diff options
| -rw-r--r-- | drivers/char/drm/radeon_drv.h | 30 | ||||
| -rw-r--r-- | drivers/char/drm/radeon_state.c | 6 |
2 files changed, 21 insertions, 15 deletions
diff --git a/drivers/char/drm/radeon_drv.h b/drivers/char/drm/radeon_drv.h index d1df21685b91..e5fe01c61995 100644 --- a/drivers/char/drm/radeon_drv.h +++ b/drivers/char/drm/radeon_drv.h @@ -714,6 +714,7 @@ do { \ n, __FUNCTION__ ); \ } \ if ( dev_priv->ring.space <= (n) * sizeof(u32) ) { \ + COMMIT_RING(); \ radeon_wait_ring( dev_priv, (n) * sizeof(u32) ); \ } \ _nr = n; dev_priv->ring.space -= (n) * sizeof(u32); \ @@ -756,20 +757,25 @@ do { \ #define OUT_RING_USER_TABLE( tab, sz ) do { \ - if (write + (sz) > mask) { \ - int i; \ - for ( i = 0 ; i < (sz) ; i++ ) { \ - if (__get_user( tmp, &(tab)[i] )) \ - return -EFAULT; \ - OUT_RING( tmp ); \ - } \ - } \ - else { \ - if (__copy_from_user( (int *)(ring+write), \ - (tab), (sz)*4 )) \ + int _size = (sz); \ + int *_tab = (tab); \ + \ + if (write + _size > mask) { \ + int i = (mask+1) - write; \ + if (__copy_from_user( (int *)(ring+write), \ + _tab, i*4 )) \ return -EFAULT; \ - write += (sz); \ + write = 0; \ + _size -= i; \ + _tab += i; \ } \ + \ + if (_size && __copy_from_user( (int *)(ring+write), \ + _tab, _size*4 )) \ + return -EFAULT; \ + \ + write += _size; \ + write &= mask; \ } while (0) diff --git a/drivers/char/drm/radeon_state.c b/drivers/char/drm/radeon_state.c index 5ab000f8ef28..1b3253217e18 100644 --- a/drivers/char/drm/radeon_state.c +++ b/drivers/char/drm/radeon_state.c @@ -1587,7 +1587,7 @@ static int radeon_emit_packets( { int sz = packet[(int)header.packet.packet_id].len; int reg = packet[(int)header.packet.packet_id].start; - int tmp, *data = (int *)cmdbuf->buf; + int *data = (int *)cmdbuf->buf; RING_LOCALS; if (sz * sizeof(int) > cmdbuf->bufsz) @@ -1610,7 +1610,7 @@ static inline int radeon_emit_scalars( drm_radeon_cmd_buffer_t *cmdbuf ) { int sz = header.scalars.count; - int tmp, *data = (int *)cmdbuf->buf; + int *data = (int *)cmdbuf->buf; int start = header.scalars.offset; int stride = header.scalars.stride; RING_LOCALS; @@ -1632,7 +1632,7 @@ static inline int radeon_emit_vectors( drm_radeon_cmd_buffer_t *cmdbuf ) { int sz = header.vectors.count; - int tmp, *data = (int *)cmdbuf->buf; + int *data = (int *)cmdbuf->buf; int start = header.vectors.offset; int stride = header.vectors.stride; RING_LOCALS; |
