x86 setup: display VESA graphics modes in vga=ask menu

Display VESA graphics modes, with their mode IDs, in the vga=ask
menu.  Most VESA mode numbers are platform-dependent, so it helps to
have an easy way to display them.

Based in part on a patch by Petr Vandrovec <petr@vandrovec.name>.

Cc: Petr Vandrovec <petr@vandrovec.name>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
H. Peter Anvin 2008-01-30 13:33:02 +01:00 committed by Ingo Molnar
parent 02a7b425e8
commit 1cac5004e9
5 changed files with 61 additions and 24 deletions

View file

@ -104,6 +104,7 @@ static int bios_probe(void)
mi = GET_HEAP(struct mode_info, 1); mi = GET_HEAP(struct mode_info, 1);
mi->mode = VIDEO_FIRST_BIOS+mode; mi->mode = VIDEO_FIRST_BIOS+mode;
mi->depth = 0; /* text */
mi->x = rdfs16(0x44a); mi->x = rdfs16(0x44a);
mi->y = rdfs8(0x484)+1; mi->y = rdfs8(0x484)+1;
nmodes++; nmodes++;
@ -116,7 +117,7 @@ static int bios_probe(void)
__videocard video_bios = __videocard video_bios =
{ {
.card_name = "BIOS (scanned)", .card_name = "BIOS",
.probe = bios_probe, .probe = bios_probe,
.set_mode = bios_set_mode, .set_mode = bios_set_mode,
.unsafe = 1, .unsafe = 1,

View file

@ -79,20 +79,28 @@ static int vesa_probe(void)
/* Text Mode, TTY BIOS supported, /* Text Mode, TTY BIOS supported,
supported by hardware */ supported by hardware */
mi = GET_HEAP(struct mode_info, 1); mi = GET_HEAP(struct mode_info, 1);
mi->mode = mode + VIDEO_FIRST_VESA; mi->mode = mode + VIDEO_FIRST_VESA;
mi->x = vminfo.h_res; mi->depth = 0; /* text */
mi->y = vminfo.v_res; mi->x = vminfo.h_res;
mi->y = vminfo.v_res;
nmodes++; nmodes++;
} else if ((vminfo.mode_attr & 0x99) == 0x99) { } else if ((vminfo.mode_attr & 0x99) == 0x99 &&
(vminfo.memory_layout == 4 ||
vminfo.memory_layout == 6) &&
vminfo.memory_planes == 1) {
#ifdef CONFIG_FB #ifdef CONFIG_FB
/* Graphics mode, color, linear frame buffer /* Graphics mode, color, linear frame buffer
supported -- register the mode but hide from supported. Only register the mode if
the menu. Only do this if framebuffer is if framebuffer is configured, however,
configured, however, otherwise the user will otherwise the user will be left without a screen.
be left without a screen. */ We don't require CONFIG_FB_VESA, however, since
some of the other framebuffer drivers can use
this mode-setting, too. */
mi = GET_HEAP(struct mode_info, 1); mi = GET_HEAP(struct mode_info, 1);
mi->mode = mode + VIDEO_FIRST_VESA; mi->mode = mode + VIDEO_FIRST_VESA;
mi->x = mi->y = 0; mi->depth = vminfo.bpp;
mi->x = vminfo.h_res;
mi->y = vminfo.v_res;
nmodes++; nmodes++;
#endif #endif
} }

View file

@ -18,22 +18,22 @@
#include "video.h" #include "video.h"
static struct mode_info vga_modes[] = { static struct mode_info vga_modes[] = {
{ VIDEO_80x25, 80, 25 }, { VIDEO_80x25, 80, 25, 0 },
{ VIDEO_8POINT, 80, 50 }, { VIDEO_8POINT, 80, 50, 0 },
{ VIDEO_80x43, 80, 43 }, { VIDEO_80x43, 80, 43, 0 },
{ VIDEO_80x28, 80, 28 }, { VIDEO_80x28, 80, 28, 0 },
{ VIDEO_80x30, 80, 30 }, { VIDEO_80x30, 80, 30, 0 },
{ VIDEO_80x34, 80, 34 }, { VIDEO_80x34, 80, 34, 0 },
{ VIDEO_80x60, 80, 60 }, { VIDEO_80x60, 80, 60, 0 },
}; };
static struct mode_info ega_modes[] = { static struct mode_info ega_modes[] = {
{ VIDEO_80x25, 80, 25 }, { VIDEO_80x25, 80, 25, 0 },
{ VIDEO_8POINT, 80, 43 }, { VIDEO_8POINT, 80, 43, 0 },
}; };
static struct mode_info cga_modes[] = { static struct mode_info cga_modes[] = {
{ VIDEO_80x25, 80, 25 }, { VIDEO_80x25, 80, 25, 0 },
}; };
__videocard video_vga; __videocard video_vga;

View file

@ -293,13 +293,28 @@ static void display_menu(void)
struct mode_info *mi; struct mode_info *mi;
char ch; char ch;
int i; int i;
int nmodes;
int modes_per_line;
int col;
puts("Mode: COLSxROWS:\n"); nmodes = 0;
for (card = video_cards; card < video_cards_end; card++)
nmodes += card->nmodes;
modes_per_line = 1;
if (nmodes >= 20)
modes_per_line = 3;
for (col = 0; col < modes_per_line; col++)
puts("Mode: Resolution: Type: ");
putchar('\n');
col = 0;
ch = '0'; ch = '0';
for (card = video_cards; card < video_cards_end; card++) { for (card = video_cards; card < video_cards_end; card++) {
mi = card->modes; mi = card->modes;
for (i = 0; i < card->nmodes; i++, mi++) { for (i = 0; i < card->nmodes; i++, mi++) {
char resbuf[32];
int visible = mi->x && mi->y; int visible = mi->x && mi->y;
u16 mode_id = mi->mode ? mi->mode : u16 mode_id = mi->mode ? mi->mode :
(mi->y << 8)+mi->x; (mi->y << 8)+mi->x;
@ -307,8 +322,18 @@ static void display_menu(void)
if (!visible) if (!visible)
continue; /* Hidden mode */ continue; /* Hidden mode */
printf("%c %04X %3dx%-3d %s\n", if (mi->depth)
ch, mode_id, mi->x, mi->y, card->card_name); sprintf(resbuf, "%dx%d", mi->y, mi->depth);
else
sprintf(resbuf, "%d", mi->y);
printf("%c %03X %4dx%-7s %-6s",
ch, mode_id, mi->x, resbuf, card->card_name);
col++;
if (col >= modes_per_line) {
putchar('\n');
col = 0;
}
if (ch == '9') if (ch == '9')
ch = 'a'; ch = 'a';
@ -318,6 +343,8 @@ static void display_menu(void)
ch++; ch++;
} }
} }
if (col)
putchar('\n');
} }
#define H(x) ((x)-'a'+10) #define H(x) ((x)-'a'+10)

View file

@ -83,7 +83,8 @@ void store_screen(void);
struct mode_info { struct mode_info {
u16 mode; /* Mode number (vga= style) */ u16 mode; /* Mode number (vga= style) */
u8 x, y; /* Width, height */ u16 x, y; /* Width, height */
u16 depth; /* Bits per pixel, 0 for text mode */
}; };
struct card_info { struct card_info {