drm/amdgpu/virt: add two functions for MM table
authorXiangliang Yu <Xiangliang.Yu@amd.com>
Fri, 21 Apr 2017 07:40:25 +0000 (15:40 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 28 Apr 2017 21:32:58 +0000 (17:32 -0400)
Add two functions to allocate & free MM table memory.

Signed-off-by: Xiangliang Yu <Xiangliang.Yu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h

index ba8b8ae6234f583bef4ec5030d7888fbf6cfabb2..6bf5cea294f2e01212151688ffa10758a1756b8e 100644 (file)
@@ -225,3 +225,49 @@ int amdgpu_virt_reset_gpu(struct amdgpu_device *adev)
 
        return 0;
 }
+
+/**
+ * amdgpu_virt_alloc_mm_table() - alloc memory for mm table
+ * @amdgpu:    amdgpu device.
+ * MM table is used by UVD and VCE for its initialization
+ * Return: Zero if allocate success.
+ */
+int amdgpu_virt_alloc_mm_table(struct amdgpu_device *adev)
+{
+       int r;
+
+       if (!amdgpu_sriov_vf(adev) || adev->virt.mm_table.gpu_addr)
+               return 0;
+
+       r = amdgpu_bo_create_kernel(adev, PAGE_SIZE, PAGE_SIZE,
+                                   AMDGPU_GEM_DOMAIN_VRAM,
+                                   &adev->virt.mm_table.bo,
+                                   &adev->virt.mm_table.gpu_addr,
+                                   (void *)&adev->virt.mm_table.cpu_addr);
+       if (r) {
+               DRM_ERROR("failed to alloc mm table and error = %d.\n", r);
+               return r;
+       }
+
+       memset((void *)adev->virt.mm_table.cpu_addr, 0, PAGE_SIZE);
+       DRM_INFO("MM table gpu addr = 0x%llx, cpu addr = %p.\n",
+                adev->virt.mm_table.gpu_addr,
+                adev->virt.mm_table.cpu_addr);
+       return 0;
+}
+
+/**
+ * amdgpu_virt_free_mm_table() - free mm table memory
+ * @amdgpu:    amdgpu device.
+ * Free MM table memory
+ */
+void amdgpu_virt_free_mm_table(struct amdgpu_device *adev)
+{
+       if (!amdgpu_sriov_vf(adev) || !adev->virt.mm_table.gpu_addr)
+               return;
+
+       amdgpu_bo_free_kernel(&adev->virt.mm_table.bo,
+                             &adev->virt.mm_table.gpu_addr,
+                             (void *)&adev->virt.mm_table.cpu_addr);
+       adev->virt.mm_table.gpu_addr = 0;
+}
index 1ee0a190b33b1dd4d2f236f507621352f7d2bc08..a8ed162cc0bc83ed8a86a623c8a45bd476f4f4f2 100644 (file)
@@ -98,5 +98,7 @@ int amdgpu_virt_request_full_gpu(struct amdgpu_device *adev, bool init);
 int amdgpu_virt_release_full_gpu(struct amdgpu_device *adev, bool init);
 int amdgpu_virt_reset_gpu(struct amdgpu_device *adev);
 int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, bool voluntary);
+int amdgpu_virt_alloc_mm_table(struct amdgpu_device *adev);
+void amdgpu_virt_free_mm_table(struct amdgpu_device *adev);
 
 #endif