[edk2-devel] [PATCH v2 5/6] DynamicTablesPkg: AcpiSsdtPcieLibArm: Added function to reserve ECAM space
Kun Qin
kuqin12 at gmail.com
Fri Jul 29 05:01:50 UTC 2022
Hi Pierre,
Thank you for the suggestions. I will update the patch per your feedback and
send for review in v3.
Regards,
Kun
On 7/28/2022 6:07 AM, Pierre Gondois wrote:
> Hello Kun,
> With the changes below:
> Reviewed-by: Pierre Gondois <pierre.gondois at arm.com>
>
> Thanks!
>
>
> On 7/28/22 06:31, Kun Qin via groups.io wrote:
>> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3998
>>
>> Certain OSes will complain if the ECAM config space is not reserved in
>> the ACPI namespace.
>>
>> This change adds a function to reserve PNP motherboard resources for a
>> given PCI node.
>>
>> Co-authored-by: Joe Lopez <joelopez at microsoft.com>
>> Signed-off-by: Kun Qin <kuqin12 at gmail.com>
>> ---
>>
>> Notes:
>> v2:
>> - Only create RES0 after config space checking [Pierre]
>>
>> DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieGenerator.c
>> | 169 ++++++++++++++++++++
>> 1 file changed, 169 insertions(+)
>>
>> diff --git
>> a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieGenerator.c
>> b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieGenerator.c
>>
>> index ceffe2838c03..c03550baabf2 100644
>> ---
>> a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieGenerator.c
>> +++
>> b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieGenerator.c
>> @@ -616,6 +616,167 @@ GeneratePciCrs (
>> return Status;
>> }
>> +/** Generate a Pci Resource Template to hold Address Space Info
>> +
>> + @param [in] PciNode RootNode of the AML tree.
>> + @param [in, out] CrsNode CRS node of the AML tree to populate.
>
> I think CrsNode is an 'out' only parameter. Also the description of
> PciNode
> seems incorrect.
>
>> +
>> + @retval EFI_SUCCESS The function completed successfully.
>> + @retval EFI_INVALID_PARAMETER Invalid input parameter.
>> + @retval EFI_OUT_OF_RESOURCES Could not allocate memory.
>> +**/
>> +STATIC
>> +EFI_STATUS
>> +EFIAPI
>> +PopulateBasicPciResObjects (
>
> Would it be possible to rename it:
> GenerateMotherboardDevice()
> or with a name related to 'motherboard' ?
>
>> + IN AML_OBJECT_NODE_HANDLE PciNode,
>> + IN OUT AML_OBJECT_NODE_HANDLE *CrsNode
>> + )
>> +{
>> + EFI_STATUS Status;
>> + UINT32 EisaId;
>> + AML_OBJECT_NODE_HANDLE ResNode;
>> +
>> + if (CrsNode == NULL) {
>> + ASSERT (0);
>> + return EFI_INVALID_PARAMETER;
>> + }
>> +
>> + // ASL: Device (PCIx) {}
>> + Status = AmlCodeGenDevice ("RES0", PciNode, &ResNode);
>> + if (EFI_ERROR (Status)) {
>> + ASSERT (0);
>> + return Status;
>> + }
>> +
>> + // ASL: Name (_HID, EISAID ("PNP0C02"))
>> + Status = AmlGetEisaIdFromString ("PNP0C02", &EisaId); /* PNP
>> Motherboard Resources */
>> + if (EFI_ERROR (Status)) {
>> + ASSERT (0);
>> + return Status;
>> + }
>> +
>> + Status = AmlCodeGenNameInteger ("_HID", EisaId, ResNode, NULL);
>> + if (EFI_ERROR (Status)) {
>> + ASSERT (0);
>> + return Status;
>> + }
>> +
>> + // ASL: Name (_CRS, ResourceTemplate () {})
>> + Status = AmlCodeGenNameResourceTemplate ("_CRS", ResNode, CrsNode);
>> + if (EFI_ERROR (Status)) {
>> + ASSERT (0);
>> + return Status;
>> + }
>> +
>> + return Status;
>> +}
>> +
>> +/** Generate a Pci Resource Template to hold Address Space Info
>> +
>> + @param [in] Generator The SSDT Pci generator.
>> + @param [in] CfgMgrProtocol Pointer to the Configuration
>> Manager
>> + Protocol interface.
>> + @param [in] PciInfo Pci device information.
>> + @param [in, out] PciNode RootNode of the AML tree to
>> populate.
>> +
>> + @retval EFI_SUCCESS The function completed successfully.
>> + @retval EFI_INVALID_PARAMETER Invalid parameter.
>> + @retval EFI_OUT_OF_RESOURCES Could not allocate memory.
>> +**/
>> +STATIC
>> +EFI_STATUS
>> +EFIAPI
>> +GeneratePciRes (
>
> Would it be possible to rename it:
> ReserveEcamSpace()
> or with a name related to 'ecam' ?
>
>
>> + IN ACPI_PCI_GENERATOR *Generator,
>> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST
>> CfgMgrProtocol,
>> + IN CONST CM_ARM_PCI_CONFIG_SPACE_INFO *PciInfo,
>> + IN OUT AML_OBJECT_NODE_HANDLE PciNode
>> + )
>> +{
>> + EFI_STATUS Status;
>> + AML_OBJECT_NODE_HANDLE CrsNode;
>> + BOOLEAN Translation;
>> + UINT32 Index;
>> + CM_ARM_OBJ_REF *RefInfo;
>> + UINT32 RefCount;
>> + CM_ARM_PCI_ADDRESS_MAP_INFO *AddrMapInfo;
>> + BOOLEAN IsPosDecode;
>> +
>> + // Get the array of CM_ARM_OBJ_REF referencing the
>> + // CM_ARM_PCI_ADDRESS_MAP_INFO objects.
>> + Status = GetEArmObjCmRef (
>> + CfgMgrProtocol,
>> + PciInfo->AddressMapToken,
>> + &RefInfo,
>> + &RefCount
>> + );
>> + if (EFI_ERROR (Status)) {
>> + ASSERT (0);
>> + return Status;
>> + }
>> +
>> + for (Index = 0; Index < RefCount; Index++) {
>> + // Get CM_ARM_PCI_ADDRESS_MAP_INFO structures one by one.
>> + Status = GetEArmObjPciAddressMapInfo (
>> + CfgMgrProtocol,
>> + RefInfo[Index].ReferenceToken,
>> + &AddrMapInfo,
>> + NULL
>> + );
>> + if (EFI_ERROR (Status)) {
>> + ASSERT (0);
>> + return Status;
>> + }
>> +
>> + Translation = (AddrMapInfo->CpuAddress != AddrMapInfo->PciAddress);
>> + if (AddrMapInfo->CpuAddress >= AddrMapInfo->PciAddress) {
>> + IsPosDecode = TRUE;
>> + } else {
>> + IsPosDecode = FALSE;
>> + }
>
> I think this should be done in:
> case PCI_SS_CONFIG:
> to only do it when necessary.
>
>> +
>> + switch (AddrMapInfo->SpaceCode) {
>> + case PCI_SS_CONFIG:
>> + Status = PopulateBasicPciResObjects (PciNode, &CrsNode);
>> + if (EFI_ERROR (Status)) {
>> + ASSERT (0);
>> + break;
>> + }
>> +
>> + Status = AmlCodeGenRdQWordMemory (
>> + FALSE,
>> + IsPosDecode,
>> + TRUE,
>> + TRUE,
>> + FALSE, // non-cacheable
>> + TRUE,
>> + 0,
>> + AddrMapInfo->PciAddress,
>> + AddrMapInfo->PciAddress +
>> AddrMapInfo->AddressSize - 1,
>> + Translation ? AddrMapInfo->CpuAddress -
>> AddrMapInfo->PciAddress : 0,
>> + AddrMapInfo->AddressSize,
>> + 0,
>> + NULL,
>> + 0,
>> + TRUE,
>> + CrsNode,
>> + NULL
>> + );
>> + break;
>> + default:
>> + break;
>> + } // switch
>> +
>> + if (EFI_ERROR (Status)) {
>> + ASSERT (0);
>> + return Status;
>> + }
>> + }
>> +
>> + return Status;
>> +}
>> +
>> /** Generate a Pci device.
>> @param [in] Generator The SSDT Pci generator.
>> @@ -702,9 +863,17 @@ GeneratePciDevice (
>> return Status;
>> }
>> + // Add the PNP Motherboard Resources Device to reserve ECAM space
>> + Status = GeneratePciRes (Generator, CfgMgrProtocol, PciInfo,
>> PciNode);
>> + if (EFI_ERROR (Status)) {
>> + ASSERT (0);
>> + return Status;
>> + }
>> +
>> // Add the template _OSC method.
>> Status = AddOscMethod (PciInfo, PciNode);
>> ASSERT_EFI_ERROR (Status);
>> +
>> return Status;
>> }
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#91963): https://edk2.groups.io/g/devel/message/91963
Mute This Topic: https://groups.io/mt/92664649/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-
More information about the edk2-devel-archive
mailing list