On 2019-04-17 12:20 p.m., Deucher, Alexander wrote: >> -----Original Message----- >> From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of >> Zeng, Oak >> Sent: Wednesday, April 17, 2019 10:21 AM >> To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx >> Cc: Deucher, Alexander <Alexander.Deucher@xxxxxxx>; Kuehling, Felix >> <Felix.Kuehling@xxxxxxx>; Zeng, Oak <Oak.Zeng@xxxxxxx>; Keely, Sean >> <Sean.Keely@xxxxxxx>; Koenig, Christian <Christian.Koenig@xxxxxxx> >> 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 <Oak.Zeng@xxxxxxx> >> --- >> 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 >> amd-gfx@xxxxxxxxxxxxxxxxxxxxx >> https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx