TRACE("Created key: DisplayController\\0\n");
/* FIXME: Add display peripheral (monitor) data */
+ if (VesaVersion != 0)
+ {
+ if (BiosIsVesaDdcSupported())
+ {
+ TRACE("VESA/DDC supported!\n");
+ if (BiosVesaReadEdid())
+ {
+ TRACE("EDID data read successfully!\n");
+
+ }
+ }
+ }
}
#define NDEBUG
#include <debug.h>
-DBG_DEFAULT_CHANNEL(UI);
+DBG_DEFAULT_CHANNEL(HWDETECT);
#include <pshpack2.h>
typedef struct
return SvgaInfo->VesaVersion;
}
+
+
+BOOLEAN
+BiosIsVesaDdcSupported(VOID)
+{
+ REGS Regs;
+
+ TRACE("BiosIsVesaDdcSupported()\n");
+
+ Regs.w.ax = 0x4F15;
+ Regs.b.bl = 0;
+ Regs.w.cx = 0;
+ Regs.w.es = 0;
+ Regs.w.di = 0;
+ Int386(0x10, &Regs, &Regs);
+
+ TRACE("AL = 0x%x\n", Regs.b.al);
+ TRACE("AH = 0x%x\n", Regs.b.ah);
+
+ TRACE("BL = 0x%x\n", Regs.b.bl);
+
+ if (Regs.w.ax != 0x004F)
+ {
+ ERR("VESA/DDC installation check failed\n");
+ return FALSE;
+ }
+
+ return (Regs.b.ah == 0);
+}
+
+
+BOOLEAN
+BiosVesaReadEdid(VOID)
+{
+ REGS Regs;
+
+ TRACE("BiosVesaReadEdid()\n");
+
+ RtlZeroMemory((PVOID)BIOSCALLBUFFER, 128);
+
+ Regs.w.ax = 0x4F15;
+ Regs.b.bl = 1;
+ Regs.w.cx = 0;
+ Regs.w.dx = 0;
+ Regs.w.es = BIOSCALLBUFSEGMENT;
+ Regs.w.di = BIOSCALLBUFOFFSET;
+ Int386(0x10, &Regs, &Regs);
+
+ TRACE("AL = 0x%x\n", Regs.b.al);
+ TRACE("AH = 0x%x\n", Regs.b.ah);
+
+ if (Regs.w.ax != 0x004F)
+ {
+ ERR("Read EDID function not supported!\n");
+ return FALSE;
+ }
+
+ return (Regs.b.ah == 0);
+}
+
+/* EOF */
extern PVOID VideoOffScreenBuffer;
-USHORT BiosIsVesaSupported(VOID); // Implemented in i386vid.c, returns the VESA version
+USHORT BiosIsVesaSupported(VOID); // Implemented in i386vid.c, returns the VESA version
+BOOLEAN BiosIsVesaDdcSupported(VOID);
+BOOLEAN BiosVesaReadEdid(VOID);
-PVOID VideoAllocateOffScreenBuffer(VOID); // Returns a pointer to an off-screen buffer sufficient for the current video mode
+PVOID VideoAllocateOffScreenBuffer(VOID); // Returns a pointer to an off-screen buffer sufficient for the current video mode
VOID VideoCopyOffScreenBufferToVRAM(VOID);