+++ /dev/null
-/** @file\r
- Implements EFI Driver Binding Protocol and VGA Mini Port Protocol for VGA Mini Port Driver.\r
-\r
-Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#include "VgaMiniPort.h"\r
-\r
-//\r
-// EFI Driver Binding Protocol Instance\r
-//\r
-// This driver has a version value of 0x00000000. This is the\r
-// lowest possible priority for a driver. This is done on purpose to help\r
-// the developers of UGA drivers. This driver can bind if no UGA driver\r
-// is present, so a console is available. Then, when a UGA driver is loaded\r
-// this driver can be disconnected, and the UGA driver can be connected.\r
-// As long as the UGA driver has a version value greater than 0x00000000, it\r
-// will be connected first and will block this driver from connecting.\r
-//\r
-EFI_DRIVER_BINDING_PROTOCOL gPciVgaMiniPortDriverBinding = {\r
- PciVgaMiniPortDriverBindingSupported,\r
- PciVgaMiniPortDriverBindingStart,\r
- PciVgaMiniPortDriverBindingStop,\r
- 0x00000000,\r
- NULL,\r
- NULL\r
-};\r
-\r
-/**\r
- Entrypoint of VGA Mini Port Driver.\r
-\r
- This function is the entrypoint of UVGA Mini Port Driver. It installs Driver Binding\r
- Protocols together with Component Name Protocols.\r
-\r
- @param ImageHandle The firmware allocated handle for the EFI image.\r
- @param SystemTable A pointer to the EFI System Table.\r
-\r
- @retval EFI_SUCCESS The entry point is executed successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PciVgaMiniPortDriverEntryPoint (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- Status = EfiLibInstallDriverBindingComponentName2 (\r
- ImageHandle,\r
- SystemTable,\r
- &gPciVgaMiniPortDriverBinding,\r
- ImageHandle,\r
- &gPciVgaMiniPortComponentName,\r
- &gPciVgaMiniPortComponentName2\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Check whether VGA Mini Port driver supports this device.\r
-\r
- @param This The driver binding protocol.\r
- @param Controller The controller handle to check.\r
- @param RemainingDevicePath The remaining device path.\r
-\r
- @retval EFI_SUCCESS The driver supports this controller.\r
- @retval EFI_UNSUPPORTED This device isn't supported.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PciVgaMiniPortDriverBindingSupported (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_PCI_IO_PROTOCOL *PciIo;\r
- PCI_TYPE00 Pci;\r
-\r
- //\r
- // Open the IO Abstraction(s) needed to perform the supported test\r
- //\r
- Status = gBS->OpenProtocol (\r
- Controller,\r
- &gEfiPciIoProtocolGuid,\r
- (VOID **) &PciIo,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- //\r
- // See if this is a PCI VGA Controller by looking at the Command register and\r
- // Class Code Register\r
- //\r
- Status = PciIo->Pci.Read (\r
- PciIo,\r
- EfiPciIoWidthUint32,\r
- 0,\r
- sizeof (Pci) / sizeof (UINT32),\r
- &Pci\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
-\r
- Status = EFI_UNSUPPORTED;\r
- //\r
- // See if the device is an enabled VGA device.\r
- // Most systems can only have on VGA device on at a time.\r
- //\r
- if (((Pci.Hdr.Command & 0x03) == 0x03) && IS_PCI_VGA (&Pci)) {\r
- Status = EFI_SUCCESS;\r
- }\r
-\r
-Done:\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiPciIoProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Starts the VGA device with this driver.\r
-\r
- This function consumes PCI I/O Protocol, and installs VGA Mini Port Protocol\r
- onto the VGA device handle.\r
-\r
- @param This The driver binding instance.\r
- @param Controller The controller to check.\r
- @param RemainingDevicePath The remaining device patch.\r
-\r
- @retval EFI_SUCCESS The controller is controlled by the driver.\r
- @retval EFI_ALREADY_STARTED The controller is already controlled by the driver.\r
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PciVgaMiniPortDriverBindingStart (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_PCI_IO_PROTOCOL *PciIo;\r
- PCI_VGA_MINI_PORT_DEV *PciVgaMiniPortPrivate;\r
-\r
- PciVgaMiniPortPrivate = NULL;\r
- PciIo = NULL;\r
- //\r
- // Open the IO Abstraction(s) needed\r
- //\r
- Status = gBS->OpenProtocol (\r
- Controller,\r
- &gEfiPciIoProtocolGuid,\r
- (VOID **) &PciIo,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
- //\r
- // Allocate the private device structure\r
- //\r
- PciVgaMiniPortPrivate = AllocateZeroPool (sizeof (PCI_VGA_MINI_PORT_DEV));\r
- ASSERT (PciVgaMiniPortPrivate != NULL);\r
-\r
- //\r
- // Initialize the private device structure\r
- //\r
- PciVgaMiniPortPrivate->Signature = PCI_VGA_MINI_PORT_DEV_SIGNATURE;\r
- PciVgaMiniPortPrivate->Handle = Controller;\r
- PciVgaMiniPortPrivate->PciIo = PciIo;\r
-\r
- PciVgaMiniPortPrivate->VgaMiniPort.SetMode = PciVgaMiniPortSetMode;\r
- PciVgaMiniPortPrivate->VgaMiniPort.VgaMemoryOffset = 0xb8000;\r
- PciVgaMiniPortPrivate->VgaMiniPort.CrtcAddressRegisterOffset = 0x3d4;\r
- PciVgaMiniPortPrivate->VgaMiniPort.CrtcDataRegisterOffset = 0x3d5;\r
- PciVgaMiniPortPrivate->VgaMiniPort.VgaMemoryBar = EFI_PCI_IO_PASS_THROUGH_BAR;\r
- PciVgaMiniPortPrivate->VgaMiniPort.CrtcAddressRegisterBar = EFI_PCI_IO_PASS_THROUGH_BAR;\r
- PciVgaMiniPortPrivate->VgaMiniPort.CrtcDataRegisterBar = EFI_PCI_IO_PASS_THROUGH_BAR;\r
- PciVgaMiniPortPrivate->VgaMiniPort.MaxMode = 1;\r
-\r
- //\r
- // Install VGA Mini Port Protocol\r
- //\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &Controller,\r
- &gEfiVgaMiniPortProtocolGuid,\r
- &PciVgaMiniPortPrivate->VgaMiniPort,\r
- NULL\r
- );\r
-Done:\r
- if (EFI_ERROR (Status)) {\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiPciIoProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
- if (PciVgaMiniPortPrivate != NULL) {\r
- FreePool (PciVgaMiniPortPrivate);\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Stop the VGA device with this driver.\r
-\r
- This function uninstalls VGA Mini Port Protocol from the VGA device handle,\r
- and closes PCI I/O Protocol.\r
-\r
- @param This The driver binding protocol.\r
- @param Controller The controller to release.\r
- @param NumberOfChildren The child number that opened controller\r
- BY_CHILD.\r
- @param ChildHandleBuffer The array of child handle.\r
-\r
- @retval EFI_SUCCESS The controller or children are stopped.\r
- @retval EFI_DEVICE_ERROR Failed to stop the driver.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PciVgaMiniPortDriverBindingStop (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_VGA_MINI_PORT_PROTOCOL *VgaMiniPort;\r
- PCI_VGA_MINI_PORT_DEV *PciVgaMiniPortPrivate;\r
-\r
- Status = gBS->OpenProtocol (\r
- Controller,\r
- &gEfiVgaMiniPortProtocolGuid,\r
- (VOID **) &VgaMiniPort,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- PciVgaMiniPortPrivate = PCI_VGA_MINI_PORT_DEV_FROM_THIS (VgaMiniPort);\r
-\r
- Status = gBS->UninstallProtocolInterface (\r
- Controller,\r
- &gEfiVgaMiniPortProtocolGuid,\r
- &PciVgaMiniPortPrivate->VgaMiniPort\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiPciIoProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
-\r
- FreePool (PciVgaMiniPortPrivate);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-//\r
-// VGA Mini Port Protocol Functions\r
-//\r
-\r
-/**\r
- Sets the text display mode of a VGA controller.\r
-\r
- This function implements EFI_VGA_MINI_PORT_PROTOCOL.SetMode().\r
- If ModeNumber exceeds the valid range, then EFI_UNSUPPORTED is returned.\r
- Otherwise, EFI_SUCCESS is directly returned without real operation.\r
-\r
- @param This Protocol instance pointer.\r
- @param ModeNumber Mode number. 0 - 80x25 1-80x50\r
-\r
- @retval EFI_SUCCESS The mode was set\r
- @retval EFI_UNSUPPORTED ModeNumber is not supported.\r
- @retval EFI_DEVICE_ERROR The device is not functioning properly.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PciVgaMiniPortSetMode (\r
- IN EFI_VGA_MINI_PORT_PROTOCOL *This,\r
- IN UINTN ModeNumber\r
- )\r
-{\r
- if (ModeNumber > This->MaxMode) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r