drm/r300: fix wait interface mixup
authorDave Airlie <airlied@redhat.com>
Sat, 29 Mar 2008 21:33:39 +0000 (07:33 +1000)
committerDave Airlie <airlied@redhat.com>
Sat, 29 Mar 2008 21:33:39 +0000 (07:33 +1000)
This interface was defined completely wrong, however userspace has only
ever used 4 values from it (0x1, 0x2, 0x3 and 0x6), so fix the interface to do what userspace actually expected but define new defines for new users to use
it properly.

shared-core/r300_cmdbuf.c
shared-core/radeon_drm.h

index db5186c..0a78901 100644 (file)
@@ -739,22 +739,37 @@ static void r300_discard_buffer(struct drm_device * dev, struct drm_buf * buf)
 static void r300_cmd_wait(drm_radeon_private_t * dev_priv,
                          drm_r300_cmd_header_t header)
 {
-       RING_LOCALS;
        u32 wait_until;
+       RING_LOCALS;
 
        if (!header.wait.flags)
                return;
 
        wait_until = 0;
 
-       if (header.wait.flags & R300_WAIT_2D)
-               wait_until |= RADEON_WAIT_2D_IDLE;
-       if (header.wait.flags & R300_WAIT_3D)
-               wait_until |= RADEON_WAIT_3D_IDLE;
-       if (header.wait.flags & R300_WAIT_2D_CLEAN)
-               wait_until |= RADEON_WAIT_2D_IDLECLEAN;
-       if (header.wait.flags & R300_WAIT_3D_CLEAN)
-               wait_until |= RADEON_WAIT_3D_IDLECLEAN;
+       switch(header.wait.flags) {
+       case R300_WAIT_2D:
+               wait_until = RADEON_WAIT_2D_IDLE;
+               break;
+       case R300_WAIT_3D:
+               wait_until = RADEON_WAIT_3D_IDLE;
+               break;
+       case R300_NEW_WAIT_2D_3D:
+               wait_until = RADEON_WAIT_2D_IDLE|RADEON_WAIT_3D_IDLE;
+               break;
+       case R300_NEW_WAIT_2D_2D_CLEAN:
+               wait_until = RADEON_WAIT_2D_IDLE|RADEON_WAIT_2D_IDLECLEAN;
+               break;
+       case R300_NEW_WAIT_3D_3D_CLEAN:
+               wait_until = RADEON_WAIT_3D_IDLE|RADEON_WAIT_3D_IDLECLEAN;
+               break;
+       case R300_NEW_WAIT_2D_2D_CLEAN_3D_3D_CLEAN:
+               wait_until = RADEON_WAIT_2D_IDLE|RADEON_WAIT_2D_IDLECLEAN;
+               wait_until |= RADEON_WAIT_3D_IDLE|RADEON_WAIT_3D_IDLECLEAN;
+               break;
+       default:
+               return;
+       }
 
        BEGIN_RING(2);
        OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0));
index c4d9cc6..67c3558 100644 (file)
@@ -225,8 +225,20 @@ typedef union {
 #define R300_CMD_WAIT                  7
 #      define R300_WAIT_2D             0x1
 #      define R300_WAIT_3D             0x2
+/* these two defines are DOING IT WRONG - however
+ * we have userspace which relies on using these.
+ * The wait interface is backwards compat new 
+ * code should use the NEW_WAIT defines below
+ * THESE ARE NOT BIT FIELDS
+ */
 #      define R300_WAIT_2D_CLEAN       0x3
 #      define R300_WAIT_3D_CLEAN       0x4
+
+#      define R300_NEW_WAIT_2D_3D      0x3
+#      define R300_NEW_WAIT_2D_2D_CLEAN        0x4
+#      define R300_NEW_WAIT_3D_3D_CLEAN        0x6
+#      define R300_NEW_WAIT_2D_2D_CLEAN_3D_3D_CLEAN    0x8
+
 #define R300_CMD_SCRATCH               8
 #define R300_CMD_R500FP                 9