[PATCH 33.0 1/5] LEON: updated AMBA PnP API

Gedare Bloom gedare at rtems.org
Mon Apr 16 15:13:25 UTC 2012


On Mon, Apr 16, 2012 at 4:23 AM, Daniel Hellstrom <daniel at gaisler.com> wrote:
> Hello,
>
>
> On 04/15/2012 08:34 PM, Gedare Bloom wrote:
>>
>> This is a big one! Most of this is specific to the leon bsps so I just
>> glanced it over. I have just two comments.
>>
>> First you can eliminate the $Id$ tags.
>
> Ok.
>
>> Second is the indentation. We usually use 2 spaces per indent level
>> while this code uses 6 or so.
>
> Yes, it have hard TAB = 8 spaces. I believe I have asked before about
> indentation, and I've got the impression that it doesn't really matter as it
> is consistent within the file. At least it is easier to go from hw-tab to
> soft, and of course I agree that all files should aim to have the same
> coding-style. I will update the patches and come back.
>
Thanks. It is not a big deal within the BSPs (since they are rather
inconsistent) but it is nice when adding new files / replacing entire
files to try to be consistent with RTEMS general style "rules". And I
think much of the sparc code already conforms to the 2-space
indentations.

> Daniel
>
>> -Gedare
>>
>> On Tue, Apr 10, 2012 at 7:33 AM, Daniel Hellstrom<daniel at gaisler.com>
>>  wrote:
>>>
>>> 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 at gaisler.com>
>>> ---
>>>  c/src/lib/libbsp/sparc/Makefile.am                 |   10 +
>>>  c/src/lib/libbsp/sparc/leon2/Makefile.am           |   15 +-
>>>  c/src/lib/libbsp/sparc/leon2/preinstall.am         |   12 +-
>>>  c/src/lib/libbsp/sparc/leon3/Makefile.am           |   15 +-
>>>  c/src/lib/libbsp/sparc/leon3/amba/amba.c           |   47 +-
>>>  c/src/lib/libbsp/sparc/leon3/include/amba.h        |    2 +-
>>>  c/src/lib/libbsp/sparc/leon3/preinstall.am         |    4 +
>>>  c/src/lib/libbsp/sparc/shared/amba/ambapp.c        |  866
>>> ++++++++++----------
>>>  c/src/lib/libbsp/sparc/shared/amba/ambapp_alloc.c  |   28 +
>>>  c/src/lib/libbsp/sparc/shared/amba/ambapp_count.c  |   27 +
>>>  c/src/lib/libbsp/sparc/shared/amba/ambapp_depth.c  |   27 +
>>>  .../libbsp/sparc/shared/amba/ambapp_find_by_idx.c  |   42 +
>>>  c/src/lib/libbsp/sparc/shared/amba/ambapp_freq.c   |  114 +++
>>>  c/src/lib/libbsp/sparc/shared/amba/ambapp_names.c  |  395 +++++++++
>>>  c/src/lib/libbsp/sparc/shared/amba/ambapp_old.c    |   92 ++
>>>  c/src/lib/libbsp/sparc/shared/amba/ambapp_parent.c |   26 +
>>>  c/src/lib/libbsp/sparc/shared/amba/ambapp_show.c   |   76 ++
>>>  c/src/lib/libbsp/sparc/shared/include/ambapp.h     |  497 +++++++-----
>>>  c/src/lib/libbsp/sparc/shared/include/ambapp_ids.h |  245 ++++++
>>>  19 files changed, 1882 insertions(+), 658 deletions(-)
>>>  create mode 100644 c/src/lib/libbsp/sparc/shared/amba/ambapp_alloc.c
>>>  create mode 100644 c/src/lib/libbsp/sparc/shared/amba/ambapp_count.c
>>>  create mode 100644 c/src/lib/libbsp/sparc/shared/amba/ambapp_depth.c
>>>  create mode 100644
>>> c/src/lib/libbsp/sparc/shared/amba/ambapp_find_by_idx.c
>>>  create mode 100644 c/src/lib/libbsp/sparc/shared/amba/ambapp_freq.c
>>>  create mode 100644 c/src/lib/libbsp/sparc/shared/amba/ambapp_names.c
>>>  create mode 100644 c/src/lib/libbsp/sparc/shared/amba/ambapp_old.c
>>>  create mode 100644 c/src/lib/libbsp/sparc/shared/amba/ambapp_parent.c
>>>  create mode 100644 c/src/lib/libbsp/sparc/shared/amba/ambapp_show.c
>>>  create mode 100644 c/src/lib/libbsp/sparc/shared/include/ambapp_ids.h
>>>
>>> diff --git a/c/src/lib/libbsp/sparc/Makefile.am
>>> b/c/src/lib/libbsp/sparc/Makefile.am
>>> index 4f445ba..2b9909c 100644
>>> --- a/c/src/lib/libbsp/sparc/Makefile.am
>>> +++ b/c/src/lib/libbsp/sparc/Makefile.am
>>> @@ -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
>>> diff --git a/c/src/lib/libbsp/sparc/leon2/Makefile.am
>>> b/c/src/lib/libbsp/sparc/leon2/Makefile.am
>>> index 2acca78..c2310bc 100644
>>> --- a/c/src/lib/libbsp/sparc/leon2/Makefile.am
>>> +++ b/c/src/lib/libbsp/sparc/leon2/Makefile.am
>>> @@ -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
>>> diff --git a/c/src/lib/libbsp/sparc/leon2/preinstall.am
>>> b/c/src/lib/libbsp/sparc/leon2/preinstall.am
>>> index 00ed05e..2978d58 100644
>>> --- a/c/src/lib/libbsp/sparc/leon2/preinstall.am
>>> +++ b/c/src/lib/libbsp/sparc/leon2/preinstall.am
>>> @@ -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
>>> diff --git a/c/src/lib/libbsp/sparc/leon3/Makefile.am
>>> b/c/src/lib/libbsp/sparc/leon3/Makefile.am
>>> index ebbeb46..6bcc53f 100644
>>> --- a/c/src/lib/libbsp/sparc/leon3/Makefile.am
>>> +++ b/c/src/lib/libbsp/sparc/leon3/Makefile.am
>>> @@ -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
>>> diff --git a/c/src/lib/libbsp/sparc/leon3/amba/amba.c
>>> b/c/src/lib/libbsp/sparc/leon3/amba/amba.c
>>> index 16fb8de..e41d0aa 100644
>>> --- a/c/src/lib/libbsp/sparc/leon3/amba/amba.c
>>> +++ b/c/src/lib/libbsp/sparc/leon3/amba/amba.c
>>> @@ -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 */
>>> diff --git a/c/src/lib/libbsp/sparc/leon3/include/amba.h
>>> b/c/src/lib/libbsp/sparc/leon3/include/amba.h
>>> index 9167ff1..aa13f2c 100644
>>> --- a/c/src/lib/libbsp/sparc/leon3/include/amba.h
>>> +++ b/c/src/lib/libbsp/sparc/leon3/include/amba.h
>>> @@ -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
>>>  }
>>> diff --git a/c/src/lib/libbsp/sparc/leon3/preinstall.am
>>> b/c/src/lib/libbsp/sparc/leon3/preinstall.am
>>> index 8c27b81..540e37b 100644
>>> --- a/c/src/lib/libbsp/sparc/leon3/preinstall.am
>>> +++ b/c/src/lib/libbsp/sparc/leon3/preinstall.am
>>> @@ -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
>>> diff --git a/c/src/lib/libbsp/sparc/shared/amba/ambapp.c
>>> b/c/src/lib/libbsp/sparc/shared/amba/ambapp.c
>>> index 814ee8c..62c96a0 100644
>>> --- a/c/src/lib/libbsp/sparc/shared/amba/ambapp.c
>>> +++ b/c/src/lib/libbsp/sparc/shared/amba/ambapp.c
>>> @@ -1,499 +1,475 @@
>>>  /*
>>> - *  AMBA Plag&  Play Bus Driver
>>> + *  AMBA Plug&  Play routines
>>>  *
>>> - *  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
>>>  *  http://www.rtems.com/license/LICENSE.
>>>  *
>>> - *  $Id$
>>> + *  $Id: ambapp.c,v 1.2 2009/11/29 15:33:27 ralf Exp $
>>> + *
>>> + *
>>> + *  2008-12-01, Daniel Hellstrom<daniel at gaisler.com>
>>> + *    Created
>>>  */
>>>
>>> -#include<bsp.h>
>>> -#include<rtems/bspIo.h>
>>> +#include<string.h>
>>> +#include<stdlib.h>
>>> +#include<string.h>
>>> +
>>>  #include<ambapp.h>
>>> +#include<bsp.h>
>>> +
>>> +#define AMBA_CONF_AREA 0xff000
>>> +#define AMBA_AHB_SLAVE_CONF_AREA (1<<  11)
>>> +#define AMBA_APB_SLAVES 16
>>>
>>> -#define amba_insert_device(tab, address) \
>>> -{ \
>>> -  if (*(address)) \
>>> -  { \
>>> -    (tab)->addr[(tab)->devnr] = (address); \
>>> -    (tab)->devnr ++; \
>>> -  } \
>>> -} while(0)
>>> -
>>> -#define amba_insert_apb_device(tab, address, apbmst) \
>>> -{ \
>>> -  if (*(address)) \
>>> -  { \
>>> -    (tab)->addr[(tab)->devnr] = (address); \
>>> -               (tab)->apbmst[(tab)->devnr] = (apbmst); \
>>> -    (tab)->devnr ++; \
>>> -  } \
>>> -} while(0)
>>> -
>>> -static unsigned int
>>> -addr_from (struct amba_mmap *mmaps, unsigned int address)
>>> +/* Allocate one AMBA device */
>>> +struct ambapp_dev *ambapp_alloc_dev_struct(int dev_type)
>>>  {
>>> -  /* no translation? */
>>> -  if (!mmaps)
>>> -    return address;
>>> -
>>> -  while (mmaps->size) {
>>> -    if ((address>= mmaps->remote_amba_adr)
>>> -&&  (address<= (mmaps->remote_amba_adr + (mmaps->size - 1)))) {
>>> -      return (address - mmaps->remote_amba_adr) + mmaps->cpu_adr;
>>> -    }
>>> -    mmaps++;
>>> -  }
>>> -  return 1;
>>> +       int size = sizeof(struct ambapp_dev);
>>> +       struct ambapp_dev *dev;
>>> +
>>> +       if (dev_type == DEV_APB_SLV)
>>> +               size += sizeof(struct ambapp_apb_info);
>>> +       else
>>> +               size += sizeof(struct ambapp_ahb_info); /* AHB */
>>> +       dev = (struct ambapp_dev *)bsp_early_malloc(size);
>>> +       if (dev == NULL)
>>> +               return NULL;
>>> +       memset(dev, 0 , size);
>>> +       dev->dev_type = dev_type;
>>> +       return dev;
>>>  }
>>>
>>> -
>>> -void
>>> -amba_scan (amba_confarea_type * amba_conf, unsigned int ioarea,
>>> -           struct amba_mmap *mmaps)
>>> +unsigned int
>>> +ambapp_addr_from (struct ambapp_mmap *mmaps, unsigned int address)
>>>  {
>>> -  unsigned int *cfg_area;       /* address to configuration area */
>>> -  unsigned int mbar, conf, custom;
>>> -  int i, j;
>>> -  unsigned int apbmst;
>>> -  int maxloops = amba_conf->notroot ? 16 : 64; /* scan first bus for 64
>>> devices, rest for 16 devices */
>>> -
>>> -  amba_conf->ahbmst.devnr = 0;
>>> -  amba_conf->ahbslv.devnr = 0;
>>> -  amba_conf->apbslv.devnr = 0;
>>> -  cfg_area = (unsigned int *) (ioarea | AMBA_CONF_AREA);
>>> -  amba_conf->ioarea = ioarea;
>>> -  amba_conf->mmaps = mmaps;
>>> -
>>> -  for (i = 0; i<  maxloops; i++) {
>>> -    amba_insert_device (&amba_conf->ahbmst, cfg_area);
>>> -    cfg_area += AMBA_AHB_CONF_WORDS;
>>> -  }
>>> -
>>> -  cfg_area =
>>> -    (unsigned int *) (ioarea | AMBA_CONF_AREA |
>>> AMBA_AHB_SLAVE_CONF_AREA);
>>> -  for (i = 0; i<  maxloops; i++) {
>>> -    amba_insert_device (&amba_conf->ahbslv, cfg_area);
>>> -    cfg_area += AMBA_AHB_CONF_WORDS;
>>> -  }
>>> -
>>> -  for (i = 0; i<  amba_conf->ahbslv.devnr; i++){
>>> -    conf = amba_get_confword(amba_conf->ahbslv, i, 0);
>>> -    mbar = amba_ahb_get_membar(amba_conf->ahbslv, i, 0);
>>> -    if ( (amba_vendor(conf) == VENDOR_GAISLER)&&  (amba_device(conf) ==
>>> GAISLER_AHB2AHB) ){
>>> -      /* Found AHB->AHB bus bridge, scan it if more free
>>> amba_confarea_type:s available
>>> -       * Custom config 1 contain ioarea.
>>> -       */
>>> -      custom = amba_ahb_get_custom(amba_conf->ahbslv,i,1);
>>> -
>>> -      if ( amba_ver(conf)&&  amba_conf->next ){
>>> -        amba_conf->next->notroot = 1;
>>> -        amba_scan(amba_conf->next,custom,mmaps);
>>> -      }
>>> -    }else if ((amba_vendor(conf) == VENDOR_GAISLER)&&
>>>  (amba_device(conf) == GAISLER_APBMST))
>>> -    {
>>> -      apbmst = amba_membar_start(mbar);
>>> -                       if ( (apbmst=addr_from(mmaps,apbmst)) == 1 )
>>> -                               continue; /* no available memory
>>> translation available, will not be able to access
>>> -                                          * Plug&Play information for
>>> this AHB/APB bridge. Skip it.
>>> -                                          */
>>> -                       cfg_area = (unsigned int *)( apbmst |
>>> AMBA_CONF_AREA);
>>> -      for (j=0; (amba_conf->apbslv.devnr<AMBA_APB_SLAVES)&&
>>>  (j<AMBA_APB_SLAVES); j++){
>>> -        amba_insert_apb_device(&amba_conf->apbslv, cfg_area, apbmst);
>>> -        cfg_area += AMBA_APB_CONF_WORDS;
>>> -      }
>>> -    }
>>> -  }
>>> +       /* no translation? */
>>> +       if (!mmaps)
>>> +               return address;
>>> +
>>> +       while (mmaps->size) {
>>> +               if ((address>= mmaps->remote_adr)&&
>>> +                   (address<= (mmaps->remote_adr + (mmaps->size - 1))))
>>> {
>>> +                       return (address - mmaps->remote_adr) +
>>> mmaps->local_adr;
>>> +               }
>>> +               mmaps++;
>>> +       }
>>> +       return 1;
>>>  }
>>>
>>> -void
>>> -amba_print_dev(int devno, unsigned int conf){
>>> -       int irq = amba_irq(conf);
>>> -       if ( irq>  0 ){
>>> -               printk("%x.%x.%x: irq
>>> %d\n",devno,amba_vendor(conf),amba_device(conf),irq);
>>> -       }else{
>>> -               printk("%x.%x.%x: no
>>> irq\n",devno,amba_vendor(conf),amba_device(conf));
>>> +void ambapp_ahb_dev_init(
>>> +       unsigned int ioarea,
>>> +       struct ambapp_mmap *mmaps,
>>> +       struct ambapp_pnp_ahb *ahb,
>>> +       struct ambapp_dev *dev,
>>> +       int ahbidx
>>> +       )
>>> +{
>>> +       int bar;
>>> +       struct ambapp_ahb_info *ahb_info;
>>> +       unsigned int addr, mask, mbar;
>>> +
>>> +       /* Setup device struct */
>>> +       dev->vendor = ambapp_pnp_vendor(ahb->id);
>>> +       dev->device = ambapp_pnp_device(ahb->id);
>>> +       ahb_info = DEV_TO_AHB(dev);
>>> +       ahb_info->ver = ambapp_pnp_ver(ahb->id);
>>> +       ahb_info->irq = ambapp_pnp_irq(ahb->id);
>>> +       ahb_info->ahbidx = ahbidx;
>>> +       ahb_info->custom[0] = (unsigned int)ahb->custom[0];
>>> +       ahb_info->custom[1] = (unsigned int)ahb->custom[1];
>>> +       ahb_info->custom[2] = (unsigned int)ahb->custom[2];
>>> +
>>> +       /* Memory BARs */
>>> +       for (bar=0; bar<4; bar++) {
>>> +               mbar = ahb->mbar[bar];
>>> +               if (mbar == 0) {
>>> +                       addr = 0;
>>> +                       mask = 0;
>>> +               } else {
>>> +                       addr = ambapp_pnp_start(mbar);
>>> +                       if (ambapp_pnp_mbar_type(mbar) ==
>>> AMBA_TYPE_AHBIO) {
>>> +                               /* AHB I/O area is releative IO_AREA */
>>> +                               addr = AMBA_TYPE_AHBIO_ADDR(addr,
>>> ioarea);
>>> +                               mask = (((unsigned int)
>>> +
>>> (ambapp_pnp_mbar_mask((~mbar))<<8) |
>>> +                                       0xff)) + 1;
>>> +                       } else {
>>> +                               /* AHB memory area, absolute address */
>>> +                               addr = ambapp_addr_from(mmaps, addr);
>>> +                               mask = (~((unsigned int)
>>> +
>>> (ambapp_pnp_mbar_mask(mbar)<<20))) + 1;
>>> +                       }
>>> +               }
>>> +               ahb_info->start[bar] = addr;
>>> +               ahb_info->mask[bar] = mask;
>>> +               ahb_info->type[bar] = ambapp_pnp_mbar_type(mbar);
>>>        }
>>>  }
>>>
>>> -void
>>> -amba_apb_print_dev(int devno, unsigned int conf, unsigned int address){
>>> -       int irq = amba_irq(conf);
>>> -       if ( irq>  0 ){
>>> -               printk("%x.%x.%x: irq %d, apb:
>>> 0x%lx\n",devno,amba_vendor(conf),amba_device(conf),irq,address);
>>> -       }else{
>>> -               printk("%x.%x.%x: no irq, apb:
>>> 0x%lx\n",devno,amba_vendor(conf),amba_device(conf),address);
>>> -       }
>>> +void ambapp_apb_dev_init(
>>> +       unsigned int base,
>>> +       struct ambapp_mmap *mmaps,
>>> +       struct ambapp_pnp_apb *apb,
>>> +       struct ambapp_dev *dev,
>>> +       int ahbidx
>>> +       )
>>> +{
>>> +       struct ambapp_apb_info *apb_info;
>>> +
>>> +       /* Setup device struct */
>>> +       dev->vendor = ambapp_pnp_vendor(apb->id);
>>> +       dev->device = ambapp_pnp_device(apb->id);
>>> +       apb_info = DEV_TO_APB(dev);
>>> +       apb_info->ver = ambapp_pnp_ver(apb->id);
>>> +       apb_info->irq = ambapp_pnp_irq(apb->id);
>>> +       apb_info->ahbidx = ahbidx;
>>> +       apb_info->start = ambapp_pnp_apb_start(apb->iobar, base);
>>> +       apb_info->mask = ambapp_pnp_apb_mask(apb->iobar);
>>>  }
>>>
>>> -/* Print AMBA Plug&Play info on terminal */
>>> -void
>>> -amba_print_conf (amba_confarea_type * amba_conf)
>>> +int ambapp_add_ahbbus(
>>> +       struct ambapp_bus *abus,
>>> +       unsigned int ioarea
>>> +       )
>>>  {
>>> -       int i,base=0;
>>> -       unsigned int conf, iobar, address;
>>> -       unsigned int apbmst;
>>> -
>>> -       /* print all ahb masters */
>>> -       printk("--- AMBA AHB Masters ---\n");
>>> -       for(i=0; i<amba_conf->ahbmst.devnr; i++){
>>> -               conf = amba_get_confword(amba_conf->ahbmst, i, 0);
>>> -               amba_print_dev(i,conf);
>>> +       int i;
>>> +       for (i=0; i<AHB_BUS_MAX; i++) {
>>> +               if (abus->ahbs[i].ioarea == 0) {
>>> +                       abus->ahbs[i].ioarea = ioarea;
>>> +                       return i;
>>> +               } else if (abus->ahbs[i].ioarea == ioarea) {
>>> +                       /* Bus already added */
>>> +                       return -1;
>>> +               }
>>>        }
>>> +       return -1;
>>> +}
>>>
>>> -       /* print all ahb slaves */
>>> -       printk("--- AMBA AHB Slaves ---\n");
>>> -       for(i=0; i<amba_conf->ahbslv.devnr; i++){
>>> -               conf = amba_get_confword(amba_conf->ahbslv, i, 0);
>>> -               amba_print_dev(i,conf);
>>> +/* Internal AMBA Scanning Function */
>>> +static int ambapp_scan2(
>>> +       struct ambapp_bus *abus,
>>> +       unsigned int ioarea,
>>> +       ambapp_memcpy_t memfunc,
>>> +       struct ambapp_dev *parent,
>>> +       struct ambapp_dev **root
>>> +       )
>>> +{
>>> +       struct ambapp_pnp_ahb *ahb, ahb_buf;
>>> +       struct ambapp_pnp_apb *apb, apb_buf;
>>> +       struct ambapp_dev *dev, *prev, *prevapb, *apbdev;
>>> +       struct ambapp_ahb_info *ahb_info;
>>> +       int maxloops = 64;
>>> +       unsigned int apbbase, bridge_adr;
>>> +       int i, j, ahbidx;
>>> +
>>> +       *root = NULL;
>>> +
>>> +       if (parent) {
>>> +               /* scan first bus for 64 devices, rest for 16 devices */
>>> +               maxloops = 16;
>>>        }
>>>
>>> -       /* print all apb slaves */
>>> -       apbmst = 0;
>>> -       for(i=0; i<amba_conf->apbslv.devnr; i++){
>>> -               if ( apbmst != amba_conf->apbslv.apbmst[i] ){
>>> -                       apbmst = amba_conf->apbslv.apbmst[i];
>>> -                       printk("--- AMBA APB Slaves on 0x%x
>>> ---\n",apbmst);
>>> -                       base=i;
>>> -               }
>>> -               conf = amba_get_confword(amba_conf->apbslv, i, 0);
>>> -    iobar = amba_apb_get_membar(amba_conf->apbslv, i);
>>> -    address = amba_iobar_start(amba_conf->apbslv.apbmst[i], iobar);
>>> -               amba_apb_print_dev(i-base,conf,address);
>>> +       ahbidx = ambapp_add_ahbbus(abus, ioarea);
>>> +       if (ahbidx<  0) {
>>> +               /* Bus already scanned, stop */
>>> +               return 0;
>>>        }
>>>
>>> -}
>>> -/**** APB Slaves ****/
>>> +       prev = parent;
>>>
>>> -/* 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)
>>> -{
>>> -  unsigned int conf;
>>> -  int cnt, i;
>>> -
>>> -  for (cnt = i = 0; i<  amba_conf->apbslv.devnr; i++) {
>>> -    conf = amba_get_confword (amba_conf->apbslv, i, 0);
>>> -    if ((amba_vendor (conf) == vendor)&&  (amba_device (conf) ==
>>> device))
>>> -      cnt++;
>>> -  }
>>> -  return cnt;
>>> -}
>>> +       /* AHB MASTERS */
>>> +       ahb = (struct ambapp_pnp_ahb *) (ioarea | AMBA_CONF_AREA);
>>> +       for (i = 0; i<  maxloops; i++, ahb++) {
>>> +               memfunc(&ahb_buf, ahb, sizeof(struct ambapp_pnp_ahb),
>>> abus);
>>> +               if (ahb_buf.id == 0)
>>> +                       continue;
>>>
>>> -/* 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)
>>> -{
>>> -  unsigned int conf, iobar;
>>> -  int i;
>>> -
>>> -  for (i = 0; i<  amba_conf->apbslv.devnr; i++) {
>>> -    conf = amba_get_confword (amba_conf->apbslv, i, 0);
>>> -    if ((amba_vendor (conf) == vendor)&&  (amba_device (conf) ==
>>> device)) {
>>> -      iobar = amba_apb_get_membar (amba_conf->apbslv, i);
>>> -      dev->start = amba_iobar_start (amba_conf->apbslv.apbmst[i],
>>> iobar);
>>> -      dev->irq = amba_irq (conf);
>>> -      return 1;
>>> -    }
>>> -  }
>>> -  return 0;
>>> -}
>>> +               /* An AHB device present here */
>>> +               dev = ambapp_alloc_dev_struct(DEV_AHB_MST);
>>> +               if (!dev)
>>> +                       return -1;
>>>
>>> -/* 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)
>>> -{
>>> -  unsigned int conf, iobar;
>>> -  int cnt, i;
>>> -
>>> -  for (cnt = i = 0; i<  amba_conf->apbslv.devnr; i++) {
>>> -    conf = amba_get_confword (amba_conf->apbslv, i, 0);
>>> -    if ((amba_vendor (conf) == vendor)&&  (amba_device (conf) ==
>>> device)) {
>>> -      if (cnt == index) {
>>> -        /* found device */
>>> -        iobar = amba_apb_get_membar (amba_conf->apbslv, i);
>>> -        dev->start = amba_iobar_start (amba_conf->apbslv.apbmst[i],
>>> iobar);
>>> -        dev->irq = amba_irq (conf);
>>> -        return 1;
>>> -      }
>>> -      cnt++;
>>> -    }
>>> -  }
>>> -  return 0;
>>> -}
>>> +               ambapp_ahb_dev_init(ioarea, abus->mmaps,&ahb_buf, dev,
>>> ahbidx);
>>>
>>> -/* 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)
>>> -{
>>> -  unsigned int conf, iobar;
>>> -  int cnt, i;
>>> -
>>> -  for (cnt = i = 0; (i<  amba_conf->apbslv.devnr)&&  (cnt<  maxno); i++)
>>> {
>>> -    conf = amba_get_confword (amba_conf->apbslv, i, 0);
>>> -    if ((amba_vendor (conf) == vendor)&&  (amba_device (conf) ==
>>> device)) {
>>> -      /* found device */
>>> -      iobar = amba_apb_get_membar (amba_conf->apbslv, i);
>>> -      devs[cnt].start = amba_iobar_start (amba_conf->apbslv.apbmst[i],
>>> iobar);
>>> -      devs[cnt].irq = amba_irq (conf);
>>> -      cnt++;
>>> -    }
>>> -  }
>>> -  return cnt;
>>> -}
>>> +               if (*root == NULL)
>>> +                       *root = dev;
>>>
>>> -/***** AHB SLAVES *****/
>>> +               if (prev != parent)
>>> +                       prev->next = dev;
>>> +               dev->prev = prev;
>>> +               prev = dev;
>>> +       }
>>>
>>> -/* 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)
>>> -{
>>> -  unsigned int conf;
>>> -  int cnt, i;
>>> -
>>> -  for (cnt = i = 0; i<  amba_conf->ahbslv.devnr; i++) {
>>> -    conf = amba_get_confword (amba_conf->ahbslv, i, 0);
>>> -    if ((amba_vendor (conf) == vendor)&&  (amba_device (conf) ==
>>> device))
>>> -      cnt++;
>>> -  }
>>> -  return cnt;
>>> -}
>>> +       /* AHB SLAVES */
>>> +       ahb = (struct ambapp_pnp_ahb *)
>>> +               (ioarea | AMBA_CONF_AREA | AMBA_AHB_SLAVE_CONF_AREA);
>>> +       for (i = 0; i<  maxloops; i++, ahb++) {
>>> +               memfunc(&ahb_buf, ahb, sizeof(struct ambapp_pnp_ahb),
>>> abus);
>>> +               if (ahb_buf.id == 0)
>>> +                       continue;
>>> +
>>> +               /* An AHB device present here */
>>> +               dev = ambapp_alloc_dev_struct(DEV_AHB_SLV);
>>> +               if (!dev)
>>> +                       return -1;
>>> +
>>> +               ambapp_ahb_dev_init(ioarea, abus->mmaps,&ahb_buf, dev,
>>> ahbidx);
>>> +
>>> +               if (*root == NULL)
>>> +                       *root = dev;
>>> +
>>> +               if (prev != parent)
>>> +                       prev->next = dev;
>>> +               dev->prev = prev;
>>> +               prev = dev;
>>> +
>>> +               ahb_info = DEV_TO_AHB(dev);
>>> +
>>> +               /* Is it a AHB/AHB Bridge ? */
>>> +               if (((dev->device == GAISLER_AHB2AHB)&&
>>> +                   (dev->vendor == VENDOR_GAISLER)&&  (ahb_info->ver>0))
>>> ||
>>> +                   ((dev->device == GAISLER_L2CACHE)&&
>>> +                   (dev->vendor == VENDOR_GAISLER)) ||
>>> +                   ((dev->device == GAISLER_GRIOMMU)&&
>>> +                   (dev->vendor == VENDOR_GAISLER))) {
>>> +                       /* AHB/AHB Bridge Found, recurse down the
>>> +                        * Bridge
>>> +                        */
>>> +                       if (ahb_info->custom[1] != 0) {
>>> +                               bridge_adr =
>>> ambapp_addr_from(abus->mmaps,
>>> +
>>> ahb_info->custom[1]);
>>> +                               /* Scan next bus if not already scanned
>>> */
>>> +                               if (ambapp_scan2(abus, bridge_adr,
>>> memfunc, dev,
>>> +&dev->children))
>>> +                                       return -1;
>>> +                       }
>>> +               } else if ((dev->device == GAISLER_APBMST)&&
>>> +                          (dev->vendor == VENDOR_GAISLER)) {
>>> +                       /* AHB/APB Bridge Found, add the APB devices to
>>> this
>>> +                        * AHB Slave's children
>>> +                        */
>>> +                       prevapb = dev;
>>> +                       apbbase = ahb_info->start[0];
>>> +
>>> +                       /* APB SLAVES */
>>> +                       apb = (struct ambapp_pnp_apb *)
>>> +                               (apbbase | AMBA_CONF_AREA);
>>> +                       for (j=0; j<AMBA_APB_SLAVES; j++, apb++) {
>>> +                               memfunc(&apb_buf, apb, sizeof(*apb),
>>> abus);
>>> +                               if (apb_buf.id == 0)
>>> +                                       continue;
>>> +
>>> +                               apbdev =
>>> ambapp_alloc_dev_struct(DEV_APB_SLV);
>>> +                               if (!dev)
>>> +                                       return -1;
>>> +
>>> +                               ambapp_apb_dev_init(apbbase, abus->mmaps,
>>> +&apb_buf, apbdev, ahbidx);
>>> +
>>> +                               if (prevapb != dev)
>>> +                                       prevapb->next = apbdev;
>>> +                               else
>>> +                                       dev->children = apbdev;
>>> +                               apbdev->prev = prevapb;
>>> +                               prevapb = apbdev;
>>> +                       }
>>> +               }
>>> +       }
>>>
>>> -/* 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)
>>> -{
>>> -  unsigned int conf, mbar, addr;
>>> -  int j, i;
>>> -
>>> -  for (i = 0; i<  amba_conf->ahbslv.devnr; i++) {
>>> -    conf = amba_get_confword (amba_conf->ahbslv, i, 0);
>>> -    if ((amba_vendor (conf) == vendor)&&  (amba_device (conf) ==
>>> device)) {
>>> -      for (j = 0; j<  4; j++) {
>>> -        mbar = amba_ahb_get_membar (amba_conf->ahbslv, i, j);
>>> -        addr = amba_membar_start (mbar);
>>> -        if (amba_membar_type (mbar) == AMBA_TYPE_AHBIO) {
>>> -          addr = AMBA_TYPE_AHBIO_ADDR (addr, amba_conf->ioarea);
>>> -        } else {                /* convert address if needed */
>>> -          if ((addr = addr_from (amba_conf->mmaps, addr)) == 1) {
>>> -            addr = 0;           /* no available memory translation
>>> available, will not be able to access
>>> -                                 * Plug&Play information for this AHB
>>> address. Skip it.
>>> -                                 */
>>> -          }
>>> -        }
>>> -        dev->start[j] = addr;
>>> -      }
>>> -      dev->irq = amba_irq (conf);
>>> -      dev->ver = amba_ver (conf);
>>> -      return 1;
>>> -    }
>>> -  }
>>> -  return 0;
>>> -}
>>> +       /* Remember first AHB MST/SLV device on bus and Parent Bridge */
>>> +       abus->ahbs[ahbidx].dev = *root;
>>> +       abus->ahbs[ahbidx].bridge = parent;
>>>
>>> -/* 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)
>>> -{
>>> -  unsigned int conf, mbar, addr;
>>> -  int i, j, cnt;
>>> -
>>> -  for (cnt = i = 0; i<  amba_conf->ahbslv.devnr; i++) {
>>> -    conf = amba_get_confword (amba_conf->ahbslv, i, 0);
>>> -    if ((amba_vendor (conf) == vendor)&&  (amba_device (conf) ==
>>> device)) {
>>> -      if (cnt == index) {
>>> -        for (j = 0; j<  4; j++) {
>>> -          mbar = amba_ahb_get_membar (amba_conf->ahbslv, i, j);
>>> -          addr = amba_membar_start (mbar);
>>> -          if (amba_membar_type (mbar) == AMBA_TYPE_AHBIO) {
>>> -            addr = AMBA_TYPE_AHBIO_ADDR (addr, amba_conf->ioarea);
>>> -          } else {
>>> -            /* convert address if needed */
>>> -            if ((addr = addr_from (amba_conf->mmaps, addr)) == 1) {
>>> -              addr = 0;         /* no available memory translation
>>> available, will not be able to access
>>> -                                 * Plug&Play information for this AHB
>>> address. Skip it.
>>> -                                 */
>>> -            }
>>> -          }
>>> -          dev->start[j] = addr;
>>> -        }
>>> -        dev->irq = amba_irq (conf);
>>> -        dev->ver = amba_ver (conf);
>>> -        return 1;
>>> -      }
>>> -      cnt++;
>>> -    }
>>> -  }
>>> -  return 0;
>>> +       return 0;
>>>  }
>>>
>>> -/* 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)
>>> +/* Build AMBA Plug&  Play device graph */
>>> +int ambapp_scan(
>>> +       struct ambapp_bus *abus,
>>> +       unsigned int ioarea,
>>> +       ambapp_memcpy_t memfunc,
>>> +       struct ambapp_mmap *mmaps
>>> +       )
>>>  {
>>> -  unsigned int conf, mbar, addr;
>>> -  int i, j, cnt;
>>> -
>>> -  for (cnt = i = 0; (i<  amba_conf->ahbslv.devnr)&&  (maxno<  cnt); i++)
>>> {
>>> -    conf = amba_get_confword (amba_conf->ahbslv, i, 0);
>>> -    if ((amba_vendor (conf) == vendor)&&  (amba_device (conf) ==
>>> device)) {
>>> -      for (j = 0; j<  4; j++) {
>>> -        mbar = amba_ahb_get_membar (amba_conf->ahbslv, i, j);
>>> -        addr = amba_membar_start (mbar);
>>> -        if (amba_membar_type (mbar) == AMBA_TYPE_AHBIO) {
>>> -          addr = AMBA_TYPE_AHBIO_ADDR (addr, amba_conf->ioarea);
>>> -        } else {
>>> -          /* convert address if needed */
>>> -          if ((addr = addr_from (amba_conf->mmaps, addr)) == 1) {
>>> -            addr = 0;           /* no available memory translation
>>> available, will not be able to access
>>> -                                 * Plug&Play information for this AHB
>>> address. Skip it.
>>> -                                 */
>>> -          }
>>> -        }
>>> -        devs[cnt].start[j] = addr;
>>> -      }
>>> -      devs[cnt].irq = amba_irq (conf);
>>> -      devs[cnt].ver = amba_ver (conf);
>>> -      cnt++;
>>> -    }
>>> -  }
>>> -  return cnt;
>>> -}
>>> +       memset(abus, 0, sizeof(*abus));
>>> +       abus->mmaps = mmaps;
>>>
>>> +       /* Default to memcpy() */
>>> +       if (!memfunc)
>>> +               memfunc = (ambapp_memcpy_t)memcpy;
>>>
>>> -/***** AHB Masters *****/
>>> +       return ambapp_scan2(abus, ioarea, memfunc, NULL,&abus->root);
>>> +}
>>>
>>> -/* Return number of AHB Slave devices which has given vendor and device
>>> */
>>> -int
>>> -amba_get_number_ahbmst_devices (amba_confarea_type * amba_conf, int
>>> vendor,
>>> -                                int device)
>>> +/* Match search options againt device */
>>> +int ambapp_dev_match_options(struct ambapp_dev *dev, unsigned int
>>> options, int vendor, int device)
>>>  {
>>> -  unsigned int conf;
>>> -  int cnt, i;
>>> -
>>> -  for (cnt = i = 0; i<  amba_conf->ahbmst.devnr; i++) {
>>> -    conf = amba_get_confword (amba_conf->ahbmst, i, 0);
>>> -    if ((amba_vendor (conf) == vendor)&&  (amba_device (conf) ==
>>> device))
>>> -      cnt++;
>>> -  }
>>> -  return cnt;
>>> +       if ((((options&  (OPTIONS_ALL_DEVS)) == OPTIONS_ALL_DEVS) || /*
>>> TYPE */
>>> +           ((options&  OPTIONS_AHB_MSTS)&&  (dev->dev_type ==
>>> DEV_AHB_MST)) ||
>>> +           ((options&  OPTIONS_AHB_SLVS)&&  (dev->dev_type ==
>>> DEV_AHB_SLV)) ||
>>> +           ((options&  OPTIONS_APB_SLVS)&&  (dev->dev_type ==
>>> DEV_APB_SLV)))&&
>>> +           ((vendor == -1) || (vendor == dev->vendor))&&  /* VENDOR/DEV
>>> ID */
>>> +           ((device == -1) || (device == dev->device))&&
>>> +           (((options&  OPTIONS_ALL) == OPTIONS_ALL) || /* Allocated
>>> State */
>>> +           ((options&  OPTIONS_FREE)&&  DEV_IS_FREE(dev)) ||
>>> +           ((options&  OPTIONS_ALLOCATED)&&  DEV_IS_ALLOCATED(dev)))) {
>>> +               return 1;
>>> +       }
>>> +       return 0;
>>>  }
>>>
>>> -/* Get First AHB Slave device of this vendor&device id */
>>> -int
>>> -amba_find_ahbmst (amba_confarea_type * amba_conf, int vendor, int
>>> device,
>>> -                  amba_ahb_device * dev)
>>> +/* If device is an APB bridge all devices on the APB bridge is processed
>>> */
>>> +static int ambapp_for_each_apb(
>>> +       struct ambapp_dev *dev,
>>> +       unsigned int options,
>>> +       int vendor,
>>> +       int device,
>>> +       ambapp_func_t func,
>>> +       void *arg)
>>>  {
>>> -  unsigned int conf, mbar, addr;
>>> -  int j, i;
>>> -
>>> -  for (i = 0; i<  amba_conf->ahbmst.devnr; i++) {
>>> -    conf = amba_get_confword (amba_conf->ahbslv, i, 0);
>>> -    if ((amba_vendor (conf) == vendor)&&  (amba_device (conf) ==
>>> device)) {
>>> -      for (j = 0; j<  4; j++) {
>>> -        mbar = amba_ahb_get_membar (amba_conf->ahbmst, i, j);
>>> -        addr = amba_membar_start (mbar);
>>> -        if (amba_membar_type (mbar) == AMBA_TYPE_AHBIO) {
>>> -          addr = AMBA_TYPE_AHBIO_ADDR (addr, amba_conf->ioarea);
>>> -        } else {
>>> -          /* convert address if needed */
>>> -          if ((addr = addr_from (amba_conf->mmaps, addr)) == 1) {
>>> -            addr = 0;           /* no available memory translation
>>> available, will not be able to access
>>> -                                 * Plug&Play information for this AHB
>>> address. Skip it.
>>> -                                 */
>>> -          }
>>> -        }
>>> -        dev->start[j] = addr;
>>> -      }
>>> -      dev->irq = amba_irq (conf);
>>> -      dev->ver = amba_ver (conf);
>>> -      return 1;
>>> -    }
>>> -  }
>>> -  return 0;
>>> +       int index, ret;
>>> +       struct ambapp_dev *apbslv;
>>> +
>>> +       ret = 0;
>>> +       if (dev->children&&  (dev->children->dev_type == DEV_APB_SLV)) {
>>> +               /* Found a APB Bridge */
>>> +               index = 0;
>>> +               apbslv = dev->children;
>>> +               while (apbslv) {
>>> +                       if (ambapp_dev_match_options(apbslv, options,
>>> +                                                    vendor, device) ==
>>> 1) {
>>> +                               ret = func(apbslv, index, arg);
>>> +                               if (ret != 0)
>>> +                                       break; /* Signalled stopped */
>>> +                       }
>>> +                       index++;
>>> +                       apbslv = apbslv->next;
>>> +               }
>>> +       }
>>> +
>>> +       return ret;
>>>  }
>>>
>>> -/* Get AHB Slave device of this vendor&device id. (setting nr to 0 is
>>> eqivalent to calling amba_find_ahbslv() ) */
>>> -int
>>> -amba_find_next_ahbmst (amba_confarea_type * amba_conf, int vendor, int
>>> device,
>>> -                       amba_ahb_device * dev, int index)
>>> +/* Traverse the prescanned device information */
>>> +static int ambapp_for_each_dev(
>>> +       struct ambapp_dev *root,
>>> +       unsigned int options,
>>> +       int vendor,
>>> +       int device,
>>> +       ambapp_func_t func,
>>> +       void *arg)
>>>  {
>>> -  unsigned int conf, mbar, addr;
>>> -  int i, j, cnt;
>>> -
>>> -  for (cnt = i = 0; i<  amba_conf->ahbmst.devnr; i++) {
>>> -    conf = amba_get_confword (amba_conf->ahbmst, i, 0);
>>> -    if ((amba_vendor (conf) == vendor)&&  (amba_device (conf) ==
>>> device)) {
>>> -      if (cnt == index) {
>>> -        for (j = 0; j<  4; j++) {
>>> -          mbar = amba_ahb_get_membar (amba_conf->ahbmst, i, j);
>>> -          addr = amba_membar_start (mbar);
>>> -          if (amba_membar_type (mbar) == AMBA_TYPE_AHBIO) {
>>> -            addr = AMBA_TYPE_AHBIO_ADDR (addr, amba_conf->ioarea);
>>> -          } else {
>>> -            /* convert address if needed */
>>> -            if ((addr = addr_from (amba_conf->mmaps, addr)) == 1) {
>>> -              addr = 0;         /* no available memory translation
>>> available, will not be able to access
>>> -                                 * Plug&Play information for this AHB
>>> address. Skip it.
>>> -                                 */
>>> -            }
>>> -          }
>>> -          dev->start[j] = addr;
>>> -        }
>>> -        dev->irq = amba_irq (conf);
>>> -        dev->ver = amba_ver (conf);
>>> -        return 1;
>>> -      }
>>> -      cnt++;
>>> -    }
>>> -  }
>>> -  return 0;
>>> +       struct ambapp_dev *dev;
>>> +       int ahb_slave = 0;
>>> +       int index, ret;
>>> +
>>> +       /* Start at device 'root' and process downwards.
>>> +        *
>>> +        * Breadth first search, search order
>>> +        * 1. AHB MSTS
>>> +        * 2. AHB SLVS
>>> +        * 3. APB SLVS on primary bus
>>> +        * 4. AHB/AHB secondary... ->  step to 1.
>>> +        */
>>> +
>>> +       /* AHB MST / AHB SLV */
>>> +       if (options&
>>>  (OPTIONS_AHB_MSTS|OPTIONS_AHB_SLVS|OPTIONS_DEPTH_FIRST)) {
>>> +               index = 0;
>>> +               dev = root;
>>> +               while (dev) {
>>> +                       if ((dev->dev_type == DEV_AHB_SLV)&&  !ahb_slave)
>>> {
>>> +                               /* First AHB Slave */
>>> +                               ahb_slave = 1;
>>> +                               index = 0;
>>> +                       }
>>> +
>>> +                       /* Conditions must be fullfilled for function to
>>> be
>>> +                        * called
>>> +                        */
>>> +                       if (ambapp_dev_match_options(dev, options,
>>> vendor,
>>> +                                                     device) == 1) {
>>> +                               /* Correct device and vendor ID */
>>> +                               ret = func(dev, index, arg);
>>> +                               if (ret != 0)
>>> +                                       return ret; /* Signalled stopped
>>> */
>>> +                       }
>>> +
>>> +                       if ((options&  OPTIONS_DEPTH_FIRST)&&
>>> +                           (options&  OPTIONS_APB_SLVS)) {
>>> +                               /* Check is APB bridge, and process all
>>> APB
>>> +                                * Slaves in that case
>>> +                                */
>>> +                               ret = ambapp_for_each_apb(dev, options,
>>> vendor,
>>> +                                                         device, func,
>>> arg);
>>> +                               if (ret != 0)
>>> +                                       return ret; /* Signalled stopped
>>> */
>>> +                       }
>>> +
>>> +                       if (options&  OPTIONS_DEPTH_FIRST) {
>>> +                               if (dev->children&&
>>> +                                   (dev->children->dev_type !=
>>> DEV_APB_SLV)) {
>>> +                                       /* Found AHB Bridge, recurse */
>>> +                                       ret =
>>> ambapp_for_each_dev(dev->children,
>>> +                                                            options,
>>> vendor,
>>> +                                                            device,
>>> func, arg);
>>> +                                       if (ret != 0)
>>> +                                               return ret;
>>> +                               }
>>> +                       }
>>> +
>>> +                       index++;
>>> +                       dev = dev->next;
>>> +               }
>>> +       }
>>> +
>>> +       /* Find APB Bridges */
>>> +       if ((options&  OPTIONS_APB_SLVS)&&  !(options&
>>>  OPTIONS_DEPTH_FIRST)) {
>>> +               dev = root;
>>> +               while (dev) {
>>> +                       /* Check is APB bridge, and process all APB
>>> Slaves in
>>> +                        * that case
>>> +                        */
>>> +                       ret = ambapp_for_each_apb(dev, options, vendor,
>>> device,
>>> +                                                 func, arg);
>>> +                       if (ret != 0)
>>> +                               return ret; /* Signalled stopped */
>>> +                       dev = dev->next;
>>> +               }
>>> +       }
>>> +
>>> +       /* Find AHB Bridges */
>>> +       if (!(options&  OPTIONS_DEPTH_FIRST)) {
>>> +               dev = root;
>>> +               while (dev) {
>>> +                       if (dev->children&&
>>> +                           (dev->children->dev_type != DEV_APB_SLV)) {
>>> +                               /* Found AHB Bridge, recurse */
>>> +                               ret = ambapp_for_each_dev(dev->children,
>>> +                                                         options,
>>> vendor,
>>> +                                                         device, func,
>>> arg);
>>> +                               if (ret != 0)
>>> +                                       return ret;
>>> +                       }
>>> +                       dev = dev->next;
>>> +               }
>>> +       }
>>> +
>>> +       return 0;
>>>  }
>>>
>>> -/* Get first nr AHB Slave 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)
>>> +int ambapp_for_each(
>>> +       struct ambapp_bus *abus,
>>> +       unsigned int options,
>>> +       int vendor,
>>> +       int device,
>>> +       ambapp_func_t func,
>>> +       void *arg)
>>>  {
>>> -  unsigned int conf, mbar, addr;
>>> -  int i, j, cnt;
>>> -
>>> -  for (cnt = i = 0; (i<  amba_conf->ahbmst.devnr)&&  (maxno<  cnt); i++)
>>> {
>>> -    conf = amba_get_confword (amba_conf->ahbslv, i, 0);
>>> -    if ((amba_vendor (conf) == vendor)&&  (amba_device (conf) ==
>>> device)) {
>>> -      for (j = 0; j<  4; j++) {
>>> -        mbar = amba_ahb_get_membar (amba_conf->ahbmst, i, j);
>>> -        addr = amba_membar_start (mbar);
>>> -        if (amba_membar_type (mbar) == AMBA_TYPE_AHBIO) {
>>> -          addr = AMBA_TYPE_AHBIO_ADDR (addr, amba_conf->ioarea);
>>> -        } else {
>>> -          /* convert address if needed */
>>> -          if ((addr = addr_from (amba_conf->mmaps, addr)) == 1) {
>>> -            addr = 0;           /* no available memory translation
>>> available, will not be able to access
>>> -                                 * Plug&Play information for this AHB
>>> address. Skip it.
>>> -                                 */
>>> -          }
>>> -        }
>>> -        devs[cnt].start[j] = addr;
>>> -      }
>>> -      devs[cnt].irq = amba_irq (conf);
>>> -      devs[cnt].ver = amba_ver (conf);
>>> -      cnt++;
>>> -    }
>>> -  }
>>> -  return cnt;
>>> +       return ambapp_for_each_dev(abus->root, options, vendor, device,
>>> func,
>>> +                                  arg);
>>>  }
>>> diff --git a/c/src/lib/libbsp/sparc/shared/amba/ambapp_alloc.c
>>> b/c/src/lib/libbsp/sparc/shared/amba/ambapp_alloc.c
>>> new file mode 100644
>>> index 0000000..0188267
>>> --- /dev/null
>>> +++ b/c/src/lib/libbsp/sparc/shared/amba/ambapp_alloc.c
>>> @@ -0,0 +1,28 @@
>>> +/*
>>> + *  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.
>>> + *
>>> + *  $Id: ambapp_alloc.c,v
>>> + *
>>> + */
>>> +
>>> +#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;
>>> +}
>>> diff --git a/c/src/lib/libbsp/sparc/shared/amba/ambapp_count.c
>>> b/c/src/lib/libbsp/sparc/shared/amba/ambapp_count.c
>>> new file mode 100644
>>> index 0000000..5be4607
>>> --- /dev/null
>>> +++ b/c/src/lib/libbsp/sparc/shared/amba/ambapp_count.c
>>> @@ -0,0 +1,27 @@
>>> +/*
>>> + *  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.
>>> + *
>>> + *  $Id: ambapp_count.c,v
>>> + *
>>> + */
>>> +
>>> +#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;
>>> +}
>>> diff --git a/c/src/lib/libbsp/sparc/shared/amba/ambapp_depth.c
>>> b/c/src/lib/libbsp/sparc/shared/amba/ambapp_depth.c
>>> new file mode 100644
>>> index 0000000..cd1a7b4
>>> --- /dev/null
>>> +++ b/c/src/lib/libbsp/sparc/shared/amba/ambapp_depth.c
>>> @@ -0,0 +1,27 @@
>>> +/*
>>> + *  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.
>>> + *
>>> + *  $Id: ambapp_depth.c,v
>>> + *
>>> + */
>>> +
>>> +#include<ambapp.h>
>>> +
>>> +int ambapp_depth(struct ambapp_dev *dev)
>>> +{
>>> +       int depth = 0;
>>> +
>>> +       do {
>>> +               dev = ambapp_find_parent(dev);
>>> +               depth++;
>>> +       } while (dev);
>>> +
>>> +       return depth - 1;
>>> +}
>>> diff --git a/c/src/lib/libbsp/sparc/shared/amba/ambapp_find_by_idx.c
>>> b/c/src/lib/libbsp/sparc/shared/amba/ambapp_find_by_idx.c
>>> new file mode 100644
>>> index 0000000..9d078c0
>>> --- /dev/null
>>> +++ b/c/src/lib/libbsp/sparc/shared/amba/ambapp_find_by_idx.c
>>> @@ -0,0 +1,42 @@
>>> +/*
>>> + *  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.
>>> + *
>>> + *  $Id: ambapp_find_by_idx.c,v
>>> + *
>>> + */
>>> +
>>> +#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;
>>> +       }
>>> +}
>>> diff --git a/c/src/lib/libbsp/sparc/shared/amba/ambapp_freq.c
>>> b/c/src/lib/libbsp/sparc/shared/amba/ambapp_freq.c
>>> new file mode 100644
>>> index 0000000..d3f0e78
>>> --- /dev/null
>>> +++ b/c/src/lib/libbsp/sparc/shared/amba/ambapp_freq.c
>>> @@ -0,0 +1,114 @@
>>> +/*
>>> + *  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.
>>> + *
>>> + *  $Id: ambapp_freq.c,v
>>> + *
>>> + */
>>> +
>>> +#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;
>>> +}
>>> diff --git a/c/src/lib/libbsp/sparc/shared/amba/ambapp_names.c
>>> b/c/src/lib/libbsp/sparc/shared/amba/ambapp_names.c
>>> new file mode 100644
>>> index 0000000..1fe6553
>>> --- /dev/null
>>> +++ b/c/src/lib/libbsp/sparc/shared/amba/ambapp_names.c
>>> @@ -0,0 +1,395 @@
>>> +/*
>>> + *  AMBA Plug&  Play Device and Vendor name database
>>> + *
>>> + *  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.
>>> + *
>>> + *  2009-01-27, Daniel Hellstrom<daniel at gaisler.com>
>>> + *    Created from GRLIB 3386.
>>> + */
>>> +
>>> +#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);
>>> +}
>>> diff --git a/c/src/lib/libbsp/sparc/shared/amba/ambapp_old.c
>>> b/c/src/lib/libbsp/sparc/shared/amba/ambapp_old.c
>>> new file mode 100644
>>> index 0000000..c730173
>>> --- /dev/null
>>> +++ b/c/src/lib/libbsp/sparc/shared/amba/ambapp_old.c
>>> @@ -0,0 +1,92 @@
>>> +/* Old AMBA scanning Interface provided for backwards compability */
>>> +#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_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);
>>> +}
>>> diff --git a/c/src/lib/libbsp/sparc/shared/amba/ambapp_parent.c
>>> b/c/src/lib/libbsp/sparc/shared/amba/ambapp_parent.c
>>> new file mode 100644
>>> index 0000000..44d3b26
>>> --- /dev/null
>>> +++ b/c/src/lib/libbsp/sparc/shared/amba/ambapp_parent.c
>>> @@ -0,0 +1,26 @@
>>> +/*
>>> + *  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.
>>> + *
>>> + *  $Id: ambapp_parent.c,v
>>> + *
>>> + */
>>> +
>>> +#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;
>>> +}
>>> diff --git a/c/src/lib/libbsp/sparc/shared/amba/ambapp_show.c
>>> b/c/src/lib/libbsp/sparc/shared/amba/ambapp_show.c
>>> new file mode 100644
>>> index 0000000..eecca40
>>> --- /dev/null
>>> +++ b/c/src/lib/libbsp/sparc/shared/amba/ambapp_show.c
>>> @@ -0,0 +1,76 @@
>>> +/*  AMBA Plug&  Play device information printing.
>>> + *
>>> + *  COPYRIGHT (c) 2009.
>>> + *  Aeroflex Gaisler.
>>> + *
>>> + *  Prints a short description of APB and AHB devices.
>>> + *
>>> + *  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.
>>> + *
>>> + *  2008-12-01, Daniel Hellstrom<daniel at gaisler.com>
>>> + *    Created
>>> + */
>>> +
>>> +#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);
>>> +}
>>> diff --git a/c/src/lib/libbsp/sparc/shared/include/ambapp.h
>>> b/c/src/lib/libbsp/sparc/shared/include/ambapp.h
>>> index 7ca2d13..5eb3f2a 100644
>>> --- a/c/src/lib/libbsp/sparc/shared/include/ambapp.h
>>> +++ b/c/src/lib/libbsp/sparc/shared/include/ambapp.h
>>> @@ -1,10 +1,8 @@
>>>  /*
>>> - *  AMBA Plag&  Play Bus Driver Macros for LEON2
>>> + *  AMBA Plug&  Play routines
>>>  *
>>> - *  Macros used for AMBA Plug&  Play bus scanning
>>> - *
>>> - *  COPYRIGHT (c) 2007.
>>> - *  Gaisler Research
>>> + *  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
>>> @@ -16,224 +14,345 @@
>>>  #ifndef __AMBAPP_H__
>>>  #define __AMBAPP_H__
>>>
>>> +/* Include VENDOR and DEVICE definitions */
>>> +#include<ambapp_ids.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
>>> +/* Max supported AHB buses */
>>> +#define AHB_BUS_MAX 6
>>> +
>>> +struct ambapp_dev;
>>> +struct ambapp_core;
>>> +struct ambapp_apb_info;
>>> +struct ambapp_ahb_info;
>>> +
>>> +struct ambapp_dev {
>>> +       struct ambapp_dev *next;        /* Next */
>>> +       struct ambapp_dev *prev;        /* Previous Device. If (this ==
>>> +                                        * rev->child) prev is bus bridge
>>> */
>>> +       struct ambapp_dev *children;    /* Points to first device on
>>> sub-bus */
>>> +       void *owner;                    /* Owner of this AMBA device */
>>> +       unsigned char dev_type;         /* AHB MST, AHB SLV or APB SLV*/
>>> +       unsigned char vendor;           /* Vendor ID */
>>> +       unsigned short device;          /* Device ID */
>>> +       int devinfo[0];                 /* Device info (APB/AHB dep. on
>>> type) */
>>> +};
>>>
>>> -/*
>>> - *
>>> - * Macros for manipulating Configuration registers
>>> - *
>>> - */
>>> -#define amba_get_confword(tab, index, word)
>>> (*((tab).addr[(index)]+(word)))
>>> +#define AMBAPP_FLAG_FFACT_DIR  0x100   /* Frequency factor direction,
>>> 0=down, 1=up */
>>> +#define AMBAPP_FLAG_FFACT      0x0f0   /* Frequency factor against top
>>> bus */
>>> +#define AMBAPP_FLAG_MBUS       0x00c
>>> +#define AMBAPP_FLAG_SBUS       0x003
>>> +
>>> +/* Get APB or AHB information from a AMBA device */
>>> +#define DEV_TO_APB(adev) ((struct ambapp_apb_info *)((adev)->devinfo))
>>> +#define DEV_TO_AHB(adev) ((struct ambapp_ahb_info *)((adev)->devinfo))
>>> +#define DEV_TO_COMMON(adev) ((struct ambapp_common_info
>>> *)((adev)->devinfo))
>>> +/* Convert address of ambapp_apb_info/ambapp_ahb_info into ambapp_dev */
>>> +#define APB_TO_DEV(apb_info) ((struct ambapp_dev *)(unsigned
>>> int(apb_info) - \
>>> +                               offsetof(struct ambapp_dev, devinfo)))
>>> +#define AHB_TO_DEV(ahb_info) ((struct ambapp_dev *)(unsigned
>>> int(ahb_info) - \
>>> +                               offsetof(struct ambapp_dev, devinfo)))
>>> +
>>> +struct ambapp_common_info {
>>> +       unsigned char irq;
>>> +       unsigned char ver;
>>> +       unsigned char ahbidx;   /* AHB Bus Index */
>>> +};
>>>
>>> -#define amba_vendor(x) (((x)>>  24)&  0xff)
>>> +struct ambapp_apb_info {
>>> +       /* COMMON */
>>> +       unsigned char irq;
>>> +       unsigned char ver;
>>> +       unsigned char ahbidx;   /* AHB Bus Index */
>>>
>>> -#define amba_device(x) (((x)>>  12)&  0xfff)
>>> +       /* APB SPECIFIC */
>>> +       unsigned int start;
>>> +       unsigned int mask;
>>> +};
>>> +
>>> +struct ambapp_ahb_info {
>>> +       /* COMMON */
>>> +       unsigned char irq;
>>> +       unsigned char ver;
>>> +       unsigned char ahbidx;   /* AHB Bus Index */
>>> +
>>> +       /* AHB SPECIFIC */
>>> +       unsigned int start[4];
>>> +       unsigned int mask[4];
>>> +       char type[4];           /* type[N] Determine type of
>>> start[N]-mask[N],
>>> +                                * 2=AHB Memory Space, 3=AHB I/O Space */
>>> +       unsigned int custom[3];
>>> +};
>>> +
>>> +/* Describes a complete AMBA Core. Each device may consist of 3
>>> interfaces */
>>> +struct ambapp_core {
>>> +       char                    irq;            /* irq=-1 indicate no IRQ
>>> */
>>> +       unsigned char           vendor;
>>> +       unsigned short          device;
>>> +       int                     index;          /* Core index */
>>> +       struct ambapp_ahb_info  *ahb_mst;
>>> +       struct ambapp_ahb_info  *ahb_slv;
>>> +       struct ambapp_apb_info  *apb_slv;
>>> +};
>>> +
>>> +struct ambapp_ahb_bus {
>>> +       unsigned int ioarea;    /* AHB Bus IOAREA */
>>> +       unsigned int freq_hz;   /* Frequency of AHB Bus */
>>> +       struct ambapp_dev *bridge;/* Bridge Device on Parent AHB Bus */
>>> +       struct ambapp_dev *dev; /* First Device on AHB Bus */
>>> +};
>>>
>>> -#define amba_ahb_get_membar(tab, index, nr)
>>> (*((tab).addr[(index)]+4+(nr)))
>>> +struct ambapp_mmap {
>>> +       unsigned int            size;
>>> +       unsigned int            local_adr;
>>> +       unsigned int            remote_adr;
>>> +};
>>>
>>> -#define amba_ahb_get_custom(tab, index, nr)
>>> (*((tab).addr[(index)]+1+(nr)))
>>> +/* Complete AMBA PnP information */
>>> +struct ambapp_bus {
>>> +       struct ambapp_dev       *root;                  /* AHB/APB Device
>>> Tree*/
>>> +       struct ambapp_mmap      *mmaps;                 /* Memory MAP
>>> Array */
>>> +       struct ambapp_ahb_bus   ahbs[AHB_BUS_MAX];      /* AHB Buses */
>>> +};
>>>
>>> -#define amba_apb_get_membar(tab, index) (*((tab).addr[(index)]+1))
>>> +/*
>>> + * Return values
>>> + *  0 - continue
>>> + *  1 - stop scanning
>>> + */
>>> +typedef int (*ambapp_func_t)(struct ambapp_dev *dev, int index, void
>>> *arg);
>>> +
>>> +#define DEV_IS_FREE(dev) (dev->owner == NULL)
>>> +#define DEV_IS_ALLOCATED(dev) (dev->owner != NULL)
>>> +
>>> +/* Options to ambapp_for_each */
>>> +#define OPTIONS_AHB_MSTS       0x00000001
>>> +#define OPTIONS_AHB_SLVS       0x00000002
>>> +#define OPTIONS_APB_SLVS       0x00000004
>>> +#define OPTIONS_ALL_DEVS
>>> (OPTIONS_AHB_MSTS|OPTIONS_AHB_SLVS|OPTIONS_APB_SLVS)
>>> +
>>> +#define OPTIONS_FREE           0x00000010
>>> +#define OPTIONS_ALLOCATED      0x00000020
>>> +#define OPTIONS_ALL            (OPTIONS_FREE|OPTIONS_ALLOCATED)
>>> +
>>> +/* Depth first search, Defualt is breath first search. */
>>> +#define OPTIONS_DEPTH_FIRST    0x00000100
>>> +
>>> +#define DEV_AHB_NONE 0
>>> +#define DEV_AHB_MST  1
>>> +#define DEV_AHB_SLV  2
>>> +#define DEV_APB_SLV 3
>>> +
>>> +/* Structures used to access Plug&Play information directly */
>>> +struct ambapp_pnp_ahb {
>>> +       const unsigned int      id;             /* VENDOR, DEVICE, VER,
>>> IRQ, */
>>> +       const unsigned int      custom[3];
>>> +       const unsigned int      mbar[4];        /* MASK, ADDRESS, TYPE,
>>> CACHABLE/PREFETCHABLE */
>>> +};
>>>
>>> -#define amba_membar_start(mbar) (((mbar)&  0xfff00000)&  (((mbar)&
>>>  0xfff0)<<  16))
>>> +struct ambapp_pnp_apb {
>>> +       const unsigned int      id;             /* VENDOR, DEVICE, VER,
>>> IRQ, */
>>> +       const unsigned int      iobar;          /* MASK, ADDRESS, TYPE,
>>> CACHABLE/PREFETCHABLE */
>>> +};
>>>
>>> -#define amba_iobar_start(base, iobar) ((base) | ((((iobar)&
>>>  0xfff00000)>>12)&  (((iobar)&  0xfff0)<<4)) )
>>> +#define ambapp_pnp_vendor(id) (((id)>>  24)&  0xff)
>>> +#define ambapp_pnp_device(id) (((id)>>  12)&  0xfff)
>>> +#define ambapp_pnp_ver(id) (((id)>>5)&  0x1f)
>>> +#define ambapp_pnp_irq(id) ((id)&  0x1f)
>>>
>>> -#define amba_irq(conf) ((conf)&  0x1f)
>>> +#define ambapp_pnp_start(mbar)  (((mbar)&  0xfff00000)&  (((mbar)&
>>>  0xfff0)<<  16))
>>> +#define ambapp_pnp_mbar_mask(mbar) (((mbar)>>4)&  0xfff)
>>> +#define ambapp_pnp_mbar_type(mbar) ((mbar)&  0xf)
>>>
>>> -#define amba_ver(conf) (((conf)>>5)&  0x1f)
>>> +#define ambapp_pnp_apb_start(iobar, base) ((base) | ((((iobar)&
>>>  0xfff00000)>>12)&  (((iobar)&  0xfff0)<<4)) )
>>> +#define ambapp_pnp_apb_mask(iobar) ((~(ambapp_pnp_mbar_mask(iobar)<<8)&
>>>  0x000fffff) + 1)
>>>
>>> -#define amba_membar_type(mbar) ((mbar)&  0xf)
>>> +#define AMBA_TYPE_AHBIO_ADDR(addr,base_ioarea) ((unsigned
>>> int)(base_ioarea) | ((addr)>>  12))
>>>
>>>  #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
>>> +/* Copy Data from AMBA PnP I/O Area */
>>> +typedef void *(*ambapp_memcpy_t)(
>>> +       void *dest,             /* Destination RAM copy */
>>> +       const void *src,        /* Source AMBA PnP Address to copy from
>>> */
>>> +       int n,                  /* Number of bytes to be copied */
>>> +       struct ambapp_bus *abus /* Optional AMBA Bus pointer */
>>> +       );
>>> +
>>> +/* Scan a AMBA Plug&  Play bus and create all device structures
>>> describing the
>>> + * the devices. The devices will form a tree, where every node describes
>>> one
>>> + * interface. The resulting tree is placed in the location pointed to by
>>> root.
>>> + *
>>> + * Since it the tree is located in RAM it is easier to work with AMBA
>>> buses
>>> + * that is located over PCI and SpaceWire etc.
>>> + *
>>> + * \param ioarea   The IO-AREA where Plug&  Play information can be
>>> found.
>>> + * \param parent   Used internally when recursing down a bridge. Set to
>>> NULL.
>>> + * \param mmaps    Is used to perform address translation if needed.
>>> + * \param root     Resulting device node tree root is stored here.
>>>  *
>>>  */
>>> -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.
>>> +extern int ambapp_scan(
>>> +       struct ambapp_bus *abus,
>>> +       unsigned int ioarea,
>>> +       ambapp_memcpy_t memfunc,
>>> +       struct ambapp_mmap *mmaps
>>> +       );
>>> +
>>> +/* Initialize the frequency [Hz] of all AHB Buses from knowing the
>>> frequency
>>> + * of one particular APB/AHB Device.
>>> + */
>>> +extern void ambapp_freq_init(
>>> +       struct ambapp_bus *abus,
>>> +       struct ambapp_dev *dev,
>>> +       unsigned int freq);
>>> +
>>> +/* Returns the frequency [Hz] of a AHB/APB device */
>>> +extern unsigned int ambapp_freq_get(
>>> +       struct ambapp_bus *abus,
>>> +       struct ambapp_dev *dev);
>>> +
>>> +/* Iterates through all AMBA devices previously found, it calls func
>>> + * once for every device that match the search arguments.
>>>  *
>>> - * Will scan for - AHB Masters
>>> - *               - AHB Slaves
>>> - *               - APB Slaves (if a AHB/APB bridge is found)
>>> + * SEARCH OPTIONS
>>> + * All search options must be fulfilled, type of devices searched
>>> (options)
>>> + * and AMBA Plug&Play ID [VENDOR,DEVICE], before func() is called. The
>>> options
>>> + * can be use to search only for AMBA APB or AHB Slaves or AHB Masters
>>> for
>>> + * example. Note that when VENDOR=-1 or DEVICE=-1 it will match any
>>> vendor or
>>> + * device ID, this means setting both VENDOR and DEVICE to -1 will
>>> result in
>>> + * calling all devices matches the options argument.
>>>  *
>>> - * \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.
>>> + * \param abus     AMBAPP Bus to search
>>> + * \param options  Search options, see OPTIONS_* above
>>> + * \param vendor   AMBAPP VENDOR ID to search for
>>> + * \param device   AMBAPP DEVICE ID to search for
>>> + * \param func     Function called for every device matching search
>>> options
>>> + * \param arg      Optional argument passed on to func
>>> + *
>>> + * func return value affects the search, returning a non-zero value will
>>> + * stop the search and ambapp_for_each will return immediately returning
>>> the
>>> + * same non-zero value.
>>> + *
>>> + * Return Values
>>> + *  0 - all devices was scanned
>>> + *  non-zero - stopped by user function returning the non-zero value
>>>  */
>>> -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);
>>> +extern int ambapp_for_each(
>>> +       struct ambapp_bus *abus,
>>> +       unsigned int options,
>>> +       int vendor,
>>> +       int device,
>>> +       ambapp_func_t func,
>>> +       void *arg);
>>> +
>>> +/* Helper function for ambapp_for_each(), find a device by index. If
>>> pcount
>>> + * is NULL the first device is returned, else pcount is interpreted as
>>> index
>>> + * by decrementing the value until zero is reaced: *count=0 first
>>> device,
>>> + * *count=1 second device etc.
>>> + *
>>> + * 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
>>> + */
>>> +extern int ambapp_find_by_idx(struct ambapp_dev *dev, int index, void
>>> *pcount);
>>>
>>> -/* 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 number of devices matching the options/vendor/device arguments,
>>> the
>>> + * arguments are passed onto ambapp_for_each().
>>> + */
>>> +extern int ambapp_dev_count(struct ambapp_bus *abus, unsigned int
>>> options,
>>> +                               int vendor, int device);
>>>
>>> -/* 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);
>>> +/* Print short information about devices on the AMBA bus onto the
>>> console */
>>> +extern void ambapp_print(struct ambapp_bus *abus, int show_depth);
>>>
>>> +/* Mark a device taken (allocate), Owner field is set with owner Data.
>>> Returns
>>> + * -1 if device has already been allocated.
>>> + */
>>> +extern int ambapp_alloc_dev(struct ambapp_dev *dev, void *owner);
>>>
>>> +/* Owner field is cleared, which indicates that device is not allocated
>>> */
>>> +extern void ambapp_free_dev(struct ambapp_dev *dev);
>>>
>>> -/***** AHB MASTERS *****/
>>> +/* Find AHB/APB Bridge or AHB/AHB Bridge Parent */
>>> +extern struct ambapp_dev *ambapp_find_parent(struct ambapp_dev *dev);
>>>
>>> -/* 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);
>>> +/* Returns bus depth (number of sub AHB buses) of device from root bus
>>> */
>>> +extern int ambapp_depth(struct ambapp_dev *dev);
>>>
>>> -/* 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 Device Name from AMBA PnP name database */
>>> +extern char *ambapp_device_id2str(int vendor, int id);
>>>
>>> -/* 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 Vendor Name from AMBA PnP name database */
>>> +extern char *ambapp_vendor_id2str(int vendor);
>>>
>>> -/* 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);
>>> +/* Set together VENDOR_DEVICE Name from AMBA PnP name database. Return
>>> length
>>> + * of C-string stored in buf not including string termination '\0'.
>>> + */
>>> +extern int ambapp_vendev_id2str(int vendor, int id, char *buf);
>>> +
>>> +/* Help functions for backwards compability */
>>> +
>>> +extern int ambapp_find_apbslv(
>>> +       struct ambapp_bus *abus,
>>> +       int vendor,
>>> +       int device,
>>> +       struct ambapp_apb_info *dev);
>>> +
>>> +extern int ambapp_find_apbslv_next(
>>> +       struct ambapp_bus *abus,
>>> +       int vendor,
>>> +       int device,
>>> +       struct ambapp_apb_info *dev,
>>> +       int index);
>>> +
>>> +extern int ambapp_find_apbslvs_next(
>>> +       struct ambapp_bus *abus,
>>> +       int vendor,
>>> +       int device,
>>> +       struct ambapp_apb_info *dev,
>>> +       int index,
>>> +       int maxno);
>>> +
>>> +extern int ambapp_find_apbslvs(
>>> +       struct ambapp_bus *abus,
>>> +       int vendor,
>>> +       int device,
>>> +       struct ambapp_apb_info *dev,
>>> +       int maxno);
>>> +
>>> +extern int ambapp_find_ahbslv(
>>> +       struct ambapp_bus *abus,
>>> +       int vendor,
>>> +       int device,
>>> +       struct ambapp_ahb_info *dev);
>>> +
>>> +extern int ambapp_find_ahbslv_next(
>>> +       struct ambapp_bus *abus,
>>> +       int vendor,
>>> +       int device,
>>> +       struct ambapp_ahb_info *dev,
>>> +       int index);
>>> +
>>> +extern int ambapp_find_ahbslvs_next(
>>> +       struct ambapp_bus *abus,
>>> +       int vendor,
>>> +       int device,
>>> +       struct ambapp_ahb_info *dev,
>>> +       int index,
>>> +       int maxno);
>>> +
>>> +extern int ambapp_find_ahbslvs(
>>> +       struct ambapp_bus *abus,
>>> +       int vendor,
>>> +       int device,
>>> +       struct ambapp_ahb_info *dev,
>>> +       int maxno);
>>>
>>>
>>>  /******** AMBA DEVICES *******/
>>> diff --git a/c/src/lib/libbsp/sparc/shared/include/ambapp_ids.h
>>> b/c/src/lib/libbsp/sparc/shared/include/ambapp_ids.h
>>> new file mode 100644
>>> index 0000000..e6f3601
>>> --- /dev/null
>>> +++ b/c/src/lib/libbsp/sparc/shared/include/ambapp_ids.h
>>> @@ -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
>>> --
>>> 1.7.0.4
>>>
>>> _______________________________________________
>>> rtems-devel mailing list
>>> rtems-devel at rtems.org
>>> http://www.rtems.org/mailman/listinfo/rtems-devel
>>
>>
>




More information about the devel mailing list