Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'airoha-add-the-capability-to-read-firmware-binary-names-from-dts-for-airoha-npu-driver'

Lorenzo Bianconi says:

====================
airoha: Add the capability to read firmware binary names from dts for Airoha NPU driver

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). This is a preliminary patch to enable MT76 NPU offloading if
the Airoha SoC is equipped with MT7996 (Eagle) WiFi chipset.
====================

Link: https://patch.msgid.link/20260120-airoha-npu-firmware-name-v4-0-88999628b4c1@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+47 -6
+7
Documentation/devicetree/bindings/net/airoha,en7581-npu.yaml
··· 59 59 - const: ba 60 60 minItems: 1 61 61 62 + firmware-name: 63 + items: 64 + - description: Firmware name of RiscV core 65 + - description: Firmware name of Data section 66 + 62 67 required: 63 68 - compatible 64 69 - reg ··· 101 96 memory-region = <&npu_firmware>, <&npu_pkt>, <&npu_txpkt>, 102 97 <&npu_txbufid>, <&npu_ba>; 103 98 memory-region-names = "firmware", "pkt", "tx-pkt", "tx-bufid", "ba"; 99 + firmware-name = "airoha/en7581_npu_rv32.bin", 100 + "airoha/en7581_npu_data.bin"; 104 101 }; 105 102 };
+40 -6
drivers/net/ethernet/airoha/airoha_npu.c
··· 16 16 17 17 #define NPU_EN7581_FIRMWARE_DATA "airoha/en7581_npu_data.bin" 18 18 #define NPU_EN7581_FIRMWARE_RV32 "airoha/en7581_npu_rv32.bin" 19 + #define NPU_EN7581_7996_FIRMWARE_DATA "airoha/en7581_MT7996_npu_data.bin" 20 + #define NPU_EN7581_7996_FIRMWARE_RV32 "airoha/en7581_MT7996_npu_rv32.bin" 19 21 #define NPU_AN7583_FIRMWARE_DATA "airoha/an7583_npu_data.bin" 20 22 #define NPU_AN7583_FIRMWARE_RV32 "airoha/an7583_npu_rv32.bin" 21 23 #define NPU_EN7581_FIRMWARE_RV32_MAX_SIZE 0x200000 ··· 197 195 } 198 196 199 197 static int airoha_npu_load_firmware(struct device *dev, void __iomem *addr, 200 - const struct airoha_npu_fw *fw_info) 198 + const char *fw_name, int fw_max_size) 201 199 { 202 200 const struct firmware *fw; 203 201 int ret; 204 202 205 - ret = request_firmware(&fw, fw_info->name, dev); 203 + ret = request_firmware(&fw, fw_name, dev); 206 204 if (ret) 207 205 return ret == -ENOENT ? -EPROBE_DEFER : ret; 208 206 209 - if (fw->size > fw_info->max_size) { 207 + if (fw->size > fw_max_size) { 210 208 dev_err(dev, "%s: fw size too overlimit (%zu)\n", 211 - fw_info->name, fw->size); 209 + fw_name, fw->size); 212 210 ret = -E2BIG; 213 211 goto out; 214 212 } ··· 218 216 release_firmware(fw); 219 217 220 218 return ret; 219 + } 220 + 221 + static int 222 + airoha_npu_load_firmware_from_dts(struct device *dev, void __iomem *addr, 223 + void __iomem *base) 224 + { 225 + const char *fw_names[2]; 226 + int ret; 227 + 228 + ret = of_property_read_string_array(dev->of_node, "firmware-name", 229 + fw_names, ARRAY_SIZE(fw_names)); 230 + if (ret != ARRAY_SIZE(fw_names)) 231 + return -EINVAL; 232 + 233 + ret = airoha_npu_load_firmware(dev, addr, fw_names[0], 234 + NPU_EN7581_FIRMWARE_RV32_MAX_SIZE); 235 + if (ret) 236 + return ret; 237 + 238 + return airoha_npu_load_firmware(dev, base + REG_NPU_LOCAL_SRAM, 239 + fw_names[1], 240 + NPU_EN7581_FIRMWARE_DATA_MAX_SIZE); 221 241 } 222 242 223 243 static int airoha_npu_run_firmware(struct device *dev, void __iomem *base, ··· 257 233 if (IS_ERR(addr)) 258 234 return PTR_ERR(addr); 259 235 236 + /* Try to load firmware images using the firmware names provided via 237 + * dts if available. 238 + */ 239 + if (of_find_property(dev->of_node, "firmware-name", NULL)) 240 + return airoha_npu_load_firmware_from_dts(dev, addr, base); 241 + 260 242 /* Load rv32 npu firmware */ 261 - ret = airoha_npu_load_firmware(dev, addr, &soc->fw_rv32); 243 + ret = airoha_npu_load_firmware(dev, addr, soc->fw_rv32.name, 244 + soc->fw_rv32.max_size); 262 245 if (ret) 263 246 return ret; 264 247 265 248 /* Load data npu firmware */ 266 249 return airoha_npu_load_firmware(dev, base + REG_NPU_LOCAL_SRAM, 267 - &soc->fw_data); 250 + soc->fw_data.name, 251 + soc->fw_data.max_size); 268 252 } 269 253 270 254 static irqreturn_t airoha_npu_mbox_handler(int irq, void *npu_instance) ··· 822 790 823 791 MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_DATA); 824 792 MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_RV32); 793 + MODULE_FIRMWARE(NPU_EN7581_7996_FIRMWARE_DATA); 794 + MODULE_FIRMWARE(NPU_EN7581_7996_FIRMWARE_RV32); 825 795 MODULE_FIRMWARE(NPU_AN7583_FIRMWARE_DATA); 826 796 MODULE_FIRMWARE(NPU_AN7583_FIRMWARE_RV32); 827 797 MODULE_LICENSE("GPL");