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>
22 #include <linux/spinlock.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>
32 #include <asm/pgtable.h>
33 #include <asm/immap_qe.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);
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 */
65 static phys_addr_t qebase = -1;
67 phys_addr_t get_qe_base(void)
69 struct device_node *qe;
76 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
78 qe = of_find_node_by_type(NULL, "qe");
83 prop = of_get_property(qe, "reg", &size);
84 if (prop && size >= sizeof(*prop))
85 qebase = of_translate_address(qe, prop);
91 EXPORT_SYMBOL(get_qe_base);
93 void __init qe_reset(void)
96 qe_immr = ioremap(get_qe_base(), QE_IMMAP_SIZE);
100 qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
101 QE_CR_PROTOCOL_UNSPECIFIED, 0);
103 /* Reclaim the MURAM memory for our use. */
107 panic("sdma init failed!");
110 int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input)
113 u8 mcn_shift = 0, dev_shift = 0;
115 spin_lock_irqsave(&qe_lock, flags);
116 if (cmd == QE_RESET) {
117 out_be32(&qe_immr->cp.cecr, (u32) (cmd | QE_CR_FLG));
119 if (cmd == QE_ASSIGN_PAGE) {
120 /* Here device is the SNUM, not sub-block */
121 dev_shift = QE_CR_SNUM_SHIFT;
122 } else if (cmd == QE_ASSIGN_RISC) {
123 /* Here device is the SNUM, and mcnProtocol is
124 * e_QeCmdRiscAssignment value */
125 dev_shift = QE_CR_SNUM_SHIFT;
126 mcn_shift = QE_CR_MCN_RISC_ASSIGN_SHIFT;
128 if (device == QE_CR_SUBBLOCK_USB)
129 mcn_shift = QE_CR_MCN_USB_SHIFT;
131 mcn_shift = QE_CR_MCN_NORMAL_SHIFT;
134 out_be32(&qe_immr->cp.cecdr, cmd_input);
135 out_be32(&qe_immr->cp.cecr,
136 (cmd | QE_CR_FLG | ((u32) device << dev_shift) | (u32)
137 mcn_protocol << mcn_shift));
140 /* wait for the QE_CR_FLG to clear */
141 while(in_be32(&qe_immr->cp.cecr) & QE_CR_FLG)
143 spin_unlock_irqrestore(&qe_lock, flags);
147 EXPORT_SYMBOL(qe_issue_cmd);
149 /* Set a baud rate generator. This needs lots of work. There are
150 * 16 BRGs, which can be connected to the QE channels or output
151 * as clocks. The BRGs are in two different block of internal
152 * memory mapped space.
153 * The BRG clock is the QE clock divided by 2.
154 * It was set up long ago during the initial boot phase and is
156 * Baud rate clocks are zero-based in the driver code (as that maps
157 * to port numbers). Documentation uses 1-based numbering.
159 static unsigned int brg_clk = 0;
161 unsigned int qe_get_brg_clk(void)
163 struct device_node *qe;
170 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
172 qe = of_find_node_by_type(NULL, "qe");
177 prop = of_get_property(qe, "brg-frequency", &size);
178 if (prop && size == sizeof(*prop))
185 EXPORT_SYMBOL(qe_get_brg_clk);
187 /* Program the BRG to the given sampling rate and multiplier
189 * @brg: the BRG, QE_BRG1 - QE_BRG16
190 * @rate: the desired sampling rate
191 * @multiplier: corresponds to the value programmed in GUMR_L[RDCR] or
192 * GUMR_L[TDCR]. E.g., if this BRG is the RX clock, and GUMR_L[RDCR]=01,
193 * then 'multiplier' should be 8.
195 int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier)
197 u32 divisor, tempval;
200 if ((brg < QE_BRG1) || (brg > QE_BRG16))
203 divisor = qe_get_brg_clk() / (rate * multiplier);
205 if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
206 div16 = QE_BRGC_DIV16;
210 /* Errata QE_General4, which affects some MPC832x and MPC836x SOCs, says
211 that the BRG divisor must be even if you're not using divide-by-16
213 if (!div16 && (divisor & 1))
216 tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
217 QE_BRGC_ENABLE | div16;
219 out_be32(&qe_immr->brg.brgc[brg - QE_BRG1], tempval);
223 EXPORT_SYMBOL(qe_setbrg);
225 /* Convert a string to a QE clock source enum
227 * This function takes a string, typically from a property in the device
228 * tree, and returns the corresponding "enum qe_clock" value.
230 enum qe_clock qe_clock_source(const char *source)
234 if (strcasecmp(source, "none") == 0)
237 if (strncasecmp(source, "brg", 3) == 0) {
238 i = simple_strtoul(source + 3, NULL, 10);
239 if ((i >= 1) && (i <= 16))
240 return (QE_BRG1 - 1) + i;
245 if (strncasecmp(source, "clk", 3) == 0) {
246 i = simple_strtoul(source + 3, NULL, 10);
247 if ((i >= 1) && (i <= 24))
248 return (QE_CLK1 - 1) + i;
255 EXPORT_SYMBOL(qe_clock_source);
257 /* Initialize SNUMs (thread serial numbers) according to
258 * QE Module Control chapter, SNUM table
260 static void qe_snums_init(void)
263 static const u8 snum_init[] = {
264 0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
265 0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x88, 0x89,
266 0x98, 0x99, 0xA8, 0xA9, 0xB8, 0xB9, 0xC8, 0xC9,
267 0xD8, 0xD9, 0xE8, 0xE9,
270 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
271 snums[i].num = snum_init[i];
272 snums[i].state = QE_SNUM_STATE_FREE;
276 int qe_get_snum(void)
282 spin_lock_irqsave(&qe_lock, flags);
283 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
284 if (snums[i].state == QE_SNUM_STATE_FREE) {
285 snums[i].state = QE_SNUM_STATE_USED;
290 spin_unlock_irqrestore(&qe_lock, flags);
294 EXPORT_SYMBOL(qe_get_snum);
296 void qe_put_snum(u8 snum)
300 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
301 if (snums[i].num == snum) {
302 snums[i].state = QE_SNUM_STATE_FREE;
307 EXPORT_SYMBOL(qe_put_snum);
309 static int qe_sdma_init(void)
311 struct sdma __iomem *sdma = &qe_immr->sdma;
312 unsigned long sdma_buf_offset;
317 /* allocate 2 internal temporary buffers (512 bytes size each) for
319 sdma_buf_offset = qe_muram_alloc(512 * 2, 4096);
320 if (IS_ERR_VALUE(sdma_buf_offset))
323 out_be32(&sdma->sdebcr, (u32) sdma_buf_offset & QE_SDEBCR_BA_MASK);
324 out_be32(&sdma->sdmr, (QE_SDMR_GLB_1_MSK |
325 (0x1 << QE_SDMR_CEN_SHIFT)));
330 /* The maximum number of RISCs we support */
331 #define MAX_QE_RISC 2
333 /* Firmware information stored here for qe_get_firmware_info() */
334 static struct qe_firmware_info qe_firmware_info;
337 * Set to 1 if QE firmware has been uploaded, and therefore
338 * qe_firmware_info contains valid data.
340 static int qe_firmware_uploaded;
343 * Upload a QE microcode
345 * This function is a worker function for qe_upload_firmware(). It does
346 * the actual uploading of the microcode.
348 static void qe_upload_microcode(const void *base,
349 const struct qe_microcode *ucode)
351 const __be32 *code = base + be32_to_cpu(ucode->code_offset);
354 if (ucode->major || ucode->minor || ucode->revision)
355 printk(KERN_INFO "qe-firmware: "
356 "uploading microcode '%s' version %u.%u.%u\n",
357 ucode->id, ucode->major, ucode->minor, ucode->revision);
359 printk(KERN_INFO "qe-firmware: "
360 "uploading microcode '%s'\n", ucode->id);
362 /* Use auto-increment */
363 out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
364 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
366 for (i = 0; i < be32_to_cpu(ucode->count); i++)
367 out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
371 * Upload a microcode to the I-RAM at a specific address.
373 * See Documentation/powerpc/qe-firmware.txt for information on QE microcode
376 * Currently, only version 1 is supported, so the 'version' field must be
379 * The SOC model and revision are not validated, they are only displayed for
380 * informational purposes.
382 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
383 * all of the microcode structures, minus the CRC.
385 * 'length' is the size that the structure says it is, including the CRC.
387 int qe_upload_firmware(const struct qe_firmware *firmware)
392 size_t calc_size = sizeof(struct qe_firmware);
394 const struct qe_header *hdr;
397 printk(KERN_ERR "qe-firmware: invalid pointer\n");
401 hdr = &firmware->header;
402 length = be32_to_cpu(hdr->length);
404 /* Check the magic */
405 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
406 (hdr->magic[2] != 'F')) {
407 printk(KERN_ERR "qe-firmware: not a microcode\n");
411 /* Check the version */
412 if (hdr->version != 1) {
413 printk(KERN_ERR "qe-firmware: unsupported version\n");
417 /* Validate some of the fields */
418 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
419 printk(KERN_ERR "qe-firmware: invalid data\n");
423 /* Validate the length and check if there's a CRC */
424 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
426 for (i = 0; i < firmware->count; i++)
428 * For situations where the second RISC uses the same microcode
429 * as the first, the 'code_offset' and 'count' fields will be
430 * zero, so it's okay to add those.
432 calc_size += sizeof(__be32) *
433 be32_to_cpu(firmware->microcode[i].count);
435 /* Validate the length */
436 if (length != calc_size + sizeof(__be32)) {
437 printk(KERN_ERR "qe-firmware: invalid length\n");
441 /* Validate the CRC */
442 crc = be32_to_cpu(*(__be32 *)((void *)firmware + calc_size));
443 if (crc != crc32(0, firmware, calc_size)) {
444 printk(KERN_ERR "qe-firmware: firmware CRC is invalid\n");
449 * If the microcode calls for it, split the I-RAM.
451 if (!firmware->split)
452 setbits16(&qe_immr->cp.cercr, QE_CP_CERCR_CIR);
454 if (firmware->soc.model)
456 "qe-firmware: firmware '%s' for %u V%u.%u\n",
457 firmware->id, be16_to_cpu(firmware->soc.model),
458 firmware->soc.major, firmware->soc.minor);
460 printk(KERN_INFO "qe-firmware: firmware '%s'\n",
464 * The QE only supports one microcode per RISC, so clear out all the
465 * saved microcode information and put in the new.
467 memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
468 strcpy(qe_firmware_info.id, firmware->id);
469 qe_firmware_info.extended_modes = firmware->extended_modes;
470 memcpy(qe_firmware_info.vtraps, firmware->vtraps,
471 sizeof(firmware->vtraps));
473 /* Loop through each microcode. */
474 for (i = 0; i < firmware->count; i++) {
475 const struct qe_microcode *ucode = &firmware->microcode[i];
477 /* Upload a microcode if it's present */
478 if (ucode->code_offset)
479 qe_upload_microcode(firmware, ucode);
481 /* Program the traps for this processor */
482 for (j = 0; j < 16; j++) {
483 u32 trap = be32_to_cpu(ucode->traps[j]);
486 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
490 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
493 qe_firmware_uploaded = 1;
497 EXPORT_SYMBOL(qe_upload_firmware);
500 * Get info on the currently-loaded firmware
502 * This function also checks the device tree to see if the boot loader has
503 * uploaded a firmware already.
505 struct qe_firmware_info *qe_get_firmware_info(void)
507 static int initialized;
508 struct property *prop;
509 struct device_node *qe;
510 struct device_node *fw = NULL;
515 * If we haven't checked yet, and a driver hasn't uploaded a firmware
516 * yet, then check the device tree for information.
518 if (qe_firmware_uploaded)
519 return &qe_firmware_info;
527 * Newer device trees have an "fsl,qe" compatible property for the QE
528 * node, but we still need to support older device trees.
530 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
532 qe = of_find_node_by_type(NULL, "qe");
537 /* Find the 'firmware' child node */
538 for_each_child_of_node(qe, fw) {
539 if (strcmp(fw->name, "firmware") == 0)
545 /* Did we find the 'firmware' node? */
549 qe_firmware_uploaded = 1;
551 /* Copy the data into qe_firmware_info*/
552 sprop = of_get_property(fw, "id", NULL);
554 strncpy(qe_firmware_info.id, sprop,
555 sizeof(qe_firmware_info.id) - 1);
557 prop = of_find_property(fw, "extended-modes", NULL);
558 if (prop && (prop->length == sizeof(u64))) {
559 const u64 *iprop = prop->value;
561 qe_firmware_info.extended_modes = *iprop;
564 prop = of_find_property(fw, "virtual-traps", NULL);
565 if (prop && (prop->length == 32)) {
566 const u32 *iprop = prop->value;
568 for (i = 0; i < ARRAY_SIZE(qe_firmware_info.vtraps); i++)
569 qe_firmware_info.vtraps[i] = iprop[i];
574 return &qe_firmware_info;
576 EXPORT_SYMBOL(qe_get_firmware_info);