/* * AMBA Plag & Play Bus Driver Macros for LEON2 * * Macros used for AMBA Plug & Play bus scanning * * COPYRIGHT (c) 2007. * Gaisler Research * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. * * $Id$ */ #ifndef __AMBAPP_H__ #define __AMBAPP_H__ #ifdef __cplusplus extern "C" { #endif #define AMBA_CONF_AREA 0xff000 #define AMBA_AHB_SLAVE_CONF_AREA (1 << 11) #define AMBA_AHB_CONF_WORDS 8 #define AMBA_APB_CONF_WORDS 2 #define AMBA_AHB_MASTERS 16 #define AMBA_AHB_SLAVES 16 #define AMBA_APB_SLAVES 16 #define AMBA_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 0x03 #define GAISLER_LEON3DSU 0x04 #define GAISLER_ETHAHB 0x05 #define GAISLER_APBMST 0x06 #define GAISLER_AHBUART 0x07 #define GAISLER_SRCTRL 0x08 #define GAISLER_SDCTRL 0x09 #define GAISLER_APBUART 0x0C #define GAISLER_IRQMP 0x0D #define GAISLER_AHBRAM 0x0E #define GAISLER_GPTIMER 0x11 #define GAISLER_PCITRG 0x12 #define GAISLER_PCISBRG 0x13 #define GAISLER_PCIFBRG 0x14 #define GAISLER_PCITRACE 0x15 #define GAISLER_DMACTRL 0x16 #define GAISLER_OCCAN 0x19 #define GAISLER_PIOPORT 0x1A #define GAISLER_ETHMAC 0x1D #define GAISLER_SPACEWIRE 0x1f #define GAISLER_AHB2AHB 0x20 #define GAISLER_I2CMST 0x28 #define GAISLER_GRSPW2 0x29 #define GAISLER_GRCAN 0x34 #define GAISLER_GRHCAN 0x3d #define GAISLER_GRFIFO 0x35 #define GAISLER_GRADCDAC 0x36 #define GAISLER_GRPULSE 0x37 #define GAISLER_GRTIMER 0x38 #define GAISLER_FTAHBRAM 0x50 #define GAISLER_FTMCTRL 0x54 #define GAISLER_BRM 0x72 /* European Space Agency device id's */ #define ESA_LEON2 0x2 #define ESA_MCTRL 0xF #define ESA_SPW2 0x12 /* Opencores device id's */ #define OPENCORES_PCIBR 0x4 #define OPENCORES_ETHMAC 0x5 /* * * Macros for manipulating Configuration registers * */ #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_ahb_get_custom(tab, index, nr) (*((tab).addr[(index)]+1+(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) & 0x1f) #define amba_ver(conf) (((conf)>>5) & 0x1f) #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,base_ioarea) ((unsigned int)(base_ioarea) | ((addr) >> 12)) /* * Types and structure used for AMBA Plug & Play bus scanning * */ 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 */ } amba_device_table; typedef struct { int devnr; unsigned int *addr[AMBA_APB_SLAVES]; /* addresses to the devices configuration tables */ unsigned int apbmst[AMBA_APB_SLAVES]; /* pointer to AHB slave (which is a APB master) */ } amba_apb_dev; struct amba_mmap { unsigned int cpu_adr; unsigned int size; unsigned int remote_amba_adr; }; typedef struct _amba_confarea_type amba_confarea_type; struct _amba_confarea_type { amba_confarea_type *next; /* next bus in chain */ int notroot; /* is root of a bus (mother AHB has 64 masters/slaves rest 16) */ unsigned int ioarea; struct amba_mmap *mmaps; amba_device_table ahbmst; amba_device_table ahbslv; amba_apb_dev apbslv; }; typedef struct { unsigned int start, irq, bus_id; } amba_apb_device; typedef struct { unsigned int start[4], irq, ver; } amba_ahb_device; /* Scans AMBA Plug&Play Information and convers that information * to a more readable format in RAM. * * Will scan for - AHB Masters * - AHB Slaves * - APB Slaves (if a AHB/APB bridge is found) * * \param amba_conf AMBA P&P device info is placed here. * \param ioarea address of AMBA Plug&Play information, * on LEON3 systems default is 0xfff00000 * \param mmaps Memory mmap specific to this amba bus, * if NULL no translation will be made (default). * A array of maps, ending with a entry with size=0. */ void amba_scan (amba_confarea_type * amba_conf, unsigned int ioarea, struct amba_mmap *mmaps); /* Print AMBA Plug&Play info on terminal */ void amba_print_conf (amba_confarea_type * amba_conf); /***** APB SLAVES *****/ /* Return number of APB Slave devices which has given vendor and device */ int amba_get_number_apbslv_devices (amba_confarea_type * amba_conf, int vendor, int device); /* Get First APB Slave device of this vendor&device id */ int amba_find_apbslv (amba_confarea_type * amba_conf, int vendor, int device, amba_apb_device * dev); /* Get APB Slave device of this vendor&device id. (setting nr to 0 is eqivalent to calling amba_find_apbslv() ) */ int amba_find_next_apbslv (amba_confarea_type * amba_conf, int vendor, int device, amba_apb_device * dev, int index); /* Get first nr APB Slave devices, put them into dev (which is an array of nr length) */ int amba_find_apbslvs (amba_confarea_type * amba_conf, int vendor, int device, amba_apb_device * devs, int maxno); /***** AHB SLAVES *****/ /* Return number of AHB Slave devices which has given vendor and device */ int amba_get_number_ahbslv_devices (amba_confarea_type * amba_conf, int vendor, int device); /* Get First AHB Slave device of this vendor&device id */ int amba_find_ahbslv (amba_confarea_type * amba_conf, int vendor, int device, amba_ahb_device * dev); /* Get AHB Slave device of this vendor&device id. (setting nr to 0 is eqivalent to calling amba_find_ahbslv() ) */ int amba_find_next_ahbslv (amba_confarea_type * amba_conf, int vendor, int device, amba_ahb_device * dev, int index); /* Get first nr AHB Slave devices, put them into dev (which is an array of nr length) */ int amba_find_ahbslvs (amba_confarea_type * amba_conf, int vendor, int device, amba_ahb_device * devs, int maxno); /***** AHB MASTERS *****/ /* Return number of AHB Master devices which has given vendor and device */ int amba_get_number_ahbmst_devices (amba_confarea_type * amba_conf, int vendor, int device); /* Get First AHB Master device of this vendor&device id */ int amba_find_ahbmst (amba_confarea_type * amba_conf, int vendor, int device, amba_ahb_device * dev); /* Get AHB Master device of this vendor&device id. (setting nr to 0 is eqivalent to calling amba_find_ahbmst() ) */ int amba_find_next_ahbmst (amba_confarea_type * amba_conf, int vendor, int device, amba_ahb_device * dev, int index); /* Get first nr AHB Master devices, put them into dev (which is an array of nr length) */ int amba_find_ahbmsts (amba_confarea_type * amba_conf, int vendor, int device, amba_ahb_device * devs, int maxno); /******** AMBA DEVICES *******/ /* ESA MEMORY CONTROLLER */ typedef struct { unsigned int mcfg1; unsigned int mcfg2; unsigned int mcfg3; } ambapp_regmap_mctrl; /* APB UART */ typedef struct { volatile unsigned int data; volatile unsigned int status; volatile unsigned int ctrl; volatile unsigned int scaler; } ambapp_apb_uart; typedef struct { volatile unsigned int ilevel; volatile unsigned int ipend; volatile unsigned int iforce; volatile unsigned int iclear; volatile unsigned int mpstat; 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]; volatile unsigned int force[16]; /* Extended IRQ registers */ volatile unsigned int intid[16]; } LEON3_IrqCtrl_Regs_Map; /*****************************/ #ifdef __cplusplus } #endif #endif