]>
Commit | Line | Data |
---|---|---|
1e9a164e DH |
1 | /* Interface for accessing Gaisler AMBA Plug&Play Bus. |
2 | * The AHB bus can be interfaced with a simpler bus - | |
3 | * the APB bus, also freely available in GRLIB at | |
4 | * www.gaisler.com. | |
5 | * | |
898cc81d DH |
6 | * (C) Copyright 2009, 2015 |
7 | * Daniel Hellstrom, Cobham Gaisler, [email protected]. | |
1e9a164e | 8 | * |
1a459660 | 9 | * SPDX-License-Identifier: GPL-2.0+ |
1e9a164e DH |
10 | */ |
11 | ||
12 | #ifndef __AMBAPP_H__ | |
13 | #define __AMBAPP_H__ | |
14 | ||
898cc81d | 15 | #include <ambapp_ids.h> |
1e9a164e | 16 | |
898cc81d DH |
17 | #ifndef __ASSEMBLER__ |
18 | /* Structures used to access Plug&Play information directly */ | |
19 | struct ambapp_pnp_ahb { | |
20 | const unsigned int id; /* VENDOR, DEVICE, VER, IRQ, */ | |
21 | const unsigned int custom[3]; | |
22 | const unsigned int mbar[4]; /* MASK, ADDRESS, TYPE, | |
23 | * CACHABLE/PREFETCHABLE */ | |
24 | }; | |
25 | ||
26 | struct ambapp_pnp_apb { | |
27 | const unsigned int id; /* VENDOR, DEVICE, VER, IRQ, */ | |
28 | const unsigned int iobar; /* MASK, ADDRESS, TYPE, | |
29 | * CACHABLE/PREFETCHABLE */ | |
30 | }; | |
1e9a164e | 31 | |
898cc81d DH |
32 | /* AMBA Plug&Play AHB Masters & Slaves information locations |
33 | * Max devices is 64 supported by HW, however often only 16 | |
34 | * are used. | |
35 | */ | |
36 | struct ambapp_pnp_info { | |
37 | struct ambapp_pnp_ahb masters[64]; | |
38 | struct ambapp_pnp_ahb slaves[63]; | |
39 | const unsigned int unused[4]; | |
40 | const unsigned int systemid[4]; | |
41 | }; | |
42 | ||
43 | /* Describes a AMBA PnP bus */ | |
44 | struct ambapp_bus { | |
45 | int buses; /* Number of buses */ | |
46 | unsigned int ioareas[6]; /* PnP I/O AREAs of AHB buses */ | |
47 | unsigned int freq; /* Frequency of bus0 [Hz] */ | |
48 | }; | |
49 | ||
50 | /* Processor Local AMBA bus */ | |
51 | extern struct ambapp_bus ambapp_plb; | |
52 | ||
53 | /* Get Bus frequency of a certain AMBA bus */ | |
54 | extern unsigned int ambapp_bus_freq( | |
55 | struct ambapp_bus *abus, | |
56 | int ahb_bus_index | |
57 | ); | |
58 | ||
59 | /* AMBA PnP information of a APB Device */ | |
60 | typedef struct { | |
61 | unsigned int vendor; | |
62 | unsigned int device; | |
63 | unsigned char irq; | |
64 | unsigned char ver; | |
65 | unsigned int address; | |
66 | unsigned int mask; | |
67 | int ahb_bus_index; | |
68 | } ambapp_apbdev; | |
1e9a164e | 69 | |
898cc81d DH |
70 | /* AMBA PnP information of a AHB Device */ |
71 | typedef struct { | |
72 | unsigned int vendor; | |
73 | unsigned int device; | |
74 | unsigned char irq; | |
75 | unsigned char ver; | |
76 | unsigned int userdef[3]; | |
77 | unsigned int address[4]; | |
78 | unsigned int mask[4]; | |
79 | int type[4]; | |
80 | int ahb_bus_index; | |
81 | } ambapp_ahbdev; | |
1e9a164e | 82 | |
898cc81d DH |
83 | /* Scan AMBA Bus for AHB Bridges */ |
84 | extern void ambapp_bus_init( | |
85 | unsigned int ioarea, | |
86 | unsigned int freq, | |
87 | struct ambapp_bus *abus); | |
1e9a164e | 88 | |
898cc81d DH |
89 | /* Find APB Slave device by index using breath first search. |
90 | * | |
91 | * When vendor and device are both set to zero, any device | |
92 | * with a non-zero device ID will match the search. It may be | |
93 | * useful when processing all devices on a AMBA bus. | |
94 | */ | |
95 | extern int ambapp_apb_find( | |
96 | struct ambapp_bus *abus, | |
97 | int vendor, | |
98 | int device, | |
99 | int index, | |
100 | ambapp_apbdev *dev | |
101 | ); | |
102 | ||
103 | /* Find AHB Master device by index using breath first search. | |
104 | * | |
105 | * When vendor and device are both set to zero, any device | |
106 | * with a non-zero device ID will match the search. It may be | |
107 | * useful when processing all devices on a AMBA bus. | |
108 | */ | |
109 | extern int ambapp_ahbmst_find( | |
110 | struct ambapp_bus *abus, | |
111 | int vendor, | |
112 | int device, | |
113 | int index, | |
114 | ambapp_ahbdev *dev | |
115 | ); | |
116 | ||
117 | /* Find AHB Slave device by index using breath first search. | |
118 | * | |
119 | * When vendor and device are both set to zero, any device | |
120 | * with a non-zero device ID will match the search. It may be | |
121 | * useful when processing all devices on a AMBA bus. | |
122 | */ | |
123 | extern int ambapp_ahbslv_find( | |
124 | struct ambapp_bus *abus, | |
125 | int vendor, | |
126 | int device, | |
127 | int index, | |
128 | ambapp_ahbdev *dev | |
129 | ); | |
130 | ||
131 | /* Return number of APB Slave devices of a certain ID (VENDOR:DEVICE) | |
132 | * zero is returned if no devices was found. | |
133 | */ | |
134 | extern int ambapp_apb_count(struct ambapp_bus *abus, int vendor, int device); | |
1e9a164e | 135 | |
898cc81d DH |
136 | /* Return number of AHB Master devices of a certain ID (VENDOR:DEVICE) |
137 | * zero is returned if no devices was found. | |
138 | */ | |
139 | extern int ambapp_ahbmst_count(struct ambapp_bus *abus, int vendor, int device); | |
1e9a164e | 140 | |
898cc81d DH |
141 | /* Return number of AHB Slave devices of a certain ID (VENDOR:DEVICE) |
142 | * zero is returned if no devices was found. | |
143 | */ | |
144 | extern int ambapp_ahbslv_count(struct ambapp_bus *abus, int vendor, int device); | |
1e9a164e | 145 | |
2a2fa797 DH |
146 | #ifdef CONFIG_CMD_AMBAPP |
147 | ||
148 | /* AMBA Plug&Play relocation & initialization */ | |
149 | int ambapp_init_reloc(void); | |
150 | ||
151 | /* AMBA Plug&Play Name of Vendors and devices */ | |
152 | ||
153 | /* Return name of device */ | |
154 | char *ambapp_device_id2str(int vendor, int id); | |
155 | ||
156 | /* Return name of vendor */ | |
157 | char *ambapp_vendor_id2str(int vendor); | |
2a2fa797 | 158 | |
898cc81d DH |
159 | /* Return description of a device */ |
160 | char *ambapp_device_id2desc(int vendor, int id); | |
1e9a164e | 161 | |
898cc81d | 162 | #endif |
1e9a164e | 163 | |
898cc81d | 164 | #endif /* defined(__ASSEMBLER__) */ |
1e9a164e | 165 | |
898cc81d DH |
166 | #define AMBA_DEFAULT_IOAREA 0xfff00000 |
167 | #define AMBA_CONF_AREA 0xff000 | |
168 | #define AMBA_AHB_SLAVE_CONF_AREA 0x800 | |
1e9a164e | 169 | |
898cc81d DH |
170 | #define DEV_NONE 0 |
171 | #define DEV_AHB_MST 1 | |
172 | #define DEV_AHB_SLV 2 | |
173 | #define DEV_APB_SLV 3 | |
1e9a164e | 174 | |
898cc81d DH |
175 | #define AMBA_TYPE_APBIO 0x1 |
176 | #define AMBA_TYPE_MEM 0x2 | |
177 | #define AMBA_TYPE_AHBIO 0x3 | |
1e9a164e | 178 | |
898cc81d DH |
179 | /* ID layout for APB and AHB devices */ |
180 | #define AMBA_PNP_ID(vendor, device) (((vendor)<<24) | ((device)<<12)) | |
181 | ||
182 | /* APB Slave PnP layout definitions */ | |
183 | #define AMBA_APB_ID_OFS (0*4) | |
184 | #define AMBA_APB_IOBAR_OFS (1*4) | |
185 | #define AMBA_APB_CONF_LENGH (2*4) | |
186 | ||
187 | /* AHB Master/Slave layout PnP definitions */ | |
188 | #define AMBA_AHB_ID_OFS (0*4) | |
189 | #define AMBA_AHB_CUSTOM0_OFS (1*4) | |
190 | #define AMBA_AHB_CUSTOM1_OFS (2*4) | |
191 | #define AMBA_AHB_CUSTOM2_OFS (3*4) | |
192 | #define AMBA_AHB_MBAR0_OFS (4*4) | |
193 | #define AMBA_AHB_MBAR1_OFS (5*4) | |
194 | #define AMBA_AHB_MBAR2_OFS (6*4) | |
195 | #define AMBA_AHB_MBAR3_OFS (7*4) | |
196 | #define AMBA_AHB_CONF_LENGH (8*4) | |
197 | ||
198 | /* Macros for extracting information from AMBA PnP information | |
199 | * registers. | |
1e9a164e DH |
200 | */ |
201 | ||
898cc81d | 202 | #define amba_vendor(x) (((x) >> 24) & 0xff) |
1e9a164e | 203 | |
898cc81d | 204 | #define amba_device(x) (((x) >> 12) & 0xfff) |
1e9a164e | 205 | |
898cc81d | 206 | #define amba_irq(conf) ((conf) & 0x1f) |
1e9a164e | 207 | |
898cc81d | 208 | #define amba_ver(conf) (((conf)>>5) & 0x1f) |
1e9a164e | 209 | |
898cc81d DH |
210 | #define amba_iobar_start(base, iobar) \ |
211 | ((base) | ((((iobar) & 0xfff00000)>>12) & (((iobar) & 0xfff0)<<4))) | |
1e9a164e | 212 | |
898cc81d DH |
213 | #define amba_membar_start(mbar) \ |
214 | (((mbar) & 0xfff00000) & (((mbar) & 0xfff0) << 16)) | |
1e9a164e | 215 | |
898cc81d | 216 | #define amba_membar_type(mbar) ((mbar) & 0xf) |
1e9a164e | 217 | |
898cc81d | 218 | #define amba_membar_mask(mbar) (((mbar) >> 4) & 0xfff) |
1e9a164e | 219 | |
898cc81d DH |
220 | #define amba_ahbio_adr(addr, base_ioarea) \ |
221 | ((unsigned int)(base_ioarea) | ((addr) >> 12)) | |
1e9a164e | 222 | |
898cc81d | 223 | #define amba_apb_mask(iobar) ((~(amba_membar_mask(iobar)<<8) & 0x000fffff) + 1) |
1e9a164e | 224 | |
1e9a164e | 225 | #endif |