vppinfra: add AMD EPYC cpu family details 91/38691/2
authorSivaprasad Tummala <sivaprasad.tummala@amd.com>
Mon, 17 Apr 2023 12:16:11 +0000 (05:16 -0700)
committerDamjan Marion <dmarion@0xa5.net>
Mon, 17 Apr 2023 14:36:10 +0000 (14:36 +0000)
Type: feature

- Added support for AMD EPYC processor family

Change-Id: I60da87cca429117c209d240e5a5f3b4d9f4981d8
Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
src/vppinfra/cpu.c
src/vppinfra/cpu.h

index 4f6b46f..735a183 100644 (file)
@@ -93,13 +93,34 @@ format_cpu_uarch (u8 * s, va_list * args)
 #if __x86_64__
   u32 __attribute__ ((unused)) eax, ebx, ecx, edx;
   u8 model, family, stepping;
+  u8 amd_vendor = 0;
+
+  if (__get_cpuid (0, &eax, &ebx, &ecx, &edx) == 0)
+    return format (s, "unknown (missing cpuid)");
+
+  if (amd_vendor (ebx, ecx, edx))
+    amd_vendor = 1;
 
   if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0)
     return format (s, "unknown (missing cpuid)");
 
-  model = ((eax >> 4) & 0x0f) | ((eax >> 12) & 0xf0);
-  family = (eax >> 8) & 0x0f;
   stepping = eax & 0x0f;
+  if (amd_vendor)
+    {
+      family = ((eax >> 8) & 0x0f);
+      model = ((eax >> 4) & 0x0f);
+      if (family >= 0xf)
+       {
+         family = family + ((eax >> 20) & 0xf);
+         model = (model | ((eax >> 12) & 0xf0));
+       }
+      return format (s, "Zen (family 0x%02x model 0x%02x)", family, model);
+    }
+  else
+    {
+      model = ((eax >> 4) & 0x0f) | ((eax >> 12) & 0xf0);
+      family = (eax >> 8) & 0x0f;
+    }
 
 #define _(f,m,a,c) if ((model == m) && (family == f)) return \
 format(s, "[0x%x] %s ([0x%02x] %s) stepping 0x%x", f, a, m, c, stepping);
index 60439e0..29992bb 100644 (file)
 #define foreach_march_variant
 #endif
 
+#define amd_vendor(t1, t2, t3)                                                \
+  ((t1 == 0x68747541) && /* htuA */                                           \
+   (t2 == 0x444d4163) && /* DMAc */                                           \
+   (t3 == 0x69746e65))  /* itne */
 typedef enum
 {
   CLIB_MARCH_VARIANT_TYPE = 0,