]> www.infradead.org Git - nvme.git/commitdiff
drm/amd/display: Fix divide by zero in CURSOR_DST_X_OFFSET calculation
authorGeorge Shen <george.shen@amd.com>
Sat, 15 Jun 2024 01:13:43 +0000 (21:13 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 1 Jul 2024 20:06:53 +0000 (16:06 -0400)
[Why]
Certain situations cause pipes to have a recout of 0, such as when the
dst_rect lies completely outside of a given ODM slice.

[How]
Skip calculation that transforms cursor coordinates to viewport space.

Reviewed-by: Alvin Lee <alvin.lee2@amd.com>
Signed-off-by: Jerry Zuo <jerry.zuo@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>
drivers/gpu/drm/amd/display/dc/hubp/dcn401/dcn401_hubp.c

index f0c45a74c2e51138cfb3a162ae664d4531fe6e1f..eb0da6c6b87ca6c49896ec76b1cff429a3838a25 100644 (file)
@@ -677,12 +677,23 @@ void hubp401_cursor_set_position(
        int rec_x_offset = x_pos - pos->x_hotspot;
        int rec_y_offset = y_pos - pos->y_hotspot;
        int dst_x_offset;
-       int x_pos_viewport = x_pos * param->viewport.width / param->recout.width;
-       int x_hot_viewport = pos->x_hotspot * param->viewport.width / param->recout.width;
+       int x_pos_viewport = 0;
+       int x_hot_viewport = 0;
        uint32_t cur_en = pos->enable ? 1 : 0;
 
        hubp->curs_pos = *pos;
 
+       /* Recout is zero for pipes if the entire dst_rect is contained
+        * within preceeding ODM slices.
+        */
+       if (param->recout.width) {
+               x_pos_viewport = x_pos * param->viewport.width / param->recout.width;
+               x_hot_viewport = pos->x_hotspot * param->viewport.width / param->recout.width;
+       } else {
+               ASSERT(!cur_en || x_pos == 0);
+               ASSERT(!cur_en || pos->x_hotspot == 0);
+       }
+
        /*
         * Guard aganst cursor_set_position() from being called with invalid
         * attributes