MdeModulePkg/NonDiscoverablePciDeviceDxe: expose unique B/D/F identifiers
Currently, the implementation of EFI_PCI_IO_PROTOCOL::GetLocation() in NonDiscoverablePciDeviceDxe returns the same set of dummy values for each instance of the NON_DISCOVERABLE_DEVICE protocol that it attaches itself to. However, this turns out to be causing problems in cases where software (such as the ARM Compliance Test Suite [ACS]) attempts to use these values to uniquely identify controllers, since the collisions create ambiguity in this regard. So let's modify GetLocation() to return an arbitrary bus/device tuple on segment 0xff instead. This is guaranteed not to clash with other non-discoverable PCI devices, and highly unlikely to clash with real PCIe devices. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Tested-by: Marcin Wojtas <mw@semihalf.com> Reviewed-by: Star Zeng <star.zeng@intel.com>
This commit is contained in:
@@ -1181,6 +1181,8 @@ PciIoGetLocation (
|
||||
OUT UINTN *FunctionNumber
|
||||
)
|
||||
{
|
||||
NON_DISCOVERABLE_PCI_DEVICE *Dev;
|
||||
|
||||
if (SegmentNumber == NULL ||
|
||||
BusNumber == NULL ||
|
||||
DeviceNumber == NULL ||
|
||||
@@ -1188,9 +1190,11 @@ PciIoGetLocation (
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
*SegmentNumber = 0;
|
||||
*BusNumber = 0xff;
|
||||
*DeviceNumber = 0;
|
||||
Dev = NON_DISCOVERABLE_PCI_DEVICE_FROM_PCI_IO(This);
|
||||
|
||||
*SegmentNumber = 0xff;
|
||||
*BusNumber = Dev->UniqueId >> 5;
|
||||
*DeviceNumber = Dev->UniqueId & 0x1f;
|
||||
*FunctionNumber = 0;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
Reference in New Issue
Block a user