AMD General

> -----Original Message-----
> From: amd-gfx <[email protected]> On Behalf Of Alex
> Deucher
> Sent: Wednesday, September 2, 2026 4:10 AM
> To: [email protected]; Koenig, Christian
> <[email protected]>
> Cc: Deucher, Alexander <[email protected]>
> Subject: [PATCH 20/31] drm/amdgpu/gmc: add new callback to lookup vmid to
> pasid mapping
>
> 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))
Spelling error?
It should be get_vmid_pasid_mapping_info((adev), (v), (i), (p)) // a -> adev

Thanks
Jesse

> +#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 a91d0ddb6e729..0019706b0b2a9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> @@ -727,7 +727,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;
>
> @@ -889,7 +890,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;
>
> @@ -1302,6 +1303,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