aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorXiangliang Yu <Xiangliang.Yu@amd.com>2017-01-12 02:14:36 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-01-27 11:13:25 -0500
commit3149d9da12263b696d6123f90e44968ebde2115d (patch)
treed72701f0fec1914431e9a10adff0aaddefd533e7 /drivers/gpu/drm
parentab71ac56f6d832443fcd9f884460263b2dc3ff6b (diff)
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: Xiangliang Yu <Xiangliang.Yu@amd.com> Signed-off-by: Monk Liu <Monk.Liu@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c10
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c6
2 files changed, 15 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 6eabeaaa3c30..e0fcfea99328 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1345,6 +1345,12 @@ static int amdgpu_early_init(struct amdgpu_device *adev)
1345 return -EINVAL; 1345 return -EINVAL;
1346 } 1346 }
1347 1347
1348 if (amdgpu_sriov_vf(adev)) {
1349 r = amdgpu_virt_request_full_gpu(adev, true);
1350 if (r)
1351 return r;
1352 }
1353
1348 for (i = 0; i < adev->num_ip_blocks; i++) { 1354 for (i = 0; i < adev->num_ip_blocks; i++) {
1349 if ((amdgpu_ip_block_mask & (1 << i)) == 0) { 1355 if ((amdgpu_ip_block_mask & (1 << i)) == 0) {
1350 DRM_ERROR("disabled ip block: %d\n", i); 1356 DRM_ERROR("disabled ip block: %d\n", i);
@@ -1547,8 +1553,10 @@ static int amdgpu_fini(struct amdgpu_device *adev)
1547 adev->ip_blocks[i].status.late_initialized = false; 1553 adev->ip_blocks[i].status.late_initialized = false;
1548 } 1554 }
1549 1555
1550 if (amdgpu_sriov_vf(adev)) 1556 if (amdgpu_sriov_vf(adev)) {
1551 amdgpu_bo_free_kernel(&adev->virt.csa_obj, &adev->virt.csa_vmid0_addr, NULL); 1557 amdgpu_bo_free_kernel(&adev->virt.csa_obj, &adev->virt.csa_vmid0_addr, NULL);
1558 amdgpu_virt_release_full_gpu(adev, false);
1559 }
1552 1560
1553 return 0; 1561 return 0;
1554} 1562}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 8f852cb152f5..61d94c745672 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -60,6 +60,9 @@ void amdgpu_driver_unload_kms(struct drm_device *dev)
60 if (adev->rmmio == NULL) 60 if (adev->rmmio == NULL)
61 goto done_free; 61 goto done_free;
62 62
63 if (amdgpu_sriov_vf(adev))
64 amdgpu_virt_request_full_gpu(adev, false);
65
63 if (amdgpu_device_is_px(dev)) { 66 if (amdgpu_device_is_px(dev)) {
64 pm_runtime_get_sync(dev->dev); 67 pm_runtime_get_sync(dev->dev);
65 pm_runtime_forbid(dev->dev); 68 pm_runtime_forbid(dev->dev);
@@ -138,6 +141,9 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)
138 pm_runtime_put_autosuspend(dev->dev); 141 pm_runtime_put_autosuspend(dev->dev);
139 } 142 }
140 143
144 if (amdgpu_sriov_vf(adev))
145 amdgpu_virt_release_full_gpu(adev, true);
146
141out: 147out:
142 if (r) { 148 if (r) {
143 /* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */ 149 /* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */