diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 66 | 
1 files changed, 27 insertions, 39 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c index 2badbc0355f2..495c3d7bb2b2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c @@ -42,6 +42,8 @@  #define FIRMWARE_NAVI10 	"amdgpu/navi10_vcn.bin"  #define FIRMWARE_NAVI14 	"amdgpu/navi14_vcn.bin"  #define FIRMWARE_NAVI12 	"amdgpu/navi12_vcn.bin" +#define FIRMWARE_SIENNA_CICHLID 	"amdgpu/sienna_cichlid_vcn.bin" +#define FIRMWARE_NAVY_FLOUNDER 	"amdgpu/navy_flounder_vcn.bin"  MODULE_FIRMWARE(FIRMWARE_RAVEN);  MODULE_FIRMWARE(FIRMWARE_PICASSO); @@ -51,12 +53,14 @@ MODULE_FIRMWARE(FIRMWARE_RENOIR);  MODULE_FIRMWARE(FIRMWARE_NAVI10);  MODULE_FIRMWARE(FIRMWARE_NAVI14);  MODULE_FIRMWARE(FIRMWARE_NAVI12); +MODULE_FIRMWARE(FIRMWARE_SIENNA_CICHLID); +MODULE_FIRMWARE(FIRMWARE_NAVY_FLOUNDER);  static void amdgpu_vcn_idle_work_handler(struct work_struct *work);  int amdgpu_vcn_sw_init(struct amdgpu_device *adev)  { -	unsigned long bo_size, fw_shared_bo_size; +	unsigned long bo_size;  	const char *fw_name;  	const struct common_firmware_header *hdr;  	unsigned char fw_check; @@ -107,6 +111,18 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)  		    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))  			adev->vcn.indirect_sram = true;  		break; +	case CHIP_SIENNA_CICHLID: +		fw_name = FIRMWARE_SIENNA_CICHLID; +		if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && +		    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) +			adev->vcn.indirect_sram = true; +		break; +	case CHIP_NAVY_FLOUNDER: +		fw_name = FIRMWARE_NAVY_FLOUNDER; +		if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && +		    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) +			adev->vcn.indirect_sram = true; +		break;  	default:  		return -EINVAL;  	} @@ -160,6 +176,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)  	bo_size = AMDGPU_VCN_STACK_SIZE + AMDGPU_VCN_CONTEXT_SIZE;  	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)  		bo_size += AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8); +	bo_size += AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_fw_shared));  	for (i = 0; i < adev->vcn.num_vcn_inst; i++) {  		if (adev->vcn.harvest_config & (1 << i)) @@ -173,6 +190,11 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)  			return r;  		} +		adev->vcn.inst[i].fw_shared_cpu_addr = adev->vcn.inst[i].cpu_addr + +				bo_size - AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_fw_shared)); +		adev->vcn.inst[i].fw_shared_gpu_addr = adev->vcn.inst[i].gpu_addr + +				bo_size - AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_fw_shared)); +  		if (adev->vcn.indirect_sram) {  			r = amdgpu_bo_create_kernel(adev, 64 * 2 * 4, PAGE_SIZE,  					AMDGPU_GEM_DOMAIN_VRAM, &adev->vcn.inst[i].dpg_sram_bo, @@ -182,17 +204,6 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)  				return r;  			}  		} - -		r = amdgpu_bo_create_kernel(adev, AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_fw_shared)), -				PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM, &adev->vcn.inst[i].fw_shared_bo, -				&adev->vcn.inst[i].fw_shared_gpu_addr, &adev->vcn.inst[i].fw_shared_cpu_addr); -		if (r) { -			dev_err(adev->dev, "VCN %d (%d) failed to allocate firmware shared bo\n", i, r); -			return r; -		} - -		fw_shared_bo_size = amdgpu_bo_size(adev->vcn.inst[i].fw_shared_bo); -		adev->vcn.inst[i].saved_shm_bo = kvmalloc(fw_shared_bo_size, GFP_KERNEL);  	}  	return 0; @@ -208,11 +219,6 @@ int amdgpu_vcn_sw_fini(struct amdgpu_device *adev)  		if (adev->vcn.harvest_config & (1 << j))  			continue; -		kvfree(adev->vcn.inst[j].saved_shm_bo); -		amdgpu_bo_free_kernel(&adev->vcn.inst[j].fw_shared_bo, -					  &adev->vcn.inst[j].fw_shared_gpu_addr, -					  (void **)&adev->vcn.inst[j].fw_shared_cpu_addr); -  		if (adev->vcn.indirect_sram) {  			amdgpu_bo_free_kernel(&adev->vcn.inst[j].dpg_sram_bo,  						  &adev->vcn.inst[j].dpg_sram_gpu_addr, @@ -258,17 +264,6 @@ int amdgpu_vcn_suspend(struct amdgpu_device *adev)  			return -ENOMEM;  		memcpy_fromio(adev->vcn.inst[i].saved_bo, ptr, size); - -		if (adev->vcn.inst[i].fw_shared_bo == NULL) -			return 0; - -		if (!adev->vcn.inst[i].saved_shm_bo) -			return -ENOMEM; - -		size = amdgpu_bo_size(adev->vcn.inst[i].fw_shared_bo); -		ptr = adev->vcn.inst[i].fw_shared_cpu_addr; - -		memcpy_fromio(adev->vcn.inst[i].saved_shm_bo, ptr, size);  	}  	return 0;  } @@ -306,17 +301,6 @@ int amdgpu_vcn_resume(struct amdgpu_device *adev)  			}  			memset_io(ptr, 0, size);  		} - -		if (adev->vcn.inst[i].fw_shared_bo == NULL) -			return -EINVAL; - -		size = amdgpu_bo_size(adev->vcn.inst[i].fw_shared_bo); -		ptr = adev->vcn.inst[i].fw_shared_cpu_addr; - -		if (adev->vcn.inst[i].saved_shm_bo != NULL) -			memcpy_toio(ptr, adev->vcn.inst[i].saved_shm_bo, size); -		else -			memset_io(ptr, 0, size);  	}  	return 0;  } @@ -413,6 +397,10 @@ int amdgpu_vcn_dec_ring_test_ring(struct amdgpu_ring *ring)  	unsigned i;  	int r; +	/* VCN in SRIOV does not support direct register read/write */ +	if (amdgpu_sriov_vf(adev)) +		return 0; +  	WREG32(adev->vcn.inst[ring->me].external.scratch9, 0xCAFEDEAD);  	r = amdgpu_ring_alloc(ring, 3);  	if (r) | 
