On 8 April 2016 at 21:15, Laszlo Ersek <[email protected]> wrote:
> On 04/08/16 11:45, Ard Biesheuvel wrote:
>> Instead of using a constructor, which may reference a dynamic PCD which is
>> set by the DXE entry point of its user, defer the assignment of the global
>> mPciExpressBaseAddress until the first the library is actually invoked.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Ard Biesheuvel <[email protected]>
>> ---
>>  ArmVirtPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf |  
>> 1 -
>>  ArmVirtPkg/Library/BaseCachingPciExpressLib/PciExpressLib.c              | 
>> 16 ++++------------
>>  2 files changed, 4 insertions(+), 13 deletions(-)
>>
>> diff --git 
>> a/ArmVirtPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf 
>> b/ArmVirtPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf
>> index f6a346d49f22..5374f1b9a369 100644
>> --- 
>> a/ArmVirtPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf
>> +++ 
>> b/ArmVirtPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf
>> @@ -23,7 +23,6 @@ [Defines]
>>    MODULE_TYPE                    = BASE
>>    VERSION_STRING                 = 1.0
>>    LIBRARY_CLASS                  = PciExpressLib|DXE_DRIVER UEFI_DRIVER 
>> UEFI_APPLICATION
>> -  CONSTRUCTOR                    = PciExpressLibInitialize
>>
>>  #
>>  #  VALID_ARCHITECTURES           = ARM AARCH64
>> diff --git a/ArmVirtPkg/Library/BaseCachingPciExpressLib/PciExpressLib.c 
>> b/ArmVirtPkg/Library/BaseCachingPciExpressLib/PciExpressLib.c
>> index 6479f53b3714..0ce6d118483b 100644
>> --- a/ArmVirtPkg/Library/BaseCachingPciExpressLib/PciExpressLib.c
>> +++ b/ArmVirtPkg/Library/BaseCachingPciExpressLib/PciExpressLib.c
>> @@ -68,18 +68,7 @@ PciExpressRegisterForRuntimeAccess (
>>    return RETURN_UNSUPPORTED;
>>  }
>>
>> -STATIC UINT64 mPciExpressBaseAddress;
>> -
>> -RETURN_STATUS
>> -EFIAPI
>> -PciExpressLibInitialize (
>> -  VOID
>> -  )
>> -{
>> -  mPciExpressBaseAddress = PcdGet64 (PcdPciExpressBaseAddress);
>> -  return RETURN_SUCCESS;
>> -}
>> -
>> +STATIC UINT64 mPciExpressBaseAddress = MAX_UINT64;
>>
>>  /**
>>    Gets the base address of PCI Express.
>> @@ -92,6 +81,9 @@ GetPciExpressBaseAddress (
>>    VOID
>>    )
>>  {
>> +  if (mPciExpressBaseAddress == MAX_UINT64) {
>> +    mPciExpressBaseAddress = PcdGet64 (PcdPciExpressBaseAddress);
>> +  }
>>    return (VOID*)(UINTN) mPciExpressBaseAddress;
>>  }
>>
>>
>
> I think this patch is not the right approach.
>
> I would like to preserve the ability to write a DXE_DRIVER that accesses
> PCI config space through this PciExpressLib instance, regardless of its
> own dispatch order against PciHostBridgeDxe.
>
> (Of course, given that PCI may not be available at all in the guest,
> such a DXE_DRIVER will have to check PCI presence explicitly in its
> entry point function, similarly to how PciHostBridgeDxe looks at
> PcdPciExpressBaseAddress at startup.)
>
> Therefore, I suggest the following:
>
> - In our DSC files, set PcdPciExpressBaseAddress to MAX_UINT64. This
>   value is never a valid MMCONFIG base address. It shall mean that
>   PcdPciExpressBaseAddress has not been detected yet.
>
>   We should continue to interpret the value 0 as "detected but
>   unavailable".
>
>   Any other value means "detected and available".
>
> - Please keep the structure of this library instance (constructor etc).
>   In the constructor, if the value of PcdPciExpressBaseAddress is not
>   MAX_UINT64, then assign it to mPciExpressBaseAddress, and return
>   immediately with success.
>
>   Otherwise, parse the DTB as minimally as possible, using the client
>   protocol (-> depex needed), just to determine the value of
>   PcdPciExpressBaseAddress. If PCI is present, set the PCD to
>   the (nonzero) base address. If PCI is absent (or there is some other
>   parse error), set the PCD to zero. Either way, set
>   mPciExpressBaseAddress to the same value, and then return with
>   success.
>
> For the next patch (i.e., PciHostBridgeDxe):
>
> - The PCI presence check should be preserved in PciHostBridgeDxe, in
>   the entry point function (PCD-based). This would (see above) consume
>   the product of our one library instance that is linked into
>   PciHostBridgeDxe itself, *or* into one of those future DXE_DRIVERs
>   that I mentioned above. Because PciHostBridgeDxe itself links against
>   the library, the PCD will never be MAX_UINT64, when the driver entry
>   point checks it.
>
> - If that check passes, then PciHostBridgeDxe should implement its own,
>   more complete FDT traversal (using the FDT client protocol), in order
>   to find all the other characteristics of the pci-host node that it
>   needs for operating.
>
> - Going forward, the PCDs (from ArmPkg) that are currently used for
>   communicating these "other characteristics" from VirtFdtDxe to
>   PciHostBridgeDxe should be eliminated from ArmVirtPkg.
>
> - Drop everything else too that becomes unused (to state the obvious).
>
> Do you agree?
>

Yes, that makes sense. I coded up the first part, which is
straightforward enough, but for the second part, I think it is better
to deal with the MAX_UINT64 case in the code as well. This way, the
module and the library are independent, and we don't ignore the 'reg'
property in the module, which is a bit strange as well considering
that we do consume the rest of the DT node,

Thanks,
Ard.
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to