1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/screen_info.h>
3 #include <linux/init.h>
5 #include <asm/bootparam.h>
8 #include <xen/interface/xen.h>
12 void __init
xen_init_vga(const struct dom0_vga_console_info
*info
, size_t size
)
14 struct screen_info
*screen_info
= &boot_params
.screen_info
;
16 /* This is drawn from a dump from vgacon:startup in
18 screen_info
->orig_video_mode
= 3;
19 screen_info
->orig_video_isVGA
= 1;
20 screen_info
->orig_video_lines
= 25;
21 screen_info
->orig_video_cols
= 80;
22 screen_info
->orig_video_ega_bx
= 3;
23 screen_info
->orig_video_points
= 16;
24 screen_info
->orig_y
= screen_info
->orig_video_lines
- 1;
26 switch (info
->video_type
) {
27 case XEN_VGATYPE_TEXT_MODE_3
:
28 if (size
< offsetof(struct dom0_vga_console_info
, u
.text_mode_3
)
29 + sizeof(info
->u
.text_mode_3
))
31 screen_info
->orig_video_lines
= info
->u
.text_mode_3
.rows
;
32 screen_info
->orig_video_cols
= info
->u
.text_mode_3
.columns
;
33 screen_info
->orig_x
= info
->u
.text_mode_3
.cursor_x
;
34 screen_info
->orig_y
= info
->u
.text_mode_3
.cursor_y
;
35 screen_info
->orig_video_points
=
36 info
->u
.text_mode_3
.font_height
;
39 case XEN_VGATYPE_EFI_LFB
:
40 case XEN_VGATYPE_VESA_LFB
:
41 if (size
< offsetof(struct dom0_vga_console_info
,
44 screen_info
->orig_video_isVGA
= VIDEO_TYPE_VLFB
;
45 screen_info
->lfb_width
= info
->u
.vesa_lfb
.width
;
46 screen_info
->lfb_height
= info
->u
.vesa_lfb
.height
;
47 screen_info
->lfb_depth
= info
->u
.vesa_lfb
.bits_per_pixel
;
48 screen_info
->lfb_base
= info
->u
.vesa_lfb
.lfb_base
;
49 screen_info
->lfb_size
= info
->u
.vesa_lfb
.lfb_size
;
50 screen_info
->lfb_linelength
= info
->u
.vesa_lfb
.bytes_per_line
;
51 screen_info
->red_size
= info
->u
.vesa_lfb
.red_size
;
52 screen_info
->red_pos
= info
->u
.vesa_lfb
.red_pos
;
53 screen_info
->green_size
= info
->u
.vesa_lfb
.green_size
;
54 screen_info
->green_pos
= info
->u
.vesa_lfb
.green_pos
;
55 screen_info
->blue_size
= info
->u
.vesa_lfb
.blue_size
;
56 screen_info
->blue_pos
= info
->u
.vesa_lfb
.blue_pos
;
57 screen_info
->rsvd_size
= info
->u
.vesa_lfb
.rsvd_size
;
58 screen_info
->rsvd_pos
= info
->u
.vesa_lfb
.rsvd_pos
;
60 if (info
->video_type
== XEN_VGATYPE_EFI_LFB
) {
61 screen_info
->orig_video_isVGA
= VIDEO_TYPE_EFI
;
65 if (size
>= offsetof(struct dom0_vga_console_info
,
67 + sizeof(info
->u
.vesa_lfb
.gbl_caps
))
68 screen_info
->capabilities
= info
->u
.vesa_lfb
.gbl_caps
;
69 if (size
>= offsetof(struct dom0_vga_console_info
,
70 u
.vesa_lfb
.mode_attrs
)
71 + sizeof(info
->u
.vesa_lfb
.mode_attrs
))
72 screen_info
->vesa_attributes
= info
->u
.vesa_lfb
.mode_attrs
;