summaryrefslogtreecommitdiffstats
path: root/libgloss/sparc_leon/asm-leon/lambapp.h
diff options
context:
space:
mode:
Diffstat (limited to 'libgloss/sparc_leon/asm-leon/lambapp.h')
-rw-r--r--libgloss/sparc_leon/asm-leon/lambapp.h177
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