From 123557f0e293169ca647f07fff527e45fcf8b7dc Mon Sep 17 00:00:00 2001 From: Lorenzo Bianconi Date: Wed, 7 Jan 2026 11:46:00 +0100 Subject: [PATCH] airoha: add the capability to read firmware names from dts Introduce the capability to read the firmware binary names from device-tree using the firmware-name property if available. This is a preliminary patch to enable NPU offloading for MT7996 (Eagle) chipset since it requires a different binary with respect to the one used for MT7992 on the EN7581 SoC. Signed-off-by: Lorenzo Bianconi Link: https://github.com/openwrt/openwrt/pull/22289 Signed-off-by: Christian Marangi --- target/linux/airoha/dts/an7581-evb-emmc.dts | 6 + ...dd-the-capability-to-read-firmware-n.patch | 121 ++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 target/linux/airoha/patches-6.12/910-02-v7.0-net-airoha-npu-Add-the-capability-to-read-firmware-n.patch diff --git a/target/linux/airoha/dts/an7581-evb-emmc.dts b/target/linux/airoha/dts/an7581-evb-emmc.dts index 3a532e74f9..d78bbb1bd2 100644 --- a/target/linux/airoha/dts/an7581-evb-emmc.dts +++ b/target/linux/airoha/dts/an7581-evb-emmc.dts @@ -232,6 +232,12 @@ }; }; +&npu { + firmware-name = "airoha/en7581_MT7996_npu_rv32.bin", + "airoha/en7581_MT7996_npu_data.bin"; + status = "okay"; +}; + ð { status = "okay"; }; diff --git a/target/linux/airoha/patches-6.12/910-02-v7.0-net-airoha-npu-Add-the-capability-to-read-firmware-n.patch b/target/linux/airoha/patches-6.12/910-02-v7.0-net-airoha-npu-Add-the-capability-to-read-firmware-n.patch new file mode 100644 index 0000000000..b626840ee6 --- /dev/null +++ b/target/linux/airoha/patches-6.12/910-02-v7.0-net-airoha-npu-Add-the-capability-to-read-firmware-n.patch @@ -0,0 +1,121 @@ +From 3847173525e307ebcd23bd4863da943ea78b0057 Mon Sep 17 00:00:00 2001 +From: Lorenzo Bianconi +Date: Tue, 20 Jan 2026 11:17:18 +0100 +Subject: [PATCH] net: airoha: npu: Add the capability to read firmware names + from dts + +Introduce the capability to read the firmware binary names from device-tree +using the firmware-name property if available. +This patch is needed because NPU firmware binaries are board specific since +they depend on the MediaTek WiFi chip used on the board (e.g. MT7996 or +MT7992) and the WiFi chip version info is not available in the NPU driver. +This is a preliminary patch to enable MT76 NPU offloading if the Airoha SoC +is equipped with MT7996 (Eagle) WiFi chipset. + +Signed-off-by: Lorenzo Bianconi +Reviewed-by: Andrew Lunn +Link: https://patch.msgid.link/20260120-airoha-npu-firmware-name-v4-2-88999628b4c1@kernel.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/ethernet/airoha/airoha_npu.c | 46 ++++++++++++++++++++---- + 1 file changed, 40 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/ethernet/airoha/airoha_npu.c b/drivers/net/ethernet/airoha/airoha_npu.c +index a56b3780bb627c..89f22f3f47dc56 100644 +--- 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_EN7581_7996_FIRMWARE_DATA "airoha/en7581_MT7996_npu_data.bin" ++#define NPU_EN7581_7996_FIRMWARE_RV32 "airoha/en7581_MT7996_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 +@@ -195,18 +197,18 @@ static int airoha_npu_send_msg(struct airoha_npu *npu, int func_id, + } + + static int airoha_npu_load_firmware(struct device *dev, void __iomem *addr, +- const struct airoha_npu_fw *fw_info) ++ const char *fw_name, int fw_max_size) + { + const struct firmware *fw; + int ret; + +- ret = request_firmware(&fw, fw_info->name, dev); ++ ret = request_firmware(&fw, fw_name, dev); + if (ret) + return ret == -ENOENT ? -EPROBE_DEFER : ret; + +- if (fw->size > fw_info->max_size) { ++ if (fw->size > fw_max_size) { + dev_err(dev, "%s: fw size too overlimit (%zu)\n", +- fw_info->name, fw->size); ++ fw_name, fw->size); + ret = -E2BIG; + goto out; + } +@@ -218,6 +220,28 @@ static int airoha_npu_load_firmware(struct device *dev, void __iomem *addr, + return ret; + } + ++static int ++airoha_npu_load_firmware_from_dts(struct device *dev, void __iomem *addr, ++ void __iomem *base) ++{ ++ const char *fw_names[2]; ++ int ret; ++ ++ ret = of_property_read_string_array(dev->of_node, "firmware-name", ++ fw_names, ARRAY_SIZE(fw_names)); ++ if (ret != ARRAY_SIZE(fw_names)) ++ return -EINVAL; ++ ++ ret = airoha_npu_load_firmware(dev, addr, fw_names[0], ++ NPU_EN7581_FIRMWARE_RV32_MAX_SIZE); ++ if (ret) ++ return ret; ++ ++ return airoha_npu_load_firmware(dev, base + REG_NPU_LOCAL_SRAM, ++ fw_names[1], ++ NPU_EN7581_FIRMWARE_DATA_MAX_SIZE); ++} ++ + static int airoha_npu_run_firmware(struct device *dev, void __iomem *base, + struct resource *res) + { +@@ -233,14 +257,22 @@ static int airoha_npu_run_firmware(struct device *dev, void __iomem *base, + if (IS_ERR(addr)) + return PTR_ERR(addr); + ++ /* Try to load firmware images using the firmware names provided via ++ * dts if available. ++ */ ++ if (of_find_property(dev->of_node, "firmware-name", NULL)) ++ return airoha_npu_load_firmware_from_dts(dev, addr, base); ++ + /* Load rv32 npu firmware */ +- ret = airoha_npu_load_firmware(dev, addr, &soc->fw_rv32); ++ ret = airoha_npu_load_firmware(dev, addr, soc->fw_rv32.name, ++ soc->fw_rv32.max_size); + if (ret) + return ret; + + /* Load data npu firmware */ + return airoha_npu_load_firmware(dev, base + REG_NPU_LOCAL_SRAM, +- &soc->fw_data); ++ soc->fw_data.name, ++ soc->fw_data.max_size); + } + + static irqreturn_t airoha_npu_mbox_handler(int irq, void *npu_instance) +@@ -790,6 +822,8 @@ module_platform_driver(airoha_npu_driver); + + MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_DATA); + MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_RV32); ++MODULE_FIRMWARE(NPU_EN7581_7996_FIRMWARE_DATA); ++MODULE_FIRMWARE(NPU_EN7581_7996_FIRMWARE_RV32); + MODULE_FIRMWARE(NPU_AN7583_FIRMWARE_DATA); + MODULE_FIRMWARE(NPU_AN7583_FIRMWARE_RV32); + MODULE_LICENSE("GPL");