/*++ | |
Copyright (c) 2005 - 2006, Intel Corporation. All rights reserved.<BR> | |
This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
Module Name: | |
PcatPciRootBridge.h | |
Abstract: | |
The driver for the host to pci bridge (root bridge). | |
--*/ | |
#ifndef _PCAT_PCI_ROOT_BRIDGE_H_ | |
#define _PCAT_PCI_ROOT_BRIDGE_H_ | |
#include <PiDxe.h> | |
#include <Protocol/PciRootBridgeIo.h> | |
#include <Protocol/DeviceIo.h> | |
#include <Protocol/CpuIo2.h> | |
#include <Library/UefiLib.h> | |
#include <Library/BaseLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/UefiBootServicesTableLib.h> | |
#include <Library/DebugLib.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/DevicePathLib.h> | |
#include <Library/HobLib.h> | |
#include <Guid/PciOptionRomTable.h> | |
#include <Guid/HobList.h> | |
#include <Guid/PciExpressBaseAddress.h> | |
#include <IndustryStandard/Acpi.h> | |
#include <IndustryStandard/Pci.h> | |
#define PCI_MAX_SEGMENT 0 | |
// | |
// Driver Instance Data Prototypes | |
// | |
#define PCAT_PCI_ROOT_BRIDGE_SIGNATURE SIGNATURE_32('p', 'c', 'r', 'b') | |
typedef struct { | |
UINT32 Signature; | |
EFI_HANDLE Handle; | |
EFI_DEVICE_PATH_PROTOCOL *DevicePath; | |
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL Io; | |
EFI_CPU_IO2_PROTOCOL *CpuIo; | |
UINT32 RootBridgeNumber; | |
UINT32 PrimaryBus; | |
UINT32 SubordinateBus; | |
UINT64 MemBase; // Offsets host to bus memory addr. | |
UINT64 MemLimit; // Max allowable memory access | |
UINT64 IoBase; // Offsets host to bus io addr. | |
UINT64 IoLimit; // Max allowable io access | |
UINT64 PciAddress; | |
UINT64 PciData; | |
UINT64 PhysicalMemoryBase; | |
UINT64 PhysicalIoBase; | |
EFI_LOCK PciLock; | |
UINT64 Attributes; | |
UINT64 Mem32Base; | |
UINT64 Mem32Limit; | |
UINT64 Pmem32Base; | |
UINT64 Pmem32Limit; | |
UINT64 Mem64Base; | |
UINT64 Mem64Limit; | |
UINT64 Pmem64Base; | |
UINT64 Pmem64Limit; | |
UINT64 PciExpressBaseAddress; | |
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Configuration; | |
LIST_ENTRY MapInfo; | |
} PCAT_PCI_ROOT_BRIDGE_INSTANCE; | |
// | |
// Driver Instance Data Macros | |
// | |
#define DRIVER_INSTANCE_FROM_PCI_ROOT_BRIDGE_IO_THIS(a) \ | |
CR(a, PCAT_PCI_ROOT_BRIDGE_INSTANCE, Io, PCAT_PCI_ROOT_BRIDGE_SIGNATURE) | |
// | |
// Private data types | |
// | |
typedef union { | |
UINT8 volatile *buf; | |
UINT8 volatile *ui8; | |
UINT16 volatile *ui16; | |
UINT32 volatile *ui32; | |
UINT64 volatile *ui64; | |
UINTN volatile ui; | |
} PTR; | |
typedef struct { | |
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION Operation; | |
UINTN NumberOfBytes; | |
UINTN NumberOfPages; | |
EFI_PHYSICAL_ADDRESS HostAddress; | |
EFI_PHYSICAL_ADDRESS MappedHostAddress; | |
} MAP_INFO; | |
typedef struct { | |
LIST_ENTRY Link; | |
MAP_INFO * Map; | |
} MAP_INFO_INSTANCE; | |
typedef | |
VOID | |
(*EFI_PCI_BUS_SCAN_CALLBACK) ( | |
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev, | |
UINT16 MinBus, | |
UINT16 MaxBus, | |
UINT16 MinDevice, | |
UINT16 MaxDevice, | |
UINT16 MinFunc, | |
UINT16 MaxFunc, | |
UINT16 Bus, | |
UINT16 Device, | |
UINT16 Func, | |
IN VOID *Context | |
); | |
typedef struct { | |
UINT16 *CommandRegisterBuffer; | |
UINT32 PpbMemoryWindow; | |
} PCAT_PCI_ROOT_BRIDGE_SCAN_FOR_ROM_CONTEXT; | |
typedef struct { | |
UINT8 Register; | |
UINT8 Function; | |
UINT8 Device; | |
UINT8 Bus; | |
UINT8 Reserved[4]; | |
} DEFIO_PCI_ADDR; | |
// | |
// Driver Protocol Constructor Prototypes | |
// | |
EFI_STATUS | |
ConstructConfiguration( | |
IN OUT PCAT_PCI_ROOT_BRIDGE_INSTANCE *PrivateData | |
); | |
EFI_STATUS | |
PcatPciRootBridgeParseBars ( | |
IN PCAT_PCI_ROOT_BRIDGE_INSTANCE *PrivateData, | |
IN UINT16 Command, | |
IN UINTN Bus, | |
IN UINTN Device, | |
IN UINTN Function | |
); | |
EFI_STATUS | |
ScanPciRootBridgeForRoms( | |
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev | |
); | |
EFI_STATUS | |
PcatRootBridgeDevicePathConstructor ( | |
IN EFI_DEVICE_PATH_PROTOCOL **Protocol, | |
IN UINTN RootBridgeNumber, | |
IN BOOLEAN IsPciExpress | |
); | |
EFI_STATUS | |
PcatRootBridgeIoConstructor ( | |
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *Protocol, | |
IN UINTN SegmentNumber | |
); | |
EFI_STATUS | |
PcatRootBridgeIoGetIoPortMapping ( | |
OUT EFI_PHYSICAL_ADDRESS *IoPortMapping, | |
OUT EFI_PHYSICAL_ADDRESS *MemoryPortMapping | |
); | |
EFI_STATUS | |
PcatRootBridgeIoPciRW ( | |
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, | |
IN BOOLEAN Write, | |
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, | |
IN UINT64 UserAddress, | |
IN UINTN Count, | |
IN OUT VOID *UserBuffer | |
); | |
UINT64 | |
GetPciExpressBaseAddressForRootBridge ( | |
IN UINTN HostBridgeNumber, | |
IN UINTN RootBridgeNumber | |
); | |
EFI_STATUS | |
EFIAPI | |
PcatRootBridgeIoIoRead ( | |
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, | |
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, | |
IN UINT64 UserAddress, | |
IN UINTN Count, | |
IN OUT VOID *UserBuffer | |
); | |
EFI_STATUS | |
EFIAPI | |
PcatRootBridgeIoIoWrite ( | |
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, | |
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, | |
IN UINT64 UserAddress, | |
IN UINTN Count, | |
IN OUT VOID *UserBuffer | |
); | |
// | |
// Driver entry point prototype | |
// | |
EFI_STATUS | |
EFIAPI | |
InitializePcatPciRootBridge ( | |
IN EFI_HANDLE ImageHandle, | |
IN EFI_SYSTEM_TABLE *SystemTable | |
); | |
extern EFI_CPU_IO2_PROTOCOL *gCpuIo; | |
#endif |