Lines Matching +full:ixp4xx +full:- +full:crypto
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>
23 #include <linux/soc/ixp4xx/npe.h>
24 #include <linux/soc/ixp4xx/cpu.h>
120 #define NPE_A_FIRMWARE "NPE-A"
121 #define NPE_B_FIRMWARE "NPE-B"
122 #define NPE_C_FIRMWARE "NPE-C"
166 return (__raw_readl(&npe->regs->exec_status_cmd) & STAT_RUN) != 0; in npe_running()
171 __raw_writel(data, &npe->regs->exec_data); in npe_cmd_write()
172 __raw_writel(addr, &npe->regs->exec_addr); in npe_cmd_write()
173 __raw_writel(cmd, &npe->regs->exec_status_cmd); in npe_cmd_write()
178 __raw_writel(addr, &npe->regs->exec_addr); in npe_cmd_read()
179 __raw_writel(cmd, &npe->regs->exec_status_cmd); in npe_cmd_read()
183 __raw_readl(&npe->regs->exec_data); in npe_cmd_read()
184 __raw_readl(&npe->regs->exec_data); in npe_cmd_read()
185 return __raw_readl(&npe->regs->exec_data); in npe_cmd_read()
201 __raw_writel(CMD_NPE_CLR_PIPE, &npe->regs->exec_status_cmd); in npe_start()
202 __raw_writel(CMD_NPE_START, &npe->regs->exec_status_cmd); in npe_start()
207 __raw_writel(CMD_NPE_STOP, &npe->regs->exec_status_cmd); in npe_stop()
208 __raw_writel(CMD_NPE_CLR_PIPE, &npe->regs->exec_status_cmd); /*FIXME?*/ in npe_stop()
231 __raw_writel(CMD_NPE_CLR_PIPE, &npe->regs->exec_status_cmd); in npe_debug_instr()
238 wc = __raw_readl(&npe->regs->watch_count); in npe_debug_instr()
241 __raw_writel(CMD_NPE_STEP, &npe->regs->exec_status_cmd); in npe_debug_instr()
245 if (wc != __raw_readl(&npe->regs->watch_count)) in npe_debug_instr()
251 return -ETIMEDOUT; in npe_debug_instr()
261 (val & ~0x1F) << (18 - 5);/* higher 3 bits to CoProc instr. */ in npe_logical_reg_write8()
272 (val & ~0x1F) << (18 - 5);/* higher 11 bits to CoProc instr. */ in npe_logical_reg_write16()
281 return -ETIMEDOUT; in npe_logical_reg_write32()
290 ctl = (__raw_readl(&npe->regs->messaging_control) | 0x3F000000) & in npe_reset()
294 __raw_writel(ctl & 0x3F00FFFF, &npe->regs->messaging_control); in npe_reset()
296 /* pre exec - debug instruction */ in npe_reset()
298 exec_count = __raw_readl(&npe->regs->exec_count); in npe_reset()
299 __raw_writel(0, &npe->regs->exec_count); in npe_reset()
307 while (__raw_readl(&npe->regs->watchpoint_fifo) & WFIFO_VALID) in npe_reset()
309 while (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_OFNE) in npe_reset()
312 __raw_readl(&npe->regs->in_out_fifo)); in npe_reset()
314 while (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_IFNE) in npe_reset()
318 return -ETIMEDOUT; in npe_reset()
321 __raw_writel(RESET_MBOX_STAT, &npe->regs->mailbox_status); in npe_reset()
324 return -ETIMEDOUT; in npe_reset()
329 return -ETIMEDOUT; in npe_reset()
332 return -ETIMEDOUT; in npe_reset()
348 return -ETIMEDOUT; in npe_reset()
350 return -ETIMEDOUT; in npe_reset()
352 /* REGMAP = d0->p0, d8->p2, d16->p4 */ in npe_reset()
354 return -ETIMEDOUT; in npe_reset()
356 return -ETIMEDOUT; in npe_reset()
363 __raw_writel(CMD_NPE_CLR_PIPE, &npe->regs->exec_status_cmd); in npe_reset()
365 __raw_writel(exec_count, &npe->regs->exec_count); in npe_reset()
374 __raw_writel(CMD_CLR_PROFILE_CNT, &npe->regs->exec_status_cmd); in npe_reset()
376 __raw_writel(0, &npe->regs->exec_count); in npe_reset()
377 __raw_writel(0, &npe->regs->action_points[0]); in npe_reset()
378 __raw_writel(0, &npe->regs->action_points[1]); in npe_reset()
379 __raw_writel(0, &npe->regs->action_points[2]); in npe_reset()
380 __raw_writel(0, &npe->regs->action_points[3]); in npe_reset()
381 __raw_writel(0, &npe->regs->watch_count); in npe_reset()
386 ~(IXP4XX_FEATURE_RESET_NPEA << npe->id)); in npe_reset()
389 (IXP4XX_FEATURE_RESET_NPEA << npe->id)); in npe_reset()
392 (IXP4XX_FEATURE_RESET_NPEA << npe->id)) in npe_reset()
397 return -ETIMEDOUT; in npe_reset()
401 /* restore NPE configuration bus Control Register - parity settings */ in npe_reset()
402 __raw_writel(ctl, &npe->regs->messaging_control); in npe_reset()
415 if (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_IFNE) { in npe_send_message()
417 return -EIO; in npe_send_message()
420 __raw_writel(send[0], &npe->regs->in_out_fifo); in npe_send_message()
422 if (!(__raw_readl(&npe->regs->messaging_status) & MSGSTAT_IFNF)) { in npe_send_message()
424 return -EIO; in npe_send_message()
427 __raw_writel(send[1], &npe->regs->in_out_fifo); in npe_send_message()
430 (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_IFNE)) { in npe_send_message()
437 return -ETIMEDOUT; in npe_send_message()
454 if (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_OFNE) { in npe_recv_message()
455 recv[cnt++] = __raw_readl(&npe->regs->in_out_fifo); in npe_recv_message()
475 return -ETIMEDOUT; in npe_recv_message()
497 return -EIO; in npe_send_recv_message()
534 err = -EINVAL; in npe_load_firmware()
535 if (fw_entry->size < sizeof(struct dl_image)) { in npe_load_firmware()
539 image = (struct dl_image*)fw_entry->data; in npe_load_firmware()
543 image->magic, image->id, image->size, image->size * 4); in npe_load_firmware()
546 if (image->magic == swab32(FW_MAGIC)) { /* swapped file */ in npe_load_firmware()
547 image->id = swab32(image->id); in npe_load_firmware()
548 image->size = swab32(image->size); in npe_load_firmware()
549 } else if (image->magic != FW_MAGIC) { in npe_load_firmware()
551 image->magic); in npe_load_firmware()
554 if ((image->size * 4 + sizeof(struct dl_image)) != fw_entry->size) { in npe_load_firmware()
559 if (((image->id >> 24) & 0xF /* NPE ID */) != npe->id) { in npe_load_firmware()
563 if (image->magic == swab32(FW_MAGIC)) in npe_load_firmware()
564 for (i = 0; i < image->size; i++) in npe_load_firmware()
565 image->data[i] = swab32(image->data[i]); in npe_load_firmware()
567 if (cpu_is_ixp42x() && ((image->id >> 28) & 0xF /* device ID */)) { in npe_load_firmware()
576 err = -EBUSY; in npe_load_firmware()
585 "revision 0x%X:%X\n", (image->id >> 16) & 0xFF, in npe_load_firmware()
586 (image->id >> 8) & 0xFF, image->id & 0xFF); in npe_load_firmware()
589 if (!npe->id) in npe_load_firmware()
599 for (blocks = 0; blocks * sizeof(struct dl_block) / 4 < image->size; in npe_load_firmware()
601 if (image->blocks[blocks].type == FW_BLOCK_TYPE_EOF) in npe_load_firmware()
603 if (blocks * sizeof(struct dl_block) / 4 >= image->size) { in npe_load_firmware()
614 for (i = 0, blk = image->blocks; i < blocks; i++, blk++) { in npe_load_firmware()
615 if (blk->offset > image->size - sizeof(struct dl_codeblock) / 4 in npe_load_firmware()
616 || blk->offset < table_end) { in npe_load_firmware()
618 "firmware block #%i\n", blk->offset, i); in npe_load_firmware()
622 cb = (struct dl_codeblock*)&image->data[blk->offset]; in npe_load_firmware()
623 if (blk->type == FW_BLOCK_TYPE_INSTR) { in npe_load_firmware()
624 if (cb->npe_addr + cb->size > instr_size) in npe_load_firmware()
627 } else if (blk->type == FW_BLOCK_TYPE_DATA) { in npe_load_firmware()
628 if (cb->npe_addr + cb->size > data_size) in npe_load_firmware()
633 "type 0x%X\n", i, blk->type); in npe_load_firmware()
636 if (blk->offset + sizeof(*cb) / 4 + cb->size > image->size) { in npe_load_firmware()
640 blk->type == FW_BLOCK_TYPE_INSTR ? 'I' : 'D', in npe_load_firmware()
641 cb->npe_addr, cb->size); in npe_load_firmware()
645 for (j = 0; j < cb->size; j++) in npe_load_firmware()
646 npe_cmd_write(npe, cb->npe_addr + j, cmd, cb->data[j]); in npe_load_firmware()
658 blk->type == FW_BLOCK_TYPE_INSTR ? 'I' : 'D', in npe_load_firmware()
659 cb->npe_addr, cb->size); in npe_load_firmware()
683 struct device *dev = &pdev->dev; in ixp4xx_npe_probe()
684 struct device_node *np = dev->of_node; in ixp4xx_npe_probe()
692 return -ENODEV; in ixp4xx_npe_probe()
700 npe->regs = devm_ioremap_resource(dev, res); in ixp4xx_npe_probe()
701 if (IS_ERR(npe->regs)) in ixp4xx_npe_probe()
702 return PTR_ERR(npe->regs); in ixp4xx_npe_probe()
709 npe->valid = 1; in ixp4xx_npe_probe()
715 return -ENODEV; in ixp4xx_npe_probe()
717 /* Spawn crypto subdevice if using device tree */ in ixp4xx_npe_probe()
738 .compatible = "intel,ixp4xx-network-processing-engine",
745 .name = "ixp4xx-npe",