Ping. Will anyone pick up this patch, please? Marek
On Tue, Oct 25, 2011 at 1:38 AM, Marek Ol??k <maraeo at gmail.com> wrote: > This adds a new optional chunk to the CS ioctl that specifies optional flags > to the CS parser. Why this is useful is explained below. Note that some regs > no longer need the NOP relocation packet if this feature is enabled. > Tested on r300g and r600g with this flag disabled and enabled. > > Assume there are two contexts sharing the same mipmapped tiled texture. > One context wants to render into the first mipmap and the other one > wants to render into the last mipmap. As you probably know, the hardware > has a MACRO_SWITCH feature, which turns off macro tiling for small mipmaps, > but that only applies to samplers. > (at least on r300-r500, though later hardware likely behaves the same) > > So we want to just re-set the tiling flags before rendering (writing > packets), right? ... No. The contexts run in parallel, so they may > set the tiling flags simultaneously and then fire their command streams > also simultaneously. The last one setting the flags wins, the other one > loses. > > Another problem is when one context wants to render into the first and > the last mipmap in one CS. Impossible. It must flush before changing > tiling flags and do the rendering into the smaller mipmaps in another CS. > > Yet another problem is that writing copy_blit in userspace would be a mess > involving re-setting tiling flags to please the kernel, and causing races > with other contexts at the same time. > > The only way out of this is to send tiling flags with each CS, ideally > with each relocation. But we already do that through the registers. > So let's just use what we have in the registers. > > Signed-off-by: Marek Ol??k <maraeo at gmail.com> > --- > ?drivers/gpu/drm/radeon/evergreen_cs.c | ? 92 +++++++++++++++++--------------- > ?drivers/gpu/drm/radeon/r300.c ? ? ? ? | ? 94 > ++++++++++++++++++--------------- > ?drivers/gpu/drm/radeon/r600_cs.c ? ? ?| ? 26 ++++++---- > ?drivers/gpu/drm/radeon/radeon.h ? ? ? | ? ?3 +- > ?drivers/gpu/drm/radeon/radeon_cs.c ? ?| ? 11 ++++- > ?drivers/gpu/drm/radeon/radeon_drv.c ? | ? ?3 +- > ?include/drm/radeon_drm.h ? ? ? ? ? ? ?| ? ?4 ++ > ?7 files changed, 135 insertions(+), 98 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c > b/drivers/gpu/drm/radeon/evergreen_cs.c > index a134790..86b060c 100644 > --- a/drivers/gpu/drm/radeon/evergreen_cs.c > +++ b/drivers/gpu/drm/radeon/evergreen_cs.c > @@ -508,21 +508,23 @@ static inline int evergreen_cs_check_reg(struct > radeon_cs_parser *p, u32 reg, u3 > ? ? ? ? ? ? ? ?} > ? ? ? ? ? ? ? ?break; > ? ? ? ?case DB_Z_INFO: > - ? ? ? ? ? ? ? r = evergreen_cs_packet_next_reloc(p, &reloc); > - ? ? ? ? ? ? ? if (r) { > - ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "bad SET_CONTEXT_REG " > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "0x%04X\n", reg); > - ? ? ? ? ? ? ? ? ? ? ? return -EINVAL; > - ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ?track->db_z_info = radeon_get_ib_value(p, idx); > - ? ? ? ? ? ? ? ib[idx] &= ~Z_ARRAY_MODE(0xf); > - ? ? ? ? ? ? ? track->db_z_info &= ~Z_ARRAY_MODE(0xf); > - ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) { > - ? ? ? ? ? ? ? ? ? ? ? ib[idx] |= Z_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > - ? ? ? ? ? ? ? ? ? ? ? track->db_z_info |= > Z_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > - ? ? ? ? ? ? ? } else { > - ? ? ? ? ? ? ? ? ? ? ? ib[idx] |= Z_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > - ? ? ? ? ? ? ? ? ? ? ? track->db_z_info |= > Z_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > + ? ? ? ? ? ? ? if (!p->keep_tiling_flags) { > + ? ? ? ? ? ? ? ? ? ? ? r = evergreen_cs_packet_next_reloc(p, &reloc); > + ? ? ? ? ? ? ? ? ? ? ? if (r) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "bad SET_CONTEXT_REG " > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "0x%04X\n", reg); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL; > + ? ? ? ? ? ? ? ? ? ? ? } > + ? ? ? ? ? ? ? ? ? ? ? ib[idx] &= ~Z_ARRAY_MODE(0xf); > + ? ? ? ? ? ? ? ? ? ? ? track->db_z_info &= ~Z_ARRAY_MODE(0xf); > + ? ? ? ? ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx] |= Z_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? track->db_z_info |= > Z_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? } else { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx] |= Z_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? track->db_z_info |= > Z_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ?} > ? ? ? ? ? ? ? ?break; > ? ? ? ?case DB_STENCIL_INFO: > @@ -635,40 +637,44 @@ static inline int evergreen_cs_check_reg(struct > radeon_cs_parser *p, u32 reg, u3 > ? ? ? ?case CB_COLOR5_INFO: > ? ? ? ?case CB_COLOR6_INFO: > ? ? ? ?case CB_COLOR7_INFO: > - ? ? ? ? ? ? ? r = evergreen_cs_packet_next_reloc(p, &reloc); > - ? ? ? ? ? ? ? if (r) { > - ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "bad SET_CONTEXT_REG " > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "0x%04X\n", reg); > - ? ? ? ? ? ? ? ? ? ? ? return -EINVAL; > - ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ?tmp = (reg - CB_COLOR0_INFO) / 0x3c; > ? ? ? ? ? ? ? ?track->cb_color_info[tmp] = radeon_get_ib_value(p, idx); > - ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) { > - ? ? ? ? ? ? ? ? ? ? ? ib[idx] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > - ? ? ? ? ? ? ? ? ? ? ? track->cb_color_info[tmp] |= > CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > - ? ? ? ? ? ? ? } else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) { > - ? ? ? ? ? ? ? ? ? ? ? ib[idx] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > - ? ? ? ? ? ? ? ? ? ? ? track->cb_color_info[tmp] |= > CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > + ? ? ? ? ? ? ? if (!p->keep_tiling_flags) { > + ? ? ? ? ? ? ? ? ? ? ? r = evergreen_cs_packet_next_reloc(p, &reloc); > + ? ? ? ? ? ? ? ? ? ? ? if (r) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "bad SET_CONTEXT_REG " > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "0x%04X\n", reg); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL; > + ? ? ? ? ? ? ? ? ? ? ? } > + ? ? ? ? ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx] |= > CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? track->cb_color_info[tmp] |= > CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? } else if (reloc->lobj.tiling_flags & > RADEON_TILING_MICRO) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx] |= > CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? track->cb_color_info[tmp] |= > CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ?} > ? ? ? ? ? ? ? ?break; > ? ? ? ?case CB_COLOR8_INFO: > ? ? ? ?case CB_COLOR9_INFO: > ? ? ? ?case CB_COLOR10_INFO: > ? ? ? ?case CB_COLOR11_INFO: > - ? ? ? ? ? ? ? r = evergreen_cs_packet_next_reloc(p, &reloc); > - ? ? ? ? ? ? ? if (r) { > - ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "bad SET_CONTEXT_REG " > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "0x%04X\n", reg); > - ? ? ? ? ? ? ? ? ? ? ? return -EINVAL; > - ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ?tmp = ((reg - CB_COLOR8_INFO) / 0x1c) + 8; > ? ? ? ? ? ? ? ?track->cb_color_info[tmp] = radeon_get_ib_value(p, idx); > - ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) { > - ? ? ? ? ? ? ? ? ? ? ? ib[idx] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > - ? ? ? ? ? ? ? ? ? ? ? track->cb_color_info[tmp] |= > CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > - ? ? ? ? ? ? ? } else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) { > - ? ? ? ? ? ? ? ? ? ? ? ib[idx] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > - ? ? ? ? ? ? ? ? ? ? ? track->cb_color_info[tmp] |= > CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > + ? ? ? ? ? ? ? if (!p->keep_tiling_flags) { > + ? ? ? ? ? ? ? ? ? ? ? r = evergreen_cs_packet_next_reloc(p, &reloc); > + ? ? ? ? ? ? ? ? ? ? ? if (r) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "bad SET_CONTEXT_REG " > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "0x%04X\n", reg); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL; > + ? ? ? ? ? ? ? ? ? ? ? } > + ? ? ? ? ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx] |= > CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? track->cb_color_info[tmp] |= > CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? } else if (reloc->lobj.tiling_flags & > RADEON_TILING_MICRO) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx] |= > CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? track->cb_color_info[tmp] |= > CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ?} > ? ? ? ? ? ? ? ?break; > ? ? ? ?case CB_COLOR0_PITCH: > @@ -1339,10 +1345,12 @@ static int evergreen_packet3_check(struct > radeon_cs_parser *p, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return -EINVAL; > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?} > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ib[idx+1+(i*8)+2] += > (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & > RADEON_TILING_MACRO) > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx+1+(i*8)+1] |= > TEX_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else if (reloc->lobj.tiling_flags & > RADEON_TILING_MICRO) > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx+1+(i*8)+1] |= > TEX_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (!p->keep_tiling_flags) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & > RADEON_TILING_MACRO) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx+1+(i*8)+1] |= > TEX_ARRAY_MODE(ARRAY_2D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else if (reloc->lobj.tiling_flags & > RADEON_TILING_MICRO) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx+1+(i*8)+1] |= > TEX_ARRAY_MODE(ARRAY_1D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?texture = reloc->robj; > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* tex mip base */ > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?r = evergreen_cs_packet_next_reloc(p, &reloc); > diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c > index 55a7f19..058c311 100644 > --- a/drivers/gpu/drm/radeon/r300.c > +++ b/drivers/gpu/drm/radeon/r300.c > @@ -708,16 +708,21 @@ static int r300_packet0_check(struct radeon_cs_parser > *p, > ? ? ? ? ? ? ? ? ? ? ? ?return r; > ? ? ? ? ? ? ? ?} > > - ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) > - ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_TXO_MACRO_TILE; > - ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) > - ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_TXO_MICRO_TILE; > - ? ? ? ? ? ? ? else if (reloc->lobj.tiling_flags & > RADEON_TILING_MICRO_SQUARE) > - ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_TXO_MICRO_TILE_SQUARE; > - > - ? ? ? ? ? ? ? tmp = idx_value + ((u32)reloc->lobj.gpu_offset); > - ? ? ? ? ? ? ? tmp |= tile_flags; > - ? ? ? ? ? ? ? ib[idx] = tmp; > + ? ? ? ? ? ? ? if (p->keep_tiling_flags) { > + ? ? ? ? ? ? ? ? ? ? ? ib[idx] = (idx_value & 31) | /* keep the 1st 5 bits */ > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ((idx_value & ~31) + > (u32)reloc->lobj.gpu_offset); > + ? ? ? ? ? ? ? } else { > + ? ? ? ? ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_TXO_MACRO_TILE; > + ? ? ? ? ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_TXO_MICRO_TILE; > + ? ? ? ? ? ? ? ? ? ? ? else if (reloc->lobj.tiling_flags & > RADEON_TILING_MICRO_SQUARE) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_TXO_MICRO_TILE_SQUARE; > + > + ? ? ? ? ? ? ? ? ? ? ? tmp = idx_value + ((u32)reloc->lobj.gpu_offset); > + ? ? ? ? ? ? ? ? ? ? ? tmp |= tile_flags; > + ? ? ? ? ? ? ? ? ? ? ? ib[idx] = tmp; > + ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ?track->textures[i].robj = reloc->robj; > ? ? ? ? ? ? ? ?track->tex_dirty = true; > ? ? ? ? ? ? ? ?break; > @@ -767,24 +772,26 @@ static int r300_packet0_check(struct radeon_cs_parser > *p, > ? ? ? ? ? ? ? ?/* RB3D_COLORPITCH1 */ > ? ? ? ? ? ? ? ?/* RB3D_COLORPITCH2 */ > ? ? ? ? ? ? ? ?/* RB3D_COLORPITCH3 */ > - ? ? ? ? ? ? ? r = r100_cs_packet_next_reloc(p, &reloc); > - ? ? ? ? ? ? ? if (r) { > - ? ? ? ? ? ? ? ? ? ? ? DRM_ERROR("No reloc for ib[%d]=0x%04X\n", > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? idx, reg); > - ? ? ? ? ? ? ? ? ? ? ? r100_cs_dump_packet(p, pkt); > - ? ? ? ? ? ? ? ? ? ? ? return r; > - ? ? ? ? ? ? ? } > + ? ? ? ? ? ? ? if (!p->keep_tiling_flags) { > + ? ? ? ? ? ? ? ? ? ? ? r = r100_cs_packet_next_reloc(p, &reloc); > + ? ? ? ? ? ? ? ? ? ? ? if (r) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? DRM_ERROR("No reloc for ib[%d]=0x%04X\n", > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? idx, reg); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? r100_cs_dump_packet(p, pkt); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return r; > + ? ? ? ? ? ? ? ? ? ? ? } > > - ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) > - ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_COLOR_TILE_ENABLE; > - ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) > - ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_COLOR_MICROTILE_ENABLE; > - ? ? ? ? ? ? ? else if (reloc->lobj.tiling_flags & > RADEON_TILING_MICRO_SQUARE) > - ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_COLOR_MICROTILE_SQUARE_ENABLE; > + ? ? ? ? ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_COLOR_TILE_ENABLE; > + ? ? ? ? ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_COLOR_MICROTILE_ENABLE; > + ? ? ? ? ? ? ? ? ? ? ? else if (reloc->lobj.tiling_flags & > RADEON_TILING_MICRO_SQUARE) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tile_flags |= > R300_COLOR_MICROTILE_SQUARE_ENABLE; > > - ? ? ? ? ? ? ? tmp = idx_value & ~(0x7 << 16); > - ? ? ? ? ? ? ? tmp |= tile_flags; > - ? ? ? ? ? ? ? ib[idx] = tmp; > + ? ? ? ? ? ? ? ? ? ? ? tmp = idx_value & ~(0x7 << 16); > + ? ? ? ? ? ? ? ? ? ? ? tmp |= tile_flags; > + ? ? ? ? ? ? ? ? ? ? ? ib[idx] = tmp; > + ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ?i = (reg - 0x4E38) >> 2; > ? ? ? ? ? ? ? ?track->cb[i].pitch = idx_value & 0x3FFE; > ? ? ? ? ? ? ? ?switch (((idx_value >> 21) & 0xF)) { > @@ -850,25 +857,26 @@ static int r300_packet0_check(struct radeon_cs_parser > *p, > ? ? ? ? ? ? ? ?break; > ? ? ? ?case 0x4F24: > ? ? ? ? ? ? ? ?/* ZB_DEPTHPITCH */ > - ? ? ? ? ? ? ? r = r100_cs_packet_next_reloc(p, &reloc); > - ? ? ? ? ? ? ? if (r) { > - ? ? ? ? ? ? ? ? ? ? ? DRM_ERROR("No reloc for ib[%d]=0x%04X\n", > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? idx, reg); > - ? ? ? ? ? ? ? ? ? ? ? r100_cs_dump_packet(p, pkt); > - ? ? ? ? ? ? ? ? ? ? ? return r; > - ? ? ? ? ? ? ? } > - > - ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) > - ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_DEPTHMACROTILE_ENABLE; > - ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) > - ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_DEPTHMICROTILE_TILED; > - ? ? ? ? ? ? ? else if (reloc->lobj.tiling_flags & > RADEON_TILING_MICRO_SQUARE) > - ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_DEPTHMICROTILE_TILED_SQUARE; > + ? ? ? ? ? ? ? if (!p->keep_tiling_flags) { > + ? ? ? ? ? ? ? ? ? ? ? r = r100_cs_packet_next_reloc(p, &reloc); > + ? ? ? ? ? ? ? ? ? ? ? if (r) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? DRM_ERROR("No reloc for ib[%d]=0x%04X\n", > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? idx, reg); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? r100_cs_dump_packet(p, pkt); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return r; > + ? ? ? ? ? ? ? ? ? ? ? } > > - ? ? ? ? ? ? ? tmp = idx_value & ~(0x7 << 16); > - ? ? ? ? ? ? ? tmp |= tile_flags; > - ? ? ? ? ? ? ? ib[idx] = tmp; > + ? ? ? ? ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_DEPTHMACROTILE_ENABLE; > + ? ? ? ? ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tile_flags |= R300_DEPTHMICROTILE_TILED; > + ? ? ? ? ? ? ? ? ? ? ? else if (reloc->lobj.tiling_flags & > RADEON_TILING_MICRO_SQUARE) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tile_flags |= > R300_DEPTHMICROTILE_TILED_SQUARE; > > + ? ? ? ? ? ? ? ? ? ? ? tmp = idx_value & ~(0x7 << 16); > + ? ? ? ? ? ? ? ? ? ? ? tmp |= tile_flags; > + ? ? ? ? ? ? ? ? ? ? ? ib[idx] = tmp; > + ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ?track->zb.pitch = idx_value & 0x3FFC; > ? ? ? ? ? ? ? ?track->zb_dirty = true; > ? ? ? ? ? ? ? ?break; > diff --git a/drivers/gpu/drm/radeon/r600_cs.c > b/drivers/gpu/drm/radeon/r600_cs.c > index cf83aa0..9e78dfb 100644 > --- a/drivers/gpu/drm/radeon/r600_cs.c > +++ b/drivers/gpu/drm/radeon/r600_cs.c > @@ -960,7 +960,8 @@ static inline int r600_cs_check_reg(struct > radeon_cs_parser *p, u32 reg, u32 idx > ? ? ? ? ? ? ? ?track->db_depth_control = radeon_get_ib_value(p, idx); > ? ? ? ? ? ? ? ?break; > ? ? ? ?case R_028010_DB_DEPTH_INFO: > - ? ? ? ? ? ? ? if (r600_cs_packet_next_is_pkt3_nop(p)) { > + ? ? ? ? ? ? ? if (!p->keep_tiling_flags && > + ? ? ? ? ? ? ? ? ? r600_cs_packet_next_is_pkt3_nop(p)) { > ? ? ? ? ? ? ? ? ? ? ? ?r = r600_cs_packet_next_reloc(p, &reloc); > ? ? ? ? ? ? ? ? ? ? ? ?if (r) { > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?dev_warn(p->dev, "bad SET_CONTEXT_REG " > @@ -1011,7 +1012,8 @@ static inline int r600_cs_check_reg(struct > radeon_cs_parser *p, u32 reg, u32 idx > ? ? ? ?case R_0280B4_CB_COLOR5_INFO: > ? ? ? ?case R_0280B8_CB_COLOR6_INFO: > ? ? ? ?case R_0280BC_CB_COLOR7_INFO: > - ? ? ? ? ? ? ? if (r600_cs_packet_next_is_pkt3_nop(p)) { > + ? ? ? ? ? ? ? if (!p->keep_tiling_flags && > + ? ? ? ? ? ? ? ? ? ?r600_cs_packet_next_is_pkt3_nop(p)) { > ? ? ? ? ? ? ? ? ? ? ? ?r = r600_cs_packet_next_reloc(p, &reloc); > ? ? ? ? ? ? ? ? ? ? ? ?if (r) { > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?dev_err(p->dev, "bad SET_CONTEXT_REG > 0x%04X\n", reg); > @@ -1310,10 +1312,12 @@ static inline int r600_check_texture_resource(struct > radeon_cs_parser *p, ?u32 i > ? ? ? ?mip_offset <<= 8; > > ? ? ? ?word0 = radeon_get_ib_value(p, idx + 0); > - ? ? ? if (tiling_flags & RADEON_TILING_MACRO) > - ? ? ? ? ? ? ? word0 |= S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1); > - ? ? ? else if (tiling_flags & RADEON_TILING_MICRO) > - ? ? ? ? ? ? ? word0 |= S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1); > + ? ? ? if (!p->keep_tiling_flags) { > + ? ? ? ? ? ? ? if (tiling_flags & RADEON_TILING_MACRO) > + ? ? ? ? ? ? ? ? ? ? ? word0 |= > S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1); > + ? ? ? ? ? ? ? else if (tiling_flags & RADEON_TILING_MICRO) > + ? ? ? ? ? ? ? ? ? ? ? word0 |= > S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1); > + ? ? ? } > ? ? ? ?word1 = radeon_get_ib_value(p, idx + 1); > ? ? ? ?w0 = G_038000_TEX_WIDTH(word0) + 1; > ? ? ? ?h0 = G_038004_TEX_HEIGHT(word1) + 1; > @@ -1640,10 +1644,12 @@ static int r600_packet3_check(struct radeon_cs_parser > *p, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return -EINVAL; > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?} > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?base_offset = (u32)((reloc->lobj.gpu_offset >> > 8) & 0xffffffff); > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & > RADEON_TILING_MACRO) > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx+1+(i*7)+0] |= > S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1); > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else if (reloc->lobj.tiling_flags & > RADEON_TILING_MICRO) > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx+1+(i*7)+0] |= > S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (!p->keep_tiling_flags) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (reloc->lobj.tiling_flags & > RADEON_TILING_MACRO) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx+1+(i*7)+0] |= > S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else if (reloc->lobj.tiling_flags & > RADEON_TILING_MICRO) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ib[idx+1+(i*7)+0] |= > S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1); > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?texture = reloc->robj; > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* tex mip base */ > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?r = r600_cs_packet_next_reloc(p, &reloc); > diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h > index c1e056b..7ae80c7 100644 > --- a/drivers/gpu/drm/radeon/radeon.h > +++ b/drivers/gpu/drm/radeon/radeon.h > @@ -596,7 +596,8 @@ struct radeon_cs_parser { > ? ? ? ?struct radeon_ib ? ? ? ?*ib; > ? ? ? ?void ? ? ? ? ? ? ? ? ? ?*track; > ? ? ? ?unsigned ? ? ? ? ? ? ? ?family; > - ? ? ? int parser_error; > + ? ? ? int ? ? ? ? ? ? ? ? ? ? parser_error; > + ? ? ? bool ? ? ? ? ? ? ? ? ? ?keep_tiling_flags; > ?}; > > ?extern int radeon_cs_update_pages(struct radeon_cs_parser *p, int pg_idx); > diff --git a/drivers/gpu/drm/radeon/radeon_cs.c > b/drivers/gpu/drm/radeon/radeon_cs.c > index fae00c0..44e4201 100644 > --- a/drivers/gpu/drm/radeon/radeon_cs.c > +++ b/drivers/gpu/drm/radeon/radeon_cs.c > @@ -93,7 +93,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void > *data) > ?{ > ? ? ? ?struct drm_radeon_cs *cs = data; > ? ? ? ?uint64_t *chunk_array_ptr; > - ? ? ? unsigned size, i; > + ? ? ? unsigned size, i, flags = 0; > > ? ? ? ?if (!cs->num_chunks) { > ? ? ? ? ? ? ? ?return 0; > @@ -140,6 +140,10 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, > void *data) > ? ? ? ? ? ? ? ? ? ? ? ?if (p->chunks[i].length_dw == 0) > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return -EINVAL; > ? ? ? ? ? ? ? ?} > + ? ? ? ? ? ? ? if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_FLAGS && > + ? ? ? ? ? ? ? ? ? !p->chunks[i].length_dw) { > + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL; > + ? ? ? ? ? ? ? } > > ? ? ? ? ? ? ? ?p->chunks[i].length_dw = user_chunk.length_dw; > ? ? ? ? ? ? ? ?p->chunks[i].user_ptr = (void __user *)(unsigned > long)user_chunk.chunk_data; > @@ -155,6 +159,9 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, > void *data) > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p->chunks[i].user_ptr, size)) { > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return -EFAULT; > ? ? ? ? ? ? ? ? ? ? ? ?} > + ? ? ? ? ? ? ? ? ? ? ? if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_FLAGS) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? flags = p->chunks[i].kdata[0]; > + ? ? ? ? ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ?} else { > ? ? ? ? ? ? ? ? ? ? ? ?p->chunks[i].kpage[0] = kmalloc(PAGE_SIZE, GFP_KERNEL); > ? ? ? ? ? ? ? ? ? ? ? ?p->chunks[i].kpage[1] = kmalloc(PAGE_SIZE, GFP_KERNEL); > @@ -174,6 +181,8 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, > void *data) > ? ? ? ? ? ? ? ? ? ? ? ? ?p->chunks[p->chunk_ib_idx].length_dw); > ? ? ? ? ? ? ? ?return -EINVAL; > ? ? ? ?} > + > + ? ? ? p->keep_tiling_flags = (flags & RADEON_CS_KEEP_TILING_FLAGS) != 0; > ? ? ? ?return 0; > ?} > > diff --git a/drivers/gpu/drm/radeon/radeon_drv.c > b/drivers/gpu/drm/radeon/radeon_drv.c > index e71d2ed..aea2218 100644 > --- a/drivers/gpu/drm/radeon/radeon_drv.c > +++ b/drivers/gpu/drm/radeon/radeon_drv.c > @@ -52,9 +52,10 @@ > ?* ? 2.9.0 - r600 tiling (s3tc,rgtc) working, SET_PREDICATION packet 3 on > r600 + eg, backend query > ?* ? 2.10.0 - fusion 2D tiling > ?* ? 2.11.0 - backend map, initial compute support for the CS checker > + * ? 2.12.0 - RADEON_CS_KEEP_TILING_FLAGS > ?*/ > ?#define KMS_DRIVER_MAJOR ? ? ? 2 > -#define KMS_DRIVER_MINOR ? ? ? 11 > +#define KMS_DRIVER_MINOR ? ? ? 12 > ?#define KMS_DRIVER_PATCHLEVEL ?0 > ?int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); > ?int radeon_driver_unload_kms(struct drm_device *dev); > diff --git a/include/drm/radeon_drm.h b/include/drm/radeon_drm.h > index b65be60..be94be6 100644 > --- a/include/drm/radeon_drm.h > +++ b/include/drm/radeon_drm.h > @@ -874,6 +874,10 @@ struct drm_radeon_gem_pwrite { > > ?#define RADEON_CHUNK_ID_RELOCS 0x01 > ?#define RADEON_CHUNK_ID_IB ? ? 0x02 > +#define RADEON_CHUNK_ID_FLAGS ?0x03 > + > +/* The first dword of RADEON_CHUNK_ID_FLAGS is a uint32 of these flags: */ > +#define RADEON_CS_KEEP_TILING_FLAGS 0x01 > > ?struct drm_radeon_cs_chunk { > ? ? ? ?uint32_t ? ? ? ? ? ? ? ?chunk_id; > -- > 1.7.4.1 > >