at master 317 lines 8.7 kB view raw
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/skbuff.h> 10#include <linux/spinlock.h> 11#include <linux/workqueue.h> 12 13enum { 14 PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f, 15}; 16 17struct airoha_ppe_dev { 18 struct { 19 int (*setup_tc_block_cb)(struct airoha_ppe_dev *dev, 20 void *type_data); 21 void (*check_skb)(struct airoha_ppe_dev *dev, 22 struct sk_buff *skb, u16 hash, 23 bool rx_wlan); 24 } ops; 25 26 void *priv; 27}; 28 29#if (IS_BUILTIN(CONFIG_NET_AIROHA) || IS_MODULE(CONFIG_NET_AIROHA)) 30struct airoha_ppe_dev *airoha_ppe_get_dev(struct device *dev); 31void airoha_ppe_put_dev(struct airoha_ppe_dev *dev); 32 33static inline int airoha_ppe_dev_setup_tc_block_cb(struct airoha_ppe_dev *dev, 34 void *type_data) 35{ 36 return dev->ops.setup_tc_block_cb(dev, type_data); 37} 38 39static inline void airoha_ppe_dev_check_skb(struct airoha_ppe_dev *dev, 40 struct sk_buff *skb, 41 u16 hash, bool rx_wlan) 42{ 43 dev->ops.check_skb(dev, skb, hash, rx_wlan); 44} 45#else 46static inline struct airoha_ppe_dev *airoha_ppe_get_dev(struct device *dev) 47{ 48 return NULL; 49} 50 51static inline void airoha_ppe_put_dev(struct airoha_ppe_dev *dev) 52{ 53} 54 55static inline int airoha_ppe_dev_setup_tc_block_cb(struct airoha_ppe_dev *dev, 56 void *type_data) 57{ 58 return -EOPNOTSUPP; 59} 60 61static inline void airoha_ppe_dev_check_skb(struct airoha_ppe_dev *dev, 62 struct sk_buff *skb, u16 hash, 63 bool rx_wlan) 64{ 65} 66#endif 67 68#define NPU_NUM_CORES 8 69#define NPU_NUM_IRQ 6 70#define NPU_RX0_DESC_NUM 512 71#define NPU_RX1_DESC_NUM 512 72 73/* CTRL */ 74#define NPU_RX_DMA_DESC_LAST_MASK BIT(27) 75#define NPU_RX_DMA_DESC_LEN_MASK GENMASK(26, 14) 76#define NPU_RX_DMA_DESC_CUR_LEN_MASK GENMASK(13, 1) 77#define NPU_RX_DMA_DESC_DONE_MASK BIT(0) 78/* INFO */ 79#define NPU_RX_DMA_PKT_COUNT_MASK GENMASK(31, 29) 80#define NPU_RX_DMA_PKT_ID_MASK GENMASK(28, 26) 81#define NPU_RX_DMA_SRC_PORT_MASK GENMASK(25, 21) 82#define NPU_RX_DMA_CRSN_MASK GENMASK(20, 16) 83#define NPU_RX_DMA_FOE_ID_MASK GENMASK(15, 0) 84/* DATA */ 85#define NPU_RX_DMA_SID_MASK GENMASK(31, 16) 86#define NPU_RX_DMA_FRAG_TYPE_MASK GENMASK(15, 14) 87#define NPU_RX_DMA_PRIORITY_MASK GENMASK(13, 10) 88#define NPU_RX_DMA_RADIO_ID_MASK GENMASK(9, 6) 89#define NPU_RX_DMA_VAP_ID_MASK GENMASK(5, 2) 90#define NPU_RX_DMA_FRAME_TYPE_MASK GENMASK(1, 0) 91 92struct airoha_npu_rx_dma_desc { 93 u32 ctrl; 94 u32 info; 95 u32 data; 96 u32 addr; 97 u64 rsv; 98} __packed; 99 100/* CTRL */ 101#define NPU_TX_DMA_DESC_SCHED_MASK BIT(31) 102#define NPU_TX_DMA_DESC_LEN_MASK GENMASK(30, 18) 103#define NPU_TX_DMA_DESC_VEND_LEN_MASK GENMASK(17, 1) 104#define NPU_TX_DMA_DESC_DONE_MASK BIT(0) 105 106#define NPU_TXWI_LEN 192 107 108struct airoha_npu_tx_dma_desc { 109 u32 ctrl; 110 u32 addr; 111 u64 rsv; 112 u8 txwi[NPU_TXWI_LEN]; 113} __packed; 114 115enum airoha_npu_wlan_set_cmd { 116 WLAN_FUNC_SET_WAIT_PCIE_ADDR, 117 WLAN_FUNC_SET_WAIT_DESC, 118 WLAN_FUNC_SET_WAIT_NPU_INIT_DONE, 119 WLAN_FUNC_SET_WAIT_TRAN_TO_CPU, 120 WLAN_FUNC_SET_WAIT_BA_WIN_SIZE, 121 WLAN_FUNC_SET_WAIT_DRIVER_MODEL, 122 WLAN_FUNC_SET_WAIT_DEL_STA, 123 WLAN_FUNC_SET_WAIT_DRAM_BA_NODE_ADDR, 124 WLAN_FUNC_SET_WAIT_PKT_BUF_ADDR, 125 WLAN_FUNC_SET_WAIT_IS_TEST_NOBA, 126 WLAN_FUNC_SET_WAIT_FLUSHONE_TIMEOUT, 127 WLAN_FUNC_SET_WAIT_FLUSHALL_TIMEOUT, 128 WLAN_FUNC_SET_WAIT_IS_FORCE_TO_CPU, 129 WLAN_FUNC_SET_WAIT_PCIE_STATE, 130 WLAN_FUNC_SET_WAIT_PCIE_PORT_TYPE, 131 WLAN_FUNC_SET_WAIT_ERROR_RETRY_TIMES, 132 WLAN_FUNC_SET_WAIT_BAR_INFO, 133 WLAN_FUNC_SET_WAIT_FAST_FLAG, 134 WLAN_FUNC_SET_WAIT_NPU_BAND0_ONCPU, 135 WLAN_FUNC_SET_WAIT_TX_RING_PCIE_ADDR, 136 WLAN_FUNC_SET_WAIT_TX_DESC_HW_BASE, 137 WLAN_FUNC_SET_WAIT_TX_BUF_SPACE_HW_BASE, 138 WLAN_FUNC_SET_WAIT_RX_RING_FOR_TXDONE_HW_BASE, 139 WLAN_FUNC_SET_WAIT_TX_PKT_BUF_ADDR, 140 WLAN_FUNC_SET_WAIT_INODE_TXRX_REG_ADDR, 141 WLAN_FUNC_SET_WAIT_INODE_DEBUG_FLAG, 142 WLAN_FUNC_SET_WAIT_INODE_HW_CFG_INFO, 143 WLAN_FUNC_SET_WAIT_INODE_STOP_ACTION, 144 WLAN_FUNC_SET_WAIT_INODE_PCIE_SWAP, 145 WLAN_FUNC_SET_WAIT_RATELIMIT_CTRL, 146 WLAN_FUNC_SET_WAIT_HWNAT_INIT, 147 WLAN_FUNC_SET_WAIT_ARHT_CHIP_INFO, 148 WLAN_FUNC_SET_WAIT_TX_BUF_CHECK_ADDR, 149 WLAN_FUNC_SET_WAIT_TOKEN_ID_SIZE, 150}; 151 152enum airoha_npu_wlan_get_cmd { 153 WLAN_FUNC_GET_WAIT_NPU_INFO, 154 WLAN_FUNC_GET_WAIT_LAST_RATE, 155 WLAN_FUNC_GET_WAIT_COUNTER, 156 WLAN_FUNC_GET_WAIT_DBG_COUNTER, 157 WLAN_FUNC_GET_WAIT_RXDESC_BASE, 158 WLAN_FUNC_GET_WAIT_WCID_DBG_COUNTER, 159 WLAN_FUNC_GET_WAIT_DMA_ADDR, 160 WLAN_FUNC_GET_WAIT_RING_SIZE, 161 WLAN_FUNC_GET_WAIT_NPU_SUPPORT_MAP, 162 WLAN_FUNC_GET_WAIT_MDC_LOCK_ADDRESS, 163 WLAN_FUNC_GET_WAIT_NPU_VERSION, 164}; 165 166struct airoha_npu { 167#if (IS_BUILTIN(CONFIG_NET_AIROHA_NPU) || IS_MODULE(CONFIG_NET_AIROHA_NPU)) 168 struct device *dev; 169 struct regmap *regmap; 170 171 struct airoha_npu_core { 172 struct airoha_npu *npu; 173 /* protect concurrent npu memory accesses */ 174 spinlock_t lock; 175 struct work_struct wdt_work; 176 } cores[NPU_NUM_CORES]; 177 178 int irqs[NPU_NUM_IRQ]; 179 180 struct airoha_foe_stats __iomem *stats; 181 182 struct { 183 int (*ppe_init)(struct airoha_npu *npu); 184 int (*ppe_deinit)(struct airoha_npu *npu); 185 int (*ppe_init_stats)(struct airoha_npu *npu, 186 dma_addr_t addr, u32 num_stats_entries); 187 int (*ppe_flush_sram_entries)(struct airoha_npu *npu, 188 dma_addr_t foe_addr, 189 int sram_num_entries); 190 int (*ppe_foe_commit_entry)(struct airoha_npu *npu, 191 dma_addr_t foe_addr, 192 u32 entry_size, u32 hash, 193 bool ppe2); 194 int (*wlan_init_reserved_memory)(struct airoha_npu *npu); 195 int (*wlan_send_msg)(struct airoha_npu *npu, int ifindex, 196 enum airoha_npu_wlan_set_cmd func_id, 197 void *data, int data_len, gfp_t gfp); 198 int (*wlan_get_msg)(struct airoha_npu *npu, int ifindex, 199 enum airoha_npu_wlan_get_cmd func_id, 200 void *data, int data_len, gfp_t gfp); 201 u32 (*wlan_get_queue_addr)(struct airoha_npu *npu, int qid, 202 bool xmit); 203 void (*wlan_set_irq_status)(struct airoha_npu *npu, u32 val); 204 u32 (*wlan_get_irq_status)(struct airoha_npu *npu, int q); 205 void (*wlan_enable_irq)(struct airoha_npu *npu, int q); 206 void (*wlan_disable_irq)(struct airoha_npu *npu, int q); 207 } ops; 208#endif 209}; 210 211#if (IS_BUILTIN(CONFIG_NET_AIROHA_NPU) || IS_MODULE(CONFIG_NET_AIROHA_NPU)) 212struct airoha_npu *airoha_npu_get(struct device *dev); 213void airoha_npu_put(struct airoha_npu *npu); 214 215static inline int airoha_npu_wlan_init_reserved_memory(struct airoha_npu *npu) 216{ 217 return npu->ops.wlan_init_reserved_memory(npu); 218} 219 220static inline int airoha_npu_wlan_send_msg(struct airoha_npu *npu, 221 int ifindex, 222 enum airoha_npu_wlan_set_cmd cmd, 223 void *data, int data_len, gfp_t gfp) 224{ 225 return npu->ops.wlan_send_msg(npu, ifindex, cmd, data, data_len, gfp); 226} 227 228static inline int airoha_npu_wlan_get_msg(struct airoha_npu *npu, int ifindex, 229 enum airoha_npu_wlan_get_cmd cmd, 230 void *data, int data_len, gfp_t gfp) 231{ 232 return npu->ops.wlan_get_msg(npu, ifindex, cmd, data, data_len, gfp); 233} 234 235static inline u32 airoha_npu_wlan_get_queue_addr(struct airoha_npu *npu, 236 int qid, bool xmit) 237{ 238 return npu->ops.wlan_get_queue_addr(npu, qid, xmit); 239} 240 241static inline void airoha_npu_wlan_set_irq_status(struct airoha_npu *npu, 242 u32 val) 243{ 244 npu->ops.wlan_set_irq_status(npu, val); 245} 246 247static inline u32 airoha_npu_wlan_get_irq_status(struct airoha_npu *npu, int q) 248{ 249 return npu->ops.wlan_get_irq_status(npu, q); 250} 251 252static inline void airoha_npu_wlan_enable_irq(struct airoha_npu *npu, int q) 253{ 254 npu->ops.wlan_enable_irq(npu, q); 255} 256 257static inline void airoha_npu_wlan_disable_irq(struct airoha_npu *npu, int q) 258{ 259 npu->ops.wlan_disable_irq(npu, q); 260} 261#else 262static inline struct airoha_npu *airoha_npu_get(struct device *dev) 263{ 264 return NULL; 265} 266 267static inline void airoha_npu_put(struct airoha_npu *npu) 268{ 269} 270 271static inline int airoha_npu_wlan_init_reserved_memory(struct airoha_npu *npu) 272{ 273 return -EOPNOTSUPP; 274} 275 276static inline int airoha_npu_wlan_send_msg(struct airoha_npu *npu, 277 int ifindex, 278 enum airoha_npu_wlan_set_cmd cmd, 279 void *data, int data_len, gfp_t gfp) 280{ 281 return -EOPNOTSUPP; 282} 283 284static inline int airoha_npu_wlan_get_msg(struct airoha_npu *npu, int ifindex, 285 enum airoha_npu_wlan_get_cmd cmd, 286 void *data, int data_len, gfp_t gfp) 287{ 288 return -EOPNOTSUPP; 289} 290 291static inline u32 airoha_npu_wlan_get_queue_addr(struct airoha_npu *npu, 292 int qid, bool xmit) 293{ 294 return 0; 295} 296 297static inline void airoha_npu_wlan_set_irq_status(struct airoha_npu *npu, 298 u32 val) 299{ 300} 301 302static inline u32 airoha_npu_wlan_get_irq_status(struct airoha_npu *npu, 303 int q) 304{ 305 return 0; 306} 307 308static inline void airoha_npu_wlan_enable_irq(struct airoha_npu *npu, int q) 309{ 310} 311 312static inline void airoha_npu_wlan_disable_irq(struct airoha_npu *npu, int q) 313{ 314} 315#endif 316 317#endif /* AIROHA_OFFLOAD_H */