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 <asm/global_data.h>
13 #include <linux/errno.h>
15 #include <linux/immap_qe.h>
18 #include <u-boot/crc.h>
20 #ifdef CONFIG_ARCH_LS1021A
21 #include <asm/arch/immap_ls102xa.h>
24 #include <asm/armv8/mmu.h>
25 #include <asm/arch/cpu.h>
28 #define MPC85xx_DEVDISR_QE_DISABLE 0x1
32 static qe_snum_t snums[QE_NUM_OF_SNUM];
35 DECLARE_GLOBAL_DATA_PTR;
37 void qe_issue_cmd(uint cmd, uint sbc, u8 mcn, u32 cmd_data)
41 if (cmd == QE_RESET) {
42 out_be32(&qe_immr->cp.cecr, (u32)(cmd | QE_CR_FLG));
44 out_be32(&qe_immr->cp.cecdr, cmd_data);
45 out_be32(&qe_immr->cp.cecr, (sbc | QE_CR_FLG |
46 ((u32)mcn << QE_CR_PROTOCOL_SHIFT) | cmd));
48 /* Wait for the QE_CR_FLG to clear */
50 cecr = in_be32(&qe_immr->cp.cecr);
51 } while (cecr & QE_CR_FLG);
55 uint qe_muram_alloc(uint size, uint align)
61 align_mask = align - 1;
62 savebase = gd->arch.mp_alloc_base;
64 off = gd->arch.mp_alloc_base & align_mask;
66 gd->arch.mp_alloc_base += (align - off);
68 off = size & align_mask;
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", __func__);
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 = (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 0x04, 0x05, 0x0c, 0x0d,
123 0x14, 0x15, 0x1c, 0x1d,
124 0x24, 0x25, 0x2c, 0x2d,
126 0x88, 0x89, 0x98, 0x99,
127 0xa8, 0xa9, 0xb8, 0xb9,
128 0xc8, 0xc9, 0xd8, 0xd9,
129 0xe8, 0xe9, 0x08, 0x09,
130 0x18, 0x19, 0x28, 0x29,
131 0x38, 0x39, 0x48, 0x49,
132 0x58, 0x59, 0x68, 0x69,
133 0x78, 0x79, 0x80, 0x81
136 static void qe_snums_init(void)
140 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
141 snums[i].state = QE_SNUM_STATE_FREE;
142 snums[i].num = thread_snum[i];
146 int qe_get_snum(void)
151 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
152 if (snums[i].state == QE_SNUM_STATE_FREE) {
153 snums[i].state = QE_SNUM_STATE_USED;
162 void qe_put_snum(u8 snum)
166 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
167 if (snums[i].num == snum) {
168 snums[i].state = QE_SNUM_STATE_FREE;
174 #ifdef CONFIG_TFABOOT
175 void qe_init(uint qe_base)
177 enum boot_src src = get_boot_src();
179 /* Init the QE IMMR base */
180 qe_immr = (qe_map_t *)qe_base;
182 if (src == BOOT_SOURCE_IFC_NOR) {
184 * Upload microcode to IRAM for those SOCs
185 * which do not have ROM in QE.
187 qe_upload_firmware((const void *)(CONFIG_SYS_QE_FW_ADDR +
188 CONFIG_SYS_FSL_IFC_BASE));
190 /* enable the microcode in IRAM */
191 out_be32(&qe_immr->iram.iready, QE_IRAM_READY);
194 gd->arch.mp_alloc_base = QE_DATAONLY_BASE;
195 gd->arch.mp_alloc_top = gd->arch.mp_alloc_base + QE_DATAONLY_SIZE;
201 void qe_init(uint qe_base)
203 /* Init the QE IMMR base */
204 qe_immr = (qe_map_t *)qe_base;
206 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_NOR
208 * Upload microcode to IRAM for those SOCs which do not have ROM in QE.
210 qe_upload_firmware((const void *)CONFIG_SYS_QE_FW_ADDR);
212 /* enable the microcode in IRAM */
213 out_be32(&qe_immr->iram.iready, QE_IRAM_READY);
216 gd->arch.mp_alloc_base = QE_DATAONLY_BASE;
217 gd->arch.mp_alloc_top = gd->arch.mp_alloc_base + QE_DATAONLY_SIZE;
226 #ifdef CONFIG_TFABOOT
229 enum boot_src src = get_boot_src();
231 qe_immr = (qe_map_t *)(CONFIG_SYS_IMMR + QE_IMMR_OFFSET);
233 void *addr = (void *)CONFIG_SYS_QE_FW_ADDR;
235 if (src == BOOT_SOURCE_IFC_NOR)
236 addr = (void *)(CONFIG_SYS_QE_FW_ADDR +
237 CONFIG_SYS_FSL_IFC_BASE);
239 if (src == BOOT_SOURCE_QSPI_NOR)
240 addr = (void *)(CONFIG_SYS_QE_FW_ADDR +
241 CFG_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);
290 printf("\nMMC cannot find device for ucode\n");
292 printf("\nMMC read: dev # %u, block # %u, count %u ...\n",
295 (void)blk_dread(mmc_get_blk_desc(mmc), blk, cnt,
299 if (!u_qe_upload_firmware(addr))
300 out_be32(&qe_immr->iram.iready, QE_IRAM_READY);
301 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_MMC
309 void u_qe_resume(void)
313 qe_immrr = (qe_map_t *)(CONFIG_SYS_IMMR + QE_IMMR_OFFSET);
314 u_qe_firmware_resume((const void *)CONFIG_SYS_QE_FW_ADDR, qe_immrr);
315 out_be32(&qe_immrr->iram.iready, QE_IRAM_READY);
321 qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
322 (u8)QE_CR_PROTOCOL_UNSPECIFIED, 0);
326 void qe_assign_page(uint snum, uint para_ram_base)
330 out_be32(&qe_immr->cp.cecdr, para_ram_base);
331 out_be32(&qe_immr->cp.cecr, ((u32)snum << QE_CR_ASSIGN_PAGE_SNUM_SHIFT)
332 | QE_CR_FLG | QE_ASSIGN_PAGE);
334 /* Wait for the QE_CR_FLG to clear */
336 cecr = in_be32(&qe_immr->cp.cecr);
337 } while (cecr & QE_CR_FLG);
342 * brg: 0~15 as BRG1~BRG16
344 * BRG input clock comes from the BRGCLK (internal clock generated from
345 * the QE clock, it is one-half of the QE clock), If need the clock source
346 * from CLKn pin, we have te change the function.
349 #define BRG_CLK (gd->arch.brg_clk)
352 int qe_set_brg(uint brg, uint rate)
359 if (brg >= QE_NUM_OF_BRGS)
362 bp = (uint *)&qe_immr->brg.brgc1;
365 divisor = (BRG_CLK / rate);
366 if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
374 * *bp = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
375 * __asm__ __volatile__("sync");
378 val = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
380 val |= QE_BRGC_DIV16;
388 /* Set ethernet MII clock master */
389 int qe_set_mii_clk_src(int ucc_num)
393 /* check if the UCC number is in range. */
394 if ((ucc_num > UCC_MAX_NUM - 1) || ucc_num < 0) {
395 printf("%s: ucc num not in ranges\n", __func__);
399 cmxgcr = in_be32(&qe_immr->qmx.cmxgcr);
400 cmxgcr &= ~QE_CMXGCR_MII_ENET_MNG_MASK;
401 cmxgcr |= (ucc_num << QE_CMXGCR_MII_ENET_MNG_SHIFT);
402 out_be32(&qe_immr->qmx.cmxgcr, cmxgcr);
407 /* Firmware information stored here for qe_get_firmware_info() */
408 static struct qe_firmware_info qe_firmware_info;
411 * Set to 1 if QE firmware has been uploaded, and therefore
412 * qe_firmware_info contains valid data.
414 static int qe_firmware_uploaded;
417 * Upload a QE microcode
419 * This function is a worker function for qe_upload_firmware(). It does
420 * the actual uploading of the microcode.
422 static void qe_upload_microcode(const void *base,
423 const struct qe_microcode *ucode)
425 const u32 *code = base + be32_to_cpu(ucode->code_offset);
428 if (ucode->major || ucode->minor || ucode->revision)
429 printf("QE: uploading microcode '%s' version %u.%u.%u\n",
430 (char *)ucode->id, (u16)ucode->major, (u16)ucode->minor,
431 (u16)ucode->revision);
433 printf("QE: uploading microcode '%s'\n", (char *)ucode->id);
435 /* Use auto-increment */
436 out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
437 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
439 for (i = 0; i < be32_to_cpu(ucode->count); i++)
440 out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
444 * Upload a microcode to the I-RAM at a specific address.
446 * See Documentation/powerpc/qe_firmware.rst in the Linux kernel tree for
447 * information on QE microcode uploading.
449 * Currently, only version 1 is supported, so the 'version' field must be
452 * The SOC model and revision are not validated, they are only displayed for
453 * informational purposes.
455 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
456 * all of the microcode structures, minus the CRC.
458 * 'length' is the size that the structure says it is, including the CRC.
460 int qe_upload_firmware(const struct qe_firmware *firmware)
465 size_t calc_size = sizeof(struct qe_firmware);
467 const struct qe_header *hdr;
468 #ifdef CONFIG_DEEP_SLEEP
469 #ifdef CONFIG_ARCH_LS1021A
470 struct ccsr_gur __iomem *gur = (void *)CFG_SYS_FSL_GUTS_ADDR;
472 ccsr_gur_t *gur = (void *)(CFG_SYS_MPC85xx_GUTS_ADDR);
476 printf("Invalid address\n");
480 hdr = &firmware->header;
481 length = be32_to_cpu(hdr->length);
483 /* Check the magic */
484 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
485 (hdr->magic[2] != 'F')) {
486 printf("QE microcode not found\n");
487 #ifdef CONFIG_DEEP_SLEEP
488 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
493 /* Check the version */
494 if (hdr->version != 1) {
495 printf("Unsupported version\n");
499 /* Validate some of the fields */
500 if (firmware->count < 1 || firmware->count > MAX_QE_RISC) {
501 printf("Invalid data\n");
505 /* Validate the length and check if there's a CRC */
506 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
508 for (i = 0; i < firmware->count; i++)
510 * For situations where the second RISC uses the same microcode
511 * as the first, the 'code_offset' and 'count' fields will be
512 * zero, so it's okay to add those.
514 calc_size += sizeof(u32) *
515 be32_to_cpu(firmware->microcode[i].count);
517 /* Validate the length */
518 if (length != calc_size + sizeof(u32)) {
519 printf("Invalid length\n");
524 * Validate the CRC. We would normally call crc32_no_comp(), but that
525 * function isn't available unless you turn on JFFS support.
527 crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
528 if (crc != (crc32(-1, (const void *)firmware, calc_size) ^ -1)) {
529 printf("Firmware CRC is invalid\n");
534 * If the microcode calls for it, split the I-RAM.
536 if (!firmware->split) {
537 out_be16(&qe_immr->cp.cercr,
538 in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
541 if (firmware->soc.model)
542 printf("Firmware '%s' for %u V%u.%u\n",
543 firmware->id, be16_to_cpu(firmware->soc.model),
544 firmware->soc.major, firmware->soc.minor);
546 printf("Firmware '%s'\n", firmware->id);
549 * The QE only supports one microcode per RISC, so clear out all the
550 * saved microcode information and put in the new.
552 memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
553 strncpy(qe_firmware_info.id, (char *)firmware->id, 62);
554 qe_firmware_info.extended_modes = firmware->extended_modes;
555 memcpy(qe_firmware_info.vtraps, firmware->vtraps,
556 sizeof(firmware->vtraps));
557 qe_firmware_uploaded = 1;
559 /* Loop through each microcode. */
560 for (i = 0; i < firmware->count; i++) {
561 const struct qe_microcode *ucode = &firmware->microcode[i];
563 /* Upload a microcode if it's present */
564 if (ucode->code_offset)
565 qe_upload_microcode(firmware, ucode);
567 /* Program the traps for this processor */
568 for (j = 0; j < 16; j++) {
569 u32 trap = be32_to_cpu(ucode->traps[j]);
572 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
576 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
584 * Upload a microcode to the I-RAM at a specific address.
586 * See Documentation/powerpc/qe_firmware.rst in the Linux kernel tree for
587 * information on QE microcode uploading.
589 * Currently, only version 1 is supported, so the 'version' field must be
592 * The SOC model and revision are not validated, they are only displayed for
593 * informational purposes.
595 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
596 * all of the microcode structures, minus the CRC.
598 * 'length' is the size that the structure says it is, including the CRC.
600 int u_qe_upload_firmware(const struct qe_firmware *firmware)
605 size_t calc_size = sizeof(struct qe_firmware);
607 const struct qe_header *hdr;
608 #ifdef CONFIG_DEEP_SLEEP
609 #ifdef CONFIG_ARCH_LS1021A
610 struct ccsr_gur __iomem *gur = (void *)CFG_SYS_FSL_GUTS_ADDR;
612 ccsr_gur_t __iomem *gur = (void *)(CFG_SYS_MPC85xx_GUTS_ADDR);
616 printf("Invalid address\n");
620 hdr = &firmware->header;
621 length = be32_to_cpu(hdr->length);
623 /* Check the magic */
624 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
625 (hdr->magic[2] != 'F')) {
626 printf("Not a microcode\n");
627 #ifdef CONFIG_DEEP_SLEEP
628 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
633 /* Check the version */
634 if (hdr->version != 1) {
635 printf("Unsupported version\n");
639 /* Validate some of the fields */
640 if (firmware->count < 1 || firmware->count > MAX_QE_RISC) {
641 printf("Invalid data\n");
645 /* Validate the length and check if there's a CRC */
646 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
648 for (i = 0; i < firmware->count; i++)
650 * For situations where the second RISC uses the same microcode
651 * as the first, the 'code_offset' and 'count' fields will be
652 * zero, so it's okay to add those.
654 calc_size += sizeof(u32) *
655 be32_to_cpu(firmware->microcode[i].count);
657 /* Validate the length */
658 if (length != calc_size + sizeof(u32)) {
659 printf("Invalid length\n");
664 * Validate the CRC. We would normally call crc32_no_comp(), but that
665 * function isn't available unless you turn on JFFS support.
667 crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
668 if (crc != (crc32(-1, (const void *)firmware, calc_size) ^ -1)) {
669 printf("Firmware CRC is invalid\n");
674 * If the microcode calls for it, split the I-RAM.
676 if (!firmware->split) {
677 out_be16(&qe_immr->cp.cercr,
678 in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
681 if (firmware->soc.model)
682 printf("Firmware '%s' for %u V%u.%u\n",
683 firmware->id, be16_to_cpu(firmware->soc.model),
684 firmware->soc.major, firmware->soc.minor);
686 printf("Firmware '%s'\n", firmware->id);
688 /* Loop through each microcode. */
689 for (i = 0; i < firmware->count; i++) {
690 const struct qe_microcode *ucode = &firmware->microcode[i];
692 /* Upload a microcode if it's present */
693 if (ucode->code_offset)
694 qe_upload_microcode(firmware, ucode);
696 /* Program the traps for this processor */
697 for (j = 0; j < 16; j++) {
698 u32 trap = be32_to_cpu(ucode->traps[j]);
701 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
705 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
713 int u_qe_firmware_resume(const struct qe_firmware *firmware, qe_map_t *qe_immrr)
717 const struct qe_header *hdr;
719 #ifdef CONFIG_DEEP_SLEEP
721 ccsr_gur_t __iomem *gur = (void *)(CFG_SYS_MPC85xx_GUTS_ADDR);
723 struct ccsr_gur __iomem *gur = (void *)CFG_SYS_FSL_GUTS_ADDR;
730 hdr = &firmware->header;
732 /* Check the magic */
733 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
734 (hdr->magic[2] != 'F')) {
735 #ifdef CONFIG_DEEP_SLEEP
736 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
742 * If the microcode calls for it, split the I-RAM.
744 if (!firmware->split) {
745 out_be16(&qe_immrr->cp.cercr,
746 in_be16(&qe_immrr->cp.cercr) | QE_CP_CERCR_CIR);
749 /* Loop through each microcode. */
750 for (i = 0; i < firmware->count; i++) {
751 const struct qe_microcode *ucode = &firmware->microcode[i];
753 /* Upload a microcode if it's present */
754 if (!ucode->code_offset)
757 code = (const void *)firmware + be32_to_cpu(ucode->code_offset);
759 /* Use auto-increment */
760 out_be32(&qe_immrr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
761 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
763 for (i = 0; i < be32_to_cpu(ucode->count); i++)
764 out_be32(&qe_immrr->iram.idata, be32_to_cpu(code[i]));
766 /* Program the traps for this processor */
767 for (j = 0; j < 16; j++) {
768 u32 trap = be32_to_cpu(ucode->traps[j]);
771 out_be32(&qe_immrr->rsp[i].tibcr[j], trap);
775 out_be32(&qe_immrr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
782 struct qe_firmware_info *qe_get_firmware_info(void)
784 return qe_firmware_uploaded ? &qe_firmware_info : NULL;
787 static int qe_cmd(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
792 return cmd_usage(cmdtp);
794 if (strcmp(argv[1], "fw") == 0) {
795 addr = hextoul(argv[2], NULL);
798 printf("Invalid address\n");
803 * If a length was supplied, compare that with the 'length'
808 ulong length = hextoul(argv[3], NULL);
809 struct qe_firmware *firmware = (void *)addr;
811 if (length != be32_to_cpu(firmware->header.length)) {
812 printf("Length mismatch\n");
817 return qe_upload_firmware((const struct qe_firmware *)addr);
820 return cmd_usage(cmdtp);
825 "QUICC Engine commands",
826 "fw <addr> [<length>] - Upload firmware binary at address <addr> to the QE,\n"
827 "\twith optional length <length> verification."