aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
index 6738df836a70..e7dfb7b44b4b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
@@ -24,6 +24,14 @@
24#include "amdgpu.h" 24#include "amdgpu.h"
25#define MAX_KIQ_REG_WAIT 100000000 /* in usecs */ 25#define MAX_KIQ_REG_WAIT 100000000 /* in usecs */
26 26
27bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev)
28{
29 /* By now all MMIO pages except mailbox are blocked */
30 /* if blocking is enabled in hypervisor. Choose the */
31 /* SCRATCH_REG0 to test. */
32 return RREG32_NO_KIQ(0xc040) == 0xffffffff;
33}
34
27int amdgpu_allocate_static_csa(struct amdgpu_device *adev) 35int amdgpu_allocate_static_csa(struct amdgpu_device *adev)
28{ 36{
29 int r; 37 int r;
@@ -39,6 +47,12 @@ int amdgpu_allocate_static_csa(struct amdgpu_device *adev)
39 return 0; 47 return 0;
40} 48}
41 49
50void amdgpu_free_static_csa(struct amdgpu_device *adev) {
51 amdgpu_bo_free_kernel(&adev->virt.csa_obj,
52 &adev->virt.csa_vmid0_addr,
53 NULL);
54}
55
42/* 56/*
43 * amdgpu_map_static_csa should be called during amdgpu_vm_init 57 * amdgpu_map_static_csa should be called during amdgpu_vm_init
44 * it maps virtual address "AMDGPU_VA_RESERVED_SIZE - AMDGPU_CSA_SIZE" 58 * it maps virtual address "AMDGPU_VA_RESERVED_SIZE - AMDGPU_CSA_SIZE"
@@ -107,8 +121,6 @@ void amdgpu_virt_init_setting(struct amdgpu_device *adev)
107 adev->enable_virtual_display = true; 121 adev->enable_virtual_display = true;
108 adev->cg_flags = 0; 122 adev->cg_flags = 0;
109 adev->pg_flags = 0; 123 adev->pg_flags = 0;
110
111 mutex_init(&adev->virt.lock_reset);
112} 124}
113 125
114uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg) 126uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg)
@@ -228,6 +240,22 @@ int amdgpu_virt_reset_gpu(struct amdgpu_device *adev)
228} 240}
229 241
230/** 242/**
243 * amdgpu_virt_wait_reset() - wait for reset gpu completed
244 * @amdgpu: amdgpu device.
245 * Wait for GPU reset completed.
246 * Return: Zero if reset success, otherwise will return error.
247 */
248int amdgpu_virt_wait_reset(struct amdgpu_device *adev)
249{
250 struct amdgpu_virt *virt = &adev->virt;
251
252 if (!virt->ops || !virt->ops->wait_reset)
253 return -EINVAL;
254
255 return virt->ops->wait_reset(adev);
256}
257
258/**
231 * amdgpu_virt_alloc_mm_table() - alloc memory for mm table 259 * amdgpu_virt_alloc_mm_table() - alloc memory for mm table
232 * @amdgpu: amdgpu device. 260 * @amdgpu: amdgpu device.
233 * MM table is used by UVD and VCE for its initialization 261 * MM table is used by UVD and VCE for its initialization
@@ -296,7 +324,6 @@ int amdgpu_virt_fw_reserve_get_checksum(void *obj,
296 324
297void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev) 325void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev)
298{ 326{
299 uint32_t pf2vf_ver = 0;
300 uint32_t pf2vf_size = 0; 327 uint32_t pf2vf_size = 0;
301 uint32_t checksum = 0; 328 uint32_t checksum = 0;
302 uint32_t checkval; 329 uint32_t checkval;
@@ -309,9 +336,9 @@ void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev)
309 adev->virt.fw_reserve.p_pf2vf = 336 adev->virt.fw_reserve.p_pf2vf =
310 (struct amdgim_pf2vf_info_header *)( 337 (struct amdgim_pf2vf_info_header *)(
311 adev->fw_vram_usage.va + AMDGIM_DATAEXCHANGE_OFFSET); 338 adev->fw_vram_usage.va + AMDGIM_DATAEXCHANGE_OFFSET);
312 pf2vf_ver = adev->virt.fw_reserve.p_pf2vf->version;
313 AMDGPU_FW_VRAM_PF2VF_READ(adev, header.size, &pf2vf_size); 339 AMDGPU_FW_VRAM_PF2VF_READ(adev, header.size, &pf2vf_size);
314 AMDGPU_FW_VRAM_PF2VF_READ(adev, checksum, &checksum); 340 AMDGPU_FW_VRAM_PF2VF_READ(adev, checksum, &checksum);
341 AMDGPU_FW_VRAM_PF2VF_READ(adev, feature_flags, &adev->virt.gim_feature);
315 342
316 /* pf2vf message must be in 4K */ 343 /* pf2vf message must be in 4K */
317 if (pf2vf_size > 0 && pf2vf_size < 4096) { 344 if (pf2vf_size > 0 && pf2vf_size < 4096) {