/** @file | |
Library class layered on top of PciCapLib that allows clients to plug a | |
PciSegmentLib backend into PciCapLib, for config space access. | |
Copyright (C) 2018, Red Hat, Inc. | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef __PCI_CAP_PCI_SEGMENT_LIB_H__ | |
#define __PCI_CAP_PCI_SEGMENT_LIB_H__ | |
#include <Library/PciCapLib.h> | |
/** | |
Create a PCI_CAP_DEV object from the PCI Segment:Bus:Device.Function | |
quadruplet. The config space accessors are based upon PciSegmentLib. | |
@param[in] MaxDomain If MaxDomain is PciCapExtended, then | |
PciDevice->ReadConfig() and PciDevice->WriteConfig() | |
will delegate extended config space accesses too to | |
PciSegmentReadBuffer() and PciSegmentWriteBuffer(), | |
respectively. Otherwise, PciDevice->ReadConfig() and | |
PciDevice->WriteConfig() will reject accesses to | |
extended config space with RETURN_UNSUPPORTED, without | |
calling PciSegmentReadBuffer() or | |
PciSegmentWriteBuffer(). By setting MaxDomain to | |
PciCapNormal, the platform can prevent undefined | |
PciSegmentLib behavior when the PCI root bridge under | |
the PCI device at Segment:Bus:Device.Function doesn't | |
support extended config space. | |
@param[in] Segment 16-bit wide segment number. | |
@param[in] Bus 8-bit wide bus number. | |
@param[in] Device 5-bit wide device number. | |
@param[in] Function 3-bit wide function number. | |
@param[out] PciDevice The PCI_CAP_DEV object constructed as described above. | |
PciDevice can be passed to the PciCapLib APIs. | |
@retval RETURN_SUCCESS PciDevice has been constructed and output. | |
@retval RETURN_INVALID_PARAMETER Device or Function does not fit in the | |
permitted number of bits. | |
@retval RETURN_OUT_OF_RESOURCES Memory allocation failed. | |
**/ | |
RETURN_STATUS | |
EFIAPI | |
PciCapPciSegmentDeviceInit ( | |
IN PCI_CAP_DOMAIN MaxDomain, | |
IN UINT16 Segment, | |
IN UINT8 Bus, | |
IN UINT8 Device, | |
IN UINT8 Function, | |
OUT PCI_CAP_DEV **PciDevice | |
); | |
/** | |
Free the resources used by PciDevice. | |
@param[in] PciDevice The PCI_CAP_DEV object to free, originally produced by | |
PciCapPciSegmentDeviceInit(). | |
**/ | |
VOID | |
EFIAPI | |
PciCapPciSegmentDeviceUninit ( | |
IN PCI_CAP_DEV *PciDevice | |
); | |
#endif // __PCI_CAP_PCI_SEGMENT_LIB_H__ |