From nobody Fri Dec 26 03:24:39 2025 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A0153C6A4 for ; Tue, 9 Jan 2024 18:11:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=yngvason.is Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yngvason.is Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=yngvason.is header.i=@yngvason.is header.b="NFyOBa68" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-40e4f71288bso9849915e9.1 for ; Tue, 09 Jan 2024 10:11:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yngvason.is; s=google; t=1704823881; x=1705428681; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=j5TmlSqr2R0DSFOwP1jgxjjJC7p4LGOYCLeSujiTr2s=; b=NFyOBa68JSBivYbQH0MOufyWc2LTeC9fzzWCLqo5MyR8S74VtriYTjyi7CbKsmbxBQ Jo2vJYt6mR0ObOGPBPS4GUthV+fKNBR5PSDA7TFZB88oVG0yLQ5n4KQ9RohvH3OtjMzM ORjB+0Tveacfdk3r8xudlzdIEyKp1O16XIlT4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704823881; x=1705428681; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=j5TmlSqr2R0DSFOwP1jgxjjJC7p4LGOYCLeSujiTr2s=; b=UjlI3n2DCcABYX77Zku1GgjIFWgqNz4yx+sG2kGLNGFolZLp8ZSjCQ2uFGDpXaPHZ3 Wt0eDhXypwtdScLrKBC4rSQ+vVvYE3yyJ9lokjCChiunGcYev1RNO+IwOi4B6L+R4Nbc AZLC2zZy5JmpEyDPhcEEFAY03PUsOyVmEitk2JpLPjZwiflybYSa69d5j4m5lQrArv3g UBjDo6qdNFdCVQCK9bdGVxTISrjbL5dpk4uQewVrvzFFcP5jWwLs3MXrUOL/yYibR6cP VNq6U/YdwIpbLy3eaTvF90Rjk0VzLt9p1vm5Y6Ab05xgIVhZHZLYxnxp5fyUZMZUVAU6 IGMA== X-Gm-Message-State: AOJu0Yxh50Crrb6xZa2uZ6QDAaU2dPClHq/iSRP4WA34CxuWv2Vjib+7 JvQxaYvC7IUyqnrThW+mOUA6gN0piOTt0A== X-Google-Smtp-Source: AGHT+IE8mUwmBNyBZAX/TyOCIvUTmkvOp0uvsitYL/5KGkF2V5MZ5MAl58F6Q1VC6O24Tg7pMyScTA== X-Received: by 2002:a05:600c:468b:b0:40d:8909:b3a3 with SMTP id p11-20020a05600c468b00b0040d8909b3a3mr2205592wmo.20.1704823881662; Tue, 09 Jan 2024 10:11:21 -0800 (PST) Received: from andri-workstation.turninn.appdynamic.com ([2a01:8280:aa07:ad:7285:c2ff:fef0:4baf]) by smtp.gmail.com with ESMTPSA id n25-20020a05600c3b9900b0040e527602c8sm2104579wms.9.2024.01.09.10.11.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jan 2024 10:11:21 -0800 (PST) From: Andri Yngvason To: Harry Wentland , Leo Li , Rodrigo Siqueira , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , "Pan, Xinhui" , David Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin Cc: amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, intel-gfx@lists.freedesktop.org, Simon Ser , Werner Sembach , Andri Yngvason Subject: [PATCH 1/7] drm/amd/display: Remove unnecessary SIGNAL_TYPE_HDMI_TYPE_A check Date: Tue, 9 Jan 2024 18:10:58 +0000 Message-ID: <20240109181104.1670304-2-andri@yngvason.is> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240109181104.1670304-1-andri@yngvason.is> References: <20240109181104.1670304-1-andri@yngvason.is> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Werner Sembach Remove unnecessary SIGNAL_TYPE_HDMI_TYPE_A check that was performed in the drm_mode_is_420_only() case, but not in the drm_mode_is_420_also() && force_yuv420_output case. Without further knowledge if YCbCr 4:2:0 is supported outside of HDMI, there is no reason to use RGB when the display reports drm_mode_is_420_only() even on a non HDMI connection. This patch also moves both checks in the same if-case. This eliminates an extra else-if-case. Signed-off-by: Werner Sembach Signed-off-by: Andri Yngvason Tested-by: Andri Yngvason --- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gp= u/drm/amd/display/amdgpu_dm/amdgpu_dm.c index c8c00c2a5224a..10e041a3b2545 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -5524,10 +5524,7 @@ static void fill_stream_properties_from_drm_display_= mode( timing_out->v_border_bottom =3D 0; /* TODO: un-hardcode */ if (drm_mode_is_420_only(info, mode_in) - && stream->signal =3D=3D SIGNAL_TYPE_HDMI_TYPE_A) - timing_out->pixel_encoding =3D PIXEL_ENCODING_YCBCR420; - else if (drm_mode_is_420_also(info, mode_in) - && aconnector->force_yuv420_output) + || (drm_mode_is_420_also(info, mode_in) && aconnector->force_yuv420_out= put)) timing_out->pixel_encoding =3D PIXEL_ENCODING_YCBCR420; else if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR4= 44) && stream->signal =3D=3D SIGNAL_TYPE_HDMI_TYPE_A) --=20 2.43.0 From nobody Fri Dec 26 03:24:39 2025 Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3777A3B2BD for ; Tue, 9 Jan 2024 18:11:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=yngvason.is Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yngvason.is Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=yngvason.is header.i=@yngvason.is header.b="G4/toiPv" Received: by mail-wr1-f53.google.com with SMTP id ffacd0b85a97d-3368ae75082so2434321f8f.1 for ; Tue, 09 Jan 2024 10:11:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yngvason.is; s=google; t=1704823888; x=1705428688; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=iv1CfwfAn7ER1wsoqgpUMaFNsB1LA0XxFCM2c1c7OSw=; b=G4/toiPvFrdHXMzbEVJ5OgWm/tTyhic25V1Ch1HdieFO9cbifVpySeiSj/FmQJer1Z F2tTzQ4s0qcpT2NfT6Yglz8Bpmi2AhIM5o2aV73uLfZzx8AWWRnDsKbQ/Nt3SD1roK9a Eu2d5DMqbV1mlccMA0ftVFAPs6E2gYFOy3j2A= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704823888; x=1705428688; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=iv1CfwfAn7ER1wsoqgpUMaFNsB1LA0XxFCM2c1c7OSw=; b=MLWvcKO5yJrIezXibcgPTiqsUlhX/DOqrcH4YQDcfGdHICGqTGjoptTPPZH83hFywv L8virBiHpY/JNOPPN/IGdeAYw2vnQYM5OXdTgSeyEt+ApZVy9rt4wRvYVuEmmPKYFBDf pSJp8P+HxYS9cxoh/o0KYajZ1Z3VIiDqGpQtE9jSM3GS2uY8kXoZ86fbO/Xbgep+b9Yh 46zX7IwkP5sHRQqaKgUoyvWSe4gnM0S9wpkk3qXjZa4FOqlvWU5l3xHehVbin+U8PYvk JYp8LzQwdbowSGFVuWveaxtip5RETHQJnZ2tH9oe2MgulALHJOhrhxqwRSrp9hmOjJub rmKg== X-Gm-Message-State: AOJu0YyQIWB9pmtoYrfro8Sgmo3+XWRnx61daUb22dppvrGrSFWxfjw6 zxc/5qE7jl2WneBgjLIYHFRq5EaCusyZSg== X-Google-Smtp-Source: AGHT+IHW+vnqtWq9qmMkX3cIDIbzoDHeml8A7NAyBIdCumvkqdPXyTH0vlksZ0ndiZHQzAVFE7zyJg== X-Received: by 2002:a05:600c:298c:b0:40d:5aea:c89b with SMTP id r12-20020a05600c298c00b0040d5aeac89bmr648932wmd.64.1704823888508; Tue, 09 Jan 2024 10:11:28 -0800 (PST) Received: from andri-workstation.turninn.appdynamic.com ([2a01:8280:aa07:ad:7285:c2ff:fef0:4baf]) by smtp.gmail.com with ESMTPSA id n25-20020a05600c3b9900b0040e527602c8sm2104579wms.9.2024.01.09.10.11.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jan 2024 10:11:27 -0800 (PST) From: Andri Yngvason To: Harry Wentland , Leo Li , Rodrigo Siqueira , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , "Pan, Xinhui" , David Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin Cc: amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, intel-gfx@lists.freedesktop.org, Simon Ser , Werner Sembach , Andri Yngvason Subject: [PATCH 2/7] drm/uAPI: Add "active color format" drm property as feedback for userspace Date: Tue, 9 Jan 2024 18:10:59 +0000 Message-ID: <20240109181104.1670304-3-andri@yngvason.is> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240109181104.1670304-1-andri@yngvason.is> References: <20240109181104.1670304-1-andri@yngvason.is> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Werner Sembach Add a new general drm property "active color format" which can be used by graphic drivers to report the used color format back to userspace. There was no way to check which color format got actually used on a given monitor. To surely predict this, one must know the exact capabilities of the monitor, the GPU, and the connection used and what the default behaviour of the used driver is (e.g. amdgpu prefers YCbCr 4:4:4 while i915 prefers RGB). This property helps eliminating the guessing on this point. In the future, automatic color calibration for screens might also depend on this information being available. Signed-off-by: Werner Sembach Signed-off-by: Andri Yngvason Tested-by: Andri Yngvason --- drivers/gpu/drm/drm_connector.c | 63 +++++++++++++++++++++++++++++++++ include/drm/drm_connector.h | 10 ++++++ 2 files changed, 73 insertions(+) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index c3725086f4132..30d62e505d188 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -1061,6 +1061,14 @@ static const struct drm_prop_enum_list drm_dp_subcon= nector_enum_list[] =3D { { DRM_MODE_SUBCONNECTOR_Native, "Native" }, /* DP */ }; =20 +static const struct drm_prop_enum_list drm_active_color_format_enum_list[]= =3D { + { 0, "not applicable" }, + { DRM_COLOR_FORMAT_RGB444, "rgb" }, + { DRM_COLOR_FORMAT_YCBCR444, "ycbcr444" }, + { DRM_COLOR_FORMAT_YCBCR422, "ycbcr422" }, + { DRM_COLOR_FORMAT_YCBCR420, "ycbcr420" }, +}; + DRM_ENUM_NAME_FN(drm_get_dp_subconnector_name, drm_dp_subconnector_enum_list) =20 @@ -1390,6 +1398,15 @@ static const u32 dp_colorspaces =3D * drm_connector_attach_max_bpc_property() to create and attach the * property to the connector during initialization. * + * active color format: + * This read-only property tells userspace the color format actually used + * by the hardware display engine "on the cable" on a connector. The chosen + * value depends on hardware capabilities, both display engine and + * connected monitor. Drivers shall use + * drm_connector_attach_active_color_format_property() to install this + * property. Possible values are "not applicable", "rgb", "ycbcr444", + * "ycbcr422", and "ycbcr420". + * * Connectors also have one standardized atomic property: * * CRTC_ID: @@ -2451,6 +2468,52 @@ int drm_connector_attach_max_bpc_property(struct drm= _connector *connector, } EXPORT_SYMBOL(drm_connector_attach_max_bpc_property); =20 +/** + * drm_connector_attach_active_color_format_property - attach "active colo= r format" property + * @connector: connector to attach active color format property on. + * + * This is used to check the applied color format on a connector. + * + * Returns: + * Zero on success, negative errno on failure. + */ +int drm_connector_attach_active_color_format_property(struct drm_connector= *connector) +{ + struct drm_device *dev =3D connector->dev; + struct drm_property *prop; + + if (!connector->active_color_format_property) { + prop =3D drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE, "active = color format", + drm_active_color_format_enum_list, + ARRAY_SIZE(drm_active_color_format_enum_list)); + if (!prop) + return -ENOMEM; + + connector->active_color_format_property =3D prop; + } + + drm_object_attach_property(&connector->base, prop, 0); + + return 0; +} +EXPORT_SYMBOL(drm_connector_attach_active_color_format_property); + +/** + * drm_connector_set_active_color_format_property - sets the active color = format property for a + * connector + * @connector: drm connector + * @active_color_format: color format for the connector currently active "= on the cable" + * + * Should be used by atomic drivers to update the active color format over= a connector. + */ +void drm_connector_set_active_color_format_property(struct drm_connector *= connector, + u32 active_color_format) +{ + drm_object_property_set_value(&connector->base, connector->active_color_f= ormat_property, + active_color_format); +} +EXPORT_SYMBOL(drm_connector_set_active_color_format_property); + /** * drm_connector_attach_hdr_output_metadata_property - attach "HDR_OUTPUT_= METADA" property * @connector: connector to attach the property on. diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index fe88d7fc6b8f4..9ae73cfdceeb1 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -1699,6 +1699,12 @@ struct drm_connector { */ struct drm_property *privacy_screen_hw_state_property; =20 + /** + * @active_color_format_property: Default connector property for the + * active color format to be driven out of the connector. + */ + struct drm_property *active_color_format_property; + #define DRM_CONNECTOR_POLL_HPD (1 << 0) #define DRM_CONNECTOR_POLL_CONNECT (1 << 1) #define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2) @@ -2053,6 +2059,10 @@ void drm_connector_attach_privacy_screen_provider( struct drm_connector *connector, struct drm_privacy_screen *priv); void drm_connector_update_privacy_screen(const struct drm_connector_state = *connector_state); =20 +int drm_connector_attach_active_color_format_property(struct drm_connector= *connector); +void drm_connector_set_active_color_format_property(struct drm_connector *= connector, + u32 active_color_format); + /** * struct drm_tile_group - Tile group metadata * @refcount: reference count --=20 2.43.0 From nobody Fri Dec 26 03:24:39 2025 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 16F9B3C6A4 for ; Tue, 9 Jan 2024 18:11:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=yngvason.is Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yngvason.is Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=yngvason.is header.i=@yngvason.is header.b="fq1GBTbr" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-40e43e489e4so34643035e9.1 for ; Tue, 09 Jan 2024 10:11:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yngvason.is; s=google; t=1704823893; x=1705428693; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Ab6S82YVhL2fQWMl7n/iDflNvLFt/phlZFbHK/9RmUw=; b=fq1GBTbrZbQyxPMF0QpQ/uHN2osqF60fTCQdTVQGqr6CLPDii77IBJBMB9+1RpLFSt 4bSzvvvVaZaydL+ZhGW55rGlrSMR4gXSPs2Ij7Rx1goZ0aFFH4ZKZKKglEoN5AgMDxZC 7p8eqYRBXmtSYY7LNw/fR8b0tl31+GFAUSVLw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704823893; x=1705428693; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Ab6S82YVhL2fQWMl7n/iDflNvLFt/phlZFbHK/9RmUw=; b=FkGr7V+SPbszMjFSVveUfnK4EqaNBhmQWnm1MH4ejj7sLhQoLYKQ0lphpM5edpxjpL RulxDgF/XAUwQA6F8yBhcBWR6et1Pw6FEh3z8Qt7LEieGPplgGOypXaBf8EaqXXyKQR4 jbwv3fcxUiBk0V5kTfBtBzAObyemiFipEpBCWuMmm/WedUd2uw6NgNRYlduLwa8OLu8X HHtUO5iZdnK4jaxqFL55j4cuHPshwXeS11jxBW6kmjVj3juv3haDC0kr37oL9tOyErd+ csm4J63+Tz+6Z8LVpRBWmHPVBPW/MpatgAs0JLaZ5zTvntekB6abGzgCmkCHOrCNk5WB awYw== X-Gm-Message-State: AOJu0YwwbplKh6NRMV88SgTX9AXD9atlg7LqU+RSaZHFA/Mm7ttIFS7l +ag/aRxGXXJJwP9J3Nv2+LZnNuU12ABsYw== X-Google-Smtp-Source: AGHT+IECX0laRRtfF4jvavSEkKwLcA9a4P5MCiLvTCxN6JaHCGAk1yoL0mgxvPQHa7eWzawwSwZVFQ== X-Received: by 2002:a05:600c:1c20:b0:40e:53f8:5242 with SMTP id j32-20020a05600c1c2000b0040e53f85242mr186194wms.72.1704823893245; Tue, 09 Jan 2024 10:11:33 -0800 (PST) Received: from andri-workstation.turninn.appdynamic.com ([2a01:8280:aa07:ad:7285:c2ff:fef0:4baf]) by smtp.gmail.com with ESMTPSA id n25-20020a05600c3b9900b0040e527602c8sm2104579wms.9.2024.01.09.10.11.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jan 2024 10:11:32 -0800 (PST) From: Andri Yngvason To: Harry Wentland , Leo Li , Rodrigo Siqueira , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , "Pan, Xinhui" , David Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin Cc: amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, intel-gfx@lists.freedesktop.org, Simon Ser , Werner Sembach , Andri Yngvason Subject: [PATCH 3/7] drm/amd/display: Add handling for new "active color format" property Date: Tue, 9 Jan 2024 18:11:00 +0000 Message-ID: <20240109181104.1670304-4-andri@yngvason.is> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240109181104.1670304-1-andri@yngvason.is> References: <20240109181104.1670304-1-andri@yngvason.is> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Werner Sembach This commit implements the "active color format" drm property for the AMD GPU driver. Signed-off-by: Werner Sembach Signed-off-by: Andri Yngvason Tested-by: Andri Yngvason --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 42 ++++++++++++++++++- .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 4 ++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gp= u/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 10e041a3b2545..b44d06c3b1706 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -6882,6 +6882,24 @@ int convert_dc_color_depth_into_bpc(enum dc_color_de= pth display_color_depth) return 0; } =20 +static int convert_dc_pixel_encoding_into_drm_color_format( + enum dc_pixel_encoding display_pixel_encoding) +{ + switch (display_pixel_encoding) { + case PIXEL_ENCODING_RGB: + return DRM_COLOR_FORMAT_RGB444; + case PIXEL_ENCODING_YCBCR422: + return DRM_COLOR_FORMAT_YCBCR422; + case PIXEL_ENCODING_YCBCR444: + return DRM_COLOR_FORMAT_YCBCR444; + case PIXEL_ENCODING_YCBCR420: + return DRM_COLOR_FORMAT_YCBCR420; + default: + break; + } + return 0; +} + static int dm_encoder_helper_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) @@ -7436,8 +7454,10 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_d= isplay_manager *dm, adev->mode_info.underscan_vborder_property, 0); =20 - if (!aconnector->mst_root) + if (!aconnector->mst_root) { drm_connector_attach_max_bpc_property(&aconnector->base, 8, 16); + drm_connector_attach_active_color_format_property(&aconnector->base); + } =20 aconnector->base.state->max_bpc =3D 16; aconnector->base.state->max_requested_bpc =3D aconnector->base.state->max= _bpc; @@ -8969,6 +8989,26 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_= atomic_state *state) kfree(dummy_updates); } =20 + /* Extract information from crtc to communicate it to userspace as connec= tor properties */ + for_each_new_connector_in_state(state, connector, new_con_state, i) { + struct drm_crtc *crtc =3D new_con_state->crtc; + struct dc_stream_state *stream; + + if (crtc) { + new_crtc_state =3D drm_atomic_get_new_crtc_state(state, crtc); + dm_new_crtc_state =3D to_dm_crtc_state(new_crtc_state); + stream =3D dm_new_crtc_state->stream; + + if (stream) { + drm_connector_set_active_color_format_property(connector, + convert_dc_pixel_encoding_into_drm_color_format( + dm_new_crtc_state->stream->timing.pixel_encoding)); + } + } else { + drm_connector_set_active_color_format_property(connector, 0); + } + } + /** * Enable interrupts for CRTCs that are newly enabled or went through * a modeset. It was intentionally deferred until after the front end diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/= drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index 11da0eebee6c4..a4d1b3ea8f81c 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c @@ -600,6 +600,10 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr= *mgr, if (connector->max_bpc_property) drm_connector_attach_max_bpc_property(connector, 8, 16); =20 + connector->active_color_format_property =3D master->base.active_color_for= mat_property; + if (connector->active_color_format_property) + drm_connector_attach_active_color_format_property(&aconnector->base); + connector->vrr_capable_property =3D master->base.vrr_capable_property; if (connector->vrr_capable_property) drm_connector_attach_vrr_capable_property(connector); --=20 2.43.0 From nobody Fri Dec 26 03:24:39 2025 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6AEDE3D3A3 for ; Tue, 9 Jan 2024 18:11:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=yngvason.is Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yngvason.is Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=yngvason.is header.i=@yngvason.is header.b="Y+hn9Ho4" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-40e43fb2659so26945385e9.1 for ; Tue, 09 Jan 2024 10:11:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yngvason.is; s=google; t=1704823897; x=1705428697; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xEKXGZp6/dSPIf69wGEjjsLtzr50iEJJm//VReGTJdM=; b=Y+hn9Ho4Qqq4Alp3DzfcBQo9TQGkabKoNzHpPdWb4reuKCxWeA/a+Q7xFX3jTAXrrA eus97KfjbJjdwZD9WaCHliDJCrvegVNZ+b4cBesVDSoRL9j5UYBwyLJo/rUmrWa4lm0u Bf4mU4qREOAZOxnkIu+JhM/rDfVd7NXi+CuTQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704823897; x=1705428697; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xEKXGZp6/dSPIf69wGEjjsLtzr50iEJJm//VReGTJdM=; b=ePBnLS6qOklA3VAqaeVBttGeKFIkZfZD48eoWefFg0Nj726wgZ0C/qu5g193RrDTuf fHPB8Ou4kEC1LHIxx1zoCEr6qwP6BTBxnp2gIOLh/RPuNPrSj65zkUuyRmAwDGWMlX6S ufsyR//cdbI+abZY1n3BxTkv39NGcK0flDyGkbJpWBCjpPHi6dtGAz7PiTT4KWrwOvvQ 5dhVOby4o9xsyfwnPs4sZQrqxj/IQX7NOcEAV0gxEjtStwCVi86HgM3cpKk3JXR6LHxD my+fyhow+IaGF1mLvk1ogfCDeC8OHP08bSeQ8P1smKtuA7iJvbq3PuywtCeCNcAkiUQG 6AYQ== X-Gm-Message-State: AOJu0YwOVmxDTpBRzgIftUZpGE6obj7xMMLe5k2cOKUeSDdnY1yFL1FG cA6qhWshfk58EeZVH1noK+67T/SOSgNJRg== X-Google-Smtp-Source: AGHT+IGPmvdUO8SXjXgKV/aQCxeStLpIIPvoeykWdqZkiW7Qc5Us/N/1WUFwWDhYHwAEHPNbOA3kGg== X-Received: by 2002:a05:600c:228d:b0:40e:4579:9eb1 with SMTP id 13-20020a05600c228d00b0040e45799eb1mr2208339wmf.1.1704823897680; Tue, 09 Jan 2024 10:11:37 -0800 (PST) Received: from andri-workstation.turninn.appdynamic.com ([2a01:8280:aa07:ad:7285:c2ff:fef0:4baf]) by smtp.gmail.com with ESMTPSA id n25-20020a05600c3b9900b0040e527602c8sm2104579wms.9.2024.01.09.10.11.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jan 2024 10:11:37 -0800 (PST) From: Andri Yngvason To: Harry Wentland , Leo Li , Rodrigo Siqueira , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , "Pan, Xinhui" , David Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin Cc: amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, intel-gfx@lists.freedesktop.org, Simon Ser , Werner Sembach , Andri Yngvason Subject: [PATCH 4/7] drm/i915/display: Add handling for new "active color format" property Date: Tue, 9 Jan 2024 18:11:01 +0000 Message-ID: <20240109181104.1670304-5-andri@yngvason.is> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240109181104.1670304-1-andri@yngvason.is> References: <20240109181104.1670304-1-andri@yngvason.is> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Werner Sembach This commit implements the "active color format" drm property for the Intel GPU driver. Signed-off-by: Werner Sembach Signed-off-by: Andri Yngvason Tested-by: Andri Yngvason --- drivers/gpu/drm/i915/display/intel_display.c | 33 ++++++++++++++++++++ drivers/gpu/drm/i915/display/intel_dp.c | 7 +++-- drivers/gpu/drm/i915/display/intel_dp_mst.c | 5 +++ drivers/gpu/drm/i915/display/intel_hdmi.c | 4 ++- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm= /i915/display/intel_display.c index df582ff81b45f..79cc258db8f09 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -7167,6 +7167,21 @@ static void intel_atomic_prepare_plane_clear_colors(= struct intel_atomic_state *s } } =20 +static int convert_intel_output_format_into_drm_color_format(enum intel_ou= tput_format output_format) +{ + switch (output_format) { + case INTEL_OUTPUT_FORMAT_RGB: + return DRM_COLOR_FORMAT_RGB444; + case INTEL_OUTPUT_FORMAT_YCBCR420: + return DRM_COLOR_FORMAT_YCBCR420; + case INTEL_OUTPUT_FORMAT_YCBCR444: + return DRM_COLOR_FORMAT_YCBCR444; + default: + break; + } + return 0; +} + static void intel_atomic_commit_tail(struct intel_atomic_state *state) { struct drm_device *dev =3D state->base.dev; @@ -7438,6 +7453,9 @@ int intel_atomic_commit(struct drm_device *dev, struc= t drm_atomic_state *_state, { struct intel_atomic_state *state =3D to_intel_atomic_state(_state); struct drm_i915_private *dev_priv =3D to_i915(dev); + struct drm_connector *connector; + struct drm_connector_state *new_conn_state; + int i; int ret =3D 0; =20 state->wakeref =3D intel_runtime_pm_get(&dev_priv->runtime_pm); @@ -7506,6 +7524,21 @@ int intel_atomic_commit(struct drm_device *dev, stru= ct drm_atomic_state *_state, intel_shared_dpll_swap_state(state); intel_atomic_track_fbs(state); =20 + /* Extract information from crtc to communicate it to userspace as connec= tor properties */ + for_each_new_connector_in_state(&state->base, connector, new_conn_state, = i) { + struct intel_crtc *crtc =3D to_intel_crtc(new_conn_state->crtc); + + if (crtc) { + struct intel_crtc_state *new_crtc_state =3D + intel_atomic_get_new_crtc_state(state, crtc); + + drm_connector_set_active_color_format_property(connector, + convert_intel_output_format_into_drm_color_format( + new_crtc_state->output_format)); + } else + drm_connector_set_active_color_format_property(connector, 0); + } + drm_atomic_state_get(&state->base); INIT_WORK(&state->base.commit_work, intel_atomic_commit_work); =20 diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915= /display/intel_dp.c index 62ce92772367f..c40fe8a847614 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -5910,10 +5910,13 @@ intel_dp_add_properties(struct intel_dp *intel_dp, = struct drm_connector *connect intel_attach_force_audio_property(connector); =20 intel_attach_broadcast_rgb_property(connector); - if (HAS_GMCH(dev_priv)) + if (HAS_GMCH(dev_priv)) { drm_connector_attach_max_bpc_property(connector, 6, 10); - else if (DISPLAY_VER(dev_priv) >=3D 5) + drm_connector_attach_active_color_format_property(connector); + } else if (DISPLAY_VER(dev_priv) >=3D 5) { drm_connector_attach_max_bpc_property(connector, 6, 12); + drm_connector_attach_active_color_format_property(connector); + } =20 /* Register HDMI colorspace for case of lspcon */ if (intel_bios_encoder_is_lspcon(dp_to_dig_port(intel_dp)->base.devdata))= { diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/= i915/display/intel_dp_mst.c index aa10612626136..e7574ca0604e6 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c @@ -1210,6 +1210,11 @@ static struct drm_connector *intel_dp_add_mst_connec= tor(struct drm_dp_mst_topolo drm_dbg_kms(&dev_priv->drm, "[%s:%d] HDCP MST init failed, skipping.\n", connector->name, connector->base.id); =20 + connector->active_color_format_property =3D + intel_dp->attached_connector->base.active_color_format_property; + if (connector->active_color_format_property) + drm_connector_attach_active_color_format_property(connector); + return connector; =20 err: diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i9= 15/display/intel_hdmi.c index bfa456fa7d25c..ce0221f90de92 100644 --- a/drivers/gpu/drm/i915/display/intel_hdmi.c +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c @@ -2611,8 +2611,10 @@ intel_hdmi_add_properties(struct intel_hdmi *intel_h= dmi, struct drm_connector *c if (DISPLAY_VER(dev_priv) >=3D 10) drm_connector_attach_hdr_output_metadata_property(connector); =20 - if (!HAS_GMCH(dev_priv)) + if (!HAS_GMCH(dev_priv)) { drm_connector_attach_max_bpc_property(connector, 8, 12); + drm_connector_attach_active_color_format_property(connector); + } } =20 /* --=20 2.43.0 From nobody Fri Dec 26 03:24:39 2025 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4CAB13D54E for ; Tue, 9 Jan 2024 18:11:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=yngvason.is Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yngvason.is Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=yngvason.is header.i=@yngvason.is header.b="V/emrowL" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-40d4f5d902dso34426705e9.2 for ; Tue, 09 Jan 2024 10:11:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yngvason.is; s=google; t=1704823904; x=1705428704; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0FOig009jjEjeh+vnprQEku+JrOLkbdtfCg1b2Ndzfw=; b=V/emrowLlMo7scB/HM3bojKlx9zLBgGmFXHveB3ahM1LwP/FdW3M6Q1VY75XPuegLo Oup0i50h7Msl1bjREO+24D5N39xo2o775I3K7lLpin9vftkL+T8vAd5gpqTxUL6/LMie g+cfp66SDqPQDUylggj7Cczgq9e0uovyL4MNU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704823904; x=1705428704; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0FOig009jjEjeh+vnprQEku+JrOLkbdtfCg1b2Ndzfw=; b=ZJrOhWf7mpVnJQ7O48AhDfXHHXYW4YpEFMwewoODUcUjT/IWq4GYWsx1AlGNgaoDk7 vgK6rZJ6YE4pLYsoIW1VFHPq9IjNeOcuqAe+i8s6rC66GxcIi0knq6ezwinnQtj9fzSi AmXiq6YFgca1czguZlqv833p0VIb2ATVlBmT563jM9sygtCoWvyAwl/0KLNWuyp6GmcY c3glNVaKTdN9mjAOeRO6kYOoZsi8XOoL44zI1gY9O/VuU0CtZhK3o9c/p8jF15q6gEUC ZuImPykbrYgku5hClaeDe+1sK8vx4YmzroH9poi7oMcb+1f+TZPw3atPglZkLkZICZse vk4Q== X-Gm-Message-State: AOJu0YzJTTll4uGlchDsVDX2Vmra/AHt04mlw1JQE/EW0nGWfEQJJZkl URhm95nn/J9X1rOB409SevNd5IBwkpd/Bw== X-Google-Smtp-Source: AGHT+IFzA8uBOAMbRxLaFNUGf0cxS9vZD5/6R/qJ13W5c3i448PbrK2IbE7snX+W95EFhYkD/m0DGA== X-Received: by 2002:a7b:ce10:0:b0:40e:4572:57ea with SMTP id m16-20020a7bce10000000b0040e457257eamr1973874wmc.65.1704823904568; Tue, 09 Jan 2024 10:11:44 -0800 (PST) Received: from andri-workstation.turninn.appdynamic.com ([2a01:8280:aa07:ad:7285:c2ff:fef0:4baf]) by smtp.gmail.com with ESMTPSA id n25-20020a05600c3b9900b0040e527602c8sm2104579wms.9.2024.01.09.10.11.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jan 2024 10:11:44 -0800 (PST) From: Andri Yngvason To: Harry Wentland , Leo Li , Rodrigo Siqueira , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , "Pan, Xinhui" , David Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin Cc: amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, intel-gfx@lists.freedesktop.org, Simon Ser , Werner Sembach , Dan Carpenter , Andri Yngvason Subject: [PATCH 5/7] drm/uAPI: Add "preferred color format" drm property as setting for userspace Date: Tue, 9 Jan 2024 18:11:02 +0000 Message-ID: <20240109181104.1670304-6-andri@yngvason.is> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240109181104.1670304-1-andri@yngvason.is> References: <20240109181104.1670304-1-andri@yngvason.is> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Werner Sembach Add a new general drm property "preferred color format" which can be used by userspace to tell the graphic drivers to which color format to use. Possible options are: - auto (default/current behaviour) - rgb - ycbcr444 - ycbcr422 (not supported by both amdgpu and i915) - ycbcr420 In theory the auto option should choose the best available option for the current setup, but because of bad internal conversion some monitors look better with rgb and some with ycbcr444. Also, because of bad shielded connectors and/or cables, it might be preferable to use the less bandwidth heavy ycbcr422 and ycbcr420 formats for a signal that is less deceptible to interference. In the future, automatic color calibration for screens might also depend on this option being available. Signed-off-by: Werner Sembach Reported-by: Dan Carpenter Signed-off-by: Andri Yngvason Tested-by: Andri Yngvason --- drivers/gpu/drm/drm_atomic_helper.c | 4 +++ drivers/gpu/drm/drm_atomic_uapi.c | 4 +++ drivers/gpu/drm/drm_connector.c | 50 ++++++++++++++++++++++++++++- include/drm/drm_connector.h | 17 ++++++++++ 4 files changed, 74 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atom= ic_helper.c index 68ffcc0b00dca..745a43d9c5da3 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -707,6 +707,10 @@ drm_atomic_helper_check_modeset(struct drm_device *dev, if (old_connector_state->max_requested_bpc !=3D new_connector_state->max_requested_bpc) new_crtc_state->connectors_changed =3D true; + + if (old_connector_state->preferred_color_format !=3D + new_connector_state->preferred_color_format) + new_crtc_state->connectors_changed =3D true; } =20 if (funcs->atomic_check) diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic= _uapi.c index 98d3b10c08ae1..eba5dea1249e5 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -798,6 +798,8 @@ static int drm_atomic_connector_set_property(struct drm= _connector *connector, state->max_requested_bpc =3D val; } else if (property =3D=3D connector->privacy_screen_sw_state_property) { state->privacy_screen_sw_state =3D val; + } else if (property =3D=3D connector->preferred_color_format_property) { + state->preferred_color_format =3D val; } else if (connector->funcs->atomic_set_property) { return connector->funcs->atomic_set_property(connector, state, property, val); @@ -881,6 +883,8 @@ drm_atomic_connector_get_property(struct drm_connector = *connector, *val =3D state->max_requested_bpc; } else if (property =3D=3D connector->privacy_screen_sw_state_property) { *val =3D state->privacy_screen_sw_state; + } else if (property =3D=3D connector->preferred_color_format_property) { + *val =3D state->preferred_color_format; } else if (connector->funcs->atomic_get_property) { return connector->funcs->atomic_get_property(connector, state, property, val); diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index 30d62e505d188..4de48a38792cf 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -1061,6 +1061,14 @@ static const struct drm_prop_enum_list drm_dp_subcon= nector_enum_list[] =3D { { DRM_MODE_SUBCONNECTOR_Native, "Native" }, /* DP */ }; =20 +static const struct drm_prop_enum_list drm_preferred_color_format_enum_lis= t[] =3D { + { 0, "auto" }, + { DRM_COLOR_FORMAT_RGB444, "rgb" }, + { DRM_COLOR_FORMAT_YCBCR444, "ycbcr444" }, + { DRM_COLOR_FORMAT_YCBCR422, "ycbcr422" }, + { DRM_COLOR_FORMAT_YCBCR420, "ycbcr420" }, +}; + static const struct drm_prop_enum_list drm_active_color_format_enum_list[]= =3D { { 0, "not applicable" }, { DRM_COLOR_FORMAT_RGB444, "rgb" }, @@ -1398,11 +1406,20 @@ static const u32 dp_colorspaces =3D * drm_connector_attach_max_bpc_property() to create and attach the * property to the connector during initialization. * + * preferred color format: + * This property is used by userspace to change the used color format. When + * used the driver will use the selected format if valid for the hardware, + * sink, and current resolution and refresh rate combination. Drivers to + * use the function drm_connector_attach_preferred_color_format_property() + * to create and attach the property to the connector during + * initialization. Possible values are "auto", "rgb", "ycbcr444", + * "ycbcr422", and "ycbcr420". + * * active color format: * This read-only property tells userspace the color format actually used * by the hardware display engine "on the cable" on a connector. The chosen * value depends on hardware capabilities, both display engine and - * connected monitor. Drivers shall use + * connected monitor, and the "preferred color format". Drivers shall use * drm_connector_attach_active_color_format_property() to install this * property. Possible values are "not applicable", "rgb", "ycbcr444", * "ycbcr422", and "ycbcr420". @@ -2468,6 +2485,37 @@ int drm_connector_attach_max_bpc_property(struct drm= _connector *connector, } EXPORT_SYMBOL(drm_connector_attach_max_bpc_property); =20 +/** + * drm_connector_attach_preferred_color_format_property - attach "preferre= d color format" property + * @connector: connector to attach preferred color format property on. + * + * This is used to add support for selecting a color format on a connector. + * + * Returns: + * Zero on success, negative errno on failure. + */ +int drm_connector_attach_preferred_color_format_property(struct drm_connec= tor *connector) +{ + struct drm_device *dev =3D connector->dev; + struct drm_property *prop; + + if (!connector->preferred_color_format_property) { + prop =3D drm_property_create_enum(dev, 0, "preferred color format", + drm_preferred_color_format_enum_list, + ARRAY_SIZE(drm_preferred_color_format_enum_list)); + if (!prop) + return -ENOMEM; + + connector->preferred_color_format_property =3D prop; + } + + drm_object_attach_property(&connector->base, prop, 0); + connector->state->preferred_color_format =3D 0; + + return 0; +} +EXPORT_SYMBOL(drm_connector_attach_preferred_color_format_property); + /** * drm_connector_attach_active_color_format_property - attach "active colo= r format" property * @connector: connector to attach active color format property on. diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index 9ae73cfdceeb1..d7bc54c8b42cb 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -1026,6 +1026,16 @@ struct drm_connector_state { */ enum drm_privacy_screen_status privacy_screen_sw_state; =20 + /** + * preferred_color_format: Property set by userspace to tell the GPU + * driver which color format to use. It only gets applied if hardware, + * meaning both the computer and the monitor, and the driver support the + * given format at the current resolution and refresh rate. Userspace + * can check for (un-)successful application via the "active color + * format" property. + */ + u32 preferred_color_format; + /** * @hdr_output_metadata: * DRM blob property for HDR output metadata @@ -1699,6 +1709,12 @@ struct drm_connector { */ struct drm_property *privacy_screen_hw_state_property; =20 + /** + * @preferred_color_format_property: Default connector property for the + * preferred color format to be driven out of the connector. + */ + struct drm_property *preferred_color_format_property; + /** * @active_color_format_property: Default connector property for the * active color format to be driven out of the connector. @@ -2059,6 +2075,7 @@ void drm_connector_attach_privacy_screen_provider( struct drm_connector *connector, struct drm_privacy_screen *priv); void drm_connector_update_privacy_screen(const struct drm_connector_state = *connector_state); =20 +int drm_connector_attach_preferred_color_format_property(struct drm_connec= tor *connector); int drm_connector_attach_active_color_format_property(struct drm_connector= *connector); void drm_connector_set_active_color_format_property(struct drm_connector *= connector, u32 active_color_format); --=20 2.43.0 From nobody Fri Dec 26 03:24:39 2025 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 25FC03D55D for ; Tue, 9 Jan 2024 18:11:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=yngvason.is Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yngvason.is Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=yngvason.is header.i=@yngvason.is header.b="Qx1js/bV" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-40e4d515c9aso15956565e9.0 for ; Tue, 09 Jan 2024 10:11:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yngvason.is; s=google; t=1704823908; x=1705428708; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Qt0c3XMcNoO4kFPW/v1FdVP0dkTx8zEwl7ZVK3nsems=; b=Qx1js/bVClfb+QSGHwM2n4FN/oVWIBTM1WHt0MS/KQ8T0UKWHg9UcJa/XYtoVdTI6Q 7DvKY0f3gFZPPGAJOtj3ovMoLox6FPjoc0hgtzCINOKlFp32nrnQVrCyE557C5YiYBLY x20U4fe+9fTaNZEmHnxA8sVsWA0zRIFNN4HQU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704823908; x=1705428708; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Qt0c3XMcNoO4kFPW/v1FdVP0dkTx8zEwl7ZVK3nsems=; b=cLTsggmTkWz2KUzoTStlb4IYPhA/uwIbg4SOKbgTvXHMcy9MOzoOQaHv/Ki7eYuE50 +AhZ3dSb3S+5cmHB0fAkfa2QoElzzZfbRznavPSDZsSGq/akrYGRFOkn5hVCKHooo4oh VubTzjZsnXXY47XIWkAs5l4v8rJ/I5EW4nf8Ts8UAK21iJsmKxpVtc0J9M4xynMV6Ide xGYmISSg1s3zf7b4iJYWO1o2c9PrP/gRI3XWfVXu+O7AJs49V1o6ZrxsqOCUDmzpYOZ1 khu874lLRRFQaxLlaxxt6arThttUDGpKSxNtIQElwaBoXINpONu7sBOMjIvDc+a8r3XT UdCg== X-Gm-Message-State: AOJu0YySuVcm7xgi9sOyp4CD0AHQ2S1qwe3j1EiXEncBTsOLP4FIwLfy aDvUdyrSa4Lb+OGJz0uCLUm2t68g2HynTA== X-Google-Smtp-Source: AGHT+IFgwClqgXbf2UT4umhrLU7jfpYqaURbrVxuW4v/iRn1SN3rphz7JKJNAvzao7RlEeWaArDvaQ== X-Received: by 2002:a7b:ca45:0:b0:40e:482d:e718 with SMTP id m5-20020a7bca45000000b0040e482de718mr1724173wml.33.1704823908518; Tue, 09 Jan 2024 10:11:48 -0800 (PST) Received: from andri-workstation.turninn.appdynamic.com ([2a01:8280:aa07:ad:7285:c2ff:fef0:4baf]) by smtp.gmail.com with ESMTPSA id n25-20020a05600c3b9900b0040e527602c8sm2104579wms.9.2024.01.09.10.11.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jan 2024 10:11:48 -0800 (PST) From: Andri Yngvason To: Harry Wentland , Leo Li , Rodrigo Siqueira , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , "Pan, Xinhui" , David Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin Cc: amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, intel-gfx@lists.freedesktop.org, Simon Ser , Werner Sembach , Andri Yngvason Subject: [PATCH 6/7] drm/amd/display: Add handling for new "preferred color format" property Date: Tue, 9 Jan 2024 18:11:03 +0000 Message-ID: <20240109181104.1670304-7-andri@yngvason.is> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240109181104.1670304-1-andri@yngvason.is> References: <20240109181104.1670304-1-andri@yngvason.is> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Werner Sembach This commit implements the "preferred color format" drm property for the AMD GPU driver. Signed-off-by: Werner Sembach Signed-off-by: Andri Yngvason Tested-by: Andri Yngvason --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 30 +++++++++++++++---- .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 4 +++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gp= u/drm/amd/display/amdgpu_dm/amdgpu_dm.c index b44d06c3b1706..262d420877c91 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -5522,15 +5522,32 @@ static void fill_stream_properties_from_drm_display= _mode( timing_out->h_border_right =3D 0; timing_out->v_border_top =3D 0; timing_out->v_border_bottom =3D 0; - /* TODO: un-hardcode */ - if (drm_mode_is_420_only(info, mode_in) - || (drm_mode_is_420_also(info, mode_in) && aconnector->force_yuv420_out= put)) + + if (connector_state + && (connector_state->preferred_color_format =3D=3D DRM_COLOR_FORMAT_YCB= CR420 + || aconnector->force_yuv420_output) && drm_mode_is_420(info, mode_in)) timing_out->pixel_encoding =3D PIXEL_ENCODING_YCBCR420; - else if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR4= 44) - && stream->signal =3D=3D SIGNAL_TYPE_HDMI_TYPE_A) + else if (connector_state + && connector_state->preferred_color_format =3D=3D DRM_COLOR_FORMAT_YCBC= R444 + && connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR444) timing_out->pixel_encoding =3D PIXEL_ENCODING_YCBCR444; - else + else if (connector_state + && connector_state->preferred_color_format =3D=3D DRM_COLOR_FORMAT_RGB4= 44 + && !drm_mode_is_420_only(info, mode_in)) timing_out->pixel_encoding =3D PIXEL_ENCODING_RGB; + else + /* + * connector_state->preferred_color_format not possible + * || connector_state->preferred_color_format =3D=3D 0 (auto) + * || connector_state->preferred_color_format =3D=3D DRM_COLOR_FORMAT_YC= BCR422 + */ + if (drm_mode_is_420_only(info, mode_in)) + timing_out->pixel_encoding =3D PIXEL_ENCODING_YCBCR420; + else if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR= 444) + && stream->signal =3D=3D SIGNAL_TYPE_HDMI_TYPE_A) + timing_out->pixel_encoding =3D PIXEL_ENCODING_YCBCR444; + else + timing_out->pixel_encoding =3D PIXEL_ENCODING_RGB; =20 timing_out->timing_3d_format =3D TIMING_3D_FORMAT_NONE; timing_out->display_color_depth =3D convert_color_depth_from_display_info( @@ -7456,6 +7473,7 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_di= splay_manager *dm, =20 if (!aconnector->mst_root) { drm_connector_attach_max_bpc_property(&aconnector->base, 8, 16); + drm_connector_attach_preferred_color_format_property(&aconnector->base); drm_connector_attach_active_color_format_property(&aconnector->base); } =20 diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/= drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index a4d1b3ea8f81c..dc8cea0ac2c11 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c @@ -600,6 +600,10 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr= *mgr, if (connector->max_bpc_property) drm_connector_attach_max_bpc_property(connector, 8, 16); =20 + connector->preferred_color_format_property =3D master->base.preferred_col= or_format_property; + if (connector->preferred_color_format_property) + drm_connector_attach_preferred_color_format_property(&aconnector->base); + connector->active_color_format_property =3D master->base.active_color_for= mat_property; if (connector->active_color_format_property) drm_connector_attach_active_color_format_property(&aconnector->base); --=20 2.43.0 From nobody Fri Dec 26 03:24:39 2025 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8784B3D570 for ; Tue, 9 Jan 2024 18:11:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=yngvason.is Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yngvason.is Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=yngvason.is header.i=@yngvason.is header.b="UuzbJPPt" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-40e4582ed74so25202335e9.1 for ; Tue, 09 Jan 2024 10:11:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yngvason.is; s=google; t=1704823914; x=1705428714; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1K35iyXrIjP9JEaVNwNgowQ2gmFwtnlNnPCP001WTzs=; b=UuzbJPPt6/VYdgVQKcYpuRJuDbVBbvuHP3kCmeHoi3EpmcO/wmzm3+edGaTnnbiB1M zzh4XTci7lixZFRj5NKxNcDnlkyQraVmD16qmTNzJNXrLfpTYmAvy3wE0kS4n0z2Ucpd c1wnBDQkQlaIKrBPrwL/ta9zjH3T+cC77cEPg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704823914; x=1705428714; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=1K35iyXrIjP9JEaVNwNgowQ2gmFwtnlNnPCP001WTzs=; b=OfyQH/j6OJbDFuXg0UviRLQogcuI1zIs6pwfjVCQd1ZQlNydtf+etubpH1CaBvtP26 4jG9d/xn7m1hcPT1/O7JM0NGWLQoD/DQY24Z5GousIhy+nzZZ0TJzNItxVEu8kvW79Ch oG+H7a+SlBwZk079SL1BGe3F8oaB8kgsOFTEAtrJdH6NXe6qWKjfYs0aVQ2ZNBWGpH6q PkvAwvld8KnV2mUrxel+U9uN+i8leA6SQbjqyf8OM8MrXUiGDDUW6YG6mflDltfC+HeZ SbRcVbD9cKHAgQBJFZc7v34unxsUQkDVlWCtqR5FrkMxXRS2JefQ4+b62fFq+rhDXu/1 Ceog== X-Gm-Message-State: AOJu0Yx8VMRJYnw68cYZ6C+KTyDWiV6KCpmaKJ52WBjIriAlWzewhw1n DorPrHCmPlBIdHX0ljkc8qcKrwy6F63qCw== X-Google-Smtp-Source: AGHT+IHCvkhLBDjMnPPg6VS4Uza9HPKoHPU28wAqqAGezxMnCAYYxMWKNpbjFIpaRNQwjFu2XbHG4A== X-Received: by 2002:a05:600c:5251:b0:40c:24b1:8d07 with SMTP id fc17-20020a05600c525100b0040c24b18d07mr1582485wmb.192.1704823913857; Tue, 09 Jan 2024 10:11:53 -0800 (PST) Received: from andri-workstation.turninn.appdynamic.com ([2a01:8280:aa07:ad:7285:c2ff:fef0:4baf]) by smtp.gmail.com with ESMTPSA id n25-20020a05600c3b9900b0040e527602c8sm2104579wms.9.2024.01.09.10.11.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jan 2024 10:11:53 -0800 (PST) From: Andri Yngvason To: Harry Wentland , Leo Li , Rodrigo Siqueira , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , "Pan, Xinhui" , David Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin Cc: amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, intel-gfx@lists.freedesktop.org, Simon Ser , Werner Sembach , Andri Yngvason Subject: [PATCH 7/7] drm/i915/display: Add handling for new "preferred color format" property Date: Tue, 9 Jan 2024 18:11:04 +0000 Message-ID: <20240109181104.1670304-8-andri@yngvason.is> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240109181104.1670304-1-andri@yngvason.is> References: <20240109181104.1670304-1-andri@yngvason.is> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Werner Sembach This commit implements the "preferred color format" drm property for the Intel GPU driver. Signed-off-by: Werner Sembach Co-developed-by: Andri Yngvason Signed-off-by: Andri Yngvason Tested-by: Andri Yngvason --- drivers/gpu/drm/i915/display/intel_dp.c | 16 ++++++++++------ drivers/gpu/drm/i915/display/intel_dp_mst.c | 5 +++++ drivers/gpu/drm/i915/display/intel_hdmi.c | 12 +++++++++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915= /display/intel_dp.c index c40fe8a847614..f241798660d0b 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -2698,21 +2698,23 @@ intel_dp_compute_output_format(struct intel_encoder= *encoder, struct intel_connector *connector =3D intel_dp->attached_connector; const struct drm_display_info *info =3D &connector->base.display_info; const struct drm_display_mode *adjusted_mode =3D &crtc_state->hw.adjusted= _mode; - bool ycbcr_420_only; + bool ycbcr_420_output; int ret; =20 - ycbcr_420_only =3D drm_mode_is_420_only(info, adjusted_mode); + ycbcr_420_output =3D drm_mode_is_420_only(info, adjusted_mode) || + (conn_state->preferred_color_format =3D=3D DRM_COLOR_FORMAT_YCBCR420= && + drm_mode_is_420_also(&connector->base.display_info, adjusted_mode)); =20 - if (ycbcr_420_only && !connector->base.ycbcr_420_allowed) { + crtc_state->sink_format =3D ycbcr_420_output ? INTEL_OUTPUT_FORMAT_YCBCR4= 20 : + INTEL_OUTPUT_FORMAT_RGB; + + if (ycbcr_420_output && !connector->base.ycbcr_420_allowed) { drm_dbg_kms(&i915->drm, "YCbCr 4:2:0 mode but YCbCr 4:2:0 output not possible. Falling back= to RGB.\n"); crtc_state->sink_format =3D INTEL_OUTPUT_FORMAT_RGB; - } else { - crtc_state->sink_format =3D intel_dp_sink_format(connector, adjusted_mod= e); } =20 crtc_state->output_format =3D intel_dp_output_format(connector, crtc_stat= e->sink_format); - ret =3D intel_dp_compute_link_config(encoder, crtc_state, conn_state, respect_downstream_limits); if (ret) { @@ -5912,9 +5914,11 @@ intel_dp_add_properties(struct intel_dp *intel_dp, s= truct drm_connector *connect intel_attach_broadcast_rgb_property(connector); if (HAS_GMCH(dev_priv)) { drm_connector_attach_max_bpc_property(connector, 6, 10); + drm_connector_attach_preferred_color_format_property(connector); drm_connector_attach_active_color_format_property(connector); } else if (DISPLAY_VER(dev_priv) >=3D 5) { drm_connector_attach_max_bpc_property(connector, 6, 12); + drm_connector_attach_preferred_color_format_property(connector); drm_connector_attach_active_color_format_property(connector); } =20 diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/= i915/display/intel_dp_mst.c index e7574ca0604e6..4a850eb9b8d4d 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c @@ -1210,6 +1210,11 @@ static struct drm_connector *intel_dp_add_mst_connec= tor(struct drm_dp_mst_topolo drm_dbg_kms(&dev_priv->drm, "[%s:%d] HDCP MST init failed, skipping.\n", connector->name, connector->base.id); =20 + connector->preferred_color_format_property =3D + intel_dp->attached_connector->base.preferred_color_format_property; + if (connector->preferred_color_format_property) + drm_connector_attach_preferred_color_format_property(connector); + connector->active_color_format_property =3D intel_dp->attached_connector->base.active_color_format_property; if (connector->active_color_format_property) diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i9= 15/display/intel_hdmi.c index ce0221f90de92..3030589d245d7 100644 --- a/drivers/gpu/drm/i915/display/intel_hdmi.c +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c @@ -2214,19 +2214,24 @@ static int intel_hdmi_compute_output_format(struct = intel_encoder *encoder, const struct drm_display_mode *adjusted_mode =3D &crtc_state->hw.adjusted= _mode; const struct drm_display_info *info =3D &connector->base.display_info; struct drm_i915_private *i915 =3D to_i915(connector->base.dev); - bool ycbcr_420_only =3D drm_mode_is_420_only(info, adjusted_mode); + bool ycbcr_420_output; int ret; =20 + ycbcr_420_output =3D drm_mode_is_420_only(info, adjusted_mode) || + (conn_state->preferred_color_format =3D=3D DRM_COLOR_FORMAT_YCBCR420= && + drm_mode_is_420_also(&connector->base.display_info, adjusted_mode)); + crtc_state->sink_format =3D - intel_hdmi_sink_format(crtc_state, connector, ycbcr_420_only); + intel_hdmi_sink_format(crtc_state, connector, ycbcr_420_output); =20 - if (ycbcr_420_only && crtc_state->sink_format !=3D INTEL_OUTPUT_FORMAT_YC= BCR420) { + if (ycbcr_420_output && crtc_state->sink_format !=3D INTEL_OUTPUT_FORMAT_= YCBCR420) { drm_dbg_kms(&i915->drm, "YCbCr 4:2:0 mode but YCbCr 4:2:0 output not possible. Falling back= to RGB.\n"); crtc_state->sink_format =3D INTEL_OUTPUT_FORMAT_RGB; } =20 crtc_state->output_format =3D intel_hdmi_output_format(crtc_state); + ret =3D intel_hdmi_compute_clock(encoder, crtc_state, respect_downstream_= limits); if (ret) { if (crtc_state->sink_format =3D=3D INTEL_OUTPUT_FORMAT_YCBCR420 || @@ -2613,6 +2618,7 @@ intel_hdmi_add_properties(struct intel_hdmi *intel_hd= mi, struct drm_connector *c =20 if (!HAS_GMCH(dev_priv)) { drm_connector_attach_max_bpc_property(connector, 8, 12); + drm_connector_attach_preferred_color_format_property(connector); drm_connector_attach_active_color_format_property(connector); } } --=20 2.43.0