aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYong Zhao <yong.zhao@amd.com>2017-08-15 23:00:22 -0400
committerOded Gabbay <oded.gabbay@gmail.com>2017-08-15 23:00:22 -0400
commit5d71dbc3a588690c3d66d76db8cd29973425ce6d (patch)
treeeba2ef2142b95240e6b313fb3510afbd70874851
parentfb31a0c92f06348fe2ec5c76e30ef89b0e748ea9 (diff)
drm/amdkfd: Implement image tiling mode support v2
v2: Removed hole in ioctl number space Signed-off-by: Yong Zhao <yong.zhao@amd.com> Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com> Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_chardev.c43
-rw-r--r--include/uapi/linux/kfd_ioctl.h28
2 files changed, 70 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
index 7436d34b77ab..e4a8c2e52cb2 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
@@ -883,6 +883,46 @@ bind_process_to_device_fail:
883 return err; 883 return err;
884} 884}
885 885
886static int kfd_ioctl_get_tile_config(struct file *filep,
887 struct kfd_process *p, void *data)
888{
889 struct kfd_ioctl_get_tile_config_args *args = data;
890 struct kfd_dev *dev;
891 struct tile_config config;
892 int err = 0;
893
894 dev = kfd_device_by_id(args->gpu_id);
895
896 dev->kfd2kgd->get_tile_config(dev->kgd, &config);
897
898 args->gb_addr_config = config.gb_addr_config;
899 args->num_banks = config.num_banks;
900 args->num_ranks = config.num_ranks;
901
902 if (args->num_tile_configs > config.num_tile_configs)
903 args->num_tile_configs = config.num_tile_configs;
904 err = copy_to_user((void __user *)args->tile_config_ptr,
905 config.tile_config_ptr,
906 args->num_tile_configs * sizeof(uint32_t));
907 if (err) {
908 args->num_tile_configs = 0;
909 return -EFAULT;
910 }
911
912 if (args->num_macro_tile_configs > config.num_macro_tile_configs)
913 args->num_macro_tile_configs =
914 config.num_macro_tile_configs;
915 err = copy_to_user((void __user *)args->macro_tile_config_ptr,
916 config.macro_tile_config_ptr,
917 args->num_macro_tile_configs * sizeof(uint32_t));
918 if (err) {
919 args->num_macro_tile_configs = 0;
920 return -EFAULT;
921 }
922
923 return 0;
924}
925
886#define AMDKFD_IOCTL_DEF(ioctl, _func, _flags) \ 926#define AMDKFD_IOCTL_DEF(ioctl, _func, _flags) \
887 [_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, \ 927 [_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, \
888 .cmd_drv = 0, .name = #ioctl} 928 .cmd_drv = 0, .name = #ioctl}
@@ -939,6 +979,9 @@ static const struct amdkfd_ioctl_desc amdkfd_ioctls[] = {
939 979
940 AMDKFD_IOCTL_DEF(AMDKFD_IOC_SET_SCRATCH_BACKING_VA, 980 AMDKFD_IOCTL_DEF(AMDKFD_IOC_SET_SCRATCH_BACKING_VA,
941 kfd_ioctl_set_scratch_backing_va, 0), 981 kfd_ioctl_set_scratch_backing_va, 0),
982
983 AMDKFD_IOCTL_DEF(AMDKFD_IOC_GET_TILE_CONFIG,
984 kfd_ioctl_get_tile_config, 0)
942}; 985};
943 986
944#define AMDKFD_CORE_IOCTL_COUNT ARRAY_SIZE(amdkfd_ioctls) 987#define AMDKFD_CORE_IOCTL_COUNT ARRAY_SIZE(amdkfd_ioctls)
diff --git a/include/uapi/linux/kfd_ioctl.h b/include/uapi/linux/kfd_ioctl.h
index 1b9c5609d523..7b4567bacfc2 100644
--- a/include/uapi/linux/kfd_ioctl.h
+++ b/include/uapi/linux/kfd_ioctl.h
@@ -238,6 +238,29 @@ struct kfd_ioctl_set_scratch_backing_va_args {
238 uint32_t pad; 238 uint32_t pad;
239}; 239};
240 240
241struct kfd_ioctl_get_tile_config_args {
242 /* to KFD: pointer to tile array */
243 uint64_t tile_config_ptr;
244 /* to KFD: pointer to macro tile array */
245 uint64_t macro_tile_config_ptr;
246 /* to KFD: array size allocated by user mode
247 * from KFD: array size filled by kernel
248 */
249 uint32_t num_tile_configs;
250 /* to KFD: array size allocated by user mode
251 * from KFD: array size filled by kernel
252 */
253 uint32_t num_macro_tile_configs;
254
255 uint32_t gpu_id; /* to KFD */
256 uint32_t gb_addr_config; /* from KFD */
257 uint32_t num_banks; /* from KFD */
258 uint32_t num_ranks; /* from KFD */
259 /* struct size can be extended later if needed
260 * without breaking ABI compatibility
261 */
262};
263
241#define AMDKFD_IOCTL_BASE 'K' 264#define AMDKFD_IOCTL_BASE 'K'
242#define AMDKFD_IO(nr) _IO(AMDKFD_IOCTL_BASE, nr) 265#define AMDKFD_IO(nr) _IO(AMDKFD_IOCTL_BASE, nr)
243#define AMDKFD_IOR(nr, type) _IOR(AMDKFD_IOCTL_BASE, nr, type) 266#define AMDKFD_IOR(nr, type) _IOR(AMDKFD_IOCTL_BASE, nr, type)
@@ -295,7 +318,10 @@ struct kfd_ioctl_set_scratch_backing_va_args {
295#define AMDKFD_IOC_SET_SCRATCH_BACKING_VA \ 318#define AMDKFD_IOC_SET_SCRATCH_BACKING_VA \
296 AMDKFD_IOWR(0x11, struct kfd_ioctl_set_scratch_backing_va_args) 319 AMDKFD_IOWR(0x11, struct kfd_ioctl_set_scratch_backing_va_args)
297 320
321#define AMDKFD_IOC_GET_TILE_CONFIG \
322 AMDKFD_IOWR(0x12, struct kfd_ioctl_get_tile_config_args)
323
298#define AMDKFD_COMMAND_START 0x01 324#define AMDKFD_COMMAND_START 0x01
299#define AMDKFD_COMMAND_END 0x12 325#define AMDKFD_COMMAND_END 0x13
300 326
301#endif 327#endif