Module Name:    src
Committed By:   skrll
Date:           Sun Aug 19 07:27:33 UTC 2018

Modified Files:
        src/sys/arch/arm/samsung: exynos_platform.c exynos_soc.c exynos_var.h
            files.exynos
        src/sys/arch/evbarm/conf: EXYNOS
        src/sys/arch/evbarm/exynos: exynos_start.S
Added Files:
        src/sys/arch/arm/samsung: exynos4_reg.h

Log Message:
Some changes to bring back exynos4 support and make exynos5 support more
modern/generic

- Provide a exynos_platform_early_putchar based on CONSADDR and remove
  EXYNOS_CONSOLE_EARLY
- Provide devmaps for exynos4 and exynos5
- Simplify exynos_bootstrap
- Update exynos_start.S to use exynos_platform_early_putchar - this
  needs a fix in a9_subr.S for arm_cpuinit to save lr in a callee save
  register and not use ip.  Maybe this change is safe now, but too much
  testing required to commit it now.


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.15 src/sys/arch/arm/samsung/exynos4_reg.h
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/samsung/exynos_platform.c
cvs rdiff -u -r1.34 -r1.35 src/sys/arch/arm/samsung/exynos_soc.c
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/arm/samsung/exynos_var.h
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/arm/samsung/files.exynos
cvs rdiff -u -r1.31 -r1.32 src/sys/arch/evbarm/conf/EXYNOS
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/evbarm/exynos/exynos_start.S

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/samsung/exynos_platform.c
diff -u src/sys/arch/arm/samsung/exynos_platform.c:1.12 src/sys/arch/arm/samsung/exynos_platform.c:1.13
--- src/sys/arch/arm/samsung/exynos_platform.c:1.12	Sun Aug  5 14:02:35 2018
+++ src/sys/arch/arm/samsung/exynos_platform.c	Sun Aug 19 07:27:33 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: exynos_platform.c,v 1.12 2018/08/05 14:02:35 skrll Exp $ */
+/* $NetBSD: exynos_platform.c,v 1.13 2018/08/19 07:27:33 skrll Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared D. McNeill <jmcne...@invisible.ca>
@@ -34,7 +34,7 @@
 #include "ukbd.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: exynos_platform.c,v 1.12 2018/08/05 14:02:35 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exynos_platform.c,v 1.13 2018/08/19 07:27:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -52,28 +52,15 @@ __KERNEL_RCSID(0, "$NetBSD: exynos_platf
 #include <arm/samsung/exynos_reg.h>
 #include <arm/samsung/exynos_var.h>
 #include <arm/samsung/mct_var.h>
+#include <arm/samsung/sscom_reg.h>
 
 #include <evbarm/exynos/platform.h>
 
 #include <arm/fdt/arm_fdtvar.h>
 
-#define	EXYNOS5_SWRESET_REG	0x10040400
+void exynos_platform_early_putchar(char);
 
-static const struct pmap_devmap *
-exynos_platform_devmap(void)
-{
-	static const struct pmap_devmap devmap[] = {
-		DEVMAP_ENTRY(EXYNOS_CORE_VBASE,
-			     EXYNOS_CORE_PBASE,
-			     EXYNOS5_CORE_SIZE),
-		DEVMAP_ENTRY(EXYNOS5_AUDIOCORE_VBASE,
-			     EXYNOS5_AUDIOCORE_PBASE,
-			     EXYNOS5_AUDIOCORE_SIZE),
-		DEVMAP_ENTRY_END
-	};
-
-	return devmap;
-}
+#define	EXYNOS5_SWRESET_REG	0x10040400
 
 #define EXYNOS_IOPHYSTOVIRT(a) \
     ((vaddr_t)(((a) - EXYNOS_CORE_PBASE) + EXYNOS_CORE_VBASE))
@@ -81,8 +68,8 @@ exynos_platform_devmap(void)
 static void
 exynos_platform_bootstrap(void)
 {
-	paddr_t uart_address = armreg_tpidruro_read();	/* XXX */
-	exynos_bootstrap(EXYNOS_CORE_VBASE, EXYNOS_IOPHYSTOVIRT(uart_address));
+
+	exynos_bootstrap(EXYNOS_CORE_VBASE);
 }
 
 static void
@@ -97,13 +84,21 @@ exynos_platform_init_attach_args(struct 
 	faa->faa_dmat = &arm_generic_dma_tag;
 }
 
-static void
+
+void
 exynos_platform_early_putchar(char c)
 {
-#if defined(VERBOSE_INIT_ARM)
-	extern void exynos_putchar(int);	/* XXX from exynos_start.S */
+#ifdef CONSADDR
+#define CONSADDR_VA	(CONSADDR - EXYNOS_CORE_PBASE + EXYNOS_CORE_VBASE)
 
-	exynos_putchar(c);
+	volatile uint32_t *uartaddr = cpu_earlydevice_va_p() ?
+	    (volatile uint32_t *)CONSADDR_VA :
+	    (volatile uint32_t *)CONSADDR;
+	    
+	while ((uartaddr[SSCOM_UFSTAT / 4] & UFSTAT_TXFULL) != 0)
+		;
+
+	uartaddr[SSCOM_UTXH / 4] = c;
 #endif
 }
 
@@ -129,8 +124,58 @@ exynos_platform_uart_freq(void)
 	return EXYNOS_UART_FREQ;
 }
 
+
+#if defined(SOC_EXYNOS4)
+static const struct pmap_devmap *
+exynos4_platform_devmap(void)
+{
+	static const struct pmap_devmap devmap[] = {
+		DEVMAP_ENTRY(EXYNOS_CORE_VBASE,
+			     EXYNOS_CORE_PBASE,
+			     EXYNOS4_CORE_SIZE),
+		DEVMAP_ENTRY(EXYNOS4_AUDIOCORE_VBASE,
+			     EXYNOS4_AUDIOCORE_PBASE,
+			     EXYNOS4_AUDIOCORE_SIZE),
+		DEVMAP_ENTRY_END
+	};
+
+	return devmap;
+}
+
+static const struct arm_platform exynos4_platform = {
+	.ap_devmap = exynos4_platform_devmap,
+	.ap_bootstrap = exynos_platform_bootstrap,
+	.ap_init_attach_args = exynos_platform_init_attach_args,
+	.ap_early_putchar = exynos_platform_early_putchar,
+	.ap_device_register = exynos_platform_device_register,
+	.ap_reset = exynos5_platform_reset,
+	.ap_delay = mct_delay,
+	.ap_uart_freq = exynos_platform_uart_freq,
+};
+
+ARM_PLATFORM(exynos4, "samsung,exynos4", &exynos4_platform);
+#endif
+
+
+#if defined(SOC_EXYNOS5)
+static const struct pmap_devmap *
+exynos5_platform_devmap(void)
+{
+	static const struct pmap_devmap devmap[] = {
+		DEVMAP_ENTRY(EXYNOS_CORE_VBASE,
+			     EXYNOS_CORE_PBASE,
+			     EXYNOS5_CORE_SIZE),
+		DEVMAP_ENTRY(EXYNOS5_AUDIOCORE_VBASE,
+			     EXYNOS5_AUDIOCORE_PBASE,
+			     EXYNOS5_AUDIOCORE_SIZE),
+		DEVMAP_ENTRY_END
+	};
+
+	return devmap;
+}
+
 static const struct arm_platform exynos5_platform = {
-	.ap_devmap = exynos_platform_devmap,
+	.ap_devmap = exynos5_platform_devmap,
 	.ap_bootstrap = exynos_platform_bootstrap,
 	.ap_init_attach_args = exynos_platform_init_attach_args,
 	.ap_early_putchar = exynos_platform_early_putchar,
@@ -141,3 +186,4 @@ static const struct arm_platform exynos5
 };
 
 ARM_PLATFORM(exynos5, "samsung,exynos5", &exynos5_platform);
+#endif

Index: src/sys/arch/arm/samsung/exynos_soc.c
diff -u src/sys/arch/arm/samsung/exynos_soc.c:1.34 src/sys/arch/arm/samsung/exynos_soc.c:1.35
--- src/sys/arch/arm/samsung/exynos_soc.c:1.34	Tue Jul 31 06:46:25 2018
+++ src/sys/arch/arm/samsung/exynos_soc.c	Sun Aug 19 07:27:33 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: exynos_soc.c,v 1.34 2018/07/31 06:46:25 skrll Exp $	*/
+/*	$NetBSD: exynos_soc.c,v 1.35 2018/08/19 07:27:33 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
 #include "opt_exynos.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: exynos_soc.c,v 1.34 2018/07/31 06:46:25 skrll Exp $");
+__KERNEL_RCSID(1, "$NetBSD: exynos_soc.c,v 1.35 2018/08/19 07:27:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -76,6 +76,8 @@ struct cpu_freq {
 
 
 #ifdef SOC_EXYNOS4
+int exynos4_l2cc_init(void);
+
 const struct cpu_freq cpu_freq_settings_exynos4[] = {
 	{ 200, 3, 100, 2},
 	{ 300, 4, 200, 2},
@@ -473,7 +475,7 @@ exynos_clocks_bootstrap(void)
 
 
 void
-exynos_bootstrap(vaddr_t iobase, vaddr_t uartbase)
+exynos_bootstrap(vaddr_t iobase)
 {
 	int error;
 	size_t core_size, audiocore_size;
@@ -484,13 +486,6 @@ exynos_bootstrap(vaddr_t iobase, vaddr_t
 	bus_addr_t exynos_sysreg_offset;
 	bus_addr_t exynos_cmu_apll_offset;
 
-	/* set up early console so we can use printf() and friends */
-#ifdef EXYNOS_CONSOLE_EARLY
-	uart_base = (volatile uint8_t *) uartbase;
-	cn_tab = &exynos_earlycons;
-	printf("Exynos early console operational\n\n");
-#endif
-
 #ifdef SOC_EXYNOS4
 	core_size = EXYNOS4_CORE_SIZE;
 	audiocore_size = EXYNOS4_AUDIOCORE_SIZE;

Index: src/sys/arch/arm/samsung/exynos_var.h
diff -u src/sys/arch/arm/samsung/exynos_var.h:1.24 src/sys/arch/arm/samsung/exynos_var.h:1.25
--- src/sys/arch/arm/samsung/exynos_var.h:1.24	Mon Jul  2 23:54:52 2018
+++ src/sys/arch/arm/samsung/exynos_var.h	Sun Aug 19 07:27:33 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: exynos_var.h,v 1.24 2018/07/02 23:54:52 jmcneill Exp $	*/
+/*	$NetBSD: exynos_var.h,v 1.25 2018/08/19 07:27:33 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2013, 2014 The NetBSD Foundation, Inc.
@@ -143,7 +143,7 @@ extern bus_space_handle_t exynos_pmu_bsh
 extern bus_space_handle_t exynos_cmu_bsh;
 extern bus_space_handle_t exynos_sysreg_bsh;
 
-extern void exynos_bootstrap(vaddr_t, vaddr_t);
+extern void exynos_bootstrap(vaddr_t);
 extern void exynos_dma_bootstrap(psize_t memsize);
 
 struct exynos_pinctrl_softc;

Index: src/sys/arch/arm/samsung/files.exynos
diff -u src/sys/arch/arm/samsung/files.exynos:1.30 src/sys/arch/arm/samsung/files.exynos:1.31
--- src/sys/arch/arm/samsung/files.exynos:1.30	Thu Jul  5 13:11:58 2018
+++ src/sys/arch/arm/samsung/files.exynos	Sun Aug 19 07:27:33 2018
@@ -1,4 +1,4 @@
-#	$NetBSD: files.exynos,v 1.30 2018/07/05 13:11:58 jmcneill Exp $
+#	$NetBSD: files.exynos,v 1.31 2018/08/19 07:27:33 skrll Exp $
 #
 # Configuration info for Samsung Exynos SoC ARM Peripherals
 #
@@ -27,7 +27,6 @@ defparam opt_exynos.h				CONMODE
 # Memory size in megabytes
 defparam opt_exynos.h				MEMSIZE
 defparam opt_exynos.h				EXYNOS_WDT_DEFAULT_PERIOD
-defflag opt_exynos.h				EXYNOS_CONSOLE_EARLY
 
 #
 defflag opt_exynos.h				SOC_EXYNOS4: CPU_CORTEXA9
@@ -43,7 +42,7 @@ defflag opt_exynos.h				SOC_EXYNOS5420: 
 defflag opt_exynos.h				SOC_EXYNOS5440: SOC_EXYNOS5
 defflag opt_exynos.h				SOC_EXYNOS5422: SOC_EXYNOS5
 
-file	arch/arm/samsung/exynos_platform.c	soc_exynos5
+file	arch/arm/samsung/exynos_platform.c
 
 # Interrupt combiner
 device  exyointr
@@ -58,12 +57,12 @@ file    arch/arm/samsung/exynos_rtc.c		e
 # Multi Core timer
 device	mct
 attach	mct at fdt with exyo_mct
-file	arch/arm/samsung/mct.c		exyo_mct
+file	arch/arm/samsung/mct.c			exyo_mct
 
 # Watchdog
 device	exyowdt : sysmon_wdog
 attach	exyowdt at fdt with exynos_wdt
-file	arch/arm/samsung/exynos_wdt.c	exynos_wdt needs-flag
+file	arch/arm/samsung/exynos_wdt.c		exynos_wdt needs-flag
 
 # UARTs
 device	exuart

Index: src/sys/arch/evbarm/conf/EXYNOS
diff -u src/sys/arch/evbarm/conf/EXYNOS:1.31 src/sys/arch/evbarm/conf/EXYNOS:1.32
--- src/sys/arch/evbarm/conf/EXYNOS:1.31	Sat Jul 14 15:09:41 2018
+++ src/sys/arch/evbarm/conf/EXYNOS	Sun Aug 19 07:27:33 2018
@@ -1,5 +1,5 @@
 #
-#	$NetBSD: EXYNOS,v 1.31 2018/07/14 15:09:41 maxv Exp $
+#	$NetBSD: EXYNOS,v 1.32 2018/08/19 07:27:33 skrll Exp $
 #
 #	Samsung Exynos SoC kernel
 #
@@ -27,6 +27,10 @@ pseudo-device 	openfirm	# /dev/openfirm
 #options 	LOCKDEBUG
 #options 	PMAP_DEBUG	# Enable pmap_debug_level code
 #options 	VERBOSE_INIT_ARM # verbose bootstrapping messages
+# CONSADDR is required for early init messages from VERBOSE_INIT_ARM.
+
+# ODROID-XU lite
+#options 	EARLYCONS=exynos, CONSADDR=0x12c20000
 
 makeoptions	DEBUG="-g"	# compile full symbol table
 makeoptions	COPY_SYMTAB=1

Index: src/sys/arch/evbarm/exynos/exynos_start.S
diff -u src/sys/arch/evbarm/exynos/exynos_start.S:1.6 src/sys/arch/evbarm/exynos/exynos_start.S:1.7
--- src/sys/arch/evbarm/exynos/exynos_start.S:1.6	Thu Jul  5 13:11:58 2018
+++ src/sys/arch/evbarm/exynos/exynos_start.S	Sun Aug 19 07:27:33 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: exynos_start.S,v 1.6 2018/07/05 13:11:58 jmcneill Exp $	*/
+/*	$NetBSD: exynos_start.S,v 1.7 2018/08/19 07:27:33 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -36,6 +36,7 @@
 #include "opt_arm_debug.h"
 #include "opt_fdt.h"
 
+#include <sys/cdefs.h>
 #include <arm/asm.h>
 #include <arm/armreg.h>
 #include "assym.h"
@@ -45,16 +46,34 @@
 
 #include <evbarm/exynos/platform.h>
 
-RCSID("$NetBSD: exynos_start.S,v 1.6 2018/07/05 13:11:58 jmcneill Exp $")
+RCSID("$NetBSD: exynos_start.S,v 1.7 2018/08/19 07:27:33 skrll Exp $")
 
-#define XPUTC(n)
-#define XPUTC2(n)
+#if defined(KERNEL_BASES_EQUAL)
+#define CALL(f)		bl	_C_LABEL(f)
+#else
+#define	CALL(f)	\
+	movw	fp, #:lower16:_C_LABEL(f); \
+	movt	fp, #:upper16:_C_LABEL(f); \
+	sub	fp, fp, #KERNEL_BASE_VOFFSET; \
+	blx	fp
+#endif
+
+#define	PLATFORM_EARLY_PUTCHAR	___CONCAT(EARLYCONS, _platform_early_putchar)
+
+#if defined(VERBOSE_INIT_ARM) && defined(EARLYCONS)
+#define	XPUTC(n)	mov r0, n; CALL(PLATFORM_EARLY_PUTCHAR)
+#define	XPUTC2(n)	mov r0, n; bl _C_LABEL(PLATFORM_EARLY_PUTCHAR);
+#else
+#define	XPUTC(n)
+#define	XPUTC2(n)
+#endif
 
 #define INIT_MEMSIZE	128
 
 #define	TEMP_L1_TABLE	(KERNEL_BASE - KERNEL_BASE_VOFFSET + INIT_MEMSIZE * L1_S_SIZE - L1_TABLE_SIZE)
 
 #define	MD_CPU_HATCH	_C_LABEL(arm_fdt_cpu_hatch)
+#define TMPSTKSIZE	8192
 
 /*
  * Kernel start routine for Exynos 5422 boards running on uboot firmware
@@ -73,6 +92,11 @@ _C_LABEL(exynos_start):
 	setend	be			/* force big endian */
 #endif
 
+	ldr	r10, =KERNEL_BASE_VOFFSET
+	ldr	r9, =tmpstk
+	add	r9, #TMPSTKSIZE
+	sub	sp, r9, r10
+
 	/*
 	 * Save any arguments passed to us.  If .start is not at
 	 * 0x80000000 but .text is, we can't directly use the address that
@@ -84,22 +108,41 @@ _C_LABEL(exynos_start):
 	sub	r4, r4, #KERNEL_BASE_VOFFSET
 	stmia	r4, {r0-r3}			// Save the arguments
 
+	mov	r4, r0
+	mov	r5, r1
+	mov	r6, r2
+	mov	r7, r3
+
+	XPUTC(#'e')
+	XPUTC(#'x')
+	XPUTC(#'y')
+	XPUTC(#'n')
+	XPUTC(#'o')
+	XPUTC(#'s')
+
 #ifdef FDT
 	/*
 	 * ARM boot protocol has FDT address in r2
 	 */
+	XPUTC(#',')
+	XPUTC(#'f')
+	XPUTC(#'d')
+	XPUTC(#'t')
+
 	movw	r4, #:lower16:fdt_addr_r
 	movt	r4, #:upper16:fdt_addr_r
 	sub	r4, r4, #KERNEL_BASE_VOFFSET
-	str	r2, [r4]
+	str	r6, [r4]
 #endif
 
+	XPUTC(#':')
+
 	/* Add DTB PA (1MB) from r2 to MMU init table */
 	movw	r3, #:lower16:(L1_S_SIZE - 1)		/* align DTB PA to 1M */
 	movt	r3, #:upper16:(L1_S_SIZE - 1)
-	bic	r0, r2, r3
+	bic	r0, r6, r3
 	orr	r0, r0, #1				/* 1MB mapping */
-	bic	r1, r2, r3
+	bic	r1, r6, r3
 	movw	r3, #:lower16:(L1_S_PROTO_armv7|L1_S_APv7_KRW|L1_S_CACHEABLE)
 	movt	r3, #:upper16:(L1_S_PROTO_armv7|L1_S_APv7_KRW|L1_S_CACHEABLE)
 	orr	r1, r1, r3
@@ -157,6 +200,8 @@ _C_LABEL(exynos_start):
 	.pushsection .text, "ax", %progbits
 1:
 #endif
+
+exynos_startva:
 	XPUTC2(#'Z')
 
 	XPUTC2(#13)
@@ -197,6 +242,7 @@ mmu_init_table:
 		EXYNOS_CORE_SIZE / L1_S_SIZE,
 		L1_S_PROTO_armv7 | L1_S_APv7_KRW | L1_S_V6_XN)
 
+#if 0
 	/* Map EXYNOS AUDIOBASE */
 	MMU_INIT(EXYNOS5_AUDIOCORE_VBASE, EXYNOS5_AUDIOCORE_VBASE,
 	        EXYNOS5_AUDIOCORE_SIZE / L1_S_SIZE,
@@ -216,6 +262,7 @@ mmu_init_table:
 	MMU_INIT(EXYNOS5_SYSRAM_PBASE, EXYNOS5_SYSRAM_PBASE,
 	        EXYNOS5_SYSRAM_SIZE / L1_S_SIZE,
 		L1_S_PROTO_armv7 | L1_S_APv7_KRW | L1_S_V6_XN)
+#endif
 
 	/* Map DTB location in SDRAM, patched in later */
 .Lmmu_init_table_dtb:
@@ -226,3 +273,12 @@ mmu_init_table:
 	MMU_INIT(0, 0, 0, 0)
 
 END(exynos_start)
+
+	.bss
+#ifdef __ARM_EABI__
+	.align	3
+#endif
+
+tmpstk:
+	.space	TMPSTKSIZE
+

Added files:

Index: src/sys/arch/arm/samsung/exynos4_reg.h
diff -u /dev/null src/sys/arch/arm/samsung/exynos4_reg.h:1.15
--- /dev/null	Sun Aug 19 07:27:33 2018
+++ src/sys/arch/arm/samsung/exynos4_reg.h	Sun Aug 19 07:27:33 2018
@@ -0,0 +1,300 @@
+/*	$NetBSD: exynos4_reg.h,v 1.15 2018/08/19 07:27:33 skrll Exp $	*/
+
+/*-
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Reinoud Zandijk.
+ *
+ * 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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.
+ */
+
+#ifndef _ARM_SAMSUNG_EXYNOS4_REG_H_
+#define _ARM_SAMSUNG_EXYNOS4_REG_H_
+
+/*
+ * Physical memory layout of Exynos SoCs as per documentation
+ *
+ * Base Address Limit Address  Size  Description
+ * 0x00000000   0x00010000    64 KB  iROM
+ * 0x02000000   0x02010000    64 KB  iROM (mirror of 0x0 to 0x10000)
+ * 0x02020000   0x02060000   256 KB  iRAM
+ * 0x03000000   0x03020000   128 KB  Data memory or general purpose of Samsung
+ *                                   Reconfigurable Processor SRP.
+ * 0x03020000   0x03030000    64 KB  I-cache or general purpose of SRP.
+ * 0x03030000   0x03039000    36 KB  Configuration memory (write only) of SRP
+ * 0x03810000   0x03830000      ­    AudioSS's SFR region
+ * 0x04000000   0x05000000    16 MB  Bank0 of Static ROM Controller (SMC)
+ *                                   (16-bit only)
+ * 0x05000000   0x06000000    16 MB  Bank1 of SMC
+ * 0x06000000   0x07000000    16 MB  Bank2 of SMC
+ * 0x07000000   0x08000000    16 MB  Bank3 of SMC
+ * 0x08000000   0x0C000000    64 MB  Reserved
+ * 0x0C000000   0x0CD00000       ­   Reserved
+ * 0x0CE00000   0x0D000000       ­   SFR region of Nand Flash Contr. (NFCON)
+ * 0x10000000   0x14000000       ­   SFR region
+ * 0x40000000   0xA0000000   1.5 GB  Memory of Dynamic Memory Contr. (DMC)-0
+ * 0xA0000000   0x00000000   1.5 GB  Memory of DMC-1
+*/
+
+/*
+ *
+ * The exynos can boot from its iROM or from an external Nand memory. Since
+ * these are normally hardly used they are excluded from the normal register
+ * space here.
+ *
+ * XXX What about the audio subsystem region. Where are the docs?
+ *
+ * EXYNOS_CORE_PBASE points to the main SFR region.
+ *
+ * Notes:
+ *
+ * SFR		Special Function Register
+ * ISP		In-System Programming, like a JTAG
+ * ACP		Accelerator Coherency Port
+ * SSS		Security Sub System
+ * GIC		Generic Interurrupt Controller
+ * PMU		Power Management Unit
+ * DMC		2D Graphics engine
+ * LEFTBUS	Data bus / Peripheral bus
+ * RIGHTBUS	,,
+ * G3D		3D Graphics engine
+ * MFC		Multi-Format Codec
+ * LCD0		LCD display
+ * MCT		Multi Core Timer
+ * CMU		Clock Management Unit
+ * TMU		Thermal Management Unit
+ * PPMU		Pin Parametric Measurement Unit (?)
+ * MMU		Memory Management Unit
+ * MCTimer	?
+ * WDT		Watch Dog Timer
+ * RTC		Real Time Clock
+ * KEYIF	Keypad interface
+ * SECKEY	?
+ * TZPC		TrustZone Protection Controller
+ * UART		Universal asynchronous receiver/transmitter
+ * I2C		Inter IC Connect
+ * SPI		Serial Peripheral Interface Bus
+ * I2S		Inter-IC Sound, Integrated Interchip Sound, or IIS
+ * PCM		Pulse-code modulation, audio stream at set fixed rate
+ * SPDIF	Sony/Philips Digital Interface Format
+ * Slimbus	Serial Low-power Inter-chip Media Bus
+ * SMMU		System mmu. No idea as how its programmed (or not)
+ * PERI-L	UART, I2C, SPI, I2S, PCM, SPDIF, PWM, I2CHDMI, Slimbus
+ * PERI-R	CHIPID, SYSREG, PMU/CMU/TMU Bus I/F, MCTimer, WDT, RTC, KEYIF,
+ * 		SECKEY, TZPC
+ */
+
+/*
+ * Note that this table is not 80-char friendly, this is done to allow more
+ * elaborate comments to clarify the register offsets use
+ */
+
+/* CORE */
+#define EXYNOS4_CORE_SIZE			0x04000000
+#define EXYNOS4_SDRAM_PBASE			0x40000000
+
+#define EXYNOS4_SYSREG_OFFSET			0x00010000
+#define EXYNOS4_PMU_OFFSET			0x00020000	/* Power Management Unit */
+#define EXYNOS4_CMU_TOP_PART_OFFSET		0x00030000	/* Clock(s) management unit */
+#define   EXYNOS4_CMU_EPLL			0x0003C010	/* Audio and ext. interf. clock */
+#define   EXYNOS4_CMU_VPLL			0x0003C020	/* Video core (dither?) clock */
+#define EXYNOS4_CMU_CORE_ISP_PART_OFFSET	0x00040000	/* Clock(s) management unit */
+#define   EXYNOS4_CMU_MPLL			0x00040008	/* MEM cntr. clock */
+#define   EXYNOS4_CMU_APLL			0x00044000	/* ARM core clock */
+#define EXYNOS4_MCT_OFFSET			0x00050000	/* Multi Core Timer */
+#define EXYNOS4_WDT_OFFSET			0x00060000	/* Watch Dog Timer */
+#define EXYNOS4_RTC_OFFSET			0x00070000	/* Real Time Clock */
+#define EXYNOS4_KEYIF_OFFSET			0x000A0000	/* Keypad interface */
+#define EXYNOS4_HDMI_CEC_OFFSET			0x000B0000	/* HDMI Consumer Electronic Control */
+#define EXYNOS4_TMU_OFFSET			0x000C0000	/* Thermal Managment */
+#define EXYNOS4_SECKEY_OFFSET			0x00100000	/* XXX unknown XXX */
+#define EXYNOS4_TZPC0_OFFSET			0x00110000	/* ARM Trusted Zone Protection Controller */
+#define EXYNOS4_TZPC1_OFFSET			0x00120000
+#define EXYNOS4_TZPC2_OFFSET			0x00130000
+#define EXYNOS4_TZPC3_OFFSET			0x00140000
+#define EXYNOS4_TZPC4_OFFSET			0x00150000
+#define EXYNOS4_TZPC5_OFFSET			0x00160000
+#define EXYNOS4_INTCOMBINER_OFFSET		0x00440000	/* combines first 32 interrupt sources */
+#define EXYNOS4_GIC_CNTR_OFFSET			0x00480000	/* generic interrupt controller offset */
+#define EXYNOS4_GIC_DISTRIBUTOR_OFFSET		0x00490000
+#define EXYNOS4_AP_C2C_OFFSET			0x00540000	/* Chip 2 Chip XXX doc? XXX */
+#define EXYNOS4_CP_C2C_MODEM_OFFSET		0x00580000
+#define EXYNOS4_DMC0_OFFSET			0x00600000	/* Dynamic Memory Controller */
+#define EXYNOS4_DMC1_OFFSET			0x00610000
+#define EXYNOS4_PPMU_DMC_L_OFFSET		0x006A0000	/* event counters XXX ? */
+#define EXYNOS4_PPMU_DMC_R_OFFSET		0x006B0000
+#define EXYNOS4_PPMU_CPU_OFFSET			0x006C0000
+#define EXYNOS4_GPIO_C2C_OFFSET			0x006E0000
+#define EXYNOS4_TZASC_LR_OFFSET			0x00700000	/* trust zone access control */
+#define EXYNOS4_TZASC_LW_OFFSET			0x00710000
+#define EXYNOS4_TZASC_RR_OFFSET			0x00720000
+#define EXYNOS4_TZASC_RW_OFFSET			0x00730000
+#define EXYNOS4_G2D_ACP_OFFSET			0x00800000	/* 2D graphics engine */
+#define EXYNOS4_SSS_OFFSET			0x00830000	/* Security Sub System */
+#define EXYNOS4_CORESIGHT_1_OFFSET		0x00880000	/* 1st region */
+#define EXYNOS4_CORESIGHT_2_OFFSET		0x00890000	/* 2nd region */
+#define EXYNOS4_CORESIGHT_3_OFFSET		0x008B0000	/* 3rd region */
+#define EXYNOS4_SMMUG2D_ACP_OFFSET		0x00A40000	/* system mmu for 2D graphics engine */
+#define EXYNOS4_SMMUSSS_OFFSET			0x00A50000	/* system mmu for SSS */
+#define EXYNOS4_GPIO_RIGHT_OFFSET		0x01000000
+#define EXYNOS4_GPIO_LEFT_OFFSET		0x01400000
+#define EXYNOS4_FIMC0_OFFSET			0x01800000	/* image for display */
+#define EXYNOS4_FIMC1_OFFSET			0x01810000
+#define EXYNOS4_FIMC2_OFFSET			0x01820000
+#define EXYNOS4_FIMC3_OFFSET			0x01830000
+#define EXYNOS4_JPEG_OFFSET			0x01840000	/* JPEG Codec */
+#define EXYNOS4_MIPI_CSI0_OFFSET		0x01880000	/* MIPI-Slim bus Interface */
+#define EXYNOS4_MIPI_CSI1_OFFSET		0x01890000
+#define EXYNOS4_SMMUFIMC0_OFFSET		0x01A20000	/* system mmus */
+#define EXYNOS4_SMMUFIMC1_OFFSET		0x01A30000
+#define EXYNOS4_SMMUFIMC2_OFFSET		0x01A40000
+#define EXYNOS4_SMMUFIMC3_OFFSET		0x01A50000
+#define EXYNOS4_SMMUJPEG_OFFSET			0x01A60000
+#define EXYNOS4_FIMD0_OFFSET			0x01C00000	/* LCD0 */
+#define EXYNOS4_MIPI_DSI0_OFFSET		0x01C80000	/* LCD0 */
+#define EXYNOS4_SMMUFIMD0_OFFSET		0x01E20000	/* system mmus */
+#define EXYNOS4_FIMC_ISP_OFFSET			0x02000000	/* (digital) camera video input */
+#define EXYNOS4_FIMC_DRC_TOP_OFFSET		0x02010000
+#define EXYNOS4_FIMC_FD_TOP_OFFSET		0x02040000
+#define EXYNOS4_MPWM_ISP_OFFSET			0x02110000	/* (specialised?) PWM */
+#define EXYNOS4_I2C0_ISP_OFFSET			0x02130000	/* I2C bus */
+#define EXYNOS4_I2C1_ISP_OFFSET			0x02140000
+#define EXYNOS4_MTCADC_ISP_OFFSET		0x02150000	/* (specialised?) AD Converter */
+#define EXYNOS4_PWM_ISP_OFFSET			0x02160000	/* PWM */
+#define EXYNOS4_WDT_ISP_OFFSET			0x02170000	/* Watch Dog Timer */
+#define EXYNOS4_MCUCTL_ISP_OFFSET		0x02180000	/* XXX unknown XXX */
+#define EXYNOS4_UART_ISP_OFFSET			0x02190000	/* uart base clock */
+#define EXYNOS4_SPI0_ISP_OFFSET			0x021A0000
+#define EXYNOS4_SPI1_ISP_OFFSET			0x021B0000
+#define EXYNOS4_GIC_C_ISP_OFFSET		0x021E0000
+#define EXYNOS4_GIC_D_ISP_OFFSET		0x021F0000
+#define EXYNOS4_SYSMMU_FIMC_ISP_OFFSET		0x02260000
+#define EXYNOS4_SYSMMU_FIMC_DRC_OFFSET		0x02270000
+#define EXYNOS4_SYSMMU_FIMC_FD_OFFSET		0x022A0000
+#define EXYNOS4_SYSMMU_ISPCPU_OFFSET		0x022B0000
+#define EXYNOS4_FIMC_LITE0_OFFSET		0x02390000	/* external image input? */
+#define EXYNOS4_FIMC_LITE1_OFFSET		0x023A0000
+#define EXYNOS4_SYSMMU_FIMC_LITE0_OFFSET	0x023B0000
+#define EXYNOS4_SYSMMU_FIMC_LITE1_OFFSET	0x023C0000
+#define EXYNOS4_USBDEV0_OFFSET			0x02480000	/* XXX unknown XXX */
+#define EXYNOS4_USBDEV0_1_OFFSET		0x02480000
+#define EXYNOS4_USBDEV0_2_OFFSET		0x02490000
+#define EXYNOS4_USBDEV0_3_OFFSET		0x024A0000
+#define EXYNOS4_USBDEV0_4_OFFSET		0x024B0000
+#define EXYNOS4_TSI_OFFSET			0x02500000	/* Transport Stream Interface */
+#define EXYNOS4_SDMMC0_OFFSET			0x02510000	/* SD card interface */
+#define EXYNOS4_SDMMC1_OFFSET			0x02520000
+#define EXYNOS4_SDMMC2_OFFSET			0x02530000
+#define EXYNOS4_SDMMC3_OFFSET			0x02540000
+#define EXYNOS4_SDMMC4_OFFSET			0x02550000
+#define EXYNOS4_MIPI_HSI_OFFSET			0x02560000	/* LCD0 */
+#define EXYNOS4_SROMC_OFFSET			0x02570000
+
+#define EXYNOS4_USB2HOST_OFFSET			0x02580000
+#define EXYNOS4_USB2_HOST_EHCI_OFFSET		0x02580000
+#define EXYNOS4_USB2_HOST_OHCI_OFFSET		0x02590000
+#define EXYNOS4_USB2_HOST_PHYCTRL_OFFSET	0x025B0000
+#define EXYNOS4_USBOTG1_OFFSET			0x025B0000	/* USB On The Go interface */
+
+#define EXYNOS4_PDMA0_OFFSET			0x02680000	/* Peripheral DMA */
+#define EXYNOS4_PDMA1_OFFSET			0x02690000
+#define EXYNOS4_GADC_OFFSET			0x026C0000	/* General AD Converter */
+#define EXYNOS4_ROTATOR_OFFSET			0x02810000	/* Image rotator for video output */
+#define EXYNOS4_SMDMA_OFFSET			0x02840000	/* (s) Memory DMA */
+#define EXYNOS4_NSMDMA_OFFSET			0x02850000	/* (ns) Memory DMA */
+#define EXYNOS4_SMMUROTATOR_OFFSET		0x02A30000	/* system mmu for rotator */
+#define EXYNOS4_SMMUMDMA_OFFSET			0x02A40000
+#define EXYNOS4_VP_OFFSET			0x02C00000	/* Video Processor */
+#define EXYNOS4_MIXER_OFFSET			0x02C10000	/* Video mixer */
+#define EXYNOS4_HDMI0_OFFSET			0x02D00000
+#define EXYNOS4_HDMI1_OFFSET			0x02D10000
+#define EXYNOS4_HDMI2_OFFSET			0x02D20000
+#define EXYNOS4_HDMI3_OFFSET			0x02D30000
+#define EXYNOS4_HDMI4_OFFSET			0x02D40000
+#define EXYNOS4_HDMI5_OFFSET			0x02D50000
+#define EXYNOS4_HDMI6_OFFSET			0x02D60000
+#define EXYNOS4_SMMUTV_OFFSET			0x02E20000
+#define EXYNOS4_G3D_OFFSET			0x03000000	/* 3D Graphics Accelerator */
+#define EXYNOS4_PPMU_3D_OFFSET			0x03220000
+#define EXYNOS4_MFC_OFFSET			0x03400000	/* Multi Format Codec */
+#define EXYNOS4_SMMUMFC_L_OFFSET		0x03620000
+#define EXYNOS4_SMMUMFC_R_OFFSET		0x03630000
+#define EXYNOS4_PMMU_MFC_L_OFFSET		0x03660000	/* ? */
+#define EXYNOS4_PMMU_MFC_R_OFFSET		0x03670000	/* ? */
+#define EXYNOS4_UART0_OFFSET			0x03800000	/* serial port 0 */
+#define EXYNOS4_UART1_OFFSET			0x03810000	/* serial port 1 */
+#define EXYNOS4_UART2_OFFSET			0x03820000	/* serial port 2 */
+#define EXYNOS4_UART3_OFFSET			0x03830000	/* serial port 3 */
+#define EXYNOS4_UART4_OFFSET			0x03840000	/* serial port 4 */
+#define EXYNOS4_I2C0_OFFSET			0x03860000	/* Inter Integrated Circuit (I2C) */
+#define EXYNOS4_I2C1_OFFSET			0x03870000	/* Inter Integrated Circuit (I2C) */
+#define EXYNOS4_I2C2_OFFSET			0x03880000	/* Inter Integrated Circuit (I2C) */
+#define EXYNOS4_I2C3_OFFSET			0x03890000	/* Inter Integrated Circuit (I2C) */
+#define EXYNOS4_I2C4_OFFSET			0x038A0000	/* Inter Integrated Circuit (I2C) */
+#define EXYNOS4_I2C5_OFFSET			0x038B0000	/* Inter Integrated Circuit (I2C) */
+#define EXYNOS4_I2C6_OFFSET			0x038C0000	/* Inter Integrated Circuit (I2C) */
+#define EXYNOS4_I2C7_OFFSET			0x038D0000	/* Inter Integrated Circuit (I2C) */
+#define EXYNOS4_I2CHDMI_OFFSET			0x038E0000	/* I2C for HDMI */
+#define EXYNOS4_SPI0_OFFSET			0x03920000	/* Serial Peripheral Interface0 */
+#define EXYNOS4_SPI1_OFFSET			0x03930000	/* Serial Peripheral Interface0 */
+#define EXYNOS4_SPI2_OFFSET			0x03940000	/* Serial Peripheral Interface0 */
+#define EXYNOS4_I2S1_OFFSET			0x03960000	/* sound */
+#define EXYNOS4_I2S2_OFFSET			0x03970000	/* sound */
+#define EXYNOS4_PCM1_OFFSET			0x03980000	/* sound */
+#define EXYNOS4_PCM2_OFFSET			0x03990000	/* sound */
+#define EXYNOS4_AC97_OFFSET			0x039A0000	/* AC97 audio codec sound */
+#define EXYNOS4_SPDIF_OFFSET			0x039B0000	/* SPDIF sound */
+#define EXYNOS4_PWMTIMER_OFFSET			0x039D0000
+
+/* AUDIOCORE */
+#define EXYNOS4_AUDIOCORE_OFFSET		0x04000000	/* on 1Mb L1 chunk */
+#define EXYNOS4_AUDIOCORE_VBASE			(EXYNOS_CORE_VBASE + EXYNOS4_AUDIOCORE_OFFSET)
+#define EXYNOS4_AUDIOCORE_PBASE			0x03800000	/* Audio SFR */
+#define EXYNOS4_AUDIOCORE_SIZE			0x00100000
+
+#define EXYNOS4_GPIO_I2S0_OFFSET		(EXYNOS4_AUDIOCORE_OFFSET + 0x00060000)
+
+/* used Exynos4 USB PHY registers */
+#define USB_PHYPWR			0x00
+#define   PHYPWR_FORCE_SUSPEND		__BIT(1)
+#define   PHYPWR_ANALOG_POWERDOWN	__BIT(3)
+#define   PHYPWR_OTG_DISABLE		__BIT(4)
+#define   PHYPWR_SLEEP_PHY0		__BIT(5)
+#define   PHYPWR_NORMAL_MASK		0x19
+#define   PHYPWR_NORMAL_MASK_PHY0	(__BITS(3,3) | 1)
+#define   PHYPWR_NORMAL_MASK_PHY1	__BITS(6,3)
+#define   PHYPWR_NORMAL_MASK_HSIC0	__BITS(9,3)
+#define   PHYPWR_NORMAL_MASK_HSIC1	__BITS(12,3)
+#define USB_PHYCLK			0x04			/* holds FSEL_CLKSEL_ */
+#define USB_RSTCON			0x08
+#define   RSTCON_SWRST			__BIT(0)
+#define   RSTCON_HLINK_RWRST		__BIT(1)
+#define   RSTCON_DEVPHYLINK_SWRST	__BIT(2)
+#define   RSTCON_DEVPHY_SWRST		__BITS(0,3)
+#define   RSTCON_HOSTPHY_SWRST		__BITS(3,4)
+#define   RSTCON_HOSTPHYLINK_SWRST	__BITS(7,4)
+
+
+#endif /* _ARM_SAMSUNG_EXYNOS4_REG_H_ */
+

Reply via email to