Commit 3149d9da authored by Xiangliang Yu's avatar Xiangliang Yu Committed by Alex Deucher
Browse files

drm/amdgpu: request/release full gpu access if device is vf



For gpu vf device, first need to request full gpu access before
accessing gpu registers, and release full gpu access after the
access is done.

Signed-off-by: default avatarXiangliang Yu <Xiangliang.Yu@amd.com>
Signed-off-by: default avatarMonk Liu <Monk.Liu@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent ab71ac56
Loading
Loading
Loading
Loading
+9 −1
Original line number Original line Diff line number Diff line
@@ -1345,6 +1345,12 @@ static int amdgpu_early_init(struct amdgpu_device *adev)
		return -EINVAL;
		return -EINVAL;
	}
	}


	if (amdgpu_sriov_vf(adev)) {
		r = amdgpu_virt_request_full_gpu(adev, true);
		if (r)
			return r;
	}

	for (i = 0; i < adev->num_ip_blocks; i++) {
	for (i = 0; i < adev->num_ip_blocks; i++) {
		if ((amdgpu_ip_block_mask & (1 << i)) == 0) {
		if ((amdgpu_ip_block_mask & (1 << i)) == 0) {
			DRM_ERROR("disabled ip block: %d\n", i);
			DRM_ERROR("disabled ip block: %d\n", i);
@@ -1547,8 +1553,10 @@ static int amdgpu_fini(struct amdgpu_device *adev)
		adev->ip_blocks[i].status.late_initialized = false;
		adev->ip_blocks[i].status.late_initialized = false;
	}
	}


	if (amdgpu_sriov_vf(adev))
	if (amdgpu_sriov_vf(adev)) {
		amdgpu_bo_free_kernel(&adev->virt.csa_obj, &adev->virt.csa_vmid0_addr, NULL);
		amdgpu_bo_free_kernel(&adev->virt.csa_obj, &adev->virt.csa_vmid0_addr, NULL);
		amdgpu_virt_release_full_gpu(adev, false);
	}


	return 0;
	return 0;
}
}
+6 −0
Original line number Original line Diff line number Diff line
@@ -60,6 +60,9 @@ void amdgpu_driver_unload_kms(struct drm_device *dev)
	if (adev->rmmio == NULL)
	if (adev->rmmio == NULL)
		goto done_free;
		goto done_free;


	if (amdgpu_sriov_vf(adev))
		amdgpu_virt_request_full_gpu(adev, false);

	if (amdgpu_device_is_px(dev)) {
	if (amdgpu_device_is_px(dev)) {
		pm_runtime_get_sync(dev->dev);
		pm_runtime_get_sync(dev->dev);
		pm_runtime_forbid(dev->dev);
		pm_runtime_forbid(dev->dev);
@@ -138,6 +141,9 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)
		pm_runtime_put_autosuspend(dev->dev);
		pm_runtime_put_autosuspend(dev->dev);
	}
	}


	if (amdgpu_sriov_vf(adev))
		amdgpu_virt_release_full_gpu(adev, true);

out:
out:
	if (r) {
	if (r) {
		/* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */
		/* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */