summaryrefslogtreecommitdiffstats
path: root/sys/isa
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>1998-08-06 09:15:54 +0000
committerdfr <dfr@FreeBSD.org>1998-08-06 09:15:54 +0000
commita90f51195aac4c0aeb53796dfaf8a568408b9b8c (patch)
tree89e9159f24c3845aafd7edd9604a82559aff5389 /sys/isa
parentc6de79f7a597571af387deda446358c6851e794e (diff)
downloadFreeBSD-src-a90f51195aac4c0aeb53796dfaf8a568408b9b8c.zip
FreeBSD-src-a90f51195aac4c0aeb53796dfaf8a568408b9b8c.tar.gz
Port syscons to the alpha. The driver itself has moved to sys/isa as it will
hopefully become a portable driver usable by all architectures. The api support files have had to be copied to sys/alpha/include since userland programs expect to find them in <machine/*.h>. All the revision history of the i386 syscons has been retained by a repository copy.
Diffstat (limited to 'sys/isa')
-rw-r--r--sys/isa/kbdio.c6
-rw-r--r--sys/isa/kbdio.h3
-rw-r--r--sys/isa/kbdtables.h3
-rw-r--r--sys/isa/syscons.c317
-rw-r--r--sys/isa/syscons.h16
-rw-r--r--sys/isa/timerreg.h1
6 files changed, 233 insertions, 113 deletions
diff --git a/sys/isa/kbdio.c b/sys/isa/kbdio.c
index 2d01313..ca1565d 100644
--- a/sys/isa/kbdio.c
+++ b/sys/isa/kbdio.c
@@ -26,11 +26,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: kbdio.c,v 1.11 1997/07/20 14:10:05 bde Exp $
+ * $Id$
+ * from: i386/isa kbdio.c,v 1.12
*/
#include "sc.h"
-#include "vt.h"
+/* #include "vt.h" */
+#define NVT 0
#include "psm.h"
#include "opt_kbdio.h"
diff --git a/sys/isa/kbdio.h b/sys/isa/kbdio.h
index b9bbe0a..5bdb5be 100644
--- a/sys/isa/kbdio.h
+++ b/sys/isa/kbdio.h
@@ -26,7 +26,8 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: kbdio.h,v 1.6 1997/02/22 09:36:47 peter Exp $
+ * $Id$
+ * from: i386/isa kbdio.h,v 1.7
*/
#ifndef _I386_ISA_KBDIO_H_
diff --git a/sys/isa/kbdtables.h b/sys/isa/kbdtables.h
index d36b39a..6a1241f 100644
--- a/sys/isa/kbdtables.h
+++ b/sys/isa/kbdtables.h
@@ -25,7 +25,8 @@
* (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: kbdtables.h,v 1.39 1998/01/28 08:45:18 yokota Exp $
+ * $Id$
+ * from: i386/isa kbdtables.h,v 1.40
*/
#define SET8 0x80 /* set eight bit on */
diff --git a/sys/isa/syscons.c b/sys/isa/syscons.c
index bb68f7f..311a63c 100644
--- a/sys/isa/syscons.c
+++ b/sys/isa/syscons.c
@@ -25,11 +25,14 @@
* (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: syscons.c,v 1.271 1998/08/03 09:18:58 yokota Exp $
+ * $Id$
+ * from: i386/isa syscons.c,v 1.272
*/
#include "sc.h"
-#include "apm.h"
+/* #include "apm.h" */
+#define NAPM 0
+
#include "opt_ddb.h"
#include "opt_devfs.h"
#include "opt_syscons.h"
@@ -38,6 +41,9 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/reboot.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/bus.h>
#include <sys/conf.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
@@ -57,20 +63,19 @@
#include <machine/psl.h>
#include <machine/frame.h>
#include <machine/pc/display.h>
-#include <machine/apm_bios.h>
-#include <machine/random.h>
-#include <machine/bootinfo.h>
+/* #include <machine/apm_bios.h> */
+/* #include <machine/random.h> */
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <vm/pmap.h>
-#include <i386/isa/isa.h>
-#include <i386/isa/isa_device.h>
-#include <i386/isa/timerreg.h>
-#include <i386/isa/kbdtables.h>
-#include <i386/isa/kbdio.h>
-#include <i386/isa/syscons.h>
+#include <isa/isareg.h>
+#include <isa/isavar.h>
+#include <isa/timerreg.h>
+#include <isa/kbdtables.h>
+#include <isa/kbdio.h>
+#include <isa/syscons.h>
#if !defined(MAXCONS)
#define MAXCONS 16
@@ -234,9 +239,9 @@ static struct tty sccons[MAXCONS+2];
#endif
#define SC_MOUSE 128
#define SC_CONSOLE 255
-#define MONO_BUF pa_to_va(0xB0000)
-#define CGA_BUF pa_to_va(0xB8000)
-u_short *Crtat;
+#define MONO_BUF 0xB0000
+#define CGA_BUF 0xB8000
+u_int32_t Crtat;
static const int nsccons = MAXCONS+2;
#define WRAPHIST(scp, pointer, offset)\
@@ -248,9 +253,10 @@ static const int nsccons = MAXCONS+2;
#define RTC_EQUIPMENT 0x14
/* prototypes */
-static int scattach(struct isa_device *dev);
+static int scattach(device_t dev);
static int scparam(struct tty *tp, struct termios *t);
-static int scprobe(struct isa_device *dev);
+static int scprobe(device_t dev);
+static void scintr(void *arg);
static int scvidprobe(int unit, int flags);
static int sckbdprobe(int unit, int flags);
static void scstart(struct tty *tp);
@@ -324,10 +330,23 @@ static void scsplash(int show);
#define scsplash_stick(stick)
#endif
-struct isa_driver scdriver = {
- scprobe, scattach, "sc", 1
+static device_method_t sc_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, scprobe),
+ DEVMETHOD(device_attach, scattach),
+
+ { 0, 0 }
};
+static driver_t sc_driver = {
+ "sc",
+ sc_methods,
+ DRIVER_TYPE_TTY,
+ 1, /* XXX */
+};
+
+static devclass_t sc_devclass;
+
static d_open_t scopen;
static d_close_t scclose;
static d_read_t scread;
@@ -345,10 +364,31 @@ static struct cdevsw scdevsw = {
/*
* These functions need to be before calls to them so they can be inlined.
*/
+
+#ifdef __alpha__
+
+static void fillw(int pat, void *base, size_t cnt)
+{
+ u_short *sp = base;
+ while (cnt--)
+ *sp++ = pat;
+}
+
+static void fillw_io(int pat, u_int32_t base, size_t cnt)
+{
+ while (cnt--) {
+ writew(base, pat);
+ base += 2;
+ }
+}
+
+#endif
+
static void
draw_cursor_image(scr_stat *scp)
{
- u_short cursor_image, *ptr = Crtat + (scp->cursor_pos - scp->scr_buf);
+ u_short cursor_image;
+ u_int32_t ptr = Crtat + 2*(scp->cursor_pos - scp->scr_buf);
u_short prev_image;
if (VESA_MODE(scp->mode)) {
@@ -360,7 +400,7 @@ draw_cursor_image(scr_stat *scp)
/* do we have a destructive cursor ? */
if (flags & CHAR_CURSOR) {
prev_image = scp->cursor_saveunder;
- cursor_image = *ptr & 0x00ff;
+ cursor_image = readw(ptr) & 0x00ff;
if (cursor_image == DEAD_CHAR)
cursor_image = prev_image & 0x00ff;
cursor_image |= *(scp->cursor_pos) & 0xff00;
@@ -383,7 +423,7 @@ draw_cursor_image(scr_stat *scp)
cursor_image |= DEAD_CHAR;
}
} else {
- cursor_image = (*(ptr) & 0x00ff) | *(scp->cursor_pos) & 0xff00;
+ cursor_image = (readw(ptr) & 0x00ff) | *(scp->cursor_pos) & 0xff00;
scp->cursor_saveunder = cursor_image;
if (!(flags & BLINK_CURSOR)||((flags & BLINK_CURSOR)&&(blinkrate & 4))){
if ((cursor_image & 0x7000) == 0x7000) {
@@ -397,7 +437,7 @@ draw_cursor_image(scr_stat *scp)
}
}
}
- *ptr = cursor_image;
+ writew(ptr, cursor_image);
}
static void
@@ -407,7 +447,7 @@ remove_cursor_image(scr_stat *scp)
sc_bcopy(scp, scp->scr_buf, scp->cursor_oldpos - scp->scr_buf,
scp->cursor_oldpos - scp->scr_buf, 0);
else
- *(Crtat + (scp->cursor_oldpos - scp->scr_buf)) = scp->cursor_saveunder;
+ writew(Crtat + 2*(scp->cursor_oldpos - scp->scr_buf), scp->cursor_saveunder);
}
static void
@@ -427,19 +467,20 @@ move_crsr(scr_stat *scp, int x, int y)
}
static int
-scprobe(struct isa_device *dev)
+scprobe(device_t dev)
{
- if (!scvidprobe(dev->id_unit, dev->id_flags)) {
+ if (!scvidprobe(device_get_unit(dev), isa_get_flags(dev))) {
if (bootverbose)
- printf("sc%d: no video adapter is found.\n", dev->id_unit);
+ printf("sc%d: no video adapter is found.\n", device_get_unit(dev));
return (0);
}
- sc_port = dev->id_iobase;
- if (sckbdprobe(dev->id_unit, dev->id_flags))
- return (IO_KBDSIZE);
+ sc_port = isa_get_port(dev);
+ isa_set_portsize(dev, IO_KBDSIZE);
+ if (sckbdprobe(device_get_unit(dev), isa_get_flags(dev)))
+ return 0;
else
- return ((dev->id_flags & DETECT_KBD) ? 0 : IO_KBDSIZE);
+ return ((isa_get_flags(dev) & DETECT_KBD) ? ENXIO : 0);
}
/* probe video adapters, return TRUE if found */
@@ -450,7 +491,7 @@ scvidprobe(int unit, int flags)
* XXX don't try to `printf' anything here, the console may not have
* been configured yet.
*/
- u_short volatile *cp;
+ u_int32_t cp;
u_short was;
u_int pa;
u_int segoff;
@@ -464,36 +505,40 @@ scvidprobe(int unit, int flags)
* bogus common variable so that it can be shared with pcvt, so it
* can't be statically initialized. XXX.
*/
- Crtat = (u_short *)MONO_BUF;
+ Crtat = MONO_BUF;
crtc_type = KD_MONO;
/* If CGA memory seems to work, switch to color. */
- cp = (u_short *)CGA_BUF;
- was = *cp;
- *cp = (u_short) 0xA55A;
+ cp = CGA_BUF;
+ was = readw(cp);
+ writew(cp, 0xA55A);
+#ifdef __i386__
bios_video_mode = *(u_char *)pa_to_va(0x449);
if (bootinfo.bi_vesa == 0x102) {
bios_video_mode = bootinfo.bi_vesa;
- Crtat = (u_short *)pa_to_va(0xA0000);
+ Crtat = 0xA0000;
crtc_addr = COLOR_BASE;
crtc_type = KD_VGA;
- bzero(Crtat, 800*600/8);
- } else if (*cp == 0xA55A) {
- Crtat = (u_short *)CGA_BUF;
+ memset_io(Crtat, 0, 800*600/8);
+ } else
+#endif
+ if (readw(cp)) {
+ Crtat = CGA_BUF;
crtc_addr = COLOR_BASE;
crtc_type = KD_CGA;
} else {
cp = Crtat;
- was = *cp;
- *cp = (u_short) 0xA55A;
- if (*cp != 0xA55A) {
+ was = readw(cp);
+ writew(cp, 0xA55A);
+ if (readw(cp) != 0xA55A) {
/* no screen at all, bail out */
Crtat = 0;
return FALSE;
}
}
- *cp = was;
+ writew(cp, was);
if (!VESA_MODE(bios_video_mode)) {
+#ifdef __i386__
/*
* Check rtc and BIOS date area.
* XXX: don't use BIOSDATA_EQUIPMENT, it is not a dead copy
@@ -519,6 +564,7 @@ scvidprobe(int unit, int flags)
/* crtc_type = KD_MONO; */
break;
}
+#endif
/* is this a VGA or higher ? */
outb(crtc_addr, 7);
@@ -528,15 +574,17 @@ scvidprobe(int unit, int flags)
crtc_vga = TRUE;
read_vgaregs(vgaregs);
+#ifdef __i386__
/* Get the BIOS video mode pointer */
- segoff = *(u_int *)pa_to_va(0x4a8);
+ segoff = readl(0x4a8);
pa = ((segoff & 0xffff0000) >> 12) + (segoff & 0xffff);
if (ISMAPPED(pa, sizeof(u_int))) {
- segoff = *(u_int *)pa_to_va(pa);
+ segoff = readl(pa);
pa = ((segoff & 0xffff0000) >> 12) + (segoff & 0xffff);
if (ISMAPPED(pa, MODE_PARAM_SIZE))
video_mode_ptr = (char *)pa_to_va(pa);
}
+#endif
}
}
@@ -676,6 +724,16 @@ sckbdprobe(int unit, int flags)
goto fail;
}
}
+
+#ifdef __alpha__
+ if (send_kbd_command_and_data(
+ sc_kbdc, KBDC_SET_SCANCODE_SET, 2) != KBD_ACK) {
+ printf("sc%d: can't set translation.\n", unit);
+
+ }
+ c |= KBD_TRANSLATION;
+#endif
+
/* enable the keyboard port and intr. */
if (!set_controller_command_byte(sc_kbdc,
KBD_KBD_CONTROL_BITS | KBD_TRANSLATION | KBD_OVERRIDE_KBD_LOCK,
@@ -723,17 +781,18 @@ scresume(void *dummy)
#endif
static int
-scattach(struct isa_device *dev)
+scattach(device_t dev)
{
scr_stat *scp;
dev_t cdev = makedev(CDEV_MAJOR, 0);
char *p;
+ void *ih;
#ifdef DEVFS
int vc;
#endif
scinit();
- flags = dev->id_flags;
+ flags = isa_get_flags(dev);
if (crtc_type != KD_VGA || VESA_MODE(bios_video_mode))
flags &= ~CHAR_CURSOR;
@@ -771,32 +830,32 @@ scattach(struct isa_device *dev)
draw_cursor_image(scp);
/* get screen update going */
- scrn_timer((void *)TRUE);
+ scrn_timer((void*)TRUE);
update_leds(scp->status);
if ((crtc_type == KD_VGA) && bootverbose) {
- printf("sc%d: BIOS video mode:%d\n", dev->id_unit, bios_video_mode);
- printf("sc%d: VGA registers upon power-up\n", dev->id_unit);
+ printf("sc%d: BIOS video mode:%d\n", device_get_unit(dev), bios_video_mode);
+ printf("sc%d: VGA registers upon power-up\n", device_get_unit(dev));
dump_vgaregs(vgaregs);
- printf("sc%d: video mode:%d\n", dev->id_unit, scp->mode);
+ printf("sc%d: video mode:%d\n", device_get_unit(dev), scp->mode);
printf("sc%d: VGA registers in BIOS for mode:%d\n",
- dev->id_unit, scp->mode);
+ device_get_unit(dev), scp->mode);
dump_vgaregs(vgaregs2);
p = get_mode_param(scp, scp->mode);
if (p != NULL) {
printf("sc%d: VGA registers to be used for mode:%d\n",
- dev->id_unit, scp->mode);
+ device_get_unit(dev), scp->mode);
dump_vgaregs(p);
}
- printf("sc%d: rows_offset:%d\n", dev->id_unit, rows_offset);
+ printf("sc%d: rows_offset:%d\n", device_get_unit(dev), rows_offset);
}
if ((crtc_type == KD_VGA) && !VESA_MODE(bios_video_mode)
&& (video_mode_ptr == NULL))
printf("sc%d: WARNING: video mode switching is only partially supported\n",
- dev->id_unit);
+ device_get_unit(dev));
- printf("sc%d: ", dev->id_unit);
+ printf("sc%d: ", device_get_unit(dev));
switch(crtc_type) {
case KD_VGA:
if (VESA_MODE(bios_video_mode))
@@ -833,8 +892,6 @@ scattach(struct isa_device *dev)
at_shutdown(scshutdown, NULL, SHUTDOWN_PRE_SYNC);
- cdevsw_add(&cdev, &scdevsw, NULL);
-
#ifdef DEVFS
for (vc = 0; vc < MAXCONS; vc++)
sc_devfs_token[vc] = devfs_add_devswf(&scdevsw, vc, DV_CHR,
@@ -845,6 +902,16 @@ scattach(struct isa_device *dev)
sc_console_devfs_token = devfs_add_devswf(&scdevsw, SC_CONSOLE, DV_CHR,
UID_ROOT, GID_WHEEL, 0600, "consolectl");
#endif
+
+ ih = BUS_CREATE_INTR(device_get_parent(dev), dev,
+ isa_get_irq(dev),
+ scintr, 0);
+ if (!ih)
+ return ENXIO;
+
+ BUS_CONNECT_INTR(device_get_parent(dev), ih);
+
+
return 0;
}
@@ -967,8 +1034,8 @@ scwrite(dev_t dev, struct uio *uio, int flag)
return((*linesw[tp->t_line].l_write)(tp, uio, flag));
}
-void
-scintr(int unit)
+static void
+scintr(void *arg)
{
static struct tty *cur_tty;
int c, len;
@@ -1913,11 +1980,15 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
return error;
if (securelevel > 0)
return EPERM;
+#ifdef __i386__
p->p_md.md_regs->tf_eflags |= PSL_IOPL;
+#endif
return 0;
case KDDISABIO: /* disallow io operations (default) */
+#ifdef __i386__
p->p_md.md_regs->tf_eflags &= ~PSL_IOPL;
+#endif
return 0;
case KDSETMODE: /* set current mode of this (virtual) console */
@@ -2051,6 +2122,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
case KIOCSOUND: /* make tone (*data) hz */
if (scp == cur_console) {
+#if 0
if (*(int*)data) {
int pitch = timer_freq / *(int*)data;
@@ -2070,6 +2142,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
outb(IO_PPI, inb(IO_PPI) & 0xFC);
release_timer2();
}
+#endif
}
return 0;
@@ -2290,6 +2363,7 @@ scmousestart(struct tty *tp)
void
sccnprobe(struct consdev *cp)
{
+#if 0
struct isa_device *dvp;
/*
@@ -2311,6 +2385,27 @@ sccnprobe(struct consdev *cp)
cp->cn_pri = CN_INTERNAL;
sc_kbdc = kbdc_open(sc_port);
+#endif
+}
+
+struct consdev sc_cons = {
+ NULL, NULL, sccngetc, sccncheckc, sccnputc,
+ NULL, makedev(CDEV_MAJOR, 0), CN_NORMAL,
+};
+
+extern struct consdev *cn_tab;
+
+void
+sccnattach(void)
+{
+ if (!scvidprobe(0, 0) || !sckbdprobe(0, 0)) {
+ return;
+ }
+
+ sc_kbdc = kbdc_open(sc_port);
+ scinit();
+
+ cn_tab = &sc_cons;
}
void
@@ -2738,7 +2833,7 @@ exchange_scr(void)
delayed_next_scr = FALSE;
mark_all(new_scp);
if (new_scp->mode == 0x102) {
- bzero(Crtat, 800*600/8);
+ memset_io(Crtat, 0, 800*600/8);
}
}
@@ -3492,7 +3587,7 @@ scinit(void)
/* copy screen to temporary buffer */
if (!VESA_MODE(console[0]->mode))
- generic_bcopy(Crtat, sc_buffer,
+ memcpy_fromio(sc_buffer, Crtat,
console[0]->xsize * console[0]->ysize * sizeof(u_short));
console[0]->scr_buf = console[0]->mouse_pos = console[0]->mouse_oldpos
@@ -3677,8 +3772,8 @@ init_scp(scr_stat *scp)
current_default->std_color;
scp->term.rev_color = current_default->rev_color;
scp->border = BG_BLACK;
- scp->cursor_start = *(char *)pa_to_va(0x461);
- scp->cursor_end = *(char *)pa_to_va(0x460);
+ scp->cursor_start = readb(0x461);
+ scp->cursor_end = readb(0x460);
scp->mouse_xpos = scp->xsize*8/2;
scp->mouse_ypos = scp->ysize*scp->font_size/2;
scp->mouse_cut_start = scp->mouse_cut_end = NULL;
@@ -3687,7 +3782,7 @@ init_scp(scr_stat *scp)
scp->mouse_proc = NULL;
scp->bell_pitch = BELL_PITCH;
scp->bell_duration = BELL_DURATION;
- scp->status = (*(char *)pa_to_va(0x417) & 0x20) ? NLKED : 0;
+ scp->status = (readb(0x417) & 0x20) ? NLKED : 0;
scp->status |= CURSOR_ENABLED;
scp->pid = 0;
scp->proc = NULL;
@@ -3785,7 +3880,9 @@ next_code:
if (!(flags & SCGETC_CN)) {
/* do the /dev/random device a favour */
+#if 0
add_keyboard_randomness(scancode);
+#endif
if (cur_console->status & KBD_RAW_MODE)
return scancode;
@@ -4309,7 +4406,7 @@ scmmap(dev_t dev, int offset, int nprot)
{
if (offset > 0x20000 - PAGE_SIZE)
return -1;
- return i386_btop((VIDEOMEM + offset));
+ return (VIDEOMEM + offset) >> PAGE_SHIFT;
}
/*
@@ -4634,11 +4731,11 @@ read_vgaregs(char *buf)
inb(crtc_addr+6); /* reset flip-flop */
outb(ATC, 0x20); /* enable palette */
- buf[0] = *(char *)pa_to_va(0x44a); /* COLS */
- buf[1] = *(char *)pa_to_va(0x484); /* ROWS */
- buf[2] = *(char *)pa_to_va(0x485); /* POINTS */
- buf[3] = *(char *)pa_to_va(0x44c);
- buf[4] = *(char *)pa_to_va(0x44d);
+ buf[0] = readb(0x44a); /* COLS */
+ buf[1] = readb(0x484); /* ROWS */
+ buf[2] = readb(0x485); /* POINTS */
+ buf[3] = readb(0x44c);
+ buf[4] = readb(0x44d);
splx(s);
}
@@ -4827,11 +4924,11 @@ copy_font(int operation, int font_type, char* font_image)
for (ch=0; ch < 256; ch++)
for (line=0; line < fontsize; line++)
if (operation)
- *(char *)pa_to_va(VIDEOMEM+(segment)+(ch*32)+line) =
- font_image[(ch*fontsize)+line];
+ writeb(VIDEOMEM+(segment)+(ch*32)+line,
+ font_image[(ch*fontsize)+line]);
else
font_image[(ch*fontsize)+line] =
- *(char *)pa_to_va(VIDEOMEM+(segment)+(ch*32)+line);
+ readb(VIDEOMEM+(segment)+(ch*32)+line);
set_normal_mode(buf);
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); /* enable screen */
}
@@ -4841,27 +4938,27 @@ set_destructive_cursor(scr_stat *scp)
{
u_char buf[PARAM_BUFSIZE];
u_char cursor[32];
- caddr_t address;
+ u_int32_t address;
int i;
char *font_buffer;
if (scp->font_size < 14) {
font_buffer = font_8;
- address = (caddr_t)VIDEOMEM + 0x8000;
+ address = VIDEOMEM + 0x8000;
}
else if (scp->font_size >= 16) {
font_buffer = font_16;
- address = (caddr_t)VIDEOMEM;
+ address = VIDEOMEM;
}
else {
font_buffer = font_14;
- address = (caddr_t)VIDEOMEM + 0x4000;
+ address = VIDEOMEM + 0x4000;
}
/*
* FONT KLUDGE
* Always use the font page #0. XXX
*/
- address = (caddr_t)VIDEOMEM;
+ address = VIDEOMEM;
if (scp->status & MOUSE_VISIBLE) {
if ((scp->cursor_saveunder & 0xff) == SC_MOUSE_CHAR)
@@ -4887,7 +4984,7 @@ set_destructive_cursor(scr_stat *scp)
while (!(inb(crtc_addr+6) & 0x08)) /* wait for vertical retrace */ ;
#endif
set_font_mode(buf);
- generic_bcopy(cursor, (char *)pa_to_va(address) + DEAD_CHAR * 32, 32);
+ memcpy_toio(address + DEAD_CHAR * 32, cursor, 32);
set_normal_mode(buf);
}
@@ -5130,32 +5227,32 @@ mouse_paste(scr_stat *scp)
static void
draw_mouse_image(scr_stat *scp)
{
- caddr_t address;
+ u_int32_t address;
int i;
char *font_buffer;
u_char buf[PARAM_BUFSIZE];
u_short buffer[32];
u_short xoffset, yoffset;
- u_short *crt_pos = Crtat + (scp->mouse_pos - scp->scr_buf);
+ u_int32_t crt_pos = Crtat + 2*(scp->mouse_pos - scp->scr_buf);
int font_size = scp->font_size;
if (font_size < 14) {
font_buffer = font_8;
- address = (caddr_t)VIDEOMEM + 0x8000;
+ address = VIDEOMEM + 0x8000;
}
else if (font_size >= 16) {
font_buffer = font_16;
- address = (caddr_t)VIDEOMEM;
+ address = VIDEOMEM;
}
else {
font_buffer = font_14;
- address = (caddr_t)VIDEOMEM + 0x4000;
+ address = VIDEOMEM + 0x4000;
}
/*
* FONT KLUDGE
* Always use the font page #0. XXX
*/
- address = (caddr_t)VIDEOMEM;
+ address = VIDEOMEM;
xoffset = scp->mouse_xpos % 8;
yoffset = scp->mouse_ypos % font_size;
@@ -5194,15 +5291,15 @@ draw_mouse_image(scr_stat *scp)
while (!(inb(crtc_addr+6) & 0x08)) /* idle */ ;
#endif
set_font_mode(buf);
- generic_bcopy(scp->mouse_cursor, (char *)pa_to_va(address) + SC_MOUSE_CHAR * 32, 128);
+ memcpy_toio(address + SC_MOUSE_CHAR * 32, scp->mouse_cursor, 128);
set_normal_mode(buf);
- *(crt_pos) = (*(scp->mouse_pos) & 0xff00) | SC_MOUSE_CHAR;
- *(crt_pos+scp->xsize) =
- (*(scp->mouse_pos + scp->xsize) & 0xff00) | (SC_MOUSE_CHAR + 2);
+ writew(crt_pos, (*(scp->mouse_pos) & 0xff00) | SC_MOUSE_CHAR);
+ writew(crt_pos+2*scp->xsize,
+ (*(scp->mouse_pos + scp->xsize) & 0xff00) | (SC_MOUSE_CHAR + 2));
if (scp->mouse_xpos < (scp->xsize-1)*8) {
- *(crt_pos + 1) = (*(scp->mouse_pos + 1) & 0xff00) | (SC_MOUSE_CHAR + 1);
- *(crt_pos+scp->xsize + 1) =
- (*(scp->mouse_pos + scp->xsize + 1) & 0xff00) | (SC_MOUSE_CHAR + 3);
+ writew(crt_pos + 2, (*(scp->mouse_pos + 1) & 0xff00) | (SC_MOUSE_CHAR + 1));
+ writew(crt_pos+2*scp->xsize + 2,
+ (*(scp->mouse_pos + scp->xsize + 1) & 0xff00) | (SC_MOUSE_CHAR + 3));
}
mark_for_update(scp, scp->mouse_pos - scp->scr_buf);
mark_for_update(scp, scp->mouse_pos + scp->xsize + 1 - scp->scr_buf);
@@ -5211,12 +5308,12 @@ draw_mouse_image(scr_stat *scp)
static void
remove_mouse_image(scr_stat *scp)
{
- u_short *crt_pos = Crtat + (scp->mouse_oldpos - scp->scr_buf);
+ u_int32_t crt_pos = Crtat + 2*(scp->mouse_oldpos - scp->scr_buf);
- *(crt_pos) = *(scp->mouse_oldpos);
- *(crt_pos+1) = *(scp->mouse_oldpos+1);
- *(crt_pos+scp->xsize) = *(scp->mouse_oldpos+scp->xsize);
- *(crt_pos+scp->xsize+1) = *(scp->mouse_oldpos+scp->xsize+1);
+ writew(crt_pos, *(scp->mouse_oldpos));
+ writew(crt_pos+2, *(scp->mouse_oldpos+1));
+ writew(crt_pos+2*scp->xsize, *(scp->mouse_oldpos+scp->xsize));
+ writew(crt_pos+2*scp->xsize+2, *(scp->mouse_oldpos+scp->xsize+1));
mark_for_update(scp, scp->mouse_oldpos - scp->scr_buf);
mark_for_update(scp, scp->mouse_oldpos + scp->xsize + 1 - scp->scr_buf);
}
@@ -5228,7 +5325,7 @@ draw_cutmarking(scr_stat *scp)
u_short och, nch;
for (ptr=scp->scr_buf; ptr<=(scp->scr_buf+(scp->xsize*scp->ysize)); ptr++) {
- nch = och = *(Crtat + (ptr - scp->scr_buf));
+ nch = och = readw(Crtat + 2*(ptr - scp->scr_buf));
/* are we outside the selected area ? */
if ( ptr < (scp->mouse_cut_start > scp->mouse_cut_end ?
scp->mouse_cut_end : scp->mouse_cut_start) ||
@@ -5250,7 +5347,7 @@ draw_cutmarking(scr_stat *scp)
}
}
if (nch != och)
- *(Crtat + (ptr - scp->scr_buf)) = nch;
+ writew(Crtat + 2*(ptr - scp->scr_buf), nch);
}
}
@@ -5322,11 +5419,11 @@ blink_screen(void *arg)
}
else {
if (blink_in_progress & 1)
- fillw(kernel_default.std_color | scr_map[0x20],
- Crtat, scp->xsize * scp->ysize);
+ fillw_io(kernel_default.std_color | scr_map[0x20],
+ Crtat, scp->xsize * scp->ysize);
else
- fillw(kernel_default.rev_color | scr_map[0x20],
- Crtat, scp->xsize * scp->ysize);
+ fillw_io(kernel_default.rev_color | scr_map[0x20],
+ Crtat, scp->xsize * scp->ysize);
blink_in_progress--;
timeout(blink_screen, scp, hz / 10);
}
@@ -5336,19 +5433,19 @@ void
sc_bcopy(scr_stat *scp, u_short *p, int from, int to, int mark)
{
if (!VESA_MODE(scp->mode)) {
- generic_bcopy(p+from, Crtat+from, (to-from+1)*sizeof (u_short));
+ memcpy_toio(Crtat+2*from, p+from, (to-from+1)*sizeof (u_short));
} else if (scp->mode == 0x102) {
- u_char *d, *e;
+ u_int32_t d, e;
int i,j;
if (mark)
mark = 255;
- d = (u_char *)Crtat;
+ d = Crtat;
d += 10 + 6*16*100 + (from%80) + 16*100*(from/80);
for (i = from ; i <= to ; i++) {
e = d;
for (j = 0 ; j < 16; j++) {
- *e = mark^font_16[(p[i]&0xff)*16+j];
+ writeb(e, mark^font_16[(p[i]&0xff)*16+j]);
e+=100;
}
d++;
@@ -5393,4 +5490,8 @@ scsplash(int show)
#endif /* SC_SPLASH_SCREEN */
+
+CDEV_DRIVER_MODULE(sc, isa, sc_driver, sc_devclass,
+ CDEV_MAJOR, scdevsw, 0, 0);
+
#endif /* NSC */
diff --git a/sys/isa/syscons.h b/sys/isa/syscons.h
index b23a2ae..dc57f07 100644
--- a/sys/isa/syscons.h
+++ b/sys/isa/syscons.h
@@ -25,7 +25,8 @@
* (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: syscons.h,v 1.38 1998/08/03 09:09:35 yokota Exp $
+ * $Id$
+ * from: i386/isa syscons.h,v 1.39
*/
#ifndef _I386_ISA_SYSCONS_H_
@@ -35,7 +36,18 @@
#define ISMAPPED(pa, width) \
(((pa) <= (u_long)0x1000 - (width)) \
|| ((pa) >= 0xa0000 && (pa) <= 0x100000 - (width)))
+
+#if 0
#define pa_to_va(pa) (KERNBASE + (pa)) /* works if ISMAPPED(pa...) */
+#endif
+
+#ifdef __i386__
+#define WRITEB(pa, b) *(u_int8_t*)(KERNBASE + (pa)) = b
+#define READB(pa) *(u_int8_t*)(KERNBASE + (pa))
+#else
+#define WRITEB(pa, b) writeb(pa, b)
+#define READB(pa) readb(pa)
+#endif
/* printable chars */
#define PRINTABLE(ch) ((ch) > 0x1b || ((ch) > 0x0d && (ch) < 0x1b) \
@@ -184,7 +196,9 @@ typedef struct scr_stat {
u_short *history_pos; /* position shown on screen */
u_short *history_save; /* save area index */
int history_size; /* size of history buffer */
+#ifdef __i386__
struct apmhook r_hook; /* reconfiguration support */
+#endif
#ifdef SC_SPLASH_SCREEN
u_char splash_save_mode; /* saved mode for splash screen */
#endif
diff --git a/sys/isa/timerreg.h b/sys/isa/timerreg.h
index ff27bac..e429bf7 100644
--- a/sys/isa/timerreg.h
+++ b/sys/isa/timerreg.h
@@ -32,6 +32,7 @@
*
* from: Header: timerreg.h,v 1.2 93/02/28 15:08:58 mccanne Exp
* $Id$
+ * from: i386/isa timerreg.h,v 1.5
*/
/*
OpenPOWER on IntegriCloud