From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from EUR03-DB5-obe.outbound.protection.outlook.com (EUR03-DB5-obe.outbound.protection.outlook.com [40.107.4.84]) by mx.groups.io with SMTP id smtpd.web11.13566.1633533440352125419 for ; Wed, 06 Oct 2021 08:17:21 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=86iT4lCz; spf=pass (domain: arm.com, ip: 40.107.4.84, mailfrom: sami.mujawar@arm.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Rcpkbd67Rdm/EtktUowSxDmDn7j8CZ93u1bjD4U+coA=; b=86iT4lCzGAikDQ1U4e6nOVZHGzfW8Yky0bPQDfNs+B4hGUEgYCATbg6oR9AMJEA0Zf+JsUsCCfB/cdDLnSJEdadae7yTehDMN31XbFuqlCLp7XWBQR+FhuYsgLxAz2ABtWBYuRTBowwWr7z7fds+8r77DH5brkb5WPMQKskUAE0= Received: from AM5PR0602CA0022.eurprd06.prod.outlook.com (2603:10a6:203:a3::32) by DB6PR0801MB1688.eurprd08.prod.outlook.com (2603:10a6:4:3a::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4566.20; Wed, 6 Oct 2021 15:17:17 +0000 Received: from AM5EUR03FT046.eop-EUR03.prod.protection.outlook.com (2603:10a6:203:a3::4) by AM5PR0602CA0022.outlook.office365.com (2603:10a6:203:a3::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4566.14 via Frontend Transport; Wed, 6 Oct 2021 15:17:17 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; edk2.groups.io; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;edk2.groups.io; dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM5EUR03FT046.mail.protection.outlook.com (10.152.16.164) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4587.18 via Frontend Transport; Wed, 6 Oct 2021 15:17:16 +0000 Received: ("Tessian outbound 2e7020cc8961:v103"); Wed, 06 Oct 2021 15:17:16 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 848aa79e124e738b X-CR-MTA-TID: 64aa7808 Received: from 0d623a28d2f7.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id EFFDCB6B-3451-48B5-B023-E2C6362C3F86.1; Wed, 06 Oct 2021 15:17:09 +0000 Received: from EUR05-DB8-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 0d623a28d2f7.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Wed, 06 Oct 2021 15:17:09 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=B1lG95QHwJtiQaY0DNSdWltWJdf+Xb2Fxx0PePtqcogCCZ8Slkh1HogpwOEwYeuy7ABKCR5U3bYwZ9bYlHA27ys7u/nK3U6sZg8Pu4hUA4y6Ji9X6ydRlo5WkdKtQyOkVw8D+3OUx8/+xr2WoUfLPaBwNAUjxde+2alzpAcHZyQguG0Kc87ZdkWkH7vh8xUxDFTwPSMPo5Becm2tCKyV64jV8u0kL4wCPog2wLZZ5HlAasx+e67RjUwIOm9B+ZaUkREhEzYSkc235MeFvueFL6miGFOht1jGOH0LsuYdBAzDR19eY3oHht7KLTN1SghQFNEmP/eeK0iJaGGwHgeWEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Rcpkbd67Rdm/EtktUowSxDmDn7j8CZ93u1bjD4U+coA=; b=XigducC7iCp2Lb+ghDStPKHTvgXrITLNmgDBFh9CkBQ8jt826K/WYScs36thUiQiZhnYixIwFAPa3XKIOBMwEuickdNL59ccqRfbz8dkbbE3EXfpiABFWdmQSPZSfrmoUowWxQKjw2PP/qg3y9UcYitFTWKOYsNm6q9g/KQTkU4sO9PpVCEieAczABmHarTLfPko2IWEZWTufDn+CUQKUvpD9jpHwY8HyGKuKDI5qEURzLXE4gS5M0HvcWLwTD4WeW6XxuZ2PMgNqQdcfTKUU5/A7yXduD4gMfb8qaUAs8EpLBskLxh2OfgADslhKzAxa3iHO6uuenC79w5zBU0uaw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Rcpkbd67Rdm/EtktUowSxDmDn7j8CZ93u1bjD4U+coA=; b=86iT4lCzGAikDQ1U4e6nOVZHGzfW8Yky0bPQDfNs+B4hGUEgYCATbg6oR9AMJEA0Zf+JsUsCCfB/cdDLnSJEdadae7yTehDMN31XbFuqlCLp7XWBQR+FhuYsgLxAz2ABtWBYuRTBowwWr7z7fds+8r77DH5brkb5WPMQKskUAE0= Authentication-Results-Original: arm.com; dkim=none (message not signed) header.d=none;arm.com; dmarc=none action=none header.from=arm.com; Received: from AS8PR08MB6806.eurprd08.prod.outlook.com (2603:10a6:20b:39b::12) by AS8PR08MB6038.eurprd08.prod.outlook.com (2603:10a6:20b:23f::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4566.22; Wed, 6 Oct 2021 15:17:07 +0000 Received: from AS8PR08MB6806.eurprd08.prod.outlook.com ([fe80::54b5:239d:9896:ee65]) by AS8PR08MB6806.eurprd08.prod.outlook.com ([fe80::54b5:239d:9896:ee65%4]) with mapi id 15.20.4566.022; Wed, 6 Oct 2021 15:17:07 +0000 Subject: Re: [PATCH v1 4/7] DynamicTablesPkg: AML Code generation to add _PRT entries To: Pierre.Gondois@arm.com, devel@edk2.groups.io, Alexei Fedorov Cc: Akanksha Jain , Alexandru Elisei , nd References: <20210623115834.907-1-Pierre.Gondois@arm.com> <20210623115834.907-5-Pierre.Gondois@arm.com> From: "Sami Mujawar" Message-ID: <4b31d912-a6a5-a86a-e0df-55fc39a0299e@arm.com> Date: Wed, 6 Oct 2021 16:17:12 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.0.1 In-Reply-To: <20210623115834.907-5-Pierre.Gondois@arm.com> X-ClientProxiedBy: LNXP123CA0020.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:d2::32) To AS8PR08MB6806.eurprd08.prod.outlook.com (2603:10a6:20b:39b::12) MIME-Version: 1.0 Received: from [10.1.196.43] (217.140.106.52) by LNXP123CA0020.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:d2::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4566.15 via Frontend Transport; Wed, 6 Oct 2021 15:17:06 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 03d06bbb-0764-405b-7ad1-08d988dc6212 X-MS-TrafficTypeDiagnostic: AS8PR08MB6038:|DB6PR0801MB1688: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true NoDisclaimer: true X-MS-Oob-TLC-OOBClassifiers: OLM:3826;OLM:3826; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: zNDumAvaQR2V6yVzJ0FvgDO0LrNsqtpeNxtv0KnYUgmnAVxtO2Sd/Nr9DYG9+URwlsNy/jfpXMtGCoGkhrI9kkwn0jdwNpYluh5EwRiFOhOvDUrgZAGQajLTkwzi/vwRvLhaJv3zM84IOmiWatrX9iZp5s3dJZ3Nz5TYtG3zkTcJHMx4Cq3jjpzJO7giekq3jkF61U66DNoNvGX52wsGOEM5QGvja9QuP8ngKP+kl4/utdk49+aGyrHMX7EtdWYrY1iEGrTsQ9N8U+e0RY9pQx++49+z202s6NbphM4/QRf/7x7WClQNon8vU0F9Y5lXvcDovu1qdZibL2zL7Qwgv7TZ2BlL0kP/nG5IV0lA6EVPmGz7G4Fbl0T9FteVAtC1vKDIB0tDCNMoC8IKkvMrkm+v5Kkc2pgDNc3UJuguGO8FLpqBFZXxockVYsL5rI4ObPQnwQEE0HB/rQ7nPPJDHvFv5YY/3c+/6GIXsjChpkqJTRmxnCoI/+9J0dVY2pZmmKVfmKg9EaLnpeW2HRslu1P9mbRgWgYSvS1rKVip50M4vpdh+Exx7olE0R7qAn6bvOm3hqskdTbs8gnzse5by2veMyP5FtZCxH3ZL9HVyitdJkvsEWfwx76KMfBAMEsW+QUrWnsffhbdrNcDYWlXaJSp/l2M6sLWU1pPXHSprK8AL7yiJoyFlRID0LoZhL/3JoexiG5UjTCPpMB/2T4skb+R7XRc0ajOJB1Gld6+BSvD45CLdk9HDRvhnX1o8kLXMjyZqsvtGD9CXY/1u9NBeQ== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR08MB6806.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(366004)(66556008)(6666004)(19627235002)(66946007)(26005)(8936002)(53546011)(38350700002)(66476007)(4326008)(186003)(38100700002)(508600001)(54906003)(31686004)(5660300002)(2616005)(956004)(6862004)(2906002)(16576012)(44832011)(8676002)(316002)(52116002)(6636002)(37006003)(83380400001)(36756003)(6486002)(86362001)(31696002)(43740500002)(45980500001);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB6038 Original-Authentication-Results: arm.com; dkim=none (message not signed) header.d=none;arm.com; dmarc=none action=none header.from=arm.com; Return-Path: Sami.Mujawar@arm.com X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM5EUR03FT046.eop-EUR03.prod.protection.outlook.com X-MS-Office365-Filtering-Correlation-Id-Prvs: 0191798d-b5de-4d89-afce-08d988dc5c16 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: siZZTs2gG/76zbX/mQvXeyET3oX+XmZqFSGqppCvd6mlhF/octYnFUze3npfxaClVmlNdaAoc1MnI5ngPkqhu87morkkczh7QRmWE+6EGwqnZ7Cv7oQjYW9qyhzKaMbgYHb2gfTaKFI8Ay2qsxKA4pv5YVfG5fY6VnQPzITj5XlMe4lFHHZ2xoAik6tdNiFA8SNgs0pf7hiWO0YGoiQHxqzeBCkCquYwwkBjgfVj9A/puyqtFbXxpKTa7ZjuLvEW2JtLCE0hxrnM2rDVkN75/kQBOqoWo3925keNWZFPXpHjs3vUX4Y57jtTfbtxZfcGnnT/k+h9DHiJHhV+BWcmVrBh1oSRj6im7cRUxcHKVfoZ0aNeci/YzNo5Plcsb5XKw3cEXrXrrfoeT51jlHzONxWR8lKfEZUUzMDZGRFqJq1+5NzZKKlfNUJk4DcSv0JXkqc8yJWix4v29NKyqgqvg5jc4aTzkFaMkPSQ5xrOrJR71WZavBoRACNPVlpzgoQUiFCH34WVj1926w9GWObjwyJ+kGjDg7FHW8Krtw2y3y2rbVJOmmAWBcZAwG52uwjUAbrhVfN4ynUfDWviiXCZk5l/0DwbDbFD2BYxLtYjiRCXAlTsHYib2UecVVdD2hz2TFeLTRUjJEpHZMRQR1UXuC88A7lyxH+iJ3HxF31+5dH68oM1WxDjmPlOEEmQoI6444DZpJ1oHuoCQRt8DSRW5ovE4HTdJsmDvyt/vT0jyKw= X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(4636009)(36840700001)(46966006)(356005)(36860700001)(16576012)(81166007)(2906002)(316002)(186003)(82310400003)(508600001)(19627235002)(31686004)(336012)(54906003)(86362001)(956004)(2616005)(37006003)(47076005)(83380400001)(26005)(70586007)(44832011)(4326008)(36756003)(70206006)(8936002)(53546011)(6862004)(6666004)(8676002)(5660300002)(6486002)(31696002)(6636002)(43740500002);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Oct 2021 15:17:16.8467 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 03d06bbb-0764-405b-7ad1-08d988dc6212 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: AM5EUR03FT046.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0801MB1688 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-GB Hi Pierre, Thank you for this patch. Reviewed-by: Sami Mujawar Regards, Sami Mujawar On 23/06/2021 12:58 PM, Pierre.Gondois@arm.com wrote: > From: Pierre Gondois > > _PRT entries can describe interrupt mapping for Pci devices. The > object is described in ACPI 6.4 s6.2.13 "_PRT (PCI Routing Table)". > > Add AmlCodeGenPrtEntry() helper function to add _PRT entries > to an existing _PRT object. > > Signed-off-by: Pierre Gondois > --- > .../Include/Library/AmlLib/AmlLib.h | 52 +++++ > .../Common/AmlLib/CodeGen/AmlCodeGen.c | 210 ++++++++++++++++++ > 2 files changed, 262 insertions(+) > > diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h > index 544bc670c455..4a10da8cd7bb 100644 > --- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h > +++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h > @@ -908,6 +908,58 @@ AmlCodeGenNameResourceTemplate ( > OUT AML_OBJECT_NODE_HANDLE * NewObjectNode OPTIONAL > ); > > +/** Add a _PRT entry. > + > + AmlCodeGenPrtEntry (0x0FFFF, 0, "LNKA", 0, PrtNameNode) is > + equivalent of the following ASL code: > + Package (4) { > + 0x0FFFF, // Address: Device address (([Device Id] << 16) | 0xFFFF). > + 0, // Pin: PCI pin number of the device (0-INTA, ...). > + LNKA // Source: Name of the device that allocates the interrupt > + // to which the above pin is connected. > + 0 // Source Index: Source is assumed to only describe one > + // interrupt, so let it to index 0. > + } > + > + The package is added at the tail of the list of the input _PRT node > + name: > + Name (_PRT, Package () { > + [Pre-existing _PRT entries], > + [Newly created _PRT entry] > + }) > + > + Cf. ACPI 6.4, s6.2.13 "_PRT (PCI Routing Table)" > + > + @ingroup CodeGenApis > + > + @param [in] Address Address. Cf ACPI 6.4 specification, Table 6.2: > + "ADR Object Address Encodings": > + High word-Device #, Low word-Function #. (for > + example, device 3, function 2 is 0x00030002). > + To refer to all the functions on a device #, > + use a function number of FFFF). > + @param [in] Pin PCI pin number of the device (0-INTA ... 3-INTD). > + Must be between 0-3. > + @param [in] LinkName Link Name, i.e. device in the AML NameSpace > + describing the interrupt used. > + The input string is copied. > + @param [in] SourceIndex Source index or GSIV. > + @param [in] PrtNameNode Prt Named node to add the object to .... > + > + @retval EFI_SUCCESS Success. > + @retval EFI_INVALID_PARAMETER Invalid parameter. > + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > +**/ > +EFI_STATUS > +EFIAPI > +AmlAddPrtEntry ( > + IN UINT32 Address, > + IN UINT8 Pin, > + IN CONST CHAR8 * LinkName, > + IN UINT32 SourceIndex, > + IN AML_OBJECT_NODE_HANDLE PrtNameNode > + ); > + > /** AML code generation for a Device object node. > > AmlCodeGenDevice ("COM0", ParentNode, NewObjectNode) is > diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c > index eaa49a5834c2..9bf4e110d05c 100644 > --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c > +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c > @@ -857,6 +857,216 @@ AmlCodeGenNameResourceTemplate ( > return Status; > } > > +/** Add a _PRT entry. > + > + AmlCodeGenPrtEntry (0x0FFFF, 0, "LNKA", 0, PrtNameNode) is > + equivalent of the following ASL code: > + Package (4) { > + 0x0FFFF, // Address: Device address (([Device Id] << 16) | 0xFFFF). > + 0, // Pin: PCI pin number of the device (0-INTA, ...). > + LNKA // Source: Name of the device that allocates the interrupt > + // to which the above pin is connected. > + 0 // Source Index: Source is assumed to only describe one > + // interrupt, so let it to index 0. > + } > + > + The package is added at the tail of the list of the input _PRT node > + name: > + Name (_PRT, Package () { > + [Pre-existing _PRT entries], > + [Newly created _PRT entry] > + }) > + > + Cf. ACPI 6.4 specification: > + - s6.2.13 "_PRT (PCI Routing Table)" > + - s6.1.1 "_ADR (Address)" > + > + @param [in] Address Address. Cf ACPI 6.4 specification, Table 6.2: > + "ADR Object Address Encodings": > + High word-Device #, Low word-Function #. (for > + example, device 3, function 2 is 0x00030002). > + To refer to all the functions on a device #, > + use a function number of FFFF). > + @param [in] Pin PCI pin number of the device (0-INTA ... 3-INTD). > + Must be between 0-3. > + @param [in] LinkName Link Name, i.e. device in the AML NameSpace > + describing the interrupt used. > + The input string is copied. > + @param [in] SourceIndex Source index or GSIV. > + @param [in] PrtNameNode Prt Named node to add the object to .... > + > + @retval EFI_SUCCESS Success. > + @retval EFI_INVALID_PARAMETER Invalid parameter. > + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > +**/ > +EFI_STATUS > +EFIAPI > +AmlAddPrtEntry ( > + IN UINT32 Address, > + IN UINT8 Pin, > + IN CONST CHAR8 * LinkName, > + IN UINT32 SourceIndex, > + IN AML_OBJECT_NODE_HANDLE PrtNameNode > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_NODE * PrtEntryList; > + AML_OBJECT_NODE * PackageNode; > + AML_OBJECT_NODE * NewElementNode; > + > + CHAR8 * AmlNameString; > + UINT32 AmlNameStringSize; > + AML_DATA_NODE * DataNode; > + > + if ((Pin > 3) || > + (LinkName == NULL) || > + (PrtNameNode == NULL) || > + (AmlGetNodeType ((AML_NODE_HANDLE)PrtNameNode) != EAmlNodeObject) || > + (!AmlNodeHasOpCode (PrtNameNode, AML_NAME_OP, 0)) || > + !AmlNameOpCompareName (PrtNameNode, "_PRT")) { > + ASSERT (0); > + return EFI_INVALID_PARAMETER; > + } > + > + NewElementNode = NULL; > + AmlNameString = NULL; > + DataNode = NULL; > + > + // Get the Package object node of the _PRT node, > + // which is the 2nd fixed argument (i.e. index 1). > + PrtEntryList = (AML_OBJECT_NODE_HANDLE)AmlGetFixedArgument ( > + PrtNameNode, > + EAmlParseIndexTerm1 > + ); > + if ((PrtEntryList == NULL) || > + (AmlGetNodeType ((AML_NODE_HANDLE)PrtEntryList) != EAmlNodeObject) || > + (!AmlNodeHasOpCode (PrtEntryList, AML_PACKAGE_OP, 0))) { > + ASSERT (0); > + return EFI_INVALID_PARAMETER; > + } > + > + // The new _PRT entry. > + Status = AmlCodeGenPackage (&PackageNode); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + return Status; > + } > + > + Status = AmlCodeGenInteger (Address, &NewElementNode); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler; > + } > + > + Status = AmlVarListAddTail ( > + (AML_NODE_HANDLE)PackageNode, > + (AML_NODE_HANDLE)NewElementNode > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler; > + } > + > + NewElementNode = NULL; > + > + Status = AmlCodeGenInteger (Pin, &NewElementNode); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler; > + } > + > + Status = AmlVarListAddTail ( > + (AML_NODE_HANDLE)PackageNode, > + (AML_NODE_HANDLE)NewElementNode > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler; > + } > + > + NewElementNode = NULL; > + > + Status = ConvertAslNameToAmlName (LinkName, &AmlNameString); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler; > + } > + > + Status = AmlGetNameStringSize (AmlNameString, &AmlNameStringSize); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler; > + } > + > + Status = AmlCreateDataNode ( > + EAmlNodeDataTypeNameString, > + (UINT8*)AmlNameString, > + AmlNameStringSize, > + &DataNode > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler; > + } > + > + // AmlNameString will be freed before returning. > + > + Status = AmlVarListAddTail ( > + (AML_NODE_HANDLE)PackageNode, > + (AML_NODE_HANDLE)DataNode > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler; > + } > + > + DataNode = NULL; > + > + Status = AmlCodeGenInteger (SourceIndex, &NewElementNode); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler; > + } > + > + Status = AmlVarListAddTail ( > + (AML_NODE_HANDLE)PackageNode, > + (AML_NODE_HANDLE)NewElementNode > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler; > + } > + > + // Append to the the list of _PRT entries. > + Status = AmlVarListAddTail ( > + (AML_NODE_HANDLE)PrtEntryList, > + (AML_NODE_HANDLE)PackageNode > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler; > + } > + > + // Free AmlNameString before returning as it is copied > + // in the call to AmlCreateDataNode(). > + goto exit_handler; > + > +error_handler: > + AmlDeleteTree ((AML_NODE_HANDLE)PackageNode); > + if (NewElementNode != NULL) { > + AmlDeleteTree ((AML_NODE_HANDLE)NewElementNode); > + } > + if (DataNode != NULL) { > + AmlDeleteTree ((AML_NODE_HANDLE)DataNode); > + } > + > +exit_handler: > + if (AmlNameString != NULL) { > + FreePool (AmlNameString); > + } > + return Status; > +} > + > /** AML code generation for a Device object node. > > AmlCodeGenDevice ("COM0", ParentNode, NewObjectNode) is