[POWERPC] QE: implement qe_muram_offset
[deliverable/linux.git] / arch / powerpc / sysdev / qe_lib / qe.c
CommitLineData
98658538
LY
1/*
2 * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved.
3 *
4 * Authors: Shlomi Gridish <gridish@freescale.com>
5 * Li Yang <leoli@freescale.com>
6 * Based on cpm2_common.c from Dan Malek (dmalek@jlc.net)
7 *
8 * Description:
9 * General Purpose functions for the global management of the
10 * QUICC Engine (QE).
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version.
16 */
17#include <linux/errno.h>
18#include <linux/sched.h>
19#include <linux/kernel.h>
20#include <linux/param.h>
21#include <linux/string.h>
22#include <linux/mm.h>
23#include <linux/interrupt.h>
24#include <linux/bootmem.h>
25#include <linux/module.h>
26#include <linux/delay.h>
27#include <linux/ioport.h>
bc556ba9 28#include <linux/crc32.h>
98658538
LY
29#include <asm/irq.h>
30#include <asm/page.h>
31#include <asm/pgtable.h>
32#include <asm/immap_qe.h>
33#include <asm/qe.h>
34#include <asm/prom.h>
35#include <asm/rheap.h>
36
37static void qe_snums_init(void);
38static void qe_muram_init(void);
39static int qe_sdma_init(void);
40
41static DEFINE_SPINLOCK(qe_lock);
42
43/* QE snum state */
44enum qe_snum_state {
45 QE_SNUM_STATE_USED,
46 QE_SNUM_STATE_FREE
47};
48
49/* QE snum */
50struct qe_snum {
51 u8 num;
52 enum qe_snum_state state;
53};
54
55/* We allocate this here because it is used almost exclusively for
56 * the communication processor devices.
57 */
0b51b02e 58struct qe_immap __iomem *qe_immr;
98658538
LY
59EXPORT_SYMBOL(qe_immr);
60
61static struct qe_snum snums[QE_NUM_OF_SNUM]; /* Dynamically allocated SNUMs */
62
63static phys_addr_t qebase = -1;
64
65phys_addr_t get_qe_base(void)
66{
67 struct device_node *qe;
a2dd70a1 68 unsigned int size;
d8985fd2 69 const u32 *prop;
98658538
LY
70
71 if (qebase != -1)
72 return qebase;
73
a2dd70a1
AV
74 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
75 if (!qe) {
76 qe = of_find_node_by_type(NULL, "qe");
77 if (!qe)
78 return qebase;
79 }
80
81 prop = of_get_property(qe, "reg", &size);
d8985fd2
AV
82 if (prop && size >= sizeof(*prop))
83 qebase = of_translate_address(qe, prop);
a2dd70a1 84 of_node_put(qe);
98658538
LY
85
86 return qebase;
87}
88
89EXPORT_SYMBOL(get_qe_base);
90
91void qe_reset(void)
92{
93 if (qe_immr == NULL)
94 qe_immr = ioremap(get_qe_base(), QE_IMMAP_SIZE);
95
96 qe_snums_init();
97
98 qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
99 QE_CR_PROTOCOL_UNSPECIFIED, 0);
100
101 /* Reclaim the MURAM memory for our use. */
102 qe_muram_init();
103
104 if (qe_sdma_init())
105 panic("sdma init failed!");
106}
107
108int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input)
109{
110 unsigned long flags;
111 u8 mcn_shift = 0, dev_shift = 0;
112
113 spin_lock_irqsave(&qe_lock, flags);
114 if (cmd == QE_RESET) {
115 out_be32(&qe_immr->cp.cecr, (u32) (cmd | QE_CR_FLG));
116 } else {
117 if (cmd == QE_ASSIGN_PAGE) {
118 /* Here device is the SNUM, not sub-block */
119 dev_shift = QE_CR_SNUM_SHIFT;
120 } else if (cmd == QE_ASSIGN_RISC) {
121 /* Here device is the SNUM, and mcnProtocol is
122 * e_QeCmdRiscAssignment value */
123 dev_shift = QE_CR_SNUM_SHIFT;
124 mcn_shift = QE_CR_MCN_RISC_ASSIGN_SHIFT;
125 } else {
126 if (device == QE_CR_SUBBLOCK_USB)
127 mcn_shift = QE_CR_MCN_USB_SHIFT;
128 else
129 mcn_shift = QE_CR_MCN_NORMAL_SHIFT;
130 }
131
302439d2 132 out_be32(&qe_immr->cp.cecdr, cmd_input);
98658538
LY
133 out_be32(&qe_immr->cp.cecr,
134 (cmd | QE_CR_FLG | ((u32) device << dev_shift) | (u32)
135 mcn_protocol << mcn_shift));
136 }
137
138 /* wait for the QE_CR_FLG to clear */
139 while(in_be32(&qe_immr->cp.cecr) & QE_CR_FLG)
140 cpu_relax();
141 spin_unlock_irqrestore(&qe_lock, flags);
142
143 return 0;
144}
145EXPORT_SYMBOL(qe_issue_cmd);
146
147/* Set a baud rate generator. This needs lots of work. There are
148 * 16 BRGs, which can be connected to the QE channels or output
149 * as clocks. The BRGs are in two different block of internal
150 * memory mapped space.
6b0b594b 151 * The BRG clock is the QE clock divided by 2.
98658538
LY
152 * It was set up long ago during the initial boot phase and is
153 * is given to us.
154 * Baud rate clocks are zero-based in the driver code (as that maps
155 * to port numbers). Documentation uses 1-based numbering.
156 */
157static unsigned int brg_clk = 0;
158
159unsigned int get_brg_clk(void)
160{
161 struct device_node *qe;
a2dd70a1
AV
162 unsigned int size;
163 const u32 *prop;
164
98658538
LY
165 if (brg_clk)
166 return brg_clk;
167
a2dd70a1
AV
168 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
169 if (!qe) {
170 qe = of_find_node_by_type(NULL, "qe");
171 if (!qe)
172 return brg_clk;
173 }
174
175 prop = of_get_property(qe, "brg-frequency", &size);
d8985fd2
AV
176 if (prop && size == sizeof(*prop))
177 brg_clk = *prop;
a2dd70a1 178
a2dd70a1
AV
179 of_node_put(qe);
180
98658538
LY
181 return brg_clk;
182}
183
6b0b594b
TT
184/* Program the BRG to the given sampling rate and multiplier
185 *
7264ec44 186 * @brg: the BRG, QE_BRG1 - QE_BRG16
6b0b594b
TT
187 * @rate: the desired sampling rate
188 * @multiplier: corresponds to the value programmed in GUMR_L[RDCR] or
189 * GUMR_L[TDCR]. E.g., if this BRG is the RX clock, and GUMR_L[RDCR]=01,
190 * then 'multiplier' should be 8.
98658538 191 */
7264ec44 192int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier)
98658538 193{
98658538 194 u32 divisor, tempval;
6b0b594b 195 u32 div16 = 0;
98658538 196
7264ec44
TT
197 if ((brg < QE_BRG1) || (brg > QE_BRG16))
198 return -EINVAL;
199
6b0b594b 200 divisor = get_brg_clk() / (rate * multiplier);
98658538 201
98658538 202 if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
6b0b594b 203 div16 = QE_BRGC_DIV16;
98658538
LY
204 divisor /= 16;
205 }
206
6b0b594b
TT
207 /* Errata QE_General4, which affects some MPC832x and MPC836x SOCs, says
208 that the BRG divisor must be even if you're not using divide-by-16
209 mode. */
210 if (!div16 && (divisor & 1))
211 divisor++;
212
213 tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
214 QE_BRGC_ENABLE | div16;
98658538 215
7264ec44
TT
216 out_be32(&qe_immr->brg.brgc[brg - QE_BRG1], tempval);
217
218 return 0;
98658538 219}
7264ec44 220EXPORT_SYMBOL(qe_setbrg);
98658538 221
174b0da2
TT
222/* Convert a string to a QE clock source enum
223 *
224 * This function takes a string, typically from a property in the device
225 * tree, and returns the corresponding "enum qe_clock" value.
226*/
227enum qe_clock qe_clock_source(const char *source)
228{
229 unsigned int i;
230
231 if (strcasecmp(source, "none") == 0)
232 return QE_CLK_NONE;
233
234 if (strncasecmp(source, "brg", 3) == 0) {
235 i = simple_strtoul(source + 3, NULL, 10);
236 if ((i >= 1) && (i <= 16))
237 return (QE_BRG1 - 1) + i;
238 else
239 return QE_CLK_DUMMY;
240 }
241
242 if (strncasecmp(source, "clk", 3) == 0) {
243 i = simple_strtoul(source + 3, NULL, 10);
244 if ((i >= 1) && (i <= 24))
245 return (QE_CLK1 - 1) + i;
246 else
247 return QE_CLK_DUMMY;
248 }
249
250 return QE_CLK_DUMMY;
251}
252EXPORT_SYMBOL(qe_clock_source);
253
98658538
LY
254/* Initialize SNUMs (thread serial numbers) according to
255 * QE Module Control chapter, SNUM table
256 */
257static void qe_snums_init(void)
258{
259 int i;
260 static const u8 snum_init[] = {
261 0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
262 0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x88, 0x89,
263 0x98, 0x99, 0xA8, 0xA9, 0xB8, 0xB9, 0xC8, 0xC9,
264 0xD8, 0xD9, 0xE8, 0xE9,
265 };
266
267 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
268 snums[i].num = snum_init[i];
269 snums[i].state = QE_SNUM_STATE_FREE;
270 }
271}
272
273int qe_get_snum(void)
274{
275 unsigned long flags;
276 int snum = -EBUSY;
277 int i;
278
279 spin_lock_irqsave(&qe_lock, flags);
280 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
281 if (snums[i].state == QE_SNUM_STATE_FREE) {
282 snums[i].state = QE_SNUM_STATE_USED;
283 snum = snums[i].num;
284 break;
285 }
286 }
287 spin_unlock_irqrestore(&qe_lock, flags);
288
289 return snum;
290}
291EXPORT_SYMBOL(qe_get_snum);
292
293void qe_put_snum(u8 snum)
294{
295 int i;
296
297 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
298 if (snums[i].num == snum) {
299 snums[i].state = QE_SNUM_STATE_FREE;
300 break;
301 }
302 }
303}
304EXPORT_SYMBOL(qe_put_snum);
305
306static int qe_sdma_init(void)
307{
308 struct sdma *sdma = &qe_immr->sdma;
4c35630c 309 unsigned long sdma_buf_offset;
98658538
LY
310
311 if (!sdma)
312 return -ENODEV;
313
314 /* allocate 2 internal temporary buffers (512 bytes size each) for
315 * the SDMA */
7f013bc9 316 sdma_buf_offset = qe_muram_alloc(512 * 2, 4096);
4c35630c 317 if (IS_ERR_VALUE(sdma_buf_offset))
98658538
LY
318 return -ENOMEM;
319
4c35630c 320 out_be32(&sdma->sdebcr, (u32) sdma_buf_offset & QE_SDEBCR_BA_MASK);
7f013bc9
CM
321 out_be32(&sdma->sdmr, (QE_SDMR_GLB_1_MSK |
322 (0x1 << QE_SDMR_CEN_SHIFT)));
98658538
LY
323
324 return 0;
325}
326
327/*
328 * muram_alloc / muram_free bits.
329 */
330static DEFINE_SPINLOCK(qe_muram_lock);
331
332/* 16 blocks should be enough to satisfy all requests
333 * until the memory subsystem goes up... */
334static rh_block_t qe_boot_muram_rh_block[16];
335static rh_info_t qe_muram_info;
336
337static void qe_muram_init(void)
338{
339 struct device_node *np;
a2dd70a1 340 const u32 *address;
98658538
LY
341 u64 size;
342 unsigned int flags;
343
344 /* initialize the info header */
345 rh_init(&qe_muram_info, 1,
346 sizeof(qe_boot_muram_rh_block) /
347 sizeof(qe_boot_muram_rh_block[0]), qe_boot_muram_rh_block);
348
349 /* Attach the usable muram area */
350 /* XXX: This is a subset of the available muram. It
351 * varies with the processor and the microcode patches activated.
352 */
a2dd70a1
AV
353 np = of_find_compatible_node(NULL, NULL, "fsl,qe-muram-data");
354 if (!np) {
355 np = of_find_node_by_name(NULL, "data-only");
356 if (!np) {
357 WARN_ON(1);
358 return;
359 }
98658538 360 }
a2dd70a1
AV
361
362 address = of_get_address(np, 0, &size, &flags);
363 WARN_ON(!address);
364
365 of_node_put(np);
366 if (address)
367 rh_attach_region(&qe_muram_info, *address, (int)size);
98658538
LY
368}
369
370/* This function returns an index into the MURAM area.
371 */
4c35630c 372unsigned long qe_muram_alloc(int size, int align)
98658538 373{
4c35630c 374 unsigned long start;
98658538
LY
375 unsigned long flags;
376
377 spin_lock_irqsave(&qe_muram_lock, flags);
378 start = rh_alloc_align(&qe_muram_info, size, align, "QE");
379 spin_unlock_irqrestore(&qe_muram_lock, flags);
380
4c35630c 381 return start;
98658538
LY
382}
383EXPORT_SYMBOL(qe_muram_alloc);
384
4c35630c 385int qe_muram_free(unsigned long offset)
98658538
LY
386{
387 int ret;
388 unsigned long flags;
389
390 spin_lock_irqsave(&qe_muram_lock, flags);
4c35630c 391 ret = rh_free(&qe_muram_info, offset);
98658538
LY
392 spin_unlock_irqrestore(&qe_muram_lock, flags);
393
394 return ret;
395}
396EXPORT_SYMBOL(qe_muram_free);
397
398/* not sure if this is ever needed */
4c35630c 399unsigned long qe_muram_alloc_fixed(unsigned long offset, int size)
98658538 400{
4c35630c 401 unsigned long start;
98658538
LY
402 unsigned long flags;
403
404 spin_lock_irqsave(&qe_muram_lock, flags);
4c35630c 405 start = rh_alloc_fixed(&qe_muram_info, offset, size, "commproc");
98658538
LY
406 spin_unlock_irqrestore(&qe_muram_lock, flags);
407
4c35630c 408 return start;
98658538
LY
409}
410EXPORT_SYMBOL(qe_muram_alloc_fixed);
411
412void qe_muram_dump(void)
413{
414 rh_dump(&qe_muram_info);
415}
416EXPORT_SYMBOL(qe_muram_dump);
417
bc556ba9
TT
418/* The maximum number of RISCs we support */
419#define MAX_QE_RISC 2
420
421/* Firmware information stored here for qe_get_firmware_info() */
422static struct qe_firmware_info qe_firmware_info;
423
424/*
425 * Set to 1 if QE firmware has been uploaded, and therefore
426 * qe_firmware_info contains valid data.
427 */
428static int qe_firmware_uploaded;
429
430/*
431 * Upload a QE microcode
432 *
433 * This function is a worker function for qe_upload_firmware(). It does
434 * the actual uploading of the microcode.
435 */
436static void qe_upload_microcode(const void *base,
437 const struct qe_microcode *ucode)
438{
439 const __be32 *code = base + be32_to_cpu(ucode->code_offset);
440 unsigned int i;
441
442 if (ucode->major || ucode->minor || ucode->revision)
443 printk(KERN_INFO "qe-firmware: "
444 "uploading microcode '%s' version %u.%u.%u\n",
445 ucode->id, ucode->major, ucode->minor, ucode->revision);
446 else
447 printk(KERN_INFO "qe-firmware: "
448 "uploading microcode '%s'\n", ucode->id);
449
450 /* Use auto-increment */
451 out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
452 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
453
454 for (i = 0; i < be32_to_cpu(ucode->count); i++)
455 out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
456}
457
458/*
459 * Upload a microcode to the I-RAM at a specific address.
460 *
461 * See Documentation/powerpc/qe-firmware.txt for information on QE microcode
462 * uploading.
463 *
464 * Currently, only version 1 is supported, so the 'version' field must be
465 * set to 1.
466 *
467 * The SOC model and revision are not validated, they are only displayed for
468 * informational purposes.
469 *
470 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
471 * all of the microcode structures, minus the CRC.
472 *
473 * 'length' is the size that the structure says it is, including the CRC.
474 */
475int qe_upload_firmware(const struct qe_firmware *firmware)
476{
477 unsigned int i;
478 unsigned int j;
479 u32 crc;
480 size_t calc_size = sizeof(struct qe_firmware);
481 size_t length;
482 const struct qe_header *hdr;
483
484 if (!firmware) {
485 printk(KERN_ERR "qe-firmware: invalid pointer\n");
486 return -EINVAL;
487 }
488
489 hdr = &firmware->header;
490 length = be32_to_cpu(hdr->length);
491
492 /* Check the magic */
493 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
494 (hdr->magic[2] != 'F')) {
495 printk(KERN_ERR "qe-firmware: not a microcode\n");
496 return -EPERM;
497 }
498
499 /* Check the version */
500 if (hdr->version != 1) {
501 printk(KERN_ERR "qe-firmware: unsupported version\n");
502 return -EPERM;
503 }
504
505 /* Validate some of the fields */
6f913160 506 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
bc556ba9
TT
507 printk(KERN_ERR "qe-firmware: invalid data\n");
508 return -EINVAL;
509 }
510
511 /* Validate the length and check if there's a CRC */
512 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
513
514 for (i = 0; i < firmware->count; i++)
515 /*
516 * For situations where the second RISC uses the same microcode
517 * as the first, the 'code_offset' and 'count' fields will be
518 * zero, so it's okay to add those.
519 */
520 calc_size += sizeof(__be32) *
521 be32_to_cpu(firmware->microcode[i].count);
522
523 /* Validate the length */
524 if (length != calc_size + sizeof(__be32)) {
525 printk(KERN_ERR "qe-firmware: invalid length\n");
526 return -EPERM;
527 }
528
529 /* Validate the CRC */
530 crc = be32_to_cpu(*(__be32 *)((void *)firmware + calc_size));
531 if (crc != crc32(0, firmware, calc_size)) {
532 printk(KERN_ERR "qe-firmware: firmware CRC is invalid\n");
533 return -EIO;
534 }
535
536 /*
537 * If the microcode calls for it, split the I-RAM.
538 */
539 if (!firmware->split)
540 setbits16(&qe_immr->cp.cercr, QE_CP_CERCR_CIR);
541
542 if (firmware->soc.model)
543 printk(KERN_INFO
544 "qe-firmware: firmware '%s' for %u V%u.%u\n",
545 firmware->id, be16_to_cpu(firmware->soc.model),
546 firmware->soc.major, firmware->soc.minor);
547 else
548 printk(KERN_INFO "qe-firmware: firmware '%s'\n",
549 firmware->id);
550
551 /*
552 * The QE only supports one microcode per RISC, so clear out all the
553 * saved microcode information and put in the new.
554 */
555 memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
556 strcpy(qe_firmware_info.id, firmware->id);
557 qe_firmware_info.extended_modes = firmware->extended_modes;
558 memcpy(qe_firmware_info.vtraps, firmware->vtraps,
559 sizeof(firmware->vtraps));
560
561 /* Loop through each microcode. */
562 for (i = 0; i < firmware->count; i++) {
563 const struct qe_microcode *ucode = &firmware->microcode[i];
564
565 /* Upload a microcode if it's present */
566 if (ucode->code_offset)
567 qe_upload_microcode(firmware, ucode);
568
569 /* Program the traps for this processor */
570 for (j = 0; j < 16; j++) {
571 u32 trap = be32_to_cpu(ucode->traps[j]);
572
573 if (trap)
574 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
575 }
576
577 /* Enable traps */
578 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
579 }
580
581 qe_firmware_uploaded = 1;
582
583 return 0;
584}
585EXPORT_SYMBOL(qe_upload_firmware);
586
587/*
588 * Get info on the currently-loaded firmware
589 *
590 * This function also checks the device tree to see if the boot loader has
591 * uploaded a firmware already.
592 */
593struct qe_firmware_info *qe_get_firmware_info(void)
594{
595 static int initialized;
596 struct property *prop;
597 struct device_node *qe;
598 struct device_node *fw = NULL;
599 const char *sprop;
600 unsigned int i;
601
602 /*
603 * If we haven't checked yet, and a driver hasn't uploaded a firmware
604 * yet, then check the device tree for information.
605 */
86f4e5d4
IN
606 if (qe_firmware_uploaded)
607 return &qe_firmware_info;
608
609 if (initialized)
bc556ba9
TT
610 return NULL;
611
612 initialized = 1;
613
614 /*
615 * Newer device trees have an "fsl,qe" compatible property for the QE
616 * node, but we still need to support older device trees.
617 */
618 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
619 if (!qe) {
620 qe = of_find_node_by_type(NULL, "qe");
621 if (!qe)
622 return NULL;
623 }
624
625 /* Find the 'firmware' child node */
626 for_each_child_of_node(qe, fw) {
627 if (strcmp(fw->name, "firmware") == 0)
628 break;
629 }
630
631 of_node_put(qe);
632
633 /* Did we find the 'firmware' node? */
634 if (!fw)
635 return NULL;
636
637 qe_firmware_uploaded = 1;
638
639 /* Copy the data into qe_firmware_info*/
640 sprop = of_get_property(fw, "id", NULL);
641 if (sprop)
642 strncpy(qe_firmware_info.id, sprop,
643 sizeof(qe_firmware_info.id) - 1);
644
645 prop = of_find_property(fw, "extended-modes", NULL);
646 if (prop && (prop->length == sizeof(u64))) {
647 const u64 *iprop = prop->value;
648
649 qe_firmware_info.extended_modes = *iprop;
650 }
651
652 prop = of_find_property(fw, "virtual-traps", NULL);
653 if (prop && (prop->length == 32)) {
654 const u32 *iprop = prop->value;
655
656 for (i = 0; i < ARRAY_SIZE(qe_firmware_info.vtraps); i++)
657 qe_firmware_info.vtraps[i] = iprop[i];
658 }
659
660 of_node_put(fw);
661
662 return &qe_firmware_info;
663}
664EXPORT_SYMBOL(qe_get_firmware_info);
665
This page took 0.175177 seconds and 5 git commands to generate.