From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) by mx.groups.io with SMTP id smtpd.web10.28888.1658982715514172969 for ; Wed, 27 Jul 2022 21:31:55 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20210112 header.b=nXcOrOwN; spf=pass (domain: gmail.com, ip: 209.85.214.170, mailfrom: kuqin12@gmail.com) Received: by mail-pl1-f170.google.com with SMTP id t2so790324ply.2 for ; Wed, 27 Jul 2022 21:31:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=jItLFD3g6YHSHujLR7CQiYuVP+oN4au1hqeoxqJBZxI=; b=nXcOrOwNiR8Qwn7dA+jUc93saB74q344kaAVBRF8PTzRNsrKJpoCuoDY/qFcB/KjLS D+9I+WDErtciD9mbttZN58slGmQoRd94bATEByETQABxmz+Di/HIPdb8EmuQHqcvOz4M Egz8bW+mcjzTp1itklSkTNU4Ljq0VqI7RscHpo1/yzAdo/g1mzJutVZDN2al6Tb/y3LY HqfIqCP+IZY635ZZVptaaaTlFTdwse1n+ZeKLSENyHGw02lQYsod992310/BUH2zJckP UYvnBU5CcGjENJSbkuhcCl4XcjwYK8Xi0QTFYhr7m/J5jdnO2w33wCLoZjlIFUEQNnT9 XAWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=jItLFD3g6YHSHujLR7CQiYuVP+oN4au1hqeoxqJBZxI=; b=UTSiv9/0AY4akx1yoLwQfZGLW3XJDPTw5WHanyXovZ3ad83MHM/gpDWZbsxj5ZoXYt wIfWoIETZP2T798RWL3FQjakqQyJYnh/Vmuhh8RKkmCEPT03ZFvYEpdv0NFudax0oW9r +7drjtWh+dD/l6baZ1KuKcRUdH/F2ruqSRPlvrpB7SgDdLGVlcaCuzrV88IJMNbePAw1 IVd3onRvhHdoUJNopnsFgPv+lG79Ti+VMxUGCBe3bbfFs96i0uw31oR0B0lswrUUevcP 8+qCYlYOFIhhBghw0Osd1CIR3NBRpjVzrh/lY/QD+ABDivmHZtXks4/TuSL9+YuhlIDw Tgmg== X-Gm-Message-State: AJIora/N2hTFD0BGlbb/42saaP/1Of2Ydgz1y0uoZm2tv/enFyD45C2H t0J8giZA1YlKyry+cVqF3BlKLjC7IYE= X-Google-Smtp-Source: AGRyM1u7+gY3YOREMkxECFnK8UtO16mMiq3LsIwyU6wacWW+3Sj2cm2LPaBL6FXjNzOFOPJN3w+uew== X-Received: by 2002:a17:902:e5c5:b0:16d:4a23:d0aa with SMTP id u5-20020a170902e5c500b0016d4a23d0aamr25129557plf.69.1658982714686; Wed, 27 Jul 2022 21:31:54 -0700 (PDT) Return-Path: Received: from MININT-0U7P5GU.redmond.corp.microsoft.com ([2001:4898:80e8:36:7fef:12fc:943:d465]) by smtp.gmail.com with ESMTPSA id ik1-20020a170902ab0100b0016c48c52ce4sm14716392plb.204.2022.07.27.21.31.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jul 2022 21:31:54 -0700 (PDT) From: "Kun Qin" To: devel@edk2.groups.io Cc: Joe Lopez Subject: [PATCH v2 5/6] DynamicTablesPkg: AcpiSsdtPcieLibArm: Added function to reserve ECAM space Date: Wed, 27 Jul 2022 21:31:46 -0700 Message-Id: <20220728043147.395-6-kuqin12@gmail.com> X-Mailer: git-send-email 2.37.1.windows.1 In-Reply-To: <20220728043147.395-1-kuqin12@gmail.com> References: <20220728043147.395-1-kuqin12@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3998 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 Signed-off-by: Kun Qin --- 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/SsdtPcieG= enerator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieG= enerator.c index ceffe2838c03..c03550baabf2 100644 --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieGenerato= r.c +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtPcieLibArm/SsdtPcieGenerato= r.c @@ -616,6 +616,167 @@ GeneratePciCrs ( return Status;=0D }=0D =0D +/** Generate a Pci Resource Template to hold Address Space Info=0D +=0D + @param [in] PciNode RootNode of the AML tree.=0D + @param [in, out] CrsNode CRS node of the AML tree to populate.=0D +=0D + @retval EFI_SUCCESS The function completed successfully.=0D + @retval EFI_INVALID_PARAMETER Invalid input parameter.=0D + @retval EFI_OUT_OF_RESOURCES Could not allocate memory.=0D +**/=0D +STATIC=0D +EFI_STATUS=0D +EFIAPI=0D +PopulateBasicPciResObjects (=0D + IN AML_OBJECT_NODE_HANDLE PciNode,=0D + IN OUT AML_OBJECT_NODE_HANDLE *CrsNode=0D + )=0D +{=0D + EFI_STATUS Status;=0D + UINT32 EisaId;=0D + AML_OBJECT_NODE_HANDLE ResNode;=0D +=0D + if (CrsNode =3D=3D NULL) {=0D + ASSERT (0);=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + // ASL: Device (PCIx) {}=0D + Status =3D AmlCodeGenDevice ("RES0", PciNode, &ResNode);=0D + if (EFI_ERROR (Status)) {=0D + ASSERT (0);=0D + return Status;=0D + }=0D +=0D + // ASL: Name (_HID, EISAID ("PNP0C02"))=0D + Status =3D AmlGetEisaIdFromString ("PNP0C02", &EisaId); /* PNP Motherboa= rd Resources */=0D + if (EFI_ERROR (Status)) {=0D + ASSERT (0);=0D + return Status;=0D + }=0D +=0D + Status =3D AmlCodeGenNameInteger ("_HID", EisaId, ResNode, NULL);=0D + if (EFI_ERROR (Status)) {=0D + ASSERT (0);=0D + return Status;=0D + }=0D +=0D + // ASL: Name (_CRS, ResourceTemplate () {})=0D + Status =3D AmlCodeGenNameResourceTemplate ("_CRS", ResNode, CrsNode);=0D + if (EFI_ERROR (Status)) {=0D + ASSERT (0);=0D + return Status;=0D + }=0D +=0D + return Status;=0D +}=0D +=0D +/** Generate a Pci Resource Template to hold Address Space Info=0D +=0D + @param [in] Generator The SSDT Pci generator.=0D + @param [in] CfgMgrProtocol Pointer to the Configuration Manager=0D + Protocol interface.=0D + @param [in] PciInfo Pci device information.=0D + @param [in, out] PciNode RootNode of the AML tree to populate.= =0D +=0D + @retval EFI_SUCCESS The function completed successfully.=0D + @retval EFI_INVALID_PARAMETER Invalid parameter.=0D + @retval EFI_OUT_OF_RESOURCES Could not allocate memory.=0D +**/=0D +STATIC=0D +EFI_STATUS=0D +EFIAPI=0D +GeneratePciRes (=0D + IN ACPI_PCI_GENERATOR *Generator,= =0D + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtoc= ol,=0D + IN CONST CM_ARM_PCI_CONFIG_SPACE_INFO *PciInfo,=0D + IN OUT AML_OBJECT_NODE_HANDLE PciNode=0D + )=0D +{=0D + EFI_STATUS Status;=0D + AML_OBJECT_NODE_HANDLE CrsNode;=0D + BOOLEAN Translation;=0D + UINT32 Index;=0D + CM_ARM_OBJ_REF *RefInfo;=0D + UINT32 RefCount;=0D + CM_ARM_PCI_ADDRESS_MAP_INFO *AddrMapInfo;=0D + BOOLEAN IsPosDecode;=0D +=0D + // Get the array of CM_ARM_OBJ_REF referencing the=0D + // CM_ARM_PCI_ADDRESS_MAP_INFO objects.=0D + Status =3D GetEArmObjCmRef (=0D + CfgMgrProtocol,=0D + PciInfo->AddressMapToken,=0D + &RefInfo,=0D + &RefCount=0D + );=0D + if (EFI_ERROR (Status)) {=0D + ASSERT (0);=0D + return Status;=0D + }=0D +=0D + for (Index =3D 0; Index < RefCount; Index++) {=0D + // Get CM_ARM_PCI_ADDRESS_MAP_INFO structures one by one.=0D + Status =3D GetEArmObjPciAddressMapInfo (=0D + CfgMgrProtocol,=0D + RefInfo[Index].ReferenceToken,=0D + &AddrMapInfo,=0D + NULL=0D + );=0D + if (EFI_ERROR (Status)) {=0D + ASSERT (0);=0D + return Status;=0D + }=0D +=0D + Translation =3D (AddrMapInfo->CpuAddress !=3D AddrMapInfo->PciAddress)= ;=0D + if (AddrMapInfo->CpuAddress >=3D AddrMapInfo->PciAddress) {=0D + IsPosDecode =3D TRUE;=0D + } else {=0D + IsPosDecode =3D FALSE;=0D + }=0D +=0D + switch (AddrMapInfo->SpaceCode) {=0D + case PCI_SS_CONFIG:=0D + Status =3D PopulateBasicPciResObjects (PciNode, &CrsNode);=0D + if (EFI_ERROR (Status)) {=0D + ASSERT (0);=0D + break;=0D + }=0D +=0D + Status =3D AmlCodeGenRdQWordMemory (=0D + FALSE,=0D + IsPosDecode,=0D + TRUE,=0D + TRUE,=0D + FALSE, // non-cacheable=0D + TRUE,=0D + 0,=0D + AddrMapInfo->PciAddress,=0D + AddrMapInfo->PciAddress + AddrMapInfo->AddressSize - 1,= =0D + Translation ? AddrMapInfo->CpuAddress - AddrMapInfo->Pc= iAddress : 0,=0D + AddrMapInfo->AddressSize,=0D + 0,=0D + NULL,=0D + 0,=0D + TRUE,=0D + CrsNode,=0D + NULL=0D + );=0D + break;=0D + default:=0D + break;=0D + } // switch=0D +=0D + if (EFI_ERROR (Status)) {=0D + ASSERT (0);=0D + return Status;=0D + }=0D + }=0D +=0D + return Status;=0D +}=0D +=0D /** Generate a Pci device.=0D =0D @param [in] Generator The SSDT Pci generator.=0D @@ -702,9 +863,17 @@ GeneratePciDevice ( return Status;=0D }=0D =0D + // Add the PNP Motherboard Resources Device to reserve ECAM space=0D + Status =3D GeneratePciRes (Generator, CfgMgrProtocol, PciInfo, PciNode);= =0D + if (EFI_ERROR (Status)) {=0D + ASSERT (0);=0D + return Status;=0D + }=0D +=0D // Add the template _OSC method.=0D Status =3D AddOscMethod (PciInfo, PciNode);=0D ASSERT_EFI_ERROR (Status);=0D +=0D return Status;=0D }=0D =0D --=20 2.37.1.windows.1