diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c index ba8b8ae6234f..6bf5cea294f2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | |||
@@ -225,3 +225,49 @@ int amdgpu_virt_reset_gpu(struct amdgpu_device *adev) | |||
225 | 225 | ||
226 | return 0; | 226 | return 0; |
227 | } | 227 | } |
228 | |||
229 | /** | ||
230 | * amdgpu_virt_alloc_mm_table() - alloc memory for mm table | ||
231 | * @amdgpu: amdgpu device. | ||
232 | * MM table is used by UVD and VCE for its initialization | ||
233 | * Return: Zero if allocate success. | ||
234 | */ | ||
235 | int amdgpu_virt_alloc_mm_table(struct amdgpu_device *adev) | ||
236 | { | ||
237 | int r; | ||
238 | |||
239 | if (!amdgpu_sriov_vf(adev) || adev->virt.mm_table.gpu_addr) | ||
240 | return 0; | ||
241 | |||
242 | r = amdgpu_bo_create_kernel(adev, PAGE_SIZE, PAGE_SIZE, | ||
243 | AMDGPU_GEM_DOMAIN_VRAM, | ||
244 | &adev->virt.mm_table.bo, | ||
245 | &adev->virt.mm_table.gpu_addr, | ||
246 | (void *)&adev->virt.mm_table.cpu_addr); | ||
247 | if (r) { | ||
248 | DRM_ERROR("failed to alloc mm table and error = %d.\n", r); | ||
249 | return r; | ||
250 | } | ||
251 | |||
252 | memset((void *)adev->virt.mm_table.cpu_addr, 0, PAGE_SIZE); | ||
253 | DRM_INFO("MM table gpu addr = 0x%llx, cpu addr = %p.\n", | ||
254 | adev->virt.mm_table.gpu_addr, | ||
255 | adev->virt.mm_table.cpu_addr); | ||
256 | return 0; | ||
257 | } | ||
258 | |||
259 | /** | ||
260 | * amdgpu_virt_free_mm_table() - free mm table memory | ||
261 | * @amdgpu: amdgpu device. | ||
262 | * Free MM table memory | ||
263 | */ | ||
264 | void amdgpu_virt_free_mm_table(struct amdgpu_device *adev) | ||
265 | { | ||
266 | if (!amdgpu_sriov_vf(adev) || !adev->virt.mm_table.gpu_addr) | ||
267 | return; | ||
268 | |||
269 | amdgpu_bo_free_kernel(&adev->virt.mm_table.bo, | ||
270 | &adev->virt.mm_table.gpu_addr, | ||
271 | (void *)&adev->virt.mm_table.cpu_addr); | ||
272 | adev->virt.mm_table.gpu_addr = 0; | ||
273 | } | ||