[PATCH 2/2] drm/amd/display: Fix HDMI deep color output for DCE 6-11.

Mario Kleiner mario.kleiner.de at gmail.com
Wed Feb 10 21:06:38 UTC 2021


Ping. Any bit of info appreciated wrt. the DCE-11.2+ situation.
-mario

On Mon, Jan 25, 2021 at 8:24 PM Mario Kleiner <mario.kleiner.de at gmail.com>
wrote:

> Thanks Alex and Nicholas! Brings quite a bit of extra shiny to those older
> asics :)
>
> Nicholas, any thoughts on my cover-letter wrt. why a similar patch (that I
> wrote and tested to no good or bad effect) not seem to be needed on DCN,
> and probably not DCE-11.2+ either? Is what is left in DC for those asic's
> just dead code? My Atombios disassembly sort of pointed into that
> direction, but reading disassembly is not easy on the brain, and my brain
> was getting quite mushy towards the end of digging through all the code. So
> some official statement would add peace of mind on my side. Is there a
> certain DCE version at which your team starts validating output precision /
> HDR etc. on hw?
>
> Thanks,
> -mario
>
>
> On Mon, Jan 25, 2021 at 8:16 PM Kazlauskas, Nicholas <
> nicholas.kazlauskas at amd.com> wrote:
>
>> On 2021-01-25 12:57 p.m., Alex Deucher wrote:
>> > On Thu, Jan 21, 2021 at 1:17 AM Mario Kleiner
>> > <mario.kleiner.de at gmail.com> wrote:
>> >>
>> >> This fixes corrupted display output in HDMI deep color
>> >> 10/12 bpc mode at least as observed on AMD Mullins, DCE-8.3.
>> >>
>> >> It will hopefully also provide fixes for other DCE's up to
>> >> DCE-11, assuming those will need similar fixes, but i could
>> >> not test that for HDMI due to lack of suitable hw, so viewer
>> >> discretion is advised.
>> >>
>> >> dce110_stream_encoder_hdmi_set_stream_attribute() is used for
>> >> HDMI setup on all DCE's and is missing color_depth assignment.
>> >>
>> >> dce110_program_pix_clk() is used for pixel clock setup on HDMI
>> >> for DCE 6-11, and is missing color_depth assignment.
>> >>
>> >> Additionally some of the underlying Atombios specific encoder
>> >> and pixelclock setup functions are missing code which is in
>> >> the classic amdgpu kms modesetting path and the in the radeon
>> >> kms driver for DCE6/DCE8.
>> >>
>> >> encoder_control_digx_v3() - Was missing setup code wrt. amdgpu
>> >> and radeon kms classic drivers. Added here, but untested due to
>> >> lack of suitable test hw.
>> >>
>> >> encoder_control_digx_v4() - Added missing setup code.
>> >> Successfully tested on AMD mullins / DCE-8.3 with HDMI deep color
>> >> output at 10 bpc and 12 bpc.
>> >>
>> >> Note that encoder_control_digx_v5() has proper setup code in place
>> >> and is used, e.g., by DCE-11.2, but this code wasn't used for deep
>> >> color setup due to the missing cntl.color_depth setup in the calling
>> >> function for HDMI.
>> >>
>> >> set_pixel_clock_v5() - Missing setup code wrt. classic amdgpu/radeon
>> >> kms. Added here, but untested due to lack of hw.
>> >>
>> >> set_pixel_clock_v6() - Missing setup code added. Successfully tested
>> >> on AMD mullins DCE-8.3. This fixes corrupted display output at HDMI
>> >> deep color output with 10 bpc or 12 bpc.
>> >>
>> >> Fixes: 4562236b3bc0 ("drm/amd/dc: Add dc display driver (v2)")
>> >>
>> >> Signed-off-by: Mario Kleiner <mario.kleiner.de at gmail.com>
>> >> Cc: Harry Wentland <harry.wentland at amd.com>
>> >
>> > These make sense. I've applied the series.  I'll let the display guys
>> > gauge the other points in your cover letter.
>> >
>> > Alex
>>
>> I don't have any concerns with this patch.
>>
>> Even though it's already applied feel free to have my:
>>
>> Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>
>>
>> Regards,
>> Nicholas Kazlauskas
>>
>> >
>> >
>> >> ---
>> >>   .../drm/amd/display/dc/bios/command_table.c   | 61
>> +++++++++++++++++++
>> >>   .../drm/amd/display/dc/dce/dce_clock_source.c | 14 +++++
>> >>   .../amd/display/dc/dce/dce_stream_encoder.c   |  1 +
>> >>   3 files changed, 76 insertions(+)
>> >>
>> >> diff --git a/drivers/gpu/drm/amd/display/dc/bios/command_table.c
>> b/drivers/gpu/drm/amd/display/dc/bios/command_table.c
>> >> index 070459e3e407..afc10b954ffa 100644
>> >> --- a/drivers/gpu/drm/amd/display/dc/bios/command_table.c
>> >> +++ b/drivers/gpu/drm/amd/display/dc/bios/command_table.c
>> >> @@ -245,6 +245,23 @@ static enum bp_result encoder_control_digx_v3(
>> >>                                          cntl->enable_dp_audio);
>> >>          params.ucLaneNum = (uint8_t)(cntl->lanes_number);
>> >>
>> >> +       switch (cntl->color_depth) {
>> >> +       case COLOR_DEPTH_888:
>> >> +               params.ucBitPerColor = PANEL_8BIT_PER_COLOR;
>> >> +               break;
>> >> +       case COLOR_DEPTH_101010:
>> >> +               params.ucBitPerColor = PANEL_10BIT_PER_COLOR;
>> >> +               break;
>> >> +       case COLOR_DEPTH_121212:
>> >> +               params.ucBitPerColor = PANEL_12BIT_PER_COLOR;
>> >> +               break;
>> >> +       case COLOR_DEPTH_161616:
>> >> +               params.ucBitPerColor = PANEL_16BIT_PER_COLOR;
>> >> +               break;
>> >> +       default:
>> >> +               break;
>> >> +       }
>> >> +
>> >>          if (EXEC_BIOS_CMD_TABLE(DIGxEncoderControl, params))
>> >>                  result = BP_RESULT_OK;
>> >>
>> >> @@ -274,6 +291,23 @@ static enum bp_result encoder_control_digx_v4(
>> >>                                          cntl->enable_dp_audio));
>> >>          params.ucLaneNum = (uint8_t)(cntl->lanes_number);
>> >>
>> >> +       switch (cntl->color_depth) {
>> >> +       case COLOR_DEPTH_888:
>> >> +               params.ucBitPerColor = PANEL_8BIT_PER_COLOR;
>> >> +               break;
>> >> +       case COLOR_DEPTH_101010:
>> >> +               params.ucBitPerColor = PANEL_10BIT_PER_COLOR;
>> >> +               break;
>> >> +       case COLOR_DEPTH_121212:
>> >> +               params.ucBitPerColor = PANEL_12BIT_PER_COLOR;
>> >> +               break;
>> >> +       case COLOR_DEPTH_161616:
>> >> +               params.ucBitPerColor = PANEL_16BIT_PER_COLOR;
>> >> +               break;
>> >> +       default:
>> >> +               break;
>> >> +       }
>> >> +
>> >>          if (EXEC_BIOS_CMD_TABLE(DIGxEncoderControl, params))
>> >>                  result = BP_RESULT_OK;
>> >>
>> >> @@ -1057,6 +1091,19 @@ static enum bp_result set_pixel_clock_v5(
>> >>                   * driver choose program it itself, i.e. here we
>> program it
>> >>                   * to 888 by default.
>> >>                   */
>> >> +               if (bp_params->signal_type == SIGNAL_TYPE_HDMI_TYPE_A)
>> >> +                       switch (bp_params->color_depth) {
>> >> +                       case TRANSMITTER_COLOR_DEPTH_30:
>> >> +                               /* yes this is correct, the atom
>> define is wrong */
>> >> +                               clk.sPCLKInput.ucMiscInfo |=
>> PIXEL_CLOCK_V5_MISC_HDMI_32BPP;
>> >> +                               break;
>> >> +                       case TRANSMITTER_COLOR_DEPTH_36:
>> >> +                               /* yes this is correct, the atom
>> define is wrong */
>> >> +                               clk.sPCLKInput.ucMiscInfo |=
>> PIXEL_CLOCK_V5_MISC_HDMI_30BPP;
>> >> +                               break;
>> >> +                       default:
>> >> +                               break;
>> >> +                       }
>> >>
>> >>                  if (EXEC_BIOS_CMD_TABLE(SetPixelClock, clk))
>> >>                          result = BP_RESULT_OK;
>> >> @@ -1135,6 +1182,20 @@ static enum bp_result set_pixel_clock_v6(
>> >>                   * driver choose program it itself, i.e. here we pass
>> required
>> >>                   * target rate that includes deep color.
>> >>                   */
>> >> +               if (bp_params->signal_type == SIGNAL_TYPE_HDMI_TYPE_A)
>> >> +                       switch (bp_params->color_depth) {
>> >> +                       case TRANSMITTER_COLOR_DEPTH_30:
>> >> +                               clk.sPCLKInput.ucMiscInfo |=
>> PIXEL_CLOCK_V6_MISC_HDMI_30BPP_V6;
>> >> +                               break;
>> >> +                       case TRANSMITTER_COLOR_DEPTH_36:
>> >> +                               clk.sPCLKInput.ucMiscInfo |=
>> PIXEL_CLOCK_V6_MISC_HDMI_36BPP_V6;
>> >> +                               break;
>> >> +                       case TRANSMITTER_COLOR_DEPTH_48:
>> >> +                               clk.sPCLKInput.ucMiscInfo |=
>> PIXEL_CLOCK_V6_MISC_HDMI_48BPP;
>> >> +                               break;
>> >> +                       default:
>> >> +                               break;
>> >> +                       }
>> >>
>> >>                  if (EXEC_BIOS_CMD_TABLE(SetPixelClock, clk))
>> >>                          result = BP_RESULT_OK;
>> >> diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c
>> b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c
>> >> index fb733f573715..466f8f5803c9 100644
>> >> --- a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c
>> >> +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c
>> >> @@ -871,6 +871,20 @@ static bool dce110_program_pix_clk(
>> >>          bp_pc_params.flags.SET_EXTERNAL_REF_DIV_SRC =
>> >>
>> pll_settings->use_external_clk;
>> >>
>> >> +       switch (pix_clk_params->color_depth) {
>> >> +       case COLOR_DEPTH_101010:
>> >> +               bp_pc_params.color_depth = TRANSMITTER_COLOR_DEPTH_30;
>> >> +               break;
>> >> +       case COLOR_DEPTH_121212:
>> >> +               bp_pc_params.color_depth = TRANSMITTER_COLOR_DEPTH_36;
>> >> +               break;
>> >> +       case COLOR_DEPTH_161616:
>> >> +               bp_pc_params.color_depth = TRANSMITTER_COLOR_DEPTH_48;
>> >> +               break;
>> >> +       default:
>> >> +               break;
>> >> +       }
>> >> +
>> >>          if (clk_src->bios->funcs->set_pixel_clock(
>> >>                          clk_src->bios, &bp_pc_params) != BP_RESULT_OK)
>> >>                  return false;
>> >> diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c
>> b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c
>> >> index ada57f745fd7..19e380e0a330 100644
>> >> --- a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c
>> >> +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c
>> >> @@ -564,6 +564,7 @@ static void
>> dce110_stream_encoder_hdmi_set_stream_attribute(
>> >>          cntl.enable_dp_audio = enable_audio;
>> >>          cntl.pixel_clock = actual_pix_clk_khz;
>> >>          cntl.lanes_number = LANE_COUNT_FOUR;
>> >> +       cntl.color_depth = crtc_timing->display_color_depth;
>> >>
>> >>          if (enc110->base.bp->funcs->encoder_control(
>> >>                          enc110->base.bp, &cntl) != BP_RESULT_OK)
>> >> --
>> >> 2.25.1
>> >>
>> >> _______________________________________________
>> >> dri-devel mailing list
>> >> dri-devel at lists.freedesktop.org
>> >>
>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Fdri-devel&data=04%7C01%7Cnicholas.kazlauskas%40amd.com%7C598b2b5e841940b8c27708d8c15aa80d%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637471942408643835%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=b9C3Xi%2F2RmNsGyGUN5oBF8U%2BuGyt2w4jUZ2dK8NM4AY%3D&reserved=0
>> > _______________________________________________
>> > dri-devel mailing list
>> > dri-devel at lists.freedesktop.org
>> >
>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Fdri-devel&data=04%7C01%7Cnicholas.kazlauskas%40amd.com%7C598b2b5e841940b8c27708d8c15aa80d%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637471942408643835%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=b9C3Xi%2F2RmNsGyGUN5oBF8U%2BuGyt2w4jUZ2dK8NM4AY%3D&reserved=0
>> >
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20210210/c6a34753/attachment-0001.htm>


More information about the amd-gfx mailing list