refactor loading of dmamaps.
authordlg <dlg@openbsd.org>
Sun, 25 Jan 2015 11:36:41 +0000 (11:36 +0000)
committerdlg <dlg@openbsd.org>
Sun, 25 Jan 2015 11:36:41 +0000 (11:36 +0000)
commit880ce07f8829ad9f3295ccc4fb91f82df8df89b6
tree763a35d7435d5827c514e45882bcf7e7e939852d
parent606881540916898b4c535fa0d5ac430c257e9031
refactor loading of dmamaps.

bus_dmama_load and bus_dmamap_load mbuf figure out the physical
addresses of the memory theyre given and then hand it to
_bus_dmamap_load_paddr to store in the dmamaps sg lists.

unfortunately bus_dmamap_load_mbuf assumes it is only given memory
from the kernels direct mapped region, and blindly translates
anything its given into phys addresses to hand to _load_paddr.

i recently committed change to pool asking them to allocate large
pages, which meant uvm allocated mbufs outside the direct map, which
meant bus_dmamap_load_mbuf was handing out bogus physical addresses.
the pool change got backed out until i could debug this.

now _load and _load_mbuf now call _bus_dmamap_load_vaddr for every
buffer theyve been given, which properly determines if the addresses
are in the direct map or via the tlb. _load_vaddr then feeds the
physical addresses into _bus_dmamap_load_paddr to store them in the
dmamap.

tldr; _load_mbuf doesnt make naive assumptions about its addresses
now.

ok miod@ kettenis@
sys/arch/landisk/landisk/bus_dma.c