OSDN Git Service

drm/amdkfd: Implement image tiling mode support v2
authorYong Zhao <yong.zhao@amd.com>
Wed, 16 Aug 2017 03:00:22 +0000 (23:00 -0400)
committerOded Gabbay <oded.gabbay@gmail.com>
Wed, 16 Aug 2017 03:00:22 +0000 (23:00 -0400)
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>
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
include/uapi/linux/kfd_ioctl.h

index 7436d34..e4a8c2e 100644 (file)
@@ -883,6 +883,46 @@ bind_process_to_device_fail:
        return err;
 }
 
+static int kfd_ioctl_get_tile_config(struct file *filep,
+               struct kfd_process *p, void *data)
+{
+       struct kfd_ioctl_get_tile_config_args *args = data;
+       struct kfd_dev *dev;
+       struct tile_config config;
+       int err = 0;
+
+       dev = kfd_device_by_id(args->gpu_id);
+
+       dev->kfd2kgd->get_tile_config(dev->kgd, &config);
+
+       args->gb_addr_config = config.gb_addr_config;
+       args->num_banks = config.num_banks;
+       args->num_ranks = config.num_ranks;
+
+       if (args->num_tile_configs > config.num_tile_configs)
+               args->num_tile_configs = config.num_tile_configs;
+       err = copy_to_user((void __user *)args->tile_config_ptr,
+                       config.tile_config_ptr,
+                       args->num_tile_configs * sizeof(uint32_t));
+       if (err) {
+               args->num_tile_configs = 0;
+               return -EFAULT;
+       }
+
+       if (args->num_macro_tile_configs > config.num_macro_tile_configs)
+               args->num_macro_tile_configs =
+                               config.num_macro_tile_configs;
+       err = copy_to_user((void __user *)args->macro_tile_config_ptr,
+                       config.macro_tile_config_ptr,
+                       args->num_macro_tile_configs * sizeof(uint32_t));
+       if (err) {
+               args->num_macro_tile_configs = 0;
+               return -EFAULT;
+       }
+
+       return 0;
+}
+
 #define AMDKFD_IOCTL_DEF(ioctl, _func, _flags) \
        [_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, \
                            .cmd_drv = 0, .name = #ioctl}
@@ -939,6 +979,9 @@ static const struct amdkfd_ioctl_desc amdkfd_ioctls[] = {
 
        AMDKFD_IOCTL_DEF(AMDKFD_IOC_SET_SCRATCH_BACKING_VA,
                        kfd_ioctl_set_scratch_backing_va, 0),
+
+       AMDKFD_IOCTL_DEF(AMDKFD_IOC_GET_TILE_CONFIG,
+                       kfd_ioctl_get_tile_config, 0)
 };
 
 #define AMDKFD_CORE_IOCTL_COUNT        ARRAY_SIZE(amdkfd_ioctls)
index 1b9c560..7b4567b 100644 (file)
@@ -238,6 +238,29 @@ struct kfd_ioctl_set_scratch_backing_va_args {
        uint32_t pad;
 };
 
+struct kfd_ioctl_get_tile_config_args {
+       /* to KFD: pointer to tile array */
+       uint64_t tile_config_ptr;
+       /* to KFD: pointer to macro tile array */
+       uint64_t macro_tile_config_ptr;
+       /* to KFD: array size allocated by user mode
+        * from KFD: array size filled by kernel
+        */
+       uint32_t num_tile_configs;
+       /* to KFD: array size allocated by user mode
+        * from KFD: array size filled by kernel
+        */
+       uint32_t num_macro_tile_configs;
+
+       uint32_t gpu_id;                /* to KFD */
+       uint32_t gb_addr_config;        /* from KFD */
+       uint32_t num_banks;             /* from KFD */
+       uint32_t num_ranks;             /* from KFD */
+       /* struct size can be extended later if needed
+        * without breaking ABI compatibility
+        */
+};
+
 #define AMDKFD_IOCTL_BASE 'K'
 #define AMDKFD_IO(nr)                  _IO(AMDKFD_IOCTL_BASE, nr)
 #define AMDKFD_IOR(nr, type)           _IOR(AMDKFD_IOCTL_BASE, nr, type)
@@ -295,7 +318,10 @@ struct kfd_ioctl_set_scratch_backing_va_args {
 #define AMDKFD_IOC_SET_SCRATCH_BACKING_VA      \
                AMDKFD_IOWR(0x11, struct kfd_ioctl_set_scratch_backing_va_args)
 
+#define AMDKFD_IOC_GET_TILE_CONFIG                                      \
+               AMDKFD_IOWR(0x12, struct kfd_ioctl_get_tile_config_args)
+
 #define AMDKFD_COMMAND_START           0x01
-#define AMDKFD_COMMAND_END             0x12
+#define AMDKFD_COMMAND_END             0x13
 
 #endif