Skip to content

Commit d8e408a

Browse files
oakzengalexdeucher
authored andcommitted
drm/amdkfd: Expose HDP registers to user space
Introduce a new memory type (KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP) and expose mmio page of HDP registers to user space through this new memory type. v2: moved remapped hdp regs to adev struct v3: rename the new memory type to ALLOC_MEM_FLAGS_MMIO_REMAP v4: use more generic function name v5: Fail remapped mmio allocation for asics before gfx9 Signed-off-by: Oak Zeng <Oak.Zeng@amd.com> Reviewed-by: Felix Kuehling <felix.kuehling@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 88807dc commit d8e408a

File tree

6 files changed

+20
-3
lines changed

6 files changed

+20
-3
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,13 @@ uint64_t amdgpu_amdkfd_get_hive_id(struct kgd_dev *kgd)
519519
return adev->gmc.xgmi.hive_id;
520520
}
521521

522+
uint64_t amdgpu_amdkfd_get_mmio_remap_phys_addr(struct kgd_dev *kgd)
523+
{
524+
struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
525+
526+
return adev->rmmio_remap.bus_addr;
527+
}
528+
522529
int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine,
523530
uint32_t vmid, uint64_t gpu_addr,
524531
uint32_t *ib_cmd, uint32_t ib_len)

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ int amdgpu_amdkfd_get_dmabuf_info(struct kgd_dev *kgd, int dma_buf_fd,
169169
uint32_t *flags);
170170
uint64_t amdgpu_amdkfd_get_vram_usage(struct kgd_dev *kgd);
171171
uint64_t amdgpu_amdkfd_get_hive_id(struct kgd_dev *kgd);
172+
uint64_t amdgpu_amdkfd_get_mmio_remap_phys_addr(struct kgd_dev *kgd);
172173

173174
#define read_user_wptr(mmptr, wptr, dst) \
174175
({ \

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,7 +1109,8 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
11091109
if (!offset || !*offset)
11101110
return -EINVAL;
11111111
user_addr = *offset;
1112-
} else if (flags & ALLOC_MEM_FLAGS_DOORBELL) {
1112+
} else if (flags & (ALLOC_MEM_FLAGS_DOORBELL |
1113+
ALLOC_MEM_FLAGS_MMIO_REMAP)) {
11131114
domain = AMDGPU_GEM_DOMAIN_GTT;
11141115
alloc_domain = AMDGPU_GEM_DOMAIN_CPU;
11151116
bo_type = ttm_bo_type_sg;
@@ -1294,8 +1295,8 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
12941295
/* Free the sync object */
12951296
amdgpu_sync_free(&mem->sync);
12961297

1297-
/* If the SG is not NULL, it's one we created for a doorbell
1298-
* BO. We need to free it.
1298+
/* If the SG is not NULL, it's one we created for a doorbell or mmio
1299+
* remap BO. We need to free it.
12991300
*/
13001301
if (mem->bo->tbo.sg) {
13011302
sg_free_table(mem->bo->tbo.sg);

drivers/gpu/drm/amd/amdkfd/kfd_chardev.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,6 +1272,12 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,
12721272
if (args->size != kfd_doorbell_process_slice(dev))
12731273
return -EINVAL;
12741274
offset = kfd_get_process_doorbells(dev, p);
1275+
} else if (flags & KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP) {
1276+
if (args->size != PAGE_SIZE)
1277+
return -EINVAL;
1278+
offset = amdgpu_amdkfd_get_mmio_remap_phys_addr(dev->kgd);
1279+
if (!offset)
1280+
return -ENOMEM;
12751281
}
12761282

12771283
mutex_lock(&p->mutex);

drivers/gpu/drm/amd/include/kgd_kfd_interface.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ struct tile_config {
174174
#define ALLOC_MEM_FLAGS_GTT (1 << 1)
175175
#define ALLOC_MEM_FLAGS_USERPTR (1 << 2)
176176
#define ALLOC_MEM_FLAGS_DOORBELL (1 << 3)
177+
#define ALLOC_MEM_FLAGS_MMIO_REMAP (1 << 4)
177178

178179
/*
179180
* Allocation flags attributes/access options.

include/uapi/linux/kfd_ioctl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ struct kfd_ioctl_acquire_vm_args {
338338
#define KFD_IOC_ALLOC_MEM_FLAGS_GTT (1 << 1)
339339
#define KFD_IOC_ALLOC_MEM_FLAGS_USERPTR (1 << 2)
340340
#define KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL (1 << 3)
341+
#define KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP (1 << 4)
341342
/* Allocation flags: attributes/access options */
342343
#define KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE (1 << 31)
343344
#define KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE (1 << 30)

0 commit comments

Comments
 (0)