mirror of
https://github.com/torvalds/linux.git
synced 2024-12-25 12:21:37 +00:00
drm/i915: extract dri1 breadcrumb update from irq handler
... and hide it in i915_dma.c. This way all the legacy stuff dealing with READ_BREADCRUMB and LP_RING and friends is in i915_dma.c. v2: Rebase on top of Chris Wilson's rework irq handling code. Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
9488867a67
commit
d05c617ea4
@ -47,6 +47,19 @@
|
|||||||
#include <acpi/video.h>
|
#include <acpi/video.h>
|
||||||
#include <asm/pat.h>
|
#include <asm/pat.h>
|
||||||
|
|
||||||
|
void i915_update_dri1_breadcrumb(struct drm_device *dev)
|
||||||
|
{
|
||||||
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
|
struct drm_i915_master_private *master_priv;
|
||||||
|
|
||||||
|
if (dev->primary->master) {
|
||||||
|
master_priv = dev->primary->master->driver_priv;
|
||||||
|
if (master_priv->sarea_priv)
|
||||||
|
master_priv->sarea_priv->last_dispatch =
|
||||||
|
READ_BREADCRUMB(dev_priv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void i915_write_hws_pga(struct drm_device *dev)
|
static void i915_write_hws_pga(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
|
@ -1129,6 +1129,7 @@ extern int i915_master_create(struct drm_device *dev, struct drm_master *master)
|
|||||||
extern void i915_master_destroy(struct drm_device *dev, struct drm_master *master);
|
extern void i915_master_destroy(struct drm_device *dev, struct drm_master *master);
|
||||||
|
|
||||||
/* i915_dma.c */
|
/* i915_dma.c */
|
||||||
|
void i915_update_dri1_breadcrumb(struct drm_device *dev);
|
||||||
extern void i915_kernel_lost_context(struct drm_device * dev);
|
extern void i915_kernel_lost_context(struct drm_device * dev);
|
||||||
extern int i915_driver_load(struct drm_device *, unsigned long flags);
|
extern int i915_driver_load(struct drm_device *, unsigned long flags);
|
||||||
extern int i915_driver_unload(struct drm_device *);
|
extern int i915_driver_unload(struct drm_device *);
|
||||||
|
@ -2015,7 +2015,6 @@ static irqreturn_t i8xx_irq_handler(DRM_IRQ_ARGS)
|
|||||||
{
|
{
|
||||||
struct drm_device *dev = (struct drm_device *) arg;
|
struct drm_device *dev = (struct drm_device *) arg;
|
||||||
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
||||||
struct drm_i915_master_private *master_priv;
|
|
||||||
u16 iir, new_iir;
|
u16 iir, new_iir;
|
||||||
u32 pipe_stats[2];
|
u32 pipe_stats[2];
|
||||||
unsigned long irqflags;
|
unsigned long irqflags;
|
||||||
@ -2061,12 +2060,7 @@ static irqreturn_t i8xx_irq_handler(DRM_IRQ_ARGS)
|
|||||||
I915_WRITE16(IIR, iir & ~flip_mask);
|
I915_WRITE16(IIR, iir & ~flip_mask);
|
||||||
new_iir = I915_READ16(IIR); /* Flush posted writes */
|
new_iir = I915_READ16(IIR); /* Flush posted writes */
|
||||||
|
|
||||||
if (dev->primary->master) {
|
i915_update_dri1_breadcrumb(dev);
|
||||||
master_priv = dev->primary->master->driver_priv;
|
|
||||||
if (master_priv->sarea_priv)
|
|
||||||
master_priv->sarea_priv->last_dispatch =
|
|
||||||
READ_BREADCRUMB(dev_priv);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (iir & I915_USER_INTERRUPT)
|
if (iir & I915_USER_INTERRUPT)
|
||||||
notify_ring(dev, &dev_priv->ring[RCS]);
|
notify_ring(dev, &dev_priv->ring[RCS]);
|
||||||
@ -2199,7 +2193,6 @@ static irqreturn_t i915_irq_handler(DRM_IRQ_ARGS)
|
|||||||
{
|
{
|
||||||
struct drm_device *dev = (struct drm_device *) arg;
|
struct drm_device *dev = (struct drm_device *) arg;
|
||||||
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
||||||
struct drm_i915_master_private *master_priv;
|
|
||||||
u32 iir, new_iir, pipe_stats[I915_MAX_PIPES];
|
u32 iir, new_iir, pipe_stats[I915_MAX_PIPES];
|
||||||
unsigned long irqflags;
|
unsigned long irqflags;
|
||||||
u32 flip_mask =
|
u32 flip_mask =
|
||||||
@ -2305,12 +2298,7 @@ static irqreturn_t i915_irq_handler(DRM_IRQ_ARGS)
|
|||||||
iir = new_iir;
|
iir = new_iir;
|
||||||
} while (iir & ~flip_mask);
|
} while (iir & ~flip_mask);
|
||||||
|
|
||||||
if (dev->primary->master) {
|
i915_update_dri1_breadcrumb(dev);
|
||||||
master_priv = dev->primary->master->driver_priv;
|
|
||||||
if (master_priv->sarea_priv)
|
|
||||||
master_priv->sarea_priv->last_dispatch =
|
|
||||||
READ_BREADCRUMB(dev_priv);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -2446,7 +2434,6 @@ static irqreturn_t i965_irq_handler(DRM_IRQ_ARGS)
|
|||||||
{
|
{
|
||||||
struct drm_device *dev = (struct drm_device *) arg;
|
struct drm_device *dev = (struct drm_device *) arg;
|
||||||
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
||||||
struct drm_i915_master_private *master_priv;
|
|
||||||
u32 iir, new_iir;
|
u32 iir, new_iir;
|
||||||
u32 pipe_stats[I915_MAX_PIPES];
|
u32 pipe_stats[I915_MAX_PIPES];
|
||||||
unsigned long irqflags;
|
unsigned long irqflags;
|
||||||
@ -2555,12 +2542,7 @@ static irqreturn_t i965_irq_handler(DRM_IRQ_ARGS)
|
|||||||
iir = new_iir;
|
iir = new_iir;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->primary->master) {
|
i915_update_dri1_breadcrumb(dev);
|
||||||
master_priv = dev->primary->master->driver_priv;
|
|
||||||
if (master_priv->sarea_priv)
|
|
||||||
master_priv->sarea_priv->last_dispatch =
|
|
||||||
READ_BREADCRUMB(dev_priv);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user