aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/r100.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/r100.c')
-rw-r--r--drivers/gpu/drm/radeon/r100.c58
1 files changed, 37 insertions, 21 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index bfd36ab643a6..99bb00649357 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
@@ -1554,7 +1558,17 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1554 r100_cs_dump_packet(p, pkt); 1558 r100_cs_dump_packet(p, pkt);
1555 return r; 1559 return r;
1556 } 1560 }
1557 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 1561 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {
1562 if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
1563 tile_flags |= RADEON_TXO_MACRO_TILE;
1564 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
1565 tile_flags |= RADEON_TXO_MICRO_TILE_X2;
1566
1567 tmp = idx_value & ~(0x7 << 2);
1568 tmp |= tile_flags;
1569 ib[idx] = tmp + ((u32)reloc->lobj.gpu_offset);
1570 } else
1571 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1558 track->textures[i].robj = reloc->robj; 1572 track->textures[i].robj = reloc->robj;
1559 track->tex_dirty = true; 1573 track->tex_dirty = true;
1560 break; 1574 break;
@@ -1625,15 +1639,17 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1625 r100_cs_dump_packet(p, pkt); 1639 r100_cs_dump_packet(p, pkt);
1626 return r; 1640 return r;
1627 } 1641 }
1628 1642 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {
1629 if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) 1643 if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
1630 tile_flags |= RADEON_COLOR_TILE_ENABLE; 1644 tile_flags |= RADEON_COLOR_TILE_ENABLE;
1631 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) 1645 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
1632 tile_flags |= RADEON_COLOR_MICROTILE_ENABLE; 1646 tile_flags |= RADEON_COLOR_MICROTILE_ENABLE;
1633 1647
1634 tmp = idx_value & ~(0x7 << 16); 1648 tmp = idx_value & ~(0x7 << 16);
1635 tmp |= tile_flags; 1649 tmp |= tile_flags;
1636 ib[idx] = tmp; 1650 ib[idx] = tmp;
1651 } else
1652 ib[idx] = idx_value;
1637 1653
1638 track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK; 1654 track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK;
1639 track->cb_dirty = true; 1655 track->cb_dirty = true;