diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0448-drm-amd-display-Calculate-swizzle-mode-using-bpp-dur.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/0448-drm-amd-display-Calculate-swizzle-mode-using-bpp-dur.patch | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0448-drm-amd-display-Calculate-swizzle-mode-using-bpp-dur.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0448-drm-amd-display-Calculate-swizzle-mode-using-bpp-dur.patch new file mode 100644 index 00000000..107be822 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0448-drm-amd-display-Calculate-swizzle-mode-using-bpp-dur.patch @@ -0,0 +1,213 @@ +From 83f873da00e4ee67fe0feb14f768e9548bc12f77 Mon Sep 17 00:00:00 2001 +From: Su Sung Chung <Su.Chung@amd.com> +Date: Thu, 13 Sep 2018 15:26:08 -0400 +Subject: [PATCH 0448/2940] drm/amd/display: Calculate swizzle mode using bpp + during validation + +[Why] +Previously bandwidth validation was failing because swizzle mode was not +initialized during plane_state allocation. The swizzle mode was +calculated using pixed format which is how swizzle mode is initially +calculated in addrlib. + +[How] +* Set default swizzle mode for validation to DC_SW_UNKNOWN +* Created new function in dcn10_assign_swizzle_mode which sets the + plane swizzle mode based on selected pixed format +* Added the call of assign_swizzle_mode into dc_validate_global_state +* Set failsafe swizzle mode back to DC_SW_LINEAR + +Signed-off-by: Su Sung Chung <Su.Chung@amd.com> +Reviewed-by: Eric Yang <eric.yang2@amd.com> +Acked-by: Leo Li <sunpeng.li@amd.com> +--- + drivers/gpu/drm/amd/display/dc/core/dc.c | 30 +-------------- + .../gpu/drm/amd/display/dc/core/dc_resource.c | 37 +++++++++++++++++++ + drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 3 +- + .../drm/amd/display/dc/dcn10/dcn10_resource.c | 21 ++++++++++- + .../gpu/drm/amd/display/dc/inc/core_types.h | 3 ++ + drivers/gpu/drm/amd/display/dc/inc/resource.h | 3 ++ + 6 files changed, 67 insertions(+), 30 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index 1faabae0fa3a..f87542bfba78 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -1113,32 +1113,6 @@ static bool is_surface_in_context( + return false; + } + +-static unsigned int pixel_format_to_bpp(enum surface_pixel_format format) +-{ +- switch (format) { +- case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr: +- case SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb: +- return 12; +- case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555: +- case SURFACE_PIXEL_FORMAT_GRPH_RGB565: +- case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr: +- case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb: +- return 16; +- case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888: +- case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888: +- case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010: +- case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010: +- return 32; +- case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: +- case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: +- case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: +- return 64; +- default: +- ASSERT_CRITICAL(false); +- return -1; +- } +-} +- + static enum surface_update_type get_plane_info_update_type(const struct dc_surface_update *u) + { + union surface_update_flags *update_flags = &u->surface->update_flags; +@@ -1172,8 +1146,8 @@ static enum surface_update_type get_plane_info_update_type(const struct dc_surfa + || u->plane_info->dcc.grph.meta_pitch != u->surface->dcc.grph.meta_pitch) + update_flags->bits.dcc_change = 1; + +- if (pixel_format_to_bpp(u->plane_info->format) != +- pixel_format_to_bpp(u->surface->format)) ++ if (resource_pixel_format_to_bpp(u->plane_info->format) != ++ resource_pixel_format_to_bpp(u->surface->format)) + /* different bytes per element will require full bandwidth + * and DML calculation + */ +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +index a500381c7973..8a50fd6b2b81 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +@@ -2099,6 +2099,14 @@ enum dc_status dc_validate_global_state( + if (pipe_ctx->stream != stream) + continue; + ++ if (dc->res_pool->funcs->get_default_swizzle_mode && ++ pipe_ctx->plane_state && ++ pipe_ctx->plane_state->tiling_info.gfx9.swizzle == DC_SW_UNKNOWN) { ++ result = dc->res_pool->funcs->get_default_swizzle_mode(pipe_ctx->plane_state); ++ if (result != DC_OK) ++ return result; ++ } ++ + /* Switch to dp clock source only if there is + * no non dp stream that shares the same timing + * with the dp stream. +@@ -2888,3 +2896,32 @@ enum dc_status dc_validate_plane(struct dc *dc, const struct dc_plane_state *pla + + return res; + } ++ ++unsigned int resource_pixel_format_to_bpp(enum surface_pixel_format format) ++{ ++ switch (format) { ++ case SURFACE_PIXEL_FORMAT_GRPH_PALETA_256_COLORS: ++ return 8; ++ case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr: ++ case SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb: ++ return 12; ++ case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555: ++ case SURFACE_PIXEL_FORMAT_GRPH_RGB565: ++ case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr: ++ case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb: ++ return 16; ++ case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888: ++ case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888: ++ case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010: ++ case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010: ++ case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS: ++ return 32; ++ case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: ++ case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: ++ case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: ++ return 64; ++ default: ++ ASSERT_CRITICAL(false); ++ return -1; ++ } ++} +diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h +index 57f57cf0fe2a..7825e4b5e97c 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h ++++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h +@@ -289,7 +289,8 @@ enum swizzle_mode_values { + DC_SW_VAR_S_X = 29, + DC_SW_VAR_D_X = 30, + DC_SW_VAR_R_X = 31, +- DC_SW_MAX ++ DC_SW_MAX = 32, ++ DC_SW_UNKNOWN = DC_SW_MAX + }; + + union dc_tiling_info { +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +index e148f708e8b3..910f0b4b873d 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +@@ -1131,6 +1131,24 @@ static enum dc_status dcn10_validate_plane(const struct dc_plane_state *plane_st + return DC_OK; + } + ++static enum dc_status dcn10_get_default_swizzle_mode(struct dc_plane_state *plane_state) ++{ ++ enum dc_status result = DC_OK; ++ ++ enum surface_pixel_format surf_pix_format = plane_state->format; ++ unsigned int bpp = resource_pixel_format_to_bpp(surf_pix_format); ++ ++ enum swizzle_mode_values swizzle = DC_SW_LINEAR; ++ ++ if (bpp == 64) ++ swizzle = DC_SW_64KB_D; ++ else ++ swizzle = DC_SW_64KB_S; ++ ++ plane_state->tiling_info.gfx9.swizzle = swizzle; ++ return result; ++} ++ + static const struct dc_cap_funcs cap_funcs = { + .get_dcc_compression_cap = dcn10_get_dcc_compression_cap + }; +@@ -1141,7 +1159,8 @@ static const struct resource_funcs dcn10_res_pool_funcs = { + .validate_bandwidth = dcn_validate_bandwidth, + .acquire_idle_pipe_for_layer = dcn10_acquire_idle_pipe_for_layer, + .validate_plane = dcn10_validate_plane, +- .add_stream_to_ctx = dcn10_add_stream_to_ctx ++ .add_stream_to_ctx = dcn10_add_stream_to_ctx, ++ .get_default_swizzle_mode = dcn10_get_default_swizzle_mode + }; + + static uint32_t read_pipe_fuses(struct dc_context *ctx) +diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h +index 71fcc4b2abca..55352589ab02 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h +@@ -120,6 +120,9 @@ struct resource_funcs { + struct dc *dc, + struct dc_state *new_ctx, + struct dc_stream_state *stream); ++ enum dc_status (*get_default_swizzle_mode)( ++ struct dc_plane_state *plane_state); ++ + }; + + struct audio_support{ +diff --git a/drivers/gpu/drm/amd/display/dc/inc/resource.h b/drivers/gpu/drm/amd/display/dc/inc/resource.h +index 76d00c6dbca9..33b99e3ab10d 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/resource.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/resource.h +@@ -172,4 +172,7 @@ void update_audio_usage( + const struct resource_pool *pool, + struct audio *audio, + bool acquired); ++ ++unsigned int resource_pixel_format_to_bpp(enum surface_pixel_format format); ++ + #endif /* DRIVERS_GPU_DRM_AMD_DC_DEV_DC_INC_RESOURCE_H_ */ +-- +2.17.1 + |