xref: /reactos/boot/environ/lib/io/display/textcons.c (revision 1734f297)
1 /*
2  * COPYRIGHT:       See COPYING.ARM in the top level directory
3  * PROJECT:         ReactOS UEFI Boot Library
4  * FILE:            boot/environ/lib/io/display/textcons.c
5  * PURPOSE:         Boot Library Text Console Routines
6  * PROGRAMMER:      Alex Ionescu (alex.ionescu@reactos.org)
7  */
8 
9 /* INCLUDES ******************************************************************/
10 
11 #include "bl.h"
12 
13 /* DATA VARIABLES ************************************************************/
14 
15 BL_TEXT_CONSOLE_VTABLE ConsoleTextLocalVtbl =
16 {
17     ConsoleTextLocalDestruct,
18     ConsoleTextLocalReinitialize,
19     ConsoleTextBaseGetTextState,
20     ConsoleTextLocalSetTextState,
21     ConsoleTextBaseGetTextResolution,
22     ConsoleTextLocalSetTextResolution,
23     ConsoleTextLocalClearText,
24     ConsoleTextLocalWriteText
25 };
26 
27 /* FUNCTIONS *****************************************************************/
28 
29 VOID
30 ConsoleTextLocalDestruct (
31     _In_ struct _BL_TEXT_CONSOLE* Console
32     )
33 {
34 
35 }
36 
37 NTSTATUS
38 ConsoleTextLocalReinitialize (
39     _In_ struct _BL_TEXT_CONSOLE* Console
40     )
41 {
42     EfiPrintf(L"Not active yet!\r\n");
43     return STATUS_NOT_IMPLEMENTED;
44 }
45 
46 NTSTATUS
47 ConsoleTextBaseGetTextState (
48     _In_ struct _BL_TEXT_CONSOLE* Console,
49     _Out_ PBL_DISPLAY_STATE TextState
50     )
51 {
52     return STATUS_NOT_IMPLEMENTED;
53 }
54 
55 NTSTATUS
56 ConsoleTextLocalSetTextState (
57     _In_ struct _BL_TEXT_CONSOLE* Console,
58     _In_ ULONG Mask,
59     _In_ PBL_DISPLAY_STATE TextState
60     )
61 {
62     return ConsoleFirmwareTextSetState(Console, Mask, TextState);
63 }
64 
65 NTSTATUS
66 ConsoleTextBaseGetTextResolution (
67     _In_ struct _BL_TEXT_CONSOLE* Console,
68     _Out_ PULONG TextResolution
69     )
70 {
71     return STATUS_NOT_IMPLEMENTED;
72 }
73 
74 NTSTATUS
75 ConsoleTextLocalSetTextResolution (
76     _In_ struct _BL_TEXT_CONSOLE* Console,
77     _In_ ULONG NewTextResolution,
78     _Out_ PULONG OldTextResolution
79     )
80 {
81     return STATUS_NOT_IMPLEMENTED;
82 }
83 
84 NTSTATUS
85 ConsoleTextLocalClearText (
86     _In_ struct _BL_TEXT_CONSOLE* Console,
87     _In_ BOOLEAN LineOnly
88     )
89 {
90     return ConsoleFirmwareTextClear(Console, LineOnly);
91 }
92 
93 NTSTATUS
94 ConsoleTextLocalWriteText (
95     _In_ struct _BL_TEXT_CONSOLE* Console,
96     _In_ PCHAR Text,
97     _In_ ULONG Attribute
98     )
99 {
100     return STATUS_NOT_IMPLEMENTED;
101 }
102 
103 NTSTATUS
104 ConsoleTextLocalConstruct (
105     _In_ PBL_TEXT_CONSOLE TextConsole,
106     _In_ BOOLEAN Activate
107     )
108 {
109     NTSTATUS Status;
110     BL_DISPLAY_STATE TextState;
111 
112     /* Set our callbacks */
113     TextConsole->Callbacks = &ConsoleTextLocalVtbl;
114 
115     /* Are we activating this console? */
116     if (Activate)
117     {
118         /* Call firmware to activate it */
119         Status = ConsoleFirmwareTextOpen(TextConsole);
120         if (!NT_SUCCESS(Status))
121         {
122             EfiPrintf(L"Failed to activate console: %lx\r\n", Status);
123             return Status;
124         }
125     }
126 
127     /* Set default text state */
128     TextState.BgColor = 0;
129     TextState.XPos = 0;
130     TextState.YPos = 0;
131     TextState.CursorVisible = FALSE;
132     TextState.FgColor = White;
133 
134     /* Are we activating? */
135     if (Activate)
136     {
137         /* Call firmware to set it */
138         Status = ConsoleFirmwareTextSetState(TextConsole, 0xF, &TextState);
139         if (!NT_SUCCESS(Status))
140         {
141             /* We failed, back down */
142             EfiPrintf(L"Failed to set console state: %lx\r\n", Status);
143             ConsoleFirmwareTextClose(TextConsole);
144             return Status;
145         }
146     }
147     else
148     {
149         /* Just save the state for now, someone else can activate later */
150         TextConsole->State = TextState;
151     }
152 
153     /* Remember if we activated it */
154     TextConsole->Active = Activate;
155     return STATUS_SUCCESS;
156 }
157 
158 BOOLEAN
159 ConsolepFindResolution (
160     _In_ PBL_DISPLAY_MODE Mode,
161     _In_ PBL_DISPLAY_MODE List,
162     _In_ ULONG MaxIndex
163     )
164 {
165     PBL_DISPLAY_MODE ListEnd;
166 
167     /* Loop until we hit the maximum supported list index */
168     ListEnd = &List[MaxIndex];
169     while (List != ListEnd)
170     {
171         /* Does this resolution match? */
172         if ((Mode->HRes == List->HRes) && (Mode->VRes == List->VRes))
173         {
174             /* Yep -- we got a match */
175             return TRUE;
176 
177         }
178 
179         /* Try another one*/
180         List++;
181     }
182 
183     /* No matches were found */
184     return FALSE;
185 }
186 
187 BL_INPUT_CONSOLE_VTABLE ConsoleInputLocalVtbl =
188 {
189     (PCONSOLE_DESTRUCT)ConsoleInputLocalDestruct,
190     (PCONSOLE_REINITIALIZE)ConsoleInputBaseReinitialize,
191 };
192 
193 VOID
194 ConsoleInputLocalDestruct (
195     _In_ PBL_INPUT_CONSOLE Console
196     )
197 {
198     /* Erase the current input buffer, and tear down the console */
199     ConsoleInputLocalEraseBuffer(Console, NULL);
200     BlMmFreeHeap(Console->Buffer);
201 }
202 
203 NTSTATUS
204 ConsoleInputBaseConstruct (
205     _In_ PBL_INPUT_CONSOLE Console
206     )
207 {
208     PULONG Buffer;
209 
210     /* Allocate a new 512 byte buffer */
211     Buffer = BlMmAllocateHeap(512);
212     Console->Buffer = Buffer;
213     if (!Buffer)
214     {
215         return STATUS_INSUFFICIENT_RESOURCES;
216     }
217 
218     /* Set the current buffer pointers to it */
219     Console->DataStart = Buffer;
220     Console->DataEnd = Buffer;
221 
222     /* Set the end 128 data entries into the buffer */
223     Console->EndBuffer = Buffer + 128;
224     return STATUS_SUCCESS;
225 }
226 
227 NTSTATUS
228 ConsoleInputBaseReinitialize (
229     _In_ PBL_INPUT_CONSOLE Console
230     )
231 {
232     PULONG Buffer;
233 
234     /* Reset all the buffer pointers to the current buffer */
235     Buffer = Console->Buffer;
236     Console->DataStart = Buffer;
237     Console->DataEnd = Buffer;
238     Console->EndBuffer = Buffer + 128;
239     return STATUS_SUCCESS;
240 }
241 
242 NTSTATUS
243 ConsoleCreateLocalInputConsole (
244     VOID
245     )
246 {
247     PBL_INPUT_CONSOLE InputConsole;
248     NTSTATUS Status;
249 
250     /* Allocate the input console */
251     InputConsole = BlMmAllocateHeap(sizeof(*InputConsole));
252     if (!InputConsole)
253     {
254         return STATUS_INSUFFICIENT_RESOURCES;
255     }
256 
257     /* Construct it */
258     Status = ConsoleInputBaseConstruct(InputConsole);
259     if (!NT_SUCCESS(Status))
260     {
261         /* Tear down on failure */
262         BlMmFreeHeap(InputConsole);
263         return Status;
264     }
265 
266     /* Set the callback table, and set us as the local input console */
267     InputConsole->Callbacks = &ConsoleInputLocalVtbl;
268     DspLocalInputConsole = InputConsole;
269     return STATUS_SUCCESS;
270 }
271