diff options
author | Oak Zeng <Oak.Zeng@amd.com> | 2019-04-11 15:43:39 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2019-05-24 13:20:47 -0400 |
commit | d8e408a82704c86ba87c3d58cfe69dcdb758aa07 (patch) | |
tree | 3cb4be068142e653816c43541852b5116283a4ff | |
parent | 88807dc8d573c0f718d0d26f592f212c5a487cf0 (diff) |
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>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 1 | ||||
-rw-r--r-- | include/uapi/linux/kfd_ioctl.h | 1 |
6 files changed, 20 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index aeead072fa79..401edb605fdd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | |||
@@ -519,6 +519,13 @@ uint64_t amdgpu_amdkfd_get_hive_id(struct kgd_dev *kgd) | |||
519 | return adev->gmc.xgmi.hive_id; | 519 | return adev->gmc.xgmi.hive_id; |
520 | } | 520 | } |
521 | 521 | ||
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 | |||
522 | int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine, | 529 | int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine, |
523 | uint32_t vmid, uint64_t gpu_addr, | 530 | uint32_t vmid, uint64_t gpu_addr, |
524 | uint32_t *ib_cmd, uint32_t ib_len) | 531 | 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 4e37fa7e85b1..ea1f141db3ff 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | |||
@@ -169,6 +169,7 @@ int amdgpu_amdkfd_get_dmabuf_info(struct kgd_dev *kgd, int dma_buf_fd, | |||
169 | uint32_t *flags); | 169 | uint32_t *flags); |
170 | uint64_t amdgpu_amdkfd_get_vram_usage(struct kgd_dev *kgd); | 170 | uint64_t amdgpu_amdkfd_get_vram_usage(struct kgd_dev *kgd); |
171 | uint64_t amdgpu_amdkfd_get_hive_id(struct kgd_dev *kgd); | 171 | 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); | ||
172 | 173 | ||
173 | #define read_user_wptr(mmptr, wptr, dst) \ | 174 | #define read_user_wptr(mmptr, wptr, dst) \ |
174 | ({ \ | 175 | ({ \ |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index a6e5184d436c..00e013581a70 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | |||
@@ -1109,7 +1109,8 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( | |||
1109 | if (!offset || !*offset) | 1109 | if (!offset || !*offset) |
1110 | return -EINVAL; | 1110 | return -EINVAL; |
1111 | user_addr = *offset; | 1111 | 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)) { | ||
1113 | domain = AMDGPU_GEM_DOMAIN_GTT; | 1114 | domain = AMDGPU_GEM_DOMAIN_GTT; |
1114 | alloc_domain = AMDGPU_GEM_DOMAIN_CPU; | 1115 | alloc_domain = AMDGPU_GEM_DOMAIN_CPU; |
1115 | bo_type = ttm_bo_type_sg; | 1116 | bo_type = ttm_bo_type_sg; |
@@ -1294,8 +1295,8 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu( | |||
1294 | /* Free the sync object */ | 1295 | /* Free the sync object */ |
1295 | amdgpu_sync_free(&mem->sync); | 1296 | amdgpu_sync_free(&mem->sync); |
1296 | 1297 | ||
1297 | /* If the SG is not NULL, it's one we created for a doorbell | 1298 | /* If the SG is not NULL, it's one we created for a doorbell or mmio |
1298 | * BO. We need to free it. | 1299 | * remap BO. We need to free it. |
1299 | */ | 1300 | */ |
1300 | if (mem->bo->tbo.sg) { | 1301 | if (mem->bo->tbo.sg) { |
1301 | sg_free_table(mem->bo->tbo.sg); | 1302 | 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 083bd8114db1..d795e5018270 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | |||
@@ -1272,6 +1272,12 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep, | |||
1272 | if (args->size != kfd_doorbell_process_slice(dev)) | 1272 | if (args->size != kfd_doorbell_process_slice(dev)) |
1273 | return -EINVAL; | 1273 | return -EINVAL; |
1274 | offset = kfd_get_process_doorbells(dev, p); | 1274 | 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; | ||
1275 | } | 1281 | } |
1276 | 1282 | ||
1277 | mutex_lock(&p->mutex); | 1283 | 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 b897aca9b4c9..98b9533e672b 100644 --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h | |||
@@ -174,6 +174,7 @@ struct tile_config { | |||
174 | #define ALLOC_MEM_FLAGS_GTT (1 << 1) | 174 | #define ALLOC_MEM_FLAGS_GTT (1 << 1) |
175 | #define ALLOC_MEM_FLAGS_USERPTR (1 << 2) | 175 | #define ALLOC_MEM_FLAGS_USERPTR (1 << 2) |
176 | #define ALLOC_MEM_FLAGS_DOORBELL (1 << 3) | 176 | #define ALLOC_MEM_FLAGS_DOORBELL (1 << 3) |
177 | #define ALLOC_MEM_FLAGS_MMIO_REMAP (1 << 4) | ||
177 | 178 | ||
178 | /* | 179 | /* |
179 | * Allocation flags attributes/access options. | 180 | * Allocation flags attributes/access options. |
diff --git a/include/uapi/linux/kfd_ioctl.h b/include/uapi/linux/kfd_ioctl.h index bb1b4280f53d..1e7d5f3376b0 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 { | |||
338 | #define KFD_IOC_ALLOC_MEM_FLAGS_GTT (1 << 1) | 338 | #define KFD_IOC_ALLOC_MEM_FLAGS_GTT (1 << 1) |
339 | #define KFD_IOC_ALLOC_MEM_FLAGS_USERPTR (1 << 2) | 339 | #define KFD_IOC_ALLOC_MEM_FLAGS_USERPTR (1 << 2) |
340 | #define KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL (1 << 3) | 340 | #define KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL (1 << 3) |
341 | #define KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP (1 << 4) | ||
341 | /* Allocation flags: attributes/access options */ | 342 | /* Allocation flags: attributes/access options */ |
342 | #define KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE (1 << 31) | 343 | #define KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE (1 << 31) |
343 | #define KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE (1 << 30) | 344 | #define KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE (1 << 30) |