On Fri, Nov 7, 2025 at 12:05 PM Jani Nikula <[email protected]> wrote:
>
> We have drm_crtc_vblank_crtc() to get the struct drm_vblank_crtc pointer
> for a crtc. Use it instead of poking at dev->vblank[] directly.
>
> However, we also need to get the crtc to start with. We could use
> drm_crtc_from_index(), but refactor to use drm_for_each_crtc() instead.
>
> This is all a bit tedious, and perhaps the driver shouldn't be poking at
> vblank->enabled directly in the first place. But at least hide away the
> dev->vblank[] access in drm_vblank.c where it belongs.
>
> Cc: Patrik Jakobsson <[email protected]>
> Signed-off-by: Jani Nikula <[email protected]>

Hi Jani,
The gma500 part looks good. Feel free to merge this yourself.

Acked-by: Patrik Jakobsson <[email protected]>

> ---
>  drivers/gpu/drm/gma500/psb_irq.c | 36 ++++++++++++++++++++------------
>  1 file changed, 23 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/gma500/psb_irq.c 
> b/drivers/gpu/drm/gma500/psb_irq.c
> index c224c7ff353c..3a946b472064 100644
> --- a/drivers/gpu/drm/gma500/psb_irq.c
> +++ b/drivers/gpu/drm/gma500/psb_irq.c
> @@ -250,6 +250,7 @@ static irqreturn_t gma_irq_handler(int irq, void *arg)
>  void gma_irq_preinstall(struct drm_device *dev)
>  {
>         struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
> +       struct drm_crtc *crtc;
>         unsigned long irqflags;
>
>         spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
> @@ -260,10 +261,15 @@ void gma_irq_preinstall(struct drm_device *dev)
>         PSB_WSGX32(0x00000000, PSB_CR_EVENT_HOST_ENABLE);
>         PSB_RSGX32(PSB_CR_EVENT_HOST_ENABLE);
>
> -       if (dev->vblank[0].enabled)
> -               dev_priv->vdc_irq_mask |= _PSB_VSYNC_PIPEA_FLAG;
> -       if (dev->vblank[1].enabled)
> -               dev_priv->vdc_irq_mask |= _PSB_VSYNC_PIPEB_FLAG;
> +       drm_for_each_crtc(crtc, dev) {
> +               struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
> +
> +               if (vblank->enabled) {
> +                       u32 mask = drm_crtc_index(crtc) ? 
> _PSB_VSYNC_PIPEB_FLAG :
> +                               _PSB_VSYNC_PIPEA_FLAG;
> +                       dev_priv->vdc_irq_mask |= mask;
> +               }
> +       }
>
>         /* Revisit this area - want per device masks ? */
>         if (dev_priv->ops->hotplug)
> @@ -278,8 +284,8 @@ void gma_irq_preinstall(struct drm_device *dev)
>  void gma_irq_postinstall(struct drm_device *dev)
>  {
>         struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
> +       struct drm_crtc *crtc;
>         unsigned long irqflags;
> -       unsigned int i;
>
>         spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
>
> @@ -292,11 +298,13 @@ void gma_irq_postinstall(struct drm_device *dev)
>         PSB_WVDC32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
>         PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
>
> -       for (i = 0; i < dev->num_crtcs; ++i) {
> -               if (dev->vblank[i].enabled)
> -                       gma_enable_pipestat(dev_priv, i, 
> PIPE_VBLANK_INTERRUPT_ENABLE);
> +       drm_for_each_crtc(crtc, dev) {
> +               struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
> +
> +               if (vblank->enabled)
> +                       gma_enable_pipestat(dev_priv, drm_crtc_index(crtc), 
> PIPE_VBLANK_INTERRUPT_ENABLE);
>                 else
> -                       gma_disable_pipestat(dev_priv, i, 
> PIPE_VBLANK_INTERRUPT_ENABLE);
> +                       gma_disable_pipestat(dev_priv, drm_crtc_index(crtc), 
> PIPE_VBLANK_INTERRUPT_ENABLE);
>         }
>
>         if (dev_priv->ops->hotplug_enable)
> @@ -337,8 +345,8 @@ void gma_irq_uninstall(struct drm_device *dev)
>  {
>         struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
>         struct pci_dev *pdev = to_pci_dev(dev->dev);
> +       struct drm_crtc *crtc;
>         unsigned long irqflags;
> -       unsigned int i;
>
>         if (!dev_priv->irq_enabled)
>                 return;
> @@ -350,9 +358,11 @@ void gma_irq_uninstall(struct drm_device *dev)
>
>         PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
>
> -       for (i = 0; i < dev->num_crtcs; ++i) {
> -               if (dev->vblank[i].enabled)
> -                       gma_disable_pipestat(dev_priv, i, 
> PIPE_VBLANK_INTERRUPT_ENABLE);
> +       drm_for_each_crtc(crtc, dev) {
> +               struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
> +
> +               if (vblank->enabled)
> +                       gma_disable_pipestat(dev_priv, drm_crtc_index(crtc), 
> PIPE_VBLANK_INTERRUPT_ENABLE);
>         }
>
>         dev_priv->vdc_irq_mask &= _PSB_IRQ_SGX_FLAG |
> --
> 2.47.3
>

Reply via email to