diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 66 | 
1 files changed, 43 insertions, 23 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c index 04cf9b207e62..894444ab0032 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c @@ -283,17 +283,15 @@ static int amdgpu_virt_init_ras_err_handler_data(struct amdgpu_device *adev)  	*data = kmalloc(sizeof(struct amdgpu_virt_ras_err_handler_data), GFP_KERNEL);  	if (!*data) -		return -ENOMEM; +		goto data_failure;  	bps = kmalloc_array(align_space, sizeof((*data)->bps), GFP_KERNEL); -	bps_bo = kmalloc_array(align_space, sizeof((*data)->bps_bo), GFP_KERNEL); +	if (!bps) +		goto bps_failure; -	if (!bps || !bps_bo) { -		kfree(bps); -		kfree(bps_bo); -		kfree(*data); -		return -ENOMEM; -	} +	bps_bo = kmalloc_array(align_space, sizeof((*data)->bps_bo), GFP_KERNEL); +	if (!bps_bo) +		goto bps_bo_failure;  	(*data)->bps = bps;  	(*data)->bps_bo = bps_bo; @@ -303,6 +301,13 @@ static int amdgpu_virt_init_ras_err_handler_data(struct amdgpu_device *adev)  	virt->ras_init_done = true;  	return 0; + +bps_bo_failure: +	kfree(bps); +bps_failure: +	kfree(*data); +data_failure: +	return -ENOMEM;  }  static void amdgpu_virt_ras_release_bp(struct amdgpu_device *adev) @@ -548,7 +553,6 @@ static void amdgpu_virt_populate_vf2pf_ucode_info(struct amdgpu_device *adev)  static int amdgpu_virt_write_vf2pf_data(struct amdgpu_device *adev)  {  	struct amd_sriov_msg_vf2pf_info *vf2pf_info; -	struct ttm_resource_manager *vram_man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM);  	vf2pf_info = (struct amd_sriov_msg_vf2pf_info *) adev->virt.fw_reserve.p_vf2pf; @@ -571,8 +575,8 @@ static int amdgpu_virt_write_vf2pf_data(struct amdgpu_device *adev)  	vf2pf_info->driver_cert = 0;  	vf2pf_info->os_info.all = 0; -	vf2pf_info->fb_usage = amdgpu_vram_mgr_usage(vram_man) >> 20; -	vf2pf_info->fb_vis_usage = amdgpu_vram_mgr_vis_usage(vram_man) >> 20; +	vf2pf_info->fb_usage = amdgpu_vram_mgr_usage(&adev->mman.vram_mgr) >> 20; +	vf2pf_info->fb_vis_usage = amdgpu_vram_mgr_vis_usage(&adev->mman.vram_mgr) >> 20;  	vf2pf_info->fb_size = adev->gmc.real_vram_size >> 20;  	vf2pf_info->fb_vis_size = adev->gmc.visible_vram_size >> 20; @@ -617,19 +621,37 @@ void amdgpu_virt_fini_data_exchange(struct amdgpu_device *adev)  void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev)  { -	uint64_t bp_block_offset = 0; -	uint32_t bp_block_size = 0; -	struct amd_sriov_msg_pf2vf_info *pf2vf_v2 = NULL; -  	adev->virt.fw_reserve.p_pf2vf = NULL;  	adev->virt.fw_reserve.p_vf2pf = NULL;  	adev->virt.vf2pf_update_interval_ms = 0; -	if (adev->mman.fw_vram_usage_va != NULL) { +	if (adev->bios != NULL) {  		adev->virt.vf2pf_update_interval_ms = 2000;  		adev->virt.fw_reserve.p_pf2vf =  			(struct amd_sriov_msg_pf2vf_info_header *) +			(adev->bios + (AMD_SRIOV_MSG_PF2VF_OFFSET_KB << 10)); + +		amdgpu_virt_read_pf2vf_data(adev); +	} + +	if (adev->virt.vf2pf_update_interval_ms != 0) { +		INIT_DELAYED_WORK(&adev->virt.vf2pf_work, amdgpu_virt_update_vf2pf_work_item); +		schedule_delayed_work(&(adev->virt.vf2pf_work), msecs_to_jiffies(adev->virt.vf2pf_update_interval_ms)); +	} +} + + +void amdgpu_virt_exchange_data(struct amdgpu_device *adev) +{ +	uint64_t bp_block_offset = 0; +	uint32_t bp_block_size = 0; +	struct amd_sriov_msg_pf2vf_info *pf2vf_v2 = NULL; + +	if (adev->mman.fw_vram_usage_va != NULL) { + +		adev->virt.fw_reserve.p_pf2vf = +			(struct amd_sriov_msg_pf2vf_info_header *)  			(adev->mman.fw_vram_usage_va + (AMD_SRIOV_MSG_PF2VF_OFFSET_KB << 10));  		adev->virt.fw_reserve.p_vf2pf =  			(struct amd_sriov_msg_vf2pf_info_header *) @@ -658,16 +680,10 @@ void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev)  			(adev->bios + (AMD_SRIOV_MSG_PF2VF_OFFSET_KB << 10));  		amdgpu_virt_read_pf2vf_data(adev); - -		return; -	} - -	if (adev->virt.vf2pf_update_interval_ms != 0) { -		INIT_DELAYED_WORK(&adev->virt.vf2pf_work, amdgpu_virt_update_vf2pf_work_item); -		schedule_delayed_work(&(adev->virt.vf2pf_work), adev->virt.vf2pf_update_interval_ms);  	}  } +  void amdgpu_detect_virtualization(struct amdgpu_device *adev)  {  	uint32_t reg; @@ -710,6 +726,10 @@ void amdgpu_detect_virtualization(struct amdgpu_device *adev)  			vi_set_virt_ops(adev);  			break;  		case CHIP_VEGA10: +			soc15_set_virt_ops(adev); +			/* send a dummy GPU_INIT_DATA request to host on vega10 */ +			amdgpu_virt_request_init_data(adev); +			break;  		case CHIP_VEGA20:  		case CHIP_ARCTURUS:  		case CHIP_ALDEBARAN:  |