diff options
author | Owain Ainsworth <oga@cvs.openbsd.org> | 2009-04-03 11:31:37 +0000 |
---|---|---|
committer | Owain Ainsworth <oga@cvs.openbsd.org> | 2009-04-03 11:31:37 +0000 |
commit | c869e9dab9822b474b8d72c4bb9fe9ec3547f8d3 (patch) | |
tree | 06a2db2670456294b364b33e24896fb5332cbfea /sys/dev/pci/drm | |
parent | 70411cf63903f9756f566a59c36c13284cd44715 (diff) |
Convert DRM_WAIT_ON to take additional parameters, the wmsg for msleep,
and the lock to manipulate.
first step of removing drm_irq_handler_wrap which just grabs the
irq_lock, and eventually irq_lock. drivers should manage their own.
Diffstat (limited to 'sys/dev/pci/drm')
-rw-r--r-- | sys/dev/pci/drm/drmP.h | 20 | ||||
-rw-r--r-- | sys/dev/pci/drm/drm_irq.c | 13 | ||||
-rw-r--r-- | sys/dev/pci/drm/i915_irq.c | 36 | ||||
-rw-r--r-- | sys/dev/pci/drm/mga_irq.c | 30 | ||||
-rw-r--r-- | sys/dev/pci/drm/radeon_irq.c | 11 |
5 files changed, 51 insertions, 59 deletions
diff --git a/sys/dev/pci/drm/drmP.h b/sys/dev/pci/drm/drmP.h index 10aa28c9245..43d3fd77d84 100644 --- a/sys/dev/pci/drm/drmP.h +++ b/sys/dev/pci/drm/drmP.h @@ -164,7 +164,6 @@ typedef u_int8_t u8; #define le32_to_cpu(x) letoh32(x) #define cpu_to_le32(x) htole32(x) -#define DRM_HZ hz #define DRM_UDELAY(udelay) DELAY(udelay) #define LOCK_TEST_WITH_RETURN(dev, file_priv) \ @@ -177,15 +176,16 @@ do { \ } \ } while (0) -#define DRM_WAIT_ON( ret, queue, timeout, condition ) \ -mtx_enter(&dev->irq_lock); \ -while ( ret == 0 ) { \ - if (condition) \ - break; \ - ret = msleep((queue), &dev->irq_lock, \ - PZERO | PCATCH, "drmwtq", (timeout)); \ -} \ -mtx_leave(&dev->irq_lock) +#define DRM_WAIT_ON(ret, queue, lock, timeout, msg, condition ) do { \ + mtx_enter(lock); \ + while ((ret) == 0) { \ + if (condition) \ + break; \ + ret = msleep((queue), (lock), PZERO | PCATCH, \ + (msg), (timeout)); \ + } \ + mtx_leave(lock); \ +} while (/* CONSTCOND */ 0) #define DRM_ERROR(fmt, arg...) \ printf("error: [" DRM_NAME ":pid%d:%s] *ERROR* " fmt, \ diff --git a/sys/dev/pci/drm/drm_irq.c b/sys/dev/pci/drm/drm_irq.c index 2a0f7cf592c..9d72580e3d1 100644 --- a/sys/dev/pci/drm/drm_irq.c +++ b/sys/dev/pci/drm/drm_irq.c @@ -346,16 +346,9 @@ drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_priv) if (flags & _DRM_VBLANK_SIGNAL) { ret = EINVAL; } else { - mtx_enter(&dev->vbl_lock); - while (ret == 0) { - if ((drm_vblank_count(dev, crtc) - - vblwait->request.sequence) <= (1 << 23)) - break; - ret = msleep(&dev->vblank[crtc], - &dev->vbl_lock, PZERO | PCATCH, - "drmvblq", 3 * DRM_HZ); - } - mtx_leave(&dev->vbl_lock); + DRM_WAIT_ON(ret, &dev->vblank[crtc], &dev->vbl_lock, 3 * hz, + "drmvblq", (drm_vblank_count(dev, crtc) - + vblwait->request.sequence) <= (1 << 23)); if (ret != EINTR) { struct timeval now; diff --git a/sys/dev/pci/drm/i915_irq.c b/sys/dev/pci/drm/i915_irq.c index 71bc282cbd0..6aa8541d9f0 100644 --- a/sys/dev/pci/drm/i915_irq.c +++ b/sys/dev/pci/drm/i915_irq.c @@ -159,13 +159,13 @@ i915_pipe_enabled(struct drm_device *dev, int pipe) return 0; } -u32 i915_get_vblank_counter(struct drm_device *dev, int plane) +u_int32_t +i915_get_vblank_counter(struct drm_device *dev, int plane) { - drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; - unsigned long high_frame; - unsigned long low_frame; - u32 high1, high2, low, count; - int pipe; + drm_i915_private_t *dev_priv = dev->dev_private; + bus_size_t high_frame, low_frame; + u_int32_t high1, high2, low; + int pipe; pipe = i915_get_pipe(dev, plane); high_frame = pipe ? PIPEBFRAMEHIGH : PIPEAFRAMEHIGH; @@ -174,7 +174,7 @@ u32 i915_get_vblank_counter(struct drm_device *dev, int plane) if (!i915_pipe_enabled(dev, pipe)) { DRM_DEBUG("trying to get vblank count for disabled pipe %d\n", pipe); - return 0; + return (0); } /* @@ -191,12 +191,11 @@ u32 i915_get_vblank_counter(struct drm_device *dev, int plane) PIPE_FRAME_HIGH_SHIFT); } while (high1 != high2); - count = (high1 << 8) | low; - - return count; + return ((high1 << 8) | low); } -irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) +irqreturn_t +i915_driver_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; @@ -281,10 +280,11 @@ void i915_user_irq_put(struct drm_device *dev) } -int i915_wait_irq(struct drm_device * dev, int irq_nr) +int +i915_wait_irq(struct drm_device *dev, int irq_nr) { - drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; - int ret = 0; + drm_i915_private_t *dev_priv = dev->dev_private; + int ret = 0; DRM_DEBUG("irq_nr=%d breadcrumb=%d\n", irq_nr, READ_BREADCRUMB(dev_priv)); @@ -294,12 +294,12 @@ int i915_wait_irq(struct drm_device * dev, int irq_nr) dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); } - return 0; + return (0); } i915_user_irq_get(dev); - DRM_WAIT_ON(ret, dev_priv, 3 * DRM_HZ, - READ_BREADCRUMB(dev_priv) >= irq_nr); + DRM_WAIT_ON(ret, dev_priv, &dev->irq_lock, 3 * hz, "i915wt", + READ_BREADCRUMB(dev_priv) >= irq_nr); i915_user_irq_put(dev); if (ret == EBUSY) { @@ -309,7 +309,7 @@ int i915_wait_irq(struct drm_device * dev, int irq_nr) if (dev_priv->sarea_priv != NULL) dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); - return ret; + return (ret); } /* Needs the lock as it touches the ring. diff --git a/sys/dev/pci/drm/mga_irq.c b/sys/dev/pci/drm/mga_irq.c index 441948836c4..0d3bdac8730 100644 --- a/sys/dev/pci/drm/mga_irq.c +++ b/sys/dev/pci/drm/mga_irq.c @@ -36,26 +36,26 @@ #include "mga_drm.h" #include "mga_drv.h" -u32 mga_get_vblank_counter(struct drm_device *dev, int crtc) +u_int32_t +mga_get_vblank_counter(struct drm_device *dev, int crtc) { - const drm_mga_private_t *const dev_priv = - (drm_mga_private_t *) dev->dev_private; + const drm_mga_private_t *const dev_priv = dev->dev_private; if (crtc != 0) { - return 0; + return (0); } - return atomic_read(&dev_priv->vbl_received); + return (atomic_read(&dev_priv->vbl_received)); } -irqreturn_t mga_driver_irq_handler(DRM_IRQ_ARGS) +irqreturn_t +mga_driver_irq_handler(DRM_IRQ_ARGS) { - struct drm_device *dev = (struct drm_device *) arg; - drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; - int status; - int handled = 0; + struct drm_device *dev = arg; + drm_mga_private_t *dev_priv = dev->dev_private; + int status, handled = 0; status = MGA_READ(MGA_STATUS); @@ -88,8 +88,8 @@ irqreturn_t mga_driver_irq_handler(DRM_IRQ_ARGS) } if (handled) - return IRQ_HANDLED; - return IRQ_NONE; + return (IRQ_HANDLED); + return (IRQ_NONE); } int mga_enable_vblank(struct drm_device *dev, int crtc) @@ -132,9 +132,9 @@ int mga_driver_fence_wait(struct drm_device * dev, unsigned int *sequence) * by about a day rather than she wants to wait for years * using fences. */ - DRM_WAIT_ON(ret, dev_priv, 3 * DRM_HZ, - (((cur_fence = atomic_read(&dev_priv->last_fence_retired)) - - *sequence) <= (1 << 23))); + DRM_WAIT_ON(ret, dev_priv, &dev->irq_lock, 3 * hz, "mgawt", + (((cur_fence = atomic_read(&dev_priv->last_fence_retired)) - + *sequence) <= (1 << 23))); *sequence = cur_fence; diff --git a/sys/dev/pci/drm/radeon_irq.c b/sys/dev/pci/drm/radeon_irq.c index 0ebfabcec27..ec407aeeebc 100644 --- a/sys/dev/pci/drm/radeon_irq.c +++ b/sys/dev/pci/drm/radeon_irq.c @@ -245,17 +245,16 @@ radeon_emit_irq(struct drm_device * dev) int radeon_wait_irq(struct drm_device * dev, int swi_nr) { - drm_radeon_private_t *dev_priv = - (drm_radeon_private_t *) dev->dev_private; - int ret = 0; + drm_radeon_private_t *dev_priv = dev->dev_private; + int ret = 0; if (RADEON_READ(RADEON_LAST_SWI_REG) >= swi_nr) return 0; - DRM_WAIT_ON(ret, dev_priv, 3 * DRM_HZ, - RADEON_READ(RADEON_LAST_SWI_REG) >= swi_nr); + DRM_WAIT_ON(ret, dev_priv, &dev->irq_lock, 3 * hz, "rdnwt", + RADEON_READ(RADEON_LAST_SWI_REG) >= swi_nr); - return ret; + return (ret); } u32 radeon_get_vblank_counter(struct drm_device *dev, int crtc) |