]> err.no Git - linux-2.6/blobdiff - drivers/char/drm/r300_cmdbuf.c
Merge branch 'master' of ../linux-2.6/
[linux-2.6] / drivers / char / drm / r300_cmdbuf.c
index 59b2944811c50c7c9e0269585ba525ce88a49a4e..0f4afc44245c60ffc9e67cce44aaf209ce58a7a7 100644 (file)
@@ -77,23 +77,31 @@ static int r300_emit_cliprects(drm_radeon_private_t *dev_priv,
                                return -EFAULT;
                        }
 
-                       box.x1 =
-                           (box.x1 +
-                            R300_CLIPRECT_OFFSET) & R300_CLIPRECT_MASK;
-                       box.y1 =
-                           (box.y1 +
-                            R300_CLIPRECT_OFFSET) & R300_CLIPRECT_MASK;
-                       box.x2 =
-                           (box.x2 +
-                            R300_CLIPRECT_OFFSET) & R300_CLIPRECT_MASK;
-                       box.y2 =
-                           (box.y2 +
-                            R300_CLIPRECT_OFFSET) & R300_CLIPRECT_MASK;
+                       if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV515) {
+                               box.x1 = (box.x1) &
+                                       R300_CLIPRECT_MASK;
+                               box.y1 = (box.y1) &
+                                       R300_CLIPRECT_MASK;
+                               box.x2 = (box.x2) &
+                                       R300_CLIPRECT_MASK;
+                               box.y2 = (box.y2) &
+                                       R300_CLIPRECT_MASK;
+                       } else {
+                               box.x1 = (box.x1 + R300_CLIPRECT_OFFSET) &
+                                       R300_CLIPRECT_MASK;
+                               box.y1 = (box.y1 + R300_CLIPRECT_OFFSET) &
+                                       R300_CLIPRECT_MASK;
+                               box.x2 = (box.x2 + R300_CLIPRECT_OFFSET) &
+                                       R300_CLIPRECT_MASK;
+                               box.y2 = (box.y2 + R300_CLIPRECT_OFFSET) &
+                                       R300_CLIPRECT_MASK;
 
+                       }
                        OUT_RING((box.x1 << R300_CLIPRECT_X_SHIFT) |
                                 (box.y1 << R300_CLIPRECT_Y_SHIFT));
                        OUT_RING((box.x2 << R300_CLIPRECT_X_SHIFT) |
                                 (box.y2 << R300_CLIPRECT_Y_SHIFT));
+
                }
 
                OUT_RING_REG(R300_RE_CLIPRECT_CNTL, r300_cliprect_cntl[nr - 1]);
@@ -133,9 +141,11 @@ static int r300_emit_cliprects(drm_radeon_private_t *dev_priv,
 
 static u8 r300_reg_flags[0x10000 >> 2];
 
-void r300_init_reg_flags(void)
+void r300_init_reg_flags(struct drm_device *dev)
 {
        int i;
+       drm_radeon_private_t *dev_priv = dev->dev_private;
+
        memset(r300_reg_flags, 0, 0x10000 >> 2);
 #define ADD_RANGE_MARK(reg, count,mark) \
                for(i=((reg)>>2);i<((reg)>>2)+(count);i++)\
@@ -230,6 +240,9 @@ void r300_init_reg_flags(void)
        ADD_RANGE(R300_VAP_INPUT_ROUTE_0_0, 8);
        ADD_RANGE(R300_VAP_INPUT_ROUTE_1_0, 8);
 
+       if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV515) {
+               ADD_RANGE(0x4074, 16);
+       }
 }
 
 static __inline__ int r300_check_range(unsigned reg, int count)
@@ -486,7 +499,7 @@ static __inline__ int r300_emit_bitblt_multi(drm_radeon_private_t *dev_priv,
        if (cmd[0] & 0x8000) {
                u32 offset;
 
-               if (cmd[1] & (RADEON_GMC_SRC_PITCH_OFFSET_CNTL 
+               if (cmd[1] & (RADEON_GMC_SRC_PITCH_OFFSET_CNTL
                              | RADEON_GMC_DST_PITCH_OFFSET_CNTL)) {
                        offset = cmd[2] << 10;
                        ret = !radeon_check_offset(dev_priv, offset);
@@ -504,7 +517,7 @@ static __inline__ int r300_emit_bitblt_multi(drm_radeon_private_t *dev_priv,
                                DRM_ERROR("Invalid bitblt second offset is %08X\n", offset);
                                return -EINVAL;
                        }
-                       
+
                }
        }
 
@@ -723,54 +736,54 @@ static int r300_scratch(drm_radeon_private_t *dev_priv,
        u32 *ref_age_base;
        u32 i, buf_idx, h_pending;
        RING_LOCALS;
-       
-       if (cmdbuf->bufsz < 
+
+       if (cmdbuf->bufsz <
            (sizeof(u64) + header.scratch.n_bufs * sizeof(buf_idx))) {
                return -EINVAL;
        }
-       
+
        if (header.scratch.reg >= 5) {
                return -EINVAL;
        }
-       
+
        dev_priv->scratch_ages[header.scratch.reg]++;
-       
+
        ref_age_base =  (u32 *)(unsigned long)*((uint64_t *)cmdbuf->buf);
-       
+
        cmdbuf->buf += sizeof(u64);
        cmdbuf->bufsz -= sizeof(u64);
-       
+
        for (i=0; i < header.scratch.n_bufs; i++) {
                buf_idx = *(u32 *)cmdbuf->buf;
                buf_idx *= 2; /* 8 bytes per buf */
-               
+
                if (DRM_COPY_TO_USER(ref_age_base + buf_idx, &dev_priv->scratch_ages[header.scratch.reg], sizeof(u32))) {
                        return -EINVAL;
                }
-                                       
+
                if (DRM_COPY_FROM_USER(&h_pending, ref_age_base + buf_idx + 1, sizeof(u32))) {
                        return -EINVAL;
                }
-                                       
+
                if (h_pending == 0) {
                        return -EINVAL;
                }
-                                       
+
                h_pending--;
-                                               
+
                if (DRM_COPY_TO_USER(ref_age_base + buf_idx + 1, &h_pending, sizeof(u32))) {
                        return -EINVAL;
                }
-                                       
+
                cmdbuf->buf += sizeof(buf_idx);
                cmdbuf->bufsz -= sizeof(buf_idx);
        }
-       
+
        BEGIN_RING(2);
        OUT_RING( CP_PACKET0( RADEON_SCRATCH_REG0 + header.scratch.reg * 4, 0 ) );
        OUT_RING( dev_priv->scratch_ages[header.scratch.reg] );
        ADVANCE_RING();
-       
+
        return 0;
 }
 
@@ -919,7 +932,7 @@ int r300_do_cp_cmdbuf(struct drm_device *dev,
                                goto cleanup;
                        }
                        break;
-                       
+
                default:
                        DRM_ERROR("bad cmd_type %i at %p\n",
                                  header.header.cmd_type,