Commit 57963ff8 authored by Tomer Tayar's avatar Tomer Tayar Committed by Oded Gabbay

accel/habanalabs: Move ioctls to the device specific ioctls range

To use drm_ioctl(), move the ioctls to the device specific ioctls
range at [DRM_COMMAND_BASE, DRM_COMMAND_END).
Signed-off-by: default avatarTomer Tayar <ttayar@habana.ai>
Reviewed-by: default avatarOded Gabbay <ogabbay@kernel.org>
Signed-off-by: default avatarOded Gabbay <ogabbay@kernel.org>
parent 38ed55bc
...@@ -361,10 +361,11 @@ static int hl_cb_info(struct hl_mem_mgr *mmg, ...@@ -361,10 +361,11 @@ static int hl_cb_info(struct hl_mem_mgr *mmg,
return rc; return rc;
} }
int hl_cb_ioctl(struct hl_fpriv *hpriv, void *data) int hl_cb_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv)
{ {
union hl_cb_args *args = data; struct hl_fpriv *hpriv = file_priv->driver_priv;
struct hl_device *hdev = hpriv->hdev; struct hl_device *hdev = hpriv->hdev;
union hl_cb_args *args = data;
u64 handle = 0, device_va = 0; u64 handle = 0, device_va = 0;
enum hl_device_status status; enum hl_device_status status;
u32 usage_cnt = 0; u32 usage_cnt = 0;
......
...@@ -2558,8 +2558,9 @@ static int cs_ioctl_flush_pci_hbw_writes(struct hl_fpriv *hpriv) ...@@ -2558,8 +2558,9 @@ static int cs_ioctl_flush_pci_hbw_writes(struct hl_fpriv *hpriv)
return 0; return 0;
} }
int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data) int hl_cs_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv)
{ {
struct hl_fpriv *hpriv = file_priv->driver_priv;
union hl_cs_args *args = data; union hl_cs_args *args = data;
enum hl_cs_type cs_type = 0; enum hl_cs_type cs_type = 0;
u64 cs_seq = ULONG_MAX; u64 cs_seq = ULONG_MAX;
...@@ -3718,8 +3719,9 @@ static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -3718,8 +3719,9 @@ static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data)
return 0; return 0;
} }
int hl_wait_ioctl(struct hl_fpriv *hpriv, void *data) int hl_wait_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv)
{ {
struct hl_fpriv *hpriv = file_priv->driver_priv;
struct hl_device *hdev = hpriv->hdev; struct hl_device *hdev = hpriv->hdev;
union hl_wait_cs_args *args = data; union hl_wait_cs_args *args = data;
u32 flags = args->in.flags; u32 flags = args->in.flags;
......
...@@ -4118,11 +4118,12 @@ void hl_ack_pb_single_dcore(struct hl_device *hdev, u32 dcore_offset, ...@@ -4118,11 +4118,12 @@ void hl_ack_pb_single_dcore(struct hl_device *hdev, u32 dcore_offset,
const u32 pb_blocks[], u32 blocks_array_size); const u32 pb_blocks[], u32 blocks_array_size);
/* IOCTLs */ /* IOCTLs */
long hl_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);
long hl_ioctl_control(struct file *filep, unsigned int cmd, unsigned long arg); long hl_ioctl_control(struct file *filep, unsigned int cmd, unsigned long arg);
int hl_cb_ioctl(struct hl_fpriv *hpriv, void *data); int hl_info_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv);
int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data); int hl_cb_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv);
int hl_wait_ioctl(struct hl_fpriv *hpriv, void *data); int hl_cs_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv);
int hl_mem_ioctl(struct hl_fpriv *hpriv, void *data); int hl_wait_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv);
int hl_mem_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv);
int hl_debug_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv);
#endif /* HABANALABSP_H_ */ #endif /* HABANALABSP_H_ */
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <drm/drm_accel.h> #include <drm/drm_accel.h>
#include <drm/drm_drv.h> #include <drm/drm_drv.h>
#include <drm/drm_ioctl.h>
#define CREATE_TRACE_POINTS #define CREATE_TRACE_POINTS
#include <trace/events/habanalabs.h> #include <trace/events/habanalabs.h>
...@@ -73,12 +74,21 @@ static const struct pci_device_id ids[] = { ...@@ -73,12 +74,21 @@ static const struct pci_device_id ids[] = {
}; };
MODULE_DEVICE_TABLE(pci, ids); MODULE_DEVICE_TABLE(pci, ids);
static const struct drm_ioctl_desc hl_drm_ioctls[] = {
DRM_IOCTL_DEF_DRV(HL_INFO, hl_info_ioctl, 0),
DRM_IOCTL_DEF_DRV(HL_CB, hl_cb_ioctl, 0),
DRM_IOCTL_DEF_DRV(HL_CS, hl_cs_ioctl, 0),
DRM_IOCTL_DEF_DRV(HL_WAIT_CS, hl_wait_ioctl, 0),
DRM_IOCTL_DEF_DRV(HL_MEMORY, hl_mem_ioctl, 0),
DRM_IOCTL_DEF_DRV(HL_DEBUG, hl_debug_ioctl, 0),
};
static const struct file_operations hl_fops = { static const struct file_operations hl_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.open = accel_open, .open = accel_open,
.release = drm_release, .release = drm_release,
.unlocked_ioctl = hl_ioctl, .unlocked_ioctl = drm_ioctl,
.compat_ioctl = hl_ioctl, .compat_ioctl = drm_compat_ioctl,
.llseek = noop_llseek, .llseek = noop_llseek,
.mmap = hl_mmap .mmap = hl_mmap
}; };
...@@ -95,7 +105,9 @@ static const struct drm_driver hl_driver = { ...@@ -95,7 +105,9 @@ static const struct drm_driver hl_driver = {
.fops = &hl_fops, .fops = &hl_fops,
.open = hl_device_open, .open = hl_device_open,
.postclose = hl_device_release .postclose = hl_device_release,
.ioctls = hl_drm_ioctls,
.num_ioctls = ARRAY_SIZE(hl_drm_ioctls)
}; };
/* /*
......
...@@ -1095,8 +1095,10 @@ static int _hl_info_ioctl(struct hl_fpriv *hpriv, void *data, ...@@ -1095,8 +1095,10 @@ static int _hl_info_ioctl(struct hl_fpriv *hpriv, void *data,
return rc; return rc;
} }
static int hl_info_ioctl(struct hl_fpriv *hpriv, void *data) int hl_info_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv)
{ {
struct hl_fpriv *hpriv = file_priv->driver_priv;
return _hl_info_ioctl(hpriv, data, hpriv->hdev->dev); return _hl_info_ioctl(hpriv, data, hpriv->hdev->dev);
} }
...@@ -1105,10 +1107,11 @@ static int hl_info_ioctl_control(struct hl_fpriv *hpriv, void *data) ...@@ -1105,10 +1107,11 @@ static int hl_info_ioctl_control(struct hl_fpriv *hpriv, void *data)
return _hl_info_ioctl(hpriv, data, hpriv->hdev->dev_ctrl); return _hl_info_ioctl(hpriv, data, hpriv->hdev->dev_ctrl);
} }
static int hl_debug_ioctl(struct hl_fpriv *hpriv, void *data) int hl_debug_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv)
{ {
struct hl_debug_args *args = data; struct hl_fpriv *hpriv = file_priv->driver_priv;
struct hl_device *hdev = hpriv->hdev; struct hl_device *hdev = hpriv->hdev;
struct hl_debug_args *args = data;
enum hl_device_status status; enum hl_device_status status;
int rc = 0; int rc = 0;
...@@ -1151,19 +1154,10 @@ static int hl_debug_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -1151,19 +1154,10 @@ static int hl_debug_ioctl(struct hl_fpriv *hpriv, void *data)
} }
#define HL_IOCTL_DEF(ioctl, _func) \ #define HL_IOCTL_DEF(ioctl, _func) \
[_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func} [_IOC_NR(ioctl) - HL_COMMAND_START] = {.cmd = ioctl, .func = _func}
static const struct hl_ioctl_desc hl_ioctls[] = {
HL_IOCTL_DEF(HL_IOCTL_INFO, hl_info_ioctl),
HL_IOCTL_DEF(HL_IOCTL_CB, hl_cb_ioctl),
HL_IOCTL_DEF(HL_IOCTL_CS, hl_cs_ioctl),
HL_IOCTL_DEF(HL_IOCTL_WAIT_CS, hl_wait_ioctl),
HL_IOCTL_DEF(HL_IOCTL_MEMORY, hl_mem_ioctl),
HL_IOCTL_DEF(HL_IOCTL_DEBUG, hl_debug_ioctl)
};
static const struct hl_ioctl_desc hl_ioctls_control[] = { static const struct hl_ioctl_desc hl_ioctls_control[] = {
HL_IOCTL_DEF(HL_IOCTL_INFO, hl_info_ioctl_control) HL_IOCTL_DEF(DRM_IOCTL_HL_INFO, hl_info_ioctl_control)
}; };
static long _hl_ioctl(struct hl_fpriv *hpriv, unsigned int cmd, unsigned long arg, static long _hl_ioctl(struct hl_fpriv *hpriv, unsigned int cmd, unsigned long arg,
...@@ -1232,33 +1226,6 @@ static long _hl_ioctl(struct hl_fpriv *hpriv, unsigned int cmd, unsigned long ar ...@@ -1232,33 +1226,6 @@ static long _hl_ioctl(struct hl_fpriv *hpriv, unsigned int cmd, unsigned long ar
return retcode; return retcode;
} }
long hl_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
{
struct drm_file *file_priv = filep->private_data;
struct hl_fpriv *hpriv = file_priv->driver_priv;
struct hl_device *hdev = hpriv->hdev;
const struct hl_ioctl_desc *ioctl = NULL;
unsigned int nr = _IOC_NR(cmd);
if (!hdev) {
pr_err_ratelimited("Sending ioctl after device was removed! Please close FD\n");
return -ENODEV;
}
if ((nr >= HL_COMMAND_START) && (nr < HL_COMMAND_END)) {
ioctl = &hl_ioctls[nr];
} else {
char task_comm[TASK_COMM_LEN];
dev_dbg_ratelimited(hdev->dev,
"invalid ioctl: pid=%d, comm=\"%s\", cmd=%#010x, nr=%#04x\n",
task_pid_nr(current), get_task_comm(task_comm, current), cmd, nr);
return -ENOTTY;
}
return _hl_ioctl(hpriv, cmd, arg, ioctl, hdev->dev);
}
long hl_ioctl_control(struct file *filep, unsigned int cmd, unsigned long arg) long hl_ioctl_control(struct file *filep, unsigned int cmd, unsigned long arg)
{ {
struct hl_fpriv *hpriv = filep->private_data; struct hl_fpriv *hpriv = filep->private_data;
...@@ -1271,8 +1238,8 @@ long hl_ioctl_control(struct file *filep, unsigned int cmd, unsigned long arg) ...@@ -1271,8 +1238,8 @@ long hl_ioctl_control(struct file *filep, unsigned int cmd, unsigned long arg)
return -ENODEV; return -ENODEV;
} }
if (nr == _IOC_NR(HL_IOCTL_INFO)) { if (nr == _IOC_NR(DRM_IOCTL_HL_INFO)) {
ioctl = &hl_ioctls_control[nr]; ioctl = &hl_ioctls_control[nr - HL_COMMAND_START];
} else { } else {
char task_comm[TASK_COMM_LEN]; char task_comm[TASK_COMM_LEN];
......
...@@ -2171,8 +2171,9 @@ static int allocate_timestamps_buffers(struct hl_fpriv *hpriv, struct hl_mem_in ...@@ -2171,8 +2171,9 @@ static int allocate_timestamps_buffers(struct hl_fpriv *hpriv, struct hl_mem_in
return 0; return 0;
} }
int hl_mem_ioctl(struct hl_fpriv *hpriv, void *data) int hl_mem_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv)
{ {
struct hl_fpriv *hpriv = file_priv->driver_priv;
enum hl_device_status status; enum hl_device_status status;
union hl_mem_args *args = data; union hl_mem_args *args = data;
struct hl_device *hdev = hpriv->hdev; struct hl_device *hdev = hpriv->hdev;
......
...@@ -8,8 +8,7 @@ ...@@ -8,8 +8,7 @@
#ifndef HABANALABS_H_ #ifndef HABANALABS_H_
#define HABANALABS_H_ #define HABANALABS_H_
#include <linux/types.h> #include <drm/drm.h>
#include <linux/ioctl.h>
/* /*
* Defines that are asic-specific but constitutes as ABI between kernel driver * Defines that are asic-specific but constitutes as ABI between kernel driver
...@@ -607,9 +606,9 @@ enum gaudi2_engine_id { ...@@ -607,9 +606,9 @@ enum gaudi2_engine_id {
/* /*
* ASIC specific PLL index * ASIC specific PLL index
* *
* Used to retrieve in frequency info of different IPs via * Used to retrieve in frequency info of different IPs via HL_INFO_PLL_FREQUENCY under
* HL_INFO_PLL_FREQUENCY under HL_IOCTL_INFO IOCTL. The enums need to be * DRM_IOCTL_HL_INFO IOCTL.
* used as an index in struct hl_pll_frequency_info * The enums need to be used as an index in struct hl_pll_frequency_info.
*/ */
enum hl_goya_pll_index { enum hl_goya_pll_index {
...@@ -2163,6 +2162,13 @@ struct hl_debug_args { ...@@ -2163,6 +2162,13 @@ struct hl_debug_args {
__u32 ctx_id; __u32 ctx_id;
}; };
#define HL_IOCTL_INFO 0x00
#define HL_IOCTL_CB 0x01
#define HL_IOCTL_CS 0x02
#define HL_IOCTL_WAIT_CS 0x03
#define HL_IOCTL_MEMORY 0x04
#define HL_IOCTL_DEBUG 0x05
/* /*
* Various information operations such as: * Various information operations such as:
* - H/W IP information * - H/W IP information
...@@ -2177,8 +2183,7 @@ struct hl_debug_args { ...@@ -2177,8 +2183,7 @@ struct hl_debug_args {
* definitions of structures in kernel and userspace, e.g. in case of old * definitions of structures in kernel and userspace, e.g. in case of old
* userspace and new kernel driver * userspace and new kernel driver
*/ */
#define HL_IOCTL_INFO \ #define DRM_IOCTL_HL_INFO DRM_IOWR(DRM_COMMAND_BASE + HL_IOCTL_INFO, struct hl_info_args)
_IOWR('H', 0x01, struct hl_info_args)
/* /*
* Command Buffer * Command Buffer
...@@ -2199,8 +2204,7 @@ struct hl_debug_args { ...@@ -2199,8 +2204,7 @@ struct hl_debug_args {
* and won't be returned to user. * and won't be returned to user.
* *
*/ */
#define HL_IOCTL_CB \ #define DRM_IOCTL_HL_CB DRM_IOWR(DRM_COMMAND_BASE + HL_IOCTL_CB, union hl_cb_args)
_IOWR('H', 0x02, union hl_cb_args)
/* /*
* Command Submission * Command Submission
...@@ -2252,8 +2256,7 @@ struct hl_debug_args { ...@@ -2252,8 +2256,7 @@ struct hl_debug_args {
* and only if CS N and CS N-1 are exactly the same (same CBs for the same * and only if CS N and CS N-1 are exactly the same (same CBs for the same
* queues). * queues).
*/ */
#define HL_IOCTL_CS \ #define DRM_IOCTL_HL_CS DRM_IOWR(DRM_COMMAND_BASE + HL_IOCTL_CS, union hl_cs_args)
_IOWR('H', 0x03, union hl_cs_args)
/* /*
* Wait for Command Submission * Wait for Command Submission
...@@ -2285,9 +2288,7 @@ struct hl_debug_args { ...@@ -2285,9 +2288,7 @@ struct hl_debug_args {
* HL_WAIT_CS_STATUS_ABORTED - The CS was aborted, usually because the * HL_WAIT_CS_STATUS_ABORTED - The CS was aborted, usually because the
* device was reset (EIO) * device was reset (EIO)
*/ */
#define DRM_IOCTL_HL_WAIT_CS DRM_IOWR(DRM_COMMAND_BASE + HL_IOCTL_WAIT_CS, union hl_wait_cs_args)
#define HL_IOCTL_WAIT_CS \
_IOWR('H', 0x04, union hl_wait_cs_args)
/* /*
* Memory * Memory
...@@ -2304,8 +2305,7 @@ struct hl_debug_args { ...@@ -2304,8 +2305,7 @@ struct hl_debug_args {
* There is an option for the user to specify the requested virtual address. * There is an option for the user to specify the requested virtual address.
* *
*/ */
#define HL_IOCTL_MEMORY \ #define DRM_IOCTL_HL_MEMORY DRM_IOWR(DRM_COMMAND_BASE + HL_IOCTL_MEMORY, union hl_mem_args)
_IOWR('H', 0x05, union hl_mem_args)
/* /*
* Debug * Debug
...@@ -2331,10 +2331,9 @@ struct hl_debug_args { ...@@ -2331,10 +2331,9 @@ struct hl_debug_args {
* The driver can decide to "kick out" the user if he abuses this interface. * The driver can decide to "kick out" the user if he abuses this interface.
* *
*/ */
#define HL_IOCTL_DEBUG \ #define DRM_IOCTL_HL_DEBUG DRM_IOWR(DRM_COMMAND_BASE + HL_IOCTL_DEBUG, struct hl_debug_args)
_IOWR('H', 0x06, struct hl_debug_args)
#define HL_COMMAND_START 0x01 #define HL_COMMAND_START (DRM_COMMAND_BASE + HL_IOCTL_INFO)
#define HL_COMMAND_END 0x07 #define HL_COMMAND_END (DRM_COMMAND_BASE + HL_IOCTL_DEBUG + 1)
#endif /* HABANALABS_H_ */ #endif /* HABANALABS_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment