Module Name: src Committed By: phx Date: Sat Dec 17 20:20:38 UTC 2011
Modified Files: src/sys/arch/sandpoint/conf: GENERIC files.sandpoint src/sys/arch/sandpoint/include: bus_funcs.h src/sys/arch/sandpoint/sandpoint: machdep.c mainbus.c Added Files: src/sys/arch/sandpoint/include: autoconf.h src/sys/arch/sandpoint/sandpoint: flash_cfi.c Removed Files: src/sys/arch/sandpoint/include: bus.h Log Message: Added NOR flash driver, using nor(4) and flash(4). To generate a diff of this commit: cvs rdiff -u -r1.61 -r1.62 src/sys/arch/sandpoint/conf/GENERIC cvs rdiff -u -r1.29 -r1.30 src/sys/arch/sandpoint/conf/files.sandpoint cvs rdiff -u -r0 -r1.1 src/sys/arch/sandpoint/include/autoconf.h cvs rdiff -u -r1.8 -r0 src/sys/arch/sandpoint/include/bus.h cvs rdiff -u -r1.1 -r1.2 src/sys/arch/sandpoint/include/bus_funcs.h cvs rdiff -u -r0 -r1.1 src/sys/arch/sandpoint/sandpoint/flash_cfi.c cvs rdiff -u -r1.59 -r1.60 src/sys/arch/sandpoint/sandpoint/machdep.c cvs rdiff -u -r1.24 -r1.25 src/sys/arch/sandpoint/sandpoint/mainbus.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/sandpoint/conf/GENERIC diff -u src/sys/arch/sandpoint/conf/GENERIC:1.61 src/sys/arch/sandpoint/conf/GENERIC:1.62 --- src/sys/arch/sandpoint/conf/GENERIC:1.61 Tue Nov 22 21:25:34 2011 +++ src/sys/arch/sandpoint/conf/GENERIC Sat Dec 17 20:20:37 2011 @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC,v 1.61 2011/11/22 21:25:34 tls Exp $ +# $NetBSD: GENERIC,v 1.62 2011/12/17 20:20:37 phx Exp $ # # machine description file for GENERIC NAS # @@ -22,7 +22,7 @@ include "arch/sandpoint/conf/std.sandpo options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.61 $" +#ident "GENERIC-$Revision: 1.62 $" maxusers 32 @@ -174,8 +174,12 @@ options RTC_OFFSET=0 # hardware clock i mainbus0 at root cpu* at mainbus0 -pci* at mainbus0 bus ? +cfi0 at mainbus0 +nor* at cfi? +flash* at nor? + +pci* at mainbus0 bus ? pchb* at pci? dev ? function ? # PCI host bridge eumb* at mainbus0 @@ -197,6 +201,7 @@ cmdide* at pci? dev ? function ? # CMD iteide* at pci? dev ? function ? # IT Express IDE controllers satalink* at pci? dev ? function ? # SiI SATALink controllers viaide* at pci? dev ? function ? # VIA IDE controllers +#options WDC_NO_IDS # fix Iomega viaide VT6410 # ATA (IDE) bus support atabus* at ata? Index: src/sys/arch/sandpoint/conf/files.sandpoint diff -u src/sys/arch/sandpoint/conf/files.sandpoint:1.29 src/sys/arch/sandpoint/conf/files.sandpoint:1.30 --- src/sys/arch/sandpoint/conf/files.sandpoint:1.29 Tue Mar 1 09:17:07 2011 +++ src/sys/arch/sandpoint/conf/files.sandpoint Sat Dec 17 20:20:37 2011 @@ -1,4 +1,4 @@ -# $NetBSD: files.sandpoint,v 1.29 2011/03/01 09:17:07 phx Exp $ +# $NetBSD: files.sandpoint,v 1.30 2011/12/17 20:20:37 phx Exp $ # # Motorola's "SandPoint" evaluation board and multiplied descendents. # @@ -39,19 +39,30 @@ file dev/md_root.c memory_disk_hooks define mainbus { } device mainbus: isabus, pcibus, mainbus attach mainbus at root + device cpu attach cpu at mainbus file arch/sandpoint/sandpoint/mainbus.c mainbus|cpu needs-flag +device cfi: norbus +attach cfi at mainbus with sandpointcfi +file arch/sandpoint/sandpoint/flash_cfi.c sandpointcfi + device eumb { [ unit = -1 ] }: mainbus attach eumb at mainbus file arch/sandpoint/sandpoint/eumb.c eumb + attach com at eumb with com_eumb file arch/sandpoint/sandpoint/com_eumb.c com_eumb needs-flag + device ociic: motoi2c, i2cbus attach ociic at eumb with iic_eumb file arch/sandpoint/sandpoint/iic_eumb.c iic_eumb +device satmgr: sysmon_power, sysmon_taskq +attach satmgr at eumb +file arch/sandpoint/sandpoint/satmgr.c satmgr + # # PCI-only drivers # XXX MUST BE INCLUDED BEFORE files.isa, as long as files.isa attaches @@ -104,8 +115,4 @@ attach fd at fdc include "dev/usb/files.usb" -device satmgr: sysmon_power, sysmon_taskq -attach satmgr at eumb -file arch/sandpoint/sandpoint/satmgr.c satmgr - include "arch/powerpc/conf/majors.powerpc" Index: src/sys/arch/sandpoint/include/bus_funcs.h diff -u src/sys/arch/sandpoint/include/bus_funcs.h:1.1 src/sys/arch/sandpoint/include/bus_funcs.h:1.2 --- src/sys/arch/sandpoint/include/bus_funcs.h:1.1 Fri Jul 1 17:10:00 2011 +++ src/sys/arch/sandpoint/include/bus_funcs.h Sat Dec 17 20:20:37 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_funcs.h,v 1.1 2011/07/01 17:10:00 dyoung Exp $ */ +/* $NetBSD: bus_funcs.h,v 1.2 2011/12/17 20:20:37 phx Exp $ */ /* $OpenBSD: bus.h,v 1.1 1997/10/13 10:53:42 pefo Exp $ */ #ifndef _SANDPOINT_BUS_FUNCS_H_ @@ -10,6 +10,7 @@ extern struct powerpc_bus_space genppc_i extern struct powerpc_bus_space sandpoint_mem_space_tag; extern struct powerpc_bus_space genppc_isa_mem_space_tag; extern struct powerpc_bus_space sandpoint_eumb_space_tag; +extern struct powerpc_bus_space sandpoint_flash_space_tag; #endif #include <powerpc/bus_funcs.h> Index: src/sys/arch/sandpoint/sandpoint/machdep.c diff -u src/sys/arch/sandpoint/sandpoint/machdep.c:1.59 src/sys/arch/sandpoint/sandpoint/machdep.c:1.60 --- src/sys/arch/sandpoint/sandpoint/machdep.c:1.59 Tue Nov 22 16:56:29 2011 +++ src/sys/arch/sandpoint/sandpoint/machdep.c Sat Dec 17 20:20:38 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.59 2011/11/22 16:56:29 phx Exp $ */ +/* $NetBSD: machdep.c,v 1.60 2011/12/17 20:20:38 phx Exp $ */ /* * Copyright (C) 1995, 1996 Wolfgang Solfrank. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.59 2011/11/22 16:56:29 phx Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.60 2011/12/17 20:20:38 phx Exp $"); #include "opt_compat_netbsd.h" #include "opt_ddb.h" @@ -438,7 +438,7 @@ struct powerpc_bus_space genppc_isa_io_s }; struct powerpc_bus_space sandpoint_mem_space_tag = { _BUS_SPACE_LITTLE_ENDIAN|_BUS_SPACE_MEM_TYPE, - 0x00000000, 0x80000000, 0xfbffffff, + 0x00000000, 0x80000000, 0xfc000000, }; struct powerpc_bus_space genppc_isa_mem_space_tag = { _BUS_SPACE_LITTLE_ENDIAN|_BUS_SPACE_MEM_TYPE, @@ -448,8 +448,12 @@ struct powerpc_bus_space sandpoint_eumb_ _BUS_SPACE_LITTLE_ENDIAN|_BUS_SPACE_MEM_TYPE, 0xfc000000, 0x00000000, 0x00100000, }; +struct powerpc_bus_space sandpoint_flash_space_tag = { + _BUS_SPACE_LITTLE_ENDIAN|_BUS_SPACE_MEM_TYPE, + 0x00000000, 0xff000000, 0x00000000, +}; -static char ex_storage[5][EXTENT_FIXED_STORAGE_SIZE(8)] +static char ex_storage[6][EXTENT_FIXED_STORAGE_SIZE(8)] __attribute__((aligned(8))); void @@ -487,6 +491,11 @@ sandpoint_bus_space_init(void) ex_storage[4], sizeof(ex_storage[4])); if (error) panic("sandpoint_bus_space_init: can't init eumb tag"); + + error = bus_space_init(&sandpoint_flash_space_tag, "flash", + ex_storage[5], sizeof(ex_storage[5])); + if (error) + panic("sandpoint_bus_space_init: can't init flash tag"); } #define MPC107_EUMBBAR 0x78 /* Eumb base address */ @@ -527,7 +536,7 @@ mpc107memsize(void) end |= ((val >> bankn) & 0xff) << 20; end |= 0xfffff; /* bit 19:00 */ - return (end + 1); /* recongize this as the amount of SDRAM */ + return (end + 1); /* recognize this as the amount of SDRAM */ } /* XXX XXX debug purpose only XXX XXX */ Index: src/sys/arch/sandpoint/sandpoint/mainbus.c diff -u src/sys/arch/sandpoint/sandpoint/mainbus.c:1.24 src/sys/arch/sandpoint/sandpoint/mainbus.c:1.25 --- src/sys/arch/sandpoint/sandpoint/mainbus.c:1.24 Fri Jul 1 19:16:06 2011 +++ src/sys/arch/sandpoint/sandpoint/mainbus.c Sat Dec 17 20:20:38 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: mainbus.c,v 1.24 2011/07/01 19:16:06 dyoung Exp $ */ +/* $NetBSD: mainbus.c,v 1.25 2011/12/17 20:20:38 phx Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.24 2011/07/01 19:16:06 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.25 2011/12/17 20:20:38 phx Exp $"); #include "opt_pci.h" #include "pci.h" @@ -42,12 +42,13 @@ __KERNEL_RCSID(0, "$NetBSD: mainbus.c,v #include <sys/malloc.h> #include <sys/systm.h> -#include <sys/bus.h> +#include <machine/autoconf.h> #include <machine/isa_machdep.h> #include <dev/pci/pcivar.h> #include <dev/pci/pciconf.h> +/* XXX go away! */ struct conf_args { const char *ca_name; }; @@ -78,18 +79,25 @@ void mainbus_attach(device_t parent, device_t self, void *aux) { struct conf_args ca; + struct mainbus_attach_args mba; struct pcibus_attach_args pba; #if defined(PCI_NETBSD_CONFIGURE) struct extent *ioext, *memext; #endif - printf("\n"); + aprint_naive("\n"); + aprint_normal("\n"); ca.ca_name = "cpu"; config_found_ia(self, "mainbus", &ca, mainbus_print); ca.ca_name = "eumb"; config_found_ia(self, "mainbus", &ca, mainbus_print); + mba.ma_name = "cfi"; + mba.ma_bst = &sandpoint_flash_space_tag; + mba.ma_addr = 0xffe00000; /* smallest flash is 2 MiB */ + config_found_ia(self, "mainbus", &mba, mainbus_print); + /* * XXX Note also that the presence of a PCI bus should * XXX _always_ be checked, and if present the bus should be @@ -125,8 +133,7 @@ mainbus_attach(device_t parent, device_t static int cpu_match(device_t, cfdata_t, void *); static void cpu_attach(device_t, device_t, void *); -CFATTACH_DECL_NEW(cpu, 0, - cpu_match, cpu_attach, NULL, NULL); +CFATTACH_DECL_NEW(cpu, 0, cpu_match, cpu_attach, NULL, NULL); extern struct cfdriver cpu_cd; Added files: Index: src/sys/arch/sandpoint/include/autoconf.h diff -u /dev/null src/sys/arch/sandpoint/include/autoconf.h:1.1 --- /dev/null Sat Dec 17 20:20:38 2011 +++ src/sys/arch/sandpoint/include/autoconf.h Sat Dec 17 20:20:37 2011 @@ -0,0 +1,37 @@ +/* $NetBSD: autoconf.h,v 1.1 2011/12/17 20:20:37 phx Exp $ */ + +/*- + * Copyright (c) 2011 Frank Wille. + * All rights reserved. + * + * Written by Frank Wille for The NetBSD Project. + * + * 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. + */ + +#include <sys/bus.h> + +struct mainbus_attach_args { + const char *ma_name; + bus_space_tag_t ma_bst; + bus_addr_t ma_addr; +}; Index: src/sys/arch/sandpoint/sandpoint/flash_cfi.c diff -u /dev/null src/sys/arch/sandpoint/sandpoint/flash_cfi.c:1.1 --- /dev/null Sat Dec 17 20:20:38 2011 +++ src/sys/arch/sandpoint/sandpoint/flash_cfi.c Sat Dec 17 20:20:38 2011 @@ -0,0 +1,172 @@ +/* $NetBSD: flash_cfi.c,v 1.1 2011/12/17 20:20:38 phx Exp $ */ + +/*- + * Copyright (c) 2011 Frank Wille. + * All rights reserved. + * + * Written by Frank Wille for The NetBSD Project. + * + * 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. + */ + +/* + * NOR CFI driver support for sandpoint + */ +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: flash_cfi.c,v 1.1 2011/12/17 20:20:38 phx Exp $"); + +#include <sys/param.h> +#include <sys/device.h> + +#include <machine/autoconf.h> + +#include <dev/nor/nor.h> +#include <dev/nor/cfi.h> + + +static int sandpointcfi_probe(device_t, cfdata_t, void *); +static void sandpointcfi_attach(device_t, device_t, void *); +static int sandpointcfi_detach(device_t, int); + +struct sandpointcfi_softc { + device_t sc_dev; + device_t sc_nordev; + struct cfi sc_cfi; + bus_size_t sc_size; + struct nor_interface sc_nor_if; +}; + +CFATTACH_DECL_NEW(sandpointcfi, sizeof(struct sandpointcfi_softc), + sandpointcfi_probe, sandpointcfi_attach, sandpointcfi_detach, NULL); + +static int +sandpointcfi_probe(device_t parent, cfdata_t cf, void *aux) +{ + extern struct cfdriver cfi_cd; + struct mainbus_attach_args *ma = aux; + const bus_size_t tmpsize = CFI_QRY_MIN_MAP_SIZE; + struct cfi cfi; + int error, rv; + + if (strcmp(ma->ma_name, cfi_cd.cd_name) != 0) + return 0; + + KASSERT(ma->ma_bst != NULL); + + cfi.cfi_bst = ma->ma_bst; + + error = bus_space_map(cfi.cfi_bst, ma->ma_addr, tmpsize, 0, + &cfi.cfi_bsh); + if (error != 0) { + aprint_error("%s: cannot map %d at offset %#x, error %d\n", + __func__, tmpsize, ma->ma_addr, error); + return 0; + } + + /* probe for NOR flash */ + if (!cfi_probe(&cfi)) { + aprint_debug("%s: probe addr %#x, CFI not found\n", + __func__, ma->ma_addr); + rv = 0; + } else + rv = 1; + + bus_space_unmap(cfi.cfi_bst, cfi.cfi_bsh, tmpsize); + return rv; +} + +static void +sandpointcfi_attach(device_t parent, device_t self, void *aux) +{ + struct mainbus_attach_args *ma = aux; + struct sandpointcfi_softc *sc; + const bus_size_t tmpsize = CFI_QRY_MIN_MAP_SIZE; + bus_addr_t addr; + bool found; + int error; + + aprint_naive("\n"); + aprint_normal("\n"); + + sc = device_private(self); + sc->sc_dev = self; + sc->sc_cfi.cfi_bst = ma->ma_bst; + + /* map enough to identify, remap later when size is known */ + error = bus_space_map(sc->sc_cfi.cfi_bst, ma->ma_addr, tmpsize, 0, + &sc->sc_cfi.cfi_bsh); + if (error != 0) { + aprint_error_dev(self, "could not map error %d\n", error); + return; + } + + /* identify the NOR flash */ + found = cfi_identify(&sc->sc_cfi); + + bus_space_unmap(sc->sc_cfi.cfi_bst, sc->sc_cfi.cfi_bsh, tmpsize); + if (!found) { + /* should not happen, we already probed OK in match */ + aprint_error_dev(self, "could not map error %d\n", error); + return; + } + + /* get size of flash in bytes */ + sc->sc_size = 1 << sc->sc_cfi.cfi_qry_data.device_size; + + /* real base address */ + addr = (0xffffffff - sc->sc_size) + 1; + + sc->sc_nor_if = nor_interface_cfi; + sc->sc_nor_if.private = &sc->sc_cfi; + sc->sc_nor_if.access_width = (1 << sc->sc_cfi.cfi_portwidth); + + cfi_print(self, &sc->sc_cfi); + + error = bus_space_map(sc->sc_cfi.cfi_bst, addr, sc->sc_size, 0, + &sc->sc_cfi.cfi_bsh); + if (error != 0) { + aprint_error_dev(self, "could not map error %d\n", error); + return; + } + + if (!pmf_device_register1(self, NULL, NULL, NULL)) + aprint_error_dev(self, "couldn't establish power handler\n"); + + sc->sc_nordev = nor_attach_mi(&sc->sc_nor_if, self); +} + +static int +sandpointcfi_detach(device_t self, int flags) +{ + struct sandpointcfi_softc *sc; + int rv; + + pmf_device_deregister(self); + sc = device_private(self); + rv = 0; + + if (sc->sc_nordev != NULL) + rv = config_detach(sc->sc_nordev, flags); + + bus_space_unmap(sc->sc_cfi.cfi_bst, sc->sc_cfi.cfi_bsh, sc->sc_size); + return rv; +}