155a1bb43aa37fc948911197a99e23199fcc58b72xli/** @file
255a1bb43aa37fc948911197a99e23199fcc58b72xli  VGA Class Driver that managers VGA devices and produces Simple Text Output Protocol.
33db510989eb500296c3f4839c427325a02aea2e3klu
4180a5a35cb49699bd249dee19e41cee34c856a58hhtianCopyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
5180a5a35cb49699bd249dee19e41cee34c856a58hhtianThis program and the accompanying materials
63db510989eb500296c3f4839c427325a02aea2e3kluare licensed and made available under the terms and conditions of the BSD License
73db510989eb500296c3f4839c427325a02aea2e3kluwhich accompanies this distribution.  The full text of the license may be found at
83db510989eb500296c3f4839c427325a02aea2e3kluhttp://opensource.org/licenses/bsd-license.php
93db510989eb500296c3f4839c427325a02aea2e3klu
103db510989eb500296c3f4839c427325a02aea2e3kluTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
113db510989eb500296c3f4839c427325a02aea2e3kluWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
123db510989eb500296c3f4839c427325a02aea2e3klu
133db510989eb500296c3f4839c427325a02aea2e3klu**/
14e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
15e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang#include "VgaClass.h"
16e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
17e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang//
18e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// EFI Driver Binding Protocol for the VGA Class Driver
19e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang//
20e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_DRIVER_BINDING_PROTOCOL gVgaClassDriverBinding = {
21e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VgaClassDriverBindingSupported,
22e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VgaClassDriverBindingStart,
23e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VgaClassDriverBindingStop,
24e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  0xa,
25e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  NULL,
26e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  NULL
27e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang};
28e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
29e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang//
30e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// Local variables
31e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang//
32819d1488930d30b30bb467fcb3bf0f05b28d675ejjiCHAR16               CrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };
33e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
34e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang//
35e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// This list is used to define the valid extend chars.
36e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// It also provides a mapping from Unicode to PCANSI or
37e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang// ASCII. The ASCII mapping we just made up.
38e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang//
39e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang//
40819d1488930d30b30bb467fcb3bf0f05b28d675ejjiUNICODE_TO_CHAR  UnicodeToPcAnsiOrAscii[] = {
41e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
42e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_HORIZONTAL,
43e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xc4,
44e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'-'
45e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
46e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
47e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_VERTICAL,
48e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xb3,
49e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'|'
50e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
51e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
52e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOWN_RIGHT,
53e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xda,
54e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'/'
55e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
56e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
57e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOWN_LEFT,
58e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xbf,
59e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'\\'
60e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
61e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
62e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_UP_RIGHT,
63e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xc0,
64e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'\\'
65e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
66e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
67e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_UP_LEFT,
68e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xd9,
69e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'/'
70e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
71e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
72e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_VERTICAL_RIGHT,
73e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xc3,
74e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'|'
75e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
76e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
77e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_VERTICAL_LEFT,
78e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xb4,
79e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'|'
80e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
81e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
82e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOWN_HORIZONTAL,
83e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xc2,
84e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'+'
85e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
86e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
87e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_UP_HORIZONTAL,
88e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xc1,
89e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'+'
90e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
91e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
92e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_VERTICAL_HORIZONTAL,
93e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xc5,
94e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'+'
95e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
96e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
97e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOUBLE_HORIZONTAL,
98e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xcd,
99e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'-'
100e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
101e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
102e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOUBLE_VERTICAL,
103e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xba,
104e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'|'
105e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
106e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
107e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOWN_RIGHT_DOUBLE,
108e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xd5,
109e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'/'
110e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
111e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
112e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOWN_DOUBLE_RIGHT,
113e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xd6,
114e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'/'
115e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
116e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
117e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOUBLE_DOWN_RIGHT,
118e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xc9,
119e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'/'
120e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
121e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
122e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOWN_LEFT_DOUBLE,
123e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xb8,
124e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'\\'
125e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
126e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
127e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOWN_DOUBLE_LEFT,
128e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xb7,
129e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'\\'
130e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
131e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
132e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOUBLE_DOWN_LEFT,
133e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xbb,
134e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'\\'
135e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
136e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
137e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_UP_RIGHT_DOUBLE,
138e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xd4,
139e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'\\'
140e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
141e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
142e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_UP_DOUBLE_RIGHT,
143e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xd3,
144e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'\\'
145e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
146e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
147e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOUBLE_UP_RIGHT,
148e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xc8,
149e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'\\'
150e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
151e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
152e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_UP_LEFT_DOUBLE,
153e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xbe,
154e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'/'
155e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
156e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
157e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_UP_DOUBLE_LEFT,
158e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xbd,
159e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'/'
160e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
161e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
162e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOUBLE_UP_LEFT,
163e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xbc,
164e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'/'
165e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
166e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
167e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_VERTICAL_RIGHT_DOUBLE,
168e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xc6,
169e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'|'
170e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
171e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
172e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_VERTICAL_DOUBLE_RIGHT,
173e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xc7,
174e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'|'
175e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
176e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
177e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOUBLE_VERTICAL_RIGHT,
178e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xcc,
179e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'|'
180e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
181e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
182e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_VERTICAL_LEFT_DOUBLE,
183e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xb5,
184e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'|'
185e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
186e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
187e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_VERTICAL_DOUBLE_LEFT,
188e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xb6,
189e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'|'
190e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
191e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
192e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOUBLE_VERTICAL_LEFT,
193e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xb9,
194e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'|'
195e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
196e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
197e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOWN_HORIZONTAL_DOUBLE,
198e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xd1,
199e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'+'
200e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
201e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
202e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOWN_DOUBLE_HORIZONTAL,
203e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xd2,
204e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'+'
205e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
206e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
207e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOUBLE_DOWN_HORIZONTAL,
208e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xcb,
209e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'+'
210e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
211e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
212e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_UP_HORIZONTAL_DOUBLE,
213e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xcf,
214e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'+'
215e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
216e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
217e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_UP_DOUBLE_HORIZONTAL,
218e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xd0,
219e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'+'
220e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
221e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
222e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOUBLE_UP_HORIZONTAL,
223e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xca,
224e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'+'
225e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
226e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
227e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE,
228e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xd8,
229e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'+'
230e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
231e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
232e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL,
233e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xd7,
234e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'+'
235e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
236e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
237e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL,
238e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xce,
239e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'+'
240e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
241e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
242e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
243e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BLOCKELEMENT_FULL_BLOCK,
244e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xdb,
245e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'*'
246e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
247e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
248e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    BLOCKELEMENT_LIGHT_SHADE,
249e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0xb0,
250e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'+'
251e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
252e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
253e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
254e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    GEOMETRICSHAPE_UP_TRIANGLE,
255e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0x1e,
256e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'^'
257e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
258e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
259e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    GEOMETRICSHAPE_RIGHT_TRIANGLE,
260e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0x10,
261e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'>'
262e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
263e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
264e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    GEOMETRICSHAPE_DOWN_TRIANGLE,
265e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0x1f,
266e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'v'
267e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
268e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
269e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    GEOMETRICSHAPE_LEFT_TRIANGLE,
270e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0x11,
271e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'<'
272e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
273e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
274e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
275e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    ARROW_LEFT,
276e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0x3c,
277e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'<'
278e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
279e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
280e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
281e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    ARROW_UP,
282e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0x18,
283e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'^'
284e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
285e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
286e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
287e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    ARROW_RIGHT,
288e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0x3e,
289e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'>'
290e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
291e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
292e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
293e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    ARROW_DOWN,
294e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0x19,
295e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    L'v'
296e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  },
297e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
298e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  {
299e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0x0000,
300e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0x00,
301e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    0x00
302e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
303e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang};
304e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
30555a1bb43aa37fc948911197a99e23199fcc58b72xli/**
30655a1bb43aa37fc948911197a99e23199fcc58b72xli  Entrypoint of this VGA Class Driver.
30755a1bb43aa37fc948911197a99e23199fcc58b72xli
30855a1bb43aa37fc948911197a99e23199fcc58b72xli  This function is the entrypoint of this VGA Class Driver. It installs Driver Binding
30955a1bb43aa37fc948911197a99e23199fcc58b72xli  Protocols together with Component Name Protocols.
31055a1bb43aa37fc948911197a99e23199fcc58b72xli
31155a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  ImageHandle       The firmware allocated handle for the EFI image.
31255a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  SystemTable       A pointer to the EFI System Table.
31355a1bb43aa37fc948911197a99e23199fcc58b72xli
31455a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_SUCCESS       The entry point is executed successfully.
31555a1bb43aa37fc948911197a99e23199fcc58b72xli
31655a1bb43aa37fc948911197a99e23199fcc58b72xli**/
31755a1bb43aa37fc948911197a99e23199fcc58b72xliEFI_STATUS
31855a1bb43aa37fc948911197a99e23199fcc58b72xliEFIAPI
31955a1bb43aa37fc948911197a99e23199fcc58b72xliInitializeVgaClass(
32055a1bb43aa37fc948911197a99e23199fcc58b72xli  IN EFI_HANDLE           ImageHandle,
32155a1bb43aa37fc948911197a99e23199fcc58b72xli  IN EFI_SYSTEM_TABLE     *SystemTable
32255a1bb43aa37fc948911197a99e23199fcc58b72xli  )
32355a1bb43aa37fc948911197a99e23199fcc58b72xli{
32455a1bb43aa37fc948911197a99e23199fcc58b72xli  EFI_STATUS              Status;
32555a1bb43aa37fc948911197a99e23199fcc58b72xli
32655a1bb43aa37fc948911197a99e23199fcc58b72xli  //
32755a1bb43aa37fc948911197a99e23199fcc58b72xli  // Install driver model protocol(s).
32855a1bb43aa37fc948911197a99e23199fcc58b72xli  //
32955a1bb43aa37fc948911197a99e23199fcc58b72xli  Status = EfiLibInstallDriverBindingComponentName2 (
33055a1bb43aa37fc948911197a99e23199fcc58b72xli             ImageHandle,
33155a1bb43aa37fc948911197a99e23199fcc58b72xli             SystemTable,
33255a1bb43aa37fc948911197a99e23199fcc58b72xli             &gVgaClassDriverBinding,
33355a1bb43aa37fc948911197a99e23199fcc58b72xli             ImageHandle,
33455a1bb43aa37fc948911197a99e23199fcc58b72xli             &gVgaClassComponentName,
33555a1bb43aa37fc948911197a99e23199fcc58b72xli             &gVgaClassComponentName2
33655a1bb43aa37fc948911197a99e23199fcc58b72xli             );
33755a1bb43aa37fc948911197a99e23199fcc58b72xli  ASSERT_EFI_ERROR (Status);
33855a1bb43aa37fc948911197a99e23199fcc58b72xli
33955a1bb43aa37fc948911197a99e23199fcc58b72xli  return EFI_SUCCESS;
34055a1bb43aa37fc948911197a99e23199fcc58b72xli}
34155a1bb43aa37fc948911197a99e23199fcc58b72xli
34255a1bb43aa37fc948911197a99e23199fcc58b72xli/**
34355a1bb43aa37fc948911197a99e23199fcc58b72xli  Internal worker function to program CRTC register via PCI I/O Protocol.
34455a1bb43aa37fc948911197a99e23199fcc58b72xli
34555a1bb43aa37fc948911197a99e23199fcc58b72xli  @param VgaClassDev  device instance object
34655a1bb43aa37fc948911197a99e23199fcc58b72xli  @param Address      Address of register to write
34755a1bb43aa37fc948911197a99e23199fcc58b72xli  @param Data         Data to write to register.
34855a1bb43aa37fc948911197a99e23199fcc58b72xli
34955a1bb43aa37fc948911197a99e23199fcc58b72xli**/
35055a1bb43aa37fc948911197a99e23199fcc58b72xliVOID
35155a1bb43aa37fc948911197a99e23199fcc58b72xliWriteCrtc (
35255a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  VGA_CLASS_DEV  *VgaClassDev,
35355a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  UINT16         Address,
35455a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  UINT8          Data
35555a1bb43aa37fc948911197a99e23199fcc58b72xli  )
35655a1bb43aa37fc948911197a99e23199fcc58b72xli{
35755a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassDev->PciIo->Io.Write (
35855a1bb43aa37fc948911197a99e23199fcc58b72xli                           VgaClassDev->PciIo,
35955a1bb43aa37fc948911197a99e23199fcc58b72xli                           EfiPciIoWidthUint8,
36055a1bb43aa37fc948911197a99e23199fcc58b72xli                           VgaClassDev->VgaMiniPort->CrtcAddressRegisterBar,
36155a1bb43aa37fc948911197a99e23199fcc58b72xli                           VgaClassDev->VgaMiniPort->CrtcAddressRegisterOffset,
36255a1bb43aa37fc948911197a99e23199fcc58b72xli                           1,
36355a1bb43aa37fc948911197a99e23199fcc58b72xli                           &Address
36455a1bb43aa37fc948911197a99e23199fcc58b72xli                           );
36555a1bb43aa37fc948911197a99e23199fcc58b72xli
36655a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassDev->PciIo->Io.Write (
36755a1bb43aa37fc948911197a99e23199fcc58b72xli                           VgaClassDev->PciIo,
36855a1bb43aa37fc948911197a99e23199fcc58b72xli                           EfiPciIoWidthUint8,
36955a1bb43aa37fc948911197a99e23199fcc58b72xli                           VgaClassDev->VgaMiniPort->CrtcDataRegisterBar,
37055a1bb43aa37fc948911197a99e23199fcc58b72xli                           VgaClassDev->VgaMiniPort->CrtcDataRegisterOffset,
37155a1bb43aa37fc948911197a99e23199fcc58b72xli                           1,
37255a1bb43aa37fc948911197a99e23199fcc58b72xli                           &Data
37355a1bb43aa37fc948911197a99e23199fcc58b72xli                           );
37455a1bb43aa37fc948911197a99e23199fcc58b72xli}
37555a1bb43aa37fc948911197a99e23199fcc58b72xli
37655a1bb43aa37fc948911197a99e23199fcc58b72xli/**
37755a1bb43aa37fc948911197a99e23199fcc58b72xli  Internal worker function to set cursor's position to VgaClass device
37855a1bb43aa37fc948911197a99e23199fcc58b72xli
37955a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  VgaClassDev   Private data structure for device instance.
38055a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  Column        Colomn of position to set cursor to.
38155a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  Row           Row of position to set cursor to.
38255a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  MaxColumn     Max value of column.
38355a1bb43aa37fc948911197a99e23199fcc58b72xli
38455a1bb43aa37fc948911197a99e23199fcc58b72xli**/
385e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVOID
386e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangSetVideoCursorPosition (
387e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  VGA_CLASS_DEV  *VgaClassDev,
388e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  UINTN          Column,
389e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  UINTN          Row,
390e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  UINTN          MaxColumn
39155a1bb43aa37fc948911197a99e23199fcc58b72xli  )
39255a1bb43aa37fc948911197a99e23199fcc58b72xli{
39355a1bb43aa37fc948911197a99e23199fcc58b72xli  Column    = Column & 0xff;
39455a1bb43aa37fc948911197a99e23199fcc58b72xli  Row       = Row & 0xff;
39555a1bb43aa37fc948911197a99e23199fcc58b72xli  MaxColumn = MaxColumn & 0xff;
396e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
39755a1bb43aa37fc948911197a99e23199fcc58b72xli  WriteCrtc (
39855a1bb43aa37fc948911197a99e23199fcc58b72xli    VgaClassDev,
39955a1bb43aa37fc948911197a99e23199fcc58b72xli    CRTC_CURSOR_LOCATION_HIGH,
40055a1bb43aa37fc948911197a99e23199fcc58b72xli    (UINT8) ((Row * MaxColumn + Column) >> 8)
40155a1bb43aa37fc948911197a99e23199fcc58b72xli    );
40255a1bb43aa37fc948911197a99e23199fcc58b72xli  WriteCrtc (
40355a1bb43aa37fc948911197a99e23199fcc58b72xli    VgaClassDev,
40455a1bb43aa37fc948911197a99e23199fcc58b72xli    CRTC_CURSOR_LOCATION_LOW,
40555a1bb43aa37fc948911197a99e23199fcc58b72xli    (UINT8) ((Row * MaxColumn + Column) & 0xff)
40655a1bb43aa37fc948911197a99e23199fcc58b72xli    );
40755a1bb43aa37fc948911197a99e23199fcc58b72xli}
40855a1bb43aa37fc948911197a99e23199fcc58b72xli
40955a1bb43aa37fc948911197a99e23199fcc58b72xli/**
41055a1bb43aa37fc948911197a99e23199fcc58b72xli  Internal worker function to detect if a Unicode char is for Box Drawing text graphics.
411e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
41255a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  Graphic  Unicode char to test.
41355a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  PcAnsi   Pointer to PCANSI equivalent of Graphic for output.
41455a1bb43aa37fc948911197a99e23199fcc58b72xli                   If NULL, then PCANSI value is not returned.
41555a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  Ascii    Pointer to ASCII equivalent of Graphic for output.
41655a1bb43aa37fc948911197a99e23199fcc58b72xli                   If NULL, then ASCII value is not returned.
41755a1bb43aa37fc948911197a99e23199fcc58b72xli
41855a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval TRUE     Gpaphic is a supported Unicode Box Drawing character.
41955a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval FALSE    Gpaphic is not a supported Unicode Box Drawing character.
42055a1bb43aa37fc948911197a99e23199fcc58b72xli
42155a1bb43aa37fc948911197a99e23199fcc58b72xli**/
422e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangBOOLEAN
423e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangLibIsValidTextGraphics (
424e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  CHAR16  Graphic,
425e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  OUT CHAR8   *PcAnsi, OPTIONAL
426e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  OUT CHAR8   *Ascii OPTIONAL
42755a1bb43aa37fc948911197a99e23199fcc58b72xli  )
42855a1bb43aa37fc948911197a99e23199fcc58b72xli{
42955a1bb43aa37fc948911197a99e23199fcc58b72xli  UNICODE_TO_CHAR *Table;
43055a1bb43aa37fc948911197a99e23199fcc58b72xli
43155a1bb43aa37fc948911197a99e23199fcc58b72xli  //
43255a1bb43aa37fc948911197a99e23199fcc58b72xli  // Unicode drawing code charts are all in the 0x25xx range, arrows are 0x21xx.
43355a1bb43aa37fc948911197a99e23199fcc58b72xli  // So first filter out values not in these 2 ranges.
43455a1bb43aa37fc948911197a99e23199fcc58b72xli  //
43555a1bb43aa37fc948911197a99e23199fcc58b72xli  if ((((Graphic & 0xff00) != 0x2500) && ((Graphic & 0xff00) != 0x2100))) {
43655a1bb43aa37fc948911197a99e23199fcc58b72xli    return FALSE;
43755a1bb43aa37fc948911197a99e23199fcc58b72xli  }
43855a1bb43aa37fc948911197a99e23199fcc58b72xli
43955a1bb43aa37fc948911197a99e23199fcc58b72xli  //
44055a1bb43aa37fc948911197a99e23199fcc58b72xli  // Search UnicodeToPcAnsiOrAscii table for matching entry.
44155a1bb43aa37fc948911197a99e23199fcc58b72xli  //
44255a1bb43aa37fc948911197a99e23199fcc58b72xli  for (Table = UnicodeToPcAnsiOrAscii; Table->Unicode != 0x0000; Table++) {
44355a1bb43aa37fc948911197a99e23199fcc58b72xli    if (Graphic == Table->Unicode) {
44455a1bb43aa37fc948911197a99e23199fcc58b72xli      if (PcAnsi != NULL) {
44555a1bb43aa37fc948911197a99e23199fcc58b72xli        *PcAnsi = Table->PcAnsi;
44655a1bb43aa37fc948911197a99e23199fcc58b72xli      }
44755a1bb43aa37fc948911197a99e23199fcc58b72xli
44855a1bb43aa37fc948911197a99e23199fcc58b72xli      if (Ascii != NULL) {
44955a1bb43aa37fc948911197a99e23199fcc58b72xli        *Ascii = Table->Ascii;
45055a1bb43aa37fc948911197a99e23199fcc58b72xli      }
45155a1bb43aa37fc948911197a99e23199fcc58b72xli
45255a1bb43aa37fc948911197a99e23199fcc58b72xli      return TRUE;
45355a1bb43aa37fc948911197a99e23199fcc58b72xli    }
45455a1bb43aa37fc948911197a99e23199fcc58b72xli  }
45555a1bb43aa37fc948911197a99e23199fcc58b72xli
45655a1bb43aa37fc948911197a99e23199fcc58b72xli  //
45755a1bb43aa37fc948911197a99e23199fcc58b72xli  // If value is not found in UnicodeToPcAnsiOrAscii table, then return FALSE.
45855a1bb43aa37fc948911197a99e23199fcc58b72xli  //
45955a1bb43aa37fc948911197a99e23199fcc58b72xli  return FALSE;
46055a1bb43aa37fc948911197a99e23199fcc58b72xli}
46155a1bb43aa37fc948911197a99e23199fcc58b72xli
46255a1bb43aa37fc948911197a99e23199fcc58b72xli/**
46355a1bb43aa37fc948911197a99e23199fcc58b72xli  Internal worker function to check whether input value is an ASCII char.
46455a1bb43aa37fc948911197a99e23199fcc58b72xli
46555a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  Char     Character to check.
46655a1bb43aa37fc948911197a99e23199fcc58b72xli
46755a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval TRUE     Input value is an ASCII char.
46855a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval FALSE    Input value is not an ASCII char.
469e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
47055a1bb43aa37fc948911197a99e23199fcc58b72xli**/
471e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangBOOLEAN
472e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangIsValidAscii (
47355a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  CHAR16  Char
47455a1bb43aa37fc948911197a99e23199fcc58b72xli  )
47555a1bb43aa37fc948911197a99e23199fcc58b72xli{
47655a1bb43aa37fc948911197a99e23199fcc58b72xli  if ((Char >= 0x20) && (Char <= 0x7f)) {
47755a1bb43aa37fc948911197a99e23199fcc58b72xli    return TRUE;
47855a1bb43aa37fc948911197a99e23199fcc58b72xli  }
479e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
48055a1bb43aa37fc948911197a99e23199fcc58b72xli  return FALSE;
48155a1bb43aa37fc948911197a99e23199fcc58b72xli}
48255a1bb43aa37fc948911197a99e23199fcc58b72xli
48355a1bb43aa37fc948911197a99e23199fcc58b72xli/**
48455a1bb43aa37fc948911197a99e23199fcc58b72xli  Internal worker function to check whether input value is a unicode control char.
48555a1bb43aa37fc948911197a99e23199fcc58b72xli
48655a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  Char    Character to check.
48755a1bb43aa37fc948911197a99e23199fcc58b72xli
48855a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval TRUE     Input value is a unicode control char.
48955a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval FALSE    Input value is not a unicode control char.
49055a1bb43aa37fc948911197a99e23199fcc58b72xli
49155a1bb43aa37fc948911197a99e23199fcc58b72xli**/
492e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangBOOLEAN
493e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangIsValidEfiCntlChar (
49455a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  CHAR16  Char
49555a1bb43aa37fc948911197a99e23199fcc58b72xli  )
49655a1bb43aa37fc948911197a99e23199fcc58b72xli{
49755a1bb43aa37fc948911197a99e23199fcc58b72xli  if (Char == CHAR_NULL || Char == CHAR_BACKSPACE || Char == CHAR_LINEFEED || Char == CHAR_CARRIAGE_RETURN) {
49855a1bb43aa37fc948911197a99e23199fcc58b72xli    return TRUE;
49955a1bb43aa37fc948911197a99e23199fcc58b72xli  }
50055a1bb43aa37fc948911197a99e23199fcc58b72xli
50155a1bb43aa37fc948911197a99e23199fcc58b72xli  return FALSE;
50255a1bb43aa37fc948911197a99e23199fcc58b72xli}
503e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
504a73d0c743b5192b1038a24711525eed71dfa300fklu/**
50555a1bb43aa37fc948911197a99e23199fcc58b72xli  Tests to see if this driver supports a given controller.
506a73d0c743b5192b1038a24711525eed71dfa300fklu
50755a1bb43aa37fc948911197a99e23199fcc58b72xli  This function implments EFI_DRIVER_BINDING_PROTOCOL.Supported().
50855a1bb43aa37fc948911197a99e23199fcc58b72xli  It Checks if this driver supports the controller specified. Any Controller
50955a1bb43aa37fc948911197a99e23199fcc58b72xli  with VgaMiniPort Protocol and Pci I/O protocol can be supported.
51055a1bb43aa37fc948911197a99e23199fcc58b72xli
51155a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  This                A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
512a73d0c743b5192b1038a24711525eed71dfa300fklu  @param  ControllerHandle    Handle of device to test
513a73d0c743b5192b1038a24711525eed71dfa300fklu  @param  RemainingDevicePath Optional parameter use to pick a specific child
514a73d0c743b5192b1038a24711525eed71dfa300fklu                              device to start.
515a73d0c743b5192b1038a24711525eed71dfa300fklu
51655a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_SUCCESS         This driver supports this device.
51755a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_ALREADY_STARTED This driver is already running on this device.
51855a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_UNSUPPORTED     This driver does not support this device.
519a73d0c743b5192b1038a24711525eed71dfa300fklu
520a73d0c743b5192b1038a24711525eed71dfa300fklu**/
521e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS
522e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI
523e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassDriverBindingSupported (
524e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
525e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN EFI_HANDLE                   Controller,
52655a1bb43aa37fc948911197a99e23199fcc58b72xli  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
527e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  )
528e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{
529e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  EFI_STATUS                  Status;
530e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
531e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
53255a1bb43aa37fc948911197a99e23199fcc58b72xli  // Checks if Abstraction(s) needed to perform the supported test
533e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
534e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = gBS->OpenProtocol (
535e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  Controller,
536e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  &gEfiVgaMiniPortProtocolGuid,
53755a1bb43aa37fc948911197a99e23199fcc58b72xli                  NULL,
538e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  This->DriverBindingHandle,
539e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  Controller,
540e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
541e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  );
542e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
543e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return Status;
544e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
545e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
546e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  // Open the IO Abstraction(s) needed to perform the supported test
547e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
548e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = gBS->OpenProtocol (
549e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  Controller,
550e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  &gEfiPciIoProtocolGuid,
551e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  NULL,
552e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  This->DriverBindingHandle,
553e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  Controller,
554e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
555e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  );
556e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
557e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return Status;
558e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
559e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
560e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  return Status;
561e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}
562e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
563a73d0c743b5192b1038a24711525eed71dfa300fklu/**
56455a1bb43aa37fc948911197a99e23199fcc58b72xli  Starts the device controller.
565a73d0c743b5192b1038a24711525eed71dfa300fklu
56655a1bb43aa37fc948911197a99e23199fcc58b72xli  This function implments EFI_DRIVER_BINDING_PROTOCOL.Start().
56755a1bb43aa37fc948911197a99e23199fcc58b72xli  It starts the device specified by Controller with the driver based on PCI I/O Protocol
56855a1bb43aa37fc948911197a99e23199fcc58b72xli  and VgaMiniPort Protocol. It creates context for device instance and install EFI_SIMPLE_TEXT_OUT_PROTOCOL.
56955a1bb43aa37fc948911197a99e23199fcc58b72xli
57055a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
571a73d0c743b5192b1038a24711525eed71dfa300fklu  @param  ControllerHandle     Handle of device to bind driver to
572a73d0c743b5192b1038a24711525eed71dfa300fklu  @param  RemainingDevicePath  Optional parameter use to pick a specific child
573a73d0c743b5192b1038a24711525eed71dfa300fklu                               device to start.
574a73d0c743b5192b1038a24711525eed71dfa300fklu
57555a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_SUCCESS          The device was started.
57655a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval other                Fail to start the device.
577a73d0c743b5192b1038a24711525eed71dfa300fklu
578a73d0c743b5192b1038a24711525eed71dfa300fklu**/
579e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS
580e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI
581e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassDriverBindingStart (
582e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
583e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN EFI_HANDLE                   Controller,
58455a1bb43aa37fc948911197a99e23199fcc58b72xli  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
585e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  )
586e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{
587e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  EFI_STATUS                  Status;
588e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  EFI_VGA_MINI_PORT_PROTOCOL  *VgaMiniPort;
589e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  EFI_PCI_IO_PROTOCOL         *PciIo;
590e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VGA_CLASS_DEV               *VgaClassPrivate;
591e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  EFI_DEVICE_PATH_PROTOCOL    *DevicePath;
592e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
593e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = gBS->HandleProtocol (
594e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  Controller,
595e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  &gEfiDevicePathProtocolGuid,
596e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  (VOID **) &DevicePath
597e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  );
598e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
599e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return Status;
600e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
601e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
602e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  // Report that VGA Class driver is being enabled
603e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
604e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  REPORT_STATUS_CODE_WITH_DEVICE_PATH (
605e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    EFI_PROGRESS_CODE,
606e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_ENABLE,
607e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    DevicePath
608e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    );
609e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
610e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
61155a1bb43aa37fc948911197a99e23199fcc58b72xli  // Open the PCI I/O Protocol
612e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
613e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = gBS->OpenProtocol (
614e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  Controller,
615e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  &gEfiPciIoProtocolGuid,
616e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  (VOID **) &PciIo,
617e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  This->DriverBindingHandle,
618e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  Controller,
619e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
620e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  );
621e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
622e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return Status;
623e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
62455a1bb43aa37fc948911197a99e23199fcc58b72xli  //
62555a1bb43aa37fc948911197a99e23199fcc58b72xli  // Open the VGA Mini Port Protocol
62655a1bb43aa37fc948911197a99e23199fcc58b72xli  //
627e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = gBS->OpenProtocol (
628e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  Controller,
629e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  &gEfiVgaMiniPortProtocolGuid,
630e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  (VOID **) &VgaMiniPort,
631e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  This->DriverBindingHandle,
632e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  Controller,
633e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  EFI_OPEN_PROTOCOL_BY_DRIVER
634e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  );
635e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
636e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return Status;
637e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
638e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
639e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  // Allocate the private device structure
640e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
64155a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate = AllocateZeroPool (sizeof (VGA_CLASS_DEV));
64255a1bb43aa37fc948911197a99e23199fcc58b72xli  ASSERT (VgaClassPrivate != NULL);
643e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
644e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
645e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  // Initialize the private device structure
646e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
64755a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->Signature   = VGA_CLASS_DEV_SIGNATURE;
64855a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->Handle      = Controller;
649e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VgaClassPrivate->VgaMiniPort = VgaMiniPort;
65055a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->PciIo       = PciIo;
651e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
65255a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->SimpleTextOut.Reset             = VgaClassReset;
65355a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->SimpleTextOut.OutputString      = VgaClassOutputString;
65455a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->SimpleTextOut.TestString        = VgaClassTestString;
65555a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->SimpleTextOut.ClearScreen       = VgaClassClearScreen;
65655a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->SimpleTextOut.SetAttribute      = VgaClassSetAttribute;
657e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VgaClassPrivate->SimpleTextOut.SetCursorPosition = VgaClassSetCursorPosition;
65855a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->SimpleTextOut.EnableCursor      = VgaClassEnableCursor;
65955a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->SimpleTextOut.QueryMode         = VgaClassQueryMode;
66055a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->SimpleTextOut.SetMode           = VgaClassSetMode;
661e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
66255a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->SimpleTextOut.Mode              = &VgaClassPrivate->SimpleTextOutputMode;
66355a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->SimpleTextOutputMode.MaxMode    = VgaMiniPort->MaxMode;
66455a1bb43aa37fc948911197a99e23199fcc58b72xli  VgaClassPrivate->DevicePath                      = DevicePath;
665e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
66655a1bb43aa37fc948911197a99e23199fcc58b72xli  //
66755a1bb43aa37fc948911197a99e23199fcc58b72xli  // Initialize the VGA device.
66855a1bb43aa37fc948911197a99e23199fcc58b72xli  //
669e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = VgaClassPrivate->SimpleTextOut.SetAttribute (
670e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                            &VgaClassPrivate->SimpleTextOut,
67155a1bb43aa37fc948911197a99e23199fcc58b72xli                                            EFI_TEXT_ATTR (EFI_WHITE, EFI_BLACK)
672e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                            );
673e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
674e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    goto ErrorExit;
675e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
676e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
677e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = VgaClassPrivate->SimpleTextOut.Reset (
678e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                            &VgaClassPrivate->SimpleTextOut,
679e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                            FALSE
680e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                            );
681e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
682e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    goto ErrorExit;
683e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
684e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
685e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = VgaClassPrivate->SimpleTextOut.EnableCursor (
686e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                            &VgaClassPrivate->SimpleTextOut,
687e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                            TRUE
688e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                            );
689e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
690e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    goto ErrorExit;
691e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
692e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
693e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = gBS->InstallMultipleProtocolInterfaces (
694e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  &Controller,
695e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  &gEfiSimpleTextOutProtocolGuid,
696e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  &VgaClassPrivate->SimpleTextOut,
697e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  NULL
698e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  );
699e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
700e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  return Status;
701e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
702e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangErrorExit:
703e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  REPORT_STATUS_CODE_WITH_DEVICE_PATH (
704e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    EFI_ERROR_CODE | EFI_ERROR_MINOR,
705e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_EC_CONTROLLER_ERROR,
706e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    DevicePath
707e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    );
708e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
709e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  return Status;
710e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
711e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}
712e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
713a73d0c743b5192b1038a24711525eed71dfa300fklu/**
71455a1bb43aa37fc948911197a99e23199fcc58b72xli  Starts the device controller.
71555a1bb43aa37fc948911197a99e23199fcc58b72xli
71655a1bb43aa37fc948911197a99e23199fcc58b72xli  This function implments EFI_DRIVER_BINDING_PROTOCOL.Stop().
71755a1bb43aa37fc948911197a99e23199fcc58b72xli  It stops this driver on Controller. Support stoping any child handles
718a73d0c743b5192b1038a24711525eed71dfa300fklu  created by this driver.
719a73d0c743b5192b1038a24711525eed71dfa300fklu
72055a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  This              A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
72155a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  ControllerHandle  A handle to the device being stopped.
72255a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  NumberOfChildren  The number of child device handles in ChildHandleBuffer.
72355a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  ChildHandleBuffer An array of child handles to be freed.
724a73d0c743b5192b1038a24711525eed71dfa300fklu
725a73d0c743b5192b1038a24711525eed71dfa300fklu  @retval EFI_SUCCESS       This driver is removed ControllerHandle
726a73d0c743b5192b1038a24711525eed71dfa300fklu  @retval other             This driver was not removed from this device
727a73d0c743b5192b1038a24711525eed71dfa300fklu
728a73d0c743b5192b1038a24711525eed71dfa300fklu**/
729e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS
730e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI
731e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassDriverBindingStop (
732e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
733e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  EFI_HANDLE                      Controller,
734e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  UINTN                           NumberOfChildren,
73555a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  EFI_HANDLE                      *ChildHandleBuffer OPTIONAL
736e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  )
737e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{
738e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  EFI_STATUS                    Status;
739e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *SimpleTextOut;
740e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VGA_CLASS_DEV                 *VgaClassPrivate;
741e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
742e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = gBS->OpenProtocol (
743e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  Controller,
744e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  &gEfiSimpleTextOutProtocolGuid,
745e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  (VOID **) &SimpleTextOut,
746e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  This->DriverBindingHandle,
747e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  Controller,
748e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
749e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  );
750e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
751e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return Status;
752e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
753e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
754e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VgaClassPrivate = VGA_CLASS_DEV_FROM_THIS (SimpleTextOut);
755e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
756e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
757e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  // Report that VGA Class driver is being disabled
758e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
759e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  REPORT_STATUS_CODE_WITH_DEVICE_PATH (
760e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    EFI_PROGRESS_CODE,
761e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_DISABLE,
762e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    VgaClassPrivate->DevicePath
763e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    );
764e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
765e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = gBS->UninstallProtocolInterface (
766e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  Controller,
767e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  &gEfiSimpleTextOutProtocolGuid,
768e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  &VgaClassPrivate->SimpleTextOut
769e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                  );
770e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
771e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return Status;
772e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
773e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
774e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  // Release PCI I/O and VGA Mini Port Protocols on the controller handle.
775e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  //
776e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  gBS->CloseProtocol (
77755a1bb43aa37fc948911197a99e23199fcc58b72xli         Controller,
77855a1bb43aa37fc948911197a99e23199fcc58b72xli         &gEfiPciIoProtocolGuid,
77955a1bb43aa37fc948911197a99e23199fcc58b72xli         This->DriverBindingHandle,
78055a1bb43aa37fc948911197a99e23199fcc58b72xli         Controller
78155a1bb43aa37fc948911197a99e23199fcc58b72xli         );
782e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
783e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  gBS->CloseProtocol (
78455a1bb43aa37fc948911197a99e23199fcc58b72xli         Controller,
78555a1bb43aa37fc948911197a99e23199fcc58b72xli         &gEfiVgaMiniPortProtocolGuid,
78655a1bb43aa37fc948911197a99e23199fcc58b72xli         This->DriverBindingHandle,
78755a1bb43aa37fc948911197a99e23199fcc58b72xli         Controller
78855a1bb43aa37fc948911197a99e23199fcc58b72xli         );
789e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
79055a1bb43aa37fc948911197a99e23199fcc58b72xli  FreePool (VgaClassPrivate);
791e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
792e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  return EFI_SUCCESS;
793e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}
794a73d0c743b5192b1038a24711525eed71dfa300fklu
795a73d0c743b5192b1038a24711525eed71dfa300fklu/**
79655a1bb43aa37fc948911197a99e23199fcc58b72xli  Resets the text output device hardware.
79755a1bb43aa37fc948911197a99e23199fcc58b72xli
79855a1bb43aa37fc948911197a99e23199fcc58b72xli  This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.Reset().
79955a1bb43aa37fc948911197a99e23199fcc58b72xli  It resets the text output device hardware. The cursor position is set to (0, 0),
80055a1bb43aa37fc948911197a99e23199fcc58b72xli  and the screen is cleared to the default background color for the output device.
801a73d0c743b5192b1038a24711525eed71dfa300fklu
80255a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  This                 Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.
80355a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  ExtendedVerification Indicates that the driver may perform a more exhaustive
80455a1bb43aa37fc948911197a99e23199fcc58b72xli                               verification operation of the device during reset.
80555a1bb43aa37fc948911197a99e23199fcc58b72xli
80655a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_SUCCESS          The text output device was reset.
80755a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_DEVICE_ERROR     The text output device is not functioning correctly and could not be reset.
80855a1bb43aa37fc948911197a99e23199fcc58b72xli
809a73d0c743b5192b1038a24711525eed71dfa300fklu**/
810e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS
811e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI
812e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassReset (
81355a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL     *This,
814e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  BOOLEAN                             ExtendedVerification
815e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  )
816e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{
817e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  EFI_STATUS    Status;
818e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VGA_CLASS_DEV *VgaClassPrivate;
819e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
820e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VgaClassPrivate = VGA_CLASS_DEV_FROM_THIS (This);
821e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
822e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  REPORT_STATUS_CODE_WITH_DEVICE_PATH (
823e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    EFI_PROGRESS_CODE,
824e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_RESET,
825e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    VgaClassPrivate->DevicePath
826e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    );
827e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
828e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  This->SetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));
829e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
830e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = This->SetMode (This, 0);
831e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
832e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return Status;
833e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
834e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
835e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  return This->ClearScreen (This);
836e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}
837e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
838a73d0c743b5192b1038a24711525eed71dfa300fklu/**
83955a1bb43aa37fc948911197a99e23199fcc58b72xli  Writes a Unicode string to the output device.
840a73d0c743b5192b1038a24711525eed71dfa300fklu
84155a1bb43aa37fc948911197a99e23199fcc58b72xli  This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString().
84255a1bb43aa37fc948911197a99e23199fcc58b72xli  It writes a Unicode string to the output device. This is the most basic output mechanism
84355a1bb43aa37fc948911197a99e23199fcc58b72xli  on an output device.
84455a1bb43aa37fc948911197a99e23199fcc58b72xli
84555a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  This                   Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.
84655a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  String                 The Null-terminated Unicode string to be displayed on the output device(s).
84755a1bb43aa37fc948911197a99e23199fcc58b72xli
84855a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_SUCCESS            The string was output to the device.
84955a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_DEVICE_ERROR       The device reported an error while attempting to output the text.
8501910fbaf7014fab2012f06ab03829f0146cf32d4vanjeff  @retval EFI_UNSUPPORTED        The output device's mode is not currently in a defined text mode.
85155a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_WARN_UNKNOWN_GLYPH This warning code indicates that some of the characters in
85255a1bb43aa37fc948911197a99e23199fcc58b72xli                                 the Unicode string could not be rendered and were skipped.
85355a1bb43aa37fc948911197a99e23199fcc58b72xli
854a73d0c743b5192b1038a24711525eed71dfa300fklu**/
855e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS
856e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI
857e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassOutputString (
85855a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
85955a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  CHAR16                          *String
860e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  )
861e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{
862e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  EFI_STATUS                  Status;
863e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VGA_CLASS_DEV               *VgaClassDev;
864e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode;
865e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  UINTN                       MaxColumn;
866e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  UINTN                       MaxRow;
867e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  UINT32                      VideoChar;
868e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  CHAR8                       GraphicChar;
869e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
870e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
871e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Mode        = This->Mode;
872e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
873e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = This->QueryMode (
87455a1bb43aa37fc948911197a99e23199fcc58b72xli                   This,
87555a1bb43aa37fc948911197a99e23199fcc58b72xli                   Mode->Mode,
87655a1bb43aa37fc948911197a99e23199fcc58b72xli                   &MaxColumn,
87755a1bb43aa37fc948911197a99e23199fcc58b72xli                   &MaxRow
87855a1bb43aa37fc948911197a99e23199fcc58b72xli                   );
879e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
880e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return Status;
881e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
882e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
88355a1bb43aa37fc948911197a99e23199fcc58b72xli  //
88455a1bb43aa37fc948911197a99e23199fcc58b72xli  // Parse each character of the string to output
88555a1bb43aa37fc948911197a99e23199fcc58b72xli  //
88655a1bb43aa37fc948911197a99e23199fcc58b72xli  for (; *String != CHAR_NULL; String++) {
887e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
88855a1bb43aa37fc948911197a99e23199fcc58b72xli    switch (*String) {
889e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    case CHAR_BACKSPACE:
890e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      if (Mode->CursorColumn > 0) {
891e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        Mode->CursorColumn--;
892e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      }
893e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      break;
894e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
895e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    case CHAR_LINEFEED:
896e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      if (Mode->CursorRow == (INT32) (MaxRow - 1)) {
897e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        //
898e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        // Scroll the screen by copying the contents
899e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        // of the VGA display up one line
900e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        //
901e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        VgaClassDev->PciIo->CopyMem (
902e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                              VgaClassDev->PciIo,
903e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                              EfiPciIoWidthUint32,
904e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                              VgaClassDev->VgaMiniPort->VgaMemoryBar,
905e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                              VgaClassDev->VgaMiniPort->VgaMemoryOffset,
906e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                              VgaClassDev->VgaMiniPort->VgaMemoryBar,
907e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                              VgaClassDev->VgaMiniPort->VgaMemoryOffset + MaxColumn * 2,
908e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                              ((MaxRow - 1) * MaxColumn) >> 1
909e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                              );
910e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
911e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        //
912e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        // Print Blank Line of spaces with the current color attributes
913e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        //
914e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        VideoChar = (Mode->Attribute << 8) | ' ';
915e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        VideoChar = (VideoChar << 16) | VideoChar;
916e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        VgaClassDev->PciIo->Mem.Write (
917e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                  VgaClassDev->PciIo,
918e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                  EfiPciIoWidthFillUint32,
919e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                  VgaClassDev->VgaMiniPort->VgaMemoryBar,
920e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                  VgaClassDev->VgaMiniPort->VgaMemoryOffset + (MaxRow - 1) * MaxColumn * 2,
921e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                  MaxColumn >> 1,
922e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                  &VideoChar
923e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                  );
924e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      }
925e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
926e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      if (Mode->CursorRow < (INT32) (MaxRow - 1)) {
927e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        Mode->CursorRow++;
928e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      }
929e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      break;
930e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
931e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    case CHAR_CARRIAGE_RETURN:
932e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      Mode->CursorColumn = 0;
933e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      break;
934e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
935e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    default:
93655a1bb43aa37fc948911197a99e23199fcc58b72xli      if (!LibIsValidTextGraphics (*String, &GraphicChar, NULL)) {
937e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        //
93855a1bb43aa37fc948911197a99e23199fcc58b72xli        // If this character is not ,Box Drawing text graphics, then convert it to ASCII.
939e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        //
94055a1bb43aa37fc948911197a99e23199fcc58b72xli        GraphicChar = (CHAR8) *String;
941e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        if (!IsValidAscii (GraphicChar)) {
942e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang          //
94355a1bb43aa37fc948911197a99e23199fcc58b72xli          // If not valid ASCII char, convert it to "?"
944e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang          //
945e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang          GraphicChar = '?';
946e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        }
947e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      }
948e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
949e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      VideoChar = (Mode->Attribute << 8) | GraphicChar;
950e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      VgaClassDev->PciIo->Mem.Write (
951e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                VgaClassDev->PciIo,
952e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                EfiPciIoWidthUint16,
953e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                VgaClassDev->VgaMiniPort->VgaMemoryBar,
954e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                VgaClassDev->VgaMiniPort->VgaMemoryOffset + ((Mode->CursorRow * MaxColumn + Mode->CursorColumn) * 2),
955e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                1,
956e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                &VideoChar
957e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                                );
958e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
959e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      if (Mode->CursorColumn >= (INT32) (MaxColumn - 1)) {
960e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        This->OutputString (This, CrLfString);
961e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      } else {
962e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang        Mode->CursorColumn++;
963e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      }
964e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      break;
965e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    }
966e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
967e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
968e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  SetVideoCursorPosition (
969e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    VgaClassDev,
970e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    (UINTN) Mode->CursorColumn,
971e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    (UINTN) Mode->CursorRow,
972e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    MaxColumn
973e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    );
974e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
975e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  return EFI_SUCCESS;
976e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}
977e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
978a73d0c743b5192b1038a24711525eed71dfa300fklu/**
97955a1bb43aa37fc948911197a99e23199fcc58b72xli  Verifies that all characters in a Unicode string can be output to the target device.
980a73d0c743b5192b1038a24711525eed71dfa300fklu
98155a1bb43aa37fc948911197a99e23199fcc58b72xli  This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.TestString().
98255a1bb43aa37fc948911197a99e23199fcc58b72xli  It verifies that all characters in a Unicode string can be output to the target device.
98355a1bb43aa37fc948911197a99e23199fcc58b72xli
98455a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  This                   Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.
98555a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  String                 The Null-terminated Unicode string to be examined for the output device(s).
98655a1bb43aa37fc948911197a99e23199fcc58b72xli
98755a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_SUCCESS            The device(s) are capable of rendering the output string.
98855a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_UNSUPPORTED        Some of the characters in the Unicode string cannot be rendered by
98955a1bb43aa37fc948911197a99e23199fcc58b72xli                                 one or more of the output devices mapped by the EFI handle.
99055a1bb43aa37fc948911197a99e23199fcc58b72xli
991a73d0c743b5192b1038a24711525eed71dfa300fklu**/
992e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS
993e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI
994e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassTestString (
99555a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
99655a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  CHAR16                          *String
997e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  )
998e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{
99955a1bb43aa37fc948911197a99e23199fcc58b72xli  while (*String != CHAR_NULL) {
100055a1bb43aa37fc948911197a99e23199fcc58b72xli    if (!(IsValidAscii (*String) || IsValidEfiCntlChar (*String) || LibIsValidTextGraphics (*String, NULL, NULL))) {
1001e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      return EFI_UNSUPPORTED;
1002e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    }
1003e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
100455a1bb43aa37fc948911197a99e23199fcc58b72xli    String++;
1005e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
1006e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1007e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  return EFI_SUCCESS;
1008e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}
1009e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1010a73d0c743b5192b1038a24711525eed71dfa300fklu/**
101155a1bb43aa37fc948911197a99e23199fcc58b72xli  Clears the output device(s) display to the currently selected background color.
1012a73d0c743b5192b1038a24711525eed71dfa300fklu
101355a1bb43aa37fc948911197a99e23199fcc58b72xli  This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.ClearScreen().
101455a1bb43aa37fc948911197a99e23199fcc58b72xli  The ClearScreen() function clears the output device(s) display to the currently
101555a1bb43aa37fc948911197a99e23199fcc58b72xli  selected background color. The cursor position is set to (0, 0).
101655a1bb43aa37fc948911197a99e23199fcc58b72xli
101755a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  This                   Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.
1018a73d0c743b5192b1038a24711525eed71dfa300fklu
101955a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_SUCESS             The operation completed successfully.
102055a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_DEVICE_ERROR       The device had an error and could not complete the request.
102155a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_UNSUPPORTED        The output device is not in a valid text mode.
102255a1bb43aa37fc948911197a99e23199fcc58b72xli
1023a73d0c743b5192b1038a24711525eed71dfa300fklu**/
1024e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS
1025e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI
1026e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassClearScreen (
1027e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This
1028e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  )
1029e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{
1030e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  EFI_STATUS    Status;
1031e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VGA_CLASS_DEV *VgaClassDev;
1032e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  UINTN         MaxRow;
1033e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  UINTN         MaxColumn;
1034e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  UINT32        VideoChar;
1035e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1036e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
1037e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1038e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = This->QueryMode (
103955a1bb43aa37fc948911197a99e23199fcc58b72xli                   This,
104055a1bb43aa37fc948911197a99e23199fcc58b72xli                   This->Mode->Mode,
104155a1bb43aa37fc948911197a99e23199fcc58b72xli                   &MaxColumn,
104255a1bb43aa37fc948911197a99e23199fcc58b72xli                   &MaxRow
104355a1bb43aa37fc948911197a99e23199fcc58b72xli                   );
1044e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
1045e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return Status;
1046e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
1047e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1048e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VideoChar = (This->Mode->Attribute << 8) | ' ';
1049e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VideoChar = (VideoChar << 16) | VideoChar;
1050e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VgaClassDev->PciIo->Mem.Write (
1051e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                            VgaClassDev->PciIo,
1052e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                            EfiPciIoWidthFillUint32,
1053e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                            VgaClassDev->VgaMiniPort->VgaMemoryBar,
1054e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                            VgaClassDev->VgaMiniPort->VgaMemoryOffset,
1055e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                            (MaxRow * MaxColumn) >> 1,
1056e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                            &VideoChar
1057e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang                            );
1058e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1059e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  This->SetCursorPosition (This, 0, 0);
1060e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1061e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  return EFI_SUCCESS;
1062e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}
1063e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1064a73d0c743b5192b1038a24711525eed71dfa300fklu/**
106555a1bb43aa37fc948911197a99e23199fcc58b72xli  Sets the background and foreground colors for theOutputString() and ClearScreen() functions.
1066a73d0c743b5192b1038a24711525eed71dfa300fklu
106755a1bb43aa37fc948911197a99e23199fcc58b72xli  This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetAttribute().
106855a1bb43aa37fc948911197a99e23199fcc58b72xli  It sets the background and foreground colors for the OutputString() and ClearScreen() functions.
106955a1bb43aa37fc948911197a99e23199fcc58b72xli  The color mask can be set even when the device is in an invalid text mode.
107055a1bb43aa37fc948911197a99e23199fcc58b72xli  Devices supporting a different number of text colors are required to emulate the above colors
1071689b2d720c21a286103d188070c1a76633fa95bevanjeff  to the best of the device's capabilities.
107255a1bb43aa37fc948911197a99e23199fcc58b72xli
107355a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  This                   Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.
107455a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  Attribute              The attribute to set.
107555a1bb43aa37fc948911197a99e23199fcc58b72xli                                 Bits 0..3 are the foreground color,
107655a1bb43aa37fc948911197a99e23199fcc58b72xli                                 and bits 4..6 are the background color.
1077a73d0c743b5192b1038a24711525eed71dfa300fklu
107855a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_SUCCESS            The requested attributes were set.
107955a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_DEVICE_ERROR       The device had an error and could not complete the request.
108055a1bb43aa37fc948911197a99e23199fcc58b72xli
1081a73d0c743b5192b1038a24711525eed71dfa300fklu**/
1082e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS
1083e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI
1084e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassSetAttribute (
108555a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
1086e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  UINTN                           Attribute
1087e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  )
1088e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{
1089e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (Attribute <= EFI_MAX_ATTRIBUTE) {
1090e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    This->Mode->Attribute = (INT32) Attribute;
1091e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return EFI_SUCCESS;
1092e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
1093e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1094e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  return EFI_UNSUPPORTED;
1095e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}
1096e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1097a73d0c743b5192b1038a24711525eed71dfa300fklu/**
109855a1bb43aa37fc948911197a99e23199fcc58b72xli  Sets the current coordinates of the cursor position.
109955a1bb43aa37fc948911197a99e23199fcc58b72xli
110055a1bb43aa37fc948911197a99e23199fcc58b72xli  This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetCursorPosition().
110155a1bb43aa37fc948911197a99e23199fcc58b72xli  It sets the current coordinates of the cursor position.
110255a1bb43aa37fc948911197a99e23199fcc58b72xli  The upper left corner of the screen is defined as coordinate (0, 0).
1103a73d0c743b5192b1038a24711525eed71dfa300fklu
110455a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  This                   Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.
110555a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  Column                 Column of position to set the cursor to.
110655a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  Row                    Row of position to set the cursor to.
1107a73d0c743b5192b1038a24711525eed71dfa300fklu
110855a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_SUCCESS            The operation completed successfully.
110955a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_DEVICE_ERROR       The device had an error and could not complete the request.
111055a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_UNSUPPORTED        The output device is not in a valid text mode, or the cursor
111155a1bb43aa37fc948911197a99e23199fcc58b72xli                                 position is invalid for the current mode.
111255a1bb43aa37fc948911197a99e23199fcc58b72xli
1113a73d0c743b5192b1038a24711525eed71dfa300fklu**/
1114e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS
1115e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI
1116e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassSetCursorPosition (
111755a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
1118e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  UINTN                           Column,
1119e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  UINTN                           Row
1120e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  )
1121e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{
1122e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  EFI_STATUS    Status;
1123e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VGA_CLASS_DEV *VgaClassDev;
1124e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  UINTN         MaxColumn;
1125e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  UINTN         MaxRow;
1126e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1127e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
1128e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1129e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  Status = This->QueryMode (
113055a1bb43aa37fc948911197a99e23199fcc58b72xli                   This,
113155a1bb43aa37fc948911197a99e23199fcc58b72xli                   This->Mode->Mode,
113255a1bb43aa37fc948911197a99e23199fcc58b72xli                   &MaxColumn,
113355a1bb43aa37fc948911197a99e23199fcc58b72xli                   &MaxRow
113455a1bb43aa37fc948911197a99e23199fcc58b72xli                   );
1135e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (EFI_ERROR (Status)) {
1136e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return Status;
1137e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
1138e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1139e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (Column >= MaxColumn || Row >= MaxRow) {
1140e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return EFI_UNSUPPORTED;
1141e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
1142e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1143e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  SetVideoCursorPosition (VgaClassDev, Column, Row, MaxColumn);
1144e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1145e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  This->Mode->CursorColumn  = (INT32) Column;
1146e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  This->Mode->CursorRow     = (INT32) Row;
1147e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1148e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  return EFI_SUCCESS;
1149e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}
1150e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1151a73d0c743b5192b1038a24711525eed71dfa300fklu/**
115255a1bb43aa37fc948911197a99e23199fcc58b72xli  Makes the cursor visible or invisible.
1153a73d0c743b5192b1038a24711525eed71dfa300fklu
115455a1bb43aa37fc948911197a99e23199fcc58b72xli  This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.EnableCursor().
115555a1bb43aa37fc948911197a99e23199fcc58b72xli  It makes the cursor visible or invisible.
115655a1bb43aa37fc948911197a99e23199fcc58b72xli
115755a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  This                   Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.
115855a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  Visible                If TRUE, the cursor is set to be visible.
115955a1bb43aa37fc948911197a99e23199fcc58b72xli                                 If FALSE, the cursor is set to be invisible.
1160a73d0c743b5192b1038a24711525eed71dfa300fklu
116155a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_SUCESS             The operation completed successfully.
116255a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_DEVICE_ERROR       The device had an error and could not complete the request or the
116355a1bb43aa37fc948911197a99e23199fcc58b72xli                                 device does not support changing the cursor mode.
116455a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_UNSUPPORTED        The output device does not support visibility control of the cursor.
116555a1bb43aa37fc948911197a99e23199fcc58b72xli
1166a73d0c743b5192b1038a24711525eed71dfa300fklu**/
1167e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS
1168e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI
1169e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassEnableCursor (
117055a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
1171e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  BOOLEAN                         Visible
1172e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  )
1173e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{
1174e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VGA_CLASS_DEV *VgaClassDev;
1175e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1176e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
1177e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if (Visible) {
117855a1bb43aa37fc948911197a99e23199fcc58b72xli    if (This->Mode->Mode == 1) {
117955a1bb43aa37fc948911197a99e23199fcc58b72xli      //
118055a1bb43aa37fc948911197a99e23199fcc58b72xli      // 80 * 50
118155a1bb43aa37fc948911197a99e23199fcc58b72xli      //
1182e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x06);
1183e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      WriteCrtc (VgaClassDev, CRTC_CURSOR_END, 0x07);
118455a1bb43aa37fc948911197a99e23199fcc58b72xli    } else {
118555a1bb43aa37fc948911197a99e23199fcc58b72xli      //
118655a1bb43aa37fc948911197a99e23199fcc58b72xli      // 80 * 25
118755a1bb43aa37fc948911197a99e23199fcc58b72xli      //
1188e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x0e);
1189e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang      WriteCrtc (VgaClassDev, CRTC_CURSOR_END, 0x0f);
1190e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    }
1191e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  } else {
1192e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    WriteCrtc (VgaClassDev, CRTC_CURSOR_START, 0x20);
1193e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
1194e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1195e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  This->Mode->CursorVisible = Visible;
1196e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  return EFI_SUCCESS;
1197e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}
1198e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1199a73d0c743b5192b1038a24711525eed71dfa300fklu/**
120055a1bb43aa37fc948911197a99e23199fcc58b72xli  Returns information for an available text mode that the output device(s) supports.
120155a1bb43aa37fc948911197a99e23199fcc58b72xli
120255a1bb43aa37fc948911197a99e23199fcc58b72xli  This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode().
120355a1bb43aa37fc948911197a99e23199fcc58b72xli  It returns information for an available text mode that the output device(s) supports.
120455a1bb43aa37fc948911197a99e23199fcc58b72xli  It is required that all output devices support at least 80x25 text mode. This mode is defined to be mode 0.
120555a1bb43aa37fc948911197a99e23199fcc58b72xli  If the output devices support 80x50, that is defined to be mode 1.
120655a1bb43aa37fc948911197a99e23199fcc58b72xli
120755a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  This                   Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.
120855a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  ModeNumber             The mode number to return information on.
120955a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  Columns                Columen in current mode number
121055a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  Rows                   Row in current mode number.
1211a73d0c743b5192b1038a24711525eed71dfa300fklu
121255a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_SUCCESS            The requested mode information was returned.
121355a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_DEVICE_ERROR       The device had an error and could not complete the request.
121455a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_UNSUPPORTED        The mode number was not valid.
121555a1bb43aa37fc948911197a99e23199fcc58b72xli
1216a73d0c743b5192b1038a24711525eed71dfa300fklu**/
1217e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS
1218e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI
1219e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassQueryMode (
122055a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
1221e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  UINTN                           ModeNumber,
1222e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  OUT UINTN                           *Columns,
1223e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  OUT UINTN                           *Rows
1224e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  )
1225e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{
1226e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if ((INT32) ModeNumber >= This->Mode->MaxMode) {
1227e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    *Columns  = 0;
1228e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    *Rows     = 0;
1229e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return EFI_UNSUPPORTED;
1230e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
1231e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1232e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  switch (ModeNumber) {
1233e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  case 0:
1234e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    *Columns  = 80;
1235e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    *Rows     = 25;
1236e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    break;
1237e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1238e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  case 1:
1239e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    *Columns  = 80;
1240e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    *Rows     = 50;
1241e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    break;
1242e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1243e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  default:
1244e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    *Columns  = 0;
1245e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    *Rows     = 0;
1246e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return EFI_UNSUPPORTED;
1247e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
1248e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1249e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  return EFI_SUCCESS;
1250e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}
1251e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1252a73d0c743b5192b1038a24711525eed71dfa300fklu/**
125355a1bb43aa37fc948911197a99e23199fcc58b72xli  Sets the output device(s) to a specified mode.
1254a73d0c743b5192b1038a24711525eed71dfa300fklu
125555a1bb43aa37fc948911197a99e23199fcc58b72xli  This function implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode().
125655a1bb43aa37fc948911197a99e23199fcc58b72xli  It sets the output device(s) to the requested mode.
125755a1bb43aa37fc948911197a99e23199fcc58b72xli  On success the device is in the geometry for the requested mode,
125855a1bb43aa37fc948911197a99e23199fcc58b72xli  and the device has been cleared to the current background color with the cursor at (0,0).
125955a1bb43aa37fc948911197a99e23199fcc58b72xli
126055a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  This                   Pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.
126155a1bb43aa37fc948911197a99e23199fcc58b72xli  @param  ModeNumber             The text mode to set.
1262a73d0c743b5192b1038a24711525eed71dfa300fklu
126355a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_SUCCESS            The requested text mode was set.
126455a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_DEVICE_ERROR       The device had an error and could not complete the request.
126555a1bb43aa37fc948911197a99e23199fcc58b72xli  @retval EFI_UNSUPPORTED        The mode number was not valid.
126655a1bb43aa37fc948911197a99e23199fcc58b72xli
1267a73d0c743b5192b1038a24711525eed71dfa300fklu**/
1268e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFI_STATUS
1269e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangEFIAPI
1270e081218df73d6b6042c1c1a2ce422a2495b03f8dqwangVgaClassSetMode (
127155a1bb43aa37fc948911197a99e23199fcc58b72xli  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
1272e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  IN  UINTN                           ModeNumber
1273e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  )
1274e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang{
1275e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VGA_CLASS_DEV *VgaClassDev;
1276e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1277e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  VgaClassDev = VGA_CLASS_DEV_FROM_THIS (This);
1278e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1279e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  if ((INT32) ModeNumber >= This->Mode->MaxMode) {
1280e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang    return EFI_UNSUPPORTED;
1281e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  }
1282e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1283e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  This->ClearScreen (This);
1284e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
1285e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang  This->Mode->Mode  = (INT32) ModeNumber;
1286e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang
128755a1bb43aa37fc948911197a99e23199fcc58b72xli  return VgaClassDev->VgaMiniPort->SetMode (VgaClassDev->VgaMiniPort, ModeNumber);
1288e081218df73d6b6042c1c1a2ce422a2495b03f8dqwang}
1289