summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/dma.c41
-rw-r--r--src/core/iobuf.c45
2 files changed, 45 insertions, 41 deletions
diff --git a/src/core/dma.c b/src/core/dma.c
index 561aec1e1..e5fa3f323 100644
--- a/src/core/dma.c
+++ b/src/core/dma.c
@@ -25,7 +25,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <assert.h>
#include <errno.h>
-#include <ipxe/iobuf.h>
#include <ipxe/dma.h>
/** @file
@@ -139,43 +138,3 @@ PROVIDE_DMAAPI ( op, dma_alloc, dma_op_alloc );
PROVIDE_DMAAPI ( op, dma_free, dma_op_free );
PROVIDE_DMAAPI ( op, dma_set_mask, dma_op_set_mask );
PROVIDE_DMAAPI_INLINE ( op, dma_phys );
-
-/******************************************************************************
- *
- * Utility functions
- *
- ******************************************************************************
- */
-
-/**
- * Allocate and map I/O buffer for receiving data from device
- *
- * @v dma DMA device
- * @v map DMA mapping to fill in
- * @v len Length of I/O buffer
- * @ret iobuf I/O buffer, or NULL on error
- */
-struct io_buffer * dma_alloc_rx_iob ( struct dma_device *dma,
- struct dma_mapping *map,
- size_t len ) {
- struct io_buffer *iobuf;
- int rc;
-
- /* Allocate I/O buffer */
- iobuf = alloc_iob ( len );
- if ( ! iobuf )
- goto err_alloc;
-
- /* Map I/O buffer */
- if ( ( rc = dma_map ( dma, map, virt_to_phys ( iobuf->data ),
- len, DMA_RX ) ) != 0 )
- goto err_map;
-
- return iobuf;
-
- dma_unmap ( map );
- err_map:
- free_iob ( iobuf );
- err_alloc:
- return NULL;
-}
diff --git a/src/core/iobuf.c b/src/core/iobuf.c
index 941bb3446..c9970bc76 100644
--- a/src/core/iobuf.c
+++ b/src/core/iobuf.c
@@ -110,6 +110,7 @@ struct io_buffer * alloc_iob_raw ( size_t len, size_t align, size_t offset ) {
}
/* Populate descriptor */
+ memset ( &iobuf->map, 0, sizeof ( iobuf->map ) );
iobuf->head = iobuf->data = iobuf->tail = data;
iobuf->end = ( data + len );
@@ -153,6 +154,7 @@ void free_iob ( struct io_buffer *iobuf ) {
assert ( iobuf->head <= iobuf->data );
assert ( iobuf->data <= iobuf->tail );
assert ( iobuf->tail <= iobuf->end );
+ assert ( ! dma_mapped ( &iobuf->map ) );
/* Free buffer */
len = ( iobuf->end - iobuf->head );
@@ -170,6 +172,49 @@ void free_iob ( struct io_buffer *iobuf ) {
}
/**
+ * Allocate and map I/O buffer for receive DMA
+ *
+ * @v len Length of I/O buffer
+ * @v dma DMA device
+ * @ret iobuf I/O buffer, or NULL on error
+ */
+struct io_buffer * alloc_rx_iob ( size_t len, struct dma_device *dma ) {
+ struct io_buffer *iobuf;
+ int rc;
+
+ /* Allocate I/O buffer */
+ iobuf = alloc_iob ( len );
+ if ( ! iobuf )
+ goto err_alloc;
+
+ /* Map I/O buffer */
+ if ( ( rc = iob_map_rx ( iobuf, dma ) ) != 0 )
+ goto err_map;
+
+ return iobuf;
+
+ iob_unmap ( iobuf );
+ err_map:
+ free_iob ( iobuf );
+ err_alloc:
+ return NULL;
+}
+
+/**
+ * Unmap and free I/O buffer for receive DMA
+ *
+ * @v iobuf I/O buffer
+ */
+void free_rx_iob ( struct io_buffer *iobuf ) {
+
+ /* Unmap I/O buffer */
+ iob_unmap ( iobuf );
+
+ /* Free I/O buffer */
+ free_iob ( iobuf );
+}
+
+/**
* Ensure I/O buffer has sufficient headroom
*
* @v iobuf I/O buffer