1733f03aa9056f4de82621caf06f2c10908e7f662qhuang/** @file 2269e4559ae140e6217584a627ba9056db2f60952xli Implements EFI Driver Binding Protocol and VGA Mini Port Protocol for VGA Mini Port Driver. 3733f03aa9056f4de82621caf06f2c10908e7f662qhuang 4180a5a35cb49699bd249dee19e41cee34c856a58hhtianCopyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR> 5733f03aa9056f4de82621caf06f2c10908e7f662qhuangThis program and the accompanying materials 6733f03aa9056f4de82621caf06f2c10908e7f662qhuangare licensed and made available under the terms and conditions of the BSD License 7733f03aa9056f4de82621caf06f2c10908e7f662qhuangwhich accompanies this distribution. The full text of the license may be found at 8733f03aa9056f4de82621caf06f2c10908e7f662qhuanghttp://opensource.org/licenses/bsd-license.php 9733f03aa9056f4de82621caf06f2c10908e7f662qhuang 10733f03aa9056f4de82621caf06f2c10908e7f662qhuangTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11733f03aa9056f4de82621caf06f2c10908e7f662qhuangWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12733f03aa9056f4de82621caf06f2c10908e7f662qhuang 13733f03aa9056f4de82621caf06f2c10908e7f662qhuang**/ 14733f03aa9056f4de82621caf06f2c10908e7f662qhuang 15733f03aa9056f4de82621caf06f2c10908e7f662qhuang#include "VgaMiniPort.h" 16733f03aa9056f4de82621caf06f2c10908e7f662qhuang 17733f03aa9056f4de82621caf06f2c10908e7f662qhuang// 18733f03aa9056f4de82621caf06f2c10908e7f662qhuang// EFI Driver Binding Protocol Instance 19733f03aa9056f4de82621caf06f2c10908e7f662qhuang// 20733f03aa9056f4de82621caf06f2c10908e7f662qhuang// This driver has a version value of 0x00000000. This is the 21733f03aa9056f4de82621caf06f2c10908e7f662qhuang// lowest possible priority for a driver. This is done on purpose to help 22733f03aa9056f4de82621caf06f2c10908e7f662qhuang// the developers of UGA drivers. This driver can bind if no UGA driver 23733f03aa9056f4de82621caf06f2c10908e7f662qhuang// is present, so a console is available. Then, when a UGA driver is loaded 24733f03aa9056f4de82621caf06f2c10908e7f662qhuang// this driver can be disconnected, and the UGA driver can be connected. 25733f03aa9056f4de82621caf06f2c10908e7f662qhuang// As long as the UGA driver has a version value greater than 0x00000000, it 26733f03aa9056f4de82621caf06f2c10908e7f662qhuang// will be connected first and will block this driver from connecting. 27733f03aa9056f4de82621caf06f2c10908e7f662qhuang// 28733f03aa9056f4de82621caf06f2c10908e7f662qhuangEFI_DRIVER_BINDING_PROTOCOL gPciVgaMiniPortDriverBinding = { 29733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortDriverBindingSupported, 30733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortDriverBindingStart, 31733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortDriverBindingStop, 32733f03aa9056f4de82621caf06f2c10908e7f662qhuang 0x00000000, 33733f03aa9056f4de82621caf06f2c10908e7f662qhuang NULL, 34733f03aa9056f4de82621caf06f2c10908e7f662qhuang NULL 35733f03aa9056f4de82621caf06f2c10908e7f662qhuang}; 36733f03aa9056f4de82621caf06f2c10908e7f662qhuang 37fcf03596d10de53e45292bd9eb4767a8ddc344edklu/** 38269e4559ae140e6217584a627ba9056db2f60952xli Entrypoint of VGA Mini Port Driver. 39269e4559ae140e6217584a627ba9056db2f60952xli 40269e4559ae140e6217584a627ba9056db2f60952xli This function is the entrypoint of UVGA Mini Port Driver. It installs Driver Binding 41269e4559ae140e6217584a627ba9056db2f60952xli Protocols together with Component Name Protocols. 42269e4559ae140e6217584a627ba9056db2f60952xli 43269e4559ae140e6217584a627ba9056db2f60952xli @param ImageHandle The firmware allocated handle for the EFI image. 44269e4559ae140e6217584a627ba9056db2f60952xli @param SystemTable A pointer to the EFI System Table. 45269e4559ae140e6217584a627ba9056db2f60952xli 46269e4559ae140e6217584a627ba9056db2f60952xli @retval EFI_SUCCESS The entry point is executed successfully. 47269e4559ae140e6217584a627ba9056db2f60952xli 48fcf03596d10de53e45292bd9eb4767a8ddc344edklu**/ 49733f03aa9056f4de82621caf06f2c10908e7f662qhuangEFI_STATUS 50733f03aa9056f4de82621caf06f2c10908e7f662qhuangEFIAPI 51733f03aa9056f4de82621caf06f2c10908e7f662qhuangPciVgaMiniPortDriverEntryPoint ( 52733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN EFI_HANDLE ImageHandle, 53733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN EFI_SYSTEM_TABLE *SystemTable 54733f03aa9056f4de82621caf06f2c10908e7f662qhuang ) 55733f03aa9056f4de82621caf06f2c10908e7f662qhuang{ 56269e4559ae140e6217584a627ba9056db2f60952xli EFI_STATUS Status; 57269e4559ae140e6217584a627ba9056db2f60952xli 58269e4559ae140e6217584a627ba9056db2f60952xli Status = EfiLibInstallDriverBindingComponentName2 ( 59269e4559ae140e6217584a627ba9056db2f60952xli ImageHandle, 60269e4559ae140e6217584a627ba9056db2f60952xli SystemTable, 61269e4559ae140e6217584a627ba9056db2f60952xli &gPciVgaMiniPortDriverBinding, 62269e4559ae140e6217584a627ba9056db2f60952xli ImageHandle, 63269e4559ae140e6217584a627ba9056db2f60952xli &gPciVgaMiniPortComponentName, 64269e4559ae140e6217584a627ba9056db2f60952xli &gPciVgaMiniPortComponentName2 65269e4559ae140e6217584a627ba9056db2f60952xli ); 66269e4559ae140e6217584a627ba9056db2f60952xli ASSERT_EFI_ERROR (Status); 67269e4559ae140e6217584a627ba9056db2f60952xli 68269e4559ae140e6217584a627ba9056db2f60952xli return EFI_SUCCESS; 69733f03aa9056f4de82621caf06f2c10908e7f662qhuang} 70733f03aa9056f4de82621caf06f2c10908e7f662qhuang 71733f03aa9056f4de82621caf06f2c10908e7f662qhuang 72733f03aa9056f4de82621caf06f2c10908e7f662qhuang/** 73269e4559ae140e6217584a627ba9056db2f60952xli Check whether VGA Mini Port driver supports this device. 74733f03aa9056f4de82621caf06f2c10908e7f662qhuang 75eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @param This The driver binding protocol. 76eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @param Controller The controller handle to check. 77eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @param RemainingDevicePath The remaining device path. 78eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang 79eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @retval EFI_SUCCESS The driver supports this controller. 80eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @retval EFI_UNSUPPORTED This device isn't supported. 81733f03aa9056f4de82621caf06f2c10908e7f662qhuang 82733f03aa9056f4de82621caf06f2c10908e7f662qhuang**/ 83733f03aa9056f4de82621caf06f2c10908e7f662qhuangEFI_STATUS 84733f03aa9056f4de82621caf06f2c10908e7f662qhuangEFIAPI 85733f03aa9056f4de82621caf06f2c10908e7f662qhuangPciVgaMiniPortDriverBindingSupported ( 86733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN EFI_DRIVER_BINDING_PROTOCOL *This, 87733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN EFI_HANDLE Controller, 88733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath 89733f03aa9056f4de82621caf06f2c10908e7f662qhuang ) 90733f03aa9056f4de82621caf06f2c10908e7f662qhuang{ 91733f03aa9056f4de82621caf06f2c10908e7f662qhuang EFI_STATUS Status; 92733f03aa9056f4de82621caf06f2c10908e7f662qhuang EFI_PCI_IO_PROTOCOL *PciIo; 93733f03aa9056f4de82621caf06f2c10908e7f662qhuang PCI_TYPE00 Pci; 94733f03aa9056f4de82621caf06f2c10908e7f662qhuang 95733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 96733f03aa9056f4de82621caf06f2c10908e7f662qhuang // Open the IO Abstraction(s) needed to perform the supported test 97733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 98733f03aa9056f4de82621caf06f2c10908e7f662qhuang Status = gBS->OpenProtocol ( 99733f03aa9056f4de82621caf06f2c10908e7f662qhuang Controller, 100733f03aa9056f4de82621caf06f2c10908e7f662qhuang &gEfiPciIoProtocolGuid, 101733f03aa9056f4de82621caf06f2c10908e7f662qhuang (VOID **) &PciIo, 102733f03aa9056f4de82621caf06f2c10908e7f662qhuang This->DriverBindingHandle, 103733f03aa9056f4de82621caf06f2c10908e7f662qhuang Controller, 104733f03aa9056f4de82621caf06f2c10908e7f662qhuang EFI_OPEN_PROTOCOL_BY_DRIVER 105733f03aa9056f4de82621caf06f2c10908e7f662qhuang ); 106733f03aa9056f4de82621caf06f2c10908e7f662qhuang if (EFI_ERROR (Status)) { 107733f03aa9056f4de82621caf06f2c10908e7f662qhuang return Status; 108733f03aa9056f4de82621caf06f2c10908e7f662qhuang } 109733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 110733f03aa9056f4de82621caf06f2c10908e7f662qhuang // See if this is a PCI VGA Controller by looking at the Command register and 111733f03aa9056f4de82621caf06f2c10908e7f662qhuang // Class Code Register 112733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 113733f03aa9056f4de82621caf06f2c10908e7f662qhuang Status = PciIo->Pci.Read ( 114733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciIo, 115733f03aa9056f4de82621caf06f2c10908e7f662qhuang EfiPciIoWidthUint32, 116733f03aa9056f4de82621caf06f2c10908e7f662qhuang 0, 117733f03aa9056f4de82621caf06f2c10908e7f662qhuang sizeof (Pci) / sizeof (UINT32), 118733f03aa9056f4de82621caf06f2c10908e7f662qhuang &Pci 119733f03aa9056f4de82621caf06f2c10908e7f662qhuang ); 120733f03aa9056f4de82621caf06f2c10908e7f662qhuang if (EFI_ERROR (Status)) { 121733f03aa9056f4de82621caf06f2c10908e7f662qhuang goto Done; 122733f03aa9056f4de82621caf06f2c10908e7f662qhuang } 123733f03aa9056f4de82621caf06f2c10908e7f662qhuang 124733f03aa9056f4de82621caf06f2c10908e7f662qhuang Status = EFI_UNSUPPORTED; 125733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 126733f03aa9056f4de82621caf06f2c10908e7f662qhuang // See if the device is an enabled VGA device. 127733f03aa9056f4de82621caf06f2c10908e7f662qhuang // Most systems can only have on VGA device on at a time. 128733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 129733f03aa9056f4de82621caf06f2c10908e7f662qhuang if (((Pci.Hdr.Command & 0x03) == 0x03) && IS_PCI_VGA (&Pci)) { 130733f03aa9056f4de82621caf06f2c10908e7f662qhuang Status = EFI_SUCCESS; 131733f03aa9056f4de82621caf06f2c10908e7f662qhuang } 132733f03aa9056f4de82621caf06f2c10908e7f662qhuang 133733f03aa9056f4de82621caf06f2c10908e7f662qhuangDone: 134733f03aa9056f4de82621caf06f2c10908e7f662qhuang gBS->CloseProtocol ( 135269e4559ae140e6217584a627ba9056db2f60952xli Controller, 136269e4559ae140e6217584a627ba9056db2f60952xli &gEfiPciIoProtocolGuid, 137269e4559ae140e6217584a627ba9056db2f60952xli This->DriverBindingHandle, 138269e4559ae140e6217584a627ba9056db2f60952xli Controller 139269e4559ae140e6217584a627ba9056db2f60952xli ); 140733f03aa9056f4de82621caf06f2c10908e7f662qhuang 141733f03aa9056f4de82621caf06f2c10908e7f662qhuang return Status; 142733f03aa9056f4de82621caf06f2c10908e7f662qhuang} 143733f03aa9056f4de82621caf06f2c10908e7f662qhuang 144733f03aa9056f4de82621caf06f2c10908e7f662qhuang 145733f03aa9056f4de82621caf06f2c10908e7f662qhuang/** 146269e4559ae140e6217584a627ba9056db2f60952xli Starts the VGA device with this driver. 147733f03aa9056f4de82621caf06f2c10908e7f662qhuang 148269e4559ae140e6217584a627ba9056db2f60952xli This function consumes PCI I/O Protocol, and installs VGA Mini Port Protocol 149269e4559ae140e6217584a627ba9056db2f60952xli onto the VGA device handle. 150733f03aa9056f4de82621caf06f2c10908e7f662qhuang 151eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @param This The driver binding instance. 152eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @param Controller The controller to check. 153eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @param RemainingDevicePath The remaining device patch. 154eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang 155eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @retval EFI_SUCCESS The controller is controlled by the driver. 156eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @retval EFI_ALREADY_STARTED The controller is already controlled by the driver. 157eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @retval EFI_OUT_OF_RESOURCES Failed to allocate resources. 158733f03aa9056f4de82621caf06f2c10908e7f662qhuang 159733f03aa9056f4de82621caf06f2c10908e7f662qhuang**/ 160733f03aa9056f4de82621caf06f2c10908e7f662qhuangEFI_STATUS 161733f03aa9056f4de82621caf06f2c10908e7f662qhuangEFIAPI 162733f03aa9056f4de82621caf06f2c10908e7f662qhuangPciVgaMiniPortDriverBindingStart ( 163733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN EFI_DRIVER_BINDING_PROTOCOL *This, 164733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN EFI_HANDLE Controller, 165733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath 166733f03aa9056f4de82621caf06f2c10908e7f662qhuang ) 167733f03aa9056f4de82621caf06f2c10908e7f662qhuang{ 168733f03aa9056f4de82621caf06f2c10908e7f662qhuang EFI_STATUS Status; 169733f03aa9056f4de82621caf06f2c10908e7f662qhuang EFI_PCI_IO_PROTOCOL *PciIo; 170733f03aa9056f4de82621caf06f2c10908e7f662qhuang PCI_VGA_MINI_PORT_DEV *PciVgaMiniPortPrivate; 171733f03aa9056f4de82621caf06f2c10908e7f662qhuang 172733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortPrivate = NULL; 173733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciIo = NULL; 174733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 175733f03aa9056f4de82621caf06f2c10908e7f662qhuang // Open the IO Abstraction(s) needed 176733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 177733f03aa9056f4de82621caf06f2c10908e7f662qhuang Status = gBS->OpenProtocol ( 178733f03aa9056f4de82621caf06f2c10908e7f662qhuang Controller, 179733f03aa9056f4de82621caf06f2c10908e7f662qhuang &gEfiPciIoProtocolGuid, 180733f03aa9056f4de82621caf06f2c10908e7f662qhuang (VOID **) &PciIo, 181733f03aa9056f4de82621caf06f2c10908e7f662qhuang This->DriverBindingHandle, 182733f03aa9056f4de82621caf06f2c10908e7f662qhuang Controller, 183733f03aa9056f4de82621caf06f2c10908e7f662qhuang EFI_OPEN_PROTOCOL_BY_DRIVER 184733f03aa9056f4de82621caf06f2c10908e7f662qhuang ); 185733f03aa9056f4de82621caf06f2c10908e7f662qhuang if (EFI_ERROR (Status)) { 186733f03aa9056f4de82621caf06f2c10908e7f662qhuang goto Done; 187733f03aa9056f4de82621caf06f2c10908e7f662qhuang } 188733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 189733f03aa9056f4de82621caf06f2c10908e7f662qhuang // Allocate the private device structure 190733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 191269e4559ae140e6217584a627ba9056db2f60952xli PciVgaMiniPortPrivate = AllocateZeroPool (sizeof (PCI_VGA_MINI_PORT_DEV)); 192269e4559ae140e6217584a627ba9056db2f60952xli ASSERT (PciVgaMiniPortPrivate != NULL); 193733f03aa9056f4de82621caf06f2c10908e7f662qhuang 194733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 195733f03aa9056f4de82621caf06f2c10908e7f662qhuang // Initialize the private device structure 196733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 197733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortPrivate->Signature = PCI_VGA_MINI_PORT_DEV_SIGNATURE; 198733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortPrivate->Handle = Controller; 199733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortPrivate->PciIo = PciIo; 200733f03aa9056f4de82621caf06f2c10908e7f662qhuang 201733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortPrivate->VgaMiniPort.SetMode = PciVgaMiniPortSetMode; 202733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortPrivate->VgaMiniPort.VgaMemoryOffset = 0xb8000; 203733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortPrivate->VgaMiniPort.CrtcAddressRegisterOffset = 0x3d4; 204733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortPrivate->VgaMiniPort.CrtcDataRegisterOffset = 0x3d5; 205733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortPrivate->VgaMiniPort.VgaMemoryBar = EFI_PCI_IO_PASS_THROUGH_BAR; 206733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortPrivate->VgaMiniPort.CrtcAddressRegisterBar = EFI_PCI_IO_PASS_THROUGH_BAR; 207733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortPrivate->VgaMiniPort.CrtcDataRegisterBar = EFI_PCI_IO_PASS_THROUGH_BAR; 208733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortPrivate->VgaMiniPort.MaxMode = 1; 209733f03aa9056f4de82621caf06f2c10908e7f662qhuang 210733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 211269e4559ae140e6217584a627ba9056db2f60952xli // Install VGA Mini Port Protocol 212733f03aa9056f4de82621caf06f2c10908e7f662qhuang // 213733f03aa9056f4de82621caf06f2c10908e7f662qhuang Status = gBS->InstallMultipleProtocolInterfaces ( 214733f03aa9056f4de82621caf06f2c10908e7f662qhuang &Controller, 215733f03aa9056f4de82621caf06f2c10908e7f662qhuang &gEfiVgaMiniPortProtocolGuid, 216733f03aa9056f4de82621caf06f2c10908e7f662qhuang &PciVgaMiniPortPrivate->VgaMiniPort, 217733f03aa9056f4de82621caf06f2c10908e7f662qhuang NULL 218733f03aa9056f4de82621caf06f2c10908e7f662qhuang ); 219733f03aa9056f4de82621caf06f2c10908e7f662qhuangDone: 220733f03aa9056f4de82621caf06f2c10908e7f662qhuang if (EFI_ERROR (Status)) { 221733f03aa9056f4de82621caf06f2c10908e7f662qhuang gBS->CloseProtocol ( 222269e4559ae140e6217584a627ba9056db2f60952xli Controller, 223269e4559ae140e6217584a627ba9056db2f60952xli &gEfiPciIoProtocolGuid, 224269e4559ae140e6217584a627ba9056db2f60952xli This->DriverBindingHandle, 225269e4559ae140e6217584a627ba9056db2f60952xli Controller 226269e4559ae140e6217584a627ba9056db2f60952xli ); 227eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang if (PciVgaMiniPortPrivate != NULL) { 228269e4559ae140e6217584a627ba9056db2f60952xli FreePool (PciVgaMiniPortPrivate); 229733f03aa9056f4de82621caf06f2c10908e7f662qhuang } 230733f03aa9056f4de82621caf06f2c10908e7f662qhuang } 231733f03aa9056f4de82621caf06f2c10908e7f662qhuang 232733f03aa9056f4de82621caf06f2c10908e7f662qhuang return Status; 233733f03aa9056f4de82621caf06f2c10908e7f662qhuang} 234733f03aa9056f4de82621caf06f2c10908e7f662qhuang 235733f03aa9056f4de82621caf06f2c10908e7f662qhuang 236733f03aa9056f4de82621caf06f2c10908e7f662qhuang/** 237269e4559ae140e6217584a627ba9056db2f60952xli Stop the VGA device with this driver. 238733f03aa9056f4de82621caf06f2c10908e7f662qhuang 239269e4559ae140e6217584a627ba9056db2f60952xli This function uninstalls VGA Mini Port Protocol from the VGA device handle, 240269e4559ae140e6217584a627ba9056db2f60952xli and closes PCI I/O Protocol. 241733f03aa9056f4de82621caf06f2c10908e7f662qhuang 242eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @param This The driver binding protocol. 243eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @param Controller The controller to release. 244eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @param NumberOfChildren The child number that opened controller 245eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang BY_CHILD. 246eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @param ChildHandleBuffer The array of child handle. 247eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang 248eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @retval EFI_SUCCESS The controller or children are stopped. 249eeefcb9d4bbe0282ce9efeba838596e9c5a2f809hfang @retval EFI_DEVICE_ERROR Failed to stop the driver. 250733f03aa9056f4de82621caf06f2c10908e7f662qhuang 251733f03aa9056f4de82621caf06f2c10908e7f662qhuang**/ 252733f03aa9056f4de82621caf06f2c10908e7f662qhuangEFI_STATUS 253733f03aa9056f4de82621caf06f2c10908e7f662qhuangEFIAPI 254733f03aa9056f4de82621caf06f2c10908e7f662qhuangPciVgaMiniPortDriverBindingStop ( 255733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN EFI_DRIVER_BINDING_PROTOCOL *This, 256733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN EFI_HANDLE Controller, 257733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN UINTN NumberOfChildren, 258733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN EFI_HANDLE *ChildHandleBuffer 259733f03aa9056f4de82621caf06f2c10908e7f662qhuang ) 260733f03aa9056f4de82621caf06f2c10908e7f662qhuang{ 261733f03aa9056f4de82621caf06f2c10908e7f662qhuang EFI_STATUS Status; 262733f03aa9056f4de82621caf06f2c10908e7f662qhuang EFI_VGA_MINI_PORT_PROTOCOL *VgaMiniPort; 263733f03aa9056f4de82621caf06f2c10908e7f662qhuang PCI_VGA_MINI_PORT_DEV *PciVgaMiniPortPrivate; 264733f03aa9056f4de82621caf06f2c10908e7f662qhuang 265733f03aa9056f4de82621caf06f2c10908e7f662qhuang Status = gBS->OpenProtocol ( 266733f03aa9056f4de82621caf06f2c10908e7f662qhuang Controller, 267733f03aa9056f4de82621caf06f2c10908e7f662qhuang &gEfiVgaMiniPortProtocolGuid, 268733f03aa9056f4de82621caf06f2c10908e7f662qhuang (VOID **) &VgaMiniPort, 269733f03aa9056f4de82621caf06f2c10908e7f662qhuang This->DriverBindingHandle, 270733f03aa9056f4de82621caf06f2c10908e7f662qhuang Controller, 271733f03aa9056f4de82621caf06f2c10908e7f662qhuang EFI_OPEN_PROTOCOL_GET_PROTOCOL 272733f03aa9056f4de82621caf06f2c10908e7f662qhuang ); 273733f03aa9056f4de82621caf06f2c10908e7f662qhuang if (EFI_ERROR (Status)) { 274733f03aa9056f4de82621caf06f2c10908e7f662qhuang return Status; 275733f03aa9056f4de82621caf06f2c10908e7f662qhuang } 276733f03aa9056f4de82621caf06f2c10908e7f662qhuang 277733f03aa9056f4de82621caf06f2c10908e7f662qhuang PciVgaMiniPortPrivate = PCI_VGA_MINI_PORT_DEV_FROM_THIS (VgaMiniPort); 278733f03aa9056f4de82621caf06f2c10908e7f662qhuang 279733f03aa9056f4de82621caf06f2c10908e7f662qhuang Status = gBS->UninstallProtocolInterface ( 280733f03aa9056f4de82621caf06f2c10908e7f662qhuang Controller, 281733f03aa9056f4de82621caf06f2c10908e7f662qhuang &gEfiVgaMiniPortProtocolGuid, 282733f03aa9056f4de82621caf06f2c10908e7f662qhuang &PciVgaMiniPortPrivate->VgaMiniPort 283733f03aa9056f4de82621caf06f2c10908e7f662qhuang ); 284733f03aa9056f4de82621caf06f2c10908e7f662qhuang if (EFI_ERROR (Status)) { 285733f03aa9056f4de82621caf06f2c10908e7f662qhuang return Status; 286733f03aa9056f4de82621caf06f2c10908e7f662qhuang } 287733f03aa9056f4de82621caf06f2c10908e7f662qhuang 288733f03aa9056f4de82621caf06f2c10908e7f662qhuang gBS->CloseProtocol ( 289269e4559ae140e6217584a627ba9056db2f60952xli Controller, 290269e4559ae140e6217584a627ba9056db2f60952xli &gEfiPciIoProtocolGuid, 291269e4559ae140e6217584a627ba9056db2f60952xli This->DriverBindingHandle, 292269e4559ae140e6217584a627ba9056db2f60952xli Controller 293269e4559ae140e6217584a627ba9056db2f60952xli ); 294733f03aa9056f4de82621caf06f2c10908e7f662qhuang 295269e4559ae140e6217584a627ba9056db2f60952xli FreePool (PciVgaMiniPortPrivate); 296733f03aa9056f4de82621caf06f2c10908e7f662qhuang 297733f03aa9056f4de82621caf06f2c10908e7f662qhuang return EFI_SUCCESS; 298733f03aa9056f4de82621caf06f2c10908e7f662qhuang} 299733f03aa9056f4de82621caf06f2c10908e7f662qhuang// 300733f03aa9056f4de82621caf06f2c10908e7f662qhuang// VGA Mini Port Protocol Functions 301733f03aa9056f4de82621caf06f2c10908e7f662qhuang// 302733f03aa9056f4de82621caf06f2c10908e7f662qhuang 303733f03aa9056f4de82621caf06f2c10908e7f662qhuang/** 304269e4559ae140e6217584a627ba9056db2f60952xli Sets the text display mode of a VGA controller. 305733f03aa9056f4de82621caf06f2c10908e7f662qhuang 306269e4559ae140e6217584a627ba9056db2f60952xli This function implements EFI_VGA_MINI_PORT_PROTOCOL.SetMode(). 307269e4559ae140e6217584a627ba9056db2f60952xli If ModeNumber exceeds the valid range, then EFI_UNSUPPORTED is returned. 308269e4559ae140e6217584a627ba9056db2f60952xli Otherwise, EFI_SUCCESS is directly returned without real operation. 309269e4559ae140e6217584a627ba9056db2f60952xli 310269e4559ae140e6217584a627ba9056db2f60952xli @param This Protocol instance pointer. 311269e4559ae140e6217584a627ba9056db2f60952xli @param ModeNumber Mode number. 0 - 80x25 1-80x50 312733f03aa9056f4de82621caf06f2c10908e7f662qhuang 313269e4559ae140e6217584a627ba9056db2f60952xli @retval EFI_SUCCESS The mode was set 314269e4559ae140e6217584a627ba9056db2f60952xli @retval EFI_UNSUPPORTED ModeNumber is not supported. 315269e4559ae140e6217584a627ba9056db2f60952xli @retval EFI_DEVICE_ERROR The device is not functioning properly. 316269e4559ae140e6217584a627ba9056db2f60952xli 317733f03aa9056f4de82621caf06f2c10908e7f662qhuang**/ 318733f03aa9056f4de82621caf06f2c10908e7f662qhuangEFI_STATUS 319733f03aa9056f4de82621caf06f2c10908e7f662qhuangEFIAPI 320733f03aa9056f4de82621caf06f2c10908e7f662qhuangPciVgaMiniPortSetMode ( 321733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN EFI_VGA_MINI_PORT_PROTOCOL *This, 322733f03aa9056f4de82621caf06f2c10908e7f662qhuang IN UINTN ModeNumber 323733f03aa9056f4de82621caf06f2c10908e7f662qhuang ) 324733f03aa9056f4de82621caf06f2c10908e7f662qhuang{ 325733f03aa9056f4de82621caf06f2c10908e7f662qhuang if (ModeNumber > This->MaxMode) { 326733f03aa9056f4de82621caf06f2c10908e7f662qhuang return EFI_UNSUPPORTED; 327733f03aa9056f4de82621caf06f2c10908e7f662qhuang } 328733f03aa9056f4de82621caf06f2c10908e7f662qhuang 329733f03aa9056f4de82621caf06f2c10908e7f662qhuang return EFI_SUCCESS; 330733f03aa9056f4de82621caf06f2c10908e7f662qhuang} 331fcf03596d10de53e45292bd9eb4767a8ddc344edklu 332