On Fri, 05 Feb 2016, "Thulasimani, Sivakumar" <sivakumar.thulasim...@intel.com> 
wrote:
> On 2/4/2016 5:59 PM, Jani Nikula wrote:
>> On Thu, 04 Feb 2016, Shubhangi Shrivastava <shubhangi.shrivast...@intel.com> 
>> wrote:
>>> This patch sets the invert bit for hpd detection for each port
>>> based on vbt configuration. since each AOB can be designed to
>>> depend on invert bit or not, it is expected if an AOB requires
>>> invert bit, the user will set respective bit in VBT.
>>>
>>> Signed-off-by: Sivakumar Thulasimani <sivakumar.thulasim...@intel.com>
>>> Signed-off-by: Durgadoss R <durgados...@intel.com>
>>> Signed-off-by: Shubhangi Shrivastava <shubhangi.shrivast...@intel.com>
>>> ---
>>>   drivers/gpu/drm/i915/i915_irq.c | 49 
>>> +++++++++++++++++++++++++++++++++++++++++
>>>   drivers/gpu/drm/i915/i915_reg.h |  9 ++++++++
>>>   2 files changed, 58 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/i915/i915_irq.c 
>>> b/drivers/gpu/drm/i915/i915_irq.c
>>> index 25a8937..305e6dd 100644
>>> --- a/drivers/gpu/drm/i915/i915_irq.c
>>> +++ b/drivers/gpu/drm/i915/i915_irq.c
>>> @@ -3424,6 +3424,54 @@ static void ibx_hpd_irq_setup(struct drm_device *dev)
>>>     I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
>>>   }
>>>   
>>> +/*
>>> + * For BXT invert bit has to be set based on AOB design
>>> + * for HPD detection logic, update it based on VBT fields.
>>> + */
>>> +static void bxt_hpd_set_invert(struct drm_device *dev, u32 hotplug_port)
>>> +{
>>> +   struct drm_i915_private *dev_priv = dev->dev_private;
>>> +   int i, reg_val, val = 0;
>>> +
>>> +   for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
>>> +
>>> +           /* Proceed only if invert bit is set */
>>> +           if (dev_priv->vbt.child_dev[i].common.hpd_invert == 0)
>>> +                   continue;
>>> +
>>> +           /*
>>> +            * Convert dvo_port to PORT_X and set appropriate bit
>>> +            * only if hotplug is enabled on that port
>>> +            */
>>> +           switch (dev_priv->vbt.child_dev[i].common.dvo_port) {
>>> +           case DVO_PORT_DPA:
>>> +           case DVO_PORT_HDMIA:
>>> +                   if (hotplug_port & BXT_DE_PORT_HP_DDIA)
>>> +                           val |= BXT_DDIA_HPD_INVERT;
>>> +                   break;
>>> +           case DVO_PORT_DPB:
>>> +           case DVO_PORT_HDMIB:
>>> +                   if (hotplug_port & BXT_DE_PORT_HP_DDIB)
>>> +                           val |= BXT_DDIB_HPD_INVERT;
>>> +                   break;
>>> +           case DVO_PORT_DPC:
>>> +           case DVO_PORT_HDMIC:
>>> +                   if (hotplug_port & BXT_DE_PORT_HP_DDIC)
>>> +                           val |= BXT_DDIC_HPD_INVERT;
>>> +                   break;
>>> +           default:
>>> +                   DRM_ERROR("HPD invert set for invalid dvo port %d\n",
>>> +                              dev_priv->vbt.child_dev[i].common.dvo_port);
>>> +                   break;
>>> +           }
>>> +   }
>>> +   reg_val = I915_READ(BXT_HOTPLUG_CTL);
>>> +   DRM_DEBUG_KMS("Invert bit setting: hp_ctl:%x hp_port:%x val:%x\n",
>>> +                           reg_val, hotplug_port, val);
>>> +   reg_val &= ~BXT_DDI_HPD_INVERT_MASK;
>>> +   I915_WRITE(BXT_HOTPLUG_CTL, reg_val | val);
>>> +}
>> No, we don't want this here. Separate VBT parsing from the rest of the
>> logic. See [1] for some directions where I want to take this type of
>> things.
> hmm understood, will add intel_bios_requires_invert(dev, port)
> and change the logic above to
> if (intel_bios_requires_invert(dev,port)
>      val |= port;
> hope this should be fine.

I'd make it

bool intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv, enum 
port port);

BR,
Jani.



>> BR,
>> Jani.
>>
>> [1] http://mid.gmane.org/cover.1452541881.git.jani.nik...@intel.com
>>
>>
>>
>>> +
>>>   static void spt_hpd_irq_setup(struct drm_device *dev)
>>>   {
>>>     struct drm_i915_private *dev_priv = dev->dev_private;
>>> @@ -3494,6 +3542,7 @@ static void bxt_hpd_irq_setup(struct drm_device *dev)
>>>     hotplug |= PORTC_HOTPLUG_ENABLE | PORTB_HOTPLUG_ENABLE |
>>>             PORTA_HOTPLUG_ENABLE;
>>>     I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
>>> +   bxt_hpd_set_invert(dev, enabled_irqs);
>>>   }
>>>   
>>>   static void ibx_irq_postinstall(struct drm_device *dev)
>>> diff --git a/drivers/gpu/drm/i915/i915_reg.h 
>>> b/drivers/gpu/drm/i915/i915_reg.h
>>> index 0a98889..01bd3c5 100644
>>> --- a/drivers/gpu/drm/i915/i915_reg.h
>>> +++ b/drivers/gpu/drm/i915/i915_reg.h
>>> @@ -5936,6 +5936,15 @@ enum skl_disp_power_wells {
>>>   #define GEN8_PCU_IIR _MMIO(0x444e8)
>>>   #define GEN8_PCU_IER _MMIO(0x444ec)
>>>   
>>> +/* BXT hotplug control */
>>> +#define BXT_HOTPLUG_CTL                    _MMIO(0xC4030)
>>> +#define BXT_DDIA_HPD_INVERT                (1 << 27)
>>> +#define BXT_DDIC_HPD_INVERT                (1 << 11)
>>> +#define BXT_DDIB_HPD_INVERT                (1 << 3)
>>> +#define BXT_DDI_HPD_INVERT_MASK            (BXT_DDIA_HPD_INVERT | \
>>> +                                    BXT_DDIB_HPD_INVERT | \
>>> +                                    BXT_DDIC_HPD_INVERT)
>>> +
>>>   #define ILK_DISPLAY_CHICKEN2      _MMIO(0x42004)
>>>   /* Required on all Ironlake and Sandybridge according to the B-Spec. */
>>>   #define  ILK_ELPIN_409_SELECT     (1 << 25)
>

-- 
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to