On Thu, Oct 29, 2026 at 3:41 AM Jesse Zhang <[email protected]> wrote:
>
> Commit 02232367be23 ("drm/amdgpu: add spm_vmid and exclude it from the
> MES, KFD and kq pools") took the SPM VMID out of the kernel queue and the
> user queue VMID masks, and since commit 8a9263fc8812 ("drm/amdgpu: use
> dedicated SPM VMID from the reserved path") the kernel queue jobs of a VM
> with a reserved VMID run on it. The gfx constants_init() only programs
> SH_MEM_CONFIG and SH_MEM_BASES for VMID 0 and the kernel queue mask
> though, and init_compute_vmid() for the user queue mask, so the SPM VMID
> keeps the reset defaults: no unaligned access mode and no apertures.
This is fine for now, but I think it would be better to unify
constants_init() and init_compute_vmid() and update all the vmids in
one place. The reserved vmid will need to reflect the configuration
of whoever uses it, which could be gfx or compute.
Alex
>
> On navi48 VMID 15 has SH_MEM_CONFIG 0xc000 and SH_MEM_BASES 0 while the
> other graphics VMIDs have 0xc00c and 0x20001000. A shader storing a dword
> to an address with a byte offset of 1 writes it there in a normal
> process, but at the dword aligned address in one which reserved a VMID,
> e.g. for profiling with SPM:
>
> $ umr -i 0 -sb 0 0 0 15 -r '*.*.regSH_MEM_CONFIG'
> gfx1201.regSH_MEM_CONFIG => 0x0000c000
> $ amd_pmc --run-subtest reserved-vmid-unaligned-store
> unaligned store: 0x0000000000002a00 normally, 0x000000000000002a with a
> reserved VMID
>
> Include the SPM VMID in for_each_vmid_and_zero() for the GFXHUB so the
> constants_init() of all gfx generations program it like the other
> kernel queue VMIDs.
>
> Fixes: 8a9263fc8812 ("drm/amdgpu: use dedicated SPM VMID from the reserved
> path")
> Signed-off-by: Jesse Zhang <[email protected]>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
> index c134000eecfd..6d0f302c1344 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
> @@ -45,14 +45,17 @@
> * Equivalent to OR-ing BIT(0) into id_mgr[hub].vmid_mask and walking
> * the result with for_each_set_bit(). Used by the gfx_v*_constants_init()
> * paths which must always touch VMID 0 (system) in addition to the regular
> - * VMIDs owned by the hub.
> + * VMIDs owned by the hub. On the GFXHUB this includes the SPM VMID, which is
> + * kept out of the pool but runs the kernel queue jobs of the VM reserving
> it.
> *
> * Relies on AMDGPU_NUM_VMID (16) fitting in a single unsigned long, i.e.
> * vmid_mask[] being a 1-element bitmap.
> */
> #define for_each_vmid_and_zero(vmid, adev, hub)
> \
> for (unsigned long __vmid_mask = \
> - (adev)->vm_manager.id_mgr[(hub)].vmid_mask[0] | BIT(0); \
> + (adev)->vm_manager.id_mgr[(hub)].vmid_mask[0] | BIT(0) |
> \
> + ((hub) == AMDGPU_GFXHUB(0) && (adev)->vm_manager.spm_vmid ?
> \
> + BIT((adev)->vm_manager.spm_vmid) : 0); \
> __vmid_mask; __vmid_mask = 0) \
> for_each_set_bit((vmid), &__vmid_mask, AMDGPU_NUM_VMID)
>
> --
> 2.50.1
>