]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd/display: add HDMI 2.1 Compliance Support
authorFangzhi Zuo <Jerry.Zuo@amd.com>
Tue, 28 Apr 2026 20:53:29 +0000 (16:53 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 3 Jun 2026 17:44:56 +0000 (13:44 -0400)
Add force yuv format from igt for compliance test.

Signed-off-by: Fangzhi Zuo <Jerry.Zuo@amd.com>
Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c

index 8ef40fe81013f0d3bf1a48f2c372bd0b2f45fb85..06b674129f4d7b105ffaac44cccd6f77fd8e2e02 100644 (file)
@@ -6978,18 +6978,26 @@ static void fill_stream_properties_from_drm_display_mode(
        timing_out->v_border_bottom = 0;
        /* TODO: un-hardcode */
        if (drm_mode_is_420_only(info, mode_in)
-                       && stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
+                       && (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A ||
+                           stream->signal == SIGNAL_TYPE_HDMI_FRL)
+                       && aconnector
+                       && aconnector->force_yuv_pixel_format == PIXEL_ENCODING_YCBCR420)
                timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420;
        else if (drm_mode_is_420_also(info, mode_in)
                        && aconnector
-                       && aconnector->force_yuv420_output)
+                       && (aconnector->force_yuv_pixel_format == PIXEL_ENCODING_YCBCR420
+                       || aconnector->force_yuv420_output))
                timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420;
        else if ((connector->display_info.color_formats & BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR422))
                        && aconnector
-                       && aconnector->force_yuv422_output)
+                       && (aconnector->force_yuv_pixel_format == PIXEL_ENCODING_YCBCR422
+                       || aconnector->force_yuv422_output))
                timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR422;
        else if ((connector->display_info.color_formats & BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR444))
-                       && stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
+                       && (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A ||
+                           stream->signal == SIGNAL_TYPE_HDMI_FRL)
+                       && aconnector
+                       && aconnector->force_yuv_pixel_format == PIXEL_ENCODING_YCBCR444)
                timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR444;
        else
                timing_out->pixel_encoding = PIXEL_ENCODING_RGB;
index e92b3bc844695b0cdf9e0823b65417d80642db1e..d0cad3bfe697b96b2dc0c879dca94c65a3c6c451 100644 (file)
@@ -848,6 +848,7 @@ struct amdgpu_dm_connector {
        bool fake_enable;
        bool force_yuv420_output;
        bool force_yuv422_output;
+       uint8_t force_yuv_pixel_format;
        struct dsc_preferred_settings dsc_settings;
        struct psr_caps psr_caps;
        union dp_downstream_port_present mst_downstream_port_present;
index df6c54d84b8f0a147447fe856fcc9c3f7fd74635..7db38ad3f8487998ecc132bb54a45866df57e6bc 100644 (file)
@@ -3142,6 +3142,7 @@ static int force_yuv420_output_set(void *data, u64 val)
        struct amdgpu_dm_connector *connector = data;
 
        connector->force_yuv420_output = (bool)val;
+       connector->force_yuv_pixel_format = PIXEL_ENCODING_YCBCR420;
 
        return 0;
 }
@@ -3161,6 +3162,31 @@ static int force_yuv420_output_get(void *data, u64 *val)
 DEFINE_DEBUGFS_ATTRIBUTE(force_yuv420_output_fops, force_yuv420_output_get,
                         force_yuv420_output_set, "%llu\n");
 
+static int force_yuv422_output_set(void *data, u64 val)
+{
+      struct amdgpu_dm_connector *connector = data;
+
+      connector->force_yuv422_output = (bool)val;
+      connector->force_yuv_pixel_format = PIXEL_ENCODING_YCBCR422;
+
+      return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(force_yuv422_output_fops, NULL,
+                       force_yuv422_output_set, "%llu\n");
+
+static int force_yuv444_output_set(void *data, u64 val)
+{
+      struct amdgpu_dm_connector *connector = data;
+
+      connector->force_yuv_pixel_format = PIXEL_ENCODING_YCBCR444;
+
+      return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(force_yuv444_output_fops, NULL,
+                       force_yuv444_output_set, "%llu\n");
+
 /*
  *  Read Replay state
  */
@@ -3610,6 +3636,8 @@ static const struct {
        const struct file_operations *fops;
 } connector_debugfs_entries[] = {
                {"force_yuv420_output", &force_yuv420_output_fops},
+               {"force_yuv422_output", &force_yuv422_output_fops},
+               {"force_yuv444_output", &force_yuv444_output_fops},
                {"trigger_hotplug", &trigger_hotplug_debugfs_fops},
                {"internal_display", &internal_display_fops},
                {"odm_combine_segments", &odm_combine_segments_fops}