/* * Copyright (c) 2011 Aeroflex Gaisler * * BSD license: * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #ifndef _LEON3_AMBA_H__ #define _LEON3_AMBA_H__ #define LEON3_IO_AREA 0xfff00000 #define LEON3_CONF_AREA 0xff000 #define LEON3_AHB_SLAVE_CONF_AREA (1 << 11) #define LEON3_AHB_CONF_WORDS 8 #define LEON3_APB_CONF_WORDS 2 #define LEON3_AHB_MASTERS 8 #define LEON3_AHB_SLAVES 8 #define LEON3_APB_SLAVES 16 #define LEON3_APBUARTS 8 /* Vendor codes */ #define VENDOR_GAISLER 1 #define VENDOR_PENDER 2 #define VENDOR_ESA 4 #define VENDOR_OPENCORES 8 /* Gaisler Research device id's */ #define GAISLER_LEON3 0x003 #define GAISLER_LEON3DSU 0x004 #define GAISLER_ETHAHB 0x005 #define GAISLER_APBMST 0x006 #define GAISLER_AHBUART 0x007 #define GAISLER_SRCTRL 0x008 #define GAISLER_SDCTRL 0x009 #define GAISLER_APBUART 0x00c #define GAISLER_IRQMP 0x00d #define GAISLER_AHBRAM 0x00e #define GAISLER_GPTIMER 0x011 #define GAISLER_PCITRG 0x012 #define GAISLER_PCISBRG 0x013 #define GAISLER_PCIFBRG 0x014 #define GAISLER_PCITRACE 0x015 #define GAISLER_PCIDMA 0x016 #define GAISLER_AHBTRACE 0x017 #define GAISLER_ETHDSU 0x018 #define GAISLER_PIOPORT 0x01A #define GAISLER_SPACEWIRE 0x01f #define GAISLER_ETHMAC 0x01d #define GAISLER_EHCI 0x026 #define GAISLER_UHCI 0x027 #define GAISLER_L2TIME 0xffd /* internal device: leon2 timer */ #define GAISLER_L2C 0xffe /* internal device: leon2compat */ #define GAISLER_PLUGPLAY 0xfff /* internal device: plug & play configarea */ #ifndef __ASSEMBLER__ extern inline char * gaisler_device_str (int id) { switch (id) { case GAISLER_LEON3: return "GAISLER_LEON3"; case GAISLER_LEON3DSU: return "GAISLER_LEON3DSU"; case GAISLER_ETHAHB: return "GAISLER_ETHAHB"; case GAISLER_APBMST: return "GAISLER_APBMST"; case GAISLER_AHBUART: return "GAISLER_AHBUART"; case GAISLER_SRCTRL: return "GAISLER_SRCTRL"; case GAISLER_SDCTRL: return "GAISLER_SDCTRL"; case GAISLER_APBUART: return "GAISLER_APBUART"; case GAISLER_IRQMP: return "GAISLER_IRQMP"; case GAISLER_AHBRAM: return "GAISLER_AHBRAM"; case GAISLER_GPTIMER: return "GAISLER_GPTIMER"; case GAISLER_PCITRG: return "GAISLER_PCITRG"; case GAISLER_PCISBRG: return "GAISLER_PCISBRG"; case GAISLER_PCIFBRG: return "GAISLER_PCIFBRG"; case GAISLER_PCITRACE: return "GAISLER_PCITRACE"; case GAISLER_AHBTRACE: return "GAISLER_AHBTRACE"; case GAISLER_ETHDSU: return "GAISLER_ETHDSU"; case GAISLER_PIOPORT: return "GAISLER_PIOPORT"; case GAISLER_SPACEWIRE: return "GAISLER_SPACEWIRE"; case GAISLER_L2TIME: return "GAISLER_L2TIME"; case GAISLER_L2C: return "GAISLER_L2C"; case GAISLER_PLUGPLAY: return "GAISLER_PLUGPLAY"; default: break; } return 0; } #endif /* European Space Agency device id's */ #define ESA_LEON2 0x002 #define ESA_MCTRL 0x00f #ifndef __ASSEMBLER__ extern inline char * esa_device_str (int id) { switch (id) { case ESA_LEON2: return "ESA_LEON2"; case ESA_MCTRL: return "ESA_MCTRL"; default: break; } return 0; } #endif /* Opencores device id's */ #define OPENCORES_PCIBR 0x4 #define OPENCORES_ETHMAC 0x5 #ifndef __ASSEMBLER__ extern inline char * opencores_device_str (int id) { switch (id) { case OPENCORES_PCIBR: return "OPENCORES_PCIBR"; case OPENCORES_ETHMAC: return "OPENCORES_ETHMAC"; default: break; } return 0; } extern inline char * device_id2str (int vendor, int id) { switch (vendor) { case VENDOR_GAISLER: return gaisler_device_str (id); case VENDOR_ESA: return esa_device_str (id); case VENDOR_OPENCORES: return opencores_device_str (id); case VENDOR_PENDER: default: break; } return 0; } extern inline char * vendor_id2str (int vendor) { switch (vendor) { case VENDOR_GAISLER: return "VENDOR_GAISLER"; case VENDOR_ESA: return "VENDOR_ESA"; case VENDOR_OPENCORES: return "VENDOR_OPENCORES"; case VENDOR_PENDER: return "VENDOR_PENDER"; default: break; } return 0; } #endif /* Vendor codes */ /* * * Macros for manipulating Configuration registers * */ #define LEON3_BYPASS_LOAD_PA(x) (*((unsigned long*)x)) #define LEON3_BYPASS_STORE_PA(x,v) (*((unsigned long*)x) = (v)) #define amba_get_confword(tab, index, word) (*((tab).addr[(index)]+(word))) #define amba_vendor(x) (((x) >> 24) & 0xff) #define amba_device(x) (((x) >> 12) & 0xfff) #define amba_ahb_get_membar(tab, index, nr) (*((tab).addr[(index)]+4+(nr))) #define amba_apb_get_membar(tab, index) (*((tab).addr[(index)]+1)) #define amba_membar_start(mbar) (((mbar) & 0xfff00000) & (((mbar) & 0xfff0) << 16)) #define amba_iobar_start(base, iobar) ((base) | ((((iobar) & 0xfff00000)>>12) & (((iobar) & 0xfff0)<<4)) ) #define amba_irq(conf) ((conf) & 0xf) #define amba_membar_type(mbar) ((mbar) & 0xf) #define AMBA_TYPE_APBIO 0x1 #define AMBA_TYPE_MEM 0x2 #define AMBA_TYPE_AHBIO 0x3 #define AMBA_TYPE_AHBIO_ADDR(addr) (LEON3_IO_AREA | ((addr) >> 12)) #ifndef __ASSEMBLER__ /* * The following defines the bits in the LEON UART Status Registers. */ #define LEON_REG_UART_STATUS_DR 0x00000001 /* Data Ready */ #define LEON_REG_UART_STATUS_TSE 0x00000002 /* TX Send Register Empty */ #define LEON_REG_UART_STATUS_THE 0x00000004 /* TX Hold Register Empty */ #define LEON_REG_UART_STATUS_BR 0x00000008 /* Break Error */ #define LEON_REG_UART_STATUS_OE 0x00000010 /* RX Overrun Error */ #define LEON_REG_UART_STATUS_PE 0x00000020 /* RX Parity Error */ #define LEON_REG_UART_STATUS_FE 0x00000040 /* RX Framing Error */ #define LEON_REG_UART_STATUS_ERR 0x00000078 /* Error Mask */ /* * The following defines the bits in the LEON UART Ctrl Registers. */ #define LEON_REG_UART_CTRL_RE 0x00000001 /* Receiver enable */ #define LEON_REG_UART_CTRL_TE 0x00000002 /* Transmitter enable */ #define LEON_REG_UART_CTRL_RI 0x00000004 /* Receiver interrupt enable */ #define LEON_REG_UART_CTRL_TI 0x00000008 /* Transmitter interrupt enable */ #define LEON_REG_UART_CTRL_PS 0x00000010 /* Parity select */ #define LEON_REG_UART_CTRL_PE 0x00000020 /* Parity enable */ #define LEON_REG_UART_CTRL_FL 0x00000040 /* Flow control enable */ #define LEON_REG_UART_CTRL_LB 0x00000080 /* Loop Back enable */ #define LEON3_GPTIMER_EN 1 #define LEON3_GPTIMER_RL 2 #define LEON3_GPTIMER_LD 4 #define LEON3_GPTIMER_IRQEN 8 #define LEON3_GPTIMER_IP 0x10 #define LEON3_GPTIMER_CONFIG_TIMERMASK 0x7 #define LEON3_GPTIMER_CONFIG_SEPERATE (1<<8) typedef struct { volatile unsigned int ilevel; volatile unsigned int ipend; volatile unsigned int iforce; volatile unsigned int iclear; volatile unsigned int notused00; volatile unsigned int notused01; volatile unsigned int notused02; volatile unsigned int notused03; volatile unsigned int notused10; volatile unsigned int notused11; volatile unsigned int notused12; volatile unsigned int notused13; volatile unsigned int notused20; volatile unsigned int notused21; volatile unsigned int notused22; volatile unsigned int notused23; volatile unsigned int mask[16]; } LEON3_IrqCtrl_Regs_Map; extern volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs; /* in amba.c */ typedef struct { volatile unsigned int data; volatile unsigned int status; volatile unsigned int ctrl; volatile unsigned int scaler; } LEON23_APBUART_Regs_Map; extern volatile LEON23_APBUART_Regs_Map *leon23_uarts[2]; /* in console.c */ extern unsigned int leon23_irqs[2]; /* in console.c */ typedef struct { volatile unsigned int val; volatile unsigned int rld; volatile unsigned int ctrl; volatile unsigned int unused; } LEON3_GpTimerElem_Regs_Map; typedef struct { volatile unsigned int scalar; volatile unsigned int scalar_reload; volatile unsigned int config; volatile unsigned int unused; volatile LEON3_GpTimerElem_Regs_Map e[8]; } LEON3_GpTimer_Regs_Map; #define LEON3_GPTIMER_CONFIG_NRTIMERS(c) ((c)->config & 0x7) int Timer_getTimer1 (unsigned int **count, unsigned int **reload, unsigned int **ctrl); /* in timer.c */ int Timer_getTimer2 (unsigned int **count, unsigned int **reload, unsigned int **ctrl); /* in timer.c */ extern volatile LEON3_GpTimer_Regs_Map *LEON3_GpTimer_Regs; extern unsigned long LEON3_GpTimer_Irq; typedef struct { volatile unsigned int iodata; volatile unsigned int ioout; volatile unsigned int iodir; volatile unsigned int irqmask; volatile unsigned int irqpol; volatile unsigned int irqedge; } LEON3_IOPORT_Regs_Map; /* * Types and structure used for AMBA Plug & Play bus scanning */ extern int amba_init_done; #define AMBA_MAXAPB_DEVS 64 #define AMBA_MAXAPB_DEVS_PERBUS 16 typedef struct amba_device_table { int devnr; /* numbrer of devices on AHB or APB bus */ unsigned int *addr[16]; /* addresses to the devices configuration tables */ unsigned int allocbits[1]; /* 0=unallocated, 1=allocated driver */ } amba_device_table; typedef struct amba_apbslv_device_table { int devnr; /* number of devices on AHB or APB bus */ unsigned int *addr[AMBA_MAXAPB_DEVS]; /* addresses to the devices configuration tables */ unsigned int apbmst[AMBA_MAXAPB_DEVS]; /* apb master if a entry is a apb slave */ unsigned int apbmstidx[AMBA_MAXAPB_DEVS]; /* apb master idx if a entry is a apb slave */ unsigned int allocbits[4]; /* 0=unallocated, 1=allocated driver */ } amba_apbslv_device_table; typedef struct amba_confarea_type { amba_device_table ahbmst; amba_device_table ahbslv; amba_apbslv_device_table apbslv; /*unsigned int apbmst; */ } amba_confarea_type; extern unsigned long amba_find_apbslv_addr (unsigned long vendor, unsigned long device, unsigned long *irq); // collect apb slaves typedef struct amba_apb_device { unsigned int start, irq; } amba_apb_device; extern int amba_get_free_apbslv_devices (int vendor, int device, amba_apb_device * dev, int nr); // collect ahb slaves typedef struct amba_ahb_device { unsigned int start[4], irq; } amba_ahb_device; extern int amba_get_free_ahbslv_devices (int vendor, int device, amba_ahb_device * dev, int nr); /*amba_scan.c*/ unsigned int leon3_getapbbase (register unsigned int vendor, register unsigned int driver, amba_apb_device * apbdevs, int c); #endif //!__ASSEMBLER__ #endif