Module Name: src Committed By: matt Date: Mon Sep 9 17:54:38 UTC 2013
Modified Files: src/sys/arch/evbarm/cubie: cubie_machdep.c Log Message: Cleanup. Make KGDB work. We now process the u-boot boot args. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/arch/evbarm/cubie/cubie_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/evbarm/cubie/cubie_machdep.c diff -u src/sys/arch/evbarm/cubie/cubie_machdep.c:1.7 src/sys/arch/evbarm/cubie/cubie_machdep.c:1.8 --- src/sys/arch/evbarm/cubie/cubie_machdep.c:1.7 Sun Sep 8 04:06:44 2013 +++ src/sys/arch/evbarm/cubie/cubie_machdep.c Mon Sep 9 17:54:38 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: cubie_machdep.c,v 1.7 2013/09/08 04:06:44 matt Exp $ */ +/* $NetBSD: cubie_machdep.c,v 1.8 2013/09/09 17:54:38 matt Exp $ */ /* * Machine dependent functions for kernel setup for TI OSK5912 board. @@ -125,7 +125,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cubie_machdep.c,v 1.7 2013/09/08 04:06:44 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cubie_machdep.c,v 1.8 2013/09/09 17:54:38 matt Exp $"); #include "opt_machdep.h" #include "opt_ddb.h" @@ -192,29 +192,32 @@ static char bootargs[MAX_BOOT_STRING]; char *boot_args = NULL; char *boot_file = NULL; -u_int uboot_args[4] = { 0 }; /* filled in by cubie_start.S (not in bss) */ +/* + * uboot_args are filled in by cubie_start.S and must be in .data + * and not .bbs since .bss is cleared after uboot_args are filled in. + */ +uintptr_t uboot_args[4] = { 0 }; /* Same things, but for the free (unused by the kernel) memory. */ -extern char KERNEL_BASE_phys[]; -extern char _end[]; +extern char KERNEL_BASE_phys[]; /* physical start of kernel */ +extern char _end[]; /* physical end of kernel */ +#if NAWIN_FB > 0 #if NCOM > 0 int use_fb_console = false; #else int use_fb_console = true; #endif - -#ifdef CPU_CORTEXA7 -uint32_t arm_cnt_frq; #endif /* * Macros to translate between physical and virtual for a subset of the * kernel address space. *Not* for general use. */ -#define KERNEL_BASE_PHYS ((paddr_t)KERNEL_BASE_phys) -#define AWIN_CORE_VOFFSET (AWIN_CORE_VBASE - AWIN_CORE_PBASE) +#define KERNEL_BASE_PHYS ((paddr_t)KERNEL_BASE_phys) +#define KERNEL_PHYS_VOFFSET (KERNEL_BASE - AWIN_SDRAM_PBASE) +#define AWIN_CORE_VOFFSET (AWIN_CORE_VBASE - AWIN_CORE_PBASE) /* Prototypes */ @@ -223,11 +226,8 @@ void consinit(void); static void kgdb_port_init(void); #endif -static void init_clocks(void); static void cubie_device_register(device_t, void *); -bs_protos(bs_notimpl); - #if NCOM > 0 #include <dev/ic/comreg.h> #include <dev/ic/comvar.h> @@ -248,8 +248,8 @@ bs_protos(bs_notimpl); * using the 2nd page tables. */ -#define _A(a) ((a) & ~L1_S_OFFSET) -#define _S(s) (((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1)) +#define _A(a) ((a) & ~L1_S_OFFSET) +#define _S(s) (((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1)) static const struct pmap_devmap devmap[] = { { @@ -295,9 +295,6 @@ static const struct pmap_devmap devmap[] u_int initarm(void *arg) { - psize_t ram_size = 0; - char *ptr; - pmap_devmap_register(devmap); awin_bootstrap(AWIN_CORE_VBASE, CONADDR_VA); @@ -305,13 +302,13 @@ initarm(void *arg) if (set_cpufuncs()) panic("cpu not recognized!"); - init_clocks(); - /* The console is going to try to map things. Give pmap a devmap. */ consinit(); +#ifdef VERBOSE_INIT_ARM printf("\nuboot arg = %#x, %#x, %#x, %#x\n", uboot_args[0], uboot_args[1], uboot_args[2], uboot_args[3]); +#endif #ifdef KGDB kgdb_port_init(); @@ -331,17 +328,17 @@ initarm(void *arg) #ifdef VERBOSE_INIT_ARM printf("initarm: Configuring system ...\n"); -#endif #if defined(CPU_CORTEXA7) || defined(CPU_CORTEXA9) || defined(CPU_CORTEXA15) printf("initarm: cbar=%#x\n", armreg_cbar_read()); #endif +#endif /* * Set up the variables that define the availability of physical * memory. */ - ram_size = awin_memprobe(); + psize_t ram_size = awin_memprobe(); /* * If MEMSIZE specified less than what we really have, limit ourselves @@ -356,7 +353,7 @@ initarm(void *arg) /* Fake bootconfig structure for the benefit of pmap.c. */ bootconfig.dramblocks = 1; - bootconfig.dram[0].address = KERNEL_BASE_PHYS & -0x400000; + bootconfig.dram[0].address = AWIN_SDRAM_PBASE; bootconfig.dram[0].pages = ram_size / PAGE_SIZE; #ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS @@ -367,43 +364,45 @@ initarm(void *arg) #endif KASSERT((armreg_pfr1_read() & ARM_PFR1_SEC_MASK) != 0); -#if 0 - /* "bootargs" env variable is passed as 4th argument to kernel */ - printf("Copy bootargs"); - if (uboot_args[3] - AWIN_SDRAM_PBASE < ram_size) { - strlcpy(bootargs, (char *)uboot_args[3], sizeof(bootargs)); - } - printf("\n"); -#endif - arm32_bootmem_init(bootconfig.dram[0].address, ram_size, KERNEL_BASE_PHYS); arm32_kernel_vm_init(KERNEL_VM_BASE, ARM_VECTORS_LOW, 0, devmap, mapallmem_p); + if (mapallmem_p) { + /* + * "bootargs" env variable is passed as 4th argument + * to kernel but it's using the physical address and + * we to convert that to a virtual address. + */ + if (uboot_args[3] - AWIN_SDRAM_PBASE < ram_size) { + const char * const args = (const char *) + (uboot_args[3] + KERNEL_PHYS_VOFFSET); + strlcpy(bootargs, args, sizeof(bootargs)); + } + } + boot_args = bootargs; parse_mi_bootargs(boot_args); /* we've a specific device_register routine */ evbarm_device_register = cubie_device_register; +#if NAWIN_FB > 0 + char *ptr; if (get_bootconf_option(boot_args, "console", BOOTOPT_TYPE_STRING, &ptr) && strncmp(ptr, "fb", 2) == 0) { use_fb_console = true; } +#endif return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0); } -static void -init_clocks(void) -{ -} - #if NCOM > 0 #ifndef CONADDR -#define CONADDR (AWIN_CORE_PBASE + AWIN_UART0_OFFSET) +#define CONADDR (AWIN_CORE_PBASE + AWIN_UART0_OFFSET) #endif #ifndef CONSPEED #define CONSPEED 115200 @@ -412,6 +411,9 @@ init_clocks(void) #define CONMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */ #endif +__CTASSERT(AWIN_CORE_PBASE + AWIN_UART0_OFFSET <= CONADDR); +__CTASSERT(CONADDR <= AWIN_CORE_PBASE + AWIN_UART7_OFFSET); +__CTASSERT(CONADDR % AWIN_UART_SIZE == 0); static const bus_addr_t conaddr = CONADDR; static const int conspeed = CONSPEED; static const int conmode = CONMODE; @@ -420,6 +422,7 @@ static const int conmode = CONMODE; void consinit(void) { + bus_space_tag_t bst = &awin_a4x_bs_tag; #if NCOM > 0 bus_space_handle_t bh; #endif @@ -431,14 +434,14 @@ consinit(void) consinit_called = 1; #if NCOM > 0 - if (bus_space_map(&awin_a4x_bs_tag, conaddr, AWIN_UART_SIZE, 0, &bh)) + if (bus_space_map(bst, conaddr, AWIN_UART_SIZE, 0, &bh)) panic("Serial console can not be mapped."); - if (comcnattach(&awin_a4x_bs_tag, conaddr, conspeed, AWIN_UART_FREQ, + if (comcnattach(bst, conaddr, conspeed, AWIN_UART_FREQ, COM_TYPE_NORMAL, conmode)) panic("Serial console can not be initialized."); - bus_space_unmap(&awin_a4x_bs_tag, bh, AWIN_UART_SIZE); + bus_space_unmap(bst, bh, AWIN_UART_SIZE); #else #error only COM console is supported @@ -459,6 +462,12 @@ consinit(void) #ifndef KGDB_DEVMODE #define KGDB_DEVMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */ #endif + +__CTASSERT(KGDB_DEVADDR != CONADDR); +__CTASSERT(AWIN_CORE_PBASE + AWIN_UART0_OFFSET <= KGDB_DEVADDR); +__CTASSERT(KGDB_DEVADDR <= AWIN_CORE_PBASE + AWIN_UART7_OFFSET); +__CTASSERT(KGDB_DEVADDR % AWIN_UART_SIZE == 0); + static const vaddr_t comkgdbaddr = KGDB_DEVADDR; static const int comkgdbspeed = KGDB_DEVRATE; static const int comkgdbmode = KGDB_DEVMODE; @@ -466,22 +475,23 @@ static const int comkgdbmode = KGDB_DEVM void static kgdb_port_init(void) { - static int kgdbsinit_called = 0; + bus_space_tag_t bst = &awin_a4x_bs_tag; + static bool kgdbsinit_called; - if (kgdbsinit_called != 0) + if (kgdbsinit_called) return; - kgdbsinit_called = 1; + kgdbsinit_called = true; bus_space_handle_t bh; - if (bus_space_map(&awin_a4x_bs_tag, comkgdbaddr, OMAP_COM_SIZE, 0, &bh)) + if (bus_space_map(bst, comkgdbaddr, AWIN_UART_SIZE, 0, &bh)) panic("kgdb port can not be mapped."); - if (com_kgdb_attach(&awin_a4x_bs_tag, comkgdbaddr, comkgdbspeed, - OMAP_COM_FREQ, COM_TYPE_NORMAL, comkgdbmode)) + if (com_kgdb_attach(bst, comkgdbaddr, comkgdbspeed, AWIN_REF_FREQ, + COM_TYPE_NORMAL, comkgdbmode)) panic("KGDB uart can not be initialized."); - bus_space_unmap(&awin_a4x_bs_tag, bh, OMAP_COM_SIZE); + bus_space_unmap(bst, bh, AWIN_UART_SIZE); } #endif @@ -563,7 +573,10 @@ cubie_device_register(device_t self, voi } if (device_is_a(self, "com")) { +#if NAWIN_FB > 0 if (use_fb_console) prop_dictionary_set_bool(dict, "is_console", false); +#endif + return; } }