Module Name: src Committed By: matt Date: Thu Dec 13 01:16:39 UTC 2012
Modified Files: src/sys/arch/evbarm/beagle: beagle.h beagle_machdep.c beagle_start.S Log Message: Add SDRC to devmap. Use SDRC to determine RAM size on OMAP3xxx. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/arch/evbarm/beagle/beagle.h cvs rdiff -u -r1.27 -r1.28 src/sys/arch/evbarm/beagle/beagle_machdep.c cvs rdiff -u -r1.11 -r1.12 src/sys/arch/evbarm/beagle/beagle_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/evbarm/beagle/beagle.h diff -u src/sys/arch/evbarm/beagle/beagle.h:1.8 src/sys/arch/evbarm/beagle/beagle.h:1.9 --- src/sys/arch/evbarm/beagle/beagle.h:1.8 Tue Dec 11 01:54:43 2012 +++ src/sys/arch/evbarm/beagle/beagle.h Thu Dec 13 01:16:39 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: beagle.h,v 1.8 2012/12/11 01:54:43 khorben Exp $ */ +/* $NetBSD: beagle.h,v 1.9 2012/12/13 01:16:39 matt Exp $ */ /* * Copyright (c) 2007 Microsoft * All rights reserved. @@ -47,6 +47,8 @@ #define OMAP_L4_PERIPHERAL_SIZE OMAP3430_L4_PERIPHERAL_SIZE #define OMAP_L4_WAKEUP_BASE OMAP3430_L4_WAKEUP_BASE #define OMAP_L4_WAKEUP_SIZE OMAP3430_L4_WAKEUP_SIZE +#define OMAP_SDRC_BASE OMAP3530_SDRC_BASE +#define OMAP_SDRC_SIZE OMAP3530_SDRC_SIZE #endif #ifdef OMAP_3530 @@ -56,6 +58,8 @@ #define OMAP_L4_PERIPHERAL_SIZE OMAP3530_L4_PERIPHERAL_SIZE #define OMAP_L4_WAKEUP_BASE OMAP3530_L4_WAKEUP_BASE #define OMAP_L4_WAKEUP_SIZE OMAP3530_L4_WAKEUP_SIZE +#define OMAP_SDRC_BASE OMAP3530_SDRC_BASE +#define OMAP_SDRC_SIZE OMAP3530_SDRC_SIZE #endif #ifdef OMAP_4430 @@ -95,7 +99,8 @@ #define OMAP_L4_CORE_VBASE OMAP_KERNEL_IO_VBASE #define OMAP_L4_PERIPHERAL_VBASE (OMAP_L4_CORE_VBASE + OMAP_L4_CORE_SIZE) #define OMAP_L4_WAKEUP_VBASE (OMAP_L4_PERIPHERAL_VBASE + OMAP_L4_PERIPHERAL_SIZE) -#define OMAP_KERNEL_IO_VEND (OMAP_L4_WAKEUP_VBASE + OMAP_L4_WAKEUP_SIZE) +#define OMAP_SDRC_VBASE (OMAP_L4_WAKEUP_VBASE + OMAP_L4_WAKEUP_SIZE) +#define OMAP_KERNEL_IO_VEND (OMAP_SDRC_VBASE + OMAP_SDRC_SIZE) #define CONSADDR_VA ((CONSADDR - OMAP_L4_PERIPHERAL_BASE) + OMAP_L4_PERIPHERAL_VBASE) #elif defined(OMAP_4430) #define OMAP_L4_CORE_VBASE OMAP_KERNEL_IO_VBASE Index: src/sys/arch/evbarm/beagle/beagle_machdep.c diff -u src/sys/arch/evbarm/beagle/beagle_machdep.c:1.27 src/sys/arch/evbarm/beagle/beagle_machdep.c:1.28 --- src/sys/arch/evbarm/beagle/beagle_machdep.c:1.27 Wed Dec 12 15:20:44 2012 +++ src/sys/arch/evbarm/beagle/beagle_machdep.c Thu Dec 13 01:16:39 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: beagle_machdep.c,v 1.27 2012/12/12 15:20:44 matt Exp $ */ +/* $NetBSD: beagle_machdep.c,v 1.28 2012/12/13 01:16:39 matt Exp $ */ /* * Machine dependent functions for kernel setup for TI OSK5912 board. @@ -125,7 +125,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: beagle_machdep.c,v 1.27 2012/12/12 15:20:44 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: beagle_machdep.c,v 1.28 2012/12/13 01:16:39 matt Exp $"); #include "opt_machdep.h" #include "opt_ddb.h" @@ -221,6 +221,10 @@ static void omap4_cpu_clk(void); static void am335x_cpu_clk(void); #endif +#if defined(OMAP_3530) || defined(OMAP_3430) +static psize_t omap3530_memprobe(void); +#endif + bs_protos(bs_notimpl); #include "com.h" @@ -311,6 +315,18 @@ static const struct pmap_devmap devmap[] .pd_cache = PTE_NOCACHE }, #endif +#ifdef OMAP_SDRC_BASE + { + /* + * Map SDRAM Controller (SDRC) registers + */ + .pd_va = _A(OMAP_SDRC_VBASE), + .pd_pa = _A(OMAP_SDRC_BASE), + .pd_size = _S(OMAP_SDRC_SIZE), + .pd_prot = VM_PROT_READ|VM_PROT_WRITE, + .pd_cache = PTE_NOCACHE, + }, +#endif {0} }; @@ -367,6 +383,7 @@ beagle_putchar(char c) u_int initarm(void *arg) { + psize_t ram_size; #if 1 beagle_putchar('d'); #endif @@ -423,14 +440,18 @@ initarm(void *arg) * Set up the variables that define the availability of physical * memory. */ -#define MEMSIZE_BYTES (MEMSIZE * 1024 * 1024) +#if defined(OMAP_3530) || defined(OMAP_3430) + ram_size = omap3530_memprobe(); +#else + ram_size = MEMSIZE * 1024 * 1024; +#endif /* Fake bootconfig structure for the benefit of pmap.c. */ bootconfig.dramblocks = 1; bootconfig.dram[0].address = KERNEL_BASE_PHYS & -0x400000; - bootconfig.dram[0].pages = MEMSIZE_BYTES; + bootconfig.dram[0].pages = ram_size / PAGE_SIZE; - arm32_bootmem_init(bootconfig.dram[0].address, MEMSIZE_BYTES, + arm32_bootmem_init(bootconfig.dram[0].address, ram_size, KERNEL_BASE_PHYS); arm32_kernel_vm_init(KERNEL_VM_BASE, ARM_VECTORS_HIGH, 0, devmap, true); @@ -619,6 +640,23 @@ am335x_cpu_clk(void) } #endif +#if defined(OMAP_3530) || defined(OMAP_3430) +#define SDRC_MCFG(p) (0x80 + (0x30 * (p))) +#define SDRC_MCFG_MEMSIZE(m) ((((m) & __BITS(8,17)) >> 8) * 2) +static psize_t +omap3530_memprobe(void) +{ + const vaddr_t gpmc_base = OMAP_SDRC_VBASE; + const uint32_t mcfg0 = *(volatile uint32_t *)(gpmc_base + SDRC_MCFG(0)); + const uint32_t mcfg1 = *(volatile uint32_t *)(gpmc_base + SDRC_MCFG(1)); + + printf("mcfg0 = %#x, size %lld\n", mcfg0, SDRC_MCFG_MEMSIZE(mcfg0)); + printf("mcfg1 = %#x, size %lld\n", mcfg1, SDRC_MCFG_MEMSIZE(mcfg1)); + + return (SDRC_MCFG_MEMSIZE(mcfg0) + SDRC_MCFG_MEMSIZE(mcfg1)) * 1024 * 1024; +} +#endif + void beagle_device_register(device_t self, void *aux) { Index: src/sys/arch/evbarm/beagle/beagle_start.S diff -u src/sys/arch/evbarm/beagle/beagle_start.S:1.11 src/sys/arch/evbarm/beagle/beagle_start.S:1.12 --- src/sys/arch/evbarm/beagle/beagle_start.S:1.11 Wed Sep 5 00:06:21 2012 +++ src/sys/arch/evbarm/beagle/beagle_start.S Thu Dec 13 01:16:39 2012 @@ -92,7 +92,13 @@ #include <arm/omap/omap2_obioreg.h> #include <evbarm/beagle/beagle.h> -RCSID("$NetBSD: beagle_start.S,v 1.11 2012/09/05 00:06:21 matt Exp $") +#ifdef MEMSIZE +#define INIT_MEMSIZE MEMSIZE +#else +#define INIT_MEMSIZE 128 +#endif + +RCSID("$NetBSD: beagle_start.S,v 1.12 2012/12/13 01:16:39 matt Exp $") #define Invalidate_I_cache(reg) \ mcr p15, 0, reg, c7, c5, 0 /* Invalidate Entire I cache */ @@ -225,7 +231,7 @@ Ll1_s_frame: .word L1_S_FRAME Ltemp_l1_table: /* Put the temporary L1 translation table at the end of SDRAM. */ - .word 0x80000000 + MEMSIZE * 0x100000 - L1_TABLE_SIZE + .word 0x80000000 + INIT_MEMSIZE * 0x100000 - L1_TABLE_SIZE /* * Coprocessor register initialization values @@ -270,7 +276,7 @@ Lauxctl_CZ_restrict: mmu_init_table: /* Map KERNEL_BASE VA to SDRAM PA, write-back cacheable */ MMU_INIT(KERNEL_BASE, KERNEL_BASE, - (MEMSIZE * L1_S_SIZE + L1_S_SIZE - 1) / L1_S_SIZE, + (INIT_MEMSIZE * L1_S_SIZE + L1_S_SIZE - 1) / L1_S_SIZE, L1_S_PROTO | L1_S_APv7_KRW | L1_S_B | L1_S_C) /* Map first 1MB of L4 CORE (so console will work) */ @@ -297,5 +303,12 @@ mmu_init_table: L1_S_PROTO | L1_S_APv7_KRW) #endif +#ifdef OMAP_SDRC_BASE + /* Map 64KB SDRAM Controller (SDRC) */ + MMU_INIT(OMAP_SDRC_VBASE, OMAP_SDRC_BASE, + (OMAP_SDRC_SIZE + L1_S_SIZE - 1) / L1_S_SIZE, + L1_S_PROTO | L1_S_APv7_KRW) +#endif + /* end of table */ MMU_INIT(0, 0, 0, 0)