1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2006-2009 Freescale Semiconductor, Inc.
6 * based on source code of Shlomi Gridish
12 #include <linux/errno.h>
14 #include <linux/immap_qe.h>
17 #include <u-boot/crc.h>
19 #ifdef CONFIG_ARCH_LS1021A
20 #include <asm/arch/immap_ls102xa.h>
23 #include <asm/armv8/mmu.h>
24 #include <asm/arch/cpu.h>
27 #define MPC85xx_DEVDISR_QE_DISABLE 0x1
29 qe_map_t *qe_immr = NULL;
31 static qe_snum_t snums[QE_NUM_OF_SNUM];
34 DECLARE_GLOBAL_DATA_PTR;
36 void qe_issue_cmd(uint cmd, uint sbc, u8 mcn, u32 cmd_data)
40 if (cmd == QE_RESET) {
41 out_be32(&qe_immr->cp.cecr,(u32) (cmd | QE_CR_FLG));
43 out_be32(&qe_immr->cp.cecdr, cmd_data);
44 out_be32(&qe_immr->cp.cecr, (sbc | QE_CR_FLG |
45 ((u32) mcn<<QE_CR_PROTOCOL_SHIFT) | cmd));
47 /* Wait for the QE_CR_FLG to clear */
49 cecr = in_be32(&qe_immr->cp.cecr);
50 } while (cecr & QE_CR_FLG);
56 uint qe_muram_alloc(uint size, uint align)
62 align_mask = align - 1;
63 savebase = gd->arch.mp_alloc_base;
65 off = gd->arch.mp_alloc_base & align_mask;
67 gd->arch.mp_alloc_base += (align - off);
69 if ((off = size & align_mask) != 0)
70 size += (align - off);
72 if ((gd->arch.mp_alloc_base + size) >= gd->arch.mp_alloc_top) {
73 gd->arch.mp_alloc_base = savebase;
74 printf("%s: ran out of ram.\n", __FUNCTION__);
77 retloc = gd->arch.mp_alloc_base;
78 gd->arch.mp_alloc_base += size;
80 memset((void *)&qe_immr->muram[retloc], 0, size);
82 __asm__ __volatile__("sync");
88 void *qe_muram_addr(uint offset)
90 return (void *)&qe_immr->muram[offset];
94 static void qe_sdma_init(void)
97 uint sdma_buffer_base;
99 p = (volatile sdma_t *)&qe_immr->sdma;
101 /* All of DMA transaction in bus 1 */
102 out_be32(&p->sdaqr, 0);
103 out_be32(&p->sdaqmr, 0);
105 /* Allocate 2KB temporary buffer for sdma */
106 sdma_buffer_base = qe_muram_alloc(2048, 4096);
107 out_be32(&p->sdwbcr, sdma_buffer_base & QE_SDEBCR_BA_MASK);
109 /* Clear sdma status */
110 out_be32(&p->sdsr, 0x03000000);
112 /* Enable global mode on bus 1, and 2KB buffer size */
113 out_be32(&p->sdmr, QE_SDMR_GLB_1_MSK | (0x3 << QE_SDMR_CEN_SHIFT));
116 /* This table is a list of the serial numbers of the Threads, taken from the
117 * "SNUM Table" chart in the QE Reference Manual. The order is not important,
118 * we just need to know what the SNUMs are for the threads.
120 static u8 thread_snum[] = {
121 /* Evthreads 16-29 are not supported in MPC8309 */
122 #if !defined(CONFIG_ARCH_MPC8309)
123 0x04, 0x05, 0x0c, 0x0d,
124 0x14, 0x15, 0x1c, 0x1d,
125 0x24, 0x25, 0x2c, 0x2d,
128 0x88, 0x89, 0x98, 0x99,
129 0xa8, 0xa9, 0xb8, 0xb9,
130 0xc8, 0xc9, 0xd8, 0xd9,
131 0xe8, 0xe9, 0x08, 0x09,
132 0x18, 0x19, 0x28, 0x29,
133 0x38, 0x39, 0x48, 0x49,
134 0x58, 0x59, 0x68, 0x69,
135 0x78, 0x79, 0x80, 0x81
138 static void qe_snums_init(void)
142 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
143 snums[i].state = QE_SNUM_STATE_FREE;
144 snums[i].num = thread_snum[i];
148 int qe_get_snum(void)
153 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
154 if (snums[i].state == QE_SNUM_STATE_FREE) {
155 snums[i].state = QE_SNUM_STATE_USED;
164 void qe_put_snum(u8 snum)
168 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
169 if (snums[i].num == snum) {
170 snums[i].state = QE_SNUM_STATE_FREE;
176 #ifdef CONFIG_TFABOOT
177 void qe_init(uint qe_base)
179 enum boot_src src = get_boot_src();
181 /* Init the QE IMMR base */
182 qe_immr = (qe_map_t *)qe_base;
184 if (src == BOOT_SOURCE_IFC_NOR) {
186 * Upload microcode to IRAM for those SOCs
187 * which do not have ROM in QE.
189 qe_upload_firmware((const void *)(CONFIG_SYS_QE_FW_ADDR +
190 CONFIG_SYS_FSL_IFC_BASE));
192 /* enable the microcode in IRAM */
193 out_be32(&qe_immr->iram.iready, QE_IRAM_READY);
196 gd->arch.mp_alloc_base = QE_DATAONLY_BASE;
197 gd->arch.mp_alloc_top = gd->arch.mp_alloc_base + QE_DATAONLY_SIZE;
203 void qe_init(uint qe_base)
205 /* Init the QE IMMR base */
206 qe_immr = (qe_map_t *)qe_base;
208 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_NOR
210 * Upload microcode to IRAM for those SOCs which do not have ROM in QE.
212 qe_upload_firmware((const void *)CONFIG_SYS_QE_FW_ADDR);
214 /* enable the microcode in IRAM */
215 out_be32(&qe_immr->iram.iready,QE_IRAM_READY);
218 gd->arch.mp_alloc_base = QE_DATAONLY_BASE;
219 gd->arch.mp_alloc_top = gd->arch.mp_alloc_base + QE_DATAONLY_SIZE;
228 #ifdef CONFIG_TFABOOT
231 enum boot_src src = get_boot_src();
233 qe_immr = (qe_map_t *)(CONFIG_SYS_IMMR + QE_IMMR_OFFSET);
235 void *addr = (void *)CONFIG_SYS_QE_FW_ADDR;
237 if (src == BOOT_SOURCE_IFC_NOR)
238 addr = (void *)(CONFIG_SYS_QE_FW_ADDR + CONFIG_SYS_FSL_IFC_BASE);
240 if (src == BOOT_SOURCE_QSPI_NOR)
241 addr = (void *)(CONFIG_SYS_QE_FW_ADDR + CONFIG_SYS_FSL_QSPI_BASE);
243 if (src == BOOT_SOURCE_SD_MMC) {
244 int dev = CONFIG_SYS_MMC_ENV_DEV;
245 u32 cnt = CONFIG_SYS_QE_FMAN_FW_LENGTH / 512;
246 u32 blk = CONFIG_SYS_QE_FW_ADDR / 512;
248 if (mmc_initialize(gd->bd)) {
249 printf("%s: mmc_initialize() failed\n", __func__);
252 addr = malloc(CONFIG_SYS_QE_FMAN_FW_LENGTH);
253 struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
257 printf("\nMMC cannot find device for ucode\n");
259 printf("\nMMC read: dev # %u, block # %u, count %u ...\n",
262 (void)blk_dread(mmc_get_blk_desc(mmc), blk, cnt,
266 if (!u_qe_upload_firmware(addr))
267 out_be32(&qe_immr->iram.iready, QE_IRAM_READY);
268 if (src == BOOT_SOURCE_SD_MMC)
274 qe_immr = (qe_map_t *)(CONFIG_SYS_IMMR + QE_IMMR_OFFSET);
276 void *addr = (void *)CONFIG_SYS_QE_FW_ADDR;
277 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_MMC
278 int dev = CONFIG_SYS_MMC_ENV_DEV;
279 u32 cnt = CONFIG_SYS_QE_FMAN_FW_LENGTH / 512;
280 u32 blk = CONFIG_SYS_QE_FW_ADDR / 512;
282 if (mmc_initialize(gd->bd)) {
283 printf("%s: mmc_initialize() failed\n", __func__);
286 addr = malloc(CONFIG_SYS_QE_FMAN_FW_LENGTH);
287 struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
291 printf("\nMMC cannot find device for ucode\n");
293 printf("\nMMC read: dev # %u, block # %u, count %u ...\n",
296 (void)blk_dread(mmc_get_blk_desc(mmc), blk, cnt,
300 if (!u_qe_upload_firmware(addr))
301 out_be32(&qe_immr->iram.iready, QE_IRAM_READY);
302 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_MMC
310 void u_qe_resume(void)
314 qe_immrr = (qe_map_t *)(CONFIG_SYS_IMMR + QE_IMMR_OFFSET);
315 u_qe_firmware_resume((const void *)CONFIG_SYS_QE_FW_ADDR, qe_immrr);
316 out_be32(&qe_immrr->iram.iready, QE_IRAM_READY);
322 qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
323 (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0);
327 void qe_assign_page(uint snum, uint para_ram_base)
331 out_be32(&qe_immr->cp.cecdr, para_ram_base);
332 out_be32(&qe_immr->cp.cecr, ((u32) snum<<QE_CR_ASSIGN_PAGE_SNUM_SHIFT)
333 | QE_CR_FLG | QE_ASSIGN_PAGE);
335 /* Wait for the QE_CR_FLG to clear */
337 cecr = in_be32(&qe_immr->cp.cecr);
338 } while (cecr & QE_CR_FLG );
345 * brg: 0~15 as BRG1~BRG16
347 * BRG input clock comes from the BRGCLK (internal clock generated from
348 the QE clock, it is one-half of the QE clock), If need the clock source
349 from CLKn pin, we have te change the function.
352 #define BRG_CLK (gd->arch.brg_clk)
355 int qe_set_brg(uint brg, uint rate)
361 if (brg >= QE_NUM_OF_BRGS)
363 bp = (uint *)&qe_immr->brg.brgc1;
366 divisor = (BRG_CLK / rate);
367 if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
372 *bp = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
373 __asm__ __volatile__("sync");
376 *bp |= QE_BRGC_DIV16;
377 __asm__ __volatile__("sync");
384 /* Set ethernet MII clock master
386 int qe_set_mii_clk_src(int ucc_num)
390 /* check if the UCC number is in range. */
391 if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0)) {
392 printf("%s: ucc num not in ranges\n", __FUNCTION__);
396 cmxgcr = in_be32(&qe_immr->qmx.cmxgcr);
397 cmxgcr &= ~QE_CMXGCR_MII_ENET_MNG_MASK;
398 cmxgcr |= (ucc_num <<QE_CMXGCR_MII_ENET_MNG_SHIFT);
399 out_be32(&qe_immr->qmx.cmxgcr, cmxgcr);
404 /* Firmware information stored here for qe_get_firmware_info() */
405 static struct qe_firmware_info qe_firmware_info;
408 * Set to 1 if QE firmware has been uploaded, and therefore
409 * qe_firmware_info contains valid data.
411 static int qe_firmware_uploaded;
414 * Upload a QE microcode
416 * This function is a worker function for qe_upload_firmware(). It does
417 * the actual uploading of the microcode.
419 static void qe_upload_microcode(const void *base,
420 const struct qe_microcode *ucode)
422 const u32 *code = base + be32_to_cpu(ucode->code_offset);
425 if (ucode->major || ucode->minor || ucode->revision)
426 printf("QE: uploading microcode '%s' version %u.%u.%u\n",
427 (char *)ucode->id, (u16)ucode->major, (u16)ucode->minor,
428 (u16)ucode->revision);
430 printf("QE: uploading microcode '%s'\n", (char *)ucode->id);
432 /* Use auto-increment */
433 out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
434 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
436 for (i = 0; i < be32_to_cpu(ucode->count); i++)
437 out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
441 * Upload a microcode to the I-RAM at a specific address.
443 * See Documentation/powerpc/qe_firmware.rst in the Linux kernel tree for
444 * information on QE microcode uploading.
446 * Currently, only version 1 is supported, so the 'version' field must be
449 * The SOC model and revision are not validated, they are only displayed for
450 * informational purposes.
452 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
453 * all of the microcode structures, minus the CRC.
455 * 'length' is the size that the structure says it is, including the CRC.
457 int qe_upload_firmware(const struct qe_firmware *firmware)
462 size_t calc_size = sizeof(struct qe_firmware);
464 const struct qe_header *hdr;
465 #ifdef CONFIG_DEEP_SLEEP
466 #ifdef CONFIG_ARCH_LS1021A
467 struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
469 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
473 printf("Invalid address\n");
477 hdr = &firmware->header;
478 length = be32_to_cpu(hdr->length);
480 /* Check the magic */
481 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
482 (hdr->magic[2] != 'F')) {
483 printf("QE microcode not found\n");
484 #ifdef CONFIG_DEEP_SLEEP
485 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
490 /* Check the version */
491 if (hdr->version != 1) {
492 printf("Unsupported version\n");
496 /* Validate some of the fields */
497 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
498 printf("Invalid data\n");
502 /* Validate the length and check if there's a CRC */
503 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
505 for (i = 0; i < firmware->count; i++)
507 * For situations where the second RISC uses the same microcode
508 * as the first, the 'code_offset' and 'count' fields will be
509 * zero, so it's okay to add those.
511 calc_size += sizeof(u32) *
512 be32_to_cpu(firmware->microcode[i].count);
514 /* Validate the length */
515 if (length != calc_size + sizeof(u32)) {
516 printf("Invalid length\n");
521 * Validate the CRC. We would normally call crc32_no_comp(), but that
522 * function isn't available unless you turn on JFFS support.
524 crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
525 if (crc != (crc32(-1, (const void *) firmware, calc_size) ^ -1)) {
526 printf("Firmware CRC is invalid\n");
531 * If the microcode calls for it, split the I-RAM.
533 if (!firmware->split) {
534 out_be16(&qe_immr->cp.cercr,
535 in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
538 if (firmware->soc.model)
539 printf("Firmware '%s' for %u V%u.%u\n",
540 firmware->id, be16_to_cpu(firmware->soc.model),
541 firmware->soc.major, firmware->soc.minor);
543 printf("Firmware '%s'\n", firmware->id);
546 * The QE only supports one microcode per RISC, so clear out all the
547 * saved microcode information and put in the new.
549 memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
550 strncpy(qe_firmware_info.id, (char *)firmware->id, 62);
551 qe_firmware_info.extended_modes = firmware->extended_modes;
552 memcpy(qe_firmware_info.vtraps, firmware->vtraps,
553 sizeof(firmware->vtraps));
554 qe_firmware_uploaded = 1;
556 /* Loop through each microcode. */
557 for (i = 0; i < firmware->count; i++) {
558 const struct qe_microcode *ucode = &firmware->microcode[i];
560 /* Upload a microcode if it's present */
561 if (ucode->code_offset)
562 qe_upload_microcode(firmware, ucode);
564 /* Program the traps for this processor */
565 for (j = 0; j < 16; j++) {
566 u32 trap = be32_to_cpu(ucode->traps[j]);
569 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
573 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
581 * Upload a microcode to the I-RAM at a specific address.
583 * See Documentation/powerpc/qe_firmware.rst in the Linux kernel tree for
584 * information on QE microcode uploading.
586 * Currently, only version 1 is supported, so the 'version' field must be
589 * The SOC model and revision are not validated, they are only displayed for
590 * informational purposes.
592 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
593 * all of the microcode structures, minus the CRC.
595 * 'length' is the size that the structure says it is, including the CRC.
597 int u_qe_upload_firmware(const struct qe_firmware *firmware)
602 size_t calc_size = sizeof(struct qe_firmware);
604 const struct qe_header *hdr;
605 #ifdef CONFIG_DEEP_SLEEP
606 #ifdef CONFIG_ARCH_LS1021A
607 struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
609 ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
613 printf("Invalid address\n");
617 hdr = &firmware->header;
618 length = be32_to_cpu(hdr->length);
620 /* Check the magic */
621 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
622 (hdr->magic[2] != 'F')) {
623 printf("Not a microcode\n");
624 #ifdef CONFIG_DEEP_SLEEP
625 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
630 /* Check the version */
631 if (hdr->version != 1) {
632 printf("Unsupported version\n");
636 /* Validate some of the fields */
637 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
638 printf("Invalid data\n");
642 /* Validate the length and check if there's a CRC */
643 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
645 for (i = 0; i < firmware->count; i++)
647 * For situations where the second RISC uses the same microcode
648 * as the first, the 'code_offset' and 'count' fields will be
649 * zero, so it's okay to add those.
651 calc_size += sizeof(u32) *
652 be32_to_cpu(firmware->microcode[i].count);
654 /* Validate the length */
655 if (length != calc_size + sizeof(u32)) {
656 printf("Invalid length\n");
661 * Validate the CRC. We would normally call crc32_no_comp(), but that
662 * function isn't available unless you turn on JFFS support.
664 crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
665 if (crc != (crc32(-1, (const void *)firmware, calc_size) ^ -1)) {
666 printf("Firmware CRC is invalid\n");
671 * If the microcode calls for it, split the I-RAM.
673 if (!firmware->split) {
674 out_be16(&qe_immr->cp.cercr,
675 in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
678 if (firmware->soc.model)
679 printf("Firmware '%s' for %u V%u.%u\n",
680 firmware->id, be16_to_cpu(firmware->soc.model),
681 firmware->soc.major, firmware->soc.minor);
683 printf("Firmware '%s'\n", firmware->id);
685 /* Loop through each microcode. */
686 for (i = 0; i < firmware->count; i++) {
687 const struct qe_microcode *ucode = &firmware->microcode[i];
689 /* Upload a microcode if it's present */
690 if (ucode->code_offset)
691 qe_upload_microcode(firmware, ucode);
693 /* Program the traps for this processor */
694 for (j = 0; j < 16; j++) {
695 u32 trap = be32_to_cpu(ucode->traps[j]);
698 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
702 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
710 int u_qe_firmware_resume(const struct qe_firmware *firmware, qe_map_t *qe_immrr)
714 const struct qe_header *hdr;
716 #ifdef CONFIG_DEEP_SLEEP
718 ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
720 struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
727 hdr = &firmware->header;
729 /* Check the magic */
730 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
731 (hdr->magic[2] != 'F')) {
732 #ifdef CONFIG_DEEP_SLEEP
733 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
739 * If the microcode calls for it, split the I-RAM.
741 if (!firmware->split) {
742 out_be16(&qe_immrr->cp.cercr,
743 in_be16(&qe_immrr->cp.cercr) | QE_CP_CERCR_CIR);
746 /* Loop through each microcode. */
747 for (i = 0; i < firmware->count; i++) {
748 const struct qe_microcode *ucode = &firmware->microcode[i];
750 /* Upload a microcode if it's present */
751 if (!ucode->code_offset)
754 code = (const void *)firmware + be32_to_cpu(ucode->code_offset);
756 /* Use auto-increment */
757 out_be32(&qe_immrr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
758 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
760 for (i = 0; i < be32_to_cpu(ucode->count); i++)
761 out_be32(&qe_immrr->iram.idata, be32_to_cpu(code[i]));
763 /* Program the traps for this processor */
764 for (j = 0; j < 16; j++) {
765 u32 trap = be32_to_cpu(ucode->traps[j]);
768 out_be32(&qe_immrr->rsp[i].tibcr[j], trap);
772 out_be32(&qe_immrr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
779 struct qe_firmware_info *qe_get_firmware_info(void)
781 return qe_firmware_uploaded ? &qe_firmware_info : NULL;
784 static int qe_cmd(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
789 return cmd_usage(cmdtp);
791 if (strcmp(argv[1], "fw") == 0) {
792 addr = simple_strtoul(argv[2], NULL, 16);
795 printf("Invalid address\n");
800 * If a length was supplied, compare that with the 'length'
805 ulong length = simple_strtoul(argv[3], NULL, 16);
806 struct qe_firmware *firmware = (void *) addr;
808 if (length != be32_to_cpu(firmware->header.length)) {
809 printf("Length mismatch\n");
814 return qe_upload_firmware((const struct qe_firmware *) addr);
817 return cmd_usage(cmdtp);
822 "QUICC Engine commands",
823 "fw <addr> [<length>] - Upload firmware binary at address <addr> to "
825 "\twith optional length <length> verification."