diff options
Diffstat (limited to 'arch/x86/boot/video.h')
-rw-r--r-- | arch/x86/boot/video.h | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/arch/x86/boot/video.h b/arch/x86/boot/video.h new file mode 100644 index 000000000000..b92447d51213 --- /dev/null +++ b/arch/x86/boot/video.h | |||
@@ -0,0 +1,152 @@ | |||
1 | /* -*- linux-c -*- ------------------------------------------------------- * | ||
2 | * | ||
3 | * Copyright (C) 1991, 1992 Linus Torvalds | ||
4 | * Copyright 2007 rPath, Inc. - All Rights Reserved | ||
5 | * | ||
6 | * This file is part of the Linux kernel, and is made available under | ||
7 | * the terms of the GNU General Public License version 2. | ||
8 | * | ||
9 | * ----------------------------------------------------------------------- */ | ||
10 | |||
11 | /* | ||
12 | * arch/i386/boot/video.h | ||
13 | * | ||
14 | * Header file for the real-mode video probing code | ||
15 | */ | ||
16 | |||
17 | #ifndef BOOT_VIDEO_H | ||
18 | #define BOOT_VIDEO_H | ||
19 | |||
20 | #include <linux/types.h> | ||
21 | |||
22 | /* Enable autodetection of SVGA adapters and modes. */ | ||
23 | #undef CONFIG_VIDEO_SVGA | ||
24 | |||
25 | /* Enable autodetection of VESA modes */ | ||
26 | #define CONFIG_VIDEO_VESA | ||
27 | |||
28 | /* Retain screen contents when switching modes */ | ||
29 | #define CONFIG_VIDEO_RETAIN | ||
30 | |||
31 | /* Force 400 scan lines for standard modes (hack to fix bad BIOS behaviour */ | ||
32 | #undef CONFIG_VIDEO_400_HACK | ||
33 | |||
34 | /* This code uses an extended set of video mode numbers. These include: | ||
35 | * Aliases for standard modes | ||
36 | * NORMAL_VGA (-1) | ||
37 | * EXTENDED_VGA (-2) | ||
38 | * ASK_VGA (-3) | ||
39 | * Video modes numbered by menu position -- NOT RECOMMENDED because of lack | ||
40 | * of compatibility when extending the table. These are between 0x00 and 0xff. | ||
41 | */ | ||
42 | #define VIDEO_FIRST_MENU 0x0000 | ||
43 | |||
44 | /* Standard BIOS video modes (BIOS number + 0x0100) */ | ||
45 | #define VIDEO_FIRST_BIOS 0x0100 | ||
46 | |||
47 | /* VESA BIOS video modes (VESA number + 0x0200) */ | ||
48 | #define VIDEO_FIRST_VESA 0x0200 | ||
49 | |||
50 | /* Video7 special modes (BIOS number + 0x0900) */ | ||
51 | #define VIDEO_FIRST_V7 0x0900 | ||
52 | |||
53 | /* Special video modes */ | ||
54 | #define VIDEO_FIRST_SPECIAL 0x0f00 | ||
55 | #define VIDEO_80x25 0x0f00 | ||
56 | #define VIDEO_8POINT 0x0f01 | ||
57 | #define VIDEO_80x43 0x0f02 | ||
58 | #define VIDEO_80x28 0x0f03 | ||
59 | #define VIDEO_CURRENT_MODE 0x0f04 | ||
60 | #define VIDEO_80x30 0x0f05 | ||
61 | #define VIDEO_80x34 0x0f06 | ||
62 | #define VIDEO_80x60 0x0f07 | ||
63 | #define VIDEO_GFX_HACK 0x0f08 | ||
64 | #define VIDEO_LAST_SPECIAL 0x0f09 | ||
65 | |||
66 | /* Video modes given by resolution */ | ||
67 | #define VIDEO_FIRST_RESOLUTION 0x1000 | ||
68 | |||
69 | /* The "recalculate timings" flag */ | ||
70 | #define VIDEO_RECALC 0x8000 | ||
71 | |||
72 | /* Define DO_STORE according to CONFIG_VIDEO_RETAIN */ | ||
73 | #ifdef CONFIG_VIDEO_RETAIN | ||
74 | void store_screen(void); | ||
75 | #define DO_STORE() store_screen() | ||
76 | #else | ||
77 | #define DO_STORE() ((void)0) | ||
78 | #endif /* CONFIG_VIDEO_RETAIN */ | ||
79 | |||
80 | /* | ||
81 | * Mode table structures | ||
82 | */ | ||
83 | |||
84 | struct mode_info { | ||
85 | u16 mode; /* Mode number (vga= style) */ | ||
86 | u8 x, y; /* Width, height */ | ||
87 | }; | ||
88 | |||
89 | struct card_info { | ||
90 | const char *card_name; | ||
91 | int (*set_mode)(struct mode_info *mode); | ||
92 | int (*probe)(void); | ||
93 | struct mode_info *modes; | ||
94 | int nmodes; /* Number of probed modes so far */ | ||
95 | int unsafe; /* Probing is unsafe, only do after "scan" */ | ||
96 | u16 xmode_first; /* Unprobed modes to try to call anyway */ | ||
97 | u16 xmode_n; /* Size of unprobed mode range */ | ||
98 | }; | ||
99 | |||
100 | #define __videocard struct card_info __attribute__((section(".videocards"))) | ||
101 | extern struct card_info video_cards[], video_cards_end[]; | ||
102 | |||
103 | int mode_defined(u16 mode); /* video.c */ | ||
104 | |||
105 | /* Basic video information */ | ||
106 | #define ADAPTER_CGA 0 /* CGA/MDA/HGC */ | ||
107 | #define ADAPTER_EGA 1 | ||
108 | #define ADAPTER_VGA 2 | ||
109 | |||
110 | extern int adapter; | ||
111 | extern u16 video_segment; | ||
112 | extern int force_x, force_y; /* Don't query the BIOS for cols/rows */ | ||
113 | extern int do_restore; /* Restore screen contents */ | ||
114 | extern int graphic_mode; /* Graphics mode with linear frame buffer */ | ||
115 | |||
116 | /* | ||
117 | * int $0x10 is notorious for touching registers it shouldn't. | ||
118 | * gcc doesn't like %ebp being clobbered, so define it as a push/pop | ||
119 | * sequence here. | ||
120 | * | ||
121 | * A number of systems, including the original PC can clobber %bp in | ||
122 | * certain circumstances, like when scrolling. There exists at least | ||
123 | * one Trident video card which could clobber DS under a set of | ||
124 | * circumstances that we are unlikely to encounter (scrolling when | ||
125 | * using an extended graphics mode of more than 800x600 pixels), but | ||
126 | * it's cheap insurance to deal with that here. | ||
127 | */ | ||
128 | #define INT10 "pushl %%ebp; pushw %%ds; int $0x10; popw %%ds; popl %%ebp" | ||
129 | |||
130 | /* Accessing VGA indexed registers */ | ||
131 | static inline u8 in_idx(u16 port, u8 index) | ||
132 | { | ||
133 | outb(index, port); | ||
134 | return inb(port+1); | ||
135 | } | ||
136 | |||
137 | static inline void out_idx(u8 v, u16 port, u8 index) | ||
138 | { | ||
139 | outw(index+(v << 8), port); | ||
140 | } | ||
141 | |||
142 | /* Writes a value to an indexed port and then reads the port again */ | ||
143 | static inline u8 tst_idx(u8 v, u16 port, u8 index) | ||
144 | { | ||
145 | out_idx(port, index, v); | ||
146 | return in_idx(port, index); | ||
147 | } | ||
148 | |||
149 | /* Get the I/O port of the VGA CRTC */ | ||
150 | u16 vga_crtc(void); /* video-vga.c */ | ||
151 | |||
152 | #endif /* BOOT_VIDEO_H */ | ||