at v6.0 3.9 kB view raw
1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2#ifndef _LINUX_UACCE_H 3#define _LINUX_UACCE_H 4 5#include <linux/cdev.h> 6#include <uapi/misc/uacce/uacce.h> 7 8#define UACCE_NAME "uacce" 9#define UACCE_MAX_REGION 2 10#define UACCE_MAX_NAME_SIZE 64 11 12struct uacce_queue; 13struct uacce_device; 14 15/** 16 * struct uacce_qfile_region - structure of queue file region 17 * @type: type of the region 18 */ 19struct uacce_qfile_region { 20 enum uacce_qfrt type; 21}; 22 23/** 24 * struct uacce_ops - uacce device operations 25 * @get_available_instances: get available instances left of the device 26 * @get_queue: get a queue from the device 27 * @put_queue: free a queue to the device 28 * @start_queue: make the queue start work after get_queue 29 * @stop_queue: make the queue stop work before put_queue 30 * @is_q_updated: check whether the task is finished 31 * @mmap: mmap addresses of queue to user space 32 * @ioctl: ioctl for user space users of the queue 33 */ 34struct uacce_ops { 35 int (*get_available_instances)(struct uacce_device *uacce); 36 int (*get_queue)(struct uacce_device *uacce, unsigned long arg, 37 struct uacce_queue *q); 38 void (*put_queue)(struct uacce_queue *q); 39 int (*start_queue)(struct uacce_queue *q); 40 void (*stop_queue)(struct uacce_queue *q); 41 int (*is_q_updated)(struct uacce_queue *q); 42 int (*mmap)(struct uacce_queue *q, struct vm_area_struct *vma, 43 struct uacce_qfile_region *qfr); 44 long (*ioctl)(struct uacce_queue *q, unsigned int cmd, 45 unsigned long arg); 46}; 47 48/** 49 * struct uacce_interface - interface required for uacce_register() 50 * @name: the uacce device name. Will show up in sysfs 51 * @flags: uacce device attributes 52 * @ops: pointer to the struct uacce_ops 53 */ 54struct uacce_interface { 55 char name[UACCE_MAX_NAME_SIZE]; 56 unsigned int flags; 57 const struct uacce_ops *ops; 58}; 59 60enum uacce_q_state { 61 UACCE_Q_ZOMBIE = 0, 62 UACCE_Q_INIT, 63 UACCE_Q_STARTED, 64}; 65 66/** 67 * struct uacce_queue 68 * @uacce: pointer to uacce 69 * @priv: private pointer 70 * @wait: wait queue head 71 * @list: index into uacce queues list 72 * @qfrs: pointer of qfr regions 73 * @mutex: protects queue state 74 * @state: queue state machine 75 * @pasid: pasid associated to the mm 76 * @handle: iommu_sva handle returned by iommu_sva_bind_device() 77 */ 78struct uacce_queue { 79 struct uacce_device *uacce; 80 void *priv; 81 wait_queue_head_t wait; 82 struct list_head list; 83 struct uacce_qfile_region *qfrs[UACCE_MAX_REGION]; 84 struct mutex mutex; 85 enum uacce_q_state state; 86 u32 pasid; 87 struct iommu_sva *handle; 88}; 89 90/** 91 * struct uacce_device 92 * @algs: supported algorithms 93 * @api_ver: api version 94 * @ops: pointer to the struct uacce_ops 95 * @qf_pg_num: page numbers of the queue file regions 96 * @parent: pointer to the parent device 97 * @is_vf: whether virtual function 98 * @flags: uacce attributes 99 * @dev_id: id of the uacce device 100 * @cdev: cdev of the uacce 101 * @dev: dev of the uacce 102 * @mutex: protects uacce operation 103 * @priv: private pointer of the uacce 104 * @queues: list of queues 105 * @inode: core vfs 106 */ 107struct uacce_device { 108 const char *algs; 109 const char *api_ver; 110 const struct uacce_ops *ops; 111 unsigned long qf_pg_num[UACCE_MAX_REGION]; 112 struct device *parent; 113 bool is_vf; 114 u32 flags; 115 u32 dev_id; 116 struct cdev *cdev; 117 struct device dev; 118 struct mutex mutex; 119 void *priv; 120 struct list_head queues; 121 struct inode *inode; 122}; 123 124#if IS_ENABLED(CONFIG_UACCE) 125 126struct uacce_device *uacce_alloc(struct device *parent, 127 struct uacce_interface *interface); 128int uacce_register(struct uacce_device *uacce); 129void uacce_remove(struct uacce_device *uacce); 130 131#else /* CONFIG_UACCE */ 132 133static inline 134struct uacce_device *uacce_alloc(struct device *parent, 135 struct uacce_interface *interface) 136{ 137 return ERR_PTR(-ENODEV); 138} 139 140static inline int uacce_register(struct uacce_device *uacce) 141{ 142 return -EINVAL; 143} 144 145static inline void uacce_remove(struct uacce_device *uacce) {} 146 147#endif /* CONFIG_UACCE */ 148 149#endif /* _LINUX_UACCE_H */