ReactOS  0.4.14-dev-52-g6116262
vbe.c File Reference
#include "vga.h"
Include dependency graph for vbe.c:

Go to the source code of this file.

Functions

BOOLEAN NTAPI IsVesaBiosOk (IN PVIDEO_PORT_INT10_INTERFACE Interface, IN ULONG OemRevision, IN PCHAR Vendor, IN PCHAR Product, IN PCHAR Revision)
 
BOOLEAN NTAPI ValidateVbeInfo (IN PHW_DEVICE_EXTENSION VgaExtension, IN PVBE_INFO VbeInfo)
 
VP_STATUS NTAPI VbeSetColorLookup (IN PHW_DEVICE_EXTENSION VgaExtension, IN PVIDEO_CLUT ClutBuffer)
 

Variables

static const CHAR Nv11Board [] = "NV11 (GeForce2) Board"
 
static const CHAR Nv11Chip [] = "Chip Rev B2"
 
static const CHAR Nv11Vendor [] = "NVidia Corporation"
 
static const CHAR IntelBrookdale [] = "Brookdale-G Graphics Controller"
 
static const PCHAR BrokenVesaBiosList []
 
BOOLEAN g_bIntelBrookdaleBIOS
 

Function Documentation

◆ IsVesaBiosOk()

BOOLEAN NTAPI IsVesaBiosOk ( IN PVIDEO_PORT_INT10_INTERFACE  Interface,
IN ULONG  OemRevision,
IN PCHAR  Vendor,
IN PCHAR  Product,
IN PCHAR  Revision 
)

Definition at line 37 of file vbe.c.

42 {
43  ULONG i;
44  CHAR Version[21];
45 
46  /* If the broken VESA bios found, turn VESA off */
47  VideoDebugPrint((0, "Vendor: %s Product: %s Revision: %s (%lx)\n", Vendor, Product, Revision, OemRevision));
48  for (i = 0; i < (sizeof(BrokenVesaBiosList) / sizeof(PCHAR)); i++)
49  {
50  if (!strncmp(Product, BrokenVesaBiosList[i], strlen(BrokenVesaBiosList[i]))) return FALSE;
51  }
52 
53  /* For Brookdale-G (Intel), special hack used */
55 
56  /* For NVIDIA make sure */
57  if (!(strncmp(Vendor, Nv11Vendor, sizeof(Nv11Vendor) - 1)) &&
58  !(strncmp(Product, Nv11Board, sizeof(Nv11Board) - 1)) &&
59  !(strncmp(Revision, Nv11Chip, sizeof(Nv11Chip) - 1)) &&
60  (OemRevision == 0x311))
61  {
62  /* Read version */
63  if (Interface->Int10ReadMemory(Interface->Context,
64  0xC000,
65  345,
66  Version,
67  sizeof(Version))) return FALSE;
68  if (!strncmp(Version, "Version 3.11.01.24N16", sizeof(Version))) return FALSE;
69  }
70 
71  /* VESA ok */
72  VideoDebugPrint((0, "Vesa ok\n"));
73  return TRUE;
74 }
signed char * PCHAR
Definition: retypes.h:7
#define TRUE
Definition: types.h:120
IN PVOID IN PVOID IN USHORT Version
Definition: pci.h:359
static const CHAR Nv11Board[]
Definition: vbe.c:15
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char CHAR
Definition: xmlstorage.h:175
static const CHAR Nv11Vendor[]
Definition: vbe.c:17
_In_ ULONG Revision
Definition: rtlfuncs.h:1104
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
IN PVOID IN PVOID IN USHORT IN USHORT IN PINTERFACE Interface
Definition: pci.h:359
static const CHAR Nv11Chip[]
Definition: vbe.c:16
BOOLEAN g_bIntelBrookdaleBIOS
Definition: vbe.c:31
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
Definition: utclib.c:534
#define VideoDebugPrint(x)
Definition: video.h:75
static const CHAR IntelBrookdale[]
Definition: vbe.c:18
static const PCHAR BrokenVesaBiosList[]
Definition: vbe.c:19
unsigned int ULONG
Definition: retypes.h:1

Referenced by ValidateVbeInfo().

◆ ValidateVbeInfo()

BOOLEAN NTAPI ValidateVbeInfo ( IN PHW_DEVICE_EXTENSION  VgaExtension,
IN PVBE_INFO  VbeInfo 
)

Definition at line 78 of file vbe.c.

80 {
81  BOOLEAN VesaBiosOk;
82  PVOID Context;
83  CHAR ProductRevision[80];
84  CHAR OemString[80];
85  CHAR ProductName[80];
86  CHAR VendorName[80];
88 
89  /* Set default */
90  VesaBiosOk = FALSE;
91  Context = VgaExtension->Int10Interface.Context;
92 
93  /* Check magic and version */
94  if (VbeInfo->Info.Signature != VESA_MAGIC) return VesaBiosOk;
95  if (VbeInfo->Info.Version < 0x102) return VesaBiosOk;
96 
97  /* Read strings */
98  Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
99  HIWORD(VbeInfo->Info.OemStringPtr),
100  LOWORD(VbeInfo->Info.OemStringPtr),
101  OemString,
102  sizeof(OemString));
103  if (Status != NO_ERROR) return VesaBiosOk;
104  Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
105  HIWORD(VbeInfo->Info.OemVendorNamePtr),
106  LOWORD(VbeInfo->Info.OemVendorNamePtr),
107  VendorName,
108  sizeof(VendorName));
109  if (Status != NO_ERROR) return VesaBiosOk;
110  Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
111  HIWORD(VbeInfo->Info.OemProductNamePtr),
112  LOWORD(VbeInfo->Info.OemProductNamePtr),
113  ProductName,
114  sizeof(ProductName));
115  if (Status != NO_ERROR) return VesaBiosOk;
116  Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
117  HIWORD(VbeInfo->Info.OemProductRevPtr),
118  LOWORD(VbeInfo->Info.OemProductRevPtr),
119  ProductRevision,
120  sizeof(ProductRevision));
121  if (Status != NO_ERROR) return VesaBiosOk;
122 
123  /* Null-terminate strings */
124  VendorName[sizeof(OemString) - 1] = ANSI_NULL;
125  ProductName[sizeof(OemString) - 1] = ANSI_NULL;
126  ProductRevision[sizeof(OemString) - 1] = ANSI_NULL;
127  OemString[sizeof(OemString) - 1] = ANSI_NULL;
128 
129  /* Check for known bad BIOS */
130  VesaBiosOk = IsVesaBiosOk(&VgaExtension->Int10Interface,
131  VbeInfo->Info.OemSoftwareRevision,
132  VendorName,
133  ProductName,
134  ProductRevision);
135  VgaExtension->VesaBiosOk = VesaBiosOk;
136  return VesaBiosOk;
137 }
*BytesInOemString PCHAR OemString
Definition: rtlfuncs.h:1561
char CHAR
Definition: xmlstorage.h:175
#define NO_ERROR
Definition: dderror.h:5
#define ANSI_NULL
unsigned char BOOLEAN
BOOLEAN NTAPI IsVesaBiosOk(IN PVIDEO_PORT_INT10_INTERFACE Interface, IN ULONG OemRevision, IN PCHAR Vendor, IN PCHAR Product, IN PCHAR Revision)
Definition: vbe.c:37
Status
Definition: gdiplustypes.h:24
struct tagContext Context
Definition: acpixf.h:1024
#define HIWORD(l)
Definition: typedefs.h:246
LONG VP_STATUS
Definition: video.h:153
#define VESA_MAGIC
Definition: vga.h:448
#define LOWORD(l)
Definition: pedump.c:82

Referenced by InitializeModeTable().

◆ VbeSetColorLookup()

VP_STATUS NTAPI VbeSetColorLookup ( IN PHW_DEVICE_EXTENSION  VgaExtension,
IN PVIDEO_CLUT  ClutBuffer 
)

Definition at line 141 of file vbe.c.

143 {
144  PVBE_COLOR_REGISTER VesaClut;
145  INT10_BIOS_ARGUMENTS BiosArguments;
146  PVOID Context;
147  ULONG Entries;
148  ULONG BufferSize = 4 * 1024;
149  USHORT TrampolineMemorySegment, TrampolineMemoryOffset;
151  USHORT i;
152  PVIDEOMODE CurrentMode = VgaExtension->CurrentMode;
153 
154  Entries = ClutBuffer->NumEntries;
155 
156  VideoDebugPrint((0, "Setting %lu entries.\n", Entries));
157 
158  /*
159  * For Vga compatible modes, write them directly.
160  * Otherwise, the LGPL VGABIOS (used in bochs) fails!
161  * It is also said that this way is faster.
162  */
163  if(!CurrentMode->NonVgaMode)
164  {
165  for (i=ClutBuffer->FirstEntry; i<ClutBuffer->FirstEntry + Entries; i++)
166  {
167  VideoPortWritePortUchar((PUCHAR)0x03c8, i);
168  VideoPortWritePortUchar((PUCHAR)0x03c9, ClutBuffer->LookupTable[i].RgbArray.Red);
169  VideoPortWritePortUchar((PUCHAR)0x03c9, ClutBuffer->LookupTable[i].RgbArray.Green);
170  VideoPortWritePortUchar((PUCHAR)0x03c9, ClutBuffer->LookupTable[i].RgbArray.Blue);
171  }
172  return NO_ERROR;
173  }
174 
175  /* Allocate INT10 context/buffer */
176  VesaClut = VideoPortAllocatePool(VgaExtension, 1, sizeof(ULONG) * Entries, ' agV');
177  if (!VesaClut) return ERROR_INVALID_PARAMETER;
178  if (!VgaExtension->Int10Interface.Size) return ERROR_INVALID_PARAMETER;
179  Context = VgaExtension->Int10Interface.Context;
180  Status = VgaExtension->Int10Interface.Int10AllocateBuffer(Context,
181  &TrampolineMemorySegment,
182  &TrampolineMemoryOffset,
183  &BufferSize);
184  if (Status != NO_ERROR) return ERROR_INVALID_PARAMETER;
185 
186  /* VESA has color registers backward! */
187  for (i = 0; i < Entries; i++)
188  {
189  VesaClut[i].Blue = ClutBuffer->LookupTable[i].RgbArray.Blue;
190  VesaClut[i].Green = ClutBuffer->LookupTable[i].RgbArray.Green;
191  VesaClut[i].Red = ClutBuffer->LookupTable[i].RgbArray.Red;
192  VesaClut[i].Pad = 0;
193  }
194  Status = VgaExtension->Int10Interface.Int10WriteMemory(Context,
195  TrampolineMemorySegment,
196  TrampolineMemoryOffset,
197  VesaClut,
198  Entries * sizeof(ULONG));
199  if (Status != NO_ERROR) return ERROR_INVALID_PARAMETER;
200 
201  /* Write the palette */
202  VideoPortZeroMemory(&BiosArguments, sizeof(BiosArguments));
203  BiosArguments.Ebx = 0;
204  BiosArguments.Ecx = Entries;
205  BiosArguments.Edx = ClutBuffer->FirstEntry;
206  BiosArguments.Edi = TrampolineMemoryOffset;
207  BiosArguments.SegEs = TrampolineMemorySegment;
208  BiosArguments.Eax = VBE_SET_GET_PALETTE_DATA;
209  Status = VgaExtension->Int10Interface.Int10CallBios(Context, &BiosArguments);
210  if (Status != NO_ERROR) return ERROR_INVALID_PARAMETER;
211  VideoPortFreePool(VgaExtension, VesaClut);
212  VideoDebugPrint((Error, "VBE Status: %lx\n", BiosArguments.Eax));
213  if (VBE_GETRETURNCODE(BiosArguments.Eax) == VBE_SUCCESS)
214  return NO_ERROR;
216 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
unsigned char * PUCHAR
Definition: retypes.h:3
ULONG NonVgaMode
Definition: vga.h:276
#define VBE_GETRETURNCODE(x)
Definition: vbemp.h:100
#define NO_ERROR
Definition: dderror.h:5
VPAPI VOID NTAPI VideoPortZeroMemory(IN PVOID Destination, IN ULONG Length)
Definition: vga.h:250
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define VBE_SUCCESS
Definition: vbemp.h:95
VPAPI PVOID NTAPI VideoPortAllocatePool(IN PVOID HwDeviceExtension, IN VP_POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag)
Definition: resource.c:913
VPAPI VOID NTAPI VideoPortFreePool(IN PVOID HwDeviceExtension, IN PVOID Ptr)
Definition: resource.c:928
#define BufferSize
Definition: classpnp.h:419
BOOL Error
Definition: chkdsk.c:66
#define VBE_SET_GET_PALETTE_DATA
Definition: vbemp.h:55
Status
Definition: gdiplustypes.h:24
#define VideoDebugPrint(x)
Definition: video.h:75
LIST_ENTRY Entries[5]
Definition: ExDoubleList.c:8
unsigned short USHORT
Definition: pedump.c:61
struct tagContext Context
Definition: acpixf.h:1024
unsigned int ULONG
Definition: retypes.h:1
LONG VP_STATUS
Definition: video.h:153
VPAPI VOID NTAPI VideoPortWritePortUchar(IN PUCHAR Port, IN UCHAR Value)

Referenced by VgaSetColorLookup().

Variable Documentation

◆ BrokenVesaBiosList

const PCHAR BrokenVesaBiosList[]
static
Initial value:
=
{
"SiS 5597",
"MGA-G100",
"3Dfx Banshee",
"Voodoo3 2000 LC ",
"Voodoo3 3000 LC ",
"Voodoo4 4500 ",
"ArtX I",
"ATI S1-370TL"
}

Definition at line 19 of file vbe.c.

Referenced by IsVesaBiosOk().

◆ g_bIntelBrookdaleBIOS

BOOLEAN g_bIntelBrookdaleBIOS

Definition at line 31 of file vbe.c.

Referenced by InitializeModeTable(), and IsVesaBiosOk().

◆ IntelBrookdale

const CHAR IntelBrookdale[] = "Brookdale-G Graphics Controller"
static

Definition at line 18 of file vbe.c.

Referenced by IsVesaBiosOk().

◆ Nv11Board

const CHAR Nv11Board[] = "NV11 (GeForce2) Board"
static

Definition at line 15 of file vbe.c.

Referenced by IsVesaBiosOk().

◆ Nv11Chip

const CHAR Nv11Chip[] = "Chip Rev B2"
static

Definition at line 16 of file vbe.c.

Referenced by IsVesaBiosOk().

◆ Nv11Vendor

const CHAR Nv11Vendor[] = "NVidia Corporation"
static

Definition at line 17 of file vbe.c.

Referenced by IsVesaBiosOk().