]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - drivers/qe/qe.c
config: rename CONFIG_MX* to CONFIG_SOC_MX*
[karo-tx-uboot.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_SOC_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_SOC_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_SOC_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 );