On Wed, Mar 28, 2012 at 01:39:38PM -0700, Jesse Barnes wrote:
> ValleyView has a new interrupt architecture; best to put it in a new set
> of functions.  Also make sure the ring mask functions handle ValleyView.
> 
> FIXME: fix flipping; need to enable interrupts and call prepare/finish
> 
> Signed-off-by: Jesse Barnes <[email protected]>
> ---
>  drivers/gpu/drm/i915/i915_debugfs.c     |   40 ++++-
>  drivers/gpu/drm/i915/i915_irq.c         |  338 
> ++++++++++++++++++++++++++++++-
>  drivers/gpu/drm/i915/i915_reg.h         |    7 +-
>  drivers/gpu/drm/i915/intel_ringbuffer.c |    4 +-
>  4 files changed, 383 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
> b/drivers/gpu/drm/i915/i915_debugfs.c
> index e74674b..d226f2f 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -468,7 +468,45 @@ static int i915_interrupt_info(struct seq_file *m, void 
> *data)
>       if (ret)
>               return ret;
>  
> -     if (!HAS_PCH_SPLIT(dev)) {
> +     if (IS_VALLEYVIEW(dev)) {
> +             seq_printf(m, "Display IER:\t%08x\n",
> +                        I915_READ(VLV_IER));
> +             seq_printf(m, "Display IIR:\t%08x\n",
> +                        I915_READ(VLV_IIR));
> +             seq_printf(m, "Display IIR_RW:\t%08x\n",
> +                        I915_READ(VLV_IIR_RW));
> +             seq_printf(m, "Display IMR:\t%08x\n",
> +                        I915_READ(VLV_IMR));
> +             for_each_pipe(pipe)
> +                     seq_printf(m, "Pipe %c stat:\t%08x\n",
> +                                pipe_name(pipe),
> +                                I915_READ(PIPESTAT(pipe)));
> +
> +             seq_printf(m, "Master IER:\t%08x\n",
> +                        I915_READ(VLV_MASTER_IER));
> +
> +             seq_printf(m, "Render IER:\t%08x\n",
> +                        I915_READ(GTIER));
> +             seq_printf(m, "Render IIR:\t%08x\n",
> +                        I915_READ(GTIIR));
> +             seq_printf(m, "Render IMR:\t%08x\n",
> +                        I915_READ(GTIMR));
> +
> +             seq_printf(m, "PM IER:\t\t%08x\n",
> +                        I915_READ(GEN6_PMIER));
> +             seq_printf(m, "PM IIR:\t\t%08x\n",
> +                        I915_READ(GEN6_PMIIR));
> +             seq_printf(m, "PM IMR:\t\t%08x\n",
> +                        I915_READ(GEN6_PMIMR));
> +
> +             seq_printf(m, "Port hotplug:\t%08x\n",
> +                        I915_READ(PORT_HOTPLUG_EN));
> +             seq_printf(m, "DPFLIPSTAT:\t%08x\n",
> +                        I915_READ(VLV_DPFLIPSTAT));
> +             seq_printf(m, "DPINVGTT:\t%08x\n",
> +                        I915_READ(DPINVGTT));
> +
> +     } else if (!HAS_PCH_SPLIT(dev)) {
>               seq_printf(m, "Interrupt enable:    %08x\n",
>                          I915_READ(IER));
>               seq_printf(m, "Interrupt identity:  %08x\n",
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 998116e..01fb650 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -120,6 +120,10 @@ void intel_enable_asle(struct drm_device *dev)
>       drm_i915_private_t *dev_priv = dev->dev_private;
>       unsigned long irqflags;
>  
> +     /* FIXME: opregion/asle for VLV */
> +     if (IS_VALLEYVIEW(dev))
> +             return;
> +
>       spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
>  
>       if (HAS_PCH_SPLIT(dev))
> @@ -426,6 +430,119 @@ static void gen6_pm_rps_work(struct work_struct *work)
>       mutex_unlock(&dev_priv->dev->struct_mutex);
>  }
>  
> +static irqreturn_t valleyview_irq_handler(DRM_IRQ_ARGS)
> +{
> +     struct drm_device *dev = (struct drm_device *) arg;
> +     drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
> +     u32 iir, gt_iir, pm_iir;
> +     irqreturn_t ret = IRQ_NONE;
> +     unsigned long irqflags;
> +     int pipe;
> +     u32 pipe_stats[I915_MAX_PIPES];
> +     u32 vblank_status;
> +     int vblank = 0;
> +     bool blc_event;
> +
> +     atomic_inc(&dev_priv->irq_received);
> +
> +     vblank_status = PIPE_START_VBLANK_INTERRUPT_STATUS |
> +             PIPE_VBLANK_INTERRUPT_STATUS;
> +
> +     while (true) {
> +             iir = I915_READ(VLV_IIR);
> +             gt_iir = I915_READ(GTIIR);
> +             pm_iir = I915_READ(GEN6_PMIIR);
> +
> +             if (gt_iir == 0 && pm_iir == 0 && iir == 0)
> +                     goto out;
> +
> +             ret = IRQ_HANDLED;
> +
> +             if (gt_iir & (GT_USER_INTERRUPT | GT_PIPE_NOTIFY))
> +                     notify_ring(dev, &dev_priv->ring[RCS]);
> +             if (gt_iir & GT_GEN6_BSD_USER_INTERRUPT)
> +                     notify_ring(dev, &dev_priv->ring[VCS]);
> +             if (gt_iir & GT_BLT_USER_INTERRUPT)
> +                     notify_ring(dev, &dev_priv->ring[BCS]);
> +
> +             if (gt_iir & (GT_GEN6_BLT_CS_ERROR_INTERRUPT |
> +                           GT_GEN6_BSD_CS_ERROR_INTERRUPT |
> +                           GT_RENDER_CS_ERROR_INTERRUPT)) {
> +                     DRM_ERROR("GT error interrupt 0x%08x\n", gt_iir);
> +                     i915_handle_error(dev, false);
> +             }

Ben just cleaned up this code slightly (well, the reg definitions mostly
in i915_irq.c). I'm also wondering whether we should share the gt_iir
handling a bit - after all we share the gt core with ilk. But this can
easily be done in a follow-up patch.

> +
> +             spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
> +             for_each_pipe(pipe) {
> +                     int reg = PIPESTAT(pipe);
> +                     pipe_stats[pipe] = I915_READ(reg);
> +
> +                     /*
> +                      * Clear the PIPE*STAT regs before the IIR
> +                      */
> +                     if (pipe_stats[pipe] & 0x8000ffff) {
> +                             if (pipe_stats[pipe] & 
> PIPE_FIFO_UNDERRUN_STATUS)
> +                                     DRM_DEBUG_DRIVER("pipe %c underrun\n",
> +                                                      pipe_name(pipe));
> +                             I915_WRITE(reg, pipe_stats[pipe]);
> +                     }
> +             }
> +             spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
> +
> +             /* Consume port.  Then clear IIR or we'll miss events */
> +             if (iir & I915_DISPLAY_PORT_INTERRUPT) {
> +                     u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT);
> +
> +                     DRM_DEBUG_DRIVER("hotplug event received, stat 
> 0x%08x\n",
> +                                      hotplug_status);
> +                     if (hotplug_status & dev_priv->hotplug_supported_mask)
> +                             queue_work(dev_priv->wq,
> +                                        &dev_priv->hotplug_work);
> +
> +                     I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status);
> +                     I915_READ(PORT_HOTPLUG_STAT);
> +             }
> +
> +
> +             if (iir & I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT) {
> +                     drm_handle_vblank(dev, 0);
> +                     vblank++;
> +                     if (!dev_priv->flip_pending_is_done) {
> +                             intel_finish_page_flip(dev, 0);
> +                     }
> +             }
> +
> +             if (iir & I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT) {
> +                     drm_handle_vblank(dev, 1);
> +                     vblank++;
> +                     if (!dev_priv->flip_pending_is_done) {
> +                             intel_finish_page_flip(dev, 0);
> +                     }
> +             }
> +
> +             if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
> +                     blc_event = true;
> +
> +             if (pm_iir & GEN6_PM_DEFERRED_EVENTS) {
> +                     unsigned long flags;
> +                     spin_lock_irqsave(&dev_priv->rps_lock, flags);
> +                     WARN(dev_priv->pm_iir & pm_iir, "Missed a PM 
> interrupt\n");
> +                     dev_priv->pm_iir |= pm_iir;
> +                     I915_WRITE(GEN6_PMIMR, dev_priv->pm_iir);
> +                     POSTING_READ(GEN6_PMIMR);
> +                     spin_unlock_irqrestore(&dev_priv->rps_lock, flags);
> +                     queue_work(dev_priv->wq, &dev_priv->rps_work);
> +             }
> +
> +             I915_WRITE(GTIIR, gt_iir);
> +             I915_WRITE(GEN6_PMIIR, pm_iir);
> +             I915_WRITE(VLV_IIR, iir);
> +     }
> +
> +out:
> +     return ret;
> +}
> +
>  static void pch_irq_handler(struct drm_device *dev)
>  {
>       drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
> @@ -1567,6 +1684,32 @@ static int ivybridge_enable_vblank(struct drm_device 
> *dev, int pipe)
>       return 0;
>  }
>  
> +static int valleyview_enable_vblank(struct drm_device *dev, int pipe)
> +{
> +     drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
> +     unsigned long irqflags;
> +     u32 dpfl, imr;
> +
> +     if (!i915_pipe_enabled(dev, pipe))
> +             return -EINVAL;
> +
> +     spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
> +     dpfl = I915_READ(VLV_DPFLIPSTAT);
> +     imr = I915_READ(VLV_IMR);
> +     if (pipe == 0) {
> +             dpfl |= PIPEA_VBLANK_INT_EN;
> +             imr &= ~I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT;
> +     } else {
> +             dpfl |= PIPEA_VBLANK_INT_EN;
> +             imr &= ~I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT;
> +     }
> +     I915_WRITE(VLV_DPFLIPSTAT, dpfl);
> +     I915_WRITE(VLV_IMR, imr);
> +     spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
> +
> +     return 0;
> +}
> +
>  /* Called from drm generic code, passed 'crtc' which
>   * we use as a pipe index
>   */
> @@ -1608,6 +1751,28 @@ static void ivybridge_disable_vblank(struct drm_device 
> *dev, int pipe)
>       spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
>  }
>  
> +static void valleyview_disable_vblank(struct drm_device *dev, int pipe)
> +{
> +     drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
> +     unsigned long irqflags;
> +     u32 dpfl, imr;
> +
> +     spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
> +     dpfl = I915_READ(VLV_DPFLIPSTAT);
> +     imr = I915_READ(VLV_IMR);
> +     if (pipe == 0) {
> +             dpfl &= ~PIPEA_VBLANK_INT_EN;
> +             imr |= I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT;
> +     } else {
> +             dpfl &= ~PIPEB_VBLANK_INT_EN;
> +             imr |= I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT;
> +     }
> +     I915_WRITE(VLV_IMR, imr);
> +     I915_WRITE(VLV_DPFLIPSTAT, dpfl);
> +     spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
> +}
> +
> +
>  /* Set the vblank monitor pipe
>   */
>  int i915_vblank_pipe_set(struct drm_device *dev, void *data,
> @@ -1817,6 +1982,53 @@ static void ironlake_irq_preinstall(struct drm_device 
> *dev)
>       POSTING_READ(SDEIER);
>  }
>  
> +static void valleyview_irq_preinstall(struct drm_device *dev)
> +{
> +     drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
> +     int pipe;
> +
> +     atomic_set(&dev_priv->irq_received, 0);
> +
> +     INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func);
> +     INIT_WORK(&dev_priv->error_work, i915_error_work_func);
> +
> +     /* VLV magic */
> +     I915_WRITE(VLV_IMR, 0);
> +     I915_WRITE(RING_IMR(RENDER_RING_BASE), 0);
> +     I915_WRITE(RING_IMR(GEN6_BSD_RING_BASE), 0);
> +     I915_WRITE(RING_IMR(BLT_RING_BASE), 0);
> +
> +     if (IS_GEN6(dev) || IS_GEN7(dev)) {
> +             /* Workaround stalls observed on Sandy Bridge GPUs by
> +              * making the blitter command streamer generate a
> +              * write to the Hardware Status Page for
> +              * MI_USER_INTERRUPT.  This appears to serialize the
> +              * previous seqno write out before the interrupt
> +              * happens.
> +              */
> +             I915_WRITE(GEN6_BLITTER_HWSTAM, ~GEN6_BLITTER_USER_INTERRUPT);
> +             I915_WRITE(GEN6_BSD_HWSTAM, ~GEN6_BSD_USER_INTERRUPT);
> +     }

That wa hopefully doesn't apply to vlv. And it's dead by now anyway.
Please kill it.

> +
> +     /* and GT */
> +     I915_WRITE(GTIIR, I915_READ(GTIIR));
> +     I915_WRITE(GTIIR, I915_READ(GTIIR));
> +     I915_WRITE(GTIMR, 0xffffffff);
> +     I915_WRITE(GTIER, 0x0);
> +     POSTING_READ(GTIER);
> +
> +     I915_WRITE(DPINVGTT, 0xff);
> +
> +     I915_WRITE(PORT_HOTPLUG_EN, 0);
> +     I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
> +     for_each_pipe(pipe)
> +             I915_WRITE(PIPESTAT(pipe), 0xffff);
> +     I915_WRITE(VLV_IIR, 0xffffffff);
> +     I915_WRITE(VLV_IMR, 0xffffffff);
> +     I915_WRITE(VLV_IER, 0x0);
> +     POSTING_READ(VLV_IER);
> +}
> +
>  /*
>   * Enable digital hotplug on the PCH, and configure the DP short pulse
>   * duration to 2ms (which is the minimum in the Display Port spec)
> @@ -1963,6 +2175,96 @@ static int ivybridge_irq_postinstall(struct drm_device 
> *dev)
>       return 0;
>  }
>  
> +static int valleyview_irq_postinstall(struct drm_device *dev)
> +{
> +     drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
> +     u32 render_irqs;
> +     u32 enable_mask;
> +     u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN);
> +     u16 msid;
> +
> +     enable_mask = I915_DISPLAY_PORT_INTERRUPT;
> +     enable_mask |= I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT |
> +             I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT;
> +
> +     dev_priv->irq_mask = ~enable_mask;
> +
> +
> +     DRM_INIT_WAITQUEUE(&dev_priv->ring[RCS].irq_queue);
> +     DRM_INIT_WAITQUEUE(&dev_priv->ring[VCS].irq_queue);
> +     DRM_INIT_WAITQUEUE(&dev_priv->ring[BCS].irq_queue);
> +
> +     dev_priv->pipestat[0] = 0;
> +     dev_priv->pipestat[1] = 0;
> +
> +     dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B;
> +
> +     /* Hack for broken MSIs on VLV */
> +     pci_write_config_dword(dev_priv->dev->pdev, 0x94, 0xfee00000);
> +     pci_read_config_word(dev->pdev, 0x98, &msid);
> +     msid &= 0xff; /* mask out delivery bits */
> +     msid |= (1<<14);
> +     pci_write_config_word(dev_priv->dev->pdev, 0x98, msid);
> +
> +     I915_WRITE(VLV_IMR, dev_priv->irq_mask);
> +     I915_WRITE(VLV_IER, enable_mask);
> +     I915_WRITE(VLV_IIR, 0xffffffff);
> +     I915_WRITE(PIPESTAT(0), 0xffff);
> +     I915_WRITE(PIPESTAT(1), 0xffff);
> +     POSTING_READ(VLV_IER);
> +
> +     I915_WRITE(VLV_IIR, 0xffffffff);
> +     I915_WRITE(VLV_IIR, 0xffffffff);
> +
> +     render_irqs = GT_GEN6_BLT_FLUSHDW_NOTIFY_INTERRUPT |
> +             GT_GEN6_BLT_CS_ERROR_INTERRUPT |
> +             GT_BLT_USER_INTERRUPT |
> +             GT_GEN6_BSD_USER_INTERRUPT |
> +             GT_GEN6_BSD_CS_ERROR_INTERRUPT |
> +             GT_GEN7_L3_PARITY_ERROR_INTERRUPT |
> +             GT_PIPE_NOTIFY |
> +             GT_RENDER_CS_ERROR_INTERRUPT |
> +             GT_SYNC_STATUS |
> +             GT_USER_INTERRUPT;
> +
> +     dev_priv->gt_irq_mask = ~render_irqs;
> +
> +     I915_WRITE(GTIIR, I915_READ(GTIIR));
> +     I915_WRITE(GTIIR, I915_READ(GTIIR));
> +     I915_WRITE(GTIMR, 0);
> +     I915_WRITE(GTIER, render_irqs);
> +     POSTING_READ(GTIER);
> +
> +     /* ack & enable invalid PTE error interrupts */
> +#if 0 /* FIXME: add support to irq handler for checking these bits */
> +     I915_WRITE(DPINVGTT, DPINVGTT_STATUS_MASK);
> +     I915_WRITE(DPINVGTT, DPINVGTT_EN_MASK);
> +#endif
> +
> +     I915_WRITE(VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
> +#if 0 /* FIXME: check register definitions; some have moved */
> +     /* Note HDMI and DP share bits */
> +     if (dev_priv->hotplug_supported_mask & HDMIB_HOTPLUG_INT_STATUS)
> +             hotplug_en |= HDMIB_HOTPLUG_INT_EN;
> +     if (dev_priv->hotplug_supported_mask & HDMIC_HOTPLUG_INT_STATUS)
> +             hotplug_en |= HDMIC_HOTPLUG_INT_EN;
> +     if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS)
> +             hotplug_en |= HDMID_HOTPLUG_INT_EN;
> +     if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS)
> +             hotplug_en |= SDVOC_HOTPLUG_INT_EN;
> +     if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS)
> +             hotplug_en |= SDVOB_HOTPLUG_INT_EN;
> +     if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) {
> +             hotplug_en |= CRT_HOTPLUG_INT_EN;
> +             hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50;
> +     }
> +#endif
> +
> +     I915_WRITE(PORT_HOTPLUG_EN, hotplug_en);
> +
> +     return 0;
> +}
> +
>  static void i915_driver_irq_preinstall(struct drm_device * dev)
>  {
>       drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
> @@ -2066,6 +2368,30 @@ static int i915_driver_irq_postinstall(struct 
> drm_device *dev)
>       return 0;
>  }
>  
> +static void valleyview_irq_uninstall(struct drm_device *dev)
> +{
> +     drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
> +     int pipe;
> +
> +     if (!dev_priv)
> +             return;
> +
> +     dev_priv->vblank_pipe = 0;
> +
> +     for_each_pipe(pipe)
> +             I915_WRITE(PIPESTAT(pipe), 0xffff);
> +
> +     I915_WRITE(HWSTAM, 0xffffffff);
> +     I915_WRITE(PORT_HOTPLUG_EN, 0);
> +     I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
> +     for_each_pipe(pipe)
> +             I915_WRITE(PIPESTAT(pipe), 0xffff);
> +     I915_WRITE(VLV_IIR, 0xffffffff);
> +     I915_WRITE(VLV_IMR, 0xffffffff);
> +     I915_WRITE(VLV_IER, 0x0);
> +     POSTING_READ(VLV_IER);
> +}
> +
>  static void ironlake_irq_uninstall(struct drm_device *dev)
>  {
>       drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
> @@ -2121,7 +2447,8 @@ void intel_irq_init(struct drm_device *dev)
>  {
>       dev->driver->get_vblank_counter = i915_get_vblank_counter;
>       dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
> -     if (IS_G4X(dev) || IS_GEN5(dev) || IS_GEN6(dev) || IS_IVYBRIDGE(dev)) {
> +     if (IS_G4X(dev) || IS_GEN5(dev) || IS_GEN6(dev) || IS_IVYBRIDGE(dev) ||
> +         IS_VALLEYVIEW(dev)) {
>               dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */
>               dev->driver->get_vblank_counter = gm45_get_vblank_counter;
>       }
> @@ -2132,7 +2459,14 @@ void intel_irq_init(struct drm_device *dev)
>               dev->driver->get_vblank_timestamp = NULL;
>       dev->driver->get_scanout_position = i915_get_crtc_scanoutpos;
>  
> -     if (IS_IVYBRIDGE(dev)) {
> +     if (IS_VALLEYVIEW(dev)) {
> +             dev->driver->irq_handler = valleyview_irq_handler;
> +             dev->driver->irq_preinstall = valleyview_irq_preinstall;
> +             dev->driver->irq_postinstall = valleyview_irq_postinstall;
> +             dev->driver->irq_uninstall = valleyview_irq_uninstall;
> +             dev->driver->enable_vblank = valleyview_enable_vblank;
> +             dev->driver->disable_vblank = valleyview_disable_vblank;
> +     } else if (IS_IVYBRIDGE(dev)) {
>               /* Share pre & uninstall handlers with ILK/SNB */
>               dev->driver->irq_handler = ivybridge_irq_handler;
>               dev->driver->irq_preinstall = ironlake_irq_preinstall;
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index ddd445a..e7fab25 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -510,6 +510,11 @@
>  #define IIR          0x020a4
>  #define IMR          0x020a8
>  #define ISR          0x020ac
> +#define VLV_IIR_RW   0x182084
> +#define VLV_IER              0x1820a0
> +#define VLV_IIR              0x1820a4
> +#define VLV_IMR              0x1820a8
> +#define VLV_ISR              0x1820ac
>  #define   I915_PIPE_CONTROL_NOTIFY_INTERRUPT         (1<<18)
>  #define   I915_DISPLAY_PORT_INTERRUPT                        (1<<17)
>  #define   I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT (1<<15)
> @@ -2534,7 +2539,7 @@
>  #define PIPEFRAMEPIXEL(pipe)  _PIPE(pipe, _PIPEAFRAMEPIXEL, _PIPEBFRAMEPIXEL)
>  #define PIPESTAT(pipe) _PIPE(pipe, _PIPEASTAT, _PIPEBSTAT)
>  
> -#define DPFLIPSTAT_VLV                               0x70028
> +#define VLV_DPFLIPSTAT                               0x70028
>  #define   PIPEB_LINE_COMPARE_STATUS          (1<<29)
>  #define   PIPEB_HLINE_INT_EN                 (1<<28)
>  #define   PIPEB_VBLANK_INT_EN                        (1<<27)
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c 
> b/drivers/gpu/drm/i915/intel_ringbuffer.c
> index b7b50a5..75081f1 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -687,7 +687,7 @@ render_ring_get_irq(struct intel_ring_buffer *ring)
>  
>       spin_lock(&ring->irq_lock);
>       if (ring->irq_refcount++ == 0) {
> -             if (HAS_PCH_SPLIT(dev))
> +             if (HAS_PCH_SPLIT(dev) || IS_VALLEYVIEW(dev))

Bikeshed I've just noticed: Imo irq handling is core gt stuff, so makes
sense to check for gen >=5 instead of HAS_PCH_SPLIT (which is just an
output feature). I know, the master irq control is associated with the
display crap, but these functions here just frob around with ring (i.e.
gt) stuff.
-Daniel

>                       ironlake_enable_irq(dev_priv,
>                                           GT_PIPE_NOTIFY | GT_USER_INTERRUPT);
>               else
> @@ -706,7 +706,7 @@ render_ring_put_irq(struct intel_ring_buffer *ring)
>  
>       spin_lock(&ring->irq_lock);
>       if (--ring->irq_refcount == 0) {
> -             if (HAS_PCH_SPLIT(dev))
> +             if (HAS_PCH_SPLIT(dev) || IS_VALLEYVIEW(dev))
>                       ironlake_disable_irq(dev_priv,
>                                            GT_USER_INTERRUPT |
>                                            GT_PIPE_NOTIFY);
> -- 
> 1.7.5.4
> 
> _______________________________________________
> Intel-gfx mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Mail: [email protected]
Mobile: +41 (0)79 365 57 48
_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to