From abea19dbe10720a4ef4f9e688996d71a493cebe9 Mon Sep 17 00:00:00 2001 From: qhuang8 Date: Tue, 25 Apr 2006 05:51:23 +0000 Subject: [PATCH] =?utf8?q?PeiSmbusLib=20&=20DxeSmbusLib=20=09Remove=20Arp?= =?utf8?q?=20Related=20interfaces=20=09Change=20the=20return=20type=20of?= =?utf8?q?=20SmbusQuickWrite=20from=20=E2=80=9CBOOLEAN=E2=80=9D=20to=20?= =?utf8?q?=E2=80=9CVOID=E2=80=9D=20=09Complete=20interface=20SmBusBlockPro?= =?utf8?q?cessCall()=20=09Make=20the=20PEC=20bit=20=E2=80=9Cbit=2021?= =?utf8?q?=E2=80=9D=20of=20SMBUS=20address.=20If=20data=20show=20that=20MS?= =?utf8?q?B=20helps=20to=20save=20code=20size=20in=20BaseSmbusLib,=20we=20?= =?utf8?q?may=20simply=20redefine=20it=20to=20be=20MAX=5FBIT.=20UefiLib=20?= =?utf8?q?=09Modify=20the=20interfaces=20in=20UefiNotTiano.c=20to=20sync?= =?utf8?q?=20with=20spec=20MemoryAllocationLib=20=09Add=20extra=20checking?= =?utf8?q?=20in=20=E2=80=9CAligned=E2=80=9D=20Memory=20services=20to=20pre?= =?utf8?q?vent=20=E2=80=9CAllocationSize=20+=20OverAllocation=E2=80=9D=20o?= =?utf8?q?verflow=20in=20DxeMemoryAllocationLib.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@23 6f19259b-4bc3-4df7-8a09-765794883524 --- MdePkg/Include/Library/SmbusLib.h | 111 ++----------- MdePkg/Include/Library/UefiLib.h | 10 +- .../MemoryAllocationLib.c | 20 ++- MdePkg/Library/DxeSmbusLib/DxeSmbusLib.c | 70 +------- MdePkg/Library/DxeSmbusLib/InternalSmbusLib.h | 66 +------- MdePkg/Library/DxeSmbusLib/SmbusLib.c | 157 ++---------------- MdePkg/Library/PeiSmbusLib/InternalSmbusLib.h | 66 +------- MdePkg/Library/PeiSmbusLib/PeiSmbusLib.c | 80 +-------- MdePkg/Library/PeiSmbusLib/SmbusLib.c | 157 ++---------------- MdePkg/Library/UefiLib/UefiNotTiano.c | 18 +- 10 files changed, 86 insertions(+), 669 deletions(-) diff --git a/MdePkg/Include/Library/SmbusLib.h b/MdePkg/Include/Library/SmbusLib.h index 55aae1211e..484ab90144 100644 --- a/MdePkg/Include/Library/SmbusLib.h +++ b/MdePkg/Include/Library/SmbusLib.h @@ -17,6 +17,11 @@ #ifndef __SMBUS_LIB__ #define __SMBUS_LIB__ +// +// PEC BIT is bit 21 in SMBUS address +// +#define SMBUS_LIB_PEC_BIT (1 << 21) + /** Macro that converts SMBUS slave address, SMBUS command, SMBUS data length, and PEC to a value that can be passed to the SMBUS Library functions. @@ -27,15 +32,15 @@ @param SlaveAddress SMBUS Slave Address. Range 0..127. @param Command SMBUS Command. Range 0..255. - @param Length SMBUS Data Length. Range 0..32. + @param Length SMBUS Data Length. Range 0..31. @param Pec TRUE if Packet Error Checking is enabled. Otherwise FALSE. **/ #define SMBUS_LIB_ADDRESS(SlaveAddress,Command,Length,Pec) \ - ( ((Pec) ? MAX_BIT : 0) | \ - (((SlaveAddress) & 0x7f) << 1) | \ - (((Command) & 0xff) << 8) | \ - (((Length) & 0x1f) << 16) \ + ( ((Pec) ? SMBUS_LIB_PEC_BIT: 0) | \ + (((SlaveAddress) & 0x7f) << 1) | \ + (((Command) & 0xff) << 8) | \ + (((Length) & 0x1f) << 16) \ ) /** @@ -80,7 +85,7 @@ SmBusQuickRead ( This is an optional parameter and may be NULL. **/ -BOOLEAN +VOID EFIAPI SmBusQuickWrite ( IN UINTN SmBusAddress, @@ -373,102 +378,10 @@ UINTN EFIAPI SmBusBlockProcessCall ( IN UINTN SmBusAddress, - OUT VOID *OutBuffer, + IN VOID *OutBuffer, OUT VOID *InBuffer, OUT RETURN_STATUS *Status OPTIONAL ) ; -/** - Enumerates the SMBUS and assigns slave addresses. - - Executes the SMBUS enumeration algorithm and assigns a valid address to all SMBUS slave devices. - The total number of SMBUS slave devices detected is returned. - The status of the executed command is returned. - If Slave Address in SmBusAddress is not zero, then ASSERT(). - If Command in SmBusAddress is not zero, then ASSERT(). - If Length in SmBusAddress is not zero, then ASSERT(). - If PEC in SmBusAddress is set, then ASSERT(). - If any reserved bits of SmBusAddress are set, then ASSERT(). - - @param SmBusAddress Address that encodes the SMBUS Slave Address, - SMBUS Command, SMBUS Data Length, and PEC. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -EFIAPI -SmBusArpAll ( - IN UINTN SmBusAddress - ) -; - -/** - Assigns an SMBUS slave addresses. - - Assigns the SMBUS device specified by Uuid the slave address specified by SmBusAddress. - The status of the executed command is returned. - If Command in SmBusAddress is not zero, then ASSERT(). - If Length in SmBusAddress is not zero, then ASSERT(). - If PEC in SmBusAddress is set, then ASSERT(). - If any reserved bits of SmBusAddress are set, then ASSERT(). - - @param SmBusAddress Address that encodes the SMBUS Slave Address, - SMBUS Command, SMBUS Data Length, and PEC. - @param Uuid Pointer to the UUID of the device to assign a slave address. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -EFIAPI -SmBusArpDevice ( - IN UINTN SmBusAddress, - IN CONST GUID *Uuid - ) -; - -/** - Retrieves the UUID associated with an SMBUS slave device. - - Retrieves the UUID associated with the slave address specified - by SmBusAddress and returns the UUID in Uuid. - The status of the executed command is returned. - If Command in SmBusAddress is not zero, then ASSERT(). - If Length in SmBusAddress is not zero, then ASSERT(). - If PEC in SmBusAddress is set, then ASSERT(). - If Uuid is NULL, then ASSERT(). - If any reserved bits of SmBusAddress are set, then ASSERT(). - - @param SmBusAddress Address that encodes the SMBUS Slave Address, - SMBUS Command, SMBUS Data Length, and PEC. - @param Uuid Pointer to the UUID retrieved from the SMBUS slave device. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -EFIAPI -SmBusGetUuid ( - IN UINTN SmBusAddress, - OUT GUID *Uuid - ) -; - #endif diff --git a/MdePkg/Include/Library/UefiLib.h b/MdePkg/Include/Library/UefiLib.h index 73b761f790..fd3bdac53e 100644 --- a/MdePkg/Include/Library/UefiLib.h +++ b/MdePkg/Include/Library/UefiLib.h @@ -412,7 +412,7 @@ EfiSignalEventLegacyBoot ( EFI_STATUS EFIAPI EfiCreateEventLegacyBoot ( - OUT EFI_EVENT *LegacyBootEvent + OUT EFI_EVENT *LegacyBootEvent ); /** @@ -434,7 +434,7 @@ EfiCreateEventLegacyBoot ( EFI_STATUS EFIAPI EfiCreateEventReadyToBoot ( - OUT EFI_EVENT *ReadyToBootEvent + OUT EFI_EVENT *ReadyToBootEvent ); /** @@ -454,8 +454,8 @@ EfiCreateEventReadyToBoot ( VOID EFIAPI EfiInitializeFwVolDevicepathNode ( - IN MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode, - IN EFI_GUID *NameGuid + IN OUT MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode, + IN CONST EFI_GUID *NameGuid ); /** @@ -479,7 +479,7 @@ EfiInitializeFwVolDevicepathNode ( EFI_GUID * EFIAPI EfiGetNameGuidFromFwVolDevicePathNode ( - IN MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode + IN CONST MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode ); diff --git a/MdePkg/Library/DxeMemoryAllocationLib/MemoryAllocationLib.c b/MdePkg/Library/DxeMemoryAllocationLib/MemoryAllocationLib.c index a9bdf60aa1..ef643eed42 100644 --- a/MdePkg/Library/DxeMemoryAllocationLib/MemoryAllocationLib.c +++ b/MdePkg/Library/DxeMemoryAllocationLib/MemoryAllocationLib.c @@ -168,6 +168,13 @@ InternalAllocateAlignedPages ( // AlignmentMask = Alignment - 1; RealPages = Pages + EFI_SIZE_TO_PAGES (Alignment); + if (RealPages <= Pages) { + // + // This extra checking is to make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow. + // + return NULL; + } + Status = gBS->AllocatePages (AllocateAnyPages, MemoryType, RealPages, &Memory); if (EFI_ERROR (Status)) { return NULL; @@ -576,8 +583,8 @@ InternalAllocateAlignedPool ( UINTN AlignedAddress; UINTN AlignmentMask; UINTN OverAllocationSize; + UINTN RealAllocationSize; VOID **FreePointer; - EFI_STATUS Status; // // Alignment must be a power of two or zero. @@ -593,8 +600,15 @@ InternalAllocateAlignedPool ( // Calculate the extra memory size, over-allocate memory pool and get the aligned memory address. // OverAllocationSize = sizeof (RawAddress) + AlignmentMask; - Status = gBS->AllocatePool (PoolType, AllocationSize + OverAllocationSize, &RawAddress); - if (EFI_ERROR (Status)) { + RealAllocationSize = AllocationSize + OverAllocationSize; + if (RealAllocationSize <= AllocationSize ) { + // + // This extra checking is to make sure that AllocationSize plus OverAllocationSize does not overflow. + // + return NULL; + } + RawAddress = InternalAllocatePool (PoolType, RealAllocationSize); + if (RawAddress == NULL) { return NULL; } AlignedAddress = ((UINTN) RawAddress + OverAllocationSize) & ~AlignmentMask; diff --git a/MdePkg/Library/DxeSmbusLib/DxeSmbusLib.c b/MdePkg/Library/DxeSmbusLib/DxeSmbusLib.c index 4c888370eb..2991350e24 100644 --- a/MdePkg/Library/DxeSmbusLib/DxeSmbusLib.c +++ b/MdePkg/Library/DxeSmbusLib/DxeSmbusLib.c @@ -43,11 +43,7 @@ SmbusLibConstructor ( { EFI_STATUS Status; - Status = gBS->LocateProtocol ( - &gEfiCpuIoProtocolGuid, - NULL, - (VOID**) &mSmbus - ); + Status = gBS->LocateProtocol (&gEfiSmbusProtocolGuid, NULL, (VOID**) &mSmbus); ASSERT_EFI_ERROR (Status); ASSERT (mSmbus != NULL); @@ -80,7 +76,7 @@ InternalSmBusExec ( IN EFI_SMBUS_OPERATION SmbusOperation, IN UINTN SmBusAddress, IN UINTN Length, - IN VOID *Buffer, + IN OUT VOID *Buffer, OUT RETURN_STATUS *Status OPTIONAL ) { @@ -104,65 +100,3 @@ InternalSmBusExec ( return Length; } - -/** - Assigns an SMBUS slave addresses. - - Assigns the SMBUS device specified by Uuid the slave address specified by SmBusAddress. - The status of the executed command is returned. - - @param SmBusAddress Address that encodes the SMBUS Slave Address, - SMBUS Command, SMBUS Data Length, and PEC. - @param Uuid Pointer to the UUID of the device to assign a slave address. - It will assign to all SMBUS slave devices if it is NULL. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -InternalSmBusArpDevice ( - IN UINTN SmBusAddress, - IN CONST GUID *Uuid OPTIONAL - ) -{ - EFI_SMBUS_DEVICE_ADDRESS SmbusDeviceAddress; - - SmbusDeviceAddress.SmbusDeviceAddress = SMBUS_LIB_SLAVE_ADDRESS (SmBusAddress); - return (RETURN_STATUS) mSmbus->ArpDevice ( - mSmbus, - (BOOLEAN) (Uuid == NULL), - (EFI_SMBUS_UDID *) Uuid, - &SmbusDeviceAddress - ); -} - -/** - Retrieves the mapping of all the SMBus devices. - - The GetArpMap() function returns the mapping of all the SMBus devices - that are enumerated by the SMBus host driver. - - @param Length Size of the buffer that contains the SMBus device map. - @param SmbusDeviceMap The pointer to the device map as enumerated by the SMBus controller driver. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -InternalGetArpMap ( - OUT UINTN *Length, - OUT EFI_SMBUS_DEVICE_MAP **SmbusDeviceMap - ) -{ - return (RETURN_STATUS) mSmbus->GetArpMap (mSmbus, Length, SmbusDeviceMap); -} diff --git a/MdePkg/Library/DxeSmbusLib/InternalSmbusLib.h b/MdePkg/Library/DxeSmbusLib/InternalSmbusLib.h index 3c0b597fc5..bd6d57f2d3 100644 --- a/MdePkg/Library/DxeSmbusLib/InternalSmbusLib.h +++ b/MdePkg/Library/DxeSmbusLib/InternalSmbusLib.h @@ -18,11 +18,11 @@ Module Name: SmbusLib.c #ifndef __INTERNAL_SMBUS_LIB_H #define __INTERNAL_SMBUS_LIB_H -#define SMBUS_LIB_PEC(SmBusAddress) ((BOOLEAN) ((SmBusAddress) & 0x01)) -#define SMBUS_LIB_SLAVE_ADDRESS(SmBusAddress) (((SmBusAddress) >> 1) & 0x7f) -#define SMBUS_LIB_COMMAND(SmBusAddress) (((SmBusAddress) >> 8) & 0xff) -#define SMBUS_LIB_LENGTH(SmBusAddress) (((SmBusAddress) >> 16) & 0x1f) -#define SMBUS_LIB_RESEARVED(SmBusAddress) (((SmBusAddress) >> 21)) +#define SMBUS_LIB_SLAVE_ADDRESS(SmBusAddress) (((SmBusAddress) >> 1) & 0x7f) +#define SMBUS_LIB_COMMAND(SmBusAddress) (((SmBusAddress) >> 8) & 0xff) +#define SMBUS_LIB_LENGTH(SmBusAddress) (((SmBusAddress) >> 16) & 0x1f) +#define SMBUS_LIB_PEC(SmBusAddress) ((BOOLEAN) (((SmBusAddress) & SMBUS_LIB_PEC_BIT) != 0)) +#define SMBUS_LIB_RESEARVED(SmBusAddress) ((SmBusAddress) & ~(((1 << 21) - 2) | SMBUS_LIB_PEC_BIT)) // // Declaration for internal functions @@ -45,7 +45,7 @@ Module Name: SmbusLib.c @param Status Return status for the executed command. This is an optional parameter and may be NULL. - @return The actual number of bytes that are executed for this operation.. + @return The actual number of bytes that are executed for this operation. **/ UINTN @@ -53,60 +53,8 @@ InternalSmBusExec ( IN EFI_SMBUS_OPERATION SmbusOperation, IN UINTN SmBusAddress, IN UINTN Length, - IN VOID *Buffer, + IN OUT VOID *Buffer, OUT RETURN_STATUS *Status OPTIONAL ); -/** - Assigns an SMBUS slave addresses. - - Assigns the SMBUS device specified by Uuid the slave address specified by SmBusAddress. - The status of the executed command is returned. - If Command in SmBusAddress is not zero, then ASSERT(). - If Length in SmBusAddress is not zero, then ASSERT(). - If PEC in SmBusAddress is set, then ASSERT(). - If any reserved bits of SmBusAddress are set, then ASSERT(). - - @param SmBusAddress Address that encodes the SMBUS Slave Address, - SMBUS Command, SMBUS Data Length, and PEC. - @param Uuid Pointer to the UUID of the device to assign a slave address. - It will assign to all SMBUS slave devices if it is NULL. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -InternalSmBusArpDevice ( - IN UINTN SmBusAddress, - IN CONST GUID *Uuid OPTIONAL - ); - -/** - Retrieves the mapping of all the SMBus devices. - - The GetArpMap() function returns the mapping of all the SMBus devices - that are enumerated by the SMBus host driver. - - @param Length Size of the buffer that contains the SMBus device map. - @param SmbusDeviceMap The pointer to the device map as enumerated by the SMBus controller driver. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -InternalGetArpMap ( - OUT UINTN *Length, - OUT EFI_SMBUS_DEVICE_MAP **SmbusDeviceMap - ); - #endif diff --git a/MdePkg/Library/DxeSmbusLib/SmbusLib.c b/MdePkg/Library/DxeSmbusLib/SmbusLib.c index da29fab5a3..e71f11bef8 100644 --- a/MdePkg/Library/DxeSmbusLib/SmbusLib.c +++ b/MdePkg/Library/DxeSmbusLib/SmbusLib.c @@ -66,7 +66,7 @@ SmBusQuickRead ( This is an optional parameter and may be NULL. **/ -BOOLEAN +VOID EFIAPI SmBusQuickWrite ( IN UINTN SmBusAddress, @@ -79,10 +79,6 @@ SmBusQuickWrite ( ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); InternalSmBusExec (EfiSmbusQuickWrite, SmBusAddress, 0, NULL, Status); - // - // Bugbug: Undefined return value in spec - // - return TRUE; } /** @@ -381,7 +377,7 @@ SmBusReadBlock ( ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); - return InternalSmBusExec (EfiSmbusReadBlock, SmBusAddress, 0x1f, Buffer, Status); + return InternalSmBusExec (EfiSmbusReadBlock, SmBusAddress, 0x20, Buffer, Status); } /** @@ -413,10 +409,13 @@ SmBusWriteBlock ( OUT RETURN_STATUS *Status OPTIONAL ) { + UINTN Length; + ASSERT (Buffer != NULL); ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); - return InternalSmBusExec (EfiSmbusWriteBlock, SmBusAddress, SMBUS_LIB_LENGTH (SmBusAddress), Buffer, Status); + Length = SMBUS_LIB_LENGTH (SmBusAddress) + 1; + return InternalSmBusExec (EfiSmbusWriteBlock, SmBusAddress, Length, Buffer, Status); } /** @@ -447,151 +446,21 @@ UINTN EFIAPI SmBusBlockProcessCall ( IN UINTN SmBusAddress, - OUT VOID *OutBuffer, + IN VOID *OutBuffer, OUT VOID *InBuffer, OUT RETURN_STATUS *Status OPTIONAL ) { + UINTN Length; + ASSERT (InBuffer != NULL); ASSERT (OutBuffer != NULL); ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); + Length = SMBUS_LIB_LENGTH (SmBusAddress) + 1; // - // BugBug: Not sure whether it's all right. + // Assuming that InBuffer is large enough to save another memory copy. // - InternalSmBusExec (EfiSmbusWriteBlock, SmBusAddress, SMBUS_LIB_LENGTH (SmBusAddress), OutBuffer, Status); - - return InternalSmBusExec (EfiSmbusReadBlock, SmBusAddress, 1, InBuffer, Status); -} - -/** - Enumerates the SMBUS and assigns slave addresses. - - Executes the SMBUS enumeration algorithm and assigns a valid address to all SMBUS slave devices. - The total number of SMBUS slave devices detected is returned. - The status of the executed command is returned. - If Slave Address in SmBusAddress is not zero, then ASSERT(). - If Command in SmBusAddress is not zero, then ASSERT(). - If Length in SmBusAddress is not zero, then ASSERT(). - If PEC in SmBusAddress is set, then ASSERT(). - If any reserved bits of SmBusAddress are set, then ASSERT(). - - @param SmBusAddress Address that encodes the SMBUS Slave Address, - SMBUS Command, SMBUS Data Length, and PEC. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -EFIAPI -SmBusArpAll ( - IN UINTN SmBusAddress - ) -{ - ASSERT (!SMBUS_LIB_PEC (SmBusAddress)); - ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_SLAVE_ADDRESS (SmBusAddress) == 0); - - return InternalSmBusArpDevice (SmBusAddress, NULL); -} - -/** - Assigns an SMBUS slave addresses. - - Assigns the SMBUS device specified by Uuid the slave address specified by SmBusAddress. - The status of the executed command is returned. - If Command in SmBusAddress is not zero, then ASSERT(). - If Length in SmBusAddress is not zero, then ASSERT(). - If PEC in SmBusAddress is set, then ASSERT(). - If any reserved bits of SmBusAddress are set, then ASSERT(). - - @param SmBusAddress Address that encodes the SMBUS Slave Address, - SMBUS Command, SMBUS Data Length, and PEC. - @param Uuid Pointer to the UUID of the device to assign a slave address. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -EFIAPI -SmBusArpDevice ( - IN UINTN SmBusAddress, - IN CONST GUID *Uuid - ) -{ - ASSERT (!SMBUS_LIB_PEC (SmBusAddress)); - ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); - - return InternalSmBusArpDevice (SmBusAddress, Uuid); -} - -/** - Retrieves the UUID associated with an SMBUS slave device. - - Retrieves the UUID associated with the slave address specified - by SmBusAddress and returns the UUID in Uuid. - The status of the executed command is returned. - If Command in SmBusAddress is not zero, then ASSERT(). - If Length in SmBusAddress is not zero, then ASSERT(). - If PEC in SmBusAddress is set, then ASSERT(). - If Uuid is NULL, then ASSERT(). - If any reserved bits of SmBusAddress are set, then ASSERT(). - - @param SmBusAddress Address that encodes the SMBUS Slave Address, - SMBUS Command, SMBUS Data Length, and PEC. - @param Uuid Pointer to the UUID retrieved from the SMBUS slave device. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -EFIAPI -SmBusGetUuid ( - IN UINTN SmBusAddress, - OUT GUID *Uuid - ) -{ - UINTN Length; - EFI_SMBUS_DEVICE_MAP *SmBusDeviceMap; - RETURN_STATUS ReturnStatus; - UINTN SmbusDeviceAddress; - UINTN Index; - - ASSERT (Uuid != NULL); - ASSERT (!SMBUS_LIB_PEC (SmBusAddress)); - ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); - - ReturnStatus = InternalGetArpMap (&Length, &SmBusDeviceMap); - if (!RETURN_ERROR (ReturnStatus)) { - SmbusDeviceAddress = SMBUS_LIB_SLAVE_ADDRESS (SmBusAddress); - for (Index = 0; Index < Length; Index++) { - if (SmBusDeviceMap[Index].SmbusDeviceAddress.SmbusDeviceAddress == SmbusDeviceAddress) { - CopyMem (Uuid, &SmBusDeviceMap[Index].SmbusDeviceUdid, sizeof (EFI_SMBUS_UDID)); - break; - } - } - } - - return ReturnStatus; + InBuffer = CopyMem (InBuffer, OutBuffer, Length); + return InternalSmBusExec (EfiSmbusBWBRProcessCall, SmBusAddress, Length, InBuffer, Status); } diff --git a/MdePkg/Library/PeiSmbusLib/InternalSmbusLib.h b/MdePkg/Library/PeiSmbusLib/InternalSmbusLib.h index 3c0b597fc5..bd6d57f2d3 100644 --- a/MdePkg/Library/PeiSmbusLib/InternalSmbusLib.h +++ b/MdePkg/Library/PeiSmbusLib/InternalSmbusLib.h @@ -18,11 +18,11 @@ Module Name: SmbusLib.c #ifndef __INTERNAL_SMBUS_LIB_H #define __INTERNAL_SMBUS_LIB_H -#define SMBUS_LIB_PEC(SmBusAddress) ((BOOLEAN) ((SmBusAddress) & 0x01)) -#define SMBUS_LIB_SLAVE_ADDRESS(SmBusAddress) (((SmBusAddress) >> 1) & 0x7f) -#define SMBUS_LIB_COMMAND(SmBusAddress) (((SmBusAddress) >> 8) & 0xff) -#define SMBUS_LIB_LENGTH(SmBusAddress) (((SmBusAddress) >> 16) & 0x1f) -#define SMBUS_LIB_RESEARVED(SmBusAddress) (((SmBusAddress) >> 21)) +#define SMBUS_LIB_SLAVE_ADDRESS(SmBusAddress) (((SmBusAddress) >> 1) & 0x7f) +#define SMBUS_LIB_COMMAND(SmBusAddress) (((SmBusAddress) >> 8) & 0xff) +#define SMBUS_LIB_LENGTH(SmBusAddress) (((SmBusAddress) >> 16) & 0x1f) +#define SMBUS_LIB_PEC(SmBusAddress) ((BOOLEAN) (((SmBusAddress) & SMBUS_LIB_PEC_BIT) != 0)) +#define SMBUS_LIB_RESEARVED(SmBusAddress) ((SmBusAddress) & ~(((1 << 21) - 2) | SMBUS_LIB_PEC_BIT)) // // Declaration for internal functions @@ -45,7 +45,7 @@ Module Name: SmbusLib.c @param Status Return status for the executed command. This is an optional parameter and may be NULL. - @return The actual number of bytes that are executed for this operation.. + @return The actual number of bytes that are executed for this operation. **/ UINTN @@ -53,60 +53,8 @@ InternalSmBusExec ( IN EFI_SMBUS_OPERATION SmbusOperation, IN UINTN SmBusAddress, IN UINTN Length, - IN VOID *Buffer, + IN OUT VOID *Buffer, OUT RETURN_STATUS *Status OPTIONAL ); -/** - Assigns an SMBUS slave addresses. - - Assigns the SMBUS device specified by Uuid the slave address specified by SmBusAddress. - The status of the executed command is returned. - If Command in SmBusAddress is not zero, then ASSERT(). - If Length in SmBusAddress is not zero, then ASSERT(). - If PEC in SmBusAddress is set, then ASSERT(). - If any reserved bits of SmBusAddress are set, then ASSERT(). - - @param SmBusAddress Address that encodes the SMBUS Slave Address, - SMBUS Command, SMBUS Data Length, and PEC. - @param Uuid Pointer to the UUID of the device to assign a slave address. - It will assign to all SMBUS slave devices if it is NULL. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -InternalSmBusArpDevice ( - IN UINTN SmBusAddress, - IN CONST GUID *Uuid OPTIONAL - ); - -/** - Retrieves the mapping of all the SMBus devices. - - The GetArpMap() function returns the mapping of all the SMBus devices - that are enumerated by the SMBus host driver. - - @param Length Size of the buffer that contains the SMBus device map. - @param SmbusDeviceMap The pointer to the device map as enumerated by the SMBus controller driver. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -InternalGetArpMap ( - OUT UINTN *Length, - OUT EFI_SMBUS_DEVICE_MAP **SmbusDeviceMap - ); - #endif diff --git a/MdePkg/Library/PeiSmbusLib/PeiSmbusLib.c b/MdePkg/Library/PeiSmbusLib/PeiSmbusLib.c index 3ada624f68..db28021d58 100644 --- a/MdePkg/Library/PeiSmbusLib/PeiSmbusLib.c +++ b/MdePkg/Library/PeiSmbusLib/PeiSmbusLib.c @@ -68,7 +68,7 @@ InternalSmBusExec ( IN EFI_SMBUS_OPERATION SmbusOperation, IN UINTN SmBusAddress, IN UINTN Length, - IN VOID *Buffer, + IN OUT VOID *Buffer, OUT RETURN_STATUS *Status OPTIONAL ) { @@ -97,81 +97,3 @@ InternalSmBusExec ( return Length; } - -/** - Assigns an SMBUS slave addresses. - - Assigns the SMBUS device specified by Uuid the slave address specified by SmBusAddress. - The status of the executed command is returned. - If Command in SmBusAddress is not zero, then ASSERT(). - If Length in SmBusAddress is not zero, then ASSERT(). - If PEC in SmBusAddress is set, then ASSERT(). - If any reserved bits of SmBusAddress are set, then ASSERT(). - - @param SmBusAddress Address that encodes the SMBUS Slave Address, - SMBUS Command, SMBUS Data Length, and PEC. - @param Uuid Pointer to the UUID of the device to assign a slave address. - It will assign to all SMBUS slave devices if it is NULL. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -InternalSmBusArpDevice ( - IN UINTN SmBusAddress, - IN CONST GUID *Uuid OPTIONAL - ) -{ - EFI_PEI_SMBUS_PPI *SmbusPpi; - EFI_PEI_SERVICES **PeiServices; - EFI_SMBUS_DEVICE_ADDRESS SmbusDeviceAddress; - - PeiServices = GetPeiServicesTablePointer (); - SmbusPpi = InternalGetSmbusPpi (PeiServices); - - SmbusDeviceAddress.SmbusDeviceAddress = SMBUS_LIB_SLAVE_ADDRESS (SmBusAddress); - return (RETURN_STATUS) SmbusPpi->ArpDevice ( - PeiServices, - SmbusPpi, - (BOOLEAN) (Uuid == NULL), - (EFI_SMBUS_UDID *) Uuid, - &SmbusDeviceAddress - ); -} - -/** - Retrieves the mapping of all the SMBus devices. - - The GetArpMap() function returns the mapping of all the SMBus devices - that are enumerated by the SMBus host driver. - - @param Length Size of the buffer that contains the SMBus device map. - @param SmbusDeviceMap The pointer to the device map as enumerated by the SMBus controller driver. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -InternalGetArpMap ( - OUT UINTN *Length, - OUT EFI_SMBUS_DEVICE_MAP **SmbusDeviceMap - ) -{ - EFI_PEI_SMBUS_PPI *SmbusPpi; - EFI_PEI_SERVICES **PeiServices; - - PeiServices = GetPeiServicesTablePointer (); - SmbusPpi = InternalGetSmbusPpi (PeiServices); - - return (RETURN_STATUS) SmbusPpi->GetArpMap (PeiServices, SmbusPpi, Length, SmbusDeviceMap); -} diff --git a/MdePkg/Library/PeiSmbusLib/SmbusLib.c b/MdePkg/Library/PeiSmbusLib/SmbusLib.c index da29fab5a3..e71f11bef8 100644 --- a/MdePkg/Library/PeiSmbusLib/SmbusLib.c +++ b/MdePkg/Library/PeiSmbusLib/SmbusLib.c @@ -66,7 +66,7 @@ SmBusQuickRead ( This is an optional parameter and may be NULL. **/ -BOOLEAN +VOID EFIAPI SmBusQuickWrite ( IN UINTN SmBusAddress, @@ -79,10 +79,6 @@ SmBusQuickWrite ( ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); InternalSmBusExec (EfiSmbusQuickWrite, SmBusAddress, 0, NULL, Status); - // - // Bugbug: Undefined return value in spec - // - return TRUE; } /** @@ -381,7 +377,7 @@ SmBusReadBlock ( ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); - return InternalSmBusExec (EfiSmbusReadBlock, SmBusAddress, 0x1f, Buffer, Status); + return InternalSmBusExec (EfiSmbusReadBlock, SmBusAddress, 0x20, Buffer, Status); } /** @@ -413,10 +409,13 @@ SmBusWriteBlock ( OUT RETURN_STATUS *Status OPTIONAL ) { + UINTN Length; + ASSERT (Buffer != NULL); ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); - return InternalSmBusExec (EfiSmbusWriteBlock, SmBusAddress, SMBUS_LIB_LENGTH (SmBusAddress), Buffer, Status); + Length = SMBUS_LIB_LENGTH (SmBusAddress) + 1; + return InternalSmBusExec (EfiSmbusWriteBlock, SmBusAddress, Length, Buffer, Status); } /** @@ -447,151 +446,21 @@ UINTN EFIAPI SmBusBlockProcessCall ( IN UINTN SmBusAddress, - OUT VOID *OutBuffer, + IN VOID *OutBuffer, OUT VOID *InBuffer, OUT RETURN_STATUS *Status OPTIONAL ) { + UINTN Length; + ASSERT (InBuffer != NULL); ASSERT (OutBuffer != NULL); ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); + Length = SMBUS_LIB_LENGTH (SmBusAddress) + 1; // - // BugBug: Not sure whether it's all right. + // Assuming that InBuffer is large enough to save another memory copy. // - InternalSmBusExec (EfiSmbusWriteBlock, SmBusAddress, SMBUS_LIB_LENGTH (SmBusAddress), OutBuffer, Status); - - return InternalSmBusExec (EfiSmbusReadBlock, SmBusAddress, 1, InBuffer, Status); -} - -/** - Enumerates the SMBUS and assigns slave addresses. - - Executes the SMBUS enumeration algorithm and assigns a valid address to all SMBUS slave devices. - The total number of SMBUS slave devices detected is returned. - The status of the executed command is returned. - If Slave Address in SmBusAddress is not zero, then ASSERT(). - If Command in SmBusAddress is not zero, then ASSERT(). - If Length in SmBusAddress is not zero, then ASSERT(). - If PEC in SmBusAddress is set, then ASSERT(). - If any reserved bits of SmBusAddress are set, then ASSERT(). - - @param SmBusAddress Address that encodes the SMBUS Slave Address, - SMBUS Command, SMBUS Data Length, and PEC. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -EFIAPI -SmBusArpAll ( - IN UINTN SmBusAddress - ) -{ - ASSERT (!SMBUS_LIB_PEC (SmBusAddress)); - ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_SLAVE_ADDRESS (SmBusAddress) == 0); - - return InternalSmBusArpDevice (SmBusAddress, NULL); -} - -/** - Assigns an SMBUS slave addresses. - - Assigns the SMBUS device specified by Uuid the slave address specified by SmBusAddress. - The status of the executed command is returned. - If Command in SmBusAddress is not zero, then ASSERT(). - If Length in SmBusAddress is not zero, then ASSERT(). - If PEC in SmBusAddress is set, then ASSERT(). - If any reserved bits of SmBusAddress are set, then ASSERT(). - - @param SmBusAddress Address that encodes the SMBUS Slave Address, - SMBUS Command, SMBUS Data Length, and PEC. - @param Uuid Pointer to the UUID of the device to assign a slave address. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -EFIAPI -SmBusArpDevice ( - IN UINTN SmBusAddress, - IN CONST GUID *Uuid - ) -{ - ASSERT (!SMBUS_LIB_PEC (SmBusAddress)); - ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); - - return InternalSmBusArpDevice (SmBusAddress, Uuid); -} - -/** - Retrieves the UUID associated with an SMBUS slave device. - - Retrieves the UUID associated with the slave address specified - by SmBusAddress and returns the UUID in Uuid. - The status of the executed command is returned. - If Command in SmBusAddress is not zero, then ASSERT(). - If Length in SmBusAddress is not zero, then ASSERT(). - If PEC in SmBusAddress is set, then ASSERT(). - If Uuid is NULL, then ASSERT(). - If any reserved bits of SmBusAddress are set, then ASSERT(). - - @param SmBusAddress Address that encodes the SMBUS Slave Address, - SMBUS Command, SMBUS Data Length, and PEC. - @param Uuid Pointer to the UUID retrieved from the SMBUS slave device. - - @retval RETURN_SUCCESS The SMBUS command was executed. - @retval RETURN_TIMEOUT A timeout occurred while executing the SMBUS command. - @retval RETURN_DEVICE_ERROR The request was not completed because a failure reflected - in the Host Status Register bit. - Device errors are a result of a transaction collision, illegal command field, - unclaimed cycle (host initiated), or bus errors (collisions). - -**/ -RETURN_STATUS -EFIAPI -SmBusGetUuid ( - IN UINTN SmBusAddress, - OUT GUID *Uuid - ) -{ - UINTN Length; - EFI_SMBUS_DEVICE_MAP *SmBusDeviceMap; - RETURN_STATUS ReturnStatus; - UINTN SmbusDeviceAddress; - UINTN Index; - - ASSERT (Uuid != NULL); - ASSERT (!SMBUS_LIB_PEC (SmBusAddress)); - ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_RESEARVED (SmBusAddress) == 0); - ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0); - - ReturnStatus = InternalGetArpMap (&Length, &SmBusDeviceMap); - if (!RETURN_ERROR (ReturnStatus)) { - SmbusDeviceAddress = SMBUS_LIB_SLAVE_ADDRESS (SmBusAddress); - for (Index = 0; Index < Length; Index++) { - if (SmBusDeviceMap[Index].SmbusDeviceAddress.SmbusDeviceAddress == SmbusDeviceAddress) { - CopyMem (Uuid, &SmBusDeviceMap[Index].SmbusDeviceUdid, sizeof (EFI_SMBUS_UDID)); - break; - } - } - } - - return ReturnStatus; + InBuffer = CopyMem (InBuffer, OutBuffer, Length); + return InternalSmBusExec (EfiSmbusBWBRProcessCall, SmBusAddress, Length, InBuffer, Status); } diff --git a/MdePkg/Library/UefiLib/UefiNotTiano.c b/MdePkg/Library/UefiLib/UefiNotTiano.c index 2ac12f1b3a..f883c1d3c6 100644 --- a/MdePkg/Library/UefiLib/UefiNotTiano.c +++ b/MdePkg/Library/UefiLib/UefiNotTiano.c @@ -37,7 +37,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. EFI_STATUS EFIAPI EfiCreateEventLegacyBoot ( - OUT EFI_EVENT *LegacyBootEvent + OUT EFI_EVENT *LegacyBootEvent ) { EFI_STATUS Status; @@ -92,7 +92,7 @@ EfiCreateEventLegacyBoot ( EFI_STATUS EFIAPI EfiCreateEventReadyToBoot ( - IN EFI_EVENT *ReadyToBootEvent + OUT EFI_EVENT *ReadyToBootEvent ) { EFI_STATUS Status; @@ -196,7 +196,7 @@ EfiSignalEventLegacyBoot ( EFI_GUID * EFIAPI EfiGetNameGuidFromFwVolDevicePathNode ( - IN MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode + IN CONST MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode ) { ASSERT (FvDevicePathNode != NULL); @@ -207,7 +207,7 @@ EfiGetNameGuidFromFwVolDevicePathNode ( // if (DevicePathType (&FvDevicePathNode->Header) == MEDIA_DEVICE_PATH || DevicePathSubType (&FvDevicePathNode->Header) == MEDIA_FV_FILEPATH_DP) { - return &FvDevicePathNode->NameGuid; + return (EFI_GUID *) &FvDevicePathNode->NameGuid; } #else @@ -218,7 +218,7 @@ EfiGetNameGuidFromFwVolDevicePathNode ( FvDevicePathNode->Piwg.Header.SubType == MEDIA_VENDOR_DP) { if (CompareGuid (&gEfiFrameworkDevicePathGuid, &FvDevicePathNode->Piwg.PiwgSpecificDevicePath)) { if (FvDevicePathNode->Piwg.Type == PIWG_MEDIA_FW_VOL_FILEPATH_DEVICE_PATH_TYPE) { - return &FvDevicePathNode->NameGuid; + return (EFI_GUID *) &FvDevicePathNode->NameGuid; } } } @@ -237,15 +237,15 @@ EfiGetNameGuidFromFwVolDevicePathNode ( is compiled to conform with the UEFI 2.0 specification use the new device path else use the old form for backwards compatability. - @param FvDevicePathNode Pointer to a FV device path node to initialize - @param NameGuid FV file name to use in FvDevicePathNode + @param FvDevicePathNode Pointer to a FV device path node to initialize + @param NameGuid FV file name to use in FvDevicePathNode **/ VOID EFIAPI EfiInitializeFwVolDevicepathNode ( - IN MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode, - IN EFI_GUID *NameGuid + IN OUT MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode, + IN CONST EFI_GUID *NameGuid ) { ASSERT (FvDevicePathNode != NULL); -- 2.39.2