Lines Matching +full:ixp4xx +full:- +full:network +full:- +full:processing +full:- +full:engine

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Intel IXP4xx Network Processor Engine driver for Linux
8 * - Intel IXP4xx Developer's Manual and other e-papers
9 * - Intel IXP400 Access Library Software (BSD license)
10 * - previous works by Christian Hohnstaedt <chohnstaedt@innominate.com>
15 #include <linux/dma-mapping.h>
22 #include <linux/soc/ixp4xx/npe.h>
118 #define NPE_A_FIRMWARE "NPE-A"
119 #define NPE_B_FIRMWARE "NPE-B"
120 #define NPE_C_FIRMWARE "NPE-C"
164 return (__raw_readl(&npe->regs->exec_status_cmd) & STAT_RUN) != 0; in npe_running()
169 __raw_writel(data, &npe->regs->exec_data); in npe_cmd_write()
170 __raw_writel(addr, &npe->regs->exec_addr); in npe_cmd_write()
171 __raw_writel(cmd, &npe->regs->exec_status_cmd); in npe_cmd_write()
176 __raw_writel(addr, &npe->regs->exec_addr); in npe_cmd_read()
177 __raw_writel(cmd, &npe->regs->exec_status_cmd); in npe_cmd_read()
181 __raw_readl(&npe->regs->exec_data); in npe_cmd_read()
182 __raw_readl(&npe->regs->exec_data); in npe_cmd_read()
183 return __raw_readl(&npe->regs->exec_data); in npe_cmd_read()
199 __raw_writel(CMD_NPE_CLR_PIPE, &npe->regs->exec_status_cmd); in npe_start()
200 __raw_writel(CMD_NPE_START, &npe->regs->exec_status_cmd); in npe_start()
205 __raw_writel(CMD_NPE_STOP, &npe->regs->exec_status_cmd); in npe_stop()
206 __raw_writel(CMD_NPE_CLR_PIPE, &npe->regs->exec_status_cmd); /*FIXME?*/ in npe_stop()
229 __raw_writel(CMD_NPE_CLR_PIPE, &npe->regs->exec_status_cmd); in npe_debug_instr()
236 wc = __raw_readl(&npe->regs->watch_count); in npe_debug_instr()
239 __raw_writel(CMD_NPE_STEP, &npe->regs->exec_status_cmd); in npe_debug_instr()
243 if (wc != __raw_readl(&npe->regs->watch_count)) in npe_debug_instr()
249 return -ETIMEDOUT; in npe_debug_instr()
259 (val & ~0x1F) << (18 - 5);/* higher 3 bits to CoProc instr. */ in npe_logical_reg_write8()
270 (val & ~0x1F) << (18 - 5);/* higher 11 bits to CoProc instr. */ in npe_logical_reg_write16()
279 return -ETIMEDOUT; in npe_logical_reg_write32()
288 ctl = (__raw_readl(&npe->regs->messaging_control) | 0x3F000000) & in npe_reset()
292 __raw_writel(ctl & 0x3F00FFFF, &npe->regs->messaging_control); in npe_reset()
294 /* pre exec - debug instruction */ in npe_reset()
296 exec_count = __raw_readl(&npe->regs->exec_count); in npe_reset()
297 __raw_writel(0, &npe->regs->exec_count); in npe_reset()
305 while (__raw_readl(&npe->regs->watchpoint_fifo) & WFIFO_VALID) in npe_reset()
307 while (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_OFNE) in npe_reset()
310 __raw_readl(&npe->regs->in_out_fifo)); in npe_reset()
312 while (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_IFNE) in npe_reset()
316 return -ETIMEDOUT; in npe_reset()
319 __raw_writel(RESET_MBOX_STAT, &npe->regs->mailbox_status); in npe_reset()
322 return -ETIMEDOUT; in npe_reset()
327 return -ETIMEDOUT; in npe_reset()
330 return -ETIMEDOUT; in npe_reset()
346 return -ETIMEDOUT; in npe_reset()
348 return -ETIMEDOUT; in npe_reset()
350 /* REGMAP = d0->p0, d8->p2, d16->p4 */ in npe_reset()
352 return -ETIMEDOUT; in npe_reset()
354 return -ETIMEDOUT; in npe_reset()
361 __raw_writel(CMD_NPE_CLR_PIPE, &npe->regs->exec_status_cmd); in npe_reset()
363 __raw_writel(exec_count, &npe->regs->exec_count); in npe_reset()
372 __raw_writel(CMD_CLR_PROFILE_CNT, &npe->regs->exec_status_cmd); in npe_reset()
374 __raw_writel(0, &npe->regs->exec_count); in npe_reset()
375 __raw_writel(0, &npe->regs->action_points[0]); in npe_reset()
376 __raw_writel(0, &npe->regs->action_points[1]); in npe_reset()
377 __raw_writel(0, &npe->regs->action_points[2]); in npe_reset()
378 __raw_writel(0, &npe->regs->action_points[3]); in npe_reset()
379 __raw_writel(0, &npe->regs->watch_count); in npe_reset()
384 ~(IXP4XX_FEATURE_RESET_NPEA << npe->id)); in npe_reset()
387 (IXP4XX_FEATURE_RESET_NPEA << npe->id)); in npe_reset()
390 (IXP4XX_FEATURE_RESET_NPEA << npe->id)) in npe_reset()
395 return -ETIMEDOUT; in npe_reset()
399 /* restore NPE configuration bus Control Register - parity settings */ in npe_reset()
400 __raw_writel(ctl, &npe->regs->messaging_control); in npe_reset()
413 if (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_IFNE) { in npe_send_message()
415 return -EIO; in npe_send_message()
418 __raw_writel(send[0], &npe->regs->in_out_fifo); in npe_send_message()
420 if (!(__raw_readl(&npe->regs->messaging_status) & MSGSTAT_IFNF)) { in npe_send_message()
422 return -EIO; in npe_send_message()
425 __raw_writel(send[1], &npe->regs->in_out_fifo); in npe_send_message()
428 (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_IFNE)) { in npe_send_message()
435 return -ETIMEDOUT; in npe_send_message()
452 if (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_OFNE) { in npe_recv_message()
453 recv[cnt++] = __raw_readl(&npe->regs->in_out_fifo); in npe_recv_message()
473 return -ETIMEDOUT; in npe_recv_message()
495 return -EIO; in npe_send_recv_message()
532 err = -EINVAL; in npe_load_firmware()
533 if (fw_entry->size < sizeof(struct dl_image)) { in npe_load_firmware()
537 image = (struct dl_image*)fw_entry->data; in npe_load_firmware()
541 image->magic, image->id, image->size, image->size * 4); in npe_load_firmware()
544 if (image->magic == swab32(FW_MAGIC)) { /* swapped file */ in npe_load_firmware()
545 image->id = swab32(image->id); in npe_load_firmware()
546 image->size = swab32(image->size); in npe_load_firmware()
547 } else if (image->magic != FW_MAGIC) { in npe_load_firmware()
549 image->magic); in npe_load_firmware()
552 if ((image->size * 4 + sizeof(struct dl_image)) != fw_entry->size) { in npe_load_firmware()
557 if (((image->id >> 24) & 0xF /* NPE ID */) != npe->id) { in npe_load_firmware()
561 if (image->magic == swab32(FW_MAGIC)) in npe_load_firmware()
562 for (i = 0; i < image->size; i++) in npe_load_firmware()
563 image->data[i] = swab32(image->data[i]); in npe_load_firmware()
565 if (cpu_is_ixp42x() && ((image->id >> 28) & 0xF /* device ID */)) { in npe_load_firmware()
574 err = -EBUSY; in npe_load_firmware()
583 "revision 0x%X:%X\n", (image->id >> 16) & 0xFF, in npe_load_firmware()
584 (image->id >> 8) & 0xFF, image->id & 0xFF); in npe_load_firmware()
587 if (!npe->id) in npe_load_firmware()
597 for (blocks = 0; blocks * sizeof(struct dl_block) / 4 < image->size; in npe_load_firmware()
599 if (image->blocks[blocks].type == FW_BLOCK_TYPE_EOF) in npe_load_firmware()
601 if (blocks * sizeof(struct dl_block) / 4 >= image->size) { in npe_load_firmware()
612 for (i = 0, blk = image->blocks; i < blocks; i++, blk++) { in npe_load_firmware()
613 if (blk->offset > image->size - sizeof(struct dl_codeblock) / 4 in npe_load_firmware()
614 || blk->offset < table_end) { in npe_load_firmware()
616 "firmware block #%i\n", blk->offset, i); in npe_load_firmware()
620 cb = (struct dl_codeblock*)&image->data[blk->offset]; in npe_load_firmware()
621 if (blk->type == FW_BLOCK_TYPE_INSTR) { in npe_load_firmware()
622 if (cb->npe_addr + cb->size > instr_size) in npe_load_firmware()
625 } else if (blk->type == FW_BLOCK_TYPE_DATA) { in npe_load_firmware()
626 if (cb->npe_addr + cb->size > data_size) in npe_load_firmware()
631 "type 0x%X\n", i, blk->type); in npe_load_firmware()
634 if (blk->offset + sizeof(*cb) / 4 + cb->size > image->size) { in npe_load_firmware()
638 blk->type == FW_BLOCK_TYPE_INSTR ? 'I' : 'D', in npe_load_firmware()
639 cb->npe_addr, cb->size); in npe_load_firmware()
643 for (j = 0; j < cb->size; j++) in npe_load_firmware()
644 npe_cmd_write(npe, cb->npe_addr + j, cmd, cb->data[j]); in npe_load_firmware()
656 blk->type == FW_BLOCK_TYPE_INSTR ? 'I' : 'D', in npe_load_firmware()
657 cb->npe_addr, cb->size); in npe_load_firmware()
681 struct device *dev = &pdev->dev; in ixp4xx_npe_probe()
689 return -ENODEV; in ixp4xx_npe_probe()
693 dev_info(dev, "NPE%d at 0x%08x-0x%08x not available\n", in ixp4xx_npe_probe()
694 i, res->start, res->end); in ixp4xx_npe_probe()
697 npe->regs = devm_ioremap_resource(dev, res); in ixp4xx_npe_probe()
698 if (IS_ERR(npe->regs)) in ixp4xx_npe_probe()
699 return PTR_ERR(npe->regs); in ixp4xx_npe_probe()
702 dev_info(dev, "NPE%d at 0x%08x-0x%08x does not reset\n", in ixp4xx_npe_probe()
703 i, res->start, res->end); in ixp4xx_npe_probe()
706 npe->valid = 1; in ixp4xx_npe_probe()
707 dev_info(dev, "NPE%d at 0x%08x-0x%08x registered\n", in ixp4xx_npe_probe()
708 i, res->start, res->end); in ixp4xx_npe_probe()
713 return -ENODEV; in ixp4xx_npe_probe()
731 .compatible = "intel,ixp4xx-network-processing-engine",
738 .name = "ixp4xx-npe",