\r
Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>\r
\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions\r
-of the BSD License which accompanies this distribution. The\r
-full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
//\r
UINT64 mOriginalPciAttributes;\r
BOOLEAN mPciAttributesSaved = FALSE;\r
-\r
+FRAME_BUFFER_INFO *mFrameBufferInfo;\r
\r
//\r
// EFI Driver Binding Protocol Instance\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
EFI_PCI_IO_PROTOCOL *PciIo;\r
- PCI_TYPE00 Pci;\r
+ PCI_TYPE00 Pci;\r
EFI_DEV_PATH *Node;\r
+ UINT8 Index;\r
+ EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Resources;\r
\r
//\r
// Open the IO Abstraction(s) needed to perform the supported test\r
}\r
\r
Status = EFI_UNSUPPORTED;\r
- if (Pci.Hdr.ClassCode[2] == 0x03 || (Pci.Hdr.ClassCode[2] == 0x00 && Pci.Hdr.ClassCode[1] == 0x01)) {\r
-\r
- Status = EFI_SUCCESS;\r
+ if (IS_PCI_DISPLAY (&Pci) || IS_PCI_OLD_VGA (&Pci)) {\r
//\r
- // If this is a graphics controller,\r
- // go further check RemainingDevicePath validation\r
+ // Check if PCI BAR matches the framebuffer base\r
//\r
- if (RemainingDevicePath != NULL) {\r
- Node = (EFI_DEV_PATH *) RemainingDevicePath;\r
+ Status = EFI_UNSUPPORTED;\r
+ for (Index = 0; Index < PCI_MAX_BAR; Index++) {\r
+ Status = PciIo->GetBarAttributes (PciIo, Index, NULL, (VOID**) &Resources);\r
+ if (!EFI_ERROR (Status)) {\r
+ if ((Resources->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) &&\r
+ (Resources->Len == (UINT16) (sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) - 3)) &&\r
+ (Resources->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) &&\r
+ (Resources->AddrRangeMin == mFrameBufferInfo->LinearFrameBuffer)) {\r
+ DEBUG ((DEBUG_INFO, "Found matched framebuffer PCI BAR !\n"));\r
+ Status = EFI_SUCCESS;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (!EFI_ERROR (Status)) {\r
//\r
- // Check if RemainingDevicePath is the End of Device Path Node, \r
- // if yes, return EFI_SUCCESS\r
+ // If this is a graphics controller,\r
+ // go further check RemainingDevicePath\r
//\r
- if (!IsDevicePathEnd (Node)) {\r
+ if (RemainingDevicePath != NULL) {\r
+ Node = (EFI_DEV_PATH *) RemainingDevicePath;\r
//\r
- // If RemainingDevicePath isn't the End of Device Path Node,\r
- // check its validation\r
+ // Check if RemainingDevicePath is the End of Device Path Node,\r
+ // if yes, return EFI_SUCCESS\r
//\r
- if (Node->DevPath.Type != ACPI_DEVICE_PATH ||\r
- Node->DevPath.SubType != ACPI_ADR_DP ||\r
- DevicePathNodeLength(&Node->DevPath) < sizeof(ACPI_ADR_DEVICE_PATH)) {\r
- Status = EFI_UNSUPPORTED;\r
+ if (!IsDevicePathEnd (Node)) {\r
+ //\r
+ // Verify RemainingDevicePath\r
+ //\r
+ if (Node->DevPath.Type != ACPI_DEVICE_PATH ||\r
+ Node->DevPath.SubType != ACPI_ADR_DP ||\r
+ DevicePathNodeLength(&Node->DevPath) < sizeof(ACPI_ADR_DEVICE_PATH)) {\r
+ Status = EFI_UNSUPPORTED;\r
+ }\r
}\r
}\r
}\r
{\r
EFI_STATUS Status;\r
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
- EFI_PCI_IO_PROTOCOL *PciIo; \r
+ EFI_PCI_IO_PROTOCOL *PciIo;\r
UINT64 Supports;\r
\r
- DEBUG ((EFI_D_INFO, "GOP START\n"));\r
- \r
+ DEBUG ((DEBUG_INFO, "GOP START\n"));\r
+\r
//\r
// Initialize local variables\r
//\r
0,\r
&mOriginalPciAttributes\r
);\r
- \r
+\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
if (Supports == 0 || Supports == (EFI_PCI_IO_ATTRIBUTE_VGA_IO | EFI_PCI_IO_ATTRIBUTE_VGA_IO_16)) {\r
Status = EFI_UNSUPPORTED;\r
goto Done;\r
- } \r
- \r
+ }\r
+\r
REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
EFI_PROGRESS_CODE,\r
EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_ENABLE,\r
if (IsDevicePathEnd (RemainingDevicePath)) {\r
//\r
// If RemainingDevicePath is the End of Device Path Node,\r
- // don't create any child device and return EFI_SUCESS\r
+ // don't create any child device and return EFI_SUCCESS\r
Status = EFI_SUCCESS;\r
goto Done;\r
}\r
}\r
- \r
+\r
//\r
// Create child handle and install GraphicsOutputProtocol on it\r
//\r
ParentDevicePath,\r
RemainingDevicePath\r
);\r
- \r
+\r
Done:\r
if ((EFI_ERROR (Status)) && (Status != EFI_ALREADY_STARTED)) {\r
- \r
+\r
REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
EFI_PROGRESS_CODE,\r
EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_DISABLE,\r
}\r
\r
for (Index = 0; Index < NumberOfChildren; Index++) {\r
- \r
+\r
Status = EFI_SUCCESS;\r
\r
FbGopChildHandleUninstall (This, Controller, ChildHandleBuffer[Index]);\r
(VOID **) &PciIo\r
);\r
ASSERT_EFI_ERROR (Status);\r
- \r
+\r
//\r
// Restore original PCI attributes\r
//\r
);\r
goto Done;\r
}\r
- \r
+\r
//\r
// Initialize the child private structure\r
//\r
\r
//\r
// Fill in Graphics Output specific mode structures\r
- // \r
+ //\r
FbGopPrivate->ModeData = NULL;\r
- \r
+\r
FbGopPrivate->VbeFrameBuffer = NULL;\r
\r
FbGopPrivate->EdidDiscovered.SizeOfEdid = 0;\r
FbGopPrivate->EdidDiscovered.Edid = NULL;\r
FbGopPrivate->EdidActive.SizeOfEdid = 0;\r
FbGopPrivate->EdidActive.Edid = NULL;\r
- \r
+\r
//\r
// Fill in the Graphics Output Protocol\r
//\r
AcpiDeviceNode.Header.SubType = ACPI_ADR_DP;\r
AcpiDeviceNode.ADR = ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, 0, 0);\r
SetDevicePathNodeLength (&AcpiDeviceNode.Header, sizeof (ACPI_ADR_DEVICE_PATH));\r
- \r
+\r
FbGopPrivate->GopDevicePath = AppendDevicePathNode (\r
ParentDevicePath,\r
(EFI_DEVICE_PATH_PROTOCOL *) &AcpiDeviceNode\r
} else {\r
FbGopPrivate->GopDevicePath = AppendDevicePathNode (ParentDevicePath, RemainingDevicePath);\r
}\r
- \r
+\r
//\r
// Creat child handle and device path protocol firstly\r
//\r
goto Done;\r
}\r
}\r
- \r
+\r
//\r
// When check for VBE, PCI I/O protocol is needed, so use parent's protocol interface temporally\r
//\r
// Check for VESA BIOS Extensions for modes that are compatible with Graphics Output\r
//\r
Status = FbGopCheckForVbe (FbGopPrivate);\r
- DEBUG ((EFI_D_INFO, "FbGopCheckForVbe - %r\n", Status));\r
- \r
+ DEBUG ((DEBUG_INFO, "FbGopCheckForVbe - %r\n", Status));\r
+\r
if (EFI_ERROR (Status)) {\r
Status = EFI_UNSUPPORTED;\r
- //goto Done; \r
+ //goto Done;\r
}\r
\r
//\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&FbGopPrivate->Handle,\r
&gEfiGraphicsOutputProtocolGuid,\r
- &FbGopPrivate->GraphicsOutput, \r
+ &FbGopPrivate->GraphicsOutput,\r
&gEfiEdidDiscoveredProtocolGuid,\r
- &FbGopPrivate->EdidDiscovered, \r
+ &FbGopPrivate->EdidDiscovered,\r
&gEfiEdidActiveProtocolGuid,\r
- &FbGopPrivate->EdidActive, \r
+ &FbGopPrivate->EdidActive,\r
NULL\r
);\r
\r
goto Done;\r
}\r
}\r
- \r
+\r
Done:\r
if (EFI_ERROR (Status)) {\r
//\r
)\r
{\r
EFI_STATUS Status;\r
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; \r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
FB_VIDEO_DEV *FbGopPrivate;\r
EFI_PCI_IO_PROTOCOL *PciIo;\r
\r
if (!EFI_ERROR (Status)) {\r
FbGopPrivate = FB_VIDEO_DEV_FROM_GRAPHICS_OUTPUT_THIS (GraphicsOutput);\r
}\r
- \r
+\r
if (FbGopPrivate == NULL) {\r
return EFI_UNSUPPORTED;\r
}\r
&FbGopPrivate->GraphicsOutput,\r
NULL\r
);\r
- \r
+\r
if (EFI_ERROR (Status)) {\r
gBS->OpenProtocol (\r
Controller,\r
);\r
return Status;\r
}\r
- \r
+\r
//\r
// Release all allocated resources\r
//\r
\r
\r
/**\r
- Release resource for biso video instance.\r
+ Release resource for bios video instance.\r
\r
@param FbGopPrivate Video child device private data structure\r
\r
}\r
\r
//\r
- // Release all the resourses occupied by the FB_VIDEO_DEV\r
+ // Release all the resources occupied by the FB_VIDEO_DEV\r
//\r
- \r
+\r
//\r
// Free VBE Frame Buffer\r
//\r
if (FbGopPrivate->VbeFrameBuffer != NULL) {\r
FreePool (FbGopPrivate->VbeFrameBuffer);\r
}\r
- \r
+\r
//\r
// Free mode data\r
//\r
if (FbGopPrivate->ModeData != NULL) {\r
FreePool (FbGopPrivate->ModeData);\r
- } \r
+ }\r
\r
//\r
// Free graphics output protocol occupied resource\r
}\r
FreePool (FbGopPrivate->GraphicsOutput.Mode);\r
FbGopPrivate->GraphicsOutput.Mode = NULL;\r
- } \r
+ }\r
\r
if (FbGopPrivate->GopDevicePath!= NULL) {\r
FreePool (FbGopPrivate->GopDevicePath);\r
HasChild = TRUE;\r
}\r
}\r
- \r
+\r
return HasChild;\r
}\r
\r
IN OUT FB_VIDEO_DEV *FbGopPrivate\r
)\r
{\r
- EFI_STATUS Status; \r
+ EFI_STATUS Status;\r
FB_VIDEO_MODE_DATA *ModeBuffer;\r
- FB_VIDEO_MODE_DATA *CurrentModeData; \r
- UINTN ModeNumber; \r
- UINTN BitsPerPixel; \r
+ FB_VIDEO_MODE_DATA *CurrentModeData;\r
+ UINTN ModeNumber;\r
+ UINTN BitsPerPixel;\r
UINTN BytesPerScanLine;\r
UINT32 HorizontalResolution;\r
UINT32 VerticalResolution;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL *VbeFrameBuffer; \r
- EFI_HOB_GUID_TYPE *GuidHob;\r
- FRAME_BUFFER_INFO *pFbInfo;\r
- \r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL *VbeFrameBuffer;\r
+ FRAME_BUFFER_INFO *FbInfo;\r
+\r
Status = EFI_SUCCESS;\r
- //\r
- // Find the frame buffer information guid hob\r
- //\r
- GuidHob = GetFirstGuidHob (&gUefiFrameBufferInfoGuid);\r
- ASSERT (GuidHob != NULL);\r
- pFbInfo = (FRAME_BUFFER_INFO *)GET_GUID_HOB_DATA (GuidHob);\r
- \r
+\r
+ FbInfo = mFrameBufferInfo;\r
+\r
//\r
// Add mode to the list of available modes\r
//\r
VbeFrameBuffer = NULL;\r
ModeBuffer = NULL;\r
- \r
- ModeNumber = 1; \r
- BitsPerPixel = pFbInfo->BitsPerPixel;\r
- HorizontalResolution = pFbInfo->HorizontalResolution;\r
- VerticalResolution = pFbInfo->VerticalResolution;\r
- BytesPerScanLine = pFbInfo->BytesPerScanLine;\r
- \r
+\r
+ ModeNumber = 1;\r
+ BitsPerPixel = FbInfo->BitsPerPixel;\r
+ HorizontalResolution = FbInfo->HorizontalResolution;\r
+ VerticalResolution = FbInfo->VerticalResolution;\r
+ BytesPerScanLine = FbInfo->BytesPerScanLine;\r
+\r
ModeBuffer = (FB_VIDEO_MODE_DATA *) AllocatePool (\r
ModeNumber * sizeof (FB_VIDEO_MODE_DATA)\r
);\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
}\r
- \r
+\r
if (FbGopPrivate->ModeData != NULL) {\r
FreePool (FbGopPrivate->ModeData);\r
}\r
- \r
+\r
if (FbGopPrivate->VbeFrameBuffer != NULL) {\r
FreePool (FbGopPrivate->VbeFrameBuffer);\r
- } \r
- \r
+ }\r
+\r
CurrentModeData = &ModeBuffer[ModeNumber - 1];\r
CurrentModeData->BytesPerScanLine = (UINT16)BytesPerScanLine;\r
- \r
- CurrentModeData->Red = *(FB_VIDEO_COLOR_PLACEMENT *)&(pFbInfo->Red); \r
- CurrentModeData->Blue = *(FB_VIDEO_COLOR_PLACEMENT *)&(pFbInfo->Blue); \r
- CurrentModeData->Green = *(FB_VIDEO_COLOR_PLACEMENT *)&(pFbInfo->Green); \r
- CurrentModeData->Reserved = *(FB_VIDEO_COLOR_PLACEMENT *)&(pFbInfo->Reserved); \r
- \r
+\r
+ CurrentModeData->Red = *(FB_VIDEO_COLOR_PLACEMENT *)&(FbInfo->Red);\r
+ CurrentModeData->Blue = *(FB_VIDEO_COLOR_PLACEMENT *)&(FbInfo->Blue);\r
+ CurrentModeData->Green = *(FB_VIDEO_COLOR_PLACEMENT *)&(FbInfo->Green);\r
+ CurrentModeData->Reserved = *(FB_VIDEO_COLOR_PLACEMENT *)&(FbInfo->Reserved);\r
+\r
CurrentModeData->BitsPerPixel = (UINT32)BitsPerPixel;\r
CurrentModeData->HorizontalResolution = HorizontalResolution;\r
- CurrentModeData->VerticalResolution = VerticalResolution; \r
- CurrentModeData->FrameBufferSize = CurrentModeData->BytesPerScanLine * CurrentModeData->VerticalResolution; \r
- CurrentModeData->LinearFrameBuffer = (VOID *) (UINTN) pFbInfo->LinearFrameBuffer;\r
+ CurrentModeData->VerticalResolution = VerticalResolution;\r
+ CurrentModeData->FrameBufferSize = CurrentModeData->BytesPerScanLine * CurrentModeData->VerticalResolution;\r
+ CurrentModeData->LinearFrameBuffer = (VOID *) (UINTN) FbInfo->LinearFrameBuffer;\r
CurrentModeData->VbeModeNumber = 0;\r
CurrentModeData->ColorDepth = 32;\r
CurrentModeData->RefreshRate = 60;\r
- \r
+\r
CurrentModeData->PixelFormat = PixelBitMask;\r
if ((CurrentModeData->BitsPerPixel == 32) &&\r
(CurrentModeData->Red.Mask == 0xff) && (CurrentModeData->Green.Mask == 0xff) && (CurrentModeData->Blue.Mask == 0xff)) {\r
} else if ((CurrentModeData->Blue.Position == 0) && (CurrentModeData->Green.Position == 8) && (CurrentModeData->Red.Position == 16)) {\r
CurrentModeData->PixelFormat = PixelBlueGreenRedReserved8BitPerColor;\r
}\r
- } \r
- \r
- CopyMem (&(CurrentModeData->PixelBitMask), &mPixelBitMask, sizeof (EFI_PIXEL_BITMASK)); \r
- \r
+ }\r
+\r
+ CopyMem (&(CurrentModeData->PixelBitMask), &mPixelBitMask, sizeof (EFI_PIXEL_BITMASK));\r
+\r
FbGopPrivate->ModeData = ModeBuffer;\r
FbGopPrivate->VbeFrameBuffer = VbeFrameBuffer;\r
- \r
+\r
//\r
// Assign Gop's Blt function\r
//\r
FbGopPrivate->GraphicsOutput.Blt = FbGopGraphicsOutputVbeBlt;\r
- \r
+\r
FbGopPrivate->GraphicsOutput.Mode->MaxMode = 1;\r
- FbGopPrivate->GraphicsOutput.Mode->Mode = 0; \r
+ FbGopPrivate->GraphicsOutput.Mode->Mode = 0;\r
FbGopPrivate->GraphicsOutput.Mode->Info->Version = 0;\r
FbGopPrivate->GraphicsOutput.Mode->Info->HorizontalResolution = HorizontalResolution;\r
- FbGopPrivate->GraphicsOutput.Mode->Info->VerticalResolution = VerticalResolution; \r
+ FbGopPrivate->GraphicsOutput.Mode->Info->VerticalResolution = VerticalResolution;\r
FbGopPrivate->GraphicsOutput.Mode->Info->PixelFormat = CurrentModeData->PixelFormat;\r
- CopyMem (&(FbGopPrivate->GraphicsOutput.Mode->Info->PixelInformation), &mPixelBitMask, sizeof (EFI_PIXEL_BITMASK)); \r
- FbGopPrivate->GraphicsOutput.Mode->Info->PixelsPerScanLine = HorizontalResolution; \r
+ CopyMem (&(FbGopPrivate->GraphicsOutput.Mode->Info->PixelInformation), &mPixelBitMask, sizeof (EFI_PIXEL_BITMASK));\r
+ FbGopPrivate->GraphicsOutput.Mode->Info->PixelsPerScanLine = (UINT32)(BytesPerScanLine * 8 / BitsPerPixel);\r
FbGopPrivate->GraphicsOutput.Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
FbGopPrivate->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) CurrentModeData->LinearFrameBuffer;\r
FbGopPrivate->GraphicsOutput.Mode->FrameBufferSize = CurrentModeData->FrameBufferSize;\r
- \r
+\r
//\r
// Find the best mode to initialize\r
- // \r
+ //\r
\r
Done:\r
//\r
// If there was an error, then free the mode structure\r
//\r
if (EFI_ERROR (Status)) {\r
- \r
+\r
if (VbeFrameBuffer != NULL) {\r
FreePool (VbeFrameBuffer);\r
- } \r
- \r
+ }\r
+\r
if (ModeBuffer != NULL) {\r
FreePool (ModeBuffer);\r
- } \r
+ }\r
}\r
\r
return Status;\r
IN EFI_GRAPHICS_OUTPUT_PROTOCOL * This,\r
IN UINT32 ModeNumber\r
)\r
-{ \r
+{\r
FB_VIDEO_DEV *FbGopPrivate;\r
FB_VIDEO_MODE_DATA *ModeData;\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
if (ModeNumber >= This->Mode->MaxMode) {\r
return EFI_UNSUPPORTED;\r
}\r
- \r
+\r
if (ModeNumber == This->Mode->Mode) {\r
//\r
// Clear screen to black\r
- // \r
+ //\r
ZeroMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
FbGopGraphicsOutputVbeBlt (\r
This,\r
} else {\r
return EFI_UNSUPPORTED;\r
}\r
- \r
+\r
}\r
\r
/**\r
}\r
//\r
// We need to fill the Virtual Screen buffer with the blt data.\r
- // The virtual screen is upside down, as the first row is the bootom row of\r
+ // The virtual screen is upside down, as the first row is the bottom row of\r
// the image.\r
//\r
if (BltOperation == EfiBltVideoToBltBuffer) {\r
{\r
EFI_STATUS Status;\r
EFI_HOB_GUID_TYPE *GuidHob;\r
- \r
+\r
//\r
// Find the frame buffer information guid hob\r
//\r
GuidHob = GetFirstGuidHob (&gUefiFrameBufferInfoGuid);\r
- if (GuidHob != NULL) { \r
+ if (GuidHob != NULL) {\r
+ mFrameBufferInfo = (FRAME_BUFFER_INFO *)GET_GUID_HOB_DATA (GuidHob);\r
+\r
//\r
// Install driver model protocol(s).\r
//\r
);\r
ASSERT_EFI_ERROR (Status);\r
} else {\r
- DEBUG ((EFI_D_ERROR, "No FrameBuffer information from coreboot. NO GOP driver !!!\n"));\r
+ DEBUG ((DEBUG_ERROR, "No FrameBuffer information from coreboot. NO GOP driver !!!\n"));\r
Status = EFI_ABORTED;\r
}\r
- return Status; \r
+ return Status;\r
}\r
\r