1// Copyright 2016 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#pragma once
6
7#include <efi/boot-services.h>
8#include <efi/types.h>
9
10#define EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID \
11    {0x2f707ebb, 0x4a1a, 0x11D4, {0x9a, 0x38, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d}}
12extern efi_guid PciRootBridgeIoProtocol;
13
14typedef enum {
15    EfiPciWidthUint8,
16    EfiPciWidthUint16,
17    EfiPciWidthUint32,
18    EfiPciWidthUint64,
19    EfiPciWidthFifoUint8,
20    EfiPciWidthFifoUint16,
21    EfiPciWidthFifoUint32,
22    EfiPciWidthFifoUint64,
23    EfiPciWidthFillUint8,
24    EfiPciWidthFillUint16,
25    EfiPciWidthFillUint32,
26    EfiPciWidthFillUint64,
27    EfiPciWidthMaximum,
28} efi_pci_root_bridge_io_width;
29
30struct efi_pci_root_bridge_io_protocol;
31
32typedef struct {
33    efi_status (*Read) (struct efi_pci_root_bridge_io_protocol* self,
34                        efi_pci_root_bridge_io_width   width,
35                        uint64_t addr, size_t count, void* buffer) EFIAPI;
36    efi_status (*Write) (struct efi_pci_root_bridge_io_protocol* self,
37                         efi_pci_root_bridge_io_width   width,
38                         uint64_t addr, size_t count, void* buffer) EFIAPI;
39} efi_pci_root_bridge_io_access;
40
41#define EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
42#define EFI_PCI_ATTRIBUTE_ISA_IO 0x0002
43#define EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO 0x0004
44#define EFI_PCI_ATTRIBUTE_VGA_MEMORY 0x0008
45#define EFI_PCI_ATTRIBUTE_VGA_IO 0x0010
46#define EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
47#define EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
48#define EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
49#define EFI_PCI_ATTRIBUTE_MEMORY_CACHED 0x0800
50#define EFI_PCI_ATTRIBUTE_MEMORY_DISABLE 0x1000
51#define EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
52#define EFI_PCI_ATTRIBUTE_ISA_IO_16 0x10000
53#define EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
54#define EFI_PCI_ATTRIBUTE_VGA_IO_16 0x40000
55
56typedef enum {
57    EfiPciOperationBusMasterRead,
58    EfiPciOperationBusMasterWrite,
59    EfiPciOperationBusMasterCommonBuffer,
60    EfiPciOperationBusMasterRead64,
61    EfiPciOperationBusMasterWrite64,
62    EfiPciOperationBusMasterCommonBuffer64,
63    EfiPciOperationMaximum,
64} efi_pci_root_bridge_io_operation;
65
66typedef struct efi_pci_root_bridge_io_protocol {
67    efi_handle ParentHandle;
68
69    efi_status (*PollMem) (struct efi_pci_root_bridge_io_protocol *self,
70                           efi_pci_root_bridge_io_width width,
71                           uint64_t addr, uint64_t mask, uint64_t value, uint64_t delay,
72                           uint64_t* result) EFIAPI;
73
74    efi_status (*PollIo) (struct efi_pci_root_bridge_io_protocol *self,
75                          efi_pci_root_bridge_io_width width,
76                          uint64_t addr, uint64_t mask, uint64_t value, uint64_t delay,
77                          uint64_t* result) EFIAPI;
78
79    efi_pci_root_bridge_io_access Mem;
80    efi_pci_root_bridge_io_access Io;
81    efi_pci_root_bridge_io_access Pci;
82
83    efi_status (*CopyMem) (struct efi_pci_root_bridge_io_protocol* self,
84                           efi_pci_root_bridge_io_width width,
85                           uint64_t dest_addr, uint64_t src_addr, size_t count) EFIAPI;
86
87    efi_status (*Map) (struct efi_pci_root_bridge_io_protocol* self,
88                       efi_pci_root_bridge_io_operation operation,
89                       void* host_addr, size_t* num_bytes,
90                       efi_physical_addr* device_addr, void** mapping) EFIAPI;
91
92    efi_status (*Unmap) (struct efi_pci_root_bridge_io_protocol* self,
93                         void* mapping) EFIAPI;
94
95    efi_status (*AllocateBuffer) (struct efi_pci_root_bridge_io_protocol* self,
96                                  efi_allocate_type type, efi_memory_type memory_type,
97                                  size_t pages, void** host_addr, uint64_t attributes) EFIAPI;
98
99    efi_status (*FreeBuffer) (struct efi_pci_root_bridge_io_protocol* self,
100                              size_t pages, void* host_addr) EFIAPI;
101
102    efi_status (*Flush) (struct efi_pci_root_bridge_io_protocol* self) EFIAPI;
103
104    efi_status (*GetAttributes) (struct efi_pci_root_bridge_io_protocol* self,
105                                 uint64_t* supports, uint64_t* attributes) EFIAPI;
106
107    efi_status (*SetAttributes) (struct efi_pci_root_bridge_io_protocol* self,
108                                 uint64_t attributes, uint64_t* resource_base,
109                                 uint64_t* resource_len) EFIAPI;
110
111    efi_status (*Configuration) (struct efi_pci_root_bridge_io_protocol* self,
112                                 void** resources) EFIAPI;
113
114    uint32_t SegmentNumber;
115} efi_pci_root_bridge_io_protocol;
116