2 * PROJECT: ReactOS Boot Loader
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/video/miniport/vmx_svga/vmx_svga.c
5 * PURPOSE: VMWARE SVGA-II Card Main Driver File
6 * PROGRAMMERS: ReactOS Portable Systems Group
9 /* INCLUDES *******************************************************************/
14 /* GLOBALS ********************************************************************/
16 PHW_DEVICE_EXTENSION VmxDeviceExtensionArray
[SVGA_MAX_DISPLAYS
];
17 static WCHAR AdapterString
[] = L
"VMware SVGA II";
19 /* FUNCTIONS ******************************************************************/
23 VmxReadUlong(IN PHW_DEVICE_EXTENSION DeviceExtension
,
26 /* Program the index first, then read the value */
27 VideoPortWritePortUlong(DeviceExtension
->IndexPort
, Index
);
28 return VideoPortReadPortUlong(DeviceExtension
->ValuePort
);
33 VmxWriteUlong(IN PHW_DEVICE_EXTENSION DeviceExtension
,
37 /* Program the index first, then write the value */
38 VideoPortWritePortUlong(DeviceExtension
->IndexPort
, Index
);
39 VideoPortWritePortUlong(DeviceExtension
->ValuePort
, Value
);
44 VmxInitModes(IN PHW_DEVICE_EXTENSION DeviceExtension
)
54 VmxInitDevice(IN PHW_DEVICE_EXTENSION DeviceExtension
)
64 VmxIsMultiMon(IN PHW_DEVICE_EXTENSION DeviceExtension
)
69 Capabilities
= DeviceExtension
->Capabilities
;
71 /* Check for multi-mon support */
72 if ((Capabilities
& SVGA_CAP_MULTIMON
) && (Capabilities
& SVGA_CAP_PITCHLOCK
))
74 /* Query the monitor count */
75 if (VmxReadUlong(DeviceExtension
, SVGA_REG_NUM_DISPLAYS
) > 1) return TRUE
;
78 /* Either no support, or just one screen */
84 VmxFindAdapter(IN PVOID HwDeviceExtension
,
86 IN PWSTR ArgumentString
,
87 IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo
,
91 PHW_DEVICE_EXTENSION DeviceExtension
= HwDeviceExtension
;
92 DPRINT1("VMX searching for adapter\n");
94 /* Zero out the fields */
95 VideoPortZeroMemory(DeviceExtension
, sizeof(HW_DEVICE_EXTENSION
));
97 /* Validate the Config Info */
98 if (ConfigInfo
->Length
< sizeof(VIDEO_PORT_CONFIG_INFO
))
100 /* Incorrect OS version? */
101 DPRINT1("Invalid configuration info\n");
102 return ERROR_INVALID_PARAMETER
;
105 /* Initialize the device extension and find the adapter */
106 Status
= VmxInitDevice(DeviceExtension
);
107 DPRINT1("Init status: %lx\n", Status
);
108 if (Status
!= NO_ERROR
) return ERROR_DEV_NOT_EXIST
;
110 /* Save this adapter extension */
111 VmxDeviceExtensionArray
[0] = DeviceExtension
;
113 /* Create the sync event */
114 VideoPortCreateEvent(DeviceExtension
,
117 &DeviceExtension
->SyncEvent
);
119 /* Check for multi-monitor configuration */
120 if (VmxIsMultiMon(DeviceExtension
))
122 /* Let's not go so far */
127 /* Zero the frame buffer */
128 VideoPortZeroMemory((PVOID
)DeviceExtension
->FrameBuffer
.LowPart
,
129 DeviceExtension
->VramSize
.LowPart
);
131 /* Initialize the video modes */
132 VmxInitModes(DeviceExtension
);
134 /* Setup registry keys */
135 VideoPortSetRegistryParameters(DeviceExtension
,
136 L
"HardwareInformation.ChipType",
138 sizeof(AdapterString
));
139 VideoPortSetRegistryParameters(DeviceExtension
,
140 L
"HardwareInformation.DacType",
142 sizeof(AdapterString
));
143 VideoPortSetRegistryParameters(DeviceExtension
,
144 L
"HardwareInformation.MemorySize",
145 &DeviceExtension
->VramSize
.LowPart
,
147 VideoPortSetRegistryParameters(DeviceExtension
,
148 L
"HardwareInformation.AdapterString",
150 sizeof(AdapterString
));
151 VideoPortSetRegistryParameters(DeviceExtension
,
152 L
"HardwareInformation.BiosString",
154 sizeof(AdapterString
));
157 ConfigInfo
->NumEmulatorAccessEntries
= 0;
158 ConfigInfo
->EmulatorAccessEntries
= 0;
159 ConfigInfo
->EmulatorAccessEntriesContext
= 0;
160 ConfigInfo
->HardwareStateSize
= 0;
161 ConfigInfo
->VdmPhysicalVideoMemoryAddress
.QuadPart
= 0;
162 ConfigInfo
->VdmPhysicalVideoMemoryLength
= 0;
164 /* Write that this is Windows XP or higher */
165 VmxWriteUlong(DeviceExtension
, SVGA_REG_GUEST_ID
, 0x5000 | 0x08);
171 VmxInitialize(IN PVOID HwDeviceExtension
)
180 VmxStartIO(IN PVOID HwDeviceExtension
,
181 IN PVIDEO_REQUEST_PACKET RequestPacket
)
190 VmxResetHw(IN PVOID DeviceExtension
,
201 VmxGetPowerState(IN PVOID HwDeviceExtension
,
203 IN PVIDEO_POWER_MANAGEMENT VideoPowerControl
)
212 VmxSetPowerState(IN PVOID HwDeviceExtension
,
214 IN PVIDEO_POWER_MANAGEMENT VideoPowerControl
)
223 VmxInterrupt(IN PVOID HwDeviceExtension
)
232 VmxGetVideoChildDescriptor(IN PVOID HwDeviceExtension
,
233 IN PVIDEO_CHILD_ENUM_INFO ChildEnumInfo
,
234 OUT PVIDEO_CHILD_TYPE VideoChildType
,
235 OUT PUCHAR pChildDescriptor
,
246 DriverEntry(IN PVOID Context1
,
249 VIDEO_HW_INITIALIZATION_DATA InitData
;
251 /* Zero initialization structure and array of extensions, one per screen */
252 DPRINT1("VMX-SVGAII Loading...\n");
253 VideoPortZeroMemory(VmxDeviceExtensionArray
, sizeof(VmxDeviceExtensionArray
));
254 VideoPortZeroMemory(&InitData
, sizeof(InitData
));
256 /* Setup the initialization structure with VideoPort */
257 InitData
.HwInitDataSize
= sizeof(VIDEO_HW_INITIALIZATION_DATA
);
258 InitData
.HwFindAdapter
= VmxFindAdapter
;
259 InitData
.HwInitialize
= VmxInitialize
;
260 InitData
.HwInterrupt
= VmxInterrupt
;
261 InitData
.HwStartIO
= VmxStartIO
;
262 InitData
.HwResetHw
= VmxResetHw
;
263 InitData
.HwGetPowerState
= VmxGetPowerState
;
264 InitData
.HwSetPowerState
= VmxSetPowerState
;
265 InitData
.HwGetVideoChildDescriptor
= VmxGetVideoChildDescriptor
;
266 InitData
.AdapterInterfaceType
= PCIBus
;
267 InitData
.HwInitDataSize
= sizeof(VIDEO_HW_INITIALIZATION_DATA
);
268 InitData
.HwDeviceExtensionSize
= sizeof(HW_DEVICE_EXTENSION
);
269 return VideoPortInitialize(Context1
, Context2
, &InitData
, NULL
);