aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/r100.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2012-02-02 10:11:11 -0500
committerDave Airlie <airlied@redhat.com>2012-02-03 04:40:55 -0500
commitc9068eb296fc682513f8612168f605c169b773e4 (patch)
tree207493390e65f95a3fbb6ecf87d2c087e674f004 /drivers/gpu/drm/radeon/r100.c
parent9292f37e1f5c79400254dca46f83313488093825 (diff)
drm/radeon/kms: add r1xx/r2xx support for CS_KEEP_TILING_FLAGS
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>
Diffstat (limited to 'drivers/gpu/drm/radeon/r100.c')
-rw-r--r--drivers/gpu/drm/radeon/r100.c46
1 files changed, 26 insertions, 20 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index bfd36ab643a6..7dd6a1c47345 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -87,23 +87,27 @@ int r100_reloc_pitch_offset(struct radeon_cs_parser *p,
87 r100_cs_dump_packet(p, pkt); 87 r100_cs_dump_packet(p, pkt);
88 return r; 88 return r;
89 } 89 }
90
90 value = radeon_get_ib_value(p, idx); 91 value = radeon_get_ib_value(p, idx);
91 tmp = value & 0x003fffff; 92 tmp = value & 0x003fffff;
92 tmp += (((u32)reloc->lobj.gpu_offset) >> 10); 93 tmp += (((u32)reloc->lobj.gpu_offset) >> 10);
93 94
94 if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) 95 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {
95 tile_flags |= RADEON_DST_TILE_MACRO; 96 if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
96 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) { 97 tile_flags |= RADEON_DST_TILE_MACRO;
97 if (reg == RADEON_SRC_PITCH_OFFSET) { 98 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) {
98 DRM_ERROR("Cannot src blit from microtiled surface\n"); 99 if (reg == RADEON_SRC_PITCH_OFFSET) {
99 r100_cs_dump_packet(p, pkt); 100 DRM_ERROR("Cannot src blit from microtiled surface\n");
100 return -EINVAL; 101 r100_cs_dump_packet(p, pkt);
102 return -EINVAL;
103 }
104 tile_flags |= RADEON_DST_TILE_MICRO;
101 } 105 }
102 tile_flags |= RADEON_DST_TILE_MICRO;
103 }
104 106
105 tmp |= tile_flags; 107 tmp |= tile_flags;
106 p->ib->ptr[idx] = (value & 0x3fc00000) | tmp; 108 p->ib->ptr[idx] = (value & 0x3fc00000) | tmp;
109 } else
110 p->ib->ptr[idx] = (value & 0xffc00000) | tmp;
107 return 0; 111 return 0;
108} 112}
109 113
@@ -1625,15 +1629,17 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1625 r100_cs_dump_packet(p, pkt); 1629 r100_cs_dump_packet(p, pkt);
1626 return r; 1630 return r;
1627 } 1631 }
1628 1632 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {
1629 if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) 1633 if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
1630 tile_flags |= RADEON_COLOR_TILE_ENABLE; 1634 tile_flags |= RADEON_COLOR_TILE_ENABLE;
1631 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) 1635 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
1632 tile_flags |= RADEON_COLOR_MICROTILE_ENABLE; 1636 tile_flags |= RADEON_COLOR_MICROTILE_ENABLE;
1633 1637
1634 tmp = idx_value & ~(0x7 << 16); 1638 tmp = idx_value & ~(0x7 << 16);
1635 tmp |= tile_flags; 1639 tmp |= tile_flags;
1636 ib[idx] = tmp; 1640 ib[idx] = tmp;
1641 } else
1642 ib[idx] = idx_value;
1637 1643
1638 track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK; 1644 track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK;
1639 track->cb_dirty = true; 1645 track->cb_dirty = true;