drm/amd/display: use full update for clip size increase of large plane source
authorjsg <jsg@openbsd.org>
Thu, 30 Nov 2023 02:26:44 +0000 (02:26 +0000)
committerjsg <jsg@openbsd.org>
Thu, 30 Nov 2023 02:26:44 +0000 (02:26 +0000)
From Wenjing Liu
24faa2740b3f15e747b563a6c22fb05ba13a76b7 in linux-6.1.y/6.1.64
05b78277ef0efc1deebc8a22384fffec29a3676e in mainline linux

sys/dev/pci/drm/amd/display/dc/core/amdgpu_dc.c
sys/dev/pci/drm/amd/display/dc/dc.h

index 15d3caf..9d321f4 100644 (file)
@@ -996,7 +996,8 @@ static bool dc_construct(struct dc *dc,
        /* set i2c speed if not done by the respective dcnxxx__resource.c */
        if (dc->caps.i2c_speed_in_khz_hdcp == 0)
                dc->caps.i2c_speed_in_khz_hdcp = dc->caps.i2c_speed_in_khz;
-
+       if (dc->caps.max_optimizable_video_width == 0)
+               dc->caps.max_optimizable_video_width = 5120;
        dc->clk_mgr = dc_clk_mgr_create(dc->ctx, dc->res_pool->pp_smu, dc->res_pool->dccg);
        if (!dc->clk_mgr)
                goto fail;
@@ -2438,6 +2439,7 @@ static enum surface_update_type get_plane_info_update_type(const struct dc_surfa
 }
 
 static enum surface_update_type get_scaling_info_update_type(
+               const struct dc *dc,
                const struct dc_surface_update *u)
 {
        union surface_update_flags *update_flags = &u->surface->update_flags;
@@ -2472,6 +2474,12 @@ static enum surface_update_type get_scaling_info_update_type(
                        update_flags->bits.clock_change = 1;
        }
 
+       if (u->scaling_info->src_rect.width > dc->caps.max_optimizable_video_width &&
+               (u->scaling_info->clip_rect.width > u->surface->clip_rect.width ||
+                u->scaling_info->clip_rect.height > u->surface->clip_rect.height))
+                /* Changing clip size of a large surface may result in MPC slice count change */
+               update_flags->bits.bandwidth_change = 1;
+
        if (u->scaling_info->src_rect.x != u->surface->src_rect.x
                        || u->scaling_info->src_rect.y != u->surface->src_rect.y
                        || u->scaling_info->clip_rect.x != u->surface->clip_rect.x
@@ -2509,7 +2517,7 @@ static enum surface_update_type det_surface_update(const struct dc *dc,
        type = get_plane_info_update_type(u);
        elevate_update_type(&overall_type, type);
 
-       type = get_scaling_info_update_type(u);
+       type = get_scaling_info_update_type(dc, u);
        elevate_update_type(&overall_type, type);
 
        if (u->flip_addr) {
index b7a18d4..0dc4a9d 100644 (file)
@@ -230,6 +230,11 @@ struct dc_caps {
        uint32_t dmdata_alloc_size;
        unsigned int max_cursor_size;
        unsigned int max_video_width;
+       /*
+        * max video plane width that can be safely assumed to be always
+        * supported by single DPP pipe.
+        */
+       unsigned int max_optimizable_video_width;
        unsigned int min_horizontal_blanking_period;
        int linear_pitch_alignment;
        bool dcc_const_color;