diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 35 |
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 | ||
27 | bool 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 | |||
27 | int amdgpu_allocate_static_csa(struct amdgpu_device *adev) | 35 | int 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 | ||
50 | void 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 | ||
114 | uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg) | 126 | uint32_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 | */ | ||
248 | int 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 | ||
297 | void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev) | 325 | void 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) { |