diff --git a/win32ss/drivers/miniport/xboxvmp/xboxvmp.c b/win32ss/drivers/miniport/xboxvmp/xboxvmp.c index 6fabde00fd0..b9d3acb47d7 100644 --- a/win32ss/drivers/miniport/xboxvmp/xboxvmp.c +++ b/win32ss/drivers/miniport/xboxvmp/xboxvmp.c @@ -1,23 +1,10 @@ /* - * ReactOS Xbox miniport video driver - * Copyright (C) 2004 Gé van Geldorp - * - * Based on VBE miniport video driver - * Copyright (C) 2004 Filip Navara - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * PROJECT: ReactOS Xbox miniport video driver + * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) + * PURPOSE: Simple framebuffer driver for NVIDIA NV2A XGPU + * COPYRIGHT: Copyright 2004 Gé van Geldorp + * Copyright 2004 Filip Navara + * Copyright 2019 Stanislav Motylkov (x86corez@gmail.com) * * TODO: * - Check input parameters everywhere. @@ -35,23 +22,26 @@ /* PUBLIC AND PRIVATE FUNCTIONS ***********************************************/ -ULONG NTAPI -DriverEntry(IN PVOID Context1, IN PVOID Context2) +ULONG +NTAPI +DriverEntry( + IN PVOID Context1, + IN PVOID Context2) { - VIDEO_HW_INITIALIZATION_DATA InitData; + VIDEO_HW_INITIALIZATION_DATA InitData; - VideoPortZeroMemory(&InitData, sizeof(InitData)); - InitData.AdapterInterfaceType = PCIBus; - InitData.HwInitDataSize = sizeof(VIDEO_HW_INITIALIZATION_DATA); - InitData.HwFindAdapter = XboxVmpFindAdapter; - InitData.HwInitialize = XboxVmpInitialize; - InitData.HwStartIO = XboxVmpStartIO; - InitData.HwResetHw = XboxVmpResetHw; - InitData.HwGetPowerState = XboxVmpGetPowerState; - InitData.HwSetPowerState = XboxVmpSetPowerState; - InitData.HwDeviceExtensionSize = sizeof(XBOXVMP_DEVICE_EXTENSION); + VideoPortZeroMemory(&InitData, sizeof(InitData)); + InitData.AdapterInterfaceType = PCIBus; + InitData.HwInitDataSize = sizeof(VIDEO_HW_INITIALIZATION_DATA); + InitData.HwFindAdapter = XboxVmpFindAdapter; + InitData.HwInitialize = XboxVmpInitialize; + InitData.HwStartIO = XboxVmpStartIO; + InitData.HwResetHw = XboxVmpResetHw; + InitData.HwGetPowerState = XboxVmpGetPowerState; + InitData.HwSetPowerState = XboxVmpSetPowerState; + InitData.HwDeviceExtensionSize = sizeof(XBOXVMP_DEVICE_EXTENSION); - return VideoPortInitialize(Context1, Context2, &InitData, NULL); + return VideoPortInitialize(Context1, Context2, &InitData, NULL); } /* @@ -60,34 +50,36 @@ DriverEntry(IN PVOID Context1, IN PVOID Context2) * Detects the Xbox Nvidia display adapter. */ -VP_STATUS NTAPI +VP_STATUS +NTAPI XboxVmpFindAdapter( - IN PVOID HwDeviceExtension, - IN PVOID HwContext, - IN PWSTR ArgumentString, - IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo, - OUT PUCHAR Again) + IN PVOID HwDeviceExtension, + IN PVOID HwContext, + IN PWSTR ArgumentString, + IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo, + OUT PUCHAR Again) { - PXBOXVMP_DEVICE_EXTENSION XboxVmpDeviceExtension; - VIDEO_ACCESS_RANGE AccessRanges[3]; - VP_STATUS Status; - USHORT VendorId = 0x10DE; /* NVIDIA Corporation */ - USHORT DeviceId = 0x02A0; /* NV2A XGPU */ + PXBOXVMP_DEVICE_EXTENSION XboxVmpDeviceExtension; + VIDEO_ACCESS_RANGE AccessRanges[3]; + VP_STATUS Status; + USHORT VendorId = 0x10DE; /* NVIDIA Corporation */ + USHORT DeviceId = 0x02A0; /* NV2A XGPU */ - VideoPortDebugPrint(Trace, "XboxVmpFindAdapter\n"); + VideoPortDebugPrint(Trace, "XboxVmpFindAdapter\n"); - XboxVmpDeviceExtension = (PXBOXVMP_DEVICE_EXTENSION) HwDeviceExtension; - Status = VideoPortGetAccessRanges(HwDeviceExtension, 0, NULL, 3, AccessRanges, - &VendorId, &DeviceId, NULL); + XboxVmpDeviceExtension = (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension; - if (Status == NO_ERROR) - { - XboxVmpDeviceExtension->PhysControlStart = AccessRanges[0].RangeStart; - XboxVmpDeviceExtension->ControlLength = AccessRanges[0].RangeLength; - XboxVmpDeviceExtension->PhysFrameBufferStart = AccessRanges[1].RangeStart; - } + Status = VideoPortGetAccessRanges(HwDeviceExtension, 0, NULL, 3, AccessRanges, + &VendorId, &DeviceId, NULL); - return Status; + if (Status == NO_ERROR) + { + XboxVmpDeviceExtension->PhysControlStart = AccessRanges[0].RangeStart; + XboxVmpDeviceExtension->ControlLength = AccessRanges[0].RangeLength; + XboxVmpDeviceExtension->PhysFrameBufferStart = AccessRanges[1].RangeStart; + } + + return Status; } /* @@ -97,33 +89,38 @@ XboxVmpFindAdapter( * up control of the video hardware to the video port driver. */ -BOOLEAN NTAPI -XboxVmpInitialize(PVOID HwDeviceExtension) +BOOLEAN +NTAPI +XboxVmpInitialize( + PVOID HwDeviceExtension) { - PXBOXVMP_DEVICE_EXTENSION XboxVmpDeviceExtension; - ULONG inIoSpace = VIDEO_MEMORY_SPACE_MEMORY; - ULONG Length; + PXBOXVMP_DEVICE_EXTENSION XboxVmpDeviceExtension; + ULONG inIoSpace = VIDEO_MEMORY_SPACE_MEMORY; + ULONG Length; - VideoPortDebugPrint(Trace, "XboxVmpInitialize\n"); + VideoPortDebugPrint(Trace, "XboxVmpInitialize\n"); - XboxVmpDeviceExtension = (PXBOXVMP_DEVICE_EXTENSION) HwDeviceExtension; + XboxVmpDeviceExtension = (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension; - Length = XboxVmpDeviceExtension->ControlLength; - XboxVmpDeviceExtension->VirtControlStart = NULL; - if (NO_ERROR != VideoPortMapMemory(HwDeviceExtension, - XboxVmpDeviceExtension->PhysControlStart, - &Length, &inIoSpace, - &XboxVmpDeviceExtension->VirtControlStart)) + Length = XboxVmpDeviceExtension->ControlLength; + XboxVmpDeviceExtension->VirtControlStart = NULL; + + if (VideoPortMapMemory(HwDeviceExtension, + XboxVmpDeviceExtension->PhysControlStart, + &Length, + &inIoSpace, + &XboxVmpDeviceExtension->VirtControlStart) != NO_ERROR) { - VideoPortDebugPrint(Error, "Failed to map control memory\n"); - return FALSE; + VideoPortDebugPrint(Error, "Failed to map control memory\n"); + return FALSE; } - VideoPortDebugPrint(Info, "Mapped 0x%x bytes of control mem at 0x%x to virt addr 0x%x\n", - XboxVmpDeviceExtension->ControlLength, - XboxVmpDeviceExtension->PhysControlStart.u.LowPart, - XboxVmpDeviceExtension->VirtControlStart); - return TRUE; + VideoPortDebugPrint(Info, "Mapped 0x%x bytes of control mem at 0x%x to virt addr 0x%x\n", + XboxVmpDeviceExtension->ControlLength, + XboxVmpDeviceExtension->PhysControlStart.u.LowPart, + XboxVmpDeviceExtension->VirtControlStart); + + return TRUE; } /* @@ -132,116 +129,147 @@ XboxVmpInitialize(PVOID HwDeviceExtension) * Processes the specified Video Request Packet. */ -BOOLEAN NTAPI +BOOLEAN +NTAPI XboxVmpStartIO( - PVOID HwDeviceExtension, - PVIDEO_REQUEST_PACKET RequestPacket) + PVOID HwDeviceExtension, + PVIDEO_REQUEST_PACKET RequestPacket) { - BOOLEAN Result; + BOOLEAN Result; - RequestPacket->StatusBlock->Status = ERROR_INVALID_PARAMETER; + RequestPacket->StatusBlock->Status = ERROR_INVALID_PARAMETER; - switch (RequestPacket->IoControlCode) + switch (RequestPacket->IoControlCode) { - case IOCTL_VIDEO_SET_CURRENT_MODE: - VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_SET_CURRENT_MODE\n"); - if (RequestPacket->InputBufferLength < sizeof(VIDEO_MODE)) - { - RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; - return TRUE; - } - Result = XboxVmpSetCurrentMode( - (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, - (PVIDEO_MODE)RequestPacket->InputBuffer, - RequestPacket->StatusBlock); - break; + case IOCTL_VIDEO_SET_CURRENT_MODE: + { + VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_SET_CURRENT_MODE\n"); - case IOCTL_VIDEO_RESET_DEVICE: - VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_RESET_DEVICE\n"); - Result = XboxVmpResetDevice( - (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, - RequestPacket->StatusBlock); - break; + if (RequestPacket->InputBufferLength < sizeof(VIDEO_MODE)) + { + RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; + return TRUE; + } - case IOCTL_VIDEO_MAP_VIDEO_MEMORY: - VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_MAP_VIDEO_MEMORY\n"); - if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MEMORY_INFORMATION) || - RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY)) - { - RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; - return TRUE; - } - Result = XboxVmpMapVideoMemory( - (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, - (PVIDEO_MEMORY)RequestPacket->InputBuffer, - (PVIDEO_MEMORY_INFORMATION)RequestPacket->OutputBuffer, - RequestPacket->StatusBlock); - break; + Result = XboxVmpSetCurrentMode( + (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, + (PVIDEO_MODE)RequestPacket->InputBuffer, + RequestPacket->StatusBlock); + break; + } - case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY: - VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_UNMAP_VIDEO_MEMORY\n"); - if (RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY)) - { - RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; - return TRUE; - } - Result = XboxVmpUnmapVideoMemory( - (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, - (PVIDEO_MEMORY)RequestPacket->InputBuffer, - RequestPacket->StatusBlock); - break; + case IOCTL_VIDEO_RESET_DEVICE: + { + VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_RESET_DEVICE\n"); - case IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES: - VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES\n"); - if (RequestPacket->OutputBufferLength < sizeof(VIDEO_NUM_MODES)) - { - RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; - return TRUE; - } - Result = XboxVmpQueryNumAvailModes( - (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, - (PVIDEO_NUM_MODES)RequestPacket->OutputBuffer, - RequestPacket->StatusBlock); - break; + Result = XboxVmpResetDevice( + (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, + RequestPacket->StatusBlock); + break; + } - case IOCTL_VIDEO_QUERY_AVAIL_MODES: - VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_QUERY_AVAIL_MODES\n"); - if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MODE_INFORMATION)) - { - RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; - return TRUE; - } - Result = XboxVmpQueryAvailModes( - (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, - (PVIDEO_MODE_INFORMATION)RequestPacket->OutputBuffer, - RequestPacket->StatusBlock); - break; + case IOCTL_VIDEO_MAP_VIDEO_MEMORY: + { + VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_MAP_VIDEO_MEMORY\n"); - case IOCTL_VIDEO_QUERY_CURRENT_MODE: - VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_QUERY_CURRENT_MODE\n"); - if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MODE_INFORMATION)) - { - RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; - return TRUE; - } - Result = XboxVmpQueryCurrentMode( - (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, - (PVIDEO_MODE_INFORMATION)RequestPacket->OutputBuffer, - RequestPacket->StatusBlock); - break; + if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MEMORY_INFORMATION) || + RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY)) + { + RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; + return TRUE; + } - default: - VideoPortDebugPrint(Warn, "XboxVmpStartIO 0x%x not implemented\n"); - RequestPacket->StatusBlock->Status = ERROR_INVALID_FUNCTION; - return FALSE; + Result = XboxVmpMapVideoMemory( + (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, + (PVIDEO_MEMORY)RequestPacket->InputBuffer, + (PVIDEO_MEMORY_INFORMATION)RequestPacket->OutputBuffer, + RequestPacket->StatusBlock); + break; + } + + case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY: + { + VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_UNMAP_VIDEO_MEMORY\n"); + + if (RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY)) + { + RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; + return TRUE; + } + + Result = XboxVmpUnmapVideoMemory( + (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, + (PVIDEO_MEMORY)RequestPacket->InputBuffer, + RequestPacket->StatusBlock); + break; + } + + case IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES: + { + VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES\n"); + + if (RequestPacket->OutputBufferLength < sizeof(VIDEO_NUM_MODES)) + { + RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; + return TRUE; + } + + Result = XboxVmpQueryNumAvailModes( + (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, + (PVIDEO_NUM_MODES)RequestPacket->OutputBuffer, + RequestPacket->StatusBlock); + break; + } + + case IOCTL_VIDEO_QUERY_AVAIL_MODES: + { + VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_QUERY_AVAIL_MODES\n"); + + if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MODE_INFORMATION)) + { + RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; + return TRUE; + } + + Result = XboxVmpQueryAvailModes( + (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, + (PVIDEO_MODE_INFORMATION)RequestPacket->OutputBuffer, + RequestPacket->StatusBlock); + break; + } + + case IOCTL_VIDEO_QUERY_CURRENT_MODE: + { + VideoPortDebugPrint(Trace, "XboxVmpStartIO IOCTL_VIDEO_QUERY_CURRENT_MODE\n"); + + if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MODE_INFORMATION)) + { + RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; + return TRUE; + } + + Result = XboxVmpQueryCurrentMode( + (PXBOXVMP_DEVICE_EXTENSION)HwDeviceExtension, + (PVIDEO_MODE_INFORMATION)RequestPacket->OutputBuffer, + RequestPacket->StatusBlock); + break; + } + + default: + { + VideoPortDebugPrint(Warn, "XboxVmpStartIO 0x%x not implemented\n"); + + RequestPacket->StatusBlock->Status = ERROR_INVALID_FUNCTION; + return FALSE; + } } - if (Result) + if (Result) { - RequestPacket->StatusBlock->Status = NO_ERROR; + RequestPacket->StatusBlock->Status = NO_ERROR; } - return TRUE; + return TRUE; } /* @@ -250,20 +278,21 @@ XboxVmpStartIO( * This function is called to reset the hardware to a known state. */ -BOOLEAN NTAPI +BOOLEAN +NTAPI XboxVmpResetHw( - PVOID DeviceExtension, - ULONG Columns, - ULONG Rows) + PVOID DeviceExtension, + ULONG Columns, + ULONG Rows) { - VideoPortDebugPrint(Trace, "XboxVmpResetHw\n"); + VideoPortDebugPrint(Trace, "XboxVmpResetHw\n"); - if (! XboxVmpResetDevice((PXBOXVMP_DEVICE_EXTENSION) DeviceExtension, NULL)) + if (!XboxVmpResetDevice((PXBOXVMP_DEVICE_EXTENSION)DeviceExtension, NULL)) { - return FALSE; + return FALSE; } - return TRUE; + return TRUE; } /* @@ -272,15 +301,16 @@ XboxVmpResetHw( * Queries whether the device can support the requested power state. */ -VP_STATUS NTAPI +VP_STATUS +NTAPI XboxVmpGetPowerState( - PVOID HwDeviceExtension, - ULONG HwId, - PVIDEO_POWER_MANAGEMENT VideoPowerControl) + PVOID HwDeviceExtension, + ULONG HwId, + PVIDEO_POWER_MANAGEMENT VideoPowerControl) { - VideoPortDebugPrint(Error, "XboxVmpGetPowerState is not supported\n"); + VideoPortDebugPrint(Error, "XboxVmpGetPowerState is not supported\n"); - return ERROR_INVALID_FUNCTION; + return ERROR_INVALID_FUNCTION; } /* @@ -289,15 +319,16 @@ XboxVmpGetPowerState( * Sets the power state of the specified device */ -VP_STATUS NTAPI +VP_STATUS +NTAPI XboxVmpSetPowerState( - PVOID HwDeviceExtension, - ULONG HwId, - PVIDEO_POWER_MANAGEMENT VideoPowerControl) + PVOID HwDeviceExtension, + ULONG HwId, + PVIDEO_POWER_MANAGEMENT VideoPowerControl) { - VideoPortDebugPrint(Error, "XboxVmpSetPowerState not supported\n"); + VideoPortDebugPrint(Error, "XboxVmpSetPowerState not supported\n"); - return ERROR_INVALID_FUNCTION; + return ERROR_INVALID_FUNCTION; } /* @@ -306,20 +337,22 @@ XboxVmpSetPowerState( * Sets the adapter to the specified operating mode. */ -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpSetCurrentMode( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PVIDEO_MODE RequestedMode, - PSTATUS_BLOCK StatusBlock) + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MODE RequestedMode, + PSTATUS_BLOCK StatusBlock) { - if (0 != RequestedMode->RequestedMode) + if (RequestedMode->RequestedMode != 0) { - return FALSE; + return FALSE; } - /* Nothing to do, really. We only support a single mode and we're already - in that mode */ - return TRUE; + /* Nothing to do, really. We only support a single mode and we're already + * in that mode + */ + return TRUE; } /* @@ -329,14 +362,15 @@ XboxVmpSetCurrentMode( * at system boot. */ -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpResetDevice( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PSTATUS_BLOCK StatusBlock) + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PSTATUS_BLOCK StatusBlock) { - /* There is nothing to be done here */ + /* There is nothing to be done here */ - return TRUE; + return TRUE; } /* @@ -346,52 +380,57 @@ XboxVmpResetDevice( * space of the requestor. */ -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpMapVideoMemory( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PVIDEO_MEMORY RequestedAddress, - PVIDEO_MEMORY_INFORMATION MapInformation, - PSTATUS_BLOCK StatusBlock) + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MEMORY RequestedAddress, + PVIDEO_MEMORY_INFORMATION MapInformation, + PSTATUS_BLOCK StatusBlock) { - PHYSICAL_ADDRESS FrameBuffer; - ULONG inIoSpace = VIDEO_MEMORY_SPACE_MEMORY; - SYSTEM_BASIC_INFORMATION BasicInfo; - ULONG Length; + PHYSICAL_ADDRESS FrameBuffer; + ULONG inIoSpace = VIDEO_MEMORY_SPACE_MEMORY; + SYSTEM_BASIC_INFORMATION BasicInfo; + ULONG Length; - /* FIXME: this should probably be done differently, without native API */ - StatusBlock->Information = sizeof(VIDEO_MEMORY_INFORMATION); + /* FIXME: this should probably be done differently, without native API */ + StatusBlock->Information = sizeof(VIDEO_MEMORY_INFORMATION); - FrameBuffer.u.HighPart = 0; - if (ZwQuerySystemInformation(SystemBasicInformation, - (PVOID) &BasicInfo, - sizeof(SYSTEM_BASIC_INFORMATION), - &Length) == NO_ERROR) + FrameBuffer.u.HighPart = 0; + if (ZwQuerySystemInformation(SystemBasicInformation, + (PVOID)&BasicInfo, + sizeof(SYSTEM_BASIC_INFORMATION), + &Length) == NO_ERROR) { - FrameBuffer.u.LowPart = BasicInfo.HighestPhysicalPageNumber * PAGE_SIZE; + FrameBuffer.u.LowPart = BasicInfo.HighestPhysicalPageNumber * PAGE_SIZE; } - else + else { - VideoPortDebugPrint(Error, "ZwQueryBasicInformation failed, assuming 64MB total memory\n"); - FrameBuffer.u.LowPart = 60 * 1024 * 1024; + VideoPortDebugPrint(Error, "ZwQueryBasicInformation failed, assuming 64MB total memory\n"); + FrameBuffer.u.LowPart = 60 * 1024 * 1024; } - FrameBuffer.QuadPart += DeviceExtension->PhysFrameBufferStart.QuadPart; - MapInformation->VideoRamBase = RequestedAddress->RequestedVirtualAddress; - MapInformation->VideoRamLength = 4 * 1024 * 1024; - VideoPortMapMemory(DeviceExtension, FrameBuffer, - &MapInformation->VideoRamLength, &inIoSpace, - &MapInformation->VideoRamBase); + FrameBuffer.QuadPart += DeviceExtension->PhysFrameBufferStart.QuadPart; + MapInformation->VideoRamBase = RequestedAddress->RequestedVirtualAddress; + MapInformation->VideoRamLength = 4 * 1024 * 1024; - MapInformation->FrameBufferBase = MapInformation->VideoRamBase; - MapInformation->FrameBufferLength = MapInformation->VideoRamLength; + VideoPortMapMemory( + DeviceExtension, + FrameBuffer, + &MapInformation->VideoRamLength, + &inIoSpace, + &MapInformation->VideoRamBase); - /* Tell the nVidia controller about the framebuffer */ - *((PULONG)((char *) DeviceExtension->VirtControlStart + CONTROL_FRAMEBUFFER_ADDRESS_OFFSET)) = FrameBuffer.u.LowPart; + MapInformation->FrameBufferBase = MapInformation->VideoRamBase; + MapInformation->FrameBufferLength = MapInformation->VideoRamLength; - VideoPortDebugPrint(Info, "Mapped 0x%x bytes of phys mem at 0x%lx to virt addr 0x%p\n", - MapInformation->VideoRamLength, FrameBuffer.u.LowPart, MapInformation->VideoRamBase); + /* Tell the nVidia controller about the framebuffer */ + *((PULONG)((char *)DeviceExtension->VirtControlStart + CONTROL_FRAMEBUFFER_ADDRESS_OFFSET)) = FrameBuffer.u.LowPart; - return TRUE; + VideoPortDebugPrint(Info, "Mapped 0x%x bytes of phys mem at 0x%lx to virt addr 0x%p\n", + MapInformation->VideoRamLength, FrameBuffer.u.LowPart, MapInformation->VideoRamBase); + + return TRUE; } /* @@ -401,16 +440,19 @@ XboxVmpMapVideoMemory( * frame buffer and video RAM. */ -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpUnmapVideoMemory( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PVIDEO_MEMORY VideoMemory, - PSTATUS_BLOCK StatusBlock) + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MEMORY VideoMemory, + PSTATUS_BLOCK StatusBlock) { - VideoPortUnmapMemory(DeviceExtension, VideoMemory->RequestedVirtualAddress, - NULL); + VideoPortUnmapMemory( + DeviceExtension, + VideoMemory->RequestedVirtualAddress, + NULL); - return TRUE; + return TRUE; } /* @@ -421,100 +463,123 @@ XboxVmpUnmapVideoMemory( * buffer for an IOCTL_VIDEO_QUERY_AVAIL_MODES request. */ -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpQueryNumAvailModes( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PVIDEO_NUM_MODES Modes, - PSTATUS_BLOCK StatusBlock) + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PVIDEO_NUM_MODES Modes, + PSTATUS_BLOCK StatusBlock) { - Modes->NumModes = 1; - Modes->ModeInformationLength = sizeof(VIDEO_MODE_INFORMATION); - StatusBlock->Information = sizeof(VIDEO_NUM_MODES); - return TRUE; + Modes->NumModes = 1; + Modes->ModeInformationLength = sizeof(VIDEO_MODE_INFORMATION); + StatusBlock->Information = sizeof(VIDEO_NUM_MODES); + return TRUE; } -static BOOLEAN -ReadfromSMBus(UCHAR Address, UCHAR bRegister, UCHAR Size, ULONG *Data_to_smbus) +static +BOOLEAN +ReadfromSMBus( + UCHAR Address, + UCHAR bRegister, + UCHAR Size, + ULONG *Data_to_smbus) { - int nRetriesToLive=50; + int nRetriesToLive = 50; - while (0 != (VideoPortReadPortUshort((PUSHORT) (I2C_IO_BASE + 0)) & 0x0800)) + while ((VideoPortReadPortUshort((PUSHORT) (I2C_IO_BASE + 0)) & 0x0800) != 0) { - ; /* Franz's spin while bus busy with any master traffic */ + ; /* Franz's spin while bus busy with any master traffic */ } - while (0 != nRetriesToLive--) + while (nRetriesToLive-- != 0) { - UCHAR b; - int temp; + UCHAR b; + int temp; - VideoPortWritePortUchar((PUCHAR) (I2C_IO_BASE + 4), (Address << 1) | 1); - VideoPortWritePortUchar((PUCHAR) (I2C_IO_BASE + 8), bRegister); + VideoPortWritePortUchar((PUCHAR) (I2C_IO_BASE + 4), (Address << 1) | 1); + VideoPortWritePortUchar((PUCHAR) (I2C_IO_BASE + 8), bRegister); - temp = VideoPortReadPortUshort((PUSHORT) (I2C_IO_BASE + 0)); - VideoPortWritePortUshort((PUSHORT) (I2C_IO_BASE + 0), temp); /* clear down all preexisting errors */ + temp = VideoPortReadPortUshort((PUSHORT) (I2C_IO_BASE + 0)); + VideoPortWritePortUshort((PUSHORT) (I2C_IO_BASE + 0), temp); /* clear down all preexisting errors */ - switch (Size) + switch (Size) { - case 4: - VideoPortWritePortUchar((PUCHAR) (I2C_IO_BASE + 2), 0x0d); /* DWORD modus ? */ - break; - case 2: - VideoPortWritePortUchar((PUCHAR) (I2C_IO_BASE + 2), 0x0b); /* WORD modus */ - break; - default: - VideoPortWritePortUchar((PUCHAR) (I2C_IO_BASE + 2), 0x0a); // BYTE - break; - } - - b = 0; - - while (0 == (b & 0x36)) - { - b = VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 0)); - } - - if (0 != (b & 0x24)) - { - /* printf("I2CTransmitByteGetReturn error %x\n", b); */ - } - - if(0 == (b & 0x10)) - { - /* printf("I2CTransmitByteGetReturn no complete, retry\n"); */ - } - else - { - switch (Size) + case 4: { - case 4: - VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 6)); - VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 9)); - VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 9)); - VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 9)); - VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 9)); - break; - case 2: - *Data_to_smbus = VideoPortReadPortUshort((PUSHORT) (I2C_IO_BASE + 6)); - break; - default: - *Data_to_smbus = VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 6)); + VideoPortWritePortUchar((PUCHAR) (I2C_IO_BASE + 2), 0x0d); /* DWORD modus ? */ break; } + case 2: + { + VideoPortWritePortUchar((PUCHAR) (I2C_IO_BASE + 2), 0x0b); /* WORD modus */ + break; + } - return TRUE; + default: + { + VideoPortWritePortUchar((PUCHAR) (I2C_IO_BASE + 2), 0x0a); /* BYTE */ + } + } + + b = 0; + + while ((b & 0x36) == 0) + { + b = VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 0)); + } + + if ((b & 0x24) != 0) + { + /* printf("I2CTransmitByteGetReturn error %x\n", b); */ + } + + if ((b & 0x10) == 0) + { + /* printf("I2CTransmitByteGetReturn no complete, retry\n"); */ + } + else + { + switch (Size) + { + case 4: + { + VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 6)); + VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 9)); + VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 9)); + VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 9)); + VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 9)); + break; + } + + case 2: + { + *Data_to_smbus = VideoPortReadPortUshort((PUSHORT) (I2C_IO_BASE + 6)); + break; + } + + default: + { + *Data_to_smbus = VideoPortReadPortUchar((PUCHAR) (I2C_IO_BASE + 6)); + } + } + + return TRUE; } } - return FALSE; + return FALSE; } -static BOOLEAN -I2CTransmitByteGetReturn(UCHAR bPicAddressI2cFormat, UCHAR bDataToWrite, ULONG *Return) +static +BOOLEAN +I2CTransmitByteGetReturn( + UCHAR bPicAddressI2cFormat, + UCHAR bDataToWrite, + ULONG *Return) { - return ReadfromSMBus(bPicAddressI2cFormat, bDataToWrite, 1, Return); + return ReadfromSMBus(bPicAddressI2cFormat, bDataToWrite, 1, Return); } /* @@ -523,13 +588,14 @@ I2CTransmitByteGetReturn(UCHAR bPicAddressI2cFormat, UCHAR bDataToWrite, ULONG * * Returns information about each video mode supported by the adapter. */ -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpQueryAvailModes( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PVIDEO_MODE_INFORMATION VideoMode, - PSTATUS_BLOCK StatusBlock) + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MODE_INFORMATION VideoMode, + PSTATUS_BLOCK StatusBlock) { - return XboxVmpQueryCurrentMode(DeviceExtension, VideoMode, StatusBlock); + return XboxVmpQueryCurrentMode(DeviceExtension, VideoMode, StatusBlock); } /* @@ -538,61 +604,64 @@ XboxVmpQueryAvailModes( * Returns information about current video mode. */ -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpQueryCurrentMode( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PVIDEO_MODE_INFORMATION VideoMode, - PSTATUS_BLOCK StatusBlock) + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MODE_INFORMATION VideoMode, + PSTATUS_BLOCK StatusBlock) { - ULONG AvMode = 0; + ULONG AvMode = 0; - VideoMode->Length = sizeof(VIDEO_MODE_INFORMATION); - VideoMode->ModeIndex = 0; - if (I2CTransmitByteGetReturn(0x10, 0x04, &AvMode)) - { - if (1 == AvMode) /* HDTV */ - { - VideoMode->VisScreenWidth = 720; - } - else - { - /* FIXME Other possible values of AvMode: - * 0 - AV_SCART_RGB - * 2 - AV_VGA_SOG - * 4 - AV_SVIDEO - * 6 - AV_COMPOSITE - * 7 - AV_VGA - * other AV_COMPOSITE - */ - VideoMode->VisScreenWidth = 640; - } - } - else - { - VideoMode->VisScreenWidth = 640; - } - VideoMode->VisScreenHeight = 480; - VideoMode->ScreenStride = VideoMode->VisScreenWidth * 4; - VideoMode->NumberOfPlanes = 1; - VideoMode->BitsPerPlane = 32; - VideoMode->Frequency = 1; - VideoMode->XMillimeter = 0; /* FIXME */ - VideoMode->YMillimeter = 0; /* FIXME */ - VideoMode->NumberRedBits = 8; - VideoMode->NumberGreenBits = 8; - VideoMode->NumberBlueBits = 8; - VideoMode->RedMask = 0xff0000; - VideoMode->GreenMask = 0x00ff00; - VideoMode->BlueMask = 0x0000ff; - VideoMode->VideoMemoryBitmapWidth = VideoMode->VisScreenWidth; - VideoMode->VideoMemoryBitmapHeight = VideoMode->VisScreenHeight; - VideoMode->AttributeFlags = VIDEO_MODE_GRAPHICS | VIDEO_MODE_COLOR | - VIDEO_MODE_NO_OFF_SCREEN; - VideoMode->DriverSpecificAttributeFlags = 0; + VideoMode->Length = sizeof(VIDEO_MODE_INFORMATION); + VideoMode->ModeIndex = 0; - StatusBlock->Information = sizeof(VIDEO_MODE_INFORMATION); + if (I2CTransmitByteGetReturn(0x10, 0x04, &AvMode)) + { + if (AvMode == 1) /* HDTV */ + { + VideoMode->VisScreenWidth = 720; + } + else + { + /* FIXME Other possible values of AvMode: + * 0 - AV_SCART_RGB + * 2 - AV_VGA_SOG + * 4 - AV_SVIDEO + * 6 - AV_COMPOSITE + * 7 - AV_VGA + * other AV_COMPOSITE + */ + VideoMode->VisScreenWidth = 640; + } + } + else + { + VideoMode->VisScreenWidth = 640; + } - return TRUE; + VideoMode->VisScreenHeight = 480; + VideoMode->ScreenStride = VideoMode->VisScreenWidth * 4; + VideoMode->NumberOfPlanes = 1; + VideoMode->BitsPerPlane = 32; + VideoMode->Frequency = 1; + VideoMode->XMillimeter = 0; /* FIXME */ + VideoMode->YMillimeter = 0; /* FIXME */ + VideoMode->NumberRedBits = 8; + VideoMode->NumberGreenBits = 8; + VideoMode->NumberBlueBits = 8; + VideoMode->RedMask = 0xFF0000; + VideoMode->GreenMask = 0x00FF00; + VideoMode->BlueMask = 0x0000FF; + VideoMode->VideoMemoryBitmapWidth = VideoMode->VisScreenWidth; + VideoMode->VideoMemoryBitmapHeight = VideoMode->VisScreenHeight; + VideoMode->AttributeFlags = VIDEO_MODE_GRAPHICS | VIDEO_MODE_COLOR | + VIDEO_MODE_NO_OFF_SCREEN; + VideoMode->DriverSpecificAttributeFlags = 0; + + StatusBlock->Information = sizeof(VIDEO_MODE_INFORMATION); + + return TRUE; } /* EOF */ diff --git a/win32ss/drivers/miniport/xboxvmp/xboxvmp.h b/win32ss/drivers/miniport/xboxvmp/xboxvmp.h index 8afe0d645b4..804617dc706 100644 --- a/win32ss/drivers/miniport/xboxvmp/xboxvmp.h +++ b/win32ss/drivers/miniport/xboxvmp/xboxvmp.h @@ -1,23 +1,10 @@ /* - * ReactOS Xbox miniport video driver - * Copyright (C) 2004 Gé van Geldorp - * - * Based on VBE miniport video driver - * Copyright (C) 2004 Filip Navara - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * PROJECT: ReactOS Xbox miniport video driver + * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) + * PURPOSE: Simple framebuffer driver for NVIDIA NV2A XGPU + * COPYRIGHT: Copyright 2004 Ge van Geldorp + * Copyright 2004 Filip Navara + * Copyright 2019 Stanislav Motylkov (x86corez@gmail.com) */ #pragma once @@ -59,92 +46,107 @@ ZwQuerySystemInformation( typedef struct { - PHYSICAL_ADDRESS PhysControlStart; - ULONG ControlLength; - PVOID VirtControlStart; - PHYSICAL_ADDRESS PhysFrameBufferStart; + PHYSICAL_ADDRESS PhysControlStart; + ULONG ControlLength; + PVOID VirtControlStart; + PHYSICAL_ADDRESS PhysFrameBufferStart; } XBOXVMP_DEVICE_EXTENSION, *PXBOXVMP_DEVICE_EXTENSION; -VP_STATUS NTAPI +VP_STATUS +NTAPI XboxVmpFindAdapter( - IN PVOID HwDeviceExtension, - IN PVOID HwContext, - IN PWSTR ArgumentString, - IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo, - OUT PUCHAR Again); + IN PVOID HwDeviceExtension, + IN PVOID HwContext, + IN PWSTR ArgumentString, + IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo, + OUT PUCHAR Again); -BOOLEAN NTAPI -XboxVmpInitialize(PVOID HwDeviceExtension); +BOOLEAN +NTAPI +XboxVmpInitialize( + PVOID HwDeviceExtension); -BOOLEAN NTAPI +BOOLEAN +NTAPI XboxVmpStartIO( - PVOID HwDeviceExtension, - PVIDEO_REQUEST_PACKET RequestPacket); + PVOID HwDeviceExtension, + PVIDEO_REQUEST_PACKET RequestPacket); -BOOLEAN NTAPI +BOOLEAN +NTAPI XboxVmpResetHw( - PVOID DeviceExtension, - ULONG Columns, - ULONG Rows); + PVOID DeviceExtension, + ULONG Columns, + ULONG Rows); -VP_STATUS NTAPI +VP_STATUS +NTAPI XboxVmpGetPowerState( - PVOID HwDeviceExtension, - ULONG HwId, - PVIDEO_POWER_MANAGEMENT VideoPowerControl); + PVOID HwDeviceExtension, + ULONG HwId, + PVIDEO_POWER_MANAGEMENT VideoPowerControl); -VP_STATUS NTAPI +VP_STATUS +NTAPI XboxVmpSetPowerState( - PVOID HwDeviceExtension, - ULONG HwId, - PVIDEO_POWER_MANAGEMENT VideoPowerControl); + PVOID HwDeviceExtension, + ULONG HwId, + PVIDEO_POWER_MANAGEMENT VideoPowerControl); -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpSetCurrentMode( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PVIDEO_MODE RequestedMode, - PSTATUS_BLOCK StatusBlock); + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MODE RequestedMode, + PSTATUS_BLOCK StatusBlock); -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpResetDevice( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PSTATUS_BLOCK StatusBlock); + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PSTATUS_BLOCK StatusBlock); -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpMapVideoMemory( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PVIDEO_MEMORY RequestedAddress, - PVIDEO_MEMORY_INFORMATION MapInformation, - PSTATUS_BLOCK StatusBlock); + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MEMORY RequestedAddress, + PVIDEO_MEMORY_INFORMATION MapInformation, + PSTATUS_BLOCK StatusBlock); -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpUnmapVideoMemory( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PVIDEO_MEMORY VideoMemory, - PSTATUS_BLOCK StatusBlock); + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MEMORY VideoMemory, + PSTATUS_BLOCK StatusBlock); -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpQueryNumAvailModes( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PVIDEO_NUM_MODES Modes, - PSTATUS_BLOCK StatusBlock); + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PVIDEO_NUM_MODES Modes, + PSTATUS_BLOCK StatusBlock); -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpQueryAvailModes( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PVIDEO_MODE_INFORMATION ReturnedModes, - PSTATUS_BLOCK StatusBlock); + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MODE_INFORMATION ReturnedModes, + PSTATUS_BLOCK StatusBlock); -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpQueryCurrentMode( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PVIDEO_MODE_INFORMATION VideoModeInfo, - PSTATUS_BLOCK StatusBlock); + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MODE_INFORMATION VideoModeInfo, + PSTATUS_BLOCK StatusBlock); -BOOLEAN FASTCALL +BOOLEAN +FASTCALL XboxVmpSetColorRegisters( - PXBOXVMP_DEVICE_EXTENSION DeviceExtension, - PVIDEO_CLUT ColorLookUpTable, - PSTATUS_BLOCK StatusBlock); + PXBOXVMP_DEVICE_EXTENSION DeviceExtension, + PVIDEO_CLUT ColorLookUpTable, + PSTATUS_BLOCK StatusBlock); /* EOF */