gallium/u_cpu_detect: get the number of cores per L3 cache for AMD Zen
authorMarek Olšák <marek.olsak@amd.com>
Thu, 6 Sep 2018 01:30:44 +0000 (21:30 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 7 Sep 2018 19:48:31 +0000 (15:48 -0400)
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/auxiliary/util/u_cpu_detect.c
src/gallium/auxiliary/util/u_cpu_detect.h

index 29f4ce982034bfa0c0057b1073ebc7f306d69280..751443f06f9907834b245cc2c824ae4e7a52893e 100644 (file)
@@ -367,6 +367,28 @@ check_os_arm_support(void)
 }
 #endif /* PIPE_ARCH_ARM */
 
+static void
+get_cpu_topology(void)
+{
+   uint32_t regs[4];
+
+   /* Default. This is correct if L3 is not present or there is only one. */
+   util_cpu_caps.cores_per_L3 = util_cpu_caps.nr_cpus;
+
+#if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64)
+   /* AMD Zen */
+   if (util_cpu_caps.x86_cpu_type == 0x17) {
+      /* Query the L3 cache topology information. */
+      cpuid_count(0x8000001D, 3, regs);
+      unsigned cache_level = (regs[0] >> 5) & 0x7;
+      unsigned cores_per_cache = ((regs[0] >> 14) & 0xfff) + 1;
+
+      if (cache_level == 3)
+         util_cpu_caps.cores_per_L3 = cores_per_cache;
+   }
+#endif
+}
+
 static void
 util_cpu_detect_once(void)
 {
@@ -520,6 +542,8 @@ util_cpu_detect_once(void)
    check_os_altivec_support();
 #endif /* PIPE_ARCH_PPC */
 
+   get_cpu_topology();
+
 #ifdef DEBUG
    if (debug_get_option_dump_cpu()) {
       debug_printf("util_cpu_caps.nr_cpus = %u\n", util_cpu_caps.nr_cpus);
index 19f5567ca7ba107460967c810244c8ccb0768bb5..efc910d147304fc5e678c4e376abfce5eccf4ee2 100644 (file)
@@ -51,6 +51,7 @@ struct util_cpu_caps {
    /* Feature flags */
    int x86_cpu_type;
    unsigned cacheline;
+   unsigned cores_per_L3;
 
    unsigned has_intel:1;
    unsigned has_tsc:1;