diff options
author | Yong Zhao <yong.zhao@amd.com> | 2017-08-15 23:00:22 -0400 |
---|---|---|
committer | Oded Gabbay <oded.gabbay@gmail.com> | 2017-08-15 23:00:22 -0400 |
commit | 5d71dbc3a588690c3d66d76db8cd29973425ce6d (patch) | |
tree | eba2ef2142b95240e6b313fb3510afbd70874851 | |
parent | fb31a0c92f06348fe2ec5c76e30ef89b0e748ea9 (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.c | 43 | ||||
-rw-r--r-- | include/uapi/linux/kfd_ioctl.h | 28 |
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 | ||
886 | static 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 | ||
241 | struct 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 |