1 /* 2 * Copyright (C) 2006-2009 Freescale Semiconductor, Inc. 3 * 4 * Dave Liu <daveliu@freescale.com> 5 * based on source code of Shlomi Gridish 6 * 7 * SPDX-License-Identifier: GPL-2.0+ 8 */ 9 10 #include <common.h> 11 #include <malloc.h> 12 #include <command.h> 13 #include <linux/errno.h> 14 #include <asm/io.h> 15 #include <linux/immap_qe.h> 16 #include <fsl_qe.h> 17 #ifdef CONFIG_ARCH_LS1021A 18 #include <asm/arch/immap_ls102xa.h> 19 #endif 20 21 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_MMC 22 #include <mmc.h> 23 #endif 24 25 #define MPC85xx_DEVDISR_QE_DISABLE 0x1 26 27 qe_map_t *qe_immr = NULL; 28 #ifdef CONFIG_QE 29 static qe_snum_t snums[QE_NUM_OF_SNUM]; 30 #endif 31 32 DECLARE_GLOBAL_DATA_PTR; 33 34 void qe_issue_cmd(uint cmd, uint sbc, u8 mcn, u32 cmd_data) 35 { 36 u32 cecr; 37 38 if (cmd == QE_RESET) { 39 out_be32(&qe_immr->cp.cecr,(u32) (cmd | QE_CR_FLG)); 40 } else { 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)); 44 } 45 /* Wait for the QE_CR_FLG to clear */ 46 do { 47 cecr = in_be32(&qe_immr->cp.cecr); 48 } while (cecr & QE_CR_FLG); 49 50 return; 51 } 52 53 #ifdef CONFIG_QE 54 uint qe_muram_alloc(uint size, uint align) 55 { 56 uint retloc; 57 uint align_mask, off; 58 uint savebase; 59 60 align_mask = align - 1; 61 savebase = gd->arch.mp_alloc_base; 62 63 off = gd->arch.mp_alloc_base & align_mask; 64 if (off != 0) 65 gd->arch.mp_alloc_base += (align - off); 66 67 if ((off = size & align_mask) != 0) 68 size += (align - off); 69 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__); 73 } 74 75 retloc = gd->arch.mp_alloc_base; 76 gd->arch.mp_alloc_base += size; 77 78 memset((void *)&qe_immr->muram[retloc], 0, size); 79 80 __asm__ __volatile__("sync"); 81 82 return retloc; 83 } 84 #endif 85 86 void *qe_muram_addr(uint offset) 87 { 88 return (void *)&qe_immr->muram[offset]; 89 } 90 91 #ifdef CONFIG_QE 92 static void qe_sdma_init(void) 93 { 94 volatile sdma_t *p; 95 uint sdma_buffer_base; 96 97 p = (volatile sdma_t *)&qe_immr->sdma; 98 99 /* All of DMA transaction in bus 1 */ 100 out_be32(&p->sdaqr, 0); 101 out_be32(&p->sdaqmr, 0); 102 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); 106 107 /* Clear sdma status */ 108 out_be32(&p->sdsr, 0x03000000); 109 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)); 112 } 113 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. 117 */ 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, 124 0x34, 0x35, 125 #endif 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 134 }; 135 136 static void qe_snums_init(void) 137 { 138 int i; 139 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]; 143 } 144 } 145 146 int qe_get_snum(void) 147 { 148 int snum = -EBUSY; 149 int i; 150 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; 154 snum = snums[i].num; 155 break; 156 } 157 } 158 159 return snum; 160 } 161 162 void qe_put_snum(u8 snum) 163 { 164 int i; 165 166 for (i = 0; i < QE_NUM_OF_SNUM; i++) { 167 if (snums[i].num == snum) { 168 snums[i].state = QE_SNUM_STATE_FREE; 169 break; 170 } 171 } 172 } 173 174 void qe_init(uint qe_base) 175 { 176 /* Init the QE IMMR base */ 177 qe_immr = (qe_map_t *)qe_base; 178 179 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_NOR 180 /* 181 * Upload microcode to IRAM for those SOCs which do not have ROM in QE. 182 */ 183 qe_upload_firmware((const void *)CONFIG_SYS_QE_FW_ADDR); 184 185 /* enable the microcode in IRAM */ 186 out_be32(&qe_immr->iram.iready,QE_IRAM_READY); 187 #endif 188 189 gd->arch.mp_alloc_base = QE_DATAONLY_BASE; 190 gd->arch.mp_alloc_top = gd->arch.mp_alloc_base + QE_DATAONLY_SIZE; 191 192 qe_sdma_init(); 193 qe_snums_init(); 194 } 195 #endif 196 197 #ifdef CONFIG_U_QE 198 void u_qe_init(void) 199 { 200 qe_immr = (qe_map_t *)(CONFIG_SYS_IMMR + QE_IMMR_OFFSET); 201 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; 207 208 if (mmc_initialize(gd->bd)) { 209 printf("%s: mmc_initialize() failed\n", __func__); 210 return; 211 } 212 addr = malloc(CONFIG_SYS_QE_FMAN_FW_LENGTH); 213 struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV); 214 215 if (!mmc) { 216 free(addr); 217 printf("\nMMC cannot find device for ucode\n"); 218 } else { 219 printf("\nMMC read: dev # %u, block # %u, count %u ...\n", 220 dev, blk, cnt); 221 mmc_init(mmc); 222 (void)mmc->block_dev.block_read(&mmc->block_dev, blk, cnt, 223 addr); 224 } 225 #endif 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 229 free(addr); 230 #endif 231 } 232 #endif 233 234 #ifdef CONFIG_U_QE 235 void u_qe_resume(void) 236 { 237 qe_map_t *qe_immrr; 238 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); 242 } 243 #endif 244 245 void qe_reset(void) 246 { 247 qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID, 248 (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0); 249 } 250 251 #ifdef CONFIG_QE 252 void qe_assign_page(uint snum, uint para_ram_base) 253 { 254 u32 cecr; 255 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); 259 260 /* Wait for the QE_CR_FLG to clear */ 261 do { 262 cecr = in_be32(&qe_immr->cp.cecr); 263 } while (cecr & QE_CR_FLG ); 264 265 return; 266 } 267 #endif 268 269 /* 270 * brg: 0~15 as BRG1~BRG16 271 rate: baud rate 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. 275 */ 276 277 #define BRG_CLK (gd->arch.brg_clk) 278 279 #ifdef CONFIG_QE 280 int qe_set_brg(uint brg, uint rate) 281 { 282 volatile uint *bp; 283 u32 divisor; 284 int div16 = 0; 285 286 if (brg >= QE_NUM_OF_BRGS) 287 return -EINVAL; 288 bp = (uint *)&qe_immr->brg.brgc1; 289 bp += brg; 290 291 divisor = (BRG_CLK / rate); 292 if (divisor > QE_BRGC_DIVISOR_MAX + 1) { 293 div16 = 1; 294 divisor /= 16; 295 } 296 297 *bp = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE; 298 __asm__ __volatile__("sync"); 299 300 if (div16) { 301 *bp |= QE_BRGC_DIV16; 302 __asm__ __volatile__("sync"); 303 } 304 305 return 0; 306 } 307 #endif 308 309 /* Set ethernet MII clock master 310 */ 311 int qe_set_mii_clk_src(int ucc_num) 312 { 313 u32 cmxgcr; 314 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__); 318 return -EINVAL; 319 } 320 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); 325 326 return 0; 327 } 328 329 /* Firmware information stored here for qe_get_firmware_info() */ 330 static struct qe_firmware_info qe_firmware_info; 331 332 /* 333 * Set to 1 if QE firmware has been uploaded, and therefore 334 * qe_firmware_info contains valid data. 335 */ 336 static int qe_firmware_uploaded; 337 338 /* 339 * Upload a QE microcode 340 * 341 * This function is a worker function for qe_upload_firmware(). It does 342 * the actual uploading of the microcode. 343 */ 344 static void qe_upload_microcode(const void *base, 345 const struct qe_microcode *ucode) 346 { 347 const u32 *code = base + be32_to_cpu(ucode->code_offset); 348 unsigned int i; 349 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); 354 else 355 printf("QE: uploading microcode '%s'\n", (char *)ucode->id); 356 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); 360 361 for (i = 0; i < be32_to_cpu(ucode->count); i++) 362 out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i])); 363 } 364 365 /* 366 * Upload a microcode to the I-RAM at a specific address. 367 * 368 * See docs/README.qe_firmware for information on QE microcode uploading. 369 * 370 * Currently, only version 1 is supported, so the 'version' field must be 371 * set to 1. 372 * 373 * The SOC model and revision are not validated, they are only displayed for 374 * informational purposes. 375 * 376 * 'calc_size' is the calculated size, in bytes, of the firmware structure and 377 * all of the microcode structures, minus the CRC. 378 * 379 * 'length' is the size that the structure says it is, including the CRC. 380 */ 381 int qe_upload_firmware(const struct qe_firmware *firmware) 382 { 383 unsigned int i; 384 unsigned int j; 385 u32 crc; 386 size_t calc_size = sizeof(struct qe_firmware); 387 size_t length; 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; 392 #else 393 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 394 #endif 395 #endif 396 if (!firmware) { 397 printf("Invalid address\n"); 398 return -EINVAL; 399 } 400 401 hdr = &firmware->header; 402 length = be32_to_cpu(hdr->length); 403 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); 410 #endif 411 return -EPERM; 412 } 413 414 /* Check the version */ 415 if (hdr->version != 1) { 416 printf("Unsupported version\n"); 417 return -EPERM; 418 } 419 420 /* Validate some of the fields */ 421 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) { 422 printf("Invalid data\n"); 423 return -EINVAL; 424 } 425 426 /* Validate the length and check if there's a CRC */ 427 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode); 428 429 for (i = 0; i < firmware->count; i++) 430 /* 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. 434 */ 435 calc_size += sizeof(u32) * 436 be32_to_cpu(firmware->microcode[i].count); 437 438 /* Validate the length */ 439 if (length != calc_size + sizeof(u32)) { 440 printf("Invalid length\n"); 441 return -EPERM; 442 } 443 444 /* 445 * Validate the CRC. We would normally call crc32_no_comp(), but that 446 * function isn't available unless you turn on JFFS support. 447 */ 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"); 451 return -EIO; 452 } 453 454 /* 455 * If the microcode calls for it, split the I-RAM. 456 */ 457 if (!firmware->split) { 458 out_be16(&qe_immr->cp.cercr, 459 in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR); 460 } 461 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); 466 else 467 printf("Firmware '%s'\n", firmware->id); 468 469 /* 470 * The QE only supports one microcode per RISC, so clear out all the 471 * saved microcode information and put in the new. 472 */ 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; 479 480 /* Loop through each microcode. */ 481 for (i = 0; i < firmware->count; i++) { 482 const struct qe_microcode *ucode = &firmware->microcode[i]; 483 484 /* Upload a microcode if it's present */ 485 if (ucode->code_offset) 486 qe_upload_microcode(firmware, ucode); 487 488 /* Program the traps for this processor */ 489 for (j = 0; j < 16; j++) { 490 u32 trap = be32_to_cpu(ucode->traps[j]); 491 492 if (trap) 493 out_be32(&qe_immr->rsp[i].tibcr[j], trap); 494 } 495 496 /* Enable traps */ 497 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr)); 498 } 499 500 return 0; 501 } 502 503 #ifdef CONFIG_U_QE 504 /* 505 * Upload a microcode to the I-RAM at a specific address. 506 * 507 * See docs/README.qe_firmware for information on QE microcode uploading. 508 * 509 * Currently, only version 1 is supported, so the 'version' field must be 510 * set to 1. 511 * 512 * The SOC model and revision are not validated, they are only displayed for 513 * informational purposes. 514 * 515 * 'calc_size' is the calculated size, in bytes, of the firmware structure and 516 * all of the microcode structures, minus the CRC. 517 * 518 * 'length' is the size that the structure says it is, including the CRC. 519 */ 520 int u_qe_upload_firmware(const struct qe_firmware *firmware) 521 { 522 unsigned int i; 523 unsigned int j; 524 u32 crc; 525 size_t calc_size = sizeof(struct qe_firmware); 526 size_t length; 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; 531 #else 532 ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 533 #endif 534 #endif 535 if (!firmware) { 536 printf("Invalid address\n"); 537 return -EINVAL; 538 } 539 540 hdr = &firmware->header; 541 length = be32_to_cpu(hdr->length); 542 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); 549 #endif 550 return -EPERM; 551 } 552 553 /* Check the version */ 554 if (hdr->version != 1) { 555 printf("Unsupported version\n"); 556 return -EPERM; 557 } 558 559 /* Validate some of the fields */ 560 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) { 561 printf("Invalid data\n"); 562 return -EINVAL; 563 } 564 565 /* Validate the length and check if there's a CRC */ 566 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode); 567 568 for (i = 0; i < firmware->count; i++) 569 /* 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. 573 */ 574 calc_size += sizeof(u32) * 575 be32_to_cpu(firmware->microcode[i].count); 576 577 /* Validate the length */ 578 if (length != calc_size + sizeof(u32)) { 579 printf("Invalid length\n"); 580 return -EPERM; 581 } 582 583 /* 584 * Validate the CRC. We would normally call crc32_no_comp(), but that 585 * function isn't available unless you turn on JFFS support. 586 */ 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"); 590 return -EIO; 591 } 592 593 /* 594 * If the microcode calls for it, split the I-RAM. 595 */ 596 if (!firmware->split) { 597 out_be16(&qe_immr->cp.cercr, 598 in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR); 599 } 600 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); 605 else 606 printf("Firmware '%s'\n", firmware->id); 607 608 /* Loop through each microcode. */ 609 for (i = 0; i < firmware->count; i++) { 610 const struct qe_microcode *ucode = &firmware->microcode[i]; 611 612 /* Upload a microcode if it's present */ 613 if (ucode->code_offset) 614 qe_upload_microcode(firmware, ucode); 615 616 /* Program the traps for this processor */ 617 for (j = 0; j < 16; j++) { 618 u32 trap = be32_to_cpu(ucode->traps[j]); 619 620 if (trap) 621 out_be32(&qe_immr->rsp[i].tibcr[j], trap); 622 } 623 624 /* Enable traps */ 625 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr)); 626 } 627 628 return 0; 629 } 630 #endif 631 632 #ifdef CONFIG_U_QE 633 int u_qe_firmware_resume(const struct qe_firmware *firmware, qe_map_t *qe_immrr) 634 { 635 unsigned int i; 636 unsigned int j; 637 const struct qe_header *hdr; 638 const u32 *code; 639 #ifdef CONFIG_DEEP_SLEEP 640 #ifdef CONFIG_PPC 641 ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 642 #else 643 struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR; 644 #endif 645 #endif 646 647 if (!firmware) 648 return -EINVAL; 649 650 hdr = &firmware->header; 651 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); 657 #endif 658 return -EPERM; 659 } 660 661 /* 662 * If the microcode calls for it, split the I-RAM. 663 */ 664 if (!firmware->split) { 665 out_be16(&qe_immrr->cp.cercr, 666 in_be16(&qe_immrr->cp.cercr) | QE_CP_CERCR_CIR); 667 } 668 669 /* Loop through each microcode. */ 670 for (i = 0; i < firmware->count; i++) { 671 const struct qe_microcode *ucode = &firmware->microcode[i]; 672 673 /* Upload a microcode if it's present */ 674 if (!ucode->code_offset) 675 return 0; 676 677 code = (const void *)firmware + be32_to_cpu(ucode->code_offset); 678 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); 682 683 for (i = 0; i < be32_to_cpu(ucode->count); i++) 684 out_be32(&qe_immrr->iram.idata, be32_to_cpu(code[i])); 685 686 /* Program the traps for this processor */ 687 for (j = 0; j < 16; j++) { 688 u32 trap = be32_to_cpu(ucode->traps[j]); 689 690 if (trap) 691 out_be32(&qe_immrr->rsp[i].tibcr[j], trap); 692 } 693 694 /* Enable traps */ 695 out_be32(&qe_immrr->rsp[i].eccr, be32_to_cpu(ucode->eccr)); 696 } 697 698 return 0; 699 } 700 #endif 701 702 struct qe_firmware_info *qe_get_firmware_info(void) 703 { 704 return qe_firmware_uploaded ? &qe_firmware_info : NULL; 705 } 706 707 static int qe_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 708 { 709 ulong addr; 710 711 if (argc < 3) 712 return cmd_usage(cmdtp); 713 714 if (strcmp(argv[1], "fw") == 0) { 715 addr = simple_strtoul(argv[2], NULL, 16); 716 717 if (!addr) { 718 printf("Invalid address\n"); 719 return -EINVAL; 720 } 721 722 /* 723 * If a length was supplied, compare that with the 'length' 724 * field. 725 */ 726 727 if (argc > 3) { 728 ulong length = simple_strtoul(argv[3], NULL, 16); 729 struct qe_firmware *firmware = (void *) addr; 730 731 if (length != be32_to_cpu(firmware->header.length)) { 732 printf("Length mismatch\n"); 733 return -EINVAL; 734 } 735 } 736 737 return qe_upload_firmware((const struct qe_firmware *) addr); 738 } 739 740 return cmd_usage(cmdtp); 741 } 742 743 U_BOOT_CMD( 744 qe, 4, 0, qe_cmd, 745 "QUICC Engine commands", 746 "fw <addr> [<length>] - Upload firmware binary at address <addr> to " 747 "the QE,\n" 748 "\twith optional length <length> verification." 749 ); 750