public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Duran, Leo" <leo.duran@amd.com>
To: "Fan, Jeff" <jeff.fan@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Singh, Brijesh" <brijesh.singh@amd.com>,
	"Justen, Jordan L" <jordan.l.justen@intel.com>,
	"Gao, Liming" <liming.gao@intel.com>,
	"Kinney, Michael D" <michael.d.kinney@intel.com>,
	"lersek@redhat.com" <lersek@redhat.com>
Subject: Re: [PATCH 1/8] MdePkg: Expand BaseIoLibIntrinsic (IoLib class) library
Date: Thu, 12 Jan 2017 01:36:04 +0000	[thread overview]
Message-ID: <DM5PR12MB124383DB0479714CA43162D3F9790@DM5PR12MB1243.namprd12.prod.outlook.com> (raw)
In-Reply-To: <542CF652F8836A4AB8DBFAAD40ED192A4C51324D@shsmsx102.ccr.corp.intel.com>

Jeff,
Please see inline below.
Leo

> -----Original Message-----
> From: Fan, Jeff [mailto:jeff.fan@intel.com]
> Sent: Wednesday, January 11, 2017 7:33 PM
> To: Duran, Leo <leo.duran@amd.com>; edk2-devel@lists.01.org
> Cc: Singh, Brijesh <brijesh.singh@amd.com>; Justen, Jordan L
> <jordan.l.justen@intel.com>; Gao, Liming <liming.gao@intel.com>; Kinney,
> Michael D <michael.d.kinney@intel.com>; lersek@redhat.com
> Subject: RE: [edk2] [PATCH 1/8] MdePkg: Expand BaseIoLibIntrinsic (IoLib
> class) library
> 
> Leo,
> 
> +VOID
> +EFIAPI
> +IoWriteFifo8 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  );
> 
> Buffer should be "IN" instead of "OUT". I understand you just copied original
> code from UefiCpuPkg.
> 
> It's better you could update it in your v2 patch serial.
[Duran, Leo] You bet, I'll take care of that. Thanks.

> 
> Thanks!
> Jeff
> 
> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Leo Duran
> Sent: Wednesday, January 11, 2017 7:56 AM
> To: edk2-devel@lists.01.org
> Cc: brijesh.singh@amd.com; Justen, Jordan L; Gao, Liming; Leo Duran;
> Kinney, Michael D; lersek@redhat.com; Fan, Jeff
> Subject: [edk2] [PATCH 1/8] MdePkg: Expand BaseIoLibIntrinsic (IoLib class)
> library
> 
> The UefiCpuPkg/CpuIo2Dxe driver and the QemuCfgLib library have
> duplicate implementations of I/O Fifo routines. This patch ports the I/O Fifo
> routines into the BaseIoLibIntrinsic library and expand the IoLib class to
> include the ported I/O Fifo routines.
> 
> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
> Signed-off-by: Leo Duran  <leo.duran@amd.com>
> ---
>  MdePkg/Include/Library/IoLib.h                     | 158 ++++++++++++++++
>  .../BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf      |   6 +-
>  MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.asm  | 141
> +++++++++++++++  MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.nasm |
> 137 ++++++++++++++
>  MdePkg/Library/BaseIoLibIntrinsic/IoLibArm.c       | 182
> +++++++++++++++++++
>  MdePkg/Library/BaseIoLibIntrinsic/IoLibEbc.c       | 179
> ++++++++++++++++++
>  MdePkg/Library/BaseIoLibIntrinsic/IoLibIpf.c       | 201
> +++++++++++++++++++++
>  MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.asm   | 127 +++++++++++++
>  MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.nasm  | 126 +++++++++++++
>  9 files changed, 1256 insertions(+), 1 deletion(-)  create mode 100644
> MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.asm
>  create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.nasm
>  create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.asm
>  create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.nasm
> 
> diff --git a/MdePkg/Include/Library/IoLib.h
> b/MdePkg/Include/Library/IoLib.h index a0dd16b..708612e 100644
> --- a/MdePkg/Include/Library/IoLib.h
> +++ b/MdePkg/Include/Library/IoLib.h
> @@ -2,6 +2,8 @@
>    Provide services to access I/O Ports and MMIO registers.
> 
>  Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> +
>  This program and the accompanying materials  are licensed and made
> available under the terms and conditions of the BSD License  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -324,6 +326,58 @@ IoBitFieldAndThenOr8 (
>    );
> 
>  /**
> +  Reads an 8-bit I/O port fifo into a block of memory.
> +
> +  Reads the 8-bit I/O fifo port specified by Port.
> +
> +  The port is read Count times, and the read data is  stored in the
> + provided Buffer.
> +
> +  This function must guarantee that all I/O read and write operations
> + are  serialized.
> +
> +  If 8-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to read.
> +  @param  Count   The number of times to read I/O port.
> +  @param  Buffer  The buffer to store the read data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoReadFifo8 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  );
> +
> +/**
> +  Writes a block of memory into an 8-bit I/O port fifo.
> +
> +  Writes the 8-bit I/O fifo port specified by Port.
> +
> +  The port is written Count times, and the write data is  retrieved
> + from the provided Buffer.
> +
> +  This function must guarantee that all I/O write and write operations
> + are  serialized.
> +
> +  If 8-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to write.
> +  @param  Count   The number of times to write I/O port.
> +  @param  Buffer  The buffer to store the write data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoWriteFifo8 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  );
> +
> +/**
>    Reads a 16-bit I/O port.
> 
>    Reads the 16-bit I/O port specified by Port. The 16-bit read value is
> returned.
> @@ -625,6 +679,58 @@ IoBitFieldAndThenOr16 (
>    );
> 
>  /**
> +  Reads a 16-bit I/O port fifo into a block of memory.
> +
> +  Reads the 16-bit I/O fifo port specified by Port.
> +
> +  The port is read Count times, and the read data is  stored in the
> + provided Buffer.
> +
> +  This function must guarantee that all I/O read and write operations
> + are  serialized.
> +
> +  If 16-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to read.
> +  @param  Count   The number of times to read I/O port.
> +  @param  Buffer  The buffer to store the read data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoReadFifo16 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  );
> +
> +/**
> +  Writes a block of memory into a 16-bit I/O port fifo.
> +
> +  Writes the 16-bit I/O fifo port specified by Port.
> +
> +  The port is written Count times, and the write data is  retrieved
> + from the provided Buffer.
> +
> +  This function must guarantee that all I/O write and write operations
> + are  serialized.
> +
> +  If 16-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to write.
> +  @param  Count   The number of times to write I/O port.
> +  @param  Buffer  The buffer to store the write data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoWriteFifo16 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  );
> +
> +/**
>    Reads a 32-bit I/O port.
> 
>    Reads the 32-bit I/O port specified by Port. The 32-bit read value is
> returned.
> @@ -926,6 +1032,58 @@ IoBitFieldAndThenOr32 (
>    );
> 
>  /**
> +  Reads a 32-bit I/O port fifo into a block of memory.
> +
> +  Reads the 32-bit I/O fifo port specified by Port.
> +
> +  The port is read Count times, and the read data is  stored in the
> + provided Buffer.
> +
> +  This function must guarantee that all I/O read and write operations
> + are  serialized.
> +
> +  If 32-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to read.
> +  @param  Count   The number of times to read I/O port.
> +  @param  Buffer  The buffer to store the read data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoReadFifo32 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  );
> +
> +/**
> +  Writes a block of memory into a 32-bit I/O port fifo.
> +
> +  Writes the 32-bit I/O fifo port specified by Port.
> +
> +  The port is written Count times, and the write data is  retrieved
> + from the provided Buffer.
> +
> +  This function must guarantee that all I/O write and write operations
> + are  serialized.
> +
> +  If 32-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to write.
> +  @param  Count   The number of times to write I/O port.
> +  @param  Buffer  The buffer to store the write data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoWriteFifo32 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  );
> +
> +/**
>    Reads a 64-bit I/O port.
> 
>    Reads the 64-bit I/O port specified by Port. The 64-bit read value is
> returned.
> diff --git a/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf
> b/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf
> index 29b9e8b..8844b1c 100644
> --- a/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf
> +++ b/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf
> @@ -8,6 +8,7 @@
>  #
>  #  Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>  #
> Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>  #
>  #  This program and the accompanying materials  #  are licensed and made
> available under the terms and conditions of the BSD License @@ -16,7 +17,6
> @@  #  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS
> IS" BASIS,  #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
>  #
> -#
>  ##
> 
>  [Defines]
> @@ -43,12 +43,16 @@ [Sources.IA32]
>    IoLibMsc.c    | MSFT
>    IoLibIcc.c    | INTEL
>    IoLib.c
> +  Ia32/IoFifo.nasm
> +  Ia32/IoFifo.asm
> 
>  [Sources.X64]
>    IoLibGcc.c    | GCC
>    IoLibMsc.c    | MSFT
>    IoLibIcc.c    | INTEL
>    IoLib.c
> +  X64/IoFifo.nasm
> +  X64/IoFifo.asm
> 
>  [Sources.EBC]
>    IoLibEbc.c
> diff --git a/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.asm
> b/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.asm
> new file mode 100644
> index 0000000..d490308
> --- /dev/null
> +++ b/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.asm
> @@ -0,0 +1,141 @@
> +;----------------------------------------------------------------------
> +--------
> +;
> +; Copyright (c) 2006 - 2012, Intel Corporation. All rights
> +reserved.<BR> ; Copyright (c) 2017, AMD Incorporated. All rights
> +reserved.<BR> ; ; This program and the accompanying materials are
> +licensed and made available ; under the terms and conditions of the BSD
> +License which accompanies this ; distribution.  The full text of the
> +license may be found at ;
> +http://opensource.org/licenses/bsd-license.php.
> +;
> +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +;
> +;----------------------------------------------------------------------
> +--------
> +
> +    .586P
> +    .model  flat,C
> +    .code
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoReadFifo8 (
> +;    IN UINTN                  Port,
> +;    IN UINTN                  Size,
> +;    IN VOID                   *Buffer
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +IoReadFifo8 PROC
> +    push    edi
> +    cld
> +    mov     dx, [esp + 8]
> +    mov     ecx, [esp + 12]
> +    mov     edi, [esp + 16]
> +rep insb
> +    pop     edi
> +    ret
> +IoReadFifo8 ENDP
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoReadFifo16 (
> +;    IN UINTN                  Port,
> +;    IN UINTN                  Size,
> +;    IN VOID                   *Buffer
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +IoReadFifo16 PROC
> +    push    edi
> +    cld
> +    mov     dx, [esp + 8]
> +    mov     ecx, [esp + 12]
> +    mov     edi, [esp + 16]
> +rep insw
> +    pop     edi
> +    ret
> +IoReadFifo16 ENDP
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoReadFifo32 (
> +;    IN UINTN                  Port,
> +;    IN UINTN                  Size,
> +;    IN VOID                   *Buffer
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +IoReadFifo32 PROC
> +    push    edi
> +    cld
> +    mov     dx, [esp + 8]
> +    mov     ecx, [esp + 12]
> +    mov     edi, [esp + 16]
> +rep insd
> +    pop     edi
> +    ret
> +IoReadFifo32 ENDP
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoWriteFifo8 (
> +;    IN UINTN                  Port,
> +;    IN UINTN                  Size,
> +;    IN VOID                   *Buffer
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +IoWriteFifo8 PROC
> +    push    esi
> +    cld
> +    mov     dx, [esp + 8]
> +    mov     ecx, [esp + 12]
> +    mov     esi, [esp + 16]
> +rep outsb
> +    pop     esi
> +    ret
> +IoWriteFifo8 ENDP
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoWriteFifo16 (
> +;    IN UINTN                  Port,
> +;    IN UINTN                  Size,
> +;    IN VOID                   *Buffer
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +IoWriteFifo16 PROC
> +    push    esi
> +    cld
> +    mov     dx, [esp + 8]
> +    mov     ecx, [esp + 12]
> +    mov     esi, [esp + 16]
> +rep outsw
> +    pop     esi
> +    ret
> +IoWriteFifo16 ENDP
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoWriteFifo32 (
> +;    IN UINTN                  Port,
> +;    IN UINTN                  Size,
> +;    IN VOID                   *Buffer
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +IoWriteFifo32 PROC
> +    push    esi
> +    cld
> +    mov     dx, [esp + 8]
> +    mov     ecx, [esp + 12]
> +    mov     esi, [esp + 16]
> +rep outsd
> +    pop     esi
> +    ret
> +IoWriteFifo32 ENDP
> +
> +    END
> +
> diff --git a/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.nasm
> b/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.nasm
> new file mode 100644
> index 0000000..a09e75b
> --- /dev/null
> +++ b/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.nasm
> @@ -0,0 +1,137 @@
> +;----------------------------------------------------------------------
> +--------
> +;
> +; Copyright (c) 2006 - 2012, Intel Corporation. All rights
> +reserved.<BR> ; Copyright (c) 2017, AMD Incorporated. All rights
> +reserved.<BR> ; ; This program and the accompanying materials are
> +licensed and made available ; under the terms and conditions of the BSD
> +License which accompanies this ; distribution.  The full text of the
> +license may be found at ;
> +http://opensource.org/licenses/bsd-license.php.
> +;
> +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +;
> +;----------------------------------------------------------------------
> +--------
> +
> +    SECTION .text
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoReadFifo8 (
> +;    IN UINTN                  Port,
> +;    IN UINTN                  Size,
> +;    IN VOID                   *Buffer
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +global ASM_PFX(IoReadFifo8)
> +ASM_PFX(IoReadFifo8):
> +    push    edi
> +    cld
> +    mov     dx, [esp + 8]
> +    mov     ecx, [esp + 12]
> +    mov     edi, [esp + 16]
> +rep insb
> +    pop     edi
> +    ret
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoReadFifo16 (
> +;    IN UINTN                  Port,
> +;    IN UINTN                  Size,
> +;    IN VOID                   *Buffer
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +global ASM_PFX(IoReadFifo16)
> +ASM_PFX(IoReadFifo16):
> +    push    edi
> +    cld
> +    mov     dx, [esp + 8]
> +    mov     ecx, [esp + 12]
> +    mov     edi, [esp + 16]
> +rep insw
> +    pop     edi
> +    ret
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoReadFifo32 (
> +;    IN UINTN                  Port,
> +;    IN UINTN                  Size,
> +;    IN VOID                   *Buffer
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +global ASM_PFX(IoReadFifo32)
> +ASM_PFX(IoReadFifo32):
> +    push    edi
> +    cld
> +    mov     dx, [esp + 8]
> +    mov     ecx, [esp + 12]
> +    mov     edi, [esp + 16]
> +rep insd
> +    pop     edi
> +    ret
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoWriteFifo8 (
> +;    IN UINTN                  Port,
> +;    IN UINTN                  Size,
> +;    IN VOID                   *Buffer
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +global ASM_PFX(IoWriteFifo8)
> +ASM_PFX(IoWriteFifo8):
> +    push    esi
> +    cld
> +    mov     dx, [esp + 8]
> +    mov     ecx, [esp + 12]
> +    mov     esi, [esp + 16]
> +rep outsb
> +    pop     esi
> +    ret
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoWriteFifo16 (
> +;    IN UINTN                  Port,
> +;    IN UINTN                  Size,
> +;    IN VOID                   *Buffer
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +global ASM_PFX(IoWriteFifo16)
> +ASM_PFX(IoWriteFifo16):
> +    push    esi
> +    cld
> +    mov     dx, [esp + 8]
> +    mov     ecx, [esp + 12]
> +    mov     esi, [esp + 16]
> +rep outsw
> +    pop     esi
> +    ret
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoWriteFifo32 (
> +;    IN UINTN                  Port,
> +;    IN UINTN                  Size,
> +;    IN VOID                   *Buffer
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +global ASM_PFX(IoWriteFifo32)
> +ASM_PFX(IoWriteFifo32):
> +    push    esi
> +    cld
> +    mov     dx, [esp + 8]
> +    mov     ecx, [esp + 12]
> +    mov     esi, [esp + 16]
> +rep outsd
> +    pop     esi
> +    ret
> +
> diff --git a/MdePkg/Library/BaseIoLibIntrinsic/IoLibArm.c
> b/MdePkg/Library/BaseIoLibIntrinsic/IoLibArm.c
> index b9f4c5e..301b215 100644
> --- a/MdePkg/Library/BaseIoLibIntrinsic/IoLibArm.c
> +++ b/MdePkg/Library/BaseIoLibIntrinsic/IoLibArm.c
> @@ -3,6 +3,8 @@
> 
>    Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
>    Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> +
>    This program and the accompanying materials
>    are licensed and made available under the terms and conditions of the BSD
> License
>    which accompanies this distribution.  The full text of the license may be
> found at @@ -221,6 +223,186 @@ IoWrite64 (
>    return 0;
>  }
> 
> +/**
> +  Reads an 8-bit I/O port fifo into a block of memory.
> +
> +  Reads the 8-bit I/O fifo port specified by Port.
> +
> +  The port is read Count times, and the read data is  stored in the
> + provided Buffer.
> +
> +  This function must guarantee that all I/O read and write operations
> + are  serialized.
> +
> +  If 8-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to read.
> +  @param  Count   The number of times to read I/O port.
> +  @param  Buffer  The buffer to store the read data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoReadFifo8 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  ASSERT (FALSE);
> +}
> +
> +/**
> +  Writes a block of memory into an 8-bit I/O port fifo.
> +
> +  Writes the 8-bit I/O fifo port specified by Port.
> +
> +  The port is written Count times, and the write data is  retrieved
> + from the provided Buffer.
> +
> +  This function must guarantee that all I/O write and write operations
> + are  serialized.
> +
> +  If 8-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to write.
> +  @param  Count   The number of times to write I/O port.
> +  @param  Buffer  The buffer to store the write data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoWriteFifo8 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  ASSERT (FALSE);
> +}
> +
> +/**
> +  Reads a 16-bit I/O port fifo into a block of memory.
> +
> +  Reads the 16-bit I/O fifo port specified by Port.
> +
> +  The port is read Count times, and the read data is  stored in the
> + provided Buffer.
> +
> +  This function must guarantee that all I/O read and write operations
> + are  serialized.
> +
> +  If 16-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to read.
> +  @param  Count   The number of times to read I/O port.
> +  @param  Buffer  The buffer to store the read data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoReadFifo16 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  ASSERT (FALSE);
> +}
> +
> +/**
> +  Writes a block of memory into a 16-bit I/O port fifo.
> +
> +  Writes the 16-bit I/O fifo port specified by Port.
> +
> +  The port is written Count times, and the write data is  retrieved
> + from the provided Buffer.
> +
> +  This function must guarantee that all I/O write and write operations
> + are  serialized.
> +
> +  If 16-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to write.
> +  @param  Count   The number of times to write I/O port.
> +  @param  Buffer  The buffer to store the write data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoWriteFifo16 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  ASSERT (FALSE);
> +}
> +
> +/**
> +  Reads a 32-bit I/O port fifo into a block of memory.
> +
> +  Reads the 32-bit I/O fifo port specified by Port.
> +
> +
> +  The port is read Count times, and the read data is  stored in the
> + provided Buffer.
> +
> +  This function must guarantee that all I/O read and write operations
> + are
> +
> +  serialized.
> +
> +  If 32-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to read.
> +
> +  @param  Count   The number of times to read I/O port.
> +  @param  Buffer  The buffer to store the read data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoReadFifo32 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  ASSERT (FALSE);
> +}
> +
> +/**
> +
> +  Writes a block of memory into a 32-bit I/O port fifo.
> +
> +  Writes the 32-bit I/O fifo port specified by Port.
> +
> +  The port is written Count times, and the write data is
> +
> +  retrieved from the provided Buffer.
> +
> +  This function must guarantee that all I/O write and write operations
> + are  serialized.
> +
> +
> +  If 32-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to write.
> +  @param  Count   The number of times to write I/O port.
> +  @param  Buffer  The buffer to store the write data into.
> +
> +
> +**/
> +VOID
> +EFIAPI
> +IoWriteFifo32 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  ASSERT (FALSE);
> +}
> 
>  /**
>    Reads an 8-bit MMIO register.
> diff --git a/MdePkg/Library/BaseIoLibIntrinsic/IoLibEbc.c
> b/MdePkg/Library/BaseIoLibIntrinsic/IoLibEbc.c
> index e12a5ae..5bc539b 100644
> --- a/MdePkg/Library/BaseIoLibIntrinsic/IoLibEbc.c
> +++ b/MdePkg/Library/BaseIoLibIntrinsic/IoLibEbc.c
> @@ -4,6 +4,8 @@
>    EBC does not support port I/O.  All APIs in this file ASSERT().
> 
>    Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> +
>    This program and the accompanying materials
>    are licensed and made available under the terms and conditions of the BSD
> License
>    which accompanies this distribution.  The full text of the license may be
> found at @@ -169,3 +171,180 @@ IoWrite32 (
>    ASSERT (FALSE);
>    return 0;
>  }
> +
> +/**
> +  Reads an 8-bit I/O port fifo into a block of memory.
> +
> +  Reads the 8-bit I/O fifo port specified by Port.
> +
> +  The port is read Count times, and the read data is  stored in the
> + provided Buffer.
> +
> +  This function must guarantee that all I/O read and write operations
> + are  serialized.
> +
> +  If 8-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to read.
> +  @param  Count   The number of times to read I/O port.
> +  @param  Buffer  The buffer to store the read data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoReadFifo8 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  ASSERT (FALSE);
> +}
> +
> +/**
> +  Writes a block of memory into an 8-bit I/O port fifo.
> +
> +  Writes the 8-bit I/O fifo port specified by Port.
> +
> +  The port is written Count times, and the write data is  retrieved
> + from the provided Buffer.
> +
> +  This function must guarantee that all I/O write and write operations
> + are  serialized.
> +
> +  If 8-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to write.
> +  @param  Count   The number of times to write I/O port.
> +  @param  Buffer  The buffer to store the write data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoWriteFifo8 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  ASSERT (FALSE);
> +}
> +
> +/**
> +  Reads a 16-bit I/O port fifo into a block of memory.
> +
> +  Reads the 16-bit I/O fifo port specified by Port.
> +
> +  The port is read Count times, and the read data is  stored in the
> + provided Buffer.
> +
> +  This function must guarantee that all I/O read and write operations
> + are  serialized.
> +
> +  If 16-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to read.
> +  @param  Count   The number of times to read I/O port.
> +  @param  Buffer  The buffer to store the read data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoReadFifo16 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  ASSERT (FALSE);
> +}
> +
> +/**
> +  Writes a block of memory into a 16-bit I/O port fifo.
> +
> +  Writes the 16-bit I/O fifo port specified by Port.
> +
> +
> +  The port is written Count times, and the write data is  retrieved
> + from the provided Buffer.
> +
> +  This function must guarantee that all I/O write and write operations
> + are
> +
> +  serialized.
> +
> +  If 16-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to write.
> +
> +  @param  Count   The number of times to write I/O port.
> +  @param  Buffer  The buffer to store the write data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoWriteFifo16 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  ASSERT (FALSE);
> +}
> +/**
> +  Reads a 32-bit I/O port fifo into a block of memory.
> +
> +  Reads the 32-bit I/O fifo port specified by Port.
> +
> +  The port is read Count times, and the read data is  stored in the
> + provided Buffer.
> +
> +  This function must guarantee that all I/O read and write operations
> + are  serialized.
> +
> +  If 32-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to read.
> +  @param  Count   The number of times to read I/O port.
> +  @param  Buffer  The buffer to store the read data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoReadFifo32 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  ASSERT (FALSE);
> +}
> +
> +/**
> +  Writes a block of memory into a 32-bit I/O port fifo.
> +
> +  Writes the 32-bit I/O fifo port specified by Port.
> +
> +  The port is written Count times, and the write data is  retrieved
> + from the provided Buffer.
> +
> +  This function must guarantee that all I/O write and write operations
> + are  serialized.
> +
> +  If 32-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to write.
> +  @param  Count   The number of times to write I/O port.
> +  @param  Buffer  The buffer to store the write data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoWriteFifo32 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  ASSERT (FALSE);
> +}
> +
> diff --git a/MdePkg/Library/BaseIoLibIntrinsic/IoLibIpf.c
> b/MdePkg/Library/BaseIoLibIntrinsic/IoLibIpf.c
> index 6b0bf6a..a2e183c 100644
> --- a/MdePkg/Library/BaseIoLibIntrinsic/IoLibIpf.c
> +++ b/MdePkg/Library/BaseIoLibIntrinsic/IoLibIpf.c
> @@ -2,6 +2,8 @@
>    Common I/O Library routines.
> 
>    Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> +
>    This program and the accompanying materials
>    are licensed and made available under the terms and conditions of the BSD
> License
>    which accompanies this distribution.  The full text of the license may be
> found at @@ -147,6 +149,7 @@ IoRead64 (
>    return 0;
>  }
> 
> +
>  /**
>    Writes an 8-bit I/O port.
> 
> @@ -252,6 +255,204 @@ IoWrite64 (
>  }
> 
>  /**
> +  Reads an 8-bit I/O port fifo into a block of memory.
> +
> +  Reads the 8-bit I/O fifo port specified by Port.
> +
> +  The port is read Count times, and the read data is  stored in the
> + provided Buffer.
> +
> +  This function must guarantee that all I/O read and write operations
> + are  serialized.
> +
> +  If 8-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to read.
> +  @param  Count   The number of times to read I/O port.
> +  @param  Buffer  The buffer to store the read data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoReadFifo8 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  UINT8 *Buffer8 = (UINT8 *)Buffer;
> +
> +  while (Count--) {
> +    *Buffer8++ = IoRead8 (Port);
> +  }
> +}
> +
> +/**
> +  Reads a 16-bit I/O port fifo into a block of memory.
> +
> +  Reads the 16-bit I/O fifo port specified by Port.
> +
> +  The port is read Count times, and the read data is  stored in the
> + provided Buffer.
> +
> +  This function must guarantee that all I/O read and write operations
> + are  serialized.
> +
> +  If 16-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to read.
> +  @param  Count   The number of times to read I/O port.
> +  @param  Buffer  The buffer to store the read data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoReadFifo16 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  UINT16 *Buffer16 = (UINT16 *)Buffer;
> +
> +  while (Count--) {
> +    *Buffer16++ = IoRead16 (Port);
> +  }
> +}
> +
> +/**
> +  Reads a 32-bit I/O port fifo into a block of memory.
> +
> +  Reads the 32-bit I/O fifo port specified by Port.
> +
> +  The port is read Count times, and the read data is  stored in the
> + provided Buffer.
> +
> +  This function must guarantee that all I/O read and write operations
> + are  serialized.
> +
> +  If 32-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to read.
> +  @param  Count   The number of times to read I/O port.
> +  @param  Buffer  The buffer to store the read data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoReadFifo32 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  UINT32 *Buffer32 = (UINT32 *)Buffer;
> +
> +  while (Count--) {
> +    *Buffer32++ = IoRead32 (Port);
> +  }
> +}
> +
> +/**
> +  Writes a block of memory into an 8-bit I/O port fifo.
> +
> +  Writes the 8-bit I/O fifo port specified by Port.
> +
> +  The port is written Count times, and the write data is  retrieved
> + from the provided Buffer.
> +
> +  This function must guarantee that all I/O write and write operations
> + are  serialized.
> +
> +  If 8-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to write.
> +  @param  Count   The number of times to write I/O port.
> +  @param  Buffer  The buffer to store the write data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoWriteFifo8 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  UINT8 *Buffer8 = (UINT8 *)Buffer;
> +
> +  while (Count--) {
> +    IoWrite8 (Port, *Buffer8++);
> +  }
> +}
> +
> +/**
> +  Writes a block of memory into a 16-bit I/O port fifo.
> +
> +  Writes the 16-bit I/O fifo port specified by Port.
> +
> +  The port is written Count times, and the write data is  retrieved
> + from the provided Buffer.
> +
> +  This function must guarantee that all I/O write and write operations
> + are  serialized.
> +
> +  If 16-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to write.
> +  @param  Count   The number of times to write I/O port.
> +  @param  Buffer  The buffer to store the write data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoWriteFifo16 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  UINT16 *Buffer16 = (UINT16 *)Buffer;
> +
> +  while (Count--) {
> +    IoWrite16 (Port, *Buffer16++);
> +  }
> +}
> +
> +/**
> +  Writes a block of memory into a 32-bit I/O port fifo.
> +
> +  Writes the 32-bit I/O fifo port specified by Port.
> +
> +  The port is written Count times, and the write data is  retrieved
> + from the provided Buffer.
> +
> +  This function must guarantee that all I/O write and write operations
> + are  serialized.
> +
> +  If 32-bit I/O port operations are not supported, then ASSERT().
> +
> +  @param  Port    The I/O port to write.
> +  @param  Count   The number of times to write I/O port.
> +  @param  Buffer  The buffer to store the write data into.
> +
> +**/
> +VOID
> +EFIAPI
> +IoWriteFifo32 (
> +  IN      UINTN                     Port,
> +  IN      UINTN                     Count,
> +  OUT     VOID                      *Buffer
> +  )
> +{
> +  UINT32 *Buffer32 = (UINT32 *)Buffer;
> +
> +  while (Count--) {
> +    IoWrite32 (Port, *Buffer32++);
> +  }
> +}
> +
> +/**
>    Reads an 8-bit MMIO register.
> 
>    Reads the 8-bit MMIO register specified by Address. The 8-bit read value is
> diff --git a/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.asm
> b/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.asm
> new file mode 100644
> index 0000000..71ce6e8
> --- /dev/null
> +++ b/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.asm
> @@ -0,0 +1,127 @@
> +;----------------------------------------------------------------------
> +--------
> +;
> +; Copyright (c) 2006 - 2012, Intel Corporation. All rights
> +reserved.<BR> ; Copyright (c) 2017, AMD Incorporated. All rights
> +reserved.<BR> ; ; This program and the accompanying materials are
> +licensed and made available ; under the terms and conditions of the BSD
> +License which accompanies this ; distribution.  The full text of the
> +license may be found at ;
> +http://opensource.org/licenses/bsd-license.php.
> +;
> +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +;
> +;----------------------------------------------------------------------
> +--------
> +
> +    .code
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoReadFifo8 (
> +;    IN UINTN                  Port,              // rcx
> +;    IN UINTN                  Size,              // rdx
> +;    IN VOID                   *Buffer            // r8
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +IoReadFifo8 PROC
> +    cld
> +    xchg    rcx, rdx
> +    xchg    rdi, r8             ; rdi: buffer address; r8: save rdi
> +rep insb
> +    mov     rdi, r8             ; restore rdi
> +    ret
> +IoReadFifo8 ENDP
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoReadFifo16 (
> +;    IN UINTN                  Port,              // rcx
> +;    IN UINTN                  Size,              // rdx
> +;    IN VOID                   *Buffer            // r8
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +IoReadFifo16 PROC
> +    cld
> +    xchg    rcx, rdx
> +    xchg    rdi, r8             ; rdi: buffer address; r8: save rdi
> +rep insw
> +    mov     rdi, r8             ; restore rdi
> +    ret
> +IoReadFifo16 ENDP
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoReadFifo32 (
> +;    IN UINTN                  Port,              // rcx
> +;    IN UINTN                  Size,              // rdx
> +;    IN VOID                   *Buffer            // r8
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +IoReadFifo32 PROC
> +    cld
> +    xchg    rcx, rdx
> +    xchg    rdi, r8             ; rdi: buffer address; r8: save rdi
> +rep insd
> +    mov     rdi, r8             ; restore rdi
> +    ret
> +IoReadFifo32 ENDP
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoWriteFifo8 (
> +;    IN UINTN                  Port,              // rcx
> +;    IN UINTN                  Size,              // rdx
> +;    IN VOID                   *Buffer            // r8
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +IoWriteFifo8 PROC
> +    cld
> +    xchg    rcx, rdx
> +    xchg    rsi, r8             ; rsi: buffer address; r8: save rsi
> +rep outsb
> +    mov     rsi, r8             ; restore rsi
> +    ret
> +IoWriteFifo8 ENDP
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoWriteFifo16 (
> +;    IN UINTN                  Port,              // rcx
> +;    IN UINTN                  Size,              // rdx
> +;    IN VOID                   *Buffer            // r8
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +IoWriteFifo16 PROC
> +    cld
> +    xchg    rcx, rdx
> +    xchg    rsi, r8             ; rsi: buffer address; r8: save rsi
> +rep outsw
> +    mov     rsi, r8             ; restore rsi
> +    ret
> +IoWriteFifo16 ENDP
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoWriteFifo32 (
> +;    IN UINTN                  Port,              // rcx
> +;    IN UINTN                  Size,              // rdx
> +;    IN VOID                   *Buffer            // r8
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +IoWriteFifo32 PROC
> +    cld
> +    xchg    rcx, rdx
> +    xchg    rsi, r8             ; rsi: buffer address; r8: save rsi
> +rep outsd
> +    mov     rsi, r8             ; restore rsi
> +    ret
> +IoWriteFifo32 ENDP
> +
> +    END
> +
> diff --git a/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.nasm
> b/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.nasm
> new file mode 100644
> index 0000000..7ca2ba3
> --- /dev/null
> +++ b/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.nasm
> @@ -0,0 +1,126 @@
> +;----------------------------------------------------------------------
> +--------
> +;
> +; Copyright (c) 2006 - 2012, Intel Corporation. All rights
> +reserved.<BR> ; Copyright (c) 2017, AMD Incorporated. All rights
> +reserved.<BR> ; ; This program and the accompanying materials are
> +licensed and made available ; under the terms and conditions of the BSD
> +License which accompanies this ; distribution.  The full text of the
> +license may be found at ;
> +http://opensource.org/licenses/bsd-license.php.
> +;
> +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +;
> +;----------------------------------------------------------------------
> +--------
> +
> +    DEFAULT REL
> +    SECTION .text
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoReadFifo8 (
> +;    IN UINTN                  Port,              // rcx
> +;    IN UINTN                  Size,              // rdx
> +;    IN VOID                   *Buffer            // r8
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +global ASM_PFX(IoReadFifo8)
> +ASM_PFX(IoReadFifo8):
> +    cld
> +    xchg    rcx, rdx
> +    xchg    rdi, r8             ; rdi: buffer address; r8: save rdi
> +rep insb
> +    mov     rdi, r8             ; restore rdi
> +    ret
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoReadFifo16 (
> +;    IN UINTN                  Port,              // rcx
> +;    IN UINTN                  Size,              // rdx
> +;    IN VOID                   *Buffer            // r8
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +global ASM_PFX(IoReadFifo16)
> +ASM_PFX(IoReadFifo16):
> +    cld
> +    xchg    rcx, rdx
> +    xchg    rdi, r8             ; rdi: buffer address; r8: save rdi
> +rep insw
> +    mov     rdi, r8             ; restore rdi
> +    ret
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoReadFifo32 (
> +;    IN UINTN                  Port,              // rcx
> +;    IN UINTN                  Size,              // rdx
> +;    IN VOID                   *Buffer            // r8
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +global ASM_PFX(IoReadFifo32)
> +ASM_PFX(IoReadFifo32):
> +    cld
> +    xchg    rcx, rdx
> +    xchg    rdi, r8             ; rdi: buffer address; r8: save rdi
> +rep insd
> +    mov     rdi, r8             ; restore rdi
> +    ret
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoWriteFifo8 (
> +;    IN UINTN                  Port,              // rcx
> +;    IN UINTN                  Size,              // rdx
> +;    IN VOID                   *Buffer            // r8
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +global ASM_PFX(IoWriteFifo8)
> +ASM_PFX(IoWriteFifo8):
> +    cld
> +    xchg    rcx, rdx
> +    xchg    rsi, r8             ; rsi: buffer address; r8: save rsi
> +rep outsb
> +    mov     rsi, r8             ; restore rsi
> +    ret
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoWriteFifo16 (
> +;    IN UINTN                  Port,              // rcx
> +;    IN UINTN                  Size,              // rdx
> +;    IN VOID                   *Buffer            // r8
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +global ASM_PFX(IoWriteFifo16)
> +ASM_PFX(IoWriteFifo16):
> +    cld
> +    xchg    rcx, rdx
> +    xchg    rsi, r8             ; rsi: buffer address; r8: save rsi
> +rep outsw
> +    mov     rsi, r8             ; restore rsi
> +    ret
> +
> +;----------------------------------------------------------------------
> +--------
> +;  VOID
> +;  EFIAPI
> +;  IoWriteFifo32 (
> +;    IN UINTN                  Port,              // rcx
> +;    IN UINTN                  Size,              // rdx
> +;    IN VOID                   *Buffer            // r8
> +;    );
> +;----------------------------------------------------------------------
> +--------
> +global ASM_PFX(IoWriteFifo32)
> +ASM_PFX(IoWriteFifo32):
> +    cld
> +    xchg    rcx, rdx
> +    xchg    rsi, r8             ; rsi: buffer address; r8: save rsi
> +rep outsd
> +    mov     rsi, r8             ; restore rsi
> +    ret
> +
> --
> 1.9.1
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


  reply	other threads:[~2017-01-12  1:36 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-10 23:55 [PATCH 0/8] IoLib class library Leo Duran
2017-01-10 23:55 ` [PATCH 1/8] MdePkg: Expand BaseIoLibIntrinsic (IoLib class) library Leo Duran
2017-01-12  1:33   ` Fan, Jeff
2017-01-12  1:36     ` Duran, Leo [this message]
2017-01-10 23:55 ` [PATCH 2/8] MdePkg/DxeIoLibCpuIo2: Add new Fifo routines in IoLib class Leo Duran
2017-01-10 23:55 ` [PATCH 3/8] MdePkg/DxeIoLibEsal: " Leo Duran
2017-01-10 23:55 ` [PATCH 4/8] MdePkg/PeiIoLibCpuIo: " Leo Duran
2017-01-10 23:55 ` [PATCH 5/8] MdePkg/SmmIoLibSmmCpuIo2: " Leo Duran
2017-01-10 23:55 ` [PATCH 6/8] IntelFrameworkPkg/DxeIoLibCpuIo: " Leo Duran
2017-01-10 23:55 ` [PATCH 7/8] UefiCpuPkg: Modify CpuIo2Dxe to use new IoLib class library Leo Duran
2017-01-10 23:55 ` [PATCH 8/8] OvmfPkg: Modify QemuFwCfgLib " Leo Duran
2017-01-11  1:41 ` [PATCH 0/8] " Gao, Liming
2017-01-11  1:45   ` Fan, Jeff
2017-01-11  1:52     ` Gao, Liming
2017-01-11  3:37   ` Duran, Leo
2017-01-11  4:06     ` Gao, Liming
2017-01-11 16:29       ` Duran, Leo
2017-01-12  1:22         ` Gao, Liming
2017-01-12  1:34           ` Duran, Leo
2017-01-12  1:39             ` Gao, Liming
2017-01-12  1:51               ` Duran, Leo
2017-01-12  4:25                 ` Gao, Liming
2017-01-12 17:13                   ` Jordan Justen
2017-01-17  2:50                   ` Gao, Liming
2017-01-12  0:25       ` Duran, Leo

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=DM5PR12MB124383DB0479714CA43162D3F9790@DM5PR12MB1243.namprd12.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