162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __NITROX_DEV_H
362306a36Sopenharmony_ci#define __NITROX_DEV_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/dma-mapping.h>
662306a36Sopenharmony_ci#include <linux/interrupt.h>
762306a36Sopenharmony_ci#include <linux/pci.h>
862306a36Sopenharmony_ci#include <linux/if.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define VERSION_LEN 32
1162306a36Sopenharmony_ci/* Maximum queues in PF mode */
1262306a36Sopenharmony_ci#define MAX_PF_QUEUES	64
1362306a36Sopenharmony_ci/* Maximum device queues */
1462306a36Sopenharmony_ci#define MAX_DEV_QUEUES (MAX_PF_QUEUES)
1562306a36Sopenharmony_ci/* Maximum UCD Blocks */
1662306a36Sopenharmony_ci#define CNN55XX_MAX_UCD_BLOCKS	8
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/**
1962306a36Sopenharmony_ci * struct nitrox_cmdq - NITROX command queue
2062306a36Sopenharmony_ci * @cmd_qlock: command queue lock
2162306a36Sopenharmony_ci * @resp_qlock: response queue lock
2262306a36Sopenharmony_ci * @backlog_qlock: backlog queue lock
2362306a36Sopenharmony_ci * @ndev: NITROX device
2462306a36Sopenharmony_ci * @response_head: submitted request list
2562306a36Sopenharmony_ci * @backlog_head: backlog queue
2662306a36Sopenharmony_ci * @dbell_csr_addr: doorbell register address for this queue
2762306a36Sopenharmony_ci * @compl_cnt_csr_addr: completion count register address of the slc port
2862306a36Sopenharmony_ci * @base: command queue base address
2962306a36Sopenharmony_ci * @dma: dma address of the base
3062306a36Sopenharmony_ci * @pending_count: request pending at device
3162306a36Sopenharmony_ci * @backlog_count: backlog request count
3262306a36Sopenharmony_ci * @write_idx: next write index for the command
3362306a36Sopenharmony_ci * @instr_size: command size
3462306a36Sopenharmony_ci * @qno: command queue number
3562306a36Sopenharmony_ci * @qsize: command queue size
3662306a36Sopenharmony_ci * @unalign_base: unaligned base address
3762306a36Sopenharmony_ci * @unalign_dma: unaligned dma address
3862306a36Sopenharmony_ci */
3962306a36Sopenharmony_cistruct nitrox_cmdq {
4062306a36Sopenharmony_ci	spinlock_t cmd_qlock;
4162306a36Sopenharmony_ci	spinlock_t resp_qlock;
4262306a36Sopenharmony_ci	spinlock_t backlog_qlock;
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	struct nitrox_device *ndev;
4562306a36Sopenharmony_ci	struct list_head response_head;
4662306a36Sopenharmony_ci	struct list_head backlog_head;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	u8 __iomem *dbell_csr_addr;
4962306a36Sopenharmony_ci	u8 __iomem *compl_cnt_csr_addr;
5062306a36Sopenharmony_ci	u8 *base;
5162306a36Sopenharmony_ci	dma_addr_t dma;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	struct work_struct backlog_qflush;
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	atomic_t pending_count;
5662306a36Sopenharmony_ci	atomic_t backlog_count;
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	int write_idx;
5962306a36Sopenharmony_ci	u8 instr_size;
6062306a36Sopenharmony_ci	u8 qno;
6162306a36Sopenharmony_ci	u32 qsize;
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	u8 *unalign_base;
6462306a36Sopenharmony_ci	dma_addr_t unalign_dma;
6562306a36Sopenharmony_ci};
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci/**
6862306a36Sopenharmony_ci * struct nitrox_hw - NITROX hardware information
6962306a36Sopenharmony_ci * @partname: partname ex: CNN55xxx-xxx
7062306a36Sopenharmony_ci * @fw_name: firmware version
7162306a36Sopenharmony_ci * @freq: NITROX frequency
7262306a36Sopenharmony_ci * @vendor_id: vendor ID
7362306a36Sopenharmony_ci * @device_id: device ID
7462306a36Sopenharmony_ci * @revision_id: revision ID
7562306a36Sopenharmony_ci * @se_cores: number of symmetric cores
7662306a36Sopenharmony_ci * @ae_cores: number of asymmetric cores
7762306a36Sopenharmony_ci * @zip_cores: number of zip cores
7862306a36Sopenharmony_ci */
7962306a36Sopenharmony_cistruct nitrox_hw {
8062306a36Sopenharmony_ci	char partname[IFNAMSIZ * 2];
8162306a36Sopenharmony_ci	char fw_name[CNN55XX_MAX_UCD_BLOCKS][VERSION_LEN];
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	int freq;
8462306a36Sopenharmony_ci	u16 vendor_id;
8562306a36Sopenharmony_ci	u16 device_id;
8662306a36Sopenharmony_ci	u8 revision_id;
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	u8 se_cores;
8962306a36Sopenharmony_ci	u8 ae_cores;
9062306a36Sopenharmony_ci	u8 zip_cores;
9162306a36Sopenharmony_ci};
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistruct nitrox_stats {
9462306a36Sopenharmony_ci	atomic64_t posted;
9562306a36Sopenharmony_ci	atomic64_t completed;
9662306a36Sopenharmony_ci	atomic64_t dropped;
9762306a36Sopenharmony_ci};
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci#define IRQ_NAMESZ	32
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_cistruct nitrox_q_vector {
10262306a36Sopenharmony_ci	char name[IRQ_NAMESZ];
10362306a36Sopenharmony_ci	bool valid;
10462306a36Sopenharmony_ci	int ring;
10562306a36Sopenharmony_ci	struct tasklet_struct resp_tasklet;
10662306a36Sopenharmony_ci	union {
10762306a36Sopenharmony_ci		struct nitrox_cmdq *cmdq;
10862306a36Sopenharmony_ci		struct nitrox_device *ndev;
10962306a36Sopenharmony_ci	};
11062306a36Sopenharmony_ci};
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_cienum mcode_type {
11362306a36Sopenharmony_ci	MCODE_TYPE_INVALID,
11462306a36Sopenharmony_ci	MCODE_TYPE_AE,
11562306a36Sopenharmony_ci	MCODE_TYPE_SE_SSL,
11662306a36Sopenharmony_ci	MCODE_TYPE_SE_IPSEC,
11762306a36Sopenharmony_ci};
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci/**
12062306a36Sopenharmony_ci * mbox_msg - Mailbox message data
12162306a36Sopenharmony_ci * @type: message type
12262306a36Sopenharmony_ci * @opcode: message opcode
12362306a36Sopenharmony_ci * @data: message data
12462306a36Sopenharmony_ci */
12562306a36Sopenharmony_ciunion mbox_msg {
12662306a36Sopenharmony_ci	u64 value;
12762306a36Sopenharmony_ci	struct {
12862306a36Sopenharmony_ci		u64 type: 2;
12962306a36Sopenharmony_ci		u64 opcode: 6;
13062306a36Sopenharmony_ci		u64 data: 58;
13162306a36Sopenharmony_ci	};
13262306a36Sopenharmony_ci	struct {
13362306a36Sopenharmony_ci		u64 type: 2;
13462306a36Sopenharmony_ci		u64 opcode: 6;
13562306a36Sopenharmony_ci		u64 chipid: 8;
13662306a36Sopenharmony_ci		u64 vfid: 8;
13762306a36Sopenharmony_ci	} id;
13862306a36Sopenharmony_ci	struct {
13962306a36Sopenharmony_ci		u64 type: 2;
14062306a36Sopenharmony_ci		u64 opcode: 6;
14162306a36Sopenharmony_ci		u64 count: 4;
14262306a36Sopenharmony_ci		u64 info: 40;
14362306a36Sopenharmony_ci		u64 next_se_grp: 3;
14462306a36Sopenharmony_ci		u64 next_ae_grp: 3;
14562306a36Sopenharmony_ci	} mcode_info;
14662306a36Sopenharmony_ci};
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci/**
14962306a36Sopenharmony_ci * nitrox_vfdev - NITROX VF device instance in PF
15062306a36Sopenharmony_ci * @state: VF device state
15162306a36Sopenharmony_ci * @vfno: VF number
15262306a36Sopenharmony_ci * @nr_queues: number of queues enabled in VF
15362306a36Sopenharmony_ci * @ring: ring to communicate with VF
15462306a36Sopenharmony_ci * @msg: Mailbox message data from VF
15562306a36Sopenharmony_ci * @mbx_resp: Mailbox counters
15662306a36Sopenharmony_ci */
15762306a36Sopenharmony_cistruct nitrox_vfdev {
15862306a36Sopenharmony_ci	atomic_t state;
15962306a36Sopenharmony_ci	int vfno;
16062306a36Sopenharmony_ci	int nr_queues;
16162306a36Sopenharmony_ci	int ring;
16262306a36Sopenharmony_ci	union mbox_msg msg;
16362306a36Sopenharmony_ci	atomic64_t mbx_resp;
16462306a36Sopenharmony_ci};
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci/**
16762306a36Sopenharmony_ci * struct nitrox_iov - SR-IOV information
16862306a36Sopenharmony_ci * @num_vfs: number of VF(s) enabled
16962306a36Sopenharmony_ci * @max_vf_queues: Maximum number of queues allowed for VF
17062306a36Sopenharmony_ci * @vfdev: VF(s) devices
17162306a36Sopenharmony_ci * @pf2vf_wq: workqueue for PF2VF communication
17262306a36Sopenharmony_ci * @msix: MSI-X entry for PF in SR-IOV case
17362306a36Sopenharmony_ci */
17462306a36Sopenharmony_cistruct nitrox_iov {
17562306a36Sopenharmony_ci	int num_vfs;
17662306a36Sopenharmony_ci	int max_vf_queues;
17762306a36Sopenharmony_ci	struct nitrox_vfdev *vfdev;
17862306a36Sopenharmony_ci	struct workqueue_struct *pf2vf_wq;
17962306a36Sopenharmony_ci	struct msix_entry msix;
18062306a36Sopenharmony_ci};
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci/*
18362306a36Sopenharmony_ci * NITROX Device states
18462306a36Sopenharmony_ci */
18562306a36Sopenharmony_cienum ndev_state {
18662306a36Sopenharmony_ci	__NDEV_NOT_READY,
18762306a36Sopenharmony_ci	__NDEV_READY,
18862306a36Sopenharmony_ci	__NDEV_IN_RESET,
18962306a36Sopenharmony_ci};
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci/* NITROX support modes for VF(s) */
19262306a36Sopenharmony_cienum vf_mode {
19362306a36Sopenharmony_ci	__NDEV_MODE_PF,
19462306a36Sopenharmony_ci	__NDEV_MODE_VF16,
19562306a36Sopenharmony_ci	__NDEV_MODE_VF32,
19662306a36Sopenharmony_ci	__NDEV_MODE_VF64,
19762306a36Sopenharmony_ci	__NDEV_MODE_VF128,
19862306a36Sopenharmony_ci};
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci#define __NDEV_SRIOV_BIT 0
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci/* command queue size */
20362306a36Sopenharmony_ci#define DEFAULT_CMD_QLEN 2048
20462306a36Sopenharmony_ci/* command timeout in milliseconds */
20562306a36Sopenharmony_ci#define CMD_TIMEOUT 2000
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci#define DEV(ndev) ((struct device *)(&(ndev)->pdev->dev))
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci#define NITROX_CSR_ADDR(ndev, offset) \
21062306a36Sopenharmony_ci	((ndev)->bar_addr + (offset))
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci/**
21362306a36Sopenharmony_ci * struct nitrox_device - NITROX Device Information.
21462306a36Sopenharmony_ci * @list: pointer to linked list of devices
21562306a36Sopenharmony_ci * @bar_addr: iomap address
21662306a36Sopenharmony_ci * @pdev: PCI device information
21762306a36Sopenharmony_ci * @state: NITROX device state
21862306a36Sopenharmony_ci * @flags: flags to indicate device the features
21962306a36Sopenharmony_ci * @timeout: Request timeout in jiffies
22062306a36Sopenharmony_ci * @refcnt: Device usage count
22162306a36Sopenharmony_ci * @idx: device index (0..N)
22262306a36Sopenharmony_ci * @node: NUMA node id attached
22362306a36Sopenharmony_ci * @qlen: Command queue length
22462306a36Sopenharmony_ci * @nr_queues: Number of command queues
22562306a36Sopenharmony_ci * @mode: Device mode PF/VF
22662306a36Sopenharmony_ci * @ctx_pool: DMA pool for crypto context
22762306a36Sopenharmony_ci * @pkt_inq: Packet input rings
22862306a36Sopenharmony_ci * @aqmq: AQM command queues
22962306a36Sopenharmony_ci * @qvec: MSI-X queue vectors information
23062306a36Sopenharmony_ci * @iov: SR-IOV informatin
23162306a36Sopenharmony_ci * @num_vecs: number of MSI-X vectors
23262306a36Sopenharmony_ci * @stats: request statistics
23362306a36Sopenharmony_ci * @hw: hardware information
23462306a36Sopenharmony_ci * @debugfs_dir: debugfs directory
23562306a36Sopenharmony_ci */
23662306a36Sopenharmony_cistruct nitrox_device {
23762306a36Sopenharmony_ci	struct list_head list;
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci	u8 __iomem *bar_addr;
24062306a36Sopenharmony_ci	struct pci_dev *pdev;
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	atomic_t state;
24362306a36Sopenharmony_ci	unsigned long flags;
24462306a36Sopenharmony_ci	unsigned long timeout;
24562306a36Sopenharmony_ci	refcount_t refcnt;
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	u8 idx;
24862306a36Sopenharmony_ci	int node;
24962306a36Sopenharmony_ci	u16 qlen;
25062306a36Sopenharmony_ci	u16 nr_queues;
25162306a36Sopenharmony_ci	enum vf_mode mode;
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci	struct dma_pool *ctx_pool;
25462306a36Sopenharmony_ci	struct nitrox_cmdq *pkt_inq;
25562306a36Sopenharmony_ci	struct nitrox_cmdq *aqmq[MAX_DEV_QUEUES] ____cacheline_aligned_in_smp;
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	struct nitrox_q_vector *qvec;
25862306a36Sopenharmony_ci	struct nitrox_iov iov;
25962306a36Sopenharmony_ci	int num_vecs;
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci	struct nitrox_stats stats;
26262306a36Sopenharmony_ci	struct nitrox_hw hw;
26362306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_DEBUG_FS)
26462306a36Sopenharmony_ci	struct dentry *debugfs_dir;
26562306a36Sopenharmony_ci#endif
26662306a36Sopenharmony_ci};
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci/**
26962306a36Sopenharmony_ci * nitrox_read_csr - Read from device register
27062306a36Sopenharmony_ci * @ndev: NITROX device
27162306a36Sopenharmony_ci * @offset: offset of the register to read
27262306a36Sopenharmony_ci *
27362306a36Sopenharmony_ci * Returns: value read
27462306a36Sopenharmony_ci */
27562306a36Sopenharmony_cistatic inline u64 nitrox_read_csr(struct nitrox_device *ndev, u64 offset)
27662306a36Sopenharmony_ci{
27762306a36Sopenharmony_ci	return readq(ndev->bar_addr + offset);
27862306a36Sopenharmony_ci}
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci/**
28162306a36Sopenharmony_ci * nitrox_write_csr - Write to device register
28262306a36Sopenharmony_ci * @ndev: NITROX device
28362306a36Sopenharmony_ci * @offset: offset of the register to write
28462306a36Sopenharmony_ci * @value: value to write
28562306a36Sopenharmony_ci */
28662306a36Sopenharmony_cistatic inline void nitrox_write_csr(struct nitrox_device *ndev, u64 offset,
28762306a36Sopenharmony_ci				    u64 value)
28862306a36Sopenharmony_ci{
28962306a36Sopenharmony_ci	writeq(value, (ndev->bar_addr + offset));
29062306a36Sopenharmony_ci}
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_cistatic inline bool nitrox_ready(struct nitrox_device *ndev)
29362306a36Sopenharmony_ci{
29462306a36Sopenharmony_ci	return atomic_read(&ndev->state) == __NDEV_READY;
29562306a36Sopenharmony_ci}
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_cistatic inline bool nitrox_vfdev_ready(struct nitrox_vfdev *vfdev)
29862306a36Sopenharmony_ci{
29962306a36Sopenharmony_ci	return atomic_read(&vfdev->state) == __NDEV_READY;
30062306a36Sopenharmony_ci}
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci#endif /* __NITROX_DEV_H */
303