diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3831-drm-amd-display-Add-debugfs-entry-to-force-YUV420-ou.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3831-drm-amd-display-Add-debugfs-entry-to-force-YUV420-ou.patch | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3831-drm-amd-display-Add-debugfs-entry-to-force-YUV420-ou.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3831-drm-amd-display-Add-debugfs-entry-to-force-YUV420-ou.patch new file mode 100644 index 00000000..f756f400 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3831-drm-amd-display-Add-debugfs-entry-to-force-YUV420-ou.patch @@ -0,0 +1,110 @@ +From ef1c0ee906b4da04cbf3684cf26feab70b2b899f Mon Sep 17 00:00:00 2001 +From: Stylon Wang <stylon.wang@amd.com> +Date: Tue, 20 Aug 2019 14:48:37 -0400 +Subject: [PATCH 3831/4256] drm/amd/display: Add debugfs entry to force YUV420 + output + +[Why] +Even if YUV420 is available for video mode, YUV444 is still +automatically selected. This poses a problem for compliance tests. + +[How] +Add a per-connector debugfs entry "force_yuv420_output" to force +selection of YUV420 mode. + +Signed-off-by: Stylon Wang <stylon.wang@amd.com> +Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com> +Acked-by: Leo Li <sunpeng.li@amd.com> +--- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 5 ++- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 1 + + .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 31 +++++++++++++++++++ + 3 files changed, 36 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index a0ae950d3a60..1b63ce6b9370 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -3380,7 +3380,7 @@ static void fill_stream_properties_from_drm_display_mode( + { + struct dc_crtc_timing *timing_out = &stream->timing; + const struct drm_display_info *info = &connector->display_info; +- ++ struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); + memset(timing_out, 0, sizeof(struct dc_crtc_timing)); + + timing_out->h_border_left = 0; +@@ -3391,6 +3391,9 @@ static void fill_stream_properties_from_drm_display_mode( + if (drm_mode_is_420_only(info, mode_in) + && stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) + timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420; ++ else if (drm_mode_is_420_also(info, mode_in) ++ && aconnector->force_yuv420_output) ++ timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420; + else if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCRCB444) + && stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) + timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR444; +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +index 32893635c995..c39ee21c290f 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +@@ -281,6 +281,7 @@ struct amdgpu_dm_connector { + uint32_t debugfs_dpcd_address; + uint32_t debugfs_dpcd_size; + #endif ++ bool force_yuv420_output; + }; + + #define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base) +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +index 8fa160378378..1f1ed64dd78d 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +@@ -941,6 +941,33 @@ static const struct { + {"aux_dpcd_data", &dp_dpcd_data_debugfs_fops} + }; + ++/* ++ * Force YUV420 output if available from the given mode ++ */ ++static int force_yuv420_output_set(void *data, u64 val) ++{ ++ struct amdgpu_dm_connector *connector = data; ++ ++ connector->force_yuv420_output = (bool)val; ++ ++ return 0; ++} ++ ++/* ++ * Check if YUV420 is forced when available from the given mode ++ */ ++static int force_yuv420_output_get(void *data, u64 *val) ++{ ++ struct amdgpu_dm_connector *connector = data; ++ ++ *val = connector->force_yuv420_output; ++ ++ return 0; ++} ++ ++DEFINE_DEBUGFS_ATTRIBUTE(force_yuv420_output_fops, force_yuv420_output_get, ++ force_yuv420_output_set, "%llu\n"); ++ + void connector_debugfs_init(struct amdgpu_dm_connector *connector) + { + int i; +@@ -954,6 +981,10 @@ void connector_debugfs_init(struct amdgpu_dm_connector *connector) + dp_debugfs_entries[i].fops); + } + } ++ ++ debugfs_create_file_unsafe("force_yuv420_output", 0644, dir, connector, ++ &force_yuv420_output_fops); ++ + } + + /* +-- +2.17.1 + |