]> git.hungrycats.org Git - linux/commitdiff
More drm updates from Keith Whitwell
authorLinus Torvalds <torvalds@home.transmeta.com>
Tue, 28 May 2002 09:58:56 +0000 (02:58 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Tue, 28 May 2002 09:58:56 +0000 (02:58 -0700)
drivers/char/drm/radeon_drv.h
drivers/char/drm/radeon_state.c

index d1df21685b915203b503e0502445ff6c7ccc82c3..e5fe01c61995007153f8551f8b80ac389d090d28 100644 (file)
@@ -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)
 
 
index 5ab000f8ef289a79518aac39816f9833b3bf5d8d..1b3253217e18b3a45a9a38d44c3a4f25be99f99b 100644 (file)
@@ -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;