summaryrefslogtreecommitdiffstats
path: root/sys/dev/dcons
diff options
context:
space:
mode:
authorsimokawa <simokawa@FreeBSD.org>2004-02-16 07:25:46 +0000
committersimokawa <simokawa@FreeBSD.org>2004-02-16 07:25:46 +0000
commit24775302eb1bada4d09e738e593de3b6124623bf (patch)
treef51fb81de10ebf9c6ae2b2acf6f14e690a9d63aa /sys/dev/dcons
parent600caa157eae5e9619a172eb362d497bf39da392 (diff)
downloadFreeBSD-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.
Diffstat (limited to 'sys/dev/dcons')
-rw-r--r--sys/dev/dcons/dcons.c59
-rw-r--r--sys/dev/dcons/dcons.h12
-rw-r--r--sys/dev/dcons/dcons_crom.c25
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);
OpenPOWER on IntegriCloud