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