* [PATCH net-next v4 0/7] net: airoha: Introduce NPU callbacks for wlan offloading
@ 2025-07-17 6:57 Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 1/7] dt-bindings: net: airoha: npu: Add memory regions used for wlan offload Lorenzo Bianconi
` (6 more replies)
0 siblings, 7 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2025-07-17 6:57 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Lorenzo Bianconi
Cc: Simon Horman, linux-arm-kernel, linux-mediatek, netdev,
devicetree
Similar to wired traffic, EN7581 SoC allows to offload traffic to/from
the MT76 wireless NIC configuring the NPU module via the Netfilter
flowtable. This series introduces the necessary NPU callback used by
the MT7996 driver in order to enable the offloading.
MT76 support has been posted as RFC in [0] in order to show how the
APIs are consumed.
[0] https://lore.kernel.org/linux-wireless/cover.1752505597.git.lorenzo@kernel.org/T/#t
---
Changes in v4:
- Improve commit messages
- Link to v3: https://lore.kernel.org/r/20250714-airoha-en7581-wlan-offlaod-v3-0-80abf6aae9e4@kernel.org
Changes in v3:
- Rename 'binary' memory region in 'firmware'
- Do not make memory-region-names property required
- Link to v2: https://lore.kernel.org/r/20250705-airoha-en7581-wlan-offlaod-v2-0-3cf32785e381@kernel.org
Changes in v2:
- Introduce binding for memory regions used for wlan offload
- Rely on of_reserved_mem_region_to_resource_byname
- Export just wlan_{send,get}_msg NPU callback for MT76
- Improve commit messages
- Link to v1: https://lore.kernel.org/r/20250702-airoha-en7581-wlan-offlaod-v1-0-803009700b38@kernel.org
---
Lorenzo Bianconi (7):
dt-bindings: net: airoha: npu: Add memory regions used for wlan offload
net: airoha: npu: Add NPU wlan memory initialization commands
net: airoha: npu: Add wlan_{send,get}_msg NPU callbacks
net: airoha: npu: Add wlan irq management callbacks
net: airoha: npu: Read NPU wlan interrupt lines from the DTS
net: airoha: npu: Enable core 3 for WiFi offloading
net: airoha: Add airoha_offload.h header
.../devicetree/bindings/net/airoha,en7581-npu.yaml | 19 +-
drivers/net/ethernet/airoha/airoha_npu.c | 180 +++++++++++++-
drivers/net/ethernet/airoha/airoha_npu.h | 36 ---
drivers/net/ethernet/airoha/airoha_ppe.c | 2 +-
include/linux/soc/airoha/airoha_offload.h | 259 +++++++++++++++++++++
5 files changed, 452 insertions(+), 44 deletions(-)
---
base-commit: cd031354087d8ae005404f0c552730f0bd33ac33
change-id: 20250701-airoha-en7581-wlan-offlaod-67c9daff8473
Best regards,
--
Lorenzo Bianconi <lorenzo@kernel.org>
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH net-next v4 1/7] dt-bindings: net: airoha: npu: Add memory regions used for wlan offload
2025-07-17 6:57 [PATCH net-next v4 0/7] net: airoha: Introduce NPU callbacks for wlan offloading Lorenzo Bianconi
@ 2025-07-17 6:57 ` Lorenzo Bianconi
2025-07-18 7:14 ` Krzysztof Kozlowski
2025-07-17 6:57 ` [PATCH net-next v4 2/7] net: airoha: npu: Add NPU wlan memory initialization commands Lorenzo Bianconi
` (5 subsequent siblings)
6 siblings, 1 reply; 11+ messages in thread
From: Lorenzo Bianconi @ 2025-07-17 6:57 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Lorenzo Bianconi
Cc: Simon Horman, linux-arm-kernel, linux-mediatek, netdev,
devicetree
Document memory regions used by Airoha EN7581 NPU for wlan traffic
offloading. The brand new added memory regions do not introduce any
backward compatibility issues since they will be used just to offload
traffic to/from the MT76 wireless NIC and the MT76 probing will not fail
if these memory regions are not provide, it will just disable offloading
via the NPU module.
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
.../devicetree/bindings/net/airoha,en7581-npu.yaml | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/Documentation/devicetree/bindings/net/airoha,en7581-npu.yaml b/Documentation/devicetree/bindings/net/airoha,en7581-npu.yaml
index 76dd97c3fb4004674dc30a54c039c1cc19afedb3..f99d60f75bb03931a1c4f35066c72c709e337fd2 100644
--- a/Documentation/devicetree/bindings/net/airoha,en7581-npu.yaml
+++ b/Documentation/devicetree/bindings/net/airoha,en7581-npu.yaml
@@ -41,9 +41,18 @@ properties:
- description: wlan irq line5
memory-region:
- maxItems: 1
- description:
- Memory used to store NPU firmware binary.
+ items:
+ - description: NPU firmware binary region
+ - description: NPU wlan offload RX buffers region
+ - description: NPU wlan offload TX buffers region
+ - description: NPU wlan offload TX packet identifiers region
+
+ memory-region-names:
+ items:
+ - const: firmware
+ - const: pkt
+ - const: tx-pkt
+ - const: tx-bufid
required:
- compatible
@@ -79,6 +88,8 @@ examples:
<GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
- memory-region = <&npu_binary>;
+ memory-region = <&npu_firmware>, <&npu_pkt>, <&npu_txpkt>,
+ <&npu_txbufid>;
+ memory-region-names = "firmware", "pkt", "tx-pkt", "tx-bufid";
};
};
--
2.50.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next v4 2/7] net: airoha: npu: Add NPU wlan memory initialization commands
2025-07-17 6:57 [PATCH net-next v4 0/7] net: airoha: Introduce NPU callbacks for wlan offloading Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 1/7] dt-bindings: net: airoha: npu: Add memory regions used for wlan offload Lorenzo Bianconi
@ 2025-07-17 6:57 ` Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 3/7] net: airoha: npu: Add wlan_{send,get}_msg NPU callbacks Lorenzo Bianconi
` (4 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2025-07-17 6:57 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Lorenzo Bianconi
Cc: Simon Horman, linux-arm-kernel, linux-mediatek, netdev,
devicetree
Introduce wlan_init_reserved_memory callback used by MT76 driver during
NPU wlan offloading setup.
This is a preliminary patch to enable wlan flowtable offload for EN7581
SoC with MT76 driver.
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/ethernet/airoha/airoha_npu.c | 81 ++++++++++++++++++++++++++++++++
drivers/net/ethernet/airoha/airoha_npu.h | 38 +++++++++++++++
2 files changed, 119 insertions(+)
diff --git a/drivers/net/ethernet/airoha/airoha_npu.c b/drivers/net/ethernet/airoha/airoha_npu.c
index 4e8deb87f7514b2d17d877d485ffb3bce1ae03be..bcf7f5e645f7ec5e3e8c7474f6715f4810d192dc 100644
--- a/drivers/net/ethernet/airoha/airoha_npu.c
+++ b/drivers/net/ethernet/airoha/airoha_npu.c
@@ -124,6 +124,17 @@ struct ppe_mbox_data {
};
};
+#define WLAN_MAX_STATS_SIZE 4408
+struct wlan_mbox_data {
+ u32 ifindex:4;
+ u32 func_type:4;
+ u32 func_id;
+ union {
+ u32 data;
+ u8 stats[WLAN_MAX_STATS_SIZE];
+ };
+};
+
static int airoha_npu_send_msg(struct airoha_npu *npu, int func_id,
void *p, int size)
{
@@ -390,6 +401,75 @@ static int airoha_npu_stats_setup(struct airoha_npu *npu,
return err;
}
+static int airoha_npu_wlan_msg_send(struct airoha_npu *npu, int ifindex,
+ enum airoha_npu_wlan_set_cmd func_id,
+ u32 data, gfp_t gfp)
+{
+ struct wlan_mbox_data *wlan_data;
+ int err;
+
+ wlan_data = kzalloc(sizeof(*wlan_data), gfp);
+ if (!wlan_data)
+ return -ENOMEM;
+
+ wlan_data->ifindex = ifindex;
+ wlan_data->func_type = NPU_OP_SET;
+ wlan_data->func_id = func_id;
+ wlan_data->data = data;
+
+ err = airoha_npu_send_msg(npu, NPU_FUNC_WIFI, wlan_data,
+ sizeof(*wlan_data));
+ kfree(wlan_data);
+
+ return err;
+}
+
+static int
+airoha_npu_wlan_set_reserved_memory(struct airoha_npu *npu,
+ int ifindex, const char *name,
+ enum airoha_npu_wlan_set_cmd func_id)
+{
+ struct device *dev = npu->dev;
+ struct resource res;
+ int err;
+
+ err = of_reserved_mem_region_to_resource_byname(dev->of_node, name,
+ &res);
+ if (err)
+ return err;
+
+ return airoha_npu_wlan_msg_send(npu, ifindex, func_id, res.start,
+ GFP_KERNEL);
+}
+
+static int airoha_npu_wlan_init_memory(struct airoha_npu *npu)
+{
+ enum airoha_npu_wlan_set_cmd cmd = WLAN_FUNC_SET_WAIT_NPU_BAND0_ONCPU;
+ int err;
+
+ err = airoha_npu_wlan_msg_send(npu, 1, cmd, 0, GFP_KERNEL);
+ if (err)
+ return err;
+
+ cmd = WLAN_FUNC_SET_WAIT_TX_BUF_CHECK_ADDR;
+ err = airoha_npu_wlan_set_reserved_memory(npu, 0, "tx-bufid", cmd);
+ if (err)
+ return err;
+
+ cmd = WLAN_FUNC_SET_WAIT_PKT_BUF_ADDR;
+ err = airoha_npu_wlan_set_reserved_memory(npu, 0, "pkt", cmd);
+ if (err)
+ return err;
+
+ cmd = WLAN_FUNC_SET_WAIT_TX_PKT_BUF_ADDR;
+ err = airoha_npu_wlan_set_reserved_memory(npu, 0, "tx-pkt", cmd);
+ if (err)
+ return err;
+
+ cmd = WLAN_FUNC_SET_WAIT_IS_FORCE_TO_CPU;
+ return airoha_npu_wlan_msg_send(npu, 0, cmd, 0, GFP_KERNEL);
+}
+
struct airoha_npu *airoha_npu_get(struct device *dev, dma_addr_t *stats_addr)
{
struct platform_device *pdev;
@@ -492,6 +572,7 @@ static int airoha_npu_probe(struct platform_device *pdev)
npu->ops.ppe_deinit = airoha_npu_ppe_deinit;
npu->ops.ppe_flush_sram_entries = airoha_npu_ppe_flush_sram_entries;
npu->ops.ppe_foe_commit_entry = airoha_npu_foe_commit_entry;
+ npu->ops.wlan_init_reserved_memory = airoha_npu_wlan_init_memory;
npu->regmap = devm_regmap_init_mmio(dev, base, ®map_config);
if (IS_ERR(npu->regmap))
diff --git a/drivers/net/ethernet/airoha/airoha_npu.h b/drivers/net/ethernet/airoha/airoha_npu.h
index 98ec3be74ce450bf4fa8bc771d19d174e8c157e5..58f4ee04e17161acbe513779638c23fe79a83a78 100644
--- a/drivers/net/ethernet/airoha/airoha_npu.h
+++ b/drivers/net/ethernet/airoha/airoha_npu.h
@@ -6,6 +6,43 @@
#define NPU_NUM_CORES 8
+enum airoha_npu_wlan_set_cmd {
+ WLAN_FUNC_SET_WAIT_PCIE_ADDR,
+ WLAN_FUNC_SET_WAIT_DESC,
+ WLAN_FUNC_SET_WAIT_NPU_INIT_DONE,
+ WLAN_FUNC_SET_WAIT_TRAN_TO_CPU,
+ WLAN_FUNC_SET_WAIT_BA_WIN_SIZE,
+ WLAN_FUNC_SET_WAIT_DRIVER_MODEL,
+ WLAN_FUNC_SET_WAIT_DEL_STA,
+ WLAN_FUNC_SET_WAIT_DRAM_BA_NODE_ADDR,
+ WLAN_FUNC_SET_WAIT_PKT_BUF_ADDR,
+ WLAN_FUNC_SET_WAIT_IS_TEST_NOBA,
+ WLAN_FUNC_SET_WAIT_FLUSHONE_TIMEOUT,
+ WLAN_FUNC_SET_WAIT_FLUSHALL_TIMEOUT,
+ WLAN_FUNC_SET_WAIT_IS_FORCE_TO_CPU,
+ WLAN_FUNC_SET_WAIT_PCIE_STATE,
+ WLAN_FUNC_SET_WAIT_PCIE_PORT_TYPE,
+ WLAN_FUNC_SET_WAIT_ERROR_RETRY_TIMES,
+ WLAN_FUNC_SET_WAIT_BAR_INFO,
+ WLAN_FUNC_SET_WAIT_FAST_FLAG,
+ WLAN_FUNC_SET_WAIT_NPU_BAND0_ONCPU,
+ WLAN_FUNC_SET_WAIT_TX_RING_PCIE_ADDR,
+ WLAN_FUNC_SET_WAIT_TX_DESC_HW_BASE,
+ WLAN_FUNC_SET_WAIT_TX_BUF_SPACE_HW_BASE,
+ WLAN_FUNC_SET_WAIT_RX_RING_FOR_TXDONE_HW_BASE,
+ WLAN_FUNC_SET_WAIT_TX_PKT_BUF_ADDR,
+ WLAN_FUNC_SET_WAIT_INODE_TXRX_REG_ADDR,
+ WLAN_FUNC_SET_WAIT_INODE_DEBUG_FLAG,
+ WLAN_FUNC_SET_WAIT_INODE_HW_CFG_INFO,
+ WLAN_FUNC_SET_WAIT_INODE_STOP_ACTION,
+ WLAN_FUNC_SET_WAIT_INODE_PCIE_SWAP,
+ WLAN_FUNC_SET_WAIT_RATELIMIT_CTRL,
+ WLAN_FUNC_SET_WAIT_HWNAT_INIT,
+ WLAN_FUNC_SET_WAIT_ARHT_CHIP_INFO,
+ WLAN_FUNC_SET_WAIT_TX_BUF_CHECK_ADDR,
+ WLAN_FUNC_SET_WAIT_DEBUG_ARRAY_ADDR,
+};
+
struct airoha_npu {
struct device *dev;
struct regmap *regmap;
@@ -29,6 +66,7 @@ struct airoha_npu {
dma_addr_t foe_addr,
u32 entry_size, u32 hash,
bool ppe2);
+ int (*wlan_init_reserved_memory)(struct airoha_npu *npu);
} ops;
};
--
2.50.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next v4 3/7] net: airoha: npu: Add wlan_{send,get}_msg NPU callbacks
2025-07-17 6:57 [PATCH net-next v4 0/7] net: airoha: Introduce NPU callbacks for wlan offloading Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 1/7] dt-bindings: net: airoha: npu: Add memory regions used for wlan offload Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 2/7] net: airoha: npu: Add NPU wlan memory initialization commands Lorenzo Bianconi
@ 2025-07-17 6:57 ` Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 4/7] net: airoha: npu: Add wlan irq management callbacks Lorenzo Bianconi
` (3 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2025-07-17 6:57 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Lorenzo Bianconi
Cc: Simon Horman, linux-arm-kernel, linux-mediatek, netdev,
devicetree
Introduce wlan_send_msg() and wlan_get_msg() NPU wlan callbacks used
by the wlan driver (MT76) to initialize NPU module registers in order to
offload wireless-wired traffic.
This is a preliminary patch to enable wlan flowtable offload for EN7581
SoC with MT76 driver.
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/ethernet/airoha/airoha_npu.c | 58 ++++++++++++++++++++++++++++++++
drivers/net/ethernet/airoha/airoha_npu.h | 21 ++++++++++++
2 files changed, 79 insertions(+)
diff --git a/drivers/net/ethernet/airoha/airoha_npu.c b/drivers/net/ethernet/airoha/airoha_npu.c
index bcf7f5e645f7ec5e3e8c7474f6715f4810d192dc..cf087daa5d0b7b5e60edda632423a8d07240ed4f 100644
--- a/drivers/net/ethernet/airoha/airoha_npu.c
+++ b/drivers/net/ethernet/airoha/airoha_npu.c
@@ -42,6 +42,22 @@
#define REG_CR_MBQ8_CTRL(_n) (NPU_MBOX_BASE_ADDR + 0x0b0 + ((_n) << 2))
#define REG_CR_NPU_MIB(_n) (NPU_MBOX_BASE_ADDR + 0x140 + ((_n) << 2))
+#define NPU_WLAN_BASE_ADDR 0x30d000
+
+#define REG_IRQ_STATUS (NPU_WLAN_BASE_ADDR + 0x030)
+#define REG_IRQ_RXDONE(_n) (NPU_WLAN_BASE_ADDR + ((_n) << 2) + 0x034)
+#define NPU_IRQ_RX_MASK(_n) ((_n) == 1 ? BIT(17) : BIT(16))
+
+#define REG_TX_BASE(_n) (NPU_WLAN_BASE_ADDR + ((_n) << 4) + 0x080)
+#define REG_TX_DSCP_NUM(_n) (NPU_WLAN_BASE_ADDR + ((_n) << 4) + 0x084)
+#define REG_TX_CPU_IDX(_n) (NPU_WLAN_BASE_ADDR + ((_n) << 4) + 0x088)
+#define REG_TX_DMA_IDX(_n) (NPU_WLAN_BASE_ADDR + ((_n) << 4) + 0x08c)
+
+#define REG_RX_BASE(_n) (NPU_WLAN_BASE_ADDR + ((_n) << 4) + 0x180)
+#define REG_RX_DSCP_NUM(_n) (NPU_WLAN_BASE_ADDR + ((_n) << 4) + 0x184)
+#define REG_RX_CPU_IDX(_n) (NPU_WLAN_BASE_ADDR + ((_n) << 4) + 0x188)
+#define REG_RX_DMA_IDX(_n) (NPU_WLAN_BASE_ADDR + ((_n) << 4) + 0x18c)
+
#define NPU_TIMER_BASE_ADDR 0x310100
#define REG_WDT_TIMER_CTRL(_n) (NPU_TIMER_BASE_ADDR + ((_n) * 0x100))
#define WDT_EN_MASK BIT(25)
@@ -131,6 +147,12 @@ struct wlan_mbox_data {
u32 func_id;
union {
u32 data;
+ struct {
+ u32 dir;
+ u32 in_counter_addr;
+ u32 out_status_addr;
+ u32 out_counter_addr;
+ } txrx_addr;
u8 stats[WLAN_MAX_STATS_SIZE];
};
};
@@ -424,6 +446,30 @@ static int airoha_npu_wlan_msg_send(struct airoha_npu *npu, int ifindex,
return err;
}
+static int airoha_npu_wlan_msg_get(struct airoha_npu *npu, int ifindex,
+ enum airoha_npu_wlan_get_cmd func_id,
+ u32 *data, gfp_t gfp)
+{
+ struct wlan_mbox_data *wlan_data;
+ int err;
+
+ wlan_data = kzalloc(sizeof(*wlan_data), gfp);
+ if (!wlan_data)
+ return -ENOMEM;
+
+ wlan_data->ifindex = ifindex;
+ wlan_data->func_type = NPU_OP_GET;
+ wlan_data->func_id = func_id;
+
+ err = airoha_npu_send_msg(npu, NPU_FUNC_WIFI, wlan_data,
+ sizeof(*wlan_data));
+ if (!err)
+ *data = wlan_data->data;
+ kfree(wlan_data);
+
+ return err;
+}
+
static int
airoha_npu_wlan_set_reserved_memory(struct airoha_npu *npu,
int ifindex, const char *name,
@@ -470,6 +516,15 @@ static int airoha_npu_wlan_init_memory(struct airoha_npu *npu)
return airoha_npu_wlan_msg_send(npu, 0, cmd, 0, GFP_KERNEL);
}
+static u32 airoha_npu_wlan_queue_addr_get(struct airoha_npu *npu, int qid,
+ bool xmit)
+{
+ if (xmit)
+ return REG_TX_BASE(qid + 2);
+
+ return REG_RX_BASE(qid);
+}
+
struct airoha_npu *airoha_npu_get(struct device *dev, dma_addr_t *stats_addr)
{
struct platform_device *pdev;
@@ -573,6 +628,9 @@ static int airoha_npu_probe(struct platform_device *pdev)
npu->ops.ppe_flush_sram_entries = airoha_npu_ppe_flush_sram_entries;
npu->ops.ppe_foe_commit_entry = airoha_npu_foe_commit_entry;
npu->ops.wlan_init_reserved_memory = airoha_npu_wlan_init_memory;
+ npu->ops.wlan_send_msg = airoha_npu_wlan_msg_send;
+ npu->ops.wlan_get_msg = airoha_npu_wlan_msg_get;
+ npu->ops.wlan_get_queue_addr = airoha_npu_wlan_queue_addr_get;
npu->regmap = devm_regmap_init_mmio(dev, base, ®map_config);
if (IS_ERR(npu->regmap))
diff --git a/drivers/net/ethernet/airoha/airoha_npu.h b/drivers/net/ethernet/airoha/airoha_npu.h
index 58f4ee04e17161acbe513779638c23fe79a83a78..b81bb9398fed9366a18f9bf79e323372969ee138 100644
--- a/drivers/net/ethernet/airoha/airoha_npu.h
+++ b/drivers/net/ethernet/airoha/airoha_npu.h
@@ -43,6 +43,19 @@ enum airoha_npu_wlan_set_cmd {
WLAN_FUNC_SET_WAIT_DEBUG_ARRAY_ADDR,
};
+enum airoha_npu_wlan_get_cmd {
+ WLAN_FUNC_GET_WAIT_NPU_INFO,
+ WLAN_FUNC_GET_WAIT_LAST_RATE,
+ WLAN_FUNC_GET_WAIT_COUNTER,
+ WLAN_FUNC_GET_WAIT_DBG_COUNTER,
+ WLAN_FUNC_GET_WAIT_RXDESC_BASE,
+ WLAN_FUNC_GET_WAIT_WCID_DBG_COUNTER,
+ WLAN_FUNC_GET_WAIT_DMA_ADDR,
+ WLAN_FUNC_GET_WAIT_RING_SIZE,
+ WLAN_FUNC_GET_WAIT_NPU_SUPPORT_MAP,
+ WLAN_FUNC_GET_WAIT_MDC_LOCK_ADDRESS,
+};
+
struct airoha_npu {
struct device *dev;
struct regmap *regmap;
@@ -67,6 +80,14 @@ struct airoha_npu {
u32 entry_size, u32 hash,
bool ppe2);
int (*wlan_init_reserved_memory)(struct airoha_npu *npu);
+ int (*wlan_send_msg)(struct airoha_npu *npu, int ifindex,
+ enum airoha_npu_wlan_set_cmd func_id,
+ u32 data, gfp_t gfp);
+ int (*wlan_get_msg)(struct airoha_npu *npu, int ifindex,
+ enum airoha_npu_wlan_get_cmd func_id,
+ u32 *data, gfp_t gfp);
+ u32 (*wlan_get_queue_addr)(struct airoha_npu *npu, int qid,
+ bool xmit);
} ops;
};
--
2.50.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next v4 4/7] net: airoha: npu: Add wlan irq management callbacks
2025-07-17 6:57 [PATCH net-next v4 0/7] net: airoha: Introduce NPU callbacks for wlan offloading Lorenzo Bianconi
` (2 preceding siblings ...)
2025-07-17 6:57 ` [PATCH net-next v4 3/7] net: airoha: npu: Add wlan_{send,get}_msg NPU callbacks Lorenzo Bianconi
@ 2025-07-17 6:57 ` Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 5/7] net: airoha: npu: Read NPU wlan interrupt lines from the DTS Lorenzo Bianconi
` (2 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2025-07-17 6:57 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Lorenzo Bianconi
Cc: Simon Horman, linux-arm-kernel, linux-mediatek, netdev,
devicetree
Introduce callbacks used by the MT76 driver to configure NPU SoC
interrupts. This is a preliminary patch to enable wlan flowtable
offload for EN7581 SoC with MT76 driver.
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/ethernet/airoha/airoha_npu.c | 27 +++++++++++++++++++++++++++
drivers/net/ethernet/airoha/airoha_npu.h | 4 ++++
2 files changed, 31 insertions(+)
diff --git a/drivers/net/ethernet/airoha/airoha_npu.c b/drivers/net/ethernet/airoha/airoha_npu.c
index cf087daa5d0b7b5e60edda632423a8d07240ed4f..d25c9e799c8b0725e82f44f067112caa101ec12e 100644
--- a/drivers/net/ethernet/airoha/airoha_npu.c
+++ b/drivers/net/ethernet/airoha/airoha_npu.c
@@ -525,6 +525,29 @@ static u32 airoha_npu_wlan_queue_addr_get(struct airoha_npu *npu, int qid,
return REG_RX_BASE(qid);
}
+static void airoha_npu_wlan_irq_status_set(struct airoha_npu *npu, u32 val)
+{
+ regmap_write(npu->regmap, REG_IRQ_STATUS, val);
+}
+
+static u32 airoha_npu_wlan_irq_status_get(struct airoha_npu *npu, int q)
+{
+ u32 val;
+
+ regmap_read(npu->regmap, REG_IRQ_STATUS, &val);
+ return val;
+}
+
+static void airoha_npu_wlan_irq_enable(struct airoha_npu *npu, int q)
+{
+ regmap_set_bits(npu->regmap, REG_IRQ_RXDONE(q), NPU_IRQ_RX_MASK(q));
+}
+
+static void airoha_npu_wlan_irq_disable(struct airoha_npu *npu, int q)
+{
+ regmap_clear_bits(npu->regmap, REG_IRQ_RXDONE(q), NPU_IRQ_RX_MASK(q));
+}
+
struct airoha_npu *airoha_npu_get(struct device *dev, dma_addr_t *stats_addr)
{
struct platform_device *pdev;
@@ -631,6 +654,10 @@ static int airoha_npu_probe(struct platform_device *pdev)
npu->ops.wlan_send_msg = airoha_npu_wlan_msg_send;
npu->ops.wlan_get_msg = airoha_npu_wlan_msg_get;
npu->ops.wlan_get_queue_addr = airoha_npu_wlan_queue_addr_get;
+ npu->ops.wlan_set_irq_status = airoha_npu_wlan_irq_status_set;
+ npu->ops.wlan_get_irq_status = airoha_npu_wlan_irq_status_get;
+ npu->ops.wlan_enable_irq = airoha_npu_wlan_irq_enable;
+ npu->ops.wlan_disable_irq = airoha_npu_wlan_irq_disable;
npu->regmap = devm_regmap_init_mmio(dev, base, ®map_config);
if (IS_ERR(npu->regmap))
diff --git a/drivers/net/ethernet/airoha/airoha_npu.h b/drivers/net/ethernet/airoha/airoha_npu.h
index b81bb9398fed9366a18f9bf79e323372969ee138..8e830d12bd8a518038f2df7605a5d9f455725e40 100644
--- a/drivers/net/ethernet/airoha/airoha_npu.h
+++ b/drivers/net/ethernet/airoha/airoha_npu.h
@@ -88,6 +88,10 @@ struct airoha_npu {
u32 *data, gfp_t gfp);
u32 (*wlan_get_queue_addr)(struct airoha_npu *npu, int qid,
bool xmit);
+ void (*wlan_set_irq_status)(struct airoha_npu *npu, u32 val);
+ u32 (*wlan_get_irq_status)(struct airoha_npu *npu, int q);
+ void (*wlan_enable_irq)(struct airoha_npu *npu, int q);
+ void (*wlan_disable_irq)(struct airoha_npu *npu, int q);
} ops;
};
--
2.50.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next v4 5/7] net: airoha: npu: Read NPU wlan interrupt lines from the DTS
2025-07-17 6:57 [PATCH net-next v4 0/7] net: airoha: Introduce NPU callbacks for wlan offloading Lorenzo Bianconi
` (3 preceding siblings ...)
2025-07-17 6:57 ` [PATCH net-next v4 4/7] net: airoha: npu: Add wlan irq management callbacks Lorenzo Bianconi
@ 2025-07-17 6:57 ` Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 6/7] net: airoha: npu: Enable core 3 for WiFi offloading Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 7/7] net: airoha: Add airoha_offload.h header Lorenzo Bianconi
6 siblings, 0 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2025-07-17 6:57 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Lorenzo Bianconi
Cc: Simon Horman, linux-arm-kernel, linux-mediatek, netdev,
devicetree
Read all NPU wlan IRQ lines from the NPU device-tree node.
NPU module fires wlan irq lines when the traffic to/from the WiFi NIC is
not hw accelerated (these interrupts will be consumed by the MT76 driver
in subsequent patches).
This is a preliminary patch to enable wlan flowtable offload for EN7581
SoC.
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/ethernet/airoha/airoha_npu.c | 9 +++++++++
drivers/net/ethernet/airoha/airoha_npu.h | 3 +++
2 files changed, 12 insertions(+)
diff --git a/drivers/net/ethernet/airoha/airoha_npu.c b/drivers/net/ethernet/airoha/airoha_npu.c
index d25c9e799c8b0725e82f44f067112caa101ec12e..68ddc940f675b42599bd2c0245dc715bb56edb32 100644
--- a/drivers/net/ethernet/airoha/airoha_npu.c
+++ b/drivers/net/ethernet/airoha/airoha_npu.c
@@ -694,6 +694,15 @@ static int airoha_npu_probe(struct platform_device *pdev)
INIT_WORK(&core->wdt_work, airoha_npu_wdt_work);
}
+ /* wlan IRQ lines */
+ for (i = 0; i < ARRAY_SIZE(npu->irqs); i++) {
+ irq = platform_get_irq(pdev, i + ARRAY_SIZE(npu->cores) + 1);
+ if (irq < 0)
+ return irq;
+
+ npu->irqs[i] = irq;
+ }
+
err = dma_set_coherent_mask(dev, DMA_BIT_MASK(32));
if (err)
return err;
diff --git a/drivers/net/ethernet/airoha/airoha_npu.h b/drivers/net/ethernet/airoha/airoha_npu.h
index 8e830d12bd8a518038f2df7605a5d9f455725e40..981b283806fa8347256f6dce756729daa4736e47 100644
--- a/drivers/net/ethernet/airoha/airoha_npu.h
+++ b/drivers/net/ethernet/airoha/airoha_npu.h
@@ -5,6 +5,7 @@
*/
#define NPU_NUM_CORES 8
+#define NPU_NUM_IRQ 6
enum airoha_npu_wlan_set_cmd {
WLAN_FUNC_SET_WAIT_PCIE_ADDR,
@@ -67,6 +68,8 @@ struct airoha_npu {
struct work_struct wdt_work;
} cores[NPU_NUM_CORES];
+ int irqs[NPU_NUM_IRQ];
+
struct airoha_foe_stats __iomem *stats;
struct {
--
2.50.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next v4 6/7] net: airoha: npu: Enable core 3 for WiFi offloading
2025-07-17 6:57 [PATCH net-next v4 0/7] net: airoha: Introduce NPU callbacks for wlan offloading Lorenzo Bianconi
` (4 preceding siblings ...)
2025-07-17 6:57 ` [PATCH net-next v4 5/7] net: airoha: npu: Read NPU wlan interrupt lines from the DTS Lorenzo Bianconi
@ 2025-07-17 6:57 ` Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 7/7] net: airoha: Add airoha_offload.h header Lorenzo Bianconi
6 siblings, 0 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2025-07-17 6:57 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Lorenzo Bianconi
Cc: Simon Horman, linux-arm-kernel, linux-mediatek, netdev,
devicetree
NPU core 3 is responsible for WiFi offloading so enable it during NPU
probe.
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/ethernet/airoha/airoha_npu.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/airoha/airoha_npu.c b/drivers/net/ethernet/airoha/airoha_npu.c
index 68ddc940f675b42599bd2c0245dc715bb56edb32..90000496b6a234897d4f208ab78d54af14be4aac 100644
--- a/drivers/net/ethernet/airoha/airoha_npu.c
+++ b/drivers/net/ethernet/airoha/airoha_npu.c
@@ -724,8 +724,7 @@ static int airoha_npu_probe(struct platform_device *pdev)
usleep_range(1000, 2000);
/* enable NPU cores */
- /* do not start core3 since it is used for WiFi offloading */
- regmap_write(npu->regmap, REG_CR_BOOT_CONFIG, 0xf7);
+ regmap_write(npu->regmap, REG_CR_BOOT_CONFIG, 0xff);
regmap_write(npu->regmap, REG_CR_BOOT_TRIGGER, 0x1);
msleep(100);
--
2.50.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH net-next v4 7/7] net: airoha: Add airoha_offload.h header
2025-07-17 6:57 [PATCH net-next v4 0/7] net: airoha: Introduce NPU callbacks for wlan offloading Lorenzo Bianconi
` (5 preceding siblings ...)
2025-07-17 6:57 ` [PATCH net-next v4 6/7] net: airoha: npu: Enable core 3 for WiFi offloading Lorenzo Bianconi
@ 2025-07-17 6:57 ` Lorenzo Bianconi
6 siblings, 0 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2025-07-17 6:57 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Lorenzo Bianconi
Cc: Simon Horman, linux-arm-kernel, linux-mediatek, netdev,
devicetree
Move NPU definitions to airoha_offload.h in include/linux/soc/airoha/ in
order to allow the MT76 driver to access the callback definitions.
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
drivers/net/ethernet/airoha/airoha_npu.c | 2 +-
drivers/net/ethernet/airoha/airoha_npu.h | 102 ------------
drivers/net/ethernet/airoha/airoha_ppe.c | 2 +-
include/linux/soc/airoha/airoha_offload.h | 259 ++++++++++++++++++++++++++++++
4 files changed, 261 insertions(+), 104 deletions(-)
diff --git a/drivers/net/ethernet/airoha/airoha_npu.c b/drivers/net/ethernet/airoha/airoha_npu.c
index 90000496b6a234897d4f208ab78d54af14be4aac..00c0144224a7a9e6321e9959c02400e3cb384126 100644
--- a/drivers/net/ethernet/airoha/airoha_npu.c
+++ b/drivers/net/ethernet/airoha/airoha_npu.c
@@ -11,9 +11,9 @@
#include <linux/of_platform.h>
#include <linux/of_reserved_mem.h>
#include <linux/regmap.h>
+#include <linux/soc/airoha/airoha_offload.h>
#include "airoha_eth.h"
-#include "airoha_npu.h"
#define NPU_EN7581_FIRMWARE_DATA "airoha/en7581_npu_data.bin"
#define NPU_EN7581_FIRMWARE_RV32 "airoha/en7581_npu_rv32.bin"
diff --git a/drivers/net/ethernet/airoha/airoha_npu.h b/drivers/net/ethernet/airoha/airoha_npu.h
deleted file mode 100644
index 981b283806fa8347256f6dce756729daa4736e47..0000000000000000000000000000000000000000
--- a/drivers/net/ethernet/airoha/airoha_npu.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Copyright (c) 2025 AIROHA Inc
- * Author: Lorenzo Bianconi <lorenzo@kernel.org>
- */
-
-#define NPU_NUM_CORES 8
-#define NPU_NUM_IRQ 6
-
-enum airoha_npu_wlan_set_cmd {
- WLAN_FUNC_SET_WAIT_PCIE_ADDR,
- WLAN_FUNC_SET_WAIT_DESC,
- WLAN_FUNC_SET_WAIT_NPU_INIT_DONE,
- WLAN_FUNC_SET_WAIT_TRAN_TO_CPU,
- WLAN_FUNC_SET_WAIT_BA_WIN_SIZE,
- WLAN_FUNC_SET_WAIT_DRIVER_MODEL,
- WLAN_FUNC_SET_WAIT_DEL_STA,
- WLAN_FUNC_SET_WAIT_DRAM_BA_NODE_ADDR,
- WLAN_FUNC_SET_WAIT_PKT_BUF_ADDR,
- WLAN_FUNC_SET_WAIT_IS_TEST_NOBA,
- WLAN_FUNC_SET_WAIT_FLUSHONE_TIMEOUT,
- WLAN_FUNC_SET_WAIT_FLUSHALL_TIMEOUT,
- WLAN_FUNC_SET_WAIT_IS_FORCE_TO_CPU,
- WLAN_FUNC_SET_WAIT_PCIE_STATE,
- WLAN_FUNC_SET_WAIT_PCIE_PORT_TYPE,
- WLAN_FUNC_SET_WAIT_ERROR_RETRY_TIMES,
- WLAN_FUNC_SET_WAIT_BAR_INFO,
- WLAN_FUNC_SET_WAIT_FAST_FLAG,
- WLAN_FUNC_SET_WAIT_NPU_BAND0_ONCPU,
- WLAN_FUNC_SET_WAIT_TX_RING_PCIE_ADDR,
- WLAN_FUNC_SET_WAIT_TX_DESC_HW_BASE,
- WLAN_FUNC_SET_WAIT_TX_BUF_SPACE_HW_BASE,
- WLAN_FUNC_SET_WAIT_RX_RING_FOR_TXDONE_HW_BASE,
- WLAN_FUNC_SET_WAIT_TX_PKT_BUF_ADDR,
- WLAN_FUNC_SET_WAIT_INODE_TXRX_REG_ADDR,
- WLAN_FUNC_SET_WAIT_INODE_DEBUG_FLAG,
- WLAN_FUNC_SET_WAIT_INODE_HW_CFG_INFO,
- WLAN_FUNC_SET_WAIT_INODE_STOP_ACTION,
- WLAN_FUNC_SET_WAIT_INODE_PCIE_SWAP,
- WLAN_FUNC_SET_WAIT_RATELIMIT_CTRL,
- WLAN_FUNC_SET_WAIT_HWNAT_INIT,
- WLAN_FUNC_SET_WAIT_ARHT_CHIP_INFO,
- WLAN_FUNC_SET_WAIT_TX_BUF_CHECK_ADDR,
- WLAN_FUNC_SET_WAIT_DEBUG_ARRAY_ADDR,
-};
-
-enum airoha_npu_wlan_get_cmd {
- WLAN_FUNC_GET_WAIT_NPU_INFO,
- WLAN_FUNC_GET_WAIT_LAST_RATE,
- WLAN_FUNC_GET_WAIT_COUNTER,
- WLAN_FUNC_GET_WAIT_DBG_COUNTER,
- WLAN_FUNC_GET_WAIT_RXDESC_BASE,
- WLAN_FUNC_GET_WAIT_WCID_DBG_COUNTER,
- WLAN_FUNC_GET_WAIT_DMA_ADDR,
- WLAN_FUNC_GET_WAIT_RING_SIZE,
- WLAN_FUNC_GET_WAIT_NPU_SUPPORT_MAP,
- WLAN_FUNC_GET_WAIT_MDC_LOCK_ADDRESS,
-};
-
-struct airoha_npu {
- struct device *dev;
- struct regmap *regmap;
-
- struct airoha_npu_core {
- struct airoha_npu *npu;
- /* protect concurrent npu memory accesses */
- spinlock_t lock;
- struct work_struct wdt_work;
- } cores[NPU_NUM_CORES];
-
- int irqs[NPU_NUM_IRQ];
-
- struct airoha_foe_stats __iomem *stats;
-
- struct {
- int (*ppe_init)(struct airoha_npu *npu);
- int (*ppe_deinit)(struct airoha_npu *npu);
- int (*ppe_flush_sram_entries)(struct airoha_npu *npu,
- dma_addr_t foe_addr,
- int sram_num_entries);
- int (*ppe_foe_commit_entry)(struct airoha_npu *npu,
- dma_addr_t foe_addr,
- u32 entry_size, u32 hash,
- bool ppe2);
- int (*wlan_init_reserved_memory)(struct airoha_npu *npu);
- int (*wlan_send_msg)(struct airoha_npu *npu, int ifindex,
- enum airoha_npu_wlan_set_cmd func_id,
- u32 data, gfp_t gfp);
- int (*wlan_get_msg)(struct airoha_npu *npu, int ifindex,
- enum airoha_npu_wlan_get_cmd func_id,
- u32 *data, gfp_t gfp);
- u32 (*wlan_get_queue_addr)(struct airoha_npu *npu, int qid,
- bool xmit);
- void (*wlan_set_irq_status)(struct airoha_npu *npu, u32 val);
- u32 (*wlan_get_irq_status)(struct airoha_npu *npu, int q);
- void (*wlan_enable_irq)(struct airoha_npu *npu, int q);
- void (*wlan_disable_irq)(struct airoha_npu *npu, int q);
- } ops;
-};
-
-struct airoha_npu *airoha_npu_get(struct device *dev, dma_addr_t *stats_addr);
-void airoha_npu_put(struct airoha_npu *npu);
diff --git a/drivers/net/ethernet/airoha/airoha_ppe.c b/drivers/net/ethernet/airoha/airoha_ppe.c
index c354d536bc66e97ab853792e4ab4273283d2fb91..5d12bde6b20a89b3037ae4405b383d75307e8239 100644
--- a/drivers/net/ethernet/airoha/airoha_ppe.c
+++ b/drivers/net/ethernet/airoha/airoha_ppe.c
@@ -7,10 +7,10 @@
#include <linux/ip.h>
#include <linux/ipv6.h>
#include <linux/rhashtable.h>
+#include <linux/soc/airoha/airoha_offload.h>
#include <net/ipv6.h>
#include <net/pkt_cls.h>
-#include "airoha_npu.h"
#include "airoha_regs.h"
#include "airoha_eth.h"
diff --git a/include/linux/soc/airoha/airoha_offload.h b/include/linux/soc/airoha/airoha_offload.h
new file mode 100644
index 0000000000000000000000000000000000000000..299455abc6dad82791eef6d03adff65f08ed8d2f
--- /dev/null
+++ b/include/linux/soc/airoha/airoha_offload.h
@@ -0,0 +1,259 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2025 AIROHA Inc
+ * Author: Lorenzo Bianconi <lorenzo@kernel.org>
+ */
+#ifndef AIROHA_OFFLOAD_H
+#define AIROHA_OFFLOAD_H
+
+#include <linux/spinlock.h>
+#include <linux/workqueue.h>
+
+#define NPU_NUM_CORES 8
+#define NPU_NUM_IRQ 6
+#define NPU_RX0_DESC_NUM 512
+#define NPU_RX1_DESC_NUM 512
+
+/* CTRL */
+#define NPU_RX_DMA_DESC_LAST_MASK BIT(29)
+#define NPU_RX_DMA_DESC_LEN_MASK GENMASK(28, 15)
+#define NPU_RX_DMA_DESC_CUR_LEN_MASK GENMASK(14, 1)
+#define NPU_RX_DMA_DESC_DONE_MASK BIT(0)
+/* INFO */
+#define NPU_RX_DMA_PKT_COUNT_MASK GENMASK(31, 28)
+#define NPU_RX_DMA_PKT_ID_MASK GENMASK(28, 26)
+#define NPU_RX_DMA_SRC_PORT_MASK GENMASK(25, 21)
+#define NPU_RX_DMA_CRSN_MASK GENMASK(20, 16)
+#define NPU_RX_DMA_FOE_ID_MASK GENMASK(15, 0)
+/* DATA */
+#define NPU_RX_DMA_SID_MASK GENMASK(31, 16)
+#define NPU_RX_DMA_FRAG_TYPE_MASK GENMASK(15, 14)
+#define NPU_RX_DMA_PRIORITY_MASK GENMASK(13, 10)
+#define NPU_RX_DMA_RADIO_ID_MASK GENMASK(9, 6)
+#define NPU_RX_DMA_VAP_ID_MASK GENMASK(5, 2)
+#define NPU_RX_DMA_FRAME_TYPE_MASK GENMASK(1, 0)
+
+struct airoha_npu_rx_dma_desc {
+ u32 ctrl;
+ u32 info;
+ u32 data;
+ u32 addr;
+ u64 rsv;
+} __packed;
+
+/* CTRL */
+#define NPU_TX_DMA_DESC_SCHED_MASK BIT(31)
+#define NPU_TX_DMA_DESC_LEN_MASK GENMASK(30, 18)
+#define NPU_TX_DMA_DESC_VEND_LEN_MASK GENMASK(17, 1)
+#define NPU_TX_DMA_DESC_DONE_MASK BIT(0)
+
+#define NPU_TXWI_LEN 192
+
+struct airoha_npu_tx_dma_desc {
+ u32 ctrl;
+ u32 addr;
+ u64 rsv;
+ u8 txwi[NPU_TXWI_LEN];
+} __packed;
+
+enum airoha_npu_wlan_set_cmd {
+ WLAN_FUNC_SET_WAIT_PCIE_ADDR,
+ WLAN_FUNC_SET_WAIT_DESC,
+ WLAN_FUNC_SET_WAIT_NPU_INIT_DONE,
+ WLAN_FUNC_SET_WAIT_TRAN_TO_CPU,
+ WLAN_FUNC_SET_WAIT_BA_WIN_SIZE,
+ WLAN_FUNC_SET_WAIT_DRIVER_MODEL,
+ WLAN_FUNC_SET_WAIT_DEL_STA,
+ WLAN_FUNC_SET_WAIT_DRAM_BA_NODE_ADDR,
+ WLAN_FUNC_SET_WAIT_PKT_BUF_ADDR,
+ WLAN_FUNC_SET_WAIT_IS_TEST_NOBA,
+ WLAN_FUNC_SET_WAIT_FLUSHONE_TIMEOUT,
+ WLAN_FUNC_SET_WAIT_FLUSHALL_TIMEOUT,
+ WLAN_FUNC_SET_WAIT_IS_FORCE_TO_CPU,
+ WLAN_FUNC_SET_WAIT_PCIE_STATE,
+ WLAN_FUNC_SET_WAIT_PCIE_PORT_TYPE,
+ WLAN_FUNC_SET_WAIT_ERROR_RETRY_TIMES,
+ WLAN_FUNC_SET_WAIT_BAR_INFO,
+ WLAN_FUNC_SET_WAIT_FAST_FLAG,
+ WLAN_FUNC_SET_WAIT_NPU_BAND0_ONCPU,
+ WLAN_FUNC_SET_WAIT_TX_RING_PCIE_ADDR,
+ WLAN_FUNC_SET_WAIT_TX_DESC_HW_BASE,
+ WLAN_FUNC_SET_WAIT_TX_BUF_SPACE_HW_BASE,
+ WLAN_FUNC_SET_WAIT_RX_RING_FOR_TXDONE_HW_BASE,
+ WLAN_FUNC_SET_WAIT_TX_PKT_BUF_ADDR,
+ WLAN_FUNC_SET_WAIT_INODE_TXRX_REG_ADDR,
+ WLAN_FUNC_SET_WAIT_INODE_DEBUG_FLAG,
+ WLAN_FUNC_SET_WAIT_INODE_HW_CFG_INFO,
+ WLAN_FUNC_SET_WAIT_INODE_STOP_ACTION,
+ WLAN_FUNC_SET_WAIT_INODE_PCIE_SWAP,
+ WLAN_FUNC_SET_WAIT_RATELIMIT_CTRL,
+ WLAN_FUNC_SET_WAIT_HWNAT_INIT,
+ WLAN_FUNC_SET_WAIT_ARHT_CHIP_INFO,
+ WLAN_FUNC_SET_WAIT_TX_BUF_CHECK_ADDR,
+ WLAN_FUNC_SET_WAIT_DEBUG_ARRAY_ADDR,
+};
+
+enum airoha_npu_wlan_get_cmd {
+ WLAN_FUNC_GET_WAIT_NPU_INFO,
+ WLAN_FUNC_GET_WAIT_LAST_RATE,
+ WLAN_FUNC_GET_WAIT_COUNTER,
+ WLAN_FUNC_GET_WAIT_DBG_COUNTER,
+ WLAN_FUNC_GET_WAIT_RXDESC_BASE,
+ WLAN_FUNC_GET_WAIT_WCID_DBG_COUNTER,
+ WLAN_FUNC_GET_WAIT_DMA_ADDR,
+ WLAN_FUNC_GET_WAIT_RING_SIZE,
+ WLAN_FUNC_GET_WAIT_NPU_SUPPORT_MAP,
+ WLAN_FUNC_GET_WAIT_MDC_LOCK_ADDRESS,
+};
+
+struct airoha_npu {
+#if (IS_BUILTIN(CONFIG_NET_AIROHA_NPU) || IS_MODULE(CONFIG_NET_AIROHA_NPU))
+ struct device *dev;
+ struct regmap *regmap;
+
+ struct airoha_npu_core {
+ struct airoha_npu *npu;
+ /* protect concurrent npu memory accesses */
+ spinlock_t lock;
+ struct work_struct wdt_work;
+ } cores[NPU_NUM_CORES];
+
+ int irqs[NPU_NUM_IRQ];
+
+ struct airoha_foe_stats __iomem *stats;
+
+ struct {
+ int (*ppe_init)(struct airoha_npu *npu);
+ int (*ppe_deinit)(struct airoha_npu *npu);
+ int (*ppe_flush_sram_entries)(struct airoha_npu *npu,
+ dma_addr_t foe_addr,
+ int sram_num_entries);
+ int (*ppe_foe_commit_entry)(struct airoha_npu *npu,
+ dma_addr_t foe_addr,
+ u32 entry_size, u32 hash,
+ bool ppe2);
+ int (*wlan_init_reserved_memory)(struct airoha_npu *npu);
+ int (*wlan_send_msg)(struct airoha_npu *npu, int ifindex,
+ enum airoha_npu_wlan_set_cmd func_id,
+ u32 data, gfp_t gfp);
+ int (*wlan_get_msg)(struct airoha_npu *npu, int ifindex,
+ enum airoha_npu_wlan_get_cmd func_id,
+ u32 *data, gfp_t gfp);
+ u32 (*wlan_get_queue_addr)(struct airoha_npu *npu, int qid,
+ bool xmit);
+ void (*wlan_set_irq_status)(struct airoha_npu *npu, u32 val);
+ u32 (*wlan_get_irq_status)(struct airoha_npu *npu, int q);
+ void (*wlan_enable_irq)(struct airoha_npu *npu, int q);
+ void (*wlan_disable_irq)(struct airoha_npu *npu, int q);
+ } ops;
+#endif
+};
+
+#if (IS_BUILTIN(CONFIG_NET_AIROHA_NPU) || IS_MODULE(CONFIG_NET_AIROHA_NPU))
+struct airoha_npu *airoha_npu_get(struct device *dev, dma_addr_t *stats_addr);
+void airoha_npu_put(struct airoha_npu *npu);
+
+static inline int airoha_npu_wlan_init_reserved_memory(struct airoha_npu *npu)
+{
+ return npu->ops.wlan_init_reserved_memory(npu);
+}
+
+static inline int airoha_npu_wlan_send_msg(struct airoha_npu *npu,
+ int ifindex,
+ enum airoha_npu_wlan_set_cmd cmd,
+ u32 data, gfp_t gfp)
+{
+ return npu->ops.wlan_send_msg(npu, ifindex, cmd, data, gfp);
+}
+
+static inline int airoha_npu_wlan_get_msg(struct airoha_npu *npu, int ifindex,
+ enum airoha_npu_wlan_get_cmd cmd,
+ u32 *data, gfp_t gfp)
+{
+ return npu->ops.wlan_get_msg(npu, ifindex, cmd, data, gfp);
+}
+
+static inline u32 airoha_npu_wlan_get_queue_addr(struct airoha_npu *npu,
+ int qid, bool xmit)
+{
+ return npu->ops.wlan_get_queue_addr(npu, qid, xmit);
+}
+
+static inline void airoha_npu_wlan_set_irq_status(struct airoha_npu *npu,
+ u32 val)
+{
+ npu->ops.wlan_set_irq_status(npu, val);
+}
+
+static inline u32 airoha_npu_wlan_get_irq_status(struct airoha_npu *npu, int q)
+{
+ return npu->ops.wlan_get_irq_status(npu, q);
+}
+
+static inline void airoha_npu_wlan_enable_irq(struct airoha_npu *npu, int q)
+{
+ npu->ops.wlan_enable_irq(npu, q);
+}
+
+static inline void airoha_npu_wlan_disable_irq(struct airoha_npu *npu, int q)
+{
+ npu->ops.wlan_disable_irq(npu, q);
+}
+#else
+static inline struct airoha_npu *airoha_npu_get(struct device *dev,
+ dma_addr_t *foe_stats_addr)
+{
+ return NULL;
+}
+
+static inline void airoha_npu_put(struct airoha_npu *npu)
+{
+}
+
+static inline int airoha_npu_wlan_init_reserved_memory(struct airoha_npu *npu)
+{
+ return -EOPNOTSUPP;
+}
+
+static inline int airoha_npu_wlan_send_msg(struct airoha_npu *npu,
+ int ifindex,
+ enum airoha_npu_wlan_set_cmd cmd,
+ u32 data, gfp_t gfp)
+{
+ return -EOPNOTSUPP;
+}
+
+static inline int airoha_npu_wlan_get_msg(struct airoha_npu *npu, int ifindex,
+ enum airoha_npu_wlan_get_cmd cmd,
+ u32 *data, gfp_t gfp)
+{
+ return -EOPNOTSUPP;
+}
+
+static inline u32 airoha_npu_wlan_get_queue_addr(struct airoha_npu *npu,
+ int qid, bool xmit)
+{
+ return 0;
+}
+
+static inline void airoha_npu_wlan_set_irq_status(struct airoha_npu *npu,
+ u32 val)
+{
+}
+
+static inline u32 airoha_npu_wlan_get_irq_status(struct airoha_npu *npu,
+ int q)
+{
+ return 0;
+}
+
+static inline void airoha_npu_wlan_enable_irq(struct airoha_npu *npu, int q)
+{
+}
+
+static inline void airoha_npu_wlan_disable_irq(struct airoha_npu *npu, int q)
+{
+}
+#endif
+
+#endif /* AIROHA_OFFLOAD_H */
--
2.50.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH net-next v4 1/7] dt-bindings: net: airoha: npu: Add memory regions used for wlan offload
2025-07-17 6:57 ` [PATCH net-next v4 1/7] dt-bindings: net: airoha: npu: Add memory regions used for wlan offload Lorenzo Bianconi
@ 2025-07-18 7:14 ` Krzysztof Kozlowski
2025-07-18 9:39 ` Lorenzo Bianconi
0 siblings, 1 reply; 11+ messages in thread
From: Krzysztof Kozlowski @ 2025-07-18 7:14 UTC (permalink / raw)
To: Lorenzo Bianconi
Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Simon Horman, linux-arm-kernel, linux-mediatek, netdev,
devicetree
On Thu, Jul 17, 2025 at 08:57:42AM +0200, Lorenzo Bianconi wrote:
> Document memory regions used by Airoha EN7581 NPU for wlan traffic
> offloading. The brand new added memory regions do not introduce any
> backward compatibility issues since they will be used just to offload
> traffic to/from the MT76 wireless NIC and the MT76 probing will not fail
> if these memory regions are not provide, it will just disable offloading
> via the NPU module.
That's not what I see entirely. I see the same problem I told you already.
of_reserved_mem_region_to_resource_byname returns error ->
airoha_npu_wlan_init_memory returns error -> your other patchset prints
big fat warning in mt7996_pci_probe().
So all correct DTS now gets a warning. Warning is a state of failure,
even if probe proceeds.
I don't understand why you can't make it fully optional, so also fully
backwards compatible.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH net-next v4 1/7] dt-bindings: net: airoha: npu: Add memory regions used for wlan offload
2025-07-18 7:14 ` Krzysztof Kozlowski
@ 2025-07-18 9:39 ` Lorenzo Bianconi
2025-07-21 21:37 ` Lorenzo Bianconi
0 siblings, 1 reply; 11+ messages in thread
From: Lorenzo Bianconi @ 2025-07-18 9:39 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Simon Horman, linux-arm-kernel, linux-mediatek, netdev,
devicetree
[-- Attachment #1: Type: text/plain, Size: 1809 bytes --]
> On Thu, Jul 17, 2025 at 08:57:42AM +0200, Lorenzo Bianconi wrote:
> > Document memory regions used by Airoha EN7581 NPU for wlan traffic
> > offloading. The brand new added memory regions do not introduce any
> > backward compatibility issues since they will be used just to offload
> > traffic to/from the MT76 wireless NIC and the MT76 probing will not fail
> > if these memory regions are not provide, it will just disable offloading
> > via the NPU module.
>
> That's not what I see entirely. I see the same problem I told you already.
> of_reserved_mem_region_to_resource_byname returns error ->
> airoha_npu_wlan_init_memory returns error -> your other patchset prints
> big fat warning in mt7996_pci_probe().
Is it ok to use dev_info() instead dev_warn() or do you prefer to completely
remove the log?
>
> So all correct DTS now gets a warning. Warning is a state of failure,
> even if probe proceeds.
>
> I don't understand why you can't make it fully optional, so also fully
> backwards compatible.
I am completely fine to make it fully optional, but can you please explain
what you mean here with 'optional'?
At the moment in mt76_npu_init() we first look for the "airoha,npu" property
in mt76 node to load the NPU pointer running airoha_npu_get():
wifi@0,0 {
compatible = "mediatek,mt76";
...
airoha,npu = <&npu>;
...
};
If this property is defined in the wifi node I guess it is fine to assume
even the NPU memory regions are properly defined int the DTS.
Is it ok to use dev_info() instead of dev_warn() in mt7996_pci_probe() if
the mt76_npu_init() returns an error (e.g. if the "airoha,npu" is not defined)
or do you prefer to do something else to make this process optional?
Regards,
Lorenzo
>
> Best regards,
> Krzysztof
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH net-next v4 1/7] dt-bindings: net: airoha: npu: Add memory regions used for wlan offload
2025-07-18 9:39 ` Lorenzo Bianconi
@ 2025-07-21 21:37 ` Lorenzo Bianconi
0 siblings, 0 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2025-07-21 21:37 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Simon Horman, linux-arm-kernel, linux-mediatek, netdev,
devicetree, Felix Fietkau
[-- Attachment #1: Type: text/plain, Size: 2573 bytes --]
> > On Thu, Jul 17, 2025 at 08:57:42AM +0200, Lorenzo Bianconi wrote:
> > > Document memory regions used by Airoha EN7581 NPU for wlan traffic
> > > offloading. The brand new added memory regions do not introduce any
> > > backward compatibility issues since they will be used just to offload
> > > traffic to/from the MT76 wireless NIC and the MT76 probing will not fail
> > > if these memory regions are not provide, it will just disable offloading
> > > via the NPU module.
> >
> > That's not what I see entirely. I see the same problem I told you already.
> > of_reserved_mem_region_to_resource_byname returns error ->
> > airoha_npu_wlan_init_memory returns error -> your other patchset prints
> > big fat warning in mt7996_pci_probe().
>
> Is it ok to use dev_info() instead dev_warn() or do you prefer to completely
> remove the log?
>
> >
> > So all correct DTS now gets a warning. Warning is a state of failure,
> > even if probe proceeds.
> >
> > I don't understand why you can't make it fully optional, so also fully
> > backwards compatible.
>
> I am completely fine to make it fully optional, but can you please explain
> what you mean here with 'optional'?
>
> At the moment in mt76_npu_init() we first look for the "airoha,npu" property
> in mt76 node to load the NPU pointer running airoha_npu_get():
>
> wifi@0,0 {
> compatible = "mediatek,mt76";
> ...
> airoha,npu = <&npu>;
> ...
> };
According to my understanding it is enough to get rid of the dev_warn() in the
MT76 series in order to avoid any backward compatibility issues. Am I wrong?
Moreover, we have the NPU phandle in the MT76 DTS node in order to check if the
reserved-memory properties are mandatory or not (if the MT76 node is configured
with the NPU phandle it is expected to have the reserved-memory properties properly
configured).
If my understanding is correct the NPU series does not require any change (the
only required change is in MT76 series). Since the current series is marked as
"Changes Requested' in patchwork, do I need to repost?
Regards,
Lorenzo
>
> If this property is defined in the wifi node I guess it is fine to assume
> even the NPU memory regions are properly defined int the DTS.
>
> Is it ok to use dev_info() instead of dev_warn() in mt7996_pci_probe() if
> the mt76_npu_init() returns an error (e.g. if the "airoha,npu" is not defined)
> or do you prefer to do something else to make this process optional?
>
> Regards,
> Lorenzo
>
> >
> > Best regards,
> > Krzysztof
> >
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2025-07-21 21:42 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-17 6:57 [PATCH net-next v4 0/7] net: airoha: Introduce NPU callbacks for wlan offloading Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 1/7] dt-bindings: net: airoha: npu: Add memory regions used for wlan offload Lorenzo Bianconi
2025-07-18 7:14 ` Krzysztof Kozlowski
2025-07-18 9:39 ` Lorenzo Bianconi
2025-07-21 21:37 ` Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 2/7] net: airoha: npu: Add NPU wlan memory initialization commands Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 3/7] net: airoha: npu: Add wlan_{send,get}_msg NPU callbacks Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 4/7] net: airoha: npu: Add wlan irq management callbacks Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 5/7] net: airoha: npu: Read NPU wlan interrupt lines from the DTS Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 6/7] net: airoha: npu: Enable core 3 for WiFi offloading Lorenzo Bianconi
2025-07-17 6:57 ` [PATCH net-next v4 7/7] net: airoha: Add airoha_offload.h header Lorenzo Bianconi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).