diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 22 | 
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c index 36b55d2bd51a..f4963330c772 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c @@ -58,6 +58,7 @@  #define FIRMWARE_VCN4_0_2		"amdgpu/vcn_4_0_2.bin"  #define FIRMWARE_VCN4_0_3		"amdgpu/vcn_4_0_3.bin"  #define FIRMWARE_VCN4_0_4		"amdgpu/vcn_4_0_4.bin" +#define FIRMWARE_VCN4_0_5		"amdgpu/vcn_4_0_5.bin"  MODULE_FIRMWARE(FIRMWARE_RAVEN);  MODULE_FIRMWARE(FIRMWARE_PICASSO); @@ -80,6 +81,7 @@ MODULE_FIRMWARE(FIRMWARE_VCN4_0_0);  MODULE_FIRMWARE(FIRMWARE_VCN4_0_2);  MODULE_FIRMWARE(FIRMWARE_VCN4_0_3);  MODULE_FIRMWARE(FIRMWARE_VCN4_0_4); +MODULE_FIRMWARE(FIRMWARE_VCN4_0_5);  static void amdgpu_vcn_idle_work_handler(struct work_struct *work); @@ -124,7 +126,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)  	 * Hence, check for these versions here - notice this is  	 * restricted to Vangogh (Deck's APU).  	 */ -	if (adev->ip_versions[UVD_HWIP][0] == IP_VERSION(3, 0, 2)) { +	if (amdgpu_ip_version(adev, UVD_HWIP, 0) == IP_VERSION(3, 0, 2)) {  		const char *bios_ver = dmi_get_system_info(DMI_BIOS_VERSION);  		if (bios_ver && (!strncmp("F7A0113", bios_ver, 7) || @@ -169,7 +171,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)  	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)  		bo_size += AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8); -	if (adev->ip_versions[UVD_HWIP][0] >= IP_VERSION(4, 0, 0)) { +	if (amdgpu_ip_version(adev, UVD_HWIP, 0) >= IP_VERSION(4, 0, 0)) {  		fw_shared_size = AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_vcn4_fw_shared));  		log_offset = offsetof(struct amdgpu_vcn4_fw_shared, fw_log);  	} else { @@ -265,7 +267,7 @@ static bool amdgpu_vcn_using_unified_queue(struct amdgpu_ring *ring)  	struct amdgpu_device *adev = ring->adev;  	bool ret = false; -	if (adev->ip_versions[UVD_HWIP][0] >= IP_VERSION(4, 0, 0)) +	if (amdgpu_ip_version(adev, UVD_HWIP, 0) >= IP_VERSION(4, 0, 0))  		ret = true;  	return ret; @@ -292,8 +294,15 @@ int amdgpu_vcn_suspend(struct amdgpu_device *adev)  	void *ptr;  	int i, idx; +	bool in_ras_intr = amdgpu_ras_intr_triggered(); +  	cancel_delayed_work_sync(&adev->vcn.idle_work); +	/* err_event_athub will corrupt VCPU buffer, so we need to +	 * restore fw data and clear buffer in amdgpu_vcn_resume() */ +	if (in_ras_intr) +		return 0; +  	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {  		if (adev->vcn.harvest_config & (1 << i))  			continue; @@ -996,7 +1005,7 @@ int amdgpu_vcn_unified_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	struct amdgpu_device *adev = ring->adev;  	long r; -	if (adev->ip_versions[UVD_HWIP][0] != IP_VERSION(4, 0, 3)) { +	if (amdgpu_ip_version(adev, UVD_HWIP, 0) != IP_VERSION(4, 0, 3)) {  		r = amdgpu_vcn_enc_ring_test_ib(ring, timeout);  		if (r)  			goto error; @@ -1046,7 +1055,8 @@ void amdgpu_vcn_setup_ucode(struct amdgpu_device *adev)  			adev->firmware.fw_size +=  				ALIGN(le32_to_cpu(hdr->ucode_size_bytes), PAGE_SIZE); -			if (adev->ip_versions[UVD_HWIP][0] == IP_VERSION(4, 0, 3)) +			if (amdgpu_ip_version(adev, UVD_HWIP, 0) == +			    IP_VERSION(4, 0, 3))  				break;  		}  		dev_info(adev->dev, "Will use PSP to load VCN firmware\n"); @@ -1087,7 +1097,7 @@ static ssize_t amdgpu_debugfs_vcn_fwlog_read(struct file *f, char __user *buf,  	if (write_pos > read_pos) {  		available = write_pos - read_pos; -		read_num[0] = min(size, (size_t)available); +		read_num[0] = min_t(size_t, size, available);  	} else {  		read_num[0] = AMDGPU_VCNFW_LOG_SIZE - read_pos;  		available = read_num[0] + write_pos - plog->header_size;  | 
