qxl-wddm-dod: Return EDID data to the OS

Solves failure of HLK "Test for EDID requirements"
EDID contains capabilities and manufacturer data of
the emulated display device. Parsed EDID data presented
in the source file.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
This commit is contained in:
yuri.benditovich@daynix.com 2017-02-16 16:30:57 +02:00 committed by Frediano Ziglio
parent 93c66603f0
commit 72ed815334

View File

@ -371,6 +371,95 @@ NTSTATUS QxlDod::QueryChildStatus(_Inout_ DXGK_CHILD_STATUS* pChildStatus,
} }
} }
/* edid-decode:
Extracted contents:
header: 00 ff ff ff ff ff ff 00
serial number: 47 0c 01 00 41 fa 38 78 01 1b
version: 01 04
basic params: 6a 22 1b 78 ea
chroma info: 32 31 a3 57 4c 9d 25 11 50 54
established: 04 43 00
standard: 31 4f 45 4f 61 4f 81 4f 01 01 01 01 01 01 01 01
descriptor 1: ba 2c 00 a0 50 00 25 40 30 20 37 00 54 0e 11 00 00 1e
descriptor 2: 00 00 00 fd 00 38 50 1e 53 0f 00 00 00 00 00 00 00 00
descriptor 3: 00 00 00 fc 00 51 58 4c 30 30 30 31 0a 20 20 20 20 20
descriptor 4: 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00
extensions: 01
checksum: d5
Manufacturer: QXL Model 1 Serial Number 2017000001
Made week 1 of 2017
EDID version: 1.4
Analog display, Input voltage level: 0.7/0.7 V
Blank level equals black level
Sync: Separate SyncOnGreen
Maximum image size: 34 cm x 27 cm
Gamma: 2.20
DPMS levels: Standby Suspend Off
RGB color display
First detailed timing is preferred timing
Established timings supported:
640x480@75Hz
800x600@75Hz
1024x768@75Hz
1280x1024@75Hz
Standard timings supported:
640x480@75Hz
800x600@75Hz
1024x768@75Hz
1280x960@75Hz
Detailed mode: Clock 114.500 MHz, 340 mm x 270 mm
1280 1328 1360 1440 hborder 0
1024 1027 1034 1061 vborder 0
+hsync +vsync
Monitor ranges: 56-80HZ vertical, 30-83kHz horizontal, max dotclock 150MHz
Monitor name: QXL0001
Dummy block
Has 1 extension blocks
Checksum: 0xd5
CEA extension block
Extension version: 3
0 bytes of CEA data
0 native detailed modes
Checksum: 0xf7
*/
static const UCHAR edid[256] =
{
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,
0x47,0x0C,0x01,0x00,0x41,0xFA,0x38,0x78,
0x01,0x1B,0x01,0x04,0x6A,0x22,0x1B,0x78,
0xEA,0x32,0x31,0xA3,0x57,0x4C,0x9D,0x25,
0x11,0x50,0x54,0x04,0x43,0x00,0x31,0x4F,
0x45,0x4F,0x61,0x4F,0x81,0x4F,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0xBA,0x2C,
0x00,0xA0,0x50,0x00,0x25,0x40,0x30,0x20,
0x37,0x00,0x54,0x0E,0x11,0x00,0x00,0x1E,
0x00,0x00,0x00,0xFD,0x00,0x38,0x50,0x1E,
0x53,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x51,
0x58,0x4C,0x30,0x30,0x30,0x31,0x0A,0x20,
0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x10,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xD5,
0x02,0x03,0x04,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF7,
};
// EDID retrieval // EDID retrieval
NTSTATUS QxlDod::QueryDeviceDescriptor(_In_ ULONG ChildUid, NTSTATUS QxlDod::QueryDeviceDescriptor(_In_ ULONG ChildUid,
_Inout_ DXGK_DEVICE_DESCRIPTOR* pDeviceDescriptor) _Inout_ DXGK_DEVICE_DESCRIPTOR* pDeviceDescriptor)
@ -380,8 +469,21 @@ NTSTATUS QxlDod::QueryDeviceDescriptor(_In_ ULONG ChildUid,
QXL_ASSERT(pDeviceDescriptor != NULL); QXL_ASSERT(pDeviceDescriptor != NULL);
QXL_ASSERT(ChildUid < MAX_CHILDREN); QXL_ASSERT(ChildUid < MAX_CHILDREN);
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__)); if (pDeviceDescriptor->DescriptorOffset >= sizeof(edid))
{
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s out of area\n", __FUNCTION__));
return STATUS_MONITOR_NO_MORE_DESCRIPTOR_DATA; return STATUS_MONITOR_NO_MORE_DESCRIPTOR_DATA;
}
else
{
const VOID *src = edid + pDeviceDescriptor->DescriptorOffset;
ULONG len = sizeof(edid) - pDeviceDescriptor->DescriptorOffset;
len = min(len, pDeviceDescriptor->DescriptorLength);
RtlMoveMemory(pDeviceDescriptor->DescriptorBuffer, src, len);
pDeviceDescriptor->DescriptorLength = len;
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s (%d copied)\n", __FUNCTION__, len));
return STATUS_SUCCESS;
}
} }
NTSTATUS QxlDod::QueryAdapterInfo(_In_ CONST DXGKARG_QUERYADAPTERINFO* pQueryAdapterInfo) NTSTATUS QxlDod::QueryAdapterInfo(_In_ CONST DXGKARG_QUERYADAPTERINFO* pQueryAdapterInfo)