On Mon, November 2, 2020 2:12 PM Matt Roper wrote:
>On Fri, Oct 30, 2020 at 07:55:35PM -0700, Lee, Shawn C wrote:
>> On Fri, Oct. 30, 2020, 5:35 p.m., Matt Roper wrote:
>> >On Fri, Oct 30, 2020 at 09:41:37PM +0800, Lee Shawn C wrote:
>> >> After boot into kernel. Driver configured ddc pin mapping based on 
>> >> predefined table in parse_ddi_port(). Now driver configure rkl ddc 
>> >> pin mapping depends on icp_ddc_pin_map[]. Then this table will give 
>> >> incorrect gmbus port number to cause HDMI can't work.
>> >>
>> >> Refer to commit d0a89527d06 ("drm/i915/rkl: Add DDC pin mapping").
>> >> Create two ddc pin table for rkl TGP and CMP pch. Then HDMI can 
>> >> works properly on rkl.
>> >>
>> >> v2: update patch based on latest dinq branch.
>> >>
>> >> Cc: Matt Roper <[email protected]>
>> >> Cc: Aditya Swarup <[email protected]>
>> >> Cc: Anusha Srivatsa <[email protected]>
>> >> Cc: Jani Nikula <[email protected]>
>> >> Cc: Cooper Chiou <[email protected]>
>> >> Cc: Khaled Almahallawy <[email protected]>
>> >> Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2577
>> >> Signed-off-by: Lee Shawn C <[email protected]>
>> >> ---
>> >>  drivers/gpu/drm/i915/display/intel_bios.c     | 20 +++++++++++++++++++
>> >>  drivers/gpu/drm/i915/display/intel_vbt_defs.h |  4 ++++
>> >>  2 files changed, 24 insertions(+)
>> >>
>> >> diff --git a/drivers/gpu/drm/i915/display/intel_bios.c
>> >> b/drivers/gpu/drm/i915/display/intel_bios.c
>> >> index 0a309645fe06..ca9426e1768a 100644
>> >> --- a/drivers/gpu/drm/i915/display/intel_bios.c
>> >> +++ b/drivers/gpu/drm/i915/display/intel_bios.c
>> >> @@ -1623,6 +1623,18 @@ static const u8 icp_ddc_pin_map[] = {  
>> >> [TGL_DDC_BUS_PORT_6] = GMBUS_PIN_14_TC6_TGP,  };
>> >>
>> >> +static const u8 rkl_pch_tgp_ddc_pin_map[] = { [RKL_DDC_BUS_DDI_B] 
>> >> += GMBUS_PIN_2_BXT, [RKL_DDC_BUS_DDI_D] = GMBUS_PIN_9_TC1_ICP, 
>> >> +[RKL_DDC_BUS_DDI_E] = GMBUS_PIN_10_TC2_ICP, };
>> >> +
>> >> +static const u8 rkl_pch_cmp_ddc_pin_map[] = { [RKL_DDC_BUS_DDI_B] 
>> >> += GMBUS_PIN_2_BXT, [RKL_DDC_BUS_DDI_D] = GMBUS_PIN_3_BXT, 
>> >> +[RKL_DDC_BUS_DDI_E] = GMBUS_PIN_4_CNP, };
>> >> +
>> >>  static u8 map_ddc_pin(struct drm_i915_private *dev_priv, u8 
>> >> vbt_pin) {  const u8 *ddc_pin_map; @@ -1630,6 +1642,14 @@ static u8 
>> >> map_ddc_pin(struct drm_i915_private *dev_priv, u8 vbt_pin)
>> >>
>> >>  if (INTEL_PCH_TYPE(dev_priv) >= PCH_DG1) {  return vbt_pin;
>> >> +} else if (IS_ROCKETLAKE(dev_priv)) { if (INTEL_PCH_TYPE(dev_priv) 
>> >> +>= PCH_TGP) { ddc_pin_map = rkl_pch_tgp_ddc_pin_map; n_entries = 
>> >> +ARRAY_SIZE(rkl_pch_tgp_ddc_pin_map);
>> >> +} else {
>> >> +ddc_pin_map = rkl_pch_cmp_ddc_pin_map; n_entries = 
>> >> +ARRAY_SIZE(rkl_pch_cmp_ddc_pin_map);
>> >> +}
>> >>  } else if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP) {  ddc_pin_map = 
>> >> icp_ddc_pin_map;  n_entries = ARRAY_SIZE(icp_ddc_pin_map); diff 
>> >> --git a/drivers/gpu/drm/i915/display/intel_vbt_defs.h
>> >> b/drivers/gpu/drm/i915/display/intel_vbt_defs.h
>> >> index 49b4b5fca941..2df009996128 100644
>> >> --- a/drivers/gpu/drm/i915/display/intel_vbt_defs.h
>> >> +++ b/drivers/gpu/drm/i915/display/intel_vbt_defs.h
>> >> @@ -319,6 +319,10 @@ enum vbt_gmbus_ddi {  ICL_DDC_BUS_DDI_A = 0x1,  
>> >> ICL_DDC_BUS_DDI_B,  TGL_DDC_BUS_DDI_C,
>> >> +RKL_DDC_BUS_DDI_B = 0x1,
>> >> +RKL_DDC_BUS_DDI_C,
>> >> +RKL_DDC_BUS_DDI_D,
>> >> +RKL_DDC_BUS_DDI_E,
>> >
>> >These definitions don't really make sense; according to the VBT definition 
>> >in the bspec (20124), the symbolic names map to different VBT input values 
>> >depending on which PCH is paired with RKL.  E.g., VBT value of "2" refers 
>> >to PHY-C when using a CMP PCH, but refers to PHY-B when using a TGP PCH.
>> >
>> >From what I can see, RKL+TGP is already handled properly today in the code 
>> >and doesn't need any special handling.  The patch here would actually break 
>> >it, because it would associate the wrong pins to outputs (and fail to 
>> >associate anything at all with PHY-B [vbt value 2]).
>> >
>> >For RKL+CMP, we do need a change to the code to pick valid output pins in 
>> >the range 1-4 rather than 1,2,9,A, but it doesn't look like the mapping 
>> >being added here is quite right for that either.  CMP is a derivative of 
>> >CNP, so I believe we should be following the "CNL-PCH"
>> >column of the VBT definition.
>> >
>> >
>> >Matt
>> >
>> 
>> Hi Matt,
>> 
>> Thanks for your comments! Below is EFP configuration from vbt. And we 
>> know there is no real port "C" on physical hardware with TGP-PCH.
>
>The terminology gets somewhat confusing, so just for clarity, the outputs on 
>RKL in general are:
>
>          DDI-A (aka PORT-A) <-> PHY-A
>          DDI-B (aka PORT-B) <-> PHY-B
>        DDI-TC1 (aka PORT-D) <-> PHY-C
>        DDI-TC2 (aka PORT-E) <-> PHY-D
>
>Note that on recent platforms where the DDI and PHY are separate blocks we try 
>to use the term "port" to refer to the DDI.  And based on their register 
>offsets, we treat DDI-TC1 and DDI-TC2 as ports D and E in i915, even though 
>that's not something the bspec does.
>
>It looks like the proper table for RKL+TGP should actually be:
>
>        static const u8 rkl_pch_tgp_ddc_pin_map[] = {
>                [1] = GMBUS_PIN_1_BXT,
>                [2] = GMBUS_PIN_2_BXT,
>                [3] = GMBUS_PIN_9_TC1_ICP,
>                [4] = GMBUS_PIN_10_TC2_ICP,
>        }
>

Thanks for clarification! I will update table like this.

>i.e., basically the same as what you had, but we do need to handle the input 
>value '1' too since we can legitimately drive HDMI on all four of the outputs 
>when using a TGP PCH.
>
>When we're instead working on a RKL+CMP platform DDI-A output (if
>present) will always be eDP; there's no support for HDMI in that case.
>So for RKL+CMP the gmbus pin mapping needs to be
>
>        0x1 (DDI-B) -> 0x1
>        0x2 (DDI-C) -> 0x2
>        0x3 (DDI-D) -> 0x4
>
>The cnp_ddc_pin_map[] table that we already have in the code should handle 
>that properly, so there's no need for special RKL+CMP handling; we can just 
>let it fall through to the existing HAS_PCH_CNP() branch.

OK! If RKL+CMP sku, driver will load cnp_ddc_pin_map[] just like original 
design. The new table will be removed.

>However I think rkl_port_to_ddc_pin() is off by one for the values it's 
>returning on CMP; we need to fix that so that cases where the VBT doesn't 
>specify a valid DDC pin.
>

Looks like we need some changes in rkl_port_to_ddc_pin() like below. What do 
you think?
        if (INTEL_PCH_TYPE(dev_priv) >= PCH_TGP && phy > PHY_C)
                return GMBUS_PIN_9_TC1_ICP + phy - PHY_D;

>
>Matt
>
>> EFP1 : DisplayPort-B
>> EFP2 : HDMI-C
>> EFP3 : HDMI-D
>> EFP4 : no device
>> 
>> Below messages came from customer board with latest drm-tip kernel 
>> (5.10.0-rc1+). Port D/E will be mapped to ddc pin 0x3/0x9 according to 
>> icp_ddc_pin_map[].
>> But port D/E should map to 0x9/0xa on TGP-PCH.
>> Oct 23 18:39:14 ubuntu kernel: i915 0000:00:02.0: 
>> [drm:intel_bios_port_aux_ch [i915]] using AUX D for port D (platform 
>> default) Oct 23 18:39:14 ubuntu kernel: i915 0000:00:02.0: 
>> [drm:intel_hdmi_init_connector [i915]] Adding HDMI connector on 
>> [ENCODER:201:DDI D] Oct 23 18:39:14 ubuntu kernel: i915 0000:00:02.0: 
>> [drm:intel_hdmi_init_connector [i915]] Using DDC pin 0x3 for port D 
>> (VBT) Oct 23 18:39:14 ubuntu kernel: i915 0000:00:02.0: 
>> [drm:intel_bios_port_aux_ch [i915]] using AUX E for port E (platform 
>> default) Oct 23 18:39:14 ubuntu kernel: i915 0000:00:02.0: 
>> [drm:intel_hdmi_init_connector [i915]] Adding HDMI connector on 
>> [ENCODER:205:DDI E] Oct 23 18:39:14 ubuntu kernel: i915 0000:00:02.0: 
>> [drm:intel_hdmi_init_connector [i915]] Using DDC pin 0x9 for port E 
>> (VBT)
>> 
>> This is what we got after applied this change.
>> Oct 28 18:18:47 ubuntu kernel: i915 0000:00:02.0: 
>> [drm:intel_bios_port_aux_ch [i915]] using AUX D for port D (platform 
>> default) Oct 28 18:18:47 ubuntu kernel: i915 0000:00:02.0: 
>> [drm:intel_hdmi_init_connector [i915]] Adding HDMI connector on 
>> [ENCODER:201:DDI D] Oct 28 18:18:47 ubuntu kernel: i915 0000:00:02.0: 
>> [drm:intel_hdmi_init_connector [i915]] Using DDC pin 0x9 for port D 
>> (VBT) Oct 28 18:18:47 ubuntu kernel: i915 0000:00:02.0: 
>> [drm:intel_bios_port_aux_ch [i915]] using AUX E for port E (platform 
>> default) Oct 28 18:18:47 ubuntu kernel: i915 0000:00:02.0: 
>> [drm:intel_hdmi_init_connector [i915]] Adding HDMI connector on 
>> [ENCODER:205:DDI E] Oct 28 18:18:47 ubuntu kernel: i915 0000:00:02.0: 
>> [drm:intel_hdmi_init_connector [i915]] Using DDC pin 0xa for port E 
>> (VBT)
>> 
>> Best regards,
>> Shawn
>> 
>> >>  ICL_DDC_BUS_PORT_1 = 0x4,
>> >>  ICL_DDC_BUS_PORT_2,
>> >>  ICL_DDC_BUS_PORT_3,
>> >> --
>> >> 2.28.0
>> >>
>> >
>> >--
>> >Matt Roper
>> >Graphics Software Engineer
>> >VTT-OSGC Platform Enablement
>> >Intel Corporation
>> >(916) 356-2795
>> >
>
>--
>Matt Roper
>Graphics Software Engineer
>VTT-OSGC Platform Enablement
>Intel Corporation
>(916) 356-2795

Best regards,
Shawn
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to