> -----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. 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