Move NPU definitions to airoha_offload.h in include/linux/soc/airoha/ in order to allow the MT76 driver to access the callback definitions.
Showing the changes to include/linux/soc (1 of 4 files). Show all
Unified · Split
| @@ -0,0 +1,260 @@ | |||
| 1 | /* SPDX-License-Identifier: GPL-2.0-only */ | ||
| 2 | /* | ||
| 3 | * Copyright (c) 2025 AIROHA Inc | ||
| 4 | * Author: Lorenzo Bianconi <lorenzo@kernel.org> | ||
| 5 | */ | ||
| 6 | #ifndef AIROHA_OFFLOAD_H | ||
| 7 | #define AIROHA_OFFLOAD_H | ||
| 8 | |||
| 9 | #include <linux/spinlock.h> | ||
| 10 | #include <linux/workqueue.h> | ||
| 11 | |||
| 12 | #define NPU_NUM_CORES 8 | ||
| 13 | #define NPU_NUM_IRQ 6 | ||
| 14 | #define NPU_RX0_DESC_NUM 512 | ||
| 15 | #define NPU_RX1_DESC_NUM 512 | ||
| 16 | |||
| 17 | /* CTRL */ | ||
| 18 | #define NPU_RX_DMA_DESC_LAST_MASK BIT(29) | ||
| 19 | #define NPU_RX_DMA_DESC_LEN_MASK GENMASK(28, 15) | ||
| 20 | #define NPU_RX_DMA_DESC_CUR_LEN_MASK GENMASK(14, 1) | ||
| 21 | #define NPU_RX_DMA_DESC_DONE_MASK BIT(0) | ||
| 22 | /* INFO */ | ||
| 23 | #define NPU_RX_DMA_PKT_COUNT_MASK GENMASK(31, 28) | ||
| 24 | #define NPU_RX_DMA_PKT_ID_MASK GENMASK(28, 26) | ||
| 25 | #define NPU_RX_DMA_SRC_PORT_MASK GENMASK(25, 21) | ||
| 26 | #define NPU_RX_DMA_CRSN_MASK GENMASK(20, 16) | ||
| 27 | #define NPU_RX_DMA_FOE_ID_MASK GENMASK(15, 0) | ||
| 28 | /* DATA */ | ||
| 29 | #define NPU_RX_DMA_SID_MASK GENMASK(31, 16) | ||
| 30 | #define NPU_RX_DMA_FRAG_TYPE_MASK GENMASK(15, 14) | ||
| 31 | #define NPU_RX_DMA_PRIORITY_MASK GENMASK(13, 10) | ||
| 32 | #define NPU_RX_DMA_RADIO_ID_MASK GENMASK(9, 6) | ||
| 33 | #define NPU_RX_DMA_VAP_ID_MASK GENMASK(5, 2) | ||
| 34 | #define NPU_RX_DMA_FRAME_TYPE_MASK GENMASK(1, 0) | ||
| 35 | |||
| 36 | struct airoha_npu_rx_dma_desc { | ||
| 37 | u32 ctrl; | ||
| 38 | u32 info; | ||
| 39 | u32 data; | ||
| 40 | u32 addr; | ||
| 41 | u64 rsv; | ||
| 42 | } __packed; | ||
| 43 | |||
| 44 | /* CTRL */ | ||
| 45 | #define NPU_TX_DMA_DESC_SCHED_MASK BIT(31) | ||
| 46 | #define NPU_TX_DMA_DESC_LEN_MASK GENMASK(30, 18) | ||
| 47 | #define NPU_TX_DMA_DESC_VEND_LEN_MASK GENMASK(17, 1) | ||
| 48 | #define NPU_TX_DMA_DESC_DONE_MASK BIT(0) | ||
| 49 | |||
| 50 | #define NPU_TXWI_LEN 192 | ||
| 51 | |||
| 52 | struct airoha_npu_tx_dma_desc { | ||
| 53 | u32 ctrl; | ||
| 54 | u32 addr; | ||
| 55 | u64 rsv; | ||
| 56 | u8 txwi[NPU_TXWI_LEN]; | ||
| 57 | } __packed; | ||
| 58 | |||
| 59 | enum airoha_npu_wlan_set_cmd { | ||
| 60 | WLAN_FUNC_SET_WAIT_PCIE_ADDR, | ||
| 61 | WLAN_FUNC_SET_WAIT_DESC, | ||
| 62 | WLAN_FUNC_SET_WAIT_NPU_INIT_DONE, | ||
| 63 | WLAN_FUNC_SET_WAIT_TRAN_TO_CPU, | ||
| 64 | WLAN_FUNC_SET_WAIT_BA_WIN_SIZE, | ||
| 65 | WLAN_FUNC_SET_WAIT_DRIVER_MODEL, | ||
| 66 | WLAN_FUNC_SET_WAIT_DEL_STA, | ||
| 67 | WLAN_FUNC_SET_WAIT_DRAM_BA_NODE_ADDR, | ||
| 68 | WLAN_FUNC_SET_WAIT_PKT_BUF_ADDR, | ||
| 69 | WLAN_FUNC_SET_WAIT_IS_TEST_NOBA, | ||
| 70 | WLAN_FUNC_SET_WAIT_FLUSHONE_TIMEOUT, | ||
| 71 | WLAN_FUNC_SET_WAIT_FLUSHALL_TIMEOUT, | ||
| 72 | WLAN_FUNC_SET_WAIT_IS_FORCE_TO_CPU, | ||
| 73 | WLAN_FUNC_SET_WAIT_PCIE_STATE, | ||
| 74 | WLAN_FUNC_SET_WAIT_PCIE_PORT_TYPE, | ||
| 75 | WLAN_FUNC_SET_WAIT_ERROR_RETRY_TIMES, | ||
| 76 | WLAN_FUNC_SET_WAIT_BAR_INFO, | ||
| 77 | WLAN_FUNC_SET_WAIT_FAST_FLAG, | ||
| 78 | WLAN_FUNC_SET_WAIT_NPU_BAND0_ONCPU, | ||
| 79 | WLAN_FUNC_SET_WAIT_TX_RING_PCIE_ADDR, | ||
| 80 | WLAN_FUNC_SET_WAIT_TX_DESC_HW_BASE, | ||
| 81 | WLAN_FUNC_SET_WAIT_TX_BUF_SPACE_HW_BASE, | ||
| 82 | WLAN_FUNC_SET_WAIT_RX_RING_FOR_TXDONE_HW_BASE, | ||
| 83 | WLAN_FUNC_SET_WAIT_TX_PKT_BUF_ADDR, | ||
| 84 | WLAN_FUNC_SET_WAIT_INODE_TXRX_REG_ADDR, | ||
| 85 | WLAN_FUNC_SET_WAIT_INODE_DEBUG_FLAG, | ||
| 86 | WLAN_FUNC_SET_WAIT_INODE_HW_CFG_INFO, | ||
| 87 | WLAN_FUNC_SET_WAIT_INODE_STOP_ACTION, | ||
| 88 | WLAN_FUNC_SET_WAIT_INODE_PCIE_SWAP, | ||
| 89 | WLAN_FUNC_SET_WAIT_RATELIMIT_CTRL, | ||
| 90 | WLAN_FUNC_SET_WAIT_HWNAT_INIT, | ||
| 91 | WLAN_FUNC_SET_WAIT_ARHT_CHIP_INFO, | ||
| 92 | WLAN_FUNC_SET_WAIT_TX_BUF_CHECK_ADDR, | ||
| 93 | WLAN_FUNC_SET_WAIT_TOKEN_ID_SIZE, | ||
| 94 | }; | ||
| 95 | |||
| 96 | enum airoha_npu_wlan_get_cmd { | ||
| 97 | WLAN_FUNC_GET_WAIT_NPU_INFO, | ||
| 98 | WLAN_FUNC_GET_WAIT_LAST_RATE, | ||
| 99 | WLAN_FUNC_GET_WAIT_COUNTER, | ||
| 100 | WLAN_FUNC_GET_WAIT_DBG_COUNTER, | ||
| 101 | WLAN_FUNC_GET_WAIT_RXDESC_BASE, | ||
| 102 | WLAN_FUNC_GET_WAIT_WCID_DBG_COUNTER, | ||
| 103 | WLAN_FUNC_GET_WAIT_DMA_ADDR, | ||
| 104 | WLAN_FUNC_GET_WAIT_RING_SIZE, | ||
| 105 | WLAN_FUNC_GET_WAIT_NPU_SUPPORT_MAP, | ||
| 106 | WLAN_FUNC_GET_WAIT_MDC_LOCK_ADDRESS, | ||
| 107 | WLAN_FUNC_GET_WAIT_NPU_VERSION, | ||
| 108 | }; | ||
| 109 | |||
| 110 | struct airoha_npu { | ||
| 111 | #if (IS_BUILTIN(CONFIG_NET_AIROHA_NPU) || IS_MODULE(CONFIG_NET_AIROHA_NPU)) | ||
| 112 | struct device *dev; | ||
| 113 | struct regmap *regmap; | ||
| 114 | |||
| 115 | struct airoha_npu_core { | ||
| 116 | struct airoha_npu *npu; | ||
| 117 | /* protect concurrent npu memory accesses */ | ||
| 118 | spinlock_t lock; | ||
| 119 | struct work_struct wdt_work; | ||
| 120 | } cores[NPU_NUM_CORES]; | ||
| 121 | |||
| 122 | int irqs[NPU_NUM_IRQ]; | ||
| 123 | |||
| 124 | struct airoha_foe_stats __iomem *stats; | ||
| 125 | |||
| 126 | struct { | ||
| 127 | int (*ppe_init)(struct airoha_npu *npu); | ||
| 128 | int (*ppe_deinit)(struct airoha_npu *npu); | ||
| 129 | int (*ppe_flush_sram_entries)(struct airoha_npu *npu, | ||
| 130 | dma_addr_t foe_addr, | ||
| 131 | int sram_num_entries); | ||
| 132 | int (*ppe_foe_commit_entry)(struct airoha_npu *npu, | ||
| 133 | dma_addr_t foe_addr, | ||
| 134 | u32 entry_size, u32 hash, | ||
| 135 | bool ppe2); | ||
| 136 | int (*wlan_init_reserved_memory)(struct airoha_npu *npu); | ||
| 137 | int (*wlan_send_msg)(struct airoha_npu *npu, int ifindex, | ||
| 138 | enum airoha_npu_wlan_set_cmd func_id, | ||
| 139 | void *data, int data_len, gfp_t gfp); | ||
| 140 | int (*wlan_get_msg)(struct airoha_npu *npu, int ifindex, | ||
| 141 | enum airoha_npu_wlan_get_cmd func_id, | ||
| 142 | void *data, int data_len, gfp_t gfp); | ||
| 143 | u32 (*wlan_get_queue_addr)(struct airoha_npu *npu, int qid, | ||
| 144 | bool xmit); | ||
| 145 | void (*wlan_set_irq_status)(struct airoha_npu *npu, u32 val); | ||
| 146 | u32 (*wlan_get_irq_status)(struct airoha_npu *npu, int q); | ||
| 147 | void (*wlan_enable_irq)(struct airoha_npu *npu, int q); | ||
| 148 | void (*wlan_disable_irq)(struct airoha_npu *npu, int q); | ||
| 149 | } ops; | ||
| 150 | #endif | ||
| 151 | }; | ||
| 152 | |||
| 153 | #if (IS_BUILTIN(CONFIG_NET_AIROHA_NPU) || IS_MODULE(CONFIG_NET_AIROHA_NPU)) | ||
| 154 | struct airoha_npu *airoha_npu_get(struct device *dev, dma_addr_t *stats_addr); | ||
| 155 | void airoha_npu_put(struct airoha_npu *npu); | ||
| 156 | |||
| 157 | static inline int airoha_npu_wlan_init_reserved_memory(struct airoha_npu *npu) | ||
| 158 | { | ||
| 159 | return npu->ops.wlan_init_reserved_memory(npu); | ||
| 160 | } | ||
| 161 | |||
| 162 | static inline int airoha_npu_wlan_send_msg(struct airoha_npu *npu, | ||
| 163 | int ifindex, | ||
| 164 | enum airoha_npu_wlan_set_cmd cmd, | ||
| 165 | void *data, int data_len, gfp_t gfp) | ||
| 166 | { | ||
| 167 | return npu->ops.wlan_send_msg(npu, ifindex, cmd, data, data_len, gfp); | ||
| 168 | } | ||
| 169 | |||
| 170 | static inline int airoha_npu_wlan_get_msg(struct airoha_npu *npu, int ifindex, | ||
| 171 | enum airoha_npu_wlan_get_cmd cmd, | ||
| 172 | void *data, int data_len, gfp_t gfp) | ||
| 173 | { | ||
| 174 | return npu->ops.wlan_get_msg(npu, ifindex, cmd, data, data_len, gfp); | ||
| 175 | } | ||
| 176 | |||
| 177 | static inline u32 airoha_npu_wlan_get_queue_addr(struct airoha_npu *npu, | ||
| 178 | int qid, bool xmit) | ||
| 179 | { | ||
| 180 | return npu->ops.wlan_get_queue_addr(npu, qid, xmit); | ||
| 181 | } | ||
| 182 | |||
| 183 | static inline void airoha_npu_wlan_set_irq_status(struct airoha_npu *npu, | ||
| 184 | u32 val) | ||
| 185 | { | ||
| 186 | npu->ops.wlan_set_irq_status(npu, val); | ||
| 187 | } | ||
| 188 | |||
| 189 | static inline u32 airoha_npu_wlan_get_irq_status(struct airoha_npu *npu, int q) | ||
| 190 | { | ||
| 191 | return npu->ops.wlan_get_irq_status(npu, q); | ||
| 192 | } | ||
| 193 | |||
| 194 | static inline void airoha_npu_wlan_enable_irq(struct airoha_npu *npu, int q) | ||
| 195 | { | ||
| 196 | npu->ops.wlan_enable_irq(npu, q); | ||
| 197 | } | ||
| 198 | |||
| 199 | static inline void airoha_npu_wlan_disable_irq(struct airoha_npu *npu, int q) | ||
| 200 | { | ||
| 201 | npu->ops.wlan_disable_irq(npu, q); | ||
| 202 | } | ||
| 203 | #else | ||
| 204 | static inline struct airoha_npu *airoha_npu_get(struct device *dev, | ||
| 205 | dma_addr_t *foe_stats_addr) | ||
| 206 | { | ||
| 207 | return NULL; | ||
| 208 | } | ||
| 209 | |||
| 210 | static inline void airoha_npu_put(struct airoha_npu *npu) | ||
| 211 | { | ||
| 212 | } | ||
| 213 | |||
| 214 | static inline int airoha_npu_wlan_init_reserved_memory(struct airoha_npu *npu) | ||
| 215 | { | ||
| 216 | return -EOPNOTSUPP; | ||
| 217 | } | ||
| 218 | |||
| 219 | static inline int airoha_npu_wlan_send_msg(struct airoha_npu *npu, | ||
| 220 | int ifindex, | ||
| 221 | enum airoha_npu_wlan_set_cmd cmd, | ||
| 222 | void *data, int data_len, gfp_t gfp) | ||
| 223 | { | ||
| 224 | return -EOPNOTSUPP; | ||
| 225 | } | ||
| 226 | |||
| 227 | static inline int airoha_npu_wlan_get_msg(struct airoha_npu *npu, int ifindex, | ||
| 228 | enum airoha_npu_wlan_get_cmd cmd, | ||
| 229 | void *data, int data_len, gfp_t gfp) | ||
| 230 | { | ||
| 231 | return -EOPNOTSUPP; | ||
| 232 | } | ||
| 233 | |||
| 234 | static inline u32 airoha_npu_wlan_get_queue_addr(struct airoha_npu *npu, | ||
| 235 | int qid, bool xmit) | ||
| 236 | { | ||
| 237 | return 0; | ||
| 238 | } | ||
| 239 | |||
| 240 | static inline void airoha_npu_wlan_set_irq_status(struct airoha_npu *npu, | ||
| 241 | u32 val) | ||
| 242 | { | ||
| 243 | } | ||
| 244 | |||
| 245 | static inline u32 airoha_npu_wlan_get_irq_status(struct airoha_npu *npu, | ||
| 246 | int q) | ||
| 247 | { | ||
| 248 | return 0; | ||
| 249 | } | ||
| 250 | |||
| 251 | static inline void airoha_npu_wlan_enable_irq(struct airoha_npu *npu, int q) | ||
| 252 | { | ||
| 253 | } | ||
| 254 | |||
| 255 | static inline void airoha_npu_wlan_disable_irq(struct airoha_npu *npu, int q) | ||
| 256 | { | ||
| 257 | } | ||
| 258 | #endif | ||
| 259 | |||
| 260 | #endif /* AIROHA_OFFLOAD_H */ | ||