From: FionaLi <fion...@zhaoxin.com>

Signed-off-by: Fiona Li<fion...@zhaoxin.com>
---
 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@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to