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