DRM(vblank_wait) is driver specific
parent
97961e2c65
commit
cc9a169d08
|
@ -604,44 +604,6 @@ int DRM(control)( struct inode *inode, struct file *filp,
|
||||||
|
|
||||||
#if __HAVE_VBL_IRQ
|
#if __HAVE_VBL_IRQ
|
||||||
|
|
||||||
int DRM(vblank_wait)(drm_device_t *dev, unsigned int *sequence)
|
|
||||||
{
|
|
||||||
drm_radeon_private_t *dev_priv =
|
|
||||||
(drm_radeon_private_t *)dev->dev_private;
|
|
||||||
unsigned int cur_vblank;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if ( !dev_priv ) {
|
|
||||||
DRM_ERROR( "%s called with no initialization\n", __func__ );
|
|
||||||
return DRM_ERR(EINVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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) ) {
|
|
||||||
dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
|
|
||||||
#ifdef __linux__
|
|
||||||
interruptible_sleep_on( &dev->vbl_queue );
|
|
||||||
|
|
||||||
if (signal_pending(current)) {
|
|
||||||
ret = -EINTR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif /* __linux__ */
|
|
||||||
#ifdef __FreeBSD__
|
|
||||||
ret = tsleep( &dev_priv->vbl_queue, 3*hz, "rdnvbl", PZERO | PCATCH);
|
|
||||||
if (ret)
|
|
||||||
break;
|
|
||||||
#endif /* __FreeBSD__ */
|
|
||||||
}
|
|
||||||
|
|
||||||
*sequence = cur_vblank;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DRM(wait_vblank)( DRM_IOCTL_ARGS )
|
int DRM(wait_vblank)( DRM_IOCTL_ARGS )
|
||||||
{
|
{
|
||||||
drm_file_t *priv = filp->private_data;
|
drm_file_t *priv = filp->private_data;
|
||||||
|
|
|
@ -604,44 +604,6 @@ int DRM(control)( struct inode *inode, struct file *filp,
|
||||||
|
|
||||||
#if __HAVE_VBL_IRQ
|
#if __HAVE_VBL_IRQ
|
||||||
|
|
||||||
int DRM(vblank_wait)(drm_device_t *dev, unsigned int *sequence)
|
|
||||||
{
|
|
||||||
drm_radeon_private_t *dev_priv =
|
|
||||||
(drm_radeon_private_t *)dev->dev_private;
|
|
||||||
unsigned int cur_vblank;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if ( !dev_priv ) {
|
|
||||||
DRM_ERROR( "%s called with no initialization\n", __func__ );
|
|
||||||
return DRM_ERR(EINVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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) ) {
|
|
||||||
dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
|
|
||||||
#ifdef __linux__
|
|
||||||
interruptible_sleep_on( &dev->vbl_queue );
|
|
||||||
|
|
||||||
if (signal_pending(current)) {
|
|
||||||
ret = -EINTR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif /* __linux__ */
|
|
||||||
#ifdef __FreeBSD__
|
|
||||||
ret = tsleep( &dev_priv->vbl_queue, 3*hz, "rdnvbl", PZERO | PCATCH);
|
|
||||||
if (ret)
|
|
||||||
break;
|
|
||||||
#endif /* __FreeBSD__ */
|
|
||||||
}
|
|
||||||
|
|
||||||
*sequence = cur_vblank;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DRM(wait_vblank)( DRM_IOCTL_ARGS )
|
int DRM(wait_vblank)( DRM_IOCTL_ARGS )
|
||||||
{
|
{
|
||||||
drm_file_t *priv = filp->private_data;
|
drm_file_t *priv = filp->private_data;
|
||||||
|
|
|
@ -163,6 +163,45 @@ int radeon_emit_and_wait_irq(drm_device_t *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int radeon_vblank_wait(drm_device_t *dev, unsigned int *sequence)
|
||||||
|
{
|
||||||
|
drm_radeon_private_t *dev_priv =
|
||||||
|
(drm_radeon_private_t *)dev->dev_private;
|
||||||
|
unsigned int cur_vblank;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if ( !dev_priv ) {
|
||||||
|
DRM_ERROR( "%s called with no initialization\n", __func__ );
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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) ) {
|
||||||
|
dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
|
||||||
|
#ifdef __linux__
|
||||||
|
interruptible_sleep_on( &dev->vbl_queue );
|
||||||
|
|
||||||
|
if (signal_pending(current)) {
|
||||||
|
ret = -EINTR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif /* __linux__ */
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
ret = tsleep( &dev_priv->vbl_queue, 3*hz, "rdnvbl", PZERO | PCATCH);
|
||||||
|
if (ret)
|
||||||
|
break;
|
||||||
|
#endif /* __FreeBSD__ */
|
||||||
|
}
|
||||||
|
|
||||||
|
*sequence = cur_vblank;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Needs the lock as it touches the ring.
|
/* Needs the lock as it touches the ring.
|
||||||
*/
|
*/
|
||||||
int radeon_irq_emit( DRM_IOCTL_ARGS )
|
int radeon_irq_emit( DRM_IOCTL_ARGS )
|
||||||
|
|
|
@ -163,6 +163,45 @@ int radeon_emit_and_wait_irq(drm_device_t *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int radeon_vblank_wait(drm_device_t *dev, unsigned int *sequence)
|
||||||
|
{
|
||||||
|
drm_radeon_private_t *dev_priv =
|
||||||
|
(drm_radeon_private_t *)dev->dev_private;
|
||||||
|
unsigned int cur_vblank;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if ( !dev_priv ) {
|
||||||
|
DRM_ERROR( "%s called with no initialization\n", __func__ );
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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) ) {
|
||||||
|
dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
|
||||||
|
#ifdef __linux__
|
||||||
|
interruptible_sleep_on( &dev->vbl_queue );
|
||||||
|
|
||||||
|
if (signal_pending(current)) {
|
||||||
|
ret = -EINTR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif /* __linux__ */
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
ret = tsleep( &dev_priv->vbl_queue, 3*hz, "rdnvbl", PZERO | PCATCH);
|
||||||
|
if (ret)
|
||||||
|
break;
|
||||||
|
#endif /* __FreeBSD__ */
|
||||||
|
}
|
||||||
|
|
||||||
|
*sequence = cur_vblank;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Needs the lock as it touches the ring.
|
/* Needs the lock as it touches the ring.
|
||||||
*/
|
*/
|
||||||
int radeon_irq_emit( DRM_IOCTL_ARGS )
|
int radeon_irq_emit( DRM_IOCTL_ARGS )
|
||||||
|
|
Loading…
Reference in New Issue