drm/i915/scaler: Carve up intel_atomic_setup_scalers()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 7 Nov 2024 12:26:56 +0000 (14:26 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Mon, 11 Nov 2024 22:07:09 +0000 (00:07 +0200)
Declutter intel_atomic_setup_scalers() a bit by splitting
the crtc scaling/pfit vs. plane scaling cases into their
own functions.

Reviewed-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241107122658.21901-7-ville.syrjala@linux.intel.com
drivers/gpu/drm/i915/display/skl_scaler.c

index 437fc19..e29e29c 100644 (file)
@@ -425,6 +425,55 @@ static int intel_atomic_setup_scaler(struct intel_crtc_scaler_state *scaler_stat
        return 0;
 }
 
+static int setup_crtc_scaler(struct intel_atomic_state *state,
+                            struct intel_crtc *crtc)
+{
+       struct intel_crtc_state *crtc_state =
+               intel_atomic_get_new_crtc_state(state, crtc);
+       struct intel_crtc_scaler_state *scaler_state =
+               &crtc_state->scaler_state;
+
+       return intel_atomic_setup_scaler(scaler_state,
+                                        hweight32(scaler_state->scaler_users),
+                                        crtc, "CRTC", crtc->base.base.id,
+                                        NULL, &scaler_state->scaler_id);
+}
+
+static int setup_plane_scaler(struct intel_atomic_state *state,
+                             struct intel_crtc *crtc,
+                             struct intel_plane *plane)
+{
+       struct intel_display *display = to_intel_display(state);
+       struct intel_crtc_state *crtc_state =
+               intel_atomic_get_new_crtc_state(state, crtc);
+       struct intel_crtc_scaler_state *scaler_state =
+               &crtc_state->scaler_state;
+       struct intel_plane_state *plane_state;
+
+       /* plane on different crtc cannot be a scaler user of this crtc */
+       if (drm_WARN_ON(display->drm, plane->pipe != crtc->pipe))
+               return 0;
+
+       plane_state = intel_atomic_get_new_plane_state(state, plane);
+
+       /*
+        * GLK+ scalers don't have a HQ mode so it
+        * isn't necessary to change between HQ and dyn mode
+        * on those platforms.
+        */
+       if (!plane_state && DISPLAY_VER(display) >= 10)
+               return 0;
+
+       plane_state = intel_atomic_get_plane_state(state, plane);
+       if (IS_ERR(plane_state))
+               return PTR_ERR(plane_state);
+
+       return intel_atomic_setup_scaler(scaler_state,
+                                        hweight32(scaler_state->scaler_users),
+                                        crtc, "PLANE", plane->base.base.id,
+                                        plane_state, &plane_state->scaler_id);
+}
+
 /**
  * intel_atomic_setup_scalers() - setup scalers for crtc per staged requests
  * @state: atomic state
@@ -476,53 +525,24 @@ int intel_atomic_setup_scalers(struct intel_atomic_state *state,
 
        /* walkthrough scaler_users bits and start assigning scalers */
        for (i = 0; i < sizeof(scaler_state->scaler_users) * 8; i++) {
-               struct intel_plane_state *plane_state = NULL;
-               int *scaler_id;
-               const char *name;
-               int idx, ret;
+               int ret;
 
                /* skip if scaler not required */
                if (!(scaler_state->scaler_users & (1 << i)))
                        continue;
 
                if (i == SKL_CRTC_INDEX) {
-                       name = "CRTC";
-                       idx = crtc->base.base.id;
-
-                       /* panel fitter case: assign as a crtc scaler */
-                       scaler_id = &scaler_state->scaler_id;
+                       ret = setup_crtc_scaler(state, crtc);
+                       if (ret)
+                               return ret;
                } else {
                        struct intel_plane *plane =
                                to_intel_plane(drm_plane_from_index(display->drm, i));
 
-                       /* plane on different crtc cannot be a scaler user of this crtc */
-                       if (drm_WARN_ON(display->drm, plane->pipe != crtc->pipe))
-                               continue;
-
-                       plane_state = intel_atomic_get_new_plane_state(state, plane);
-
-                       /*
-                        * GLK+ scalers don't have a HQ mode so it
-                        * isn't necessary to change between HQ and dyn mode
-                        * on those platforms.
-                        */
-                       if (!plane_state && DISPLAY_VER(display) >= 10)
-                               continue;
-
-                       plane_state = intel_atomic_get_plane_state(state, plane);
-                       if (IS_ERR(plane_state))
-                               return PTR_ERR(plane_state);
-
-                       name = "PLANE";
-                       idx = plane->base.base.id;
-                       scaler_id = &plane_state->scaler_id;
+                       ret = setup_plane_scaler(state, crtc, plane);
+                       if (ret)
+                               return ret;
                }
-
-               ret = intel_atomic_setup_scaler(scaler_state, num_scalers_need,
-                                               crtc, name, idx,
-                                               plane_state, scaler_id);
-               if (ret < 0)
-                       return ret;
        }
 
        return 0;