Index: sys/dev/fdt/simplebus.h =================================================================== --- sys/dev/fdt/simplebus.h +++ sys/dev/fdt/simplebus.h @@ -49,6 +49,8 @@ int nranges; pcell_t acells, scells; + + bus_dma_tag_t dmat; }; struct simplebus_devinfo { Index: sys/dev/fdt/simplebus.c =================================================================== --- sys/dev/fdt/simplebus.c +++ sys/dev/fdt/simplebus.c @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -65,6 +66,7 @@ static int simplebus_fill_ranges(phandle_t node, struct simplebus_softc *sc); +static bus_dma_tag_t simplebus_get_dma_tag(device_t, device_t); /* * Driver methods. @@ -96,6 +98,8 @@ DEVMETHOD(bus_child_pnpinfo_str, ofw_bus_gen_child_pnpinfo_str), DEVMETHOD(bus_get_resource_list, simplebus_get_resource_list), + DEVMETHOD(bus_get_dma_tag, simplebus_get_dma_tag), + /* ofw_bus interface */ DEVMETHOD(ofw_bus_get_devinfo, simplebus_get_devinfo), DEVMETHOD(ofw_bus_get_compat, ofw_bus_gen_get_compat), @@ -144,6 +148,7 @@ { struct simplebus_softc *sc; phandle_t node; + int flags = 0; sc = device_get_softc(dev); simplebus_init(dev, 0); @@ -152,6 +157,22 @@ return (ENXIO); } + if (ofw_bus_has_prop(dev, "dma-coherent")) + flags |= BUS_DMA_COHERENT; + + /* Create the parent DMA tag to pass down the coherent flag */ + bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */ + 1, 0, /* alignment, bounds */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + BUS_SPACE_MAXSIZE, /* maxsize */ + BUS_SPACE_UNRESTRICTED, /* nsegments */ + BUS_SPACE_MAXSIZE, /* maxsegsize */ + flags, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->dmat); + /* * In principle, simplebus could have an interrupt map, but ignore that * for now @@ -162,6 +183,15 @@ return (bus_generic_attach(dev)); } +static bus_dma_tag_t +simplebus_get_dma_tag(device_t dev, device_t child) +{ + struct simplebus_softc *sc; + + sc = device_get_softc(dev); + return (sc->dmat); +} + void simplebus_init(device_t dev, phandle_t node) {