aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2018-05-30 22:50:42 +0200
committerGerd Hoffmann <kraxel@redhat.com>2018-07-02 16:34:21 +0200
commit767365e5c429f399d1d107599b77e29ff5a0490b (patch)
tree279d139fa4e14a23bf458ca406e4b9eff0fd1ca5
parent7906460db114f96d656d938065bad13594f21a76 (diff)
downloadseabios-767365e5c429f399d1d107599b77e29ff5a0490b.zip
seabios-767365e5c429f399d1d107599b77e29ff5a0490b.tar.gz
seabios-767365e5c429f399d1d107599b77e29ff5a0490b.tar.bz2
cbvga: factor out cbvga_setup_modes()
Factor out generic data structure setup code from cbvga_setup(). Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> (cherry picked from commit 4d70b24b86012e382cf551ce72c2dd6c92a6d1fa)
-rw-r--r--vgasrc/cbvga.c57
-rw-r--r--vgasrc/vgautil.h1
2 files changed, 33 insertions, 25 deletions
diff --git a/vgasrc/cbvga.c b/vgasrc/cbvga.c
index f85989a..9ae97d5 100644
--- a/vgasrc/cbvga.c
+++ b/vgasrc/cbvga.c
@@ -232,10 +232,40 @@ struct cb_framebuffer {
u8 reserved_mask_size;
};
+void
+cbvga_setup_modes(u64 addr, u8 bpp, u32 xlines, u32 ylines, u32 linelength)
+{
+ int i;
+
+ SET_VGA(CBmode, 0x140);
+ SET_VGA(VBE_framebuffer, addr);
+ SET_VGA(VBE_total_memory, linelength * ylines);
+ SET_VGA(CBlinelength, linelength);
+ SET_VGA(CBmodeinfo.memmodel, MM_DIRECT);
+ SET_VGA(CBmodeinfo.width, xlines);
+ SET_VGA(CBmodeinfo.height, ylines);
+ SET_VGA(CBmodeinfo.depth, bpp);
+ SET_VGA(CBmodeinfo.cwidth, 8);
+ SET_VGA(CBmodeinfo.cheight, 16);
+ memcpy_far(get_global_seg(), &CBemulinfo
+ , get_global_seg(), &CBmodeinfo, sizeof(CBemulinfo));
+
+ // Validate modes
+ for (i = 0; i < ARRAY_SIZE(cbvesa_modes); i++) {
+ struct cbvga_mode_s *cbmode_g = &cbvesa_modes[i];
+ /* Skip VBE modes that doesn't fit into coreboot's framebuffer */
+ if ((GET_GLOBAL(cbmode_g->info.height) > ylines)
+ || (GET_GLOBAL(cbmode_g->info.width) > xlines)
+ || (GET_GLOBAL(cbmode_g->info.depth) != bpp)) {
+ dprintf(3, "Removing mode %x\n", GET_GLOBAL(cbmode_g->mode));
+ SET_VGA(cbmode_g->mode, 0xffff);
+ }
+ }
+}
+
int
cbvga_setup(void)
{
- int i;
dprintf(1, "coreboot vga init\n");
if (GET_GLOBAL(HaveRunInit))
@@ -277,29 +307,6 @@ cbvga_setup(void)
return -1;
}
- SET_VGA(CBmode, 0x140);
- SET_VGA(VBE_framebuffer, addr);
- SET_VGA(VBE_total_memory, linelength * ylines);
- SET_VGA(CBlinelength, linelength);
- SET_VGA(CBmodeinfo.memmodel, MM_DIRECT);
- SET_VGA(CBmodeinfo.width, xlines);
- SET_VGA(CBmodeinfo.height, ylines);
- SET_VGA(CBmodeinfo.depth, bpp);
- SET_VGA(CBmodeinfo.cwidth, 8);
- SET_VGA(CBmodeinfo.cheight, 16);
- memcpy_far(get_global_seg(), &CBemulinfo
- , get_global_seg(), &CBmodeinfo, sizeof(CBemulinfo));
-
- // Validate modes
- for (i = 0; i < ARRAY_SIZE(cbvesa_modes); i++) {
- struct cbvga_mode_s *cbmode_g = &cbvesa_modes[i];
- /* Skip VBE modes that doesn't fit into coreboot's framebuffer */
- if ((GET_GLOBAL(cbmode_g->info.height) > ylines)
- || (GET_GLOBAL(cbmode_g->info.width) > xlines)
- || (GET_GLOBAL(cbmode_g->info.depth) != bpp)) {
- dprintf(3, "Removing mode %x\n", GET_GLOBAL(cbmode_g->mode));
- SET_VGA(cbmode_g->mode, 0xffff);
- }
- }
+ cbvga_setup_modes(addr, bpp, xlines, ylines, linelength);
return 0;
}
diff --git a/vgasrc/vgautil.h b/vgasrc/vgautil.h
index fae5fba..e02ad3e 100644
--- a/vgasrc/vgautil.h
+++ b/vgasrc/vgautil.h
@@ -18,6 +18,7 @@ int cbvga_set_dacformat(struct vgamode_s *vmode_g, int val);
int cbvga_save_restore(int cmd, u16 seg, void *data);
int cbvga_set_mode(struct vgamode_s *vmode_g, int flags);
int cbvga_get_linesize(struct vgamode_s *vmode_g);
+void cbvga_setup_modes(u64 addr, u8 bpp, u32 xlines, u32 ylines, u32 linelength);
int cbvga_setup(void);
// clext.c