aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/arch/x86/boot/video.S3
-rw-r--r--xen/arch/x86/setup.c3
-rw-r--r--xen/drivers/video/vesa.c2
-rw-r--r--xen/include/public/xen-compat.h2
-rw-r--r--xen/include/public/xen.h6
5 files changed, 14 insertions, 2 deletions
diff --git a/xen/arch/x86/boot/video.S b/xen/arch/x86/boot/video.S
index 1e3c034234..d27fb12330 100644
--- a/xen/arch/x86/boot/video.S
+++ b/xen/arch/x86/boot/video.S
@@ -44,6 +44,7 @@
#define PARAM_LFB_COLORS 0x1c
#define PARAM_VESAPM_SEG 0x24
#define PARAM_VESAPM_OFF 0x26
+#define PARAM_VESA_ATTRIB 0x28
#define _param(param) bootsym(boot_vid_info)+(param)
video: xorw %ax, %ax
@@ -129,6 +130,8 @@ mopar_gr:
movl %eax, _param(PARAM_LFB_COLORS)
movl 35(%di), %eax
movl %eax, _param(PARAM_LFB_COLORS+4)
+ movw 0(%di), %ax
+ movw %ax, _param(PARAM_VESA_ATTRIB)
# get video mem size
leaw vesa_glob_info, %di
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index d58642bbba..f1f161597c 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -308,6 +308,7 @@ struct boot_video_info {
u8 rsvd_pos; /* 0x23 */
u16 vesapm_seg; /* 0x24 */
u16 vesapm_off; /* 0x26 */
+ u16 vesa_attrib; /* 0x28 */
};
static void __init parse_video_info(void)
@@ -340,6 +341,8 @@ static void __init parse_video_info(void)
vga_console_info.u.vesa_lfb.blue_size = bvi->blue_size;
vga_console_info.u.vesa_lfb.rsvd_pos = bvi->rsvd_pos;
vga_console_info.u.vesa_lfb.rsvd_size = bvi->rsvd_size;
+ vga_console_info.u.vesa_lfb.gbl_caps = bvi->capabilities;
+ vga_console_info.u.vesa_lfb.mode_attrs = bvi->vesa_attrib;
}
}
diff --git a/xen/drivers/video/vesa.c b/xen/drivers/video/vesa.c
index 8f5b5c690b..04064f786d 100644
--- a/xen/drivers/video/vesa.c
+++ b/xen/drivers/video/vesa.c
@@ -46,7 +46,7 @@ void __init vesa_early_init(void)
{
unsigned int vram_vmode;
- /* XXX vga_compat = !(boot_video_info.capabilities & 2); */
+ vga_compat = !(vesa_lfb_info.capabilities & 2);
if ( (vlfb_info.bits_per_pixel < 8) || (vlfb_info.bits_per_pixel > 32) )
return;
diff --git a/xen/include/public/xen-compat.h b/xen/include/public/xen-compat.h
index 19b0a2c733..77ca51af1a 100644
--- a/xen/include/public/xen-compat.h
+++ b/xen/include/public/xen-compat.h
@@ -27,7 +27,7 @@
#ifndef __XEN_PUBLIC_XEN_COMPAT_H__
#define __XEN_PUBLIC_XEN_COMPAT_H__
-#define __XEN_LATEST_INTERFACE_VERSION__ 0x00030205
+#define __XEN_LATEST_INTERFACE_VERSION__ 0x00030206
#if defined(__XEN__) || defined(__XEN_TOOLS__)
/* Xen is built with matching headers and implements the latest interface. */
diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h
index 3a06ebfe21..991128f0ee 100644
--- a/xen/include/public/xen.h
+++ b/xen/include/public/xen.h
@@ -565,6 +565,12 @@ typedef struct dom0_vga_console_info {
uint8_t green_pos, green_size;
uint8_t blue_pos, blue_size;
uint8_t rsvd_pos, rsvd_size;
+#if __XEN_INTERFACE_VERSION__ >= 0x00030206
+ /* VESA capabilities (offset 0xa, VESA command 0x4f00). */
+ uint32_t gbl_caps;
+ /* Mode attributes (offset 0x0, VESA command 0x4f01). */
+ uint16_t mode_attrs;
+#endif
} vesa_lfb;
} u;
} dom0_vga_console_info_t;