PROVIDE_DMAAPI_INLINE ( flat, dma_umalloc );
PROVIDE_DMAAPI_INLINE ( flat, dma_ufree );
PROVIDE_DMAAPI_INLINE ( flat, dma_set_mask );
-PROVIDE_DMAAPI_INLINE ( flat, dma_phys );
+PROVIDE_DMAAPI_INLINE ( flat, dma );
/******************************************************************************
*
* @ret rc Return status code
*/
static int dma_op_map ( struct dma_device *dma, struct dma_mapping *map,
- physaddr_t addr, size_t len, int flags ) {
+ void *addr, size_t len, int flags ) {
struct dma_operations *op = dma->op;
if ( ! op )
PROVIDE_DMAAPI ( op, dma_umalloc, dma_op_umalloc );
PROVIDE_DMAAPI ( op, dma_ufree, dma_op_ufree );
PROVIDE_DMAAPI ( op, dma_set_mask, dma_op_set_mask );
-PROVIDE_DMAAPI_INLINE ( op, dma_phys );
+PROVIDE_DMAAPI_INLINE ( op, dma );
/* Map dummy target location */
if ( ( rc = dma_map ( intelxl->dma, &intelxl->msix.map,
- virt_to_phys ( &intelxl->msix.msg ),
- sizeof ( intelxl->msix.msg ), DMA_RX ) ) != 0 ) {
+ &intelxl->msix.msg, sizeof ( intelxl->msix.msg ),
+ DMA_RX ) ) != 0 ) {
DBGC ( intelxl, "INTELXL %p could not map MSI-X target: %s\n",
intelxl, strerror ( rc ) );
goto err_map;
* @ret rc Return status code
*/
int ( * map ) ( struct dma_device *dma, struct dma_mapping *map,
- physaddr_t addr, size_t len, int flags );
+ void *addr, size_t len, int flags );
/**
* Unmap buffer
*
*/
static inline __always_inline int
DMAAPI_INLINE ( flat, dma_map ) ( struct dma_device *dma,
- struct dma_mapping *map,
- physaddr_t addr __unused,
+ struct dma_mapping *map, void *addr __unused,
size_t len __unused, int flags __unused ) {
/* Increment mapping count (for debugging) */
}
/**
- * Get DMA address from physical address
+ * Get DMA address from virtual address
*
* @v map DMA mapping
- * @v addr Physical address within the mapped region
+ * @v addr Address within the mapped region
* @ret addr Device-side DMA address
*/
static inline __always_inline physaddr_t
-DMAAPI_INLINE ( flat, dma_phys ) ( struct dma_mapping *map __unused,
- physaddr_t addr ) {
+DMAAPI_INLINE ( flat, dma ) ( struct dma_mapping *map __unused, void *addr ) {
/* Use physical address as device address */
- return addr;
+ return virt_to_phys ( addr );
}
/**
- * Get DMA address from physical address
+ * Get DMA address from virtual address
*
* @v map DMA mapping
- * @v addr Physical address within the mapped region
+ * @v addr Address within the mapped region
* @ret addr Device-side DMA address
*/
static inline __always_inline physaddr_t
-DMAAPI_INLINE ( op, dma_phys ) ( struct dma_mapping *map, physaddr_t addr ) {
+DMAAPI_INLINE ( op, dma ) ( struct dma_mapping *map, void *addr ) {
/* Adjust physical address using mapping offset */
- return ( addr + map->offset );
+ return ( virt_to_phys ( addr ) + map->offset );
}
/**
* @ret rc Return status code
*/
int dma_map ( struct dma_device *dma, struct dma_mapping *map,
- physaddr_t addr, size_t len, int flags );
+ void *addr, size_t len, int flags );
/**
* Unmap buffer
*/
void dma_set_mask ( struct dma_device *dma, physaddr_t mask );
-/**
- * Get DMA address from physical address
- *
- * @v map DMA mapping
- * @v addr Physical address within the mapped region
- * @ret addr Device-side DMA address
- */
-physaddr_t dma_phys ( struct dma_mapping *map, physaddr_t addr );
-
/**
* Get DMA address from virtual address
*
* @v map DMA mapping
- * @v addr Virtual address within the mapped region
+ * @v addr Address within the mapped region
* @ret addr Device-side DMA address
*/
-static inline __always_inline physaddr_t dma ( struct dma_mapping *map,
- void *addr ) {
-
- /* Get DMA address from corresponding physical address */
- return dma_phys ( map, virt_to_phys ( addr ) );
-}
+physaddr_t dma ( struct dma_mapping *map, void *addr );
/**
* Check if DMA unmapping is required
static inline __always_inline int iob_map ( struct io_buffer *iobuf,
struct dma_device *dma,
size_t len, int flags ) {
- return dma_map ( dma, &iobuf->map, virt_to_phys ( iobuf->data ),
- len, flags );
+ return dma_map ( dma, &iobuf->map, iobuf->data, len, flags );
}
/**
* @ret rc Return status code
*/
static int efipci_dma_map ( struct dma_device *dma, struct dma_mapping *map,
- physaddr_t addr, size_t len, int flags ) {
+ void *addr, size_t len, int flags ) {
struct efi_pci_device *efipci =
container_of ( dma, struct efi_pci_device, pci.dma );
struct pci_device *pci = &efipci->pci;
EFI_PHYSICAL_ADDRESS bus;
UINTN count;
VOID *mapping;
+ physaddr_t phys;
EFI_STATUS efirc;
int rc;
}
/* Map buffer (if non-zero length) */
+ phys = virt_to_phys ( addr );
count = len;
if ( len ) {
- if ( ( efirc = pci_io->Map ( pci_io, op, phys_to_virt ( addr ),
- &count, &bus, &mapping ) ) != 0 ) {
+ if ( ( efirc = pci_io->Map ( pci_io, op, addr, &count, &bus,
+ &mapping ) ) != 0 ) {
rc = -EEFI ( efirc );
- DBGC ( pci, "EFIPCI " PCI_FMT " cannot map %08lx+%zx: "
+ DBGC ( pci, "EFIPCI " PCI_FMT " cannot map %p+%zx: "
"%s\n", PCI_ARGS ( pci ), addr, len,
strerror ( rc ) );
goto err_map;
}
} else {
- bus = addr;
+ bus = phys;
mapping = NULL;
}
*/
if ( count != len ) {
DBGC ( pci, "EFIPCI " PCI_FMT " attempted split mapping for "
- "%08lx+%zx\n", PCI_ARGS ( pci ), addr, len );
+ "%p+%zx\n", PCI_ARGS ( pci ), addr, len );
rc = -ENOTSUP;
goto err_len;
}
/* Populate mapping */
map->dma = dma;
- map->offset = ( bus - addr );
+ map->offset = ( bus - phys );
map->token = mapping;
/* Increment mapping count (for debugging) */
memset ( addr, 0, ( pages * EFI_PAGE_SIZE ) );
/* Map buffer */
- if ( ( rc = efipci_dma_map ( dma, map, virt_to_phys ( addr ),
- ( pages * EFI_PAGE_SIZE ),
+ if ( ( rc = efipci_dma_map ( dma, map, addr, ( pages * EFI_PAGE_SIZE ),
DMA_BI ) ) != 0 )
goto err_map;