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 phys_addr_t
get_qe_base(void)
70 struct device_node
*qe
;
77 qe
= of_find_compatible_node(NULL
, NULL
, "fsl,qe");
79 qe
= of_find_node_by_type(NULL
, "qe");
84 prop
= of_get_property(qe
, "reg", &size
);
85 if (prop
&& size
>= sizeof(*prop
))
86 qebase
= of_translate_address(qe
, prop
);
92 EXPORT_SYMBOL(get_qe_base
);
94 void __init
qe_reset(void)
97 qe_immr
= ioremap(get_qe_base(), QE_IMMAP_SIZE
);
101 qe_issue_cmd(QE_RESET
, QE_CR_SUBBLOCK_INVALID
,
102 QE_CR_PROTOCOL_UNSPECIFIED
, 0);
104 /* Reclaim the MURAM memory for our use. */
108 panic("sdma init failed!");
111 int qe_issue_cmd(u32 cmd
, u32 device
, u8 mcn_protocol
, u32 cmd_input
)
114 u8 mcn_shift
= 0, dev_shift
= 0;
117 spin_lock_irqsave(&qe_lock
, flags
);
118 if (cmd
== QE_RESET
) {
119 out_be32(&qe_immr
->cp
.cecr
, (u32
) (cmd
| QE_CR_FLG
));
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
;
130 if (device
== QE_CR_SUBBLOCK_USB
)
131 mcn_shift
= QE_CR_MCN_USB_SHIFT
;
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,
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
);
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
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
;
174 qe
= of_find_compatible_node(NULL
, NULL
, "fsl,qe");
176 qe
= of_find_node_by_type(NULL
, "qe");
181 prop
= of_get_property(qe
, "brg-frequency", &size
);
182 if (prop
&& size
== sizeof(*prop
))
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
;
204 if ((brg
< QE_BRG1
) || (brg
> QE_BRG16
))
207 divisor
= qe_get_brg_clk() / (rate
* multiplier
);
209 if (divisor
> QE_BRGC_DIVISOR_MAX
+ 1) {
210 div16
= QE_BRGC_DIV16
;
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
217 if (!div16
&& (divisor
& 1))
220 tempval
= ((divisor
- 1) << QE_BRGC_DIVISOR_SHIFT
) |
221 QE_BRGC_ENABLE
| div16
;
223 out_be32(&qe_immr
->brg
.brgc
[brg
- QE_BRG1
], tempval
);
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
)
238 if (strcasecmp(source
, "none") == 0)
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
;
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
;
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)
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)
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
;
298 spin_unlock_irqrestore(&qe_lock
, flags
);
302 EXPORT_SYMBOL(qe_get_snum
);
304 void qe_put_snum(u8 snum
)
308 for (i
= 0; i
< qe_num_of_snum
; i
++) {
309 if (snums
[i
].num
== snum
) {
310 snums
[i
].state
= QE_SNUM_STATE_FREE
;
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
;
325 /* allocate 2 internal temporary buffers (512 bytes size each) for
327 sdma_buf_offset
= qe_muram_alloc(512 * 2, 4096);
328 if (IS_ERR_VALUE(sdma_buf_offset
))
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
)));
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
);
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
);
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
384 * Currently, only version 1 is supported, so the 'version' field must be
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
)
400 size_t calc_size
= sizeof(struct qe_firmware
);
402 const struct qe_header
*hdr
;
405 printk(KERN_ERR
"qe-firmware: invalid pointer\n");
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");
419 /* Check the version */
420 if (hdr
->version
!= 1) {
421 printk(KERN_ERR
"qe-firmware: unsupported version\n");
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");
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");
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");
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
)
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
);
468 printk(KERN_INFO
"qe-firmware: firmware '%s'\n",
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
]);
494 out_be32(&qe_immr
->rsp
[i
].tibcr
[j
], trap
);
498 out_be32(&qe_immr
->rsp
[i
].eccr
, be32_to_cpu(ucode
->eccr
));
501 qe_firmware_uploaded
= 1;
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
;
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
;
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");
540 qe
= of_find_node_by_type(NULL
, "qe");
545 /* Find the 'firmware' child node */
546 for_each_child_of_node(qe
, fw
) {
547 if (strcmp(fw
->name
, "firmware") == 0)
553 /* Did we find the 'firmware' node? */
557 qe_firmware_uploaded
= 1;
559 /* Copy the data into qe_firmware_info*/
560 sprop
= of_get_property(fw
, "id", NULL
);
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
];
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
;
590 unsigned int num_of_risc
= 0;
593 qe
= of_find_compatible_node(NULL
, NULL
, "fsl,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");
604 prop
= of_get_property(qe
, "fsl,qe-num-riscs", &size
);
605 if (prop
&& size
== sizeof(*prop
))
612 EXPORT_SYMBOL(qe_get_num_of_risc
);
614 unsigned int qe_get_num_of_snums(void)
616 struct device_node
*qe
;
618 unsigned int num_of_snums
;
621 num_of_snums
= 28; /* The default number of snum for threads is 28 */
622 qe
= of_find_compatible_node(NULL
, NULL
, "fsl,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");
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");
647 EXPORT_SYMBOL(qe_get_num_of_snums
);