aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1474-drm-amdgpu-Eliminate-the-set_pde_pte-function-pointe.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1474-drm-amdgpu-Eliminate-the-set_pde_pte-function-pointe.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1474-drm-amdgpu-Eliminate-the-set_pde_pte-function-pointe.patch364
1 files changed, 364 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1474-drm-amdgpu-Eliminate-the-set_pde_pte-function-pointe.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1474-drm-amdgpu-Eliminate-the-set_pde_pte-function-pointe.patch
new file mode 100644
index 00000000..8d61ee14
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1474-drm-amdgpu-Eliminate-the-set_pde_pte-function-pointe.patch
@@ -0,0 +1,364 @@
+From cf8b52ee08e2e820be34bd34f5a8b92ff1dccd9b Mon Sep 17 00:00:00 2001
+From: Yong Zhao <Yong.Zhao@amd.com>
+Date: Mon, 25 Feb 2019 12:56:53 -0500
+Subject: [PATCH 1474/2940] drm/amdgpu: Eliminate the set_pde_pte function
+ pointer in amdgpu_gmc_funcs
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+All the gmc_*_set_pde_pte functions are the same across different ASICs,
+so we can eliminate the set_pde_pte function pointer and instead use a
+generic function.
+
+Signed-off-by: Yong Zhao <Yong.Zhao@amd.com>
+Reviewed-by: Christian König <christian.koenig@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 27 ++++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h | 10 +--
+ drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 15 -----
+ drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 26 --------
+ drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 61 ++++++------------
+ drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 86 +++++++++----------------
+ 6 files changed, 77 insertions(+), 148 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
+index d73367cab4f3..5a32a0d2ad31 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
+@@ -79,6 +79,33 @@ uint64_t amdgpu_gmc_pd_addr(struct amdgpu_bo *bo)
+ return pd_addr;
+ }
+
++/**
++ * amdgpu_gmc_set_pte_pde - update the page tables using CPU
++ *
++ * @adev: amdgpu_device pointer
++ * @cpu_pt_addr: cpu address of the page table
++ * @gpu_page_idx: entry in the page table to update
++ * @addr: dst addr to write into pte/pde
++ * @flags: access flags
++ *
++ * Update the page tables using CPU.
++ */
++int amdgpu_gmc_set_pte_pde(struct amdgpu_device *adev, void *cpu_pt_addr,
++ uint32_t gpu_page_idx, uint64_t addr,
++ uint64_t flags)
++{
++ void __iomem *ptr = (void *)cpu_pt_addr;
++ uint64_t value;
++
++ /*
++ * The following is for PTE only. GART does not have PDEs.
++ */
++ value = addr & 0x0000FFFFFFFFF000ULL;
++ value |= flags;
++ writeq(value, ptr + (gpu_page_idx * 8));
++ return 0;
++}
++
+ /**
+ * amdgpu_gmc_agp_addr - return the address in the AGP address space
+ *
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
+index 59b7c34a9f92..98d0b4e54189 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
+@@ -71,12 +71,6 @@ struct amdgpu_gmc_funcs {
+ /* Change the VMID -> PASID mapping */
+ void (*emit_pasid_mapping)(struct amdgpu_ring *ring, unsigned vmid,
+ unsigned pasid);
+- /* write pte/pde updates using the cpu */
+- int (*set_pte_pde)(struct amdgpu_device *adev,
+- void *cpu_pt_addr, /* cpu addr of page table */
+- uint32_t gpu_page_idx, /* pte/pde to update */
+- uint64_t addr, /* addr to write into pte/pde */
+- uint64_t flags); /* access flags */
+ /* enable/disable PRT support */
+ void (*set_prt)(struct amdgpu_device *adev, bool enable);
+ /* set pte flags based per asic */
+@@ -155,7 +149,6 @@ struct amdgpu_gmc {
+ #define amdgpu_gmc_flush_gpu_tlb(adev, vmid) (adev)->gmc.gmc_funcs->flush_gpu_tlb((adev), (vmid))
+ #define amdgpu_gmc_emit_flush_gpu_tlb(r, vmid, addr) (r)->adev->gmc.gmc_funcs->emit_flush_gpu_tlb((r), (vmid), (addr))
+ #define amdgpu_gmc_emit_pasid_mapping(r, vmid, pasid) (r)->adev->gmc.gmc_funcs->emit_pasid_mapping((r), (vmid), (pasid))
+-#define amdgpu_gmc_set_pte_pde(adev, pt, idx, addr, flags) (adev)->gmc.gmc_funcs->set_pte_pde((adev), (pt), (idx), (addr), (flags))
+ #define amdgpu_gmc_get_vm_pde(adev, level, dst, flags) (adev)->gmc.gmc_funcs->get_vm_pde((adev), (level), (dst), (flags))
+ #define amdgpu_gmc_get_pte_flags(adev, flags) (adev)->gmc.gmc_funcs->get_vm_pte_flags((adev),(flags))
+
+@@ -189,6 +182,9 @@ static inline uint64_t amdgpu_gmc_sign_extend(uint64_t addr)
+
+ void amdgpu_gmc_get_pde_for_bo(struct amdgpu_bo *bo, int level,
+ uint64_t *addr, uint64_t *flags);
++int amdgpu_gmc_set_pte_pde(struct amdgpu_device *adev, void *cpu_pt_addr,
++ uint32_t gpu_page_idx, uint64_t addr,
++ uint64_t flags);
+ uint64_t amdgpu_gmc_pd_addr(struct amdgpu_bo *bo);
+ uint64_t amdgpu_gmc_agp_addr(struct ttm_buffer_object *bo);
+ void amdgpu_gmc_vram_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc,
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
+index 73ad02aea2b2..5e3b5952c397 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
+@@ -382,20 +382,6 @@ static uint64_t gmc_v6_0_emit_flush_gpu_tlb(struct amdgpu_ring *ring,
+ return pd_addr;
+ }
+
+-static int gmc_v6_0_set_pte_pde(struct amdgpu_device *adev, void *cpu_pt_addr,
+- uint32_t gpu_page_idx, uint64_t addr,
+- uint64_t flags)
+-{
+- void __iomem *ptr = (void *)cpu_pt_addr;
+- uint64_t value;
+-
+- value = addr & 0xFFFFFFFFFFFFF000ULL;
+- value |= flags;
+- writeq(value, ptr + (gpu_page_idx * 8));
+-
+- return 0;
+-}
+-
+ static uint64_t gmc_v6_0_get_vm_pte_flags(struct amdgpu_device *adev,
+ uint32_t flags)
+ {
+@@ -1168,7 +1154,6 @@ static const struct amd_ip_funcs gmc_v6_0_ip_funcs = {
+ static const struct amdgpu_gmc_funcs gmc_v6_0_gmc_funcs = {
+ .flush_gpu_tlb = gmc_v6_0_flush_gpu_tlb,
+ .emit_flush_gpu_tlb = gmc_v6_0_emit_flush_gpu_tlb,
+- .set_pte_pde = gmc_v6_0_set_pte_pde,
+ .set_prt = gmc_v6_0_set_prt,
+ .get_vm_pde = gmc_v6_0_get_vm_pde,
+ .get_vm_pte_flags = gmc_v6_0_get_vm_pte_flags
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+index e276cae18e12..7a0979eb2d6e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+@@ -459,31 +459,6 @@ static void gmc_v7_0_emit_pasid_mapping(struct amdgpu_ring *ring, unsigned vmid,
+ amdgpu_ring_emit_wreg(ring, mmIH_VMID_0_LUT + vmid, pasid);
+ }
+
+-/**
+- * gmc_v7_0_set_pte_pde - update the page tables using MMIO
+- *
+- * @adev: amdgpu_device pointer
+- * @cpu_pt_addr: cpu address of the page table
+- * @gpu_page_idx: entry in the page table to update
+- * @addr: dst addr to write into pte/pde
+- * @flags: access flags
+- *
+- * Update the page tables using the CPU.
+- */
+-static int gmc_v7_0_set_pte_pde(struct amdgpu_device *adev, void *cpu_pt_addr,
+- uint32_t gpu_page_idx, uint64_t addr,
+- uint64_t flags)
+-{
+- void __iomem *ptr = (void *)cpu_pt_addr;
+- uint64_t value;
+-
+- value = addr & 0xFFFFFFFFFFFFF000ULL;
+- value |= flags;
+- writeq(value, ptr + (gpu_page_idx * 8));
+-
+- return 0;
+-}
+-
+ static uint64_t gmc_v7_0_get_vm_pte_flags(struct amdgpu_device *adev,
+ uint32_t flags)
+ {
+@@ -1376,7 +1351,6 @@ static const struct amdgpu_gmc_funcs gmc_v7_0_gmc_funcs = {
+ .flush_gpu_tlb = gmc_v7_0_flush_gpu_tlb,
+ .emit_flush_gpu_tlb = gmc_v7_0_emit_flush_gpu_tlb,
+ .emit_pasid_mapping = gmc_v7_0_emit_pasid_mapping,
+- .set_pte_pde = gmc_v7_0_set_pte_pde,
+ .set_prt = gmc_v7_0_set_prt,
+ .get_vm_pte_flags = gmc_v7_0_get_vm_pte_flags,
+ .get_vm_pde = gmc_v7_0_get_vm_pde
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+index da7374cb4e6b..c12b939a0273 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+@@ -667,50 +667,26 @@ static void gmc_v8_0_emit_pasid_mapping(struct amdgpu_ring *ring, unsigned vmid,
+ amdgpu_ring_emit_wreg(ring, mmIH_VMID_0_LUT + vmid, pasid);
+ }
+
+-/**
+- * gmc_v8_0_set_pte_pde - update the page tables using MMIO
+- *
+- * @adev: amdgpu_device pointer
+- * @cpu_pt_addr: cpu address of the page table
+- * @gpu_page_idx: entry in the page table to update
+- * @addr: dst addr to write into pte/pde
+- * @flags: access flags
++/*
++ * PTE format on VI:
++ * 63:40 reserved
++ * 39:12 4k physical page base address
++ * 11:7 fragment
++ * 6 write
++ * 5 read
++ * 4 exe
++ * 3 reserved
++ * 2 snooped
++ * 1 system
++ * 0 valid
+ *
+- * Update the page tables using the CPU.
++ * PDE format on VI:
++ * 63:59 block fragment size
++ * 58:40 reserved
++ * 39:1 physical base address of PTE
++ * bits 5:1 must be 0.
++ * 0 valid
+ */
+-static int gmc_v8_0_set_pte_pde(struct amdgpu_device *adev, void *cpu_pt_addr,
+- uint32_t gpu_page_idx, uint64_t addr,
+- uint64_t flags)
+-{
+- void __iomem *ptr = (void *)cpu_pt_addr;
+- uint64_t value;
+-
+- /*
+- * PTE format on VI:
+- * 63:40 reserved
+- * 39:12 4k physical page base address
+- * 11:7 fragment
+- * 6 write
+- * 5 read
+- * 4 exe
+- * 3 reserved
+- * 2 snooped
+- * 1 system
+- * 0 valid
+- *
+- * PDE format on VI:
+- * 63:59 block fragment size
+- * 58:40 reserved
+- * 39:1 physical base address of PTE
+- * bits 5:1 must be 0.
+- * 0 valid
+- */
+- value = addr & 0x000000FFFFFFF000ULL;
+- value |= flags;
+- writeq(value, ptr + (gpu_page_idx * 8));
+-
+- return 0;
+-}
+
+ static uint64_t gmc_v8_0_get_vm_pte_flags(struct amdgpu_device *adev,
+ uint32_t flags)
+@@ -1749,7 +1725,6 @@ static const struct amdgpu_gmc_funcs gmc_v8_0_gmc_funcs = {
+ .flush_gpu_tlb = gmc_v8_0_flush_gpu_tlb,
+ .emit_flush_gpu_tlb = gmc_v8_0_emit_flush_gpu_tlb,
+ .emit_pasid_mapping = gmc_v8_0_emit_pasid_mapping,
+- .set_pte_pde = gmc_v8_0_set_pte_pde,
+ .set_prt = gmc_v8_0_set_prt,
+ .get_vm_pte_flags = gmc_v8_0_get_vm_pte_flags,
+ .get_vm_pde = gmc_v8_0_get_vm_pde
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+index c637dd270d87..1a278b771593 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+@@ -522,64 +522,37 @@ static void gmc_v9_0_emit_pasid_mapping(struct amdgpu_ring *ring, unsigned vmid,
+ amdgpu_ring_emit_wreg(ring, reg, pasid);
+ }
+
+-/**
+- * gmc_v9_0_set_pte_pde - update the page tables using MMIO
+- *
+- * @adev: amdgpu_device pointer
+- * @cpu_pt_addr: cpu address of the page table
+- * @gpu_page_idx: entry in the page table to update
+- * @addr: dst addr to write into pte/pde
+- * @flags: access flags
++/*
++ * PTE format on VEGA 10:
++ * 63:59 reserved
++ * 58:57 mtype
++ * 56 F
++ * 55 L
++ * 54 P
++ * 53 SW
++ * 52 T
++ * 50:48 reserved
++ * 47:12 4k physical page base address
++ * 11:7 fragment
++ * 6 write
++ * 5 read
++ * 4 exe
++ * 3 Z
++ * 2 snooped
++ * 1 system
++ * 0 valid
+ *
+- * Update the page tables using the CPU.
++ * PDE format on VEGA 10:
++ * 63:59 block fragment size
++ * 58:55 reserved
++ * 54 P
++ * 53:48 reserved
++ * 47:6 physical base address of PD or PTE
++ * 5:3 reserved
++ * 2 C
++ * 1 system
++ * 0 valid
+ */
+-static int gmc_v9_0_set_pte_pde(struct amdgpu_device *adev, void *cpu_pt_addr,
+- uint32_t gpu_page_idx, uint64_t addr,
+- uint64_t flags)
+-{
+- void __iomem *ptr = (void *)cpu_pt_addr;
+- uint64_t value;
+-
+- /*
+- * PTE format on VEGA 10:
+- * 63:59 reserved
+- * 58:57 mtype
+- * 56 F
+- * 55 L
+- * 54 P
+- * 53 SW
+- * 52 T
+- * 50:48 reserved
+- * 47:12 4k physical page base address
+- * 11:7 fragment
+- * 6 write
+- * 5 read
+- * 4 exe
+- * 3 Z
+- * 2 snooped
+- * 1 system
+- * 0 valid
+- *
+- * PDE format on VEGA 10:
+- * 63:59 block fragment size
+- * 58:55 reserved
+- * 54 P
+- * 53:48 reserved
+- * 47:6 physical base address of PD or PTE
+- * 5:3 reserved
+- * 2 C
+- * 1 system
+- * 0 valid
+- */
+-
+- /*
+- * The following is for PTE only. GART does not have PDEs.
+- */
+- value = addr & 0x0000FFFFFFFFF000ULL;
+- value |= flags;
+- writeq(value, ptr + (gpu_page_idx * 8));
+- return 0;
+-}
+
+ static uint64_t gmc_v9_0_get_vm_pte_flags(struct amdgpu_device *adev,
+ uint32_t flags)
+@@ -649,7 +622,6 @@ static const struct amdgpu_gmc_funcs gmc_v9_0_gmc_funcs = {
+ .flush_gpu_tlb = gmc_v9_0_flush_gpu_tlb,
+ .emit_flush_gpu_tlb = gmc_v9_0_emit_flush_gpu_tlb,
+ .emit_pasid_mapping = gmc_v9_0_emit_pasid_mapping,
+- .set_pte_pde = gmc_v9_0_set_pte_pde,
+ .get_vm_pte_flags = gmc_v9_0_get_vm_pte_flags,
+ .get_vm_pde = gmc_v9_0_get_vm_pde
+ };
+--
+2.17.1
+