442 lines
9.1 KiB
C
442 lines
9.1 KiB
C
/*++
|
|
|
|
Copyright (c) 1990-2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
vpdata.c
|
|
|
|
Abstract:
|
|
|
|
Global data module for the video port
|
|
|
|
Author:
|
|
|
|
Andre Vachon (andreva) 12-Jul-1997
|
|
|
|
Environment:
|
|
|
|
kernel mode only
|
|
|
|
Notes:
|
|
|
|
This module is a driver which implements OS dependant functions on the
|
|
behalf of the video drivers
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "videoprt.h"
|
|
|
|
//
|
|
//
|
|
// Data that is NOT pageable
|
|
//
|
|
//
|
|
|
|
//
|
|
// Globals to support HwResetHw function
|
|
//
|
|
|
|
VP_RESET_HW HwResetHw[6];
|
|
|
|
//
|
|
// Globals array of Fdos for debugging purpose
|
|
//
|
|
|
|
PFDO_EXTENSION FdoList[8];
|
|
|
|
//
|
|
// Head of Fdo list
|
|
//
|
|
|
|
PFDO_EXTENSION FdoHead = NULL;
|
|
|
|
//
|
|
// Debug Level for output routine (not pageable because VideoDebugPrint
|
|
// can be called at raised irql.
|
|
//
|
|
|
|
ULONG VideoDebugLevel = 0;
|
|
|
|
//
|
|
// Variable used to so int10 support.
|
|
//
|
|
|
|
PEPROCESS CsrProcess = NULL;
|
|
|
|
//
|
|
// Bugcheck Reason Callback support
|
|
//
|
|
|
|
KBUGCHECK_REASON_CALLBACK_RECORD VpCallbackRecord;
|
|
|
|
//
|
|
// Pointer to bugcheck data buffer
|
|
//
|
|
|
|
PVOID VpBugcheckData;
|
|
|
|
//
|
|
// Device Object for the device which caused the bugcheck EA
|
|
//
|
|
|
|
PDEVICE_OBJECT VpBugcheckDeviceObject;
|
|
|
|
//
|
|
//
|
|
// Data that IS pageable
|
|
//
|
|
//
|
|
|
|
#if defined(ALLOC_PRAGMA)
|
|
#pragma data_seg("PAGE_DATA")
|
|
#endif
|
|
|
|
//
|
|
// EA recovery event and event handle
|
|
//
|
|
|
|
PKEVENT VpThreadStuckEvent = NULL;
|
|
HANDLE VpThreadStuckEventHandle = NULL;
|
|
|
|
//
|
|
// The dump buffer fro EA recovery
|
|
//
|
|
|
|
PVOID VpDump = NULL;
|
|
|
|
//
|
|
// Global videoprt lock
|
|
//
|
|
|
|
KMUTEX VpGlobalLock;
|
|
|
|
//
|
|
// Are we running setup ? This will never change once set.
|
|
//
|
|
|
|
ULONG VpSetupTypeAtBoot = 0;
|
|
|
|
//
|
|
// Are we running setup ? This may change when we start I/O.
|
|
//
|
|
|
|
ULONG VpSetupType = 0;
|
|
|
|
//
|
|
// Used to do first time initialization of the video port.
|
|
//
|
|
|
|
BOOLEAN VPFirstTime = TRUE;
|
|
|
|
//
|
|
// Callbacks to win32k
|
|
//
|
|
|
|
PVIDEO_WIN32K_CALLOUT Win32kCallout = NULL;
|
|
|
|
//
|
|
// Disable USWC is case the machine does not work properly with it.
|
|
//
|
|
|
|
BOOLEAN EnableUSWC = TRUE;
|
|
|
|
//
|
|
// Maximal total amount of memory we'll lock down.
|
|
//
|
|
|
|
ULONG VideoPortMaxDmaSize = 0;
|
|
|
|
//
|
|
// Count to determine the number of video devices
|
|
//
|
|
|
|
ULONG VideoDeviceNumber = 0;
|
|
ULONG VideoChildDevices = 0;
|
|
|
|
//
|
|
// Registry Class in which all video information is stored.
|
|
//
|
|
|
|
PWSTR VideoClassString = L"VIDEO";
|
|
UNICODE_STRING VideoClassName = {10,12,L"VIDEO"};
|
|
|
|
//
|
|
// Global variables used to keep track of where controllers or peripherals
|
|
// are found by IoQueryDeviceDescription
|
|
//
|
|
|
|
CONFIGURATION_TYPE VpQueryDeviceControllerType = DisplayController;
|
|
CONFIGURATION_TYPE VpQueryDevicePeripheralType = MonitorPeripheral;
|
|
ULONG VpQueryDeviceControllerNumber = 0;
|
|
ULONG VpQueryDevicePeripheralNumber = 0;
|
|
|
|
//
|
|
// Global used to determine if we are running in BASEVIDEO mode.
|
|
//
|
|
// If we are, we don't want to generate a conflict for the VGA driver resources
|
|
// if there is one.
|
|
// We also want to write a volatile key in the registry indicating we booted
|
|
// in beasevideo so the display driver loading code can handle it properly
|
|
//
|
|
|
|
BOOLEAN VpBaseVideo = FALSE;
|
|
|
|
//
|
|
// Pointer to physical memory. It is created during driver initialization
|
|
// and is only closed when the driver is closed.
|
|
//
|
|
|
|
PVOID PhysicalMemorySection = NULL;
|
|
|
|
//
|
|
// Variable to determine if there is a ROM at physical address C0000 on which
|
|
// we can do the int 10
|
|
//
|
|
|
|
ULONG VpC0000Compatible = 0;
|
|
|
|
//
|
|
// HwDeviceExtension of the VGA miniport driver, if it is loaded.
|
|
//
|
|
|
|
PVOID VgaHwDeviceExtension = NULL;
|
|
|
|
//
|
|
// Pointer to list of bus addresses for devices which have been assigned
|
|
// resources.
|
|
//
|
|
|
|
PDEVICE_ADDRESS gDeviceAddressList;
|
|
|
|
//
|
|
// Store the amount of physical memory in the machine.
|
|
//
|
|
|
|
ULONGLONG VpSystemMemorySize;
|
|
|
|
//
|
|
// Store the device object that is the LCD panel for dimming and for
|
|
// lid closure purposes.
|
|
//
|
|
|
|
PDEVICE_OBJECT LCDPanelDevice = NULL;
|
|
|
|
//
|
|
// LCD Panel Device Object Mutex
|
|
//
|
|
|
|
KMUTEX LCDPanelMutex;
|
|
|
|
//
|
|
// Int10 Mutex
|
|
//
|
|
|
|
KMUTEX VpInt10Mutex;
|
|
|
|
//
|
|
// Handle to PowerState callback
|
|
//
|
|
|
|
PVOID PowerStateCallbackHandle = NULL;
|
|
|
|
//
|
|
// Handle to Dock/Undock callback
|
|
//
|
|
|
|
PVOID DockCallbackHandle = NULL;
|
|
|
|
//
|
|
// Keep track of the number of devices which have started
|
|
//
|
|
|
|
ULONG NumDevicesStarted = 0;
|
|
|
|
//
|
|
// Use the new way of generating the registry path
|
|
//
|
|
|
|
BOOLEAN EnableNewRegistryKey = FALSE;
|
|
|
|
//
|
|
// We want to use the VGA driver during setup. We don't want any pre-installed
|
|
// driver to work until after the VGA driver has been initialized. This way
|
|
// if there is a bad PNP driver which won't work on the current OS, we have
|
|
// time to replace it before trying to start it.
|
|
//
|
|
|
|
BOOLEAN VpSetupAllowDriversToStart = FALSE;
|
|
|
|
//
|
|
// Lets track whether or not any devices have had HwInitialize called on them
|
|
// so that we can force legacy drivers to start after the system is initialized.
|
|
//
|
|
|
|
BOOLEAN VpSystemInitialized = FALSE;
|
|
|
|
//
|
|
// Track whether we are running AC or DC.
|
|
//
|
|
// By default, this will be true. If we are actually running on DC, when we boot,
|
|
// VpPowerStateCallback will be called notifying us. If we are running on AC, we
|
|
// will not be called. We will therefore assume AC and track the state in
|
|
// VpSetLCDPowerUsage.
|
|
//
|
|
|
|
BOOLEAN VpRunningOnAC = TRUE;
|
|
|
|
//
|
|
// We track the state of the backlight in this structure.
|
|
//
|
|
|
|
BACKLIGHT_STATUS VpBacklightStatus;
|
|
|
|
//
|
|
// Most laptops respond incorrectly to HwSetPowerState calls
|
|
// on lid close. By default, we will support the XP behavior
|
|
// and not notify the miniport on lid close.
|
|
//
|
|
|
|
BOOLEAN VpLidCloseSetPower = FALSE;
|
|
|
|
//
|
|
// This structure describes to which ports access is required.
|
|
//
|
|
|
|
#define MEM_VGA 0xA0000
|
|
#define MEM_VGA_SIZE 0x20000
|
|
#define VGA_BASE_IO_PORT 0x000003B0
|
|
#define VGA_START_BREAK_PORT 0x000003BB
|
|
#define VGA_END_BREAK_PORT 0x000003C0
|
|
#define VGA_MAX_IO_PORT 0x000003DF
|
|
|
|
|
|
PVIDEO_ACCESS_RANGE VgaAccessRanges = NULL;
|
|
ULONG NumVgaAccessRanges = 0;
|
|
PDEVICE_OBJECT DeviceOwningVga = NULL;
|
|
|
|
|
|
VIDEO_ACCESS_RANGE VgaLegacyResources[NUM_VGA_LEGACY_RESOURCES] = {
|
|
{
|
|
VGA_BASE_IO_PORT, 0x00000000,
|
|
VGA_START_BREAK_PORT - VGA_BASE_IO_PORT+ 1,
|
|
1,
|
|
1,
|
|
1
|
|
},
|
|
{
|
|
VGA_END_BREAK_PORT, 0x00000000,
|
|
VGA_MAX_IO_PORT - VGA_END_BREAK_PORT + 1,
|
|
1,
|
|
1,
|
|
1
|
|
},
|
|
{
|
|
MEM_VGA, 0x00000000,
|
|
MEM_VGA_SIZE,
|
|
0,
|
|
1,
|
|
1
|
|
}
|
|
};
|
|
|
|
//
|
|
// Control Whether or not the bottom MEG of the CSR address space has
|
|
// already been committed.
|
|
//
|
|
|
|
ULONG ServerBiosAddressSpaceInitialized = 0;
|
|
BOOLEAN Int10BufferAllocated = FALSE;
|
|
|
|
#if defined(_IA64_) || defined(_AMD64_)
|
|
PUCHAR BiosTransferArea = NULL;
|
|
#endif
|
|
|
|
#if DBG
|
|
|
|
CHAR *BusType[] = { "Internal",
|
|
"Isa",
|
|
"Eisa",
|
|
"MicroChannel",
|
|
"TurboChannel",
|
|
"PCIBus",
|
|
"VMEBus",
|
|
"NuBus",
|
|
"PCMCIABus",
|
|
"CBus",
|
|
"MPIBus",
|
|
"MPSABus",
|
|
"ProcessorInternal",
|
|
"InternalPowerBus",
|
|
"PNPISABus",
|
|
"MaximumInterfaceType"
|
|
};
|
|
#endif
|
|
|
|
PROC_ADDRESS VideoPortEntryPoints[] =
|
|
{
|
|
PROC(VideoPortDDCMonitorHelper),
|
|
PROC(VideoPortDoDma),
|
|
PROC(VideoPortGetCommonBuffer),
|
|
PROC(VideoPortGetMdl),
|
|
PROC(VideoPortLockPages),
|
|
PROC(VideoPortSignalDmaComplete),
|
|
PROC(VideoPortUnlockPages),
|
|
PROC(VideoPortAssociateEventsWithDmaHandle),
|
|
PROC(VideoPortGetBytesUsed),
|
|
PROC(VideoPortSetBytesUsed),
|
|
PROC(VideoPortGetDmaContext),
|
|
PROC(VideoPortSetDmaContext),
|
|
PROC(VideoPortMapDmaMemory),
|
|
PROC(VideoPortUnmapDmaMemory),
|
|
PROC(VideoPortGetAgpServices),
|
|
PROC(VideoPortAllocateContiguousMemory),
|
|
PROC(VideoPortGetRomImage),
|
|
PROC(VideoPortGetAssociatedDeviceExtension),
|
|
PROC(VideoPortGetAssociatedDeviceID),
|
|
PROC(VideoPortAcquireDeviceLock),
|
|
PROC(VideoPortReleaseDeviceLock),
|
|
PROC(VideoPortAllocateBuffer),
|
|
PROC(VideoPortFreeCommonBuffer),
|
|
PROC(VideoPortMapDmaMemory),
|
|
PROC(VideoPortReleaseBuffer),
|
|
PROC(VideoPortInterlockedIncrement),
|
|
PROC(VideoPortInterlockedDecrement),
|
|
PROC(VideoPortInterlockedExchange),
|
|
PROC(VideoPortGetVgaStatus),
|
|
PROC(VideoPortQueueDpc),
|
|
PROC(VideoPortEnumerateChildren),
|
|
PROC(VideoPortQueryServices),
|
|
PROC(VideoPortGetDmaAdapter),
|
|
PROC(VideoPortPutDmaAdapter),
|
|
PROC(VideoPortAllocateCommonBuffer),
|
|
PROC(VideoPortReleaseCommonBuffer),
|
|
PROC(VideoPortLockBuffer),
|
|
PROC(VideoPortUnlockBuffer),
|
|
PROC(VideoPortStartDma),
|
|
PROC(VideoPortCompleteDma),
|
|
PROC(VideoPortCreateEvent),
|
|
PROC(VideoPortDeleteEvent),
|
|
PROC(VideoPortSetEvent),
|
|
PROC(VideoPortClearEvent),
|
|
PROC(VideoPortReadStateEvent),
|
|
PROC(VideoPortWaitForSingleObject),
|
|
PROC(VideoPortAllocatePool),
|
|
PROC(VideoPortFreePool),
|
|
PROC(VideoPortCreateSpinLock),
|
|
PROC(VideoPortDeleteSpinLock),
|
|
PROC(VideoPortAcquireSpinLock),
|
|
PROC(VideoPortAcquireSpinLockAtDpcLevel),
|
|
PROC(VideoPortReleaseSpinLock),
|
|
PROC(VideoPortReleaseSpinLockFromDpcLevel),
|
|
PROC(VideoPortCheckForDeviceExistence),
|
|
PROC(VideoPortCreateSecondaryDisplay),
|
|
PROC(VideoPortFlushRegistry),
|
|
PROC(VideoPortQueryPerformanceCounter),
|
|
PROC(VideoPortGetVersion),
|
|
PROC(VideoPortRegisterBugcheckCallback),
|
|
{NULL, NULL}
|
|
};
|