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 'net-airoha-npu-introduce-support-for-airoha-7583-npu'

Lorenzo Bianconi says:

====================
net: airoha: npu: Introduce support for Airoha 7583 NPU

Introduce support for Airoha 7583 SoC NPU.
====================

Link: https://patch.msgid.link/20251013-airoha-npu-7583-v3-0-00f748b5a0c7@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+69 -27
+1
Documentation/devicetree/bindings/net/airoha,en7581-npu.yaml
··· 18 18 compatible: 19 19 enum: 20 20 - airoha,en7581-npu 21 + - airoha,an7583-npu 21 22 22 23 reg: 23 24 maxItems: 1
+68 -27
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_AN7583_FIRMWARE_DATA "airoha/an7583_npu_data.bin" 20 + #define NPU_AN7583_FIRMWARE_RV32 "airoha/an7583_npu_rv32.bin" 19 21 #define NPU_EN7581_FIRMWARE_RV32_MAX_SIZE 0x200000 20 22 #define NPU_EN7581_FIRMWARE_DATA_MAX_SIZE 0x10000 21 23 #define NPU_DUMP_SIZE 512 ··· 105 103 QDMA_WAN_PON_XDSL, 106 104 }; 107 105 106 + struct airoha_npu_fw { 107 + const char *name; 108 + int max_size; 109 + }; 110 + 111 + struct airoha_npu_soc_data { 112 + struct airoha_npu_fw fw_rv32; 113 + struct airoha_npu_fw fw_data; 114 + }; 115 + 108 116 #define MBOX_MSG_FUNC_ID GENMASK(14, 11) 109 117 #define MBOX_MSG_STATIC_BUF BIT(5) 110 118 #define MBOX_MSG_STATUS GENMASK(4, 2) ··· 194 182 return ret; 195 183 } 196 184 197 - static int airoha_npu_run_firmware(struct device *dev, void __iomem *base, 198 - struct resource *res) 185 + static int airoha_npu_load_firmware(struct device *dev, void __iomem *addr, 186 + const struct airoha_npu_fw *fw_info) 199 187 { 200 188 const struct firmware *fw; 201 - void __iomem *addr; 202 189 int ret; 203 190 204 - ret = request_firmware(&fw, NPU_EN7581_FIRMWARE_RV32, dev); 191 + ret = request_firmware(&fw, fw_info->name, dev); 205 192 if (ret) 206 193 return ret == -ENOENT ? -EPROBE_DEFER : ret; 207 194 208 - if (fw->size > NPU_EN7581_FIRMWARE_RV32_MAX_SIZE) { 195 + if (fw->size > fw_info->max_size) { 209 196 dev_err(dev, "%s: fw size too overlimit (%zu)\n", 210 - NPU_EN7581_FIRMWARE_RV32, fw->size); 197 + fw_info->name, fw->size); 211 198 ret = -E2BIG; 212 - goto out; 213 - } 214 - 215 - addr = devm_ioremap_resource(dev, res); 216 - if (IS_ERR(addr)) { 217 - ret = PTR_ERR(addr); 218 199 goto out; 219 200 } 220 201 221 202 memcpy_toio(addr, fw->data, fw->size); 222 - release_firmware(fw); 223 - 224 - ret = request_firmware(&fw, NPU_EN7581_FIRMWARE_DATA, dev); 225 - if (ret) 226 - return ret == -ENOENT ? -EPROBE_DEFER : ret; 227 - 228 - if (fw->size > NPU_EN7581_FIRMWARE_DATA_MAX_SIZE) { 229 - dev_err(dev, "%s: fw size too overlimit (%zu)\n", 230 - NPU_EN7581_FIRMWARE_DATA, fw->size); 231 - ret = -E2BIG; 232 - goto out; 233 - } 234 - 235 - memcpy_toio(base + REG_NPU_LOCAL_SRAM, fw->data, fw->size); 236 203 out: 237 204 release_firmware(fw); 238 205 239 206 return ret; 207 + } 208 + 209 + static int airoha_npu_run_firmware(struct device *dev, void __iomem *base, 210 + struct resource *res) 211 + { 212 + const struct airoha_npu_soc_data *soc; 213 + void __iomem *addr; 214 + int ret; 215 + 216 + soc = of_device_get_match_data(dev); 217 + if (!soc) 218 + return -EINVAL; 219 + 220 + addr = devm_ioremap_resource(dev, res); 221 + if (IS_ERR(addr)) 222 + return PTR_ERR(addr); 223 + 224 + /* Load rv32 npu firmware */ 225 + ret = airoha_npu_load_firmware(dev, addr, &soc->fw_rv32); 226 + if (ret) 227 + return ret; 228 + 229 + /* Load data npu firmware */ 230 + return airoha_npu_load_firmware(dev, base + REG_NPU_LOCAL_SRAM, 231 + &soc->fw_data); 240 232 } 241 233 242 234 static irqreturn_t airoha_npu_mbox_handler(int irq, void *npu_instance) ··· 613 597 } 614 598 EXPORT_SYMBOL_GPL(airoha_npu_put); 615 599 600 + static const struct airoha_npu_soc_data en7581_npu_soc_data = { 601 + .fw_rv32 = { 602 + .name = NPU_EN7581_FIRMWARE_RV32, 603 + .max_size = NPU_EN7581_FIRMWARE_RV32_MAX_SIZE, 604 + }, 605 + .fw_data = { 606 + .name = NPU_EN7581_FIRMWARE_DATA, 607 + .max_size = NPU_EN7581_FIRMWARE_DATA_MAX_SIZE, 608 + }, 609 + }; 610 + 611 + static const struct airoha_npu_soc_data an7583_npu_soc_data = { 612 + .fw_rv32 = { 613 + .name = NPU_AN7583_FIRMWARE_RV32, 614 + .max_size = NPU_EN7581_FIRMWARE_RV32_MAX_SIZE, 615 + }, 616 + .fw_data = { 617 + .name = NPU_AN7583_FIRMWARE_DATA, 618 + .max_size = NPU_EN7581_FIRMWARE_DATA_MAX_SIZE, 619 + }, 620 + }; 621 + 616 622 static const struct of_device_id of_airoha_npu_match[] = { 617 - { .compatible = "airoha,en7581-npu" }, 623 + { .compatible = "airoha,en7581-npu", .data = &en7581_npu_soc_data }, 624 + { .compatible = "airoha,an7583-npu", .data = &an7583_npu_soc_data }, 618 625 { /* sentinel */ } 619 626 }; 620 627 MODULE_DEVICE_TABLE(of, of_airoha_npu_match); ··· 776 737 777 738 MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_DATA); 778 739 MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_RV32); 740 + MODULE_FIRMWARE(NPU_AN7583_FIRMWARE_DATA); 741 + MODULE_FIRMWARE(NPU_AN7583_FIRMWARE_RV32); 779 742 MODULE_LICENSE("GPL"); 780 743 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 781 744 MODULE_DESCRIPTION("Airoha Network Processor Unit driver");