summaryrefslogtreecommitdiffstats
path: root/sys/isa/vga_isa.c
diff options
context:
space:
mode:
authoryokota <yokota@FreeBSD.org>1999-02-05 11:52:13 +0000
committeryokota <yokota@FreeBSD.org>1999-02-05 11:52:13 +0000
commit6b5cb42c67aa5bea7e114c03e3ff298be4e22f17 (patch)
tree1e785ce94ccae6beb173c534b6e18429ad0ad8bb /sys/isa/vga_isa.c
parent2a4a03a1d96aca0a0fdcff0d1bbd8c69f95d8937 (diff)
downloadFreeBSD-src-6b5cb42c67aa5bea7e114c03e3ff298be4e22f17.zip
FreeBSD-src-6b5cb42c67aa5bea7e114c03e3ff298be4e22f17.tar.gz
- Don't assume the line length in the video memory is always the same as
the screen width. - Store the current video mode information in the `video_adapter' struct. - The size of the `v_offscreensize' field in the VESA mode information block is u_int16, not u_int8.
Diffstat (limited to 'sys/isa/vga_isa.c')
-rw-r--r--sys/isa/vga_isa.c104
1 files changed, 42 insertions, 62 deletions
diff --git a/sys/isa/vga_isa.c b/sys/isa/vga_isa.c
index 24b677f..33866b8 100644
--- a/sys/isa/vga_isa.c
+++ b/sys/isa/vga_isa.c
@@ -26,7 +26,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: vga_isa.c,v 1.1 1999/01/09 02:44:41 yokota Exp $
+ * $Id: vga_isa.c,v 1.1 1999/01/23 16:53:30 dfr Exp $
*/
#include "vga.h"
@@ -236,7 +236,7 @@ isavga_attach_unit(int unit, isavga_softc_t *sc, int flags)
#endif /* FB_INSTALL_CDEV */
if (bootverbose)
- (*sw->diag)(sc->adp, bootverbose);
+ (*vidsw[sc->adp->va_index]->diag)(sc->adp, bootverbose);
return 0;
}
@@ -300,27 +300,27 @@ static video_adapter_t adapter_init_value[] = {
/* DCC_MONO */
{ 0, KD_MONO, "mda", 0, 0, 0, IO_MDA, IO_MDASIZE, MONO_CRTC,
MDA_BUF_BASE, MDA_BUF_SIZE, MDA_BUF_BASE, MDA_BUF_SIZE, MDA_BUF_SIZE,
- 0, 0, 0, 7, 0, 0, NULL },
+ 0, 0, 0, 7, 0, },
/* DCC_CGA40 */
{ 0, KD_CGA, "cga", 0, 0, V_ADP_COLOR, IO_CGA, IO_CGASIZE, COLOR_CRTC,
CGA_BUF_BASE, CGA_BUF_SIZE, CGA_BUF_BASE, CGA_BUF_SIZE, CGA_BUF_SIZE,
- 0, 0, 0, 3, 0, 0, NULL },
+ 0, 0, 0, 3, 0, },
/* DCC_CGA80 */
{ 0, KD_CGA, "cga", 0, 0, V_ADP_COLOR, IO_CGA, IO_CGASIZE, COLOR_CRTC,
CGA_BUF_BASE, CGA_BUF_SIZE, CGA_BUF_BASE, CGA_BUF_SIZE, CGA_BUF_SIZE,
- 0, 0, 0, 3, 0, 0, NULL },
+ 0, 0, 0, 3, 0, },
/* DCC_EGAMONO */
{ 0, KD_EGA, "ega", 0, 0, 0, IO_MDA, 48, MONO_CRTC,
EGA_BUF_BASE, EGA_BUF_SIZE, MDA_BUF_BASE, MDA_BUF_SIZE, MDA_BUF_SIZE,
- 0, 0, 0, 7, 0, 0, NULL },
+ 0, 0, 0, 7, 0, },
/* DCC_EGA40 */
{ 0, KD_EGA, "ega", 0, 0, V_ADP_COLOR, IO_MDA, 48, COLOR_CRTC,
EGA_BUF_BASE, EGA_BUF_SIZE, CGA_BUF_BASE, CGA_BUF_SIZE, CGA_BUF_SIZE,
- 0, 0, 0, 3, 0, 0, NULL },
+ 0, 0, 0, 3, 0, },
/* DCC_EGA80 */
{ 0, KD_EGA, "ega", 0, 0, V_ADP_COLOR, IO_MDA, 48, COLOR_CRTC,
EGA_BUF_BASE, EGA_BUF_SIZE, CGA_BUF_BASE, CGA_BUF_SIZE, CGA_BUF_SIZE,
- 0, 0, 0, 3, 0, 0, NULL },
+ 0, 0, 0, 3, 0, },
};
static video_adapter_t biosadapter[2];
@@ -490,6 +490,7 @@ static u_char *get_mode_param(int mode);
static void fill_adapter_param(int code, video_adapter_t *adp);
#endif
static int verify_adapter(video_adapter_t *adp);
+static void update_adapter_info(video_adapter_t *adp, video_info_t *info);
#if !defined(VGA_NO_BIOS) && !defined(VGA_NO_MODE_CHANGE)
#define COMP_IDENTICAL 0
#define COMP_SIMILAR 1
@@ -832,6 +833,31 @@ verify_adapter(video_adapter_t *adp)
return 0;
}
+static void
+update_adapter_info(video_adapter_t *adp, video_info_t *info)
+{
+ adp->va_flags &= ~V_ADP_COLOR;
+ adp->va_flags |=
+ (info->vi_flags & V_INFO_COLOR) ? V_ADP_COLOR : 0;
+ adp->va_crtc_addr =
+ (adp->va_flags & V_ADP_COLOR) ? COLOR_CRTC : MONO_CRTC;
+ adp->va_window = BIOS_PADDRTOVADDR(info->vi_window);
+ adp->va_window_size = info->vi_window_size;
+ adp->va_window_gran = info->vi_window_gran;
+ if (info->vi_buffer_size == 0) {
+ adp->va_buffer = 0;
+ adp->va_buffer_size = 0;
+ } else {
+ adp->va_buffer = BIOS_PADDRTOVADDR(info->vi_buffer);
+ adp->va_buffer_size = info->vi_buffer_size;
+ }
+ if (info->vi_flags & V_INFO_GRAPHICS)
+ adp->va_line_width = info->vi_width/8;
+ else
+ adp->va_line_width = info->vi_width;
+ bcopy(info, &adp->va_info, sizeof(adp->va_info));
+}
+
#if !defined(VGA_NO_BIOS) && !defined(VGA_NO_MODE_CHANGE)
/* compare two parameter table entries */
static int
@@ -977,10 +1003,6 @@ probe_adapters(void)
}
if (biosadapters == 0)
return biosadapters;
-#if 0
- biosadapter[V_ADP_PRIMARY].va_index = V_ADP_PRIMARY;
- biosadapter[V_ADP_SECONDARY].va_index = V_ADP_SECONDARY;
-#endif
biosadapter[V_ADP_PRIMARY].va_unit = V_ADP_PRIMARY;
biosadapter[V_ADP_SECONDARY].va_unit = V_ADP_SECONDARY;
@@ -1145,35 +1167,12 @@ probe_adapters(void)
/* buffer address */
vga_get_info(&biosadapter[V_ADP_PRIMARY],
biosadapter[V_ADP_PRIMARY].va_initial_mode, &info);
- biosadapter[V_ADP_PRIMARY].va_mode_flags = info.vi_flags;
- biosadapter[V_ADP_PRIMARY].va_window = BIOS_PADDRTOVADDR(info.vi_window);
- biosadapter[V_ADP_PRIMARY].va_window_size = info.vi_window_size;
- biosadapter[V_ADP_PRIMARY].va_window_gran = info.vi_window_gran;
- if (info.vi_buffer_size == 0) {
- biosadapter[V_ADP_PRIMARY].va_buffer = 0;
- biosadapter[V_ADP_PRIMARY].va_buffer_size = 0;
- } else {
- biosadapter[V_ADP_PRIMARY].va_buffer
- = BIOS_PADDRTOVADDR(info.vi_buffer);
- biosadapter[V_ADP_PRIMARY].va_buffer_size = info.vi_buffer_size;
- }
+ update_adapter_info(&biosadapter[V_ADP_PRIMARY], &info);
if (biosadapters > 1) {
vga_get_info(&biosadapter[V_ADP_SECONDARY],
biosadapter[V_ADP_SECONDARY].va_initial_mode, &info);
- biosadapter[V_ADP_SECONDARY].va_mode_flags = info.vi_flags;
- biosadapter[V_ADP_SECONDARY].va_window =
- BIOS_PADDRTOVADDR(info.vi_window);
- biosadapter[V_ADP_SECONDARY].va_window_size = info.vi_window_size;
- biosadapter[V_ADP_SECONDARY].va_window_gran = info.vi_window_gran;
- if (info.vi_buffer_size == 0) {
- biosadapter[V_ADP_SECONDARY].va_buffer = 0;
- biosadapter[V_ADP_SECONDARY].va_buffer_size = 0;
- } else {
- biosadapter[V_ADP_SECONDARY].va_buffer =
- BIOS_PADDRTOVADDR(info.vi_buffer);
- biosadapter[V_ADP_SECONDARY].va_buffer_size = info.vi_buffer_size;
- }
+ update_adapter_info(&biosadapter[V_ADP_SECONDARY], &info);
}
/*
@@ -1429,22 +1428,7 @@ setup_grmode:
}
adp->va_mode = mode;
- adp->va_mode_flags = info.vi_flags;
- adp->va_flags &= ~V_ADP_COLOR;
- adp->va_flags |=
- (info.vi_flags & V_INFO_COLOR) ? V_ADP_COLOR : 0;
- adp->va_crtc_addr =
- (adp->va_flags & V_ADP_COLOR) ? COLOR_CRTC : MONO_CRTC;
- adp->va_window = BIOS_PADDRTOVADDR(info.vi_window);
- adp->va_window_size = info.vi_window_size;
- adp->va_window_gran = info.vi_window_gran;
- if (info.vi_buffer_size == 0) {
- adp->va_buffer = 0;
- adp->va_buffer_size = 0;
- } else {
- adp->va_buffer = BIOS_PADDRTOVADDR(info.vi_buffer);
- adp->va_buffer_size = info.vi_buffer_size;
- }
+ update_adapter_info(adp, &info);
/* move hardware cursor out of the way */
(*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1);
@@ -2010,15 +1994,13 @@ vga_set_origin(video_adapter_t *adp, off_t offset)
static int
vga_read_hw_cursor(video_adapter_t *adp, int *col, int *row)
{
- video_info_t info;
u_int16_t off;
int s;
if (!init_done)
return 1;
- (*vidsw[adp->va_index]->get_info)(adp, adp->va_mode, &info);
- if (info.vi_flags & V_INFO_GRAPHICS)
+ if (adp->va_info.vi_flags & V_INFO_GRAPHICS)
return 1;
s = spltty();
@@ -2028,8 +2010,8 @@ vga_read_hw_cursor(video_adapter_t *adp, int *col, int *row)
off = (off << 8) | inb(adp->va_crtc_addr + 1);
splx(s);
- *row = off / info.vi_width;
- *col = off % info.vi_width;
+ *row = off / adp->va_info.vi_width;
+ *col = off % adp->va_info.vi_width;
return 0;
}
@@ -2044,7 +2026,6 @@ vga_read_hw_cursor(video_adapter_t *adp, int *col, int *row)
static int
vga_set_hw_cursor(video_adapter_t *adp, int col, int row)
{
- video_info_t info;
u_int16_t off;
int s;
@@ -2054,10 +2035,9 @@ vga_set_hw_cursor(video_adapter_t *adp, int col, int row)
if ((col == -1) && (row == -1)) {
off = -1;
} else {
- (*vidsw[adp->va_index]->get_info)(adp, adp->va_mode, &info);
- if (info.vi_flags & V_INFO_GRAPHICS)
+ if (adp->va_info.vi_flags & V_INFO_GRAPHICS)
return 1;
- off = row*info.vi_width + col;
+ off = row*adp->va_info.vi_width + col;
}
s = spltty();
OpenPOWER on IntegriCloud