Linux 2.6.31.6
[linux/fpc-iii.git] / arch / powerpc / sysdev / qe_lib / qe.c
blob237e3654f48ca6b1059c7d2017ccd31544b215e2
1 /*
2 * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved.
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)
8 * Description:
9 * General Purpose functions for the global management of the
10 * QUICC Engine (QE).
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.
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/spinlock.h>
23 #include <linux/mm.h>
24 #include <linux/interrupt.h>
25 #include <linux/bootmem.h>
26 #include <linux/module.h>
27 #include <linux/delay.h>
28 #include <linux/ioport.h>
29 #include <linux/crc32.h>
30 #include <asm/irq.h>
31 #include <asm/page.h>
32 #include <asm/pgtable.h>
33 #include <asm/immap_qe.h>
34 #include <asm/qe.h>
35 #include <asm/prom.h>
36 #include <asm/rheap.h>
38 static void qe_snums_init(void);
39 static int qe_sdma_init(void);
41 static DEFINE_SPINLOCK(qe_lock);
42 DEFINE_SPINLOCK(cmxgcr_lock);
43 EXPORT_SYMBOL(cmxgcr_lock);
45 /* QE snum state */
46 enum qe_snum_state {
47 QE_SNUM_STATE_USED,
48 QE_SNUM_STATE_FREE
51 /* QE snum */
52 struct qe_snum {
53 u8 num;
54 enum qe_snum_state state;
57 /* We allocate this here because it is used almost exclusively for
58 * the communication processor devices.
60 struct qe_immap __iomem *qe_immr;
61 EXPORT_SYMBOL(qe_immr);
63 static struct qe_snum snums[QE_NUM_OF_SNUM]; /* Dynamically allocated SNUMs */
64 static unsigned int qe_num_of_snum;
66 static phys_addr_t qebase = -1;
68 phys_addr_t get_qe_base(void)
70 struct device_node *qe;
71 int size;
72 const u32 *prop;
74 if (qebase != -1)
75 return qebase;
77 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
78 if (!qe) {
79 qe = of_find_node_by_type(NULL, "qe");
80 if (!qe)
81 return qebase;
84 prop = of_get_property(qe, "reg", &size);
85 if (prop && size >= sizeof(*prop))
86 qebase = of_translate_address(qe, prop);
87 of_node_put(qe);
89 return qebase;
92 EXPORT_SYMBOL(get_qe_base);
94 void __init qe_reset(void)
96 if (qe_immr == NULL)
97 qe_immr = ioremap(get_qe_base(), QE_IMMAP_SIZE);
99 qe_snums_init();
101 qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
102 QE_CR_PROTOCOL_UNSPECIFIED, 0);
104 /* Reclaim the MURAM memory for our use. */
105 qe_muram_init();
107 if (qe_sdma_init())
108 panic("sdma init failed!");
111 int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input)
113 unsigned long flags;
114 u8 mcn_shift = 0, dev_shift = 0;
115 u32 ret;
117 spin_lock_irqsave(&qe_lock, flags);
118 if (cmd == QE_RESET) {
119 out_be32(&qe_immr->cp.cecr, (u32) (cmd | QE_CR_FLG));
120 } else {
121 if (cmd == QE_ASSIGN_PAGE) {
122 /* Here device is the SNUM, not sub-block */
123 dev_shift = QE_CR_SNUM_SHIFT;
124 } else if (cmd == QE_ASSIGN_RISC) {
125 /* Here device is the SNUM, and mcnProtocol is
126 * e_QeCmdRiscAssignment value */
127 dev_shift = QE_CR_SNUM_SHIFT;
128 mcn_shift = QE_CR_MCN_RISC_ASSIGN_SHIFT;
129 } else {
130 if (device == QE_CR_SUBBLOCK_USB)
131 mcn_shift = QE_CR_MCN_USB_SHIFT;
132 else
133 mcn_shift = QE_CR_MCN_NORMAL_SHIFT;
136 out_be32(&qe_immr->cp.cecdr, cmd_input);
137 out_be32(&qe_immr->cp.cecr,
138 (cmd | QE_CR_FLG | ((u32) device << dev_shift) | (u32)
139 mcn_protocol << mcn_shift));
142 /* wait for the QE_CR_FLG to clear */
143 ret = spin_event_timeout((in_be32(&qe_immr->cp.cecr) & QE_CR_FLG) == 0,
144 100, 0);
145 /* On timeout (e.g. failure), the expression will be false (ret == 0),
146 otherwise it will be true (ret == 1). */
147 spin_unlock_irqrestore(&qe_lock, flags);
149 return ret == 1;
151 EXPORT_SYMBOL(qe_issue_cmd);
153 /* Set a baud rate generator. This needs lots of work. There are
154 * 16 BRGs, which can be connected to the QE channels or output
155 * as clocks. The BRGs are in two different block of internal
156 * memory mapped space.
157 * The BRG clock is the QE clock divided by 2.
158 * It was set up long ago during the initial boot phase and is
159 * is given to us.
160 * Baud rate clocks are zero-based in the driver code (as that maps
161 * to port numbers). Documentation uses 1-based numbering.
163 static unsigned int brg_clk = 0;
165 unsigned int qe_get_brg_clk(void)
167 struct device_node *qe;
168 int size;
169 const u32 *prop;
171 if (brg_clk)
172 return brg_clk;
174 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
175 if (!qe) {
176 qe = of_find_node_by_type(NULL, "qe");
177 if (!qe)
178 return brg_clk;
181 prop = of_get_property(qe, "brg-frequency", &size);
182 if (prop && size == sizeof(*prop))
183 brg_clk = *prop;
185 of_node_put(qe);
187 return brg_clk;
189 EXPORT_SYMBOL(qe_get_brg_clk);
191 /* Program the BRG to the given sampling rate and multiplier
193 * @brg: the BRG, QE_BRG1 - QE_BRG16
194 * @rate: the desired sampling rate
195 * @multiplier: corresponds to the value programmed in GUMR_L[RDCR] or
196 * GUMR_L[TDCR]. E.g., if this BRG is the RX clock, and GUMR_L[RDCR]=01,
197 * then 'multiplier' should be 8.
199 int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier)
201 u32 divisor, tempval;
202 u32 div16 = 0;
204 if ((brg < QE_BRG1) || (brg > QE_BRG16))
205 return -EINVAL;
207 divisor = qe_get_brg_clk() / (rate * multiplier);
209 if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
210 div16 = QE_BRGC_DIV16;
211 divisor /= 16;
214 /* Errata QE_General4, which affects some MPC832x and MPC836x SOCs, says
215 that the BRG divisor must be even if you're not using divide-by-16
216 mode. */
217 if (!div16 && (divisor & 1))
218 divisor++;
220 tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
221 QE_BRGC_ENABLE | div16;
223 out_be32(&qe_immr->brg.brgc[brg - QE_BRG1], tempval);
225 return 0;
227 EXPORT_SYMBOL(qe_setbrg);
229 /* Convert a string to a QE clock source enum
231 * This function takes a string, typically from a property in the device
232 * tree, and returns the corresponding "enum qe_clock" value.
234 enum qe_clock qe_clock_source(const char *source)
236 unsigned int i;
238 if (strcasecmp(source, "none") == 0)
239 return QE_CLK_NONE;
241 if (strncasecmp(source, "brg", 3) == 0) {
242 i = simple_strtoul(source + 3, NULL, 10);
243 if ((i >= 1) && (i <= 16))
244 return (QE_BRG1 - 1) + i;
245 else
246 return QE_CLK_DUMMY;
249 if (strncasecmp(source, "clk", 3) == 0) {
250 i = simple_strtoul(source + 3, NULL, 10);
251 if ((i >= 1) && (i <= 24))
252 return (QE_CLK1 - 1) + i;
253 else
254 return QE_CLK_DUMMY;
257 return QE_CLK_DUMMY;
259 EXPORT_SYMBOL(qe_clock_source);
261 /* Initialize SNUMs (thread serial numbers) according to
262 * QE Module Control chapter, SNUM table
264 static void qe_snums_init(void)
266 int i;
267 static const u8 snum_init[] = {
268 0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
269 0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x88, 0x89,
270 0x98, 0x99, 0xA8, 0xA9, 0xB8, 0xB9, 0xC8, 0xC9,
271 0xD8, 0xD9, 0xE8, 0xE9, 0x08, 0x09, 0x18, 0x19,
272 0x28, 0x29, 0x38, 0x39, 0x48, 0x49, 0x58, 0x59,
273 0x68, 0x69, 0x78, 0x79, 0x80, 0x81,
276 qe_num_of_snum = qe_get_num_of_snums();
278 for (i = 0; i < qe_num_of_snum; i++) {
279 snums[i].num = snum_init[i];
280 snums[i].state = QE_SNUM_STATE_FREE;
284 int qe_get_snum(void)
286 unsigned long flags;
287 int snum = -EBUSY;
288 int i;
290 spin_lock_irqsave(&qe_lock, flags);
291 for (i = 0; i < qe_num_of_snum; i++) {
292 if (snums[i].state == QE_SNUM_STATE_FREE) {
293 snums[i].state = QE_SNUM_STATE_USED;
294 snum = snums[i].num;
295 break;
298 spin_unlock_irqrestore(&qe_lock, flags);
300 return snum;
302 EXPORT_SYMBOL(qe_get_snum);
304 void qe_put_snum(u8 snum)
306 int i;
308 for (i = 0; i < qe_num_of_snum; i++) {
309 if (snums[i].num == snum) {
310 snums[i].state = QE_SNUM_STATE_FREE;
311 break;
315 EXPORT_SYMBOL(qe_put_snum);
317 static int qe_sdma_init(void)
319 struct sdma __iomem *sdma = &qe_immr->sdma;
320 unsigned long sdma_buf_offset;
322 if (!sdma)
323 return -ENODEV;
325 /* allocate 2 internal temporary buffers (512 bytes size each) for
326 * the SDMA */
327 sdma_buf_offset = qe_muram_alloc(512 * 2, 4096);
328 if (IS_ERR_VALUE(sdma_buf_offset))
329 return -ENOMEM;
331 out_be32(&sdma->sdebcr, (u32) sdma_buf_offset & QE_SDEBCR_BA_MASK);
332 out_be32(&sdma->sdmr, (QE_SDMR_GLB_1_MSK |
333 (0x1 << QE_SDMR_CEN_SHIFT)));
335 return 0;
338 /* The maximum number of RISCs we support */
339 #define MAX_QE_RISC 2
341 /* Firmware information stored here for qe_get_firmware_info() */
342 static struct qe_firmware_info qe_firmware_info;
345 * Set to 1 if QE firmware has been uploaded, and therefore
346 * qe_firmware_info contains valid data.
348 static int qe_firmware_uploaded;
351 * Upload a QE microcode
353 * This function is a worker function for qe_upload_firmware(). It does
354 * the actual uploading of the microcode.
356 static void qe_upload_microcode(const void *base,
357 const struct qe_microcode *ucode)
359 const __be32 *code = base + be32_to_cpu(ucode->code_offset);
360 unsigned int i;
362 if (ucode->major || ucode->minor || ucode->revision)
363 printk(KERN_INFO "qe-firmware: "
364 "uploading microcode '%s' version %u.%u.%u\n",
365 ucode->id, ucode->major, ucode->minor, ucode->revision);
366 else
367 printk(KERN_INFO "qe-firmware: "
368 "uploading microcode '%s'\n", ucode->id);
370 /* Use auto-increment */
371 out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
372 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
374 for (i = 0; i < be32_to_cpu(ucode->count); i++)
375 out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
379 * Upload a microcode to the I-RAM at a specific address.
381 * See Documentation/powerpc/qe-firmware.txt for information on QE microcode
382 * uploading.
384 * Currently, only version 1 is supported, so the 'version' field must be
385 * set to 1.
387 * The SOC model and revision are not validated, they are only displayed for
388 * informational purposes.
390 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
391 * all of the microcode structures, minus the CRC.
393 * 'length' is the size that the structure says it is, including the CRC.
395 int qe_upload_firmware(const struct qe_firmware *firmware)
397 unsigned int i;
398 unsigned int j;
399 u32 crc;
400 size_t calc_size = sizeof(struct qe_firmware);
401 size_t length;
402 const struct qe_header *hdr;
404 if (!firmware) {
405 printk(KERN_ERR "qe-firmware: invalid pointer\n");
406 return -EINVAL;
409 hdr = &firmware->header;
410 length = be32_to_cpu(hdr->length);
412 /* Check the magic */
413 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
414 (hdr->magic[2] != 'F')) {
415 printk(KERN_ERR "qe-firmware: not a microcode\n");
416 return -EPERM;
419 /* Check the version */
420 if (hdr->version != 1) {
421 printk(KERN_ERR "qe-firmware: unsupported version\n");
422 return -EPERM;
425 /* Validate some of the fields */
426 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
427 printk(KERN_ERR "qe-firmware: invalid data\n");
428 return -EINVAL;
431 /* Validate the length and check if there's a CRC */
432 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
434 for (i = 0; i < firmware->count; i++)
436 * For situations where the second RISC uses the same microcode
437 * as the first, the 'code_offset' and 'count' fields will be
438 * zero, so it's okay to add those.
440 calc_size += sizeof(__be32) *
441 be32_to_cpu(firmware->microcode[i].count);
443 /* Validate the length */
444 if (length != calc_size + sizeof(__be32)) {
445 printk(KERN_ERR "qe-firmware: invalid length\n");
446 return -EPERM;
449 /* Validate the CRC */
450 crc = be32_to_cpu(*(__be32 *)((void *)firmware + calc_size));
451 if (crc != crc32(0, firmware, calc_size)) {
452 printk(KERN_ERR "qe-firmware: firmware CRC is invalid\n");
453 return -EIO;
457 * If the microcode calls for it, split the I-RAM.
459 if (!firmware->split)
460 setbits16(&qe_immr->cp.cercr, QE_CP_CERCR_CIR);
462 if (firmware->soc.model)
463 printk(KERN_INFO
464 "qe-firmware: firmware '%s' for %u V%u.%u\n",
465 firmware->id, be16_to_cpu(firmware->soc.model),
466 firmware->soc.major, firmware->soc.minor);
467 else
468 printk(KERN_INFO "qe-firmware: firmware '%s'\n",
469 firmware->id);
472 * The QE only supports one microcode per RISC, so clear out all the
473 * saved microcode information and put in the new.
475 memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
476 strcpy(qe_firmware_info.id, firmware->id);
477 qe_firmware_info.extended_modes = firmware->extended_modes;
478 memcpy(qe_firmware_info.vtraps, firmware->vtraps,
479 sizeof(firmware->vtraps));
481 /* Loop through each microcode. */
482 for (i = 0; i < firmware->count; i++) {
483 const struct qe_microcode *ucode = &firmware->microcode[i];
485 /* Upload a microcode if it's present */
486 if (ucode->code_offset)
487 qe_upload_microcode(firmware, ucode);
489 /* Program the traps for this processor */
490 for (j = 0; j < 16; j++) {
491 u32 trap = be32_to_cpu(ucode->traps[j]);
493 if (trap)
494 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
497 /* Enable traps */
498 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
501 qe_firmware_uploaded = 1;
503 return 0;
505 EXPORT_SYMBOL(qe_upload_firmware);
508 * Get info on the currently-loaded firmware
510 * This function also checks the device tree to see if the boot loader has
511 * uploaded a firmware already.
513 struct qe_firmware_info *qe_get_firmware_info(void)
515 static int initialized;
516 struct property *prop;
517 struct device_node *qe;
518 struct device_node *fw = NULL;
519 const char *sprop;
520 unsigned int i;
523 * If we haven't checked yet, and a driver hasn't uploaded a firmware
524 * yet, then check the device tree for information.
526 if (qe_firmware_uploaded)
527 return &qe_firmware_info;
529 if (initialized)
530 return NULL;
532 initialized = 1;
535 * Newer device trees have an "fsl,qe" compatible property for the QE
536 * node, but we still need to support older device trees.
538 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
539 if (!qe) {
540 qe = of_find_node_by_type(NULL, "qe");
541 if (!qe)
542 return NULL;
545 /* Find the 'firmware' child node */
546 for_each_child_of_node(qe, fw) {
547 if (strcmp(fw->name, "firmware") == 0)
548 break;
551 of_node_put(qe);
553 /* Did we find the 'firmware' node? */
554 if (!fw)
555 return NULL;
557 qe_firmware_uploaded = 1;
559 /* Copy the data into qe_firmware_info*/
560 sprop = of_get_property(fw, "id", NULL);
561 if (sprop)
562 strncpy(qe_firmware_info.id, sprop,
563 sizeof(qe_firmware_info.id) - 1);
565 prop = of_find_property(fw, "extended-modes", NULL);
566 if (prop && (prop->length == sizeof(u64))) {
567 const u64 *iprop = prop->value;
569 qe_firmware_info.extended_modes = *iprop;
572 prop = of_find_property(fw, "virtual-traps", NULL);
573 if (prop && (prop->length == 32)) {
574 const u32 *iprop = prop->value;
576 for (i = 0; i < ARRAY_SIZE(qe_firmware_info.vtraps); i++)
577 qe_firmware_info.vtraps[i] = iprop[i];
580 of_node_put(fw);
582 return &qe_firmware_info;
584 EXPORT_SYMBOL(qe_get_firmware_info);
586 unsigned int qe_get_num_of_risc(void)
588 struct device_node *qe;
589 int size;
590 unsigned int num_of_risc = 0;
591 const u32 *prop;
593 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
594 if (!qe) {
595 /* Older devices trees did not have an "fsl,qe"
596 * compatible property, so we need to look for
597 * the QE node by name.
599 qe = of_find_node_by_type(NULL, "qe");
600 if (!qe)
601 return num_of_risc;
604 prop = of_get_property(qe, "fsl,qe-num-riscs", &size);
605 if (prop && size == sizeof(*prop))
606 num_of_risc = *prop;
608 of_node_put(qe);
610 return num_of_risc;
612 EXPORT_SYMBOL(qe_get_num_of_risc);
614 unsigned int qe_get_num_of_snums(void)
616 struct device_node *qe;
617 int size;
618 unsigned int num_of_snums;
619 const u32 *prop;
621 num_of_snums = 28; /* The default number of snum for threads is 28 */
622 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
623 if (!qe) {
624 /* Older devices trees did not have an "fsl,qe"
625 * compatible property, so we need to look for
626 * the QE node by name.
628 qe = of_find_node_by_type(NULL, "qe");
629 if (!qe)
630 return num_of_snums;
633 prop = of_get_property(qe, "fsl,qe-num-snums", &size);
634 if (prop && size == sizeof(*prop)) {
635 num_of_snums = *prop;
636 if ((num_of_snums < 28) || (num_of_snums > QE_NUM_OF_SNUM)) {
637 /* No QE ever has fewer than 28 SNUMs */
638 pr_err("QE: number of snum is invalid\n");
639 return -EINVAL;
643 of_node_put(qe);
645 return num_of_snums;
647 EXPORT_SYMBOL(qe_get_num_of_snums);