Enhance BGRT driver to install BGRT table upon every ReadyToBoot event

Signed-off: czhang46 
Reviewed-by: jjin9, qianouyang


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13010 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
czhang46 2012-02-14 05:56:07 +00:00
parent 8e1253d59b
commit cbafa15e29

View File

@ -1,7 +1,7 @@
/** @file /** @file
This module install ACPI Boot Graphics Resource Table (BGRT). This module install ACPI Boot Graphics Resource Table (BGRT).
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 which accompanies this distribution. The full text of the license may be found at
@ -71,6 +71,8 @@ BMP_IMAGE_HEADER mBmpImageHeaderTemplate = {
}; };
BOOLEAN mAcpiBgrtInstalled = FALSE; BOOLEAN mAcpiBgrtInstalled = FALSE;
BOOLEAN mAcpiBgrtStatusChanged = FALSE;
BOOLEAN mAcpiBgrtBufferChanged = FALSE;
EFI_ACPI_5_0_BOOT_GRAPHICS_RESOURCE_TABLE mBootGraphicsResourceTableTemplate = { EFI_ACPI_5_0_BOOT_GRAPHICS_RESOURCE_TABLE mBootGraphicsResourceTableTemplate = {
{ {
@ -157,15 +159,18 @@ SetBootLogo (
{ {
if (BltBuffer == NULL) { if (BltBuffer == NULL) {
mIsLogoValid = FALSE; mIsLogoValid = FALSE;
mAcpiBgrtStatusChanged = TRUE;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
if (Width == 0 || Height == 0) { if (Width == 0 || Height == 0) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
mAcpiBgrtBufferChanged = TRUE;
if (mLogoBltBuffer != NULL) { if (mLogoBltBuffer != NULL) {
FreePool (mLogoBltBuffer); FreePool (mLogoBltBuffer);
mLogoBltBuffer = NULL;
} }
mLogoBltBuffer = AllocateCopyPool ( mLogoBltBuffer = AllocateCopyPool (
@ -265,18 +270,12 @@ InstallBootGraphicsResourceTable (
UINT8 *ImageBuffer; UINT8 *ImageBuffer;
UINTN PaddingSize; UINTN PaddingSize;
UINTN BmpSize; UINTN BmpSize;
UINTN OrigBmpSize;
UINT8 *Image; UINT8 *Image;
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltPixel; EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltPixel;
UINTN Col; UINTN Col;
UINTN Row; UINTN Row;
//
// Check whether Boot Graphics Resource Table is already installed.
//
if (mAcpiBgrtInstalled) {
return EFI_SUCCESS;
}
// //
// Get ACPI Table protocol. // Get ACPI Table protocol.
// //
@ -286,33 +285,68 @@ InstallBootGraphicsResourceTable (
} }
// //
// Check whether Logo exist. // Check whether Boot Graphics Resource Table is already installed.
// //
if (mLogoBltBuffer == NULL) { if (mAcpiBgrtInstalled) {
return EFI_NOT_FOUND; if (!mAcpiBgrtStatusChanged && !mAcpiBgrtBufferChanged) {
//
// Nothing has changed
//
return EFI_SUCCESS;
} else {
//
// If BGRT data change happens. Uninstall Orignal AcpiTable first
//
Status = AcpiTableProtocol->UninstallAcpiTable (
AcpiTableProtocol,
mBootGraphicsResourceTableKey
);
if (EFI_ERROR (Status)) {
return Status;
}
}
} else {
//
// Check whether Logo exist.
//
if ( mLogoBltBuffer == NULL) {
return EFI_NOT_FOUND;
}
} }
// if (mAcpiBgrtBufferChanged) {
// Allocate memory for BMP file. //
// // reserve original BGRT buffer size
PaddingSize = mLogoWidth & 0x3; //
BmpSize = (mLogoWidth * 3 + PaddingSize) * mLogoHeight + sizeof (BMP_IMAGE_HEADER); OrigBmpSize = mBmpImageHeaderTemplate.ImageSize + sizeof (BMP_IMAGE_HEADER);
ImageBuffer = BgrtAllocateReservedMemoryBelow4G (BmpSize); //
if (ImageBuffer == NULL) { // Free orignal BMP memory
return EFI_OUT_OF_RESOURCES; //
} if (mBootGraphicsResourceTableTemplate.ImageAddress) {
gBS->FreePages(mBootGraphicsResourceTableTemplate.ImageAddress, EFI_SIZE_TO_PAGES(OrigBmpSize));
}
mBmpImageHeaderTemplate.Size = (UINT32) BmpSize; //
mBmpImageHeaderTemplate.ImageSize = (UINT32) BmpSize - sizeof (BMP_IMAGE_HEADER); // Allocate memory for BMP file.
mBmpImageHeaderTemplate.PixelWidth = (UINT32) mLogoWidth; //
mBmpImageHeaderTemplate.PixelHeight = (UINT32) mLogoHeight; PaddingSize = mLogoWidth & 0x3;
CopyMem (ImageBuffer, &mBmpImageHeaderTemplate, sizeof (BMP_IMAGE_HEADER)); BmpSize = (mLogoWidth * 3 + PaddingSize) * mLogoHeight + sizeof (BMP_IMAGE_HEADER);
ImageBuffer = BgrtAllocateReservedMemoryBelow4G (BmpSize);
if (ImageBuffer == NULL) {
return EFI_OUT_OF_RESOURCES;
}
// mBmpImageHeaderTemplate.Size = (UINT32) BmpSize;
// Convert BLT buffer to BMP file. mBmpImageHeaderTemplate.ImageSize = (UINT32) BmpSize - sizeof (BMP_IMAGE_HEADER);
// mBmpImageHeaderTemplate.PixelWidth = (UINT32) mLogoWidth;
Image = ImageBuffer + sizeof (BMP_IMAGE_HEADER); mBmpImageHeaderTemplate.PixelHeight = (UINT32) mLogoHeight;
for (Row = 0; Row < mLogoHeight; Row++) { CopyMem (ImageBuffer, &mBmpImageHeaderTemplate, sizeof (BMP_IMAGE_HEADER));
//
// Convert BLT buffer to BMP file.
//
Image = ImageBuffer + sizeof (BMP_IMAGE_HEADER);
for (Row = 0; Row < mLogoHeight; Row++) {
BltPixel = &mLogoBltBuffer[(mLogoHeight - Row - 1) * mLogoWidth]; BltPixel = &mLogoBltBuffer[(mLogoHeight - Row - 1) * mLogoWidth];
for (Col = 0; Col < mLogoWidth; Col++) { for (Col = 0; Col < mLogoWidth; Col++) {
@ -322,18 +356,20 @@ InstallBootGraphicsResourceTable (
BltPixel++; BltPixel++;
} }
// //
// Padding for 4 byte alignment. // Padding for 4 byte alignment.
// //
Image += PaddingSize; Image += PaddingSize;
}
FreePool (mLogoBltBuffer);
mLogoBltBuffer = NULL;
mBootGraphicsResourceTableTemplate.ImageAddress = (UINT64) (UINTN) ImageBuffer;
mBootGraphicsResourceTableTemplate.ImageOffsetX = (UINT32) mLogoDestX;
mBootGraphicsResourceTableTemplate.ImageOffsetY = (UINT32) mLogoDestY;
} }
FreePool (mLogoBltBuffer);
mLogoBltBuffer = NULL;
mBootGraphicsResourceTableTemplate.Status = (UINT8) (mIsLogoValid ? EFI_ACPI_5_0_BGRT_STATUS_VALID : EFI_ACPI_5_0_BGRT_STATUS_INVALID); mBootGraphicsResourceTableTemplate.Status = (UINT8) (mIsLogoValid ? EFI_ACPI_5_0_BGRT_STATUS_VALID : EFI_ACPI_5_0_BGRT_STATUS_INVALID);
mBootGraphicsResourceTableTemplate.ImageAddress = (UINT64) (UINTN) ImageBuffer;
mBootGraphicsResourceTableTemplate.ImageOffsetX = (UINT32) mLogoDestX;
mBootGraphicsResourceTableTemplate.ImageOffsetY = (UINT32) mLogoDestY;
// //
// Update Checksum. // Update Checksum.
@ -354,6 +390,9 @@ InstallBootGraphicsResourceTable (
} }
mAcpiBgrtInstalled = TRUE; mAcpiBgrtInstalled = TRUE;
mAcpiBgrtStatusChanged = FALSE;
mAcpiBgrtBufferChanged = FALSE;
return Status; return Status;
} }