On Wed, 20 Dec 2023 at 02:57, Ni, Ray <ray...@intel.com> wrote:
>
> It’s new to me that PCI IO (not MMIO) space is accessed through MMIO.
>
> PCIE spec defines different TLP types for Memory and I/O request in 
> Transaction Layer chapter.
>
> If CpuIoDxe driver issues Memory request to a IO space inside a PCIE device, 
> how does PCIE device claim the TPL packet and response?
>

Hello Ray,

On the opposite side of the PCI host bridge, these are all port I/O
transactions, and the endpoint is not aware of the distinction between
native port I/O and translated port I/O.

ARM CPUs do not implement port I/O at all, and so every host bridge
that implements port I/O support on the PCI side does so by exposing a
special MMIO resource window in the CPU physical address space that
gets translated to port I/O accesses at the opposite side.

This means that an implementation of the CpuIo2 protocol can only be
provided in a meaningful way if there are port I/O capable PCI host
bridges in the system, and some bookkeeping is needed to keep track of
the mapping between the special MMIO ranges on the CPU side and the
port I/O ranges on the PCI side. Note that this is not so different
from MMIO translation, where the mapping between MMIO is not 1:1
between CPU and PCI.

That said, I am not sure I follow why PcdPciIoTranslationIsEnabled is
needed. MMIO translation and IO translation are both properties of the
PCI host bridge implementation, so having a system wide PCD for this
seems unnecessary to me. But perhaps I missed something?



>
> From: Chao Li <lic...@loongson.cn>
> Sent: Tuesday, December 19, 2023 9:04 PM
> To: devel@edk2.groups.io; Ni, Ray <ray...@intel.com>
> Cc: Kumar, Rahul R <rahul.r.ku...@intel.com>; Gerd Hoffmann 
> <kra...@redhat.com>; Leif Lindholm <quic_llind...@quicinc.com>; Ard 
> Biesheuvel <ardb+tianoc...@kernel.org>; Sami Mujawar <sami.muja...@arm.com>
> Subject: Re: [edk2-devel] [PATCH v4 19/37] UefiCpuPkg: Add MMIO method in 
> CpuIo2Dxe
>
>
>
> Hi Ray,
>
> Can you please review this patch? Thank you!
>
>
>
> Thanks,
> Chao
>
> On 2023/12/12 21:12, Chao Li wrote:
>
> CpuIo2Dxe only supports IO to access PCI IO. Some ARCH requires
>
> MMIO to access PCI IO, add the MMIO access method in CpuIo2Dxe.
>
>
>
> The MMIO methods depend on PcdPciIoTranslationIsEnabled and
>
> PcdPciIoTransLation. The code is referenced from ArmPkg.
>
>
>
> Build-tested only (with "OvmfPkgX64.dsc").
>
>
>
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4584
>
>
>
> Cc: Ray Ni <ray...@intel.com>
>
> Cc: Rahul Kumar <rahul1.ku...@intel.com>
>
> Cc: Gerd Hoffmann <kra...@redhat.com>
>
> Cc: Leif Lindholm <quic_llind...@quicinc.com>
>
> Cc: Ard Biesheuvel <ardb+tianoc...@kernel.org>
>
> Cc: Sami Mujawar <sami.muja...@arm.com>
>
> Signed-off-by: Chao Li <lic...@loongson.cn>
>
> ---
>
>  UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.c   | 149 +++++++++++++++++++----------
>
>  UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.h   |   2 +
>
>  UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf |   8 +-
>
>  UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.uni |   2 +
>
>  4 files changed, 111 insertions(+), 50 deletions(-)
>
>
>
> diff --git a/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.c 
> b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.c
>
> index 87f4f805ca..cd31977af2 100644
>
> --- a/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.c
>
> +++ b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.c
>
> @@ -3,6 +3,8 @@
>
>
>
>  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>
>  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>
> +Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
>
> +Copyright (c) 2023 Loongson Technology Corporation Limited. All rights 
> reserved.<BR>
>
>
>
>  SPDX-License-Identifier: BSD-2-Clause-Patent
>
>
>
> @@ -149,7 +151,7 @@ CpuIoCheckParameter (
>
>    //
>
>    // Since MAX_ADDRESS can be the maximum integer value supported by the CPU 
> and Count
>
>    // can also be the maximum integer value supported by the CPU, this range
>
> -  // check must be adjusted to avoid all oveflow conditions.
>
> +  // check must be adjusted to avoid all overflow conditions.
>
>    //
>
>    // The following form of the range check is equivalent but assumes that
>
>    // MAX_ADDRESS and MAX_IO_PORT_ADDRESS are of the form (2^n - 1).
>
> @@ -398,6 +400,18 @@ CpuIoServiceRead (
>
>    EFI_CPU_IO_PROTOCOL_WIDTH  OperationWidth;
>
>    UINT8                      *Uint8Buffer;
>
>
>
> +  UINT8 EFIAPI  (*CpuIoRead8) (
>
> +    UINTN
>
> +    );
>
> +
>
> +  UINT16 EFIAPI  (*CpuIoRead16) (
>
> +    UINTN
>
> +    );
>
> +
>
> +  UINT32 EFIAPI  (*CpuIoRead32) (
>
> +    UINTN
>
> +    );
>
> +
>
>    Status = CpuIoCheckParameter (FALSE, Width, Address, Count, Buffer);
>
>    if (EFI_ERROR (Status)) {
>
>      return Status;
>
> @@ -410,37 +424,48 @@ CpuIoServiceRead (
>
>    OutStride      = mOutStride[Width];
>
>    OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH)(Width & 0x03);
>
>
>
> -  //
>
> -  // Fifo operations supported for (mInStride[Width] == 0)
>
> -  //
>
> -  if (InStride == 0) {
>
> -    switch (OperationWidth) {
>
> -      case EfiCpuIoWidthUint8:
>
> -        IoReadFifo8 ((UINTN)Address, Count, Buffer);
>
> -        return EFI_SUCCESS;
>
> -      case EfiCpuIoWidthUint16:
>
> -        IoReadFifo16 ((UINTN)Address, Count, Buffer);
>
> -        return EFI_SUCCESS;
>
> -      case EfiCpuIoWidthUint32:
>
> -        IoReadFifo32 ((UINTN)Address, Count, Buffer);
>
> -        return EFI_SUCCESS;
>
> -      default:
>
> -        //
>
> -        // The CpuIoCheckParameter call above will ensure that this
>
> -        // path is not taken.
>
> -        //
>
> -        ASSERT (FALSE);
>
> -        break;
>
> +  if (FeaturePcdGet (PcdPciIoTranslationIsEnabled) == FALSE) {
>
> +    //
>
> +    // Fifo operations supported for (mInStride[Width] == 0)
>
> +    //
>
> +    if (InStride == 0) {
>
> +      switch (OperationWidth) {
>
> +        case EfiCpuIoWidthUint8:
>
> +          IoReadFifo8 ((UINTN)Address, Count, Buffer);
>
> +          return EFI_SUCCESS;
>
> +        case EfiCpuIoWidthUint16:
>
> +          IoReadFifo16 ((UINTN)Address, Count, Buffer);
>
> +          return EFI_SUCCESS;
>
> +        case EfiCpuIoWidthUint32:
>
> +          IoReadFifo32 ((UINTN)Address, Count, Buffer);
>
> +          return EFI_SUCCESS;
>
> +        default:
>
> +          //
>
> +          // The CpuIoCheckParameter call above will ensure that this
>
> +          // path is not taken.
>
> +          //
>
> +          ASSERT (FALSE);
>
> +          break;
>
> +      }
>
>      }
>
> +
>
> +    CpuIoRead8  = IoRead8;
>
> +    CpuIoRead16 = IoRead16;
>
> +    CpuIoRead32 = IoRead32;
>
> +  } else {
>
> +    Address    += PcdGet64 (PcdPciIoTranslation);
>
> +    CpuIoRead8  = MmioRead8;
>
> +    CpuIoRead16 = MmioRead16;
>
> +    CpuIoRead32 = MmioRead32;
>
>    }
>
>
>
>    for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += 
> OutStride, Count--) {
>
>      if (OperationWidth == EfiCpuIoWidthUint8) {
>
> -      *Uint8Buffer = IoRead8 ((UINTN)Address);
>
> +      *Uint8Buffer = CpuIoRead8 ((UINTN)Address);
>
>      } else if (OperationWidth == EfiCpuIoWidthUint16) {
>
> -      *((UINT16 *)Uint8Buffer) = IoRead16 ((UINTN)Address);
>
> +      *((UINT16 *)Uint8Buffer) = CpuIoRead16 ((UINTN)Address);
>
>      } else if (OperationWidth == EfiCpuIoWidthUint32) {
>
> -      *((UINT32 *)Uint8Buffer) = IoRead32 ((UINTN)Address);
>
> +      *((UINT32 *)Uint8Buffer) = CpuIoRead32 ((UINTN)Address);
>
>      }
>
>    }
>
>
>
> @@ -502,6 +527,21 @@ CpuIoServiceWrite (
>
>    EFI_CPU_IO_PROTOCOL_WIDTH  OperationWidth;
>
>    UINT8                      *Uint8Buffer;
>
>
>
> +  UINT8 EFIAPI  (*CpuIoWrite8) (
>
> +    UINTN,
>
> +    UINT8
>
> +    );
>
> +
>
> +  UINT16 EFIAPI  (*CpuIoWrite16) (
>
> +    UINTN,
>
> +    UINT16
>
> +    );
>
> +
>
> +  UINT32 EFIAPI  (*CpuIoWrite32) (
>
> +    UINTN,
>
> +    UINT32
>
> +    );
>
> +
>
>    //
>
>    // Make sure the parameters are valid
>
>    //
>
> @@ -517,37 +557,48 @@ CpuIoServiceWrite (
>
>    OutStride      = mOutStride[Width];
>
>    OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH)(Width & 0x03);
>
>
>
> -  //
>
> -  // Fifo operations supported for (mInStride[Width] == 0)
>
> -  //
>
> -  if (InStride == 0) {
>
> -    switch (OperationWidth) {
>
> -      case EfiCpuIoWidthUint8:
>
> -        IoWriteFifo8 ((UINTN)Address, Count, Buffer);
>
> -        return EFI_SUCCESS;
>
> -      case EfiCpuIoWidthUint16:
>
> -        IoWriteFifo16 ((UINTN)Address, Count, Buffer);
>
> -        return EFI_SUCCESS;
>
> -      case EfiCpuIoWidthUint32:
>
> -        IoWriteFifo32 ((UINTN)Address, Count, Buffer);
>
> -        return EFI_SUCCESS;
>
> -      default:
>
> -        //
>
> -        // The CpuIoCheckParameter call above will ensure that this
>
> -        // path is not taken.
>
> -        //
>
> -        ASSERT (FALSE);
>
> -        break;
>
> +  if (FeaturePcdGet (PcdPciIoTranslationIsEnabled) == FALSE) {
>
> +    //
>
> +    // Fifo operations supported for (mInStride[Width] == 0)
>
> +    //
>
> +    if (InStride == 0) {
>
> +      switch (OperationWidth) {
>
> +        case EfiCpuIoWidthUint8:
>
> +          IoWriteFifo8 ((UINTN)Address, Count, Buffer);
>
> +          return EFI_SUCCESS;
>
> +        case EfiCpuIoWidthUint16:
>
> +          IoWriteFifo16 ((UINTN)Address, Count, Buffer);
>
> +          return EFI_SUCCESS;
>
> +        case EfiCpuIoWidthUint32:
>
> +          IoWriteFifo32 ((UINTN)Address, Count, Buffer);
>
> +          return EFI_SUCCESS;
>
> +        default:
>
> +          //
>
> +          // The CpuIoCheckParameter call above will ensure that this
>
> +          // path is not taken.
>
> +          //
>
> +          ASSERT (FALSE);
>
> +          break;
>
> +      }
>
>      }
>
> +
>
> +    CpuIoWrite8  = IoWrite8;
>
> +    CpuIoWrite16 = IoWrite16;
>
> +    CpuIoWrite32 = IoWrite32;
>
> +  } else {
>
> +    Address     += PcdGet64 (PcdPciIoTranslation);
>
> +    CpuIoWrite8  = MmioWrite8;
>
> +    CpuIoWrite16 = MmioWrite16;
>
> +    CpuIoWrite32 = MmioWrite32;
>
>    }
>
>
>
>    for (Uint8Buffer = (UINT8 *)Buffer; Count > 0; Address += InStride, 
> Uint8Buffer += OutStride, Count--) {
>
>      if (OperationWidth == EfiCpuIoWidthUint8) {
>
> -      IoWrite8 ((UINTN)Address, *Uint8Buffer);
>
> +      CpuIoWrite8 ((UINTN)Address, *Uint8Buffer);
>
>      } else if (OperationWidth == EfiCpuIoWidthUint16) {
>
> -      IoWrite16 ((UINTN)Address, *((UINT16 *)Uint8Buffer));
>
> +      CpuIoWrite16 ((UINTN)Address, *((UINT16 *)Uint8Buffer));
>
>      } else if (OperationWidth == EfiCpuIoWidthUint32) {
>
> -      IoWrite32 ((UINTN)Address, *((UINT32 *)Uint8Buffer));
>
> +      CpuIoWrite32 ((UINTN)Address, *((UINT32 *)Uint8Buffer));
>
>      }
>
>    }
>
>
>
> diff --git a/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.h 
> b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.h
>
> index 7ebde0759b..5256a583e1 100644
>
> --- a/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.h
>
> +++ b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.h
>
> @@ -2,6 +2,8 @@
>
>    Internal include file for the CPU I/O 2 Protocol.
>
>
>
>  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>
> +Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
>
> +Copyright (c) 2023 Loongson Technology Corporation Limited. All rights 
> reserved.<BR>
>
>  SPDX-License-Identifier: BSD-2-Clause-Patent
>
>
>
>  **/
>
> diff --git a/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf 
> b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
>
> index 499258491f..271c47371b 100644
>
> --- a/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
>
> +++ b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
>
> @@ -3,6 +3,8 @@
>
>  #
>
>  # Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>
>  # Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>
> +# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
>
> +# Copyright (c) 2023 Loongson Technology Corporation Limited. All rights 
> reserved.<BR>
>
>  #
>
>  # SPDX-License-Identifier: BSD-2-Clause-Patent
>
>  #
>
> @@ -20,7 +22,7 @@
>
>  #
>
>  # The following information is for reference only and not required by the 
> build tools.
>
>  #
>
> -#  VALID_ARCHITECTURES           = IA32 X64 EBC
>
> +#  VALID_ARCHITECTURES           = IA32 X64 EBC ARM AARCH64 LOONGARCH64
>
>  #
>
>
>
>  [Sources]
>
> @@ -37,6 +39,10 @@
>
>    IoLib
>
>    UefiBootServicesTableLib
>
>
>
> +[Pcd]
>
> +  gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslationIsEnabled
>
> +  gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation
>
> +
>
>  [Protocols]
>
>    gEfiCpuIo2ProtocolGuid                         ## PRODUCES
>
>
>
> diff --git a/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.uni 
> b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.uni
>
> index 8d4e5dd6b4..14a36ff888 100644
>
> --- a/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.uni
>
> +++ b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.uni
>
> @@ -4,6 +4,8 @@
>
>  // Produces the CPU I/O 2 Protocol by using the services of the I/O Library.
>
>  //
>
>  // Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>
> +// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
>
> +// Copyright (c) 2023 Loongson Technology Corporation Limited. All rights 
> reserved.<BR>
>
>  //
>
>  // SPDX-License-Identifier: BSD-2-Clause-Patent
>
>  //
>
> 


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


Reply via email to