123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /* SPDX-License-Identifier: GPL-2.0-or-later */
- #ifndef _LINUX_UACCE_H
- #define _LINUX_UACCE_H
- #include <linux/cdev.h>
- #include <uapi/misc/uacce/uacce.h>
- #define UACCE_NAME "uacce"
- #define UACCE_MAX_REGION 2
- #define UACCE_MAX_NAME_SIZE 64
- struct uacce_queue;
- struct uacce_device;
- /**
- * struct uacce_qfile_region - structure of queue file region
- * @type: type of the region
- */
- struct uacce_qfile_region {
- enum uacce_qfrt type;
- };
- /**
- * struct uacce_ops - uacce device operations
- * @get_available_instances: get available instances left of the device
- * @get_queue: get a queue from the device
- * @put_queue: free a queue to the device
- * @start_queue: make the queue start work after get_queue
- * @stop_queue: make the queue stop work before put_queue
- * @is_q_updated: check whether the task is finished
- * @mmap: mmap addresses of queue to user space
- * @ioctl: ioctl for user space users of the queue
- */
- struct uacce_ops {
- int (*get_available_instances)(struct uacce_device *uacce);
- int (*get_queue)(struct uacce_device *uacce, unsigned long arg,
- struct uacce_queue *q);
- void (*put_queue)(struct uacce_queue *q);
- int (*start_queue)(struct uacce_queue *q);
- void (*stop_queue)(struct uacce_queue *q);
- int (*is_q_updated)(struct uacce_queue *q);
- int (*mmap)(struct uacce_queue *q, struct vm_area_struct *vma,
- struct uacce_qfile_region *qfr);
- long (*ioctl)(struct uacce_queue *q, unsigned int cmd,
- unsigned long arg);
- };
- /**
- * struct uacce_interface - interface required for uacce_register()
- * @name: the uacce device name. Will show up in sysfs
- * @flags: uacce device attributes
- * @ops: pointer to the struct uacce_ops
- */
- struct uacce_interface {
- char name[UACCE_MAX_NAME_SIZE];
- unsigned int flags;
- const struct uacce_ops *ops;
- };
- enum uacce_q_state {
- UACCE_Q_ZOMBIE = 0,
- UACCE_Q_INIT,
- UACCE_Q_STARTED,
- };
- /**
- * struct uacce_queue
- * @uacce: pointer to uacce
- * @priv: private pointer
- * @wait: wait queue head
- * @list: index into uacce queues list
- * @qfrs: pointer of qfr regions
- * @mutex: protects queue state
- * @state: queue state machine
- * @pasid: pasid associated to the mm
- * @handle: iommu_sva handle returned by iommu_sva_bind_device()
- */
- struct uacce_queue {
- struct uacce_device *uacce;
- void *priv;
- wait_queue_head_t wait;
- struct list_head list;
- struct uacce_qfile_region *qfrs[UACCE_MAX_REGION];
- struct mutex mutex;
- enum uacce_q_state state;
- u32 pasid;
- struct iommu_sva *handle;
- };
- /**
- * struct uacce_device
- * @algs: supported algorithms
- * @api_ver: api version
- * @ops: pointer to the struct uacce_ops
- * @qf_pg_num: page numbers of the queue file regions
- * @parent: pointer to the parent device
- * @is_vf: whether virtual function
- * @flags: uacce attributes
- * @dev_id: id of the uacce device
- * @cdev: cdev of the uacce
- * @dev: dev of the uacce
- * @mutex: protects uacce operation
- * @priv: private pointer of the uacce
- * @queues: list of queues
- * @inode: core vfs
- */
- struct uacce_device {
- const char *algs;
- const char *api_ver;
- const struct uacce_ops *ops;
- unsigned long qf_pg_num[UACCE_MAX_REGION];
- struct device *parent;
- bool is_vf;
- u32 flags;
- u32 dev_id;
- struct cdev *cdev;
- struct device dev;
- struct mutex mutex;
- void *priv;
- struct list_head queues;
- struct inode *inode;
- };
- #if IS_ENABLED(CONFIG_UACCE)
- struct uacce_device *uacce_alloc(struct device *parent,
- struct uacce_interface *interface);
- int uacce_register(struct uacce_device *uacce);
- void uacce_remove(struct uacce_device *uacce);
- #else /* CONFIG_UACCE */
- static inline
- struct uacce_device *uacce_alloc(struct device *parent,
- struct uacce_interface *interface)
- {
- return ERR_PTR(-ENODEV);
- }
- static inline int uacce_register(struct uacce_device *uacce)
- {
- return -EINVAL;
- }
- static inline void uacce_remove(struct uacce_device *uacce) {}
- #endif /* CONFIG_UACCE */
- #endif /* _LINUX_UACCE_H */
|