Commit | Line | Data |
---|---|---|
c2419b4a JF |
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 | ||
11 | void __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 | ||
aa387d63 | 38 | case XEN_VGATYPE_EFI_LFB: |
c2419b4a JF |
39 | case XEN_VGATYPE_VESA_LFB: |
40 | if (size < offsetof(struct dom0_vga_console_info, | |
41 | u.vesa_lfb.gbl_caps)) | |
42 | break; | |
43 | screen_info->orig_video_isVGA = VIDEO_TYPE_VLFB; | |
44 | screen_info->lfb_width = info->u.vesa_lfb.width; | |
45 | screen_info->lfb_height = info->u.vesa_lfb.height; | |
46 | screen_info->lfb_depth = info->u.vesa_lfb.bits_per_pixel; | |
47 | screen_info->lfb_base = info->u.vesa_lfb.lfb_base; | |
48 | screen_info->lfb_size = info->u.vesa_lfb.lfb_size; | |
49 | screen_info->lfb_linelength = info->u.vesa_lfb.bytes_per_line; | |
50 | screen_info->red_size = info->u.vesa_lfb.red_size; | |
51 | screen_info->red_pos = info->u.vesa_lfb.red_pos; | |
52 | screen_info->green_size = info->u.vesa_lfb.green_size; | |
53 | screen_info->green_pos = info->u.vesa_lfb.green_pos; | |
54 | screen_info->blue_size = info->u.vesa_lfb.blue_size; | |
55 | screen_info->blue_pos = info->u.vesa_lfb.blue_pos; | |
56 | screen_info->rsvd_size = info->u.vesa_lfb.rsvd_size; | |
57 | screen_info->rsvd_pos = info->u.vesa_lfb.rsvd_pos; | |
aa387d63 JB |
58 | |
59 | if (info->video_type == XEN_VGATYPE_EFI_LFB) { | |
60 | screen_info->orig_video_isVGA = VIDEO_TYPE_EFI; | |
61 | break; | |
62 | } | |
63 | ||
c2419b4a JF |
64 | if (size >= offsetof(struct dom0_vga_console_info, |
65 | u.vesa_lfb.gbl_caps) | |
66 | + sizeof(info->u.vesa_lfb.gbl_caps)) | |
67 | screen_info->capabilities = info->u.vesa_lfb.gbl_caps; | |
68 | if (size >= offsetof(struct dom0_vga_console_info, | |
69 | u.vesa_lfb.mode_attrs) | |
70 | + sizeof(info->u.vesa_lfb.mode_attrs)) | |
71 | screen_info->vesa_attributes = info->u.vesa_lfb.mode_attrs; | |
72 | break; | |
73 | } | |
74 | } |