diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1997-07-09 02:58:41 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1997-07-09 02:58:41 +0000 |
commit | 8feb5b83a9e4e8b3292bd50bdecba817e0c2508b (patch) | |
tree | 555b026f78dcde0a8a4b17650f1d0f7d8a6b9fda /sys/dev | |
parent | e54d53bf5d398310e88964f238acf908453a137a (diff) |
alpha/common/ insults my filec
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/ic/vga.c | 356 | ||||
-rw-r--r-- | sys/dev/ic/vgavar.h | 52 | ||||
-rw-r--r-- | sys/dev/isa/vga_isa.c | 2 | ||||
-rw-r--r-- | sys/dev/pci/vga_pci.c | 2 |
4 files changed, 410 insertions, 2 deletions
diff --git a/sys/dev/ic/vga.c b/sys/dev/ic/vga.c new file mode 100644 index 00000000000..14c096f2e72 --- /dev/null +++ b/sys/dev/ic/vga.c @@ -0,0 +1,356 @@ +/* $OpenBSD: vga.c,v 1.1 1997/07/09 02:58:35 deraadt Exp $ */ +/* $NetBSD: vga.c,v 1.3 1996/12/02 22:24:54 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/device.h> +#include <machine/bus.h> + +#include <alpha/wscons/wsconsvar.h> +#include <alpha/common/vgavar.h> + +#define VGA_IO_D_6845_ADDR 0x4 +#define VGA_IO_D_6845_DATA 0x5 + +struct cfdriver vga_cd = { + NULL, "vga", DV_DULL, +}; + +void vga_cursor __P((void *, int, int, int)); +void vga_putstr __P((void *, int, int, char *, int)); +void vga_copycols __P((void *, int, int, int, int)); +void vga_erasecols __P((void *, int, int, int)); +void vga_copyrows __P((void *, int, int, int)); +void vga_eraserows __P((void *, int, int)); + +struct wscons_emulfuncs vga_emulfuncs = { + vga_cursor, + vga_putstr, + vga_copycols, + vga_erasecols, + vga_copyrows, + vga_eraserows, +}; + +int vgaprint __P((void *, const char *)); +int vgaioctl __P((void *, u_long, caddr_t, int, struct proc *)); +int vgammap __P((void *, off_t, int)); + +/* + * The following functions implement back-end configuration grabbing + * and attachment. + */ +int +vga_common_probe(iot, memt) + bus_space_tag_t iot, memt; +{ + bus_space_handle_t ioh_b, ioh_c, ioh_d, memh; + u_int16_t vgadata; + int gotio_b, gotio_c, gotio_d, gotmem, rv; + + gotio_b = gotio_c = gotio_d = gotmem = rv = 0; + + if (bus_space_map(iot, 0x3b0, 0xc, 0, &ioh_b)) + goto bad; + gotio_b = 1; + if (bus_space_map(iot, 0x3c0, 0x10, 0, &ioh_c)) + goto bad; + gotio_c = 1; + if (bus_space_map(iot, 0x3d0, 0x10, 0, &ioh_d)) + goto bad; + gotio_d = 1; + if (bus_space_map(memt, 0xb8000, 0x8000, 0, &memh)) + goto bad; + gotmem = 1; + + vgadata = bus_space_read_2(memt, memh, 0); + bus_space_write_2(memt, memh, 0, 0xa55a); + rv = (bus_space_read_2(memt, memh, 0) == 0xa55a); + bus_space_write_2(memt, memh, 0, vgadata); + +bad: + if (gotio_b) + bus_space_unmap(iot, ioh_b, 0xc); + if (gotio_c) + bus_space_unmap(iot, ioh_c, 0x10); + if (gotio_d) + bus_space_unmap(iot, ioh_d, 0x10); + if (gotmem) + bus_space_unmap(memt, memh, 0x8000); + + return (rv); +} + +void +vga_common_setup(iot, memt, vc) + bus_space_tag_t iot, memt; + struct vga_config *vc; +{ + int cpos; + + vc->vc_iot = iot; + vc->vc_memt = memt; + + if (bus_space_map(vc->vc_iot, 0x3b0, 0xc, 0, &vc->vc_ioh_b)) + panic("vga_common_setup: couldn't map io b"); + if (bus_space_map(vc->vc_iot, 0x3c0, 0x10, 0, &vc->vc_ioh_c)) + panic("vga_common_setup: couldn't map io c"); + if (bus_space_map(vc->vc_iot, 0x3d0, 0x10, 0, &vc->vc_ioh_d)) + panic("vga_common_setup: couldn't map io d"); + if (bus_space_map(vc->vc_memt, 0xb8000, 0x8000, 0, &vc->vc_memh)) + panic("vga_common_setup: couldn't map memory"); + + vc->vc_nrow = 25; + vc->vc_ncol = 80; + + bus_space_write_1(iot, vc->vc_ioh_d, VGA_IO_D_6845_ADDR, 14); + cpos = bus_space_read_1(iot, vc->vc_ioh_d, VGA_IO_D_6845_DATA) << 8; + bus_space_write_1(iot, vc->vc_ioh_d, VGA_IO_D_6845_ADDR, 15); + cpos |= bus_space_read_1(iot, vc->vc_ioh_d, VGA_IO_D_6845_DATA); + vc->vc_crow = cpos / vc->vc_ncol; + vc->vc_ccol = cpos % vc->vc_ncol; + + vc->vc_so = 0; +#if 0 + vc->vc_at = 0x00 | 0xf; /* black bg|white fg */ + vc->vc_so_at = 0x00 | 0xf | 0x80; /* black bg|white fg|blink */ + + /* clear screen, frob cursor, etc.? */ + pcivga_eraserows(vc, 0, vc->vc_nrow); +#endif + /* + * XXX DEC HAS SWITCHED THE CODES FOR BLUE AND RED!!! + * XXX Therefore, though the comments say "blue bg", the code uses + * XXX the value for a red background! + */ + vc->vc_at = 0x40 | 0x0f; /* blue bg|white fg */ + vc->vc_so_at = 0x40 | 0x0f | 0x80; /* blue bg|white fg|blink */ +} + +void +vga_wscons_attach(parent, vc, console) + struct device *parent; + struct vga_config *vc; + int console; +{ + struct wscons_attach_args waa; + struct wscons_odev_spec *wo; + + waa.waa_isconsole = console; + wo = &waa.waa_odev_spec; + + wo->wo_emulfuncs = &vga_emulfuncs; + wo->wo_emulfuncs_cookie = vc; + + wo->wo_ioctl = vgaioctl; + wo->wo_mmap = vgammap; + wo->wo_miscfuncs_cookie = vc; + + wo->wo_nrows = vc->vc_nrow; + wo->wo_ncols = vc->vc_ncol; + wo->wo_crow = vc->vc_crow; + wo->wo_ccol = vc->vc_ccol; + + config_found(parent, &waa, vgaprint); +} + +void +vga_wscons_console(vc) + struct vga_config *vc; +{ + struct wscons_odev_spec wo; + + wo.wo_emulfuncs = &vga_emulfuncs; + wo.wo_emulfuncs_cookie = vc; + + /* ioctl and mmap are unused until real attachment. */ + + wo.wo_nrows = vc->vc_nrow; + wo.wo_ncols = vc->vc_ncol; + wo.wo_crow = vc->vc_crow; + wo.wo_ccol = vc->vc_ccol; + + wscons_attach_console(&wo); +} + +int +vgaprint(aux, pnp) + void *aux; + const char *pnp; +{ + + if (pnp) + printf("wscons at %s", pnp); + return (UNCONF); +} + +int +vgaioctl(v, cmd, data, flag, p) + void *v; + u_long cmd; + caddr_t data; + int flag; + struct proc *p; +{ + + /* XXX */ + return -1; +} + +int +vgammap(v, offset, prot) + void *v; + off_t offset; + int prot; +{ + + /* XXX */ + return -1; +} + +/* + * The following functions implement the MI ANSI terminal emulation on + * a VGA display. + */ +void +vga_cursor(id, on, row, col) + void *id; + int on, row, col; +{ + struct vga_config *vc = id; + bus_space_tag_t iot = vc->vc_iot; + bus_space_handle_t ioh_d = vc->vc_ioh_d; + int pos; + +#if 0 + printf("vga_cursor: %d %d\n", row, col); +#endif + /* turn the cursor off */ + if (!on) { + /* XXX disable cursor how??? */ + vc->vc_crow = vc->vc_ccol = -1; + } else { + vc->vc_crow = row; + vc->vc_ccol = col; + } + + pos = row * vc->vc_ncol + col; + + bus_space_write_1(iot, ioh_d, VGA_IO_D_6845_ADDR, 14); + bus_space_write_1(iot, ioh_d, VGA_IO_D_6845_DATA, pos >> 8); + bus_space_write_1(iot, ioh_d, VGA_IO_D_6845_ADDR, 15); + bus_space_write_1(iot, ioh_d, VGA_IO_D_6845_DATA, pos); +} + +void +vga_putstr(id, row, col, cp, len) + void *id; + int row, col; + char *cp; + int len; +{ + struct vga_config *vc = id; + bus_space_tag_t memt = vc->vc_memt; + bus_space_handle_t memh = vc->vc_memh; + int i, off; + + off = (row * vc->vc_ncol + col) * 2; + for (i = 0; i < len; i++, cp++, off += 2) { + bus_space_write_1(memt, memh, off, *cp); + bus_space_write_1(memt, memh, off + 1, + vc->vc_so ? vc->vc_so_at : vc->vc_at); + } +} + +void +vga_copycols(id, row, srccol, dstcol, ncols) + void *id; + int row, srccol, dstcol, ncols; +{ + struct vga_config *vc = id; + bus_size_t srcoff, dstoff; + + srcoff = (row * vc->vc_ncol + srccol) * 2; + dstoff = (row * vc->vc_ncol + dstcol) * 2; + + /* XXX SHOULDN'T USE THIS IF REGIONS OVERLAP... */ + bus_space_copy_2(vc->vc_memt, vc->vc_memh, srcoff, vc->vc_memh, dstoff, + ncols); +} + +void +vga_erasecols(id, row, startcol, ncols) + void *id; + int row, startcol, ncols; +{ + struct vga_config *vc = id; + bus_size_t off; + u_int16_t val; + + off = (row * vc->vc_ncol + startcol) * 2; + + val = (vc->vc_at << 8) | ' '; + + bus_space_set_region_2(vc->vc_memt, vc->vc_memh, off, val, ncols); +} + +void +vga_copyrows(id, srcrow, dstrow, nrows) + void *id; + int srcrow, dstrow, nrows; +{ + struct vga_config *vc = id; + bus_size_t srcoff, dstoff; + + srcoff = (srcrow * vc->vc_ncol + 0) * 2; + dstoff = (dstrow * vc->vc_ncol + 0) * 2; + + /* XXX SHOULDN'T USE THIS IF REGIONS OVERLAP... */ + bus_space_copy_2(vc->vc_memt, vc->vc_memh, srcoff, vc->vc_memh, dstoff, + nrows * vc->vc_ncol); +} + +void +vga_eraserows(id, startrow, nrows) + void *id; + int startrow, nrows; +{ + struct vga_config *vc = id; + bus_size_t off, count; + u_int16_t val; + + off = (startrow * vc->vc_ncol + 0) * 2; + count = nrows * vc->vc_ncol; + + val = (vc->vc_at << 8) | ' '; + + bus_space_set_region_2(vc->vc_memt, vc->vc_memh, off, val, count); +} diff --git a/sys/dev/ic/vgavar.h b/sys/dev/ic/vgavar.h new file mode 100644 index 00000000000..3c5353a83b0 --- /dev/null +++ b/sys/dev/ic/vgavar.h @@ -0,0 +1,52 @@ +/* $NetBSD: vgavar.h,v 1.2 1996/11/23 06:06:43 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +struct vga_config { + /* + * Filled in by front-ends. + */ + bus_space_tag_t vc_iot, vc_memt; + bus_space_handle_t vc_ioh_b, vc_ioh_c, vc_ioh_d, vc_memh; + + /* + * Private to back-end. + */ + int vc_ncol, vc_nrow; /* screen width & height */ + int vc_ccol, vc_crow; /* current cursor position */ + + char vc_so; /* in standout mode? */ + char vc_at; /* normal attributes */ + char vc_so_at; /* standout attributes */ +}; + +int vga_common_probe __P((bus_space_tag_t, bus_space_tag_t)); +void vga_common_setup __P((bus_space_tag_t, bus_space_tag_t, + struct vga_config *)); +void vga_wscons_attach __P((struct device *, struct vga_config *, int)); +void vga_wscons_console __P((struct vga_config *)); diff --git a/sys/dev/isa/vga_isa.c b/sys/dev/isa/vga_isa.c index 615f16590a5..8261413660c 100644 --- a/sys/dev/isa/vga_isa.c +++ b/sys/dev/isa/vga_isa.c @@ -38,7 +38,7 @@ #include <dev/isa/isavar.h> -#include <alpha/common/vgavar.h> +#include <alpha/dev/vgavar.h> #include <alpha/isa/vga_isavar.h> struct vga_isa_softc { diff --git a/sys/dev/pci/vga_pci.c b/sys/dev/pci/vga_pci.c index 4cb4ca703cf..659a75aaa3a 100644 --- a/sys/dev/pci/vga_pci.c +++ b/sys/dev/pci/vga_pci.c @@ -40,7 +40,7 @@ #include <dev/pci/pcivar.h> #include <dev/pci/pcidevs.h> -#include <alpha/common/vgavar.h> +#include <alpha/dev/vgavar.h> #include <alpha/pci/vga_pcivar.h> struct vga_pci_softc { |