Module Name: src
Committed By: matt
Date: Sun Sep 2 14:43:21 UTC 2012
Modified Files:
src/sys/arch/arm/arm32: bus_dma.c
src/sys/arch/arm/include/arm32: pmap.h
Log Message:
Make bus_dma understand supersections.
To generate a diff of this commit:
cvs rdiff -u -r1.54 -r1.55 src/sys/arch/arm/arm32/bus_dma.c
cvs rdiff -u -r1.106 -r1.107 src/sys/arch/arm/include/arm32/pmap.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/arm32/bus_dma.c
diff -u src/sys/arch/arm/arm32/bus_dma.c:1.54 src/sys/arch/arm/arm32/bus_dma.c:1.55
--- src/sys/arch/arm/arm32/bus_dma.c:1.54 Fri Jul 1 20:57:45 2011
+++ src/sys/arch/arm/arm32/bus_dma.c Sun Sep 2 14:43:21 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_dma.c,v 1.54 2011/07/01 20:57:45 dyoung Exp $ */
+/* $NetBSD: bus_dma.c,v 1.55 2012/09/02 14:43:21 matt Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
#define _ARM32_BUS_DMA_PRIVATE
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.54 2011/07/01 20:57:45 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.55 2012/09/02 14:43:21 matt Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -962,17 +962,23 @@ _bus_dmamap_load_buffer(bus_dma_tag_t t,
/*
* Get the physical address for this segment.
*
- * XXX Don't support checking for coherent mappings
+ * XXX Doesn't support checking for coherent mappings
* XXX in user address space.
*/
if (__predict_true(pmap == pmap_kernel())) {
(void) pmap_get_pde_pte(pmap, vaddr, &pde, &ptep);
if (__predict_false(pmap_pde_section(pde))) {
- curaddr = (*pde & L1_S_FRAME) |
- (vaddr & L1_S_OFFSET);
+ paddr_t s_frame = L1_S_FRAME;
+ paddr_t s_offset = L1_S_OFFSET;
+#if ARM_MMU_V7 > 0
+ if (__predict_false(pmap_pde_supersection(pde))) {
+ s_frame = L1_SS_FRAME;
+ s_frame = L1_SS_OFFSET;
+}
+#endif
+ curaddr = (*pde & s_frame) | (vaddr & s_offset);
if (*pde & L1_S_CACHE_MASK) {
- map->_dm_flags &=
- ~ARM32_DMAMAP_COHERENT;
+ map->_dm_flags &= ~ARM32_DMAMAP_COHERENT;
}
} else {
pte = *ptep;
Index: src/sys/arch/arm/include/arm32/pmap.h
diff -u src/sys/arch/arm/include/arm32/pmap.h:1.106 src/sys/arch/arm/include/arm32/pmap.h:1.107
--- src/sys/arch/arm/include/arm32/pmap.h:1.106 Sat Sep 1 12:19:32 2012
+++ src/sys/arch/arm/include/arm32/pmap.h Sun Sep 2 14:43:21 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.106 2012/09/01 12:19:32 martin Exp $ */
+/* $NetBSD: pmap.h,v 1.107 2012/09/02 14:43:21 matt Exp $ */
/*
* Copyright (c) 2002, 2003 Wasabi Systems, Inc.
@@ -453,6 +453,7 @@ pmap_ptesync(pt_entry_t *ptep, size_t cn
/* L1 and L2 page table macros */
#define pmap_pde_v(pde) l1pte_valid(*(pde))
#define pmap_pde_section(pde) l1pte_section_p(*(pde))
+#define pmap_pde_supersection(pde) l1pte_supersection_p(*(pde))
#define pmap_pde_page(pde) l1pte_page_p(*(pde))
#define pmap_pde_fpage(pde) l1pte_fpage_p(*(pde))