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 | /* 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> #define VERSION_LEN 32 struct nitrox_cmdq { /* command queue lock */ spinlock_t cmdq_lock; /* response list lock */ spinlock_t response_lock; /* backlog list lock */ spinlock_t backlog_lock; /* request submitted to chip, in progress */ struct list_head response_head; /* hw queue full, hold in backlog list */ struct list_head backlog_head; /* doorbell address */ u8 __iomem *dbell_csr_addr; /* base address of the queue */ u8 *head; struct nitrox_device *ndev; /* flush pending backlog commands */ struct work_struct backlog_qflush; /* requests posted waiting for completion */ atomic_t pending_count; /* requests in backlog queues */ atomic_t backlog_count; int write_idx; /* command size 32B/64B */ u8 instr_size; u8 qno; u32 qsize; /* unaligned addresses */ u8 *head_unaligned; dma_addr_t dma_unaligned; /* dma address of the base */ dma_addr_t dma; }; struct nitrox_hw { /* firmware version */ char fw_name[VERSION_LEN]; u16 vendor_id; u16 device_id; u8 revision_id; /* CNN55XX cores */ u8 se_cores; u8 ae_cores; u8 zip_cores; }; #define MAX_MSIX_VECTOR_NAME 20 /** * vectors for queues (64 AE, 64 SE and 64 ZIP) and * error condition/mailbox. */ #define MAX_MSIX_VECTORS 192 struct nitrox_msix { struct msix_entry *entries; char **names; DECLARE_BITMAP(irqs, MAX_MSIX_VECTORS); u32 nr_entries; }; struct bh_data { /* slc port completion count address */ u8 __iomem *completion_cnt_csr_addr; struct nitrox_cmdq *cmdq; struct tasklet_struct resp_handler; }; struct nitrox_bh { struct bh_data *slc; }; /* NITROX-V driver state */ #define NITROX_UCODE_LOADED 0 #define NITROX_READY 1 /* 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 PF_MODE 0 #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 * @status: NITROX status * @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 * @ctx_pool: DMA pool for crypto context * @pkt_cmdqs: SE Command queues * @msix: MSI-X information * @bh: post processing work * @hw: hardware information * @debugfs_dir: debugfs directory */ struct nitrox_device { struct list_head list; u8 __iomem *bar_addr; struct pci_dev *pdev; unsigned long status; unsigned long timeout; refcount_t refcnt; u8 idx; int node; u16 qlen; u16 nr_queues; struct dma_pool *ctx_pool; struct nitrox_cmdq *pkt_cmdqs; struct nitrox_msix msix; struct nitrox_bh bh; 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 int nitrox_ready(struct nitrox_device *ndev) { return test_bit(NITROX_READY, &ndev->status); } #endif /* __NITROX_DEV_H */ |