drm/i915/perf: Validate OA sseu config outside switch
authorUmesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Thu, 23 Mar 2023 22:58:53 +0000 (15:58 -0700)
committerUmesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Fri, 24 Mar 2023 15:44:32 +0000 (08:44 -0700)
Once OA supports media engine class:instance, the engine can only be
validated outside the switch since class and instance parameters are
separate entities. Since OA sseu config depends on engine
class:instance, validate OA sseu config outside the switch.

v2: (Ashutosh)
- Clarify commit message
- Use drm_dbg instead of DRM_DEBUG
- Reorder stack variables

Signed-off-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230323225901.3743681-4-umesh.nerlige.ramappa@intel.com
drivers/gpu/drm/i915/i915_perf.c

index 283a4a3..ebd76b5 100644 (file)
@@ -3940,7 +3940,9 @@ static int read_properties_unlocked(struct i915_perf *perf,
                                    u32 n_props,
                                    struct perf_open_properties *props)
 {
+       struct drm_i915_gem_context_param_sseu user_sseu;
        u64 __user *uprop = uprops;
+       bool config_sseu = false;
        u32 i;
        int ret;
 
@@ -4069,8 +4071,6 @@ static int read_properties_unlocked(struct i915_perf *perf,
                        props->hold_preemption = !!value;
                        break;
                case DRM_I915_PERF_PROP_GLOBAL_SSEU: {
-                       struct drm_i915_gem_context_param_sseu user_sseu;
-
                        if (GRAPHICS_VER_FULL(perf->i915) >= IP_VER(12, 50)) {
                                drm_dbg(&perf->i915->drm,
                                        "SSEU config not supported on gfx %x\n",
@@ -4085,14 +4085,7 @@ static int read_properties_unlocked(struct i915_perf *perf,
                                        "Unable to copy global sseu parameter\n");
                                return -EFAULT;
                        }
-
-                       ret = get_sseu_config(&props->sseu, props->engine, &user_sseu);
-                       if (ret) {
-                               drm_dbg(&perf->i915->drm,
-                                       "Invalid SSEU configuration\n");
-                               return ret;
-                       }
-                       props->has_sseu = true;
+                       config_sseu = true;
                        break;
                }
                case DRM_I915_PERF_PROP_POLL_OA_PERIOD:
@@ -4112,6 +4105,16 @@ static int read_properties_unlocked(struct i915_perf *perf,
                uprop += 2;
        }
 
+       if (config_sseu) {
+               ret = get_sseu_config(&props->sseu, props->engine, &user_sseu);
+               if (ret) {
+                       drm_dbg(&perf->i915->drm,
+                               "Invalid SSEU configuration\n");
+                       return ret;
+               }
+               props->has_sseu = true;
+       }
+
        return 0;
 }