public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Wu, Hao A" <hao.a.wu@intel.com>
To: "Czajkowski, Maciej" <maciej.czajkowski@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Ni, Ray" <ray.ni@intel.com>, "Gao, Liming" <gaoliming@byosoft.com.cn>
Subject: Re: [PATCH v3 2/2] MdeModulePkg/AhciPei: Use PCI_DEVICE_PPI to manage AHCI device
Date: Tue, 2 Aug 2022 02:20:32 +0000	[thread overview]
Message-ID: <DM6PR11MB40254B018495F10F0B2E2229CA9D9@DM6PR11MB4025.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20220801170009.2113-3-maciej.czajkowski@intel.com>

Reviewed-by: Hao A Wu <hao.a.wu@intel.com>

Best Regards,
Hao Wu

> -----Original Message-----
> From: Czajkowski, Maciej <maciej.czajkowski@intel.com>
> Sent: Tuesday, August 2, 2022 1:00 AM
> To: devel@edk2.groups.io
> Cc: Wu, Hao A <hao.a.wu@intel.com>; Ni, Ray <ray.ni@intel.com>; Gao,
> Liming <gaoliming@byosoft.com.cn>
> Subject: [PATCH v3 2/2] MdeModulePkg/AhciPei: Use PCI_DEVICE_PPI to
> manage AHCI device
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3907
> 
> 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.
> 
> Cc: Hao A Wu <hao.a.wu@intel.com>
> Cc: Ray Ni <ray.ni@intel.com>
> Cc: Liming Gao <gaoliming@byosoft.com.cn>
> Signed-off-by: Maciej Czajkowski <maciej.czajkowski@intel.com>
> ---
> 
> Notes:
>     v2 changes:
>     - added missing function descriptions
>     - moved controller initialization from PCI_DEVICE_PPI to seperate funciton
>     in order to reduce code duplication
>     - added DevicePathLib BASE instance to the MdeModulePkg.dec to allow
> PEIMs to consume it
> 
>     v3 changes:
>     - removed redundant locate PPI calls (if already installed, NotifyPpi
> executes callback)
>     - aligned enabling HC device from PCI_DEVICE_PPI with flow from
> AtaAtapiPassThru DXE driver
>     - corrected function descriptions
> 
>  MdeModulePkg/Bus/Ata/AhciPei/AhciPei.c    | 505 +++++++++++++-------
>  MdeModulePkg/Bus/Ata/AhciPei/DevicePath.c |  44 --
>  MdeModulePkg/Bus/Ata/AhciPei/AhciPei.h    |  57 ++-
>  MdeModulePkg/Bus/Ata/AhciPei/AhciPei.inf  |   5 +-
>  MdeModulePkg/MdeModulePkg.dsc             |   1 +
>  5 files changed, 390 insertions(+), 222 deletions(-)
> 
> diff --git a/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.c
> b/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.c
> index 208b7e9a3606..98dd732a4023 100644
> --- a/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.c
> +++ b/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.c
> @@ -9,6 +9,9 @@
>  **/  #include "AhciPei.h"+#include <Ppi/PciDevice.h>+#include
> <Library/DevicePathLib.h>+#include <IndustryStandard/Pci.h>
> EFI_PEI_PPI_DESCRIPTOR  mAhciAtaPassThruPpiListTemplate =
> {   (EFI_PEI_PPI_DESCRIPTOR_PPI |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),@@ -40,6 +43,18 @@
> EFI_PEI_NOTIFY_DESCRIPTOR  mAhciEndOfPeiNotifyListTemplate = {
>    AhciPeimEndOfPei }; +EFI_PEI_NOTIFY_DESCRIPTOR
> mAtaAhciHostControllerNotify = {+
> (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),+
> &gEdkiiPeiAtaAhciHostControllerPpiGuid,+
> AtaAhciHostControllerPpiInstallationCallback+};++EFI_PEI_NOTIFY_DESCRIPT
> OR  mPciDevicePpiNotify = {+  (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 +126,30 @@ AhciPeimEndOfPei (
>  }  /**-  Entry point of the PEIM.+  Initialize and install PrivateData PPIs. -
> @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 others
> Failed to initialize AHCI controller **/ EFI_STATUS-EFIAPI-AtaAhciPeimEntry
> (-  IN EFI_PEI_FILE_HANDLE     FileHandle,-  IN CONST EFI_PEI_SERVICES
> **PeiServices+AtaAhciInitPrivateData (+  IN UINTN                     MmioBase,+
> IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath,+  IN UINTN
> DevicePathLength   ) {-  EFI_STATUS                          Status;-  EFI_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_PRIVATE_DATA
> *Private;-  UINT8                               NumberOfPorts;+  EFI_STATUS
> 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 +161,149
> @@ AtaAhciPeimEntry (
>    }    //-  // Locate the ATA AHCI host controller PPI.-  //-  Status =
> PeiServicesLocatePpi (-             &gEdkiiPeiAtaAhciHostControllerPpiGuid,-
> 0,-             NULL,-             (VOID **)&AhciHcPpi-             );+  // Check validity of
> the device path of the ATA AHCI controller.+  //+  Status =
> 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 ==
> BOOT_ON_S3_RESUME) {+    NumberOfPorts = AhciS3GetEumeratePorts
> (DevicePath, DevicePathLength, &PortBitMap);+    if (NumberOfPorts == 0)
> {+      return EFI_SUCCESS;+    }+  } else {+    PortBitMap = MAX_UINT32;+  }++
> //+  // Memory allocation for controller private data.+  //+  Private =
> AllocateZeroPool (sizeof (PEI_AHCI_CONTROLLER_PRIVATE_DATA));+  if
> (Private == NULL) {+    DEBUG ((+      DEBUG_ERROR,+      "%a: Fail to allocate
> private data.\n",+      __FUNCTION__+      ));+    return
> EFI_OUT_OF_RESOURCES;+  }++  //+  // Initialize controller private data.+  //+
> Private->Signature        =
> AHCI_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE;+  Private->MmioBase
> = MmioBase;+  Private->DevicePathLength = DevicePathLength;+  Private-
> >DevicePath       = DevicePath;+  Private->PortBitMap       = PortBitMap;+
> InitializeListHead (&Private->DeviceList);++  Status = AhciModeInitialization
> (Private);   if (EFI_ERROR (Status)) {-    DEBUG ((DEBUG_ERROR, "%a: Failed to
> locate AtaAhciHostControllerPpi.\n", __FUNCTION__));-    return
> EFI_UNSUPPORTED;+    return Status;+  }++  Private-
> >AtaPassThruMode.Attributes =
> EFI_ATA_PASS_THRU_ATTRIBUTES_PHYSICAL |+
> EFI_ATA_PASS_THRU_ATTRIBUTES_LOGICAL;+  Private-
> >AtaPassThruMode.IoAlign      = sizeof (UINTN);+  Private-
> >AtaPassThruPpi.Revision      = EDKII_PEI_ATA_PASS_THRU_PPI_REVISION;+
> Private->AtaPassThruPpi.Mode          = &Private->AtaPassThruMode;+
> Private->AtaPassThruPpi.PassThru      = AhciAtaPassThruPassThru;+  Private-
> >AtaPassThruPpi.GetNextPort   = AhciAtaPassThruGetNextPort;+  Private-
> >AtaPassThruPpi.GetNextDevice = AhciAtaPassThruGetNextDevice;+
> Private->AtaPassThruPpi.GetDevicePath = AhciAtaPassThruGetDevicePath;+
> CopyMem (+    &Private->AtaPassThruPpiList,+
> &mAhciAtaPassThruPpiListTemplate,+    sizeof
> (EFI_PEI_PPI_DESCRIPTOR)+    );+  Private->AtaPassThruPpiList.Ppi =
> &Private->AtaPassThruPpi;+  PeiServicesInstallPpi (&Private-
> >AtaPassThruPpiList);++  Private->BlkIoPpi.GetNumberOfBlockDevices =
> AhciBlockIoGetDeviceNo;+  Private->BlkIoPpi.GetBlockDeviceMediaInfo =
> AhciBlockIoGetMediaInfo;+  Private->BlkIoPpi.ReadBlocks              =
> AhciBlockIoReadBlocks;+  CopyMem (+    &Private->BlkIoPpiList,+
> &mAhciBlkIoPpiListTemplate,+    sizeof (EFI_PEI_PPI_DESCRIPTOR)+    );+
> Private->BlkIoPpiList.Ppi = &Private->BlkIoPpi;+  PeiServicesInstallPpi
> (&Private->BlkIoPpiList);++  Private->BlkIo2Ppi.Revision                =
> EFI_PEI_RECOVERY_BLOCK_IO2_PPI_REVISION;+  Private-
> >BlkIo2Ppi.GetNumberOfBlockDevices = AhciBlockIoGetDeviceNo2;+
> Private->BlkIo2Ppi.GetBlockDeviceMediaInfo = AhciBlockIoGetMediaInfo2;+
> Private->BlkIo2Ppi.ReadBlocks              = AhciBlockIoReadBlocks2;+  CopyMem
> (+    &Private->BlkIo2PpiList,+    &mAhciBlkIo2PpiListTemplate,+    sizeof
> (EFI_PEI_PPI_DESCRIPTOR)+    );+  Private->BlkIo2PpiList.Ppi = &Private-
> >BlkIo2Ppi;+  PeiServicesInstallPpi (&Private->BlkIo2PpiList);++  if (Private-
> >TrustComputingDevices != 0) {+    DEBUG ((+      DEBUG_INFO,+      "%a:
> Security Security Command PPI will be produced.\n",+
> __FUNCTION__+      ));+    Private->StorageSecurityPpi.Revision           =
> EDKII_STORAGE_SECURITY_PPI_REVISION;+    Private-
> >StorageSecurityPpi.GetNumberofDevices =
> AhciStorageSecurityGetDeviceNo;+    Private-
> >StorageSecurityPpi.GetDevicePath      =
> AhciStorageSecurityGetDevicePath;+    Private-
> >StorageSecurityPpi.ReceiveData        = AhciStorageSecurityReceiveData;+
> Private->StorageSecurityPpi.SendData           =
> AhciStorageSecuritySendData;+    CopyMem (+      &Private-
> >StorageSecurityPpiList,+      &mAhciStorageSecurityPpiListTemplate,+
> sizeof (EFI_PEI_PPI_DESCRIPTOR)+      );+    Private-
> >StorageSecurityPpiList.Ppi = &Private->StorageSecurityPpi;+
> PeiServicesInstallPpi (&Private->StorageSecurityPpiList);   } +  CopyMem (+
> &Private->EndOfPeiNotifyList,+    &mAhciEndOfPeiNotifyListTemplate,+
> sizeof (EFI_PEI_NOTIFY_DESCRIPTOR)+    );+  PeiServicesNotifyPpi (&Private-
> >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 = 0;   MmioBase   = 0;   while (TRUE)
> {@@ -193,65 +335,7 @@ AtaAhciPeimEntry (
>        return Status;     } -    //-    // Check validity of the device path of the ATA
> AHCI controller.-    //-    Status = AhciIsHcDevicePathValid (DevicePath,
> DevicePathLength);-    if (EFI_ERROR (Status)) {-      DEBUG ((-
> DEBUG_ERROR,-        "%a: The device path is invalid for Controller %d.\n",-
> __FUNCTION__,-        Controller-        ));-      Controller++;-      continue;-    }--
> //-    // 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 ==
> BOOT_ON_S3_RESUME) {-      NumberOfPorts = AhciS3GetEumeratePorts
> (DevicePath, DevicePathLength, &PortBitMap);-      if (NumberOfPorts == 0)
> {-        //-        // No ports need to be enumerated for this controller.-        //-
> Controller++;-        continue;-      }-    } else {-      PortBitMap = MAX_UINT32;-
>     }--    //-    // Memory allocation for controller private data.-    //-    Private =
> AllocateZeroPool (sizeof (PEI_AHCI_CONTROLLER_PRIVATE_DATA));-    if
> (Private == NULL) {-      DEBUG ((-        DEBUG_ERROR,-        "%a: Fail to allocate
> private data for Controller %d.\n",-        __FUNCTION__,-        Controller-
>         ));-      return EFI_OUT_OF_RESOURCES;-    }--    //-    // Initialize controller
> private data.-    //-    Private->Signature        =
> AHCI_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE;-    Private->MmioBase
> = MmioBase;-    Private->DevicePathLength = DevicePathLength;-    Private-
> >DevicePath       = DevicePath;-    Private->PortBitMap       = PortBitMap;-
> InitializeListHead (&Private->DeviceList);--    Status = AhciModeInitialization
> (Private);+    Status = AtaAhciInitPrivateData (MmioBase, DevicePath,
> DevicePathLength);     if (EFI_ERROR (Status)) {       DEBUG
> ((         DEBUG_ERROR,@@ -260,86 +344,187 @@ AtaAhciPeimEntry (
>          Controller,         Status         ));-      Controller++;-      continue;-    }--
> Private->AtaPassThruMode.Attributes =
> EFI_ATA_PASS_THRU_ATTRIBUTES_PHYSICAL |-
> EFI_ATA_PASS_THRU_ATTRIBUTES_LOGICAL;-    Private-
> >AtaPassThruMode.IoAlign      = sizeof (UINTN);-    Private-
> >AtaPassThruPpi.Revision      = EDKII_PEI_ATA_PASS_THRU_PPI_REVISION;-
> Private->AtaPassThruPpi.Mode          = &Private->AtaPassThruMode;-
> Private->AtaPassThruPpi.PassThru      = AhciAtaPassThruPassThru;-    Private-
> >AtaPassThruPpi.GetNextPort   = AhciAtaPassThruGetNextPort;-    Private-
> >AtaPassThruPpi.GetNextDevice = AhciAtaPassThruGetNextDevice;-
> Private->AtaPassThruPpi.GetDevicePath = AhciAtaPassThruGetDevicePath;-
> CopyMem (-      &Private->AtaPassThruPpiList,-
> &mAhciAtaPassThruPpiListTemplate,-      sizeof (EFI_PEI_PPI_DESCRIPTOR)-
>       );-    Private->AtaPassThruPpiList.Ppi = &Private->AtaPassThruPpi;-
> PeiServicesInstallPpi (&Private->AtaPassThruPpiList);--    Private-
> >BlkIoPpi.GetNumberOfBlockDevices = AhciBlockIoGetDeviceNo;-    Private-
> >BlkIoPpi.GetBlockDeviceMediaInfo = AhciBlockIoGetMediaInfo;-    Private-
> >BlkIoPpi.ReadBlocks              = AhciBlockIoReadBlocks;-    CopyMem (-
> &Private->BlkIoPpiList,-      &mAhciBlkIoPpiListTemplate,-      sizeof
> (EFI_PEI_PPI_DESCRIPTOR)-      );-    Private->BlkIoPpiList.Ppi = &Private-
> >BlkIoPpi;-    PeiServicesInstallPpi (&Private->BlkIoPpiList);--    Private-
> >BlkIo2Ppi.Revision                =
> EFI_PEI_RECOVERY_BLOCK_IO2_PPI_REVISION;-    Private-
> >BlkIo2Ppi.GetNumberOfBlockDevices = AhciBlockIoGetDeviceNo2;-
> Private->BlkIo2Ppi.GetBlockDeviceMediaInfo = AhciBlockIoGetMediaInfo2;-
> Private->BlkIo2Ppi.ReadBlocks              = AhciBlockIoReadBlocks2;-    CopyMem
> (-      &Private->BlkIo2PpiList,-      &mAhciBlkIo2PpiListTemplate,-      sizeof
> (EFI_PEI_PPI_DESCRIPTOR)-      );-    Private->BlkIo2PpiList.Ppi = &Private-
> >BlkIo2Ppi;-    PeiServicesInstallPpi (&Private->BlkIo2PpiList);--    if (Private-
> >TrustComputingDevices != 0) {+    } else {       DEBUG ((         DEBUG_INFO,-
> "%a: Security Security Command PPI will be produced for Controller %d.\n",+
> "%a: Controller %d has been successfully initialized.\n",         __FUNCTION__,
> Controller         ));-      Private->StorageSecurityPpi.Revision           =
> EDKII_STORAGE_SECURITY_PPI_REVISION;-      Private-
> >StorageSecurityPpi.GetNumberofDevices =
> AhciStorageSecurityGetDeviceNo;-      Private-
> >StorageSecurityPpi.GetDevicePath      =
> AhciStorageSecurityGetDevicePath;-      Private-
> >StorageSecurityPpi.ReceiveData        = AhciStorageSecurityReceiveData;-
> Private->StorageSecurityPpi.SendData           = AhciStorageSecuritySendData;-
> CopyMem (-        &Private->StorageSecurityPpiList,-
> &mAhciStorageSecurityPpiListTemplate,-        sizeof
> (EFI_PEI_PPI_DESCRIPTOR)-        );-      Private->StorageSecurityPpiList.Ppi =
> &Private->StorageSecurityPpi;-      PeiServicesInstallPpi (&Private-
> >StorageSecurityPpiList);     } -    CopyMem (-      &Private-
> >EndOfPeiNotifyList,-      &mAhciEndOfPeiNotifyListTemplate,-      sizeof
> (EFI_PEI_NOTIFY_DESCRIPTOR)-      );-    PeiServicesNotifyPpi (&Private-
> >EndOfPeiNotifyList);--    DEBUG ((-      DEBUG_INFO,-      "%a: Controller %d
> has been successfully initialized.\n",-      __FUNCTION__,-      Controller-      ));
> Controller++;   }    return EFI_SUCCESS; }++/**+  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+  @retval Others                 Cannot initialize
> AHCI controller from given
> EDKII_ATA_AHCI_HOST_CONTROLLER_PPI++**/+EFI_STATUS+EFIAPI+AtaA
> hciHostControllerPpiInstallationCallback (+  IN EFI_PEI_SERVICES
> **PeiServices,+  IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,+  IN
> VOID                       *Ppi+  )+{+  EDKII_ATA_AHCI_HOST_CONTROLLER_PPI
> *AhciHcPpi;++  if (Ppi == NULL) {+    return EFI_INVALID_PARAMETER;+  }++
> AhciHcPpi = (EDKII_ATA_AHCI_HOST_CONTROLLER_PPI *)Ppi;++  return
> AtaAhciInitPrivateDataFromHostControllerPpi (AhciHcPpi);+}++/**+  Initialize
> 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 initialize 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;+  UINT64                    EnabledPciAttributes;++  //+  // Now
> further check the PCI header: Base Class (offset 0x0B) and+  // Sub Class
> (offset 0x0A). This controller should be an SATA controller+  //+  Status =
> PciDevice->PciIo.Pci.Read (+                                  &PciDevice->PciIo,+
> EfiPciIoWidthUint8,+                                  PCI_CLASSCODE_OFFSET,+
> sizeof (PciData.Hdr.ClassCode),+
> PciData.Hdr.ClassCode+                                  );+  if (EFI_ERROR (Status)) {+
> return EFI_UNSUPPORTED;+  }++  if (!IS_PCI_IDE (&PciData)
> && !IS_PCI_SATADPA (&PciData)) {+    return EFI_UNSUPPORTED;+  }++
> Status = PciDevice->PciIo.Attributes (+                              &PciDevice->PciIo,+
> EfiPciIoAttributeOperationSupported,+                              0,+
> &EnabledPciAttributes+                              );+  if (EFI_ERROR (Status)) {+    return
> EFI_UNSUPPORTED;+  } else {+    EnabledPciAttributes &=
> (UINT64)EFI_PCI_DEVICE_ENABLE;+    Status                = PciDevice-
> >PciIo.Attributes (+                                               &PciDevice->PciIo,+
> EfiPciIoAttributeOperationEnable,+
> EnabledPciAttributes,+
> NULL+                                               );+    if (EFI_ERROR (Status)) {+      return
> EFI_UNSUPPORTED;+    }+  }++  Status = PciDevice->PciIo.Pci.Read (+
> &PciDevice->PciIo,+                                  EfiPciIoWidthUint32,+
> 0x24,+                                  sizeof (UINTN),+
> &MmioBase+                                  );+  if (EFI_ERROR (Status)) {+    return
> EFI_UNSUPPORTED;+  }++  DevicePathLength = GetDevicePathSize
> (PciDevice->DevicePath);+  DevicePath       = PciDevice->DevicePath;++
> Status = 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 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 initialize AHCI
> controller from given
> PCI_DEVICE_PPI++**/+EFI_STATUS+EFIAPI+AtaAhciPciDevicePpiInstallation
> Callback (+  IN EFI_PEI_SERVICES           **PeiServices,+  IN
> EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,+  IN VOID
> *Ppi+  )+{+  EDKII_PCI_DEVICE_PPI  *PciDevice;++  PciDevice =
> (EDKII_PCI_DEVICE_PPI *)Ppi;++  return
> AtaAhciInitPrivateDataFromPciDevice (PciDevice);+}++/**+  Entry point of
> the PEIM.++  @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.++**/+EFI_STATUS+EFIAPI+AtaAhciPeimEntry (+  IN
> EFI_PEI_FILE_HANDLE     FileHandle,+  IN CONST EFI_PEI_SERVICES
> **PeiServices+  )+{+  DEBUG ((DEBUG_INFO, "%a: Enters.\n",
> __FUNCTION__));++  PeiServicesNotifyPpi
> (&mAtaAhciHostControllerNotify);++  PeiServicesNotifyPpi
> (&mPciDevicePpiNotify);++  return EFI_SUCCESS;+}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 = {
>    } }; -/**-  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-  that
> 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 Length
> field of the device path node specified by Node.--**/-UINTN-
> DevicePathNodeLength (-  IN CONST VOID  *Node-  )-{-  ASSERT (Node !=
> 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 structure.-
> -  @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 !=
> 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..4aed1cb7ad8a 100644
> --- a/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.h
> +++ b/MdeModulePkg/Bus/Ata/AhciPei/AhciPei.h
> @@ -29,6 +29,7 @@
>  #include <Library/BaseMemoryLib.h> #include <Library/IoLib.h> #include
> <Library/TimerLib.h>+#include <Library/DevicePathLib.h>  // // Structure
> forward declarations@@ -354,6 +355,46 @@ extern UINT32
> mMaxTransferBlockNumber[2];
>  // Internal functions // +/**+  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+  @retval Others                 Cannot initialize
> AHCI controller from given
> EDKII_ATA_AHCI_HOST_CONTROLLER_PPI++**/+EFI_STATUS+EFIAPI+AtaA
> hciHostControllerPpiInstallationCallback (+  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+  @retval Others                 Cannot
> initialize AHCI controller from given
> PCI_DEVICE_PPI++**/+EFI_STATUS+EFIAPI+AtaAhciPciDevicePpiInstallation
> Callback (+  IN EFI_PEI_SERVICES           **PeiServices,+  IN
> EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,+  IN VOID
> *Ppi+  );+ /**   Allocates pages that are suitable for an
> OperationBusMasterCommonBuffer or
> OperationBusMasterCommonBuffer64 mapping.@@ -631,22 +672,6 @@
> TrustTransferAtaDevice (
>    OUT    UINTN                     *TransferLengthOut   ); -/**-  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 structure.--  @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-  );- /**   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@@ -65,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]
> 
> 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


  reply	other threads:[~2022-08-02  2:20 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-01 17:00 [PATCH v3 0/2] Add EDKII_PCI_DEVICE_PPI support to EDK2 Maciej Czajkowski
2022-08-01 17:00 ` [PATCH v3 1/2] MdeModulePkg: Add EDKII_PCI_DEVICE_PPI definition Maciej Czajkowski
2022-08-01 17:00 ` [PATCH v3 2/2] MdeModulePkg/AhciPei: Use PCI_DEVICE_PPI to manage AHCI device Maciej Czajkowski
2022-08-02  2:20   ` Wu, Hao A [this message]
2022-08-02  2:20 ` [edk2-devel] [PATCH v3 0/2] Add EDKII_PCI_DEVICE_PPI support to EDK2 Wu, Hao A
2022-08-05  2:27   ` Wu, Hao A

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DM6PR11MB40254B018495F10F0B2E2229CA9D9@DM6PR11MB4025.namprd11.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox