drm/radeon/kms: add r1xx/r2xx support for CS_KEEP_TILING_FLAGS
authorAlex Deucher <alexander.deucher@amd.com>
Thu, 2 Feb 2012 15:11:11 +0000 (10:11 -0500)
committerDave Airlie <airlied@redhat.com>
Fri, 3 Feb 2012 09:40:55 +0000 (09:40 +0000)
Previous patch only updates r3xx+.  It's not likely
anyone will use this on r1xx/r2xx, but add it for consistency.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/r100.c
drivers/gpu/drm/radeon/r200.c

index bfd36ab643a68a5dea2b43d24283d08a0a2eb703..7dd6a1c473453b9ad4b2aca5f4ba4e53c3ed7668 100644 (file)
@@ -87,23 +87,27 @@ int r100_reloc_pitch_offset(struct radeon_cs_parser *p,
                r100_cs_dump_packet(p, pkt);
                return r;
        }
+
        value = radeon_get_ib_value(p, idx);
        tmp = value & 0x003fffff;
        tmp += (((u32)reloc->lobj.gpu_offset) >> 10);
 
-       if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
-               tile_flags |= RADEON_DST_TILE_MACRO;
-       if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) {
-               if (reg == RADEON_SRC_PITCH_OFFSET) {
-                       DRM_ERROR("Cannot src blit from microtiled surface\n");
-                       r100_cs_dump_packet(p, pkt);
-                       return -EINVAL;
+       if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {
+               if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
+                       tile_flags |= RADEON_DST_TILE_MACRO;
+               if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) {
+                       if (reg == RADEON_SRC_PITCH_OFFSET) {
+                               DRM_ERROR("Cannot src blit from microtiled surface\n");
+                               r100_cs_dump_packet(p, pkt);
+                               return -EINVAL;
+                       }
+                       tile_flags |= RADEON_DST_TILE_MICRO;
                }
-               tile_flags |= RADEON_DST_TILE_MICRO;
-       }
 
-       tmp |= tile_flags;
-       p->ib->ptr[idx] = (value & 0x3fc00000) | tmp;
+               tmp |= tile_flags;
+               p->ib->ptr[idx] = (value & 0x3fc00000) | tmp;
+       } else
+               p->ib->ptr[idx] = (value & 0xffc00000) | tmp;
        return 0;
 }
 
@@ -1625,15 +1629,17 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
                        r100_cs_dump_packet(p, pkt);
                        return r;
                }
-
-               if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
-                       tile_flags |= RADEON_COLOR_TILE_ENABLE;
-               if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
-                       tile_flags |= RADEON_COLOR_MICROTILE_ENABLE;
-
-               tmp = idx_value & ~(0x7 << 16);
-               tmp |= tile_flags;
-               ib[idx] = tmp;
+               if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {
+                       if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
+                               tile_flags |= RADEON_COLOR_TILE_ENABLE;
+                       if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
+                               tile_flags |= RADEON_COLOR_MICROTILE_ENABLE;
+
+                       tmp = idx_value & ~(0x7 << 16);
+                       tmp |= tile_flags;
+                       ib[idx] = tmp;
+               } else
+                       ib[idx] = idx_value;
 
                track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK;
                track->cb_dirty = true;
index eba4cbfa78f6a10f38949d0810e2732bcb67241d..2f44397f6df7fe3a91005ea75a765e663cb54a17 100644 (file)
@@ -277,14 +277,17 @@ int r200_packet0_check(struct radeon_cs_parser *p,
                        return r;
                }
 
-               if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
-                       tile_flags |= RADEON_COLOR_TILE_ENABLE;
-               if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
-                       tile_flags |= RADEON_COLOR_MICROTILE_ENABLE;
+               if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {
+                       if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
+                               tile_flags |= RADEON_COLOR_TILE_ENABLE;
+                       if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
+                               tile_flags |= RADEON_COLOR_MICROTILE_ENABLE;
 
-               tmp = idx_value & ~(0x7 << 16);
-               tmp |= tile_flags;
-               ib[idx] = tmp;
+                       tmp = idx_value & ~(0x7 << 16);
+                       tmp |= tile_flags;
+                       ib[idx] = tmp;
+               } else
+                       ib[idx] = idx_value;
 
                track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK;
                track->cb_dirty = true;