Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Cherry-Pick] BoardModulePkg\Library\BiosIdLib: Support Standalone MM #304

Merged
merged 1 commit into from
Oct 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions BoardModulePkg/BoardModulePkg.dsc
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,5 @@

BoardModulePkg/Library/BiosIdLib/DxeBiosIdLib.inf
BoardModulePkg/Library/BiosIdLib/PeiBiosIdLib.inf
BoardModulePkg/Library/BiosIdLib/StandaloneMmBiosIdLib.inf

96 changes: 96 additions & 0 deletions BoardModulePkg/Library/BiosIdLib/BiosIdCommon.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/** @file
Boot service common BIOS ID library implementation.

These functions in this file can be called during DXE and cannot be called during runtime
or in SMM which should use a RT or SMM library.


Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include <PiDxe.h>
#include <Library/BaseMemoryLib.h>
#include <Library/BiosIdLib.h>
#include <Guid/BiosId.h>

/**
This function returns the BIOS Version & Release Date and Time by getting and converting BIOS ID.

@param[out] BiosVersion The Bios Version out of the conversion.
@param[out] BiosReleaseDate The Bios Release Date out of the conversion.
@param[out] BiosReleaseTime The Bios Release Time out of the conversion.

@retval EFI_SUCCESS BIOS Version & Release Date and Time have been got successfully.
@retval EFI_NOT_FOUND BIOS ID image is not found, and no parameter will be modified.
@retval EFI_INVALID_PARAMETER All the parameters are NULL.

**/
EFI_STATUS
EFIAPI
GetBiosVersionDateTime (
OUT CHAR16 *BiosVersion OPTIONAL,
OUT CHAR16 *BiosReleaseDate OPTIONAL,
OUT CHAR16 *BiosReleaseTime OPTIONAL
)
{
EFI_STATUS Status;
BIOS_ID_IMAGE BiosIdImage;

if ((BiosVersion == NULL) && (BiosReleaseDate == NULL) && (BiosReleaseTime == NULL)) {
return EFI_INVALID_PARAMETER;
}

Status = GetBiosId (&BiosIdImage);
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}

if (BiosVersion != NULL) {
//
// Fill the BiosVersion data from the BIOS ID.
//
CopyMem (BiosVersion, &(BiosIdImage.BiosIdString), sizeof (BIOS_ID_STRING));
}

if (BiosReleaseDate != NULL) {
//
// Fill the build timestamp date from the BIOS ID in the "MM/DD/YY" format.
//
BiosReleaseDate[0] = BiosIdImage.BiosIdString.TimeStamp[2];
BiosReleaseDate[1] = BiosIdImage.BiosIdString.TimeStamp[3];
BiosReleaseDate[2] = (CHAR16)((UINT8)('/'));

BiosReleaseDate[3] = BiosIdImage.BiosIdString.TimeStamp[4];
BiosReleaseDate[4] = BiosIdImage.BiosIdString.TimeStamp[5];
BiosReleaseDate[5] = (CHAR16)((UINT8)('/'));

//
// Add 20 for SMBIOS table
// Current Linux kernel will misjudge 09 as year 0, so using 2009 for SMBIOS table
//
BiosReleaseDate[6] = '2';
BiosReleaseDate[7] = '0';
BiosReleaseDate[8] = BiosIdImage.BiosIdString.TimeStamp[0];
BiosReleaseDate[9] = BiosIdImage.BiosIdString.TimeStamp[1];

BiosReleaseDate[10] = (CHAR16)((UINT8)('\0'));
}

if (BiosReleaseTime != NULL) {
//
// Fill the build timestamp time from the BIOS ID in the "HH:MM" format.
//
BiosReleaseTime[0] = BiosIdImage.BiosIdString.TimeStamp[6];
BiosReleaseTime[1] = BiosIdImage.BiosIdString.TimeStamp[7];
BiosReleaseTime[2] = (CHAR16)((UINT8)(':'));

BiosReleaseTime[3] = BiosIdImage.BiosIdString.TimeStamp[8];
BiosReleaseTime[4] = BiosIdImage.BiosIdString.TimeStamp[9];

BiosReleaseTime[5] = (CHAR16)((UINT8)('\0'));
}

return EFI_SUCCESS;
}
111 changes: 14 additions & 97 deletions BoardModulePkg/Library/BiosIdLib/DxeBiosIdLib.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
or in SMM which should use a RT or SMM library.


Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2015 - 2023, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/
Expand All @@ -15,7 +15,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/HobLib.h>
#include <Library/DxeServicesLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/HobLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/DebugLib.h>
#include <Library/BiosIdLib.h>
Expand All @@ -36,16 +35,16 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
EFI_STATUS
EFIAPI
GetBiosId (
OUT BIOS_ID_IMAGE *BiosIdImage OPTIONAL
OUT BIOS_ID_IMAGE *BiosIdImage OPTIONAL
)
{
EFI_STATUS Status;
BIOS_ID_IMAGE TempBiosIdImage;
VOID *Address;
UINTN Size;
EFI_STATUS Status;
BIOS_ID_IMAGE TempBiosIdImage;
VOID *Address;
UINTN Size;

Address = NULL;
Size = 0;
Size = 0;

if (BiosIdImage == NULL) {
//
Expand All @@ -58,10 +57,10 @@ GetBiosId (
Address = GetFirstGuidHob (&gBiosIdGuid);
if (Address != NULL) {
Size = sizeof (BIOS_ID_IMAGE);
CopyMem ((VOID *) BiosIdImage, GET_GUID_HOB_DATA (Address), Size);
CopyMem ((VOID *)BiosIdImage, GET_GUID_HOB_DATA (Address), Size);

DEBUG ((EFI_D_INFO, "DXE get BIOS ID from HOB successfully\n"));
DEBUG ((EFI_D_INFO, "BIOS ID: %s\n", (CHAR16 *) (&(BiosIdImage->BiosIdString))));
DEBUG ((DEBUG_INFO, "DXE get BIOS ID from HOB successfully\n"));
DEBUG ((DEBUG_INFO, "BIOS ID: %s\n", (CHAR16 *)(&(BiosIdImage->BiosIdString))));
return EFI_SUCCESS;
}

Expand All @@ -77,99 +76,17 @@ GetBiosId (
// BIOS ID image is present in FV.
//
Size = sizeof (BIOS_ID_IMAGE);
CopyMem ((VOID *) BiosIdImage, Address, Size);
CopyMem ((VOID *)BiosIdImage, Address, Size);
//
// GetSectionFromAnyFv () allocated buffer for Address, now free it.
//
FreePool (Address);

DEBUG ((EFI_D_INFO, "DXE get BIOS ID from FV successfully\n"));
DEBUG ((EFI_D_INFO, "BIOS ID: %s\n", (CHAR16 *) (&(BiosIdImage->BiosIdString))));
DEBUG ((DEBUG_INFO, "DXE get BIOS ID from FV successfully\n"));
DEBUG ((DEBUG_INFO, "BIOS ID: %s\n", (CHAR16 *)(&(BiosIdImage->BiosIdString))));
return EFI_SUCCESS;
}

DEBUG ((EFI_D_ERROR, "DXE get BIOS ID failed: %r\n", EFI_NOT_FOUND));
DEBUG ((DEBUG_ERROR, "DXE get BIOS ID failed: %r\n", EFI_NOT_FOUND));
return EFI_NOT_FOUND;
}

/**
This function returns the BIOS Version & Release Date and Time by getting and converting BIOS ID.

@param[out] BiosVersion The Bios Version out of the conversion.
@param[out] BiosReleaseDate The Bios Release Date out of the conversion.
@param[out] BiosReleaseTime The Bios Release Time out of the conversion.

@retval EFI_SUCCESS BIOS Version & Release Date and Time have been got successfully.
@retval EFI_NOT_FOUND BIOS ID image is not found, and no parameter will be modified.
@retval EFI_INVALID_PARAMETER All the parameters are NULL.

**/
EFI_STATUS
EFIAPI
GetBiosVersionDateTime (
OUT CHAR16 *BiosVersion, OPTIONAL
OUT CHAR16 *BiosReleaseDate, OPTIONAL
OUT CHAR16 *BiosReleaseTime OPTIONAL
)
{
EFI_STATUS Status;
BIOS_ID_IMAGE BiosIdImage;

if ((BiosVersion == NULL) && (BiosReleaseDate == NULL) && (BiosReleaseTime == NULL)) {
return EFI_INVALID_PARAMETER;
}

Status = GetBiosId (&BiosIdImage);
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}

if (BiosVersion != NULL) {
//
// Fill the BiosVersion data from the BIOS ID.
//
CopyMem (BiosVersion, &(BiosIdImage.BiosIdString), sizeof (BIOS_ID_STRING));
}

if (BiosReleaseDate != NULL) {
//
// Fill the build timestamp date from the BIOS ID in the "MM/DD/YY" format.
//
BiosReleaseDate[0] = BiosIdImage.BiosIdString.TimeStamp[2];
BiosReleaseDate[1] = BiosIdImage.BiosIdString.TimeStamp[3];
BiosReleaseDate[2] = (CHAR16) ((UINT8) ('/'));

BiosReleaseDate[3] = BiosIdImage.BiosIdString.TimeStamp[4];
BiosReleaseDate[4] = BiosIdImage.BiosIdString.TimeStamp[5];
BiosReleaseDate[5] = (CHAR16) ((UINT8) ('/'));

//
// Add 20 for SMBIOS table
// Current Linux kernel will misjudge 09 as year 0, so using 2009 for SMBIOS table
//
BiosReleaseDate[6] = '2';
BiosReleaseDate[7] = '0';
BiosReleaseDate[8] = BiosIdImage.BiosIdString.TimeStamp[0];
BiosReleaseDate[9] = BiosIdImage.BiosIdString.TimeStamp[1];

BiosReleaseDate[10] = (CHAR16) ((UINT8) ('\0'));
}

if (BiosReleaseTime != NULL) {

//
// Fill the build timestamp time from the BIOS ID in the "HH:MM" format.
//
BiosReleaseTime[0] = BiosIdImage.BiosIdString.TimeStamp[6];
BiosReleaseTime[1] = BiosIdImage.BiosIdString.TimeStamp[7];
BiosReleaseTime[2] = (CHAR16) ((UINT8) (':'));

BiosReleaseTime[3] = BiosIdImage.BiosIdString.TimeStamp[8];
BiosReleaseTime[4] = BiosIdImage.BiosIdString.TimeStamp[9];

BiosReleaseTime[5] = (CHAR16) ((UINT8) ('\0'));
}

return EFI_SUCCESS;
}

5 changes: 3 additions & 2 deletions BoardModulePkg/Library/BiosIdLib/DxeBiosIdLib.inf
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
### @file
# DXE BIOS ID library.
#
# Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
# Copyright (c) 2015 - 2024, Intel Corporation. All rights reserved.<BR>
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
Expand All @@ -22,10 +22,11 @@

[Sources.common]
DxeBiosIdLib.c
BiosIdCommon.c

[Packages]
MdePkg/MdePkg.dec
BoardModulePkg/BoardModulePkg.dec
BoardModulePkg/BoardModulePkg.dec

[LibraryClasses]
BaseLib
Expand Down
Loading
Loading