2 * Copyright (C) 2006-2009 Freescale Semiconductor, Inc.
5 * based on source code of Shlomi Gridish
7 * SPDX-License-Identifier: GPL-2.0+
12 #include "asm/errno.h"
14 #include "linux/immap_qe.h"
17 #include <asm/arch/immap_ls102xa.h>
20 #define MPC85xx_DEVDISR_QE_DISABLE 0x1
22 qe_map_t *qe_immr = NULL;
24 static qe_snum_t snums[QE_NUM_OF_SNUM];
27 DECLARE_GLOBAL_DATA_PTR;
29 void qe_issue_cmd(uint cmd, uint sbc, u8 mcn, u32 cmd_data)
33 if (cmd == QE_RESET) {
34 out_be32(&qe_immr->cp.cecr,(u32) (cmd | QE_CR_FLG));
36 out_be32(&qe_immr->cp.cecdr, cmd_data);
37 out_be32(&qe_immr->cp.cecr, (sbc | QE_CR_FLG |
38 ((u32) mcn<<QE_CR_PROTOCOL_SHIFT) | cmd));
40 /* Wait for the QE_CR_FLG to clear */
42 cecr = in_be32(&qe_immr->cp.cecr);
43 } while (cecr & QE_CR_FLG);
49 uint qe_muram_alloc(uint size, uint align)
55 align_mask = align - 1;
56 savebase = gd->arch.mp_alloc_base;
58 off = gd->arch.mp_alloc_base & align_mask;
60 gd->arch.mp_alloc_base += (align - off);
62 if ((off = size & align_mask) != 0)
63 size += (align - off);
65 if ((gd->arch.mp_alloc_base + size) >= gd->arch.mp_alloc_top) {
66 gd->arch.mp_alloc_base = savebase;
67 printf("%s: ran out of ram.\n", __FUNCTION__);
70 retloc = gd->arch.mp_alloc_base;
71 gd->arch.mp_alloc_base += size;
73 memset((void *)&qe_immr->muram[retloc], 0, size);
75 __asm__ __volatile__("sync");
81 void *qe_muram_addr(uint offset)
83 return (void *)&qe_immr->muram[offset];
87 static void qe_sdma_init(void)
90 uint sdma_buffer_base;
92 p = (volatile sdma_t *)&qe_immr->sdma;
94 /* All of DMA transaction in bus 1 */
95 out_be32(&p->sdaqr, 0);
96 out_be32(&p->sdaqmr, 0);
98 /* Allocate 2KB temporary buffer for sdma */
99 sdma_buffer_base = qe_muram_alloc(2048, 4096);
100 out_be32(&p->sdwbcr, sdma_buffer_base & QE_SDEBCR_BA_MASK);
102 /* Clear sdma status */
103 out_be32(&p->sdsr, 0x03000000);
105 /* Enable global mode on bus 1, and 2KB buffer size */
106 out_be32(&p->sdmr, QE_SDMR_GLB_1_MSK | (0x3 << QE_SDMR_CEN_SHIFT));
109 /* This table is a list of the serial numbers of the Threads, taken from the
110 * "SNUM Table" chart in the QE Reference Manual. The order is not important,
111 * we just need to know what the SNUMs are for the threads.
113 static u8 thread_snum[] = {
114 /* Evthreads 16-29 are not supported in MPC8309 */
115 #if !defined(CONFIG_MPC8309)
116 0x04, 0x05, 0x0c, 0x0d,
117 0x14, 0x15, 0x1c, 0x1d,
118 0x24, 0x25, 0x2c, 0x2d,
121 0x88, 0x89, 0x98, 0x99,
122 0xa8, 0xa9, 0xb8, 0xb9,
123 0xc8, 0xc9, 0xd8, 0xd9,
124 0xe8, 0xe9, 0x08, 0x09,
125 0x18, 0x19, 0x28, 0x29,
126 0x38, 0x39, 0x48, 0x49,
127 0x58, 0x59, 0x68, 0x69,
128 0x78, 0x79, 0x80, 0x81
131 static void qe_snums_init(void)
135 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
136 snums[i].state = QE_SNUM_STATE_FREE;
137 snums[i].num = thread_snum[i];
141 int qe_get_snum(void)
146 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
147 if (snums[i].state == QE_SNUM_STATE_FREE) {
148 snums[i].state = QE_SNUM_STATE_USED;
157 void qe_put_snum(u8 snum)
161 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
162 if (snums[i].num == snum) {
163 snums[i].state = QE_SNUM_STATE_FREE;
169 void qe_init(uint qe_base)
171 /* Init the QE IMMR base */
172 qe_immr = (qe_map_t *)qe_base;
174 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_NOR
176 * Upload microcode to IRAM for those SOCs which do not have ROM in QE.
178 qe_upload_firmware((const void *)CONFIG_SYS_QE_FW_ADDR);
180 /* enable the microcode in IRAM */
181 out_be32(&qe_immr->iram.iready,QE_IRAM_READY);
184 gd->arch.mp_alloc_base = QE_DATAONLY_BASE;
185 gd->arch.mp_alloc_top = gd->arch.mp_alloc_base + QE_DATAONLY_SIZE;
195 qe_immr = (qe_map_t *)(CONFIG_SYS_IMMR + QE_IMMR_OFFSET);
197 u_qe_upload_firmware((const void *)CONFIG_SYS_QE_FW_ADDR);
198 out_be32(&qe_immr->iram.iready, QE_IRAM_READY);
203 void u_qe_resume(void)
207 qe_immrr = (qe_map_t *)(CONFIG_SYS_IMMR + QE_IMMR_OFFSET);
208 u_qe_firmware_resume((const void *)CONFIG_SYS_QE_FW_ADDR, qe_immrr);
209 out_be32(&qe_immrr->iram.iready, QE_IRAM_READY);
215 qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
216 (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0);
220 void qe_assign_page(uint snum, uint para_ram_base)
224 out_be32(&qe_immr->cp.cecdr, para_ram_base);
225 out_be32(&qe_immr->cp.cecr, ((u32) snum<<QE_CR_ASSIGN_PAGE_SNUM_SHIFT)
226 | QE_CR_FLG | QE_ASSIGN_PAGE);
228 /* Wait for the QE_CR_FLG to clear */
230 cecr = in_be32(&qe_immr->cp.cecr);
231 } while (cecr & QE_CR_FLG );
238 * brg: 0~15 as BRG1~BRG16
240 * BRG input clock comes from the BRGCLK (internal clock generated from
241 the QE clock, it is one-half of the QE clock), If need the clock source
242 from CLKn pin, we have te change the function.
245 #define BRG_CLK (gd->arch.brg_clk)
248 int qe_set_brg(uint brg, uint rate)
254 if (brg >= QE_NUM_OF_BRGS)
256 bp = (uint *)&qe_immr->brg.brgc1;
259 divisor = (BRG_CLK / rate);
260 if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
265 *bp = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
266 __asm__ __volatile__("sync");
269 *bp |= QE_BRGC_DIV16;
270 __asm__ __volatile__("sync");
277 /* Set ethernet MII clock master
279 int qe_set_mii_clk_src(int ucc_num)
283 /* check if the UCC number is in range. */
284 if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0)) {
285 printf("%s: ucc num not in ranges\n", __FUNCTION__);
289 cmxgcr = in_be32(&qe_immr->qmx.cmxgcr);
290 cmxgcr &= ~QE_CMXGCR_MII_ENET_MNG_MASK;
291 cmxgcr |= (ucc_num <<QE_CMXGCR_MII_ENET_MNG_SHIFT);
292 out_be32(&qe_immr->qmx.cmxgcr, cmxgcr);
297 /* Firmware information stored here for qe_get_firmware_info() */
298 static struct qe_firmware_info qe_firmware_info;
301 * Set to 1 if QE firmware has been uploaded, and therefore
302 * qe_firmware_info contains valid data.
304 static int qe_firmware_uploaded;
307 * Upload a QE microcode
309 * This function is a worker function for qe_upload_firmware(). It does
310 * the actual uploading of the microcode.
312 static void qe_upload_microcode(const void *base,
313 const struct qe_microcode *ucode)
315 const u32 *code = base + be32_to_cpu(ucode->code_offset);
318 if (ucode->major || ucode->minor || ucode->revision)
319 printf("QE: uploading microcode '%s' version %u.%u.%u\n",
320 (char *)ucode->id, (u16)ucode->major, (u16)ucode->minor,
321 (u16)ucode->revision);
323 printf("QE: uploading microcode '%s'\n", (char *)ucode->id);
325 /* Use auto-increment */
326 out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
327 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
329 for (i = 0; i < be32_to_cpu(ucode->count); i++)
330 out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
334 * Upload a microcode to the I-RAM at a specific address.
336 * See docs/README.qe_firmware for information on QE microcode uploading.
338 * Currently, only version 1 is supported, so the 'version' field must be
341 * The SOC model and revision are not validated, they are only displayed for
342 * informational purposes.
344 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
345 * all of the microcode structures, minus the CRC.
347 * 'length' is the size that the structure says it is, including the CRC.
349 int qe_upload_firmware(const struct qe_firmware *firmware)
354 size_t calc_size = sizeof(struct qe_firmware);
356 const struct qe_header *hdr;
357 #ifdef CONFIG_DEEP_SLEEP
358 #ifdef CONFIG_LS102XA
359 struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
361 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
365 printf("Invalid address\n");
369 hdr = &firmware->header;
370 length = be32_to_cpu(hdr->length);
372 /* Check the magic */
373 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
374 (hdr->magic[2] != 'F')) {
375 printf("QE microcode not found\n");
376 #ifdef CONFIG_DEEP_SLEEP
377 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
382 /* Check the version */
383 if (hdr->version != 1) {
384 printf("Unsupported version\n");
388 /* Validate some of the fields */
389 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
390 printf("Invalid data\n");
394 /* Validate the length and check if there's a CRC */
395 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
397 for (i = 0; i < firmware->count; i++)
399 * For situations where the second RISC uses the same microcode
400 * as the first, the 'code_offset' and 'count' fields will be
401 * zero, so it's okay to add those.
403 calc_size += sizeof(u32) *
404 be32_to_cpu(firmware->microcode[i].count);
406 /* Validate the length */
407 if (length != calc_size + sizeof(u32)) {
408 printf("Invalid length\n");
413 * Validate the CRC. We would normally call crc32_no_comp(), but that
414 * function isn't available unless you turn on JFFS support.
416 crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
417 if (crc != (crc32(-1, (const void *) firmware, calc_size) ^ -1)) {
418 printf("Firmware CRC is invalid\n");
423 * If the microcode calls for it, split the I-RAM.
425 if (!firmware->split) {
426 out_be16(&qe_immr->cp.cercr,
427 in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
430 if (firmware->soc.model)
431 printf("Firmware '%s' for %u V%u.%u\n",
432 firmware->id, be16_to_cpu(firmware->soc.model),
433 firmware->soc.major, firmware->soc.minor);
435 printf("Firmware '%s'\n", firmware->id);
438 * The QE only supports one microcode per RISC, so clear out all the
439 * saved microcode information and put in the new.
441 memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
442 strncpy(qe_firmware_info.id, (char *)firmware->id, 62);
443 qe_firmware_info.extended_modes = firmware->extended_modes;
444 memcpy(qe_firmware_info.vtraps, firmware->vtraps,
445 sizeof(firmware->vtraps));
446 qe_firmware_uploaded = 1;
448 /* Loop through each microcode. */
449 for (i = 0; i < firmware->count; i++) {
450 const struct qe_microcode *ucode = &firmware->microcode[i];
452 /* Upload a microcode if it's present */
453 if (ucode->code_offset)
454 qe_upload_microcode(firmware, ucode);
456 /* Program the traps for this processor */
457 for (j = 0; j < 16; j++) {
458 u32 trap = be32_to_cpu(ucode->traps[j]);
461 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
465 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
473 * Upload a microcode to the I-RAM at a specific address.
475 * See docs/README.qe_firmware for information on QE microcode uploading.
477 * Currently, only version 1 is supported, so the 'version' field must be
480 * The SOC model and revision are not validated, they are only displayed for
481 * informational purposes.
483 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
484 * all of the microcode structures, minus the CRC.
486 * 'length' is the size that the structure says it is, including the CRC.
488 int u_qe_upload_firmware(const struct qe_firmware *firmware)
493 size_t calc_size = sizeof(struct qe_firmware);
495 const struct qe_header *hdr;
496 #ifdef CONFIG_DEEP_SLEEP
497 #ifdef CONFIG_LS102XA
498 struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
500 ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
504 printf("Invalid address\n");
508 hdr = &firmware->header;
509 length = be32_to_cpu(hdr->length);
511 /* Check the magic */
512 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
513 (hdr->magic[2] != 'F')) {
514 printf("Not a microcode\n");
515 #ifdef CONFIG_DEEP_SLEEP
516 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
521 /* Check the version */
522 if (hdr->version != 1) {
523 printf("Unsupported version\n");
527 /* Validate some of the fields */
528 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
529 printf("Invalid data\n");
533 /* Validate the length and check if there's a CRC */
534 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
536 for (i = 0; i < firmware->count; i++)
538 * For situations where the second RISC uses the same microcode
539 * as the first, the 'code_offset' and 'count' fields will be
540 * zero, so it's okay to add those.
542 calc_size += sizeof(u32) *
543 be32_to_cpu(firmware->microcode[i].count);
545 /* Validate the length */
546 if (length != calc_size + sizeof(u32)) {
547 printf("Invalid length\n");
552 * Validate the CRC. We would normally call crc32_no_comp(), but that
553 * function isn't available unless you turn on JFFS support.
555 crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
556 if (crc != (crc32(-1, (const void *)firmware, calc_size) ^ -1)) {
557 printf("Firmware CRC is invalid\n");
562 * If the microcode calls for it, split the I-RAM.
564 if (!firmware->split) {
565 out_be16(&qe_immr->cp.cercr,
566 in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
569 if (firmware->soc.model)
570 printf("Firmware '%s' for %u V%u.%u\n",
571 firmware->id, be16_to_cpu(firmware->soc.model),
572 firmware->soc.major, firmware->soc.minor);
574 printf("Firmware '%s'\n", firmware->id);
576 /* Loop through each microcode. */
577 for (i = 0; i < firmware->count; i++) {
578 const struct qe_microcode *ucode = &firmware->microcode[i];
580 /* Upload a microcode if it's present */
581 if (ucode->code_offset)
582 qe_upload_microcode(firmware, ucode);
584 /* Program the traps for this processor */
585 for (j = 0; j < 16; j++) {
586 u32 trap = be32_to_cpu(ucode->traps[j]);
589 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
593 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
601 int u_qe_firmware_resume(const struct qe_firmware *firmware, qe_map_t *qe_immrr)
605 const struct qe_header *hdr;
607 #ifdef CONFIG_DEEP_SLEEP
609 ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
611 struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
618 hdr = &firmware->header;
620 /* Check the magic */
621 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
622 (hdr->magic[2] != 'F')) {
623 #ifdef CONFIG_DEEP_SLEEP
624 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
630 * If the microcode calls for it, split the I-RAM.
632 if (!firmware->split) {
633 out_be16(&qe_immrr->cp.cercr,
634 in_be16(&qe_immrr->cp.cercr) | QE_CP_CERCR_CIR);
637 /* Loop through each microcode. */
638 for (i = 0; i < firmware->count; i++) {
639 const struct qe_microcode *ucode = &firmware->microcode[i];
641 /* Upload a microcode if it's present */
642 if (!ucode->code_offset)
645 code = (const void *)firmware + be32_to_cpu(ucode->code_offset);
647 /* Use auto-increment */
648 out_be32(&qe_immrr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
649 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
651 for (i = 0; i < be32_to_cpu(ucode->count); i++)
652 out_be32(&qe_immrr->iram.idata, be32_to_cpu(code[i]));
654 /* Program the traps for this processor */
655 for (j = 0; j < 16; j++) {
656 u32 trap = be32_to_cpu(ucode->traps[j]);
659 out_be32(&qe_immrr->rsp[i].tibcr[j], trap);
663 out_be32(&qe_immrr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
670 struct qe_firmware_info *qe_get_firmware_info(void)
672 return qe_firmware_uploaded ? &qe_firmware_info : NULL;
675 static int qe_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
680 return cmd_usage(cmdtp);
682 if (strcmp(argv[1], "fw") == 0) {
683 addr = simple_strtoul(argv[2], NULL, 16);
686 printf("Invalid address\n");
691 * If a length was supplied, compare that with the 'length'
696 ulong length = simple_strtoul(argv[3], NULL, 16);
697 struct qe_firmware *firmware = (void *) addr;
699 if (length != be32_to_cpu(firmware->header.length)) {
700 printf("Length mismatch\n");
705 return qe_upload_firmware((const struct qe_firmware *) addr);
708 return cmd_usage(cmdtp);
713 "QUICC Engine commands",
714 "fw <addr> [<length>] - Upload firmware binary at address <addr> to "
716 "\twith optional length <length> verification."