xref: /openbmc/u-boot/drivers/qe/qe.c (revision 82e0646a)
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 		/* flush cache after read */
225 		flush_cache((ulong)addr, cnt * 512);
226 	}
227 #endif
228 	if (!u_qe_upload_firmware(addr))
229 		out_be32(&qe_immr->iram.iready, QE_IRAM_READY);
230 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_MMC
231 	free(addr);
232 #endif
233 }
234 #endif
235 
236 #ifdef CONFIG_U_QE
237 void u_qe_resume(void)
238 {
239 	qe_map_t *qe_immrr;
240 
241 	qe_immrr = (qe_map_t *)(CONFIG_SYS_IMMR + QE_IMMR_OFFSET);
242 	u_qe_firmware_resume((const void *)CONFIG_SYS_QE_FW_ADDR, qe_immrr);
243 	out_be32(&qe_immrr->iram.iready, QE_IRAM_READY);
244 }
245 #endif
246 
247 void qe_reset(void)
248 {
249 	qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
250 			 (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0);
251 }
252 
253 #ifdef CONFIG_QE
254 void qe_assign_page(uint snum, uint para_ram_base)
255 {
256 	u32	cecr;
257 
258 	out_be32(&qe_immr->cp.cecdr, para_ram_base);
259 	out_be32(&qe_immr->cp.cecr, ((u32) snum<<QE_CR_ASSIGN_PAGE_SNUM_SHIFT)
260 					 | QE_CR_FLG | QE_ASSIGN_PAGE);
261 
262 	/* Wait for the QE_CR_FLG to clear */
263 	do {
264 		cecr = in_be32(&qe_immr->cp.cecr);
265 	} while (cecr & QE_CR_FLG );
266 
267 	return;
268 }
269 #endif
270 
271 /*
272  * brg: 0~15 as BRG1~BRG16
273    rate: baud rate
274  * BRG input clock comes from the BRGCLK (internal clock generated from
275    the QE clock, it is one-half of the QE clock), If need the clock source
276    from CLKn pin, we have te change the function.
277  */
278 
279 #define BRG_CLK		(gd->arch.brg_clk)
280 
281 #ifdef CONFIG_QE
282 int qe_set_brg(uint brg, uint rate)
283 {
284 	volatile uint	*bp;
285 	u32		divisor;
286 	int		div16 = 0;
287 
288 	if (brg >= QE_NUM_OF_BRGS)
289 		return -EINVAL;
290 	bp = (uint *)&qe_immr->brg.brgc1;
291 	bp += brg;
292 
293 	divisor = (BRG_CLK / rate);
294 	if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
295 		div16 = 1;
296 		divisor /= 16;
297 	}
298 
299 	*bp = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
300 	__asm__ __volatile__("sync");
301 
302 	if (div16) {
303 		*bp |= QE_BRGC_DIV16;
304 		__asm__ __volatile__("sync");
305 	}
306 
307 	return 0;
308 }
309 #endif
310 
311 /* Set ethernet MII clock master
312 */
313 int qe_set_mii_clk_src(int ucc_num)
314 {
315 	u32	cmxgcr;
316 
317 	/* check if the UCC number is in range. */
318 	if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0)) {
319 		printf("%s: ucc num not in ranges\n", __FUNCTION__);
320 		return -EINVAL;
321 	}
322 
323 	cmxgcr = in_be32(&qe_immr->qmx.cmxgcr);
324 	cmxgcr &= ~QE_CMXGCR_MII_ENET_MNG_MASK;
325 	cmxgcr |= (ucc_num <<QE_CMXGCR_MII_ENET_MNG_SHIFT);
326 	out_be32(&qe_immr->qmx.cmxgcr, cmxgcr);
327 
328 	return 0;
329 }
330 
331 /* Firmware information stored here for qe_get_firmware_info() */
332 static struct qe_firmware_info qe_firmware_info;
333 
334 /*
335  * Set to 1 if QE firmware has been uploaded, and therefore
336  * qe_firmware_info contains valid data.
337  */
338 static int qe_firmware_uploaded;
339 
340 /*
341  * Upload a QE microcode
342  *
343  * This function is a worker function for qe_upload_firmware().  It does
344  * the actual uploading of the microcode.
345  */
346 static void qe_upload_microcode(const void *base,
347 	const struct qe_microcode *ucode)
348 {
349 	const u32 *code = base + be32_to_cpu(ucode->code_offset);
350 	unsigned int i;
351 
352 	if (ucode->major || ucode->minor || ucode->revision)
353 		printf("QE: uploading microcode '%s' version %u.%u.%u\n",
354 		       (char *)ucode->id, (u16)ucode->major, (u16)ucode->minor,
355 		       (u16)ucode->revision);
356 	else
357 		printf("QE: uploading microcode '%s'\n", (char *)ucode->id);
358 
359 	/* Use auto-increment */
360 	out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
361 		QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
362 
363 	for (i = 0; i < be32_to_cpu(ucode->count); i++)
364 		out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
365 }
366 
367 /*
368  * Upload a microcode to the I-RAM at a specific address.
369  *
370  * See docs/README.qe_firmware for information on QE microcode uploading.
371  *
372  * Currently, only version 1 is supported, so the 'version' field must be
373  * set to 1.
374  *
375  * The SOC model and revision are not validated, they are only displayed for
376  * informational purposes.
377  *
378  * 'calc_size' is the calculated size, in bytes, of the firmware structure and
379  * all of the microcode structures, minus the CRC.
380  *
381  * 'length' is the size that the structure says it is, including the CRC.
382  */
383 int qe_upload_firmware(const struct qe_firmware *firmware)
384 {
385 	unsigned int i;
386 	unsigned int j;
387 	u32 crc;
388 	size_t calc_size = sizeof(struct qe_firmware);
389 	size_t length;
390 	const struct qe_header *hdr;
391 #ifdef CONFIG_DEEP_SLEEP
392 #ifdef CONFIG_ARCH_LS1021A
393 	struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
394 #else
395 	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
396 #endif
397 #endif
398 	if (!firmware) {
399 		printf("Invalid address\n");
400 		return -EINVAL;
401 	}
402 
403 	hdr = &firmware->header;
404 	length = be32_to_cpu(hdr->length);
405 
406 	/* Check the magic */
407 	if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
408 	    (hdr->magic[2] != 'F')) {
409 		printf("QE microcode not found\n");
410 #ifdef CONFIG_DEEP_SLEEP
411 		setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
412 #endif
413 		return -EPERM;
414 	}
415 
416 	/* Check the version */
417 	if (hdr->version != 1) {
418 		printf("Unsupported version\n");
419 		return -EPERM;
420 	}
421 
422 	/* Validate some of the fields */
423 	if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
424 		printf("Invalid data\n");
425 		return -EINVAL;
426 	}
427 
428 	/* Validate the length and check if there's a CRC */
429 	calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
430 
431 	for (i = 0; i < firmware->count; i++)
432 		/*
433 		 * For situations where the second RISC uses the same microcode
434 		 * as the first, the 'code_offset' and 'count' fields will be
435 		 * zero, so it's okay to add those.
436 		 */
437 		calc_size += sizeof(u32) *
438 			be32_to_cpu(firmware->microcode[i].count);
439 
440 	/* Validate the length */
441 	if (length != calc_size + sizeof(u32)) {
442 		printf("Invalid length\n");
443 		return -EPERM;
444 	}
445 
446 	/*
447 	 * Validate the CRC.  We would normally call crc32_no_comp(), but that
448 	 * function isn't available unless you turn on JFFS support.
449 	 */
450 	crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
451 	if (crc != (crc32(-1, (const void *) firmware, calc_size) ^ -1)) {
452 		printf("Firmware CRC is invalid\n");
453 		return -EIO;
454 	}
455 
456 	/*
457 	 * If the microcode calls for it, split the I-RAM.
458 	 */
459 	if (!firmware->split) {
460 		out_be16(&qe_immr->cp.cercr,
461 			in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
462 	}
463 
464 	if (firmware->soc.model)
465 		printf("Firmware '%s' for %u V%u.%u\n",
466 			firmware->id, be16_to_cpu(firmware->soc.model),
467 			firmware->soc.major, firmware->soc.minor);
468 	else
469 		printf("Firmware '%s'\n", firmware->id);
470 
471 	/*
472 	 * The QE only supports one microcode per RISC, so clear out all the
473 	 * saved microcode information and put in the new.
474 	 */
475 	memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
476 	strncpy(qe_firmware_info.id, (char *)firmware->id, 62);
477 	qe_firmware_info.extended_modes = firmware->extended_modes;
478 	memcpy(qe_firmware_info.vtraps, firmware->vtraps,
479 		sizeof(firmware->vtraps));
480 	qe_firmware_uploaded = 1;
481 
482 	/* Loop through each microcode. */
483 	for (i = 0; i < firmware->count; i++) {
484 		const struct qe_microcode *ucode = &firmware->microcode[i];
485 
486 		/* Upload a microcode if it's present */
487 		if (ucode->code_offset)
488 			qe_upload_microcode(firmware, ucode);
489 
490 		/* Program the traps for this processor */
491 		for (j = 0; j < 16; j++) {
492 			u32 trap = be32_to_cpu(ucode->traps[j]);
493 
494 			if (trap)
495 				out_be32(&qe_immr->rsp[i].tibcr[j], trap);
496 		}
497 
498 		/* Enable traps */
499 		out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
500 	}
501 
502 	return 0;
503 }
504 
505 #ifdef CONFIG_U_QE
506 /*
507  * Upload a microcode to the I-RAM at a specific address.
508  *
509  * See docs/README.qe_firmware for information on QE microcode uploading.
510  *
511  * Currently, only version 1 is supported, so the 'version' field must be
512  * set to 1.
513  *
514  * The SOC model and revision are not validated, they are only displayed for
515  * informational purposes.
516  *
517  * 'calc_size' is the calculated size, in bytes, of the firmware structure and
518  * all of the microcode structures, minus the CRC.
519  *
520  * 'length' is the size that the structure says it is, including the CRC.
521  */
522 int u_qe_upload_firmware(const struct qe_firmware *firmware)
523 {
524 	unsigned int i;
525 	unsigned int j;
526 	u32 crc;
527 	size_t calc_size = sizeof(struct qe_firmware);
528 	size_t length;
529 	const struct qe_header *hdr;
530 #ifdef CONFIG_DEEP_SLEEP
531 #ifdef CONFIG_ARCH_LS1021A
532 	struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
533 #else
534 	ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
535 #endif
536 #endif
537 	if (!firmware) {
538 		printf("Invalid address\n");
539 		return -EINVAL;
540 	}
541 
542 	hdr = &firmware->header;
543 	length = be32_to_cpu(hdr->length);
544 
545 	/* Check the magic */
546 	if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
547 	    (hdr->magic[2] != 'F')) {
548 		printf("Not a microcode\n");
549 #ifdef CONFIG_DEEP_SLEEP
550 		setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
551 #endif
552 		return -EPERM;
553 	}
554 
555 	/* Check the version */
556 	if (hdr->version != 1) {
557 		printf("Unsupported version\n");
558 		return -EPERM;
559 	}
560 
561 	/* Validate some of the fields */
562 	if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
563 		printf("Invalid data\n");
564 		return -EINVAL;
565 	}
566 
567 	/* Validate the length and check if there's a CRC */
568 	calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
569 
570 	for (i = 0; i < firmware->count; i++)
571 		/*
572 		 * For situations where the second RISC uses the same microcode
573 		 * as the first, the 'code_offset' and 'count' fields will be
574 		 * zero, so it's okay to add those.
575 		 */
576 		calc_size += sizeof(u32) *
577 			be32_to_cpu(firmware->microcode[i].count);
578 
579 	/* Validate the length */
580 	if (length != calc_size + sizeof(u32)) {
581 		printf("Invalid length\n");
582 		return -EPERM;
583 	}
584 
585 	/*
586 	 * Validate the CRC.  We would normally call crc32_no_comp(), but that
587 	 * function isn't available unless you turn on JFFS support.
588 	 */
589 	crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
590 	if (crc != (crc32(-1, (const void *)firmware, calc_size) ^ -1)) {
591 		printf("Firmware CRC is invalid\n");
592 		return -EIO;
593 	}
594 
595 	/*
596 	 * If the microcode calls for it, split the I-RAM.
597 	 */
598 	if (!firmware->split) {
599 		out_be16(&qe_immr->cp.cercr,
600 			 in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
601 	}
602 
603 	if (firmware->soc.model)
604 		printf("Firmware '%s' for %u V%u.%u\n",
605 		       firmware->id, be16_to_cpu(firmware->soc.model),
606 		       firmware->soc.major, firmware->soc.minor);
607 	else
608 		printf("Firmware '%s'\n", firmware->id);
609 
610 	/* Loop through each microcode. */
611 	for (i = 0; i < firmware->count; i++) {
612 		const struct qe_microcode *ucode = &firmware->microcode[i];
613 
614 		/* Upload a microcode if it's present */
615 		if (ucode->code_offset)
616 			qe_upload_microcode(firmware, ucode);
617 
618 		/* Program the traps for this processor */
619 		for (j = 0; j < 16; j++) {
620 			u32 trap = be32_to_cpu(ucode->traps[j]);
621 
622 			if (trap)
623 				out_be32(&qe_immr->rsp[i].tibcr[j], trap);
624 		}
625 
626 		/* Enable traps */
627 		out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
628 	}
629 
630 	return 0;
631 }
632 #endif
633 
634 #ifdef CONFIG_U_QE
635 int u_qe_firmware_resume(const struct qe_firmware *firmware, qe_map_t *qe_immrr)
636 {
637 	unsigned int i;
638 	unsigned int j;
639 	const struct qe_header *hdr;
640 	const u32 *code;
641 #ifdef CONFIG_DEEP_SLEEP
642 #ifdef CONFIG_PPC
643 	ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
644 #else
645 	struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
646 #endif
647 #endif
648 
649 	if (!firmware)
650 		return -EINVAL;
651 
652 	hdr = &firmware->header;
653 
654 	/* Check the magic */
655 	if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
656 	    (hdr->magic[2] != 'F')) {
657 #ifdef CONFIG_DEEP_SLEEP
658 		setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
659 #endif
660 		return -EPERM;
661 	}
662 
663 	/*
664 	 * If the microcode calls for it, split the I-RAM.
665 	 */
666 	if (!firmware->split) {
667 		out_be16(&qe_immrr->cp.cercr,
668 			 in_be16(&qe_immrr->cp.cercr) | QE_CP_CERCR_CIR);
669 	}
670 
671 	/* Loop through each microcode. */
672 	for (i = 0; i < firmware->count; i++) {
673 		const struct qe_microcode *ucode = &firmware->microcode[i];
674 
675 		/* Upload a microcode if it's present */
676 		if (!ucode->code_offset)
677 			return 0;
678 
679 		code = (const void *)firmware + be32_to_cpu(ucode->code_offset);
680 
681 		/* Use auto-increment */
682 		out_be32(&qe_immrr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
683 			QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
684 
685 		for (i = 0; i < be32_to_cpu(ucode->count); i++)
686 			out_be32(&qe_immrr->iram.idata, be32_to_cpu(code[i]));
687 
688 		/* Program the traps for this processor */
689 		for (j = 0; j < 16; j++) {
690 			u32 trap = be32_to_cpu(ucode->traps[j]);
691 
692 			if (trap)
693 				out_be32(&qe_immrr->rsp[i].tibcr[j], trap);
694 		}
695 
696 		/* Enable traps */
697 		out_be32(&qe_immrr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
698 	}
699 
700 	return 0;
701 }
702 #endif
703 
704 struct qe_firmware_info *qe_get_firmware_info(void)
705 {
706 	return qe_firmware_uploaded ? &qe_firmware_info : NULL;
707 }
708 
709 static int qe_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
710 {
711 	ulong addr;
712 
713 	if (argc < 3)
714 		return cmd_usage(cmdtp);
715 
716 	if (strcmp(argv[1], "fw") == 0) {
717 		addr = simple_strtoul(argv[2], NULL, 16);
718 
719 		if (!addr) {
720 			printf("Invalid address\n");
721 			return -EINVAL;
722 		}
723 
724 		/*
725 		 * If a length was supplied, compare that with the 'length'
726 		 * field.
727 		 */
728 
729 		if (argc > 3) {
730 			ulong length = simple_strtoul(argv[3], NULL, 16);
731 			struct qe_firmware *firmware = (void *) addr;
732 
733 			if (length != be32_to_cpu(firmware->header.length)) {
734 				printf("Length mismatch\n");
735 				return -EINVAL;
736 			}
737 		}
738 
739 		return qe_upload_firmware((const struct qe_firmware *) addr);
740 	}
741 
742 	return cmd_usage(cmdtp);
743 }
744 
745 U_BOOT_CMD(
746 	qe, 4, 0, qe_cmd,
747 	"QUICC Engine commands",
748 	"fw <addr> [<length>] - Upload firmware binary at address <addr> to "
749 		"the QE,\n"
750 	"\twith optional length <length> verification."
751 );
752