aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/0742-drm-amdgpu-Refine-CSA-related-functions.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0742-drm-amdgpu-Refine-CSA-related-functions.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/0742-drm-amdgpu-Refine-CSA-related-functions.patch172
1 files changed, 172 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0742-drm-amdgpu-Refine-CSA-related-functions.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0742-drm-amdgpu-Refine-CSA-related-functions.patch
new file mode 100644
index 00000000..c9c1695a
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0742-drm-amdgpu-Refine-CSA-related-functions.patch
@@ -0,0 +1,172 @@
+From d229bf62740828143a32c7314d3ab300beb90738 Mon Sep 17 00:00:00 2001
+From: Rex Zhu <Rex.Zhu@amd.com>
+Date: Mon, 15 Oct 2018 17:08:38 +0800
+Subject: [PATCH 0742/2940] drm/amdgpu: Refine CSA related functions
+
+There is no functional changes,
+Use function arguments for SRIOV special variables which
+is hardcode in those functions.
+
+so we can share those functions in baremetal.
+
+Reviewed-by: Monk Liu <Monk.Liu@amd.com>
+Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 6 ++--
+ drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 5 +++-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 32 +++++++++++-----------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | 8 ++++--
+ 4 files changed, 29 insertions(+), 22 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+index 4c16bc088faa..f2bf778fa256 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+@@ -1704,7 +1704,9 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)
+
+ /* right after GMC hw init, we create CSA */
+ if (amdgpu_sriov_vf(adev)) {
+- r = amdgpu_allocate_static_csa(adev);
++ r = amdgpu_allocate_static_csa(adev, &adev->virt.csa_obj,
++ AMDGPU_GEM_DOMAIN_VRAM,
++ AMDGPU_CSA_SIZE);
+ if (r) {
+ DRM_ERROR("allocate CSA failed %d\n", r);
+ return r;
+@@ -1938,7 +1940,7 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
+
+ if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
+ amdgpu_ucode_free_bo(adev);
+- amdgpu_free_static_csa(adev);
++ amdgpu_free_static_csa(&adev->virt.csa_obj);
+ amdgpu_device_wb_fini(adev);
+ amdgpu_device_vram_scratch_fini(adev);
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+index 090a06341e7d..3d33cea894a1 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+@@ -1007,7 +1007,10 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
+ }
+
+ if (amdgpu_sriov_vf(adev)) {
+- r = amdgpu_map_static_csa(adev, &fpriv->vm, &fpriv->csa_va);
++ uint64_t csa_addr = amdgpu_csa_vaddr(adev) & AMDGPU_GMC_HOLE_MASK;
++
++ r = amdgpu_map_static_csa(adev, &fpriv->vm, adev->virt.csa_obj,
++ &fpriv->csa_va, csa_addr, AMDGPU_CSA_SIZE);
+ if (r)
+ goto error_vm;
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
+index 9ff16b790c92..f71bc6feea7a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
+@@ -41,25 +41,25 @@ bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev)
+ return RREG32_NO_KIQ(0xc040) == 0xffffffff;
+ }
+
+-int amdgpu_allocate_static_csa(struct amdgpu_device *adev)
++int amdgpu_allocate_static_csa(struct amdgpu_device *adev, struct amdgpu_bo **bo,
++ u32 domain, uint32_t size)
+ {
+ int r;
+ void *ptr;
+
+- r = amdgpu_bo_create_kernel(adev, AMDGPU_CSA_SIZE, PAGE_SIZE,
+- AMDGPU_GEM_DOMAIN_VRAM, &adev->virt.csa_obj,
++ r = amdgpu_bo_create_kernel(adev, size, PAGE_SIZE,
++ domain, bo,
+ NULL, &ptr);
+- if (r)
+- return r;
++ if (!bo)
++ return -ENOMEM;
+
+- memset(ptr, 0, AMDGPU_CSA_SIZE);
++ memset(ptr, 0, size);
+ return 0;
+ }
+
+-void amdgpu_free_static_csa(struct amdgpu_device *adev) {
+- amdgpu_bo_free_kernel(&adev->virt.csa_obj,
+- NULL,
+- NULL);
++void amdgpu_free_static_csa(struct amdgpu_bo **bo)
++{
++ amdgpu_bo_free_kernel(bo, NULL, NULL);
+ }
+
+ /*
+@@ -69,9 +69,9 @@ void amdgpu_free_static_csa(struct amdgpu_device *adev) {
+ * package to support SRIOV gfx preemption.
+ */
+ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+- struct amdgpu_bo_va **bo_va)
++ struct amdgpu_bo *bo, struct amdgpu_bo_va **bo_va,
++ uint64_t csa_addr, uint32_t size)
+ {
+- uint64_t csa_addr = amdgpu_csa_vaddr(adev) & AMDGPU_GMC_HOLE_MASK;
+ struct ww_acquire_ctx ticket;
+ struct list_head list;
+ struct amdgpu_bo_list_entry pd;
+@@ -80,7 +80,7 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+
+ INIT_LIST_HEAD(&list);
+ INIT_LIST_HEAD(&csa_tv.head);
+- csa_tv.bo = &adev->virt.csa_obj->tbo;
++ csa_tv.bo = &bo->tbo;
+ csa_tv.shared = true;
+
+ list_add(&csa_tv.head, &list);
+@@ -92,7 +92,7 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+ return r;
+ }
+
+- *bo_va = amdgpu_vm_bo_add(adev, vm, adev->virt.csa_obj);
++ *bo_va = amdgpu_vm_bo_add(adev, vm, bo);
+ if (!*bo_va) {
+ ttm_eu_backoff_reservation(&ticket, &list);
+ DRM_ERROR("failed to create bo_va for static CSA\n");
+@@ -100,7 +100,7 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+ }
+
+ r = amdgpu_vm_alloc_pts(adev, (*bo_va)->base.vm, csa_addr,
+- AMDGPU_CSA_SIZE);
++ size);
+ if (r) {
+ DRM_ERROR("failed to allocate pts for static CSA, err=%d\n", r);
+ amdgpu_vm_bo_rmv(adev, *bo_va);
+@@ -108,7 +108,7 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+ return r;
+ }
+
+- r = amdgpu_vm_bo_map(adev, *bo_va, csa_addr, 0, AMDGPU_CSA_SIZE,
++ r = amdgpu_vm_bo_map(adev, *bo_va, csa_addr, 0, size,
+ AMDGPU_PTE_READABLE | AMDGPU_PTE_WRITEABLE |
+ AMDGPU_PTE_EXECUTABLE);
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
+index f1a6a50d9444..09a7ebe964d0 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
+@@ -280,10 +280,12 @@ struct amdgpu_vm;
+
+ uint64_t amdgpu_csa_vaddr(struct amdgpu_device *adev);
+ bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev);
+-int amdgpu_allocate_static_csa(struct amdgpu_device *adev);
++int amdgpu_allocate_static_csa(struct amdgpu_device *adev, struct amdgpu_bo **bo,
++ u32 domain, uint32_t size);
+ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+- struct amdgpu_bo_va **bo_va);
+-void amdgpu_free_static_csa(struct amdgpu_device *adev);
++ struct amdgpu_bo *bo,
++ struct amdgpu_bo_va **bo_va, uint64_t csa_addr, uint32_t size);
++void amdgpu_free_static_csa(struct amdgpu_bo **bo);
+ void amdgpu_virt_init_setting(struct amdgpu_device *adev);
+ uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg);
+ void amdgpu_virt_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v);
+--
+2.17.1
+