mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-05 13:33:33 +01:00
270 lines
9.2 KiB
C
270 lines
9.2 KiB
C
|
/** @file
|
||
|
|
||
|
The Header file of the Pci Host Bridge Driver.
|
||
|
|
||
|
Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
|
||
|
#ifndef _PCI_HOST_BRIDGE_H_
|
||
|
#define _PCI_HOST_BRIDGE_H_
|
||
|
|
||
|
|
||
|
#include <PiDxe.h>
|
||
|
#include <IndustryStandard/Acpi.h>
|
||
|
#include <Library/UefiDriverEntryPoint.h>
|
||
|
#include <Library/MemoryAllocationLib.h>
|
||
|
#include <Library/PciHostBridgeLib.h>
|
||
|
#include <Protocol/PciHostBridgeResourceAllocation.h>
|
||
|
#include <Protocol/IoMmu.h>
|
||
|
|
||
|
#include "PciRootBridge.h"
|
||
|
|
||
|
#define PCI_HOST_BRIDGE_SIGNATURE SIGNATURE_32 ('p', 'h', 'b', 'g')
|
||
|
typedef struct {
|
||
|
UINTN Signature;
|
||
|
EFI_HANDLE Handle;
|
||
|
LIST_ENTRY RootBridges;
|
||
|
BOOLEAN CanRestarted;
|
||
|
EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL ResAlloc;
|
||
|
} PCI_HOST_BRIDGE_INSTANCE;
|
||
|
|
||
|
#define PCI_HOST_BRIDGE_FROM_THIS(a) CR (a, PCI_HOST_BRIDGE_INSTANCE, ResAlloc, PCI_HOST_BRIDGE_SIGNATURE)
|
||
|
|
||
|
//
|
||
|
// Macros to translate device address to host address and vice versa. According
|
||
|
// to UEFI 2.7, device address = host address + translation offset.
|
||
|
//
|
||
|
#define TO_HOST_ADDRESS(DeviceAddress,TranslationOffset) ((DeviceAddress) - (TranslationOffset))
|
||
|
#define TO_DEVICE_ADDRESS(HostAddress,TranslationOffset) ((HostAddress) + (TranslationOffset))
|
||
|
|
||
|
//
|
||
|
// Driver Entry Point
|
||
|
//
|
||
|
/**
|
||
|
|
||
|
Entry point of this driver.
|
||
|
|
||
|
@param ImageHandle - Image handle of this driver.
|
||
|
@param SystemTable - Pointer to standard EFI system table.
|
||
|
|
||
|
@retval EFI_SUCCESS - Succeed.
|
||
|
@retval EFI_DEVICE_ERROR - Fail to install PCI_ROOT_BRIDGE_IO protocol.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
InitializePciHostBridge (
|
||
|
IN EFI_HANDLE ImageHandle,
|
||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// HostBridge Resource Allocation interface
|
||
|
//
|
||
|
/**
|
||
|
|
||
|
Enter a certain phase of the PCI enumeration process.
|
||
|
|
||
|
@param This The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL instance.
|
||
|
@param Phase The phase during enumeration.
|
||
|
|
||
|
@retval EFI_SUCCESS Succeed.
|
||
|
@retval EFI_INVALID_PARAMETER Wrong phase parameter passed in.
|
||
|
@retval EFI_NOT_READY Resources have not been submitted yet.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
NotifyPhase (
|
||
|
IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
|
||
|
IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PHASE Phase
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
|
||
|
Return the device handle of the next PCI root bridge that is associated with
|
||
|
this Host Bridge.
|
||
|
|
||
|
@param This The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance.
|
||
|
@param RootBridgeHandle Returns the device handle of the next PCI Root Bridge.
|
||
|
On input, it holds the RootBridgeHandle returned by the most
|
||
|
recent call to GetNextRootBridge().The handle for the first
|
||
|
PCI Root Bridge is returned if RootBridgeHandle is NULL on input.
|
||
|
|
||
|
@retval EFI_SUCCESS Succeed.
|
||
|
@retval EFI_NOT_FOUND Next PCI root bridge not found.
|
||
|
@retval EFI_INVALID_PARAMETER Wrong parameter passed in.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
GetNextRootBridge (
|
||
|
IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
|
||
|
IN OUT EFI_HANDLE *RootBridgeHandle
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
|
||
|
Returns the attributes of a PCI Root Bridge.
|
||
|
|
||
|
@param This - The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance
|
||
|
@param RootBridgeHandle - The device handle of the PCI Root Bridge
|
||
|
that the caller is interested in
|
||
|
@param Attributes - The pointer to attributes of the PCI Root Bridge
|
||
|
|
||
|
@retval EFI_SUCCESS - Succeed.
|
||
|
@retval EFI_INVALID_PARAMETER - Attributes parameter passed in is NULL or
|
||
|
@retval RootBridgeHandle is not an EFI_HANDLE
|
||
|
@retval that was returned on a previous call to
|
||
|
@retval GetNextRootBridge().
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
GetAttributes (
|
||
|
IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
|
||
|
IN EFI_HANDLE RootBridgeHandle,
|
||
|
OUT UINT64 *Attributes
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
|
||
|
This is the request from the PCI enumerator to set up
|
||
|
the specified PCI Root Bridge for bus enumeration process.
|
||
|
|
||
|
@param This - The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance.
|
||
|
@param RootBridgeHandle - The PCI Root Bridge to be set up.
|
||
|
@param Configuration - Pointer to the pointer to the PCI bus resource descriptor.
|
||
|
|
||
|
@retval EFI_SUCCESS - Succeed.
|
||
|
@retval EFI_OUT_OF_RESOURCES - Not enough pool to be allocated.
|
||
|
@retval EFI_INVALID_PARAMETER - RootBridgeHandle is not a valid handle.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
StartBusEnumeration (
|
||
|
IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
|
||
|
IN EFI_HANDLE RootBridgeHandle,
|
||
|
OUT VOID **Configuration
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
|
||
|
This function programs the PCI Root Bridge hardware so that
|
||
|
it decodes the specified PCI bus range.
|
||
|
|
||
|
@param This - The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance.
|
||
|
@param RootBridgeHandle - The PCI Root Bridge whose bus range is to be programmed.
|
||
|
@param Configuration - The pointer to the PCI bus resource descriptor.
|
||
|
|
||
|
@retval EFI_SUCCESS - Succeed.
|
||
|
@retval EFI_INVALID_PARAMETER - Wrong parameters passed in.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
SetBusNumbers (
|
||
|
IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
|
||
|
IN EFI_HANDLE RootBridgeHandle,
|
||
|
IN VOID *Configuration
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
|
||
|
Submits the I/O and memory resource requirements for the specified PCI Root Bridge.
|
||
|
|
||
|
@param This - The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance
|
||
|
@param RootBridgeHandle - The PCI Root Bridge whose I/O and memory resource requirements
|
||
|
are being submitted
|
||
|
@param Configuration - The pointer to the PCI I/O and PCI memory resource descriptor
|
||
|
|
||
|
@retval EFI_SUCCESS - Succeed.
|
||
|
@retval EFI_INVALID_PARAMETER - Wrong parameters passed in.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
SubmitResources (
|
||
|
IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
|
||
|
IN EFI_HANDLE RootBridgeHandle,
|
||
|
IN VOID *Configuration
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
|
||
|
This function returns the proposed resource settings for the specified
|
||
|
PCI Root Bridge.
|
||
|
|
||
|
@param This - The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance.
|
||
|
@param RootBridgeHandle - The PCI Root Bridge handle.
|
||
|
@param Configuration - The pointer to the pointer to the PCI I/O
|
||
|
and memory resource descriptor.
|
||
|
|
||
|
@retval EFI_SUCCESS - Succeed.
|
||
|
@retval EFI_OUT_OF_RESOURCES - Not enough pool to be allocated.
|
||
|
@retval EFI_INVALID_PARAMETER - RootBridgeHandle is not a valid handle.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
GetProposedResources (
|
||
|
IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
|
||
|
IN EFI_HANDLE RootBridgeHandle,
|
||
|
OUT VOID **Configuration
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
|
||
|
This function is called for all the PCI controllers that the PCI
|
||
|
bus driver finds. Can be used to Preprogram the controller.
|
||
|
|
||
|
@param This - The EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_ PROTOCOL instance.
|
||
|
@param RootBridgeHandle - The PCI Root Bridge handle.
|
||
|
@param PciAddress - Address of the controller on the PCI bus.
|
||
|
@param Phase - The Phase during resource allocation.
|
||
|
|
||
|
@retval EFI_SUCCESS - Succeed.
|
||
|
@retval EFI_INVALID_PARAMETER - RootBridgeHandle is not a valid handle.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
PreprocessController (
|
||
|
IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL *This,
|
||
|
IN EFI_HANDLE RootBridgeHandle,
|
||
|
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_PCI_ADDRESS PciAddress,
|
||
|
IN EFI_PCI_CONTROLLER_RESOURCE_ALLOCATION_PHASE Phase
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
This routine constructs the resource descriptors for all root bridges and call PciHostBridgeResourceConflict().
|
||
|
|
||
|
@param HostBridge The Host Bridge Instance where the resource adjustment happens.
|
||
|
**/
|
||
|
VOID
|
||
|
ResourceConflict (
|
||
|
IN PCI_HOST_BRIDGE_INSTANCE *HostBridge
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
This routine gets translation offset from a root bridge instance by resource type.
|
||
|
|
||
|
@param RootBridge The Root Bridge Instance for the resources.
|
||
|
@param ResourceType The Resource Type of the translation offset.
|
||
|
|
||
|
@retval The Translation Offset of the specified resource.
|
||
|
**/
|
||
|
UINT64
|
||
|
GetTranslationByResourceType (
|
||
|
IN PCI_ROOT_BRIDGE_INSTANCE *RootBridge,
|
||
|
IN PCI_RESOURCE_TYPE ResourceType
|
||
|
);
|
||
|
|
||
|
extern EFI_CPU_IO2_PROTOCOL *mCpuIo;
|
||
|
extern EDKII_IOMMU_PROTOCOL *mIoMmu;
|
||
|
|
||
|
#endif
|