1d6505d063c0b45021d092746dbb412b18067269
[reactos.git] / reactos / drivers / dd / vidport / vidport.c
1 /*
2 * VideoPort driver
3 * Written by Rex Jolliff
4 */
5
6 #include <ddk/ntddk.h>
7 #include <ddk/ntddvid.h>
8 #include <internal/halio.h>
9
10 #include "vidport.h"
11
12 #define UNIMPLEMENTED do {DbgPrint("%s:%d: Function not implemented", __FILE__, __LINE__); for(;;);} while (0)
13
14 #define VERSION "0.0.0"
15
16 static VOID VidStartIo(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
17 static NTSTATUS VidDispatchOpenClose(IN PDEVICE_OBJECT pDO, IN PIRP Irp);
18 static NTSTATUS VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
19
20 // ------------------------------------------------------- Public Interface
21
22 // DriverEntry
23 //
24 // DESCRIPTION:
25 // This function initializes the driver.
26 //
27 // RUN LEVEL:
28 // PASSIVE_LEVEL
29 //
30 // ARGUMENTS:
31 // IN PDRIVER_OBJECT DriverObject System allocated Driver Object
32 // for this driver
33 // IN PUNICODE_STRING RegistryPath Name of registry driver service
34 // key
35 //
36 // RETURNS:
37 // NTSTATUS
38
39 STDCALL NTSTATUS
40 DriverEntry(IN PDRIVER_OBJECT DriverObject,
41 IN PUNICODE_STRING RegistryPath)
42 {
43
44 DbgPrint("VideoPort Driver %s\n", VERSION);
45
46 // Export other driver entry points...
47 DriverObject->DriverStartIo = VidStartIo;
48 DriverObject->MajorFunction[IRP_MJ_CREATE] = VidDispatchOpenClose;
49 DriverObject->MajorFunction[IRP_MJ_CLOSE] = VidDispatchOpenClose;
50 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VidDispatchDeviceControl;
51
52 return STATUS_SUCCESS;
53 }
54
55 ULONG
56 VideoPortCompareMemory(IN PVOID Source1,
57 IN PVOID Source2,
58 IN ULONG Length)
59 {
60 return RtlCompareMemory(Source1, Source2, Length);
61 }
62
63 VOID
64 VideoPortDebugPrint(IN ULONG DebugPrintLevel,
65 IN PCHAR DebugMessage, ...)
66 {
67 UNIMPLEMENTED;
68 }
69
70 VP_STATUS
71 VideoPortDisableInterrupt(IN PVOID HwDeviceExtension)
72 {
73 UNIMPLEMENTED;
74 }
75
76 VP_STATUS
77 VideoPortEnableInterrupt(IN PVOID HwDeviceExtension)
78 {
79 UNIMPLEMENTED;
80 }
81
82 VOID
83 VideoPortFreeDeviceBase(IN PVOID HwDeviceExtension,
84 IN PVOID MappedAddress)
85 {
86 UNIMPLEMENTED;
87 }
88
89 ULONG
90 VideoPortGetBusData(IN PVOID HwDeviceExtension,
91 IN BUS_DATA_TYPE BusDataType,
92 IN ULONG SlotNumber,
93 OUT PVOID Buffer,
94 IN ULONG Offset,
95 IN ULONG Length)
96 {
97 return HalGetBusDataByOffset(BusDataType,
98 0,
99 SlotNumber,
100 Buffer,
101 Offset,
102 Length);
103 }
104
105 UCHAR
106 VideoPortGetCurrentIrql(VOID)
107 {
108 return KeGetCurrentIrql();
109 }
110
111 PVOID
112 VideoPortGetDeviceBase(IN PVOID HwDeviceExtension,
113 IN PHYSICAL_ADDRESS IoAddress,
114 IN ULONG NumberOfUchars,
115 IN UCHAR InIoSpace)
116 {
117 if (InIoSpace)
118 {
119 return MmMapIoSpace(IoAddress, NumberOfUchars, FALSE);
120 }
121 else
122 {
123 UNIMPLEMENTED;
124 return NULL;
125 }
126 }
127
128 VP_STATUS
129 VideoPortGetDeviceData(IN PVOID HwDeviceExtension,
130 IN VIDEO_DEVICE_DATA_TYPE DeviceDataType,
131 IN PMINIPORT_QUERY_DEVICE_ROUTINE CallbackRoutine,
132 IN PVOID Context)
133 {
134 UNIMPLEMENTED;
135 }
136
137 VP_STATUS
138 VideoPortGetAccessRanges(IN PVOID HwDeviceExtension,
139 IN ULONG NumRequestedResources,
140 IN PIO_RESOURCE_DESCRIPTOR RequestedResources OPTIONAL,
141 IN ULONG NumAccessRanges,
142 IN PVIDEO_ACCESS_RANGE AccessRanges,
143 IN PVOID VendorId,
144 IN PVOID DeviceId,
145 IN PULONG Slot)
146 {
147 UNIMPLEMENTED;
148 }
149
150 VP_STATUS
151 VideoPortGetRegistryParameters(IN PVOID HwDeviceExtension,
152 IN PWSTR ParameterName,
153 IN UCHAR IsParameterFileName,
154 IN PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine,
155 IN PVOID Context)
156 {
157 UNIMPLEMENTED;
158 }
159
160 ULONG
161 VideoPortInitialize(IN PVOID Context1,
162 IN PVOID Context2,
163 IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData,
164 IN PVOID HwContext)
165 {
166 UCHAR Again;
167 WCHAR UnicodeBuffer[18];
168 NTSTATUS Status;
169 ANSI_STRING AnsiName;
170 UNICODE_STRING UnicodeName;
171 PDRIVER_OBJECT MPDriverObject = (PDRIVER_OBJECT) Context1;
172 PDEVICE_OBJECT MPDeviceObject;
173 VIDEO_PORT_CONFIG_INFO ConfigInfo;
174 PVIDEOPORT_EXTENSION_DATA ExtensionData;
175
176 /* Build Dispatch table from passed data */
177 MPDriverObject->DriverStartIo = (PDRIVER_STARTIO) HwInitializationData->HwStartIO;
178
179 /* Create a unicode device name */
180 Again = FALSE;
181 do
182 {
183 /* FIXME: Need to add a device index for multiple adapters */
184 RtlInitAnsiString(&AnsiName, "\\Device\\Display");
185 UnicodeName.MaximumLength = 18 * sizeof(WCHAR);
186 UnicodeName.Buffer = UnicodeBuffer;
187 RtlAnsiStringToUnicodeString(&UnicodeName, &AnsiName, FALSE);
188
189 /* Create the device */
190 Status = IoCreateDevice(MPDriverObject,
191 HwInitializationData->HwDeviceExtensionSize +
192 sizeof(VIDEOPORT_EXTENSION_DATA),
193 &UnicodeName,
194 FILE_DEVICE_VIDEO,
195 0,
196 TRUE,
197 &MPDeviceObject);
198 if (!NT_SUCCESS(Status))
199 {
200 DbgPrint("IoCreateDevice call failed\n",0);
201 return Status;
202 }
203 ExtensionData =
204 (PVIDEOPORT_EXTENSION_DATA) MPDeviceObject->DeviceExtension;
205 ExtensionData->DeviceObject = MPDeviceObject;
206
207 /* Set the buffering strategy here... */
208 MPDeviceObject->Flags |= DO_BUFFERED_IO;
209
210 /* Call HwFindAdapter entry point */
211 /* FIXME: Need to figure out what string to pass as param 3 */
212 Status = HwInitializationData->HwFindAdapter(VPExtensionToMPExtension(ExtensionData),
213 Context2,
214 L"",
215 &ConfigInfo,
216 &Again);
217 if (!NT_SUCCESS(Status))
218 {
219 DbgPrint("HwFindAdapter call failed");
220 IoDeleteDevice(MPDeviceObject);
221
222 return Status;
223 }
224
225 /* FIXME: Allocate hardware resources for device */
226
227 /* Allocate interrupt for device */
228 if (HwInitializationData->HwInterrupt != NULL &&
229 !(ConfigInfo.BusInterruptLevel == 0 &&
230 ConfigInfo.BusInterruptVector == 0))
231 {
232 ExtensionData->IRQL = ConfigInfo.BusInterruptLevel;
233 ExtensionData->InterruptLevel =
234 HalGetInterruptVector(ConfigInfo.AdapterInterfaceType,
235 ConfigInfo.SystemIoBusNumber,
236 ConfigInfo.BusInterruptLevel,
237 ConfigInfo.BusInterruptVector,
238 &ExtensionData->IRQL,
239 &ExtensionData->Affinity);
240 KeInitializeSpinLock(&ExtensionData->InterruptSpinLock);
241 Status = IoConnectInterrupt(&ExtensionData->InterruptObject,
242 (PKSERVICE_ROUTINE)
243 HwInitializationData->HwInterrupt,
244 VPExtensionToMPExtension(ExtensionData),
245 &ExtensionData->InterruptSpinLock,
246 ExtensionData->InterruptLevel,
247 ExtensionData->IRQL,
248 ExtensionData->IRQL,
249 ConfigInfo.InterruptMode,
250 FALSE,
251 ExtensionData->Affinity,
252 FALSE);
253 if (!NT_SUCCESS(Status))
254 {
255 DbgPrint("IoConnectInterrupt failed\n");
256 IoDeleteDevice(MPDeviceObject);
257
258 return Status;
259 }
260
261 }
262 }
263 while (Again);
264
265 /* FIXME: initialize timer routine for MP Driver */
266 if (HwInitializationData->HwTimer != NULL)
267 {
268 Status = IoInitializeTimer(MPDeviceObject,
269 (PIO_TIMER_ROUTINE)
270 HwInitializationData->HwTimer,
271 VPExtensionToMPExtension(ExtensionData));
272 if (!NT_SUCCESS(Status))
273 {
274 DbgPrint("IoInitializeTimer failed\n");
275
276 if (HwInitializationData->HwInterrupt != NULL)
277 {
278 IoDisconnectInterrupt(&ExtensionData->InterruptObject);
279 }
280 IoDeleteDevice(MPDeviceObject);
281
282 return Status;
283 }
284 }
285
286 return STATUS_SUCCESS;
287 }
288
289 VP_STATUS
290 VideoPortInt10(IN PVOID HwDeviceExtension,
291 IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments)
292 {
293 UNIMPLEMENTED;
294 }
295
296 VOID
297 VideoPortLogError(IN PVOID HwDeviceExtension,
298 IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL,
299 IN VP_STATUS ErrorCode,
300 IN ULONG UniqueId)
301 {
302 UNIMPLEMENTED;
303 }
304
305 VP_STATUS
306 VideoPortMapBankedMemory(IN PVOID HwDeviceExtension,
307 IN PHYSICAL_ADDRESS PhysicalAddress,
308 IN PULONG Length,
309 IN PULONG InIoSpace,
310 OUT PVOID *VirtualAddress,
311 IN ULONG BankLength,
312 IN UCHAR ReadWriteBank,
313 IN PBANKED_SECTION_ROUTINE BankRoutine,
314 IN PVOID Context)
315 {
316 UNIMPLEMENTED;
317 }
318
319 VP_STATUS
320 VideoPortMapMemory(IN PVOID HwDeviceExtension,
321 IN PHYSICAL_ADDRESS PhysicalAddress,
322 IN PULONG Length,
323 IN PULONG InIoSpace,
324 OUT PVOID *VirtualAddress)
325 {
326 if (*InIoSpace)
327 {
328 *VirtualAddress = MmMapIoSpace(PhysicalAddress, *Length, FALSE);
329
330 return *VirtualAddress != NULL ? STATUS_SUCCESS :
331 STATUS_INSUFFICIENT_RESOURCES;
332 }
333 else
334 {
335 UNIMPLEMENTED;
336 }
337
338 return STATUS_SUCCESS;
339 }
340
341 VOID
342 VideoPortMoveMemory(OUT PVOID Destination,
343 IN PVOID Source,
344 IN ULONG Length)
345 {
346 RtlMoveMemory(Destination, Source, Length);
347 }
348
349 UCHAR
350 VideoPortReadPortUchar(IN PUCHAR Port)
351 {
352 return READ_PORT_UCHAR(Port);
353 }
354
355 USHORT
356 VideoPortReadPortUshort(IN PUSHORT Port)
357 {
358 return READ_PORT_USHORT(Port);
359 }
360
361 ULONG
362 VideoPortReadPortUlong(IN PULONG Port)
363 {
364 return READ_PORT_ULONG(Port);
365 }
366
367 VOID
368 VideoPortReadPortBufferUchar(IN PUCHAR Port,
369 OUT PUCHAR Buffer,
370 IN ULONG Count)
371 {
372 READ_PORT_BUFFER_UCHAR(Port, Buffer, Count);
373 }
374
375 VOID
376 VideoPortReadPortBufferUshort(IN PUSHORT Port,
377 OUT PUSHORT Buffer,
378 IN ULONG Count)
379 {
380 READ_PORT_BUFFER_USHORT(Port, Buffer, Count);
381 }
382
383 VOID
384 VideoPortReadPortBufferUlong(IN PULONG Port,
385 OUT PULONG Buffer,
386 IN ULONG Count)
387 {
388 READ_PORT_BUFFER_ULONG(Port, Buffer, Count);
389 }
390
391 UCHAR
392 VideoPortReadRegisterUchar(IN PUCHAR Register)
393 {
394 return READ_REGISTER_UCHAR(Register);
395 }
396
397 USHORT
398 VideoPortReadRegisterUshort(IN PUSHORT Register)
399 {
400 return READ_REGISTER_USHORT(Register);
401 }
402
403 ULONG
404 VideoPortReadRegisterUlong(IN PULONG Register)
405 {
406 return READ_REGISTER_ULONG(Register);
407 }
408
409 VOID
410 VideoPortReadRegisterBufferUchar(IN PUCHAR Register,
411 OUT PUCHAR Buffer,
412 IN ULONG Count)
413 {
414 READ_REGISTER_BUFFER_UCHAR(Register, Buffer, Count);
415 }
416
417 VOID
418 VideoPortReadRegisterBufferUshort(IN PUSHORT Register,
419 OUT PUSHORT Buffer,
420 IN ULONG Count)
421 {
422 READ_REGISTER_BUFFER_USHORT(Register, Buffer, Count);
423 }
424
425 VOID
426 VideoPortReadRegisterBufferUlong(IN PULONG Register,
427 OUT PULONG Buffer,
428 IN ULONG Count)
429 {
430 READ_REGISTER_BUFFER_ULONG(Register, Buffer, Count);
431 }
432
433 BOOLEAN
434 VideoPortScanRom(IN PVOID HwDeviceExtension,
435 IN PUCHAR RomBase,
436 IN ULONG RomLength,
437 IN PUCHAR String)
438 {
439 UNIMPLEMENTED;
440 }
441
442 ULONG
443 VideoPortSetBusData(IN PVOID HwDeviceExtension,
444 IN BUS_DATA_TYPE BusDataType,
445 IN ULONG SlotNumber,
446 IN PVOID Buffer,
447 IN ULONG Offset,
448 IN ULONG Length)
449 {
450 return HalSetBusDataByOffset(BusDataType,
451 0,
452 SlotNumber,
453 Buffer,
454 Offset,
455 Length);
456 }
457
458 VP_STATUS
459 VideoPortSetRegistryParameters(IN PVOID HwDeviceExtension,
460 IN PWSTR ValueName,
461 IN PVOID ValueData,
462 IN ULONG ValueLength)
463 {
464 UNIMPLEMENTED;
465 }
466
467 VP_STATUS
468 VideoPortSetTrappedEmulatorPorts(IN PVOID HwDeviceExtension,
469 IN ULONG NumAccessRanges,
470 IN PVIDEO_ACCESS_RANGE AccessRange)
471 {
472 UNIMPLEMENTED;
473 }
474
475 VOID
476 VideoPortStallExecution(IN ULONG Microseconds)
477 {
478 KeStallExecutionProcessor(Microseconds);
479 }
480
481 VOID
482 VideoPortStartTimer(IN PVOID HwDeviceExtension)
483 {
484 PVIDEOPORT_EXTENSION_DATA ExtensionData =
485 MPExtensionToVPExtension(HwDeviceExtension);
486
487 IoStartTimer(ExtensionData->DeviceObject);
488 }
489
490 VOID
491 VideoPortStopTimer(IN PVOID HwDeviceExtension)
492 {
493 PVIDEOPORT_EXTENSION_DATA ExtensionData =
494 MPExtensionToVPExtension(HwDeviceExtension);
495
496 IoStopTimer(ExtensionData->DeviceObject);
497 }
498
499 BOOLEAN
500 VideoPortSynchronizeExecution(IN PVOID HwDeviceExtension,
501 IN VIDEO_SYNCHRONIZE_PRIORITY Priority,
502 IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine,
503 OUT PVOID Context)
504 {
505 UNIMPLEMENTED;
506 }
507
508 VP_STATUS
509 VideoPortUnmapMemory(IN PVOID HwDeviceExtension,
510 IN PVOID VirtualAddress,
511 IN HANDLE ProcessHandle)
512 {
513 UNIMPLEMENTED;
514 }
515
516 VP_STATUS
517 VideoPortVerifyAccessRanges(IN PVOID HwDeviceExtension,
518 IN ULONG NumAccessRanges,
519 IN PVIDEO_ACCESS_RANGE AccessRanges)
520 {
521 UNIMPLEMENTED;
522 }
523
524 VOID
525 VideoPortWritePortUchar(IN PUCHAR Port,
526 IN UCHAR Value)
527 {
528 UNIMPLEMENTED;
529 }
530
531 VOID
532 VideoPortWritePortUshort(IN PUSHORT Port,
533 IN USHORT Value)
534 {
535 UNIMPLEMENTED;
536 }
537
538 VOID
539 VideoPortWritePortUlong(IN PULONG Port,
540 IN ULONG Value)
541 {
542 UNIMPLEMENTED;
543 }
544
545 VOID
546 VideoPortWritePortBufferUchar(IN PUCHAR Port,
547 IN PUCHAR Buffer,
548 IN ULONG Count)
549 {
550 UNIMPLEMENTED;
551 }
552
553 VOID
554 VideoPortWritePortBufferUshort(IN PUSHORT Port,
555 IN PUSHORT Buffer,
556 IN ULONG Count)
557 {
558 UNIMPLEMENTED;
559 }
560
561 VOID
562 VideoPortWritePortBufferUlong(IN PULONG Port,
563 IN PULONG Buffer,
564 IN ULONG Count)
565 {
566 UNIMPLEMENTED;
567 }
568
569 VOID
570 VideoPortWriteRegisterUchar(IN PUCHAR Register,
571 IN UCHAR Value)
572 {
573 UNIMPLEMENTED;
574 }
575
576 VOID
577 VideoPortWriteRegisterUshort(IN PUSHORT Register,
578 IN USHORT Value)
579 {
580 UNIMPLEMENTED;
581 }
582
583 VOID
584 VideoPortWriteRegisterUlong(IN PULONG Register,
585 IN ULONG Value)
586 {
587 UNIMPLEMENTED;
588 }
589
590 VOID
591 VideoPortWriteRegisterBufferUchar(IN PUCHAR Register,
592 IN PUCHAR Buffer,
593 IN ULONG Count)
594 {
595 UNIMPLEMENTED;
596 }
597
598 VOID
599 VideoPortWriteRegisterBufferUshort(IN PUSHORT Register,
600 IN PUSHORT Buffer,
601 IN ULONG Count)
602 {
603 UNIMPLEMENTED;
604 }
605
606 VOID
607 VideoPortWriteRegisterBufferUlong(IN PULONG Register,
608 IN PULONG Buffer,
609 IN ULONG Count)
610 {
611 UNIMPLEMENTED;
612 }
613
614 VOID VideoPortZeroMemory(OUT PVOID Destination,
615 IN ULONG Length)
616 {
617 RtlZeroMemory (Destination, Length);
618 }
619
620 VOID VideoPortZeroDeviceMemory(OUT PVOID Destination,
621 IN ULONG Length)
622 {
623 UNIMPLEMENTED;
624 }
625
626
627 // ------------------------------------------- Nondiscardable statics
628
629 // VidDispatchOpenClose
630 //
631 // DESCRIPTION:
632 // Answer requests for Open/Close calls: a null operation
633 //
634 // RUN LEVEL:
635 // PASSIVE_LEVEL
636 //
637 // ARGUMENTS:
638 // Standard dispatch arguments
639 //
640 // RETURNS:
641 // NTSTATUS
642 //
643
644 static NTSTATUS
645 VidDispatchOpenClose(IN PDEVICE_OBJECT pDO,
646 IN PIRP Irp)
647 {
648 Irp->IoStatus.Status = STATUS_SUCCESS;
649 Irp->IoStatus.Information = FILE_OPENED;
650 IoCompleteRequest(Irp, IO_NO_INCREMENT);
651
652 return STATUS_SUCCESS;
653 }
654
655 // VidStartIo
656 //
657 // DESCRIPTION:
658 // Get the next requested I/O packet started
659 //
660 // RUN LEVEL:
661 // DISPATCH_LEVEL
662 //
663 // ARGUMENTS:
664 // Dispatch routine standard arguments
665 //
666 // RETURNS:
667 // NTSTATUS
668 //
669
670 static VOID
671 VidStartIo(IN PDEVICE_OBJECT DeviceObject,
672 IN PIRP Irp)
673 {
674 UNIMPLEMENTED;
675 }
676
677 // VidDispatchDeviceControl
678 //
679 // DESCRIPTION:
680 // Answer requests for device control calls
681 //
682 // RUN LEVEL:
683 // PASSIVE_LEVEL
684 //
685 // ARGUMENTS:
686 // Standard dispatch arguments
687 //
688 // RETURNS:
689 // NTSTATUS
690 //
691
692 static NTSTATUS
693 VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,
694 IN PIRP Irp)
695 {
696 UNIMPLEMENTED;
697 }
698
699