Use free Windows DDK and compile with latest MinGW releases.
[reactos.git] / reactos / drivers / dd / vga / miniport / vgamp.c
1 /*
2 * VGA.C - a generic VGA miniport driver
3 *
4 */
5
6 #define NTOS_KERNEL_MODE
7 #include <ntos.h>
8 #include <ddk/ntddvdeo.h>
9 #include <ntos/ntddvid.h>
10
11 #define UNIMPLEMENTED do {DbgPrint("%s:%d: Function not implemented", __FILE__, __LINE__); for(;;);} while (0)
12
13 #define VERSION "0.0.0"
14
15 // ---------------------------------------------------- Forward Declarations
16 static VP_STATUS STDCALL
17 VGAFindAdapter(PVOID DeviceExtension,
18 PVOID Context,
19 PWSTR ArgumentString,
20 PVIDEO_PORT_CONFIG_INFO ConfigInfo,
21 PUCHAR Again);
22 static BOOLEAN STDCALL
23 VGAInitialize(PVOID DeviceExtension);
24 static BOOLEAN STDCALL
25 VGAStartIO(PVOID DeviceExtension,
26 PVIDEO_REQUEST_PACKET RequestPacket);
27 /*
28 static BOOLEAN STDCALL
29 VGAInterrupt(PVOID DeviceExtension);
30 static BOOLEAN STDCALL
31 VGAResetHw(PVOID DeviceExtension,
32 ULONG Columns,
33 ULONG Rows);
34 static VOID STDCALL
35 VGATimer(PVOID DeviceExtension);
36 */
37
38 /* Mandatory IoControl routines */
39 VOID VGAMapVideoMemory(IN PVIDEO_MEMORY RequestedAddress,
40 OUT PVIDEO_MEMORY_INFORMATION MapInformation,
41 OUT PSTATUS_BLOCK StatusBlock);
42 VOID VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes,
43 OUT PSTATUS_BLOCK StatusBlock);
44 VOID VGAQueryCurrentMode(OUT PVIDEO_MODE_INFORMATION CurrentMode,
45 OUT PSTATUS_BLOCK StatusBlock);
46 VOID VGAQueryNumAvailModes(OUT PVIDEO_NUM_MODES NumberOfModes,
47 OUT PSTATUS_BLOCK StatusBlock);
48 VOID VGAResetDevice(OUT PSTATUS_BLOCK StatusBlock);
49 VOID VGASetColorRegisters(IN PVIDEO_CLUT ColorLookUpTable,
50 OUT PSTATUS_BLOCK StatusBlock);
51 VOID VGASetPaletteRegisters(IN PWORD PaletteRegisters,
52 OUT PSTATUS_BLOCK StatusBlock);
53 VOID VGASetCurrentMode(IN PVIDEO_MODE RequestedMode,
54 OUT PSTATUS_BLOCK StatusBlock);
55 VOID VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory,
56 OUT PVIDEO_MEMORY_INFORMATION ReturnedMemory,
57 OUT PSTATUS_BLOCK StatusBlock);
58 VOID VGAUnmapVideoMemory(IN PVIDEO_MEMORY MemoryToUnmap,
59 OUT PSTATUS_BLOCK StatusBlock);
60 VOID VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare,
61 OUT PSTATUS_BLOCK StatusBlock);
62
63 // ------------------------------------------------------- Public Interface
64
65 // DriverEntry
66 //
67 // DESCRIPTION:
68 // This function initializes the driver.
69 //
70 // RUN LEVEL:
71 // PASSIVE_LEVEL
72 //
73 // ARGUMENTS:
74 // IN PVOID Context1 Context parameter to pass to VidPortInitialize
75 // IN PVOID Context2 Context parameter to pass to VidPortInitialize
76 // RETURNS:
77 // VP_STATUS
78
79 VP_STATUS STDCALL
80 DriverEntry(IN PVOID Context1,
81 IN PVOID Context2)
82 {
83 VIDEO_HW_INITIALIZATION_DATA InitData;
84
85 VideoPortZeroMemory(&InitData, sizeof InitData);
86
87 /* FIXME: Fill in InitData members */
88 InitData.StartingDeviceNumber = 0;
89
90 /* Export driver entry points... */
91 InitData.HwFindAdapter = VGAFindAdapter;
92 InitData.HwInitialize = VGAInitialize;
93 InitData.HwStartIO = VGAStartIO;
94 /* InitData.HwInterrupt = VGAInterrupt; */
95 /* InitData.HwResetHw = VGAResetHw; */
96 /* InitData.HwTimer = VGATimer; */
97
98 return VideoPortInitialize(Context1, Context2, &InitData, NULL);
99 }
100
101 // VGAFindAdapter
102 //
103 // DESCRIPTION:
104 // This routine is called by the videoport driver to find and allocate
105 // the adapter for a given bus. The miniport driver needs to do the
106 // following in this routine:
107 // - Determine if the adapter is present
108 // - Claim any necessary memory/IO resources for the adapter
109 // - Map resources into system memory for the adapter
110 // - fill in relevant information in the VIDEO_PORT_CONFIG_INFO buffer
111 // - update registry settings for adapter specifics.
112 // - Set 'Again' based on whether the function should be called again
113 // another adapter on the same bus.
114 //
115 // RUN LEVEL:
116 // PASSIVE_LEVEL
117 //
118 // ARGUMENTS:
119 // PVOID DeviceExtension
120 // PVOID Context
121 // PWSTR ArgumentString
122 // PVIDEO_PORT_CONFIG_INFO ConfigInfo
123 // PUCHAR Again
124 // RETURNS:
125 // VP_STATUS
126
127 static VP_STATUS STDCALL
128 VGAFindAdapter(PVOID DeviceExtension,
129 PVOID Context,
130 PWSTR ArgumentString,
131 PVIDEO_PORT_CONFIG_INFO ConfigInfo,
132 PUCHAR Again)
133 {
134 /* FIXME: Determine if the adapter is present */
135 *Again = FALSE;
136
137 return STATUS_SUCCESS;
138
139 /* FIXME: Claim any necessary memory/IO resources for the adapter */
140 /* FIXME: Map resources into system memory for the adapter */
141 /* FIXME: Fill in relevant information in the VIDEO_PORT_CONFIG_INFO buffer */
142 /* FIXME: Update registry settings for adapter specifics. */
143 // return NO_ERROR;
144 }
145
146 // VGAInitialize
147 //
148 // DESCRIPTION:
149 // Perform initialization tasks, but leave the adapter in the same
150 // user visible state
151 //
152 // RUN LEVEL:
153 // PASSIVE_LEVEL
154 //
155 // ARGUMENTS:
156 // PVOID DeviceExtension
157 // RETURNS:
158 // BOOLEAN Success or failure
159 static BOOLEAN STDCALL
160 VGAInitialize(PVOID DeviceExtension)
161 {
162 return FALSE;
163 }
164
165 // VGAStartIO
166 //
167 // DESCRIPTION:
168 // This function gets called in responce to GDI EngDeviceIoControl
169 // calls. Device requests are passed in VRPs.
170 // Required VRPs:
171 // IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
172 // IOCTL_VIDEO_QUERY_AVAIL_MODES
173 // IOCTL_VIDEO_QUERY_CURRENT_MODE
174 // IOCTL_VIDEO_SET_CURRENT_MODE
175 // IOCTL_VIDEO_RESET_DEVICE
176 // IOCTL_VIDEO_MAP_VIDEO_MEMORY
177 // IOCTL_VIDEO_UNMAP_VIDEO_MEMORY
178 // IOCTL_VIDEO_SHARE_VIDEO_MEMORY
179 // IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY
180 // Optional VRPs:
181 // IOCTL_VIDEO_GET_PUBLIC_ACCESS_RANGES
182 // IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES
183 // IOCTL_VIDEO_GET_POWER_MANAGEMENT
184 // IOCTL_VIDEO_SET_POWER_MANAGEMENT
185 // IOCTL_QUERY_COLOR_CAPABILITIES
186 // IOCTL_VIDEO_SET_COLOR_REGISTERS (required if the device has a palette)
187 // IOCTL_VIDEO_DISABLE_POINTER
188 // IOCTL_VIDEO_ENABLE_POINTER
189 // IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES
190 // IOCTL_VIDEO_QUERY_POINTER_ATTR
191 // IOCTL_VIDEO_SET_POINTER_ATTR
192 // IOCTL_VIDEO_QUERY_POINTER_POSITION
193 // IOCTL_VIDEO_SET_POINTER_POSITION
194 // IOCTL_VIDEO_SAVE_HARDWARE_STATE
195 // IOCTL_VIDEO_RESTORE_HARDWARE_STATE
196 // IOCTL_VIDEO_DISABLE_CURSOR
197 // IOCTL_VIDEO_ENABLE_CURSOR
198 // IOCTL_VIDEO_QUERY_CURSOR_ATTR
199 // IOCTL_VIDEO_SET_CURSOR_ATTR
200 // IOCTL_VIDEO_QUERY_CURSOR_POSITION
201 // IOCTL_VIDEO_SET_CURSOR_POSITION
202 // IOCTL_VIDEO_GET_BANK_SELECT_CODE
203 // IOCTL_VIDEO_SET_PALETTE_REGISTERS
204 // IOCTL_VIDEO_LOAD_AND_SET_FONT
205 //
206 // RUN LEVEL:
207 // PASSIVE_LEVEL
208 //
209 // ARGUMENTS:
210 // PVOID DeviceExtension
211 // PVIDEO_REQUEST_PACKET RequestPacket
212 // RETURNS:
213 // BOOLEAN This function must return TRUE, and complete the work or
214 // set an error status in the VRP.
215
216 static BOOLEAN STDCALL
217 VGAStartIO(PVOID DeviceExtension,
218 PVIDEO_REQUEST_PACKET RequestPacket)
219 {
220 switch (RequestPacket->IoControlCode)
221 {
222 case IOCTL_VIDEO_MAP_VIDEO_MEMORY:
223 VGAMapVideoMemory((PVIDEO_MEMORY) RequestPacket->InputBuffer,
224 (PVIDEO_MEMORY_INFORMATION)
225 RequestPacket->OutputBuffer,
226 RequestPacket->StatusBlock);
227 break;
228
229 case IOCTL_VIDEO_QUERY_AVAIL_MODES:
230 VGAQueryAvailModes((PVIDEO_MODE_INFORMATION) RequestPacket->OutputBuffer,
231 RequestPacket->StatusBlock);
232 break;
233
234 case IOCTL_VIDEO_QUERY_CURRENT_MODE:
235 VGAQueryCurrentMode((PVIDEO_MODE_INFORMATION) RequestPacket->OutputBuffer,
236 RequestPacket->StatusBlock);
237 break;
238
239 case IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES:
240 VGAQueryNumAvailModes((PVIDEO_NUM_MODES) RequestPacket->OutputBuffer,
241 RequestPacket->StatusBlock);
242 break;
243
244 case IOCTL_VIDEO_RESET_DEVICE:
245 VGAResetDevice(RequestPacket->StatusBlock);
246 break;
247
248 case IOCTL_VIDEO_SET_COLOR_REGISTERS:
249 VGASetColorRegisters((PVIDEO_CLUT) RequestPacket->InputBuffer,
250 RequestPacket->StatusBlock);
251 break;
252
253 case IOCTL_VIDEO_SET_CURRENT_MODE:
254 VGASetCurrentMode((PVIDEO_MODE) RequestPacket->InputBuffer,
255 RequestPacket->StatusBlock);
256 break;
257
258 case IOCTL_VIDEO_SHARE_VIDEO_MEMORY:
259 VGAShareVideoMemory((PVIDEO_SHARE_MEMORY) RequestPacket->InputBuffer,
260 (PVIDEO_MEMORY_INFORMATION) RequestPacket->OutputBuffer,
261 RequestPacket->StatusBlock);
262 break;
263
264 case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY:
265 VGAUnmapVideoMemory((PVIDEO_MEMORY) RequestPacket->InputBuffer,
266 RequestPacket->StatusBlock);
267 break;
268
269 case IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY:
270 VGAUnshareVideoMemory((PVIDEO_MEMORY) RequestPacket->InputBuffer,
271 RequestPacket->StatusBlock);
272 break;
273 case IOCTL_VIDEO_SET_PALETTE_REGISTERS:
274 VGASetPaletteRegisters((PWORD) RequestPacket->InputBuffer,
275 RequestPacket->StatusBlock);
276 break;
277
278 #if 0
279 case IOCTL_VIDEO_DISABLE_CURSOR:
280 case IOCTL_VIDEO_DISABLE_POINTER:
281 case IOCTL_VIDEO_ENABLE_CURSOR:
282 case IOCTL_VIDEO_ENABLE_POINTER:
283
284 case IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES:
285 VGAFreePublicAccessRanges((PVIDEO_PUBLIC_ACCESS_RANGES)
286 RequestPacket->InputBuffer,
287 RequestPacket->StatusBlock);
288 break;
289
290 case IOCTL_VIDEO_GET_BANK_SELECT_CODE:
291 case IOCTL_VIDEO_GET_POWER_MANAGEMENT:
292 case IOCTL_VIDEO_LOAD_AND_SET_FONT:
293 case IOCTL_VIDEO_QUERY_CURSOR_POSITION:
294 case IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES:
295 case IOCTL_VIDEO_QUERY_CURSOR_ATTR:
296 case IOCTL_VIDEO_QUERY_POINTER_ATTR:
297 case IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES:
298 case IOCTL_VIDEO_QUERY_POINTER_POSITION:
299
300 case IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES:
301 VGAQueryPublicAccessRanges((PVIDEO_PUBLIC_ACCESS_RANGES)
302 RequestPacket->OutputBuffer,
303 RequestPacket->StatusBlock);
304 break;
305
306 case IOCTL_VIDEO_RESTORE_HARDWARE_STATE:
307 case IOCTL_VIDEO_SAVE_HARDWARE_STATE:
308 case IOCTL_VIDEO_SET_CURSOR_ATTR:
309 case IOCTL_VIDEO_SET_CURSOR_POSITION:
310 case IOCTL_VIDEO_SET_POINTER_ATTR:
311 case IOCTL_VIDEO_SET_POINTER_POSITION:
312 case IOCTL_VIDEO_SET_POWER_MANAGEMENT:
313
314 #endif
315
316 default:
317 RequestPacket->StatusBlock->Status = STATUS_NOT_IMPLEMENTED;
318 break;
319 }
320
321 return TRUE;
322 }
323
324 #if 0
325 // VGAInterrupt
326 //
327 // DESCRIPTION:
328 // This function will be called upon receipt of a adapter generated
329 // interrupt when enabled.
330 //
331 // RUN LEVEL:
332 // IRQL
333 //
334 // ARGUMENTS:
335 // PVOID DeviceExtension
336 // RETURNS:
337 // BOOLEAN TRUE if the interrupt was handled by the routine
338
339 static BOOLEAN STDCALL
340 VGAInterrupt(PVOID DeviceExtension)
341 {
342 return(TRUE);
343 }
344
345 // VGAResetHw
346 //
347 // DESCRIPTION:
348 // This function is called to reset the hardware to a known state
349 // if calling a BIOS int 10 reset will not achieve this result.
350 //
351 // RUN LEVEL:
352 // PASSIVE_LEVEL
353 //
354 // ARGUMENTS:
355 // PVOID DeviceExtension
356 // ULONG Columns Columns and Rows specify the mode parameters
357 // ULONG Rows to reset to.
358 // RETURNS:
359 // BOOLEAN TRUE if no further action is necessary, FALSE if the system
360 // needs to still do a BOIS int 10 reset.
361
362 static BOOLEAN STDCALL
363 VGAResetHw(PVOID DeviceExtension,
364 ULONG Columns,
365 ULONG Rows)
366 {
367 return(TRUE);
368 }
369
370 // VGATimer
371 //
372 // DESCRIPTION:
373 // This function will be called once a second when enabled
374 //
375 // RUN LEVEL:
376 // PASSIVE_LEVEL
377 //
378 // ARGUMENTS:
379 // PVOID DeviceExtension
380 // RETURNS:
381 // VOID
382
383 static VOID STDCALL
384 VGATimer(PVOID DeviceExtension)
385 {
386 }
387
388 #endif
389
390 VOID VGAMapVideoMemory(IN PVIDEO_MEMORY RequestedAddress,
391 OUT PVIDEO_MEMORY_INFORMATION MapInformation,
392 OUT PSTATUS_BLOCK StatusBlock)
393 {
394 UNIMPLEMENTED;
395 }
396
397 VOID VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes,
398 OUT PSTATUS_BLOCK StatusBlock)
399 {
400 UNIMPLEMENTED;
401 }
402
403 VOID VGAQueryCurrentMode(OUT PVIDEO_MODE_INFORMATION CurrentMode,
404 OUT PSTATUS_BLOCK StatusBlock)
405 {
406 UNIMPLEMENTED;
407 }
408
409 VOID VGAQueryNumAvailModes(OUT PVIDEO_NUM_MODES NumberOfModes,
410 OUT PSTATUS_BLOCK StatusBlock)
411 {
412 UNIMPLEMENTED;
413 }
414
415 VOID VGASetPaletteRegisters(IN PWORD PaletteRegisters,
416 OUT PSTATUS_BLOCK StatusBlock)
417 {
418 ;
419
420 /*
421 We don't need the following code because the palette registers are set correctly on VGA initialization.
422 Still, we may include\test this is in the future.
423
424 int i, j = 2;
425 char tmp, v;
426
427 tmp = VideoPortReadPortUchar(0x03da);
428 v = VideoPortReadPortUchar(0x03c0);
429
430 // Set the first 16 palette registers to map to the first 16 palette colors
431 for (i=PaletteRegisters[1]; i<PaletteRegisters[0]; i++)
432 {
433 tmp = VideoPortReadPortUchar(0x03da);
434 VideoPortWritePortUchar(0x03c0, i);
435 VideoPortWritePortUchar(0x03c0, PaletteRegisters[j++]);
436 }
437
438 tmp = VideoPortReadPortUchar(0x03da);
439 VideoPortWritePortUchar(0x03d0, v | 0x20);
440 */
441 }
442
443 VOID VGASetColorRegisters(IN PVIDEO_CLUT ColorLookUpTable,
444 OUT PSTATUS_BLOCK StatusBlock)
445 {
446 int i;
447
448 for (i=ColorLookUpTable->FirstEntry; i<ColorLookUpTable->NumEntries; i++)
449 {
450 VideoPortWritePortUchar((PUCHAR)0x03c8, i);
451 VideoPortWritePortUchar((PUCHAR)0x03c9, ColorLookUpTable->LookupTable[i].RgbArray.Red);
452 VideoPortWritePortUchar((PUCHAR)0x03c9, ColorLookUpTable->LookupTable[i].RgbArray.Green);
453 VideoPortWritePortUchar((PUCHAR)0x03c9, ColorLookUpTable->LookupTable[i].RgbArray.Blue);
454 }
455 }
456
457 VOID VGASetCurrentMode(IN PVIDEO_MODE RequestedMode,
458 OUT PSTATUS_BLOCK StatusBlock)
459 {
460 if(RequestedMode->RequestedMode == 12)
461 {
462 InitVGAMode();
463 } else {
464 DbgPrint("Unrecognised mode for VGASetCurrentMode\n");
465 }
466 }
467
468 VOID VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory,
469 OUT PVIDEO_MEMORY_INFORMATION ReturnedMemory,
470 OUT PSTATUS_BLOCK StatusBlock)
471 {
472 UNIMPLEMENTED;
473 }
474
475 VOID VGAUnmapVideoMemory(IN PVIDEO_MEMORY MemoryToUnmap,
476 OUT PSTATUS_BLOCK StatusBlock)
477 {
478 UNIMPLEMENTED;
479 }
480
481 VOID VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare,
482 OUT PSTATUS_BLOCK StatusBlock)
483 {
484 UNIMPLEMENTED;
485 }