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 */
64 static unsigned int qe_num_of_snum;
66 static phys_addr_t qebase = -1;
68 int qe_alive_during_sleep(void)
75 ret = !of_find_compatible_node(NULL, NULL, "fsl,mpc8569-pmc");
79 EXPORT_SYMBOL(qe_alive_during_sleep);
81 phys_addr_t get_qe_base(void)
83 struct device_node *qe;
90 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
92 qe = of_find_node_by_type(NULL, "qe");
97 prop = of_get_property(qe, "reg", &size);
98 if (prop && size >= sizeof(*prop))
99 qebase = of_translate_address(qe, prop);
105 EXPORT_SYMBOL(get_qe_base);
110 qe_immr = ioremap(get_qe_base(), QE_IMMAP_SIZE);
114 qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
115 QE_CR_PROTOCOL_UNSPECIFIED, 0);
117 /* Reclaim the MURAM memory for our use. */
121 panic("sdma init failed!");
124 int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input)
127 u8 mcn_shift = 0, dev_shift = 0;
130 spin_lock_irqsave(&qe_lock, flags);
131 if (cmd == QE_RESET) {
132 out_be32(&qe_immr->cp.cecr, (u32) (cmd | QE_CR_FLG));
134 if (cmd == QE_ASSIGN_PAGE) {
135 /* Here device is the SNUM, not sub-block */
136 dev_shift = QE_CR_SNUM_SHIFT;
137 } else if (cmd == QE_ASSIGN_RISC) {
138 /* Here device is the SNUM, and mcnProtocol is
139 * e_QeCmdRiscAssignment value */
140 dev_shift = QE_CR_SNUM_SHIFT;
141 mcn_shift = QE_CR_MCN_RISC_ASSIGN_SHIFT;
143 if (device == QE_CR_SUBBLOCK_USB)
144 mcn_shift = QE_CR_MCN_USB_SHIFT;
146 mcn_shift = QE_CR_MCN_NORMAL_SHIFT;
149 out_be32(&qe_immr->cp.cecdr, cmd_input);
150 out_be32(&qe_immr->cp.cecr,
151 (cmd | QE_CR_FLG | ((u32) device << dev_shift) | (u32)
152 mcn_protocol << mcn_shift));
155 /* wait for the QE_CR_FLG to clear */
156 ret = spin_event_timeout((in_be32(&qe_immr->cp.cecr) & QE_CR_FLG) == 0,
158 /* On timeout (e.g. failure), the expression will be false (ret == 0),
159 otherwise it will be true (ret == 1). */
160 spin_unlock_irqrestore(&qe_lock, flags);
164 EXPORT_SYMBOL(qe_issue_cmd);
166 /* Set a baud rate generator. This needs lots of work. There are
167 * 16 BRGs, which can be connected to the QE channels or output
168 * as clocks. The BRGs are in two different block of internal
169 * memory mapped space.
170 * The BRG clock is the QE clock divided by 2.
171 * It was set up long ago during the initial boot phase and is
173 * Baud rate clocks are zero-based in the driver code (as that maps
174 * to port numbers). Documentation uses 1-based numbering.
176 static unsigned int brg_clk = 0;
178 unsigned int qe_get_brg_clk(void)
180 struct device_node *qe;
187 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
189 qe = of_find_node_by_type(NULL, "qe");
194 prop = of_get_property(qe, "brg-frequency", &size);
195 if (prop && size == sizeof(*prop))
202 EXPORT_SYMBOL(qe_get_brg_clk);
204 /* Program the BRG to the given sampling rate and multiplier
206 * @brg: the BRG, QE_BRG1 - QE_BRG16
207 * @rate: the desired sampling rate
208 * @multiplier: corresponds to the value programmed in GUMR_L[RDCR] or
209 * GUMR_L[TDCR]. E.g., if this BRG is the RX clock, and GUMR_L[RDCR]=01,
210 * then 'multiplier' should be 8.
212 int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier)
214 u32 divisor, tempval;
217 if ((brg < QE_BRG1) || (brg > QE_BRG16))
220 divisor = qe_get_brg_clk() / (rate * multiplier);
222 if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
223 div16 = QE_BRGC_DIV16;
227 /* Errata QE_General4, which affects some MPC832x and MPC836x SOCs, says
228 that the BRG divisor must be even if you're not using divide-by-16
230 if (!div16 && (divisor & 1))
233 tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
234 QE_BRGC_ENABLE | div16;
236 out_be32(&qe_immr->brg.brgc[brg - QE_BRG1], tempval);
240 EXPORT_SYMBOL(qe_setbrg);
242 /* Convert a string to a QE clock source enum
244 * This function takes a string, typically from a property in the device
245 * tree, and returns the corresponding "enum qe_clock" value.
247 enum qe_clock qe_clock_source(const char *source)
251 if (strcasecmp(source, "none") == 0)
254 if (strncasecmp(source, "brg", 3) == 0) {
255 i = simple_strtoul(source + 3, NULL, 10);
256 if ((i >= 1) && (i <= 16))
257 return (QE_BRG1 - 1) + i;
262 if (strncasecmp(source, "clk", 3) == 0) {
263 i = simple_strtoul(source + 3, NULL, 10);
264 if ((i >= 1) && (i <= 24))
265 return (QE_CLK1 - 1) + i;
272 EXPORT_SYMBOL(qe_clock_source);
274 /* Initialize SNUMs (thread serial numbers) according to
275 * QE Module Control chapter, SNUM table
277 static void qe_snums_init(void)
280 static const u8 snum_init[] = {
281 0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
282 0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x88, 0x89,
283 0x98, 0x99, 0xA8, 0xA9, 0xB8, 0xB9, 0xC8, 0xC9,
284 0xD8, 0xD9, 0xE8, 0xE9, 0x08, 0x09, 0x18, 0x19,
285 0x28, 0x29, 0x38, 0x39, 0x48, 0x49, 0x58, 0x59,
286 0x68, 0x69, 0x78, 0x79, 0x80, 0x81,
289 qe_num_of_snum = qe_get_num_of_snums();
291 for (i = 0; i < qe_num_of_snum; i++) {
292 snums[i].num = snum_init[i];
293 snums[i].state = QE_SNUM_STATE_FREE;
297 int qe_get_snum(void)
303 spin_lock_irqsave(&qe_lock, flags);
304 for (i = 0; i < qe_num_of_snum; i++) {
305 if (snums[i].state == QE_SNUM_STATE_FREE) {
306 snums[i].state = QE_SNUM_STATE_USED;
311 spin_unlock_irqrestore(&qe_lock, flags);
315 EXPORT_SYMBOL(qe_get_snum);
317 void qe_put_snum(u8 snum)
321 for (i = 0; i < qe_num_of_snum; i++) {
322 if (snums[i].num == snum) {
323 snums[i].state = QE_SNUM_STATE_FREE;
328 EXPORT_SYMBOL(qe_put_snum);
330 static int qe_sdma_init(void)
332 struct sdma __iomem *sdma = &qe_immr->sdma;
333 static unsigned long sdma_buf_offset = (unsigned long)-ENOMEM;
338 /* allocate 2 internal temporary buffers (512 bytes size each) for
340 if (IS_ERR_VALUE(sdma_buf_offset)) {
341 sdma_buf_offset = qe_muram_alloc(512 * 2, 4096);
342 if (IS_ERR_VALUE(sdma_buf_offset))
346 out_be32(&sdma->sdebcr, (u32) sdma_buf_offset & QE_SDEBCR_BA_MASK);
347 out_be32(&sdma->sdmr, (QE_SDMR_GLB_1_MSK |
348 (0x1 << QE_SDMR_CEN_SHIFT)));
353 /* The maximum number of RISCs we support */
354 #define MAX_QE_RISC 4
356 /* Firmware information stored here for qe_get_firmware_info() */
357 static struct qe_firmware_info qe_firmware_info;
360 * Set to 1 if QE firmware has been uploaded, and therefore
361 * qe_firmware_info contains valid data.
363 static int qe_firmware_uploaded;
366 * Upload a QE microcode
368 * This function is a worker function for qe_upload_firmware(). It does
369 * the actual uploading of the microcode.
371 static void qe_upload_microcode(const void *base,
372 const struct qe_microcode *ucode)
374 const __be32 *code = base + be32_to_cpu(ucode->code_offset);
377 if (ucode->major || ucode->minor || ucode->revision)
378 printk(KERN_INFO "qe-firmware: "
379 "uploading microcode '%s' version %u.%u.%u\n",
380 ucode->id, ucode->major, ucode->minor, ucode->revision);
382 printk(KERN_INFO "qe-firmware: "
383 "uploading microcode '%s'\n", ucode->id);
385 /* Use auto-increment */
386 out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
387 QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
389 for (i = 0; i < be32_to_cpu(ucode->count); i++)
390 out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
394 * Upload a microcode to the I-RAM at a specific address.
396 * See Documentation/powerpc/qe-firmware.txt for information on QE microcode
399 * Currently, only version 1 is supported, so the 'version' field must be
402 * The SOC model and revision are not validated, they are only displayed for
403 * informational purposes.
405 * 'calc_size' is the calculated size, in bytes, of the firmware structure and
406 * all of the microcode structures, minus the CRC.
408 * 'length' is the size that the structure says it is, including the CRC.
410 int qe_upload_firmware(const struct qe_firmware *firmware)
415 size_t calc_size = sizeof(struct qe_firmware);
417 const struct qe_header *hdr;
420 printk(KERN_ERR "qe-firmware: invalid pointer\n");
424 hdr = &firmware->header;
425 length = be32_to_cpu(hdr->length);
427 /* Check the magic */
428 if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
429 (hdr->magic[2] != 'F')) {
430 printk(KERN_ERR "qe-firmware: not a microcode\n");
434 /* Check the version */
435 if (hdr->version != 1) {
436 printk(KERN_ERR "qe-firmware: unsupported version\n");
440 /* Validate some of the fields */
441 if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
442 printk(KERN_ERR "qe-firmware: invalid data\n");
446 /* Validate the length and check if there's a CRC */
447 calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
449 for (i = 0; i < firmware->count; i++)
451 * For situations where the second RISC uses the same microcode
452 * as the first, the 'code_offset' and 'count' fields will be
453 * zero, so it's okay to add those.
455 calc_size += sizeof(__be32) *
456 be32_to_cpu(firmware->microcode[i].count);
458 /* Validate the length */
459 if (length != calc_size + sizeof(__be32)) {
460 printk(KERN_ERR "qe-firmware: invalid length\n");
464 /* Validate the CRC */
465 crc = be32_to_cpu(*(__be32 *)((void *)firmware + calc_size));
466 if (crc != crc32(0, firmware, calc_size)) {
467 printk(KERN_ERR "qe-firmware: firmware CRC is invalid\n");
472 * If the microcode calls for it, split the I-RAM.
474 if (!firmware->split)
475 setbits16(&qe_immr->cp.cercr, QE_CP_CERCR_CIR);
477 if (firmware->soc.model)
479 "qe-firmware: firmware '%s' for %u V%u.%u\n",
480 firmware->id, be16_to_cpu(firmware->soc.model),
481 firmware->soc.major, firmware->soc.minor);
483 printk(KERN_INFO "qe-firmware: firmware '%s'\n",
487 * The QE only supports one microcode per RISC, so clear out all the
488 * saved microcode information and put in the new.
490 memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
491 strcpy(qe_firmware_info.id, firmware->id);
492 qe_firmware_info.extended_modes = firmware->extended_modes;
493 memcpy(qe_firmware_info.vtraps, firmware->vtraps,
494 sizeof(firmware->vtraps));
496 /* Loop through each microcode. */
497 for (i = 0; i < firmware->count; i++) {
498 const struct qe_microcode *ucode = &firmware->microcode[i];
500 /* Upload a microcode if it's present */
501 if (ucode->code_offset)
502 qe_upload_microcode(firmware, ucode);
504 /* Program the traps for this processor */
505 for (j = 0; j < 16; j++) {
506 u32 trap = be32_to_cpu(ucode->traps[j]);
509 out_be32(&qe_immr->rsp[i].tibcr[j], trap);
513 out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
516 qe_firmware_uploaded = 1;
520 EXPORT_SYMBOL(qe_upload_firmware);
523 * Get info on the currently-loaded firmware
525 * This function also checks the device tree to see if the boot loader has
526 * uploaded a firmware already.
528 struct qe_firmware_info *qe_get_firmware_info(void)
530 static int initialized;
531 struct property *prop;
532 struct device_node *qe;
533 struct device_node *fw = NULL;
538 * If we haven't checked yet, and a driver hasn't uploaded a firmware
539 * yet, then check the device tree for information.
541 if (qe_firmware_uploaded)
542 return &qe_firmware_info;
550 * Newer device trees have an "fsl,qe" compatible property for the QE
551 * node, but we still need to support older device trees.
553 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
555 qe = of_find_node_by_type(NULL, "qe");
560 /* Find the 'firmware' child node */
561 for_each_child_of_node(qe, fw) {
562 if (strcmp(fw->name, "firmware") == 0)
568 /* Did we find the 'firmware' node? */
572 qe_firmware_uploaded = 1;
574 /* Copy the data into qe_firmware_info*/
575 sprop = of_get_property(fw, "id", NULL);
577 strncpy(qe_firmware_info.id, sprop,
578 sizeof(qe_firmware_info.id) - 1);
580 prop = of_find_property(fw, "extended-modes", NULL);
581 if (prop && (prop->length == sizeof(u64))) {
582 const u64 *iprop = prop->value;
584 qe_firmware_info.extended_modes = *iprop;
587 prop = of_find_property(fw, "virtual-traps", NULL);
588 if (prop && (prop->length == 32)) {
589 const u32 *iprop = prop->value;
591 for (i = 0; i < ARRAY_SIZE(qe_firmware_info.vtraps); i++)
592 qe_firmware_info.vtraps[i] = iprop[i];
597 return &qe_firmware_info;
599 EXPORT_SYMBOL(qe_get_firmware_info);
601 unsigned int qe_get_num_of_risc(void)
603 struct device_node *qe;
605 unsigned int num_of_risc = 0;
608 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
610 /* Older devices trees did not have an "fsl,qe"
611 * compatible property, so we need to look for
612 * the QE node by name.
614 qe = of_find_node_by_type(NULL, "qe");
619 prop = of_get_property(qe, "fsl,qe-num-riscs", &size);
620 if (prop && size == sizeof(*prop))
627 EXPORT_SYMBOL(qe_get_num_of_risc);
629 unsigned int qe_get_num_of_snums(void)
631 struct device_node *qe;
633 unsigned int num_of_snums;
636 num_of_snums = 28; /* The default number of snum for threads is 28 */
637 qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
639 /* Older devices trees did not have an "fsl,qe"
640 * compatible property, so we need to look for
641 * the QE node by name.
643 qe = of_find_node_by_type(NULL, "qe");
648 prop = of_get_property(qe, "fsl,qe-num-snums", &size);
649 if (prop && size == sizeof(*prop)) {
650 num_of_snums = *prop;
651 if ((num_of_snums < 28) || (num_of_snums > QE_NUM_OF_SNUM)) {
652 /* No QE ever has fewer than 28 SNUMs */
653 pr_err("QE: number of snum is invalid\n");
662 EXPORT_SYMBOL(qe_get_num_of_snums);