Author: jgardou
Date: Thu Sep 12 20:25:24 2013
New Revision: 60063
URL:
http://svn.reactos.org/svn/reactos?rev=60063&view=rev
Log:
[VGA_NEW]
- Zero out the Int10 Bios call arguments structure before calling Videoprt Int10CallBios
- Properly check for VESA BIOS return value from such calls
- Use VGA registers to update the palette when possible.
Now bochs goes up to 3rd stage when using this driver in conjunction with framebuf_new.
Modified:
trunk/reactos/win32ss/drivers/miniport/vga_new/vbe.c
trunk/reactos/win32ss/drivers/miniport/vga_new/vbemodes.c
Modified: trunk/reactos/win32ss/drivers/miniport/vga_new/vbe.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/drivers/miniport/v…
==============================================================================
--- trunk/reactos/win32ss/drivers/miniport/vga_new/vbe.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/drivers/miniport/vga_new/vbe.c [iso-8859-1] Thu Sep 12 20:25:24
2013
@@ -91,7 +91,7 @@
Context = VgaExtension->Int10Interface.Context;
/* Check magic and version */
- if (VbeInfo->Info.Signature == VESA_MAGIC) return VesaBiosOk;
+ if (VbeInfo->Info.Signature != VESA_MAGIC) return VesaBiosOk;
if (VbeInfo->Info.Version < 0x102) return VesaBiosOk;
/* Read strings */
@@ -149,11 +149,31 @@
USHORT TrampolineMemorySegment, TrampolineMemoryOffset;
VP_STATUS Status;
USHORT i;
+ PVIDEOMODE CurrentMode = VgaExtension->CurrentMode;
Entries = ClutBuffer->NumEntries;
+
+ VideoPortDebugPrint(0, "Setting %lu entries.\n", Entries);
+
+ /*
+ * For Vga compatible modes, write them directly.
+ * Otherwise, the LGPL VGABIOS (used in bochs) fails!
+ * It is also said that this way is faster.
+ */
+ if(!CurrentMode->NonVgaMode)
+ {
+ for (i=ClutBuffer->FirstEntry; i<ClutBuffer->FirstEntry + Entries; i++)
+ {
+ VideoPortWritePortUchar((PUCHAR)0x03c8, i);
+ VideoPortWritePortUchar((PUCHAR)0x03c9,
ClutBuffer->LookupTable[i].RgbArray.Red);
+ VideoPortWritePortUchar((PUCHAR)0x03c9,
ClutBuffer->LookupTable[i].RgbArray.Green);
+ VideoPortWritePortUchar((PUCHAR)0x03c9,
ClutBuffer->LookupTable[i].RgbArray.Blue);
+ }
+ return NO_ERROR;
+ }
/* Allocate INT10 context/buffer */
- VesaClut = VideoPortAllocatePool(VgaExtension, 1, sizeof(ULONG) * Entries,
0x20616756u);
+ VesaClut = VideoPortAllocatePool(VgaExtension, 1, sizeof(ULONG) * Entries, '
agV');
if (!VesaClut) return ERROR_INVALID_PARAMETER;
if (!VgaExtension->Int10Interface.Size) return ERROR_INVALID_PARAMETER;
Context = VgaExtension->Int10Interface.Context;
@@ -178,7 +198,8 @@
Entries * sizeof(ULONG));
if (Status != NO_ERROR) return ERROR_INVALID_PARAMETER;
- /* Write new palette */
+ /* Write the palette */
+ VideoPortZeroMemory(&BiosArguments, sizeof(BiosArguments));
BiosArguments.Ebx = 0;
BiosArguments.Ecx = Entries;
BiosArguments.Edx = ClutBuffer->FirstEntry;
@@ -189,7 +210,8 @@
if (Status != NO_ERROR) return ERROR_INVALID_PARAMETER;
VideoPortFreePool(VgaExtension, VesaClut);
VideoPortDebugPrint(Error, "VBE Status: %lx\n", BiosArguments.Eax);
- if (BiosArguments.Eax == VBE_SUCCESS) return NO_ERROR;
+ if (VBE_GETRETURNCODE(BiosArguments.Eax) == VBE_SUCCESS)
+ return NO_ERROR;
return ERROR_INVALID_PARAMETER;
}
Modified: trunk/reactos/win32ss/drivers/miniport/vga_new/vbemodes.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/drivers/miniport/v…
==============================================================================
--- trunk/reactos/win32ss/drivers/miniport/vga_new/vbemodes.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/drivers/miniport/vga_new/vbemodes.c [iso-8859-1] Thu Sep 12
20:25:24 2013
@@ -58,13 +58,15 @@
if (Status != NO_ERROR) return 0;
/* Ask VBE BIOS for mode info */
+ VideoPortZeroMemory(&BiosArguments, sizeof(BiosArguments));
BiosArguments.Ecx = HIWORD(VgaMode->Mode);
BiosArguments.Edi = TrampolineMemorySegment;
BiosArguments.SegEs = TrampolineMemoryOffset;
BiosArguments.Eax = VBE_GET_MODE_INFORMATION;
Status = VgaExtension->Int10Interface.Int10CallBios(Context, &BiosArguments);
if (Status != NO_ERROR) return 0;
- if (BiosArguments.Eax != VBE_SUCCESS) return 0;
+ if (VBE_GETRETURNCODE(BiosArguments.Eax) != VBE_SUCCESS)
+ return 0;
Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
TrampolineMemorySegment,
TrampolineMemoryOffset,
@@ -94,23 +96,27 @@
VideoPortZeroMemory(&BiosArguments, sizeof(BiosArguments));
ModeIndex = VgaMode->Mode;
- BiosArguments.Eax = ModeIndex & 0x0000FFFF;
- BiosArguments.Ebx = ModeIndex >> 16;
+ BiosArguments.Eax = VBE_SET_VBE_MODE;
+ BiosArguments.Ebx = HIWORD(ModeIndex);
VideoPortDebugPrint(0, "Switching to %lx %lx\n", BiosArguments.Eax,
BiosArguments.Ebx);
Status = VideoPortInt10(VgaDeviceExtension, &BiosArguments);
if (Status != NO_ERROR) return Status;
+ if(VBE_GETRETURNCODE(BiosArguments.Eax) != VBE_SUCCESS)
+ VideoPortDebugPrint(0, "Changing VBE mode failed, Eax %lx",
BiosArguments.Eax);
/* Check for VESA mode */
if (ModeIndex >> 16)
{
/* Mode set fail */
- if (BiosArguments.Eax != VBE_SUCCESS) return ERROR_INVALID_PARAMETER;
+ if (VBE_GETRETURNCODE(BiosArguments.Eax) != VBE_SUCCESS)
+ return ERROR_INVALID_PARAMETER;
/* Check current mode is desired mode */
+ VideoPortZeroMemory(&BiosArguments, sizeof(BiosArguments));
BiosArguments.Eax = VBE_GET_CURRENT_VBE_MODE;
Status = VideoPortInt10(VgaDeviceExtension, &BiosArguments);
if ((Status == NO_ERROR) &&
- (BiosArguments.Eax == VBE_SUCCESS) &&
+ (VBE_GETRETURNCODE(BiosArguments.Eax) == VBE_SUCCESS) &&
((BiosArguments.Ebx ^ (ModeIndex >> 16)) & VBE_MODE_BITS))
{
return ERROR_INVALID_PARAMETER;
@@ -120,12 +126,13 @@
if (VgaMode->LogicalWidth != VgaMode->hres)
{
/* Check setting works after being set */
+ VideoPortZeroMemory(&BiosArguments, sizeof(BiosArguments));
BiosArguments.Eax = VBE_SET_GET_LOGICAL_SCAN_LINE_LENGTH;
BiosArguments.Ecx = VgaMode->LogicalWidth;
BiosArguments.Ebx = 0;
Status = VideoPortInt10(VgaDeviceExtension, &BiosArguments);
if ((Status != NO_ERROR) ||
- (BiosArguments.Eax != VBE_SUCCESS) ||
+ (VBE_GETRETURNCODE(BiosArguments.Eax) != VBE_SUCCESS) ||
(BiosArguments.Ecx != VgaMode->LogicalWidth))
{
return ERROR_INVALID_PARAMETER;
@@ -192,7 +199,7 @@
}
/* Add ref */
- //VideoPortDebugPrint(0, "have int10 iface\n");
+ VideoPortDebugPrint(0, "have int10 iface\n");
VgaExtension->Int10Interface.InterfaceReference(VgaExtension->Int10Interface.Context);
Context = VgaExtension->Int10Interface.Context;
@@ -207,23 +214,28 @@
if (!VbeInfo) return;
/* Init VBE data and write to card buffer */
- //VideoPortDebugPrint(0, "have int10 data\n");
+ VideoPortDebugPrint(0, "have int10 data\n");
VbeInfo->ModeArray[128] = 0xFFFF;
VbeInfo->Info.Signature = VBE2_MAGIC;
Status = VgaExtension->Int10Interface.Int10WriteMemory(Context,
TrampolineMemorySegment,
TrampolineMemoryOffset,
- VbeInfo,
- 512);
+
&VbeInfo->Info.Signature,
+ 4);
if (Status != NO_ERROR) return;
/* Get controller info */
+ VideoPortZeroMemory(&BiosArguments, sizeof(BiosArguments));
BiosArguments.Edi = TrampolineMemoryOffset;
BiosArguments.SegEs = TrampolineMemorySegment;
BiosArguments.Eax = VBE_GET_CONTROLLER_INFORMATION;
Status = VgaExtension->Int10Interface.Int10CallBios(Context, &BiosArguments);
if (Status != NO_ERROR) return;
- if (BiosArguments.Eax != VBE_SUCCESS) return;
+ if(VBE_GETRETURNCODE(BiosArguments.Eax) != VBE_SUCCESS)
+ {
+ VideoPortDebugPrint(0, "BiosArguments.Eax %lx\n", BiosArguments.Eax);
+ return;
+ }
Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
TrampolineMemorySegment,
TrampolineMemoryOffset,
@@ -232,21 +244,21 @@
if (Status != NO_ERROR) return;
/* Check correct VBE BIOS */
- //VideoPortDebugPrint(0, "have vbe data\n");
+ VideoPortDebugPrint(0, "have vbe data\n");
TotalMemory = VbeInfo->Info.TotalMemory << 16;
VbeVersion = VbeInfo->Info.Version;
VideoPortDebugPrint(0, "vbe version %lx memory %lx\n", VbeVersion,
TotalMemory);
if (!ValidateVbeInfo(VgaExtension, VbeInfo)) return;
/* Read modes */
- //VideoPortDebugPrint(0, "read modes from %p\n",
VbeInfo->Info.VideoModePtr);
+ VideoPortDebugPrint(0, "read modes from %p\n",
VbeInfo->Info.VideoModePtr);
Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
HIWORD(VbeInfo->Info.VideoModePtr),
LOWORD(VbeInfo->Info.VideoModePtr),
VbeInfo->ModeArray,
128 * sizeof(USHORT));
if (Status != NO_ERROR) return;
- //VideoPortDebugPrint(0, "Read modes at: %p\n", VbeInfo->ModeArray);
+ VideoPortDebugPrint(0, "Read modes at: %p\n", VbeInfo->ModeArray);
/* Count modes, check for new 4bpp SVGA modes */
ThisMode = VbeInfo->ModeArray;
@@ -254,7 +266,7 @@
while (ModeResult != 0xFFFF)
{
Mode = ModeResult & 0x1FF;
- //VideoPortDebugPrint(0, "Mode found: %lx\n", Mode);
+ VideoPortDebugPrint(0, "Mode found: %lx\n", Mode);
if ((Mode == 0x102) || (Mode == 0x6A)) FourBppModeFound = TRUE;
ModeResult = *++ThisMode;
NewModes++;
@@ -277,20 +289,22 @@
}
/* Scan SVGA modes */
-// VideoPortDebugPrint(0, "Static modes: %d\n", NumVideoModes);
+ VideoPortDebugPrint(0, "Static modes: %d\n", NumVideoModes);
VgaMode = &VgaModeList[NumVideoModes];
ThisMode = VbeInfo->ModeArray;
- //VideoPortDebugPrint(0, "new modes: %d\n", NewModes);
+ VideoPortDebugPrint(0, "new modes: %d\n", NewModes);
while (NewModes--)
{
/* Get info on mode */
+ VideoPortDebugPrint(0, "Getting info of mode %lx.\n", *ThisMode);
+ VideoPortZeroMemory(&BiosArguments, sizeof(BiosArguments));
BiosArguments.Eax = VBE_GET_MODE_INFORMATION;
BiosArguments.Ecx = *ThisMode;
BiosArguments.Edi = TrampolineMemoryOffset;
BiosArguments.SegEs = TrampolineMemorySegment;
Status = VgaExtension->Int10Interface.Int10CallBios(Context,
&BiosArguments);
if (Status != NO_ERROR) goto Next;
- if (BiosArguments.Eax != VBE_SUCCESS) goto Next;
+ if (VBE_GETRETURNCODE(BiosArguments.Eax) != VBE_SUCCESS) goto Next;
Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
TrampolineMemorySegment,
TrampolineMemoryOffset,
@@ -299,7 +313,7 @@
if (Status != NO_ERROR) goto Next;
/* Parse graphics modes only if linear framebuffer support */
- //VideoPortDebugPrint(0, "attr: %lx\n",
VbeModeInfo->ModeAttributes);
+ VideoPortDebugPrint(0, "attr: %lx\n", VbeModeInfo->ModeAttributes);
if (!(VbeModeInfo->ModeAttributes & (VBE_MODEATTR_VALID |
VBE_MODEATTR_GRAPHICS))) goto Next;
LinearAddressing = ((VbeVersion >= 0x200) &&
@@ -308,7 +322,7 @@
TRUE : FALSE;
/* Check SVGA modes if 8bpp or higher */
- //VideoPortDebugPrint(0, "PhysBase: %lx\n",
VbeModeInfo->PhysBasePtr);
+ VideoPortDebugPrint(0, "PhysBase: %lx\n",
VbeModeInfo->PhysBasePtr);
if ((VbeModeInfo->XResolution >= 640) &&
(VbeModeInfo->YResolution >= 480) &&
(VbeModeInfo->NumberOfPlanes >= 1) &&
@@ -322,7 +336,7 @@
VgaMode->Frequency = 1;
VgaMode->Mode = (*ThisMode << 16) | VBE_SET_VBE_MODE;
VgaMode->Granularity = VbeModeInfo->WinGranularity << 10;
- //VideoPortDebugPrint(0, "Mode %lx (Granularity %d)\n",
VgaMode->Mode, VgaMode->Granularity);
+ VideoPortDebugPrint(0, "Mode %lx (Granularity %d)\n",
VgaMode->Mode, VgaMode->Granularity);
/* Set flags */
if (VbeModeInfo->ModeAttributes & VBE_MODEATTR_COLOR)
VgaMode->fbType |= VIDEO_MODE_COLOR;
@@ -332,12 +346,12 @@
/* If no char data, say 80x25 */
VgaMode->col = VbeModeInfo->XCharSize ? VbeModeInfo->XResolution /
VbeModeInfo->XCharSize : 80;
VgaMode->row = VbeModeInfo->YCharSize ? VbeModeInfo->YResolution /
VbeModeInfo->YCharSize : 25;
- //VideoPortDebugPrint(0, "%d by %d rows\n", VgaMode->Columns,
VgaMode->Rows);
+ VideoPortDebugPrint(0, "%d by %d rows\n", VgaMode->col,
VgaMode->row);
/* Check RGB555 (15bpp only) */
VgaMode->bitsPerPlane = VbeModeInfo->BitsPerPixel /
VbeModeInfo->NumberOfPlanes;
if ((VgaMode->bitsPerPlane == 16) &&
(VbeModeInfo->GreenMaskSize == 5)) VgaMode->bitsPerPlane = 15;
- //VideoPortDebugPrint(0, "BPP: %d\n", VgaMode->BitsPerPlane);
+ VideoPortDebugPrint(0, "BPP: %d\n", VgaMode->bitsPerPlane);
/* Do linear or banked frame buffers */
VgaMode->FrameBufferBase = 0;
@@ -347,18 +361,18 @@
ScreenStride = RaiseToPower2(VbeModeInfo->BytesPerScanLine);
//ASSERT(ScreenStride <= MAX_USHORT);
VgaMode->wbytes = (USHORT)ScreenStride;
- //VideoPortDebugPrint(0, "ScanLines: %lx Stride: %lx\n",
VbeModeInfo->BytesPerScanLine, VgaMode->Stride);
+ VideoPortDebugPrint(0, "ScanLines: %lx Stride: %lx\n",
VbeModeInfo->BytesPerScanLine, VgaMode->wbytes);
/* Size of frame buffer is Height X ScanLine, align to bank/page size */
ScreenSize = VgaMode->hres * ScreenStride;
- //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
+ VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
Size = (ScreenSize + ((64 * 1024) - 1)) & ((64 * 1024) - 1);
- //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
+ VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
if (Size > TotalMemory) Size = (Size + ((4 * 1024) - 1)) & ((4 *
1024) - 1);
- //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
+ VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
/* Banked VGA at 0xA0000 (64K) */
- //VideoPortDebugPrint(0, "Final size: %lx\n", Size);
+ VideoPortDebugPrint(0, "Final size: %lx\n", Size);
VgaMode->fbType |= VIDEO_MODE_BANKED;
VgaMode->sbytes = Size;
VgaMode->PhysSize = 64 * 1024;
@@ -370,20 +384,20 @@
else
{
/* VBE 3.00+ has specific field, read legacy field if not */
- //VideoPortDebugPrint(0, "LINEAR MODE!!!\n");
+ VideoPortDebugPrint(0, "LINEAR MODE!!!\n");
ScreenStride = (VbeVersion >= 0x300) ?
VbeModeInfo->LinBytesPerScanLine : 0;
if (!ScreenStride) ScreenStride = VbeModeInfo->BytesPerScanLine;
//ASSERT(ScreenStride <= MAX_USHORT);
VgaMode->wbytes = (USHORT)ScreenStride;
- //VideoPortDebugPrint(0, "ScanLines: %lx Stride: %lx\n",
VbeModeInfo->BytesPerScanLine, VgaMode->Stride);
+ VideoPortDebugPrint(0, "ScanLines: %lx Stride: %lx\n",
VbeModeInfo->BytesPerScanLine, VgaMode->wbytes);
/* Size of frame buffer is Height X ScanLine, align to page size */
ScreenSize = VgaMode->hres * LOWORD(VgaMode->wbytes);
- //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
+ VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
Size = RaiseToPower2Ulong(ScreenSize);
- //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
+ VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
if (Size > TotalMemory) Size = (Size + ((4 * 1024) - 1)) & ((4 *
1024) - 1);
- //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
+ VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
/* Linear VGA must read settings from VBE */
VgaMode->fbType |= VIDEO_MODE_LINEAR;