Module Name:    src
Committed By:   jmcneill
Date:           Fri Dec 26 19:44:48 UTC 2014

Modified Files:
        src/sys/arch/arm/rockchip: files.rockchip obio.c obio_com.c
            rockchip_dwctwo.c rockchip_reg.h rockchip_var.h
        src/sys/arch/evbarm/rockchip: rockchip_machdep.c
Added Files:
        src/sys/arch/arm/rockchip: rockchip_board.c

Log Message:
Map all of core0 and core1 space and let drivers use bus_space_subregion
instead of bus_space_map. Fill in rockchip_reset.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/rockchip/files.rockchip \
    src/sys/arch/arm/rockchip/obio.c src/sys/arch/arm/rockchip/obio_com.c \
    src/sys/arch/arm/rockchip/rockchip_dwctwo.c \
    src/sys/arch/arm/rockchip/rockchip_reg.h \
    src/sys/arch/arm/rockchip/rockchip_var.h
cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/rockchip/rockchip_board.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/evbarm/rockchip/rockchip_machdep.c

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/rockchip/files.rockchip
diff -u src/sys/arch/arm/rockchip/files.rockchip:1.1 src/sys/arch/arm/rockchip/files.rockchip:1.2
--- src/sys/arch/arm/rockchip/files.rockchip:1.1	Fri Dec 26 16:53:33 2014
+++ src/sys/arch/arm/rockchip/files.rockchip	Fri Dec 26 19:44:48 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: files.rockchip,v 1.1 2014/12/26 16:53:33 jmcneill Exp $
+#	$NetBSD: files.rockchip,v 1.2 2014/12/26 19:44:48 jmcneill Exp $
 #
 # Configuration info for Rockchip ARM Peripherals
 #
@@ -11,6 +11,7 @@ file	arch/arm/arm32/arm32_kvminit.c
 file	arch/arm/arm32/arm32_reboot.c
 file	arch/arm/arm32/irq_dispatch.S
 
+file	arch/arm/rockchip/rockchip_board.c
 file	arch/arm/rockchip/rockchip_space.c	obio
 #file	arch/arm/rockchip/rockchip_a4x_space.c	obio
 file	arch/arm/rockchip/rockchip_dma.c
@@ -25,11 +26,11 @@ file arch/arm/rockchip/obio.c		obio
 attach com at obio with obiouart
 file	arch/arm/rockchip/obio_com.c	obiouart
 
-# SDHC
-#attach	sdhc at obio with rksdhc
-#file	arch/arm/rockchip/rockchip_sdhc.c	rksdhc
+# SD/MMC (Synopsys DesignWare)
+attach	dwcmmc at obio with rkdwcmmc
+file	arch/arm/rockchip/rockchip_dwcmmc.c	rkdwcmmc
 
-# USB OTG (Synopsys DesignWave OTG)
+# USB OTG (Synopsys DesignWare OTG)
 attach  dwctwo at obio with rkdwctwo
 file    arch/arm/rockchip/rockchip_dwctwo.c	rkdwctwo	needs-flag
 
Index: src/sys/arch/arm/rockchip/obio.c
diff -u src/sys/arch/arm/rockchip/obio.c:1.1 src/sys/arch/arm/rockchip/obio.c:1.2
--- src/sys/arch/arm/rockchip/obio.c:1.1	Fri Dec 26 16:53:33 2014
+++ src/sys/arch/arm/rockchip/obio.c	Fri Dec 26 19:44:48 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: obio.c,v 1.1 2014/12/26 16:53:33 jmcneill Exp $	*/
+/*	$NetBSD: obio.c,v 1.2 2014/12/26 19:44:48 jmcneill Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: obio.c,v 1.1 2014/12/26 16:53:33 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: obio.c,v 1.2 2014/12/26 19:44:48 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -100,14 +100,16 @@ int
 obio_print(void *aux, const char *pnp)
 {
 	struct obio_attach_args *obio = aux;
+	bus_addr_t addr = obio->obio_base + obio->obio_offset;
 
-	aprint_normal(": addr 0x%08lx", obio->obio_addr);
-	aprint_normal("-0x%08lx", obio->obio_addr + (obio->obio_size - 1));
+	aprint_normal(": addr 0x%08lx", addr);
+	aprint_normal("-0x%08lx", addr + (obio->obio_size - 1));
 	if (obio->obio_width != OBIOCF_WIDTH_DEFAULT)
 		aprint_normal(" width %d", obio->obio_width);
 	if (obio->obio_intr != OBIOCF_INTR_DEFAULT)
 		aprint_normal(" intr %d", obio->obio_intr);
-	aprint_normal(" mult %d", obio->obio_mult);
+	if (obio->obio_mult != OBIOCF_MULT_DEFAULT)
+		aprint_normal(" mult %d", obio->obio_mult);
 
 	return UNCONF;
 }
@@ -116,21 +118,33 @@ int
 obio_search(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
 {
 	struct obio_attach_args obio;
+	bus_addr_t addr = cf->cf_loc[OBIOCF_ADDR];
 
-	obio.obio_addr = cf->cf_loc[OBIOCF_ADDR];
+	if (addr >= ROCKCHIP_CORE0_BASE &&
+	    addr < ROCKCHIP_CORE0_BASE + ROCKCHIP_CORE0_SIZE) {
+		obio.obio_base = ROCKCHIP_CORE0_BASE;
+		obio.obio_bsh = rockchip_core0_bsh;
+	} else if (addr >= ROCKCHIP_CORE1_BASE &&
+	    addr < ROCKCHIP_CORE1_BASE + ROCKCHIP_CORE1_SIZE) {
+		obio.obio_base = ROCKCHIP_CORE1_BASE;
+		obio.obio_bsh = rockchip_core1_bsh;
+	} else {
+		panic("addr %#llx is not in CORE0 or CORE1 space",
+		    (long long unsigned int)addr);
+	}
+	obio.obio_offset = addr - obio.obio_base;
 	obio.obio_size = cf->cf_loc[OBIOCF_SIZE];
 	obio.obio_width = cf->cf_loc[OBIOCF_WIDTH];
 	obio.obio_intr = cf->cf_loc[OBIOCF_INTR];
 	obio.obio_mult = cf->cf_loc[OBIOCF_MULT];
 	obio.obio_dmat = &rockchip_bus_dma_tag;
 
-
 	switch (cf->cf_loc[OBIOCF_MULT]) {
 	case 1:
-		obio.obio_iot = &rockchip_bs_tag;
+		obio.obio_bst = &rockchip_bs_tag;
 		break;
 	case 4:
-		obio.obio_iot = &rockchip_a4x_bs_tag;
+		obio.obio_bst = &rockchip_a4x_bs_tag;
 		break;
 	default:
 		panic("Unsupported EMIFS multiplier.");
@@ -160,16 +174,14 @@ void obio_iomux(int offset, int new)
 	bus_space_tag_t bt = &rockchip_bs_tag;
 	int old, renew;
 
-	if (bus_space_map(bt, ROCKCHIP_GRF_BASE, ROCKCHIP_GRF_SIZE, 0, &bh))
-		panic("GRF can not be mapped.");
+	bus_space_subregion(bt, rockchip_core1_bsh, ROCKCHIP_GRF_OFFSET,
+	    ROCKCHIP_GRF_SIZE, &bh);
 
 	old = bus_space_read_4(bt, bh, offset);
 	bus_space_write_4(bt, bh, offset, (old | new | 0xffff0000));
 	renew = bus_space_read_4(bt, bh, offset);
 
 	printf("grf iomux: old %08x, new %08x, renew %08x\n", old, new, renew);
-
-	bus_space_unmap(bt, bh, ROCKCHIP_GRF_SIZE);
 }
 
 #define GPIO_SWPORTA_DR_OFFSET	0x00
@@ -177,8 +189,8 @@ void obio_iomux(int offset, int new)
 
 void obio_init_gpio(void)
 {
-	obio_swporta(ROCKCHIP_GPIO0_BASE, GPIO_SWPORTA_DR_OFFSET, __BIT(3));
-	obio_swporta(ROCKCHIP_GPIO0_BASE, GPIO_SWPORTA_DD_OFFSET, __BIT(3));
+	obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(3));
+	obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(3));
 }
 
 void obio_swporta(int gpio_base, int offset, int new)
@@ -188,14 +200,11 @@ void obio_swporta(int gpio_base, int off
 	int old, renew;
 	int gpio_size = 0x100; /* XXX */
 
-	if (bus_space_map(bt, gpio_base, gpio_size, 0, &bh))
-		panic("gpio can not be mapped.");
+	bus_space_subregion(bt, rockchip_core1_bsh, gpio_base, gpio_size, &bh);
 
 	old = bus_space_read_4(bt, bh, offset);
 	bus_space_write_4(bt, bh, offset, old | new);
 	renew = bus_space_read_4(bt, bh, offset);
 
 	printf("gpio: 0x%08x 0x%08x -> 0x%08x\n", gpio_base + offset, old, renew);
-
-	bus_space_unmap(bt, bh, gpio_size);
 }
Index: src/sys/arch/arm/rockchip/obio_com.c
diff -u src/sys/arch/arm/rockchip/obio_com.c:1.1 src/sys/arch/arm/rockchip/obio_com.c:1.2
--- src/sys/arch/arm/rockchip/obio_com.c:1.1	Fri Dec 26 16:53:33 2014
+++ src/sys/arch/arm/rockchip/obio_com.c	Fri Dec 26 19:44:48 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: obio_com.c,v 1.1 2014/12/26 16:53:33 jmcneill Exp $	*/
+/*	$NetBSD: obio_com.c,v 1.2 2014/12/26 19:44:48 jmcneill Exp $	*/
 
 /*	based on omap/obio_com.c	*/
 
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: obio_com.c,v 1.1 2014/12/26 16:53:33 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: obio_com.c,v 1.2 2014/12/26 19:44:48 jmcneill Exp $");
 
 #include "opt_rockchip.h"
 /*#include "opt_com.h"*/
@@ -77,10 +77,24 @@ static int
 obiouart_match(device_t parent, cfdata_t cf, void *aux)
 {
 	struct obio_attach_args *obio = aux;
-	bus_space_handle_t bh;
-	int rv;
-	if (obio->obio_addr == OBIOCF_ADDR_DEFAULT)
+	bus_space_handle_t bsh;
+	bus_addr_t ioaddr;
+
+	switch (obio->obio_base) {
+	case ROCKCHIP_CORE0_BASE:
+		KASSERT(obio->obio_offset == ROCKCHIP_UART0_OFFSET ||
+			obio->obio_offset == ROCKCHIP_UART1_OFFSET);
+		break;
+	case ROCKCHIP_CORE1_BASE:
+		KASSERT(obio->obio_offset == ROCKCHIP_UART2_OFFSET ||
+			obio->obio_offset == ROCKCHIP_UART3_OFFSET);
+		break;
+	default:
 		panic("obiouart must have addr specified in config.");
+	}
+
+	ioaddr = obio->obio_base + obio->obio_offset;
+
 #if 0
 	/*
 	 * XXX this should be ifdefed on a board-dependent switch
@@ -93,18 +107,13 @@ obiouart_match(device_t parent, cfdata_t
 	if (obio->obio_size == OBIOCF_SIZE_DEFAULT)
 		obio->obio_size = ROCKCHIP_UART_SIZE;
 
-	if (com_is_console(obio->obio_iot, obio->obio_addr, NULL))
+	if (com_is_console(obio->obio_bst, ioaddr, NULL))
 		return 1;
 
-	if (bus_space_map(obio->obio_iot, obio->obio_addr, obio->obio_size,
-			  0, &bh))
-		return 1;
-
-	rv = comprobe1(obio->obio_iot, bh);
+	bus_space_subregion(obio->obio_bst, obio->obio_bsh, obio->obio_size, 0,
+	    &bsh);
 
-	bus_space_unmap(obio->obio_iot, bh, obio->obio_size);
-
-	return rv;
+	return comprobe1(obio->obio_bst, bsh);
 }
 
 static void
@@ -113,24 +122,23 @@ obiouart_attach(device_t parent, device_
 	struct com_obio_softc *osc = device_private(self);
 	struct com_softc *sc = &osc->sc_sc;
 	struct obio_attach_args *obio = aux;
-	bus_space_tag_t iot;
-	bus_space_handle_t ioh = 0;
+	bus_space_tag_t bst;
+	bus_space_handle_t bsh = 0;
 	bus_addr_t iobase;
 
-
 	sc->sc_dev = self;
 
-	iot = obio->obio_iot;
-	iobase = obio->obio_addr;
+	bst = obio->obio_bst;
+	iobase = obio->obio_base + obio->obio_offset;
 	sc->sc_frequency = ROCKCHIP_UART_FREQ;
 	sc->sc_type = COM_TYPE_NORMAL;
 
-	if (com_is_console(iot, iobase, &ioh) == 0 &&
-	    bus_space_map(iot, iobase, obio->obio_size, 0, &ioh)) {
+	if (com_is_console(bst, iobase, &bsh) == 0 &&
+	    bus_space_subregion(bst, obio->obio_bsh, obio->obio_size, 0, &bsh)) {
 		panic(": can't map registers\n");
 		return;
 	}
-	COM_INIT_REGS(sc->sc_regs, iot, ioh, iobase);
+	COM_INIT_REGS(sc->sc_regs, bst, bsh, iobase);
 
 	com_attach_subr(sc);
 	aprint_naive("\n");
Index: src/sys/arch/arm/rockchip/rockchip_dwctwo.c
diff -u src/sys/arch/arm/rockchip/rockchip_dwctwo.c:1.1 src/sys/arch/arm/rockchip/rockchip_dwctwo.c:1.2
--- src/sys/arch/arm/rockchip/rockchip_dwctwo.c:1.1	Fri Dec 26 16:53:33 2014
+++ src/sys/arch/arm/rockchip/rockchip_dwctwo.c	Fri Dec 26 19:44:48 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rockchip_dwctwo.c,v 1.1 2014/12/26 16:53:33 jmcneill Exp $	*/
+/*	$NetBSD: rockchip_dwctwo.c,v 1.2 2014/12/26 19:44:48 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rockchip_dwctwo.c,v 1.1 2014/12/26 16:53:33 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rockchip_dwctwo.c,v 1.2 2014/12/26 19:44:48 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -112,21 +112,15 @@ rkdwc2_attach(device_t parent, device_t 
 {
 	struct rkdwc2_softc *sc = device_private(self);
 	struct obio_attach_args *obio = aux;
-	int error;
 
 	sc->sc_dwc2.sc_dev = self;
 
-	sc->sc_dwc2.sc_iot = obio->obio_iot;
+	sc->sc_dwc2.sc_iot = obio->obio_bst;
 	sc->sc_dwc2.sc_bus.dmatag = obio->obio_dmat;
 	sc->sc_dwc2.sc_params = &rkdwc2_params;
 
-	error = bus_space_map(obio->obio_iot, obio->obio_addr, obio->obio_size, 0,
-	    &sc->sc_dwc2.sc_ioh);
-	if (error) {
-		aprint_error_dev(self,
-		    "can't map registers for %s: %d\n", obio->obio_name, error);
-		return;
-	}
+	bus_space_subregion(obio->obio_bst, obio->obio_bsh, obio->obio_offset,
+	    obio->obio_size, &sc->sc_dwc2.sc_ioh);
 
 	aprint_naive(": USB controller\n");
 	aprint_normal(": USB controller\n");
@@ -151,7 +145,6 @@ fail:
 		intr_disestablish(sc->sc_ih);
 		sc->sc_ih = NULL;
 	}
-	bus_space_unmap(sc->sc_dwc2.sc_iot, sc->sc_dwc2.sc_ioh, obio->obio_size);
 }
 
 static void
Index: src/sys/arch/arm/rockchip/rockchip_reg.h
diff -u src/sys/arch/arm/rockchip/rockchip_reg.h:1.1 src/sys/arch/arm/rockchip/rockchip_reg.h:1.2
--- src/sys/arch/arm/rockchip/rockchip_reg.h:1.1	Fri Dec 26 16:53:33 2014
+++ src/sys/arch/arm/rockchip/rockchip_reg.h	Fri Dec 26 19:44:48 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rockchip_reg.h,v 1.1 2014/12/26 16:53:33 jmcneill Exp $ */
+/* $NetBSD: rockchip_reg.h,v 1.2 2014/12/26 19:44:48 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -42,43 +42,46 @@
 #define ROCKCHIP_CORE0_VBASE    0xFEA00000
 #define ROCKCHIP_CORE0_SIZE     0x00300000
 
-#define ROCKCHIP_OTG_BASE	0x10180000
+/* CORE0 */
+#define ROCKCHIP_OTG_OFFSET	0x00180000
 #define ROCKCHIP_OTG_SIZE	0x40000
-#define ROCKCHIP_USB_BASE	0x101C0000
+#define ROCKCHIP_USB_OFFSET	0x001C0000
 #define ROCKCHIP_USB_SIZE	0x40000
-#define ROCKCHIP_UART0_BASE	0x10124000
+#define ROCKCHIP_UART0_OFFSET	0x00124000
 #define ROCKCHIP_UART0_SIZE	0x400
-#define ROCKCHIP_UART1_BASE	0x10126000
+#define ROCKCHIP_UART1_OFFSET	0x00126000
 #define ROCKCHIP_UART1_SIZE	0x400
-#define ROCKCHIP_PL310_BASE     0x10138000
+#define ROCKCHIP_PL310_OFFSET	0x00138000
 #define ROCKCHIP_PL310_SIZE     0x1000
-#define ROCKCHIP_GICC_BASE	0x1013C100
+#define ROCKCHIP_GICC_OFFSET	0x0013C100
 #define ROCKCHIP_GICC_SIZE	0x100
-#define ROCKCHIP_A9TMR_BASE	0x1013C200
+#define ROCKCHIP_A9TMR_OFFSET	0x0013C200
 #define ROCKCHIP_A9TMR_SIZE	0x100
-#define ROCKCHIP_A9WDT_BASE	0x1013C600
+#define ROCKCHIP_A9WDT_OFFSET	0x0013C600
 #define ROCKCHIP_A9WDT_SIZE	0x20
-#define ROCKCHIP_GICD_BASE	0x1013D000
+#define ROCKCHIP_GICD_OFFSET	0x0013D000
 #define ROCKCHIP_GICD_SIZE	0x1000
 
 #define ROCKCHIP_CORE1_BASE     0x20000000
 #define ROCKCHIP_CORE1_VBASE    0xFED00000
 #define ROCKCHIP_CORE1_SIZE     0x00100000
 
-#define ROCKCHIP_GRF_BASE	0x20008000
+/* CORE1 */
+#define ROCKCHIP_CRU_OFFSET	0x00000000
+#define ROCKCHIP_CRU_SIZE	0x4000
+#define ROCKCHIP_GRF_OFFSET	0x00008000
 #define ROCKCHIP_GRF_SIZE	0x2000
-
-#define ROCKCHIP_UART2_BASE	0x20064000
+#define ROCKCHIP_UART2_OFFSET	0x00064000
 #define ROCKCHIP_UART2_SIZE	0x400
-#define ROCKCHIP_UART3_BASE	0x20068000
+#define ROCKCHIP_UART3_OFFSET	0x00068000
 #define ROCKCHIP_UART3_SIZE	0x400
-#define ROCKCHIP_GPIO0_BASE	0x2000A000
+#define ROCKCHIP_GPIO0_OFFSET	0x0000A000
 #define ROCKCHIP_GPIO0_SIZE	0x100
-#define ROCKCHIP_GPIO1_BASE	0x2003C000
+#define ROCKCHIP_GPIO1_OFFSET	0x0003C000
 #define ROCKCHIP_GPIO1_SIZE	0x100
-#define ROCKCHIP_GPIO2_BASE	0x2003E000
+#define ROCKCHIP_GPIO2_OFFSET	0x0003E000
 #define ROCKCHIP_GPIO2_SIZE	0x100
-#define ROCKCHIP_GPIO3_BASE	0x20080000
+#define ROCKCHIP_GPIO3_OFFSET	0x00080000
 #define ROCKCHIP_GPIO3_SIZE	0x100
 
 #endif /* _ARM_ROCKCHIP_ROCKCHIP_REG_H_ */
Index: src/sys/arch/arm/rockchip/rockchip_var.h
diff -u src/sys/arch/arm/rockchip/rockchip_var.h:1.1 src/sys/arch/arm/rockchip/rockchip_var.h:1.2
--- src/sys/arch/arm/rockchip/rockchip_var.h:1.1	Fri Dec 26 16:53:33 2014
+++ src/sys/arch/arm/rockchip/rockchip_var.h	Fri Dec 26 19:44:48 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rockchip_var.h,v 1.1 2014/12/26 16:53:33 jmcneill Exp $ */
+/* $NetBSD: rockchip_var.h,v 1.2 2014/12/26 19:44:48 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -36,8 +36,10 @@
 #include <sys/bus.h>
 
 struct obio_attach_args {
-	bus_space_tag_t	obio_iot;	/* bus space tag */
-	bus_addr_t	obio_addr;	/* address of device */
+	bus_space_tag_t	obio_bst;	/* bus space tag */
+	bus_space_handle_t obio_bsh;	/* bus space handle */
+	bus_addr_t	obio_base;	/* base address of handle */
+	bus_addr_t	obio_offset;	/* address of device */
 	bus_size_t	obio_size;	/* size of device */
 	int		obio_intr;	/* irq */
 	int		obio_width;	/* bus width */
@@ -49,5 +51,9 @@ struct obio_attach_args {
 extern struct bus_space rockchip_bs_tag;
 extern struct bus_space rockchip_a4x_bs_tag;
 extern struct arm32_bus_dma_tag	rockchip_bus_dma_tag;
+extern bus_space_handle_t rockchip_core0_bsh;
+extern bus_space_handle_t rockchip_core1_bsh;
+
+void rockchip_bootstrap(void);
 
 #endif /* _ARM_ROCKCHIP_ROCKCHIP_VAR_H_ */

Index: src/sys/arch/evbarm/rockchip/rockchip_machdep.c
diff -u src/sys/arch/evbarm/rockchip/rockchip_machdep.c:1.1 src/sys/arch/evbarm/rockchip/rockchip_machdep.c:1.2
--- src/sys/arch/evbarm/rockchip/rockchip_machdep.c:1.1	Fri Dec 26 16:53:33 2014
+++ src/sys/arch/evbarm/rockchip/rockchip_machdep.c	Fri Dec 26 19:44:48 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rockchip_machdep.c,v 1.1 2014/12/26 16:53:33 jmcneill Exp $ */
+/*	$NetBSD: rockchip_machdep.c,v 1.2 2014/12/26 19:44:48 jmcneill Exp $ */
 
 /*
  * Machine dependent functions for kernel setup for TI OSK5912 board.
@@ -125,7 +125,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rockchip_machdep.c,v 1.1 2014/12/26 16:53:33 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rockchip_machdep.c,v 1.2 2014/12/26 19:44:48 jmcneill Exp $");
 
 #include "opt_machdep.h"
 #include "opt_ddb.h"
@@ -181,6 +181,7 @@ __KERNEL_RCSID(0, "$NetBSD: rockchip_mac
 #include <dev/ic/ns16550reg.h>
 #include <dev/ic/comreg.h>
 
+#include <arm/rockchip/rockchip_reg.h>
 #include <arm/rockchip/rockchip_var.h>
 
 #ifdef CPU_CORTEXA9
@@ -340,6 +341,9 @@ initarm(void *arg)
 	rockchip_putchar('d');
 #endif
 
+	pmap_devmap_register(devmap);
+	rockchip_bootstrap();
+
 	/* Heads up ... Setup the CPU / MMU / TLB functions. */
 	if (set_cpufuncs())
 		panic("cpu not recognized!");
@@ -348,8 +352,6 @@ curcpu()->ci_data.cpu_cc_freq = 16000000
 
 	init_clocks();
 
-	/* The console is going to try to map things.  Give pmap a devmap. */
-	pmap_devmap_register(devmap);
 	consinit();
 #ifdef CPU_CORTEXA15
 #ifdef MULTIPROCESSOR
@@ -362,8 +364,8 @@ curcpu()->ci_data.cpu_cc_freq = 16000000
          * Probe the PL310 L2CC
          */
 	printf("probe the PL310 L2CC\n");
-        const bus_space_handle_t pl310_bh = ROCKCHIP_PL310_BASE
-            + ROCKCHIP_CORE0_VBASE - ROCKCHIP_CORE0_BASE;
+        const bus_space_handle_t pl310_bh =
+            ROCKCHIP_CORE0_VBASE + ROCKCHIP_PL310_OFFSET;
         arml2cc_init(&rockchip_a4x_bs_tag, pl310_bh, 0);
         rockchip_putchar('l');
 #endif
@@ -520,7 +522,13 @@ consinit(void)
 void
 rockchip_reset(void)
 {
-	/* NOT YET */
+	bus_space_tag_t bst = &rockchip_bs_tag;
+	bus_space_handle_t bsh;
+
+	bus_space_subregion(bst, rockchip_core1_bsh,
+	    ROCKCHIP_CRU_OFFSET, ROCKCHIP_CRU_SIZE, &bsh);
+
+	bus_space_write_4(bst, bsh, 0x100, 0xfdb9);
 }
 
 #ifdef KGDB

Added files:

Index: src/sys/arch/arm/rockchip/rockchip_board.c
diff -u /dev/null src/sys/arch/arm/rockchip/rockchip_board.c:1.1
--- /dev/null	Fri Dec 26 19:44:48 2014
+++ src/sys/arch/arm/rockchip/rockchip_board.c	Fri Dec 26 19:44:48 2014
@@ -0,0 +1,57 @@
+/* $NetBSD: rockchip_board.c,v 1.1 2014/12/26 19:44:48 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2014 Jared D. McNeill <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: rockchip_board.c,v 1.1 2014/12/26 19:44:48 jmcneill Exp $");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/cpu.h>
+#include <sys/device.h>
+
+#include <arm/rockchip/rockchip_reg.h>
+#include <arm/rockchip/rockchip_var.h>
+
+bus_space_handle_t rockchip_core0_bsh;
+bus_space_handle_t rockchip_core1_bsh;
+
+void
+rockchip_bootstrap(void)
+{
+	int error;
+
+	error = bus_space_map(&rockchip_bs_tag, ROCKCHIP_CORE0_BASE,
+	    ROCKCHIP_CORE0_SIZE, 0, &rockchip_core0_bsh);
+	if (error)
+		panic("%s: failed to map CORE0 registers: %d", __func__, error);
+
+	error = bus_space_map(&rockchip_bs_tag, ROCKCHIP_CORE1_BASE,
+	    ROCKCHIP_CORE1_SIZE, 0, &rockchip_core1_bsh);
+	if (error)
+		panic("%s: failed to map CORE1 registers: %d", __func__, error);
+}

Reply via email to