178 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * 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
 |