Re: [PATCH 1/4] staging: unisys: detect s-Par firmware

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Apr 24, 2014 at 01:57:09PM -0500, Ken Cox wrote:
> From: Benjamin Romer <benjamin.romer@xxxxxxxxxx>
> 
> This patch adds support for detection of s-Par firmware by checking for the hypervisor bit in the CPU capabilities, and then querying the hypervisor ID cpuid leaf.

No linewrap?

> 
> This functionality will be used by the unisys drivers to determine if
> they are being loaded on an s-Par platform and refuse to load if no
> s-Par firmware is present.
> 
> This fixes a problem reported from upstream where a panic occurs if the
> unisys drivers are loaded on a non s-Par system.
> 
> Reported-by: Fengguang Wu <fengguang.wu@xxxxxxxxx>
> Signed-off-by: Benjamin Romer <benjamin.romer@xxxxxxxxxx>
> Tested-by: Benjamin Romer <benjamin.romer@xxxxxxxxxx>
> Signed-off-by: Ken Cox <jkc@xxxxxxxxxx>
> Tested-by: Ken Cox <jkc@xxxxxxxxxx>
> ---
>  arch/x86/include/asm/hypervisor.h |  1 +
>  arch/x86/kernel/cpu/Makefile      |  2 +-
>  arch/x86/kernel/cpu/hypervisor.c  |  3 +++
>  arch/x86/kernel/cpu/unisys_spar.c | 51 +++++++++++++++++++++++++++++++++++++++
>  4 files changed, 56 insertions(+), 1 deletion(-)
>  create mode 100644 arch/x86/kernel/cpu/unisys_spar.c

I can't accept code for arch/x86/ files in the staging tree, sorry,
everything there must be stand-alone in your drivers/staging/ directory.

I suggest you submit this to the x86 developers if you need it in the
x86 part of the tree, they are the only ones who can take it, not me.

> 
> diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h
> index e42f758..3a86e0e 100644
> --- a/arch/x86/include/asm/hypervisor.h
> +++ b/arch/x86/include/asm/hypervisor.h
> @@ -52,6 +52,7 @@ extern const struct hypervisor_x86 x86_hyper_vmware;
>  extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
>  extern const struct hypervisor_x86 x86_hyper_xen_hvm;
>  extern const struct hypervisor_x86 x86_hyper_kvm;
> +extern const struct hypervisor_x86 x86_hyper_unisys_spar;
>  
>  extern void init_hypervisor(struct cpuinfo_x86 *c);
>  extern void init_hypervisor_platform(void);
> diff --git a/arch/x86/kernel/cpu/Makefile b/arch/x86/kernel/cpu/Makefile
> index 7fd54f0..a64ee5a 100644
> --- a/arch/x86/kernel/cpu/Makefile
> +++ b/arch/x86/kernel/cpu/Makefile
> @@ -46,7 +46,7 @@ obj-$(CONFIG_MICROCODE)			+= microcode/
>  
>  obj-$(CONFIG_X86_LOCAL_APIC)		+= perfctr-watchdog.o perf_event_amd_ibs.o
>  
> -obj-$(CONFIG_HYPERVISOR_GUEST)		+= vmware.o hypervisor.o mshyperv.o
> +obj-$(CONFIG_HYPERVISOR_GUEST)		+= vmware.o hypervisor.o mshyperv.o unisys_spar.o
>  
>  quiet_cmd_mkcapflags = MKCAP   $@
>        cmd_mkcapflags = $(CONFIG_SHELL) $(srctree)/$(src)/mkcapflags.sh $< $@
> diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c
> index 36ce402..ba92d14 100644
> --- a/arch/x86/kernel/cpu/hypervisor.c
> +++ b/arch/x86/kernel/cpu/hypervisor.c
> @@ -35,6 +35,9 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] =
>  #ifdef CONFIG_KVM_GUEST
>  	&x86_hyper_kvm,
>  #endif
> +#ifdef CONFIG_UNISYSSPAR
> +	&x86_hyper_unisys_spar,
> +#endif
>  };
>  
>  const struct hypervisor_x86 *x86_hyper;
> diff --git a/arch/x86/kernel/cpu/unisys_spar.c b/arch/x86/kernel/cpu/unisys_spar.c
> new file mode 100644
> index 0000000..264f309
> --- /dev/null
> +++ b/arch/x86/kernel/cpu/unisys_spar.c
> @@ -0,0 +1,51 @@
> +/* unisys_spar.c
> + *
> + * Copyright (C) 2014 - 2014 UNISYS CORPORATION
> + * All rights reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or (at
> + * your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
> + * NON INFRINGEMENT.  See the GNU General Public License for more
> + * details.
> + */
> +
> +#include <asm/hypervisor.h>
> +
> +/* 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
> +
> +static uint32_t unisys_spar_detect(void)
> +{
> +	if (cpu_has_hypervisor) {
> +		unsigned int eax, ebx, ecx, edx;
> +
> +		/* 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;
> +}
> +
> +const __refconst struct hypervisor_x86 x86_hyper_unisys_spar = {
> +	.name			= "Unisys s-Par(R)",
> +	.detect			= unisys_spar_detect,
> +};
> +EXPORT_SYMBOL(x86_hyper_unisys_spar);

EXPORT_SYMBOL_GPL()?

_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel




[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux