Look up the mapping so we know which vmid to flush.

Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h | 7 ++++++-
 drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c  | 6 ++++--
 drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c  | 6 ++++--
 drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c  | 6 ++++--
 drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c  | 1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c   | 6 ++++--
 6 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
index 204cf1c360896..27785b1b38ccd 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
@@ -171,6 +171,10 @@ struct amdgpu_gmc_funcs {
        /* Change the VMID -> PASID mapping */
        void (*emit_pasid_mapping)(struct amdgpu_ring *ring, unsigned vmid,
                                   unsigned pasid);
+       /* look up the vmids for the pasid */
+       bool (*get_vmid_pasid_mapping_info)(struct amdgpu_device *adev,
+                                           uint8_t vmid, uint8_t inst,
+                                           uint16_t *p_pasid);
        /* enable/disable PRT support */
        void (*set_prt)(struct amdgpu_device *adev, bool enable);
        /* get the pde for a given mc addr */
@@ -384,7 +388,8 @@ struct amdgpu_gmc {
 #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_get_vm_pde(adev, level, dst, flags) 
(adev)->gmc.gmc_funcs->get_vm_pde((adev), (level), (dst), (flags))
-#define amdgpu_gmc_get_vm_pte(adev, vm, bo, vm_flags, pte_flags) \
+#define amdgpu_gmc_get_vmid_pasid_mapping_info(adev, v, i, p) 
(adev)->gmc.gmc_funcs->get_vmid_pasid_mapping_info((a), (v), (i), (p))
+#define amdgpu_gmc_get_vm_pte(adev, vm, bo, vm_flags, pte_flags)       \
        ((adev)->gmc.gmc_funcs->get_vm_pte((adev), (vm), (bo), (vm_flags), \
                                           (pte_flags)))
 #define amdgpu_gmc_override_vm_pte_flags(adev, vm, addr, pte_flags)    \
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
index 23d9fe995a2b5..0028639448956 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
@@ -204,7 +204,8 @@ static bool gmc_v10_0_use_invalidate_semaphore(struct 
amdgpu_device *adev,
 
 static bool gmc_v10_0_get_atc_vmid_pasid_mapping_info(
                                        struct amdgpu_device *adev,
-                                       uint8_t vmid, uint16_t *p_pasid)
+                                       uint8_t vmid, uint8_t inst,
+                                       uint16_t *p_pasid)
 {
        uint32_t value;
 
@@ -346,7 +347,7 @@ static void gmc_v10_0_flush_gpu_tlb_pasid(struct 
amdgpu_device *adev,
        for (vmid = 1; vmid < AMDGPU_NUM_VMID; vmid++) {
                bool valid;
 
-               valid = gmc_v10_0_get_atc_vmid_pasid_mapping_info(adev, vmid,
+               valid = gmc_v10_0_get_atc_vmid_pasid_mapping_info(adev, vmid, 0,
                                                                  &queried);
                if (!valid || queried != pasid)
                        continue;
@@ -555,6 +556,7 @@ static const struct amdgpu_gmc_funcs gmc_v10_0_gmc_funcs = {
        .flush_gpu_tlb_pasid = gmc_v10_0_flush_gpu_tlb_pasid,
        .emit_flush_gpu_tlb = gmc_v10_0_emit_flush_gpu_tlb,
        .emit_pasid_mapping = gmc_v10_0_emit_pasid_mapping,
+       .get_vmid_pasid_mapping_info = 
gmc_v10_0_get_atc_vmid_pasid_mapping_info,
        .get_vm_pde = gmc_v10_0_get_vm_pde,
        .get_vm_pte = gmc_v10_0_get_vm_pte,
        .get_vbios_fb_size = gmc_v10_0_get_vbios_fb_size,
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
index 098e1340554c5..b34bd7881726d 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
@@ -200,7 +200,8 @@ static bool gmc_v11_0_use_invalidate_semaphore(struct 
amdgpu_device *adev,
 
 static bool gmc_v11_0_get_vmid_pasid_mapping_info(
                                        struct amdgpu_device *adev,
-                                       uint8_t vmid, uint16_t *p_pasid)
+                                       uint8_t vmid, uint8_t inst,
+                                       uint16_t *p_pasid)
 {
        *p_pasid = RREG32(SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_0_LUT) + vmid) 
& 0xffff;
 
@@ -338,7 +339,7 @@ static void gmc_v11_0_flush_gpu_tlb_pasid(struct 
amdgpu_device *adev,
        for (vmid = 1; vmid < 16; vmid++) {
                bool valid;
 
-               valid = gmc_v11_0_get_vmid_pasid_mapping_info(adev, vmid,
+               valid = gmc_v11_0_get_vmid_pasid_mapping_info(adev, vmid, 0,
                                                              &queried);
                if (!valid || queried != pasid)
                        continue;
@@ -546,6 +547,7 @@ static const struct amdgpu_gmc_funcs gmc_v11_0_gmc_funcs = {
        .flush_gpu_tlb_pasid = gmc_v11_0_flush_gpu_tlb_pasid,
        .emit_flush_gpu_tlb = gmc_v11_0_emit_flush_gpu_tlb,
        .emit_pasid_mapping = gmc_v11_0_emit_pasid_mapping,
+       .get_vmid_pasid_mapping_info = gmc_v11_0_get_vmid_pasid_mapping_info,
        .get_vm_pde = gmc_v11_0_get_vm_pde,
        .get_vm_pte = gmc_v11_0_get_vm_pte,
        .get_vbios_fb_size = gmc_v11_0_get_vbios_fb_size,
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c
index cffc818880d12..9179dc0787f13 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c
@@ -196,7 +196,8 @@ static bool gmc_v12_0_use_invalidate_semaphore(struct 
amdgpu_device *adev,
 
 static bool gmc_v12_0_get_vmid_pasid_mapping_info(
                                        struct amdgpu_device *adev,
-                                       uint8_t vmid, uint16_t *p_pasid)
+                                       uint8_t vmid, uint8_t inst,
+                                       uint16_t *p_pasid)
 {
        *p_pasid = RREG32(SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_0_LUT) + vmid) 
& 0xffff;
 
@@ -374,7 +375,7 @@ static void gmc_v12_0_flush_gpu_tlb_pasid(struct 
amdgpu_device *adev,
        for (vmid = 1; vmid < 16; vmid++) {
                bool valid;
 
-               valid = gmc_v12_0_get_vmid_pasid_mapping_info(adev, vmid,
+               valid = gmc_v12_0_get_vmid_pasid_mapping_info(adev, vmid, 0,
                                                              &queried);
                if (!valid || queried != pasid)
                        continue;
@@ -581,6 +582,7 @@ static const struct amdgpu_gmc_funcs gmc_v12_0_gmc_funcs = {
        .flush_gpu_tlb_pasid = gmc_v12_0_flush_gpu_tlb_pasid,
        .emit_flush_gpu_tlb = gmc_v12_0_emit_flush_gpu_tlb,
        .emit_pasid_mapping = gmc_v12_0_emit_pasid_mapping,
+       .get_vmid_pasid_mapping_info = gmc_v12_0_get_vmid_pasid_mapping_info,
        .get_vm_pde = gmc_v12_0_get_vm_pde,
        .get_vm_pte = gmc_v12_0_get_vm_pte,
        .get_vbios_fb_size = gmc_v12_0_get_vbios_fb_size,
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c
index 6c0d2689cc05d..3fa1ec3dca273 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c
@@ -668,6 +668,7 @@ static const struct amdgpu_gmc_funcs gmc_v12_1_gmc_funcs = {
        .flush_gpu_tlb_pasid = gmc_v12_1_flush_gpu_tlb_pasid,
        .emit_flush_gpu_tlb = gmc_v12_1_emit_flush_gpu_tlb,
        .emit_pasid_mapping = gmc_v12_1_emit_pasid_mapping,
+       .get_vmid_pasid_mapping_info = gmc_v12_1_get_vmid_pasid_mapping_info,
        .get_vm_pde = gmc_v12_1_get_vm_pde,
        .get_vm_pte = gmc_v12_1_get_vm_pte,
        .query_mem_partition_mode = &amdgpu_gmc_query_memory_partition,
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index 8edaa54fca82f..19a10acedc6ce 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -746,7 +746,8 @@ static bool gmc_v9_0_use_invalidate_semaphore(struct 
amdgpu_device *adev,
 }
 
 static bool gmc_v9_0_get_atc_vmid_pasid_mapping_info(struct amdgpu_device 
*adev,
-                                       uint8_t vmid, uint16_t *p_pasid)
+                                                    uint8_t vmid, uint8_t inst,
+                                                    uint16_t *p_pasid)
 {
        uint32_t value;
 
@@ -908,7 +909,7 @@ static void gmc_v9_0_flush_gpu_tlb_pasid(struct 
amdgpu_device *adev,
                bool valid;
 
                valid = gmc_v9_0_get_atc_vmid_pasid_mapping_info(adev, vmid,
-                                                                &queried);
+                                                                inst, 
&queried);
                if (!valid || queried != pasid)
                        continue;
 
@@ -1321,6 +1322,7 @@ static const struct amdgpu_gmc_funcs gmc_v9_0_gmc_funcs = 
{
        .flush_gpu_tlb_pasid = gmc_v9_0_flush_gpu_tlb_pasid,
        .emit_flush_gpu_tlb = gmc_v9_0_emit_flush_gpu_tlb,
        .emit_pasid_mapping = gmc_v9_0_emit_pasid_mapping,
+       .get_vmid_pasid_mapping_info = gmc_v9_0_get_atc_vmid_pasid_mapping_info,
        .get_vm_pde = gmc_v9_0_get_vm_pde,
        .get_vm_pte = gmc_v9_0_get_vm_pte,
        .override_vm_pte_flags = gmc_v9_0_override_vm_pte_flags,
-- 
2.55.0

Reply via email to