Skip to content

Commit cb85ca4

Browse files
committed
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/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 1ecd749 + 4478596 commit cb85ca4

File tree

2 files changed

+68
-26
lines changed

2 files changed

+68
-26
lines changed

Documentation/devicetree/bindings/net/airoha,en7581-npu.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ properties:
1818
compatible:
1919
enum:
2020
- airoha,en7581-npu
21+
- airoha,an7583-npu
2122

2223
reg:
2324
maxItems: 1

drivers/net/ethernet/airoha/airoha_npu.c

Lines changed: 67 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
#define NPU_EN7581_FIRMWARE_DATA "airoha/en7581_npu_data.bin"
1818
#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"
1921
#define NPU_EN7581_FIRMWARE_RV32_MAX_SIZE 0x200000
2022
#define NPU_EN7581_FIRMWARE_DATA_MAX_SIZE 0x10000
2123
#define NPU_DUMP_SIZE 512
@@ -103,6 +105,16 @@ enum {
103105
QDMA_WAN_PON_XDSL,
104106
};
105107

108+
struct airoha_npu_fw {
109+
const char *name;
110+
int max_size;
111+
};
112+
113+
struct airoha_npu_soc_data {
114+
struct airoha_npu_fw fw_rv32;
115+
struct airoha_npu_fw fw_data;
116+
};
117+
106118
#define MBOX_MSG_FUNC_ID GENMASK(14, 11)
107119
#define MBOX_MSG_STATIC_BUF BIT(5)
108120
#define MBOX_MSG_STATUS GENMASK(4, 2)
@@ -182,49 +194,53 @@ static int airoha_npu_send_msg(struct airoha_npu *npu, int func_id,
182194
return ret;
183195
}
184196

185-
static int airoha_npu_run_firmware(struct device *dev, void __iomem *base,
186-
struct resource *res)
197+
static int airoha_npu_load_firmware(struct device *dev, void __iomem *addr,
198+
const struct airoha_npu_fw *fw_info)
187199
{
188200
const struct firmware *fw;
189-
void __iomem *addr;
190201
int ret;
191202

192-
ret = request_firmware(&fw, NPU_EN7581_FIRMWARE_RV32, dev);
203+
ret = request_firmware(&fw, fw_info->name, dev);
193204
if (ret)
194205
return ret == -ENOENT ? -EPROBE_DEFER : ret;
195206

196-
if (fw->size > NPU_EN7581_FIRMWARE_RV32_MAX_SIZE) {
207+
if (fw->size > fw_info->max_size) {
197208
dev_err(dev, "%s: fw size too overlimit (%zu)\n",
198-
NPU_EN7581_FIRMWARE_RV32, fw->size);
209+
fw_info->name, fw->size);
199210
ret = -E2BIG;
200211
goto out;
201212
}
202213

203-
addr = devm_ioremap_resource(dev, res);
204-
if (IS_ERR(addr)) {
205-
ret = PTR_ERR(addr);
206-
goto out;
207-
}
208-
209214
memcpy_toio(addr, fw->data, fw->size);
215+
out:
210216
release_firmware(fw);
211217

212-
ret = request_firmware(&fw, NPU_EN7581_FIRMWARE_DATA, dev);
213-
if (ret)
214-
return ret == -ENOENT ? -EPROBE_DEFER : ret;
218+
return ret;
219+
}
215220

216-
if (fw->size > NPU_EN7581_FIRMWARE_DATA_MAX_SIZE) {
217-
dev_err(dev, "%s: fw size too overlimit (%zu)\n",
218-
NPU_EN7581_FIRMWARE_DATA, fw->size);
219-
ret = -E2BIG;
220-
goto out;
221-
}
221+
static int airoha_npu_run_firmware(struct device *dev, void __iomem *base,
222+
struct resource *res)
223+
{
224+
const struct airoha_npu_soc_data *soc;
225+
void __iomem *addr;
226+
int ret;
222227

223-
memcpy_toio(base + REG_NPU_LOCAL_SRAM, fw->data, fw->size);
224-
out:
225-
release_firmware(fw);
228+
soc = of_device_get_match_data(dev);
229+
if (!soc)
230+
return -EINVAL;
226231

227-
return ret;
232+
addr = devm_ioremap_resource(dev, res);
233+
if (IS_ERR(addr))
234+
return PTR_ERR(addr);
235+
236+
/* Load rv32 npu firmware */
237+
ret = airoha_npu_load_firmware(dev, addr, &soc->fw_rv32);
238+
if (ret)
239+
return ret;
240+
241+
/* Load data npu firmware */
242+
return airoha_npu_load_firmware(dev, base + REG_NPU_LOCAL_SRAM,
243+
&soc->fw_data);
228244
}
229245

230246
static irqreturn_t airoha_npu_mbox_handler(int irq, void *npu_instance)
@@ -597,8 +613,31 @@ void airoha_npu_put(struct airoha_npu *npu)
597613
}
598614
EXPORT_SYMBOL_GPL(airoha_npu_put);
599615

616+
static const struct airoha_npu_soc_data en7581_npu_soc_data = {
617+
.fw_rv32 = {
618+
.name = NPU_EN7581_FIRMWARE_RV32,
619+
.max_size = NPU_EN7581_FIRMWARE_RV32_MAX_SIZE,
620+
},
621+
.fw_data = {
622+
.name = NPU_EN7581_FIRMWARE_DATA,
623+
.max_size = NPU_EN7581_FIRMWARE_DATA_MAX_SIZE,
624+
},
625+
};
626+
627+
static const struct airoha_npu_soc_data an7583_npu_soc_data = {
628+
.fw_rv32 = {
629+
.name = NPU_AN7583_FIRMWARE_RV32,
630+
.max_size = NPU_EN7581_FIRMWARE_RV32_MAX_SIZE,
631+
},
632+
.fw_data = {
633+
.name = NPU_AN7583_FIRMWARE_DATA,
634+
.max_size = NPU_EN7581_FIRMWARE_DATA_MAX_SIZE,
635+
},
636+
};
637+
600638
static const struct of_device_id of_airoha_npu_match[] = {
601-
{ .compatible = "airoha,en7581-npu" },
639+
{ .compatible = "airoha,en7581-npu", .data = &en7581_npu_soc_data },
640+
{ .compatible = "airoha,an7583-npu", .data = &an7583_npu_soc_data },
602641
{ /* sentinel */ }
603642
};
604643
MODULE_DEVICE_TABLE(of, of_airoha_npu_match);
@@ -737,6 +776,8 @@ module_platform_driver(airoha_npu_driver);
737776

738777
MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_DATA);
739778
MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_RV32);
779+
MODULE_FIRMWARE(NPU_AN7583_FIRMWARE_DATA);
780+
MODULE_FIRMWARE(NPU_AN7583_FIRMWARE_RV32);
740781
MODULE_LICENSE("GPL");
741782
MODULE_AUTHOR("Lorenzo Bianconi <[email protected]>");
742783
MODULE_DESCRIPTION("Airoha Network Processor Unit driver");

0 commit comments

Comments
 (0)