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

[Xen-devel] [PATCH] x86/cpu: Support a new cpu vendor, which is Shanghai. Shanghai cpu defines two msr registers to enable Random Number Generator and Advanced Cryprography Engine.The cpu supports iommu, which is designed according to Intel's specification.



From: FionaLi <FionaLi@xxxxxxxxxxx>

Signed-off-by: Fiona Li<fionali@xxxxxxxxxxx>
---
 xen/arch/x86/cpu/Makefile         |  1 +
 xen/arch/x86/cpu/common.c         |  1 +
 xen/arch/x86/cpu/shanghai.c       | 61 +++++++++++++++++++++++++++++++++++++++
 xen/include/asm-x86/iommu.h       |  2 ++
 xen/include/asm-x86/msr-index.h   |  4 +++
 xen/include/asm-x86/setup.h       |  1 +
 xen/include/asm-x86/x86-vendors.h |  3 +-
 7 files changed, 72 insertions(+), 1 deletion(-)
 create mode 100644 xen/arch/x86/cpu/shanghai.c

diff --git a/xen/arch/x86/cpu/Makefile b/xen/arch/x86/cpu/Makefile
index 74f23ae..8fcffdd 100644
--- a/xen/arch/x86/cpu/Makefile
+++ b/xen/arch/x86/cpu/Makefile
@@ -5,6 +5,7 @@ obj-y += amd.o
 obj-y += centaur.o
 obj-y += common.o
 obj-y += intel.o
+obj-y += shanghai.o
 obj-y += intel_cacheinfo.o
 obj-y += mwait-idle.o
 obj-y += vpmu.o vpmu_amd.o vpmu_intel.o
diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c
index 0a452ae..02863c9 100644
--- a/xen/arch/x86/cpu/common.c
+++ b/xen/arch/x86/cpu/common.c
@@ -709,6 +709,7 @@ void __init early_cpu_init(void)
        intel_cpu_init();
        amd_init_cpu();
        centaur_init_cpu();
+       shanghai_init_cpu();
        early_cpu_detect();
 }
 
diff --git a/xen/arch/x86/cpu/shanghai.c b/xen/arch/x86/cpu/shanghai.c
new file mode 100644
index 0000000..7910f03
--- /dev/null
+++ b/xen/arch/x86/cpu/shanghai.c
@@ -0,0 +1,61 @@
+#include <xen/lib.h>
+#include <xen/init.h>
+#include <xen/bitops.h>
+#include <asm/processor.h>
+#include <asm/msr.h>
+#include <asm/e820.h>
+#include "cpu.h"
+
+#define ACE_PRESENT(x)  ((x)&(1U<<6))
+#define ACE_ENABLED(x)  ((x)&(1U<<7))
+#define ACE_FCR                (1U << 28)      /* MSR_ZX_ACE Advanced 
Cryprography Engine */
+
+#define RNG_PRESENT(x)  ((x)&(1U<<6))
+#define RNG_ENABLED(x)  ((x)&(1U<<7))
+#define RNG_ENABLE     (1U << 6)       /* MSR_ZX_RNG Random Number Generator */
+
+
+
+static void init_shanghai(struct cpuinfo_x86 *c)
+{
+       uint64_t msr_ace,msr_rng;
+       /* Test for Shanghai Extended CPUID information */
+       if (cpuid_eax(0xC0000000) >= 0xC0000001) {
+               /*Get Shanghai Extended function number */
+               u32 extented_feature_flags = cpuid_edx(0xC0000001);
+
+               /* enable ACE,if support ACE unit */
+               if(ACE_PRESENT(extented_feature_flags) && 
!ACE_ENABLED(extented_feature_flags)) {
+                       rdmsrl(MSR_ZX_ACE, msr_ace);
+                       /* enable ACE  */
+                       wrmsrl(MSR_ZX_ACE, (msr_ace | ACE_FCR));
+                       printk(KERN_INFO "CPU: Enabled ACE h/w crypto\n");
+               }
+               /* enable RNG,if support RNG unit */
+               if (RNG_PRESENT(extented_feature_flags) && 
!RNG_ENABLED(extented_feature_flags)) {
+                       rdmsrl(MSR_ZX_RNG, msr_rng);
+                       /* enable RNG  */
+                       wrmsrl(MSR_ZX_RNG, msr_rng | RNG_ENABLE);
+                       printk(KERN_INFO "CPU: Enabled h/w RNG\n");
+               }
+       }
+
+       if (c->x86 == 0x6 && c->x86_model >= 0xf) {
+               c->x86_cache_alignment = c->x86_clflush_size * 2;
+               __set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability);
+       }
+       get_model_name(c);
+       display_cacheinfo(c);
+}
+
+static const struct cpu_dev shanghai_cpu_dev = {
+       .c_vendor       = "Shanghai",
+       .c_ident        = { "  Shanghai  " },
+       .c_init         = init_shanghai,
+};
+
+int __init shanghai_init_cpu(void)
+{
+       cpu_devs[X86_VENDOR_SHANGHAI] = &shanghai_cpu_dev;
+       return 0;
+}
diff --git a/xen/include/asm-x86/iommu.h b/xen/include/asm-x86/iommu.h
index 14ad048..c125da6 100644
--- a/xen/include/asm-x86/iommu.h
+++ b/xen/include/asm-x86/iommu.h
@@ -53,6 +53,7 @@ static inline const struct iommu_ops *iommu_get_ops(void)
 {
     switch ( boot_cpu_data.x86_vendor )
     {
+    case X86_VENDOR_SHANGHAI:
     case X86_VENDOR_INTEL:
         return &intel_iommu_ops;
     case X86_VENDOR_AMD:
@@ -68,6 +69,7 @@ static inline int iommu_hardware_setup(void)
 {
     switch ( boot_cpu_data.x86_vendor )
     {
+    case X86_VENDOR_SHANGHAI:
     case X86_VENDOR_INTEL:
         return intel_vtd_setup();
     case X86_VENDOR_AMD:
diff --git a/xen/include/asm-x86/msr-index.h b/xen/include/asm-x86/msr-index.h
index 23ad743..f2ce71a 100644
--- a/xen/include/asm-x86/msr-index.h
+++ b/xen/include/asm-x86/msr-index.h
@@ -293,6 +293,10 @@
 #define MSR_TMTA_LRTI_READOUT          0x80868018
 #define MSR_TMTA_LRTI_VOLT_MHZ         0x8086801a
 
+/* Shanghai ZhaoXin defined MSRs*/
+#define MSR_ZX_ACE                     0x00001107
+#define MSR_ZX_RNG                     0x0000110b
+
 /* Intel defined MSRs. */
 #define MSR_IA32_P5_MC_ADDR            0x00000000
 #define MSR_IA32_P5_MC_TYPE            0x00000001
diff --git a/xen/include/asm-x86/setup.h b/xen/include/asm-x86/setup.h
index 19232af..827daf8 100644
--- a/xen/include/asm-x86/setup.h
+++ b/xen/include/asm-x86/setup.h
@@ -22,6 +22,7 @@ int amd_init_cpu(void);
 int cyrix_init_cpu(void);
 int nsc_init_cpu(void);
 int centaur_init_cpu(void);
+int shanghai_init_cpu(void);
 int transmeta_init_cpu(void);
 
 void set_nr_cpu_ids(unsigned int max_cpus);
diff --git a/xen/include/asm-x86/x86-vendors.h 
b/xen/include/asm-x86/x86-vendors.h
index cae5507..c53d0b9 100644
--- a/xen/include/asm-x86/x86-vendors.h
+++ b/xen/include/asm-x86/x86-vendors.h
@@ -7,7 +7,8 @@
 #define X86_VENDOR_INTEL 0
 #define X86_VENDOR_AMD 1
 #define X86_VENDOR_CENTAUR 2
-#define X86_VENDOR_NUM 3
+#define X86_VENDOR_SHANGHAI 3
+#define X86_VENDOR_NUM 4
 #define X86_VENDOR_UNKNOWN 0xff
 
 #endif /* __XEN_X86_VENDORS_H__ */
-- 
2.7.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.