| /* 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 */ |