]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Enhance BGRT driver to install BGRT table upon every ReadyToBoot event
authorczhang46 <czhang46@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 14 Feb 2012 05:56:07 +0000 (05:56 +0000)
committerczhang46 <czhang46@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 14 Feb 2012 05:56:07 +0000 (05:56 +0000)
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

MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.c

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