Commit | Line | Data |
---|---|---|
5e8ddcbe PA |
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. | |
8c027ae2 PA |
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. | |
5e8ddcbe | 127 | */ |
8c027ae2 | 128 | #define INT10 "pushl %%ebp; pushw %%ds; int $0x10; popw %%ds; popl %%ebp" |
5e8ddcbe PA |
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 */ |