|  | /* 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 */ |