aboutsummaryrefslogtreecommitdiff
path: root/vgasrc
diff options
context:
space:
mode:
authorPatrick Rudolph <siro@das-labor.org>2017-05-29 19:25:12 +0200
committerKevin O'Connor <kevin@koconnor.net>2017-06-12 15:17:09 -0400
commit4902b8a703779ee2d85da406d6f1dc16df71a43d (patch)
tree9d78ef245ac730a3b2a1bd5e70f0d1ef1ec1db2e /vgasrc
parent4b42cc4b31f682214ab473838f0de0584f58cba8 (diff)
downloadseabios-hppa-4902b8a703779ee2d85da406d6f1dc16df71a43d.zip
seabios-hppa-4902b8a703779ee2d85da406d6f1dc16df71a43d.tar.gz
seabios-hppa-4902b8a703779ee2d85da406d6f1dc16df71a43d.tar.bz2
SeaVGABIOS/vbe: Query driver for scanline pitch v2
Query the driver for the real scanline pitch in bytes. As cbvga doesn't change the pitch on mode change, always return the same pitch, that might exceed width times Bytes-per-pixel. Report the default stdvga pitch for all other drivers. Signed-off-by: Patrick Rudolph <siro@das-labor.org>
Diffstat (limited to 'vgasrc')
-rw-r--r--vgasrc/cbvga.c7
-rw-r--r--vgasrc/stdvga.c5
-rw-r--r--vgasrc/vbe.c2
-rw-r--r--vgasrc/vgahw.h6
-rw-r--r--vgasrc/vgautil.h2
5 files changed, 21 insertions, 1 deletions
diff --git a/vgasrc/cbvga.c b/vgasrc/cbvga.c
index 39ffdbb..417ade3 100644
--- a/vgasrc/cbvga.c
+++ b/vgasrc/cbvga.c
@@ -115,6 +115,13 @@ cbvga_set_mode(struct vgamode_s *vmode_g, int flags)
return 0;
}
+int
+cbvga_get_linesize(struct vgamode_s *vmode_g)
+{
+ /* Can't change mode, always report active pitch. */
+ return GET_GLOBAL(CBlinelength);
+}
+
#define CB_TAG_FRAMEBUFFER 0x0012
struct cb_framebuffer {
u32 tag;
diff --git a/vgasrc/stdvga.c b/vgasrc/stdvga.c
index 886deca..0e24297 100644
--- a/vgasrc/stdvga.c
+++ b/vgasrc/stdvga.c
@@ -321,6 +321,11 @@ stdvga_set_dacformat(struct vgamode_s *vmode_g, int val)
return -1;
}
+int
+stdvga_get_linesize(struct vgamode_s *vmode_g)
+{
+ return DIV_ROUND_UP(vmode_g->width * vga_bpp(vmode_g), 8);
+}
/****************************************************************
* Save/Restore state
diff --git a/vgasrc/vbe.c b/vgasrc/vbe.c
index facad19..724c1ba 100644
--- a/vgasrc/vbe.c
+++ b/vgasrc/vbe.c
@@ -107,7 +107,7 @@ vbe_104f01(struct bregs *regs)
// Basic information about mode.
int width = GET_GLOBAL(vmode_g->width);
int height = GET_GLOBAL(vmode_g->height);
- int linesize = DIV_ROUND_UP(width * vga_bpp(vmode_g), 8);
+ int linesize = vgahw_get_linesize(vmode_g);
SET_FARVAR(seg, info->bytes_per_scanline, linesize);
SET_FARVAR(seg, info->xres, width);
SET_FARVAR(seg, info->yres, height);
diff --git a/vgasrc/vgahw.h b/vgasrc/vgahw.h
index dab2b4d..2a85eba 100644
--- a/vgasrc/vgahw.h
+++ b/vgasrc/vgahw.h
@@ -139,4 +139,10 @@ static inline int vgahw_save_restore(int cmd, u16 seg, void *data) {
return stdvga_save_restore(cmd, seg, data);
}
+static inline int vgahw_get_linesize(struct vgamode_s *vmode_g) {
+ if (CONFIG_VGA_COREBOOT)
+ return cbvga_get_linesize(vmode_g);
+ return stdvga_get_linesize(vmode_g);
+}
+
#endif // vgahw.h
diff --git a/vgasrc/vgautil.h b/vgasrc/vgautil.h
index 08c4e8d..fae5fba 100644
--- a/vgasrc/vgautil.h
+++ b/vgasrc/vgautil.h
@@ -17,6 +17,7 @@ int cbvga_get_dacformat(struct vgamode_s *vmode_g);
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);
int cbvga_setup(void);
// clext.c
@@ -63,6 +64,7 @@ void stdvga_list_modes(u16 seg, u16 *dest, u16 *last);
void stdvga_build_video_param(void);
void stdvga_override_crtc(int mode, u8 *crtc);
int stdvga_set_mode(struct vgamode_s *vmode_g, int flags);
+int stdvga_get_linesize(struct vgamode_s *vmode_g);
void stdvga_set_packed_palette(void);
// swcursor.c