[PATCH 2/2] drm/amdkfd: Expose HDP registers to user space

Kuehling, Felix Felix.Kuehling at amd.com
Wed Apr 17 21:13:53 UTC 2019


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


More information about the amd-gfx mailing list