Merge branch 'master' of git://www.denx.de/git/u-boot-socfpga
[oweals/u-boot.git] / drivers / qe / qe.c
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 <command.h>
12 #include "asm/errno.h"
13 #include "asm/io.h"
14 #include "linux/immap_qe.h"
15 #include "qe.h"
16 #ifdef CONFIG_LS102XA
17 #include <asm/arch/immap_ls102xa.h>
18 #endif
19
20 #define MPC85xx_DEVDISR_QE_DISABLE      0x1
21
22 qe_map_t                *qe_immr = NULL;
23 static qe_snum_t        snums[QE_NUM_OF_SNUM];
24
25 DECLARE_GLOBAL_DATA_PTR;
26
27 void qe_issue_cmd(uint cmd, uint sbc, u8 mcn, u32 cmd_data)
28 {
29         u32 cecr;
30
31         if (cmd == QE_RESET) {
32                 out_be32(&qe_immr->cp.cecr,(u32) (cmd | QE_CR_FLG));
33         } else {
34                 out_be32(&qe_immr->cp.cecdr, cmd_data);
35                 out_be32(&qe_immr->cp.cecr, (sbc | QE_CR_FLG |
36                          ((u32) mcn<<QE_CR_PROTOCOL_SHIFT) | cmd));
37         }
38         /* Wait for the QE_CR_FLG to clear */
39         do {
40                 cecr = in_be32(&qe_immr->cp.cecr);
41         } while (cecr & QE_CR_FLG);
42
43         return;
44 }
45
46 #ifdef CONFIG_QE
47 uint qe_muram_alloc(uint size, uint align)
48 {
49         uint    retloc;
50         uint    align_mask, off;
51         uint    savebase;
52
53         align_mask = align - 1;
54         savebase = gd->arch.mp_alloc_base;
55
56         off = gd->arch.mp_alloc_base & align_mask;
57         if (off != 0)
58                 gd->arch.mp_alloc_base += (align - off);
59
60         if ((off = size & align_mask) != 0)
61                 size += (align - off);
62
63         if ((gd->arch.mp_alloc_base + size) >= gd->arch.mp_alloc_top) {
64                 gd->arch.mp_alloc_base = savebase;
65                 printf("%s: ran out of ram.\n",  __FUNCTION__);
66         }
67
68         retloc = gd->arch.mp_alloc_base;
69         gd->arch.mp_alloc_base += size;
70
71         memset((void *)&qe_immr->muram[retloc], 0, size);
72
73         __asm__ __volatile__("sync");
74
75         return retloc;
76 }
77 #endif
78
79 void *qe_muram_addr(uint offset)
80 {
81         return (void *)&qe_immr->muram[offset];
82 }
83
84 static void qe_sdma_init(void)
85 {
86         volatile sdma_t *p;
87         uint            sdma_buffer_base;
88
89         p = (volatile sdma_t *)&qe_immr->sdma;
90
91         /* All of DMA transaction in bus 1 */
92         out_be32(&p->sdaqr, 0);
93         out_be32(&p->sdaqmr, 0);
94
95         /* Allocate 2KB temporary buffer for sdma */
96         sdma_buffer_base = qe_muram_alloc(2048, 4096);
97         out_be32(&p->sdwbcr, sdma_buffer_base & QE_SDEBCR_BA_MASK);
98
99         /* Clear sdma status */
100         out_be32(&p->sdsr, 0x03000000);
101
102         /* Enable global mode on bus 1, and 2KB buffer size */
103         out_be32(&p->sdmr, QE_SDMR_GLB_1_MSK | (0x3 << QE_SDMR_CEN_SHIFT));
104 }
105
106 /* This table is a list of the serial numbers of the Threads, taken from the
107  * "SNUM Table" chart in the QE Reference Manual. The order is not important,
108  * we just need to know what the SNUMs are for the threads.
109  */
110 static u8 thread_snum[] = {
111 /* Evthreads 16-29 are not supported in MPC8309 */
112 #if !defined(CONFIG_MPC8309)
113         0x04, 0x05, 0x0c, 0x0d,
114         0x14, 0x15, 0x1c, 0x1d,
115         0x24, 0x25, 0x2c, 0x2d,
116         0x34, 0x35,
117 #endif
118         0x88, 0x89, 0x98, 0x99,
119         0xa8, 0xa9, 0xb8, 0xb9,
120         0xc8, 0xc9, 0xd8, 0xd9,
121         0xe8, 0xe9, 0x08, 0x09,
122         0x18, 0x19, 0x28, 0x29,
123         0x38, 0x39, 0x48, 0x49,
124         0x58, 0x59, 0x68, 0x69,
125         0x78, 0x79, 0x80, 0x81
126 };
127
128 static void qe_snums_init(void)
129 {
130         int     i;
131
132         for (i = 0; i < QE_NUM_OF_SNUM; i++) {
133                 snums[i].state = QE_SNUM_STATE_FREE;
134                 snums[i].num   = thread_snum[i];
135         }
136 }
137
138 int qe_get_snum(void)
139 {
140         int     snum = -EBUSY;
141         int     i;
142
143         for (i = 0; i < QE_NUM_OF_SNUM; i++) {
144                 if (snums[i].state == QE_SNUM_STATE_FREE) {
145                         snums[i].state = QE_SNUM_STATE_USED;
146                         snum = snums[i].num;
147                         break;
148                 }
149         }
150
151         return snum;
152 }
153
154 void qe_put_snum(u8 snum)
155 {
156         int     i;
157
158         for (i = 0; i < QE_NUM_OF_SNUM; i++) {
159                 if (snums[i].num == snum) {
160                         snums[i].state = QE_SNUM_STATE_FREE;
161                         break;
162                 }
163         }
164 }
165
166 void qe_init(uint qe_base)
167 {
168         /* Init the QE IMMR base */
169         qe_immr = (qe_map_t *)qe_base;
170
171 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_NOR
172         /*
173          * Upload microcode to IRAM for those SOCs which do not have ROM in QE.
174          */
175         qe_upload_firmware((const void *)CONFIG_SYS_QE_FW_ADDR);
176
177         /* enable the microcode in IRAM */
178         out_be32(&qe_immr->iram.iready,QE_IRAM_READY);
179 #endif
180
181         gd->arch.mp_alloc_base = QE_DATAONLY_BASE;
182         gd->arch.mp_alloc_top = gd->arch.mp_alloc_base + QE_DATAONLY_SIZE;
183
184         qe_sdma_init();
185         qe_snums_init();
186 }
187
188 #ifdef CONFIG_U_QE
189 void u_qe_init(void)
190 {
191         uint qe_base = CONFIG_SYS_IMMR + 0x01400000; /* QE immr base */
192         qe_immr = (qe_map_t *)qe_base;
193
194         u_qe_upload_firmware((const void *)CONFIG_SYS_QE_FW_ADDR);
195         out_be32(&qe_immr->iram.iready, QE_IRAM_READY);
196 }
197 #endif
198
199 #ifdef CONFIG_U_QE
200 void u_qe_resume(void)
201 {
202         qe_map_t *qe_immrr;
203         uint qe_base = CONFIG_SYS_IMMR + QE_IMMR_OFFSET; /* QE immr base */
204         qe_immrr = (qe_map_t *)qe_base;
205
206         u_qe_firmware_resume((const void *)CONFIG_SYS_QE_FW_ADDR, qe_immrr);
207         out_be32(&qe_immrr->iram.iready, QE_IRAM_READY);
208 }
209 #endif
210
211 void qe_reset(void)
212 {
213         qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
214                          (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0);
215 }
216
217 void qe_assign_page(uint snum, uint para_ram_base)
218 {
219         u32     cecr;
220
221         out_be32(&qe_immr->cp.cecdr, para_ram_base);
222         out_be32(&qe_immr->cp.cecr, ((u32) snum<<QE_CR_ASSIGN_PAGE_SNUM_SHIFT)
223                                          | QE_CR_FLG | QE_ASSIGN_PAGE);
224
225         /* Wait for the QE_CR_FLG to clear */
226         do {
227                 cecr = in_be32(&qe_immr->cp.cecr);
228         } while (cecr & QE_CR_FLG );
229
230         return;
231 }
232
233 /*
234  * brg: 0~15 as BRG1~BRG16
235    rate: baud rate
236  * BRG input clock comes from the BRGCLK (internal clock generated from
237    the QE clock, it is one-half of the QE clock), If need the clock source
238    from CLKn pin, we have te change the function.
239  */
240
241 #define BRG_CLK         (gd->arch.brg_clk)
242
243 #ifdef CONFIG_QE
244 int qe_set_brg(uint brg, uint rate)
245 {
246         volatile uint   *bp;
247         u32             divisor;
248         int             div16 = 0;
249
250         if (brg >= QE_NUM_OF_BRGS)
251                 return -EINVAL;
252         bp = (uint *)&qe_immr->brg.brgc1;
253         bp += brg;
254
255         divisor = (BRG_CLK / rate);
256         if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
257                 div16 = 1;
258                 divisor /= 16;
259         }
260
261         *bp = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
262         __asm__ __volatile__("sync");
263
264         if (div16) {
265                 *bp |= QE_BRGC_DIV16;
266                 __asm__ __volatile__("sync");
267         }
268
269         return 0;
270 }
271 #endif
272
273 /* Set ethernet MII clock master
274 */
275 int qe_set_mii_clk_src(int ucc_num)
276 {
277         u32     cmxgcr;
278
279         /* check if the UCC number is in range. */
280         if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0)) {
281                 printf("%s: ucc num not in ranges\n", __FUNCTION__);
282                 return -EINVAL;
283         }
284
285         cmxgcr = in_be32(&qe_immr->qmx.cmxgcr);
286         cmxgcr &= ~QE_CMXGCR_MII_ENET_MNG_MASK;
287         cmxgcr |= (ucc_num <<QE_CMXGCR_MII_ENET_MNG_SHIFT);
288         out_be32(&qe_immr->qmx.cmxgcr, cmxgcr);
289
290         return 0;
291 }
292
293 /* Firmware information stored here for qe_get_firmware_info() */
294 static struct qe_firmware_info qe_firmware_info;
295
296 /*
297  * Set to 1 if QE firmware has been uploaded, and therefore
298  * qe_firmware_info contains valid data.
299  */
300 static int qe_firmware_uploaded;
301
302 /*
303  * Upload a QE microcode
304  *
305  * This function is a worker function for qe_upload_firmware().  It does
306  * the actual uploading of the microcode.
307  */
308 static void qe_upload_microcode(const void *base,
309         const struct qe_microcode *ucode)
310 {
311         const u32 *code = base + be32_to_cpu(ucode->code_offset);
312         unsigned int i;
313
314         if (ucode->major || ucode->minor || ucode->revision)
315                 printf("QE: uploading microcode '%s' version %u.%u.%u\n",
316                         ucode->id, ucode->major, ucode->minor, ucode->revision);
317         else
318                 printf("QE: uploading microcode '%s'\n", ucode->id);
319
320         /* Use auto-increment */
321         out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
322                 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
323
324         for (i = 0; i < be32_to_cpu(ucode->count); i++)
325                 out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
326 }
327
328 /*
329  * Upload a microcode to the I-RAM at a specific address.
330  *
331  * See docs/README.qe_firmware for information on QE microcode uploading.
332  *
333  * Currently, only version 1 is supported, so the 'version' field must be
334  * set to 1.
335  *
336  * The SOC model and revision are not validated, they are only displayed for
337  * informational purposes.
338  *
339  * 'calc_size' is the calculated size, in bytes, of the firmware structure and
340  * all of the microcode structures, minus the CRC.
341  *
342  * 'length' is the size that the structure says it is, including the CRC.
343  */
344 int qe_upload_firmware(const struct qe_firmware *firmware)
345 {
346         unsigned int i;
347         unsigned int j;
348         u32 crc;
349         size_t calc_size = sizeof(struct qe_firmware);
350         size_t length;
351         const struct qe_header *hdr;
352 #ifdef CONFIG_DEEP_SLEEP
353 #ifdef CONFIG_LS102XA
354         struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
355 #else
356         ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
357 #endif
358 #endif
359         if (!firmware) {
360                 printf("Invalid address\n");
361                 return -EINVAL;
362         }
363
364         hdr = &firmware->header;
365         length = be32_to_cpu(hdr->length);
366
367         /* Check the magic */
368         if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
369             (hdr->magic[2] != 'F')) {
370                 printf("QE microcode not found\n");
371 #ifdef CONFIG_DEEP_SLEEP
372                 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
373 #endif
374                 return -EPERM;
375         }
376
377         /* Check the version */
378         if (hdr->version != 1) {
379                 printf("Unsupported version\n");
380                 return -EPERM;
381         }
382
383         /* Validate some of the fields */
384         if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
385                 printf("Invalid data\n");
386                 return -EINVAL;
387         }
388
389         /* Validate the length and check if there's a CRC */
390         calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
391
392         for (i = 0; i < firmware->count; i++)
393                 /*
394                  * For situations where the second RISC uses the same microcode
395                  * as the first, the 'code_offset' and 'count' fields will be
396                  * zero, so it's okay to add those.
397                  */
398                 calc_size += sizeof(u32) *
399                         be32_to_cpu(firmware->microcode[i].count);
400
401         /* Validate the length */
402         if (length != calc_size + sizeof(u32)) {
403                 printf("Invalid length\n");
404                 return -EPERM;
405         }
406
407         /*
408          * Validate the CRC.  We would normally call crc32_no_comp(), but that
409          * function isn't available unless you turn on JFFS support.
410          */
411         crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
412         if (crc != (crc32(-1, (const void *) firmware, calc_size) ^ -1)) {
413                 printf("Firmware CRC is invalid\n");
414                 return -EIO;
415         }
416
417         /*
418          * If the microcode calls for it, split the I-RAM.
419          */
420         if (!firmware->split) {
421                 out_be16(&qe_immr->cp.cercr,
422                         in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
423         }
424
425         if (firmware->soc.model)
426                 printf("Firmware '%s' for %u V%u.%u\n",
427                         firmware->id, be16_to_cpu(firmware->soc.model),
428                         firmware->soc.major, firmware->soc.minor);
429         else
430                 printf("Firmware '%s'\n", firmware->id);
431
432         /*
433          * The QE only supports one microcode per RISC, so clear out all the
434          * saved microcode information and put in the new.
435          */
436         memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
437         strcpy(qe_firmware_info.id, (char *)firmware->id);
438         qe_firmware_info.extended_modes = firmware->extended_modes;
439         memcpy(qe_firmware_info.vtraps, firmware->vtraps,
440                 sizeof(firmware->vtraps));
441         qe_firmware_uploaded = 1;
442
443         /* Loop through each microcode. */
444         for (i = 0; i < firmware->count; i++) {
445                 const struct qe_microcode *ucode = &firmware->microcode[i];
446
447                 /* Upload a microcode if it's present */
448                 if (ucode->code_offset)
449                         qe_upload_microcode(firmware, ucode);
450
451                 /* Program the traps for this processor */
452                 for (j = 0; j < 16; j++) {
453                         u32 trap = be32_to_cpu(ucode->traps[j]);
454
455                         if (trap)
456                                 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
457                 }
458
459                 /* Enable traps */
460                 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
461         }
462
463         return 0;
464 }
465
466 #ifdef CONFIG_U_QE
467 /*
468  * Upload a microcode to the I-RAM at a specific address.
469  *
470  * See docs/README.qe_firmware for information on QE microcode uploading.
471  *
472  * Currently, only version 1 is supported, so the 'version' field must be
473  * set to 1.
474  *
475  * The SOC model and revision are not validated, they are only displayed for
476  * informational purposes.
477  *
478  * 'calc_size' is the calculated size, in bytes, of the firmware structure and
479  * all of the microcode structures, minus the CRC.
480  *
481  * 'length' is the size that the structure says it is, including the CRC.
482  */
483 int u_qe_upload_firmware(const struct qe_firmware *firmware)
484 {
485         unsigned int i;
486         unsigned int j;
487         u32 crc;
488         size_t calc_size = sizeof(struct qe_firmware);
489         size_t length;
490         const struct qe_header *hdr;
491 #ifdef CONFIG_DEEP_SLEEP
492 #ifdef CONFIG_LS102XA
493         struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
494 #else
495         ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
496 #endif
497 #endif
498         if (!firmware) {
499                 printf("Invalid address\n");
500                 return -EINVAL;
501         }
502
503         hdr = &firmware->header;
504         length = be32_to_cpu(hdr->length);
505
506         /* Check the magic */
507         if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
508             (hdr->magic[2] != 'F')) {
509                 printf("Not a microcode\n");
510 #ifdef CONFIG_DEEP_SLEEP
511                 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
512 #endif
513                 return -EPERM;
514         }
515
516         /* Check the version */
517         if (hdr->version != 1) {
518                 printf("Unsupported version\n");
519                 return -EPERM;
520         }
521
522         /* Validate some of the fields */
523         if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
524                 printf("Invalid data\n");
525                 return -EINVAL;
526         }
527
528         /* Validate the length and check if there's a CRC */
529         calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
530
531         for (i = 0; i < firmware->count; i++)
532                 /*
533                  * For situations where the second RISC uses the same microcode
534                  * as the first, the 'code_offset' and 'count' fields will be
535                  * zero, so it's okay to add those.
536                  */
537                 calc_size += sizeof(u32) *
538                         be32_to_cpu(firmware->microcode[i].count);
539
540         /* Validate the length */
541         if (length != calc_size + sizeof(u32)) {
542                 printf("Invalid length\n");
543                 return -EPERM;
544         }
545
546         /*
547          * Validate the CRC.  We would normally call crc32_no_comp(), but that
548          * function isn't available unless you turn on JFFS support.
549          */
550         crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
551         if (crc != (crc32(-1, (const void *)firmware, calc_size) ^ -1)) {
552                 printf("Firmware CRC is invalid\n");
553                 return -EIO;
554         }
555
556         /*
557          * If the microcode calls for it, split the I-RAM.
558          */
559         if (!firmware->split) {
560                 out_be16(&qe_immr->cp.cercr,
561                          in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
562         }
563
564         if (firmware->soc.model)
565                 printf("Firmware '%s' for %u V%u.%u\n",
566                        firmware->id, be16_to_cpu(firmware->soc.model),
567                        firmware->soc.major, firmware->soc.minor);
568         else
569                 printf("Firmware '%s'\n", firmware->id);
570
571         /* Loop through each microcode. */
572         for (i = 0; i < firmware->count; i++) {
573                 const struct qe_microcode *ucode = &firmware->microcode[i];
574
575                 /* Upload a microcode if it's present */
576                 if (ucode->code_offset)
577                         qe_upload_microcode(firmware, ucode);
578
579                 /* Program the traps for this processor */
580                 for (j = 0; j < 16; j++) {
581                         u32 trap = be32_to_cpu(ucode->traps[j]);
582
583                         if (trap)
584                                 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
585                 }
586
587                 /* Enable traps */
588                 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
589         }
590
591         return 0;
592 }
593 #endif
594
595 #ifdef CONFIG_U_QE
596 int u_qe_firmware_resume(const struct qe_firmware *firmware, qe_map_t *qe_immrr)
597 {
598         unsigned int i;
599         unsigned int j;
600         const struct qe_header *hdr;
601         const u32 *code;
602 #ifdef CONFIG_DEEP_SLEEP
603 #ifdef CONFIG_PPC
604         ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
605 #else
606         struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
607 #endif
608 #endif
609
610         if (!firmware)
611                 return -EINVAL;
612
613         hdr = &firmware->header;
614
615         /* Check the magic */
616         if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
617             (hdr->magic[2] != 'F')) {
618 #ifdef CONFIG_DEEP_SLEEP
619                 setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
620 #endif
621                 return -EPERM;
622         }
623
624         /*
625          * If the microcode calls for it, split the I-RAM.
626          */
627         if (!firmware->split) {
628                 out_be16(&qe_immrr->cp.cercr,
629                          in_be16(&qe_immrr->cp.cercr) | QE_CP_CERCR_CIR);
630         }
631
632         /* Loop through each microcode. */
633         for (i = 0; i < firmware->count; i++) {
634                 const struct qe_microcode *ucode = &firmware->microcode[i];
635
636                 /* Upload a microcode if it's present */
637                 if (!ucode->code_offset)
638                         return 0;
639
640                 code = (const void *)firmware + be32_to_cpu(ucode->code_offset);
641
642                 /* Use auto-increment */
643                 out_be32(&qe_immrr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
644                         QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
645
646                 for (i = 0; i < be32_to_cpu(ucode->count); i++)
647                         out_be32(&qe_immrr->iram.idata, be32_to_cpu(code[i]));
648
649                 /* Program the traps for this processor */
650                 for (j = 0; j < 16; j++) {
651                         u32 trap = be32_to_cpu(ucode->traps[j]);
652
653                         if (trap)
654                                 out_be32(&qe_immrr->rsp[i].tibcr[j], trap);
655                 }
656
657                 /* Enable traps */
658                 out_be32(&qe_immrr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
659         }
660
661         return 0;
662 }
663 #endif
664
665 struct qe_firmware_info *qe_get_firmware_info(void)
666 {
667         return qe_firmware_uploaded ? &qe_firmware_info : NULL;
668 }
669
670 static int qe_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
671 {
672         ulong addr;
673
674         if (argc < 3)
675                 return cmd_usage(cmdtp);
676
677         if (strcmp(argv[1], "fw") == 0) {
678                 addr = simple_strtoul(argv[2], NULL, 16);
679
680                 if (!addr) {
681                         printf("Invalid address\n");
682                         return -EINVAL;
683                 }
684
685                 /*
686                  * If a length was supplied, compare that with the 'length'
687                  * field.
688                  */
689
690                 if (argc > 3) {
691                         ulong length = simple_strtoul(argv[3], NULL, 16);
692                         struct qe_firmware *firmware = (void *) addr;
693
694                         if (length != be32_to_cpu(firmware->header.length)) {
695                                 printf("Length mismatch\n");
696                                 return -EINVAL;
697                         }
698                 }
699
700                 return qe_upload_firmware((const struct qe_firmware *) addr);
701         }
702
703         return cmd_usage(cmdtp);
704 }
705
706 U_BOOT_CMD(
707         qe, 4, 0, qe_cmd,
708         "QUICC Engine commands",
709         "fw <addr> [<length>] - Upload firmware binary at address <addr> to "
710                 "the QE,\n"
711         "\twith optional length <length> verification."
712 );