On 03/21/16 10:32, Ard Biesheuvel wrote:
> On 14 March 2016 at 13:52, Laszlo Ersek <[email protected]> wrote:
>> QEMU's ACPI table generator can only create meaningful _CRS objects --
>> apertures -- for the root buses if all of the PCI devices behind those
>> buses are actively decoding their IO and MMIO resources, at the time of
>> the firmware fetching the "etc/table-loader" fw_cfg file. This is not a
>> QEMU error; QEMU follows the definition of BARs (which are meaningless
>> when decoding is disabled).
>>
>> Currently we hook up AcpiPlatformDxe to the PCI Bus driver's
>> gEfiPciEnumerationCompleteProtocolGuid cue. Unfortunately, when the PCI
>> Bus driver installs this protocol, it's *still* not the right time for
>> fetching "etc/table-loader": although resources have been allocated and
>> BARs have been programmed with them, the PCI Bus driver has also cleared
>> IO and MMIO decoding in the command registers of the devices.
>>
>> Furthermore, we couldn't reenable IO and MMIO decoding temporarily in our
>> gEfiPciEnumerationCompleteProtocolGuid callback even if we wanted to,
>> because at that time the PCI Bus driver has not produced PciIo instances
>> yet.
>>
>> Our Platform BDSes are responsible for connecting the root bridges, hence
>> they know exactly when the PciIo instances become available -- not when
>> PCI enumeration completes (signaled by the above protocol), but when the
>> ConnectController() calls return.
>>
>> This is when our Platform BDSes should explicitly cue in AcpiPlatformDxe.
>> Then AcpiPlatformDxe can temporarily enable IO and MMIO decoding for all
>> devices, while it contacts QEMU for the ACPI payload.
>>
>> This patch introduces the non-standard protocol that we'll use for
>> unleashing AcpiPlatformDxe from or Platform BDSes.
>>
>> Cc: Ard Biesheuvel <[email protected]>
>> Cc: Gerd Hoffmann <[email protected]>
>> Cc: Jordan Justen <[email protected]>
>> Cc: Marcel Apfelbaum <[email protected]>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Laszlo Ersek <[email protected]>
>> ---
>> OvmfPkg/OvmfPkg.dec | 1 +
>> OvmfPkg/Include/Protocol/RootBusesConnected.h | 33 ++++++++++++++++++++
>> 2 files changed, 34 insertions(+)
>>
>> diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
>> index 784542f62368..a7d887ad353c 100644
>> --- a/OvmfPkg/OvmfPkg.dec
>> +++ b/OvmfPkg/OvmfPkg.dec
>> @@ -60,14 +60,15 @@ [Guids]
>> gXenBusRootDeviceGuid = {0xa732241f, 0x383d, 0x4d9c, {0x8a,
>> 0xe1, 0x8e, 0x09, 0x83, 0x75, 0x89, 0xd7}}
>>
>> [Protocols]
>> gVirtioDeviceProtocolGuid = {0xfa920010, 0x6785, 0x4941, {0xb6,
>> 0xec, 0x49, 0x8c, 0x57, 0x9f, 0x16, 0x0a}}
>> gBlockMmioProtocolGuid = {0x6b558ce3, 0x69e5, 0x4c67, {0xa6,
>> 0x34, 0xf7, 0xfe, 0x72, 0xad, 0xbe, 0x84}}
>> gXenBusProtocolGuid = {0x3d3ca290, 0xb9a5, 0x11e3, {0xb7,
>> 0x5d, 0xb8, 0xac, 0x6f, 0x7d, 0x65, 0xe6}}
>> gXenIoProtocolGuid = {0x6efac84f, 0x0ab0, 0x4747, {0x81,
>> 0xbe, 0x85, 0x55, 0x62, 0x59, 0x04, 0x49}}
>> + gRootBusesConnectedProtocolGuid = {0x24a2d66f, 0xeedd, 0x4086, {0x90,
>> 0x42, 0xf2, 0x6e, 0x47, 0x97, 0xee, 0x69}}
>>
>> [PcdsFixedAtBuild]
>> gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|0x0|UINT32|0
>> gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize|0x0|UINT32|1
>> gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|0x0|UINT32|0x15
>> gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize|0x0|UINT32|0x16
>>
>> diff --git a/OvmfPkg/Include/Protocol/RootBusesConnected.h
>> b/OvmfPkg/Include/Protocol/RootBusesConnected.h
>> new file mode 100644
>> index 000000000000..02181cbbcbb8
>> --- /dev/null
>> +++ b/OvmfPkg/Include/Protocol/RootBusesConnected.h
>> @@ -0,0 +1,33 @@
>> +/** @file
>> + A non-standard protocol with which BDS indicates that PCI root bridges
>> have
>> + been connected, and PciIo protocol instances have become available.
>> +
>> + Note that this differs from the PCI Enumeration Complete Protocol as
>> defined
>> + in the PI 1.1 specification. That protocol is installed by the PCI bus
>> driver
>> + after enumeration and resource allocation have been completed, but before
>> + PciIo protocol instances are created.
>> +
>> + Copyright (C) 2016, Red Hat, Inc.
>> +
>> + 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.
>> +**/
>> +
>> +#ifndef _ROOT_BUSES_CONNECTED_H_
>> +#define _ROOT_BUSES_CONNECTED_H_
>> +
>> +#define ROOT_BUSES_CONNECTED_PROTOCOL_GUID \
>> + { 0x24a2d66f, \
>> + 0xeedd, \
>> + 0x4086, \
>> + { 0x90, 0x42, 0xf2, 0x6e, 0x47, 0x97, 0xee, 0x69 }, \
>> + }
>> +
>> +extern EFI_GUID gRootBusesConnectedProtocolGuid;
>> +
>> +#endif
>
> Recently, someone noted that declaring EFI_GUID's like this is not
> necessary in EDK2, since AutoGen.h will declare it if the guid is
> mentioned in the .inf, and the #define is never referenced either. Do
> you have any particular reason to include this .h file regardless?
>
Two reasons:
(a) stick with existing practice
(b) macros like ROOT_BUSES_CONNECTED_PROTOCOL_GUID are useful for
initializing EFI_GUID objects (including GUID objects that are
members of structures) that have static storage duration (and are
optionally constant). So the statement "the #define is never
referenced" cannot be made in general; it is up to client code.
Thanks
Laszlo
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel