Merged: https://github.com/tianocore/edk2/pull/5138
> -----Original Message----- > From: Kinney, Michael D <michael.d.kin...@intel.com> > Sent: Monday, December 11, 2023 9:34 AM > To: Tan, Dun <dun....@intel.com>; devel@edk2.groups.io > Cc: Gao, Liming <gaolim...@byosoft.com.cn>; Liu, Zhiguang > <zhiguang....@intel.com>; Ni, Ray <ray...@intel.com>; Kinney, Michael D > <michael.d.kin...@intel.com> > Subject: RE: [edk2-devel] [PATCH 2/2] MdePkg:simplify Fifo API in > BaseIoLibIntrinsic > > Acked-by: Michael D Kinney <michael.d.kin...@intel.com> > > Mike > > > -----Original Message----- > > From: Tan, Dun <dun....@intel.com> > > Sent: Wednesday, December 6, 2023 1:26 AM > > To: devel@edk2.groups.io; Tan, Dun <dun....@intel.com> > > Cc: Kinney, Michael D <michael.d.kin...@intel.com>; Gao, Liming > > <gaolim...@byosoft.com.cn>; Liu, Zhiguang <zhiguang....@intel.com>; > Ni, > > Ray <ray...@intel.com> > > Subject: RE: [edk2-devel] [PATCH 2/2] MdePkg:simplify Fifo API in > > BaseIoLibIntrinsic > > > > Hi Mike and Liming, > > > > Could you please help to review this patch? > > > > Thanks, > > Dun > > > > -----Original Message----- > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of duntan > > Sent: Thursday, November 9, 2023 10:50 AM > > To: devel@edk2.groups.io > > Cc: Kinney, Michael D <michael.d.kin...@intel.com>; Gao, Liming > > <gaolim...@byosoft.com.cn>; Liu, Zhiguang <zhiguang....@intel.com>; > Ni, > > Ray <ray...@intel.com> > > Subject: [edk2-devel] [PATCH 2/2] MdePkg:simplify Fifo API in > > BaseIoLibIntrinsic > > > > Simplify IoRead/WriteFifo implement by repeatedly calling IoRead/Write > > in the C code. > > This can avoid calling assembly code to use string I/O instructions. > > With this change Ia32/IoFifo.nasm and X64/IoFifo.nasm can be removed. > > Then the source files for IA32 and X64 are the same. > > > > Signed-off-by: Dun Tan <dun....@intel.com> > > Cc: Michael D Kinney <michael.d.kin...@intel.com> > > Cc: Liming Gao <gaolim...@byosoft.com.cn> > > Cc: Zhiguang Liu <zhiguang....@intel.com> > > Cc: Ray Ni <ray...@intel.com> > > --- > > MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf | 10 ++---- > -- > > -- > > MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.nasm | 131 ------ > -- > > ---------------------------------------------------------------------- > -- > > --------------------------------------------------- > > MdePkg/Library/BaseIoLibIntrinsic/IoLibFifo.c | 220 > > > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > ++++ > > MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.nasm | 120 ------ > -- > > ---------------------------------------------------------------------- > -- > > ---------------------------------------- > > 4 files changed, 222 insertions(+), 259 deletions(-) > > > > diff --git a/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf > > b/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf > > index aeb072ee95..b587e2cded 100644 > > --- a/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf > > +++ b/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf > > @@ -38,17 +38,11 @@ > > IoLibInternalTdxNull.c > > IoLibTdx.h > > > > -[Sources.IA32] > > +[Sources.IA32, Sources.X64] > > IoLibGcc.c | GCC > > IoLibMsc.c | MSFT > > IoLib.c > > - Ia32/IoFifo.nasm > > - > > -[Sources.X64] > > - IoLibGcc.c | GCC > > - IoLibMsc.c | MSFT > > - IoLib.c > > - X64/IoFifo.nasm > > + IoLibFifo.c > > > > [Sources.EBC] > > IoLibEbc.c > > diff --git a/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.nasm > > b/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.nasm > > deleted file mode 100644 > > index a4ae1a0053..0000000000 > > --- a/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifo.nasm > > +++ /dev/null > > @@ -1,131 +0,0 @@ > > -;-------------------------------------------------------------------- > -- > > -------- > > -; > > -; Copyright (c) 2006 - 2012, Intel Corporation. All rights > > reserved.<BR> -; Copyright (c) 2017, AMD Incorporated. All rights > > reserved.<BR> -; -; SPDX-License-Identifier: BSD-2-Clause-Patent -; > > -;-------------------------------------------------------------------- > -- > > -------- > > - > > - SECTION .text > > - > > -;-------------------------------------------------------------------- > -- > > -------- > > -; VOID > > -; EFIAPI > > -; IoReadFifo8 ( > > -; IN UINTN Port, > > -; IN UINTN Size, > > -; OUT 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, > > -; OUT 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, > > -; OUT 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/IoLibFifo.c > > b/MdePkg/Library/BaseIoLibIntrinsic/IoLibFifo.c > > new file mode 100644 > > index 0000000000..bd1d372d0f > > --- /dev/null > > +++ b/MdePkg/Library/BaseIoLibIntrinsic/IoLibFifo.c > > @@ -0,0 +1,220 @@ > > +/** @file > > + IoFifo read/write routines. > > + > > + Copyright (c) 2021 - 2023, Intel Corporation. All rights > > + reserved.<BR> > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > + > > +#include "BaseIoLibIntrinsicInternal.h" > > +#include <Uefi/UefiBaseType.h> > > + > > +/** > > + 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(). > > + > > + In TDX a serial of TdIoRead8 is invoked to read the I/O port fifo. > > + > > + @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; > > + > > + Buffer8 = (UINT8 *)Buffer; > > + while (Count-- > 0) { > > + *Buffer8++ = IoRead8 (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(). > > + > > + In TDX a serial of TdIoWrite8 is invoked to write data to the I/O > > port. > > + > > + @param Port The I/O port to write. > > + @param Count The number of times to write I/O port. > > + @param Buffer The buffer to retrieve the write data from. > > + > > +**/ > > +VOID > > +EFIAPI > > +IoWriteFifo8 ( > > + IN UINTN Port, > > + IN UINTN Count, > > + IN VOID *Buffer > > + ) > > +{ > > + UINT8 *Buffer8; > > + > > + Buffer8 = (UINT8 *)Buffer; > > + while (Count-- > 0) { > > + IoWrite8 (Port, *Buffer8++); > > + } > > +} > > + > > +/** > > + 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(). > > + > > + In TDX a serial of TdIoRead16 is invoked to read data from the I/O > > port. > > + > > + @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; > > + > > + Buffer16 = (UINT16 *)Buffer; > > + while (Count-- > 0) { > > + *Buffer16++ = IoRead16 (Port); > > + } > > +} > > + > > +/** > > + 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(). > > + > > + In TDX a serial of TdIoWrite16 is invoked to write data to the I/O > > port. > > + > > + @param Port The I/O port to write. > > + @param Count The number of times to write I/O port. > > + @param Buffer The buffer to retrieve the write data from. > > + > > +**/ > > +VOID > > +EFIAPI > > +IoWriteFifo16 ( > > + IN UINTN Port, > > + IN UINTN Count, > > + IN VOID *Buffer > > + ) > > +{ > > + UINT16 *Buffer16; > > + > > + Buffer16 = (UINT16 *)Buffer; > > + while (Count-- > 0) { > > + IoWrite16 (Port, *Buffer16++); > > + } > > +} > > + > > +/** > > + 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(). > > + > > + In TDX a serial of TdIoRead32 is invoked to read data from the I/O > > port. > > + > > + @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; > > + > > + Buffer32 = (UINT32 *)Buffer; > > + while (Count-- > 0) { > > + *Buffer32++ = IoRead32 (Port); > > + } > > +} > > + > > +/** > > + 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(). > > + > > + In TDX a serial of TdIoWrite32 is invoked to write data to the I/O > > port. > > + > > + @param Port The I/O port to write. > > + @param Count The number of times to write I/O port. > > + @param Buffer The buffer to retrieve the write data from. > > + > > +**/ > > +VOID > > +EFIAPI > > +IoWriteFifo32 ( > > + IN UINTN Port, > > + IN UINTN Count, > > + IN VOID *Buffer > > + ) > > +{ > > + UINT32 *Buffer32; > > + > > + Buffer32 = (UINT32 *)Buffer; > > + while (Count-- > 0) { > > + IoWrite32 (Port, *Buffer32++); > > + } > > +} > > diff --git a/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.nasm > > b/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.nasm > > deleted file mode 100644 > > index d459072f6e..0000000000 > > --- a/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifo.nasm > > +++ /dev/null > > @@ -1,120 +0,0 @@ > > -;-------------------------------------------------------------------- > -- > > -------- > > -; > > -; Copyright (c) 2006 - 2012, Intel Corporation. All rights > > reserved.<BR> -; Copyright (c) 2017, AMD Incorporated. All rights > > reserved.<BR> -; -; SPDX-License-Identifier: BSD-2-Clause-Patent -; > > -;-------------------------------------------------------------------- > -- > > -------- > > - > > - DEFAULT REL > > - SECTION .text > > - > > -;-------------------------------------------------------------------- > -- > > -------- > > -; VOID > > -; EFIAPI > > -; IoReadFifo8 ( > > -; IN UINTN Port, // rcx > > -; IN UINTN Size, // rdx > > -; OUT 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 > > -; OUT 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 > > -; OUT 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 > > - > > -- > > 2.31.1.windows.1 > > > > > > > > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#112327): https://edk2.groups.io/g/devel/message/112327 Mute This Topic: https://groups.io/mt/103009916/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/leave/9847357/21656/1706620634/xyzzy [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-