[444] | 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 | |
---|
| 78 | extern inline char * |
---|
| 79 | gaisler_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 | |
---|
| 144 | extern inline char * |
---|
| 145 | esa_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 | |
---|
| 167 | extern inline char * |
---|
| 168 | opencores_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 | |
---|
| 182 | extern inline char * |
---|
| 183 | device_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 | |
---|
| 200 | extern inline char * |
---|
| 201 | vendor_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 | |
---|
| 298 | typedef 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; |
---|
| 318 | extern volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs; /* in amba.c */ |
---|
| 319 | |
---|
| 320 | typedef 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; |
---|
| 327 | extern volatile LEON23_APBUART_Regs_Map *leon23_uarts[2]; /* in console.c */ |
---|
| 328 | extern unsigned int leon23_irqs[2]; /* in console.c */ |
---|
| 329 | |
---|
| 330 | typedef 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 | |
---|
| 339 | typedef 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) |
---|
| 348 | int Timer_getTimer1 (unsigned int **count, unsigned int **reload, unsigned int **ctrl); /* in timer.c */ |
---|
| 349 | int Timer_getTimer2 (unsigned int **count, unsigned int **reload, unsigned int **ctrl); /* in timer.c */ |
---|
| 350 | extern volatile LEON3_GpTimer_Regs_Map *LEON3_GpTimer_Regs; |
---|
| 351 | extern unsigned long LEON3_GpTimer_Irq; |
---|
| 352 | |
---|
| 353 | typedef 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 | */ |
---|
| 367 | extern int amba_init_done; |
---|
| 368 | |
---|
| 369 | #define AMBA_MAXAPB_DEVS 64 |
---|
| 370 | #define AMBA_MAXAPB_DEVS_PERBUS 16 |
---|
| 371 | |
---|
| 372 | typedef 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 | |
---|
| 379 | typedef 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 | |
---|
| 388 | typedef 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 | |
---|
| 397 | extern unsigned long amba_find_apbslv_addr (unsigned long vendor, |
---|
| 398 | unsigned long device, |
---|
| 399 | unsigned long *irq); |
---|
| 400 | |
---|
| 401 | // collect apb slaves |
---|
| 402 | typedef struct amba_apb_device |
---|
| 403 | { |
---|
| 404 | unsigned int start, irq; |
---|
| 405 | } amba_apb_device; |
---|
| 406 | extern int amba_get_free_apbslv_devices (int vendor, int device, |
---|
| 407 | amba_apb_device * dev, int nr); |
---|
| 408 | |
---|
| 409 | // collect ahb slaves |
---|
| 410 | typedef struct amba_ahb_device |
---|
| 411 | { |
---|
| 412 | unsigned int start[4], irq; |
---|
| 413 | } amba_ahb_device; |
---|
| 414 | extern int amba_get_free_ahbslv_devices (int vendor, int device, |
---|
| 415 | amba_ahb_device * dev, int nr); |
---|
| 416 | |
---|
| 417 | |
---|
| 418 | /*amba_scan.c*/ |
---|
| 419 | unsigned 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 |
---|