From: Honglei Huang <[email protected]>

Add necessary data structures to support tracking multiple user
address ranges within a single memory object.

The user_range_info structure tracks individual ranges with their
own HMM ranges and MMU notifiers, allowing per-range invalidation
tracking. The kgd_mem structure is extended to hold an array of
these ranges.

Signed-off-by: Honglei Huang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index 321cbf9a1..1883833a2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -48,6 +48,7 @@ enum TLB_FLUSH_TYPE {
 
 struct amdgpu_device;
 struct kfd_process_device;
+struct kfd_ioctl_userptr_range;
 struct amdgpu_reset_context;
 
 enum kfd_mem_attachment_type {
@@ -67,6 +68,15 @@ struct kfd_mem_attachment {
        uint64_t pte_flags;
 };
 
+struct user_range_info {
+       uint64_t start;                 /* CPU virtual address start */
+       uint64_t size;                  /* Size in bytes */
+       struct hmm_range *range;        /* HMM range for this userptr */
+       uint32_t invalid;               /* Invalidation counter */
+       struct mmu_interval_notifier notifier;  /* MMU notifier for this range 
*/
+       struct kgd_mem *mem;            /* Back pointer to parent kgd_mem */
+};
+
 struct kgd_mem {
        struct mutex lock;
        struct amdgpu_bo *bo;
@@ -89,6 +99,12 @@ struct kgd_mem {
        uint32_t gem_handle;
        bool aql_queue;
        bool is_imported;
+
+       /* For batch userptr allocation: multiple non-contiguous CPU VA ranges
+        * mapped to a single contiguous GPU VA range
+        */
+       uint32_t num_user_ranges;
+       struct user_range_info *user_ranges;
 };
 
 /* KFD Memory Eviction */
@@ -313,6 +329,11 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
                struct amdgpu_device *adev, uint64_t va, uint64_t size,
                void *drm_priv, struct kgd_mem **mem,
                uint64_t *offset, uint32_t flags, bool criu_resume);
+int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu_batch(
+               struct amdgpu_device *adev, uint64_t va, uint64_t size,
+               void *drm_priv, struct kgd_mem **mem,
+               uint64_t *offset, struct kfd_ioctl_userptr_range *ranges,
+               uint32_t num_ranges, uint32_t flags, bool criu_resume);
 int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
                struct amdgpu_device *adev, struct kgd_mem *mem, void *drm_priv,
                uint64_t *size);
-- 
2.34.1

Reply via email to