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 60a492e..d7a0bd6 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 063929a..64a122d 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 &&