1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2006-2009 Freescale Semiconductor, Inc.
5 * Dave Liu <daveliu@freescale.com>
6 * based on source code of Shlomi Gridish
12 #include <linux/errno.h>
14 #include <linux/immap_qe.h>
17 #include <environment.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 docs/README.qe_firmware for information on QE microcode uploading.
445 * Currently, only version 1 is supported, so the 'version' field must be
448 * The SOC model and revision are not validated, they are only displayed for
449 * informational purposes.
451 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
452 * all of the microcode structures, minus the CRC.
454 * 'length' is the size that the structure says it is, including the CRC.
456 int qe_upload_firmware(const struct qe_firmware *firmware)
461 size_t calc_size = sizeof(struct qe_firmware);
463 const struct qe_header *hdr;
464 #ifdef CONFIG_DEEP_SLEEP
465 #ifdef CONFIG_ARCH_LS1021A
466 struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
468 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
472 printf("Invalid address\n");
476 hdr = &firmware->header;
477 length = be32_to_cpu(hdr->length);
479 /* Check the magic */
480 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
481 (hdr->magic[2] != 'F')) {
482 printf("QE microcode not found\n");
483 #ifdef CONFIG_DEEP_SLEEP
484 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
489 /* Check the version */
490 if (hdr->version != 1) {
491 printf("Unsupported version\n");
495 /* Validate some of the fields */
496 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
497 printf("Invalid data\n");
501 /* Validate the length and check if there's a CRC */
502 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
504 for (i = 0; i < firmware->count; i++)
506 * For situations where the second RISC uses the same microcode
507 * as the first, the 'code_offset' and 'count' fields will be
508 * zero, so it's okay to add those.
510 calc_size += sizeof(u32) *
511 be32_to_cpu(firmware->microcode[i].count);
513 /* Validate the length */
514 if (length != calc_size + sizeof(u32)) {
515 printf("Invalid length\n");
520 * Validate the CRC. We would normally call crc32_no_comp(), but that
521 * function isn't available unless you turn on JFFS support.
523 crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
524 if (crc != (crc32(-1, (const void *) firmware, calc_size) ^ -1)) {
525 printf("Firmware CRC is invalid\n");
530 * If the microcode calls for it, split the I-RAM.
532 if (!firmware->split) {
533 out_be16(&qe_immr->cp.cercr,
534 in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
537 if (firmware->soc.model)
538 printf("Firmware '%s' for %u V%u.%u\n",
539 firmware->id, be16_to_cpu(firmware->soc.model),
540 firmware->soc.major, firmware->soc.minor);
542 printf("Firmware '%s'\n", firmware->id);
545 * The QE only supports one microcode per RISC, so clear out all the
546 * saved microcode information and put in the new.
548 memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
549 strncpy(qe_firmware_info.id, (char *)firmware->id, 62);
550 qe_firmware_info.extended_modes = firmware->extended_modes;
551 memcpy(qe_firmware_info.vtraps, firmware->vtraps,
552 sizeof(firmware->vtraps));
553 qe_firmware_uploaded = 1;
555 /* Loop through each microcode. */
556 for (i = 0; i < firmware->count; i++) {
557 const struct qe_microcode *ucode = &firmware->microcode[i];
559 /* Upload a microcode if it's present */
560 if (ucode->code_offset)
561 qe_upload_microcode(firmware, ucode);
563 /* Program the traps for this processor */
564 for (j = 0; j < 16; j++) {
565 u32 trap = be32_to_cpu(ucode->traps[j]);
568 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
572 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
580 * Upload a microcode to the I-RAM at a specific address.
582 * See docs/README.qe_firmware for information on QE microcode uploading.
584 * Currently, only version 1 is supported, so the 'version' field must be
587 * The SOC model and revision are not validated, they are only displayed for
588 * informational purposes.
590 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
591 * all of the microcode structures, minus the CRC.
593 * 'length' is the size that the structure says it is, including the CRC.
595 int u_qe_upload_firmware(const struct qe_firmware *firmware)
600 size_t calc_size = sizeof(struct qe_firmware);
602 const struct qe_header *hdr;
603 #ifdef CONFIG_DEEP_SLEEP
604 #ifdef CONFIG_ARCH_LS1021A
605 struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
607 ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
611 printf("Invalid address\n");
615 hdr = &firmware->header;
616 length = be32_to_cpu(hdr->length);
618 /* Check the magic */
619 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
620 (hdr->magic[2] != 'F')) {
621 printf("Not a microcode\n");
622 #ifdef CONFIG_DEEP_SLEEP
623 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
628 /* Check the version */
629 if (hdr->version != 1) {
630 printf("Unsupported version\n");
634 /* Validate some of the fields */
635 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
636 printf("Invalid data\n");
640 /* Validate the length and check if there's a CRC */
641 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
643 for (i = 0; i < firmware->count; i++)
645 * For situations where the second RISC uses the same microcode
646 * as the first, the 'code_offset' and 'count' fields will be
647 * zero, so it's okay to add those.
649 calc_size += sizeof(u32) *
650 be32_to_cpu(firmware->microcode[i].count);
652 /* Validate the length */
653 if (length != calc_size + sizeof(u32)) {
654 printf("Invalid length\n");
659 * Validate the CRC. We would normally call crc32_no_comp(), but that
660 * function isn't available unless you turn on JFFS support.
662 crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
663 if (crc != (crc32(-1, (const void *)firmware, calc_size) ^ -1)) {
664 printf("Firmware CRC is invalid\n");
669 * If the microcode calls for it, split the I-RAM.
671 if (!firmware->split) {
672 out_be16(&qe_immr->cp.cercr,
673 in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
676 if (firmware->soc.model)
677 printf("Firmware '%s' for %u V%u.%u\n",
678 firmware->id, be16_to_cpu(firmware->soc.model),
679 firmware->soc.major, firmware->soc.minor);
681 printf("Firmware '%s'\n", firmware->id);
683 /* Loop through each microcode. */
684 for (i = 0; i < firmware->count; i++) {
685 const struct qe_microcode *ucode = &firmware->microcode[i];
687 /* Upload a microcode if it's present */
688 if (ucode->code_offset)
689 qe_upload_microcode(firmware, ucode);
691 /* Program the traps for this processor */
692 for (j = 0; j < 16; j++) {
693 u32 trap = be32_to_cpu(ucode->traps[j]);
696 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
700 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
708 int u_qe_firmware_resume(const struct qe_firmware *firmware, qe_map_t *qe_immrr)
712 const struct qe_header *hdr;
714 #ifdef CONFIG_DEEP_SLEEP
716 ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
718 struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
725 hdr = &firmware->header;
727 /* Check the magic */
728 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
729 (hdr->magic[2] != 'F')) {
730 #ifdef CONFIG_DEEP_SLEEP
731 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
737 * If the microcode calls for it, split the I-RAM.
739 if (!firmware->split) {
740 out_be16(&qe_immrr->cp.cercr,
741 in_be16(&qe_immrr->cp.cercr) | QE_CP_CERCR_CIR);
744 /* Loop through each microcode. */
745 for (i = 0; i < firmware->count; i++) {
746 const struct qe_microcode *ucode = &firmware->microcode[i];
748 /* Upload a microcode if it's present */
749 if (!ucode->code_offset)
752 code = (const void *)firmware + be32_to_cpu(ucode->code_offset);
754 /* Use auto-increment */
755 out_be32(&qe_immrr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
756 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
758 for (i = 0; i < be32_to_cpu(ucode->count); i++)
759 out_be32(&qe_immrr->iram.idata, be32_to_cpu(code[i]));
761 /* Program the traps for this processor */
762 for (j = 0; j < 16; j++) {
763 u32 trap = be32_to_cpu(ucode->traps[j]);
766 out_be32(&qe_immrr->rsp[i].tibcr[j], trap);
770 out_be32(&qe_immrr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
777 struct qe_firmware_info *qe_get_firmware_info(void)
779 return qe_firmware_uploaded ? &qe_firmware_info : NULL;
782 static int qe_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
787 return cmd_usage(cmdtp);
789 if (strcmp(argv[1], "fw") == 0) {
790 addr = simple_strtoul(argv[2], NULL, 16);
793 printf("Invalid address\n");
798 * If a length was supplied, compare that with the 'length'
803 ulong length = simple_strtoul(argv[3], NULL, 16);
804 struct qe_firmware *firmware = (void *) addr;
806 if (length != be32_to_cpu(firmware->header.length)) {
807 printf("Length mismatch\n");
812 return qe_upload_firmware((const struct qe_firmware *) addr);
815 return cmd_usage(cmdtp);
820 "QUICC Engine commands",
821 "fw <addr> [<length>] - Upload firmware binary at address <addr> to "
823 "\twith optional length <length> verification."