source: rtems/bsps/include/grlib/ambapp.h @ 828276b

5
Last change on this file since 828276b was 828276b, checked in by Sebastian Huber <sebastian.huber@…>, on 03/05/19 at 06:58:18

bsps: Adjust shared Doxygen groups

Update #3706.

  • Property mode set to 100644
File size: 11.2 KB
Line 
1/**
2 * @file
3 * @ingroup amba
4 */
5
6/*
7 *  COPYRIGHT (c) 2009.
8 *  Aeroflex Gaisler.
9 *
10 *  The license and distribution terms for this file may be
11 *  found in the file LICENSE in this distribution or at
12 *  http://www.rtems.org/license/LICENSE.
13 */
14
15#ifndef __AMBAPP_H__
16#define __AMBAPP_H__
17
18/**
19 * @defgroup amba AMBA
20 *
21 * @ingroup RTEMSBSPsSharedGRLIB
22 *
23 * @brief AMBA Plug & Play routines
24 *
25 * @{
26 */
27
28/* Include VENDOR and DEVICE definitions */
29#include "ambapp_ids.h"
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
35/* Max supported AHB buses */
36#define AHB_BUS_MAX 6
37
38struct ambapp_dev;
39struct ambapp_core;
40struct ambapp_apb_info;
41struct ambapp_ahb_info;
42
43struct ambapp_dev {
44        struct ambapp_dev *next;        /* Next */
45        struct ambapp_dev *prev;        /* Previous Device. If (this ==
46                                         * rev->child) prev is bus bridge */
47        struct ambapp_dev *children;    /* Points to first device on sub-bus */
48        void *owner;                    /* Owner of this AMBA device */
49        unsigned char dev_type;         /* AHB MST, AHB SLV or APB SLV*/
50        unsigned char vendor;           /* Vendor ID */
51        unsigned short device;          /* Device ID */
52        int devinfo[0];                 /* Device info (APB/AHB dep. on type) */
53};
54
55#define AMBAPP_FLAG_FFACT_DIR   0x100   /* Frequency factor direction, 0=down, 1=up */
56#define AMBAPP_FLAG_FFACT       0x0f0   /* Frequency factor against top bus */
57#define AMBAPP_FLAG_MBUS        0x00c
58#define AMBAPP_FLAG_SBUS        0x003
59
60/* Get APB or AHB information from a AMBA device */
61#define DEV_TO_APB(adev) ((struct ambapp_apb_info *)((adev)->devinfo))
62#define DEV_TO_AHB(adev) ((struct ambapp_ahb_info *)((adev)->devinfo))
63#define DEV_TO_COMMON(adev) ((struct ambapp_common_info *)((adev)->devinfo))
64/* Convert address of ambapp_apb_info/ambapp_ahb_info into ambapp_dev */
65#define APB_TO_DEV(apb_info) ((struct ambapp_dev *)(unsigned int(apb_info) - \
66                                offsetof(struct ambapp_dev, devinfo)))
67#define AHB_TO_DEV(ahb_info) ((struct ambapp_dev *)(unsigned int(ahb_info) - \
68                                offsetof(struct ambapp_dev, devinfo)))
69
70struct ambapp_common_info {
71        unsigned char irq;
72        unsigned char ver;
73        unsigned char ahbidx;   /* AHB Bus Index */
74};
75
76struct ambapp_apb_info {
77        /* COMMON */
78        unsigned char irq;
79        unsigned char ver;
80        unsigned char ahbidx;   /* AHB Bus Index */
81
82        /* APB SPECIFIC */
83        unsigned int start;
84        unsigned int mask;
85};
86
87struct ambapp_ahb_info {
88        /* COMMON */
89        unsigned char irq;
90        unsigned char ver;
91        unsigned char ahbidx;   /* AHB Bus Index */
92
93        /* AHB SPECIFIC */
94        unsigned int start[4];
95        unsigned int mask[4];
96        char type[4];           /* type[N] Determine type of start[N]-mask[N],
97                                 * 2=AHB Memory Space, 3=AHB I/O Space */
98        unsigned int custom[3];
99};
100
101/* Describes a complete AMBA Core. Each device may consist of 3 interfaces */
102struct ambapp_core {
103        char                    irq;            /* irq=-1 indicate no IRQ */
104        unsigned char           vendor;
105        unsigned short          device;
106        int                     index;          /* Core index */
107        struct ambapp_ahb_info  *ahb_mst;
108        struct ambapp_ahb_info  *ahb_slv;
109        struct ambapp_apb_info  *apb_slv;
110};
111
112struct ambapp_ahb_bus {
113        unsigned int ioarea;    /* AHB Bus IOAREA */
114        unsigned int freq_hz;   /* Frequency of AHB Bus */
115        struct ambapp_dev *bridge;/* Bridge Device on Parent AHB Bus */
116        struct ambapp_dev *dev; /* First Device on AHB Bus */
117};
118
119struct ambapp_mmap {
120        unsigned int            size;
121        unsigned int            local_adr;
122        unsigned int            remote_adr;
123};
124
125/* Complete AMBA PnP information */
126struct ambapp_bus {
127        struct ambapp_dev       *root;                  /* AHB/APB Device Tree*/
128        struct ambapp_mmap      *mmaps;                 /* Memory MAP Array */
129        struct ambapp_ahb_bus   ahbs[AHB_BUS_MAX];      /* AHB Buses */
130};
131
132/*
133 * Return values
134 *  0 - continue
135 *  1 - stop scanning
136 */
137typedef int (*ambapp_func_t)(struct ambapp_dev *dev, int index, void *arg);
138
139#define DEV_IS_FREE(dev) (dev->owner == NULL)
140#define DEV_IS_ALLOCATED(dev) (dev->owner != NULL)
141
142/* Options to ambapp_for_each */
143#define OPTIONS_AHB_MSTS        0x00000001
144#define OPTIONS_AHB_SLVS        0x00000002
145#define OPTIONS_APB_SLVS        0x00000004
146#define OPTIONS_ALL_DEVS        (OPTIONS_AHB_MSTS|OPTIONS_AHB_SLVS|OPTIONS_APB_SLVS)
147
148#define OPTIONS_FREE            0x00000010
149#define OPTIONS_ALLOCATED       0x00000020
150#define OPTIONS_ALL             (OPTIONS_FREE|OPTIONS_ALLOCATED)
151
152/* Depth first search, Defualt is breath first search. */
153#define OPTIONS_DEPTH_FIRST     0x00000100
154
155#define DEV_AHB_NONE 0
156#define DEV_AHB_MST  1
157#define DEV_AHB_SLV  2
158#define DEV_APB_SLV 3
159
160/* Structures used to access Plug&Play information directly */
161struct ambapp_pnp_ahb {
162        const unsigned int      id;             /* VENDOR, DEVICE, VER, IRQ, */
163        const unsigned int      custom[3];
164        const unsigned int      mbar[4];        /* MASK, ADDRESS, TYPE, CACHABLE/PREFETCHABLE */
165};
166
167struct ambapp_pnp_apb {
168        const unsigned int      id;             /* VENDOR, DEVICE, VER, IRQ, */
169        const unsigned int      iobar;          /* MASK, ADDRESS, TYPE, CACHABLE/PREFETCHABLE */
170};
171
172#define ambapp_pnp_vendor(id) (((id) >> 24) & 0xff)
173#define ambapp_pnp_device(id) (((id) >> 12) & 0xfff)
174#define ambapp_pnp_ver(id) (((id)>>5) & 0x1f)
175#define ambapp_pnp_irq(id) ((id) & 0x1f)
176
177#define ambapp_pnp_start(mbar)  (((mbar) & 0xfff00000) & (((mbar) & 0xfff0) << 16))
178#define ambapp_pnp_mbar_mask(mbar) (((mbar)>>4) & 0xfff)
179#define ambapp_pnp_mbar_type(mbar) ((mbar) & 0xf)
180
181#define ambapp_pnp_apb_start(iobar, base) ((base) | ((((iobar) & 0xfff00000)>>12) & (((iobar) & 0xfff0)<<4)) )
182#define ambapp_pnp_apb_mask(iobar) ((~(ambapp_pnp_mbar_mask(iobar)<<8) & 0x000fffff) + 1)
183
184#define AMBA_TYPE_AHBIO_ADDR(addr,base_ioarea) ((unsigned int)(base_ioarea) | ((addr) >> 12))
185
186#define AMBA_TYPE_APBIO 0x1
187#define AMBA_TYPE_MEM   0x2
188#define AMBA_TYPE_AHBIO 0x3
189
190/* Copy Data from AMBA PnP I/O Area */
191typedef void *(*ambapp_memcpy_t)(
192        void *dest,             /* Destination RAM copy */
193        const void *src,        /* Source AMBA PnP Address to copy from */
194        int n,                  /* Number of bytes to be copied */
195        struct ambapp_bus *abus /* Optional AMBA Bus pointer */
196        );
197
198/* Scan a AMBA Plug & Play bus and create all device structures describing the
199 * the devices. The devices will form a tree, where every node describes one
200 * interface. The resulting tree is placed in the location pointed to by root.
201 *
202 * Since it the tree is located in RAM it is easier to work with AMBA buses
203 * that is located over PCI and SpaceWire etc.
204 *
205 * \param ioarea   The IO-AREA where Plug & Play information can be found.
206 * \param parent   Used internally when recursing down a bridge. Set to NULL.
207 * \param mmaps    Is used to perform address translation if needed.
208 * \param root     Resulting device node tree root is stored here.
209 *
210 */
211extern int ambapp_scan(
212        struct ambapp_bus *abus,
213        unsigned int ioarea,
214        ambapp_memcpy_t memfunc,
215        struct ambapp_mmap *mmaps
216        );
217
218/* Initialize the frequency [Hz] of all AHB Buses from knowing the frequency
219 * of one particular APB/AHB Device.
220 */
221extern void ambapp_freq_init(
222        struct ambapp_bus *abus,
223        struct ambapp_dev *dev,
224        unsigned int freq);
225
226/* Returns the frequency [Hz] of a AHB/APB device */
227extern unsigned int ambapp_freq_get(
228        struct ambapp_bus *abus,
229        struct ambapp_dev *dev);
230
231/* Iterates through all AMBA devices previously found, it calls func
232 * once for every device that match the search arguments.
233 *
234 * SEARCH OPTIONS
235 * All search options must be fulfilled, type of devices searched (options)
236 * and AMBA Plug&Play ID [VENDOR,DEVICE], before func() is called. The options
237 * can be use to search only for AMBA APB or AHB Slaves or AHB Masters for
238 * example. Note that when VENDOR=-1 or DEVICE=-1 it will match any vendor or
239 * device ID, this means setting both VENDOR and DEVICE to -1 will result in
240 * calling all devices matches the options argument.
241 *
242 * \param abus     AMBAPP Bus to search
243 * \param options  Search options, see OPTIONS_* above
244 * \param vendor   AMBAPP VENDOR ID to search for
245 * \param device   AMBAPP DEVICE ID to search for
246 * \param func     Function called for every device matching search options
247 * \param arg      Optional argument passed on to func
248 *
249 * func return value affects the search, returning a non-zero value will
250 * stop the search and ambapp_for_each will return immediately returning the
251 * same non-zero value.
252 *
253 * Return Values
254 *  0 - all devices was scanned
255 *  non-zero - stopped by user function returning the non-zero value
256 */
257extern int ambapp_for_each(
258        struct ambapp_bus *abus,
259        unsigned int options,
260        int vendor,
261        int device,
262        ambapp_func_t func,
263        void *arg);
264
265/* Helper function for ambapp_for_each(), find a device by index. If pcount
266 * is NULL the first device is returned, else pcount is interpreted as index
267 * by decrementing the value until zero is reaced: *count=0 first device,
268 * *count=1 second device etc.
269 *
270 * The matching device is returned, which will stop the ambapp_for_each search.
271 * If zero is returned from ambapp_for_each no device matching the index was
272 * found
273 */
274extern int ambapp_find_by_idx(struct ambapp_dev *dev, int index, void *pcount);
275
276/* Get number of devices matching the options/vendor/device arguments, the
277 * arguments are passed onto ambapp_for_each().
278 */
279extern int ambapp_dev_count(struct ambapp_bus *abus, unsigned int options,
280                                int vendor, int device);
281
282/* Print short information about devices on the AMBA bus onto the console */
283extern void ambapp_print(struct ambapp_bus *abus, int show_depth);
284
285/* Mark a device taken (allocate), Owner field is set with owner Data. Returns
286 * -1 if device has already been allocated.
287 */
288extern int ambapp_alloc_dev(struct ambapp_dev *dev, void *owner);
289
290/* Owner field is cleared, which indicates that device is not allocated */
291extern void ambapp_free_dev(struct ambapp_dev *dev);
292
293/* Find AHB/APB Bridge or AHB/AHB Bridge Parent */
294extern struct ambapp_dev *ambapp_find_parent(struct ambapp_dev *dev);
295
296/* Returns bus depth (number of sub AHB buses) of device from root bus */
297extern int ambapp_depth(struct ambapp_dev *dev);
298
299/* Get Device Name from AMBA PnP name database */
300extern char *ambapp_device_id2str(int vendor, int id);
301
302/* Get Vendor Name from AMBA PnP name database */
303extern char *ambapp_vendor_id2str(int vendor);
304
305/* Set together VENDOR_DEVICE Name from AMBA PnP name database. Return length
306 * of C-string stored in buf not including string termination '\0'.
307 */
308extern int ambapp_vendev_id2str(int vendor, int id, char *buf);
309
310/* Help functions for backwards compability */
311
312extern int ambapp_find_apbslv(
313        struct ambapp_bus *abus,
314        int vendor,
315        int device,
316        struct ambapp_apb_info *dev);
317
318extern int ambapp_find_apbslv_next(
319        struct ambapp_bus *abus,
320        int vendor,
321        int device,
322        struct ambapp_apb_info *dev,
323        int index);
324
325extern int ambapp_find_apbslvs_next(
326        struct ambapp_bus *abus,
327        int vendor,
328        int device,
329        struct ambapp_apb_info *dev,
330        int index,
331        int maxno);
332
333extern int ambapp_find_apbslvs(
334        struct ambapp_bus *abus,
335        int vendor,
336        int device,
337        struct ambapp_apb_info *dev,
338        int maxno);
339
340extern int ambapp_find_ahbslv(
341        struct ambapp_bus *abus,
342        int vendor,
343        int device,
344        struct ambapp_ahb_info *dev);
345
346extern int ambapp_find_ahbslv_next(
347        struct ambapp_bus *abus,
348        int vendor,
349        int device,
350        struct ambapp_ahb_info *dev,
351        int index);
352
353extern int ambapp_find_ahbslvs_next(
354        struct ambapp_bus *abus,
355        int vendor,
356        int device,
357        struct ambapp_ahb_info *dev,
358        int index,
359        int maxno);
360
361extern int ambapp_find_ahbslvs(
362        struct ambapp_bus *abus,
363        int vendor,
364        int device,
365        struct ambapp_ahb_info *dev,
366        int maxno);
367
368
369extern int ambapp_get_number_ahbslv_devices(
370        struct ambapp_bus *abus,
371        int vendor,
372        int device);
373
374extern int ambapp_get_number_apbslv_devices(
375        struct ambapp_bus *abus,
376        int vendor,
377        int device);
378
379#ifdef __cplusplus
380}
381#endif
382
383/** @} */
384
385#endif
Note: See TracBrowser for help on using the repository browser.