diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 117 | 
1 files changed, 61 insertions, 56 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c index 344f711ad144..02cb3a12dd76 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c @@ -34,6 +34,7 @@  #include "amdgpu.h"  #include "amdgpu_pm.h"  #include "amdgpu_vce.h" +#include "amdgpu_cs.h"  #include "cikd.h"  /* 1 second timeout */ @@ -587,8 +588,7 @@ err:  /**   * amdgpu_vce_validate_bo - make sure not to cross 4GB boundary   * - * @p: parser context - * @ib_idx: indirect buffer to use + * @ib: indirect buffer to use   * @lo: address of lower dword   * @hi: address of higher dword   * @size: minimum size @@ -596,8 +596,9 @@ err:   *   * Make sure that no BO cross a 4GB boundary.   */ -static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx, -				  int lo, int hi, unsigned size, int32_t index) +static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, +				  struct amdgpu_ib *ib, int lo, int hi, +				  unsigned size, int32_t index)  {  	int64_t offset = ((uint64_t)size) * ((int64_t)index);  	struct ttm_operation_ctx ctx = { false, false }; @@ -607,8 +608,8 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx,  	uint64_t addr;  	int r; -	addr = ((uint64_t)amdgpu_get_ib_value(p, ib_idx, lo)) | -	       ((uint64_t)amdgpu_get_ib_value(p, ib_idx, hi)) << 32; +	addr = ((uint64_t)amdgpu_ib_get_value(ib, lo)) | +	       ((uint64_t)amdgpu_ib_get_value(ib, hi)) << 32;  	if (index >= 0) {  		addr += offset;  		fpfn = PAGE_ALIGN(offset) >> PAGE_SHIFT; @@ -638,7 +639,7 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx,   * amdgpu_vce_cs_reloc - command submission relocation   *   * @p: parser context - * @ib_idx: indirect buffer to use + * @ib: indirect buffer to use   * @lo: address of lower dword   * @hi: address of higher dword   * @size: minimum size @@ -646,7 +647,7 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx,   *   * Patch relocation inside command stream with real buffer address   */ -static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, uint32_t ib_idx, +static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, struct amdgpu_ib *ib,  			       int lo, int hi, unsigned size, uint32_t index)  {  	struct amdgpu_bo_va_mapping *mapping; @@ -657,8 +658,8 @@ static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, uint32_t ib_idx,  	if (index == 0xffffffff)  		index = 0; -	addr = ((uint64_t)amdgpu_get_ib_value(p, ib_idx, lo)) | -	       ((uint64_t)amdgpu_get_ib_value(p, ib_idx, hi)) << 32; +	addr = ((uint64_t)amdgpu_ib_get_value(ib, lo)) | +	       ((uint64_t)amdgpu_ib_get_value(ib, hi)) << 32;  	addr += ((uint64_t)size) * ((uint64_t)index);  	r = amdgpu_cs_find_mapping(p, addr, &bo, &mapping); @@ -679,8 +680,8 @@ static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, uint32_t ib_idx,  	addr += amdgpu_bo_gpu_offset(bo);  	addr -= ((uint64_t)size) * ((uint64_t)index); -	amdgpu_set_ib_value(p, ib_idx, lo, lower_32_bits(addr)); -	amdgpu_set_ib_value(p, ib_idx, hi, upper_32_bits(addr)); +	amdgpu_ib_set_value(ib, lo, lower_32_bits(addr)); +	amdgpu_ib_set_value(ib, hi, upper_32_bits(addr));  	return 0;  } @@ -729,11 +730,13 @@ static int amdgpu_vce_validate_handle(struct amdgpu_cs_parser *p,   * amdgpu_vce_ring_parse_cs - parse and validate the command stream   *   * @p: parser context - * @ib_idx: indirect buffer to use + * @job: the job to parse + * @ib: the IB to patch   */ -int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx) +int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, +			     struct amdgpu_job *job, +			     struct amdgpu_ib *ib)  { -	struct amdgpu_ib *ib = &p->job->ibs[ib_idx];  	unsigned fb_idx = 0, bs_idx = 0;  	int session_idx = -1;  	uint32_t destroyed = 0; @@ -744,12 +747,12 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)  	unsigned idx;  	int i, r = 0; -	p->job->vm = NULL; +	job->vm = NULL;  	ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo);  	for (idx = 0; idx < ib->length_dw;) { -		uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx); -		uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1); +		uint32_t len = amdgpu_ib_get_value(ib, idx); +		uint32_t cmd = amdgpu_ib_get_value(ib, idx + 1);  		if ((len < 8) || (len & 3)) {  			DRM_ERROR("invalid VCE command length (%d)!\n", len); @@ -759,52 +762,52 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)  		switch (cmd) {  		case 0x00000002: /* task info */ -			fb_idx = amdgpu_get_ib_value(p, ib_idx, idx + 6); -			bs_idx = amdgpu_get_ib_value(p, ib_idx, idx + 7); +			fb_idx = amdgpu_ib_get_value(ib, idx + 6); +			bs_idx = amdgpu_ib_get_value(ib, idx + 7);  			break;  		case 0x03000001: /* encode */ -			r = amdgpu_vce_validate_bo(p, ib_idx, idx + 10, -						   idx + 9, 0, 0); +			r = amdgpu_vce_validate_bo(p, ib, idx + 10, idx + 9, +						   0, 0);  			if (r)  				goto out; -			r = amdgpu_vce_validate_bo(p, ib_idx, idx + 12, -						   idx + 11, 0, 0); +			r = amdgpu_vce_validate_bo(p, ib, idx + 12, idx + 11, +						   0, 0);  			if (r)  				goto out;  			break;  		case 0x05000001: /* context buffer */ -			r = amdgpu_vce_validate_bo(p, ib_idx, idx + 3, -						   idx + 2, 0, 0); +			r = amdgpu_vce_validate_bo(p, ib, idx + 3, idx + 2, +						   0, 0);  			if (r)  				goto out;  			break;  		case 0x05000004: /* video bitstream buffer */ -			tmp = amdgpu_get_ib_value(p, ib_idx, idx + 4); -			r = amdgpu_vce_validate_bo(p, ib_idx, idx + 3, idx + 2, +			tmp = amdgpu_ib_get_value(ib, idx + 4); +			r = amdgpu_vce_validate_bo(p, ib, idx + 3, idx + 2,  						   tmp, bs_idx);  			if (r)  				goto out;  			break;  		case 0x05000005: /* feedback buffer */ -			r = amdgpu_vce_validate_bo(p, ib_idx, idx + 3, idx + 2, +			r = amdgpu_vce_validate_bo(p, ib, idx + 3, idx + 2,  						   4096, fb_idx);  			if (r)  				goto out;  			break;  		case 0x0500000d: /* MV buffer */ -			r = amdgpu_vce_validate_bo(p, ib_idx, idx + 3, -							idx + 2, 0, 0); +			r = amdgpu_vce_validate_bo(p, ib, idx + 3, idx + 2, +						   0, 0);  			if (r)  				goto out; -			r = amdgpu_vce_validate_bo(p, ib_idx, idx + 8, -							idx + 7, 0, 0); +			r = amdgpu_vce_validate_bo(p, ib, idx + 8, idx + 7, +						   0, 0);  			if (r)  				goto out;  			break; @@ -814,12 +817,12 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)  	}  	for (idx = 0; idx < ib->length_dw;) { -		uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx); -		uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1); +		uint32_t len = amdgpu_ib_get_value(ib, idx); +		uint32_t cmd = amdgpu_ib_get_value(ib, idx + 1);  		switch (cmd) {  		case 0x00000001: /* session */ -			handle = amdgpu_get_ib_value(p, ib_idx, idx + 2); +			handle = amdgpu_ib_get_value(ib, idx + 2);  			session_idx = amdgpu_vce_validate_handle(p, handle,  								 &allocated);  			if (session_idx < 0) { @@ -830,8 +833,8 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)  			break;  		case 0x00000002: /* task info */ -			fb_idx = amdgpu_get_ib_value(p, ib_idx, idx + 6); -			bs_idx = amdgpu_get_ib_value(p, ib_idx, idx + 7); +			fb_idx = amdgpu_ib_get_value(ib, idx + 6); +			bs_idx = amdgpu_ib_get_value(ib, idx + 7);  			break;  		case 0x01000001: /* create */ @@ -846,8 +849,8 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)  				goto out;  			} -			*size = amdgpu_get_ib_value(p, ib_idx, idx + 8) * -				amdgpu_get_ib_value(p, ib_idx, idx + 10) * +			*size = amdgpu_ib_get_value(ib, idx + 8) * +				amdgpu_ib_get_value(ib, idx + 10) *  				8 * 3 / 2;  			break; @@ -876,12 +879,12 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)  			break;  		case 0x03000001: /* encode */ -			r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 10, idx + 9, +			r = amdgpu_vce_cs_reloc(p, ib, idx + 10, idx + 9,  						*size, 0);  			if (r)  				goto out; -			r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 12, idx + 11, +			r = amdgpu_vce_cs_reloc(p, ib, idx + 12, idx + 11,  						*size / 3, 0);  			if (r)  				goto out; @@ -892,35 +895,35 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)  			break;  		case 0x05000001: /* context buffer */ -			r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 3, idx + 2, +			r = amdgpu_vce_cs_reloc(p, ib, idx + 3, idx + 2,  						*size * 2, 0);  			if (r)  				goto out;  			break;  		case 0x05000004: /* video bitstream buffer */ -			tmp = amdgpu_get_ib_value(p, ib_idx, idx + 4); -			r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 3, idx + 2, +			tmp = amdgpu_ib_get_value(ib, idx + 4); +			r = amdgpu_vce_cs_reloc(p, ib, idx + 3, idx + 2,  						tmp, bs_idx);  			if (r)  				goto out;  			break;  		case 0x05000005: /* feedback buffer */ -			r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 3, idx + 2, +			r = amdgpu_vce_cs_reloc(p, ib, idx + 3, idx + 2,  						4096, fb_idx);  			if (r)  				goto out;  			break;  		case 0x0500000d: /* MV buffer */ -			r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 3, -							idx + 2, *size, 0); +			r = amdgpu_vce_cs_reloc(p, ib, idx + 3, +						idx + 2, *size, 0);  			if (r)  				goto out; -			r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 8, -							idx + 7, *size / 12, 0); +			r = amdgpu_vce_cs_reloc(p, ib, idx + 8, +						idx + 7, *size / 12, 0);  			if (r)  				goto out;  			break; @@ -965,11 +968,13 @@ out:   * amdgpu_vce_ring_parse_cs_vm - parse the command stream in VM mode   *   * @p: parser context - * @ib_idx: indirect buffer to use + * @job: the job to parse + * @ib: the IB to patch   */ -int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx) +int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, +				struct amdgpu_job *job, +				struct amdgpu_ib *ib)  { -	struct amdgpu_ib *ib = &p->job->ibs[ib_idx];  	int session_idx = -1;  	uint32_t destroyed = 0;  	uint32_t created = 0; @@ -978,8 +983,8 @@ int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx)  	int i, r = 0, idx = 0;  	while (idx < ib->length_dw) { -		uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx); -		uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1); +		uint32_t len = amdgpu_ib_get_value(ib, idx); +		uint32_t cmd = amdgpu_ib_get_value(ib, idx + 1);  		if ((len < 8) || (len & 3)) {  			DRM_ERROR("invalid VCE command length (%d)!\n", len); @@ -989,7 +994,7 @@ int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx)  		switch (cmd) {  		case 0x00000001: /* session */ -			handle = amdgpu_get_ib_value(p, ib_idx, idx + 2); +			handle = amdgpu_ib_get_value(ib, idx + 2);  			session_idx = amdgpu_vce_validate_handle(p, handle,  								 &allocated);  			if (session_idx < 0) {  | 
