From owner-dev-commits-src-all@freebsd.org Wed Jan 6 08:20:24 2021 Return-Path: Delivered-To: dev-commits-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 41F434C867A; Wed, 6 Jan 2021 08:20:24 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4D9j3X1QTgz4tdB; Wed, 6 Jan 2021 08:20:24 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 1FF491B5B4; Wed, 6 Jan 2021 08:20:24 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 1068KOE5036930; Wed, 6 Jan 2021 08:20:24 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 1068KOLr036929; Wed, 6 Jan 2021 08:20:24 GMT (envelope-from git) Date: Wed, 6 Jan 2021 08:20:24 GMT Message-Id: <202101060820.1068KOLr036929@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Toomas Soome Subject: git: 99870c70bac7 - main - loader: rewrite vidc_install_font MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: tsoome X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 99870c70bac7440bb2224d990a503d87c5488323 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-all@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for all branches of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Jan 2021 08:20:24 -0000 The branch main has been updated by tsoome: URL: https://cgit.FreeBSD.org/src/commit/?id=99870c70bac7440bb2224d990a503d87c5488323 commit 99870c70bac7440bb2224d990a503d87c5488323 Author: Toomas Soome AuthorDate: 2021-01-05 22:09:30 +0000 Commit: Toomas Soome CommitDate: 2021-01-06 08:20:04 +0000 loader: rewrite vidc_install_font Instead of trying to set reasonable register values, save significant register values, then prepare for font upload and then restore registers from saved data. This seems to fix text mode for most cases where text mode breakage was reported. --- stand/i386/libi386/vidconsole.c | 66 +++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/stand/i386/libi386/vidconsole.c b/stand/i386/libi386/vidconsole.c index e373bc638ee4..3eff40588dfc 100644 --- a/stand/i386/libi386/vidconsole.c +++ b/stand/i386/libi386/vidconsole.c @@ -772,7 +772,7 @@ vga_cp437_to_uni(uint8_t c) static void vidc_install_font(void) { - static uint8_t fsreg[8] = {0x0, 0x30, 0x5, 0x35, 0xa, 0x3a, 0xf, 0x3f}; + uint8_t reg[7]; const uint8_t *from; uint8_t volatile *to; uint16_t c; @@ -788,34 +788,48 @@ vidc_install_font(void) return; /* Sync-reset the sequencer registers */ - vga_set_seq(VGA_REG_BASE, 0x00, 0x01); + vga_set_seq(VGA_REG_BASE, VGA_SEQ_RESET, VGA_SEQ_RST_NAR); + + reg[0] = vga_get_seq(VGA_REG_BASE, VGA_SEQ_MAP_MASK); + reg[1] = vga_get_seq(VGA_REG_BASE, VGA_SEQ_CLOCKING_MODE); + reg[2] = vga_get_seq(VGA_REG_BASE, VGA_SEQ_MEMORY_MODE); + reg[3] = vga_get_grc(VGA_REG_BASE, VGA_GC_READ_MAP_SELECT); + reg[4] = vga_get_grc(VGA_REG_BASE, VGA_GC_MODE); + reg[5] = vga_get_grc(VGA_REG_BASE, VGA_GC_MISCELLANEOUS); + reg[6] = vga_get_atr(VGA_REG_BASE, VGA_AC_MODE_CONTROL); + + /* Screen off */ + vga_set_seq(VGA_REG_BASE, VGA_SEQ_CLOCKING_MODE, + reg[1] | VGA_SEQ_CM_SO); + /* * enable write to plane2, since fonts * could only be loaded into plane2 */ - vga_set_seq(VGA_REG_BASE, 0x02, 0x04); + vga_set_seq(VGA_REG_BASE, VGA_SEQ_MAP_MASK, VGA_SEQ_MM_EM2); /* * sequentially access data in the bit map being * selected by MapMask register (index 0x02) */ - vga_set_seq(VGA_REG_BASE, 0x04, 0x07); + vga_set_seq(VGA_REG_BASE, VGA_SEQ_MEMORY_MODE, 0x07); /* Sync-reset ended, and allow the sequencer to operate */ - vga_set_seq(VGA_REG_BASE, 0x00, 0x03); + vga_set_seq(VGA_REG_BASE, VGA_SEQ_RESET, + VGA_SEQ_RST_SR | VGA_SEQ_RST_NAR); /* * select plane 2 on Read Mode 0 */ - vga_set_grc(VGA_REG_BASE, 0x04, 0x02); + vga_set_grc(VGA_REG_BASE, VGA_GC_READ_MAP_SELECT, 0x02); /* * system addresses sequentially access data, follow * Memory Mode register bit 2 in the sequencer */ - vga_set_grc(VGA_REG_BASE, 0x05, 0x00); + vga_set_grc(VGA_REG_BASE, VGA_GC_MODE, 0x00); /* * set range of host memory addresses decoded by VGA * hardware -- A0000h-BFFFFh (128K region) */ - vga_set_grc(VGA_REG_BASE, 0x06, 0x00); + vga_set_grc(VGA_REG_BASE, VGA_GC_MISCELLANEOUS, 0x00); /* * This assumes 8x16 characters, which yield the traditional 80x25 @@ -833,35 +847,23 @@ vidc_install_font(void) *to++ = *from++; } + vga_set_atr(VGA_REG_BASE, VGA_AC_MODE_CONTROL, reg[6]); + /* Sync-reset the sequencer registers */ - vga_set_seq(VGA_REG_BASE, 0x00, 0x01); - /* enable write to plane 0 and 1 */ - vga_set_seq(VGA_REG_BASE, 0x02, 0x03); - /* - * enable character map selection - * and odd/even addressing - */ - vga_set_seq(VGA_REG_BASE, 0x04, 0x03); - /* - * select font map - */ - vga_set_seq(VGA_REG_BASE, 0x03, fsreg[s]); + vga_set_seq(VGA_REG_BASE, VGA_SEQ_RESET, VGA_SEQ_RST_NAR); + vga_set_seq(VGA_REG_BASE, VGA_SEQ_MAP_MASK, reg[0]); + vga_set_seq(VGA_REG_BASE, VGA_SEQ_MEMORY_MODE, reg[2]); /* Sync-reset ended, and allow the sequencer to operate */ - vga_set_seq(VGA_REG_BASE, 0x00, 0x03); + vga_set_seq(VGA_REG_BASE, VGA_SEQ_RESET, + VGA_SEQ_RST_SR | VGA_SEQ_RST_NAR); /* restore graphic registers */ + vga_set_grc(VGA_REG_BASE, VGA_GC_READ_MAP_SELECT, reg[3]); + vga_set_grc(VGA_REG_BASE, VGA_GC_MODE, reg[4]); + vga_set_grc(VGA_REG_BASE, VGA_GC_MISCELLANEOUS, (reg[5] & 0x03) | 0x0c); - /* select plane 0 */ - vga_set_grc(VGA_REG_BASE, 0x04, 0x00); - /* enable odd/even addressing mode */ - vga_set_grc(VGA_REG_BASE, 0x05, 0x10); - /* - * range of host memory addresses decoded by VGA - * hardware -- B8000h-BFFFFh (32K region) - */ - vga_set_grc(VGA_REG_BASE, 0x06, 0x0e); - /* enable all color plane */ - vga_set_atr(VGA_REG_BASE, 0x12, 0x0f); + /* Screen on */ + vga_set_seq(VGA_REG_BASE, VGA_SEQ_CLOCKING_MODE, reg[1] & 0xdf); } bool