From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tim Deegan Subject: Re: [PATCH 0/4] HVM Virtual S3 Date: Thu, 31 May 2007 11:59:21 +0100 Message-ID: <20070531105921.GA16995@york.uk.xensource.com> References: <8A87A9A84C201449A0C56B728ACF491E0BA67D@liverpoolst.ad.cl.cam.ac.uk> <1104166E0B63A341805FDB977862AAD2408360@pdsmsx414.ccr.corp.intel.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="wac7ysb48OaltWcw" Return-path: Content-Disposition: inline In-Reply-To: <1104166E0B63A341805FDB977862AAD2408360@pdsmsx414.ccr.corp.intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: "Yu, Ke" Cc: Ian Pratt , xen-devel@lists.xensource.com, Kaushik Barde List-Id: xen-devel@lists.xenproject.org --wac7ysb48OaltWcw Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline At 22:17 +0800 on 17 May (1179440232), Yu, Ke wrote: > Ian Pratt wrote on 2007??5??17?? 22:15: > >> In VGA card side, the VESA FB emulation has not been tried yet, but > >> the cirrus_vga works fine with Windows. Windows has cirrus VGA > >> driver, which supports S3, So this issue is resolved. > >> > >> Current issue is that Windows is not happy with the standard monitor > >> driver. And unfortunately, seems there is no monitor emulation code > >> in QEMU, so there may be no way to change the QEMU monitor type. It > >> would be better if someone can tell how to change that. Sorry for joining this thread quite late - I've been away for a few weeks. I found that the attached patch to the Cirrus VGA BIOS helps Windows along (but not quite enough). It adds some VBE power-management calls to the BIOS, telling Windows that it's capable of putting the screen to sleep. Unfortunately, this just changes the error from the monitor driver refusing to allow S3 to the Cirrus driver refusing to allow it. :| Tracing the BIOS and I/O activity of Windows, the next most likely culprit is when the Cirrus driver tries to talk DDC2B to the monitor at start of day (by frobbing the line state manually via Cirrus control registers) and gets no response. Since it can't read the monitor's descriptor tables it can't be sure that it's possible to put it to sleep properly. Since implementing a DDC2B state machine and faking out the tables sounds nasty, I agree with Ian that the VESA/VBE device model is probably the way forward, in the hope of getting Windows to use BIOS calls for all this. Cheers, Tim. -- Tim Deegan , XenSource UK Limited Registered office c/o EC2Y 5EB, UK; company number 05334508 --wac7ysb48OaltWcw Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: attachment; filename=vbe-pm diff -r dcf5e2a0d370 tools/firmware/vgabios/clext.c --- a/tools/firmware/vgabios/clext.c Thu Apr 26 11:48:41 2007 +0100 +++ b/tools/firmware/vgabios/clext.c Thu Apr 26 11:49:02 2007 +0100 @@ -26,6 +26,7 @@ #define PM_BIOSMEM_CURRENT_MODE 0x449 #define PM_BIOSMEM_CRTC_ADDRESS 0x463 #define PM_BIOSMEM_VBE_MODE 0x4BA +#define PM_BIOSMEM_VBE_POWER 0x4BC typedef struct { @@ -491,7 +492,7 @@ cirrus_vesa: #ifdef CIRRUS_DEBUG call cirrus_debug_dump #endif - cmp al, #0x0F + cmp al, #0x10 ja cirrus_vesa_not_handled push bx xor bx, bx @@ -682,7 +683,7 @@ c80h_2: ret cirrus_extbios_81h: - mov ax, #0x100 ;; XXX + mov ax, #0x103 ;; XXX ret cirrus_extbios_82h: push dx @@ -1175,6 +1176,52 @@ cirrus_vesa_07h_2: mov cx, ax pop dx mov ax, #0x004f + ret + +cirrus_vesa_10h: ;; Power management functions + ;; Set up DS to read stored power info from RAM + push ds +#ifdef CIRRUS_VESA3_PMINFO + db 0x2e ;; cs: + mov ax, [cirrus_vesa_sel0000_data] +#else + xor ax, ax +#endif + mov ds, ax + ;; Now choose the right function + cmp bl, #0x00 + ja cirrus_vesa_10h_01 + ;; + ;; Function 00h: Get capabilities + ;; + mov bx, #0x0720 ;; 07: standby/suspend/off, 20: VBE/PM 2.0 + mov ax, #0x004f + jmp cirrus_vesa_10h_done +cirrus_vesa_10h_01: + cmp bl, #0x01 + ja cirrus_vesa_10h_02 + ;; + ;; Function 01h: Set power state + ;; + mov ax, bx + mov bx, # PM_BIOSMEM_VBE_POWER + mov [bx], ah + mov ax, #0x004f + jmp cirrus_vesa_10h_done +cirrus_vesa_10h_02: + cmp bl, #0x02 + ja cirrus_vesa_10h_unimplemented + ;; + ;; Function 02h: Get power state + ;; + mov bx, # PM_BIOSMEM_VBE_POWER + mov bh, [bx] + mov ax, #0x004f + jmp cirrus_vesa_10h_done +cirrus_vesa_10h_unimplemented: + mov ax, #0x014F ;; not implemented +cirrus_vesa_10h_done: + pop ds ret cirrus_vesa_unimplemented: @@ -1573,9 +1620,9 @@ cirrus_vesa_handlers: dw cirrus_vesa_00h dw cirrus_vesa_01h dw cirrus_vesa_02h - dw cirrus_vesa_03h + dw cirrus_vesa_unimplemented ;; 04h - dw cirrus_vesa_unimplemented + dw cirrus_vesa_04h dw cirrus_vesa_05h dw cirrus_vesa_06h dw cirrus_vesa_07h @@ -1589,7 +1636,8 @@ cirrus_vesa_handlers: dw cirrus_vesa_unimplemented dw cirrus_vesa_unimplemented dw cirrus_vesa_unimplemented - + ;; 10h + dw cirrus_vesa_10h ASM_END diff -r dcf5e2a0d370 tools/firmware/vgabios/vgatables.h --- a/tools/firmware/vgabios/vgatables.h Thu Apr 26 11:48:41 2007 +0100 +++ b/tools/firmware/vgabios/vgatables.h Thu Apr 26 11:48:42 2007 +0100 @@ -25,6 +25,7 @@ #define BIOSMEM_VS_POINTER 0xA8 #define BIOSMEM_VBE_FLAG 0xB9 #define BIOSMEM_VBE_MODE 0xBA +#define BIOSMEM_VBE_POWER 0xBC /* --wac7ysb48OaltWcw Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --wac7ysb48OaltWcw--