From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mx.groups.io with SMTP id smtpd.web09.28647.1658979004270402433 for ; Wed, 27 Jul 2022 20:30:04 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=cpoUg/nB; spf=pass (domain: intel.com, ip: 134.134.136.24, mailfrom: hao.a.wu@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1658979004; x=1690515004; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=kkCuT9rb8D3I5wpgN5aRLIpvTVh4CZ1RvPaGrRTroeM=; b=cpoUg/nBwQTBAqdtyVzAGWgBv6p+GJMuiyi0Lkzl+piOUx5UH4mPKzAi O0e+bc6zcg2svDgisAcAnNaXZpeOcPDPkubwODE60ZVUJ9zizIHCR0bI0 kDOE+aCHJrcGhfrhmFo4tn3gYvOOVkt1XNJHEyWXm8h8W6GjCGoeBSTAJ jzPuKOfxB5S5rl0bBXyBx+3P50pLuuGQ628JTig9T4oamDtSGsjT1enMG BrPlmiyOQ1uquOJOy/yT73rPNIqu+PXdzADm/wBL/YN6shlWHIrE858XM POwpqhrzKDXlOCfOasfl6+KVWljU45zga9jfZFKxTIZycPhHrU/09ulL9 g==; X-IronPort-AV: E=McAfee;i="6400,9594,10421"; a="289178769" X-IronPort-AV: E=Sophos;i="5.93,196,1654585200"; d="scan'208";a="289178769" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jul 2022 20:30:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,196,1654585200"; d="scan'208";a="928069325" Received: from orsmsx603.amr.corp.intel.com ([10.22.229.16]) by fmsmga005.fm.intel.com with ESMTP; 27 Jul 2022 20:30:02 -0700 Received: from orsmsx610.amr.corp.intel.com (10.22.229.23) by ORSMSX603.amr.corp.intel.com (10.22.229.16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.28; Wed, 27 Jul 2022 20:30:02 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by orsmsx610.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.28 via Frontend Transport; Wed, 27 Jul 2022 20:30:02 -0700 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (104.47.55.104) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2375.28; Wed, 27 Jul 2022 20:30:00 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=O0NTqlDJOTtdBVFbcBFdKo5mduPg2ikTtj2nHMS03gdAyIRbwh3dmj9aqVvtqCq6SRQVVAT3yXU/3ulZBNTq0aWcLBD/1c2fm637Ep1VD9Sba8MKwLQHmGw0iLs2MeKl6frVHmv6VBrciXTcc4BP+Gg/0S930JHsRSxe9mBJbwNFbVlwo1fN7/j6RPl63MM8PYN15hmwHQb3wStA588bfpkLv8L6krW75ujnzE+V8r8PvPS1xgLr1+hKK0B7NXCcLWP4IdhA0TPAbCl5J72a4kMjTOZPwzd+iuUn8j4e/bamIQeSLqjq/wYISpzoFtlxYChs8nXoO2zWOl5OdxfRoA== 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=yiO67TprHGgZWZVL1HkD5h9ln6AfC6e3GgVvgbXeqPs=; b=izQrKV+TKiJJIlS3+6JSzRrvflrFezqaJ+JJynr74L0obiOIM68pu+wvHGxSxmiE/frrRehAmj2xCz8aUpM9/XQYTh8tNsrBXcInHqhJQDIMfETwsnHm8pyt0fzmjMe2rnpBQaSwZFRdUBAjZNvsfo9TWBgd4t9TWCcd20TgFUXg7idqpdsTHGZW6OUpg2WqD1mzrVFWZTbjaYdPOEd1Ytfg8DJN/XtVIVq53KKlRGbWx53vPj79ljySgt/w4N+f1tAcIi5cl6zjCXuvQzUio+yTNH49NuYXRUJ24L0C5s1uLy+d9iFOaEVmWrygkpnADCZ/4MUbGTa5B5ujci/zjg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from DM6PR11MB4025.namprd11.prod.outlook.com (2603:10b6:5:197::31) by BYAPR11MB3686.namprd11.prod.outlook.com (2603:10b6:a03:fc::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5458.18; Thu, 28 Jul 2022 03:29:57 +0000 Received: from DM6PR11MB4025.namprd11.prod.outlook.com ([fe80::e9b3:7cad:874e:77f]) by DM6PR11MB4025.namprd11.prod.outlook.com ([fe80::e9b3:7cad:874e:77f%7]) with mapi id 15.20.5458.025; Thu, 28 Jul 2022 03:29:57 +0000 From: "Wu, Hao A" To: "Czajkowski, Maciej" , "devel@edk2.groups.io" CC: "Ni, Ray" , "Gao, Liming" Subject: Re: [PATCH v2 2/2] MdeModulePkg/AhciPei: Use PCI_DEVICE_PPI to manage AHCI device Thread-Topic: [PATCH v2 2/2] MdeModulePkg/AhciPei: Use PCI_DEVICE_PPI to manage AHCI device Thread-Index: AQHYobRKYfwov/OA9EynI50oRBpGqa2S/4Eg Date: Thu, 28 Jul 2022 03:29:57 +0000 Message-ID: References: <20220727122733.2251-1-maciej.czajkowski@intel.com> <20220727122733.2251-3-maciej.czajkowski@intel.com> In-Reply-To: <20220727122733.2251-3-maciej.czajkowski@intel.com> Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-reaction: no-action dlp-version: 11.5.1.3 authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 93694c3f-eaae-4ca7-7360-08da704971fa x-ms-traffictypediagnostic: BYAPR11MB3686:EE_ x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: gL1B0Pzb9r6s63o9M+gum3TbD/Gc3BIWd0r9+hkr968CKf4pADs8+DCitLoViIo1yoCh6yukUYglRLvLkZHi2NolUnPp2oJcPa39/2481E8ClUSCpBKkL2yZZ7bNbn9KSQjF7C2FWofIsfNPU4y5qygX7iIPaOgnKkwmMl8TqXyZBkWE+ZOqyEMYSlRvrswDEKVcCAppSpULaHucbrYVCHh7NyoVmhil9euzcIDkjm3olsMCCRgqF1tBwBGm0CDXFCnxVNifxFFrH/YF54GlWymLL4ML1nzOgoNm+hkyX5v5plrVVfB4+ou0dNHFfQfpU4aQyoBVP1II780JtCu1iyToEYblQdBL3NUMAU9er1WBzuHBdI1reUPxr4x4QkoGBpAEP0dLPgQLPSmrkiTsjhdOB5MEFN3O9QBkZ1D4Y6VH0m9VyLt5G4SlBSp56Hl+XnCg9pD8ktTKi5S/TktiLmBFLtT/uGx/wZKrVAoeB1D7Azbu8nFS16fp9LqOZpCz85fZuhoHqXvi4i9GG9zAJep68+VK7j6y+N/jtdcEwM51WYRjuSbcKeOenWHsjBHp/1eM4Xo2Y+JNVW/SMTyQZqOXnaFF+7cko7dSMcJNRc2Lwo29ZNTFpYlCQBDkgVtQb7avF5Q+99EeU+RnRqyWQrHeD2Z6BV0v1fhUxGwYpF+ALJ3wfCcsdtFyXa4XAQyECpnVc4SoTajT2iS0PBJyin9ijDs1FB5ptSG4I3nYf53Rwjc2BkzSUeK1mOVy/CAxgGl4QuEcQkDwEc+CoqCc3k9fmZoHRGM6nict0J3aBWWnkrj8dapg+a/MhdqHfT8670n3XyPCasKPfKaCX9sv0A== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR11MB4025.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(376002)(39860400002)(136003)(396003)(346002)(366004)(316002)(38070700005)(66946007)(38100700002)(86362001)(966005)(33656002)(66446008)(66556008)(19627235002)(76116006)(4326008)(54906003)(66476007)(122000001)(110136005)(478600001)(71200400001)(5660300002)(64756008)(82960400001)(6506007)(7696005)(53546011)(8676002)(186003)(30864003)(9686003)(26005)(2906002)(83380400001)(52536014)(41300700001)(55016003)(8936002)(559001)(579004);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?YmsDp6Nx6wJE0l8D/eC93Sns7fDhIC8BqmSyYfsK/Hcs5Rlxqv/eSGxF6EEf?= =?us-ascii?Q?bzKKTxvTE3yoOamQA0Zk+b3JURrsm8uQGEfF+8uJ2SYdxDNwM/8s8QVDGZ7R?= =?us-ascii?Q?2VHui/Zqagy6nKsJw6i2bFBEjT0hfnEGUGB+JXb2TqBaM1QeXh9Np0XRB5GY?= =?us-ascii?Q?tlyBZtJIjY/KpYaLxIwHison3XkJbvgcAS93E9bUs53eoIN2G5uq2V53MMDE?= =?us-ascii?Q?fLMVhiWg8neIeV8qYR/iQ+pfFb+KqA7B5UTSQRIFf5T2xYoVpCIY5I0c1mFZ?= =?us-ascii?Q?7ILmGfm1oia/mImtubUJsrX/d3Ep8TRPsp2rS3ZkHEZf6U7MrBsYvSRQ4snU?= =?us-ascii?Q?bAnw6YD8R80Jk4AC2cyduOn+Dx/uE+wbT42YH9s8pBjoPO7swtus7yZaDmCQ?= =?us-ascii?Q?QPnS6Xwi62VNoypNDhoD+LblVfXFiXsL9SOnLS3JIIm7tRqO3Gk+zXuU20Vb?= =?us-ascii?Q?IMHhwAMApq9HEUHfexJC/VawgGFKJFF9+o6lV5SbnVuZPltTcoc4lc272fOn?= =?us-ascii?Q?sAUs/1fdjovBxzDFUbdYJd3I1AyFzkZauTv/LglsWMh4AFHpKCwGQGQg1BVN?= =?us-ascii?Q?xi4YCeYdQ3YcVQCu1b6OQjZnj7qXHveUbA5kYxjUaACxmLeB5owx+kkEGosE?= =?us-ascii?Q?WJLU5jyCJK/rXFqyAJJi/F1qnM148ejZDFXM8OTv006FBqfQIvPRXUBAndX5?= =?us-ascii?Q?deVElwZKpQHNSH6+S5WMWUccO3tiyMQT1/oKzoGauTs/5VZ9pIVHohQOAyKp?= =?us-ascii?Q?Q6ZQd52S3gqQTd7CiZ96xIYoCYXQm6nDibA7YMZLVvqJXHsJK0QQONb+ba4V?= =?us-ascii?Q?BTnlJ3kogMQVEHDWy9o/f46SvVJbLLgv3M+OaRFkr8kk7Faj0YGtHyMhaw8V?= =?us-ascii?Q?r9pqGJlSvEFAX7IpZgro0yLeyakTocBde5tiR1irjJoV7ll+mRUTNa42/+Z/?= =?us-ascii?Q?c064jUzSEklJcHMzK6ZTnvrooJvn0cENY9MteZAQT81Nb0cNhVCHq2ZcgiHt?= =?us-ascii?Q?1+lyycwQ0/3V/v+TwzIevKZe2BUZXwLj2J7/OQNuf58BiKekRInY3e7LB1c1?= =?us-ascii?Q?G2EnkszEU6NBAnXxX8H5O+PUAWDCfDil2++j4VKDtJgJmJwDkwK20NVWTbea?= =?us-ascii?Q?kYWpa7CuRQkl+j9HWcRWAT5otL9r1+1bw6/cmfHr9hfIOVaz+TclnFgyXNph?= =?us-ascii?Q?uGpncgj2rqTFKZO+qEagJLpRvOaTssX5R6hIU3c0spksqMj0yfRpm08X/04M?= =?us-ascii?Q?ccctPouRBSDXTzzkBHl0e6T5ep1dr1KqVTZrqr/kCWo7Kliy9CqRRsMskDy9?= =?us-ascii?Q?fJpr1fsgkc/D2UvoJ7zuIuasT5DrqItSjfj2ldAmwg4XMUqGREG3Je25h5Io?= =?us-ascii?Q?/3SXF9fMo5wqc2ROyyja+crq9vN5r/YvAHpa8TOZIC9w+QLMr8EoJXPv4SCW?= =?us-ascii?Q?rUE5ThRgG/ECcUd6dyIvtd1u8cskymkHZc7dZWa+DcdjTNA1CwCAMF366BaN?= =?us-ascii?Q?Q9GiRPXqyT2M9eXCh89f2ZHFCroYAb2ip5xV8L5y07zqTeyU4A0WH5KTz43M?= =?us-ascii?Q?+GjYTpgU3L/GpwT4iZYp+67qYHWz9S91I3/dN3na?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM6PR11MB4025.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 93694c3f-eaae-4ca7-7360-08da704971fa X-MS-Exchange-CrossTenant-originalarrivaltime: 28 Jul 2022 03:29:57.2727 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: /5GQoZdjuVv8oDqhhji6CQiF4PAwnO2GTfiw2JO4Z7swAZL4UavSt0DHvhLEZi6bauce7MfmKKAhSCL3hSmA3A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR11MB3686 Return-Path: hao.a.wu@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable 1. In the AHCI PEIM entrypoint, after registering the PPI callbacks for: * gEdkiiPeiAtaAhciHostControllerPpiGuid and * gEdkiiPeiPciDevicePpiGuid My take is that there is no need to locate above PPI instances already inst= alled within system (codes in entry point that come after the callback regi= stration). The current implementation of PeiServicesNotifyPpi (details can be referred= at MdeModulePkg\Core\Pei\Ppi\Ppi.c - InternalPeiNotifyPpi) will invoke the= callback functions for all the matched PPI instances already installed. Could you help to double confirm on this in your unit test? Sorry for missi= ng this on the V1 patch. 2. Please help to move the function declaration for: AtaAhciHostControllerPpiInstallationCallback() AtaAhciPciDevicePpiInstallationCallback() from AhciPei.c to AhciPei.h to keep consistency. 3. The function description comments for: AtaAhciHostControllerPpiInstallationCallback() AtaAhciPciDevicePpiInstallationCallback() do not exactly match between their declaration and definition. 4. During the enabling of the HC in function AtaAhciInitPrivateDataFromPciD= evice(): Status =3D PciDevice->PciIo.Attributes ( &PciDevice->PciIo, EfiPciIoAttributeOperationSet, EFI_PCI_DEVICE_ENABLE, NULL ); Could you help to update the flow to align with AtaAtapiPassThru DXE counte= rpart when enabling the controller? MdeModulePkg\Bus\Ata\AtaAtapiPassThru\AtaAtapiPassThru.c - AtaAtapiPassThru= Start(): Status =3D PciIo->Attributes ( PciIo, EfiPciIoAttributeOperationSupported, 0, &EnabledPciAttributes ); if (!EFI_ERROR (Status)) { EnabledPciAttributes &=3D (UINT64)EFI_PCI_DEVICE_ENABLE; Status =3D PciIo->Attributes ( PciIo, EfiPciIoAttributeOperationEnable, EnabledPciAttributes, NULL ); } 5. DEBUG ((DEBUG_ERROR, "%a: Using AtaAhciHostControllerPpi to initialize p= rivate data.\n", __FUNCTION__)); -> DEBUG ((DEBUG_INFO, "%a: Using AtaAhciHostControllerPpi to initialize pr= ivate data.\n", __FUNCTION__)); 6. I think for AtaAhciInitPrivateDataFromPciDevices(), the below code snipp= et: // // Override the status to continue the for loop // Status =3D EFI_SUCCESS; is no longer needed. Could you help to check? Best Regards, Hao Wu > -----Original Message----- > From: Czajkowski, Maciej > Sent: Wednesday, July 27, 2022 8:28 PM > To: devel@edk2.groups.io > Cc: Wu, Hao A ; Ni, Ray ; Gao, > Liming > Subject: [PATCH v2 2/2] MdeModulePkg/AhciPei: Use PCI_DEVICE_PPI to > manage AHCI device >=20 > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3907 >=20 > This change modifies AhciPei library to allow usage both > EDKII_PCI_DEVICE_PPI and EDKII_PEI_ATA_AHCI_HOST_CONTROLLER_PPI > to manage ATA HDD working under AHCI mode. >=20 > Cc: Hao A Wu > Cc: Ray Ni > Cc: Liming Gao > Signed-off-by: Maciej Czajkowski > --- >=20 > Notes: > v2 changes: > - added missing function descriptions > - moved controller initialization from PCI_DEVICE_PPI to seperate fun= citon > in order to reduce code duplication > - added DevicePathLib BASE instance to the MdeModulePkg.dec to allow > PEIMs to consume it >=20 > MdeModulePkg/Bus/Ata/AhciPei/AhciPei.c | 585 ++++++++++++++------ > MdeModulePkg/Bus/Ata/AhciPei/DevicePath.c | 44 -- > MdeModulePkg/Bus/Ata/AhciPei/AhciPei.h | 17 +- > MdeModulePkg/Bus/Ata/AhciPei/AhciPei.inf | 5 +- > MdeModulePkg/MdeModulePkg.dsc | 1 + > 5 files changed, 430 insertions(+), 222 deletions(-) >=20 > diff --git a/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.c > b/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.c > index 208b7e9a3606..8ad98dc76bc1 100644 > --- a/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.c > +++ b/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.c > @@ -9,6 +9,47 @@ > **/ #include "AhciPei.h"+#include +#include > +#include ++/**+ > Callback for EDKII_ATA_AHCI_HOST_CONTROLLER_PPI installation.++ > @param[in] PeiServices Pointer to PEI Services Table.+ @param[in= ] > NotifyDescriptor Pointer to the descriptor for the Notification+ > event that caused this function to execute.+ @param[in] Ppi = Pointer > to the PPI data associated with this function.++ @retval EFI_SUCCESS = The > function completes > successfully++**/+EFI_STATUS+EFIAPI+AtaAhciHostControllerPpiInstallation > Callback (+ IN EFI_PEI_SERVICES **PeiServices,+ IN > EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,+ IN VOID > *Ppi+ );++/**+ Callback for EDKII_PCI_DEVICE_PPI installation.++ > @param[in] PeiServices Pointer to PEI Services Table.+ @param[in= ] > NotifyDescriptor Pointer to the descriptor for the Notification+ > event that caused this function to execute.+ @param[in] Ppi = Pointer > to the PPI data associated with this function.++ @retval EFI_SUCCESS = The > function completes > successfully++**/+EFI_STATUS+EFIAPI+AtaAhciPciDevicePpiInstallationCallb > ack (+ IN EFI_PEI_SERVICES **PeiServices,+ IN > EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,+ IN VOID > *Ppi+ ); EFI_PEI_PPI_DESCRIPTOR mAhciAtaPassThruPpiListTemplate =3D > { (EFI_PEI_PPI_DESCRIPTOR_PPI | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),@@ -40,6 +81,18 @@ > EFI_PEI_NOTIFY_DESCRIPTOR mAhciEndOfPeiNotifyListTemplate =3D { > AhciPeimEndOfPei }; +EFI_PEI_NOTIFY_DESCRIPTOR > mAtaAhciHostControllerNotify =3D {+ > (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),+ > &gEdkiiPeiAtaAhciHostControllerPpiGuid,+ > AtaAhciHostControllerPpiInstallationCallback+};++EFI_PEI_NOTIFY_DESCRIPT > OR mPciDevicePpiNotify =3D {+ (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK > | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),+ > &gEdkiiPeiPciDevicePpiGuid,+ AtaAhciPciDevicePpiInstallationCallback+};+ > /** Free the DMA resources allocated by an ATA AHCI controller. @@ - > 111,33 +164,30 @@ AhciPeimEndOfPei ( > } /**- Entry point of the PEIM.+ Initialize and install PrivateData P= PIs. - > @param[in] FileHandle Handle of the file being invoked.- @param[in] > PeiServices Describes the list of possible PEI Services.-- @retval > EFI_SUCCESS PPI successfully installed.+ @param[in] MmioBase > MMIO base address of specific AHCI controller+ @param[in] DevicePath > A pointer to the EFI_DEVICE_PATH_PROTOCOL+ = structure.+ > @param[in] DevicePathLength Length of the device path. + @retval > EFI_SUCCESS AHCI controller initialized and PPIs installed+ @retval oth= ers > Failed to initialize AHCI controller **/ EFI_STATUS-EFIAPI-AtaAhciPeimEnt= ry > (- IN EFI_PEI_FILE_HANDLE FileHandle,- IN CONST EFI_PEI_SERVICES > **PeiServices+AtaAhciInitPrivateData (+ IN UINTN Mmi= oBase,+ > IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,+ IN UINTN > DevicePathLength ) {- EFI_STATUS Status;- EF= I_BOOT_MODE > BootMode;- EDKII_ATA_AHCI_HOST_CONTROLLER_PPI *AhciHcPpi;- UINT8 > Controller;- UINTN MmioBase;- UINTN > DevicePathLength;- EFI_DEVICE_PATH_PROTOCOL *DevicePath;- > UINT32 PortBitMap;- PEI_AHCI_CONTROLLER_PRI= VATE_DATA > *Private;- UINT8 NumberOfPorts;+ EFI_STAT= US > Status;+ UINT32 PortBitMap;+ UINT8 > NumberOfPorts;+ PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;+ > EFI_BOOT_MODE BootMode; - DEBUG ((DEBUG_INFO, "%a: > Enters.\n", __FUNCTION__));+ DEBUG ((DEBUG_INFO, "Initializing private > data for ATA\n")); // // Get the current boot mode.@@ -149,19 +199,1= 49 > @@ AtaAhciPeimEntry ( > } //- // Locate the ATA AHCI host controller PPI.- //- Status = =3D > PeiServicesLocatePpi (- &gEdkiiPeiAtaAhciHostControllerPpiGui= d,- > 0,- NULL,- (VOID **)&AhciHcPpi- );+ = // Check validity of > the device path of the ATA AHCI controller.+ //+ Status =3D > AhciIsHcDevicePathValid (DevicePath, DevicePathLength);+ if (EFI_ERROR > (Status)) {+ DEBUG ((+ DEBUG_ERROR,+ "%a: The device path is > invalid.\n",+ __FUNCTION__+ ));+ return Status;+ }++ //+ = // For S3 > resume performance consideration, not all ports on an ATA AHCI+ // > controller will be enumerated/initialized. The driver consumes the+ // > content within S3StorageDeviceInitList LockBox to get the ports that+ //= will > be enumerated/initialized during S3 resume.+ //+ if (BootMode =3D=3D > BOOT_ON_S3_RESUME) {+ NumberOfPorts =3D AhciS3GetEumeratePorts > (DevicePath, DevicePathLength, &PortBitMap);+ if (NumberOfPorts =3D=3D= 0) > {+ return EFI_SUCCESS;+ }+ } else {+ PortBitMap =3D MAX_UINT3= 2;+ }++ > //+ // Memory allocation for controller private data.+ //+ Private =3D > AllocateZeroPool (sizeof (PEI_AHCI_CONTROLLER_PRIVATE_DATA));+ if > (Private =3D=3D NULL) {+ DEBUG ((+ DEBUG_ERROR,+ "%a: Fail t= o allocate > private data.\n",+ __FUNCTION__+ ));+ return > EFI_OUT_OF_RESOURCES;+ }++ //+ // Initialize controller private data.+= //+ > Private->Signature =3D > AHCI_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE;+ Private->MmioBase > =3D MmioBase;+ Private->DevicePathLength =3D DevicePathLength;+ Private= - > >DevicePath =3D DevicePath;+ Private->PortBitMap =3D PortBit= Map;+ > InitializeListHead (&Private->DeviceList);++ Status =3D AhciModeInitiali= zation > (Private); if (EFI_ERROR (Status)) {- DEBUG ((DEBUG_ERROR, "%a: Fail= ed to > locate AtaAhciHostControllerPpi.\n", __FUNCTION__));- return > EFI_UNSUPPORTED;+ return Status;+ }++ Private- > >AtaPassThruMode.Attributes =3D > EFI_ATA_PASS_THRU_ATTRIBUTES_PHYSICAL |+ > EFI_ATA_PASS_THRU_ATTRIBUTES_LOGICAL;+ Private- > >AtaPassThruMode.IoAlign =3D sizeof (UINTN);+ Private- > >AtaPassThruPpi.Revision =3D EDKII_PEI_ATA_PASS_THRU_PPI_REVISION;+ > Private->AtaPassThruPpi.Mode =3D &Private->AtaPassThruMode;+ > Private->AtaPassThruPpi.PassThru =3D AhciAtaPassThruPassThru;+ Priv= ate- > >AtaPassThruPpi.GetNextPort =3D AhciAtaPassThruGetNextPort;+ Private- > >AtaPassThruPpi.GetNextDevice =3D AhciAtaPassThruGetNextDevice;+ > Private->AtaPassThruPpi.GetDevicePath =3D AhciAtaPassThruGetDevicePath;+ > CopyMem (+ &Private->AtaPassThruPpiList,+ > &mAhciAtaPassThruPpiListTemplate,+ sizeof > (EFI_PEI_PPI_DESCRIPTOR)+ );+ Private->AtaPassThruPpiList.Ppi =3D > &Private->AtaPassThruPpi;+ PeiServicesInstallPpi (&Private- > >AtaPassThruPpiList);++ Private->BlkIoPpi.GetNumberOfBlockDevices =3D > AhciBlockIoGetDeviceNo;+ Private->BlkIoPpi.GetBlockDeviceMediaInfo =3D > AhciBlockIoGetMediaInfo;+ Private->BlkIoPpi.ReadBlocks =3D > AhciBlockIoReadBlocks;+ CopyMem (+ &Private->BlkIoPpiList,+ > &mAhciBlkIoPpiListTemplate,+ sizeof (EFI_PEI_PPI_DESCRIPTOR)+ );+ > Private->BlkIoPpiList.Ppi =3D &Private->BlkIoPpi;+ PeiServicesInstallPpi > (&Private->BlkIoPpiList);++ Private->BlkIo2Ppi.Revision = =3D > EFI_PEI_RECOVERY_BLOCK_IO2_PPI_REVISION;+ Private- > >BlkIo2Ppi.GetNumberOfBlockDevices =3D AhciBlockIoGetDeviceNo2;+ > Private->BlkIo2Ppi.GetBlockDeviceMediaInfo =3D AhciBlockIoGetMediaInfo2;+ > Private->BlkIo2Ppi.ReadBlocks =3D AhciBlockIoReadBlocks2;+ = CopyMem > (+ &Private->BlkIo2PpiList,+ &mAhciBlkIo2PpiListTemplate,+ sizeo= f > (EFI_PEI_PPI_DESCRIPTOR)+ );+ Private->BlkIo2PpiList.Ppi =3D &Private= - > >BlkIo2Ppi;+ PeiServicesInstallPpi (&Private->BlkIo2PpiList);++ if (Pri= vate- > >TrustComputingDevices !=3D 0) {+ DEBUG ((+ DEBUG_INFO,+ "%a= : > Security Security Command PPI will be produced.\n",+ > __FUNCTION__+ ));+ Private->StorageSecurityPpi.Revision = =3D > EDKII_STORAGE_SECURITY_PPI_REVISION;+ Private- > >StorageSecurityPpi.GetNumberofDevices =3D > AhciStorageSecurityGetDeviceNo;+ Private- > >StorageSecurityPpi.GetDevicePath =3D > AhciStorageSecurityGetDevicePath;+ Private- > >StorageSecurityPpi.ReceiveData =3D AhciStorageSecurityReceiveData= ;+ > Private->StorageSecurityPpi.SendData =3D > AhciStorageSecuritySendData;+ CopyMem (+ &Private- > >StorageSecurityPpiList,+ &mAhciStorageSecurityPpiListTemplate,+ > sizeof (EFI_PEI_PPI_DESCRIPTOR)+ );+ Private- > >StorageSecurityPpiList.Ppi =3D &Private->StorageSecurityPpi;+ > PeiServicesInstallPpi (&Private->StorageSecurityPpiList); } + CopyMem = (+ > &Private->EndOfPeiNotifyList,+ &mAhciEndOfPeiNotifyListTemplate,+ > sizeof (EFI_PEI_NOTIFY_DESCRIPTOR)+ );+ PeiServicesNotifyPpi (&Privat= e- > >EndOfPeiNotifyList);++ return EFI_SUCCESS;+}++/**+ Initialize AHCI > controller from EDKII_ATA_AHCI_HOST_CONTROLLER_PPI instance.++ > @param[in] AhciHcPpi Pointer to the AHCI Host Controller PPI instance.++ > @retval EFI_SUCCESS PPI successfully > installed.+**/+EFI_STATUS+AtaAhciInitPrivateDataFromHostControllerPpi (+ > IN EDKII_ATA_AHCI_HOST_CONTROLLER_PPI *AhciHcPpi+ )+{+ UINT8 > Controller;+ UINTN MmioBase;+ UINTN > DevicePathLength;+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;+ > EFI_STATUS Status;+ Controller =3D 0; MmioBase =3D 0= ; while (TRUE) > {@@ -193,65 +373,7 @@ AtaAhciPeimEntry ( > return Status; } - //- // Check validity of the device p= ath of the ATA > AHCI controller.- //- Status =3D AhciIsHcDevicePathValid (DevicePat= h, > DevicePathLength);- if (EFI_ERROR (Status)) {- DEBUG ((- > DEBUG_ERROR,- "%a: The device path is invalid for Controller %d.\n= ",- > __FUNCTION__,- Controller- ));- Controller++;- co= ntinue;- }-- > //- // For S3 resume performance consideration, not all ports on an AT= A > AHCI- // controller will be enumerated/initialized. The driver consume= s the- > // content within S3StorageDeviceInitList LockBox to get the ports that- = // > will be enumerated/initialized during S3 resume.- //- if (BootMode = =3D=3D > BOOT_ON_S3_RESUME) {- NumberOfPorts =3D AhciS3GetEumeratePorts > (DevicePath, DevicePathLength, &PortBitMap);- if (NumberOfPorts =3D= =3D 0) > {- //- // No ports need to be enumerated for this controlle= r.- //- > Controller++;- continue;- }- } else {- PortBitMap =3D= MAX_UINT32;- > }-- //- // Memory allocation for controller private data.- /= /- Private =3D > AllocateZeroPool (sizeof (PEI_AHCI_CONTROLLER_PRIVATE_DATA));- if > (Private =3D=3D NULL) {- DEBUG ((- DEBUG_ERROR,- "%a: = Fail to allocate > private data for Controller %d.\n",- __FUNCTION__,- Control= ler- > ));- return EFI_OUT_OF_RESOURCES;- }-- //- // Initi= alize controller > private data.- //- Private->Signature =3D > AHCI_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE;- Private->MmioBase > =3D MmioBase;- Private->DevicePathLength =3D DevicePathLength;- Pri= vate- > >DevicePath =3D DevicePath;- Private->PortBitMap =3D PortB= itMap;- > InitializeListHead (&Private->DeviceList);-- Status =3D AhciModeInitia= lization > (Private);+ Status =3D AtaAhciInitPrivateData (MmioBase, DevicePath, > DevicePathLength); if (EFI_ERROR (Status)) { DEBUG > (( DEBUG_ERROR,@@ -260,86 +382,229 @@ AtaAhciPeimEntry ( > Controller, Status ));- Controller++;- = continue;- }-- > Private->AtaPassThruMode.Attributes =3D > EFI_ATA_PASS_THRU_ATTRIBUTES_PHYSICAL |- > EFI_ATA_PASS_THRU_ATTRIBUTES_LOGICAL;- Private- > >AtaPassThruMode.IoAlign =3D sizeof (UINTN);- Private- > >AtaPassThruPpi.Revision =3D EDKII_PEI_ATA_PASS_THRU_PPI_REVISION;- > Private->AtaPassThruPpi.Mode =3D &Private->AtaPassThruMode;- > Private->AtaPassThruPpi.PassThru =3D AhciAtaPassThruPassThru;- Pr= ivate- > >AtaPassThruPpi.GetNextPort =3D AhciAtaPassThruGetNextPort;- Private= - > >AtaPassThruPpi.GetNextDevice =3D AhciAtaPassThruGetNextDevice;- > Private->AtaPassThruPpi.GetDevicePath =3D AhciAtaPassThruGetDevicePath;- > CopyMem (- &Private->AtaPassThruPpiList,- > &mAhciAtaPassThruPpiListTemplate,- sizeof (EFI_PEI_PPI_DESCRIPTOR)- > );- Private->AtaPassThruPpiList.Ppi =3D &Private->AtaPassThruPpi= ;- > PeiServicesInstallPpi (&Private->AtaPassThruPpiList);-- Private- > >BlkIoPpi.GetNumberOfBlockDevices =3D AhciBlockIoGetDeviceNo;- Private= - > >BlkIoPpi.GetBlockDeviceMediaInfo =3D AhciBlockIoGetMediaInfo;- Privat= e- > >BlkIoPpi.ReadBlocks =3D AhciBlockIoReadBlocks;- CopyMem = (- > &Private->BlkIoPpiList,- &mAhciBlkIoPpiListTemplate,- sizeof > (EFI_PEI_PPI_DESCRIPTOR)- );- Private->BlkIoPpiList.Ppi =3D &Priv= ate- > >BlkIoPpi;- PeiServicesInstallPpi (&Private->BlkIoPpiList);-- Priva= te- > >BlkIo2Ppi.Revision =3D > EFI_PEI_RECOVERY_BLOCK_IO2_PPI_REVISION;- Private- > >BlkIo2Ppi.GetNumberOfBlockDevices =3D AhciBlockIoGetDeviceNo2;- > Private->BlkIo2Ppi.GetBlockDeviceMediaInfo =3D AhciBlockIoGetMediaInfo2;- > Private->BlkIo2Ppi.ReadBlocks =3D AhciBlockIoReadBlocks2;- = CopyMem > (- &Private->BlkIo2PpiList,- &mAhciBlkIo2PpiListTemplate,- = sizeof > (EFI_PEI_PPI_DESCRIPTOR)- );- Private->BlkIo2PpiList.Ppi =3D &Pri= vate- > >BlkIo2Ppi;- PeiServicesInstallPpi (&Private->BlkIo2PpiList);-- if = (Private- > >TrustComputingDevices !=3D 0) {+ } else { DEBUG (( DEBU= G_INFO,- > "%a: Security Security Command PPI will be produced for Controller %d.\n"= ,+ > "%a: Controller %d has been successfully initialized.\n", __FUNCT= ION__, > Controller ));- Private->StorageSecurityPpi.Revision = =3D > EDKII_STORAGE_SECURITY_PPI_REVISION;- Private- > >StorageSecurityPpi.GetNumberofDevices =3D > AhciStorageSecurityGetDeviceNo;- Private- > >StorageSecurityPpi.GetDevicePath =3D > AhciStorageSecurityGetDevicePath;- Private- > >StorageSecurityPpi.ReceiveData =3D AhciStorageSecurityReceiveData= ;- > Private->StorageSecurityPpi.SendData =3D AhciStorageSecuritySen= dData;- > CopyMem (- &Private->StorageSecurityPpiList,- > &mAhciStorageSecurityPpiListTemplate,- sizeof > (EFI_PEI_PPI_DESCRIPTOR)- );- Private->StorageSecurityPpiList= .Ppi =3D > &Private->StorageSecurityPpi;- PeiServicesInstallPpi (&Private- > >StorageSecurityPpiList); } - CopyMem (- &Private- > >EndOfPeiNotifyList,- &mAhciEndOfPeiNotifyListTemplate,- sizeof > (EFI_PEI_NOTIFY_DESCRIPTOR)- );- PeiServicesNotifyPpi (&Private- > >EndOfPeiNotifyList);-- DEBUG ((- DEBUG_INFO,- "%a: Controll= er %d > has been successfully initialized.\n",- __FUNCTION__,- Controll= er- )); > Controller++; } return EFI_SUCCESS; }++/**+ Callback for > EDKII_ATA_AHCI_HOST_CONTROLLER_PPI installation.++ @param[in] > PeiServices Pointer to PEI Services Table.+ @param[in] NotifyDes= criptor > Pointer to the descriptor for the Notification+ = event that > caused this function to execute.+ @param[in] Ppi Pointer= to the PPI > data associated with this function.++ @retval EFI_SUCCESS The > function completes successfully+ @retval Others Cannot i= nitialize > AHCI controller for given > device+**/+EFI_STATUS+EFIAPI+AtaAhciHostControllerPpiInstallationCallbac > k (+ IN EFI_PEI_SERVICES **PeiServices,+ IN > EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,+ IN VOID > *Ppi+ )+{+ EDKII_ATA_AHCI_HOST_CONTROLLER_PPI *AhciHcPpi;++ if (Ppi > =3D=3D NULL) {+ return EFI_INVALID_PARAMETER;+ }++ AhciHcPpi =3D > (EDKII_ATA_AHCI_HOST_CONTROLLER_PPI *)Ppi;++ return > AtaAhciInitPrivateDataFromHostControllerPpi (AhciHcPpi);+}++/**+ Initial= ize > AHCI controller from fiven PCI_DEVICE_PPI.++ @param[in] PciDevice > Pointer to the PCI Device PPI instance.++ @retval EFI_SUCCESS The > function completes successfully+ @retval Others Cannot initial= ize AHCI > controller for given > device+**/+EFI_STATUS+AtaAhciInitPrivateDataFromPciDevice (+ > EDKII_PCI_DEVICE_PPI *PciDevice+ )+{+ EFI_STATUS Status= ;+ > PCI_TYPE00 PciData;+ UINTN MmioBase;+ > EFI_DEVICE_PATH_PROTOCOL *DevicePath;+ UINTN > DevicePathLength;++ //+ // Now further check the PCI header: Base Class > (offset 0x0B) and+ // Sub Class (offset 0x0A). This controller should be= an > SATA controller+ //+ Status =3D PciDevice->PciIo.Pci.Read (+ > &PciDevice->PciIo,+ EfiPciIoWidthUint8,+ > PCI_CLASSCODE_OFFSET,+ sizeof (PciData.H= dr.ClassCode),+ > PciData.Hdr.ClassCode+ );+ if (EFI_ERRO= R (Status)) {+ > return EFI_UNSUPPORTED;+ }++ if (!IS_PCI_IDE (&PciData) > && !IS_PCI_SATADPA (&PciData)) {+ return EFI_UNSUPPORTED;+ }++ > Status =3D PciDevice->PciIo.Attributes (+ &P= ciDevice->PciIo,+ > EfiPciIoAttributeOperationSet,+ EFI_PCI_DEVI= CE_ENABLE,+ > NULL+ );+ if (EFI_ERROR (Status)) {+ ret= urn > EFI_UNSUPPORTED;+ }++ Status =3D PciDevice->PciIo.Pci.Read (+ > &PciDevice->PciIo,+ EfiPciIoWidthUint32,= + > 0x24,+ sizeof (UINTN),+ > &MmioBase+ );+ if (EFI_ERROR (Status)) = {+ return > EFI_UNSUPPORTED;+ }++ DevicePathLength =3D GetDevicePathSize > (PciDevice->DevicePath);+ DevicePath =3D PciDevice->DevicePath;++ > Status =3D AtaAhciInitPrivateData (MmioBase, DevicePath, > DevicePathLength);+ if (EFI_ERROR (Status)) {+ DEBUG ((+ > DEBUG_INFO,+ "%a: Failed to init controller, with Status - %r\n",+ > __FUNCTION__,+ Status+ ));+ }++ return EFI_SUCCESS;+}++/**+ > Callback for EDKII_PCI_DEVICE_PPI installation.++ @param[in] PeiServices > Pointer to PEI Services Table.+ @param[in] NotifyDescriptor Pointer t= o the > descriptor for the Notification+ event th= at caused this > function to execute.+ @param[in] Ppi Pointer to the PPI = data > associated with this function.++ @retval EFI_SUCCESS The func= tion > completes successfully+ @retval Others Cannot initialize= AHCI > controller for given > device+**/+EFI_STATUS+EFIAPI+AtaAhciPciDevicePpiInstallationCallback (+ > IN EFI_PEI_SERVICES **PeiServices,+ IN EFI_PEI_NOTIFY_DESCRIPT= OR > *NotifyDescriptor,+ IN VOID *Ppi+ )+{+ EDKII_PCI= _DEVICE_PPI > *PciDevice;++ PciDevice =3D (EDKII_PCI_DEVICE_PPI *)Ppi;++ return > AtaAhciInitPrivateDataFromPciDevice (PciDevice);+}++/**+ Initialize AHCI > controller from EDKII_ATA_AHCI_HOST_CONTROLLER_PPI instances found in > the system.++ @retval EFI_SUCCESS The function completes > successfully+**/+EFI_STATUS+AtaAhciInitPrivateDataFromPciDevices (+ > VOID+ )+{+ EFI_STATUS Status;+ UINTN Contro= llerIndex;+ > EDKII_PCI_DEVICE_PPI *PciDevice;++ Status =3D EFI_SUCCESS;+ for > (ControllerIndex =3D 0; Status !=3D EFI_NOT_FOUND; ControllerIndex++) {+ > Status =3D PeiServicesLocatePpi (+ &gEdkiiPeiPciDevicePpiGu= id,+ > ControllerIndex,+ NULL,+ (VOID **)&PciDevice+= );+ if > (EFI_ERROR (Status)) {+ continue;+ }++ > AtaAhciInitPrivateDataFromPciDevice (PciDevice);++ //+ // Override = the > status to continue the for loop+ //+ Status =3D EFI_SUCCESS;+ }++ = return > EFI_SUCCESS;+}++/**+ Entry point of the PEIM.++ @param[in] FileHandle > Handle of the file being invoked.+ @param[in] PeiServices Describes t= he > list of possible PEI Services.++ @retval EFI_SUCCESS PPI successfully > installed.++**/+EFI_STATUS+EFIAPI+AtaAhciPeimEntry (+ IN > EFI_PEI_FILE_HANDLE FileHandle,+ IN CONST EFI_PEI_SERVICES > **PeiServices+ )+{+ EFI_STATUS Status;+ > EDKII_ATA_AHCI_HOST_CONTROLLER_PPI *AhciHcPpi;++ DEBUG > ((DEBUG_INFO, "%a: Enters.\n", __FUNCTION__));++ PeiServicesNotifyPpi > (&mAtaAhciHostControllerNotify);++ PeiServicesNotifyPpi > (&mPciDevicePpiNotify);++ AtaAhciInitPrivateDataFromPciDevices ();++ //= + > // Locate the ATA AHCI host controller PPI.+ //+ Status =3D > PeiServicesLocatePpi (+ &gEdkiiPeiAtaAhciHostControllerPpiGui= d,+ > 0,+ NULL,+ (VOID **)&AhciHcPpi+ );+ = if (!EFI_ERROR > (Status)) {+ DEBUG ((DEBUG_ERROR, "%a: Using AtaAhciHostControllerPpi > to initialize private data.\n", __FUNCTION__));+ Status =3D > AtaAhciInitPrivateDataFromHostControllerPpi (AhciHcPpi);+ }++ return > Status;+}diff --git a/MdeModulePkg/Bus/Ata/AhciPei/DevicePath.c > b/MdeModulePkg/Bus/Ata/AhciPei/DevicePath.c > index 81f8743d40d8..cf0955929dde 100644 > --- a/MdeModulePkg/Bus/Ata/AhciPei/DevicePath.c > +++ b/MdeModulePkg/Bus/Ata/AhciPei/DevicePath.c > @@ -38,50 +38,6 @@ EFI_DEVICE_PATH_PROTOCOL > mAhciEndDevicePathNodeTemplate =3D { > } }; -/**- Returns the 16-bit Length field of a device path node.-- = Returns > the 16-bit Length field of the device path node specified by Node.- Node= is > not required to be aligned on a 16-bit boundary, so it is recommended- t= hat > a function such as ReadUnaligned16() be used to extract the contents of- > the Length field.-- If Node is NULL, then ASSERT().-- @param Node = A > pointer to a device path node data structure.-- @return The 16-bit Lengt= h > field of the device path node specified by Node.--**/-UINTN- > DevicePathNodeLength (- IN CONST VOID *Node- )-{- ASSERT (Node !=3D > NULL);- return ReadUnaligned16 ((UINT16 > *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0]);-}--/**- Returns > a pointer to the next node in a device path.-- If Node is NULL, then > ASSERT().-- @param Node A pointer to a device path node data structu= re.- > - @return a pointer to the device path node that follows the device path > node- specified by Node.--**/-EFI_DEVICE_PATH_PROTOCOL *- > NextDevicePathNode (- IN CONST VOID *Node- )-{- ASSERT (Node !=3D > NULL);- return (EFI_DEVICE_PATH_PROTOCOL *)((UINT8 *)(Node) + > DevicePathNodeLength (Node));-}- /** Get the size of the current device > path instance. diff --git a/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.h > b/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.h > index 43ad4639bd77..7332c4051a0c 100644 > --- a/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.h > +++ b/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.h > @@ -29,6 +29,7 @@ > #include #include #include > +#include // // Structure > forward declarations@@ -631,22 +632,6 @@ TrustTransferAtaDevice ( > OUT UINTN *TransferLengthOut ); -/**- Return= s a pointer to > the next node in a device path.-- If Node is NULL, then ASSERT().-- @pa= ram > Node A pointer to a device path node data structure.-- @return a poin= ter > to the device path node that follows the device path node- specified by > Node.--**/-EFI_DEVICE_PATH_PROTOCOL *-NextDevicePathNode (- IN > CONST VOID *Node- );- /** Get the size of the current device path > instance. diff --git a/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.inf > b/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.inf > index 912ff7a8ba4f..788660b33299 100644 > --- a/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.inf > +++ b/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.inf > @@ -50,11 +50,13 @@ [LibraryClasses] > TimerLib LockBoxLib PeimEntryPoint+ DevicePathLib [Ppis] > gEdkiiPeiAtaAhciHostControllerPpiGuid ## CONSUMES > gEdkiiIoMmuPpiGuid ## CONSUMES > gEfiEndOfPeiSignalPpiGuid ## CONSUMES+ > gEdkiiPeiPciDevicePpiGuid ## CONSUMES > gEdkiiPeiAtaPassThruPpiGuid ## SOMETIMES_PRODUCES > gEfiPeiVirtualBlockIoPpiGuid ## SOMETIMES_PRODUCES > gEfiPeiVirtualBlockIo2PpiGuid ## SOMETIMES_PRODUCES@@ -6= 5,8 > +67,7 @@ [Guids] > [Depex] gEfiPeiMemoryDiscoveredPpiGuid AND- > gEfiPeiMasterBootModePpiGuid AND- > gEdkiiPeiAtaAhciHostControllerPpiGuid+ gEfiPeiMasterBootModePpiGuid > [UserExtensions.TianoCore."ExtraFiles"] AhciPeiExtra.unidiff --git > a/MdeModulePkg/MdeModulePkg.dsc > b/MdeModulePkg/MdeModulePkg.dsc > index 90a0a7ec4a7c..45a8ec84ad69 100644 > --- a/MdeModulePkg/MdeModulePkg.dsc > +++ b/MdeModulePkg/MdeModulePkg.dsc > @@ -117,6 +117,7 @@ [LibraryClasses.common.PEIM] >=20 > MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemory > AllocationLib.inf > ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiEx > tractGuidedSectionLib.inf > LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxPeiLib.inf > + > DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibBase.i > nf [LibraryClasses.common.DXE_CORE] > HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf-- > 2.27.0.windows.1