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