mirror of https://github.com/acidanthera/audk.git
245 lines
7.2 KiB
C
245 lines
7.2 KiB
C
/*++
|
|
|
|
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
|