Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/evbarm/cubie Cleanup. Make KGDB work.
details: https://anonhg.NetBSD.org/src/rev/d5ee8931ca76
branches: trunk
changeset: 789830:d5ee8931ca76
user: matt <matt%NetBSD.org@localhost>
date: Mon Sep 09 17:54:38 2013 +0000
description:
Cleanup. Make KGDB work.
We now process the u-boot boot args.
diffstat:
sys/arch/evbarm/cubie/cubie_machdep.c | 109 +++++++++++++++++++--------------
1 files changed, 61 insertions(+), 48 deletions(-)
diffs (289 lines):
diff -r 1c1283b1769c -r d5ee8931ca76 sys/arch/evbarm/cubie/cubie_machdep.c
--- a/sys/arch/evbarm/cubie/cubie_machdep.c Mon Sep 09 17:53:36 2013 +0000
+++ b/sys/arch/evbarm/cubie/cubie_machdep.c Mon Sep 09 17:54:38 2013 +0000
@@ -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 @@
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 @@
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 @@
* 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 @@
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 @@
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 @@
#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 @@
/* 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 @@
#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 @@
#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 @@
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_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 @@
#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 @@
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 @@
}
if (device_is_a(self, "com")) {
+#if NAWIN_FB > 0
if (use_fb_console)
prop_dictionary_set_bool(dict, "is_console", false);
+#endif
+ return;
}
}
Home |
Main Index |
Thread Index |
Old Index