mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2026-03-14 19:39:48 +01:00
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 <lorenzo@kernel.org> Link: https://github.com/openwrt/openwrt/pull/22289 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
This commit is contained in:
parent
305f685f83
commit
123557f0e2
2 changed files with 127 additions and 0 deletions
|
|
@ -232,6 +232,12 @@
|
|||
};
|
||||
};
|
||||
|
||||
&npu {
|
||||
firmware-name = "airoha/en7581_MT7996_npu_rv32.bin",
|
||||
"airoha/en7581_MT7996_npu_data.bin";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,121 @@
|
|||
From 3847173525e307ebcd23bd4863da943ea78b0057 Mon Sep 17 00:00:00 2001
|
||||
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||
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 <lorenzo@kernel.org>
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Link: https://patch.msgid.link/20260120-airoha-npu-firmware-name-v4-2-88999628b4c1@kernel.org
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
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");
|
||||
Loading…
Add table
Reference in a new issue