aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3831-drm-amd-display-Add-debugfs-entry-to-force-YUV420-ou.patch
diff options
context:
space:
mode:
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.patch110
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
+