Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
c2419b4a JF |
2 | #include <linux/screen_info.h> |
3 | #include <linux/init.h> | |
4 | ||
c2419b4a JF |
5 | #include <asm/setup.h> |
6 | ||
7 | #include <xen/interface/xen.h> | |
8 | ||
9 | #include "xen-ops.h" | |
10 | ||
934ef33e JB |
11 | void __init xen_init_vga(const struct dom0_vga_console_info *info, size_t size, |
12 | struct screen_info *screen_info) | |
c2419b4a | 13 | { |
c2419b4a JF |
14 | /* This is drawn from a dump from vgacon:startup in |
15 | * standard Linux. */ | |
16 | screen_info->orig_video_mode = 3; | |
17 | screen_info->orig_video_isVGA = 1; | |
18 | screen_info->orig_video_lines = 25; | |
19 | screen_info->orig_video_cols = 80; | |
20 | screen_info->orig_video_ega_bx = 3; | |
21 | screen_info->orig_video_points = 16; | |
22 | screen_info->orig_y = screen_info->orig_video_lines - 1; | |
23 | ||
24 | switch (info->video_type) { | |
25 | case XEN_VGATYPE_TEXT_MODE_3: | |
26 | if (size < offsetof(struct dom0_vga_console_info, u.text_mode_3) | |
27 | + sizeof(info->u.text_mode_3)) | |
28 | break; | |
29 | screen_info->orig_video_lines = info->u.text_mode_3.rows; | |
30 | screen_info->orig_video_cols = info->u.text_mode_3.columns; | |
31 | screen_info->orig_x = info->u.text_mode_3.cursor_x; | |
32 | screen_info->orig_y = info->u.text_mode_3.cursor_y; | |
33 | screen_info->orig_video_points = | |
34 | info->u.text_mode_3.font_height; | |
35 | break; | |
36 | ||
aa387d63 | 37 | case XEN_VGATYPE_EFI_LFB: |
c2419b4a JF |
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; | |
aa387d63 | 57 | |
f34c4f2d JB |
58 | if (size >= offsetof(struct dom0_vga_console_info, |
59 | u.vesa_lfb.ext_lfb_base) | |
60 | + sizeof(info->u.vesa_lfb.ext_lfb_base) | |
61 | && info->u.vesa_lfb.ext_lfb_base) { | |
62 | screen_info->ext_lfb_base = info->u.vesa_lfb.ext_lfb_base; | |
63 | screen_info->capabilities |= VIDEO_CAPABILITY_64BIT_BASE; | |
64 | } | |
65 | ||
aa387d63 JB |
66 | if (info->video_type == XEN_VGATYPE_EFI_LFB) { |
67 | screen_info->orig_video_isVGA = VIDEO_TYPE_EFI; | |
68 | break; | |
69 | } | |
70 | ||
c2419b4a JF |
71 | if (size >= offsetof(struct dom0_vga_console_info, |
72 | u.vesa_lfb.mode_attrs) | |
73 | + sizeof(info->u.vesa_lfb.mode_attrs)) | |
74 | screen_info->vesa_attributes = info->u.vesa_lfb.mode_attrs; | |
75 | break; | |
76 | } | |
77 | } |