mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-09 06:18:05 +02:00
Fix ring space calculations, tests. Based on patch by Bruce Stockwell.
This commit is contained in:
parent
8c511c60ec
commit
134aecdeed
10 changed files with 31 additions and 92 deletions
|
|
@ -38,11 +38,11 @@
|
|||
|
||||
#define DRIVER_NAME "r128"
|
||||
#define DRIVER_DESC "ATI Rage 128"
|
||||
#define DRIVER_DATE "20010216"
|
||||
#define DRIVER_DATE "20010308"
|
||||
|
||||
#define DRIVER_MAJOR 2
|
||||
#define DRIVER_MINOR 1
|
||||
#define DRIVER_PATCHLEVEL 4
|
||||
#define DRIVER_PATCHLEVEL 5
|
||||
|
||||
#define DRIVER_IOCTLS \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { r128_cce_buffers, 1, 0 }, \
|
||||
|
|
|
|||
|
|
@ -36,11 +36,11 @@
|
|||
|
||||
#define DRIVER_NAME "radeon"
|
||||
#define DRIVER_DESC "ATI Radeon"
|
||||
#define DRIVER_DATE "20010305"
|
||||
#define DRIVER_DATE "20010308"
|
||||
|
||||
#define DRIVER_MAJOR 1
|
||||
#define DRIVER_MINOR 0
|
||||
#define DRIVER_PATCHLEVEL 0
|
||||
#define DRIVER_PATCHLEVEL 1
|
||||
|
||||
#define DRIVER_IOCTLS \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { radeon_cp_buffers, 1, 0 }, \
|
||||
|
|
|
|||
|
|
@ -839,13 +839,9 @@ int r128_wait_ring( drm_r128_private_t *dev_priv, int n )
|
|||
int i;
|
||||
|
||||
for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) {
|
||||
ring->space = *ring->head - ring->tail;
|
||||
if ( ring->space <= 0 )
|
||||
ring->space += ring->size;
|
||||
|
||||
r128_update_ring_snapshot( ring );
|
||||
if ( ring->space >= n )
|
||||
return 0;
|
||||
|
||||
udelay( 1 );
|
||||
}
|
||||
|
||||
|
|
@ -854,19 +850,6 @@ int r128_wait_ring( drm_r128_private_t *dev_priv, int n )
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
void r128_update_ring_snapshot( drm_r128_private_t *dev_priv )
|
||||
{
|
||||
drm_r128_ring_buffer_t *ring = &dev_priv->ring;
|
||||
|
||||
ring->space = *ring->head - ring->tail;
|
||||
#if R128_PERFORMANCE_BOXES
|
||||
if ( ring->space == 0 )
|
||||
atomic_inc( &dev_priv->idle_count );
|
||||
#endif
|
||||
if ( ring->space <= 0 )
|
||||
ring->space += ring->size;
|
||||
}
|
||||
|
||||
static int r128_cce_get_buffers( drm_device_t *dev, drm_dma_t *d )
|
||||
{
|
||||
int i;
|
||||
|
|
|
|||
|
|
@ -38,11 +38,11 @@
|
|||
|
||||
#define DRIVER_NAME "r128"
|
||||
#define DRIVER_DESC "ATI Rage 128"
|
||||
#define DRIVER_DATE "20010216"
|
||||
#define DRIVER_DATE "20010308"
|
||||
|
||||
#define DRIVER_MAJOR 2
|
||||
#define DRIVER_MINOR 1
|
||||
#define DRIVER_PATCHLEVEL 4
|
||||
#define DRIVER_PATCHLEVEL 5
|
||||
|
||||
#define DRIVER_IOCTLS \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { r128_cce_buffers, 1, 0 }, \
|
||||
|
|
|
|||
|
|
@ -130,7 +130,14 @@ extern void r128_freelist_reset( drm_device_t *dev );
|
|||
extern drm_buf_t *r128_freelist_get( drm_device_t *dev );
|
||||
|
||||
extern int r128_wait_ring( drm_r128_private_t *dev_priv, int n );
|
||||
extern void r128_update_ring_snapshot( drm_r128_private_t *dev_priv );
|
||||
|
||||
static inline void
|
||||
r128_update_ring_snapshot( drm_r128_ring_buffer_t *ring )
|
||||
{
|
||||
ring->space = (*(volatile int *)ring->head - ring->tail) * sizeof(u32);
|
||||
if ( ring->space <= 0 )
|
||||
ring->space += ring->size;
|
||||
}
|
||||
|
||||
extern int r128_do_cce_idle( drm_r128_private_t *dev_priv );
|
||||
extern int r128_do_cleanup_cce( drm_device_t *dev );
|
||||
|
|
@ -415,9 +422,7 @@ do { \
|
|||
drm_r128_ring_buffer_t *ring = &dev_priv->ring; int i; \
|
||||
if ( ring->space < ring->high_mark ) { \
|
||||
for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { \
|
||||
ring->space = *ring->head - ring->tail; \
|
||||
if ( ring->space <= 0 ) \
|
||||
ring->space += ring->size; \
|
||||
r128_update_ring_snapshot( ring ); \
|
||||
if ( ring->space >= ring->high_mark ) \
|
||||
goto __ring_space_done; \
|
||||
udelay( 1 ); \
|
||||
|
|
@ -462,7 +467,7 @@ do { \
|
|||
DRM_INFO( "BEGIN_RING( %d ) in %s\n", \
|
||||
(n), __FUNCTION__ ); \
|
||||
} \
|
||||
if ( dev_priv->ring.space < (n) * sizeof(u32) ) { \
|
||||
if ( dev_priv->ring.space <= (n) * sizeof(u32) ) { \
|
||||
r128_wait_ring( dev_priv, (n) * sizeof(u32) ); \
|
||||
} \
|
||||
dev_priv->ring.space -= (n) * sizeof(u32); \
|
||||
|
|
|
|||
|
|
@ -372,8 +372,6 @@ static void r128_cce_dispatch_clear( drm_device_t *dev,
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
r128_update_ring_snapshot( dev_priv );
|
||||
|
||||
if ( dev_priv->page_flipping && dev_priv->current_page == 1 ) {
|
||||
unsigned int tmp = flags;
|
||||
|
||||
|
|
@ -477,8 +475,6 @@ static void r128_cce_dispatch_swap( drm_device_t *dev )
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
r128_update_ring_snapshot( dev_priv );
|
||||
|
||||
#if R128_PERFORMANCE_BOXES
|
||||
/* Do some trivial performance monitoring...
|
||||
*/
|
||||
|
|
@ -535,8 +531,6 @@ static void r128_cce_dispatch_flip( drm_device_t *dev )
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s: page=%d\n", __FUNCTION__, dev_priv->current_page );
|
||||
|
||||
r128_update_ring_snapshot( dev_priv );
|
||||
|
||||
#if R128_PERFORMANCE_BOXES
|
||||
/* Do some trivial performance monitoring...
|
||||
*/
|
||||
|
|
@ -587,8 +581,6 @@ static void r128_cce_dispatch_vertex( drm_device_t *dev,
|
|||
DRM_DEBUG( "%s: buf=%d nbox=%d\n",
|
||||
__FUNCTION__, buf->idx, sarea_priv->nbox );
|
||||
|
||||
r128_update_ring_snapshot( dev_priv );
|
||||
|
||||
if ( 0 )
|
||||
r128_print_dirty( "dispatch_vertex", sarea_priv->dirty );
|
||||
|
||||
|
|
@ -656,8 +648,6 @@ static void r128_cce_dispatch_indirect( drm_device_t *dev,
|
|||
DRM_DEBUG( "indirect: buf=%d s=0x%x e=0x%x\n",
|
||||
buf->idx, start, end );
|
||||
|
||||
r128_update_ring_snapshot( dev_priv );
|
||||
|
||||
if ( start != end ) {
|
||||
int offset = buf->bus_address + start;
|
||||
int dwords = (end - start + 3) / sizeof(u32);
|
||||
|
|
@ -722,8 +712,6 @@ static void r128_cce_dispatch_indices( drm_device_t *dev,
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "indices: s=%d e=%d c=%d\n", start, end, count );
|
||||
|
||||
r128_update_ring_snapshot( dev_priv );
|
||||
|
||||
if ( 0 )
|
||||
r128_print_dirty( "dispatch_indices", sarea_priv->dirty );
|
||||
|
||||
|
|
@ -799,8 +787,6 @@ static int r128_cce_dispatch_blit( drm_device_t *dev,
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
r128_update_ring_snapshot( dev_priv );
|
||||
|
||||
/* The compiler won't optimize away a division by a variable,
|
||||
* even if the only legal values are powers of two. Thus, we'll
|
||||
* use a shift instead.
|
||||
|
|
@ -911,8 +897,6 @@ static int r128_cce_dispatch_write_span( drm_device_t *dev,
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
r128_update_ring_snapshot( dev_priv );
|
||||
|
||||
count = depth->n;
|
||||
if ( copy_from_user( &x, depth->x, sizeof(x) ) ) {
|
||||
return -EFAULT;
|
||||
|
|
@ -1006,8 +990,6 @@ static int r128_cce_dispatch_write_pixels( drm_device_t *dev,
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
r128_update_ring_snapshot( dev_priv );
|
||||
|
||||
count = depth->n;
|
||||
|
||||
x = kmalloc( count * sizeof(*x), 0 );
|
||||
|
|
@ -1123,8 +1105,6 @@ static int r128_cce_dispatch_read_span( drm_device_t *dev,
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
r128_update_ring_snapshot( dev_priv );
|
||||
|
||||
count = depth->n;
|
||||
if ( copy_from_user( &x, depth->x, sizeof(x) ) ) {
|
||||
return -EFAULT;
|
||||
|
|
@ -1167,8 +1147,6 @@ static int r128_cce_dispatch_read_pixels( drm_device_t *dev,
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
r128_update_ring_snapshot( dev_priv );
|
||||
|
||||
count = depth->n;
|
||||
if ( count > dev_priv->depth_pitch ) {
|
||||
count = dev_priv->depth_pitch;
|
||||
|
|
@ -1236,8 +1214,6 @@ static void r128_cce_dispatch_stipple( drm_device_t *dev, u32 *stipple )
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
r128_update_ring_snapshot( dev_priv );
|
||||
|
||||
BEGIN_RING( 33 );
|
||||
|
||||
OUT_RING( CCE_PACKET0( R128_BRUSH_DATA0, 31 ) );
|
||||
|
|
|
|||
|
|
@ -1166,13 +1166,9 @@ int radeon_wait_ring( drm_radeon_private_t *dev_priv, int n )
|
|||
int i;
|
||||
|
||||
for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) {
|
||||
ring->space = *ring->head - ring->tail;
|
||||
if ( ring->space <= 0 )
|
||||
ring->space += ring->size;
|
||||
|
||||
if ( ring->space >= n )
|
||||
radeon_update_ring_snapshot( ring );
|
||||
if ( ring->space > n )
|
||||
return 0;
|
||||
|
||||
udelay( 1 );
|
||||
}
|
||||
|
||||
|
|
@ -1181,17 +1177,6 @@ int radeon_wait_ring( drm_radeon_private_t *dev_priv, int n )
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
void radeon_update_ring_snapshot( drm_radeon_private_t *dev_priv )
|
||||
{
|
||||
drm_radeon_ring_buffer_t *ring = &dev_priv->ring;
|
||||
|
||||
ring->space = *ring->head - ring->tail;
|
||||
if ( ring->space == 0 )
|
||||
atomic_inc( &dev_priv->idle_count );
|
||||
if ( ring->space <= 0 )
|
||||
ring->space += ring->size;
|
||||
}
|
||||
|
||||
static int radeon_cp_get_buffers( drm_device_t *dev, drm_dma_t *d )
|
||||
{
|
||||
int i;
|
||||
|
|
|
|||
|
|
@ -36,11 +36,11 @@
|
|||
|
||||
#define DRIVER_NAME "radeon"
|
||||
#define DRIVER_DESC "ATI Radeon"
|
||||
#define DRIVER_DATE "20010305"
|
||||
#define DRIVER_DATE "20010308"
|
||||
|
||||
#define DRIVER_MAJOR 1
|
||||
#define DRIVER_MINOR 0
|
||||
#define DRIVER_PATCHLEVEL 0
|
||||
#define DRIVER_PATCHLEVEL 1
|
||||
|
||||
#define DRIVER_IOCTLS \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { radeon_cp_buffers, 1, 0 }, \
|
||||
|
|
|
|||
|
|
@ -146,7 +146,14 @@ extern void radeon_freelist_reset( drm_device_t *dev );
|
|||
extern drm_buf_t *radeon_freelist_get( drm_device_t *dev );
|
||||
|
||||
extern int radeon_wait_ring( drm_radeon_private_t *dev_priv, int n );
|
||||
extern void radeon_update_ring_snapshot( drm_radeon_private_t *dev_priv );
|
||||
|
||||
static inline void
|
||||
radeon_update_ring_snapshot( drm_radeon_ring_buffer_t *ring )
|
||||
{
|
||||
ring->space = (*(volatile int *)ring->head - ring->tail) * sizeof(u32);
|
||||
if ( ring->space <= 0 )
|
||||
ring->space += ring->size;
|
||||
}
|
||||
|
||||
extern int radeon_do_cp_idle( drm_radeon_private_t *dev_priv );
|
||||
extern int radeon_do_cleanup_cp( drm_device_t *dev );
|
||||
|
|
@ -601,9 +608,7 @@ do { \
|
|||
drm_radeon_ring_buffer_t *ring = &dev_priv->ring; int i; \
|
||||
if ( ring->space < ring->high_mark ) { \
|
||||
for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { \
|
||||
ring->space = *ring->head - ring->tail; \
|
||||
if ( ring->space <= 0 ) \
|
||||
ring->space += ring->size; \
|
||||
radeon_update_ring_snapshot( ring ); \
|
||||
if ( ring->space >= ring->high_mark ) \
|
||||
goto __ring_space_done; \
|
||||
udelay( 1 ); \
|
||||
|
|
@ -657,7 +662,7 @@ do { \
|
|||
DRM_INFO( "BEGIN_RING( %d ) in %s\n", \
|
||||
n, __FUNCTION__ ); \
|
||||
} \
|
||||
if ( dev_priv->ring.space < (n) * sizeof(u32) ) { \
|
||||
if ( dev_priv->ring.space <= (n) * sizeof(u32) ) { \
|
||||
radeon_wait_ring( dev_priv, (n) * sizeof(u32) ); \
|
||||
} \
|
||||
dev_priv->ring.space -= (n) * sizeof(u32); \
|
||||
|
|
|
|||
|
|
@ -498,8 +498,6 @@ static void radeon_cp_dispatch_clear( drm_device_t *dev,
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
radeon_update_ring_snapshot( dev_priv );
|
||||
|
||||
if ( dev_priv->page_flipping && dev_priv->current_page == 1 ) {
|
||||
unsigned int tmp = flags;
|
||||
|
||||
|
|
@ -656,8 +654,6 @@ static void radeon_cp_dispatch_swap( drm_device_t *dev )
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
radeon_update_ring_snapshot( dev_priv );
|
||||
|
||||
#if RADEON_PERFORMANCE_BOXES
|
||||
/* Do some trivial performance monitoring...
|
||||
*/
|
||||
|
|
@ -725,8 +721,6 @@ static void radeon_cp_dispatch_flip( drm_device_t *dev )
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s: page=%d\n", __FUNCTION__, dev_priv->current_page );
|
||||
|
||||
radeon_update_ring_snapshot( dev_priv );
|
||||
|
||||
#if RADEON_PERFORMANCE_BOXES
|
||||
/* Do some trivial performance monitoring...
|
||||
*/
|
||||
|
|
@ -777,8 +771,6 @@ static void radeon_cp_dispatch_vertex( drm_device_t *dev,
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s: nbox=%d\n", __FUNCTION__, sarea_priv->nbox );
|
||||
|
||||
radeon_update_ring_snapshot( dev_priv );
|
||||
|
||||
if ( 0 )
|
||||
radeon_print_dirty( "dispatch_vertex", sarea_priv->dirty );
|
||||
|
||||
|
|
@ -845,8 +837,6 @@ static void radeon_cp_dispatch_indirect( drm_device_t *dev,
|
|||
DRM_DEBUG( "indirect: buf=%d s=0x%x e=0x%x\n",
|
||||
buf->idx, start, end );
|
||||
|
||||
radeon_update_ring_snapshot( dev_priv );
|
||||
|
||||
if ( start != end ) {
|
||||
int offset = (dev_priv->agp_buffers_offset
|
||||
+ buf->offset + start);
|
||||
|
|
@ -909,8 +899,6 @@ static void radeon_cp_dispatch_indices( drm_device_t *dev,
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "indices: s=%d e=%d c=%d\n", start, end, count );
|
||||
|
||||
radeon_update_ring_snapshot( dev_priv );
|
||||
|
||||
if ( 0 )
|
||||
radeon_print_dirty( "dispatch_indices", sarea_priv->dirty );
|
||||
|
||||
|
|
@ -1143,8 +1131,6 @@ static void radeon_cp_dispatch_stipple( drm_device_t *dev, u32 *stipple )
|
|||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
radeon_update_ring_snapshot( dev_priv );
|
||||
|
||||
BEGIN_RING( 35 );
|
||||
|
||||
OUT_RING( CP_PACKET0( RADEON_RE_STIPPLE_ADDR, 0 ) );
|
||||
|
|
@ -1180,7 +1166,6 @@ int radeon_cp_clear( struct inode *inode, struct file *filp,
|
|||
sizeof(clear) ) )
|
||||
return -EFAULT;
|
||||
|
||||
|
||||
RING_SPACE_TEST_WITH_RETURN( dev_priv );
|
||||
|
||||
if ( sarea_priv->nbox > RADEON_NR_SAREA_CLIPRECTS )
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue