Module Name: src Committed By: gavan Date: Sun Aug 2 11:32:05 UTC 2009
Modified Files: src/sys/arch/arm/arm: bootconfig.c src/sys/arch/iyonix/iyonix: autoconf.c iyonix_machdep.c Log Message: On NetBSD/iyonix: * Disable interrupts in otherwise-configure Nvidia graphics card * Support genfb console, based on information supplied by the bootloader * Support kernel args * Support ways to choose which console to use * Clarify argument parsing a little. (from me and abs) To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/arm/bootconfig.c cvs rdiff -u -r1.10 -r1.11 src/sys/arch/iyonix/iyonix/autoconf.c cvs rdiff -u -r1.11 -r1.12 src/sys/arch/iyonix/iyonix/iyonix_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/arm/bootconfig.c diff -u src/sys/arch/arm/arm/bootconfig.c:1.5 src/sys/arch/arm/arm/bootconfig.c:1.6 --- src/sys/arch/arm/arm/bootconfig.c:1.5 Tue Oct 24 20:25:52 2006 +++ src/sys/arch/arm/arm/bootconfig.c Sun Aug 2 11:32:05 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: bootconfig.c,v 1.5 2006/10/24 20:25:52 bjh21 Exp $ */ +/* $NetBSD: bootconfig.c,v 1.6 2009/08/02 11:32:05 gavan Exp $ */ /* * Copyright (c) 1994-1998 Mark Brinicombe. @@ -38,7 +38,7 @@ #include <sys/param.h> -__KERNEL_RCSID(0, "$NetBSD: bootconfig.c,v 1.5 2006/10/24 20:25:52 bjh21 Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bootconfig.c,v 1.6 2009/08/02 11:32:05 gavan Exp $"); #include <sys/systm.h> @@ -46,6 +46,9 @@ /* * Function to identify and process different types of boot argument + * Note, results may contain trailing data, eg: + * get_bootconf_option("cow=moo milk=1", "moo", BOOTOPT_TYPE_STRING, &ptr) + * will return ptr of "moo milk=1", *not* "moo" */ int Index: src/sys/arch/iyonix/iyonix/autoconf.c diff -u src/sys/arch/iyonix/iyonix/autoconf.c:1.10 src/sys/arch/iyonix/iyonix/autoconf.c:1.11 --- src/sys/arch/iyonix/iyonix/autoconf.c:1.10 Mon Apr 28 20:23:26 2008 +++ src/sys/arch/iyonix/iyonix/autoconf.c Sun Aug 2 11:32:05 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: autoconf.c,v 1.10 2008/04/28 20:23:26 martin Exp $ */ +/* $NetBSD: autoconf.c,v 1.11 2009/08/02 11:32:05 gavan Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.10 2008/04/28 20:23:26 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.11 2009/08/02 11:32:05 gavan Exp $"); #include "opt_md.h" @@ -51,9 +51,13 @@ #include <iyonix/iyonix/iyonixvar.h> +#include <acorn32/include/bootconfig.h> + struct device *booted_device; int booted_partition; +extern struct bootconfig bootconfig; + /* * Set up the root device from the boot args */ @@ -136,4 +140,47 @@ SETPROP("i82543-swdpin", swdpin); } } + + if (device_is_a(dev, "genfb") && + device_is_a(device_parent(dev), "pci") ) { + prop_dictionary_t dict = device_properties(dev); + struct pci_attach_args *pa = aux; + pcireg_t bar0, bar1; + uint32_t fbaddr; + bus_space_handle_t vgah; + + bar0 = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_MAPREG_START); + bar1 = pci_conf_read(pa->pa_pc, pa->pa_tag, + PCI_MAPREG_START + 0x04); + + /* + * We need to prod the VGA card to disable interrupts, since + * RISC OS has been using them and we don't know how to + * handle them. This assumes that we have a NVidia + * GeForce 2 MX card as supplied with the Iyonix and + * as (probably) required by RISC OS in order to boot. + * If you write your own RISC OS driver for a different card, + * you're on your own. + */ + +/* We're guessing at the numbers here, guys */ +#define VGASIZE 0x1000 +#define IRQENABLE_ADDR 0x140 + + bus_space_map(pa->pa_memt, PCI_MAPREG_MEM_ADDR(bar0), + VGASIZE, 0, &vgah); + bus_space_write_4(pa->pa_memt, vgah, 0x140, 0); + bus_space_unmap(pa->pa_memt, vgah, 0x1000); + + fbaddr = PCI_MAPREG_MEM_ADDR(bar1); + + prop_dictionary_set_bool(dict, "is_console", 1); + prop_dictionary_set_uint32(dict, "width", + bootconfig.width + 1); + prop_dictionary_set_uint32(dict, "height", + bootconfig.height + 1); + prop_dictionary_set_uint32(dict, "depth", + 1 << bootconfig.log2_bpp); + prop_dictionary_set_uint32(dict, "address", fbaddr); + } } Index: src/sys/arch/iyonix/iyonix/iyonix_machdep.c diff -u src/sys/arch/iyonix/iyonix/iyonix_machdep.c:1.11 src/sys/arch/iyonix/iyonix/iyonix_machdep.c:1.12 --- src/sys/arch/iyonix/iyonix/iyonix_machdep.c:1.11 Sun Nov 30 18:21:34 2008 +++ src/sys/arch/iyonix/iyonix/iyonix_machdep.c Sun Aug 2 11:32:05 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: iyonix_machdep.c,v 1.11 2008/11/30 18:21:34 martin Exp $ */ +/* $NetBSD: iyonix_machdep.c,v 1.12 2009/08/02 11:32:05 gavan Exp $ */ /* * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc. @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: iyonix_machdep.c,v 1.11 2008/11/30 18:21:34 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: iyonix_machdep.c,v 1.12 2009/08/02 11:32:05 gavan Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -146,8 +146,8 @@ #define UND_STACK_SIZE 1 struct bootconfig bootconfig; /* Boot config storage */ -char *boot_args = NULL; -char *boot_file = NULL; + +char *boot_args; vm_offset_t physical_start; vm_offset_t physical_freestart; @@ -198,18 +198,36 @@ char iyonix_macaddr[ETHER_ADDR_LEN]; +char boot_consdev[16]; + /* Prototypes */ -void consinit(void); void iyonix_pic_init(void); void iyonix_read_machineid(void); +void consinit(void); + +static void consinit_com(const char *consdev); +static void consinit_genfb(const char *consdev); +static void process_kernel_args(void); +static void parse_iyonix_bootargs(char *args); + #include "com.h" #if NCOM > 0 #include <dev/ic/comreg.h> #include <dev/ic/comvar.h> #endif +#include "genfb.h" + +#if (NGENFB == 0) && (NCOM == 0) +# error "No valid console device (com or genfb)" +#elif defined(COMCONSOLE) || (NGENFB == 0) +# define DEFAULT_CONSDEV "com" +#else +# define DEFAULT_CONSDEV "genfb" +#endif + /* * Define the default console speed for the machine. */ @@ -456,6 +474,21 @@ /* Calibrate the delay loop. */ i80321_calibrate_delay(); + /* Ensure bootconfig has valid magic */ + if (passed_bootconfig->magic != BOOTCONFIG_MAGIC) + printf("Bad bootconfig magic: %x\n", bootconfig.magic); + + bootconfig = *passed_bootconfig; + + /* Fake bootconfig structure for anything that still needs it */ + /* XXX must make the memory description h/w independent */ + bootconfig.dram[0].address = memstart; + bootconfig.dram[0].pages = memsize / PAGE_SIZE; + bootconfig.dramblocks = 1; + + /* process arguments - can update boothowto */ + process_kernel_args(); + /* * Since we map the on-board devices VA==PA, and the kernel * is running VA==PA, it's possible for us to initialize @@ -490,18 +523,6 @@ printf("initarm: Configuring system ...\n"); #endif - /* Ensure bootconfig has valid magic */ - if (passed_bootconfig->magic != BOOTCONFIG_MAGIC) - printf("Bad bootconfig magic: %x\n", bootconfig.magic); - - bootconfig = *passed_bootconfig; - - /* Fake bootconfig structure for anything that still needs it */ - /* XXX must make the memory description h/w independent */ - bootconfig.dram[0].address = memstart; - bootconfig.dram[0].pages = memsize / PAGE_SIZE; - bootconfig.dramblocks = 1; - /* * Set up the variables that define the availability of * physical memory. @@ -808,10 +829,6 @@ printf("done.\n"); #endif -#ifdef BOOTHOWTO - boothowto = BOOTHOWTO; -#endif - #ifdef DDB db_machine_init(); if (boothowto & RB_KDB) @@ -820,6 +837,9 @@ iyonix_pic_init(); + printf("args: %s\n", bootconfig.args); + printf("howto: %x\n", boothowto); + /* We return the new stack pointer address */ return(kernelstack.pv_va + USPACE_SVC_STACK_TOP); } @@ -827,9 +847,6 @@ void consinit(void) { - static const bus_addr_t comcnaddrs[] = { - IYONIX_UART1, /* com0 */ - }; static int consinit_called; if (consinit_called != 0) @@ -837,6 +854,23 @@ consinit_called = 1; + /* We let consinit_<foo> worry about device numbers */ + if (strncmp(boot_consdev, "genfb", 5) && + strncmp(boot_consdev, "com", 3)) + strcpy(boot_consdev, DEFAULT_CONSDEV); + + if (!strncmp(boot_consdev, "com", 3)) + consinit_com(boot_consdev); + else + consinit_genfb(boot_consdev); +} + +static void +consinit_com(const char *consdev) +{ + static const bus_addr_t comcnaddrs[] = { + IYONIX_UART1, /* com0 */ + }; /* * Console devices are mapped VA==PA. Our devmap reflects * this, so register it now so drivers can map the console @@ -844,6 +878,9 @@ */ pmap_devmap_register(iyonix_devmap); + /* When we support more than the first serial port as console, + * we should check consdev for a number. + */ #if NCOM > 0 if (comcnattach(&obio_bs_tag, comcnaddrs[comcnunit], comcnspeed, COM_FREQ, COM_TYPE_NORMAL, comcnmode)) @@ -853,12 +890,56 @@ #else panic("serial console @%lx not configured", comcnaddrs[comcnunit]); #endif + #if KGDB #if NCOM > 0 if (strcmp(kgdb_devname, "com") == 0) { com_kgdb_attach(&obio_bs_tag, kgdb_devaddr, kgdb_devrate, - COM_FREQ, COM_TYPE_NORMAL, kgdb_devmode); + COM_FREQ, COM_TYPE_NORMAL, kgdb_devmode); } #endif /* NCOM > 0 */ #endif /* KGDB */ } + +static void +consinit_genfb(const char *consdev) +{ + /* NOTYET */ +} + +static void +process_kernel_args(void) +{ + char *args; + + /* Ok now we will check the arguments for interesting parameters. */ + args = bootconfig.args; + +#ifdef BOOTHOWTO + boothowto = BOOTHOWTO; +#else + boothowto = 0; +#endif + + /* Only arguments itself are passed from the bootloader */ + while (*args == ' ') + ++args; + + boot_args = args; + parse_mi_bootargs(boot_args); + parse_iyonix_bootargs(boot_args); +} + +static void +parse_iyonix_bootargs(char *args) +{ + char *ptr; + + if (get_bootconf_option(args, "consdev", BOOTOPT_TYPE_STRING, &ptr)) + { + /* ptr may have trailing clutter */ + strlcpy(boot_consdev, ptr, sizeof(boot_consdev)); + if ( (ptr = strchr(boot_consdev, ' ')) ) + *ptr = 0; + } +}