3 * Written by Rex Jolliff
7 #include <ddk/ntddvid.h>
8 #include <internal/halio.h>
12 #define UNIMPLEMENTED do {DbgPrint("%s:%d: Function not implemented", __FILE__, __LINE__); for(;;);} while (0)
14 #define VERSION "0.0.0"
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
);
20 // ------------------------------------------------------- Public Interface
25 // This function initializes the driver.
31 // IN PDRIVER_OBJECT DriverObject System allocated Driver Object
33 // IN PUNICODE_STRING RegistryPath Name of registry driver service
40 DriverEntry(IN PDRIVER_OBJECT DriverObject
,
41 IN PUNICODE_STRING RegistryPath
)
44 DbgPrint("VideoPort Driver %s\n", VERSION
);
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
;
52 return STATUS_SUCCESS
;
56 VideoPortCompareMemory(IN PVOID Source1
,
60 return RtlCompareMemory(Source1
, Source2
, Length
);
64 VideoPortDebugPrint(IN ULONG DebugPrintLevel
,
65 IN PCHAR DebugMessage
, ...)
71 VideoPortDisableInterrupt(IN PVOID HwDeviceExtension
)
77 VideoPortEnableInterrupt(IN PVOID HwDeviceExtension
)
83 VideoPortFreeDeviceBase(IN PVOID HwDeviceExtension
,
84 IN PVOID MappedAddress
)
90 VideoPortGetBusData(IN PVOID HwDeviceExtension
,
91 IN BUS_DATA_TYPE BusDataType
,
97 return HalGetBusDataByOffset(BusDataType
,
106 VideoPortGetCurrentIrql(VOID
)
108 return KeGetCurrentIrql();
112 VideoPortGetDeviceBase(IN PVOID HwDeviceExtension
,
113 IN PHYSICAL_ADDRESS IoAddress
,
114 IN ULONG NumberOfUchars
,
119 return MmMapIoSpace(IoAddress
, NumberOfUchars
, FALSE
);
129 VideoPortGetDeviceData(IN PVOID HwDeviceExtension
,
130 IN VIDEO_DEVICE_DATA_TYPE DeviceDataType
,
131 IN PMINIPORT_QUERY_DEVICE_ROUTINE CallbackRoutine
,
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
,
151 VideoPortGetRegistryParameters(IN PVOID HwDeviceExtension
,
152 IN PWSTR ParameterName
,
153 IN UCHAR IsParameterFileName
,
154 IN PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine
,
161 VideoPortInitialize(IN PVOID Context1
,
163 IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData
,
167 WCHAR UnicodeBuffer
[18];
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
;
176 /* Build Dispatch table from passed data */
177 MPDriverObject
->DriverStartIo
= (PDRIVER_STARTIO
) HwInitializationData
->HwStartIO
;
179 /* Create a unicode device name */
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
);
189 /* Create the device */
190 Status
= IoCreateDevice(MPDriverObject
,
191 HwInitializationData
->HwDeviceExtensionSize
+
192 sizeof(VIDEOPORT_EXTENSION_DATA
),
198 if (!NT_SUCCESS(Status
))
200 DbgPrint("IoCreateDevice call failed\n",0);
204 (PVIDEOPORT_EXTENSION_DATA
) MPDeviceObject
->DeviceExtension
;
205 ExtensionData
->DeviceObject
= MPDeviceObject
;
207 /* Set the buffering strategy here... */
208 MPDeviceObject
->Flags
|= DO_BUFFERED_IO
;
210 /* Call HwFindAdapter entry point */
211 /* FIXME: Need to figure out what string to pass as param 3 */
212 Status
= HwInitializationData
->HwFindAdapter(VPExtensionToMPExtension(ExtensionData
),
217 if (!NT_SUCCESS(Status
))
219 DbgPrint("HwFindAdapter call failed");
220 IoDeleteDevice(MPDeviceObject
);
225 /* FIXME: Allocate hardware resources for device */
227 /* Allocate interrupt for device */
228 if (HwInitializationData
->HwInterrupt
!= NULL
&&
229 !(ConfigInfo
.BusInterruptLevel
== 0 &&
230 ConfigInfo
.BusInterruptVector
== 0))
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
,
243 HwInitializationData
->HwInterrupt
,
244 VPExtensionToMPExtension(ExtensionData
),
245 &ExtensionData
->InterruptSpinLock
,
246 ExtensionData
->InterruptLevel
,
249 ConfigInfo
.InterruptMode
,
251 ExtensionData
->Affinity
,
253 if (!NT_SUCCESS(Status
))
255 DbgPrint("IoConnectInterrupt failed\n");
256 IoDeleteDevice(MPDeviceObject
);
265 /* FIXME: initialize timer routine for MP Driver */
266 if (HwInitializationData
->HwTimer
!= NULL
)
268 Status
= IoInitializeTimer(MPDeviceObject
,
270 HwInitializationData
->HwTimer
,
271 VPExtensionToMPExtension(ExtensionData
));
272 if (!NT_SUCCESS(Status
))
274 DbgPrint("IoInitializeTimer failed\n");
276 if (HwInitializationData
->HwInterrupt
!= NULL
)
278 IoDisconnectInterrupt(&ExtensionData
->InterruptObject
);
280 IoDeleteDevice(MPDeviceObject
);
286 return STATUS_SUCCESS
;
290 VideoPortInt10(IN PVOID HwDeviceExtension
,
291 IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments
)
297 VideoPortLogError(IN PVOID HwDeviceExtension
,
298 IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL
,
299 IN VP_STATUS ErrorCode
,
306 VideoPortMapBankedMemory(IN PVOID HwDeviceExtension
,
307 IN PHYSICAL_ADDRESS PhysicalAddress
,
310 OUT PVOID
*VirtualAddress
,
312 IN UCHAR ReadWriteBank
,
313 IN PBANKED_SECTION_ROUTINE BankRoutine
,
320 VideoPortMapMemory(IN PVOID HwDeviceExtension
,
321 IN PHYSICAL_ADDRESS PhysicalAddress
,
324 OUT PVOID
*VirtualAddress
)
328 *VirtualAddress
= MmMapIoSpace(PhysicalAddress
, *Length
, FALSE
);
330 return *VirtualAddress
!= NULL
? STATUS_SUCCESS
:
331 STATUS_INSUFFICIENT_RESOURCES
;
338 return STATUS_SUCCESS
;
342 VideoPortMoveMemory(OUT PVOID Destination
,
346 RtlMoveMemory(Destination
, Source
, Length
);
350 VideoPortReadPortUchar(IN PUCHAR Port
)
352 return READ_PORT_UCHAR(Port
);
356 VideoPortReadPortUshort(IN PUSHORT Port
)
358 return READ_PORT_USHORT(Port
);
362 VideoPortReadPortUlong(IN PULONG Port
)
364 return READ_PORT_ULONG(Port
);
368 VideoPortReadPortBufferUchar(IN PUCHAR Port
,
372 READ_PORT_BUFFER_UCHAR(Port
, Buffer
, Count
);
376 VideoPortReadPortBufferUshort(IN PUSHORT Port
,
380 READ_PORT_BUFFER_USHORT(Port
, Buffer
, Count
);
384 VideoPortReadPortBufferUlong(IN PULONG Port
,
388 READ_PORT_BUFFER_ULONG(Port
, Buffer
, Count
);
392 VideoPortReadRegisterUchar(IN PUCHAR Register
)
394 return READ_REGISTER_UCHAR(Register
);
398 VideoPortReadRegisterUshort(IN PUSHORT Register
)
400 return READ_REGISTER_USHORT(Register
);
404 VideoPortReadRegisterUlong(IN PULONG Register
)
406 return READ_REGISTER_ULONG(Register
);
410 VideoPortReadRegisterBufferUchar(IN PUCHAR Register
,
414 READ_REGISTER_BUFFER_UCHAR(Register
, Buffer
, Count
);
418 VideoPortReadRegisterBufferUshort(IN PUSHORT Register
,
422 READ_REGISTER_BUFFER_USHORT(Register
, Buffer
, Count
);
426 VideoPortReadRegisterBufferUlong(IN PULONG Register
,
430 READ_REGISTER_BUFFER_ULONG(Register
, Buffer
, Count
);
434 VideoPortScanRom(IN PVOID HwDeviceExtension
,
443 VideoPortSetBusData(IN PVOID HwDeviceExtension
,
444 IN BUS_DATA_TYPE BusDataType
,
450 return HalSetBusDataByOffset(BusDataType
,
459 VideoPortSetRegistryParameters(IN PVOID HwDeviceExtension
,
462 IN ULONG ValueLength
)
468 VideoPortSetTrappedEmulatorPorts(IN PVOID HwDeviceExtension
,
469 IN ULONG NumAccessRanges
,
470 IN PVIDEO_ACCESS_RANGE AccessRange
)
476 VideoPortStallExecution(IN ULONG Microseconds
)
478 KeStallExecutionProcessor(Microseconds
);
482 VideoPortStartTimer(IN PVOID HwDeviceExtension
)
484 PVIDEOPORT_EXTENSION_DATA ExtensionData
=
485 MPExtensionToVPExtension(HwDeviceExtension
);
487 IoStartTimer(ExtensionData
->DeviceObject
);
491 VideoPortStopTimer(IN PVOID HwDeviceExtension
)
493 PVIDEOPORT_EXTENSION_DATA ExtensionData
=
494 MPExtensionToVPExtension(HwDeviceExtension
);
496 IoStopTimer(ExtensionData
->DeviceObject
);
500 VideoPortSynchronizeExecution(IN PVOID HwDeviceExtension
,
501 IN VIDEO_SYNCHRONIZE_PRIORITY Priority
,
502 IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine
,
509 VideoPortUnmapMemory(IN PVOID HwDeviceExtension
,
510 IN PVOID VirtualAddress
,
511 IN HANDLE ProcessHandle
)
517 VideoPortVerifyAccessRanges(IN PVOID HwDeviceExtension
,
518 IN ULONG NumAccessRanges
,
519 IN PVIDEO_ACCESS_RANGE AccessRanges
)
525 VideoPortWritePortUchar(IN PUCHAR Port
,
532 VideoPortWritePortUshort(IN PUSHORT Port
,
539 VideoPortWritePortUlong(IN PULONG Port
,
546 VideoPortWritePortBufferUchar(IN PUCHAR Port
,
554 VideoPortWritePortBufferUshort(IN PUSHORT Port
,
562 VideoPortWritePortBufferUlong(IN PULONG Port
,
570 VideoPortWriteRegisterUchar(IN PUCHAR Register
,
577 VideoPortWriteRegisterUshort(IN PUSHORT Register
,
584 VideoPortWriteRegisterUlong(IN PULONG Register
,
591 VideoPortWriteRegisterBufferUchar(IN PUCHAR Register
,
599 VideoPortWriteRegisterBufferUshort(IN PUSHORT Register
,
607 VideoPortWriteRegisterBufferUlong(IN PULONG Register
,
614 VOID
VideoPortZeroMemory(OUT PVOID Destination
,
617 RtlZeroMemory (Destination
, Length
);
620 VOID
VideoPortZeroDeviceMemory(OUT PVOID Destination
,
627 // ------------------------------------------- Nondiscardable statics
629 // VidDispatchOpenClose
632 // Answer requests for Open/Close calls: a null operation
638 // Standard dispatch arguments
645 VidDispatchOpenClose(IN PDEVICE_OBJECT pDO
,
648 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
649 Irp
->IoStatus
.Information
= FILE_OPENED
;
650 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
652 return STATUS_SUCCESS
;
658 // Get the next requested I/O packet started
664 // Dispatch routine standard arguments
671 VidStartIo(IN PDEVICE_OBJECT DeviceObject
,
677 // VidDispatchDeviceControl
680 // Answer requests for device control calls
686 // Standard dispatch arguments
693 VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject
,