EVENT_CONSTRAINT_END
 };
 
+static struct event_constraint intel_v5_gen_event_constraints[] __read_mostly =
+{
+       FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */
+       FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */
+       FIXED_EVENT_CONSTRAINT(0x0300, 2), /* CPU_CLK_UNHALTED.REF */
+       FIXED_EVENT_CONSTRAINT(0x0400, 3), /* SLOTS */
+       FIXED_EVENT_CONSTRAINT(0x0500, 4),
+       FIXED_EVENT_CONSTRAINT(0x0600, 5),
+       FIXED_EVENT_CONSTRAINT(0x0700, 6),
+       FIXED_EVENT_CONSTRAINT(0x0800, 7),
+       FIXED_EVENT_CONSTRAINT(0x0900, 8),
+       FIXED_EVENT_CONSTRAINT(0x0a00, 9),
+       FIXED_EVENT_CONSTRAINT(0x0b00, 10),
+       FIXED_EVENT_CONSTRAINT(0x0c00, 11),
+       FIXED_EVENT_CONSTRAINT(0x0d00, 12),
+       FIXED_EVENT_CONSTRAINT(0x0e00, 13),
+       FIXED_EVENT_CONSTRAINT(0x0f00, 14),
+       FIXED_EVENT_CONSTRAINT(0x1000, 15),
+       EVENT_CONSTRAINT_END
+};
+
 static struct event_constraint intel_slm_event_constraints[] __read_mostly =
 {
        FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */
                        pr_cont("generic architected perfmon v1, ");
                        name = "generic_arch_v1";
                        break;
-               default:
+               case 2:
+               case 3:
+               case 4:
                        /*
                         * default constraints for v2 and up
                         */
                        pr_cont("generic architected perfmon, ");
                        name = "generic_arch_v2+";
                        break;
+               default:
+                       /*
+                        * The default constraints for v5 and up can support up to
+                        * 16 fixed counters. For the fixed counters 4 and later,
+                        * the pseudo-encoding is applied.
+                        * The constraints may be cut according to the CPUID enumeration
+                        * by inserting the EVENT_CONSTRAINT_END.
+                        */
+                       if (x86_pmu.num_counters_fixed > INTEL_PMC_MAX_FIXED)
+                               x86_pmu.num_counters_fixed = INTEL_PMC_MAX_FIXED;
+                       intel_v5_gen_event_constraints[x86_pmu.num_counters_fixed].weight = -1;
+                       x86_pmu.event_constraints = intel_v5_gen_event_constraints;
+                       pr_cont("generic architected perfmon, ");
+                       name = "generic_arch_v5+";
+                       break;
                }
        }