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