Module Name:    src
Committed By:   matt
Date:           Sun Oct  7 19:16:40 UTC 2012

Modified Files:
        src/sys/arch/arm/broadcom: bcm53xx_board.c bcm53xx_var.h

Log Message:
Add bcm53xx_dma_bootstrap which, if there is more than 256MB of RAM, add two
ranges to the default dma tag.  This has the side effect of making most initial
bus_dmamem_allocs trying to get memory from the first 256MB which is coherent
on this platform.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/broadcom/bcm53xx_board.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/broadcom/bcm53xx_var.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/bcm53xx_board.c
diff -u src/sys/arch/arm/broadcom/bcm53xx_board.c:1.4 src/sys/arch/arm/broadcom/bcm53xx_board.c:1.5
--- src/sys/arch/arm/broadcom/bcm53xx_board.c:1.4	Wed Oct  3 19:18:40 2012
+++ src/sys/arch/arm/broadcom/bcm53xx_board.c	Sun Oct  7 19:16:39 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: bcm53xx_board.c,v 1.4 2012/10/03 19:18:40 matt Exp $	*/
+/*	$NetBSD: bcm53xx_board.c,v 1.5 2012/10/07 19:16:39 matt Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -34,7 +34,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: bcm53xx_board.c,v 1.4 2012/10/03 19:18:40 matt Exp $");
+__KERNEL_RCSID(1, "$NetBSD: bcm53xx_board.c,v 1.5 2012/10/07 19:16:39 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -67,6 +67,8 @@ bus_space_handle_t bcm53xx_armcore_bsh;
 static struct cpu_softc cpu_softc;
 static struct bcm53xx_clock_info clk_info;
 
+struct arm32_dma_range bcm53xx_dma_ranges[2];
+
 struct arm32_bus_dma_tag bcm53xx_dma_tag = {
 	_BUS_DMAMAP_FUNCS,
 	_BUS_DMAMEM_FUNCS,
@@ -485,6 +487,26 @@ bcm53xx_bootstrap(vaddr_t iobase)
 	arml2cc_init(bcm53xx_armcore_bst, bcm53xx_armcore_bsh, ARMCORE_L2C_BASE);
 }
 
+void
+bcm53xx_dma_bootstrap(psize_t memsize)
+{
+	if (memsize > 256*1024*1024) {
+		/*
+		 * By setting up two ranges, bus_dmamem_alloc will always
+		 * try to allocate from range 0 first resulting in allocations
+		 * below 256MB which for PCI and GMAC are coherent.
+		 */
+		bcm53xx_dma_ranges[0].dr_sysbase = 0x80000000;
+		bcm53xx_dma_ranges[0].dr_busbase = 0x80000000;
+		bcm53xx_dma_ranges[0].dr_len = 0x10000000;
+		bcm53xx_dma_ranges[1].dr_sysbase = 0x90000000;
+		bcm53xx_dma_ranges[1].dr_busbase = 0x90000000;
+		bcm53xx_dma_ranges[1].dr_len = memsize - 0x10000000;
+		bcm53xx_dma_tag._ranges = bcm53xx_dma_ranges;
+		bcm53xx_dma_tag._nranges = __arraycount(bcm53xx_dma_ranges);
+	}
+}
+
 #ifdef MULTIPROCESSOR
 void
 bcm53xx_cpu_hatch(struct cpu_info *ci)

Index: src/sys/arch/arm/broadcom/bcm53xx_var.h
diff -u src/sys/arch/arm/broadcom/bcm53xx_var.h:1.2 src/sys/arch/arm/broadcom/bcm53xx_var.h:1.3
--- src/sys/arch/arm/broadcom/bcm53xx_var.h:1.2	Wed Oct  3 19:18:41 2012
+++ src/sys/arch/arm/broadcom/bcm53xx_var.h	Sun Oct  7 19:16:39 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: bcm53xx_var.h,v 1.2 2012/10/03 19:18:41 matt Exp $	*/
+/*	$NetBSD: bcm53xx_var.h,v 1.3 2012/10/07 19:16:39 matt Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -106,6 +106,7 @@ bool	bcm53xx_idm_device_init(const struc
 	    bus_space_handle_t);
 void	bcm53xx_device_register(device_t, void *);
 psize_t	bcm53xx_memprobe(void);
+void	bcm53xx_dma_bootstrap(psize_t);
 void	bcm53xx_print_clocks(void);
 void	bcm53xx_rng_start(bus_space_tag_t, bus_space_handle_t);
 void	bcm53xx_srab_init(void);

Reply via email to