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