From: Alex Bee <knaerzche@gmail.com>
To: "Sandy Huang" <hjc@rock-chips.com>,
"Heiko Stübner" <heiko@sntech.de>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"Rob Herring" <robh+dt@kernel.org>,
"Krzysztof Kozlowski" <krzysztof.kozlowski+dt@linaro.org>,
"Conor Dooley" <conor+dt@kernel.org>
Cc: David Airlie <airlied@gmail.com>, Daniel Vetter <daniel@ffwll.ch>,
dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org,
Alex Bee <knaerzche@gmail.com>
Subject: [PATCH v3 20/29] drm/rockchip: inno_hdmi: Correctly setup HDMI quantization range
Date: Tue, 19 Dec 2023 18:00:50 +0100 [thread overview]
Message-ID: <20231219170100.188800-21-knaerzche@gmail.com> (raw)
In-Reply-To: <20231219170100.188800-1-knaerzche@gmail.com>
The display controller will always give full range RGB regardless of the
mode set, but HDMI requires certain modes to be transmitted in limited
range RGB. This is especially required for HDMI sinks which do not support
non-standard quantization ranges.
This enables color space conversion for those modes and sets the
quantization range accordingly in the AVI infoframe.
Signed-off-by: Alex Bee <knaerzche@gmail.com>
---
changes in v2:
- made rgb_limited_range part of the new custom connector state
changes in v3:
- moved assignment of rgb_limited_range to atomic check
drivers/gpu/drm/rockchip/inno_hdmi.c | 60 +++++++++++++++++++---------
1 file changed, 42 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c b/drivers/gpu/drm/rockchip/inno_hdmi.c
index 7ce5836fc80d..e6d37772500c 100644
--- a/drivers/gpu/drm/rockchip/inno_hdmi.c
+++ b/drivers/gpu/drm/rockchip/inno_hdmi.c
@@ -53,6 +53,7 @@ struct inno_hdmi_connector_state {
struct drm_connector_state base;
unsigned int enc_out_format;
unsigned int colorimetry;
+ bool rgb_limited_range;
};
static struct inno_hdmi *encoder_to_inno_hdmi(struct drm_encoder *encoder)
@@ -270,6 +271,18 @@ static int inno_hdmi_config_video_avi(struct inno_hdmi *hdmi,
else
frame.avi.colorspace = HDMI_COLORSPACE_RGB;
+ if (inno_conn_state->enc_out_format == HDMI_COLORSPACE_RGB) {
+ drm_hdmi_avi_infoframe_quant_range(&frame.avi,
+ connector, mode,
+ inno_conn_state->rgb_limited_range ?
+ HDMI_QUANTIZATION_RANGE_LIMITED :
+ HDMI_QUANTIZATION_RANGE_FULL);
+ } else {
+ frame.avi.quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT;
+ frame.avi.ycc_quantization_range =
+ HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
+ }
+
return inno_hdmi_upload_frame(hdmi, &frame, HDMI_INFOFRAME_TYPE_AVI);
}
@@ -297,29 +310,37 @@ static int inno_hdmi_config_video_csc(struct inno_hdmi *hdmi)
hdmi_writeb(hdmi, HDMI_VIDEO_CONTRL2, value);
if (inno_conn_state->enc_out_format == HDMI_COLORSPACE_RGB) {
- value = v_SOF_DISABLE | v_COLOR_DEPTH_NOT_INDICATED(1);
- hdmi_writeb(hdmi, HDMI_VIDEO_CONTRL3, value);
-
- hdmi_modb(hdmi, HDMI_VIDEO_CONTRL,
- m_VIDEO_AUTO_CSC | m_VIDEO_C0_C2_SWAP,
- v_VIDEO_AUTO_CSC(AUTO_CSC_DISABLE) |
- v_VIDEO_C0_C2_SWAP(C0_C2_CHANGE_DISABLE));
- return 0;
- }
-
- if (inno_conn_state->colorimetry == HDMI_COLORIMETRY_ITU_601) {
- if (inno_conn_state->enc_out_format == HDMI_COLORSPACE_YUV444) {
- csc_mode = CSC_RGB_0_255_TO_ITU601_16_235_8BIT;
+ if (inno_conn_state->rgb_limited_range) {
+ csc_mode = CSC_RGB_0_255_TO_RGB_16_235_8BIT;
auto_csc = AUTO_CSC_DISABLE;
c0_c2_change = C0_C2_CHANGE_DISABLE;
csc_enable = v_CSC_ENABLE;
+
+ } else {
+ value = v_SOF_DISABLE | v_COLOR_DEPTH_NOT_INDICATED(1);
+ hdmi_writeb(hdmi, HDMI_VIDEO_CONTRL3, value);
+
+ hdmi_modb(hdmi, HDMI_VIDEO_CONTRL,
+ m_VIDEO_AUTO_CSC | m_VIDEO_C0_C2_SWAP,
+ v_VIDEO_AUTO_CSC(AUTO_CSC_DISABLE) |
+ v_VIDEO_C0_C2_SWAP(C0_C2_CHANGE_DISABLE));
+ return 0;
}
} else {
- if (inno_conn_state->enc_out_format == HDMI_COLORSPACE_YUV444) {
- csc_mode = CSC_RGB_0_255_TO_ITU709_16_235_8BIT;
- auto_csc = AUTO_CSC_DISABLE;
- c0_c2_change = C0_C2_CHANGE_DISABLE;
- csc_enable = v_CSC_ENABLE;
+ if (inno_conn_state->colorimetry == HDMI_COLORIMETRY_ITU_601) {
+ if (inno_conn_state->enc_out_format == HDMI_COLORSPACE_YUV444) {
+ csc_mode = CSC_RGB_0_255_TO_ITU601_16_235_8BIT;
+ auto_csc = AUTO_CSC_DISABLE;
+ c0_c2_change = C0_C2_CHANGE_DISABLE;
+ csc_enable = v_CSC_ENABLE;
+ }
+ } else {
+ if (inno_conn_state->enc_out_format == HDMI_COLORSPACE_YUV444) {
+ csc_mode = CSC_RGB_0_255_TO_ITU709_16_235_8BIT;
+ auto_csc = AUTO_CSC_DISABLE;
+ c0_c2_change = C0_C2_CHANGE_DISABLE;
+ csc_enable = v_CSC_ENABLE;
+ }
}
}
@@ -473,6 +494,8 @@ inno_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
inno_conn_state->colorimetry = HDMI_COLORIMETRY_ITU_709;
inno_conn_state->enc_out_format = HDMI_COLORSPACE_RGB;
+ inno_conn_state->rgb_limited_range =
+ drm_default_rgb_quant_range(mode) == HDMI_QUANTIZATION_RANGE_LIMITED;
return 0;
}
@@ -543,6 +566,7 @@ static void inno_hdmi_connector_reset(struct drm_connector *connector)
inno_conn_state->colorimetry = HDMI_COLORIMETRY_ITU_709;
inno_conn_state->enc_out_format = HDMI_COLORSPACE_RGB;
+ inno_conn_state->rgb_limited_range = false;
}
static struct drm_connector_state *
--
2.43.0
next prev parent reply other threads:[~2023-12-19 17:01 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-19 17:00 [PATCH v3 00/29] Add HDMI support for RK3128 Alex Bee
2023-12-19 17:00 ` [PATCH v3 01/29] dt-bindings: display: rockchip,inno-hdmi: Document RK3128 compatible Alex Bee
2023-12-19 17:00 ` [PATCH v3 02/29] drm/rockchip: vop: Add output selection registers for RK312x Alex Bee
2023-12-19 17:00 ` [PATCH v3 03/29] drm/rockchip: inno_hdmi: Fix video timing Alex Bee
2023-12-19 17:00 ` [PATCH v3 04/29] drm/rockchip: inno_hdmi: Remove useless mode_fixup Alex Bee
2023-12-19 17:00 ` [PATCH v3 05/29] drm/rockchip: inno_hdmi: Remove useless copy of drm_display_mode Alex Bee
2023-12-19 17:00 ` [PATCH v3 06/29] drm/rockchip: inno_hdmi: Switch encoder hooks to atomic Alex Bee
2023-12-19 17:00 ` [PATCH v3 07/29] drm/rockchip: inno_hdmi: Get rid of mode_set Alex Bee
2023-12-19 17:00 ` [PATCH v3 08/29] drm/rockchip: inno_hdmi: no need to store vic Alex Bee
2023-12-19 17:00 ` [PATCH v3 09/29] drm/rockchip: inno_hdmi: Remove unneeded has audio flag Alex Bee
2023-12-19 17:00 ` [PATCH v3 10/29] drm/rockchip: inno_hdmi: Remove useless input format Alex Bee
2023-12-19 17:00 ` [PATCH v3 11/29] drm/rockchip: inno_hdmi: Remove YUV-based csc coefficents Alex Bee
2023-12-19 17:00 ` [PATCH v3 12/29] drm/rockchip: inno_hdmi: Remove tmds rate from structure Alex Bee
2023-12-19 17:00 ` [PATCH v3 13/29] drm/rockchip: inno_hdmi: Drop HDMI Vendor Infoframe support Alex Bee
2023-12-19 17:00 ` [PATCH v3 14/29] drm/rockchip: inno_hdmi: Move infoframe disable to separate function Alex Bee
2023-12-19 17:00 ` [PATCH v3 15/29] drm/rockchip: inno_hdmi: Switch to infoframe type Alex Bee
2023-12-19 17:00 ` [PATCH v3 16/29] drm/rockchip: inno_hdmi: Remove unused drm device pointer Alex Bee
2023-12-19 17:00 ` [PATCH v3 17/29] drm/rockchip: inno_hdmi: Drop irq struct member Alex Bee
2023-12-19 17:00 ` [PATCH v3 18/29] drm/rockchip: inno_hdmi: Remove useless include Alex Bee
2023-12-19 17:00 ` [PATCH v3 19/29] drm/rockchip: inno_hdmi: Subclass connector state Alex Bee
2023-12-19 17:00 ` Alex Bee [this message]
2023-12-19 17:00 ` [PATCH v3 21/29] drm/rockchip: inno_hdmi: Don't power up the phy after resetting Alex Bee
2023-12-19 17:00 ` [PATCH v3 22/29] drm/rockchip: inno_hdmi: Split power mode setting Alex Bee
2023-12-19 17:00 ` [PATCH v3 23/29] drm/rockchip: inno_hdmi: Add variant support Alex Bee
2023-12-19 17:00 ` [PATCH v3 24/29] drm/rockchip: inno_hdmi: Add RK3128 support Alex Bee
2023-12-19 17:00 ` [PATCH v3 25/29] drm/rockchip: inno_hdmi: Add basic mode validation Alex Bee
2023-12-19 17:00 ` [PATCH v3 26/29] drm/rockchip: inno_hdmi: Drop custom fill_modes hook Alex Bee
2023-12-19 17:00 ` [PATCH v3 27/29] ARM: dts: rockchip: Add display subsystem for RK3128 Alex Bee
2023-12-19 17:00 ` [PATCH v3 28/29] ARM: dts: rockchip: Add HDMI node " Alex Bee
2023-12-19 17:00 ` [PATCH v3 29/29] ARM: dts: rockchip: Enable HDMI output for XPI-3128 Alex Bee
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231219170100.188800-21-knaerzche@gmail.com \
--to=knaerzche@gmail.com \
--cc=airlied@gmail.com \
--cc=conor+dt@kernel.org \
--cc=daniel@ffwll.ch \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=heiko@sntech.de \
--cc=hjc@rock-chips.com \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=robh+dt@kernel.org \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox