1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __NITROX_DEV_H
3*4882a593Smuzhiyun #define __NITROX_DEV_H
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #include <linux/dma-mapping.h>
6*4882a593Smuzhiyun #include <linux/interrupt.h>
7*4882a593Smuzhiyun #include <linux/pci.h>
8*4882a593Smuzhiyun #include <linux/if.h>
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #define VERSION_LEN 32
11*4882a593Smuzhiyun /* Maximum queues in PF mode */
12*4882a593Smuzhiyun #define MAX_PF_QUEUES 64
13*4882a593Smuzhiyun /* Maximum device queues */
14*4882a593Smuzhiyun #define MAX_DEV_QUEUES (MAX_PF_QUEUES)
15*4882a593Smuzhiyun /* Maximum UCD Blocks */
16*4882a593Smuzhiyun #define CNN55XX_MAX_UCD_BLOCKS 8
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun /**
19*4882a593Smuzhiyun * struct nitrox_cmdq - NITROX command queue
20*4882a593Smuzhiyun * @cmd_qlock: command queue lock
21*4882a593Smuzhiyun * @resp_qlock: response queue lock
22*4882a593Smuzhiyun * @backlog_qlock: backlog queue lock
23*4882a593Smuzhiyun * @ndev: NITROX device
24*4882a593Smuzhiyun * @response_head: submitted request list
25*4882a593Smuzhiyun * @backlog_head: backlog queue
26*4882a593Smuzhiyun * @dbell_csr_addr: doorbell register address for this queue
27*4882a593Smuzhiyun * @compl_cnt_csr_addr: completion count register address of the slc port
28*4882a593Smuzhiyun * @base: command queue base address
29*4882a593Smuzhiyun * @dma: dma address of the base
30*4882a593Smuzhiyun * @pending_count: request pending at device
31*4882a593Smuzhiyun * @backlog_count: backlog request count
32*4882a593Smuzhiyun * @write_idx: next write index for the command
33*4882a593Smuzhiyun * @instr_size: command size
34*4882a593Smuzhiyun * @qno: command queue number
35*4882a593Smuzhiyun * @qsize: command queue size
36*4882a593Smuzhiyun * @unalign_base: unaligned base address
37*4882a593Smuzhiyun * @unalign_dma: unaligned dma address
38*4882a593Smuzhiyun */
39*4882a593Smuzhiyun struct nitrox_cmdq {
40*4882a593Smuzhiyun spinlock_t cmd_qlock;
41*4882a593Smuzhiyun spinlock_t resp_qlock;
42*4882a593Smuzhiyun spinlock_t backlog_qlock;
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun struct nitrox_device *ndev;
45*4882a593Smuzhiyun struct list_head response_head;
46*4882a593Smuzhiyun struct list_head backlog_head;
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun u8 __iomem *dbell_csr_addr;
49*4882a593Smuzhiyun u8 __iomem *compl_cnt_csr_addr;
50*4882a593Smuzhiyun u8 *base;
51*4882a593Smuzhiyun dma_addr_t dma;
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun struct work_struct backlog_qflush;
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun atomic_t pending_count;
56*4882a593Smuzhiyun atomic_t backlog_count;
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun int write_idx;
59*4882a593Smuzhiyun u8 instr_size;
60*4882a593Smuzhiyun u8 qno;
61*4882a593Smuzhiyun u32 qsize;
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun u8 *unalign_base;
64*4882a593Smuzhiyun dma_addr_t unalign_dma;
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun /**
68*4882a593Smuzhiyun * struct nitrox_hw - NITROX hardware information
69*4882a593Smuzhiyun * @partname: partname ex: CNN55xxx-xxx
70*4882a593Smuzhiyun * @fw_name: firmware version
71*4882a593Smuzhiyun * @freq: NITROX frequency
72*4882a593Smuzhiyun * @vendor_id: vendor ID
73*4882a593Smuzhiyun * @device_id: device ID
74*4882a593Smuzhiyun * @revision_id: revision ID
75*4882a593Smuzhiyun * @se_cores: number of symmetric cores
76*4882a593Smuzhiyun * @ae_cores: number of asymmetric cores
77*4882a593Smuzhiyun * @zip_cores: number of zip cores
78*4882a593Smuzhiyun */
79*4882a593Smuzhiyun struct nitrox_hw {
80*4882a593Smuzhiyun char partname[IFNAMSIZ * 2];
81*4882a593Smuzhiyun char fw_name[CNN55XX_MAX_UCD_BLOCKS][VERSION_LEN];
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun int freq;
84*4882a593Smuzhiyun u16 vendor_id;
85*4882a593Smuzhiyun u16 device_id;
86*4882a593Smuzhiyun u8 revision_id;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun u8 se_cores;
89*4882a593Smuzhiyun u8 ae_cores;
90*4882a593Smuzhiyun u8 zip_cores;
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun struct nitrox_stats {
94*4882a593Smuzhiyun atomic64_t posted;
95*4882a593Smuzhiyun atomic64_t completed;
96*4882a593Smuzhiyun atomic64_t dropped;
97*4882a593Smuzhiyun };
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun #define IRQ_NAMESZ 32
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun struct nitrox_q_vector {
102*4882a593Smuzhiyun char name[IRQ_NAMESZ];
103*4882a593Smuzhiyun bool valid;
104*4882a593Smuzhiyun int ring;
105*4882a593Smuzhiyun struct tasklet_struct resp_tasklet;
106*4882a593Smuzhiyun union {
107*4882a593Smuzhiyun struct nitrox_cmdq *cmdq;
108*4882a593Smuzhiyun struct nitrox_device *ndev;
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun };
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun enum mcode_type {
113*4882a593Smuzhiyun MCODE_TYPE_INVALID,
114*4882a593Smuzhiyun MCODE_TYPE_AE,
115*4882a593Smuzhiyun MCODE_TYPE_SE_SSL,
116*4882a593Smuzhiyun MCODE_TYPE_SE_IPSEC,
117*4882a593Smuzhiyun };
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun /**
120*4882a593Smuzhiyun * mbox_msg - Mailbox message data
121*4882a593Smuzhiyun * @type: message type
122*4882a593Smuzhiyun * @opcode: message opcode
123*4882a593Smuzhiyun * @data: message data
124*4882a593Smuzhiyun */
125*4882a593Smuzhiyun union mbox_msg {
126*4882a593Smuzhiyun u64 value;
127*4882a593Smuzhiyun struct {
128*4882a593Smuzhiyun u64 type: 2;
129*4882a593Smuzhiyun u64 opcode: 6;
130*4882a593Smuzhiyun u64 data: 58;
131*4882a593Smuzhiyun };
132*4882a593Smuzhiyun struct {
133*4882a593Smuzhiyun u64 type: 2;
134*4882a593Smuzhiyun u64 opcode: 6;
135*4882a593Smuzhiyun u64 chipid: 8;
136*4882a593Smuzhiyun u64 vfid: 8;
137*4882a593Smuzhiyun } id;
138*4882a593Smuzhiyun struct {
139*4882a593Smuzhiyun u64 type: 2;
140*4882a593Smuzhiyun u64 opcode: 6;
141*4882a593Smuzhiyun u64 count: 4;
142*4882a593Smuzhiyun u64 info: 40;
143*4882a593Smuzhiyun u64 next_se_grp: 3;
144*4882a593Smuzhiyun u64 next_ae_grp: 3;
145*4882a593Smuzhiyun } mcode_info;
146*4882a593Smuzhiyun };
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun /**
149*4882a593Smuzhiyun * nitrox_vfdev - NITROX VF device instance in PF
150*4882a593Smuzhiyun * @state: VF device state
151*4882a593Smuzhiyun * @vfno: VF number
152*4882a593Smuzhiyun * @nr_queues: number of queues enabled in VF
153*4882a593Smuzhiyun * @ring: ring to communicate with VF
154*4882a593Smuzhiyun * @msg: Mailbox message data from VF
155*4882a593Smuzhiyun * @mbx_resp: Mailbox counters
156*4882a593Smuzhiyun */
157*4882a593Smuzhiyun struct nitrox_vfdev {
158*4882a593Smuzhiyun atomic_t state;
159*4882a593Smuzhiyun int vfno;
160*4882a593Smuzhiyun int nr_queues;
161*4882a593Smuzhiyun int ring;
162*4882a593Smuzhiyun union mbox_msg msg;
163*4882a593Smuzhiyun atomic64_t mbx_resp;
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun /**
167*4882a593Smuzhiyun * struct nitrox_iov - SR-IOV information
168*4882a593Smuzhiyun * @num_vfs: number of VF(s) enabled
169*4882a593Smuzhiyun * @max_vf_queues: Maximum number of queues allowed for VF
170*4882a593Smuzhiyun * @vfdev: VF(s) devices
171*4882a593Smuzhiyun * @pf2vf_wq: workqueue for PF2VF communication
172*4882a593Smuzhiyun * @msix: MSI-X entry for PF in SR-IOV case
173*4882a593Smuzhiyun */
174*4882a593Smuzhiyun struct nitrox_iov {
175*4882a593Smuzhiyun int num_vfs;
176*4882a593Smuzhiyun int max_vf_queues;
177*4882a593Smuzhiyun struct nitrox_vfdev *vfdev;
178*4882a593Smuzhiyun struct workqueue_struct *pf2vf_wq;
179*4882a593Smuzhiyun struct msix_entry msix;
180*4882a593Smuzhiyun };
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun /*
183*4882a593Smuzhiyun * NITROX Device states
184*4882a593Smuzhiyun */
185*4882a593Smuzhiyun enum ndev_state {
186*4882a593Smuzhiyun __NDEV_NOT_READY,
187*4882a593Smuzhiyun __NDEV_READY,
188*4882a593Smuzhiyun __NDEV_IN_RESET,
189*4882a593Smuzhiyun };
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun /* NITROX support modes for VF(s) */
192*4882a593Smuzhiyun enum vf_mode {
193*4882a593Smuzhiyun __NDEV_MODE_PF,
194*4882a593Smuzhiyun __NDEV_MODE_VF16,
195*4882a593Smuzhiyun __NDEV_MODE_VF32,
196*4882a593Smuzhiyun __NDEV_MODE_VF64,
197*4882a593Smuzhiyun __NDEV_MODE_VF128,
198*4882a593Smuzhiyun };
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun #define __NDEV_SRIOV_BIT 0
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun /* command queue size */
203*4882a593Smuzhiyun #define DEFAULT_CMD_QLEN 2048
204*4882a593Smuzhiyun /* command timeout in milliseconds */
205*4882a593Smuzhiyun #define CMD_TIMEOUT 2000
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun #define DEV(ndev) ((struct device *)(&(ndev)->pdev->dev))
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun #define NITROX_CSR_ADDR(ndev, offset) \
210*4882a593Smuzhiyun ((ndev)->bar_addr + (offset))
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun /**
213*4882a593Smuzhiyun * struct nitrox_device - NITROX Device Information.
214*4882a593Smuzhiyun * @list: pointer to linked list of devices
215*4882a593Smuzhiyun * @bar_addr: iomap address
216*4882a593Smuzhiyun * @pdev: PCI device information
217*4882a593Smuzhiyun * @state: NITROX device state
218*4882a593Smuzhiyun * @flags: flags to indicate device the features
219*4882a593Smuzhiyun * @timeout: Request timeout in jiffies
220*4882a593Smuzhiyun * @refcnt: Device usage count
221*4882a593Smuzhiyun * @idx: device index (0..N)
222*4882a593Smuzhiyun * @node: NUMA node id attached
223*4882a593Smuzhiyun * @qlen: Command queue length
224*4882a593Smuzhiyun * @nr_queues: Number of command queues
225*4882a593Smuzhiyun * @mode: Device mode PF/VF
226*4882a593Smuzhiyun * @ctx_pool: DMA pool for crypto context
227*4882a593Smuzhiyun * @pkt_inq: Packet input rings
228*4882a593Smuzhiyun * @aqmq: AQM command queues
229*4882a593Smuzhiyun * @qvec: MSI-X queue vectors information
230*4882a593Smuzhiyun * @iov: SR-IOV informatin
231*4882a593Smuzhiyun * @num_vecs: number of MSI-X vectors
232*4882a593Smuzhiyun * @stats: request statistics
233*4882a593Smuzhiyun * @hw: hardware information
234*4882a593Smuzhiyun * @debugfs_dir: debugfs directory
235*4882a593Smuzhiyun */
236*4882a593Smuzhiyun struct nitrox_device {
237*4882a593Smuzhiyun struct list_head list;
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun u8 __iomem *bar_addr;
240*4882a593Smuzhiyun struct pci_dev *pdev;
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun atomic_t state;
243*4882a593Smuzhiyun unsigned long flags;
244*4882a593Smuzhiyun unsigned long timeout;
245*4882a593Smuzhiyun refcount_t refcnt;
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun u8 idx;
248*4882a593Smuzhiyun int node;
249*4882a593Smuzhiyun u16 qlen;
250*4882a593Smuzhiyun u16 nr_queues;
251*4882a593Smuzhiyun enum vf_mode mode;
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun struct dma_pool *ctx_pool;
254*4882a593Smuzhiyun struct nitrox_cmdq *pkt_inq;
255*4882a593Smuzhiyun struct nitrox_cmdq *aqmq[MAX_DEV_QUEUES] ____cacheline_aligned_in_smp;
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun struct nitrox_q_vector *qvec;
258*4882a593Smuzhiyun struct nitrox_iov iov;
259*4882a593Smuzhiyun int num_vecs;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun struct nitrox_stats stats;
262*4882a593Smuzhiyun struct nitrox_hw hw;
263*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_DEBUG_FS)
264*4882a593Smuzhiyun struct dentry *debugfs_dir;
265*4882a593Smuzhiyun #endif
266*4882a593Smuzhiyun };
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun /**
269*4882a593Smuzhiyun * nitrox_read_csr - Read from device register
270*4882a593Smuzhiyun * @ndev: NITROX device
271*4882a593Smuzhiyun * @offset: offset of the register to read
272*4882a593Smuzhiyun *
273*4882a593Smuzhiyun * Returns: value read
274*4882a593Smuzhiyun */
nitrox_read_csr(struct nitrox_device * ndev,u64 offset)275*4882a593Smuzhiyun static inline u64 nitrox_read_csr(struct nitrox_device *ndev, u64 offset)
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun return readq(ndev->bar_addr + offset);
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun /**
281*4882a593Smuzhiyun * nitrox_write_csr - Write to device register
282*4882a593Smuzhiyun * @ndev: NITROX device
283*4882a593Smuzhiyun * @offset: offset of the register to write
284*4882a593Smuzhiyun * @value: value to write
285*4882a593Smuzhiyun */
nitrox_write_csr(struct nitrox_device * ndev,u64 offset,u64 value)286*4882a593Smuzhiyun static inline void nitrox_write_csr(struct nitrox_device *ndev, u64 offset,
287*4882a593Smuzhiyun u64 value)
288*4882a593Smuzhiyun {
289*4882a593Smuzhiyun writeq(value, (ndev->bar_addr + offset));
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun
nitrox_ready(struct nitrox_device * ndev)292*4882a593Smuzhiyun static inline bool nitrox_ready(struct nitrox_device *ndev)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun return atomic_read(&ndev->state) == __NDEV_READY;
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun
nitrox_vfdev_ready(struct nitrox_vfdev * vfdev)297*4882a593Smuzhiyun static inline bool nitrox_vfdev_ready(struct nitrox_vfdev *vfdev)
298*4882a593Smuzhiyun {
299*4882a593Smuzhiyun return atomic_read(&vfdev->state) == __NDEV_READY;
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun #endif /* __NITROX_DEV_H */
303