mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-24 11:45:27 +01:00
7c0aa811ec
Signed-off-by: Sergey Isakov <isakov-sl@bk.ru>
206 lines
5.4 KiB
C
206 lines
5.4 KiB
C
/** @file
|
|
PCI Hot Plug support functions declaration for PCI Bus module.
|
|
|
|
Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#ifndef _EFI_PCI_HOT_PLUG_SUPPORT_H_
|
|
#define _EFI_PCI_HOT_PLUG_SUPPORT_H_
|
|
|
|
//
|
|
// stall 1 second, its unit is 100ns
|
|
//
|
|
#define STALL_1_SECOND 1000000
|
|
|
|
//
|
|
// PCI Hot Plug controller private data
|
|
//
|
|
typedef struct {
|
|
EFI_EVENT Event;
|
|
BOOLEAN Found;
|
|
BOOLEAN Initialized;
|
|
VOID *Padding;
|
|
} ROOT_HPC_DATA;
|
|
|
|
//
|
|
// Reference of some global variables
|
|
//
|
|
extern EFI_PCI_HOT_PLUG_INIT_PROTOCOL *gPciHotPlugInit;
|
|
extern EFI_HPC_LOCATION *gPciRootHpcPool;
|
|
extern ROOT_HPC_DATA *gPciRootHpcData;
|
|
|
|
/**
|
|
Event notification function to set Hot Plug controller status.
|
|
|
|
@param Event The event that invoke this function.
|
|
@param Context The calling context, pointer to ROOT_HPC_DATA.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
PciHPCInitialized (
|
|
IN EFI_EVENT Event,
|
|
IN VOID *Context
|
|
);
|
|
|
|
/**
|
|
Compare two device paths to check if they are exactly same.
|
|
|
|
@param DevicePath1 A pointer to the first device path data structure.
|
|
@param DevicePath2 A pointer to the second device path data structure.
|
|
|
|
@retval TRUE They are same.
|
|
@retval FALSE They are not same.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EfiCompareDevicePath (
|
|
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath1,
|
|
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath2
|
|
);
|
|
|
|
/**
|
|
Check hot plug support and initialize root hot plug private data.
|
|
|
|
If Hot Plug is supported by the platform, call PCI Hot Plug Init protocol
|
|
to get PCI Hot Plug controller's information and constructor the root hot plug
|
|
private data structure.
|
|
|
|
@retval EFI_SUCCESS They are same.
|
|
@retval EFI_UNSUPPORTED No PCI Hot Plug controller on the platform.
|
|
@retval EFI_OUT_OF_RESOURCES No memory to constructor root hot plug private
|
|
data structure.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
InitializeHotPlugSupport (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Test whether PCI device is hot plug bus.
|
|
|
|
@param PciIoDevice PCI device instance.
|
|
|
|
@retval TRUE PCI device is a hot plug bus.
|
|
@retval FALSE PCI device is not a hot plug bus.
|
|
|
|
**/
|
|
BOOLEAN
|
|
IsPciHotPlugBus (
|
|
PCI_IO_DEVICE *PciIoDevice
|
|
);
|
|
|
|
/**
|
|
Test whether device path is for root pci hot plug bus.
|
|
|
|
@param HpbDevicePath A pointer to device path data structure to be tested.
|
|
@param HpIndex If HpIndex is not NULL, return the index of root hot
|
|
plug in global array when TRUE is returned.
|
|
|
|
@retval TRUE The device path is for root pci hot plug bus.
|
|
@retval FALSE The device path is not for root pci hot plug bus.
|
|
|
|
**/
|
|
BOOLEAN
|
|
IsRootPciHotPlugBus (
|
|
IN EFI_DEVICE_PATH_PROTOCOL *HpbDevicePath,
|
|
OUT UINTN *HpIndex OPTIONAL
|
|
);
|
|
|
|
/**
|
|
Test whether device path is for root pci hot plug controller.
|
|
|
|
@param HpcDevicePath A pointer to device path data structure to be tested.
|
|
@param HpIndex If HpIndex is not NULL, return the index of root hot
|
|
plug in global array when TRUE is returned.
|
|
|
|
@retval TRUE The device path is for root pci hot plug controller.
|
|
@retval FALSE The device path is not for root pci hot plug controller.
|
|
|
|
**/
|
|
BOOLEAN
|
|
IsRootPciHotPlugController (
|
|
IN EFI_DEVICE_PATH_PROTOCOL *HpcDevicePath,
|
|
OUT UINTN *HpIndex
|
|
);
|
|
|
|
/**
|
|
Creating event object for PCI Hot Plug controller.
|
|
|
|
@param HpIndex Index of hot plug device in global array.
|
|
@param Event The returned event that invoke this function.
|
|
|
|
@return Status of create event.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
CreateEventForHpc (
|
|
IN UINTN HpIndex,
|
|
OUT EFI_EVENT *Event
|
|
);
|
|
|
|
/**
|
|
Wait for all root PCI Hot Plug controller finished initializing.
|
|
|
|
@param TimeoutInMicroSeconds Microseconds to wait for all root HPCs' initialization.
|
|
|
|
@retval EFI_SUCCESS All HPCs initialization finished.
|
|
@retval EFI_TIMEOUT Not ALL HPCs initialization finished in Microseconds.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
AllRootHPCInitialized (
|
|
IN UINTN TimeoutInMicroSeconds
|
|
);
|
|
|
|
/**
|
|
Check whether PCI-PCI bridge has PCI Hot Plug capability register block.
|
|
|
|
@param PciIoDevice A Pointer to the PCI-PCI bridge.
|
|
|
|
@retval TRUE PCI device is HPC.
|
|
@retval FALSE PCI device is not HPC.
|
|
|
|
**/
|
|
BOOLEAN
|
|
IsSHPC (
|
|
IN PCI_IO_DEVICE *PciIoDevice
|
|
);
|
|
|
|
/**
|
|
Check whether PciIoDevice supports PCIe hotplug.
|
|
|
|
This is equivalent to the following condition:
|
|
- the device is either a PCIe switch downstream port or a root port,
|
|
- and the device has the SlotImplemented bit set in its PCIe capability
|
|
register,
|
|
- and the device has the HotPlugCapable bit set in its slot capabilities
|
|
register.
|
|
|
|
@param[in] PciIoDevice The device being checked.
|
|
|
|
@retval TRUE PciIoDevice is a PCIe port that accepts a hot-plugged device.
|
|
@retval FALSE Otherwise.
|
|
|
|
**/
|
|
BOOLEAN
|
|
SupportsPcieHotplug (
|
|
IN PCI_IO_DEVICE *PciIoDevice
|
|
);
|
|
|
|
/**
|
|
Get resource padding if the specified PCI bridge is a hot plug bus.
|
|
|
|
@param PciIoDevice PCI bridge instance.
|
|
|
|
**/
|
|
VOID
|
|
GetResourcePaddingForHpb (
|
|
IN PCI_IO_DEVICE *PciIoDevice
|
|
);
|
|
|
|
#endif
|