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