summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjmcneill <jmcneill@NetBSD.org>2021-08-30 22:56:26 +0000
committerjmcneill <jmcneill@NetBSD.org>2021-08-30 22:56:26 +0000
commitd023deb89ec32bb7d3f34e1f05d4dedc199cdb74 (patch)
treeb81572f7812f25395920a9b1cdb571146120ed42
parentb600f5c3e59e2111d5f9a8d2685510a8ad0066f5 (diff)
Add storage for an iommu cookie in bus_dmamap_t and store untranslated CPU
address in bus_dma_segment_t.
-rw-r--r--sys/arch/arm/arm32/bus_dma.c9
-rw-r--r--sys/arch/arm/include/bus_defs.h4
2 files changed, 9 insertions, 4 deletions
diff --git a/sys/arch/arm/arm32/bus_dma.c b/sys/arch/arm/arm32/bus_dma.c
index 3cb5fbb4e89..495530cb979 100644
--- a/sys/arch/arm/arm32/bus_dma.c
+++ b/sys/arch/arm/arm32/bus_dma.c
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_dma.c,v 1.132 2021/02/07 10:47:40 skrll Exp $ */
+/* $NetBSD: bus_dma.c,v 1.133 2021/08/30 22:56:26 jmcneill Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2020 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
#include "opt_cputypes.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.132 2021/02/07 10:47:40 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.133 2021/08/30 22:56:26 jmcneill Exp $");
#include <sys/param.h>
@@ -259,6 +259,7 @@ _bus_dmamap_load_paddr(bus_dma_tag_t t, bus_dmamap_t map,
/* new segment */
segs[nseg].ds_addr = curaddr;
segs[nseg].ds_len = sgsize;
+ segs[nseg]._ds_paddr = curaddr;
segs[nseg]._ds_flags = _ds_flags;
nseg++;
}
@@ -1717,7 +1718,8 @@ _bus_dmamem_alloc_range(bus_dma_tag_t t, bus_size_t size, bus_size_t alignment,
*/
m = TAILQ_FIRST(&mlist);
curseg = 0;
- lastaddr = segs[curseg].ds_addr = VM_PAGE_TO_PHYS(m);
+ lastaddr = segs[curseg].ds_addr = segs[curseg]._ds_paddr =
+ VM_PAGE_TO_PHYS(m);
segs[curseg].ds_len = PAGE_SIZE;
#ifdef DEBUG_DMA
printf("alloc: page %#lx\n", lastaddr);
@@ -1742,6 +1744,7 @@ _bus_dmamem_alloc_range(bus_dma_tag_t t, bus_size_t size, bus_size_t alignment,
return EFBIG;
}
segs[curseg].ds_addr = curaddr;
+ segs[curseg]._ds_paddr = curaddr;
segs[curseg].ds_len = PAGE_SIZE;
}
lastaddr = curaddr;
diff --git a/sys/arch/arm/include/bus_defs.h b/sys/arch/arm/include/bus_defs.h
index 93f7fb7b335..6e1ac424b5f 100644
--- a/sys/arch/arm/include/bus_defs.h
+++ b/sys/arch/arm/include/bus_defs.h
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_defs.h,v 1.16 2021/04/23 06:02:48 skrll Exp $ */
+/* $NetBSD: bus_defs.h,v 1.17 2021/08/30 22:56:26 jmcneill Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc.
@@ -377,6 +377,7 @@ struct arm32_bus_dma_segment {
* PRIVATE MEMBERS:
*/
uint32_t _ds_flags; /* _BUS_DMAMAP_COHERENT */
+ paddr_t _ds_paddr; /* CPU address */
};
typedef struct arm32_bus_dma_segment bus_dma_segment_t;
@@ -481,6 +482,7 @@ struct arm32_bus_dmamap {
struct vmspace *_dm_vmspace; /* vmspace that owns the mapping */
void *_dm_cookie; /* cookie for bus-specific functions */
+ void *_dm_iommu; /* cookie for iommu functions */
/*
* PUBLIC MEMBERS: these are used by machine-independent code.