[Intel-gfx] [PATCH] drm/i915/cnp: add CNP gmbus support

Srivatsa, Anusha anusha.srivatsa at intel.com
Wed May 31 21:31:36 UTC 2017



>-----Original Message-----
>From: Rodrigo Vivi [mailto:rodrigo.vivi at gmail.com]
>Sent: Wednesday, May 31, 2017 11:29 AM
>To: Vivi, Rodrigo <rodrigo.vivi at intel.com>; Srivatsa, Anusha
><anusha.srivatsa at intel.com>
>Cc: intel-gfx <intel-gfx at lists.freedesktop.org>; Nikula, Jani
><jani.nikula at intel.com>; Vetter, Daniel <daniel.vetter at intel.com>
>Subject: Re: [Intel-gfx] [PATCH] drm/i915/cnp: add CNP gmbus support
>
>Anusha, when going to merge I noticed that we had the wrong version here.
>
>The incorrect version would break hdmi on CFL. The right workaround is not to
>respect the CNL bios for the pin number.
>
>So, I hope I can keep your rv-b on this one, but I'd like you to confirm please.

Looked into the spec again. You are right, mapping has to be changed.

Anusha 

>Thanks,
>Rodrigo.
>
>On Wed, May 31, 2017 at 11:26 AM, Rodrigo Vivi <rodrigo.vivi at intel.com>
>wrote:
>> On CNP PCH based platforms the gmbus is on the south display that is
>> on PCH. The existing implementation for previous platforms already
>> covers the need for CNP expect for the pin pair configuration that
>> follows similar definitions that we had on BXT.
>>
>> v2: Don't drop "_BXT" as the indicator of the first platform
>>     supporting this pin numbers. Suggested by Daniel.
>> v3: Add missing else and fix register table since CNP GPIO_CTL
>>     starts on 0xC5014.
>> v4: Fix pin number and map according to the current available VBT.
>>     Re-add pin 4 for port D. Lost during some rebase.
>> v5: Use table as spec. If VBT is wrong it should be ignored.
>>
>> Cc: Daniel Vetter <daniel.vetter at intel.com>
>> Cc: Jani Nikula <jani.nikula at intel.com>
>> Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
>> ---
>>  drivers/gpu/drm/i915/i915_reg.h   |  3 ++-
>>  drivers/gpu/drm/i915/intel_hdmi.c |  8 +++++---
>> drivers/gpu/drm/i915/intel_i2c.c  | 15 +++++++++++++--
>>  3 files changed, 20 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_reg.h
>> b/drivers/gpu/drm/i915/i915_reg.h index 6826547..efbbeb8 100644
>> --- a/drivers/gpu/drm/i915/i915_reg.h
>> +++ b/drivers/gpu/drm/i915/i915_reg.h
>> @@ -2618,9 +2618,10 @@ enum skl_disp_power_wells {
>>  #define   GMBUS_PIN_DPB                5 /* SDVO, HDMIB */
>>  #define   GMBUS_PIN_DPD                6 /* HDMID */
>>  #define   GMBUS_PIN_RESERVED   7 /* 7 reserved */
>> -#define   GMBUS_PIN_1_BXT      1
>> +#define   GMBUS_PIN_1_BXT      1 /* BXT+ (atom) and CNP+ (big core) */
>>  #define   GMBUS_PIN_2_BXT      2
>>  #define   GMBUS_PIN_3_BXT      3
>> +#define   GMBUS_PIN_4_CNP      4
>>  #define   GMBUS_NUM_PINS       7 /* including 0 */
>>  #define GMBUS1                 _MMIO(dev_priv->gpio_mmio_base + 0x5104) /*
>command/status */
>>  #define   GMBUS_SW_CLR_INT     (1<<31)
>> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c
>> b/drivers/gpu/drm/i915/intel_hdmi.c
>> index 6efc3cb..f8c40ae 100644
>> --- a/drivers/gpu/drm/i915/intel_hdmi.c
>> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
>> @@ -1892,19 +1892,21 @@ static u8 intel_hdmi_ddc_pin(struct
>> drm_i915_private *dev_priv,
>>
>>         switch (port) {
>>         case PORT_B:
>> -               if (IS_GEN9_LP(dev_priv))
>> +               if (IS_GEN9_LP(dev_priv) || HAS_PCH_CNP(dev_priv))
>>                         ddc_pin = GMBUS_PIN_1_BXT;
>>                 else
>>                         ddc_pin = GMBUS_PIN_DPB;
>>                 break;
>>         case PORT_C:
>> -               if (IS_GEN9_LP(dev_priv))
>> +               if (IS_GEN9_LP(dev_priv) || HAS_PCH_CNP(dev_priv))
>>                         ddc_pin = GMBUS_PIN_2_BXT;
>>                 else
>>                         ddc_pin = GMBUS_PIN_DPC;
>>                 break;
>>         case PORT_D:
>> -               if (IS_CHERRYVIEW(dev_priv))
>> +               if (HAS_PCH_CNP(dev_priv))
>> +                       ddc_pin = GMBUS_PIN_4_CNP;
>> +               else if (IS_CHERRYVIEW(dev_priv))
>>                         ddc_pin = GMBUS_PIN_DPD_CHV;
>>                 else
>>                         ddc_pin = GMBUS_PIN_DPD; diff --git
>> a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c
>> index b6401e8..3c9e00d 100644
>> --- a/drivers/gpu/drm/i915/intel_i2c.c
>> +++ b/drivers/gpu/drm/i915/intel_i2c.c
>> @@ -68,11 +68,20 @@ struct gmbus_pin {
>>         [GMBUS_PIN_3_BXT] = { "misc", GPIOD },  };
>>
>> +static const struct gmbus_pin gmbus_pins_cnp[] = {
>> +       [GMBUS_PIN_1_BXT] = { "dpb", GPIOB },
>> +       [GMBUS_PIN_2_BXT] = { "dpc", GPIOC },
>> +       [GMBUS_PIN_3_BXT] = { "misc", GPIOD },
>> +       [GMBUS_PIN_4_CNP] = { "dpd", GPIOE }, };
>> +
>>  /* pin is expected to be valid */
>>  static const struct gmbus_pin *get_gmbus_pin(struct drm_i915_private
>*dev_priv,
>>                                              unsigned int pin)  {
>> -       if (IS_GEN9_LP(dev_priv))
>> +       if (HAS_PCH_CNP(dev_priv))
>> +               return &gmbus_pins_cnp[pin];
>> +       else if (IS_GEN9_LP(dev_priv))
>>                 return &gmbus_pins_bxt[pin];
>>         else if (IS_GEN9_BC(dev_priv))
>>                 return &gmbus_pins_skl[pin]; @@ -87,7 +96,9 @@ bool
>> intel_gmbus_is_valid_pin(struct drm_i915_private *dev_priv,  {
>>         unsigned int size;
>>
>> -       if (IS_GEN9_LP(dev_priv))
>> +       if (HAS_PCH_CNP(dev_priv))
>> +               size = ARRAY_SIZE(gmbus_pins_cnp);
>> +       else if (IS_GEN9_LP(dev_priv))
>>                 size = ARRAY_SIZE(gmbus_pins_bxt);
>>         else if (IS_GEN9_BC(dev_priv))
>>                 size = ARRAY_SIZE(gmbus_pins_skl);
>> --
>> 1.9.1
>>
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
>
>
>--
>Rodrigo Vivi
>Blog: http://blog.vivi.eng.br


More information about the Intel-gfx mailing list