2 * Copyright (C) 2006-2009 Freescale Semiconductor, Inc.
5 * based on source code of Shlomi Gridish
7 * SPDX-License-Identifier: GPL-2.0+
13 #include <linux/errno.h>
15 #include <linux/immap_qe.h>
17 #ifdef CONFIG_ARCH_LS1021A
18 #include <asm/arch/immap_ls102xa.h>
21 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_MMC
25 #define MPC85xx_DEVDISR_QE_DISABLE 0x1
27 qe_map_t *qe_immr = NULL;
29 static qe_snum_t snums[QE_NUM_OF_SNUM];
32 DECLARE_GLOBAL_DATA_PTR;
34 void qe_issue_cmd(uint cmd, uint sbc, u8 mcn, u32 cmd_data)
38 if (cmd == QE_RESET) {
39 out_be32(&qe_immr->cp.cecr,(u32) (cmd | QE_CR_FLG));
41 out_be32(&qe_immr->cp.cecdr, cmd_data);
42 out_be32(&qe_immr->cp.cecr, (sbc | QE_CR_FLG |
43 ((u32) mcn<<QE_CR_PROTOCOL_SHIFT) | cmd));
45 /* Wait for the QE_CR_FLG to clear */
47 cecr = in_be32(&qe_immr->cp.cecr);
48 } while (cecr & QE_CR_FLG);
54 uint qe_muram_alloc(uint size, uint align)
60 align_mask = align - 1;
61 savebase = gd->arch.mp_alloc_base;
63 off = gd->arch.mp_alloc_base & align_mask;
65 gd->arch.mp_alloc_base += (align - off);
67 if ((off = size & align_mask) != 0)
68 size += (align - off);
70 if ((gd->arch.mp_alloc_base + size) >= gd->arch.mp_alloc_top) {
71 gd->arch.mp_alloc_base = savebase;
72 printf("%s: ran out of ram.\n", __FUNCTION__);
75 retloc = gd->arch.mp_alloc_base;
76 gd->arch.mp_alloc_base += size;
78 memset((void *)&qe_immr->muram[retloc], 0, size);
80 __asm__ __volatile__("sync");
86 void *qe_muram_addr(uint offset)
88 return (void *)&qe_immr->muram[offset];
92 static void qe_sdma_init(void)
95 uint sdma_buffer_base;
97 p = (volatile sdma_t *)&qe_immr->sdma;
99 /* All of DMA transaction in bus 1 */
100 out_be32(&p->sdaqr, 0);
101 out_be32(&p->sdaqmr, 0);
103 /* Allocate 2KB temporary buffer for sdma */
104 sdma_buffer_base = qe_muram_alloc(2048, 4096);
105 out_be32(&p->sdwbcr, sdma_buffer_base & QE_SDEBCR_BA_MASK);
107 /* Clear sdma status */
108 out_be32(&p->sdsr, 0x03000000);
110 /* Enable global mode on bus 1, and 2KB buffer size */
111 out_be32(&p->sdmr, QE_SDMR_GLB_1_MSK | (0x3 << QE_SDMR_CEN_SHIFT));
114 /* This table is a list of the serial numbers of the Threads, taken from the
115 * "SNUM Table" chart in the QE Reference Manual. The order is not important,
116 * we just need to know what the SNUMs are for the threads.
118 static u8 thread_snum[] = {
119 /* Evthreads 16-29 are not supported in MPC8309 */
120 #if !defined(CONFIG_MPC8309)
121 0x04, 0x05, 0x0c, 0x0d,
122 0x14, 0x15, 0x1c, 0x1d,
123 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 void qe_init(uint qe_base)
176 /* Init the QE IMMR base */
177 qe_immr = (qe_map_t *)qe_base;
179 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_NOR
181 * Upload microcode to IRAM for those SOCs which do not have ROM in QE.
183 qe_upload_firmware((const void *)CONFIG_SYS_QE_FW_ADDR);
185 /* enable the microcode in IRAM */
186 out_be32(&qe_immr->iram.iready,QE_IRAM_READY);
189 gd->arch.mp_alloc_base = QE_DATAONLY_BASE;
190 gd->arch.mp_alloc_top = gd->arch.mp_alloc_base + QE_DATAONLY_SIZE;
200 qe_immr = (qe_map_t *)(CONFIG_SYS_IMMR + QE_IMMR_OFFSET);
202 void *addr = (void *)CONFIG_SYS_QE_FW_ADDR;
203 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_MMC
204 int dev = CONFIG_SYS_MMC_ENV_DEV;
205 u32 cnt = CONFIG_SYS_QE_FMAN_FW_LENGTH / 512;
206 u32 blk = CONFIG_SYS_QE_FW_ADDR / 512;
208 if (mmc_initialize(gd->bd)) {
209 printf("%s: mmc_initialize() failed\n", __func__);
212 addr = malloc(CONFIG_SYS_QE_FMAN_FW_LENGTH);
213 struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
217 printf("\nMMC cannot find device for ucode\n");
219 printf("\nMMC read: dev # %u, block # %u, count %u ...\n",
222 (void)mmc->block_dev.block_read(&mmc->block_dev, blk, cnt,
226 if (!u_qe_upload_firmware(addr))
227 out_be32(&qe_immr->iram.iready, QE_IRAM_READY);
228 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_MMC
235 void u_qe_resume(void)
239 qe_immrr = (qe_map_t *)(CONFIG_SYS_IMMR + QE_IMMR_OFFSET);
240 u_qe_firmware_resume((const void *)CONFIG_SYS_QE_FW_ADDR, qe_immrr);
241 out_be32(&qe_immrr->iram.iready, QE_IRAM_READY);
247 qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
248 (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0);
252 void qe_assign_page(uint snum, uint para_ram_base)
256 out_be32(&qe_immr->cp.cecdr, para_ram_base);
257 out_be32(&qe_immr->cp.cecr, ((u32) snum<<QE_CR_ASSIGN_PAGE_SNUM_SHIFT)
258 | QE_CR_FLG | QE_ASSIGN_PAGE);
260 /* Wait for the QE_CR_FLG to clear */
262 cecr = in_be32(&qe_immr->cp.cecr);
263 } while (cecr & QE_CR_FLG );
270 * brg: 0~15 as BRG1~BRG16
272 * BRG input clock comes from the BRGCLK (internal clock generated from
273 the QE clock, it is one-half of the QE clock), If need the clock source
274 from CLKn pin, we have te change the function.
277 #define BRG_CLK (gd->arch.brg_clk)
280 int qe_set_brg(uint brg, uint rate)
286 if (brg >= QE_NUM_OF_BRGS)
288 bp = (uint *)&qe_immr->brg.brgc1;
291 divisor = (BRG_CLK / rate);
292 if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
297 *bp = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
298 __asm__ __volatile__("sync");
301 *bp |= QE_BRGC_DIV16;
302 __asm__ __volatile__("sync");
309 /* Set ethernet MII clock master
311 int qe_set_mii_clk_src(int ucc_num)
315 /* check if the UCC number is in range. */
316 if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0)) {
317 printf("%s: ucc num not in ranges\n", __FUNCTION__);
321 cmxgcr = in_be32(&qe_immr->qmx.cmxgcr);
322 cmxgcr &= ~QE_CMXGCR_MII_ENET_MNG_MASK;
323 cmxgcr |= (ucc_num <<QE_CMXGCR_MII_ENET_MNG_SHIFT);
324 out_be32(&qe_immr->qmx.cmxgcr, cmxgcr);
329 /* Firmware information stored here for qe_get_firmware_info() */
330 static struct qe_firmware_info qe_firmware_info;
333 * Set to 1 if QE firmware has been uploaded, and therefore
334 * qe_firmware_info contains valid data.
336 static int qe_firmware_uploaded;
339 * Upload a QE microcode
341 * This function is a worker function for qe_upload_firmware(). It does
342 * the actual uploading of the microcode.
344 static void qe_upload_microcode(const void *base,
345 const struct qe_microcode *ucode)
347 const u32 *code = base + be32_to_cpu(ucode->code_offset);
350 if (ucode->major || ucode->minor || ucode->revision)
351 printf("QE: uploading microcode '%s' version %u.%u.%u\n",
352 (char *)ucode->id, (u16)ucode->major, (u16)ucode->minor,
353 (u16)ucode->revision);
355 printf("QE: uploading microcode '%s'\n", (char *)ucode->id);
357 /* Use auto-increment */
358 out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
359 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
361 for (i = 0; i < be32_to_cpu(ucode->count); i++)
362 out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
366 * Upload a microcode to the I-RAM at a specific address.
368 * See docs/README.qe_firmware for information on QE microcode uploading.
370 * Currently, only version 1 is supported, so the 'version' field must be
373 * The SOC model and revision are not validated, they are only displayed for
374 * informational purposes.
376 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
377 * all of the microcode structures, minus the CRC.
379 * 'length' is the size that the structure says it is, including the CRC.
381 int qe_upload_firmware(const struct qe_firmware *firmware)
386 size_t calc_size = sizeof(struct qe_firmware);
388 const struct qe_header *hdr;
389 #ifdef CONFIG_DEEP_SLEEP
390 #ifdef CONFIG_ARCH_LS1021A
391 struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
393 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
397 printf("Invalid address\n");
401 hdr = &firmware->header;
402 length = be32_to_cpu(hdr->length);
404 /* Check the magic */
405 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
406 (hdr->magic[2] != 'F')) {
407 printf("QE microcode not found\n");
408 #ifdef CONFIG_DEEP_SLEEP
409 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
414 /* Check the version */
415 if (hdr->version != 1) {
416 printf("Unsupported version\n");
420 /* Validate some of the fields */
421 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
422 printf("Invalid data\n");
426 /* Validate the length and check if there's a CRC */
427 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
429 for (i = 0; i < firmware->count; i++)
431 * For situations where the second RISC uses the same microcode
432 * as the first, the 'code_offset' and 'count' fields will be
433 * zero, so it's okay to add those.
435 calc_size += sizeof(u32) *
436 be32_to_cpu(firmware->microcode[i].count);
438 /* Validate the length */
439 if (length != calc_size + sizeof(u32)) {
440 printf("Invalid length\n");
445 * Validate the CRC. We would normally call crc32_no_comp(), but that
446 * function isn't available unless you turn on JFFS support.
448 crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
449 if (crc != (crc32(-1, (const void *) firmware, calc_size) ^ -1)) {
450 printf("Firmware CRC is invalid\n");
455 * If the microcode calls for it, split the I-RAM.
457 if (!firmware->split) {
458 out_be16(&qe_immr->cp.cercr,
459 in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
462 if (firmware->soc.model)
463 printf("Firmware '%s' for %u V%u.%u\n",
464 firmware->id, be16_to_cpu(firmware->soc.model),
465 firmware->soc.major, firmware->soc.minor);
467 printf("Firmware '%s'\n", firmware->id);
470 * The QE only supports one microcode per RISC, so clear out all the
471 * saved microcode information and put in the new.
473 memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
474 strncpy(qe_firmware_info.id, (char *)firmware->id, 62);
475 qe_firmware_info.extended_modes = firmware->extended_modes;
476 memcpy(qe_firmware_info.vtraps, firmware->vtraps,
477 sizeof(firmware->vtraps));
478 qe_firmware_uploaded = 1;
480 /* Loop through each microcode. */
481 for (i = 0; i < firmware->count; i++) {
482 const struct qe_microcode *ucode = &firmware->microcode[i];
484 /* Upload a microcode if it's present */
485 if (ucode->code_offset)
486 qe_upload_microcode(firmware, ucode);
488 /* Program the traps for this processor */
489 for (j = 0; j < 16; j++) {
490 u32 trap = be32_to_cpu(ucode->traps[j]);
493 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
497 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
505 * Upload a microcode to the I-RAM at a specific address.
507 * See docs/README.qe_firmware for information on QE microcode uploading.
509 * Currently, only version 1 is supported, so the 'version' field must be
512 * The SOC model and revision are not validated, they are only displayed for
513 * informational purposes.
515 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
516 * all of the microcode structures, minus the CRC.
518 * 'length' is the size that the structure says it is, including the CRC.
520 int u_qe_upload_firmware(const struct qe_firmware *firmware)
525 size_t calc_size = sizeof(struct qe_firmware);
527 const struct qe_header *hdr;
528 #ifdef CONFIG_DEEP_SLEEP
529 #ifdef CONFIG_ARCH_LS1021A
530 struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
532 ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
536 printf("Invalid address\n");
540 hdr = &firmware->header;
541 length = be32_to_cpu(hdr->length);
543 /* Check the magic */
544 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
545 (hdr->magic[2] != 'F')) {
546 printf("Not a microcode\n");
547 #ifdef CONFIG_DEEP_SLEEP
548 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
553 /* Check the version */
554 if (hdr->version != 1) {
555 printf("Unsupported version\n");
559 /* Validate some of the fields */
560 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
561 printf("Invalid data\n");
565 /* Validate the length and check if there's a CRC */
566 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
568 for (i = 0; i < firmware->count; i++)
570 * For situations where the second RISC uses the same microcode
571 * as the first, the 'code_offset' and 'count' fields will be
572 * zero, so it's okay to add those.
574 calc_size += sizeof(u32) *
575 be32_to_cpu(firmware->microcode[i].count);
577 /* Validate the length */
578 if (length != calc_size + sizeof(u32)) {
579 printf("Invalid length\n");
584 * Validate the CRC. We would normally call crc32_no_comp(), but that
585 * function isn't available unless you turn on JFFS support.
587 crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
588 if (crc != (crc32(-1, (const void *)firmware, calc_size) ^ -1)) {
589 printf("Firmware CRC is invalid\n");
594 * If the microcode calls for it, split the I-RAM.
596 if (!firmware->split) {
597 out_be16(&qe_immr->cp.cercr,
598 in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
601 if (firmware->soc.model)
602 printf("Firmware '%s' for %u V%u.%u\n",
603 firmware->id, be16_to_cpu(firmware->soc.model),
604 firmware->soc.major, firmware->soc.minor);
606 printf("Firmware '%s'\n", firmware->id);
608 /* Loop through each microcode. */
609 for (i = 0; i < firmware->count; i++) {
610 const struct qe_microcode *ucode = &firmware->microcode[i];
612 /* Upload a microcode if it's present */
613 if (ucode->code_offset)
614 qe_upload_microcode(firmware, ucode);
616 /* Program the traps for this processor */
617 for (j = 0; j < 16; j++) {
618 u32 trap = be32_to_cpu(ucode->traps[j]);
621 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
625 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
633 int u_qe_firmware_resume(const struct qe_firmware *firmware, qe_map_t *qe_immrr)
637 const struct qe_header *hdr;
639 #ifdef CONFIG_DEEP_SLEEP
641 ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
643 struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
650 hdr = &firmware->header;
652 /* Check the magic */
653 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
654 (hdr->magic[2] != 'F')) {
655 #ifdef CONFIG_DEEP_SLEEP
656 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
662 * If the microcode calls for it, split the I-RAM.
664 if (!firmware->split) {
665 out_be16(&qe_immrr->cp.cercr,
666 in_be16(&qe_immrr->cp.cercr) | QE_CP_CERCR_CIR);
669 /* Loop through each microcode. */
670 for (i = 0; i < firmware->count; i++) {
671 const struct qe_microcode *ucode = &firmware->microcode[i];
673 /* Upload a microcode if it's present */
674 if (!ucode->code_offset)
677 code = (const void *)firmware + be32_to_cpu(ucode->code_offset);
679 /* Use auto-increment */
680 out_be32(&qe_immrr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
681 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
683 for (i = 0; i < be32_to_cpu(ucode->count); i++)
684 out_be32(&qe_immrr->iram.idata, be32_to_cpu(code[i]));
686 /* Program the traps for this processor */
687 for (j = 0; j < 16; j++) {
688 u32 trap = be32_to_cpu(ucode->traps[j]);
691 out_be32(&qe_immrr->rsp[i].tibcr[j], trap);
695 out_be32(&qe_immrr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
702 struct qe_firmware_info *qe_get_firmware_info(void)
704 return qe_firmware_uploaded ? &qe_firmware_info : NULL;
707 static int qe_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
712 return cmd_usage(cmdtp);
714 if (strcmp(argv[1], "fw") == 0) {
715 addr = simple_strtoul(argv[2], NULL, 16);
718 printf("Invalid address\n");
723 * If a length was supplied, compare that with the 'length'
728 ulong length = simple_strtoul(argv[3], NULL, 16);
729 struct qe_firmware *firmware = (void *) addr;
731 if (length != be32_to_cpu(firmware->header.length)) {
732 printf("Length mismatch\n");
737 return qe_upload_firmware((const struct qe_firmware *) addr);
740 return cmd_usage(cmdtp);
745 "QUICC Engine commands",
746 "fw <addr> [<length>] - Upload firmware binary at address <addr> to "
748 "\twith optional length <length> verification."