{
        struct drm_i915_gem_context_param_sseu user_sseu;
        u64 __user *uprop = uprops;
+       bool config_instance = false;
+       bool config_class = false;
        bool config_sseu = false;
+       u8 class, instance;
        u32 i;
        int ret;
 
        memset(props, 0, sizeof(struct perf_open_properties));
        props->poll_oa_period = DEFAULT_POLL_PERIOD_NS;
 
-       if (!n_props) {
-               drm_dbg(&perf->i915->drm,
-                       "No i915 perf properties given\n");
-               return -EINVAL;
-       }
-
-       /* At the moment we only support using i915-perf on the RCS. */
-       props->engine = intel_engine_lookup_user(perf->i915,
-                                                I915_ENGINE_CLASS_RENDER,
-                                                0);
-       if (!props->engine) {
-               drm_dbg(&perf->i915->drm,
-                       "No RENDER-capable engines\n");
-               return -EINVAL;
-       }
-
-       if (!engine_supports_oa(props->engine)) {
-               drm_dbg(&perf->i915->drm,
-                       "Engine not supported by OA %d:%d\n",
-                       I915_ENGINE_CLASS_RENDER, 0);
-               return -EINVAL;
-       }
-
        /* Considering that ID = 0 is reserved and assuming that we don't
         * (currently) expect any configurations to ever specify duplicate
         * values for a particular property ID then the last _PROP_MAX value is
         * one greater than the maximum number of properties we expect to get
         * from userspace.
         */
-       if (n_props >= DRM_I915_PERF_PROP_MAX) {
+       if (!n_props || n_props >= DRM_I915_PERF_PROP_MAX) {
                drm_dbg(&perf->i915->drm,
-                       "More i915 perf properties specified than exist\n");
+                       "Invalid number of i915 perf properties given\n");
                return -EINVAL;
        }
 
+       /* Defaults when class:instance is not passed */
+       class = I915_ENGINE_CLASS_RENDER;
+       instance = 0;
+
        for (i = 0; i < n_props; i++) {
                u64 oa_period, oa_freq_hz;
                u64 id, value;
                        }
                        props->poll_oa_period = value;
                        break;
-               case DRM_I915_PERF_PROP_MAX:
+               case DRM_I915_PERF_PROP_OA_ENGINE_CLASS:
+                       class = (u8)value;
+                       config_class = true;
+                       break;
+               case DRM_I915_PERF_PROP_OA_ENGINE_INSTANCE:
+                       instance = (u8)value;
+                       config_instance = true;
+                       break;
+               default:
                        MISSING_CASE(id);
                        return -EINVAL;
                }
                uprop += 2;
        }
 
+       if ((config_class && !config_instance) ||
+           (config_instance && !config_class)) {
+               drm_dbg(&perf->i915->drm,
+                       "OA engine-class and engine-instance parameters must be passed together\n");
+               return -EINVAL;
+       }
+
+       props->engine = intel_engine_lookup_user(perf->i915, class, instance);
+       if (!props->engine) {
+               drm_dbg(&perf->i915->drm,
+                       "OA engine class and instance invalid %d:%d\n",
+                       class, instance);
+               return -EINVAL;
+       }
+
+       if (!engine_supports_oa(props->engine)) {
+               drm_dbg(&perf->i915->drm,
+                       "Engine not supported by OA %d:%d\n",
+                       class, instance);
+               return -EINVAL;
+       }
+
        if (config_sseu) {
                ret = get_sseu_config(&props->sseu, props->engine, &user_sseu);
                if (ret) {
         *
         * 5: Add DRM_I915_PERF_PROP_POLL_OA_PERIOD parameter that controls the
         *    interval for the hrtimer used to check for OA data.
+        *
+        * 6: Add DRM_I915_PERF_PROP_OA_ENGINE_CLASS and
+        *    DRM_I915_PERF_PROP_OA_ENGINE_INSTANCE
         */
-       return 5;
+       return 6;
 }
 
 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
 
         */
        DRM_I915_PERF_PROP_POLL_OA_PERIOD,
 
+       /**
+        * Multiple engines may be mapped to the same OA unit. The OA unit is
+        * identified by class:instance of any engine mapped to it.
+        *
+        * This parameter specifies the engine class and must be passed along
+        * with DRM_I915_PERF_PROP_OA_ENGINE_INSTANCE.
+        *
+        * This property is available in perf revision 6.
+        */
+       DRM_I915_PERF_PROP_OA_ENGINE_CLASS,
+
+       /**
+        * This parameter specifies the engine instance and must be passed along
+        * with DRM_I915_PERF_PROP_OA_ENGINE_CLASS.
+        *
+        * This property is available in perf revision 6.
+        */
+       DRM_I915_PERF_PROP_OA_ENGINE_INSTANCE,
+
        DRM_I915_PERF_PROP_MAX /* non-ABI */
 };