diff options
author | simokawa <simokawa@FreeBSD.org> | 2004-02-16 07:25:46 +0000 |
---|---|---|
committer | simokawa <simokawa@FreeBSD.org> | 2004-02-16 07:25:46 +0000 |
commit | 24775302eb1bada4d09e738e593de3b6124623bf (patch) | |
tree | f51fb81de10ebf9c6ae2b2acf6f14e690a9d63aa | |
parent | 600caa157eae5e9619a172eb362d497bf39da392 (diff) | |
download | FreeBSD-src-24775302eb1bada4d09e738e593de3b6124623bf.zip FreeBSD-src-24775302eb1bada4d09e738e593de3b6124623bf.tar.gz |
- Clean up global data.
- Force dcons to be the high-level console after dcons_crom
has been attached.
- Add a tunable to be the high-level console.
-rw-r--r-- | sys/dev/dcons/dcons.c | 59 | ||||
-rw-r--r-- | sys/dev/dcons/dcons.h | 12 | ||||
-rw-r--r-- | sys/dev/dcons/dcons_crom.c | 25 |
3 files changed, 58 insertions, 38 deletions
diff --git a/sys/dev/dcons/dcons.c b/sys/dev/dcons/dcons.c index 4cea5ca..6fd2844 100644 --- a/sys/dev/dcons/dcons.c +++ b/sys/dev/dcons/dcons.c @@ -117,18 +117,19 @@ static struct cdevsw dcons_cdevsw = { #ifndef KLD_MODULE static char bssbuf[DCONS_BUF_SIZE]; /* buf in bss */ #endif -struct dcons_buf *dcons_buf; -size_t dcons_bufsize; -bus_dma_tag_t dcons_dma_tag = NULL; -bus_dmamap_t dcons_dma_map = NULL; +/* global data */ +static struct dcons_global dg; +struct dcons_global *dcons_conf; static int poll_hz = DCONS_POLL_HZ; + SYSCTL_NODE(_kern, OID_AUTO, dcons, CTLFLAG_RD, 0, "Dumb Console"); SYSCTL_INT(_kern_dcons, OID_AUTO, poll_hz, CTLFLAG_RW, &poll_hz, 0, "dcons polling rate"); static int drv_init = 0; static struct callout dcons_callout; +struct dcons_buf *dcons_buf; /* for local dconschat */ /* per device data */ static struct dcons_softc { @@ -373,9 +374,8 @@ dcons_checkc(struct dcons_softc *dc) ch = &dc->i; - if (dcons_dma_tag != NULL) - bus_dmamap_sync(dcons_dma_tag, dcons_dma_map, - BUS_DMASYNC_POSTREAD); + if (dg.dma_tag != NULL) + bus_dmamap_sync(dg.dma_tag, dg.dma_map, BUS_DMASYNC_POSTREAD); ptr = ntohl(*ch->ptr); gen = ptr >> DCONS_GEN_SHIFT; pos = ptr & DCONS_POS_MASK; @@ -438,9 +438,8 @@ dcons_putc(struct dcons_softc *dc, int c) ch->pos = 0; } *ch->ptr = DCONS_MAKE_PTR(ch); - if (dcons_dma_tag != NULL) - bus_dmamap_sync(dcons_dma_tag, dcons_dma_map, - BUS_DMASYNC_PREWRITE); + if (dg.dma_tag != NULL) + bus_dmamap_sync(dg.dma_tag, dg.dma_map, BUS_DMASYNC_PREWRITE); } static int @@ -455,19 +454,19 @@ dcons_init_port(int port, int offset, int size) dc->o.size = osize; dc->i.size = size - osize; - dc->o.buf = (char *)dcons_buf + offset; + dc->o.buf = (char *)dg.buf + offset; dc->i.buf = dc->o.buf + osize; dc->o.gen = dc->i.gen = 0; dc->o.pos = dc->i.pos = 0; - dc->o.ptr = &dcons_buf->optr[port]; - dc->i.ptr = &dcons_buf->iptr[port]; + dc->o.ptr = &dg.buf->optr[port]; + dc->i.ptr = &dg.buf->iptr[port]; dc->brk_state = STATE0; - dcons_buf->osize[port] = htonl(osize); - dcons_buf->isize[port] = htonl(size - osize); - dcons_buf->ooffset[port] = htonl(offset); - dcons_buf->ioffset[port] = htonl(offset + osize); - dcons_buf->optr[port] = DCONS_MAKE_PTR(&dc->o); - dcons_buf->iptr[port] = DCONS_MAKE_PTR(&dc->i); + dg.buf->osize[port] = htonl(osize); + dg.buf->isize[port] = htonl(size - osize); + dg.buf->ooffset[port] = htonl(offset); + dg.buf->ioffset[port] = htonl(offset + osize); + dg.buf->optr[port] = DCONS_MAKE_PTR(&dc->o); + dg.buf->iptr[port] = DCONS_MAKE_PTR(&dc->i); return(0); } @@ -482,7 +481,10 @@ dcons_drv_init(int stage) drv_init = -1; - dcons_bufsize = DCONS_BUF_SIZE; + bzero(&dg, sizeof(dg)); + dcons_conf = &dg; + dg.cdev = &dcons_consdev; + dg.size = DCONS_BUF_SIZE; #ifndef KLD_MODULE if (stage == 0) /* XXX or cold */ @@ -490,26 +492,27 @@ dcons_drv_init(int stage) * DCONS_FORCE_CONSOLE == 1 and statically linked. * called from cninit(). can't use contigmalloc yet . */ - dcons_buf = (struct dcons_buf *) bssbuf; + dg.buf = (struct dcons_buf *) bssbuf; else #endif /* * DCONS_FORCE_CONSOLE == 0 or kernel module case. * if the module is loaded after boot, - * dcons_buf could be non-continuous. + * bssbuf could be non-continuous. */ - dcons_buf = (struct dcons_buf *) contigmalloc(dcons_bufsize, + dg.buf = (struct dcons_buf *) contigmalloc(dg.size, M_DEVBUF, 0, 0x10000, 0xffffffff, PAGE_SIZE, 0ul); + dcons_buf = dg.buf; offset = DCONS_HEADER_SIZE; - size = (dcons_bufsize - offset); + size = (dg.size - offset); size0 = size * 3 / 4; dcons_init_port(0, offset, size0); offset += size0; dcons_init_port(1, offset, size - size0); - dcons_buf->version = htonl(DCONS_VERSION); - dcons_buf->magic = ntohl(DCONS_MAGIC); + dg.buf->version = htonl(DCONS_VERSION); + dg.buf->magic = ntohl(DCONS_MAGIC); #if DDB && DCONS_FORCE_GDB #if CONS_NODEV @@ -633,9 +636,9 @@ dcons_modevent(module_t mode, int type, void *data) #endif dcons_detach(DCONS_CON); dcons_detach(DCONS_GDB); - dcons_buf->magic = 0; + dg.buf->magic = 0; - contigfree(dcons_buf, DCONS_BUF_SIZE, M_DEVBUF); + contigfree(dg.buf, DCONS_BUF_SIZE, M_DEVBUF); break; case MOD_SHUTDOWN: diff --git a/sys/dev/dcons/dcons.h b/sys/dev/dcons/dcons.h index 73265bc..6c25ee1 100644 --- a/sys/dev/dcons/dcons.h +++ b/sys/dev/dcons/dcons.h @@ -90,8 +90,12 @@ struct dcons_ch { #define STATE2 2 #ifdef _KERNEL -extern struct dcons_buf *dcons_buf; -extern size_t dcons_bufsize; -extern bus_dma_tag_t dcons_dma_tag; -extern bus_dmamap_t dcons_dma_map; +struct dcons_global { + struct consdev *cdev; + struct dcons_buf *buf; + size_t size; + bus_dma_tag_t dma_tag; + bus_dmamap_t dma_map; +}; +extern struct dcons_global *dcons_conf; #endif diff --git a/sys/dev/dcons/dcons_crom.c b/sys/dev/dcons/dcons_crom.c index 917111d..3d79ad5 100644 --- a/sys/dev/dcons/dcons_crom.c +++ b/sys/dev/dcons/dcons_crom.c @@ -50,8 +50,15 @@ #include <dev/firewire/iec13213.h> #include <dev/dcons/dcons.h> +#include <sys/cons.h> + static bus_addr_t dcons_paddr; +#if __FreeBSD_version >= 500000 +static int force_console = 1; +TUNABLE_INT("hw.firewire.dcons_crom.force_console", &force_console); +#endif + #ifndef CSRVAL_VENDOR_PRIVATE #define NEED_NEW_DRIVER #endif @@ -136,9 +143,15 @@ dmamap_cb(void *arg, bus_dma_segment_t *segments, int seg, int error) device_printf(sc->fd.dev, "dcons_paddr is already set\n"); return; } - dcons_dma_tag = sc->dma_tag; - dcons_dma_map = sc->dma_map; + dcons_conf->dma_tag = sc->dma_tag; + dcons_conf->dma_map = sc->dma_map; dcons_paddr = sc->bus_addr; + +#if __FreeBSD_version >= 500000 + /* Force to be the high-level console */ + if (force_console) + cnselect(dcons_conf->cdev); +#endif } static int @@ -164,7 +177,7 @@ dcons_crom_attach(device_t dev) /*lowaddr*/ BUS_SPACE_MAXADDR, /*highaddr*/ BUS_SPACE_MAXADDR, /*filter*/NULL, /*filterarg*/NULL, - /*maxsize*/ dcons_bufsize, + /*maxsize*/ dcons_conf->size, /*nsegments*/ 1, /*maxsegsz*/ BUS_SPACE_MAXSIZE_32BIT, /*flags*/ BUS_DMA_ALLOCNOW, @@ -175,7 +188,7 @@ dcons_crom_attach(device_t dev) &sc->dma_tag); bus_dmamap_create(sc->dma_tag, 0, &sc->dma_map); bus_dmamap_load(sc->dma_tag, sc->dma_map, - (void *)dcons_buf, dcons_bufsize, + (void *)dcons_conf->buf, dcons_conf->size, dmamap_cb, sc, 0); return (0); #endif @@ -190,8 +203,8 @@ dcons_crom_detach(device_t dev) sc->fd.post_busreset = NULL; /* XXX */ - if (dcons_dma_tag == sc->dma_tag) - dcons_dma_tag = NULL; + if (dcons_conf->dma_tag == sc->dma_tag) + dcons_conf->dma_tag = NULL; bus_dmamap_unload(sc->dma_tag, sc->dma_map); bus_dmamap_destroy(sc->dma_tag, sc->dma_map); |