From 8b4adfbb87af1ea9d483a670bb7b1d7e85bba23e Mon Sep 17 00:00:00 2001 From: Christian Marangi Date: Thu, 23 Oct 2025 16:52:53 +0200 Subject: [PATCH] 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 --- ...u-Add-missing-MODULE_FIRMWARE-macros.patch | 27 ++++ ...-NULL-vs-IS_ERR-bug-in-airoha_npu_ru.patch | 31 ++++ ...a-npu-Add-airoha_npu_soc_data-struct.patch | 136 ++++++++++++++++++ ...-net-airoha-npu-Add-7583-SoC-support.patch | 56 ++++++++ 4 files changed, 250 insertions(+) create mode 100644 target/linux/airoha/patches-6.12/100-v6.17-net-airoha-npu-Add-missing-MODULE_FIRMWARE-macros.patch create mode 100644 target/linux/airoha/patches-6.12/101-v6.17-net-airoha-Fix-a-NULL-vs-IS_ERR-bug-in-airoha_npu_ru.patch create mode 100644 target/linux/airoha/patches-6.12/102-02-v6.19-net-airoha-npu-Add-airoha_npu_soc_data-struct.patch create mode 100644 target/linux/airoha/patches-6.12/102-03-v6.19-net-airoha-npu-Add-7583-SoC-support.patch 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 +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 +Reviewed-by: Andrew Lunn +Link: https://patch.msgid.link/20250801-airoha-npu-missing-module-firmware-v2-1-e860c824d515@kernel.org +Signed-off-by: Jakub Kicinski +--- + 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 "); + 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 +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 +Acked-by: Lorenzo Bianconi +Link: https://patch.msgid.link/fc6d194e-6bf5-49ca-bc77-3fdfda62c434@sabinyo.mountain +Signed-off-by: Jakub Kicinski +--- + 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 +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 +Reviewed-by: Simon Horman +Link: https://patch.msgid.link/20251013-airoha-npu-7583-v3-2-00f748b5a0c7@kernel.org +Signed-off-by: Jakub Kicinski +--- + 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 +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 +Reviewed-by: Simon Horman +Link: https://patch.msgid.link/20251013-airoha-npu-7583-v3-3-00f748b5a0c7@kernel.org +Signed-off-by: Jakub Kicinski +--- + 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 "); + MODULE_DESCRIPTION("Airoha Network Processor Unit driver"); -- 2.30.2