drm/amd/display: Fix calculation for cursor CAB allocation
authorGeorge Shen <george.shen@amd.com>
Wed, 2 Nov 2022 03:03:03 +0000 (23:03 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 15 Nov 2022 18:18:48 +0000 (13:18 -0500)
[Why]
The cursor size (in memory) is currently incorrectly calculated,
resulting not enough CAB being allocated for static screen cursor
in MALL refresh. This results in cursor image corruption.

[How]
Use cursor pitch instead of cursor width when calculating cursor size.
Update num cache lines calculation to use the result of the cursor size
calculation instead of manually recalculating again.

Reviewed-by: Alvin Lee <Alvin.Lee2@amd.com>
Acked-by: Tom Chung <chiahsuan.chung@amd.com>
Signed-off-by: George Shen <george.shen@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org # 6.0.x
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.c

index cf5bd97..ac41a76 100644 (file)
@@ -283,8 +283,7 @@ static uint32_t dcn32_calculate_cab_allocation(struct dc *dc, struct dc_state *c
                        using the max for calculation */
 
                if (hubp->curs_attr.width > 0) {
-                               // Round cursor width to next multiple of 64
-                               cursor_size = (((hubp->curs_attr.width + 63) / 64) * 64) * hubp->curs_attr.height;
+                               cursor_size = hubp->curs_attr.pitch * hubp->curs_attr.height;
 
                                switch (pipe->stream->cursor_attributes.color_format) {
                                case CURSOR_MODE_MONO:
@@ -309,9 +308,9 @@ static uint32_t dcn32_calculate_cab_allocation(struct dc *dc, struct dc_state *c
                                                cursor_size > 16384) {
                                        /* cursor_num_mblk = CEILING(num_cursors*cursor_width*cursor_width*cursor_Bpe/mblk_bytes, 1)
                                         */
-                                       cache_lines_used += (((hubp->curs_attr.width * hubp->curs_attr.height * cursor_bpp +
-                                                                               DCN3_2_MALL_MBLK_SIZE_BYTES - 1) / DCN3_2_MALL_MBLK_SIZE_BYTES) *
-                                                                               DCN3_2_MALL_MBLK_SIZE_BYTES) / dc->caps.cache_line_size + 2;
+                                       cache_lines_used += (((cursor_size + DCN3_2_MALL_MBLK_SIZE_BYTES - 1) /
+                                                       DCN3_2_MALL_MBLK_SIZE_BYTES) * DCN3_2_MALL_MBLK_SIZE_BYTES) /
+                                                       dc->caps.cache_line_size + 2;
                                }
                                break;
                        }
@@ -727,10 +726,7 @@ void dcn32_update_mall_sel(struct dc *dc, struct dc_state *context)
                struct hubp *hubp = pipe->plane_res.hubp;
 
                if (pipe->stream && pipe->plane_state && hubp && hubp->funcs->hubp_update_mall_sel) {
-                       //Round cursor width up to next multiple of 64
-                       int cursor_width = ((hubp->curs_attr.width + 63) / 64) * 64;
-                       int cursor_height = hubp->curs_attr.height;
-                       int cursor_size = cursor_width * cursor_height;
+                       int cursor_size = hubp->curs_attr.pitch * hubp->curs_attr.height;
 
                        switch (hubp->curs_attr.color_format) {
                        case CURSOR_MODE_MONO: