xref: /openbmc/u-boot/drivers/qe/qe.c (revision 72df68cc)
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 
17 #define MPC85xx_DEVDISR_QE_DISABLE	0x1
18 
19 qe_map_t		*qe_immr = NULL;
20 static qe_snum_t	snums[QE_NUM_OF_SNUM];
21 
22 DECLARE_GLOBAL_DATA_PTR;
23 
24 void qe_issue_cmd(uint cmd, uint sbc, u8 mcn, u32 cmd_data)
25 {
26 	u32 cecr;
27 
28 	if (cmd == QE_RESET) {
29 		out_be32(&qe_immr->cp.cecr,(u32) (cmd | QE_CR_FLG));
30 	} else {
31 		out_be32(&qe_immr->cp.cecdr, cmd_data);
32 		out_be32(&qe_immr->cp.cecr, (sbc | QE_CR_FLG |
33 			 ((u32) mcn<<QE_CR_PROTOCOL_SHIFT) | cmd));
34 	}
35 	/* Wait for the QE_CR_FLG to clear */
36 	do {
37 		cecr = in_be32(&qe_immr->cp.cecr);
38 	} while (cecr & QE_CR_FLG);
39 
40 	return;
41 }
42 
43 uint qe_muram_alloc(uint size, uint align)
44 {
45 	uint	retloc;
46 	uint	align_mask, off;
47 	uint	savebase;
48 
49 	align_mask = align - 1;
50 	savebase = gd->arch.mp_alloc_base;
51 
52 	off = gd->arch.mp_alloc_base & align_mask;
53 	if (off != 0)
54 		gd->arch.mp_alloc_base += (align - off);
55 
56 	if ((off = size & align_mask) != 0)
57 		size += (align - off);
58 
59 	if ((gd->arch.mp_alloc_base + size) >= gd->arch.mp_alloc_top) {
60 		gd->arch.mp_alloc_base = savebase;
61 		printf("%s: ran out of ram.\n",  __FUNCTION__);
62 	}
63 
64 	retloc = gd->arch.mp_alloc_base;
65 	gd->arch.mp_alloc_base += size;
66 
67 	memset((void *)&qe_immr->muram[retloc], 0, size);
68 
69 	__asm__ __volatile__("sync");
70 
71 	return retloc;
72 }
73 
74 void *qe_muram_addr(uint offset)
75 {
76 	return (void *)&qe_immr->muram[offset];
77 }
78 
79 static void qe_sdma_init(void)
80 {
81 	volatile sdma_t	*p;
82 	uint		sdma_buffer_base;
83 
84 	p = (volatile sdma_t *)&qe_immr->sdma;
85 
86 	/* All of DMA transaction in bus 1 */
87 	out_be32(&p->sdaqr, 0);
88 	out_be32(&p->sdaqmr, 0);
89 
90 	/* Allocate 2KB temporary buffer for sdma */
91 	sdma_buffer_base = qe_muram_alloc(2048, 4096);
92 	out_be32(&p->sdwbcr, sdma_buffer_base & QE_SDEBCR_BA_MASK);
93 
94 	/* Clear sdma status */
95 	out_be32(&p->sdsr, 0x03000000);
96 
97 	/* Enable global mode on bus 1, and 2KB buffer size */
98 	out_be32(&p->sdmr, QE_SDMR_GLB_1_MSK | (0x3 << QE_SDMR_CEN_SHIFT));
99 }
100 
101 /* This table is a list of the serial numbers of the Threads, taken from the
102  * "SNUM Table" chart in the QE Reference Manual. The order is not important,
103  * we just need to know what the SNUMs are for the threads.
104  */
105 static u8 thread_snum[] = {
106 /* Evthreads 16-29 are not supported in MPC8309 */
107 #if !defined(CONFIG_MPC8309)
108 	0x04, 0x05, 0x0c, 0x0d,
109 	0x14, 0x15, 0x1c, 0x1d,
110 	0x24, 0x25, 0x2c, 0x2d,
111 	0x34, 0x35,
112 #endif
113 	0x88, 0x89, 0x98, 0x99,
114 	0xa8, 0xa9, 0xb8, 0xb9,
115 	0xc8, 0xc9, 0xd8, 0xd9,
116 	0xe8, 0xe9, 0x08, 0x09,
117 	0x18, 0x19, 0x28, 0x29,
118 	0x38, 0x39, 0x48, 0x49,
119 	0x58, 0x59, 0x68, 0x69,
120 	0x78, 0x79, 0x80, 0x81
121 };
122 
123 static void qe_snums_init(void)
124 {
125 	int	i;
126 
127 	for (i = 0; i < QE_NUM_OF_SNUM; i++) {
128 		snums[i].state = QE_SNUM_STATE_FREE;
129 		snums[i].num   = thread_snum[i];
130 	}
131 }
132 
133 int qe_get_snum(void)
134 {
135 	int	snum = -EBUSY;
136 	int	i;
137 
138 	for (i = 0; i < QE_NUM_OF_SNUM; i++) {
139 		if (snums[i].state == QE_SNUM_STATE_FREE) {
140 			snums[i].state = QE_SNUM_STATE_USED;
141 			snum = snums[i].num;
142 			break;
143 		}
144 	}
145 
146 	return snum;
147 }
148 
149 void qe_put_snum(u8 snum)
150 {
151 	int	i;
152 
153 	for (i = 0; i < QE_NUM_OF_SNUM; i++) {
154 		if (snums[i].num == snum) {
155 			snums[i].state = QE_SNUM_STATE_FREE;
156 			break;
157 		}
158 	}
159 }
160 
161 void qe_init(uint qe_base)
162 {
163 	/* Init the QE IMMR base */
164 	qe_immr = (qe_map_t *)qe_base;
165 
166 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_NOR
167 	/*
168 	 * Upload microcode to IRAM for those SOCs which do not have ROM in QE.
169 	 */
170 	qe_upload_firmware((const void *)CONFIG_SYS_QE_FW_ADDR);
171 
172 	/* enable the microcode in IRAM */
173 	out_be32(&qe_immr->iram.iready,QE_IRAM_READY);
174 #endif
175 
176 	gd->arch.mp_alloc_base = QE_DATAONLY_BASE;
177 	gd->arch.mp_alloc_top = gd->arch.mp_alloc_base + QE_DATAONLY_SIZE;
178 
179 	qe_sdma_init();
180 	qe_snums_init();
181 }
182 
183 void qe_reset(void)
184 {
185 	qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
186 			 (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0);
187 }
188 
189 void qe_assign_page(uint snum, uint para_ram_base)
190 {
191 	u32	cecr;
192 
193 	out_be32(&qe_immr->cp.cecdr, para_ram_base);
194 	out_be32(&qe_immr->cp.cecr, ((u32) snum<<QE_CR_ASSIGN_PAGE_SNUM_SHIFT)
195 					 | QE_CR_FLG | QE_ASSIGN_PAGE);
196 
197 	/* Wait for the QE_CR_FLG to clear */
198 	do {
199 		cecr = in_be32(&qe_immr->cp.cecr);
200 	} while (cecr & QE_CR_FLG );
201 
202 	return;
203 }
204 
205 /*
206  * brg: 0~15 as BRG1~BRG16
207    rate: baud rate
208  * BRG input clock comes from the BRGCLK (internal clock generated from
209    the QE clock, it is one-half of the QE clock), If need the clock source
210    from CLKn pin, we have te change the function.
211  */
212 
213 #define BRG_CLK		(gd->arch.brg_clk)
214 
215 int qe_set_brg(uint brg, uint rate)
216 {
217 	volatile uint	*bp;
218 	u32		divisor;
219 	int		div16 = 0;
220 
221 	if (brg >= QE_NUM_OF_BRGS)
222 		return -EINVAL;
223 	bp = (uint *)&qe_immr->brg.brgc1;
224 	bp += brg;
225 
226 	divisor = (BRG_CLK / rate);
227 	if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
228 		div16 = 1;
229 		divisor /= 16;
230 	}
231 
232 	*bp = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
233 	__asm__ __volatile__("sync");
234 
235 	if (div16) {
236 		*bp |= QE_BRGC_DIV16;
237 		__asm__ __volatile__("sync");
238 	}
239 
240 	return 0;
241 }
242 
243 /* Set ethernet MII clock master
244 */
245 int qe_set_mii_clk_src(int ucc_num)
246 {
247 	u32	cmxgcr;
248 
249 	/* check if the UCC number is in range. */
250 	if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0)) {
251 		printf("%s: ucc num not in ranges\n", __FUNCTION__);
252 		return -EINVAL;
253 	}
254 
255 	cmxgcr = in_be32(&qe_immr->qmx.cmxgcr);
256 	cmxgcr &= ~QE_CMXGCR_MII_ENET_MNG_MASK;
257 	cmxgcr |= (ucc_num <<QE_CMXGCR_MII_ENET_MNG_SHIFT);
258 	out_be32(&qe_immr->qmx.cmxgcr, cmxgcr);
259 
260 	return 0;
261 }
262 
263 /* Firmware information stored here for qe_get_firmware_info() */
264 static struct qe_firmware_info qe_firmware_info;
265 
266 /*
267  * Set to 1 if QE firmware has been uploaded, and therefore
268  * qe_firmware_info contains valid data.
269  */
270 static int qe_firmware_uploaded;
271 
272 /*
273  * Upload a QE microcode
274  *
275  * This function is a worker function for qe_upload_firmware().  It does
276  * the actual uploading of the microcode.
277  */
278 static void qe_upload_microcode(const void *base,
279 	const struct qe_microcode *ucode)
280 {
281 	const u32 *code = base + be32_to_cpu(ucode->code_offset);
282 	unsigned int i;
283 
284 	if (ucode->major || ucode->minor || ucode->revision)
285 		printf("QE: uploading microcode '%s' version %u.%u.%u\n",
286 			ucode->id, ucode->major, ucode->minor, ucode->revision);
287 	else
288 		printf("QE: uploading microcode '%s'\n", ucode->id);
289 
290 	/* Use auto-increment */
291 	out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
292 		QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
293 
294 	for (i = 0; i < be32_to_cpu(ucode->count); i++)
295 		out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
296 }
297 
298 /*
299  * Upload a microcode to the I-RAM at a specific address.
300  *
301  * See docs/README.qe_firmware for information on QE microcode uploading.
302  *
303  * Currently, only version 1 is supported, so the 'version' field must be
304  * set to 1.
305  *
306  * The SOC model and revision are not validated, they are only displayed for
307  * informational purposes.
308  *
309  * 'calc_size' is the calculated size, in bytes, of the firmware structure and
310  * all of the microcode structures, minus the CRC.
311  *
312  * 'length' is the size that the structure says it is, including the CRC.
313  */
314 int qe_upload_firmware(const struct qe_firmware *firmware)
315 {
316 	unsigned int i;
317 	unsigned int j;
318 	u32 crc;
319 	size_t calc_size = sizeof(struct qe_firmware);
320 	size_t length;
321 	const struct qe_header *hdr;
322 #ifdef CONFIG_DEEP_SLEEP
323 	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
324 #endif
325 	if (!firmware) {
326 		printf("Invalid address\n");
327 		return -EINVAL;
328 	}
329 
330 	hdr = &firmware->header;
331 	length = be32_to_cpu(hdr->length);
332 
333 	/* Check the magic */
334 	if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
335 	    (hdr->magic[2] != 'F')) {
336 		printf("QE microcode not found\n");
337 #ifdef CONFIG_DEEP_SLEEP
338 		setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
339 #endif
340 		return -EPERM;
341 	}
342 
343 	/* Check the version */
344 	if (hdr->version != 1) {
345 		printf("Unsupported version\n");
346 		return -EPERM;
347 	}
348 
349 	/* Validate some of the fields */
350 	if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
351 		printf("Invalid data\n");
352 		return -EINVAL;
353 	}
354 
355 	/* Validate the length and check if there's a CRC */
356 	calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
357 
358 	for (i = 0; i < firmware->count; i++)
359 		/*
360 		 * For situations where the second RISC uses the same microcode
361 		 * as the first, the 'code_offset' and 'count' fields will be
362 		 * zero, so it's okay to add those.
363 		 */
364 		calc_size += sizeof(u32) *
365 			be32_to_cpu(firmware->microcode[i].count);
366 
367 	/* Validate the length */
368 	if (length != calc_size + sizeof(u32)) {
369 		printf("Invalid length\n");
370 		return -EPERM;
371 	}
372 
373 	/*
374 	 * Validate the CRC.  We would normally call crc32_no_comp(), but that
375 	 * function isn't available unless you turn on JFFS support.
376 	 */
377 	crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
378 	if (crc != (crc32(-1, (const void *) firmware, calc_size) ^ -1)) {
379 		printf("Firmware CRC is invalid\n");
380 		return -EIO;
381 	}
382 
383 	/*
384 	 * If the microcode calls for it, split the I-RAM.
385 	 */
386 	if (!firmware->split) {
387 		out_be16(&qe_immr->cp.cercr,
388 			in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
389 	}
390 
391 	if (firmware->soc.model)
392 		printf("Firmware '%s' for %u V%u.%u\n",
393 			firmware->id, be16_to_cpu(firmware->soc.model),
394 			firmware->soc.major, firmware->soc.minor);
395 	else
396 		printf("Firmware '%s'\n", firmware->id);
397 
398 	/*
399 	 * The QE only supports one microcode per RISC, so clear out all the
400 	 * saved microcode information and put in the new.
401 	 */
402 	memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
403 	strcpy(qe_firmware_info.id, (char *)firmware->id);
404 	qe_firmware_info.extended_modes = firmware->extended_modes;
405 	memcpy(qe_firmware_info.vtraps, firmware->vtraps,
406 		sizeof(firmware->vtraps));
407 	qe_firmware_uploaded = 1;
408 
409 	/* Loop through each microcode. */
410 	for (i = 0; i < firmware->count; i++) {
411 		const struct qe_microcode *ucode = &firmware->microcode[i];
412 
413 		/* Upload a microcode if it's present */
414 		if (ucode->code_offset)
415 			qe_upload_microcode(firmware, ucode);
416 
417 		/* Program the traps for this processor */
418 		for (j = 0; j < 16; j++) {
419 			u32 trap = be32_to_cpu(ucode->traps[j]);
420 
421 			if (trap)
422 				out_be32(&qe_immr->rsp[i].tibcr[j], trap);
423 		}
424 
425 		/* Enable traps */
426 		out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
427 	}
428 
429 	return 0;
430 }
431 
432 struct qe_firmware_info *qe_get_firmware_info(void)
433 {
434 	return qe_firmware_uploaded ? &qe_firmware_info : NULL;
435 }
436 
437 static int qe_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
438 {
439 	ulong addr;
440 
441 	if (argc < 3)
442 		return cmd_usage(cmdtp);
443 
444 	if (strcmp(argv[1], "fw") == 0) {
445 		addr = simple_strtoul(argv[2], NULL, 16);
446 
447 		if (!addr) {
448 			printf("Invalid address\n");
449 			return -EINVAL;
450 		}
451 
452 		/*
453 		 * If a length was supplied, compare that with the 'length'
454 		 * field.
455 		 */
456 
457 		if (argc > 3) {
458 			ulong length = simple_strtoul(argv[3], NULL, 16);
459 			struct qe_firmware *firmware = (void *) addr;
460 
461 			if (length != be32_to_cpu(firmware->header.length)) {
462 				printf("Length mismatch\n");
463 				return -EINVAL;
464 			}
465 		}
466 
467 		return qe_upload_firmware((const struct qe_firmware *) addr);
468 	}
469 
470 	return cmd_usage(cmdtp);
471 }
472 
473 U_BOOT_CMD(
474 	qe, 4, 0, qe_cmd,
475 	"QUICC Engine commands",
476 	"fw <addr> [<length>] - Upload firmware binary at address <addr> to "
477 		"the QE,\n"
478 	"\twith optional length <length> verification."
479 );
480