source: trunk/libs/newlib/src/libgloss/sparc_leon/asm-leon/amba.h @ 656

Last change on this file since 656 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 11.4 KB
Line 
1/*
2 * Copyright (c) 2011 Aeroflex Gaisler
3 *
4 * BSD license:
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24
25
26#ifndef _LEON3_AMBA_H__
27#define _LEON3_AMBA_H__
28
29#define LEON3_IO_AREA 0xfff00000
30#define LEON3_CONF_AREA 0xff000
31#define LEON3_AHB_SLAVE_CONF_AREA (1 << 11)
32
33#define LEON3_AHB_CONF_WORDS 8
34#define LEON3_APB_CONF_WORDS 2
35#define LEON3_AHB_MASTERS 8
36#define LEON3_AHB_SLAVES 8
37#define LEON3_APB_SLAVES 16
38#define LEON3_APBUARTS 8
39
40/* Vendor codes */
41#define VENDOR_GAISLER   1
42#define VENDOR_PENDER    2
43#define VENDOR_ESA       4
44#define VENDOR_OPENCORES 8
45
46/* Gaisler Research device id's */
47#define GAISLER_LEON3    0x003
48#define GAISLER_LEON3DSU 0x004
49#define GAISLER_ETHAHB   0x005
50#define GAISLER_APBMST   0x006
51#define GAISLER_AHBUART  0x007
52#define GAISLER_SRCTRL   0x008
53#define GAISLER_SDCTRL   0x009
54#define GAISLER_APBUART  0x00c
55#define GAISLER_IRQMP    0x00d
56#define GAISLER_AHBRAM   0x00e
57#define GAISLER_GPTIMER  0x011
58#define GAISLER_PCITRG   0x012
59#define GAISLER_PCISBRG  0x013
60#define GAISLER_PCIFBRG  0x014
61#define GAISLER_PCITRACE 0x015
62#define GAISLER_PCIDMA   0x016
63#define GAISLER_AHBTRACE 0x017
64#define GAISLER_ETHDSU   0x018
65#define GAISLER_PIOPORT  0x01A
66#define GAISLER_SPACEWIRE 0x01f
67
68#define GAISLER_ETHMAC       0x01d
69#define GAISLER_EHCI         0x026
70#define GAISLER_UHCI         0x027
71
72#define GAISLER_L2TIME   0xffd  /* internal device: leon2 timer */
73#define GAISLER_L2C      0xffe  /* internal device: leon2compat */
74#define GAISLER_PLUGPLAY 0xfff  /* internal device: plug & play configarea */
75
76#ifndef __ASSEMBLER__
77
78extern inline char *
79gaisler_device_str (int id)
80{
81  switch (id)
82    {
83    case GAISLER_LEON3:
84      return "GAISLER_LEON3";
85    case GAISLER_LEON3DSU:
86      return "GAISLER_LEON3DSU";
87    case GAISLER_ETHAHB:
88      return "GAISLER_ETHAHB";
89    case GAISLER_APBMST:
90      return "GAISLER_APBMST";
91    case GAISLER_AHBUART:
92      return "GAISLER_AHBUART";
93    case GAISLER_SRCTRL:
94      return "GAISLER_SRCTRL";
95    case GAISLER_SDCTRL:
96      return "GAISLER_SDCTRL";
97    case GAISLER_APBUART:
98      return "GAISLER_APBUART";
99    case GAISLER_IRQMP:
100      return "GAISLER_IRQMP";
101    case GAISLER_AHBRAM:
102      return "GAISLER_AHBRAM";
103    case GAISLER_GPTIMER:
104      return "GAISLER_GPTIMER";
105    case GAISLER_PCITRG:
106      return "GAISLER_PCITRG";
107    case GAISLER_PCISBRG:
108      return "GAISLER_PCISBRG";
109    case GAISLER_PCIFBRG:
110      return "GAISLER_PCIFBRG";
111    case GAISLER_PCITRACE:
112      return "GAISLER_PCITRACE";
113    case GAISLER_AHBTRACE:
114      return "GAISLER_AHBTRACE";
115    case GAISLER_ETHDSU:
116      return "GAISLER_ETHDSU";
117    case GAISLER_PIOPORT:
118      return "GAISLER_PIOPORT";
119    case GAISLER_SPACEWIRE:
120      return "GAISLER_SPACEWIRE";
121
122
123    case GAISLER_L2TIME:
124      return "GAISLER_L2TIME";
125    case GAISLER_L2C:
126      return "GAISLER_L2C";
127    case GAISLER_PLUGPLAY:
128      return "GAISLER_PLUGPLAY";
129
130    default:
131      break;
132    }
133  return 0;
134}
135
136#endif
137
138/* European Space Agency device id's */
139#define ESA_LEON2        0x002
140#define ESA_MCTRL        0x00f
141
142#ifndef __ASSEMBLER__
143
144extern inline char *
145esa_device_str (int id)
146{
147  switch (id)
148    {
149    case ESA_LEON2:
150      return "ESA_LEON2";
151    case ESA_MCTRL:
152      return "ESA_MCTRL";
153    default:
154      break;
155    }
156  return 0;
157}
158
159#endif
160
161/* Opencores device id's */
162#define OPENCORES_PCIBR  0x4
163#define OPENCORES_ETHMAC 0x5
164
165#ifndef __ASSEMBLER__
166
167extern inline char *
168opencores_device_str (int id)
169{
170  switch (id)
171    {
172    case OPENCORES_PCIBR:
173      return "OPENCORES_PCIBR";
174    case OPENCORES_ETHMAC:
175      return "OPENCORES_ETHMAC";
176    default:
177      break;
178    }
179  return 0;
180}
181
182extern inline char *
183device_id2str (int vendor, int id)
184{
185  switch (vendor)
186    {
187    case VENDOR_GAISLER:
188      return gaisler_device_str (id);
189    case VENDOR_ESA:
190      return esa_device_str (id);
191    case VENDOR_OPENCORES:
192      return opencores_device_str (id);
193    case VENDOR_PENDER:
194    default:
195      break;
196    }
197  return 0;
198}
199
200extern inline char *
201vendor_id2str (int vendor)
202{
203  switch (vendor)
204    {
205    case VENDOR_GAISLER:
206      return "VENDOR_GAISLER";
207    case VENDOR_ESA:
208      return "VENDOR_ESA";
209    case VENDOR_OPENCORES:
210      return "VENDOR_OPENCORES";
211    case VENDOR_PENDER:
212      return "VENDOR_PENDER";
213    default:
214      break;
215    }
216  return 0;
217}
218
219#endif
220
221/* Vendor codes */
222
223/*
224 *
225 * Macros for manipulating Configuration registers 
226 *
227 */
228
229#define LEON3_BYPASS_LOAD_PA(x) (*((unsigned long*)x))
230#define LEON3_BYPASS_STORE_PA(x,v) (*((unsigned long*)x) = (v))
231
232#define amba_get_confword(tab, index, word) (*((tab).addr[(index)]+(word)))
233
234#define amba_vendor(x) (((x) >> 24) & 0xff)
235
236#define amba_device(x) (((x) >> 12) & 0xfff)
237
238#define amba_ahb_get_membar(tab, index, nr) (*((tab).addr[(index)]+4+(nr)))
239
240#define amba_apb_get_membar(tab, index) (*((tab).addr[(index)]+1))
241
242#define amba_membar_start(mbar) (((mbar) & 0xfff00000) & (((mbar) & 0xfff0) << 16))
243
244#define amba_iobar_start(base, iobar) ((base) | ((((iobar) & 0xfff00000)>>12) & (((iobar) & 0xfff0)<<4)) )
245
246#define amba_irq(conf) ((conf) & 0xf)
247
248#define amba_membar_type(mbar) ((mbar) & 0xf)
249
250#define AMBA_TYPE_APBIO 0x1
251#define AMBA_TYPE_MEM   0x2
252#define AMBA_TYPE_AHBIO 0x3
253
254#define AMBA_TYPE_AHBIO_ADDR(addr) (LEON3_IO_AREA | ((addr) >> 12))
255
256
257
258
259
260
261#ifndef __ASSEMBLER__
262
263/*
264 *  The following defines the bits in the LEON UART Status Registers.
265 */
266
267#define LEON_REG_UART_STATUS_DR   0x00000001    /* Data Ready */
268#define LEON_REG_UART_STATUS_TSE  0x00000002    /* TX Send Register Empty */
269#define LEON_REG_UART_STATUS_THE  0x00000004    /* TX Hold Register Empty */
270#define LEON_REG_UART_STATUS_BR   0x00000008    /* Break Error */
271#define LEON_REG_UART_STATUS_OE   0x00000010    /* RX Overrun Error */
272#define LEON_REG_UART_STATUS_PE   0x00000020    /* RX Parity Error */
273#define LEON_REG_UART_STATUS_FE   0x00000040    /* RX Framing Error */
274#define LEON_REG_UART_STATUS_ERR  0x00000078    /* Error Mask */
275
276/*
277 *  The following defines the bits in the LEON UART Ctrl Registers.
278 */
279
280#define LEON_REG_UART_CTRL_RE     0x00000001    /* Receiver enable */
281#define LEON_REG_UART_CTRL_TE     0x00000002    /* Transmitter enable */
282#define LEON_REG_UART_CTRL_RI     0x00000004    /* Receiver interrupt enable */
283#define LEON_REG_UART_CTRL_TI     0x00000008    /* Transmitter interrupt enable */
284#define LEON_REG_UART_CTRL_PS     0x00000010    /* Parity select */
285#define LEON_REG_UART_CTRL_PE     0x00000020    /* Parity enable */
286#define LEON_REG_UART_CTRL_FL     0x00000040    /* Flow control enable */
287#define LEON_REG_UART_CTRL_LB     0x00000080    /* Loop Back enable */
288
289#define LEON3_GPTIMER_EN 1
290#define LEON3_GPTIMER_RL 2
291#define LEON3_GPTIMER_LD 4
292#define LEON3_GPTIMER_IRQEN 8
293#define LEON3_GPTIMER_IP 0x10
294
295#define LEON3_GPTIMER_CONFIG_TIMERMASK 0x7
296#define LEON3_GPTIMER_CONFIG_SEPERATE (1<<8)
297
298typedef struct
299{
300  volatile unsigned int ilevel;
301  volatile unsigned int ipend;
302  volatile unsigned int iforce;
303  volatile unsigned int iclear;
304  volatile unsigned int notused00;
305  volatile unsigned int notused01;
306  volatile unsigned int notused02;
307  volatile unsigned int notused03;
308  volatile unsigned int notused10;
309  volatile unsigned int notused11;
310  volatile unsigned int notused12;
311  volatile unsigned int notused13;
312  volatile unsigned int notused20;
313  volatile unsigned int notused21;
314  volatile unsigned int notused22;
315  volatile unsigned int notused23;
316  volatile unsigned int mask[16];
317} LEON3_IrqCtrl_Regs_Map;
318extern volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs;     /* in amba.c */
319
320typedef struct
321{
322  volatile unsigned int data;
323  volatile unsigned int status;
324  volatile unsigned int ctrl;
325  volatile unsigned int scaler;
326} LEON23_APBUART_Regs_Map;
327extern volatile LEON23_APBUART_Regs_Map *leon23_uarts[2];       /* in console.c */
328extern unsigned int leon23_irqs[2];     /* in console.c */
329
330typedef struct
331{
332  volatile unsigned int val;
333  volatile unsigned int rld;
334  volatile unsigned int ctrl;
335  volatile unsigned int unused;
336} LEON3_GpTimerElem_Regs_Map;
337
338
339typedef struct
340{
341  volatile unsigned int scalar;
342  volatile unsigned int scalar_reload;
343  volatile unsigned int config;
344  volatile unsigned int unused;
345  volatile LEON3_GpTimerElem_Regs_Map e[8];
346} LEON3_GpTimer_Regs_Map;
347#define LEON3_GPTIMER_CONFIG_NRTIMERS(c) ((c)->config & 0x7)
348int Timer_getTimer1 (unsigned int **count, unsigned int **reload, unsigned int **ctrl); /* in timer.c */
349int Timer_getTimer2 (unsigned int **count, unsigned int **reload, unsigned int **ctrl); /* in timer.c */
350extern volatile LEON3_GpTimer_Regs_Map *LEON3_GpTimer_Regs;
351extern unsigned long LEON3_GpTimer_Irq;
352
353typedef struct
354{
355  volatile unsigned int iodata;
356  volatile unsigned int ioout;
357  volatile unsigned int iodir;
358  volatile unsigned int irqmask;
359  volatile unsigned int irqpol;
360  volatile unsigned int irqedge;
361} LEON3_IOPORT_Regs_Map;
362
363
364/*
365 *  Types and structure used for AMBA Plug & Play bus scanning
366 */
367extern int amba_init_done;
368
369#define AMBA_MAXAPB_DEVS 64
370#define AMBA_MAXAPB_DEVS_PERBUS 16
371
372typedef struct amba_device_table
373{
374  int devnr;                    /* numbrer of devices on AHB or APB bus */
375  unsigned int *addr[16];       /* addresses to the devices configuration tables */
376  unsigned int allocbits[1];    /* 0=unallocated, 1=allocated driver */
377} amba_device_table;
378
379typedef struct amba_apbslv_device_table
380{
381  int devnr;                    /* number of devices on AHB or APB bus */
382  unsigned int *addr[AMBA_MAXAPB_DEVS]; /* addresses to the devices configuration tables */
383  unsigned int apbmst[AMBA_MAXAPB_DEVS];        /* apb master if a entry is a apb slave */
384  unsigned int apbmstidx[AMBA_MAXAPB_DEVS];     /* apb master idx if a entry is a apb slave */
385  unsigned int allocbits[4];    /* 0=unallocated, 1=allocated driver */
386} amba_apbslv_device_table;
387
388typedef struct amba_confarea_type
389{
390  amba_device_table ahbmst;
391  amba_device_table ahbslv;
392  amba_apbslv_device_table apbslv;
393  /*unsigned int apbmst; */
394} amba_confarea_type;
395
396
397extern unsigned long amba_find_apbslv_addr (unsigned long vendor,
398                                            unsigned long device,
399                                            unsigned long *irq);
400
401// collect apb slaves
402typedef struct amba_apb_device
403{
404  unsigned int start, irq;
405} amba_apb_device;
406extern int amba_get_free_apbslv_devices (int vendor, int device,
407                                         amba_apb_device * dev, int nr);
408
409// collect ahb slaves
410typedef struct amba_ahb_device
411{
412  unsigned int start[4], irq;
413} amba_ahb_device;
414extern int amba_get_free_ahbslv_devices (int vendor, int device,
415                                         amba_ahb_device * dev, int nr);
416
417
418/*amba_scan.c*/
419unsigned int leon3_getapbbase (register unsigned int vendor,
420                               register unsigned int driver,
421                               amba_apb_device * apbdevs, int c);
422
423#endif //!__ASSEMBLER__
424
425
426
427
428
429#endif
Note: See TracBrowser for help on using the repository browser.