On Thu, 24 Feb 2022 at 12:48, Tomas Pilar <quic_tpi...@quicinc.com> wrote:
>
> Delay and move the allocation and mapping of memory that backs the DMA
> engine in NvmExpress devices to NvmeInit() to ensure that
> the allocation only happens after the
> EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE attribute is set
> on the PciIo controller.
>
> This ensures that the DMA-backing memory is not forcibly allocated
> below 4G in system address map. Otherwise the allocation fails on
> platforms that do not have any memory below the 4G mark and the drive
> initialisation fails.
>
> Cc: Ray Ni <ray...@intel.com>
> Cc: Ard Biesheuvel <ardb+tianoc...@kernel.org>
> Cc: Leif Lindholm <l...@nuviainc.com>
> Signed-off-by: Tomas Pilar <quic_tpi...@quicinc.com>

NvmeControllerInit () can be called multiple times, no? So you should
probably make sure that the buffer is not allocated and mapped again
if one already exists.



> ---
>  .../Bus/Pci/NvmExpressDxe/NvmExpress.c        | 41 -------------
>  .../Bus/Pci/NvmExpressDxe/NvmExpressHci.c     | 57 ++++++++++++++++---
>  2 files changed, 49 insertions(+), 49 deletions(-)
>
> diff --git a/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.c 
> b/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.c
> index 9d40f67e8e..cc921756f5 100644
> --- a/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.c
> +++ b/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.c
> @@ -912,8 +912,6 @@ NvmExpressDriverBindingStart (
>    NVME_CONTROLLER_PRIVATE_DATA        *Private;
>    EFI_DEVICE_PATH_PROTOCOL            *ParentDevicePath;
>    UINT32                              NamespaceId;
> -  EFI_PHYSICAL_ADDRESS                MappedAddr;
> -  UINTN                               Bytes;
>    EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL  *Passthru;
>
>    DEBUG ((DEBUG_INFO, "NvmExpressDriverBindingStart: start\n"));
> @@ -959,45 +957,6 @@ NvmExpressDriverBindingStart (
>        goto Exit;
>      }
>
> -    //
> -    // 6 x 4kB aligned buffers will be carved out of this buffer.
> -    // 1st 4kB boundary is the start of the admin submission queue.
> -    // 2nd 4kB boundary is the start of the admin completion queue.
> -    // 3rd 4kB boundary is the start of I/O submission queue #1.
> -    // 4th 4kB boundary is the start of I/O completion queue #1.
> -    // 5th 4kB boundary is the start of I/O submission queue #2.
> -    // 6th 4kB boundary is the start of I/O completion queue #2.
> -    //
> -    // Allocate 6 pages of memory, then map it for bus master read and write.
> -    //
> -    Status = PciIo->AllocateBuffer (
> -                      PciIo,
> -                      AllocateAnyPages,
> -                      EfiBootServicesData,
> -                      6,
> -                      (VOID **)&Private->Buffer,
> -                      0
> -                      );
> -    if (EFI_ERROR (Status)) {
> -      goto Exit;
> -    }
> -
> -    Bytes  = EFI_PAGES_TO_SIZE (6);
> -    Status = PciIo->Map (
> -                      PciIo,
> -                      EfiPciIoOperationBusMasterCommonBuffer,
> -                      Private->Buffer,
> -                      &Bytes,
> -                      &MappedAddr,
> -                      &Private->Mapping
> -                      );
> -
> -    if (EFI_ERROR (Status) || (Bytes != EFI_PAGES_TO_SIZE (6))) {
> -      goto Exit;
> -    }
> -
> -    Private->BufferPciAddr = (UINT8 *)(UINTN)MappedAddr;
> -
>      Private->Signature                 = 
> NVME_CONTROLLER_PRIVATE_DATA_SIGNATURE;
>      Private->ControllerHandle          = Controller;
>      Private->ImageHandle               = This->DriverBindingHandle;
> diff --git a/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressHci.c 
> b/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressHci.c
> index ac77afe113..359373300e 100644
> --- a/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressHci.c
> +++ b/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressHci.c
> @@ -718,14 +718,16 @@ NvmeControllerInit (
>    IN NVME_CONTROLLER_PRIVATE_DATA  *Private
>    )
>  {
> -  EFI_STATUS           Status;
> -  EFI_PCI_IO_PROTOCOL  *PciIo;
> -  UINT64               Supports;
> -  NVME_AQA             Aqa;
> -  NVME_ASQ             Asq;
> -  NVME_ACQ             Acq;
> -  UINT8                Sn[21];
> -  UINT8                Mn[41];
> +  EFI_STATUS            Status;
> +  EFI_PCI_IO_PROTOCOL   *PciIo;
> +  UINT64                Supports;
> +  NVME_AQA              Aqa;
> +  NVME_ASQ              Asq;
> +  NVME_ACQ              Acq;
> +  UINT8                 Sn[21];
> +  UINT8                 Mn[41];
> +  UINTN                 Bytes;
> +  EFI_PHYSICAL_ADDRESS  MappedAddr;
>
>    //
>    // Save original PCI attributes and enable this controller.
> @@ -777,6 +779,45 @@ NvmeControllerInit (
>      DEBUG ((DEBUG_WARN, "NvmeControllerInit: failed to enable 64-bit DMA 
> (%r)\n", Status));
>    }
>
> +  //
> +  // 6 x 4kB aligned buffers will be carved out of this buffer.
> +  // 1st 4kB boundary is the start of the admin submission queue.
> +  // 2nd 4kB boundary is the start of the admin completion queue.
> +  // 3rd 4kB boundary is the start of I/O submission queue #1.
> +  // 4th 4kB boundary is the start of I/O completion queue #1.
> +  // 5th 4kB boundary is the start of I/O submission queue #2.
> +  // 6th 4kB boundary is the start of I/O completion queue #2.
> +  //
> +  // Allocate 6 pages of memory, then map it for bus master read and write.
> +  //
> +  Status = PciIo->AllocateBuffer (
> +                    PciIo,
> +                    AllocateAnyPages,
> +                    EfiBootServicesData,
> +                    6,
> +                    (VOID **)&Private->Buffer,
> +                    0
> +                    );
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
> +  Bytes  = EFI_PAGES_TO_SIZE (6);
> +  Status = PciIo->Map (
> +                    PciIo,
> +                    EfiPciIoOperationBusMasterCommonBuffer,
> +                    Private->Buffer,
> +                    &Bytes,
> +                    &MappedAddr,
> +                    &Private->Mapping
> +                    );
> +
> +  if (EFI_ERROR (Status) || (Bytes != EFI_PAGES_TO_SIZE (6))) {
> +    return Status;
> +  }
> +
> +  Private->BufferPciAddr = (UINT8 *)(UINTN)MappedAddr;
> +
>    //
>    // Read the Controller Capabilities register and verify that the NVM 
> command set is supported
>    //
> --
> 2.30.2
>


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#86965): https://edk2.groups.io/g/devel/message/86965
Mute This Topic: https://groups.io/mt/89363151/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to