aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2011-05-31 10:50:10 -0400
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2011-06-06 11:46:00 -0400
commitc2419b4a4727f67af2fc2cd68b0d878b75e781bb (patch)
tree0fdbd76174536c40ea00cb5011e3bc1b98cc3f3d
parent61c4f2c81c61f73549928dfd9f3e8f26aa36a8cf (diff)
xen: allow enable use of VGA console on dom0
Get the information about the VGA console hardware from Xen, and put it into the form the bootloader normally generates, so that the rest of the kernel can deal with VGA as usual. [ Impact: make VGA console work in dom0 ] Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> [v1: Rebased on 2.6.39] [v2: Removed incorrect comments and fixed compile warnings] Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
-rw-r--r--arch/x86/xen/Makefile2
-rw-r--r--arch/x86/xen/enlighten.c8
-rw-r--r--arch/x86/xen/vga.c67
-rw-r--r--arch/x86/xen/xen-ops.h11
-rw-r--r--include/xen/interface/xen.h39
5 files changed, 126 insertions, 1 deletions
diff --git a/arch/x86/xen/Makefile b/arch/x86/xen/Makefile
index 17c565de3d64..a6575b949b11 100644
--- a/arch/x86/xen/Makefile
+++ b/arch/x86/xen/Makefile
@@ -18,5 +18,5 @@ obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \
18obj-$(CONFIG_SMP) += smp.o 18obj-$(CONFIG_SMP) += smp.o
19obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= spinlock.o 19obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= spinlock.o
20obj-$(CONFIG_XEN_DEBUG_FS) += debugfs.o 20obj-$(CONFIG_XEN_DEBUG_FS) += debugfs.o
21 21obj-$(CONFIG_XEN_DOM0) += vga.o
22obj-$(CONFIG_SWIOTLB_XEN) += pci-swiotlb-xen.o 22obj-$(CONFIG_SWIOTLB_XEN) += pci-swiotlb-xen.o
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index e3c6a06cf725..4abd2d5d04f7 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -1241,6 +1241,14 @@ asmlinkage void __init xen_start_kernel(void)
1241 if (pci_xen) 1241 if (pci_xen)
1242 x86_init.pci.arch_init = pci_xen_init; 1242 x86_init.pci.arch_init = pci_xen_init;
1243 } else { 1243 } else {
1244 const struct dom0_vga_console_info *info =
1245 (void *)((char *)xen_start_info +
1246 xen_start_info->console.dom0.info_off);
1247
1248 xen_init_vga(info, xen_start_info->console.dom0.info_size);
1249 xen_start_info->console.domU.mfn = 0;
1250 xen_start_info->console.domU.evtchn = 0;
1251
1244 /* Make sure ACS will be enabled */ 1252 /* Make sure ACS will be enabled */
1245 pci_request_acs(); 1253 pci_request_acs();
1246 } 1254 }
diff --git a/arch/x86/xen/vga.c b/arch/x86/xen/vga.c
new file mode 100644
index 000000000000..1cd7f4d11e29
--- /dev/null
+++ b/arch/x86/xen/vga.c
@@ -0,0 +1,67 @@
1#include <linux/screen_info.h>
2#include <linux/init.h>
3
4#include <asm/bootparam.h>
5#include <asm/setup.h>
6
7#include <xen/interface/xen.h>
8
9#include "xen-ops.h"
10
11void __init xen_init_vga(const struct dom0_vga_console_info *info, size_t size)
12{
13 struct screen_info *screen_info = &boot_params.screen_info;
14
15 /* This is drawn from a dump from vgacon:startup in
16 * standard Linux. */
17 screen_info->orig_video_mode = 3;
18 screen_info->orig_video_isVGA = 1;
19 screen_info->orig_video_lines = 25;
20 screen_info->orig_video_cols = 80;
21 screen_info->orig_video_ega_bx = 3;
22 screen_info->orig_video_points = 16;
23 screen_info->orig_y = screen_info->orig_video_lines - 1;
24
25 switch (info->video_type) {
26 case XEN_VGATYPE_TEXT_MODE_3:
27 if (size < offsetof(struct dom0_vga_console_info, u.text_mode_3)
28 + sizeof(info->u.text_mode_3))
29 break;
30 screen_info->orig_video_lines = info->u.text_mode_3.rows;
31 screen_info->orig_video_cols = info->u.text_mode_3.columns;
32 screen_info->orig_x = info->u.text_mode_3.cursor_x;
33 screen_info->orig_y = info->u.text_mode_3.cursor_y;
34 screen_info->orig_video_points =
35 info->u.text_mode_3.font_height;
36 break;
37
38 case XEN_VGATYPE_VESA_LFB:
39 if (size < offsetof(struct dom0_vga_console_info,
40 u.vesa_lfb.gbl_caps))
41 break;
42 screen_info->orig_video_isVGA = VIDEO_TYPE_VLFB;
43 screen_info->lfb_width = info->u.vesa_lfb.width;
44 screen_info->lfb_height = info->u.vesa_lfb.height;
45 screen_info->lfb_depth = info->u.vesa_lfb.bits_per_pixel;
46 screen_info->lfb_base = info->u.vesa_lfb.lfb_base;
47 screen_info->lfb_size = info->u.vesa_lfb.lfb_size;
48 screen_info->lfb_linelength = info->u.vesa_lfb.bytes_per_line;
49 screen_info->red_size = info->u.vesa_lfb.red_size;
50 screen_info->red_pos = info->u.vesa_lfb.red_pos;
51 screen_info->green_size = info->u.vesa_lfb.green_size;
52 screen_info->green_pos = info->u.vesa_lfb.green_pos;
53 screen_info->blue_size = info->u.vesa_lfb.blue_size;
54 screen_info->blue_pos = info->u.vesa_lfb.blue_pos;
55 screen_info->rsvd_size = info->u.vesa_lfb.rsvd_size;
56 screen_info->rsvd_pos = info->u.vesa_lfb.rsvd_pos;
57 if (size >= offsetof(struct dom0_vga_console_info,
58 u.vesa_lfb.gbl_caps)
59 + sizeof(info->u.vesa_lfb.gbl_caps))
60 screen_info->capabilities = info->u.vesa_lfb.gbl_caps;
61 if (size >= offsetof(struct dom0_vga_console_info,
62 u.vesa_lfb.mode_attrs)
63 + sizeof(info->u.vesa_lfb.mode_attrs))
64 screen_info->vesa_attributes = info->u.vesa_lfb.mode_attrs;
65 break;
66 }
67}
diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h
index 3112f55638c4..e14c54eff23d 100644
--- a/arch/x86/xen/xen-ops.h
+++ b/arch/x86/xen/xen-ops.h
@@ -88,6 +88,17 @@ static inline void xen_uninit_lock_cpu(int cpu)
88} 88}
89#endif 89#endif
90 90
91struct dom0_vga_console_info;
92
93#ifdef CONFIG_XEN_DOM0
94void __init xen_init_vga(const struct dom0_vga_console_info *, size_t size);
95#else
96static inline void __init xen_init_vga(const struct dom0_vga_console_info *info,
97 size_t size)
98{
99}
100#endif
101
91/* Declare an asm function, along with symbols needed to make it 102/* Declare an asm function, along with symbols needed to make it
92 inlineable */ 103 inlineable */
93#define DECL_ASM(ret, name, ...) \ 104#define DECL_ASM(ret, name, ...) \
diff --git a/include/xen/interface/xen.h b/include/xen/interface/xen.h
index b33257bc7e83..29b362eab6cc 100644
--- a/include/xen/interface/xen.h
+++ b/include/xen/interface/xen.h
@@ -449,6 +449,45 @@ struct start_info {
449 int8_t cmd_line[MAX_GUEST_CMDLINE]; 449 int8_t cmd_line[MAX_GUEST_CMDLINE];
450}; 450};
451 451
452struct dom0_vga_console_info {
453 uint8_t video_type;
454#define XEN_VGATYPE_TEXT_MODE_3 0x03
455#define XEN_VGATYPE_VESA_LFB 0x23
456
457 union {
458 struct {
459 /* Font height, in pixels. */
460 uint16_t font_height;
461 /* Cursor location (column, row). */
462 uint16_t cursor_x, cursor_y;
463 /* Number of rows and columns (dimensions in characters). */
464 uint16_t rows, columns;
465 } text_mode_3;
466
467 struct {
468 /* Width and height, in pixels. */
469 uint16_t width, height;
470 /* Bytes per scan line. */
471 uint16_t bytes_per_line;
472 /* Bits per pixel. */
473 uint16_t bits_per_pixel;
474 /* LFB physical address, and size (in units of 64kB). */
475 uint32_t lfb_base;
476 uint32_t lfb_size;
477 /* RGB mask offsets and sizes, as defined by VBE 1.2+ */
478 uint8_t red_pos, red_size;
479 uint8_t green_pos, green_size;
480 uint8_t blue_pos, blue_size;
481 uint8_t rsvd_pos, rsvd_size;
482
483 /* VESA capabilities (offset 0xa, VESA command 0x4f00). */
484 uint32_t gbl_caps;
485 /* Mode attributes (offset 0x0, VESA command 0x4f01). */
486 uint16_t mode_attrs;
487 } vesa_lfb;
488 } u;
489};
490
452/* These flags are passed in the 'flags' field of start_info_t. */ 491/* These flags are passed in the 'flags' field of start_info_t. */
453#define SIF_PRIVILEGED (1<<0) /* Is the domain privileged? */ 492#define SIF_PRIVILEGED (1<<0) /* Is the domain privileged? */
454#define SIF_INITDOMAIN (1<<1) /* Is this the initial control domain? */ 493#define SIF_INITDOMAIN (1<<1) /* Is this the initial control domain? */