diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r100.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 58 |
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; |