diff options
author | Eric Jackson <ericj@cvs.openbsd.org> | 2000-08-04 16:45:48 +0000 |
---|---|---|
committer | Eric Jackson <ericj@cvs.openbsd.org> | 2000-08-04 16:45:48 +0000 |
commit | e640d975aff83d74ed898bc9958819ffef6d5024 (patch) | |
tree | 258685ed60b92e2309cf6b7e65e4bc0c32d0112c | |
parent | b1ab130ebe1061631d5465253f2334914def8120 (diff) |
convert sfb and cfb to use new wscons; from NetBSD.
-rw-r--r-- | sys/arch/alpha/tc/cfb.c | 187 | ||||
-rw-r--r-- | sys/arch/alpha/tc/cfbvar.h | 9 | ||||
-rw-r--r-- | sys/arch/alpha/tc/sfb.c | 185 | ||||
-rw-r--r-- | sys/arch/alpha/tc/sfbvar.h | 9 |
4 files changed, 237 insertions, 153 deletions
diff --git a/sys/arch/alpha/tc/cfb.c b/sys/arch/alpha/tc/cfb.c index 622aa607dc9..09a059f245d 100644 --- a/sys/arch/alpha/tc/cfb.c +++ b/sys/arch/alpha/tc/cfb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cfb.c,v 1.10 1998/11/21 18:13:03 millert Exp $ */ +/* $OpenBSD: cfb.c,v 1.11 2000/08/04 16:45:47 ericj Exp $ */ /* $NetBSD: cfb.c,v 1.7 1996/12/05 01:39:39 cgd Exp $ */ /* @@ -43,13 +43,10 @@ #include <dev/tc/tcvar.h> #include <machine/cfbreg.h> #include <alpha/tc/cfbvar.h> -#if 0 -#include <alpha/tc/bt459reg.h> -#endif #include <dev/rcons/raster.h> #include <dev/wscons/wscons_raster.h> -#include <dev/wscons/wsconsvar.h> +#include <dev/wscons/wsdisplayvar.h> #include <machine/fbio.h> #include <machine/autoconf.h> @@ -61,7 +58,6 @@ int cfbmatch __P((struct device *, void *, void *)); int cfbmatch __P((struct device *, struct cfdata *, void *)); #endif void cfbattach __P((struct device *, struct device *, void *)); -int cfbprint __P((void *, const char *)); struct cfattach cfb_ca = { sizeof(struct cfb_softc), cfbmatch, cfbattach, @@ -73,21 +69,52 @@ struct cfdriver cfb_cd = { void cfb_getdevconfig __P((tc_addr_t dense_addr, struct cfb_devconfig *dc)); struct cfb_devconfig cfb_console_dc; +tc_addr_t cfb_consaddr; -struct wscons_emulfuncs cfb_emulfuncs = { +struct wsdisplay_emulops cfb_emulfuncs = { rcons_cursor, /* could use hardware cursor; punt */ - rcons_putstr, + rcons_mapchar, + rcons_putchar, rcons_copycols, rcons_erasecols, rcons_copyrows, rcons_eraserows, - rcons_setattr, + rcons_alloc_attr +}; + +struct wsscreen_descr cfb_stdscreen = { + "std", + 0, 0, /* will be filled in -- XXX shouldn't, it's global */ + &cfb_emulfuncs, + 0, 0 +}; + +const struct wsscreen_descr *_cfb_scrlist[] = { + &cfb_stdscreen, + /* XXX other formats, graphics screen? */ +}; + +struct wsscreen_list cfb_screenlist = { + sizeof(_cfb_scrlist) / sizeof(struct wsscreen_descr *), _cfb_scrlist }; int cfbioctl __P((void *, u_long, caddr_t, int, struct proc *)); int cfbmmap __P((void *, off_t, int)); int cfbintr __P((void *)); +static int cfb_alloc_screen __P((void *, const struct wsscreen_descr *, + void **, int *, int *, long *)); +static void cfb_free_screen __P((void *, void *)); +static int cfb_show_screen __P((void *, void *, int, + void (*) (void *, int, int), void *)); + +struct wsdisplay_accessops cfb_accessops = { + cfbioctl, + cfbmmap, + cfb_alloc_screen, + cfb_free_screen, + cfb_show_screen, +}; int cfbmatch(parent, match, aux) @@ -166,6 +193,9 @@ cfb_getdevconfig(dense_addr, dc) rcp->rc_crowp = &rcp->rc_crow; rcp->rc_ccolp = &rcp->rc_ccol; rcons_init(rcp, 34, 80); + + cfb_stdscreen.nrows = dc->dc_rcons.rc_maxrow; + cfb_stdscreen.ncols = dc->dc_rcons.rc_maxcol; } void @@ -175,14 +205,14 @@ cfbattach(parent, self, aux) { struct cfb_softc *sc = (struct cfb_softc *)self; struct tc_attach_args *ta = aux; - struct wscons_attach_args waa; - struct wscons_odev_spec *wo; + struct wsemuldisplaydev_attach_args waa; int console; - console = 0; /* XXX */ - if (console) + console = (ta->ta_addr == cfb_consaddr); + if (console) { sc->sc_dc = &cfb_console_dc; - else { + sc->nscreens = 1; + } else { sc->sc_dc = (struct cfb_devconfig *) malloc(sizeof(struct cfb_devconfig), M_DEVBUF, M_WAITOK); cfb_getdevconfig(ta->ta_addr, sc->sc_dc); @@ -199,33 +229,12 @@ cfbattach(parent, self, aux) *(volatile u_int32_t *)(sc->sc_dc->dc_vaddr + CFB_IREQCTRL_OFFSET) = 0; /* initialize the raster */ - waa.waa_isconsole = console; - wo = &waa.waa_odev_spec; - - wo->wo_emulfuncs = &cfb_emulfuncs; - wo->wo_emulfuncs_cookie = &sc->sc_dc->dc_rcons; + waa.console = console; + waa.scrdata = &cfb_screenlist; + waa.accessops = &cfb_accessops; + waa.accesscookie = sc; - wo->wo_ioctl = cfbioctl; - wo->wo_mmap = cfbmmap; - wo->wo_miscfuncs_cookie = sc; - - wo->wo_nrows = sc->sc_dc->dc_rcons.rc_maxrow; - wo->wo_ncols = sc->sc_dc->dc_rcons.rc_maxcol; - wo->wo_crow = 0; - wo->wo_ccol = 0; - - config_found(self, &waa, cfbprint); -} - -int -cfbprint(aux, pnp) - void *aux; - const char *pnp; -{ - - if (pnp) - printf("wscons at %s", pnp); - return (UNCONF); + config_found(self, &waa, wsemuldisplaydevprint); } int @@ -303,7 +312,7 @@ cfbmmap(v, offset, prot) { struct cfb_softc *sc = v; - if (offset >= CFB_SIZE || offset < 0) + if (offset > CFB_SIZE) return (-1); return alpha_btop(sc->sc_dc->dc_paddr + offset); } @@ -319,41 +328,69 @@ cfbintr(v) return (1); } -#if 0 +int +cfb_alloc_screen(v, type, cookiep, curxp, curyp, attrp) + void *v; + const struct wsscreen_descr *type; + void **cookiep; + int *curxp, *curyp; + long *attrp; +{ + struct cfb_softc *sc = v; + long defattr; + + if (sc->nscreens > 0) + return (ENOMEM); + + *cookiep = &sc->sc_dc->dc_rcons; /* one and only for now */ + *curxp = 0; + *curyp = 0; + rcons_alloc_attr(&sc->sc_dc->dc_rcons, 0, 0, 0, &defattr); + *attrp = defattr; + sc->nscreens++; + return(0); +} + void -tga_console(bc, pc, bus, device, function) - bus_chipset_tag_t bc; - pci_chipset_tag_t pc; - int bus, device, function; +cfb_free_screen(v, cookie) + void *v; + void *cookie; { - struct tga_devconfig *dcp = &tga_console_dc; - struct wscons_odev_spec wo; - - tga_getdevconfig(bc, pc, pci_make_tag(pc, bus, device, function), dcp); - - /* sanity checks */ - if (dcp->dc_vaddr == NULL) - panic("tga_console(%d, %d): couldn't map memory space", - device, function); - if (dcp->dc_tgaconf == NULL) - panic("tga_console(%d, %d): unknown board configuration", - device, function); - - /* - * Initialize the RAMDAC but DO NOT allocate any private storage. - * Initialization includes disabling cursor, setting a sane - * colormap, etc. It will be reinitialized in tgaattach(). - */ - (*dcp->dc_tgaconf->tgac_ramdac->tgar_init)(dcp, 0); - - wo.wo_ef = &tga_emulfuncs; - wo.wo_efa = &dcp->dc_rcons; - wo.wo_nrows = dcp->dc_rcons.rc_maxrow; - wo.wo_ncols = dcp->dc_rcons.rc_maxcol; - wo.wo_crow = 0; - wo.wo_ccol = 0; - /* ioctl and mmap are unused until real attachment. */ - - wscons_attach_console(&wo); + struct cfb_softc *sc = v; + + if (sc->sc_dc == &cfb_console_dc) + panic("cfb_free_screen: console"); + + sc->nscreens--; +} + +int +cfb_show_screen(v, cookie, waitok, cb, cbarg) + void *v; + void *cookie; + int waitok; + void (*cb) __P((void *, int, int)); + void *cbarg; +{ + return (0); +} + +#if 0 +int +cfb_cnattach(addr) + tc_addr_t addr; +{ + struct cfb_devconfig *dc = &cfb_console_dc; + long defattr; + + cfb_getdevconfig(addr, dcp); + + rcons_alloc_attr(&dcp->dc_rcons, 0, 0, 0, &defattr); + + wsdisplay_cnattach(&cfb_stdscreen, &dcp->dc_rcons, + 0,0, defattr;); + + cfb_consaddr = addr; + return (0); } #endif diff --git a/sys/arch/alpha/tc/cfbvar.h b/sys/arch/alpha/tc/cfbvar.h index 6bb6217d0c6..1eada4d768e 100644 --- a/sys/arch/alpha/tc/cfbvar.h +++ b/sys/arch/alpha/tc/cfbvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cfbvar.h,v 1.4 1997/11/06 12:27:05 niklas Exp $ */ +/* $OpenBSD: cfbvar.h,v 1.5 2000/08/04 16:45:47 ericj Exp $ */ /* $NetBSD: cfbvar.h,v 1.1 1996/05/01 23:25:04 cgd Exp $ */ /* @@ -30,7 +30,6 @@ #include <machine/cfbreg.h> #include <dev/rcons/raster.h> -#include <dev/wscons/wsconsvar.h> #include <dev/wscons/wscons_raster.h> struct cfb_devconfig; @@ -60,4 +59,10 @@ struct cfb_softc { struct device sc_dev; struct cfb_devconfig *sc_dc; /* device configuration */ + + int nscreens; }; + +#if 0 +int cfb_cnattach __P((tc_addr_t)); +#endif diff --git a/sys/arch/alpha/tc/sfb.c b/sys/arch/alpha/tc/sfb.c index 5bb7cabd239..727af13cac4 100644 --- a/sys/arch/alpha/tc/sfb.c +++ b/sys/arch/alpha/tc/sfb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sfb.c,v 1.10 1998/11/21 18:13:04 millert Exp $ */ +/* $OpenBSD: sfb.c,v 1.11 2000/08/04 16:45:47 ericj Exp $ */ /* $NetBSD: sfb.c,v 1.7 1996/12/05 01:39:44 cgd Exp $ */ /* @@ -43,13 +43,10 @@ #include <dev/tc/tcvar.h> #include <machine/sfbreg.h> #include <alpha/tc/sfbvar.h> -#if 0 -#include <alpha/tc/bt459reg.h> -#endif #include <dev/rcons/raster.h> #include <dev/wscons/wscons_raster.h> -#include <dev/wscons/wsconsvar.h> +#include <dev/wscons/wsdisplayvar.h> #include <machine/fbio.h> #include <machine/autoconf.h> @@ -61,7 +58,6 @@ int sfbmatch __P((struct device *, void *, void *)); int sfbmatch __P((struct device *, struct cfdata *, void *)); #endif void sfbattach __P((struct device *, struct device *, void *)); -int sfbprint __P((void *, const char *)); struct cfattach sfb_ca = { sizeof(struct sfb_softc), sfbmatch, sfbattach, @@ -73,25 +69,56 @@ struct cfdriver sfb_cd = { void sfb_getdevconfig __P((tc_addr_t dense_addr, struct sfb_devconfig *dc)); struct sfb_devconfig sfb_console_dc; +tc_addr_t sfb_consaddr; + +struct wsdisplay_emulops sfb_emulfuncs = { + rcons_cursor, /* could use hardware cursor; punt */ + rcons_mapchar, + rcons_putchar, + rcons_copycols, + rcons_erasecols, + rcons_copyrows, + rcons_eraserows, + rcons_alloc_attr +}; -struct wscons_emulfuncs sfb_emulfuncs = { - rcons_cursor, /* could use hardware cursor; punt */ - rcons_putstr, - rcons_copycols, - rcons_erasecols, - rcons_copyrows, - rcons_eraserows, - rcons_setattr, +struct wsscreen_descr sfb_stdscreen = { + "std", + 0, 0, /* will be filled in -- XXX shouldn't, it's global */ + &sfb_emulfuncs, + 0, 0 +}; +const struct wsscreen_descr *_sfb_scrlist[] = { + &sfb_stdscreen, + /* XXX other formats, graphics screen? */ +}; + +struct wsscreen_list sfb_screenlist = { + sizeof(_sfb_scrlist) / sizeof(struct wsscreen_descr *), _sfb_scrlist }; int sfbioctl __P((void *, u_long, caddr_t, int, struct proc *)); int sfbmmap __P((void *, off_t, int)); +static int sfb_alloc_screen __P((void *, const struct wsscreen_descr *, + void **, int *, int *, long *)); +static void sfb_free_screen __P((void *, void *)); +static int sfb_show_screen __P((void *, void *, int, + void (*) (void *, int, int), void *)); + #if 0 void sfb_blank __P((struct sfb_devconfig *)); void sfb_unblank __P((struct sfb_devconfig *)); #endif +struct wsdisplay_accessops sfb_accessops = { + sfbioctl, + sfbmmap, + sfb_alloc_screen, + sfb_free_screen, + sfb_show_screen, +}; + int sfbmatch(parent, match, aux) struct device *parent; @@ -206,6 +233,9 @@ sfb_getdevconfig(dense_addr, dc) rcp->rc_crowp = &rcp->rc_crow; rcp->rc_ccolp = &rcp->rc_ccol; rcons_init(rcp, 34, 80); + + sfb_stdscreen.nrows = dc->dc_rcons.rc_maxrow; + sfb_stdscreen.ncols = dc->dc_rcons.rc_maxcol; } void @@ -215,14 +245,14 @@ sfbattach(parent, self, aux) { struct sfb_softc *sc = (struct sfb_softc *)self; struct tc_attach_args *ta = aux; - struct wscons_attach_args waa; - struct wscons_odev_spec *wo; + struct wsemuldisplaydev_attach_args waa; int console; - console = 0; /* XXX */ - if (console) + console = (ta->ta_addr == sfb_consaddr); + if (console) { sc->sc_dc = &sfb_console_dc; - else { + sc->nscreens = 1; + } else { sc->sc_dc = (struct sfb_devconfig *) malloc(sizeof(struct sfb_devconfig), M_DEVBUF, M_WAITOK); sfb_getdevconfig(ta->ta_addr, sc->sc_dc); @@ -244,33 +274,12 @@ sfbattach(parent, self, aux) *(u_int32_t *)(x + SFB_ASIC_VIDEO_VSETUP)); #endif - waa.waa_isconsole = console; - wo = &waa.waa_odev_spec; - - wo->wo_emulfuncs = &sfb_emulfuncs; - wo->wo_emulfuncs_cookie = &sc->sc_dc->dc_rcons; - - wo->wo_ioctl = sfbioctl; - wo->wo_mmap = sfbmmap; - wo->wo_miscfuncs_cookie = sc; - - wo->wo_nrows = sc->sc_dc->dc_rcons.rc_maxrow; - wo->wo_ncols = sc->sc_dc->dc_rcons.rc_maxcol; - wo->wo_crow = 0; - wo->wo_ccol = 0; - - config_found(self, &waa, sfbprint); -} - -int -sfbprint(aux, pnp) - void *aux; - const char *pnp; -{ + waa.console = console; + waa.scrdata = &sfb_screenlist; + waa.accessops = &sfb_accessops; + waa.accesscookie = sc; - if (pnp) - printf("wscons at %s", pnp); - return (UNCONF); + config_found(self, &waa, wsemuldisplaydevprint); } int @@ -353,42 +362,70 @@ sfbmmap(v, offset, prot) return alpha_btop(sc->sc_dc->dc_paddr + offset); } -#if 0 +int +sfb_alloc_screen(v, type, cookiep, curxp, curyp, attrp) + void *v; + const struct wsscreen_descr *type; + void **cookiep; + int *curxp, *curyp; + long *attrp; +{ + struct sfb_softc *sc = v; + long defattr; + + if (sc->nscreens > 0) + return (ENOMEM); + + *cookiep = &sc->sc_dc->dc_rcons; /* one and only for now */ + *curxp = 0; + *curyp = 0; + rcons_alloc_attr(&sc->sc_dc->dc_rcons, 0, 0, 0, &defattr); + *attrp = defattr; + sc->nscreens++; + return (0); +} + void -tga_console(bc, pc, bus, device, function) - bus_chipset_tag_t bc; - pci_chipset_tag_t pc; - int bus, device, function; +sfb_free_screen(v, cookie) + void *v; + void *cookie; { - struct tga_devconfig *dcp = &tga_console_dc; - struct wscons_odev_spec wo; + struct sfb_softc *sc = v; - tga_getdevconfig(bc, pc, pci_make_tag(pc, bus, device, function), dcp); + if (sc->sc_dc == &sfb_console_dc) + panic("sfb_free_screen: console"); - /* sanity checks */ - if (dcp->dc_vaddr == NULL) - panic("tga_console(%d, %d): couldn't map memory space", - device, function); - if (dcp->dc_tgaconf == NULL) - panic("tga_console(%d, %d): unknown board configuration", - device, function); + sc->nscreens--; +} - /* - * Initialize the RAMDAC but DO NOT allocate any private storage. - * Initialization includes disabling cursor, setting a sane - * colormap, etc. It will be reinitialized in tgaattach(). - */ - (*dcp->dc_tgaconf->tgac_ramdac->tgar_init)(dcp, 0); +int +sfb_show_screen(v, cookie, waitok, cb, cbarg) + void *v; + void *cookie; + int waitok; + void (*cb) __P((void *, int, int)); + void *cbarg; +{ - wo.wo_ef = &tga_emulfuncs; - wo.wo_efa = &dcp->dc_rcons; - wo.wo_nrows = dcp->dc_rcons.rc_maxrow; - wo.wo_ncols = dcp->dc_rcons.rc_maxcol; - wo.wo_crow = 0; - wo.wo_ccol = 0; - /* ioctl and mmap are unused until real attachment. */ + return (0); +} + +#if 0 +int +sfb_cnattach(addr) + tc_addr_t addr; +{ + struct sfb_devconfig *dcp = &sfb_console_dc; + long defattr; + + sfb_getdevconfig(addr, dcp); + + rcons_alloc_attr(&dcp->dc_rcons, 0, 0, 0, &defattr); - wscons_attach_console(&wo); + wsdisplay_cnattach(&sfb_stdscreen, &dcp->dc_rcons, + 0, 0, defattr); + sfb_consaddr = addr; + return(0); } #endif diff --git a/sys/arch/alpha/tc/sfbvar.h b/sys/arch/alpha/tc/sfbvar.h index 3c228e65d46..1eaefccb89e 100644 --- a/sys/arch/alpha/tc/sfbvar.h +++ b/sys/arch/alpha/tc/sfbvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sfbvar.h,v 1.4 1997/11/06 12:27:06 niklas Exp $ */ +/* $OpenBSD: sfbvar.h,v 1.5 2000/08/04 16:45:47 ericj Exp $ */ /* $NetBSD: sfbvar.h,v 1.1 1996/05/01 21:15:51 cgd Exp $ */ /* @@ -30,7 +30,6 @@ #include <machine/sfbreg.h> #include <dev/rcons/raster.h> -#include <dev/wscons/wsconsvar.h> #include <dev/wscons/wscons_raster.h> struct sfb_devconfig; @@ -60,4 +59,10 @@ struct sfb_softc { struct device sc_dev; struct sfb_devconfig *sc_dc; /* device configuration */ + + int nscreens; }; + +#if 0 +int sfb_cnattach __P((tc_addr_t)); +#endif |