xref: /netbsd-src/sys/external/bsd/gnu-efi/dist/inc/efipciio.h (revision d1b935f8e85510a16a1b49122bd2ccf5ad7e104c)
1 /*	$NetBSD: efipciio.h,v 1.1.1.2 2018/08/16 18:17:47 jmcneill Exp $	*/
2 
3 #ifndef _EFI_PCI_IO_H
4 #define _EFI_PCI_IO_H
5 
6 #define EFI_PCI_IO_PROTOCOL_GUID \
7     { 0x4cf5b200, 0x68b8, 0x4ca5, {0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x02, 0x9a} }
8 
9 #define EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID \
10     { 0x2f707ebb, 0x4a1a, 0x11d4, {0x9a, 0x38, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
11 
12 INTERFACE_DECL(_EFI_PCI_IO_PROTOCOL);
13 INTERFACE_DECL(_EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL);
14 
15 typedef enum {
16     EfiPciIoWidthUint8,
17     EfiPciIoWidthUint16,
18     EfiPciIoWidthUint32,
19     EfiPciIoWidthUint64,
20     EfiPciIoWidthFifoUint8,
21     EfiPciIoWidthFifoUint16,
22     EfiPciIoWidthFifoUint32,
23     EfiPciIoWidthFifoUint64,
24     EfiPciIoWidthFillUint8,
25     EfiPciIoWidthFillUint16,
26     EfiPciIoWidthFillUint32,
27     EfiPciIoWidthFillUint64,
28     EfiPciIoWidthMaximum
29 } EFI_PCI_IO_PROTOCOL_WIDTH, EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH;
30 
31 #define EFI_PCI_IO_PASS_THROUGH_BAR 0xff
32 
33 typedef
34 EFI_STATUS
35 (EFIAPI *EFI_PCI_IO_PROTOCOL_POLL_IO_MEM) (
36   IN struct _EFI_PCI_IO_PROTOCOL  *This,
37   IN EFI_PCI_IO_PROTOCOL_WIDTH    Width,
38   IN UINT8                        BarIndex,
39   IN UINT64                       Offset,
40   IN UINT64                       Mask,
41   IN UINT64                       Value,
42   IN UINT64                       Delay,
43   OUT UINT64                      *Result
44 );
45 
46 typedef
47 EFI_STATUS
48 (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_POLL_IO_MEM) (
49   IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,
50   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH    Width,
51   IN UINT64                                   Address,
52   IN UINT64                                   Mask,
53   IN UINT64                                   Value,
54   IN UINT64                                   Delay,
55   OUT UINT64                                  *Result
56 );
57 
58 typedef
59 EFI_STATUS
60 (EFIAPI *EFI_PCI_IO_PROTOCOL_IO_MEM) (
61   IN struct _EFI_PCI_IO_PROTOCOL  *This,
62   IN EFI_PCI_IO_PROTOCOL_WIDTH    Width,
63   IN UINT8                        BarIndex,
64   IN UINT64                       Offset,
65   IN UINTN                        Count,
66   IN OUT VOID                     *Buffer
67 );
68 
69 typedef
70 EFI_STATUS
71 (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_IO_MEM) (
72   IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,
73   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH    Width,
74   IN UINT64                                   Address,
75   IN UINTN                                    Count,
76   IN OUT VOID                                 *Buffer
77 );
78 
79 typedef struct {
80   EFI_PCI_IO_PROTOCOL_IO_MEM    Read;
81   EFI_PCI_IO_PROTOCOL_IO_MEM    Write;
82 } EFI_PCI_IO_PROTOCOL_ACCESS;
83 
84 typedef struct {
85   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_IO_MEM  Read;
86   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_IO_MEM  Write;
87 } EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ACCESS;
88 
89 typedef
90 EFI_STATUS
91 (EFIAPI *EFI_PCI_IO_PROTOCOL_CONFIG) (
92   IN struct _EFI_PCI_IO_PROTOCOL  *This,
93   IN EFI_PCI_IO_PROTOCOL_WIDTH    Width,
94   IN UINT32                       Offset,
95   IN UINTN                        Count,
96   IN OUT VOID                     *Buffer
97 );
98 
99 typedef
100 EFI_STATUS
101 (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_CONFIGURATION) (
102   IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL    *This,
103   OUT VOID                                      **Resources
104 );
105 
106 typedef struct {
107   EFI_PCI_IO_PROTOCOL_CONFIG Read;
108   EFI_PCI_IO_PROTOCOL_CONFIG Write;
109 } EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS;
110 
111 typedef
112 EFI_STATUS
113 (EFIAPI *EFI_PCI_IO_PROTOCOL_COPY_MEM) (
114   IN struct _EFI_PCI_IO_PROTOCOL  *This,
115   IN EFI_PCI_IO_PROTOCOL_WIDTH    Width,
116   IN UINT8                        DestBarIndex,
117   IN UINT64                       DestOffset,
118   IN UINT8                        SrcBarIndex,
119   IN UINT64                       SrcOffset,
120   IN UINTN                        Count
121 );
122 
123 typedef
124 EFI_STATUS
125 (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_COPY_MEM) (
126   IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL  *This,
127   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH    Width,
128   IN UINT64                                   DestAddress,
129   IN UINT64                                   SrcAddress,
130   IN UINTN                                    Count
131 );
132 
133 typedef enum {
134     EfiPciIoOperationBusMasterRead,
135     EfiPciIoOperationBusMasterWrite,
136     EfiPciIoOperationBusMasterCommonBuffer,
137     EfiPciIoOperationMaximum
138 } EFI_PCI_IO_PROTOCOL_OPERATION;
139 
140 typedef enum {
141   EfiPciOperationBusMasterRead,
142   EfiPciOperationBusMasterWrite,
143   EfiPciOperationBusMasterCommonBuffer,
144   EfiPciOperationBusMasterRead64,
145   EfiPciOperationBusMasterWrite64,
146   EfiPciOperationBusMasterCommonBuffer64,
147   EfiPciOperationMaximum
148 } EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION;
149 
150 typedef
151 EFI_STATUS
152 (EFIAPI *EFI_PCI_IO_PROTOCOL_MAP) (
153   IN struct _EFI_PCI_IO_PROTOCOL   *This,
154   IN EFI_PCI_IO_PROTOCOL_OPERATION Operation,
155   IN VOID                          *HostAddress,
156   IN OUT UINTN                     *NumberOfBytes,
157   OUT EFI_PHYSICAL_ADDRESS         *DeviceAddress,
158   OUT VOID                         **Mapping
159 );
160 
161 typedef
162 EFI_STATUS
163 (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_MAP) (
164   IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL    *This,
165   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION  Operation,
166   IN VOID                                       *HostAddress,
167   IN OUT UINTN                                  *NumberOfBytes,
168   OUT EFI_PHYSICAL_ADDRESS                      *DeviceAddress,
169   OUT VOID                                      **Mapping
170 );
171 
172 typedef
173 EFI_STATUS
174 (EFIAPI *EFI_PCI_IO_PROTOCOL_UNMAP) (
175   IN struct _EFI_PCI_IO_PROTOCOL  *This,
176   IN VOID                         *Mapping
177 );
178 
179 typedef
180 EFI_STATUS
181 (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_UNMAP) (
182   IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL    *This,
183   IN VOID                                       *Mapping
184 );
185 
186 typedef
187 EFI_STATUS
188 (EFIAPI *EFI_PCI_IO_PROTOCOL_ALLOCATE_BUFFER) (
189   IN struct _EFI_PCI_IO_PROTOCOL  *This,
190   IN EFI_ALLOCATE_TYPE            Type,
191   IN EFI_MEMORY_TYPE              MemoryType,
192   IN UINTN                        Pages,
193   OUT VOID                        **HostAddress,
194   IN UINT64                       Attributes
195 );
196 
197 typedef
198 EFI_STATUS
199 (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ALLOCATE_BUFFER) (
200   IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL    *This,
201   IN EFI_ALLOCATE_TYPE                          Type,
202   IN EFI_MEMORY_TYPE                            MemoryType,
203   IN UINTN                                      Pages,
204   IN OUT VOID                                   **HostAddress,
205   IN UINT64                                     Attributes
206 );
207 
208 typedef
209 EFI_STATUS
210 (EFIAPI *EFI_PCI_IO_PROTOCOL_FREE_BUFFER) (
211   IN struct _EFI_PCI_IO_PROTOCOL  *This,
212   IN UINTN                        Pages,
213   IN VOID                         *HostAddress
214   );
215 
216 typedef
217 EFI_STATUS
218 (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_FREE_BUFFER) (
219   IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL    *This,
220   IN UINTN                                      Pages,
221   IN VOID                                       *HostAddress
222 );
223 
224 typedef
225 EFI_STATUS
226 (EFIAPI *EFI_PCI_IO_PROTOCOL_FLUSH) (
227   IN struct _EFI_PCI_IO_PROTOCOL  *This
228 );
229 
230 typedef
231 EFI_STATUS
232 (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_FLUSH) (
233   IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL    *This
234 );
235 
236 typedef
237 EFI_STATUS
238 (EFIAPI *EFI_PCI_IO_PROTOCOL_GET_LOCATION) (
239   IN struct _EFI_PCI_IO_PROTOCOL  *This,
240   OUT UINTN                       *SegmentNumber,
241   OUT UINTN                       *BusNumber,
242   OUT UINTN                       *DeviceNumber,
243   OUT UINTN                       *FunctionNumber
244 );
245 
246 #define EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO      0x0001
247 #define EFI_PCI_ATTRIBUTE_ISA_IO                  0x0002
248 #define EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO          0x0004
249 #define EFI_PCI_ATTRIBUTE_VGA_MEMORY              0x0008
250 #define EFI_PCI_ATTRIBUTE_VGA_IO                  0x0010
251 #define EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO          0x0020
252 #define EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO        0x0040
253 #define EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE    0x0080
254 #define EFI_PCI_ATTRIBUTE_IO                      0x0100
255 #define EFI_PCI_ATTRIBUTE_MEMORY                  0x0200
256 #define EFI_PCI_ATTRIBUTE_BUS_MASTER              0x0400
257 #define EFI_PCI_ATTRIBUTE_MEMORY_CACHED           0x0800
258 #define EFI_PCI_ATTRIBUTE_MEMORY_DISABLE          0x1000
259 #define EFI_PCI_ATTRIBUTE_EMBEDDED_DEVICE         0x2000
260 #define EFI_PCI_ATTRIBUTE_EMBEDDED_ROM            0x4000
261 #define EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE      0x8000
262 #define EFI_PCI_ATTRIBUTE_ISA_IO_16               0x10000
263 #define EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16       0x20000
264 #define EFI_PCI_ATTRIBUTE_VGA_IO_16               0x40000
265 
266 #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO   EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO
267 #define EFI_PCI_IO_ATTRIBUTE_ISA_IO               EFI_PCI_ATTRIBUTE_ISA_IO
268 #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO       EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO
269 #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY           EFI_PCI_ATTRIBUTE_VGA_MEMORY
270 #define EFI_PCI_IO_ATTRIBUTE_VGA_IO               EFI_PCI_ATTRIBUTE_VGA_IO
271 #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO       EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO
272 #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO     EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO
273 #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE
274 #define EFI_PCI_IO_ATTRIBUTE_IO                   EFI_PCI_ATTRIBUTE_IO
275 #define EFI_PCI_IO_ATTRIBUTE_MEMORY               EFI_PCI_ATTRIBUTE_MEMORY
276 #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER           EFI_PCI_ATTRIBUTE_BUS_MASTER
277 #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED        EFI_PCI_ATTRIBUTE_MEMORY_CACHED
278 #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE       EFI_PCI_ATTRIBUTE_MEMORY_DISABLE
279 #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE      EFI_PCI_ATTRIBUTE_EMBEDDED_DEVICE
280 #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM         EFI_PCI_ATTRIBUTE_EMBEDDED_ROM
281 #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE   EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE
282 #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16            EFI_PCI_ATTRIBUTE_ISA_IO_16
283 #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16    EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16
284 #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16            EFI_PCI_ATTRIBUTE_VGA_IO_16
285 
286 #define EFI_PCI_ATTRIBUTE_VALID_FOR_ALLOCATE_BUFFER \
287     (EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE | EFI_PCI_ATTRIBUTE_MEMORY_CACHED | EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE)
288 
289 #define EFI_PCI_ATTRIBUTE_INVALID_FOR_ALLOCATE_BUFFER \
290     (~EFI_PCI_ATTRIBUTE_VALID_FOR_ALLOCATE_BUFFER)
291 
292 typedef struct {
293     UINT8 Register;
294     UINT8 Function;
295     UINT8 Device;
296     UINT8 Bus;
297     UINT32 ExtendedRegister;
298 } EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_PCI_ADDRESS;
299 
300 typedef enum {
301     EfiPciIoAttributeOperationGet,
302     EfiPciIoAttributeOperationSet,
303     EfiPciIoAttributeOperationEnable,
304     EfiPciIoAttributeOperationDisable,
305     EfiPciIoAttributeOperationSupported,
306     EfiPciIoAttributeOperationMaximum
307 } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
308 
309 typedef
310 EFI_STATUS
311 (EFIAPI *EFI_PCI_IO_PROTOCOL_ATTRIBUTES) (
312   IN struct _EFI_PCI_IO_PROTOCOL             *This,
313   IN EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION Operation,
314   IN UINT64                                  Attributes,
315   OUT UINT64                                 *Result OPTIONAL
316 );
317 
318 typedef
319 EFI_STATUS
320 (EFIAPI *EFI_PCI_IO_PROTOCOL_GET_BAR_ATTRIBUTES) (
321   IN struct _EFI_PCI_IO_PROTOCOL  *This,
322   IN UINT8                        BarIndex,
323   OUT UINT64                      *Supports   OPTIONAL,
324   OUT VOID                        **Resources OPTIONAL
325 );
326 
327 typedef
328 EFI_STATUS
329 (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GET_ATTRIBUTES) (
330   IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL    *This,
331   OUT UINT64                                    *Supports,
332   OUT UINT64                                    *Attributes
333 );
334 
335 typedef
336 EFI_STATUS
337 (EFIAPI *EFI_PCI_IO_PROTOCOL_SET_BAR_ATTRIBUTES) (
338   IN struct _EFI_PCI_IO_PROTOCOL  *This,
339   IN UINT64                       Attributes,
340   IN UINT8                        BarIndex,
341   IN OUT UINT64                   *Offset,
342   IN OUT UINT64                   *Length
343 );
344 
345 typedef
346 EFI_STATUS
347 (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_SET_ATTRIBUTES) (
348   IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL    *This,
349   IN UINT64                                     Attributes,
350   IN OUT UINT64                                 *ResourceBase,
351   IN OUT UINT64                                 *ResourceLength
352 );
353 
354 typedef struct _EFI_PCI_IO_PROTOCOL {
355   EFI_PCI_IO_PROTOCOL_POLL_IO_MEM        PollMem;
356   EFI_PCI_IO_PROTOCOL_POLL_IO_MEM        PollIo;
357   EFI_PCI_IO_PROTOCOL_ACCESS             Mem;
358   EFI_PCI_IO_PROTOCOL_ACCESS             Io;
359   EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS      Pci;
360   EFI_PCI_IO_PROTOCOL_COPY_MEM           CopyMem;
361   EFI_PCI_IO_PROTOCOL_MAP                Map;
362   EFI_PCI_IO_PROTOCOL_UNMAP              Unmap;
363   EFI_PCI_IO_PROTOCOL_ALLOCATE_BUFFER    AllocateBuffer;
364   EFI_PCI_IO_PROTOCOL_FREE_BUFFER        FreeBuffer;
365   EFI_PCI_IO_PROTOCOL_FLUSH              Flush;
366   EFI_PCI_IO_PROTOCOL_GET_LOCATION       GetLocation;
367   EFI_PCI_IO_PROTOCOL_ATTRIBUTES         Attributes;
368   EFI_PCI_IO_PROTOCOL_GET_BAR_ATTRIBUTES GetBarAttributes;
369   EFI_PCI_IO_PROTOCOL_SET_BAR_ATTRIBUTES SetBarAttributes;
370   UINT64                                 RomSize;
371   VOID                                   *RomImage;
372 } EFI_PCI_IO_PROTOCOL;
373 
374 // Note: Because it conflicted with the EDK2 struct name, the
375 // 'EFI_PCI_IO_PROTOCOL' GUID definition, from older versions
376 // of gnu-efi, is now obsoleted.
377 // Use 'EFI_PCI_IO_PROTOCOL_GUID' instead.
378 
379 typedef struct _EFI_PCI_IO_PROTOCOL _EFI_PCI_IO;
380 typedef EFI_PCI_IO_PROTOCOL EFI_PCI_IO;
381 
382 typedef struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL {
383   EFI_HANDLE                                      ParentHandle;
384   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_POLL_IO_MEM     PollMem;
385   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_POLL_IO_MEM     PollIo;
386   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ACCESS          Mem;
387   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ACCESS          Io;
388   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ACCESS          Pci;
389   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_COPY_MEM        CopyMem;
390   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_MAP             Map;
391   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_UNMAP           Unmap;
392   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ALLOCATE_BUFFER AllocateBuffer;
393   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_FREE_BUFFER     FreeBuffer;
394   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_FLUSH           Flush;
395   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GET_ATTRIBUTES  GetAttributes;
396   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_SET_ATTRIBUTES  SetAttributes;
397   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_CONFIGURATION   Configuration;
398   UINT32                                          SegmentNumber;
399 } EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL;
400 
401 #endif /* _EFI_PCI_IO_H */
402