diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r200.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/r200.c | 117 | 
1 files changed, 74 insertions, 43 deletions
diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c index d2408c39561..58f0473aa73 100644 --- a/drivers/gpu/drm/radeon/r200.c +++ b/drivers/gpu/drm/radeon/r200.c @@ -25,9 +25,8 @@   *          Alex Deucher   *          Jerome Glisse   */ -#include "drmP.h" -#include "drm.h" -#include "radeon_drm.h" +#include <drm/drmP.h> +#include <drm/radeon_drm.h>  #include "radeon_reg.h"  #include "radeon.h"  #include "radeon_asic.h" @@ -84,44 +83,45 @@ static int r200_get_vtx_size_0(uint32_t vtx_fmt_0)  int r200_copy_dma(struct radeon_device *rdev,  		  uint64_t src_offset,  		  uint64_t dst_offset, -		  unsigned num_pages, -		  struct radeon_fence *fence) +		  unsigned num_gpu_pages, +		  struct radeon_fence **fence)  { +	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];  	uint32_t size;  	uint32_t cur_size;  	int i, num_loops;  	int r = 0;  	/* radeon pitch is /64 */ -	size = num_pages << PAGE_SHIFT; +	size = num_gpu_pages << RADEON_GPU_PAGE_SHIFT;  	num_loops = DIV_ROUND_UP(size, 0x1FFFFF); -	r = radeon_ring_lock(rdev, num_loops * 4 + 64); +	r = radeon_ring_lock(rdev, ring, num_loops * 4 + 64);  	if (r) {  		DRM_ERROR("radeon: moving bo (%d).\n", r);  		return r;  	}  	/* Must wait for 2D idle & clean before DMA or hangs might happen */ -	radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); -	radeon_ring_write(rdev, (1 << 16)); +	radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0)); +	radeon_ring_write(ring, (1 << 16));  	for (i = 0; i < num_loops; i++) {  		cur_size = size;  		if (cur_size > 0x1FFFFF) {  			cur_size = 0x1FFFFF;  		}  		size -= cur_size; -		radeon_ring_write(rdev, PACKET0(0x720, 2)); -		radeon_ring_write(rdev, src_offset); -		radeon_ring_write(rdev, dst_offset); -		radeon_ring_write(rdev, cur_size | (1 << 31) | (1 << 30)); +		radeon_ring_write(ring, PACKET0(0x720, 2)); +		radeon_ring_write(ring, src_offset); +		radeon_ring_write(ring, dst_offset); +		radeon_ring_write(ring, cur_size | (1 << 31) | (1 << 30));  		src_offset += cur_size;  		dst_offset += cur_size;  	} -	radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); -	radeon_ring_write(rdev, RADEON_WAIT_DMA_GUI_IDLE); +	radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0)); +	radeon_ring_write(ring, RADEON_WAIT_DMA_GUI_IDLE);  	if (fence) { -		r = radeon_fence_emit(rdev, fence); +		r = radeon_fence_emit(rdev, fence, RADEON_RING_TYPE_GFX_INDEX);  	} -	radeon_ring_unlock_commit(rdev); +	radeon_ring_unlock_commit(rdev, ring);  	return r;  } @@ -153,7 +153,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,  	u32 tile_flags = 0;  	u32 idx_value; -	ib = p->ib->ptr; +	ib = p->ib.ptr;  	track = (struct r100_cs_track *)p->track;  	idx_value = radeon_get_ib_value(p, idx);  	switch (reg) { @@ -162,7 +162,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,  		if (r) {  			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",  				  idx, reg); -			r100_cs_dump_packet(p, pkt); +			radeon_cs_dump_packet(p, pkt);  			return r;  		}  		break; @@ -175,28 +175,30 @@ int r200_packet0_check(struct radeon_cs_parser *p,  			return r;  		break;  	case RADEON_RB3D_DEPTHOFFSET: -		r = r100_cs_packet_next_reloc(p, &reloc); +		r = radeon_cs_packet_next_reloc(p, &reloc, 0);  		if (r) {  			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",  				  idx, reg); -			r100_cs_dump_packet(p, pkt); +			radeon_cs_dump_packet(p, pkt);  			return r;  		}  		track->zb.robj = reloc->robj;  		track->zb.offset = idx_value; -		ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); +		track->zb_dirty = true; +		ib[idx] = idx_value + ((u32)reloc->gpu_offset);  		break;  	case RADEON_RB3D_COLOROFFSET: -		r = r100_cs_packet_next_reloc(p, &reloc); +		r = radeon_cs_packet_next_reloc(p, &reloc, 0);  		if (r) {  			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",  				  idx, reg); -			r100_cs_dump_packet(p, pkt); +			radeon_cs_dump_packet(p, pkt);  			return r;  		}  		track->cb[0].robj = reloc->robj;  		track->cb[0].offset = idx_value; -		ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); +		track->cb_dirty = true; +		ib[idx] = idx_value + ((u32)reloc->gpu_offset);  		break;  	case R200_PP_TXOFFSET_0:  	case R200_PP_TXOFFSET_1: @@ -205,15 +207,26 @@ int r200_packet0_check(struct radeon_cs_parser *p,  	case R200_PP_TXOFFSET_4:  	case R200_PP_TXOFFSET_5:  		i = (reg - R200_PP_TXOFFSET_0) / 24; -		r = r100_cs_packet_next_reloc(p, &reloc); +		r = radeon_cs_packet_next_reloc(p, &reloc, 0);  		if (r) {  			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",  				  idx, reg); -			r100_cs_dump_packet(p, pkt); +			radeon_cs_dump_packet(p, pkt);  			return r;  		} -		ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); +		if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { +			if (reloc->tiling_flags & RADEON_TILING_MACRO) +				tile_flags |= R200_TXO_MACRO_TILE; +			if (reloc->tiling_flags & RADEON_TILING_MICRO) +				tile_flags |= R200_TXO_MICRO_TILE; + +			tmp = idx_value & ~(0x7 << 2); +			tmp |= tile_flags; +			ib[idx] = tmp + ((u32)reloc->gpu_offset); +		} else +			ib[idx] = idx_value + ((u32)reloc->gpu_offset);  		track->textures[i].robj = reloc->robj; +		track->tex_dirty = true;  		break;  	case R200_PP_CUBIC_OFFSET_F1_0:  	case R200_PP_CUBIC_OFFSET_F2_0: @@ -247,42 +260,50 @@ int r200_packet0_check(struct radeon_cs_parser *p,  	case R200_PP_CUBIC_OFFSET_F5_5:  		i = (reg - R200_PP_TXOFFSET_0) / 24;  		face = (reg - ((i * 24) + R200_PP_TXOFFSET_0)) / 4; -		r = r100_cs_packet_next_reloc(p, &reloc); +		r = radeon_cs_packet_next_reloc(p, &reloc, 0);  		if (r) {  			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",  				  idx, reg); -			r100_cs_dump_packet(p, pkt); +			radeon_cs_dump_packet(p, pkt);  			return r;  		}  		track->textures[i].cube_info[face - 1].offset = idx_value; -		ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); +		ib[idx] = idx_value + ((u32)reloc->gpu_offset);  		track->textures[i].cube_info[face - 1].robj = reloc->robj; +		track->tex_dirty = true;  		break;  	case RADEON_RE_WIDTH_HEIGHT:  		track->maxy = ((idx_value >> 16) & 0x7FF); +		track->cb_dirty = true; +		track->zb_dirty = true;  		break;  	case RADEON_RB3D_COLORPITCH: -		r = r100_cs_packet_next_reloc(p, &reloc); +		r = radeon_cs_packet_next_reloc(p, &reloc, 0);  		if (r) {  			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",  				  idx, reg); -			r100_cs_dump_packet(p, pkt); +			radeon_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; +		if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { +			if (reloc->tiling_flags & RADEON_TILING_MACRO) +				tile_flags |= RADEON_COLOR_TILE_ENABLE; +			if (reloc->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;  		break;  	case RADEON_RB3D_DEPTHPITCH:  		track->zb.pitch = idx_value & RADEON_DEPTHPITCH_MASK; +		track->zb_dirty = true;  		break;  	case RADEON_RB3D_CNTL:  		switch ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) { @@ -312,6 +333,8 @@ int r200_packet0_check(struct radeon_cs_parser *p,  		}  		track->z_enabled = !!(idx_value & RADEON_Z_ENABLE); +		track->cb_dirty = true; +		track->zb_dirty = true;  		break;  	case RADEON_RB3D_ZSTENCILCNTL:  		switch (idx_value & 0xf) { @@ -329,22 +352,24 @@ int r200_packet0_check(struct radeon_cs_parser *p,  		default:  			break;  		} +		track->zb_dirty = true;  		break;  	case RADEON_RB3D_ZPASS_ADDR: -		r = r100_cs_packet_next_reloc(p, &reloc); +		r = radeon_cs_packet_next_reloc(p, &reloc, 0);  		if (r) {  			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",  				  idx, reg); -			r100_cs_dump_packet(p, pkt); +			radeon_cs_dump_packet(p, pkt);  			return r;  		} -		ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); +		ib[idx] = idx_value + ((u32)reloc->gpu_offset);  		break;  	case RADEON_PP_CNTL:  		{  			uint32_t temp = idx_value >> 4;  			for (i = 0; i < track->num_texture; i++)  				track->textures[i].enabled = !!(temp & (1 << i)); +			track->tex_dirty = true;  		}  		break;  	case RADEON_SE_VF_CNTL: @@ -369,6 +394,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,  		i = (reg - R200_PP_TXSIZE_0) / 32;  		track->textures[i].width = (idx_value & RADEON_TEX_USIZE_MASK) + 1;  		track->textures[i].height = ((idx_value & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1; +		track->tex_dirty = true;  		break;  	case R200_PP_TXPITCH_0:  	case R200_PP_TXPITCH_1: @@ -378,6 +404,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,  	case R200_PP_TXPITCH_5:  		i = (reg - R200_PP_TXPITCH_0) / 32;  		track->textures[i].pitch = idx_value + 32; +		track->tex_dirty = true;  		break;  	case R200_PP_TXFILTER_0:  	case R200_PP_TXFILTER_1: @@ -394,6 +421,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,  		tmp = (idx_value >> 27) & 0x7;  		if (tmp == 2 || tmp == 6)  			track->textures[i].roundup_h = false; +		track->tex_dirty = true;  		break;  	case R200_PP_TXMULTI_CTL_0:  	case R200_PP_TXMULTI_CTL_1: @@ -432,6 +460,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,  			track->textures[i].tex_coord_type = 1;  			break;  		} +		track->tex_dirty = true;  		break;  	case R200_PP_TXFORMAT_0:  	case R200_PP_TXFORMAT_1: @@ -488,6 +517,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,  		}  		track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf);  		track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf); +		track->tex_dirty = true;  		break;  	case R200_PP_CUBIC_FACES_0:  	case R200_PP_CUBIC_FACES_1: @@ -501,6 +531,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,  			track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf);  			track->textures[i].cube_info[face].height = 1 << ((tmp >> ((face * 8) + 4)) & 0xf);  		} +		track->tex_dirty = true;  		break;  	default:  		printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n",  | 
