Commit 1cac5004 authored by H. Peter Anvin's avatar H. Peter Anvin Committed by Ingo Molnar

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: default avatarH. Peter Anvin <hpa@zytor.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 02a7b425
...@@ -104,6 +104,7 @@ static int bios_probe(void) ...@@ -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) ...@@ -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,
......
...@@ -79,20 +79,28 @@ static int vesa_probe(void) ...@@ -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
} }
......
...@@ -18,22 +18,22 @@ ...@@ -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;
......
...@@ -293,13 +293,28 @@ static void display_menu(void) ...@@ -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) ...@@ -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) ...@@ -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)
......
...@@ -83,7 +83,8 @@ void store_screen(void); ...@@ -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 {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment