#if __HAVE_VBL_IRQ
-int DRM(vblank_wait)(drm_device_t *dev, unsigned int *sequence)
-{
- unsigned int cur_vblank;
- int ret = 0;
-
- /* Assume that the user has missed the current sequence number by about
- * a day rather than she wants to wait for years using vertical blanks :)
- */
- while ( ( ( cur_vblank = atomic_read(&dev->vbl_received ) )
- + ~*sequence + 1 ) > (1<<23) ) {
- ret = tsleep( &dev->vbl_queue, 3*hz, "rdnvbl", PZERO | PCATCH);
- if (ret)
- break;
- }
-
- *sequence = cur_vblank;
-
- return ret;
-}
-
int DRM(wait_vblank)( DRM_IOCTL_ARGS )
{
DRM_DEVICE;
#if __HAVE_VBL_IRQ
-int DRM(vblank_wait)(drm_device_t *dev, unsigned int *sequence)
-{
- unsigned int cur_vblank;
- int ret = 0;
-
- /* Assume that the user has missed the current sequence number by about
- * a day rather than she wants to wait for years using vertical blanks :)
- */
- while ( ( ( cur_vblank = atomic_read(&dev->vbl_received ) )
- + ~*sequence + 1 ) > (1<<23) ) {
- ret = tsleep( &dev->vbl_queue, 3*hz, "rdnvbl", PZERO | PCATCH);
- if (ret)
- break;
- }
-
- *sequence = cur_vblank;
-
- return ret;
-}
-
int DRM(wait_vblank)( DRM_IOCTL_ARGS )
{
DRM_DEVICE;
RADEON_WRITE(RADEON_GEN_INT_STATUS, ack);
}
-static inline void radeon_acknowledge_irqs(drm_radeon_private_t *dev_priv)
+static __inline__ void radeon_acknowledge_irqs(drm_radeon_private_t *dev_priv)
{
RADEON_WRITE( RADEON_GEN_INT_STATUS, RADEON_READ( RADEON_GEN_INT_STATUS ) );
}
#endif /* __linux__ */
#ifdef __FreeBSD__
- ret = tsleep( &dev_priv->swi_queue, PZERO | PCATCH, \
- "rdnirq", 3*hz );
- if ( (ret == EWOULDBLOCK) || (ret == EINTR) )
- return DRM_ERR(EBUSY);
+ for (;;) {
+ if (RADEON_READ( RADEON_LAST_SWI_REG ) >= swi_nr)
+ break;
+ ret = tsleep( &dev_priv->swi_queue, PZERO | PCATCH, \
+ "rdnirq", 3*hz );
+ if (ret)
+ break;
+ }
return ret;
#endif /* __FreeBSD__ */
}
}
#endif /* __linux__ */
#ifdef __FreeBSD__
- ret = tsleep( &dev_priv->vbl_queue, 3*hz, "rdnvbl", PZERO | PCATCH);
+ ret = tsleep( &dev->vbl_queue, 3*hz, "rdnvbl", PZERO | PCATCH);
if (ret)
break;
#endif /* __FreeBSD__ */
RADEON_WRITE(RADEON_GEN_INT_STATUS, ack);
}
-static inline void radeon_acknowledge_irqs(drm_radeon_private_t *dev_priv)
+static __inline__ void radeon_acknowledge_irqs(drm_radeon_private_t *dev_priv)
{
RADEON_WRITE( RADEON_GEN_INT_STATUS, RADEON_READ( RADEON_GEN_INT_STATUS ) );
}
#endif /* __linux__ */
#ifdef __FreeBSD__
- ret = tsleep( &dev_priv->swi_queue, PZERO | PCATCH, \
- "rdnirq", 3*hz );
- if ( (ret == EWOULDBLOCK) || (ret == EINTR) )
- return DRM_ERR(EBUSY);
+ for (;;) {
+ if (RADEON_READ( RADEON_LAST_SWI_REG ) >= swi_nr)
+ break;
+ ret = tsleep( &dev_priv->swi_queue, PZERO | PCATCH, \
+ "rdnirq", 3*hz );
+ if (ret)
+ break;
+ }
return ret;
#endif /* __FreeBSD__ */
}
}
#endif /* __linux__ */
#ifdef __FreeBSD__
- ret = tsleep( &dev_priv->vbl_queue, 3*hz, "rdnvbl", PZERO | PCATCH);
+ ret = tsleep( &dev->vbl_queue, 3*hz, "rdnvbl", PZERO | PCATCH);
if (ret)
break;
#endif /* __FreeBSD__ */