[openwrt/openwrt] airoha: backport additional upstream patch for NPU support for AN7583

LEDE Commits lede-commits at lists.infradead.org
Thu Oct 23 07:55:02 PDT 2025


ansuel pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/8b4adfbb87af1ea9d483a670bb7b1d7e85bba23e

commit 8b4adfbb87af1ea9d483a670bb7b1d7e85bba23e
Author: Christian Marangi <ansuelsmth at gmail.com>
AuthorDate: Thu Oct 23 16:52:53 2025 +0200

    airoha: backport additional upstream patch for NPU support for AN7583
    
    Backport additional patch required for NPU support of Airoha AN7583.
    These are specific for the NPU module with some minor fixes and to adds
    upport for loading the specific Airoha AN7583 NPU firmware.
    
    Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
---
 ...ha-npu-Add-missing-MODULE_FIRMWARE-macros.patch |  27 ++++
 ...Fix-a-NULL-vs-IS_ERR-bug-in-airoha_npu_ru.patch |  31 +++++
 ...airoha-npu-Add-airoha_npu_soc_data-struct.patch | 136 +++++++++++++++++++++
 ...v6.19-net-airoha-npu-Add-7583-SoC-support.patch |  56 +++++++++
 4 files changed, 250 insertions(+)

diff --git a/target/linux/airoha/patches-6.12/100-v6.17-net-airoha-npu-Add-missing-MODULE_FIRMWARE-macros.patch b/target/linux/airoha/patches-6.12/100-v6.17-net-airoha-npu-Add-missing-MODULE_FIRMWARE-macros.patch
new file mode 100644
index 0000000000..7e86417f9d
--- /dev/null
+++ b/target/linux/airoha/patches-6.12/100-v6.17-net-airoha-npu-Add-missing-MODULE_FIRMWARE-macros.patch
@@ -0,0 +1,27 @@
+From 4e7e471e2e3f9085fe1dbe821c4dd904a917c66a Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo at kernel.org>
+Date: Fri, 1 Aug 2025 09:12:25 +0200
+Subject: [PATCH] net: airoha: npu: Add missing MODULE_FIRMWARE macros
+
+Introduce missing MODULE_FIRMWARE definitions for firmware autoload.
+
+Fixes: 23290c7bc190d ("net: airoha: Introduce Airoha NPU support")
+Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
+Reviewed-by: Andrew Lunn <andrew at lunn.ch>
+Link: https://patch.msgid.link/20250801-airoha-npu-missing-module-firmware-v2-1-e860c824d515@kernel.org
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_npu.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/net/ethernet/airoha/airoha_npu.c
++++ b/drivers/net/ethernet/airoha/airoha_npu.c
+@@ -741,6 +741,8 @@ static struct platform_driver airoha_npu
+ };
+ module_platform_driver(airoha_npu_driver);
+ 
++MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_DATA);
++MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_RV32);
+ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR("Lorenzo Bianconi <lorenzo at kernel.org>");
+ MODULE_DESCRIPTION("Airoha Network Processor Unit driver");
diff --git a/target/linux/airoha/patches-6.12/101-v6.17-net-airoha-Fix-a-NULL-vs-IS_ERR-bug-in-airoha_npu_ru.patch b/target/linux/airoha/patches-6.12/101-v6.17-net-airoha-Fix-a-NULL-vs-IS_ERR-bug-in-airoha_npu_ru.patch
new file mode 100644
index 0000000000..71453fd57f
--- /dev/null
+++ b/target/linux/airoha/patches-6.12/101-v6.17-net-airoha-Fix-a-NULL-vs-IS_ERR-bug-in-airoha_npu_ru.patch
@@ -0,0 +1,31 @@
+From 1e5e40f2558c07f6bc60a8983000309cc0a9d600 Mon Sep 17 00:00:00 2001
+From: Dan Carpenter <dan.carpenter at linaro.org>
+Date: Tue, 15 Jul 2025 18:01:10 -0500
+Subject: [PATCH] net: airoha: Fix a NULL vs IS_ERR() bug in
+ airoha_npu_run_firmware()
+
+The devm_ioremap_resource() function returns error pointers.  It never
+returns NULL.  Update the check to match.
+
+Fixes: e27dba1951ce ("net: Use of_reserved_mem_region_to_resource{_byname}() for "memory-region"")
+Signed-off-by: Dan Carpenter <dan.carpenter at linaro.org>
+Acked-by: Lorenzo Bianconi <lorenzo at kernel.org>
+Link: https://patch.msgid.link/fc6d194e-6bf5-49ca-bc77-3fdfda62c434@sabinyo.mountain
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_npu.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_npu.c
++++ b/drivers/net/ethernet/airoha/airoha_npu.c
+@@ -201,8 +201,8 @@ static int airoha_npu_run_firmware(struc
+ 	}
+ 
+ 	addr = devm_ioremap(dev, rmem->base, rmem->size);
+-	if (!addr) {
+-		ret = -ENOMEM;
++	if (IS_ERR(addr)) {
++		ret = PTR_ERR(addr);
+ 		goto out;
+ 	}
+ 
diff --git a/target/linux/airoha/patches-6.12/102-02-v6.19-net-airoha-npu-Add-airoha_npu_soc_data-struct.patch b/target/linux/airoha/patches-6.12/102-02-v6.19-net-airoha-npu-Add-airoha_npu_soc_data-struct.patch
new file mode 100644
index 0000000000..09972a9b62
--- /dev/null
+++ b/target/linux/airoha/patches-6.12/102-02-v6.19-net-airoha-npu-Add-airoha_npu_soc_data-struct.patch
@@ -0,0 +1,136 @@
+From 0850ae496d534847ec2c26744521c1bce04ec59d Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo at kernel.org>
+Date: Mon, 13 Oct 2025 15:58:50 +0200
+Subject: [PATCH 2/3] net: airoha: npu: Add airoha_npu_soc_data struct
+
+Introduce airoha_npu_soc_data structure in order to generalize per-SoC
+NPU firmware info. Introduce airoha_npu_load_firmware utility routine.
+This is a preliminary patch in order to introduce AN7583 NPU support.
+
+Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
+Reviewed-by: Simon Horman <horms at kernel.org>
+Link: https://patch.msgid.link/20251013-airoha-npu-7583-v3-2-00f748b5a0c7@kernel.org
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_npu.c | 77 ++++++++++++++++--------
+ 1 file changed, 51 insertions(+), 26 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_npu.c
++++ b/drivers/net/ethernet/airoha/airoha_npu.c
+@@ -103,6 +103,16 @@ enum {
+ 	QDMA_WAN_PON_XDSL,
+ };
+ 
++struct airoha_npu_fw {
++	const char *name;
++	int max_size;
++};
++
++struct airoha_npu_soc_data {
++	struct airoha_npu_fw fw_rv32;
++	struct airoha_npu_fw fw_data;
++};
++
+ #define MBOX_MSG_FUNC_ID	GENMASK(14, 11)
+ #define MBOX_MSG_STATIC_BUF	BIT(5)
+ #define MBOX_MSG_STATUS		GENMASK(4, 2)
+@@ -182,49 +192,53 @@ static int airoha_npu_send_msg(struct ai
+ 	return ret;
+ }
+ 
+-static int airoha_npu_run_firmware(struct device *dev, void __iomem *base,
+-				   struct reserved_mem *rmem)
++static int airoha_npu_load_firmware(struct device *dev, void __iomem *addr,
++				    const struct airoha_npu_fw *fw_info)
+ {
+ 	const struct firmware *fw;
+-	void __iomem *addr;
+ 	int ret;
+ 
+-	ret = request_firmware(&fw, NPU_EN7581_FIRMWARE_RV32, dev);
++	ret = request_firmware(&fw, fw_info->name, dev);
+ 	if (ret)
+ 		return ret == -ENOENT ? -EPROBE_DEFER : ret;
+ 
+-	if (fw->size > NPU_EN7581_FIRMWARE_RV32_MAX_SIZE) {
++	if (fw->size > fw_info->max_size) {
+ 		dev_err(dev, "%s: fw size too overlimit (%zu)\n",
+-			NPU_EN7581_FIRMWARE_RV32, fw->size);
++			fw_info->name, fw->size);
+ 		ret = -E2BIG;
+ 		goto out;
+ 	}
+ 
+-	addr = devm_ioremap(dev, rmem->base, rmem->size);
+-	if (IS_ERR(addr)) {
+-		ret = PTR_ERR(addr);
+-		goto out;
+-	}
+-
+ 	memcpy_toio(addr, fw->data, fw->size);
++out:
+ 	release_firmware(fw);
+ 
+-	ret = request_firmware(&fw, NPU_EN7581_FIRMWARE_DATA, dev);
+-	if (ret)
+-		return ret == -ENOENT ? -EPROBE_DEFER : ret;
++	return ret;
++}
+ 
+-	if (fw->size > NPU_EN7581_FIRMWARE_DATA_MAX_SIZE) {
+-		dev_err(dev, "%s: fw size too overlimit (%zu)\n",
+-			NPU_EN7581_FIRMWARE_DATA, fw->size);
+-		ret = -E2BIG;
+-		goto out;
+-	}
++static int airoha_npu_run_firmware(struct device *dev, void __iomem *base,
++				   struct reserved_mem *rmem)
++{
++	const struct airoha_npu_soc_data *soc;
++	void __iomem *addr;
++	int ret;
+ 
+-	memcpy_toio(base + REG_NPU_LOCAL_SRAM, fw->data, fw->size);
+-out:
+-	release_firmware(fw);
++	soc = of_device_get_match_data(dev);
++	if (!soc)
++		return -EINVAL;
+ 
+-	return ret;
++	addr = devm_ioremap(dev, rmem->base, rmem->size);
++	if (IS_ERR(addr))
++		return PTR_ERR(addr);
++
++	/* Load rv32 npu firmware */
++	ret = airoha_npu_load_firmware(dev, addr, &soc->fw_rv32);
++	if (ret)
++		return ret;
++
++	/* Load data npu firmware */
++	return airoha_npu_load_firmware(dev, base + REG_NPU_LOCAL_SRAM,
++					&soc->fw_data);
+ }
+ 
+ static irqreturn_t airoha_npu_mbox_handler(int irq, void *npu_instance)
+@@ -596,8 +610,19 @@ void airoha_npu_put(struct airoha_npu *n
+ }
+ EXPORT_SYMBOL_GPL(airoha_npu_put);
+ 
++static const struct airoha_npu_soc_data en7581_npu_soc_data = {
++	.fw_rv32 = {
++		.name = NPU_EN7581_FIRMWARE_RV32,
++		.max_size = NPU_EN7581_FIRMWARE_RV32_MAX_SIZE,
++	},
++	.fw_data = {
++		.name = NPU_EN7581_FIRMWARE_DATA,
++		.max_size = NPU_EN7581_FIRMWARE_DATA_MAX_SIZE,
++	},
++};
++
+ static const struct of_device_id of_airoha_npu_match[] = {
+-	{ .compatible = "airoha,en7581-npu" },
++	{ .compatible = "airoha,en7581-npu", .data = &en7581_npu_soc_data },
+ 	{ /* sentinel */ }
+ };
+ MODULE_DEVICE_TABLE(of, of_airoha_npu_match);
diff --git a/target/linux/airoha/patches-6.12/102-03-v6.19-net-airoha-npu-Add-7583-SoC-support.patch b/target/linux/airoha/patches-6.12/102-03-v6.19-net-airoha-npu-Add-7583-SoC-support.patch
new file mode 100644
index 0000000000..a628d09b77
--- /dev/null
+++ b/target/linux/airoha/patches-6.12/102-03-v6.19-net-airoha-npu-Add-7583-SoC-support.patch
@@ -0,0 +1,56 @@
+From 4478596f71d92060c9093bdf1d2d940881f41bcc Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo at kernel.org>
+Date: Mon, 13 Oct 2025 15:58:51 +0200
+Subject: [PATCH 3/3] net: airoha: npu: Add 7583 SoC support
+
+Introduce support for Airoha 7583 SoC NPU selecting proper firmware images.
+
+Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
+Reviewed-by: Simon Horman <horms at kernel.org>
+Link: https://patch.msgid.link/20251013-airoha-npu-7583-v3-3-00f748b5a0c7@kernel.org
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_npu.c | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+--- a/drivers/net/ethernet/airoha/airoha_npu.c
++++ b/drivers/net/ethernet/airoha/airoha_npu.c
+@@ -16,6 +16,8 @@
+ 
+ #define NPU_EN7581_FIRMWARE_DATA		"airoha/en7581_npu_data.bin"
+ #define NPU_EN7581_FIRMWARE_RV32		"airoha/en7581_npu_rv32.bin"
++#define NPU_AN7583_FIRMWARE_DATA		"airoha/an7583_npu_data.bin"
++#define NPU_AN7583_FIRMWARE_RV32		"airoha/an7583_npu_rv32.bin"
+ #define NPU_EN7581_FIRMWARE_RV32_MAX_SIZE	0x200000
+ #define NPU_EN7581_FIRMWARE_DATA_MAX_SIZE	0x10000
+ #define NPU_DUMP_SIZE				512
+@@ -621,8 +623,20 @@ static const struct airoha_npu_soc_data
+ 	},
+ };
+ 
++static const struct airoha_npu_soc_data an7583_npu_soc_data = {
++	.fw_rv32 = {
++		.name = NPU_AN7583_FIRMWARE_RV32,
++		.max_size = NPU_EN7581_FIRMWARE_RV32_MAX_SIZE,
++	},
++	.fw_data = {
++		.name = NPU_AN7583_FIRMWARE_DATA,
++		.max_size = NPU_EN7581_FIRMWARE_DATA_MAX_SIZE,
++	},
++};
++
+ static const struct of_device_id of_airoha_npu_match[] = {
+ 	{ .compatible = "airoha,en7581-npu", .data = &en7581_npu_soc_data },
++	{ .compatible = "airoha,an7583-npu", .data = &an7583_npu_soc_data },
+ 	{ /* sentinel */ }
+ };
+ MODULE_DEVICE_TABLE(of, of_airoha_npu_match);
+@@ -768,6 +782,8 @@ module_platform_driver(airoha_npu_driver
+ 
+ MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_DATA);
+ MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_RV32);
++MODULE_FIRMWARE(NPU_AN7583_FIRMWARE_DATA);
++MODULE_FIRMWARE(NPU_AN7583_FIRMWARE_RV32);
+ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR("Lorenzo Bianconi <lorenzo at kernel.org>");
+ MODULE_DESCRIPTION("Airoha Network Processor Unit driver");




More information about the lede-commits mailing list