drm/amd/display: make tile changing run at ISR
authorShihChen Chen <ShihChen.Chen@amd.com>
Tue, 12 Sep 2017 03:10:12 +0000 (11:10 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Sat, 21 Oct 2017 20:41:27 +0000 (16:41 -0400)
Signed-off-by: ShihChen Chen <ShihChen.Chen@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
Acked-by: Harry Wentland <Harry.Wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc.c

index 1ec6df9870da1d12f26e3ef369e40fbfb294c88e..2cea8de9c9be03a1e5faebceb2636126f7a64caa 100644 (file)
@@ -1031,7 +1031,6 @@ static enum surface_update_type get_plane_info_update_type(
        temp_plane_info.plane_size = u->surface->plane_size;
        temp_plane_info.rotation = u->surface->rotation;
        temp_plane_info.stereo_format = u->surface->stereo_format;
-       temp_plane_info.tiling_info = u->surface->tiling_info;
 
        if (surface_index == 0)
                temp_plane_info.visible = u->plane_info->visible;
@@ -1044,10 +1043,26 @@ static enum surface_update_type get_plane_info_update_type(
 
        if (pixel_format_to_bpp(u->plane_info->format) !=
                        pixel_format_to_bpp(u->surface->format)) {
+               /* different bytes per element will require full bandwidth
+                * and DML calculation
+                */
                return UPDATE_TYPE_FULL;
-       } else {
-               return UPDATE_TYPE_MED;
        }
+
+       if (memcmp(&u->plane_info->tiling_info, &u->surface->tiling_info,
+                       sizeof(union dc_tiling_info)) != 0) {
+               /* todo: below are HW dependent, we should add a hook to
+                * DCE/N resource and validated there.
+                */
+               if (u->plane_info->tiling_info.gfx9.swizzle != DC_SW_LINEAR) {
+                       /* swizzled mode requires RQ to be setup properly,
+                        * thus need to run DML to calculate RQ settings
+                        */
+                       return UPDATE_TYPE_FULL;
+               }
+       }
+
+       return UPDATE_TYPE_MED;
 }
 
 static enum surface_update_type  get_scaling_info_update_type(