summaryrefslogtreecommitdiffstats
path: root/sys/dev/dcons/dcons_crom.c
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2009-01-07 21:25:44 +0000
committermarius <marius@FreeBSD.org>2009-01-07 21:25:44 +0000
commit325428c5284e98d68582a2629bcfbbbde1a274ae (patch)
tree5f438ca530f7116355200da08ff6ca3468c15a38 /sys/dev/dcons/dcons_crom.c
parentf885f01ae19df45aece1f108bd6c756e6b12b4f4 (diff)
downloadFreeBSD-src-325428c5284e98d68582a2629bcfbbbde1a274ae.zip
FreeBSD-src-325428c5284e98d68582a2629bcfbbbde1a274ae.tar.gz
Check the return values of contigmalloc(9) as well as bus_dma(9)
functions and stop attaching of dcons(4) and dcons_crom(4) if they indicate failure. This fixes a panic seen on sparc64 machines with no free physical memory in the requested 32-bit region but still doesn't make dcons(4)/dcons_crom(4) these work. I think the latter can be fixed by simply specifying ~0UL as the upper limit for contigmalloc(9) and letting the bounce pages and the IOMMU respectively handle limitations of the DMA engine. I didn't want to change that without the consensus of simokawa@ though, who unfortunately didn't reply so far. MFC after: 1 week
Diffstat (limited to 'sys/dev/dcons/dcons_crom.c')
-rw-r--r--sys/dev/dcons/dcons_crom.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/dev/dcons/dcons_crom.c b/sys/dev/dcons/dcons_crom.c
index 0b2b707..ee263e9 100644
--- a/sys/dev/dcons/dcons_crom.c
+++ b/sys/dev/dcons/dcons_crom.c
@@ -205,7 +205,10 @@ dcons_crom_attach(device_t dev)
return (-1);
#else
struct dcons_crom_softc *sc;
+ int error;
+ if (dcons_conf->buf == NULL)
+ return (ENXIO);
sc = (struct dcons_crom_softc *) device_get_softc(dev);
sc->fd.fc = device_get_ivars(dev);
sc->fd.dev = dev;
@@ -213,7 +216,7 @@ dcons_crom_attach(device_t dev)
sc->fd.post_busreset = (void *) dcons_crom_post_busreset;
/* map dcons buffer */
- bus_dma_tag_create(
+ error = bus_dma_tag_create(
/*parent*/ sc->fd.fc->dmat,
/*alignment*/ sizeof(u_int32_t),
/*boundary*/ 0,
@@ -229,10 +232,16 @@ dcons_crom_attach(device_t dev)
/*lockarg*/&Giant,
#endif
&sc->dma_tag);
- bus_dmamap_create(sc->dma_tag, BUS_DMA_COHERENT, &sc->dma_map);
- bus_dmamap_load(sc->dma_tag, sc->dma_map,
+ if (error != 0)
+ return (error);
+ error = bus_dmamap_create(sc->dma_tag, BUS_DMA_COHERENT, &sc->dma_map);
+ if (error != 0)
+ return (error);
+ error = bus_dmamap_load(sc->dma_tag, sc->dma_map,
(void *)dcons_conf->buf, dcons_conf->size,
dmamap_cb, sc, 0);
+ if (error != 0)
+ return (error);
sc->ehand = EVENTHANDLER_REGISTER(dcons_poll, dcons_crom_poll,
(void *)sc, 0);
return (0);
OpenPOWER on IntegriCloud