On 2019-04-17 12:20 p.m., Deucher, Alexander wrote: >> -----Original Message----- >> From: amd-gfx <[email protected]> On Behalf Of >> Zeng, Oak >> Sent: Wednesday, April 17, 2019 10:21 AM >> To: [email protected] >> Cc: Deucher, Alexander <[email protected]>; Kuehling, Felix >> <[email protected]>; Zeng, Oak <[email protected]>; Keely, Sean >> <[email protected]>; Koenig, Christian <[email protected]> >> Subject: [PATCH 2/2] drm/amdkfd: Expose HDP registers to user space >> >> Introduce a new memory type (KFD_IOC_ALLOC_MEM_FLAGS_HDP_FLUSH) > I'd suggest calling this something like ALLOC_MEM_FLAGS_MMIO_REMAP or > something like that in case we end up needing to remap other registers in the > future.
So that's assuming other registers would get remapped into the same page. Makes sense. Regards, Felix > > Alex > >> and expose mmio page of HDP registers to user space through this new >> memory type. >> >> v2: moved remapped hdp regs to adev struct >> >> Change-Id: If5ac13c46ea7fbd2194ddc8b2ece26ef4f76c330 >> Signed-off-by: Oak Zeng <[email protected]> >> --- >> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 7 +++++++ >> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 1 + >> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 7 ++++--- >> drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 4 ++++ >> drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 1 + >> include/uapi/linux/kfd_ioctl.h | 1 + >> 6 files changed, 18 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c >> index acf8ae0..d953338b8 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c >> @@ -482,6 +482,13 @@ uint64_t amdgpu_amdkfd_get_hive_id(struct >> kgd_dev *kgd) >> return adev->gmc.xgmi.hive_id; >> } >> >> +uint64_t amdgpu_amdkfd_get_hdp_register_physical_addr(struct kgd_dev >> +*kgd) { >> + struct amdgpu_device *adev = (struct amdgpu_device *)kgd; >> + >> + return >> +adev- >>> remapped_hdp_reg.remapped_hdp_mem_flush_cntl_physical_addr; >> +} >> + >> int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum >> kgd_engine_type engine, >> uint32_t vmid, uint64_t gpu_addr, >> uint32_t *ib_cmd, uint32_t ib_len) >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h >> index e6a5037..e778679 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h >> @@ -154,6 +154,7 @@ int amdgpu_amdkfd_get_dmabuf_info(struct >> kgd_dev *kgd, int dma_buf_fd, >> uint32_t *flags); >> uint64_t amdgpu_amdkfd_get_vram_usage(struct kgd_dev *kgd); uint64_t >> amdgpu_amdkfd_get_hive_id(struct kgd_dev *kgd); >> +uint64_t amdgpu_amdkfd_get_hdp_register_physical_addr(struct kgd_dev >> +*kgd); >> >> #define read_user_wptr(mmptr, wptr, dst) \ >> ({ \ >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c >> index 047bba8..4394f61 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c >> @@ -1087,7 +1087,8 @@ int >> amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( >> if (!offset || !*offset) >> return -EINVAL; >> user_addr = *offset; >> - } else if (flags & ALLOC_MEM_FLAGS_DOORBELL) { >> + } else if (flags & (ALLOC_MEM_FLAGS_DOORBELL | >> + ALLOC_MEM_FLAGS_HDP_FLUSH)) { >> domain = AMDGPU_GEM_DOMAIN_GTT; >> alloc_domain = AMDGPU_GEM_DOMAIN_CPU; >> bo_type = ttm_bo_type_sg; >> @@ -1263,8 +1264,8 @@ int >> amdgpu_amdkfd_gpuvm_free_memory_of_gpu( >> /* Free the sync object */ >> amdgpu_sync_free(&mem->sync); >> >> - /* If the SG is not NULL, it's one we created for a doorbell >> - * BO. We need to free it. >> + /* If the SG is not NULL, it's one we created for a doorbell or hdp >> + * flush BO. We need to free it. >> */ >> if (mem->bo->tbo.sg) { >> sg_free_table(mem->bo->tbo.sg); >> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c >> b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c >> index 083bd81..973d2fe 100644 >> --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c >> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c >> @@ -1272,6 +1272,10 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct >> file *filep, >> if (args->size != kfd_doorbell_process_slice(dev)) >> return -EINVAL; >> offset = kfd_get_process_doorbells(dev, p); >> + } else if (flags & KFD_IOC_ALLOC_MEM_FLAGS_HDP_FLUSH) { >> + if (args->size != PAGE_SIZE) >> + return -EINVAL; >> + offset = >> amdgpu_amdkfd_get_hdp_register_physical_addr(dev->kgd); >> } >> >> mutex_lock(&p->mutex); >> diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h >> b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h >> index 5f3c10e..3bc78b26 100644 >> --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h >> +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h >> @@ -186,6 +186,7 @@ struct tile_config { >> #define ALLOC_MEM_FLAGS_GTT (1 << 1) >> #define ALLOC_MEM_FLAGS_USERPTR (1 << 2) >> #define ALLOC_MEM_FLAGS_DOORBELL (1 << 3) >> +#define ALLOC_MEM_FLAGS_HDP_FLUSH (1 << 4) >> >> /* >> * Allocation flags attributes/access options. >> diff --git a/include/uapi/linux/kfd_ioctl.h b/include/uapi/linux/kfd_ioctl.h >> index dc067ed..96afd01 100644 >> --- a/include/uapi/linux/kfd_ioctl.h >> +++ b/include/uapi/linux/kfd_ioctl.h >> @@ -338,6 +338,7 @@ struct kfd_ioctl_acquire_vm_args { >> #define KFD_IOC_ALLOC_MEM_FLAGS_GTT (1 << 1) >> #define KFD_IOC_ALLOC_MEM_FLAGS_USERPTR (1 << 2) >> #define KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL (1 << 3) >> +#define KFD_IOC_ALLOC_MEM_FLAGS_HDP_FLUSH (1 << 4) >> /* Allocation flags: attributes/access options */ >> #define KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE (1 << 31) >> #define KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE (1 << 30) >> -- >> 2.7.4 >> >> _______________________________________________ >> amd-gfx mailing list >> [email protected] >> https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/amd-gfx
