meson: Enabling full-range HDMI output

neil.armstrong at linaro.org neil.armstrong at linaro.org
Thu Oct 24 01:38:42 PDT 2024


On 23/10/2024 14:12, Francisco Ayala Le Brun wrote:
> Thank you for your response. I can confirm reverting the commit solves
> the issue. However, it only leaves me more confused as to the root
> cause.
> 
> If dw-hdmi is set to output RGB, and you set the CSC matrix to zeroes,
> then it will show a correctly completely black output. However, if you
> set the first column of the YUV-to-RGB matrix to ones, and show a
> black image via DRM, then the tone is in the limited range. This
> seemed to indicate dw-hdmi can output full range RGB, and the problem
> was farther upstream.
> 
> Perhaps the problem is the CSC matrices? I was under the assumption
> 0x2000 corresponded to 1, even though i.MX6 manual chapter 33 seems to
> suggest with a csc_scale of 1, then 0x800 would correspond to 1.
> Still, I would expect at least fully black to be correct as that would
> give a multiplication by zero.
> 
> Or the state of dw_hdmi is affecting the VIU in some way? Perhaps the
> VIU hardware is made to clamp luminance when dw_hdmi is outputting
> RGB? I noticed for the CSC there is only a special matrix for
> RGB-to-limited-RGB, but no special matrix for YUV-to-limited-RGB. That
> seems to suggest the clamping may be done upstream in those cases.
> 
> Francisco
> 
> 
> On Wed, Oct 23, 2024 at 8:30 AM <neil.armstrong at linaro.org> wrote:
>>
>> Hi,
>>
>> On 23/10/2024 10:00, Francisco Ayala Le Brun wrote:
>>> Hello,
>>>
>>> I am seeking some guidance regarding enabling full-range HDMI output.
>>> Specifically, I am wondering which component in the video pipeline
>>> could be clamping HDMI output values to 16-235? Further details
>>> follow:
>>>
>>> I have been trying to get full-range HDMI output from a Le Potato
>>> s905x SBC. At the moment, HDMI output seems to be hard-coded to color
>>> quantization limited range (16-235). This greatly diminishes the
>>> contrast in full range displays.
>>>
>>> So far setting the VIU_OSD1/2_FULL_RANGE bit in the
>>> VIU_OSD1/2_CTRL_STAT2 register does not seem to work. I have also
>>> looked at the color space conversion matrix in dw_hdmi in case that is
>>> the culprit, but the values seem fine and setting that to zero does
>>> produce a signal in the full range (0). The buffer from the VIU is
>>> using a YUV format so dw_hdmi is not using the full to limited range
>>> conversion matrix.
>>
>> Indeed the internal VPU pipeline is in 10bit YUV444, so it requires enabling
>> the dw-hdmi CSC, so perhaps those are not designed to output full-range RGB ?
>>
>> Could you revert:
>> d3d6b1bf85ae drm: bridge: dw_hdmi: fix preference of RGB modes over YUV420
>>
>> This would give you direct YUV444 HDMI output without CSC involved, reverting
>> is not an options because of low-cost HDMI panels lying in their EDID
>> and not really supporting YUV HDMI...
>>
>> So if the original YUV is in full range, the culprit is in the DW-HDMI CSC
>> table.

So seems the current CSC tables outputs limited range from YUV, could you try:

=================><==================================
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 0031f3c54882..9e1cb9be4622 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -1769,8 +1769,11 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi,
         drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode);

         if (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) {
+               bool is_input_rgb = hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_in_bus_format);
+               bool is_limited_range = hdmi->hdmi_data.rgb_limited_range |!is_input_rgb;
+
                 drm_hdmi_avi_infoframe_quant_range(&frame, connector, mode,
-                                                  hdmi->hdmi_data.rgb_limited_range ?
+                                                  is_limited_range ?
                                                    HDMI_QUANTIZATION_RANGE_LIMITED :
                                                    HDMI_QUANTIZATION_RANGE_FULL);
         } else {
=================><==================================

It won't output full range, but at least the monitor will know the real
signal quant range.

The real fix would be to calculate some new parameters for full range,
but I'm not able to do that personally.

Neil

>>
>> Neil
>>
>>>
>>> Thank you in advance,
>>> Francisco
>>>
>>> _______________________________________________
>>> linux-amlogic mailing list
>>> linux-amlogic at lists.infradead.org
>>> http://lists.infradead.org/mailman/listinfo/linux-amlogic
>>
>>
>> _______________________________________________
>> linux-amlogic mailing list
>> linux-amlogic at lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/linux-amlogic




More information about the linux-amlogic mailing list