LEON: updated AMBA PnP API

The old layer had some limitations/problems for multiple AHB
buses since the data structure containing all AMBA devices
were allocated before scanning.

The new layer create devices as they are found and memory is
allocated using malloc() or bsp_early_malloc() during booting.

The old 8 functions for finding a specific AHB-Slave or
APB-Slave device has been replaced with one function,
ambapp_for_each(), which iterates over all devices matching
the specified search options and calls a user provided
function. The new way lowers the footprint and makes searching
more flexible.

The frequency information is now supported, if the frequency
of one device is reported by the user.

More AHB-to-AHB bridges are supported.

The API has been split into several parts in order to lower the
footprint.

The API also introduces the AMBAPP CORE concept, where one
ambapp_core can be created from one AHB Master, AHB Slave
and one APB Slave, at least one device is required for creating
a core.

Signed-off-by: Daniel Hellstrom <daniel@gaisler.com>
This commit is contained in:
Daniel Hellstrom
2012-04-17 22:01:46 -04:00
committed by Gedare Bloom
parent e99dbaa7cd
commit 9ea65119f4
19 changed files with 1846 additions and 641 deletions
+10
View File
@@ -17,7 +17,17 @@ EXTRA_DIST += shared/irq/irq-shared.c
# AMBA Plug&Play bus
EXTRA_DIST += shared/include/ambapp.h
EXTRA_DIST += shared/include/ambapp_ids.h
EXTRA_DIST += shared/amba/ambapp.c
EXTRA_DIST += shared/amba/ambapp_alloc.c
EXTRA_DIST += shared/amba/ambapp_count.c
EXTRA_DIST += shared/amba/ambapp_depth.c
EXTRA_DIST += shared/amba/ambapp_find_by_idx.c
EXTRA_DIST += shared/amba/ambapp_freq.c
EXTRA_DIST += shared/amba/ambapp_parent.c
EXTRA_DIST += shared/amba/ambapp_names.c
EXTRA_DIST += shared/amba/ambapp_old.c
EXTRA_DIST += shared/amba/ambapp_show.c
# PCI bus
EXTRA_DIST += shared/include/pci.h
+13 -2
View File
@@ -14,7 +14,6 @@ include_HEADERS = include/bsp.h
include_HEADERS += include/tm27.h
include_HEADERS += include/rasta.h
include_HEADERS += include/cchip.h
include_HEADERS += ../../sparc/shared/include/ambapp.h
include_HEADERS += ../../sparc/shared/include/grspw.h
include_HEADERS += ../../sparc/shared/include/grspw_pci.h
include_HEADERS += ../../sparc/shared/include/grspw_rasta.h
@@ -79,8 +78,20 @@ libbsp_a_SOURCES += \
../../shared/src/irq-legacy.c \
../../shared/src/irq-server.c \
../../shared/src/irq-shell.c
# AMBA PnP Scanning
# AMBA bus
include_HEADERS += ../../sparc/shared/include/ambapp.h
include_HEADERS += ../../sparc/shared/include/ambapp_ids.h
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_alloc.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_count.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_depth.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_find_by_idx.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_freq.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_parent.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_old.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_names.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_show.c
# PCI
libbsp_a_SOURCES += pci/pci.c ../../sparc/shared/pci/pcifinddevice.c
# RASTA Kit
+8 -4
View File
@@ -53,10 +53,6 @@ $(PROJECT_INCLUDE)/cchip.h: include/cchip.h $(PROJECT_INCLUDE)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/cchip.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/cchip.h
$(PROJECT_INCLUDE)/ambapp.h: ../../sparc/shared/include/ambapp.h $(PROJECT_INCLUDE)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/ambapp.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/ambapp.h
$(PROJECT_INCLUDE)/grspw.h: ../../sparc/shared/include/grspw.h $(PROJECT_INCLUDE)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/grspw.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/grspw.h
@@ -157,6 +153,14 @@ $(PROJECT_INCLUDE)/bsp/irq.h: include/bsp/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstam
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.h
$(PROJECT_INCLUDE)/ambapp.h: ../../sparc/shared/include/ambapp.h $(PROJECT_INCLUDE)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/ambapp.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/ambapp.h
$(PROJECT_INCLUDE)/ambapp_ids.h: ../../sparc/shared/include/ambapp_ids.h $(PROJECT_INCLUDE)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/ambapp_ids.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/ambapp_ids.h
$(PROJECT_INCLUDE)/i2cmst.h: ../../sparc/shared/include/i2cmst.h $(PROJECT_INCLUDE)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/i2cmst.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/i2cmst.h
+13 -2
View File
@@ -44,10 +44,21 @@ libbsp_a_SOURCES += ../../shared/bspclean.c ../../shared/bsplibc.c \
libbsp_a_SOURCES += ../../sparc/shared/irq_asm.S
# gnatsupp
libbsp_a_SOURCES += gnatsupp/gnatsupp.c ../../sparc/shared/gnatcommon.c
# amba
# AMBA bus
include_HEADERS += include/amba.h
include_HEADERS += ../../sparc/shared/include/ambapp.h
libbsp_a_SOURCES += amba/amba.c ../../sparc/shared/amba/ambapp.c
include_HEADERS += ../../sparc/shared/include/ambapp_ids.h
libbsp_a_SOURCES += amba/amba.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_alloc.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_count.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_depth.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_find_by_idx.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_freq.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_parent.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_old.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_names.c
libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_show.c
# console
libbsp_a_SOURCES += console/console.c
# debugio
+32 -15
View File
@@ -1,10 +1,10 @@
/*
* AMBA Plag & Play Bus Driver
* AMBA Plug & Play Bus Driver
*
* This driver hook performs bus scanning.
*
* COPYRIGHT (c) 2004.
* Gaisler Research
* COPYRIGHT (c) 2011.
* Aeroflex Gaisler
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
@@ -14,9 +14,14 @@
*/
#include <bsp.h>
#include <ambapp.h>
/* Structure containing address to devices found on the Amba Plug&Play bus */
amba_confarea_type amba_conf;
/* AMBA Plug&Play information description.
*
* After software has scanned AMBA PnP it builds a tree to make
* it easier for drivers to work with the bus architecture.
*/
struct ambapp_bus ambapp_plb;
/* GRLIB extended IRQ controller register */
extern void leon3_ext_irq_init(void);
@@ -38,16 +43,21 @@ extern int scan_uarts(void);
void amba_initialize(void)
{
int i;
int icsel;
amba_apb_device dev;
struct ambapp_dev *adev;
/* Scan the AMBA Plug&Play info at the default LEON3 area */
amba_scan(&amba_conf,LEON3_IO_AREA,NULL);
/* Scan AMBA Plug&Play read-only information. The routine builds a PnP
* tree into ambapp_plb in RAM, after this we never access the PnP
* information in hardware directly any more.
* Since on Processor Local Bus (PLB) memory mapping is 1:1
*/
ambapp_scan(&ambapp_plb, LEON3_IO_AREA, NULL, NULL);
/* Find LEON3 Interrupt controller */
i = amba_find_apbslv(&amba_conf,VENDOR_GAISLER,GAISLER_IRQMP,&dev);
if (i <= 0){
adev = (void *)ambapp_for_each(&ambapp_plb, (OPTIONS_ALL|OPTIONS_APB_SLVS),
VENDOR_GAISLER, GAISLER_IRQMP,
ambapp_find_by_idx, NULL);
if (adev == NULL) {
/* PANIC IRQ controller not found!
*
* What else can we do but stop ...
@@ -55,7 +65,8 @@ void amba_initialize(void)
asm volatile( "mov 1, %g1; ta 0x0" );
}
LEON3_IrqCtrl_Regs = (volatile LEON3_IrqCtrl_Regs_Map *) dev.start;
LEON3_IrqCtrl_Regs = (volatile LEON3_IrqCtrl_Regs_Map *)
DEV_TO_APB(adev)->start;
if ((LEON3_IrqCtrl_Regs->ampctrl >> 28) > 0) {
/* IRQ Controller has support for multiple IRQ Controllers, each
* CPU can be routed to different Controllers, we find out which
@@ -74,9 +85,15 @@ void amba_initialize(void)
leon3_ext_irq_init();
/* find GP Timer */
i = amba_find_apbslv(&amba_conf,VENDOR_GAISLER,GAISLER_GPTIMER,&dev);
if ( i > 0 ) {
LEON3_Timer_Regs = (volatile LEON3_Timer_Regs_Map *) dev.start;
adev = (void *)ambapp_for_each(&ambapp_plb, (OPTIONS_ALL|OPTIONS_APB_SLVS),
VENDOR_GAISLER, GAISLER_GPTIMER,
ambapp_find_by_idx, NULL);
if (adev) {
LEON3_Timer_Regs = (volatile LEON3_Timer_Regs_Map *)DEV_TO_APB(adev)->start;
/* Register AMBA Bus Frequency */
ambapp_freq_init(&ambapp_plb, adev,
(LEON3_Timer_Regs->scaler_reload + 1) * 1000000);
}
/* find UARTS */
+1 -1
View File
@@ -34,7 +34,7 @@ extern "C" {
#endif
/* The AMBA Plug&Play info of the bus that the LEON3 sits on */
extern amba_confarea_type amba_conf;
extern struct ambapp_bus ambapp_plb;
#ifdef __cplusplus
}
@@ -85,6 +85,10 @@ $(PROJECT_INCLUDE)/ambapp.h: ../../sparc/shared/include/ambapp.h $(PROJECT_INCLU
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/ambapp.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/ambapp.h
$(PROJECT_INCLUDE)/ambapp_ids.h: ../../sparc/shared/include/ambapp_ids.h $(PROJECT_INCLUDE)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/ambapp_ids.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/ambapp_ids.h
$(PROJECT_INCLUDE)/bsp/irq-generic.h: ../../shared/include/irq-generic.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-generic.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-generic.h
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,25 @@
/*
* AMBA Plug & Play routines
*
* COPYRIGHT (c) 2011
* Aeroflex Gaisler
*
* 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.
*/
#include <ambapp.h>
int ambapp_alloc_dev(struct ambapp_dev *dev, void *owner)
{
if (dev->owner)
return -1;
dev->owner = owner;
return 0;
}
void ambapp_free_dev(struct ambapp_dev *dev)
{
dev->owner = 0;
}
@@ -0,0 +1,23 @@
/*
* AMBA Plug & Play routines
*
* COPYRIGHT (c) 2011
* Aeroflex Gaisler
*
* 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.
*/
#include <ambapp.h>
/* Get number of devices matching search options */
int ambapp_dev_count(struct ambapp_bus *abus, unsigned int options,
int vendor, int device)
{
int count = 10000;
ambapp_for_each(abus, options, vendor, device, ambapp_find_by_idx, &count);
return 10000 - count;
}
@@ -0,0 +1,25 @@
/*
* AMBA Plug & Play routines
*
* COPYRIGHT (c) 2011
* Aeroflex Gaisler
*
* 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.
*/
#include <ambapp.h>
/* Get bus depth a device is located at */
int ambapp_depth(struct ambapp_dev *dev)
{
int depth = 0;
do {
dev = ambapp_find_parent(dev);
depth++;
} while (dev);
return depth - 1;
}
@@ -0,0 +1,39 @@
/*
* AMBA Plug & Play routines
*
* COPYRIGHT (c) 2011
* Aeroflex Gaisler
*
* 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.
*/
#include <ambapp.h>
/* AMBAPP helper routine to find a device by index. The function is given to
* ambapp_for_each, the argument may be NULL (find first device) or a pointer
* to a index which is downcounted until 0 is reached. If the int-pointer
* points to a value of:
* 0 - first device is returned
* 1 - second device is returned
* ...
*
* The matching device is returned, which will stop the ambapp_for_each search.
* If zero is returned from ambapp_for_each no device matching the index was
* found
*/
int ambapp_find_by_idx(struct ambapp_dev *dev, int index, void *pcount)
{
int *pi = pcount;
if (pi) {
if (*pi-- == 0)
return (int)dev;
else
return 0;
} else {
/* Satisfied with first matching device, stop search */
return (int)dev;
}
}
@@ -0,0 +1,109 @@
/*
* AMBA Plug & Play routines
*
* COPYRIGHT (c) 2011
* Aeroflex Gaisler
*
* 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.
*/
#include <ambapp.h>
/* Calculate AHB Bus frequency of
* - Bus[0] (inverse=1), relative to the frequency of Bus[ahbidx]
* NOTE: set freq_hz to frequency of Bus[ahbidx].
* or
* - Bus[ahbidx] (inverse=0), relative to the frequency of Bus[0]
* NOTE: set freq_hz to frequency of Bus[0].
*
* If a unsupported bridge is found the invalid frequncy of 0Hz is
* returned.
*/
unsigned int ambapp_freq_calc(
struct ambapp_bus *abus,
int ahbidx,
unsigned int freq_hz,
int inverse)
{
struct ambapp_ahb_info *ahb;
struct ambapp_dev *bridge;
unsigned char ffact;
int dir;
/* Found Bus0? */
bridge = abus->ahbs[ahbidx].bridge;
if (!bridge)
return freq_hz;
/* Find this bus frequency relative to freq_hz */
if ((bridge->vendor == VENDOR_GAISLER) &&
((bridge->device == GAISLER_AHB2AHB) ||
(bridge->device == GAISLER_L2CACHE))) {
ahb = DEV_TO_AHB(bridge);
ffact = (ahb->custom[0] & AMBAPP_FLAG_FFACT) >> 4;
if (ffact != 0) {
dir = ahb->custom[0] & AMBAPP_FLAG_FFACT_DIR;
/* Calculate frequency by dividing or
* multiplying system frequency
*/
if ((dir && !inverse) || (!dir && inverse))
freq_hz = freq_hz * ffact;
else
freq_hz = freq_hz / ffact;
}
return ambapp_freq_calc(abus, ahb->ahbidx, freq_hz, inverse);
} else {
/* Unknown bridge, impossible to calc frequency */
return 0;
}
}
/* Find the frequency of all AHB Buses from knowing the frequency of one
* particular APB/AHB Device.
*/
void ambapp_freq_init(
struct ambapp_bus *abus,
struct ambapp_dev *dev,
unsigned int freq_hz)
{
struct ambapp_common_info *info;
int i;
for (i=0; i<AHB_BUS_MAX; i++)
abus->ahbs[i].freq_hz = 0;
/* Register Frequency at the AHB bus that the device the user gave us
* is located at.
*/
if (dev) {
info = DEV_TO_COMMON(dev);
abus->ahbs[info->ahbidx].freq_hz = freq_hz;
/* Find Frequency of Bus 0 */
abus->ahbs[0].freq_hz = ambapp_freq_calc(abus, info->ahbidx, freq_hz, 1);
} else {
abus->ahbs[0].freq_hz = freq_hz;
}
/* Find Frequency of all except for Bus0 and the bus which frequency
* was reported at
*/
for (i=1; i<AHB_BUS_MAX; i++) {
if (abus->ahbs[i].ioarea == 0)
break;
if (abus->ahbs[i].freq_hz != 0)
continue;
abus->ahbs[i].freq_hz = ambapp_freq_calc(abus, i, abus->ahbs[0].freq_hz, 0);
}
}
/* Assign a AMBA Bus a frequency but reporting the frequency of a
* particular AHB/APB device */
unsigned int ambapp_freq_get(struct ambapp_bus *abus, struct ambapp_dev *dev)
{
struct ambapp_common_info *info = DEV_TO_COMMON(dev);
return abus->ahbs[info->ahbidx].freq_hz;
}
@@ -0,0 +1,392 @@
/*
* AMBA Plug & Play Device and Vendor name database: Created from GRLIB 3386.
*
* COPYRIGHT (c) 2009.
* Aeroflex Gaisler.
*
* The device and vendor definitions are extracted with a script from
* GRLIB.
*
* 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.
*/
#include <ambapp_ids.h>
#include <string.h>
#ifndef NULL
#define NULL 0
#endif
typedef struct {
int device_id;
char *name;
} ambapp_device_name;
typedef struct {
unsigned int vendor_id;
char *name;
ambapp_device_name *devices;
} ambapp_vendor_devnames;
/**************** AUTO GENERATED FROM devices.vhd ****************/
static ambapp_device_name GAISLER_devices[] =
{
{GAISLER_LEON2DSU, "LEON2DSU"},
{GAISLER_LEON3, "LEON3"},
{GAISLER_LEON3DSU, "LEON3DSU"},
{GAISLER_ETHAHB, "ETHAHB"},
{GAISLER_APBMST, "APBMST"},
{GAISLER_AHBUART, "AHBUART"},
{GAISLER_SRCTRL, "SRCTRL"},
{GAISLER_SDCTRL, "SDCTRL"},
{GAISLER_SSRCTRL, "SSRCTRL"},
{GAISLER_APBUART, "APBUART"},
{GAISLER_IRQMP, "IRQMP"},
{GAISLER_AHBRAM, "AHBRAM"},
{GAISLER_AHBDPRAM, "AHBDPRAM"},
{GAISLER_GPTIMER, "GPTIMER"},
{GAISLER_PCITRG, "PCITRG"},
{GAISLER_PCISBRG, "PCISBRG"},
{GAISLER_PCIFBRG, "PCIFBRG"},
{GAISLER_PCITRACE, "PCITRACE"},
{GAISLER_DMACTRL, "DMACTRL"},
{GAISLER_AHBTRACE, "AHBTRACE"},
{GAISLER_DSUCTRL, "DSUCTRL"},
{GAISLER_CANAHB, "CANAHB"},
{GAISLER_GPIO, "GPIO"},
{GAISLER_AHBROM, "AHBROM"},
{GAISLER_AHBJTAG, "AHBJTAG"},
{GAISLER_ETHMAC, "ETHMAC"},
{GAISLER_SWNODE, "SWNODE"},
{GAISLER_SPW, "SPW"},
{GAISLER_AHB2AHB, "AHB2AHB"},
{GAISLER_USBDC, "USBDC"},
{GAISLER_USB_DCL, "USB_DCL"},
{GAISLER_DDRMP, "DDRMP"},
{GAISLER_ATACTRL, "ATACTRL"},
{GAISLER_DDRSP, "DDRSP"},
{GAISLER_EHCI, "EHCI"},
{GAISLER_UHCI, "UHCI"},
{GAISLER_I2CMST, "I2CMST"},
{GAISLER_SPW2, "SPW2"},
{GAISLER_AHBDMA, "AHBDMA"},
{GAISLER_NUHOSP3, "NUHOSP3"},
{GAISLER_CLKGATE, "CLKGATE"},
{GAISLER_SPICTRL, "SPICTRL"},
{GAISLER_DDR2SP, "DDR2SP"},
{GAISLER_SLINK, "SLINK"},
{GAISLER_GRTM, "GRTM"},
{GAISLER_GRTC, "GRTC"},
{GAISLER_GRPW, "GRPW"},
{GAISLER_GRCTM, "GRCTM"},
{GAISLER_GRHCAN, "GRHCAN"},
{GAISLER_GRFIFO, "GRFIFO"},
{GAISLER_GRADCDAC, "GRADCDAC"},
{GAISLER_GRPULSE, "GRPULSE"},
{GAISLER_GRTIMER, "GRTIMER"},
{GAISLER_AHB2PP, "AHB2PP"},
{GAISLER_GRVERSION, "GRVERSION"},
{GAISLER_APB2PW, "APB2PW"},
{GAISLER_PW2APB, "PW2APB"},
{GAISLER_GRCAN, "GRCAN"},
{GAISLER_I2CSLV, "I2CSLV"},
{GAISLER_U16550, "U16550"},
{GAISLER_AHBMST_EM, "AHBMST_EM"},
{GAISLER_AHBSLV_EM, "AHBSLV_EM"},
{GAISLER_GRTESTMOD, "GRTESTMOD"},
{GAISLER_ASCS, "ASCS"},
{GAISLER_IPMVBCTRL, "IPMVBCTRL"},
{GAISLER_SPIMCTRL, "SPIMCTRL"},
{GAISLER_LEON4, "LEON4"},
{GAISLER_LEON4DSU, "LEON4DSU"},
{GAISLER_GRPWM, "GRPWM"},
{GAISLER_FTAHBRAM, "FTAHBRAM"},
{GAISLER_FTSRCTRL, "FTSRCTRL"},
{GAISLER_AHBSTAT, "AHBSTAT"},
{GAISLER_LEON3FT, "LEON3FT"},
{GAISLER_FTMCTRL, "FTMCTRL"},
{GAISLER_FTSDCTRL, "FTSDCTRL"},
{GAISLER_FTSRCTRL8, "FTSRCTRL8"},
{GAISLER_MEMSCRUB, "MEMSCRUB"},
{GAISLER_APBPS2, "APBPS2"},
{GAISLER_VGACTRL, "VGACTRL"},
{GAISLER_LOGAN, "LOGAN"},
{GAISLER_SVGACTRL, "SVGACTRL"},
{GAISLER_T1AHB, "T1AHB"},
{GAISLER_MP7WRAP, "MP7WRAP"},
{GAISLER_GRSYSMON, "GRSYSMON"},
{GAISLER_GRACECTRL, "GRACECTRL"},
{GAISLER_B1553BC, "B1553BC"},
{GAISLER_B1553RT, "B1553RT"},
{GAISLER_B1553BRM, "B1553BRM"},
{GAISLER_SATCAN, "SATCAN"},
{GAISLER_CANMUX, "CANMUX"},
{GAISLER_GRTMRX, "GRTMRX"},
{GAISLER_GRTCTX, "GRTCTX"},
{GAISLER_GRTMDESC, "GRTMDESC"},
{GAISLER_GRTMVC, "GRTMVC"},
{GAISLER_GEFFE, "GEFFE"},
{GAISLER_AES, "AES"},
{GAISLER_GRAESDMA, "GRAESDMA"},
{GAISLER_ECC, "ECC"},
{GAISLER_PCIF, "PCIF"},
{GAISLER_CLKMOD, "CLKMOD"},
{GAISLER_HAPSTRAK, "HAPSTRAK"},
{GAISLER_TEST_1X2, "TEST_1X2"},
{GAISLER_WILD2AHB, "WILD2AHB"},
{GAISLER_BIO1, "BIO1"},
{GAISLER_GR1553B, "GR1553B"},
{GAISLER_L2CACHE, "L2CACHE"},
{GAISLER_L4STAT, "L4STAT"},
{GAISLER_GRPCI2, "GRPCI2"},
{GAISLER_GRPCI2_DMA, "GRPCI2_DMA"},
{GAISLER_GRIOMMU, "GRIOMMU"},
{GAISLER_SPW2_DMA, "SPW2_DMA"},
{GAISLER_SPW_ROUTER, "SPW_ROUTER"},
{0, NULL}
};
static ambapp_device_name PENDER_devices[] =
{
{0, NULL}
};
static ambapp_device_name ESA_devices[] =
{
{ESA_LEON2, "LEON2"},
{ESA_LEON2APB, "LEON2APB"},
{ESA_IRQ, "IRQ"},
{ESA_TIMER, "TIMER"},
{ESA_UART, "UART"},
{ESA_CFG, "CFG"},
{ESA_IO, "IO"},
{ESA_MCTRL, "MCTRL"},
{ESA_PCIARB, "PCIARB"},
{ESA_HURRICANE, "HURRICANE"},
{ESA_SPW_RMAP, "SPW_RMAP"},
{ESA_AHBUART, "AHBUART"},
{ESA_SPWA, "SPWA"},
{ESA_BOSCHCAN, "BOSCHCAN"},
{ESA_IRQ2, "IRQ2"},
{ESA_AHBSTAT, "AHBSTAT"},
{ESA_WPROT, "WPROT"},
{ESA_WPROT2, "WPROT2"},
{ESA_PDEC3AMBA, "PDEC3AMBA"},
{ESA_PTME3AMBA, "PTME3AMBA"},
{0, NULL}
};
static ambapp_device_name ASTRIUM_devices[] =
{
{0, NULL}
};
static ambapp_device_name OPENCHIP_devices[] =
{
{OPENCHIP_APBGPIO, "APBGPIO"},
{OPENCHIP_APBI2C, "APBI2C"},
{OPENCHIP_APBSPI, "APBSPI"},
{OPENCHIP_APBCHARLCD, "APBCHARLCD"},
{OPENCHIP_APBPWM, "APBPWM"},
{OPENCHIP_APBPS2, "APBPS2"},
{OPENCHIP_APBMMCSD, "APBMMCSD"},
{OPENCHIP_APBNAND, "APBNAND"},
{OPENCHIP_APBLPC, "APBLPC"},
{OPENCHIP_APBCF, "APBCF"},
{OPENCHIP_APBSYSACE, "APBSYSACE"},
{OPENCHIP_APB1WIRE, "APB1WIRE"},
{OPENCHIP_APBJTAG, "APBJTAG"},
{OPENCHIP_APBSUI, "APBSUI"},
{0, NULL}
};
static ambapp_device_name OPENCORES_devices[] =
{
{0, NULL}
};
static ambapp_device_name CONTRIB_devices[] =
{
{CONTRIB_CORE1, "CORE1"},
{CONTRIB_CORE2, "CORE2"},
{0, NULL}
};
static ambapp_device_name EONIC_devices[] =
{
{0, NULL}
};
static ambapp_device_name RADIONOR_devices[] =
{
{0, NULL}
};
static ambapp_device_name GLEICHMANN_devices[] =
{
{GLEICHMANN_CUSTOM, "CUSTOM"},
{GLEICHMANN_GEOLCD01, "GEOLCD01"},
{GLEICHMANN_DAC, "DAC"},
{GLEICHMANN_HPI, "HPI"},
{GLEICHMANN_SPI, "SPI"},
{GLEICHMANN_HIFC, "HIFC"},
{GLEICHMANN_ADCDAC, "ADCDAC"},
{GLEICHMANN_SPIOC, "SPIOC"},
{GLEICHMANN_AC97, "AC97"},
{0, NULL}
};
static ambapp_device_name MENTA_devices[] =
{
{0, NULL}
};
static ambapp_device_name SUN_devices[] =
{
{SUN_T1, "SUN_T1"},
{SUN_S1, "SUN_S1"},
{0, NULL}
};
static ambapp_device_name MOVIDIA_devices[] =
{
{0, NULL}
};
static ambapp_device_name ORBITA_devices[] =
{
{ORBITA_1553B, "1553B"},
{ORBITA_429, "429"},
{ORBITA_SPI, "SPI"},
{ORBITA_I2C, "I2C"},
{ORBITA_SMARTCARD, "SMARTCARD"},
{ORBITA_SDCARD, "SDCARD"},
{ORBITA_UART16550, "UART16550"},
{ORBITA_CRYPTO, "CRYPTO"},
{ORBITA_SYSIF, "SYSIF"},
{ORBITA_PIO, "PIO"},
{ORBITA_RTC, "RTC"},
{ORBITA_COLORLCD, "COLORLCD"},
{ORBITA_PCI, "PCI"},
{ORBITA_DSP, "DSP"},
{ORBITA_USBHOST, "USBHOST"},
{ORBITA_USBDEV, "USBDEV"},
{0, NULL}
};
static ambapp_device_name SYNOPSYS_devices[] =
{
{0, NULL}
};
static ambapp_device_name NASA_devices[] =
{
{NASA_EP32, "EP32"},
{0, NULL}
};
static ambapp_device_name CAL_devices[] =
{
{CAL_DDRCTRL, "DDRCTRL"},
{0, NULL}
};
static ambapp_device_name EMBEDDIT_devices[] =
{
{0, NULL}
};
static ambapp_device_name CETON_devices[] =
{
{0, NULL}
};
static ambapp_device_name ACTEL_devices[] =
{
{ACTEL_COREMP7, "COREMP7"},
{0, NULL}
};
static ambapp_vendor_devnames vendors[] =
{
{VENDOR_GAISLER, "GAISLER", GAISLER_devices},
{VENDOR_PENDER, "PENDER", PENDER_devices},
{VENDOR_ESA, "ESA", ESA_devices},
{VENDOR_ASTRIUM, "ASTRIUM", ASTRIUM_devices},
{VENDOR_OPENCHIP, "OPENCHIP", OPENCHIP_devices},
{VENDOR_OPENCORES, "OPENCORES", OPENCORES_devices},
{VENDOR_CONTRIB, "CONTRIB", CONTRIB_devices},
{VENDOR_EONIC, "EONIC", EONIC_devices},
{VENDOR_RADIONOR, "RADIONOR", RADIONOR_devices},
{VENDOR_GLEICHMANN, "GLEICHMANN", GLEICHMANN_devices},
{VENDOR_MENTA, "MENTA", MENTA_devices},
{VENDOR_SUN, "SUN", SUN_devices},
{VENDOR_MOVIDIA, "MOVIDIA", MOVIDIA_devices},
{VENDOR_ORBITA, "ORBITA", ORBITA_devices},
{VENDOR_SYNOPSYS, "SYNOPSYS", SYNOPSYS_devices},
{VENDOR_NASA, "NASA", NASA_devices},
{VENDOR_CAL, "CAL", CAL_devices},
{VENDOR_EMBEDDIT, "EMBEDDIT", EMBEDDIT_devices},
{VENDOR_CETON, "CETON", CETON_devices},
{VENDOR_ACTEL, "ACTEL", ACTEL_devices},
{0, NULL, NULL}
};
/*****************************************************************/
static char *ambapp_get_devname(ambapp_device_name *devs, int id)
{
while (devs->device_id > 0) {
if (devs->device_id == id)
return devs->name;
devs++;
}
return NULL;
}
char *ambapp_device_id2str(int vendor, int id)
{
ambapp_vendor_devnames *ven = &vendors[0];
while (ven->vendor_id > 0) {
if (ven->vendor_id == vendor)
return ambapp_get_devname(ven->devices, id);
ven++;
}
return NULL;
}
char *ambapp_vendor_id2str(int vendor)
{
ambapp_vendor_devnames *ven = &vendors[0];
while (ven->vendor_id > 0) {
if (ven->vendor_id == vendor)
return ven->name;
ven++;
}
return NULL;
}
int ambapp_vendev_id2str(int vendor, int id, char *buf)
{
char *dstr, *vstr;
*buf = '\0';
vstr = ambapp_vendor_id2str(vendor);
if (vstr == NULL)
return 0;
dstr = ambapp_device_id2str(vendor, id);
if (dstr == NULL)
return 0;
strcpy(buf, vstr);
strcat(buf, "_");
strcat(buf, dstr);
return strlen(buf);
}
@@ -0,0 +1,112 @@
/*
* Old AMBA scanning Interface provided for backwards compability
*
* COPYRIGHT (c) 2011
* Aeroflex Gaisler
*
* 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.
*/
#include <ambapp.h>
struct ambapp_dev_find_match_arg {
int index;
int count;
int type;
void *dev;
};
/* AMBA PP find routines */
int ambapp_dev_find_match(struct ambapp_dev *dev, int index, void *arg)
{
struct ambapp_dev_find_match_arg *p = arg;
if (p->index == 0) {
/* Found controller, stop */
if (p->type == DEV_APB_SLV) {
*(struct ambapp_apb_info *)p->dev = *DEV_TO_APB(dev);
p->dev = ((struct ambapp_apb_info *)p->dev)+1;
} else {
*(struct ambapp_ahb_info *)p->dev = *DEV_TO_AHB(dev);
p->dev = ((struct ambapp_ahb_info *)p->dev)+1;
}
p->count--;
if (p->count < 1)
return 1;
} else {
p->index--;
}
return 0;
}
int ambapp_find_apbslvs_next(struct ambapp_bus *abus, int vendor, int device, struct ambapp_apb_info *dev, int index, int maxno)
{
struct ambapp_dev_find_match_arg arg;
arg.index = index;
arg.count = maxno;
arg.type = DEV_APB_SLV; /* APB */
arg.dev = dev;
ambapp_for_each(abus, (OPTIONS_ALL|OPTIONS_APB_SLVS), vendor, device,
ambapp_dev_find_match, &arg);
return maxno - arg.count;
}
int ambapp_find_apbslv(struct ambapp_bus *abus, int vendor, int device, struct ambapp_apb_info *dev)
{
return ambapp_find_apbslvs_next(abus, vendor, device, dev, 0, 1);
}
int ambapp_find_apbslv_next(struct ambapp_bus *abus, int vendor, int device, struct ambapp_apb_info *dev, int index)
{
return ambapp_find_apbslvs_next(abus, vendor, device, dev, index, 1);
}
int ambapp_find_apbslvs(struct ambapp_bus *abus, int vendor, int device, struct ambapp_apb_info *dev, int maxno)
{
return ambapp_find_apbslvs_next(abus, vendor, device, dev, 0, maxno);
}
int ambapp_get_number_apbslv_devices(struct ambapp_bus *abus, int vendor, int device)
{
return ambapp_dev_count(abus, (OPTIONS_ALL|OPTIONS_APB_SLVS), vendor, device);
}
int ambapp_find_ahbslvs_next(struct ambapp_bus *abus, int vendor, int device, struct ambapp_ahb_info *dev, int index, int maxno)
{
struct ambapp_dev_find_match_arg arg;
arg.index = index;
arg.count = maxno;
arg.type = DEV_AHB_SLV; /* AHB SLV */
arg.dev = dev;
ambapp_for_each(abus, (OPTIONS_ALL|OPTIONS_AHB_SLVS), vendor, device,
ambapp_dev_find_match, &arg);
return maxno - arg.count;
}
int ambapp_find_ahbslv_next(struct ambapp_bus *abus, int vendor, int device, struct ambapp_ahb_info *dev, int index)
{
return ambapp_find_ahbslvs_next(abus, vendor, device, dev, index, 1);
}
int ambapp_find_ahbslv(struct ambapp_bus *abus, int vendor, int device, struct ambapp_ahb_info *dev)
{
return ambapp_find_ahbslvs_next(abus, vendor, device, dev, 0, 1);
}
int ambapp_find_ahbslvs(struct ambapp_bus *abus, int vendor, int device, struct ambapp_ahb_info *dev, int maxno)
{
return ambapp_find_ahbslvs_next(abus, vendor, device, dev, 0, maxno);
}
int ambapp_get_number_ahbslv_devices(struct ambapp_bus *abus, int vendor, int device)
{
return ambapp_dev_count(abus, (OPTIONS_ALL|OPTIONS_AHB_SLVS), vendor, device);
}
@@ -0,0 +1,23 @@
/*
* AMBA Plug & Play routines
*
* COPYRIGHT (c) 2011
* Aeroflex Gaisler
*
* 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.
*/
#include <stdlib.h>
#include <ambapp.h>
struct ambapp_dev *ambapp_find_parent(struct ambapp_dev *dev)
{
while (dev->prev) {
if (dev == dev->prev->children)
return dev->prev;
dev = dev->prev;
}
return NULL;
}
@@ -0,0 +1,71 @@
/*
* AMBA Plug & Play routines: device information printing.
*
* COPYRIGHT (c) 2009.
* Aeroflex Gaisler.
*
* 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.
*/
#include <stdio.h>
#include <ambapp.h>
extern char *ambapp_device_id2str(int vendor, int id);
extern char *ambapp_vendor_id2str(int vendor);
struct ambapp_dev_print_arg {
int show_depth;
};
static char *unknown = "unknown";
int ambapp_dev_print(struct ambapp_dev *dev, int index, void *arg)
{
char *dev_str, *ven_str, *type_str;
struct ambapp_dev_print_arg *p = arg;
char dp[32];
int i=0;
unsigned int basereg;
if (p->show_depth) {
for (i=0; i<ambapp_depth(dev)*2; i+=2) {
dp[i] = ' ';
dp[i+1] = ' ';
}
}
dp[i] = '\0';
ven_str = ambapp_vendor_id2str(dev->vendor);
if (!ven_str) {
ven_str = unknown;
dev_str = unknown;
} else {
dev_str = ambapp_device_id2str(dev->vendor, dev->device);
if (!dev_str)
dev_str = unknown;
}
if (dev->dev_type == DEV_APB_SLV) {
/* APB */
basereg = DEV_TO_APB(dev)->start;
type_str = "apb";
} else {
/* AHB */
basereg = DEV_TO_AHB(dev)->start[0];
type_str = "ahb";
}
printf("%s |-> 0x%x:0x%x:0x%x: %s_%s, %s: 0x%x, 0x%x (OWNER: 0x%x)\n",
dp, index, dev->vendor, dev->device, ven_str, dev_str, type_str,
basereg, (unsigned int)dev, (unsigned int)dev->owner);
return 0;
}
void ambapp_print(struct ambapp_bus *abus, int show_depth)
{
struct ambapp_dev_print_arg arg;
arg.show_depth = show_depth;
ambapp_for_each(abus, (OPTIONS_ALL_DEVS|OPTIONS_ALL|OPTIONS_DEPTH_FIRST), -1,
-1, ambapp_dev_print, &arg);
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,245 @@
/* AMBA Plug & Play Bus Vendor and Device IDs.
*
* COPYRIGHT (c) 2008.
* Gaisler Research
*
* This header file provide all known VENDOR and DEVICE IDs available
* in the AMBA Plug & Play information. Taken from GRLIB 3386.
*
* 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.
*
*/
#ifndef __AMBAPP_DEVS_H__
#define __AMBAPP_DEVS_H__
/* Vendor codes */
#define VENDOR_GAISLER 1
#define VENDOR_PENDER 2
#define VENDOR_ESA 4
#define VENDOR_ASTRIUM 6
#define VENDOR_OPENCHIP 7
#define VENDOR_OPENCORES 8
#define VENDOR_CONTRIB 9
#define VENDOR_EONIC 11
#define VENDOR_RADIONOR 15
#define VENDOR_GLEICHMANN 16
#define VENDOR_MENTA 17
#define VENDOR_SUN 19
#define VENDOR_MOVIDIA 20
#define VENDOR_ORBITA 23
#define VENDOR_SYNOPSYS 33
#define VENDOR_NASA 34
#define VENDOR_ACTEL 172
#define VENDOR_CAL 202
#define VENDOR_EMBEDDIT 234
#define VENDOR_CETON 203
/* Gaisler Research device id's */
#define GAISLER_LEON2DSU 0x002
#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_SSRCTRL 0x00a
#define GAISLER_APBUART 0x00c
#define GAISLER_IRQMP 0x00d
#define GAISLER_AHBRAM 0x00e
#define GAISLER_AHBDPRAM 0x00f
#define GAISLER_GPTIMER 0x011
#define GAISLER_PCITRG 0x012
#define GAISLER_PCISBRG 0x013
#define GAISLER_PCIFBRG 0x014
#define GAISLER_PCITRACE 0x015
#define GAISLER_DMACTRL 0x016
#define GAISLER_AHBTRACE 0x017
#define GAISLER_DSUCTRL 0x018
#define GAISLER_CANAHB 0x019
#define GAISLER_GPIO 0x01a
#define GAISLER_AHBROM 0x01b
#define GAISLER_AHBJTAG 0x01c
#define GAISLER_ETHMAC 0x01d
#define GAISLER_SWNODE 0x01e
#define GAISLER_SPW 0x01f
#define GAISLER_AHB2AHB 0x020
#define GAISLER_USBDC 0x021
#define GAISLER_USB_DCL 0x022
#define GAISLER_DDRMP 0x023
#define GAISLER_ATACTRL 0x024
#define GAISLER_DDRSP 0x025
#define GAISLER_EHCI 0x026
#define GAISLER_UHCI 0x027
#define GAISLER_I2CMST 0x028
#define GAISLER_SPW2 0x029
#define GAISLER_AHBDMA 0x02a
#define GAISLER_NUHOSP3 0x02b
#define GAISLER_CLKGATE 0x02c
#define GAISLER_SPICTRL 0x02d
#define GAISLER_DDR2SP 0x02e
#define GAISLER_SLINK 0x02f
#define GAISLER_GRTM 0x030
#define GAISLER_GRTC 0x031
#define GAISLER_GRPW 0x032
#define GAISLER_GRCTM 0x033
#define GAISLER_GRHCAN 0x034
#define GAISLER_GRFIFO 0x035
#define GAISLER_GRADCDAC 0x036
#define GAISLER_GRPULSE 0x037
#define GAISLER_GRTIMER 0x038
#define GAISLER_AHB2PP 0x039
#define GAISLER_GRVERSION 0x03a
#define GAISLER_APB2PW 0x03b
#define GAISLER_PW2APB 0x03c
#define GAISLER_GRCAN 0x03d
#define GAISLER_I2CSLV 0x03e
#define GAISLER_U16550 0x03f
#define GAISLER_AHBMST_EM 0x040
#define GAISLER_AHBSLV_EM 0x041
#define GAISLER_GRTESTMOD 0x042
#define GAISLER_ASCS 0x043
#define GAISLER_IPMVBCTRL 0x044
#define GAISLER_SPIMCTRL 0x045
#define GAISLER_L4STAT 0x047
#define GAISLER_LEON4 0x048
#define GAISLER_LEON4DSU 0x049
#define GAISLER_GRPWM 0x04a
#define GAISLER_L2CACHE 0x04b
#define GAISLER_GR1553B 0x04d
#define GAISLER_GRIOMMU 0x04f
#define GAISLER_FTAHBRAM 0x050
#define GAISLER_FTSRCTRL 0x051
#define GAISLER_AHBSTAT 0x052
#define GAISLER_LEON3FT 0x053
#define GAISLER_FTMCTRL 0x054
#define GAISLER_FTSDCTRL 0x055
#define GAISLER_FTSRCTRL8 0x056
#define GAISLER_MEMSCRUB 0x057
#define GAISLER_APBPS2 0x060
#define GAISLER_VGACTRL 0x061
#define GAISLER_LOGAN 0x062
#define GAISLER_SVGACTRL 0x063
#define GAISLER_T1AHB 0x064
#define GAISLER_MP7WRAP 0x065
#define GAISLER_GRSYSMON 0x066
#define GAISLER_GRACECTRL 0x067
#define GAISLER_B1553BC 0x070
#define GAISLER_B1553RT 0x071
#define GAISLER_B1553BRM 0x072
#define GAISLER_GRAES 0x073
#define GAISLER_SATCAN 0x080
#define GAISLER_CANMUX 0x081
#define GAISLER_GRTMRX 0x082
#define GAISLER_GRTCTX 0x083
#define GAISLER_GRTMDESC 0x084
#define GAISLER_GRTMVC 0x085
#define GAISLER_GEFFE 0x086
#define GAISLER_AES 0x073
#define GAISLER_ECC 0x074
#define GAISLER_PCIF 0x075
#define GAISLER_CLKMOD 0x076
#define GAISLER_HAPSTRAK 0x077
#define GAISLER_TEST_1X2 0x078
#define GAISLER_WILD2AHB 0x079
#define GAISLER_BIO1 0x07a
#define GAISLER_GRAESDMA 0x07b
#define GAISLER_GRPCI2 0x07c
#define GAISLER_GRPCI2_DMA 0x07d
#define GAISLER_SPWCUC 0x089
#define GAISLER_SPW2_DMA 0x08a
#define GAISLER_SPW_ROUTER 0x08b
#define GAISLER_PIPEWRAPPER 0xffa
#define GAISLER_L2TIME 0xffd /* internal device: leon2 timer */
#define GAISLER_L2C 0xffe /* internal device: leon2compat */
#define GAISLER_PLUGPLAY 0xfff /* internal device: plug & play configarea */
/* European Space Agency device id's */
#define ESA_LEON2 0x002
#define ESA_LEON2APB 0x003
#define ESA_IRQ 0x005
#define ESA_TIMER 0x006
#define ESA_UART 0x007
#define ESA_CFG 0x008
#define ESA_IO 0x009
#define ESA_MCTRL 0x00f
#define ESA_PCIARB 0x010
#define ESA_HURRICANE 0x011
#define ESA_SPW_RMAP 0x012
#define ESA_SPW2 0x012
#define ESA_AHBUART 0x013
#define ESA_SPWA 0x014
#define ESA_BOSCHCAN 0x015
#define ESA_IRQ2 0x016
#define ESA_AHBSTAT 0x017
#define ESA_WPROT 0x018
#define ESA_WPROT2 0x019
#define ESA_PDEC3AMBA 0x020
#define ESA_PTME3AMBA 0x021
#define OPENCHIP_APBGPIO 0x001
#define OPENCHIP_APBI2C 0x002
#define OPENCHIP_APBSPI 0x003
#define OPENCHIP_APBCHARLCD 0x004
#define OPENCHIP_APBPWM 0x005
#define OPENCHIP_APBPS2 0x006
#define OPENCHIP_APBMMCSD 0x007
#define OPENCHIP_APBNAND 0x008
#define OPENCHIP_APBLPC 0x009
#define OPENCHIP_APBCF 0x00a
#define OPENCHIP_APBSYSACE 0x00b
#define OPENCHIP_APB1WIRE 0x00c
#define OPENCHIP_APBJTAG 0x00d
#define OPENCHIP_APBSUI 0x00e
#define CONTRIB_CORE1 0x001
#define CONTRIB_CORE2 0x002
#define GLEICHMANN_CUSTOM 0x001
#define GLEICHMANN_GEOLCD01 0x002
#define GLEICHMANN_DAC 0x003
#define GLEICHMANN_HPI 0x004
#define GLEICHMANN_SPI 0x005
#define GLEICHMANN_HIFC 0x006
#define GLEICHMANN_ADCDAC 0x007
#define GLEICHMANN_SPIOC 0x008
#define GLEICHMANN_AC97 0x009
#define SUN_T1 0x001
#define SUN_S1 0x011
#define ORBITA_1553B 0x001
#define ORBITA_429 0x002
#define ORBITA_SPI 0x003
#define ORBITA_I2C 0x004
#define ORBITA_SMARTCARD 0x064
#define ORBITA_SDCARD 0x065
#define ORBITA_UART16550 0x066
#define ORBITA_CRYPTO 0x067
#define ORBITA_SYSIF 0x068
#define ORBITA_PIO 0x069
#define ORBITA_RTC 0x0c8
#define ORBITA_COLORLCD 0x12c
#define ORBITA_PCI 0x190
#define ORBITA_DSP 0x1f4
#define ORBITA_USBHOST 0x258
#define ORBITA_USBDEV 0x2bc
#define NASA_EP32 0x001
#define CAL_DDRCTRL 0x188
#define ACTEL_COREMP7 0x001
/* Opencores device id's */
#define OPENCORES_PCIBR 0x4
#define OPENCORES_ETHMAC 0x5
#endif