/* * 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