diff options
-rw-r--r-- | drivers/staging/unisys/channels/chanstub.c | 3 | ||||
-rw-r--r-- | drivers/staging/unisys/include/timskmodutils.h | 2 | ||||
-rw-r--r-- | drivers/staging/unisys/uislib/uislib.c | 3 | ||||
-rw-r--r-- | drivers/staging/unisys/virthba/virthba.c | 3 | ||||
-rw-r--r-- | drivers/staging/unisys/virtpci/virtpci.c | 4 | ||||
-rw-r--r-- | drivers/staging/unisys/visorchannel/visorchannel_main.c | 3 | ||||
-rw-r--r-- | drivers/staging/unisys/visorchipset/visorchipset_main.c | 3 | ||||
-rw-r--r-- | drivers/staging/unisys/visorutil/visorkmodutils.c | 54 |
8 files changed, 75 insertions, 0 deletions
diff --git a/drivers/staging/unisys/channels/chanstub.c b/drivers/staging/unisys/channels/chanstub.c index 45ac55d3fe1c..1e7d6a78602d 100644 --- a/drivers/staging/unisys/channels/chanstub.c +++ b/drivers/staging/unisys/channels/chanstub.c @@ -25,11 +25,14 @@ #include "channel.h" #include "chanstub.h" +#include "timskmodutils.h" #include "version.h" static __init int channel_mod_init(void) { + if (!unisys_spar_platform) + return -ENODEV; return 0; } diff --git a/drivers/staging/unisys/include/timskmodutils.h b/drivers/staging/unisys/include/timskmodutils.h index 0045d559d1b9..c316c94ea194 100644 --- a/drivers/staging/unisys/include/timskmodutils.h +++ b/drivers/staging/unisys/include/timskmodutils.h @@ -72,4 +72,6 @@ char *cyclesToSomethingsPerSecond(u64 cycles, u64 cyclesPerSecond, struct seq_file *visor_seq_file_new_buffer(void *buf, size_t buf_size); void visor_seq_file_done_buffer(struct seq_file *m); +extern int unisys_spar_platform; + #endif diff --git a/drivers/staging/unisys/uislib/uislib.c b/drivers/staging/unisys/uislib/uislib.c index 0e1a58ab28b1..fbdb19fc7891 100644 --- a/drivers/staging/unisys/uislib/uislib.c +++ b/drivers/staging/unisys/uislib/uislib.c @@ -2277,6 +2277,9 @@ static int __init uislib_mod_init(void) { + if (!unisys_spar_platform) + return -ENODEV; + LOGINF("MONITORAPIS"); LOGINF("sizeof(struct uiscmdrsp):%lu bytes\n", diff --git a/drivers/staging/unisys/virthba/virthba.c b/drivers/staging/unisys/virthba/virthba.c index a13e79e287f4..d528388d596f 100644 --- a/drivers/staging/unisys/virthba/virthba.c +++ b/drivers/staging/unisys/virthba/virthba.c @@ -1699,6 +1699,9 @@ virthba_mod_init(void) int error; int i; + if (!unisys_spar_platform) + return -ENODEV; + LOGINF("Entering virthba_mod_init...\n"); POSTCODE_LINUX_2(VHBA_CREATE_ENTRY_PC, POSTCODE_SEVERITY_INFO); diff --git a/drivers/staging/unisys/virtpci/virtpci.c b/drivers/staging/unisys/virtpci/virtpci.c index 21f8bd5fdff9..9a35dd2cd472 100644 --- a/drivers/staging/unisys/virtpci/virtpci.c +++ b/drivers/staging/unisys/virtpci/virtpci.c @@ -39,6 +39,7 @@ #include <linux/version.h> #include "version.h" #include "guestlinuxdebug.h" +#include "timskmodutils.h" struct driver_private { struct kobject kobj; @@ -1687,6 +1688,9 @@ static int __init virtpci_mod_init(void) int ret; + if (!unisys_spar_platform) + return -ENODEV; + LOGINF("Module build: Date:%s Time:%s...\n", __DATE__, __TIME__); POSTCODE_LINUX_2(VPCI_CREATE_ENTRY_PC, POSTCODE_SEVERITY_INFO); diff --git a/drivers/staging/unisys/visorchannel/visorchannel_main.c b/drivers/staging/unisys/visorchannel/visorchannel_main.c index 1a092570602e..c8f89bd75e0c 100644 --- a/drivers/staging/unisys/visorchannel/visorchannel_main.c +++ b/drivers/staging/unisys/visorchannel/visorchannel_main.c @@ -29,6 +29,9 @@ static int __init visorchannel_init(void) { + if (!unisys_spar_platform) + return -ENODEV; + INFODRV("driver version %s loaded", VERSION); return 0; } diff --git a/drivers/staging/unisys/visorchipset/visorchipset_main.c b/drivers/staging/unisys/visorchipset/visorchipset_main.c index 1895dc459643..5b955926f42d 100644 --- a/drivers/staging/unisys/visorchipset/visorchipset_main.c +++ b/drivers/staging/unisys/visorchipset/visorchipset_main.c @@ -2699,6 +2699,9 @@ visorchipset_init(void) struct proc_dir_entry *toolaction_file; struct proc_dir_entry *bootToTool_file; + if (!unisys_spar_platform) + return -ENODEV; + LOGINF("chipset driver version %s loaded", VERSION); /* process module options */ POSTCODE_LINUX_2(DRIVER_ENTRY_PC, POSTCODE_SEVERITY_INFO); diff --git a/drivers/staging/unisys/visorutil/visorkmodutils.c b/drivers/staging/unisys/visorutil/visorkmodutils.c index e802e75a4696..7521027c9368 100644 --- a/drivers/staging/unisys/visorutil/visorkmodutils.c +++ b/drivers/staging/unisys/visorutil/visorkmodutils.c @@ -20,6 +20,22 @@ #define MYDRVNAME "timskmodutils" +/* s-Par uses the Intel processor's VT-X features to separate groups of + * processors into partitions. The firmware sets the hypervisor bit and + * reports an ID in the HV capabilities leaf so that the partition's OS + * knows s-Par is present and managing the processors. + */ + +#define UNISYS_SPAR_LEAF_ID 0x40000000 + +/* The s-Par leaf ID returns "UnisysSpar64" encoded across ebx, ecx, edx */ +#define UNISYS_SPAR_ID_EBX 0x73696e55 +#define UNISYS_SPAR_ID_ECX 0x70537379 +#define UNISYS_SPAR_ID_EDX 0x34367261 + +int unisys_spar_platform; +EXPORT_SYMBOL_GPL(unisys_spar_platform); + /** Callers to interfaces that set __GFP_NORETRY flag below * must check for a NULL (error) result as we are telling the * kernel interface that it is okay to fail. @@ -69,3 +85,41 @@ void visor_seq_file_done_buffer(struct seq_file *m) kfree(m); } EXPORT_SYMBOL_GPL(visor_seq_file_done_buffer); + +static __init uint32_t +visorutil_spar_detect(void) +{ + unsigned int eax, ebx, ecx, edx; + + if (cpu_has_hypervisor) { + /* check the ID */ + cpuid(UNISYS_SPAR_LEAF_ID, &eax, &ebx, &ecx, &edx); + return (ebx == UNISYS_SPAR_ID_EBX) && + (ecx == UNISYS_SPAR_ID_ECX) && + (edx == UNISYS_SPAR_ID_EDX); + } else + return 0; + +} + + + + +static __init int +visorutil_mod_init(void) +{ + if (visorutil_spar_detect()) { + unisys_spar_platform = TRUE; + return 0; + } else + return -ENODEV; +} + +static __exit void +visorutil_mod_exit(void) +{ +} + +module_init(visorutil_mod_init); +module_exit(visorutil_mod_exit); + |