From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (using TLSv1 with cipher CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 9A0CC1A1DF5 for ; Mon, 22 Aug 2016 18:59:00 -0700 (PDT) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 22 Aug 2016 18:59:01 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,563,1464678000"; d="scan'208";a="1039938464" Received: from orsmsx105.amr.corp.intel.com ([10.22.225.132]) by orsmga002.jf.intel.com with ESMTP; 22 Aug 2016 18:59:00 -0700 Received: from orsmsx160.amr.corp.intel.com (10.22.226.43) by ORSMSX105.amr.corp.intel.com (10.22.225.132) with Microsoft SMTP Server (TLS) id 14.3.248.2; Mon, 22 Aug 2016 18:59:00 -0700 Received: from orsmsx113.amr.corp.intel.com ([169.254.9.118]) by ORSMSX160.amr.corp.intel.com ([169.254.13.231]) with mapi id 14.03.0248.002; Mon, 22 Aug 2016 18:58:59 -0700 From: "Kinney, Michael D" To: "Zeng, Star" , "edk2-devel@lists.01.org" , "Kinney, Michael D" CC: "Yao, Jiewen" , Chan Amy , Laszlo Ersek Thread-Topic: [PATCH 2/6] MdeModulePkg PiDxeS3BootScriptLib: Support multiple PCI segment Thread-Index: AQHR+exYvOczRphIN0i5coKijjIqP6BVztSg Date: Tue, 23 Aug 2016 01:58:59 +0000 Message-ID: References: <1471592131-143456-1-git-send-email-star.zeng@intel.com> <1471592131-143456-3-git-send-email-star.zeng@intel.com> In-Reply-To: <1471592131-143456-3-git-send-email-star.zeng@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ctpclassification: CTP_IC x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiYTllZDFjMTktZmI4NC00OGVmLThlMmUtYjRjZTFiOTZhMWUxIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE1LjkuNi42IiwiVHJ1c3RlZExhYmVsSGFzaCI6Ik1WU2RueTQrM0syWnAyb2VkNjFLTGRWdDJXM3p1d3FhMFRUXC9qSW5rRUYwPSJ9 x-originating-ip: [10.22.254.138] MIME-Version: 1.0 Subject: Re: [PATCH 2/6] MdeModulePkg PiDxeS3BootScriptLib: Support multiple PCI segment X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 Aug 2016 01:59:00 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Star, I do not think all PCI opcodes should be updated to use the PciSegmentLib. Only the "2" versions of the PCI opcodes should use the PciSegmentLib. This means that functions like ScriptPciCfgRead() should not be modified at= all and should still use the PciLib. You will need to add a new MACRO for enco= ding a PCI address with a segment#, maybe called PCI_SEGMENT_ADDRESS_ENCODE(S, A= ). Mike > -----Original Message----- > From: Zeng, Star > Sent: Friday, August 19, 2016 12:35 AM > To: edk2-devel@lists.01.org > Cc: Zeng, Star ; Yao, Jiewen ;= Kinney, > Michael D ; Chan Amy ; La= szlo Ersek > > Subject: [PATCH 2/6] MdeModulePkg PiDxeS3BootScriptLib: Support multiple = PCI segment >=20 > Support multiple PCI segment for PCI_CONFIG2 opcodes. >=20 > PiDxeS3BootScriptLib needs to be updated to consume PciSegmentLib > instead of PciLib. That means platforms need to add PciSegmentLib > declaration like below in platform dsc if the PciSegmentLib was > not declared in platform dsc before. >=20 > PciSegmentLib|MdePkg/Library/BasePciSegmentLibPci/BasePciSegmentLibPci.in= f >=20 > For platforms only have one segment, > MdePkg/Library/BasePciSegmentLibPci/BasePciSegmentLibPci.inf is recommend= ed > to be used and declared in platform dsc for PiDxeS3BootScriptLib to have > equivalent functionality with before. >=20 > Cc: Jiewen Yao > Cc: Michael D Kinney > Cc: Chan Amy > Cc: Laszlo Ersek > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Star Zeng > --- > .../PiDxeS3BootScriptLib/BootScriptExecute.c | 135 ++++++++++-----= ------ > .../Library/PiDxeS3BootScriptLib/BootScriptSave.c | 15 +-- > .../PiDxeS3BootScriptLib/DxeS3BootScriptLib.inf | 2 +- > .../PiDxeS3BootScriptLib/InternalBootScriptLib.h | 18 +-- > 4 files changed, 80 insertions(+), 90 deletions(-) >=20 > diff --git a/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptExecute.= c > b/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptExecute.c > index 9e63273bc19c..b865d4452fc8 100644 > --- a/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptExecute.c > +++ b/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptExecute.c > @@ -1,7 +1,7 @@ > /** @file > Interpret and execute the S3 data in S3 boot script. >=20 > - Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.
> + Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
>=20 > This program and the accompanying materials > are licensed and made available under the terms and conditions > @@ -639,9 +639,10 @@ BootScriptExecuteMemoryWrite ( >=20 > } > /** > - Performance PCI configuration read operation > + Performance PCI configuration 2 read operation >=20 > @param Width Width of the operation. > + @param Segment Pci segment number > @param Address Address of the operation. > @param Count Count of the number of accesses to perform. > @param Buffer Pointer to the buffer read from PCI config space > @@ -652,8 +653,9 @@ BootScriptExecuteMemoryWrite ( >=20 > **/ > EFI_STATUS > - ScriptPciCfgRead ( > +ScriptPciCfg2Read ( > IN S3_BOOT_SCRIPT_LIB_WIDTH Width, > + IN UINT16 Segment, > IN UINT64 Address, > IN UINTN Count, > OUT VOID *Buffer > @@ -663,11 +665,11 @@ ScriptPciCfgRead ( > UINTN AddressStride; > UINTN BufferStride; > PTR Out; > - UINTN PciAddress; > + UINT64 PciAddress; >=20 > Out.Buf =3D (UINT8 *) Buffer; >=20 > - PciAddress =3D PCI_ADDRESS_ENCODE (Address); > + PciAddress =3D PCI_ADDRESS_ENCODE (Segment, Address); >=20 > Status =3D BuildLoopData (Width, PciAddress, &AddressStride, &BufferSt= ride); > if (EFI_ERROR (Status)) { > @@ -679,42 +681,42 @@ ScriptPciCfgRead ( > for (; Count > 0; Count--, PciAddress +=3D AddressStride, Out.Buf +=3D= BufferStride) { > switch (Width) { > case S3BootScriptWidthUint8: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint8 - 0x%08x\n", PciAddres= s)); > - *Out.Uint8 =3D PciRead8 (PciAddress); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint8 - 0x%016lx\n", PciAddr= ess)); > + *Out.Uint8 =3D PciSegmentRead8 (PciAddress); > break; > case S3BootScriptWidthFifoUint8: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint8 - 0x%08x\n", PciAd= dress)); > - *Out.Uint8 =3D PciRead8 (PciAddress); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint8 - 0x%016lx\n", Pci= Address)); > + *Out.Uint8 =3D PciSegmentRead8 (PciAddress); > break; > case S3BootScriptWidthFillUint8: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint8 - 0x%08x\n", PciAd= dress)); > - *Out.Uint8 =3D PciRead8 (PciAddress); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint8 - 0x%016lx\n", Pci= Address)); > + *Out.Uint8 =3D PciSegmentRead8 (PciAddress); > break; >=20 > case S3BootScriptWidthUint16: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint16 - 0x%08x\n", PciAddre= ss)); > - *Out.Uint16 =3D PciRead16 (PciAddress); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint16 - 0x%016lx\n", PciAdd= ress)); > + *Out.Uint16 =3D PciSegmentRead16 (PciAddress); > break; > case S3BootScriptWidthFifoUint16: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint16 - 0x%08x\n", PciA= ddress)); > - *Out.Uint16 =3D PciRead16 (PciAddress); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint16 - 0x%016lx\n", Pc= iAddress)); > + *Out.Uint16 =3D PciSegmentRead16 (PciAddress); > break; > case S3BootScriptWidthFillUint16: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint16 - 0x%08x\n", PciA= ddress)); > - *Out.Uint16 =3D PciRead16 (PciAddress); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint16 - 0x%016lx\n", Pc= iAddress)); > + *Out.Uint16 =3D PciSegmentRead16 (PciAddress); > break; >=20 > case S3BootScriptWidthUint32: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint32 - 0x%08x\n", PciAddre= ss)); > - *Out.Uint32 =3D PciRead32 (PciAddress); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint32 - 0x%016lx\n", PciAdd= ress)); > + *Out.Uint32 =3D PciSegmentRead32 (PciAddress); > break; > case S3BootScriptWidthFifoUint32: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint32 - 0x%08x\n", PciA= ddress)); > - *Out.Uint32 =3D PciRead32 (PciAddress); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint32 - 0x%016lx\n", Pc= iAddress)); > + *Out.Uint32 =3D PciSegmentRead32 (PciAddress); > break; > case S3BootScriptWidthFillUint32: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint32 - 0x%08x\n", PciA= ddress)); > - *Out.Uint32 =3D PciRead32 (PciAddress); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint32 - 0x%016lx\n", Pc= iAddress)); > + *Out.Uint32 =3D PciSegmentRead32 (PciAddress); > break; >=20 > default: > @@ -725,9 +727,10 @@ ScriptPciCfgRead ( > } >=20 > /** > - Performance PCI configuration write operation > + Performance PCI configuration 2 write operation >=20 > @param Width Width of the operation. > + @param Segment Pci segment number > @param Address Address of the operation. > @param Count Count of the number of accesses to perform. > @param Buffer Pointer to the buffer write to PCI config space > @@ -738,8 +741,9 @@ ScriptPciCfgRead ( >=20 > **/ > EFI_STATUS > -ScriptPciCfgWrite ( > +ScriptPciCfg2Write ( > IN S3_BOOT_SCRIPT_LIB_WIDTH Width, > + IN UINT16 Segment, > IN UINT64 Address, > IN UINTN Count, > IN VOID *Buffer > @@ -748,14 +752,14 @@ ScriptPciCfgWrite ( > EFI_STATUS Status; > UINTN AddressStride; > UINTN BufferStride; > - UINTN OriginalPciAddress; > + UINT64 OriginalPciAddress; > PTR In; > PTR OriginalIn; > - UINTN PciAddress; > + UINT64 PciAddress; >=20 > In.Buf =3D (UINT8 *) Buffer; >=20 > - PciAddress =3D PCI_ADDRESS_ENCODE (Address); > + PciAddress =3D PCI_ADDRESS_ENCODE (Segment, Address); >=20 > Status =3D BuildLoopData (Width, PciAddress, &AddressStride, &BufferSt= ride); > if (EFI_ERROR (Status)) { > @@ -769,40 +773,40 @@ ScriptPciCfgWrite ( > for (; Count > 0; Count--, PciAddress +=3D AddressStride, In.Buf +=3D = BufferStride) { > switch (Width) { > case S3BootScriptWidthUint8: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint8 - 0x%08x (0x%02x)\n"= , > PciAddress, (UINTN)*In.Uint8)); > - PciWrite8 (PciAddress, *In.Uint8); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint8 - 0x%016lx (0x%02x)\= n", > PciAddress, (UINTN)*In.Uint8)); > + PciSegmentWrite8 (PciAddress, *In.Uint8); > break; > case S3BootScriptWidthFifoUint8: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint8 - 0x%08x (0x%02x= )\n", > OriginalPciAddress, (UINTN)*In.Uint8)); > - PciWrite8 (OriginalPciAddress, *In.Uint8); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint8 - 0x%016lx (0x%0= 2x)\n", > OriginalPciAddress, (UINTN)*In.Uint8)); > + PciSegmentWrite8 (OriginalPciAddress, *In.Uint8); > break; > case S3BootScriptWidthFillUint8: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint8 - 0x%08x (0x%02x= )\n", > PciAddress, (UINTN)*OriginalIn.Uint8)); > - PciWrite8 (PciAddress, *OriginalIn.Uint8); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint8 - 0x%016lx (0x%0= 2x)\n", > PciAddress, (UINTN)*OriginalIn.Uint8)); > + PciSegmentWrite8 (PciAddress, *OriginalIn.Uint8); > break; > case S3BootScriptWidthUint16: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint16 - 0x%08x (0x%04x)\n= ", > PciAddress, (UINTN)*In.Uint16)); > - PciWrite16 (PciAddress, *In.Uint16); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint16 - 0x%016lx (0x%04x)= \n", > PciAddress, (UINTN)*In.Uint16)); > + PciSegmentWrite16 (PciAddress, *In.Uint16); > break; > case S3BootScriptWidthFifoUint16: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint16 - 0x%08x (0x%04= x)\n", > OriginalPciAddress, (UINTN)*In.Uint16)); > - PciWrite16 (OriginalPciAddress, *In.Uint16); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint16 - 0x%016lx (0x%= 04x)\n", > OriginalPciAddress, (UINTN)*In.Uint16)); > + PciSegmentWrite16 (OriginalPciAddress, *In.Uint16); > break; > case S3BootScriptWidthFillUint16: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint16 - 0x%08x (0x%04= x)\n", > PciAddress, (UINTN)*OriginalIn.Uint16)); > - PciWrite16 (PciAddress, *OriginalIn.Uint16); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint16 - 0x%016lx (0x%= 04x)\n", > PciAddress, (UINTN)*OriginalIn.Uint16)); > + PciSegmentWrite16 (PciAddress, *OriginalIn.Uint16); > break; > case S3BootScriptWidthUint32: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint32 - 0x%08x (0x%08x)\n= ", > PciAddress, (UINTN)*In.Uint32)); > - PciWrite32 (PciAddress, *In.Uint32); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthUint32 - 0x%016lx (0x%08x)= \n", > PciAddress, (UINTN)*In.Uint32)); > + PciSegmentWrite32 (PciAddress, *In.Uint32); > break; > case S3BootScriptWidthFifoUint32: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint32 - 0x%08x (0x%08= x)\n", > OriginalPciAddress, (UINTN)*In.Uint32)); > - PciWrite32 (OriginalPciAddress, *In.Uint32); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthFifoUint32 - 0x%016lx (0x%= 08x)\n", > OriginalPciAddress, (UINTN)*In.Uint32)); > + PciSegmentWrite32 (OriginalPciAddress, *In.Uint32); > break; > case S3BootScriptWidthFillUint32: > - DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint32 - 0x%08x (0x%08= x)\n", > (UINTN)PciAddress, (UINTN)*OriginalIn.Uint32)); > - PciWrite32 (PciAddress, *OriginalIn.Uint32); > + DEBUG ((EFI_D_INFO, "S3BootScriptWidthFillUint32 - 0x%016lx (0x%= 08x)\n", > (UINTN)PciAddress, (UINTN)*OriginalIn.Uint32)); > + PciSegmentWrite32 (PciAddress, *OriginalIn.Uint32); > break; > default: > return EFI_INVALID_PARAMETER; > @@ -811,10 +815,9 @@ ScriptPciCfgWrite ( > return EFI_SUCCESS; > } > /** > - Performance PCI configuration 2 read operation > + Performance PCI configuration read operation >=20 > @param Width Width of the operation. > - @param Segment Pci segment number > @param Address Address of the operation. > @param Count Count of the number of accesses = to perform. > @param Buffer Pointer to the buffer to read fr= om PCI > config space. > @@ -824,27 +827,22 @@ ScriptPciCfgWrite ( > Buffer is NULL. > The Buffer is not aligned for th= e given > Width. > Address is outside the legal ran= ge of I/O > ports. > - @note A known Limitations in the implementation which is the 'Segment= ' parameter > is assumed as > - Zero, or else, assert. > + > **/ > EFI_STATUS > -ScriptPciCfg2Read ( > +ScriptPciCfgRead ( > IN S3_BOOT_SCRIPT_LIB_WIDTH Width, > - IN UINT16 Segment, > IN UINT64 Address, > IN UINTN Count, > OUT VOID *Buffer > ) > { > - ASSERT (Segment=3D=3D0); > - > - return ScriptPciCfgRead (Width, Address, Count, Buffer); > + return ScriptPciCfg2Read (Width, 0, Address, Count, Buffer); > } > /** > - Performance PCI configuration 2 write operation > + Performance PCI configuration write operation >=20 > @param Width Width of the operation. > - @param Segment Pci segment number > @param Address Address of the operation. > @param Count Count of the number of accesses = to perform. > @param Buffer Pointer to the buffer to write t= o PCI config > space. > @@ -854,22 +852,18 @@ ScriptPciCfg2Read ( > Buffer is NULL. > The Buffer is not aligned for th= e given > Width. > Address is outside the legal ran= ge of I/O > ports. > - @note A known Limitations in the implementation which is the 'Segment= ' parameter > is assumed as > - Zero, or else, assert. >=20 > **/ > EFI_STATUS > EFIAPI > -ScriptPciCfg2Write ( > +ScriptPciCfgWrite ( > IN S3_BOOT_SCRIPT_LIB_WIDTH Width, > - IN UINT16 Segment, > IN UINT64 Address, > IN UINTN Count, > IN VOID *Buffer > ) > { > - ASSERT (Segment=3D=3D0); > - return ScriptPciCfgWrite (Width, Address, Count, Buffer); > + return ScriptPciCfg2Write (Width, 0, Address, Count, Buffer); > } > /** > Interprete the boot script node with EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE = OP code. > @@ -896,7 +890,7 @@ BootScriptExecutePciCfgWrite ( > Count =3D PciCfgWrite.Count; > Buffer =3D Script + sizeof(EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE); >=20 > - DEBUG ((EFI_D_INFO, "BootScriptExecutePciCfgWrite - 0x%08x, 0x%08x, 0x= %08x\n", > PCI_ADDRESS_ENCODE (Address), Count, (UINTN)Width)); > + DEBUG ((EFI_D_INFO, "BootScriptExecutePciCfgWrite - 0x%016lx, 0x%08x, = 0x%08x\n", > PCI_ADDRESS_ENCODE (0, Address), Count, (UINTN)Width)); > return ScriptPciCfgWrite (Width, Address, Count, Buffer); > } > /** > @@ -1012,7 +1006,7 @@ BootScriptExecutePciCfgReadWrite ( >=20 > CopyMem((VOID*)&PciCfgReadWrite, (VOID*)Script, > sizeof(EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE)); >=20 > - DEBUG ((EFI_D_INFO, "BootScriptExecutePciCfgReadWrite - 0x%08x, 0x%016= lx, > 0x%016lx\n", PCI_ADDRESS_ENCODE (PciCfgReadWrite.Address), AndMask, OrMas= k)); > + DEBUG ((EFI_D_INFO, "BootScriptExecutePciCfgReadWrite - 0x%016lx, 0x%0= 16lx, > 0x%016lx\n", PCI_ADDRESS_ENCODE (0, PciCfgReadWrite.Address), AndMask, Or= Mask)); >=20 > Status =3D ScriptPciCfgRead ( > (S3_BOOT_SCRIPT_LIB_WIDTH) PciCfgReadWrite.Width, > @@ -1422,7 +1416,7 @@ BootScriptExecutePciCfg2Write ( > Count =3D PciCfg2Write.Count; > Buffer =3D Script + sizeof(EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE); >=20 > - DEBUG ((EFI_D_INFO, "BootScriptExecutePciCfg2Write - 0x%04x, 0x%08x, 0= x%08x, > 0x%08x\n", Segment, PCI_ADDRESS_ENCODE (Address), Count, (UINTN)Width)); > + DEBUG ((EFI_D_INFO, "BootScriptExecutePciCfg2Write - 0x%016lx, 0x%08x,= 0x%08x\n", > PCI_ADDRESS_ENCODE (Segment, Address), Count, (UINTN)Width)); > return ScriptPciCfg2Write (Width, Segment, Address, Count, Buffer); > } >=20 > @@ -1452,7 +1446,7 @@ BootScriptExecutePciCfg2ReadWrite ( >=20 > CopyMem ((VOID*)&PciCfg2ReadWrite, (VOID*)Script, > sizeof(EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE)); >=20 > - DEBUG ((EFI_D_INFO, "BootScriptExecutePciCfg2ReadWrite - 0x%04x, 0x%08= x, 0x%016lx, > 0x%016lx\n", PciCfg2ReadWrite.Segment, PCI_ADDRESS_ENCODE (PciCfg2ReadWri= te.Address), > AndMask, OrMask)); > + DEBUG ((EFI_D_INFO, "BootScriptExecutePciCfg2ReadWrite - 0x%016lx, 0x%= 016lx, > 0x%016lx\n", PCI_ADDRESS_ENCODE (PciCfg2ReadWrite.Segment, PciCfg2ReadWri= te.Address), > AndMask, OrMask)); >=20 > Status =3D ScriptPciCfg2Read ( > (S3_BOOT_SCRIPT_LIB_WIDTH) PciCfg2ReadWrite.Width, > @@ -1499,7 +1493,7 @@ BootScriptPciCfgPoll ( > EFI_BOOT_SCRIPT_PCI_CONFIG_POLL PciCfgPoll; > CopyMem ((VOID*)&PciCfgPoll, (VOID*)Script, > sizeof(EFI_BOOT_SCRIPT_PCI_CONFIG_POLL)); >=20 > - DEBUG ((EFI_D_INFO, "BootScriptPciCfgPoll - 0x%08x, 0x%016lx, 0x%016lx= \n", > PCI_ADDRESS_ENCODE (PciCfgPoll.Address), AndMask, OrMask)); > + DEBUG ((EFI_D_INFO, "BootScriptPciCfgPoll - 0x%016lx, 0x%016lx, 0x%016= lx\n", > PCI_ADDRESS_ENCODE (0, PciCfgPoll.Address), AndMask, OrMask)); >=20 > Data =3D 0; > Status =3D ScriptPciCfgRead ( > @@ -1561,7 +1555,7 @@ BootScriptPciCfg2Poll ( > Data =3D 0; > CopyMem ((VOID*)&PciCfg2Poll, (VOID*)Script, > sizeof(EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL)); >=20 > - DEBUG ((EFI_D_INFO, "BootScriptPciCfg2Poll - 0x%04x, 0x%08x, 0x%016lx, > 0x%016lx\n", PciCfg2Poll.Segment, PCI_ADDRESS_ENCODE (PciCfg2Poll.Address= ), AndMask, > OrMask)); > + DEBUG ((EFI_D_INFO, "BootScriptPciCfg2Poll - 0x%016lx, 0x%016lx, 0x%01= 6lx\n", > PCI_ADDRESS_ENCODE (PciCfg2Poll.Segment, PciCfg2Poll.Address), AndMask, O= rMask)); >=20 > Status =3D ScriptPciCfg2Read ( > (S3_BOOT_SCRIPT_LIB_WIDTH) PciCfg2Poll.Width, > @@ -1604,9 +1598,6 @@ BootScriptPciCfg2Poll ( > @retval RETURN_SUCCESS The boot script table was executed su= ccessfully. > @retval RETURN_UNSUPPORTED Invalid script table or opcode. >=20 > - @note A known Limitations in the implementation: When interpreting th= e opcode > EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE > - EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE and > EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE, the 'Segment' parameter is assum= ed as > - Zero, or else, assert. > **/ > RETURN_STATUS > EFIAPI > diff --git a/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c > b/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c > index de3915511cec..9ff5b80e7a36 100644 > --- a/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c > +++ b/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c > @@ -1291,7 +1291,7 @@ S3BootScriptSavePciCfgReadWrite ( >=20 > @retval RETURN_OUT_OF_RESOURCES Not enough memory for the table do op= eration. > @retval RETURN_SUCCESS Opcode is added. > - @note A known Limitations in the implementation which is non-zero Seg= ment and > 64bits operations are not supported. > + @note A known Limitations in the implementation which is 64bits opera= tions are > not supported. >=20 > **/ > RETURN_STATUS > @@ -1309,8 +1309,7 @@ S3BootScriptSavePciCfg2Write ( > UINT8 WidthInByte; > EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE ScriptPciWrite2; >=20 > - if (Segment !=3D 0 || > - Width =3D=3D S3BootScriptWidthUint64 || > + if (Width =3D=3D S3BootScriptWidthUint64 || > Width =3D=3D S3BootScriptWidthFifoUint64 || > Width =3D=3D S3BootScriptWidthFillUint64) { > return EFI_INVALID_PARAMETER; > @@ -1351,7 +1350,7 @@ S3BootScriptSavePciCfg2Write ( >=20 > @retval RETURN_OUT_OF_RESOURCES Not enough memory for the table do op= eration. > @retval RETURN_SUCCESS Opcode is added. > - @note A known Limitations in the implementation which is non-zero Seg= ment and > 64bits operations are not supported. > + @note A known Limitations in the implementation which is 64bits opera= tions are > not supported. >=20 > **/ > RETURN_STATUS > @@ -1369,8 +1368,7 @@ S3BootScriptSavePciCfg2ReadWrite ( > UINT8 WidthInByte; > EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE ScriptPciReadWrite2; >=20 > - if (Segment !=3D 0 || > - Width =3D=3D S3BootScriptWidthUint64 || > + if (Width =3D=3D S3BootScriptWidthUint64 || > Width =3D=3D S3BootScriptWidthFifoUint64 || > Width =3D=3D S3BootScriptWidthFillUint64) { > return EFI_INVALID_PARAMETER; > @@ -1946,7 +1944,7 @@ S3BootScriptSavePciPoll ( >=20 > @retval RETURN_OUT_OF_RESOURCES Not enough memory for the table do ope= ration. > @retval RETURN_SUCCESS Opcode is added. > - @note A known Limitations in the implementation which is non-zero Seg= ment and > 64bits operations are not supported. > + @note A known Limitations in the implementation which is 64bits opera= tions are > not supported. >=20 > **/ > RETURN_STATUS > @@ -1965,8 +1963,7 @@ S3BootScriptSavePci2Poll ( > UINT8 Length; > EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL ScriptPci2Poll; >=20 > - if (Segment !=3D 0 || > - Width =3D=3D S3BootScriptWidthUint64 || > + if (Width =3D=3D S3BootScriptWidthUint64 || > Width =3D=3D S3BootScriptWidthFifoUint64 || > Width =3D=3D S3BootScriptWidthFillUint64) { > return EFI_INVALID_PARAMETER; > diff --git a/MdeModulePkg/Library/PiDxeS3BootScriptLib/DxeS3BootScriptLib= .inf > b/MdeModulePkg/Library/PiDxeS3BootScriptLib/DxeS3BootScriptLib.inf > index 4125cdd70f10..0feff3661233 100644 > --- a/MdeModulePkg/Library/PiDxeS3BootScriptLib/DxeS3BootScriptLib.inf > +++ b/MdeModulePkg/Library/PiDxeS3BootScriptLib/DxeS3BootScriptLib.inf > @@ -52,7 +52,7 @@ [LibraryClasses] > PcdLib > UefiLib > SmbusLib > - PciLib > + PciSegmentLib > IoLib > LockBoxLib >=20 > diff --git a/MdeModulePkg/Library/PiDxeS3BootScriptLib/InternalBootScript= Lib.h > b/MdeModulePkg/Library/PiDxeS3BootScriptLib/InternalBootScriptLib.h > index 9b150480dbca..ffbf5d2688da 100644 > --- a/MdeModulePkg/Library/PiDxeS3BootScriptLib/InternalBootScriptLib.h > +++ b/MdeModulePkg/Library/PiDxeS3BootScriptLib/InternalBootScriptLib.h > @@ -2,7 +2,7 @@ > Support for S3 boot script lib. This file defined some internal macro = and internal > data structure >=20 > - Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.
> + Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
>=20 > This program and the accompanying materials > are licensed and made available under the terms and conditions > @@ -33,7 +33,7 @@ > #include > #include > #include > -#include > +#include > #include > #include > #include > @@ -45,13 +45,15 @@ > #define MAX_IO_ADDRESS 0xFFFF >=20 > // > -// Macro to convert a UEFI PCI address to a PCI Library PCI address > +// Macro to convert a UEFI PCI address + segment to a PCI Segment Librar= y PCI > address > // > -#define PCI_ADDRESS_ENCODE(A) (UINTN)PCI_LIB_ADDRESS( \ > - ((((UINTN)(A))& 0xff000000) >> 24), ((((UINTN)(A)) &0x00ff0000) = >> 16), > ((((UINTN)(A)) & 0xff00) >> 8), ((RShiftU64 ((A), 32) & 0xfff) | ((A)& 0x= ff)) \ > - ) > - > - > +#define PCI_ADDRESS_ENCODE(S, A) PCI_SEGMENT_LIB_ADDRESS( \ > + S, \ > + ((((UINTN)(A)) & 0xff000000) >> 24), = \ > + ((((UINTN)(A)) & 0x00ff0000) >> 16), = \ > + ((((UINTN)(A)) & 0xff00) >> 8), \ > + ((RShiftU64 ((A), 32) & 0xfff) | ((A)= & 0xff)) \ > + ) >=20 > typedef union { > UINT8 volatile *Buf; > -- > 2.7.0.windows.1