struct perf_event *event, int idx)
 {
        u32 span, sid;
-       unsigned int num_ctrs = smmu_pmu->num_counters;
+       unsigned int cur_idx, num_ctrs = smmu_pmu->num_counters;
        bool filter_en = !!get_filter_enable(event);
 
        span = filter_en ? get_filter_span(event) :
        sid = filter_en ? get_filter_stream_id(event) :
                           SMMU_PMCG_DEFAULT_FILTER_SID;
 
-       /* Support individual filter settings */
-       if (!smmu_pmu->global_filter) {
+       cur_idx = find_first_bit(smmu_pmu->used_counters, num_ctrs);
+       /*
+        * Per-counter filtering, or scheduling the first globally-filtered
+        * event into an empty PMU so idx == 0 and it works out equivalent.
+        */
+       if (!smmu_pmu->global_filter || cur_idx == num_ctrs) {
                smmu_pmu_set_event_filter(event, idx, span, sid);
                return 0;
        }
 
-       /* Requested settings same as current global settings*/
-       idx = find_first_bit(smmu_pmu->used_counters, num_ctrs);
-       if (idx == num_ctrs ||
-           smmu_pmu_check_global_filter(smmu_pmu->events[idx], event)) {
-               smmu_pmu_set_event_filter(event, 0, span, sid);
+       /* Otherwise, must match whatever's currently scheduled */
+       if (smmu_pmu_check_global_filter(smmu_pmu->events[cur_idx], event)) {
+               smmu_pmu_set_evtyper(smmu_pmu, idx, get_event(event));
                return 0;
        }