blob: e4223226a7a87aff07d112f38c4517d9726f262b [file] [log] [blame]
Li Yang98658532006-10-03 23:10:46 -05001/*
2 * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved.
3 *
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)
7 *
8 * Description:
9 * General Purpose functions for the global management of the
10 * QUICC Engine (QE).
11 *
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.
16 */
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/mm.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 <asm/irq.h>
29#include <asm/page.h>
30#include <asm/pgtable.h>
31#include <asm/immap_qe.h>
32#include <asm/qe.h>
33#include <asm/prom.h>
34#include <asm/rheap.h>
35
36static void qe_snums_init(void);
37static void qe_muram_init(void);
38static int qe_sdma_init(void);
39
40static DEFINE_SPINLOCK(qe_lock);
41
42/* QE snum state */
43enum qe_snum_state {
44 QE_SNUM_STATE_USED,
45 QE_SNUM_STATE_FREE
46};
47
48/* QE snum */
49struct qe_snum {
50 u8 num;
51 enum qe_snum_state state;
52};
53
54/* We allocate this here because it is used almost exclusively for
55 * the communication processor devices.
56 */
57struct qe_immap *qe_immr = NULL;
58EXPORT_SYMBOL(qe_immr);
59
60static struct qe_snum snums[QE_NUM_OF_SNUM]; /* Dynamically allocated SNUMs */
61
62static phys_addr_t qebase = -1;
63
64phys_addr_t get_qe_base(void)
65{
66 struct device_node *qe;
67
68 if (qebase != -1)
69 return qebase;
70
71 qe = of_find_node_by_type(NULL, "qe");
72 if (qe) {
73 unsigned int size;
74 const void *prop = get_property(qe, "reg", &size);
75 qebase = of_translate_address(qe, prop);
76 of_node_put(qe);
77 };
78
79 return qebase;
80}
81
82EXPORT_SYMBOL(get_qe_base);
83
84void qe_reset(void)
85{
86 if (qe_immr == NULL)
87 qe_immr = ioremap(get_qe_base(), QE_IMMAP_SIZE);
88
89 qe_snums_init();
90
91 qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
92 QE_CR_PROTOCOL_UNSPECIFIED, 0);
93
94 /* Reclaim the MURAM memory for our use. */
95 qe_muram_init();
96
97 if (qe_sdma_init())
98 panic("sdma init failed!");
99}
100
101int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input)
102{
103 unsigned long flags;
104 u8 mcn_shift = 0, dev_shift = 0;
105
106 spin_lock_irqsave(&qe_lock, flags);
107 if (cmd == QE_RESET) {
108 out_be32(&qe_immr->cp.cecr, (u32) (cmd | QE_CR_FLG));
109 } else {
110 if (cmd == QE_ASSIGN_PAGE) {
111 /* Here device is the SNUM, not sub-block */
112 dev_shift = QE_CR_SNUM_SHIFT;
113 } else if (cmd == QE_ASSIGN_RISC) {
114 /* Here device is the SNUM, and mcnProtocol is
115 * e_QeCmdRiscAssignment value */
116 dev_shift = QE_CR_SNUM_SHIFT;
117 mcn_shift = QE_CR_MCN_RISC_ASSIGN_SHIFT;
118 } else {
119 if (device == QE_CR_SUBBLOCK_USB)
120 mcn_shift = QE_CR_MCN_USB_SHIFT;
121 else
122 mcn_shift = QE_CR_MCN_NORMAL_SHIFT;
123 }
124
Timur Tabi302439d2006-10-31 17:53:42 +0800125 out_be32(&qe_immr->cp.cecdr, cmd_input);
Li Yang98658532006-10-03 23:10:46 -0500126 out_be32(&qe_immr->cp.cecr,
127 (cmd | QE_CR_FLG | ((u32) device << dev_shift) | (u32)
128 mcn_protocol << mcn_shift));
129 }
130
131 /* wait for the QE_CR_FLG to clear */
132 while(in_be32(&qe_immr->cp.cecr) & QE_CR_FLG)
133 cpu_relax();
134 spin_unlock_irqrestore(&qe_lock, flags);
135
136 return 0;
137}
138EXPORT_SYMBOL(qe_issue_cmd);
139
140/* Set a baud rate generator. This needs lots of work. There are
141 * 16 BRGs, which can be connected to the QE channels or output
142 * as clocks. The BRGs are in two different block of internal
143 * memory mapped space.
144 * The baud rate clock is the system clock divided by something.
145 * It was set up long ago during the initial boot phase and is
146 * is given to us.
147 * Baud rate clocks are zero-based in the driver code (as that maps
148 * to port numbers). Documentation uses 1-based numbering.
149 */
150static unsigned int brg_clk = 0;
151
152unsigned int get_brg_clk(void)
153{
154 struct device_node *qe;
155 if (brg_clk)
156 return brg_clk;
157
158 qe = of_find_node_by_type(NULL, "qe");
159 if (qe) {
160 unsigned int size;
161 const u32 *prop = get_property(qe, "brg-frequency", &size);
162 brg_clk = *prop;
163 of_node_put(qe);
164 };
165 return brg_clk;
166}
167
168/* This function is used by UARTS, or anything else that uses a 16x
169 * oversampled clock.
170 */
171void qe_setbrg(u32 brg, u32 rate)
172{
173 volatile u32 *bp;
174 u32 divisor, tempval;
175 int div16 = 0;
176
177 bp = &qe_immr->brg.brgc1;
178 bp += brg;
179
180 divisor = (get_brg_clk() / rate);
181 if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
182 div16 = 1;
183 divisor /= 16;
184 }
185
186 tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
187 if (div16)
188 tempval |= QE_BRGC_DIV16;
189
190 out_be32(bp, tempval);
191}
192
193/* Initialize SNUMs (thread serial numbers) according to
194 * QE Module Control chapter, SNUM table
195 */
196static void qe_snums_init(void)
197{
198 int i;
199 static const u8 snum_init[] = {
200 0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
201 0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x88, 0x89,
202 0x98, 0x99, 0xA8, 0xA9, 0xB8, 0xB9, 0xC8, 0xC9,
203 0xD8, 0xD9, 0xE8, 0xE9,
204 };
205
206 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
207 snums[i].num = snum_init[i];
208 snums[i].state = QE_SNUM_STATE_FREE;
209 }
210}
211
212int qe_get_snum(void)
213{
214 unsigned long flags;
215 int snum = -EBUSY;
216 int i;
217
218 spin_lock_irqsave(&qe_lock, flags);
219 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
220 if (snums[i].state == QE_SNUM_STATE_FREE) {
221 snums[i].state = QE_SNUM_STATE_USED;
222 snum = snums[i].num;
223 break;
224 }
225 }
226 spin_unlock_irqrestore(&qe_lock, flags);
227
228 return snum;
229}
230EXPORT_SYMBOL(qe_get_snum);
231
232void qe_put_snum(u8 snum)
233{
234 int i;
235
236 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
237 if (snums[i].num == snum) {
238 snums[i].state = QE_SNUM_STATE_FREE;
239 break;
240 }
241 }
242}
243EXPORT_SYMBOL(qe_put_snum);
244
245static int qe_sdma_init(void)
246{
247 struct sdma *sdma = &qe_immr->sdma;
248 u32 sdma_buf_offset;
249
250 if (!sdma)
251 return -ENODEV;
252
253 /* allocate 2 internal temporary buffers (512 bytes size each) for
254 * the SDMA */
255 sdma_buf_offset = qe_muram_alloc(512 * 2, 64);
256 if (IS_MURAM_ERR(sdma_buf_offset))
257 return -ENOMEM;
258
259 out_be32(&sdma->sdebcr, sdma_buf_offset & QE_SDEBCR_BA_MASK);
260 out_be32(&sdma->sdmr, (QE_SDMR_GLB_1_MSK | (0x1 >>
261 QE_SDMR_CEN_SHIFT)));
262
263 return 0;
264}
265
266/*
267 * muram_alloc / muram_free bits.
268 */
269static DEFINE_SPINLOCK(qe_muram_lock);
270
271/* 16 blocks should be enough to satisfy all requests
272 * until the memory subsystem goes up... */
273static rh_block_t qe_boot_muram_rh_block[16];
274static rh_info_t qe_muram_info;
275
276static void qe_muram_init(void)
277{
278 struct device_node *np;
279 u32 address;
280 u64 size;
281 unsigned int flags;
282
283 /* initialize the info header */
284 rh_init(&qe_muram_info, 1,
285 sizeof(qe_boot_muram_rh_block) /
286 sizeof(qe_boot_muram_rh_block[0]), qe_boot_muram_rh_block);
287
288 /* Attach the usable muram area */
289 /* XXX: This is a subset of the available muram. It
290 * varies with the processor and the microcode patches activated.
291 */
292 if ((np = of_find_node_by_name(NULL, "data-only")) != NULL) {
293 address = *of_get_address(np, 0, &size, &flags);
294 of_node_put(np);
295 rh_attach_region(&qe_muram_info,
296 (void *)address, (int)size);
297 }
298}
299
300/* This function returns an index into the MURAM area.
301 */
302u32 qe_muram_alloc(u32 size, u32 align)
303{
304 void *start;
305 unsigned long flags;
306
307 spin_lock_irqsave(&qe_muram_lock, flags);
308 start = rh_alloc_align(&qe_muram_info, size, align, "QE");
309 spin_unlock_irqrestore(&qe_muram_lock, flags);
310
311 return (u32) start;
312}
313EXPORT_SYMBOL(qe_muram_alloc);
314
315int qe_muram_free(u32 offset)
316{
317 int ret;
318 unsigned long flags;
319
320 spin_lock_irqsave(&qe_muram_lock, flags);
321 ret = rh_free(&qe_muram_info, (void *)offset);
322 spin_unlock_irqrestore(&qe_muram_lock, flags);
323
324 return ret;
325}
326EXPORT_SYMBOL(qe_muram_free);
327
328/* not sure if this is ever needed */
329u32 qe_muram_alloc_fixed(u32 offset, u32 size)
330{
331 void *start;
332 unsigned long flags;
333
334 spin_lock_irqsave(&qe_muram_lock, flags);
335 start = rh_alloc_fixed(&qe_muram_info, (void *)offset, size, "commproc");
336 spin_unlock_irqrestore(&qe_muram_lock, flags);
337
338 return (u32) start;
339}
340EXPORT_SYMBOL(qe_muram_alloc_fixed);
341
342void qe_muram_dump(void)
343{
344 rh_dump(&qe_muram_info);
345}
346EXPORT_SYMBOL(qe_muram_dump);
347
348void *qe_muram_addr(u32 offset)
349{
350 return (void *)&qe_immr->muram[offset];
351}
352EXPORT_SYMBOL(qe_muram_addr);