[gPXE-devel] [PATCH 31/33] [linux] UIO-DMA: Add a function for converting back from DMA addresses

Piotr Jaroszyński p.jaroszynski at gmail.com
Sun Aug 15 18:59:36 EDT 2010


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.jaroszynski at 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



More information about the gPXE-devel mailing list