void            (*get_mem_data_src)(union perf_mem_data_src *dsrc,
                                u32 flags, struct pt_regs *regs);
        void            (*get_mem_weight)(u64 *weight);
+       unsigned long   group_constraint_mask;
+       unsigned long   group_constraint_val;
        u64             (*bhrb_filter_map)(u64 branch_sample_type);
        void            (*config_bhrb)(u64 pmu_bhrb_filter);
        void            (*disable_pmc)(unsigned int pmc, unsigned long mmcr[]);
 
        int i, j;
        unsigned long addf = ppmu->add_fields;
        unsigned long tadd = ppmu->test_adder;
+       unsigned long grp_mask = ppmu->group_constraint_mask;
+       unsigned long grp_val = ppmu->group_constraint_val;
 
        if (n_ev > ppmu->n_counter)
                return -1;
        for (i = 0; i < n_ev; ++i) {
                nv = (value | cpuhw->avalues[i][0]) +
                        (value & cpuhw->avalues[i][0] & addf);
-               if ((((nv + tadd) ^ value) & mask) != 0 ||
-                   (((nv + tadd) ^ cpuhw->avalues[i][0]) &
-                    cpuhw->amasks[i][0]) != 0)
+
+               if (((((nv + tadd) ^ value) & mask) & (~grp_mask)) != 0)
+                       break;
+
+               if (((((nv + tadd) ^ cpuhw->avalues[i][0]) & cpuhw->amasks[i][0])
+                       & (~grp_mask)) != 0)
                        break;
+
                value = nv;
                mask |= cpuhw->amasks[i][0];
        }
-       if (i == n_ev)
-               return 0;       /* all OK */
+       if (i == n_ev) {
+               if ((value & mask & grp_mask) != (mask & grp_val))
+                       return -1;
+               else
+                       return 0;       /* all OK */
+       }
 
        /* doesn't work, gather alternatives... */
        if (!ppmu->get_alternatives)
 
        }
 
        if (unit >= 6 && unit <= 9) {
-               /*
-                * L2/L3 events contain a cache selector field, which is
-                * supposed to be programmed into MMCRC. However MMCRC is only
-                * HV writable, and there is no API for guest kernels to modify
-                * it. The solution is for the hypervisor to initialise the
-                * field to zeroes, and for us to only ever allow events that
-                * have a cache selector of zero. The bank selector (bit 3) is
-                * irrelevant, as long as the rest of the value is 0.
-                */
-               if (!cpu_has_feature(CPU_FTR_ARCH_300) && (cache & 0x7))
+               if (cpu_has_feature(CPU_FTR_ARCH_300)) {
+                       mask  |= CNST_CACHE_GROUP_MASK;
+                       value |= CNST_CACHE_GROUP_VAL(event & 0xff);
+
+                       mask |= CNST_CACHE_PMC4_MASK;
+                       if (pmc == 4)
+                               value |= CNST_CACHE_PMC4_VAL;
+               } else if (cache & 0x7) {
+                       /*
+                        * L2/L3 events contain a cache selector field, which is
+                        * supposed to be programmed into MMCRC. However MMCRC is only
+                        * HV writable, and there is no API for guest kernels to modify
+                        * it. The solution is for the hypervisor to initialise the
+                        * field to zeroes, and for us to only ever allow events that
+                        * have a cache selector of zero. The bank selector (bit 3) is
+                        * irrelevant, as long as the rest of the value is 0.
+                        */
                        return -1;
+               }
 
        } else if (cpu_has_feature(CPU_FTR_ARCH_300) || (event & EVENT_IS_L1)) {
                mask  |= CNST_L1_QUAL_MASK;
 
 #define CNST_SAMPLE_VAL(v)     (((v) & EVENT_SAMPLE_MASK) << 16)
 #define CNST_SAMPLE_MASK       CNST_SAMPLE_VAL(EVENT_SAMPLE_MASK)
 
+#define CNST_CACHE_GROUP_VAL(v)        (((v) & 0xffull) << 55)
+#define CNST_CACHE_GROUP_MASK  CNST_CACHE_GROUP_VAL(0xff)
+#define CNST_CACHE_PMC4_VAL    (1ull << 54)
+#define CNST_CACHE_PMC4_MASK   CNST_CACHE_PMC4_VAL
+
 /*
  * For NC we are counting up to 4 events. This requires three bits, and we need
  * the fifth event to overflow and set the 4th bit. To achieve that we bias the
 
        .n_counter              = MAX_PMU_COUNTERS,
        .add_fields             = ISA207_ADD_FIELDS,
        .test_adder             = ISA207_TEST_ADDER,
+       .group_constraint_mask  = CNST_CACHE_PMC4_MASK,
+       .group_constraint_val   = CNST_CACHE_PMC4_VAL,
        .compute_mmcr           = isa207_compute_mmcr,
        .config_bhrb            = power9_config_bhrb,
        .bhrb_filter_map        = power9_bhrb_filter_map,