We need to be able to convert back from DMA addresses to implement bus_to_phys(). Will try to push this upstream.
Signed-off-by: Piotr Jaroszyński <p.jaroszyn...@gmail.com> --- src/include/gpxe/linux/uio-dma.h | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-) diff --git a/src/include/gpxe/linux/uio-dma.h b/src/include/gpxe/linux/uio-dma.h index 16bd0dc..07388e4 100644 --- a/src/include/gpxe/linux/uio-dma.h +++ b/src/include/gpxe/linux/uio-dma.h @@ -160,6 +160,29 @@ static inline uint64_t uio_dma_addr(struct uio_dma_mapping *m, uint8_t *addr, un return m->dmaddr[chunk] + offset; } +/** + * Map DMA address back to the user-space region. + * + * @param m pointer to @see uio_dma_mapping + * @param dma_addr the dma_addr + * @param len length of the memory region + * @return maddr or NULL if address could not be mapped + */ +static inline uint8_t *uio_maddr(struct uio_dma_mapping *m, uint64_t dma_addr, unsigned int len) +{ + unsigned long chunk, chunk_size; + + chunk_size = (1 << m->chunk_shift); + if (len > chunk_size) + return NULL; + + for (chunk = 0 ; chunk < m->chunk_count ; ++chunk) + if (dma_addr + len - m->dmaddr[chunk] <= chunk_size) + return m->addr + chunk * chunk_size + dma_addr - m->dmaddr[chunk]; + + return NULL; +} + #ifdef __cplusplus } #endif -- 1.7.1 _______________________________________________ gPXE-devel mailing list gPXE-devel@etherboot.org http://etherboot.org/mailman/listinfo/gpxe-devel