Module Name:    src
Committed By:   skrll
Date:           Sat Jan 26 08:01:49 UTC 2013

Modified Files:
        src/sys/arch/arm/broadcom: bcm2835_obio.c bcm2835_space.c bcm2835reg.h

Log Message:
Deal with bus addresses better. Switch the DMA bus address base to the
cache coherent range - not that anything uses it yet.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/broadcom/bcm2835_obio.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/broadcom/bcm2835_space.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/arm/broadcom/bcm2835reg.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/broadcom/bcm2835_obio.c
diff -u src/sys/arch/arm/broadcom/bcm2835_obio.c:1.12 src/sys/arch/arm/broadcom/bcm2835_obio.c:1.13
--- src/sys/arch/arm/broadcom/bcm2835_obio.c:1.12	Fri Jan 25 00:04:06 2013
+++ src/sys/arch/arm/broadcom/bcm2835_obio.c	Sat Jan 26 08:01:49 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: bcm2835_obio.c,v 1.12 2013/01/25 00:04:06 jmcneill Exp $	*/
+/*	$NetBSD: bcm2835_obio.c,v 1.13 2013/01/26 08:01:49 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm2835_obio.c,v 1.12 2013/01/25 00:04:06 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm2835_obio.c,v 1.13 2013/01/26 08:01:49 skrll Exp $");
 
 #include "locators.h"
 #include "obio.h"
@@ -181,7 +181,7 @@ obio_attach(device_t parent, device_t se
 	sc->sc_dmat = &bcm2835_bus_dma_tag;
 
 	sc->sc_dmarange.dr_sysbase = 0;
-	sc->sc_dmarange.dr_busbase = 0xc0000000;	/* 0x40000000 if L2 */
+	sc->sc_dmarange.dr_busbase = BCM2835_BUSADDR_CACHE_COHERENT;
 	sc->sc_dmarange.dr_len = physmem * PAGE_SIZE;
 	bcm2835_bus_dma_tag._ranges = &sc->sc_dmarange;
 	bcm2835_bus_dma_tag._nranges = 1;

Index: src/sys/arch/arm/broadcom/bcm2835_space.c
diff -u src/sys/arch/arm/broadcom/bcm2835_space.c:1.4 src/sys/arch/arm/broadcom/bcm2835_space.c:1.5
--- src/sys/arch/arm/broadcom/bcm2835_space.c:1.4	Wed Jan 23 16:51:14 2013
+++ src/sys/arch/arm/broadcom/bcm2835_space.c	Sat Jan 26 08:01:49 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: bcm2835_space.c,v 1.4 2013/01/23 16:51:14 macallan Exp $	*/
+/*	$NetBSD: bcm2835_space.c,v 1.5 2013/01/26 08:01:49 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm2835_space.c,v 1.4 2013/01/23 16:51:14 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm2835_space.c,v 1.5 2013/01/26 08:01:49 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -40,6 +40,8 @@ __KERNEL_RCSID(0, "$NetBSD: bcm2835_spac
 
 #include <sys/bus.h>
 
+#include <arm/broadcom/bcm2835reg.h>
+
 /* Prototypes for all the bus_space structure functions */
 bs_protos(bcm2835);
 bs_protos(bcm2835_a4x);
@@ -280,7 +282,7 @@ struct bus_space bcm2835_a4x_bs_tag = {
 
 
 int
-bcm2835_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flag,
+bcm2835_bs_map(void *t, bus_addr_t ba, bus_size_t size, int flag,
     bus_space_handle_t *bshp)
 {
 	u_long startpa, endpa, pa;
@@ -288,14 +290,17 @@ bcm2835_bs_map(void *t, bus_addr_t bpa, 
 	const struct pmap_devmap *pd;
 	int pmap_flags;
 
-	if ((pd = pmap_devmap_find_pa(bpa, size)) != NULL) {
+	pa = ba & ~BCM2835_BUSADDR_CACHE_MASK;
+
+	/* this does device addresses */
+	if ((pd = pmap_devmap_find_pa(pa, size)) != NULL) {
 		/* Device was statically mapped. */
-		*bshp = pd->pd_va + (bpa - pd->pd_pa);
+		*bshp = pd->pd_va + (pa - pd->pd_pa);
 		return 0;
 	}
 
-	startpa = trunc_page(bpa);
-	endpa = round_page(bpa + size);
+	startpa = trunc_page(pa);
+	endpa = round_page(pa + size);
 
 	/* XXX use extent manager to check duplicate mapping */
 
@@ -304,7 +309,7 @@ bcm2835_bs_map(void *t, bus_addr_t bpa, 
 	if (!va)
 		return ENOMEM;
 
-	*bshp = (bus_space_handle_t)(va + (bpa - startpa));
+	*bshp = (bus_space_handle_t)(va + (pa - startpa));
 
 	pmap_flags = (flag & BUS_SPACE_MAP_CACHEABLE) ? 0 : PMAP_NOCACHE;
 	for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) {
@@ -368,14 +373,15 @@ bcm2835_bs_vaddr(void *t, bus_space_hand
 }
 
 paddr_t
-bcm2835_bs_mmap(void *t, bus_addr_t paddr, off_t offset, int prot, int flags)
+bcm2835_bs_mmap(void *t, bus_addr_t ba, off_t offset, int prot, int flags)
 {
+	paddr_t pa = ba & ~BCM2835_BUSADDR_CACHE_MASK;
 	paddr_t bus_flags = 0;
 
 	if (flags & BUS_SPACE_MAP_PREFETCHABLE)
 		bus_flags |= ARM32_MMAP_WRITECOMBINE;
 
-	return (arm_btop(paddr + offset) | bus_flags);
+	return (arm_btop(pa + offset) | bus_flags);
 }
 
 int

Index: src/sys/arch/arm/broadcom/bcm2835reg.h
diff -u src/sys/arch/arm/broadcom/bcm2835reg.h:1.8 src/sys/arch/arm/broadcom/bcm2835reg.h:1.9
--- src/sys/arch/arm/broadcom/bcm2835reg.h:1.8	Fri Jan 25 00:04:06 2013
+++ src/sys/arch/arm/broadcom/bcm2835reg.h	Sat Jan 26 08:01:49 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: bcm2835reg.h,v 1.8 2013/01/25 00:04:06 jmcneill Exp $	*/
+/*	$NetBSD: bcm2835reg.h,v 1.9 2013/01/26 08:01:49 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -77,6 +77,12 @@
 #define BCM2835_IOPHYSTOVIRT(a) \
     ((0xf0000000 | (((a) & 0xf0000000) >> 4)) + ((a) & ~0xf0000000))
 
+#define	BCM2835_BUSADDR_CACHE_MASK	0xc0000000
+#define	BCM2835_BUSADDR_CACHE_COHERENT	0x40000000
+#define	BCM2835_BUSADDR_CACHE_L1L2	0x00000000
+#define	BCM2835_BUSADDR_CACHE_L2ONLY	0x80000000
+#define	BCM2835_BUSADDR_CACHE_DIRECT	0xc0000000
+
 #define	BCM2835_PERIPHERALS_VBASE \
 	BCM2835_IOPHYSTOVIRT(BCM2835_PERIPHERALS_BASE)
 #define	BCM2835_STIMER_VBASE	BCM2835_IOPHYSTOVIRT(BCM2835_ST_BASE)

Reply via email to