18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __NITROX_DEV_H
38c2ecf20Sopenharmony_ci#define __NITROX_DEV_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/dma-mapping.h>
68c2ecf20Sopenharmony_ci#include <linux/interrupt.h>
78c2ecf20Sopenharmony_ci#include <linux/pci.h>
88c2ecf20Sopenharmony_ci#include <linux/if.h>
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#define VERSION_LEN 32
118c2ecf20Sopenharmony_ci/* Maximum queues in PF mode */
128c2ecf20Sopenharmony_ci#define MAX_PF_QUEUES	64
138c2ecf20Sopenharmony_ci/* Maximum device queues */
148c2ecf20Sopenharmony_ci#define MAX_DEV_QUEUES (MAX_PF_QUEUES)
158c2ecf20Sopenharmony_ci/* Maximum UCD Blocks */
168c2ecf20Sopenharmony_ci#define CNN55XX_MAX_UCD_BLOCKS	8
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci/**
198c2ecf20Sopenharmony_ci * struct nitrox_cmdq - NITROX command queue
208c2ecf20Sopenharmony_ci * @cmd_qlock: command queue lock
218c2ecf20Sopenharmony_ci * @resp_qlock: response queue lock
228c2ecf20Sopenharmony_ci * @backlog_qlock: backlog queue lock
238c2ecf20Sopenharmony_ci * @ndev: NITROX device
248c2ecf20Sopenharmony_ci * @response_head: submitted request list
258c2ecf20Sopenharmony_ci * @backlog_head: backlog queue
268c2ecf20Sopenharmony_ci * @dbell_csr_addr: doorbell register address for this queue
278c2ecf20Sopenharmony_ci * @compl_cnt_csr_addr: completion count register address of the slc port
288c2ecf20Sopenharmony_ci * @base: command queue base address
298c2ecf20Sopenharmony_ci * @dma: dma address of the base
308c2ecf20Sopenharmony_ci * @pending_count: request pending at device
318c2ecf20Sopenharmony_ci * @backlog_count: backlog request count
328c2ecf20Sopenharmony_ci * @write_idx: next write index for the command
338c2ecf20Sopenharmony_ci * @instr_size: command size
348c2ecf20Sopenharmony_ci * @qno: command queue number
358c2ecf20Sopenharmony_ci * @qsize: command queue size
368c2ecf20Sopenharmony_ci * @unalign_base: unaligned base address
378c2ecf20Sopenharmony_ci * @unalign_dma: unaligned dma address
388c2ecf20Sopenharmony_ci */
398c2ecf20Sopenharmony_cistruct nitrox_cmdq {
408c2ecf20Sopenharmony_ci	spinlock_t cmd_qlock;
418c2ecf20Sopenharmony_ci	spinlock_t resp_qlock;
428c2ecf20Sopenharmony_ci	spinlock_t backlog_qlock;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	struct nitrox_device *ndev;
458c2ecf20Sopenharmony_ci	struct list_head response_head;
468c2ecf20Sopenharmony_ci	struct list_head backlog_head;
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	u8 __iomem *dbell_csr_addr;
498c2ecf20Sopenharmony_ci	u8 __iomem *compl_cnt_csr_addr;
508c2ecf20Sopenharmony_ci	u8 *base;
518c2ecf20Sopenharmony_ci	dma_addr_t dma;
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	struct work_struct backlog_qflush;
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	atomic_t pending_count;
568c2ecf20Sopenharmony_ci	atomic_t backlog_count;
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci	int write_idx;
598c2ecf20Sopenharmony_ci	u8 instr_size;
608c2ecf20Sopenharmony_ci	u8 qno;
618c2ecf20Sopenharmony_ci	u32 qsize;
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	u8 *unalign_base;
648c2ecf20Sopenharmony_ci	dma_addr_t unalign_dma;
658c2ecf20Sopenharmony_ci};
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci/**
688c2ecf20Sopenharmony_ci * struct nitrox_hw - NITROX hardware information
698c2ecf20Sopenharmony_ci * @partname: partname ex: CNN55xxx-xxx
708c2ecf20Sopenharmony_ci * @fw_name: firmware version
718c2ecf20Sopenharmony_ci * @freq: NITROX frequency
728c2ecf20Sopenharmony_ci * @vendor_id: vendor ID
738c2ecf20Sopenharmony_ci * @device_id: device ID
748c2ecf20Sopenharmony_ci * @revision_id: revision ID
758c2ecf20Sopenharmony_ci * @se_cores: number of symmetric cores
768c2ecf20Sopenharmony_ci * @ae_cores: number of asymmetric cores
778c2ecf20Sopenharmony_ci * @zip_cores: number of zip cores
788c2ecf20Sopenharmony_ci */
798c2ecf20Sopenharmony_cistruct nitrox_hw {
808c2ecf20Sopenharmony_ci	char partname[IFNAMSIZ * 2];
818c2ecf20Sopenharmony_ci	char fw_name[CNN55XX_MAX_UCD_BLOCKS][VERSION_LEN];
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	int freq;
848c2ecf20Sopenharmony_ci	u16 vendor_id;
858c2ecf20Sopenharmony_ci	u16 device_id;
868c2ecf20Sopenharmony_ci	u8 revision_id;
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci	u8 se_cores;
898c2ecf20Sopenharmony_ci	u8 ae_cores;
908c2ecf20Sopenharmony_ci	u8 zip_cores;
918c2ecf20Sopenharmony_ci};
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_cistruct nitrox_stats {
948c2ecf20Sopenharmony_ci	atomic64_t posted;
958c2ecf20Sopenharmony_ci	atomic64_t completed;
968c2ecf20Sopenharmony_ci	atomic64_t dropped;
978c2ecf20Sopenharmony_ci};
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ci#define IRQ_NAMESZ	32
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_cistruct nitrox_q_vector {
1028c2ecf20Sopenharmony_ci	char name[IRQ_NAMESZ];
1038c2ecf20Sopenharmony_ci	bool valid;
1048c2ecf20Sopenharmony_ci	int ring;
1058c2ecf20Sopenharmony_ci	struct tasklet_struct resp_tasklet;
1068c2ecf20Sopenharmony_ci	union {
1078c2ecf20Sopenharmony_ci		struct nitrox_cmdq *cmdq;
1088c2ecf20Sopenharmony_ci		struct nitrox_device *ndev;
1098c2ecf20Sopenharmony_ci	};
1108c2ecf20Sopenharmony_ci};
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_cienum mcode_type {
1138c2ecf20Sopenharmony_ci	MCODE_TYPE_INVALID,
1148c2ecf20Sopenharmony_ci	MCODE_TYPE_AE,
1158c2ecf20Sopenharmony_ci	MCODE_TYPE_SE_SSL,
1168c2ecf20Sopenharmony_ci	MCODE_TYPE_SE_IPSEC,
1178c2ecf20Sopenharmony_ci};
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci/**
1208c2ecf20Sopenharmony_ci * mbox_msg - Mailbox message data
1218c2ecf20Sopenharmony_ci * @type: message type
1228c2ecf20Sopenharmony_ci * @opcode: message opcode
1238c2ecf20Sopenharmony_ci * @data: message data
1248c2ecf20Sopenharmony_ci */
1258c2ecf20Sopenharmony_ciunion mbox_msg {
1268c2ecf20Sopenharmony_ci	u64 value;
1278c2ecf20Sopenharmony_ci	struct {
1288c2ecf20Sopenharmony_ci		u64 type: 2;
1298c2ecf20Sopenharmony_ci		u64 opcode: 6;
1308c2ecf20Sopenharmony_ci		u64 data: 58;
1318c2ecf20Sopenharmony_ci	};
1328c2ecf20Sopenharmony_ci	struct {
1338c2ecf20Sopenharmony_ci		u64 type: 2;
1348c2ecf20Sopenharmony_ci		u64 opcode: 6;
1358c2ecf20Sopenharmony_ci		u64 chipid: 8;
1368c2ecf20Sopenharmony_ci		u64 vfid: 8;
1378c2ecf20Sopenharmony_ci	} id;
1388c2ecf20Sopenharmony_ci	struct {
1398c2ecf20Sopenharmony_ci		u64 type: 2;
1408c2ecf20Sopenharmony_ci		u64 opcode: 6;
1418c2ecf20Sopenharmony_ci		u64 count: 4;
1428c2ecf20Sopenharmony_ci		u64 info: 40;
1438c2ecf20Sopenharmony_ci		u64 next_se_grp: 3;
1448c2ecf20Sopenharmony_ci		u64 next_ae_grp: 3;
1458c2ecf20Sopenharmony_ci	} mcode_info;
1468c2ecf20Sopenharmony_ci};
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_ci/**
1498c2ecf20Sopenharmony_ci * nitrox_vfdev - NITROX VF device instance in PF
1508c2ecf20Sopenharmony_ci * @state: VF device state
1518c2ecf20Sopenharmony_ci * @vfno: VF number
1528c2ecf20Sopenharmony_ci * @nr_queues: number of queues enabled in VF
1538c2ecf20Sopenharmony_ci * @ring: ring to communicate with VF
1548c2ecf20Sopenharmony_ci * @msg: Mailbox message data from VF
1558c2ecf20Sopenharmony_ci * @mbx_resp: Mailbox counters
1568c2ecf20Sopenharmony_ci */
1578c2ecf20Sopenharmony_cistruct nitrox_vfdev {
1588c2ecf20Sopenharmony_ci	atomic_t state;
1598c2ecf20Sopenharmony_ci	int vfno;
1608c2ecf20Sopenharmony_ci	int nr_queues;
1618c2ecf20Sopenharmony_ci	int ring;
1628c2ecf20Sopenharmony_ci	union mbox_msg msg;
1638c2ecf20Sopenharmony_ci	atomic64_t mbx_resp;
1648c2ecf20Sopenharmony_ci};
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ci/**
1678c2ecf20Sopenharmony_ci * struct nitrox_iov - SR-IOV information
1688c2ecf20Sopenharmony_ci * @num_vfs: number of VF(s) enabled
1698c2ecf20Sopenharmony_ci * @max_vf_queues: Maximum number of queues allowed for VF
1708c2ecf20Sopenharmony_ci * @vfdev: VF(s) devices
1718c2ecf20Sopenharmony_ci * @pf2vf_wq: workqueue for PF2VF communication
1728c2ecf20Sopenharmony_ci * @msix: MSI-X entry for PF in SR-IOV case
1738c2ecf20Sopenharmony_ci */
1748c2ecf20Sopenharmony_cistruct nitrox_iov {
1758c2ecf20Sopenharmony_ci	int num_vfs;
1768c2ecf20Sopenharmony_ci	int max_vf_queues;
1778c2ecf20Sopenharmony_ci	struct nitrox_vfdev *vfdev;
1788c2ecf20Sopenharmony_ci	struct workqueue_struct *pf2vf_wq;
1798c2ecf20Sopenharmony_ci	struct msix_entry msix;
1808c2ecf20Sopenharmony_ci};
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci/*
1838c2ecf20Sopenharmony_ci * NITROX Device states
1848c2ecf20Sopenharmony_ci */
1858c2ecf20Sopenharmony_cienum ndev_state {
1868c2ecf20Sopenharmony_ci	__NDEV_NOT_READY,
1878c2ecf20Sopenharmony_ci	__NDEV_READY,
1888c2ecf20Sopenharmony_ci	__NDEV_IN_RESET,
1898c2ecf20Sopenharmony_ci};
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_ci/* NITROX support modes for VF(s) */
1928c2ecf20Sopenharmony_cienum vf_mode {
1938c2ecf20Sopenharmony_ci	__NDEV_MODE_PF,
1948c2ecf20Sopenharmony_ci	__NDEV_MODE_VF16,
1958c2ecf20Sopenharmony_ci	__NDEV_MODE_VF32,
1968c2ecf20Sopenharmony_ci	__NDEV_MODE_VF64,
1978c2ecf20Sopenharmony_ci	__NDEV_MODE_VF128,
1988c2ecf20Sopenharmony_ci};
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ci#define __NDEV_SRIOV_BIT 0
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_ci/* command queue size */
2038c2ecf20Sopenharmony_ci#define DEFAULT_CMD_QLEN 2048
2048c2ecf20Sopenharmony_ci/* command timeout in milliseconds */
2058c2ecf20Sopenharmony_ci#define CMD_TIMEOUT 2000
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci#define DEV(ndev) ((struct device *)(&(ndev)->pdev->dev))
2088c2ecf20Sopenharmony_ci
2098c2ecf20Sopenharmony_ci#define NITROX_CSR_ADDR(ndev, offset) \
2108c2ecf20Sopenharmony_ci	((ndev)->bar_addr + (offset))
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_ci/**
2138c2ecf20Sopenharmony_ci * struct nitrox_device - NITROX Device Information.
2148c2ecf20Sopenharmony_ci * @list: pointer to linked list of devices
2158c2ecf20Sopenharmony_ci * @bar_addr: iomap address
2168c2ecf20Sopenharmony_ci * @pdev: PCI device information
2178c2ecf20Sopenharmony_ci * @state: NITROX device state
2188c2ecf20Sopenharmony_ci * @flags: flags to indicate device the features
2198c2ecf20Sopenharmony_ci * @timeout: Request timeout in jiffies
2208c2ecf20Sopenharmony_ci * @refcnt: Device usage count
2218c2ecf20Sopenharmony_ci * @idx: device index (0..N)
2228c2ecf20Sopenharmony_ci * @node: NUMA node id attached
2238c2ecf20Sopenharmony_ci * @qlen: Command queue length
2248c2ecf20Sopenharmony_ci * @nr_queues: Number of command queues
2258c2ecf20Sopenharmony_ci * @mode: Device mode PF/VF
2268c2ecf20Sopenharmony_ci * @ctx_pool: DMA pool for crypto context
2278c2ecf20Sopenharmony_ci * @pkt_inq: Packet input rings
2288c2ecf20Sopenharmony_ci * @aqmq: AQM command queues
2298c2ecf20Sopenharmony_ci * @qvec: MSI-X queue vectors information
2308c2ecf20Sopenharmony_ci * @iov: SR-IOV informatin
2318c2ecf20Sopenharmony_ci * @num_vecs: number of MSI-X vectors
2328c2ecf20Sopenharmony_ci * @stats: request statistics
2338c2ecf20Sopenharmony_ci * @hw: hardware information
2348c2ecf20Sopenharmony_ci * @debugfs_dir: debugfs directory
2358c2ecf20Sopenharmony_ci */
2368c2ecf20Sopenharmony_cistruct nitrox_device {
2378c2ecf20Sopenharmony_ci	struct list_head list;
2388c2ecf20Sopenharmony_ci
2398c2ecf20Sopenharmony_ci	u8 __iomem *bar_addr;
2408c2ecf20Sopenharmony_ci	struct pci_dev *pdev;
2418c2ecf20Sopenharmony_ci
2428c2ecf20Sopenharmony_ci	atomic_t state;
2438c2ecf20Sopenharmony_ci	unsigned long flags;
2448c2ecf20Sopenharmony_ci	unsigned long timeout;
2458c2ecf20Sopenharmony_ci	refcount_t refcnt;
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_ci	u8 idx;
2488c2ecf20Sopenharmony_ci	int node;
2498c2ecf20Sopenharmony_ci	u16 qlen;
2508c2ecf20Sopenharmony_ci	u16 nr_queues;
2518c2ecf20Sopenharmony_ci	enum vf_mode mode;
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci	struct dma_pool *ctx_pool;
2548c2ecf20Sopenharmony_ci	struct nitrox_cmdq *pkt_inq;
2558c2ecf20Sopenharmony_ci	struct nitrox_cmdq *aqmq[MAX_DEV_QUEUES] ____cacheline_aligned_in_smp;
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_ci	struct nitrox_q_vector *qvec;
2588c2ecf20Sopenharmony_ci	struct nitrox_iov iov;
2598c2ecf20Sopenharmony_ci	int num_vecs;
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_ci	struct nitrox_stats stats;
2628c2ecf20Sopenharmony_ci	struct nitrox_hw hw;
2638c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_DEBUG_FS)
2648c2ecf20Sopenharmony_ci	struct dentry *debugfs_dir;
2658c2ecf20Sopenharmony_ci#endif
2668c2ecf20Sopenharmony_ci};
2678c2ecf20Sopenharmony_ci
2688c2ecf20Sopenharmony_ci/**
2698c2ecf20Sopenharmony_ci * nitrox_read_csr - Read from device register
2708c2ecf20Sopenharmony_ci * @ndev: NITROX device
2718c2ecf20Sopenharmony_ci * @offset: offset of the register to read
2728c2ecf20Sopenharmony_ci *
2738c2ecf20Sopenharmony_ci * Returns: value read
2748c2ecf20Sopenharmony_ci */
2758c2ecf20Sopenharmony_cistatic inline u64 nitrox_read_csr(struct nitrox_device *ndev, u64 offset)
2768c2ecf20Sopenharmony_ci{
2778c2ecf20Sopenharmony_ci	return readq(ndev->bar_addr + offset);
2788c2ecf20Sopenharmony_ci}
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_ci/**
2818c2ecf20Sopenharmony_ci * nitrox_write_csr - Write to device register
2828c2ecf20Sopenharmony_ci * @ndev: NITROX device
2838c2ecf20Sopenharmony_ci * @offset: offset of the register to write
2848c2ecf20Sopenharmony_ci * @value: value to write
2858c2ecf20Sopenharmony_ci */
2868c2ecf20Sopenharmony_cistatic inline void nitrox_write_csr(struct nitrox_device *ndev, u64 offset,
2878c2ecf20Sopenharmony_ci				    u64 value)
2888c2ecf20Sopenharmony_ci{
2898c2ecf20Sopenharmony_ci	writeq(value, (ndev->bar_addr + offset));
2908c2ecf20Sopenharmony_ci}
2918c2ecf20Sopenharmony_ci
2928c2ecf20Sopenharmony_cistatic inline bool nitrox_ready(struct nitrox_device *ndev)
2938c2ecf20Sopenharmony_ci{
2948c2ecf20Sopenharmony_ci	return atomic_read(&ndev->state) == __NDEV_READY;
2958c2ecf20Sopenharmony_ci}
2968c2ecf20Sopenharmony_ci
2978c2ecf20Sopenharmony_cistatic inline bool nitrox_vfdev_ready(struct nitrox_vfdev *vfdev)
2988c2ecf20Sopenharmony_ci{
2998c2ecf20Sopenharmony_ci	return atomic_read(&vfdev->state) == __NDEV_READY;
3008c2ecf20Sopenharmony_ci}
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ci#endif /* __NITROX_DEV_H */
303