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)
9 * General Purpose functions for the global management of the
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>
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>
28 #include <linux/crc32.h>
31 #include <asm/pgtable.h>
32 #include <asm/immap_qe.h>
35 #include <asm/rheap.h>
37 static void qe_snums_init(void);
38 static int qe_sdma_init(void);
40 static DEFINE_SPINLOCK(qe_lock);
51 enum qe_snum_state state;
54 /* We allocate this here because it is used almost exclusively for
55 * the communication processor devices.
57 struct qe_immap __iomem *qe_immr;
58 EXPORT_SYMBOL(qe_immr);
60 static struct qe_snum snums[QE_NUM_OF_SNUM]; /* Dynamically allocated SNUMs */
62 static phys_addr_t qebase = -1;
64 phys_addr_t get_qe_base(void)
66 struct device_node *qe;
73 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
75 qe = of_find_node_by_type(NULL, "qe");
80 prop = of_get_property(qe, "reg", &size);
81 if (prop && size >= sizeof(*prop))
82 qebase = of_translate_address(qe, prop);
88 EXPORT_SYMBOL(get_qe_base);
90 void __init qe_reset(void)
93 qe_immr = ioremap(get_qe_base(), QE_IMMAP_SIZE);
97 qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
98 QE_CR_PROTOCOL_UNSPECIFIED, 0);
100 /* Reclaim the MURAM memory for our use. */
104 panic("sdma init failed!");
107 int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input)
110 u8 mcn_shift = 0, dev_shift = 0;
112 spin_lock_irqsave(&qe_lock, flags);
113 if (cmd == QE_RESET) {
114 out_be32(&qe_immr->cp.cecr, (u32) (cmd | QE_CR_FLG));
116 if (cmd == QE_ASSIGN_PAGE) {
117 /* Here device is the SNUM, not sub-block */
118 dev_shift = QE_CR_SNUM_SHIFT;
119 } else if (cmd == QE_ASSIGN_RISC) {
120 /* Here device is the SNUM, and mcnProtocol is
121 * e_QeCmdRiscAssignment value */
122 dev_shift = QE_CR_SNUM_SHIFT;
123 mcn_shift = QE_CR_MCN_RISC_ASSIGN_SHIFT;
125 if (device == QE_CR_SUBBLOCK_USB)
126 mcn_shift = QE_CR_MCN_USB_SHIFT;
128 mcn_shift = QE_CR_MCN_NORMAL_SHIFT;
131 out_be32(&qe_immr->cp.cecdr, cmd_input);
132 out_be32(&qe_immr->cp.cecr,
133 (cmd | QE_CR_FLG | ((u32) device << dev_shift) | (u32)
134 mcn_protocol << mcn_shift));
137 /* wait for the QE_CR_FLG to clear */
138 while(in_be32(&qe_immr->cp.cecr) & QE_CR_FLG)
140 spin_unlock_irqrestore(&qe_lock, flags);
144 EXPORT_SYMBOL(qe_issue_cmd);
146 /* Set a baud rate generator. This needs lots of work. There are
147 * 16 BRGs, which can be connected to the QE channels or output
148 * as clocks. The BRGs are in two different block of internal
149 * memory mapped space.
150 * The BRG clock is the QE clock divided by 2.
151 * It was set up long ago during the initial boot phase and is
153 * Baud rate clocks are zero-based in the driver code (as that maps
154 * to port numbers). Documentation uses 1-based numbering.
156 static unsigned int brg_clk = 0;
158 unsigned int qe_get_brg_clk(void)
160 struct device_node *qe;
167 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
169 qe = of_find_node_by_type(NULL, "qe");
174 prop = of_get_property(qe, "brg-frequency", &size);
175 if (prop && size == sizeof(*prop))
182 EXPORT_SYMBOL(qe_get_brg_clk);
184 /* Program the BRG to the given sampling rate and multiplier
186 * @brg: the BRG, QE_BRG1 - QE_BRG16
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.
192 int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier)
194 u32 divisor, tempval;
197 if ((brg < QE_BRG1) || (brg > QE_BRG16))
200 divisor = qe_get_brg_clk() / (rate * multiplier);
202 if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
203 div16 = QE_BRGC_DIV16;
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
210 if (!div16 && (divisor & 1))
213 tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
214 QE_BRGC_ENABLE | div16;
216 out_be32(&qe_immr->brg.brgc[brg - QE_BRG1], tempval);
220 EXPORT_SYMBOL(qe_setbrg);
222 /* Convert a string to a QE clock source enum
224 * This function takes a string, typically from a property in the device
225 * tree, and returns the corresponding "enum qe_clock" value.
227 enum qe_clock qe_clock_source(const char *source)
231 if (strcasecmp(source, "none") == 0)
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;
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;
252 EXPORT_SYMBOL(qe_clock_source);
254 /* Initialize SNUMs (thread serial numbers) according to
255 * QE Module Control chapter, SNUM table
257 static void qe_snums_init(void)
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,
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;
273 int qe_get_snum(void)
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;
287 spin_unlock_irqrestore(&qe_lock, flags);
291 EXPORT_SYMBOL(qe_get_snum);
293 void qe_put_snum(u8 snum)
297 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
298 if (snums[i].num == snum) {
299 snums[i].state = QE_SNUM_STATE_FREE;
304 EXPORT_SYMBOL(qe_put_snum);
306 static int qe_sdma_init(void)
308 struct sdma __iomem *sdma = &qe_immr->sdma;
309 unsigned long sdma_buf_offset;
314 /* allocate 2 internal temporary buffers (512 bytes size each) for
316 sdma_buf_offset = qe_muram_alloc(512 * 2, 4096);
317 if (IS_ERR_VALUE(sdma_buf_offset))
320 out_be32(&sdma->sdebcr, (u32) sdma_buf_offset & QE_SDEBCR_BA_MASK);
321 out_be32(&sdma->sdmr, (QE_SDMR_GLB_1_MSK |
322 (0x1 << QE_SDMR_CEN_SHIFT)));
327 /* The maximum number of RISCs we support */
328 #define MAX_QE_RISC 2
330 /* Firmware information stored here for qe_get_firmware_info() */
331 static struct qe_firmware_info qe_firmware_info;
334 * Set to 1 if QE firmware has been uploaded, and therefore
335 * qe_firmware_info contains valid data.
337 static int qe_firmware_uploaded;
340 * Upload a QE microcode
342 * This function is a worker function for qe_upload_firmware(). It does
343 * the actual uploading of the microcode.
345 static void qe_upload_microcode(const void *base,
346 const struct qe_microcode *ucode)
348 const __be32 *code = base + be32_to_cpu(ucode->code_offset);
351 if (ucode->major || ucode->minor || ucode->revision)
352 printk(KERN_INFO "qe-firmware: "
353 "uploading microcode '%s' version %u.%u.%u\n",
354 ucode->id, ucode->major, ucode->minor, ucode->revision);
356 printk(KERN_INFO "qe-firmware: "
357 "uploading microcode '%s'\n", ucode->id);
359 /* Use auto-increment */
360 out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
361 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
363 for (i = 0; i < be32_to_cpu(ucode->count); i++)
364 out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
368 * Upload a microcode to the I-RAM at a specific address.
370 * See Documentation/powerpc/qe-firmware.txt for information on QE microcode
373 * Currently, only version 1 is supported, so the 'version' field must be
376 * The SOC model and revision are not validated, they are only displayed for
377 * informational purposes.
379 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
380 * all of the microcode structures, minus the CRC.
382 * 'length' is the size that the structure says it is, including the CRC.
384 int qe_upload_firmware(const struct qe_firmware *firmware)
389 size_t calc_size = sizeof(struct qe_firmware);
391 const struct qe_header *hdr;
394 printk(KERN_ERR "qe-firmware: invalid pointer\n");
398 hdr = &firmware->header;
399 length = be32_to_cpu(hdr->length);
401 /* Check the magic */
402 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
403 (hdr->magic[2] != 'F')) {
404 printk(KERN_ERR "qe-firmware: not a microcode\n");
408 /* Check the version */
409 if (hdr->version != 1) {
410 printk(KERN_ERR "qe-firmware: unsupported version\n");
414 /* Validate some of the fields */
415 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
416 printk(KERN_ERR "qe-firmware: invalid data\n");
420 /* Validate the length and check if there's a CRC */
421 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
423 for (i = 0; i < firmware->count; i++)
425 * For situations where the second RISC uses the same microcode
426 * as the first, the 'code_offset' and 'count' fields will be
427 * zero, so it's okay to add those.
429 calc_size += sizeof(__be32) *
430 be32_to_cpu(firmware->microcode[i].count);
432 /* Validate the length */
433 if (length != calc_size + sizeof(__be32)) {
434 printk(KERN_ERR "qe-firmware: invalid length\n");
438 /* Validate the CRC */
439 crc = be32_to_cpu(*(__be32 *)((void *)firmware + calc_size));
440 if (crc != crc32(0, firmware, calc_size)) {
441 printk(KERN_ERR "qe-firmware: firmware CRC is invalid\n");
446 * If the microcode calls for it, split the I-RAM.
448 if (!firmware->split)
449 setbits16(&qe_immr->cp.cercr, QE_CP_CERCR_CIR);
451 if (firmware->soc.model)
453 "qe-firmware: firmware '%s' for %u V%u.%u\n",
454 firmware->id, be16_to_cpu(firmware->soc.model),
455 firmware->soc.major, firmware->soc.minor);
457 printk(KERN_INFO "qe-firmware: firmware '%s'\n",
461 * The QE only supports one microcode per RISC, so clear out all the
462 * saved microcode information and put in the new.
464 memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
465 strcpy(qe_firmware_info.id, firmware->id);
466 qe_firmware_info.extended_modes = firmware->extended_modes;
467 memcpy(qe_firmware_info.vtraps, firmware->vtraps,
468 sizeof(firmware->vtraps));
470 /* Loop through each microcode. */
471 for (i = 0; i < firmware->count; i++) {
472 const struct qe_microcode *ucode = &firmware->microcode[i];
474 /* Upload a microcode if it's present */
475 if (ucode->code_offset)
476 qe_upload_microcode(firmware, ucode);
478 /* Program the traps for this processor */
479 for (j = 0; j < 16; j++) {
480 u32 trap = be32_to_cpu(ucode->traps[j]);
483 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
487 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
490 qe_firmware_uploaded = 1;
494 EXPORT_SYMBOL(qe_upload_firmware);
497 * Get info on the currently-loaded firmware
499 * This function also checks the device tree to see if the boot loader has
500 * uploaded a firmware already.
502 struct qe_firmware_info *qe_get_firmware_info(void)
504 static int initialized;
505 struct property *prop;
506 struct device_node *qe;
507 struct device_node *fw = NULL;
512 * If we haven't checked yet, and a driver hasn't uploaded a firmware
513 * yet, then check the device tree for information.
515 if (qe_firmware_uploaded)
516 return &qe_firmware_info;
524 * Newer device trees have an "fsl,qe" compatible property for the QE
525 * node, but we still need to support older device trees.
527 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
529 qe = of_find_node_by_type(NULL, "qe");
534 /* Find the 'firmware' child node */
535 for_each_child_of_node(qe, fw) {
536 if (strcmp(fw->name, "firmware") == 0)
542 /* Did we find the 'firmware' node? */
546 qe_firmware_uploaded = 1;
548 /* Copy the data into qe_firmware_info*/
549 sprop = of_get_property(fw, "id", NULL);
551 strncpy(qe_firmware_info.id, sprop,
552 sizeof(qe_firmware_info.id) - 1);
554 prop = of_find_property(fw, "extended-modes", NULL);
555 if (prop && (prop->length == sizeof(u64))) {
556 const u64 *iprop = prop->value;
558 qe_firmware_info.extended_modes = *iprop;
561 prop = of_find_property(fw, "virtual-traps", NULL);
562 if (prop && (prop->length == 32)) {
563 const u32 *iprop = prop->value;
565 for (i = 0; i < ARRAY_SIZE(qe_firmware_info.vtraps); i++)
566 qe_firmware_info.vtraps[i] = iprop[i];
571 return &qe_firmware_info;
573 EXPORT_SYMBOL(qe_get_firmware_info);