diff options
Diffstat (limited to 'libgloss/sparc_leon/asm-leon/lambapp.h')
-rw-r--r-- | libgloss/sparc_leon/asm-leon/lambapp.h | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/libgloss/sparc_leon/asm-leon/lambapp.h b/libgloss/sparc_leon/asm-leon/lambapp.h new file mode 100644 index 000000000..ed406f1ea --- /dev/null +++ b/libgloss/sparc_leon/asm-leon/lambapp.h @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2011 Aeroflex Gaisler + * + * BSD license: + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef _LAMBAPP_H +#define _LAMBAPP_H + + +/* Include VENDOR and DEVICE definitions */ +#include "lambapp_devs.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + struct ambapp_dev_hdr; + struct ambapp_apb_info; + struct ambapp_ahb_info; + + struct ambapp_dev_hdr + { + struct ambapp_dev_hdr *next; /* Next */ + struct ambapp_dev_hdr *prev; /* Previous Device. If (this == prev->child) prev is bus bridge */ + struct ambapp_dev_hdr *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 */ + void *devinfo; /* Device info (APB or AHB depending on type) */ + }; + +#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 + + struct ambapp_apb_info + { + /* COMMON */ + unsigned char irq; + unsigned char ver; + + /* APB SPECIFIC */ + unsigned int start; + unsigned int mask; + }; + + struct ambapp_ahb_info + { + /* COMMON */ + unsigned char irq; + unsigned char ver; + + /* 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_dev_info + { + char irq; /* irq=-1 indicate no IRQ */ + unsigned char vendor; + unsigned short device; + int index; /* Core index if multiple "subcores" in one */ + struct ambapp_ahb_info *ahb_mst; + struct ambapp_ahb_info *ahb_slv; + struct ambapp_apb_info *apb_slv; + }; + + struct ambapp_mmap + { + unsigned int size; + unsigned int local_adr; + unsigned int remote_adr; + }; + +/* Complete AMBA PnP information */ + struct ambapp_bus + { + struct ambapp_mmap *mmaps; + struct ambapp_dev_hdr *root; + }; + +/* + * Return values + * 0 - continue + * 1 - stop scanning + */ + typedef int (*ambapp_func_t) (struct ambapp_dev_hdr * dev, int index, + int maxdepth, 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 breth 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 */ + }; + + struct ambapp_pnp_apb + { + const unsigned int id; /* VENDOR, DEVICE, VER, IRQ, */ + const unsigned int iobar; /* MASK, ADDRESS, TYPE, CACHABLE/PREFETCHABLE */ + }; + +#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 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 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_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 + + extern int find_apbslv (int vendor, int device, + struct ambapp_apb_info *dev); + +#ifdef __cplusplus +} +#endif + +#endif |