drm/i915/xe2lpd: Treat cursor plane as regular plane for DDB allocation
authorStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Tue, 19 Sep 2023 19:21:13 +0000 (12:21 -0700)
committerLucas De Marchi <lucas.demarchi@intel.com>
Thu, 21 Sep 2023 14:39:50 +0000 (07:39 -0700)
We now start calculating relative plane data rate for cursor plane as
well, as instructed by BSpec and also treat cursor plane same way as
other planes, when doing allocation, i.e not using fixed allocation for
cursor anymore.

Bspec: 68907
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230919192128.2045154-7-lucas.demarchi@intel.com
drivers/gpu/drm/i915/display/intel_atomic_plane.c
drivers/gpu/drm/i915/display/skl_watermark.c

index 60a492e186ab836d42fe9a6cebe7e3cf9807d440..d7a0bd686e4998b8dbaf8963d50105da52ad395b 100644 (file)
@@ -214,9 +214,6 @@ intel_plane_relative_data_rate(const struct intel_crtc_state *crtc_state,
        int width, height;
        unsigned int rel_data_rate;
 
-       if (plane->id == PLANE_CURSOR)
-               return 0;
-
        if (!plane_state->uapi.visible)
                return 0;
 
@@ -244,6 +241,9 @@ intel_plane_relative_data_rate(const struct intel_crtc_state *crtc_state,
 
        rel_data_rate = width * height * fb->format->cpp[color_plane];
 
+       if (plane->id == PLANE_CURSOR)
+               return rel_data_rate;
+
        return intel_adjusted_rate(&plane_state->uapi.src,
                                   &plane_state->uapi.dst,
                                   rel_data_rate);
index 063929a42a42f543decb97f6385070eb79f06365..64a122d3c9c01dfab03527d3b95211068b8ec591 100644 (file)
@@ -1367,7 +1367,7 @@ skl_total_relative_data_rate(const struct intel_crtc_state *crtc_state)
        u64 data_rate = 0;
 
        for_each_plane_id_on_crtc(crtc, plane_id) {
-               if (plane_id == PLANE_CURSOR)
+               if (plane_id == PLANE_CURSOR && DISPLAY_VER(i915) < 20)
                        continue;
 
                data_rate += crtc_state->rel_data_rate[plane_id];
@@ -1514,10 +1514,12 @@ skl_crtc_allocate_plane_ddb(struct intel_atomic_state *state,
                return 0;
 
        /* Allocate fixed number of blocks for cursor. */
-       cursor_size = skl_cursor_allocation(crtc_state, num_active);
-       iter.size -= cursor_size;
-       skl_ddb_entry_init(&crtc_state->wm.skl.plane_ddb[PLANE_CURSOR],
-                          alloc->end - cursor_size, alloc->end);
+       if (DISPLAY_VER(i915) < 20) {
+               cursor_size = skl_cursor_allocation(crtc_state, num_active);
+               iter.size -= cursor_size;
+               skl_ddb_entry_init(&crtc_state->wm.skl.plane_ddb[PLANE_CURSOR],
+                                  alloc->end - cursor_size, alloc->end);
+       }
 
        iter.data_rate = skl_total_relative_data_rate(crtc_state);
 
@@ -1531,7 +1533,7 @@ skl_crtc_allocate_plane_ddb(struct intel_atomic_state *state,
                        const struct skl_plane_wm *wm =
                                &crtc_state->wm.skl.optimal.planes[plane_id];
 
-                       if (plane_id == PLANE_CURSOR) {
+                       if (plane_id == PLANE_CURSOR && DISPLAY_VER(i915) < 20) {
                                const struct skl_ddb_entry *ddb =
                                        &crtc_state->wm.skl.plane_ddb[plane_id];
 
@@ -1579,7 +1581,7 @@ skl_crtc_allocate_plane_ddb(struct intel_atomic_state *state,
                const struct skl_plane_wm *wm =
                        &crtc_state->wm.skl.optimal.planes[plane_id];
 
-               if (plane_id == PLANE_CURSOR)
+               if (plane_id == PLANE_CURSOR && DISPLAY_VER(i915) < 20)
                        continue;
 
                if (DISPLAY_VER(i915) < 11 &&