[S390] add MACHINE_IS_LPAR flag
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 26 Feb 2010 21:37:38 +0000 (22:37 +0100)
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>
Fri, 26 Feb 2010 21:37:31 +0000 (22:37 +0100)
Introduce the MACHINE_IS_LPAR flag for code that should only be
executed if Linux is running in an LPAR.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/setup.h
arch/s390/kernel/early.c
arch/s390/kernel/setup.c
drivers/s390/cio/cio.c
drivers/s390/cio/qdio_main.c

index 52a779c..76f530b 100644 (file)
@@ -71,9 +71,12 @@ extern unsigned int user_mode;
 #define MACHINE_FLAG_KVM       (1UL << 9)
 #define MACHINE_FLAG_HPAGE     (1UL << 10)
 #define MACHINE_FLAG_PFMF      (1UL << 11)
+#define MACHINE_FLAG_LPAR      (1UL << 12)
 
 #define MACHINE_IS_VM          (S390_lowcore.machine_flags & MACHINE_FLAG_VM)
 #define MACHINE_IS_KVM         (S390_lowcore.machine_flags & MACHINE_FLAG_KVM)
+#define MACHINE_IS_LPAR                (S390_lowcore.machine_flags & MACHINE_FLAG_LPAR)
+
 #define MACHINE_HAS_DIAG9C     (S390_lowcore.machine_flags & MACHINE_FLAG_DIAG9C)
 
 #ifndef __s390x__
index e49e9e0..02e4586 100644 (file)
@@ -214,10 +214,13 @@ static __initdata struct sysinfo_3_2_2 vmms __aligned(PAGE_SIZE);
 
 static noinline __init void detect_machine_type(void)
 {
-       /* No VM information? Looks like LPAR */
-       if (stsi(&vmms, 3, 2, 2) == -ENOSYS)
+       /* Check current-configuration-level */
+       if ((stsi(NULL, 0, 0, 0) >> 28) <= 2) {
+               S390_lowcore.machine_flags |= MACHINE_FLAG_LPAR;
                return;
-       if (!vmms.count)
+       }
+       /* Get virtual-machine cpu information. */
+       if (stsi(&vmms, 3, 2, 2) == -ENOSYS || !vmms.count)
                return;
 
        /* Running under KVM? If not we assume z/VM */
index 8d8957b..d9fb98c 100644 (file)
@@ -804,7 +804,7 @@ setup_arch(char **cmdline_p)
        if (MACHINE_IS_VM)
                pr_info("Linux is running as a z/VM "
                        "guest operating system in 31-bit mode\n");
-       else
+       else if (MACHINE_IS_LPAR)
                pr_info("Linux is running natively in 31-bit mode\n");
        if (MACHINE_HAS_IEEE)
                pr_info("The hardware system has IEEE compatible "
@@ -818,7 +818,7 @@ setup_arch(char **cmdline_p)
                        "guest operating system in 64-bit mode\n");
        else if (MACHINE_IS_KVM)
                pr_info("Linux is running under KVM in 64-bit mode\n");
-       else
+       else if (MACHINE_IS_LPAR)
                pr_info("Linux is running natively in 64-bit mode\n");
 #endif /* CONFIG_64BIT */
 
index 126f240..f9d8c79 100644 (file)
@@ -661,7 +661,7 @@ void __irq_entry do_IRQ(struct pt_regs *regs)
                 * We don't do this for VM because a tpi drops the cpu
                 * out of the sie which costs more cycles than it saves.
                 */
-       } while (!MACHINE_IS_VM && tpi (NULL) != 0);
+       } while (MACHINE_IS_LPAR && tpi(NULL) != 0);
        irq_exit();
        set_irq_regs(old_regs);
 }
index 35dfc3c..232ef04 100644 (file)
@@ -534,7 +534,7 @@ static int qdio_inbound_q_moved(struct qdio_q *q)
 
        if ((bufnr != q->last_move) || q->qdio_error) {
                q->last_move = bufnr;
-               if (!is_thinint_irq(q->irq_ptr) && !MACHINE_IS_VM)
+               if (!is_thinint_irq(q->irq_ptr) && MACHINE_IS_LPAR)
                        q->u.in.timestamp = get_usecs();
                return 1;
        } else