* [PATCH 1/3 v8] drm/amd/amdgpu: Increase max rings to enable SDMA page ring @ 2025-03-19 5:07 jesse.zhang 2025-03-19 5:07 ` [PATCH 2/3 V8] drm/amdgpu: Optimize VM invalidation engine allocation and synchronize GPU TLB flush jesse.zhang 2025-03-19 5:07 ` [PATCH 3/3 V8] drm/amdgpu/sdma_v4_4_2: update VM flush implementation for SDMA jesse.zhang 0 siblings, 2 replies; 5+ messages in thread From: jesse.zhang @ 2025-03-19 5:07 UTC (permalink / raw) To: amd-gfx Cc: Alexander.Deucher, christian.koenig, lijo.lazar, Jesse.zhang@amd.com, Jesse Zhang From: "Jesse.zhang@amd.com" <Jesse.zhang@amd.com> Increase the maximum number of rings supported by the AMDGPU driver from 133 to 149. This change is necessary to enable support for the SDMA page ring. Signed-off-by: Jesse Zhang <jesse.zhang@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h index b4fd1e17205e..bb2b66385223 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h @@ -37,7 +37,7 @@ struct amdgpu_job; struct amdgpu_vm; /* max number of rings */ -#define AMDGPU_MAX_RINGS 133 +#define AMDGPU_MAX_RINGS 149 #define AMDGPU_MAX_HWIP_RINGS 64 #define AMDGPU_MAX_GFX_RINGS 2 #define AMDGPU_MAX_SW_GFX_RINGS 2 -- 2.25.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/3 V8] drm/amdgpu: Optimize VM invalidation engine allocation and synchronize GPU TLB flush 2025-03-19 5:07 [PATCH 1/3 v8] drm/amd/amdgpu: Increase max rings to enable SDMA page ring jesse.zhang @ 2025-03-19 5:07 ` jesse.zhang 2025-03-19 7:19 ` Lazar, Lijo 2025-03-19 5:07 ` [PATCH 3/3 V8] drm/amdgpu/sdma_v4_4_2: update VM flush implementation for SDMA jesse.zhang 1 sibling, 1 reply; 5+ messages in thread From: jesse.zhang @ 2025-03-19 5:07 UTC (permalink / raw) To: amd-gfx Cc: Alexander.Deucher, christian.koenig, lijo.lazar, Jesse.zhang@amd.com, Jesse Zhang From: "Jesse.zhang@amd.com" <Jesse.zhang@amd.com> - Modify the VM invalidation engine allocation logic to handle SDMA page rings. SDMA page rings now share the VM invalidation engine with SDMA gfx rings instead of allocating a separate engine. This change ensures efficient resource management and avoids the issue of insufficient VM invalidation engines. - Add synchronization for GPU TLB flush operations in gmc_v9_0.c. Use spin_lock and spin_unlock to ensure thread safety and prevent race conditions during TLB flush operations. This improves the stability and reliability of the driver, especially in multi-threaded environments. v2: replace the sdma ring check with a function `amdgpu_sdma_is_page_queue` to check if a ring is an SDMA page queue.(Lijo) v3: Add GC version check, only enabled on GC9.4.3/9.4.4/9.5.0 v4: Fix code style and add more detailed description (Christian) v5: Remove dependency on vm_inv_eng loop order, explicitly lookup shared inv_eng(Christian/Lijo) v6: Added search shared ring function amdgpu_sdma_get_shared_ring (Lijo) Suggested-by: Lijo Lazar <lijo.lazar@amd.com> Signed-off-by: Jesse Zhang <jesse.zhang@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 19 ++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 33 +++++++++++++++++++++++- drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h | 3 +++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c index 4eefa17fa39b..26a90576792c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c @@ -573,6 +573,7 @@ int amdgpu_gmc_allocate_vm_inv_eng(struct amdgpu_device *adev) unsigned vm_inv_engs[AMDGPU_MAX_VMHUBS] = {0}; unsigned i; unsigned vmhub, inv_eng; + struct amdgpu_ring *shared_ring; /* init the vm inv eng for all vmhubs */ for_each_set_bit(i, adev->vmhubs_mask, AMDGPU_MAX_VMHUBS) { @@ -602,6 +603,24 @@ int amdgpu_gmc_allocate_vm_inv_eng(struct amdgpu_device *adev) return -EINVAL; } + /* SDMA has a special packet which allows it to use the same + * invalidation engine for all the rings in one instance. + * Therefore, we do not allocate a separate VM invalidation engine + * for SDMA page rings. Instead, they share the VM invalidation + * engine with the SDMA gfx ring. This change ensures efficient + * resource management and avoids the issue of insufficient VM + * invalidation engines. + */ + if (amdgpu_sdma_is_shared_inv_eng(adev, ring)) { + shared_ring = amdgpu_sdma_get_shared_ring(adev, ring); + if (shared_ring) { + ring->vm_inv_eng = shared_ring->vm_inv_eng; + dev_info(adev->dev, "ring %s shares VM invalidation engine %u with ring %s on hub %u\n", + ring->name, ring->vm_inv_eng, shared_ring->name, ring->vm_hub); + continue; + } + } + ring->vm_inv_eng = inv_eng - 1; vm_inv_engs[vmhub] &= ~(1 << ring->vm_inv_eng); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c index 39669f8788a7..6287159dab62 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c @@ -504,6 +504,37 @@ void amdgpu_sdma_sysfs_reset_mask_fini(struct amdgpu_device *adev) } } +struct amdgpu_ring *amdgpu_sdma_get_shared_ring(struct amdgpu_device *adev, struct amdgpu_ring *ring) +{ + if (adev->sdma.has_page_queue && ring == &adev->sdma.instance[ring->me].page) + return &adev->sdma.instance[ring->me].ring; + else + return NULL; +} + +/** +* amdgpu_sdma_is_shared_inv_eng - Check if a ring is an SDMA ring that shares a VM invalidation engine +* @adev: Pointer to the AMDGPU device structure +* @ring: Pointer to the ring structure to check +* +* This function checks if the given ring is an SDMA ring that shares a VM invalidation engine. +* It returns true if the ring is such an SDMA ring, false otherwise. +*/ +bool amdgpu_sdma_is_shared_inv_eng(struct amdgpu_device *adev, struct amdgpu_ring *ring) +{ + int i = ring->me; + + if (!adev->sdma.has_page_queue || i >= adev->sdma.num_instances) + return false; + + if (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) || + amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4) || + amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 5, 0)) + return (ring == &adev->sdma.instance[i].page); + else + return false; +} + /** * amdgpu_sdma_register_on_reset_callbacks - Register SDMA reset callbacks * @funcs: Pointer to the callback structure containing pre_reset and post_reset functions @@ -545,7 +576,7 @@ int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id, b { struct sdma_on_reset_funcs *funcs; int ret = 0; - struct amdgpu_sdma_instance *sdma_instance = &adev->sdma.instance[instance_id];; + struct amdgpu_sdma_instance *sdma_instance = &adev->sdma.instance[instance_id]; struct amdgpu_ring *gfx_ring = &sdma_instance->ring; struct amdgpu_ring *page_ring = &sdma_instance->page; bool gfx_sched_stopped = false, page_sched_stopped = false; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h index 965169320065..77288bfb4e76 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h @@ -194,4 +194,7 @@ int amdgpu_sdma_ras_sw_init(struct amdgpu_device *adev); void amdgpu_debugfs_sdma_sched_mask_init(struct amdgpu_device *adev); int amdgpu_sdma_sysfs_reset_mask_init(struct amdgpu_device *adev); void amdgpu_sdma_sysfs_reset_mask_fini(struct amdgpu_device *adev); +bool amdgpu_sdma_is_shared_inv_eng(struct amdgpu_device *adev, struct amdgpu_ring *ring); +struct amdgpu_ring *amdgpu_sdma_get_shared_ring(struct amdgpu_device *adev, + struct amdgpu_ring *ring); #endif -- 2.25.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 2/3 V8] drm/amdgpu: Optimize VM invalidation engine allocation and synchronize GPU TLB flush 2025-03-19 5:07 ` [PATCH 2/3 V8] drm/amdgpu: Optimize VM invalidation engine allocation and synchronize GPU TLB flush jesse.zhang @ 2025-03-19 7:19 ` Lazar, Lijo 0 siblings, 0 replies; 5+ messages in thread From: Lazar, Lijo @ 2025-03-19 7:19 UTC (permalink / raw) To: jesse.zhang, amd-gfx; +Cc: Alexander.Deucher, christian.koenig On 3/19/2025 10:37 AM, jesse.zhang@amd.com wrote: > From: "Jesse.zhang@amd.com" <Jesse.zhang@amd.com> > > - Modify the VM invalidation engine allocation logic to handle SDMA page rings. > SDMA page rings now share the VM invalidation engine with SDMA gfx rings instead of > allocating a separate engine. This change ensures efficient resource management and > avoids the issue of insufficient VM invalidation engines. > > - Add synchronization for GPU TLB flush operations in gmc_v9_0.c. > Use spin_lock and spin_unlock to ensure thread safety and prevent race conditions > during TLB flush operations. This improves the stability and reliability of the driver, > especially in multi-threaded environments. > > v2: replace the sdma ring check with a function `amdgpu_sdma_is_page_queue` > to check if a ring is an SDMA page queue.(Lijo) > > v3: Add GC version check, only enabled on GC9.4.3/9.4.4/9.5.0 > v4: Fix code style and add more detailed description (Christian) > v5: Remove dependency on vm_inv_eng loop order, explicitly lookup shared inv_eng(Christian/Lijo) > v6: Added search shared ring function amdgpu_sdma_get_shared_ring (Lijo) > > Suggested-by: Lijo Lazar <lijo.lazar@amd.com> > Signed-off-by: Jesse Zhang <jesse.zhang@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 19 ++++++++++++++ > drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 33 +++++++++++++++++++++++- > drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h | 3 +++ > 3 files changed, 54 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c > index 4eefa17fa39b..26a90576792c 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c > @@ -573,6 +573,7 @@ int amdgpu_gmc_allocate_vm_inv_eng(struct amdgpu_device *adev) > unsigned vm_inv_engs[AMDGPU_MAX_VMHUBS] = {0}; > unsigned i; > unsigned vmhub, inv_eng; > + struct amdgpu_ring *shared_ring; > > /* init the vm inv eng for all vmhubs */ > for_each_set_bit(i, adev->vmhubs_mask, AMDGPU_MAX_VMHUBS) { > @@ -602,6 +603,24 @@ int amdgpu_gmc_allocate_vm_inv_eng(struct amdgpu_device *adev) > return -EINVAL; > } > > + /* SDMA has a special packet which allows it to use the same > + * invalidation engine for all the rings in one instance. > + * Therefore, we do not allocate a separate VM invalidation engine > + * for SDMA page rings. Instead, they share the VM invalidation > + * engine with the SDMA gfx ring. This change ensures efficient > + * resource management and avoids the issue of insufficient VM > + * invalidation engines. > + */ > + if (amdgpu_sdma_is_shared_inv_eng(adev, ring)) { > + shared_ring = amdgpu_sdma_get_shared_ring(adev, ring); > + if (shared_ring) { > + ring->vm_inv_eng = shared_ring->vm_inv_eng; This also has an implicit assumption that the shared_ring is already assigned inv engine. Ideally, it's better if a ring and its shared ring(s) are assigned the engine in one-go. // Skip assigning individually if it's a shared ring. if (is_shared_ring(ring)) continue; // Assign engine to ring ring->vm_inv_eng = inv_eng - 1; // Assign ring (or rings) that share the same engine shared_ring = get_shared_ring(ring); if (shared_ring) shared_ring->vm_inv_eng = ring->vm_inv_eng; Thanks, Lijo > + dev_info(adev->dev, "ring %s shares VM invalidation engine %u with ring %s on hub %u\n", > + ring->name, ring->vm_inv_eng, shared_ring->name, ring->vm_hub); > + continue; > + } > + } > + > ring->vm_inv_eng = inv_eng - 1; > vm_inv_engs[vmhub] &= ~(1 << ring->vm_inv_eng); > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c > index 39669f8788a7..6287159dab62 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c > @@ -504,6 +504,37 @@ void amdgpu_sdma_sysfs_reset_mask_fini(struct amdgpu_device *adev) > } > } > > +struct amdgpu_ring *amdgpu_sdma_get_shared_ring(struct amdgpu_device *adev, struct amdgpu_ring *ring) > +{ > + if (adev->sdma.has_page_queue && ring == &adev->sdma.instance[ring->me].page) > + return &adev->sdma.instance[ring->me].ring; > + else > + return NULL; > +} > + > +/** > +* amdgpu_sdma_is_shared_inv_eng - Check if a ring is an SDMA ring that shares a VM invalidation engine > +* @adev: Pointer to the AMDGPU device structure > +* @ring: Pointer to the ring structure to check > +* > +* This function checks if the given ring is an SDMA ring that shares a VM invalidation engine. > +* It returns true if the ring is such an SDMA ring, false otherwise. > +*/ > +bool amdgpu_sdma_is_shared_inv_eng(struct amdgpu_device *adev, struct amdgpu_ring *ring) > +{ > + int i = ring->me; > + > + if (!adev->sdma.has_page_queue || i >= adev->sdma.num_instances) > + return false; > + > + if (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) || > + amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4) || > + amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 5, 0)) > + return (ring == &adev->sdma.instance[i].page); > + else > + return false; > +} > + > /** > * amdgpu_sdma_register_on_reset_callbacks - Register SDMA reset callbacks > * @funcs: Pointer to the callback structure containing pre_reset and post_reset functions > @@ -545,7 +576,7 @@ int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id, b > { > struct sdma_on_reset_funcs *funcs; > int ret = 0; > - struct amdgpu_sdma_instance *sdma_instance = &adev->sdma.instance[instance_id];; > + struct amdgpu_sdma_instance *sdma_instance = &adev->sdma.instance[instance_id]; > struct amdgpu_ring *gfx_ring = &sdma_instance->ring; > struct amdgpu_ring *page_ring = &sdma_instance->page; > bool gfx_sched_stopped = false, page_sched_stopped = false; > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h > index 965169320065..77288bfb4e76 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h > @@ -194,4 +194,7 @@ int amdgpu_sdma_ras_sw_init(struct amdgpu_device *adev); > void amdgpu_debugfs_sdma_sched_mask_init(struct amdgpu_device *adev); > int amdgpu_sdma_sysfs_reset_mask_init(struct amdgpu_device *adev); > void amdgpu_sdma_sysfs_reset_mask_fini(struct amdgpu_device *adev); > +bool amdgpu_sdma_is_shared_inv_eng(struct amdgpu_device *adev, struct amdgpu_ring *ring); > +struct amdgpu_ring *amdgpu_sdma_get_shared_ring(struct amdgpu_device *adev, > + struct amdgpu_ring *ring); > #endif ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 3/3 V8] drm/amdgpu/sdma_v4_4_2: update VM flush implementation for SDMA 2025-03-19 5:07 [PATCH 1/3 v8] drm/amd/amdgpu: Increase max rings to enable SDMA page ring jesse.zhang 2025-03-19 5:07 ` [PATCH 2/3 V8] drm/amdgpu: Optimize VM invalidation engine allocation and synchronize GPU TLB flush jesse.zhang @ 2025-03-19 5:07 ` jesse.zhang 2025-03-19 7:13 ` Lazar, Lijo 1 sibling, 1 reply; 5+ messages in thread From: jesse.zhang @ 2025-03-19 5:07 UTC (permalink / raw) To: amd-gfx Cc: Alexander.Deucher, christian.koenig, lijo.lazar, Jesse.zhang@amd.com, Jesse Zhang From: "Jesse.zhang@amd.com" <Jesse.zhang@amd.com> This commit updates the VM flush implementation for the SDMA engine. - Added a new function `sdma_v4_4_2_get_invalidate_req` to construct the VM_INVALIDATE_ENG0_REQ register value for the specified VMID and flush type. This function ensures that all relevant page table cache levels (L1 PTEs, L2 PTEs, and L2 PDEs) are invalidated. - Modified the `sdma_v4_4_2_ring_emit_vm_flush` function to use the new `sdma_v4_4_2_get_invalidate_req` function. The updated function emits the necessary register writes and waits to perform a VM flush for the specified VMID. It updates the PTB address registers and issues a VM invalidation request using the specified VM invalidation engine. - Included the necessary header file `gc/gc_9_0_sh_mask.h` to provide access to the required register definitions. v2: vm flush by the vm inalidation packet (Lijo) v3: code stle and define thh macro for the vm invalidation packet (Christian) v4: Format definition sdma vm invalidate packet (Lijo) Suggested-by: Lijo Lazar <lijo.lazar@amd.com> Signed-off-by: Jesse Zhang <jesse.zhang@amd.com> --- drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 77 +++++++++++++++---- .../gpu/drm/amd/amdgpu/vega10_sdma_pkt_open.h | 54 +++++++++++++ 2 files changed, 117 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c index fd34dc138081..06ce0c98ef5d 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c @@ -31,6 +31,7 @@ #include "amdgpu_ucode.h" #include "amdgpu_trace.h" #include "amdgpu_reset.h" +#include "gc/gc_9_0_sh_mask.h" #include "sdma/sdma_4_4_2_offset.h" #include "sdma/sdma_4_4_2_sh_mask.h" @@ -1292,21 +1293,71 @@ static void sdma_v4_4_2_ring_emit_pipeline_sync(struct amdgpu_ring *ring) seq, 0xffffffff, 4); } - -/** - * sdma_v4_4_2_ring_emit_vm_flush - vm flush using sDMA +/* + * sdma_v4_4_2_get_invalidate_req - Construct the VM_INVALIDATE_ENG0_REQ register value + * @vmid: The VMID to invalidate + * @flush_type: The type of flush (0 = legacy, 1 = lightweight, 2 = heavyweight) * - * @ring: amdgpu_ring pointer - * @vmid: vmid number to use - * @pd_addr: address + * This function constructs the VM_INVALIDATE_ENG0_REQ register value for the specified VMID + * and flush type. It ensures that all relevant page table cache levels (L1 PTEs, L2 PTEs, and + * L2 PDEs) are invalidated. + */ +static uint32_t sdma_v4_4_2_get_invalidate_req(unsigned int vmid, + uint32_t flush_type) +{ + u32 req = 0; + + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, + PER_VMID_INVALIDATE_REQ, 1 << vmid); + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, FLUSH_TYPE, flush_type); + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PTES, 1); + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE0, 1); + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE1, 1); + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE2, 1); + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L1_PTES, 1); + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, + CLEAR_PROTECTION_FAULT_STATUS_ADDR, 0); + + return req; +} + +/* + * sdma_v4_4_2_ring_emit_vm_flush - Emit VM flush commands for SDMA + * @ring: The SDMA ring + * @vmid: The VMID to flush + * @pd_addr: The page directory address * - * Update the page table base and flush the VM TLB - * using sDMA. + * This function emits the necessary register writes and waits to perform a VM flush for the + * specified VMID. It updates the PTB address registers and issues a VM invalidation request + * using the specified VM invalidation engine. */ static void sdma_v4_4_2_ring_emit_vm_flush(struct amdgpu_ring *ring, - unsigned vmid, uint64_t pd_addr) + unsigned int vmid, uint64_t pd_addr) { - amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr); + struct amdgpu_device *adev = ring->adev; + uint32_t req = sdma_v4_4_2_get_invalidate_req(vmid, 0); + unsigned int eng = ring->vm_inv_eng; + struct amdgpu_vmhub *hub = &adev->vmhub[ring->vm_hub]; + + amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_lo32 + + (hub->ctx_addr_distance * vmid), + lower_32_bits(pd_addr)); + + amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_hi32 + + (hub->ctx_addr_distance * vmid), + upper_32_bits(pd_addr)); + /* + * Construct and emit the VM invalidation packet + */ + amdgpu_ring_write(ring, + SDMA_PKT_VM_INVALIDATE_HEADER_OP(SDMA_OP_VM_INVALIDATE) | + SDMA_PKT_VM_INVALIDATE_HEADER_SUB_OP(SDMA_SUBOP_VM_INVALIDATE) | + SDMA_PKT_VM_INVALIDATE_HEADER_XCC0_ENGINE_ID(0x1f) | + SDMA_PKT_VM_INVALIDATE_HEADER_XCC1_ENGINE_ID(0x1f | + SDMA_PKT_VM_INVALIDATE_HEADER_MMHUB_ENGINE_ID(eng))); + amdgpu_ring_write(ring, VM_INVALIDATE_REQ_INVALIDATE(req)); + amdgpu_ring_write(ring, 0); + amdgpu_ring_write(ring, VM_INVALIDATE_ADDR_RANGE_INVALIDATE_ACK(BIT(vmid))); } static void sdma_v4_4_2_ring_emit_wreg(struct amdgpu_ring *ring, @@ -2115,8 +2166,7 @@ static const struct amdgpu_ring_funcs sdma_v4_4_2_ring_funcs = { 3 + /* hdp invalidate */ 6 + /* sdma_v4_4_2_ring_emit_pipeline_sync */ /* sdma_v4_4_2_ring_emit_vm_flush */ - SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 + - SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 6 + + 4 + 2 * 3 + 10 + 10 + 10, /* sdma_v4_4_2_ring_emit_fence x3 for user fence, vm fence */ .emit_ib_size = 7 + 6, /* sdma_v4_4_2_ring_emit_ib */ .emit_ib = sdma_v4_4_2_ring_emit_ib, @@ -2148,8 +2198,7 @@ static const struct amdgpu_ring_funcs sdma_v4_4_2_page_ring_funcs = { 3 + /* hdp invalidate */ 6 + /* sdma_v4_4_2_ring_emit_pipeline_sync */ /* sdma_v4_4_2_ring_emit_vm_flush */ - SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 + - SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 6 + + 4 + 2 * 3 + 10 + 10 + 10, /* sdma_v4_4_2_ring_emit_fence x3 for user fence, vm fence */ .emit_ib_size = 7 + 6, /* sdma_v4_4_2_ring_emit_ib */ .emit_ib = sdma_v4_4_2_ring_emit_ib, diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_sdma_pkt_open.h b/drivers/gpu/drm/amd/amdgpu/vega10_sdma_pkt_open.h index 8de4ccce5e38..2da2e2443c87 100644 --- a/drivers/gpu/drm/amd/amdgpu/vega10_sdma_pkt_open.h +++ b/drivers/gpu/drm/amd/amdgpu/vega10_sdma_pkt_open.h @@ -64,6 +64,9 @@ #define HEADER_BARRIER 5 #define SDMA_OP_AQL_COPY 0 #define SDMA_OP_AQL_BARRIER_OR 0 +/* vm invalidation is only available for GC9.4.3/GC9.4.4/GC9.5.0 */ +#define SDMA_OP_VM_INVALIDATE 8 +#define SDMA_SUBOP_VM_INVALIDATE 4 /*define for op field*/ #define SDMA_PKT_HEADER_op_offset 0 @@ -3331,5 +3334,56 @@ #define SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift 0 #define SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_COMPLETION_SIGNAL_63_32(x) (((x) & SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift) +/* +** Definitions for SDMA_VM_INVALIDATION packet +*/ +/* Define for HEADER word (DW0) */ +#define SDMA_PKT_VM_INVALIDATE_HEADER_op_offset 0 +#define SDMA_PKT_VM_INVALIDATE_HEADER_op_mask 0x000000FF +#define SDMA_PKT_VM_INVALIDATE_HEADER_op_shift 0 +#define SDMA_PKT_VM_INVALIDATE_HEADER_OP(x) (((x) & SDMA_PKT_VM_INVALIDATE_HEADER_op_mask) << SDMA_PKT_VM_INVALIDATE_HEADER_op_shift) + +#define SDMA_PKT_VM_INVALIDATE_HEADER_SUB_op_offset 8 +#define SDMA_PKT_VM_INVALIDATE_HEADER_SUB_op_mask 0x000000FF +#define SDMA_PKT_VM_INVALIDATE_HEADER_SUB_op_shift 8 +#define SDMA_PKT_VM_INVALIDATE_HEADER_SUB_OP(x) (((x) & SDMA_PKT_VM_INVALIDATE_HEADER_SUB_op_mask) << SDMA_PKT_VM_INVALIDATE_HEADER_SUB_op_shift) + +#define SDMA_PKT_VM_INVALIDATE_HEADER_xcc0_engine_id_offset 16 +#define SDMA_PKT_VM_INVALIDATE_HEADER_xcc0_engine_id_mask 0x0000001F +#define SDMA_PKT_VM_INVALIDATE_HEADER_xcc0_engine_id_shift 16 +#define SDMA_PKT_VM_INVALIDATE_HEADER_XCC0_ENGINE_ID(x) (((x) & SDMA_PKT_VM_INVALIDATE_HEADER_xcc0_engine_id_mask) << SDMA_PKT_VM_INVALIDATE_HEADER_xcc0_engine_id_shift) + +#define SDMA_PKT_VM_INVALIDATE_HEADER_xcc1_engine_id_offset 21 +#define SDMA_PKT_VM_INVALIDATE_HEADER_xcc1_engine_id_mask 0x0000003E +#define SDMA_PKT_VM_INVALIDATE_HEADER_xcc1_engine_id_shift 21 +#define SDMA_PKT_VM_INVALIDATE_HEADER_XCC1_ENGINE_ID(x) (((x) & SDMA_PKT_VM_INVALIDATE_HEADER_xcc1_engine_id_mask) << SDMA_PKT_VM_INVALIDATE_HEADER_xcc1_engine_id_shift) + +#define SDMA_PKT_VM_INVALIDATE_HEADER_mmhub_engine_id_offset 26 +#define SDMA_PKT_VM_INVALIDATE_HEADER_mmhub_engine_id_mask 0x0000007C +#define SDMA_PKT_VM_INVALIDATE_HEADER_mmhub_engine_id_shift 26 +#define SDMA_PKT_VM_INVALIDATE_HEADER_MMHUB_ENGINE_ID(x) (((x) & SDMA_PKT_VM_INVALIDATE_HEADER_mmhub_engine_id_mask) << SDMA_PKT_VM_INVALIDATE_HEADER_mmhub_engine_id_shift) + +/* Define for INVALIDATEREQ word (DW1) */ +#define VM_INVALIDATE_req_invalidate_offset 0 +#define VM_INVALIDATE_req_invalidate_mask 0xFFFFFFFF +#define VM_INVALIDATE_req_invalidate_shift 0 +#define VM_INVALIDATE_REQ_INVALIDATE(x) (((x) & VM_INVALIDATE_req_invalidate_mask) << VM_INVALIDATE_req_invalidate_shift) + +/* Define for ADDRESSRANGELO word (DW2) */ +#define VM_INVALIDATE_ADDR_RANGE_LO_addr_31_0_offset 0 +#define VM_INVALIDATE_ADDR_RANGE_LO_addr_31_0_mask 0xFFFFFFFF +#define VM_INVALIDATE_ADDR_RANGE_LO_addr_31_0_shift 0 +#define VM_INVALIDATE_ADDR_RANGE_LO_ADDR_31_0(x) (((x) & VM_INVALIDATE_ADDR_RANGE_LO_addr_31_0_mask) << VM_INVALIDATE_ADDR_RANGE_LO_addr_31_0_shift) + +#define VM_INVALIDATE_ADDR_RANGE_HI_addr_64_32_offset 16 +#define VM_INVALIDATE_ADDR_RANGE_HI_addr_64_32_mask 0x0000001F +#define VM_INVALIDATE_ADDR_RANGE_HI_addr_64_32_shift 16 +#define VM_INVALIDATE_ADDR_RANGE_HI_ADDR_64_32(x) (((x) & VM_INVALIDATE_ADDR_RANGE_HI_addr_64_32_mask) << VM_INVALIDATE_ADDR_RANGE_HI_addr_64_32_shift) + +/* Define for ADDRESSRANGEHI and INVALIDATEACK word (DW3) */ +#define VM_INVALIDATE_ADDR_RANGE_invalidate_ack_offset 0 +#define VM_INVALIDATE_ADDR_RANGE_invalidate_ack_mask 0x0000FFFF +#define VM_INVALIDATE_ADDR_RANGE_invalidate_ack_shift 0 +#define VM_INVALIDATE_ADDR_RANGE_INVALIDATE_ACK(x) (((x) & VM_INVALIDATE_ADDR_RANGE_invalidate_ack_mask) << VM_INVALIDATE_ADDR_RANGE_invalidate_ack_shift) #endif /* __SDMA_PKT_OPEN_H_ */ -- 2.25.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 3/3 V8] drm/amdgpu/sdma_v4_4_2: update VM flush implementation for SDMA 2025-03-19 5:07 ` [PATCH 3/3 V8] drm/amdgpu/sdma_v4_4_2: update VM flush implementation for SDMA jesse.zhang @ 2025-03-19 7:13 ` Lazar, Lijo 0 siblings, 0 replies; 5+ messages in thread From: Lazar, Lijo @ 2025-03-19 7:13 UTC (permalink / raw) To: jesse.zhang, amd-gfx; +Cc: Alexander.Deucher, christian.koenig On 3/19/2025 10:37 AM, jesse.zhang@amd.com wrote: > From: "Jesse.zhang@amd.com" <Jesse.zhang@amd.com> > > This commit updates the VM flush implementation for the SDMA engine. > > - Added a new function `sdma_v4_4_2_get_invalidate_req` to construct the VM_INVALIDATE_ENG0_REQ > register value for the specified VMID and flush type. This function ensures that all relevant > page table cache levels (L1 PTEs, L2 PTEs, and L2 PDEs) are invalidated. > > - Modified the `sdma_v4_4_2_ring_emit_vm_flush` function to use the new `sdma_v4_4_2_get_invalidate_req` > function. The updated function emits the necessary register writes and waits to perform a VM flush > for the specified VMID. It updates the PTB address registers and issues a VM invalidation request > using the specified VM invalidation engine. > > - Included the necessary header file `gc/gc_9_0_sh_mask.h` to provide access to the required register > definitions. > > v2: vm flush by the vm inalidation packet (Lijo) > v3: code stle and define thh macro for the vm invalidation packet (Christian) > v4: Format definition sdma vm invalidate packet (Lijo) > > Suggested-by: Lijo Lazar <lijo.lazar@amd.com> > Signed-off-by: Jesse Zhang <jesse.zhang@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 77 +++++++++++++++---- > .../gpu/drm/amd/amdgpu/vega10_sdma_pkt_open.h | 54 +++++++++++++ > 2 files changed, 117 insertions(+), 14 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c > index fd34dc138081..06ce0c98ef5d 100644 > --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c > +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c > @@ -31,6 +31,7 @@ > #include "amdgpu_ucode.h" > #include "amdgpu_trace.h" > #include "amdgpu_reset.h" > +#include "gc/gc_9_0_sh_mask.h" > > #include "sdma/sdma_4_4_2_offset.h" > #include "sdma/sdma_4_4_2_sh_mask.h" > @@ -1292,21 +1293,71 @@ static void sdma_v4_4_2_ring_emit_pipeline_sync(struct amdgpu_ring *ring) > seq, 0xffffffff, 4); > } > > - > -/** > - * sdma_v4_4_2_ring_emit_vm_flush - vm flush using sDMA > +/* > + * sdma_v4_4_2_get_invalidate_req - Construct the VM_INVALIDATE_ENG0_REQ register value > + * @vmid: The VMID to invalidate > + * @flush_type: The type of flush (0 = legacy, 1 = lightweight, 2 = heavyweight) > * > - * @ring: amdgpu_ring pointer > - * @vmid: vmid number to use > - * @pd_addr: address > + * This function constructs the VM_INVALIDATE_ENG0_REQ register value for the specified VMID > + * and flush type. It ensures that all relevant page table cache levels (L1 PTEs, L2 PTEs, and > + * L2 PDEs) are invalidated. > + */ > +static uint32_t sdma_v4_4_2_get_invalidate_req(unsigned int vmid, > + uint32_t flush_type) > +{ > + u32 req = 0; > + > + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, > + PER_VMID_INVALIDATE_REQ, 1 << vmid); > + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, FLUSH_TYPE, flush_type); > + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PTES, 1); > + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE0, 1); > + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE1, 1); > + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE2, 1); > + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L1_PTES, 1); > + req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, > + CLEAR_PROTECTION_FAULT_STATUS_ADDR, 0); > + > + return req; > +} > + > +/* > + * sdma_v4_4_2_ring_emit_vm_flush - Emit VM flush commands for SDMA > + * @ring: The SDMA ring > + * @vmid: The VMID to flush > + * @pd_addr: The page directory address > * > - * Update the page table base and flush the VM TLB > - * using sDMA. > + * This function emits the necessary register writes and waits to perform a VM flush for the > + * specified VMID. It updates the PTB address registers and issues a VM invalidation request > + * using the specified VM invalidation engine. > */ > static void sdma_v4_4_2_ring_emit_vm_flush(struct amdgpu_ring *ring, > - unsigned vmid, uint64_t pd_addr) > + unsigned int vmid, uint64_t pd_addr) > { > - amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr); > + struct amdgpu_device *adev = ring->adev; > + uint32_t req = sdma_v4_4_2_get_invalidate_req(vmid, 0); > + unsigned int eng = ring->vm_inv_eng; > + struct amdgpu_vmhub *hub = &adev->vmhub[ring->vm_hub]; > + > + amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_lo32 + > + (hub->ctx_addr_distance * vmid), > + lower_32_bits(pd_addr)); > + > + amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_hi32 + > + (hub->ctx_addr_distance * vmid), > + upper_32_bits(pd_addr)); > + /* > + * Construct and emit the VM invalidation packet > + */ > + amdgpu_ring_write(ring, > + SDMA_PKT_VM_INVALIDATE_HEADER_OP(SDMA_OP_VM_INVALIDATE) | > + SDMA_PKT_VM_INVALIDATE_HEADER_SUB_OP(SDMA_SUBOP_VM_INVALIDATE) | > + SDMA_PKT_VM_INVALIDATE_HEADER_XCC0_ENGINE_ID(0x1f) | > + SDMA_PKT_VM_INVALIDATE_HEADER_XCC1_ENGINE_ID(0x1f | > + SDMA_PKT_VM_INVALIDATE_HEADER_MMHUB_ENGINE_ID(eng))); > + amdgpu_ring_write(ring, VM_INVALIDATE_REQ_INVALIDATE(req)); > + amdgpu_ring_write(ring, 0); > + amdgpu_ring_write(ring, VM_INVALIDATE_ADDR_RANGE_INVALIDATE_ACK(BIT(vmid))); > } > > static void sdma_v4_4_2_ring_emit_wreg(struct amdgpu_ring *ring, > @@ -2115,8 +2166,7 @@ static const struct amdgpu_ring_funcs sdma_v4_4_2_ring_funcs = { > 3 + /* hdp invalidate */ > 6 + /* sdma_v4_4_2_ring_emit_pipeline_sync */ > /* sdma_v4_4_2_ring_emit_vm_flush */ > - SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 + > - SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 6 + > + 4 + 2 * 3 + > 10 + 10 + 10, /* sdma_v4_4_2_ring_emit_fence x3 for user fence, vm fence */ > .emit_ib_size = 7 + 6, /* sdma_v4_4_2_ring_emit_ib */ > .emit_ib = sdma_v4_4_2_ring_emit_ib, > @@ -2148,8 +2198,7 @@ static const struct amdgpu_ring_funcs sdma_v4_4_2_page_ring_funcs = { > 3 + /* hdp invalidate */ > 6 + /* sdma_v4_4_2_ring_emit_pipeline_sync */ > /* sdma_v4_4_2_ring_emit_vm_flush */ > - SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 + > - SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 6 + > + 4 + 2 * 3 + > 10 + 10 + 10, /* sdma_v4_4_2_ring_emit_fence x3 for user fence, vm fence */ > .emit_ib_size = 7 + 6, /* sdma_v4_4_2_ring_emit_ib */ > .emit_ib = sdma_v4_4_2_ring_emit_ib, > diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_sdma_pkt_open.h b/drivers/gpu/drm/amd/amdgpu/vega10_sdma_pkt_open.h > index 8de4ccce5e38..2da2e2443c87 100644 > --- a/drivers/gpu/drm/amd/amdgpu/vega10_sdma_pkt_open.h > +++ b/drivers/gpu/drm/amd/amdgpu/vega10_sdma_pkt_open.h > @@ -64,6 +64,9 @@ > #define HEADER_BARRIER 5 > #define SDMA_OP_AQL_COPY 0 > #define SDMA_OP_AQL_BARRIER_OR 0 > +/* vm invalidation is only available for GC9.4.3/GC9.4.4/GC9.5.0 */ > +#define SDMA_OP_VM_INVALIDATE 8 > +#define SDMA_SUBOP_VM_INVALIDATE 4 > > /*define for op field*/ > #define SDMA_PKT_HEADER_op_offset 0 > @@ -3331,5 +3334,56 @@ > #define SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift 0 > #define SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_COMPLETION_SIGNAL_63_32(x) (((x) & SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift) > > +/* > +** Definitions for SDMA_VM_INVALIDATION packet > +*/ > > +/* Define for HEADER word (DW0) */ > +#define SDMA_PKT_VM_INVALIDATE_HEADER_op_offset 0 > +#define SDMA_PKT_VM_INVALIDATE_HEADER_op_mask 0x000000FF > +#define SDMA_PKT_VM_INVALIDATE_HEADER_op_shift 0 > +#define SDMA_PKT_VM_INVALIDATE_HEADER_OP(x) (((x) & SDMA_PKT_VM_INVALIDATE_HEADER_op_mask) << SDMA_PKT_VM_INVALIDATE_HEADER_op_shift) > + > +#define SDMA_PKT_VM_INVALIDATE_HEADER_SUB_op_offset 8 By consistent format, I meant - _offset = DWORD offset _mask = Mask of the field _shift = shift required for the field within that DWORD Besides, all defines start with SDMA_PKT_<packet name>_<dword name>_<field name>_offset SDMA_PKT_<packet name>_<dword name>_<field name>_mask SDMA_PKT_<packet name>_<dword name>_<field name>_shift Or, better approach design/verif team to generate the header and copy directly. Thanks, Lijo > +#define SDMA_PKT_VM_INVALIDATE_HEADER_SUB_op_mask 0x000000FF > +#define SDMA_PKT_VM_INVALIDATE_HEADER_SUB_op_shift 8 > +#define SDMA_PKT_VM_INVALIDATE_HEADER_SUB_OP(x) (((x) & SDMA_PKT_VM_INVALIDATE_HEADER_SUB_op_mask) << SDMA_PKT_VM_INVALIDATE_HEADER_SUB_op_shift) > + > +#define SDMA_PKT_VM_INVALIDATE_HEADER_xcc0_engine_id_offset 16 > +#define SDMA_PKT_VM_INVALIDATE_HEADER_xcc0_engine_id_mask 0x0000001F > +#define SDMA_PKT_VM_INVALIDATE_HEADER_xcc0_engine_id_shift 16 > +#define SDMA_PKT_VM_INVALIDATE_HEADER_XCC0_ENGINE_ID(x) (((x) & SDMA_PKT_VM_INVALIDATE_HEADER_xcc0_engine_id_mask) << SDMA_PKT_VM_INVALIDATE_HEADER_xcc0_engine_id_shift) > + > +#define SDMA_PKT_VM_INVALIDATE_HEADER_xcc1_engine_id_offset 21 > +#define SDMA_PKT_VM_INVALIDATE_HEADER_xcc1_engine_id_mask 0x0000003E > +#define SDMA_PKT_VM_INVALIDATE_HEADER_xcc1_engine_id_shift 21 > +#define SDMA_PKT_VM_INVALIDATE_HEADER_XCC1_ENGINE_ID(x) (((x) & SDMA_PKT_VM_INVALIDATE_HEADER_xcc1_engine_id_mask) << SDMA_PKT_VM_INVALIDATE_HEADER_xcc1_engine_id_shift) > + > +#define SDMA_PKT_VM_INVALIDATE_HEADER_mmhub_engine_id_offset 26 > +#define SDMA_PKT_VM_INVALIDATE_HEADER_mmhub_engine_id_mask 0x0000007C > +#define SDMA_PKT_VM_INVALIDATE_HEADER_mmhub_engine_id_shift 26 > +#define SDMA_PKT_VM_INVALIDATE_HEADER_MMHUB_ENGINE_ID(x) (((x) & SDMA_PKT_VM_INVALIDATE_HEADER_mmhub_engine_id_mask) << SDMA_PKT_VM_INVALIDATE_HEADER_mmhub_engine_id_shift) > + > +/* Define for INVALIDATEREQ word (DW1) */ > +#define VM_INVALIDATE_req_invalidate_offset 0 > +#define VM_INVALIDATE_req_invalidate_mask 0xFFFFFFFF > +#define VM_INVALIDATE_req_invalidate_shift 0 > +#define VM_INVALIDATE_REQ_INVALIDATE(x) (((x) & VM_INVALIDATE_req_invalidate_mask) << VM_INVALIDATE_req_invalidate_shift) > + > +/* Define for ADDRESSRANGELO word (DW2) */ > +#define VM_INVALIDATE_ADDR_RANGE_LO_addr_31_0_offset 0 > +#define VM_INVALIDATE_ADDR_RANGE_LO_addr_31_0_mask 0xFFFFFFFF > +#define VM_INVALIDATE_ADDR_RANGE_LO_addr_31_0_shift 0 > +#define VM_INVALIDATE_ADDR_RANGE_LO_ADDR_31_0(x) (((x) & VM_INVALIDATE_ADDR_RANGE_LO_addr_31_0_mask) << VM_INVALIDATE_ADDR_RANGE_LO_addr_31_0_shift) > + > +#define VM_INVALIDATE_ADDR_RANGE_HI_addr_64_32_offset 16 > +#define VM_INVALIDATE_ADDR_RANGE_HI_addr_64_32_mask 0x0000001F > +#define VM_INVALIDATE_ADDR_RANGE_HI_addr_64_32_shift 16 > +#define VM_INVALIDATE_ADDR_RANGE_HI_ADDR_64_32(x) (((x) & VM_INVALIDATE_ADDR_RANGE_HI_addr_64_32_mask) << VM_INVALIDATE_ADDR_RANGE_HI_addr_64_32_shift) > + > +/* Define for ADDRESSRANGEHI and INVALIDATEACK word (DW3) */ > +#define VM_INVALIDATE_ADDR_RANGE_invalidate_ack_offset 0 > +#define VM_INVALIDATE_ADDR_RANGE_invalidate_ack_mask 0x0000FFFF > +#define VM_INVALIDATE_ADDR_RANGE_invalidate_ack_shift 0 > +#define VM_INVALIDATE_ADDR_RANGE_INVALIDATE_ACK(x) (((x) & VM_INVALIDATE_ADDR_RANGE_invalidate_ack_mask) << VM_INVALIDATE_ADDR_RANGE_invalidate_ack_shift) > #endif /* __SDMA_PKT_OPEN_H_ */ ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-03-19 7:19 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-03-19 5:07 [PATCH 1/3 v8] drm/amd/amdgpu: Increase max rings to enable SDMA page ring jesse.zhang 2025-03-19 5:07 ` [PATCH 2/3 V8] drm/amdgpu: Optimize VM invalidation engine allocation and synchronize GPU TLB flush jesse.zhang 2025-03-19 7:19 ` Lazar, Lijo 2025-03-19 5:07 ` [PATCH 3/3 V8] drm/amdgpu/sdma_v4_4_2: update VM flush implementation for SDMA jesse.zhang 2025-03-19 7:13 ` Lazar, Lijo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).