/*++ Copyright (c) 1991 Microsoft Corporation Module Name: videoprt.h Abstract: This module contains the structure definitions private to the video port driver. Author: Andre Vachon (andreva) 02-Dec-1991 Notes: Revision History: --*/ extern BOOLEAN VpBaseVideo; extern PEPROCESS CsrProcess; extern ULONG VpC0000Compatible; // // Debugging Macro // // // When an IO routine is called, we want to make sure the miniport // in question has reported its IO ports. // VPResourceReported is TRUE when a miniport has called VideoPort- // VerifyAccessRanges. // It is set to FALSE as a default, and set back to FALSE when finishing // an iteration in the loop of VideoPortInitialize (which will reset // the default when we exit the loop also). // // This flag will also be set to TRUE by the VREATE entry point so that // the IO functions always work after init. // #if DBG extern BOOLEAN VPResourcesReported; #undef VideoDebugPrint #define pVideoDebugPrint(arg) VideoPortDebugPrint arg #define IS_ACCESS_RANGES_DEFINED() \ { \ if (!VPResourcesReported) { \ \ pVideoDebugPrint((0, "The miniport driver is trying to access" \ " IO ports or memory location before the" \ " ACCESS_RANGES have been reported to" \ " the port driver with the" \ " VideoPortVerifyAccessRanges(). Please" \ " fix the miniport driver\n")); \ \ DbgBreakPoint(); \ \ } \ } #else #define pVideoDebugPrint(arg) #define IS_ACCESS_RANGES_DEFINED() #endif // // Queue link for mapped addresses stored for unmapping // typedef struct _MAPPED_ADDRESS { struct _MAPPED_ADDRESS *NextMappedAddress; PVOID MappedAddress; PHYSICAL_ADDRESS PhysicalAddress; ULONG NumberOfUchars; ULONG RefCount; BOOLEAN bNeedsUnmapping; BOOLEAN bLargePageRequest; } MAPPED_ADDRESS, *PMAPPED_ADDRESS; // // BusDataRegistry variables // typedef struct _VP_QUERY_DEVICE { PVOID MiniportHwDeviceExtension; PVOID CallbackRoutine; PVOID MiniportContext; VP_STATUS MiniportStatus; ULONG DeviceDataType; } VP_QUERY_DEVICE, *PVP_QUERY_DEVICE; // // Definition of the data passed in for the VideoPortGetRegistryParameters // function for the DeviceDataType. // #define VP_GET_REGISTRY_DATA 0 #define VP_GET_REGISTRY_FILE 1 // // Possible values for the InterruptFlags field in the DeviceExtension // #define VP_ERROR_LOGGED 0x01 // // Port driver error logging // typedef struct _VP_ERROR_LOG_ENTRY { PVOID DeviceExtension; ULONG IoControlCode; VP_STATUS ErrorCode; ULONG UniqueId; } VP_ERROR_LOG_ENTRY, *PVP_ERROR_LOG_ENTRY; // // ResetHW Structure // typedef struct _VP_RESET_HW { PVIDEO_HW_RESET_HW ResetFunction; PVOID HwDeviceExtension; } VP_RESET_HW, *PVP_RESET_HW; // // Device Extension for the Driver Object // typedef struct _DEVICE_EXTENSION { // // Pointer to the miniport config info so that the port driver // can modify it when the miniport is asking for configuration information. // PVIDEO_PORT_CONFIG_INFO MiniportConfigInfo; // // Linked list of all memory mapped io space (done through MmMapIoSpace) // requested by the miniport driver. // This list is kept so we can free up those ressources if the driver // fails to load or if it is unloaded at a later time. // PMAPPED_ADDRESS MappedAddressList; // // Adapter device object // PDEVICE_OBJECT DeviceObject; // // Interrupt object // PKINTERRUPT InterruptObject; // // Interrupt vector, irql and mode // ULONG InterruptVector; KIRQL InterruptIrql; KINTERRUPT_MODE InterruptMode; // // Information about the BUS on which the adapteris located // INTERFACE_TYPE AdapterInterfaceType; ULONG SystemIoBusNumber; // // Event object for request synchronization // KEVENT SyncEvent; // // DPC used to log errors. // KDPC ErrorLogDpc; // // Miniport Configuration Routine // PVIDEO_HW_FIND_ADAPTER HwFindAdapter; // // Miniport Initialization Routine // PVIDEO_HW_INITIALIZE HwInitialize; // // Miniport Interrupt Service Routine // PVIDEO_HW_INTERRUPT HwInterrupt; // // Miniport Start IO Routine // PVIDEO_HW_START_IO HwStartIO; // // Miniport 1 second Timer routine. // PVIDEO_HW_TIMER HwTimer; // // Stores the size and pointer to the EmulatorAccessEntries. These are // kept since they will be accessed later on when the Emulation must be // enabled. // ULONG NumEmulatorAccessEntries; PEMULATOR_ACCESS_ENTRY EmulatorAccessEntries; ULONG EmulatorAccessEntriesContext; // // Determines the size required to save the video hardware state // ULONG HardwareStateSize; // // Size and location of the miniport device extension. // ULONG HwDeviceExtensionSize; PVOID HwDeviceExtension; // // Pointer to the path name indicating the path to the drivers node in // the registry's current control set // PWSTR DriverRegistryPath; // // Total memory usage of PTEs by a miniport driver. // This is used to track if the miniport is mapping too much memory // ULONG MemoryPTEUsage; // // Pointer to the video request packet; // PVIDEO_REQUEST_PACKET Vrp; // // RequestorMode of the Currently processed IRP. // This is only valid because ALL requests are processed synchronously. // KPROCESSOR_MODE CurrentIrpRequestorMode; // // Determines if the port driver is currently handling an attach caused by // a video filter drivers. // BOOLEAN bAttachInProgress; // // State set during an Interrupt that must be dealt with afterwards // ULONG InterruptFlags; // // LogEntry Packet so the information can be save when called from within // an interrupt. // VP_ERROR_LOG_ENTRY ErrorLogEntry; // // VDM and int10 support // PHYSICAL_ADDRESS VdmPhysicalVideoMemoryAddress; ULONG VdmPhysicalVideoMemoryLength; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; // // Global Data // extern UNICODE_STRING VideoClassName; // // Private function declarations // // // videoprt.c // VOID pVideoPortDebugPrint( ULONG DebugPrintLevel, PCHAR DebugMessage, ... ); NTSTATUS pVideoPortDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); PVOID pVideoPortFreeDeviceBase( IN PVOID HwDeviceExtension, IN PVOID MappedAddress ); PVOID pVideoPortGetDeviceBase( IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS IoAddress, IN ULONG NumberOfUchars, IN UCHAR InIoSpace, IN BOOLEAN bLargePage ); NTSTATUS pVideoPortGetDeviceDataRegistry( IN PVOID Context, IN PUNICODE_STRING PathName, IN INTERFACE_TYPE BusType, IN ULONG BusNumber, IN PKEY_VALUE_FULL_INFORMATION *BusInformation, IN CONFIGURATION_TYPE ControllerType, IN ULONG ControllerNumber, IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, IN CONFIGURATION_TYPE PeripheralType, IN ULONG PeripheralNumber, IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation ); NTSTATUS pVideoPortGetRegistryCallback( IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext ); VOID pVPInit( VOID ); NTSTATUS pVideoPortInitializeBusCallback( IN PVOID Context, IN PUNICODE_STRING PathName, IN INTERFACE_TYPE BusType, IN ULONG BusNumber, IN PKEY_VALUE_FULL_INFORMATION *BusInformation, IN CONFIGURATION_TYPE ControllerType, IN ULONG ControllerNumber, IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, IN CONFIGURATION_TYPE PeripheralType, IN ULONG PeripheralNumber, IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation ); VP_STATUS pVideoPorInitializeDebugCallback( PVOID HwDeviceExtension, PVOID Context, PWSTR ValueName, PVOID ValueData, ULONG ValueLength ); BOOLEAN pVideoPortInterrupt( IN PKINTERRUPT Interrupt, IN PDEVICE_OBJECT DeviceObject ); BOOLEAN pVideoPortLogErrorEntry( IN PVOID Context ); VOID pVideoPortLogErrorEntryDPC( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); VOID pVideoPortMapToNtStatus( IN PSTATUS_BLOCK StatusBlock ); NTSTATUS pVideoPortMapUserPhysicalMem( IN PDEVICE_EXTENSION DeviceExtension, IN HANDLE ProcessHandle OPTIONAL, IN PHYSICAL_ADDRESS PhysicalAddress, IN OUT PULONG Length, IN OUT PULONG InIoSpace, IN OUT PVOID *VirtualAddress ); BOOLEAN pVideoPortSynchronizeExecution( PVOID HwDeviceExtension, VIDEO_SYNCHRONIZE_PRIORITY Priority, PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine, PVOID Context ); VOID pVideoPortHwTimer( IN PDEVICE_OBJECT DeviceObject, PVOID Context ); BOOLEAN pVideoPortResetDisplay( IN ULONG Columns, IN ULONG Rows ); // // registry.c // BOOLEAN pOverrideConflict( PDEVICE_EXTENSION DeviceExtension, BOOLEAN bSetResources ); NTSTATUS pVideoPortReportResourceList( PDEVICE_EXTENSION DeviceExtension, ULONG NumAccessRanges, PVIDEO_ACCESS_RANGE AccessRanges, PBOOLEAN Conflict ); // // i386\porti386.c // mips\portmips.c // alpha\portalpha.c VOID pVideoPortInitializeInt10( PDEVICE_EXTENSION deviceExtension ); NTSTATUS pVideoPortEnableVDM( IN PDEVICE_EXTENSION DeviceExtension, IN BOOLEAN Enable, IN PVIDEO_VDM VdmInfo, IN ULONG VdmInfoSize ); NTSTATUS pVideoPortRegisterVDM( IN PDEVICE_EXTENSION DeviceExtension, IN PVIDEO_VDM VdmInfo, IN ULONG VdmInfoSize, OUT PVIDEO_REGISTER_VDM RegisterVdm, IN ULONG RegisterVdmSize, OUT PULONG OutputSize ); NTSTATUS pVideoPortSetIOPM( IN ULONG NumAccessRanges, IN PVIDEO_ACCESS_RANGE AccessRange, IN BOOLEAN Enable, IN ULONG IOPMNumber );