if (topology_smt_supported() && !topology_is_primary_thread(cpu))
                thread = 1;
 
-       shift = AMD64_L3_THREAD_SHIFT + 2 * (core % 4) + thread;
+       if (boot_cpu_data.x86 <= 0x18) {
+               shift = AMD64_L3_THREAD_SHIFT + 2 * (core % 4) + thread;
+               thread_mask = BIT_ULL(shift);
+
+               return AMD64_L3_SLICE_MASK | thread_mask;
+       }
+
+       core = (core << AMD64_L3_COREID_SHIFT) & AMD64_L3_COREID_MASK;
+       shift = AMD64_L3_THREAD_SHIFT + thread;
        thread_mask = BIT_ULL(shift);
 
-       return AMD64_L3_SLICE_MASK | thread_mask;
+       return AMD64_L3_EN_ALL_SLICES | core | thread_mask;
 }
 
 static int amd_uncore_event_init(struct perf_event *event)
                return -EINVAL;
 
        /*
-        * SliceMask and ThreadMask need to be set for certain L3 events in
-        * Family 17h. For other events, the two fields do not affect the count.
+        * SliceMask and ThreadMask need to be set for certain L3 events.
+        * For other events, the two fields do not affect the count.
         */
        if (l3_mask && is_llc_event(event))
                hwc->config |= l3_thread_slice_mask(event->cpu);
        if (!boot_cpu_has(X86_FEATURE_TOPOEXT))
                return -ENODEV;
 
-       if (boot_cpu_data.x86 == 0x17 || boot_cpu_data.x86 == 0x18) {
+       if (boot_cpu_data.x86 >= 0x17) {
                /*
-                * For F17h or F18h, the Northbridge counters are
+                * For F17h and above, the Northbridge counters are
                 * repurposed as Data Fabric counters. Also, L3
                 * counters are supported too. The PMUs are exported
                 * based on family as either L2 or L3 and NB or DF.
 
 
 #define AMD64_L3_SLICE_SHIFT                           48
 #define AMD64_L3_SLICE_MASK                            \
-       ((0xFULL) << AMD64_L3_SLICE_SHIFT)
+       (0xFULL << AMD64_L3_SLICE_SHIFT)
+#define AMD64_L3_SLICEID_MASK                          \
+       (0x7ULL << AMD64_L3_SLICE_SHIFT)
 
 #define AMD64_L3_THREAD_SHIFT                          56
 #define AMD64_L3_THREAD_MASK                           \
-       ((0xFFULL) << AMD64_L3_THREAD_SHIFT)
+       (0xFFULL << AMD64_L3_THREAD_SHIFT)
+#define AMD64_L3_F19H_THREAD_MASK                      \
+       (0x3ULL << AMD64_L3_THREAD_SHIFT)
+
+#define AMD64_L3_EN_ALL_CORES                          BIT_ULL(47)
+#define AMD64_L3_EN_ALL_SLICES                         BIT_ULL(46)
+
+#define AMD64_L3_COREID_SHIFT                          42
+#define AMD64_L3_COREID_MASK                           \
+       (0x7ULL << AMD64_L3_COREID_SHIFT)
 
 #define X86_RAW_EVENT_MASK             \
        (ARCH_PERFMON_EVENTSEL_EVENT |  \