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