Date: Wed, 6 Aug 2014 01:39:25 GMT From: astarasikov@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r271979 - in soc2014/astarasikov/head/sys/arm: conf goldfish Message-ID: <201408060139.s761dPQD016450@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: astarasikov Date: Wed Aug 6 01:39:24 2014 New Revision: 271979 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271979 Log: [goldfish]: config update, mmc/nand stubs Modified: soc2014/astarasikov/head/sys/arm/conf/GOLDFISH soc2014/astarasikov/head/sys/arm/goldfish/files.goldfish soc2014/astarasikov/head/sys/arm/goldfish/goldfish_mmc.c soc2014/astarasikov/head/sys/arm/goldfish/goldfish_nand.c Modified: soc2014/astarasikov/head/sys/arm/conf/GOLDFISH ============================================================================== --- soc2014/astarasikov/head/sys/arm/conf/GOLDFISH Wed Aug 6 01:38:02 2014 (r271978) +++ soc2014/astarasikov/head/sys/arm/conf/GOLDFISH Wed Aug 6 01:39:24 2014 (r271979) @@ -1,4 +1,4 @@ -# GOLDFISH - Configuration for QEMU version of Versatile Platform Board +#GOLDFISH - Configuration for QEMU version of Versatile Platform Board # # For more information on this file, please read the handbook section on # Kernel Configuration Files: @@ -10,105 +10,122 @@ # FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the # latest information. # -# An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. +# An exhaustive list of options and more detailed explanations of the +# device lines is also present in the ../../conf/NOTES and NOTES files. # If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # # $FreeBSD: release/10.0.0/sys/arm/conf/GOLDFISH 254902 2013-08-26 10:27:15Z andrew $ -ident GOLDFISH +ident GOLDFISH -cpu CPU_CORTEXA -machine arm armv6 -makeoptions ARM_LITTLE_ENDIAN +cpu CPU_CORTEXA +machine arm armv6 +makeoptions ARM_LITTLE_ENDIAN -options QEMU_WORKAROUNDS +nooptions ARM_CACHE_LOCK_ENABLE # QEMU does not implement this +options QEMU_WORKAROUNDS -files "../goldfish/files.goldfish" -makeoptions MODULES_OVERRIDE="" +files "../goldfish/files.goldfish" +makeoptions MODULES_OVERRIDE="" options KERNVIRTADDR=0xc0100000 -makeoptions KERNVIRTADDR=0xc0100000 +makeoptions KERNVIRTADDR=0xc0100000 options KERNPHYSADDR=0x00100000 -makeoptions KERNPHYSADDR=0x00100000 +makeoptions KERNPHYSADDR=0x00100000 options PHYSADDR=0x00000000 -options FREEBSD_BOOT_LOADER -options LINUX_BOOT_ABI +options FREEBSD_BOOT_LOADER +options LINUX_BOOT_ABI +options VERBOSE_INIT_ARM -makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols +makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols options HZ=100 options SCHED_4BSD #4BSD scheduler options INET #InterNETworking +options TMPFS # Efficient memory filesystem options FFS #Berkeley Fast Filesystem options SOFTUPDATES #Enable FFS soft updates support options UFS_ACL #Support for access control lists options UFS_DIRHASH #Improve performance on big directories -device snp +options GEOM_PART_BSD # BSD partition scheme +options GEOM_PART_MBR # MBR partition scheme options PSEUDOFS #Pseudo-filesystem framework options COMPAT_43 #Compatible with BSD 4.3 [KEEP THIS!] -options SCSI_DELAY=5000 #Delay (in ms) before probing SCSI options KTRACE #ktrace(1) support options SYSVSHM #SYSV-style shared memory options SYSVMSG #SYSV-style message queues options SYSVSEM #SYSV-style semaphores options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions options KBD_INSTALL_CDEV # install a CDEV entry in /dev -options ROOTDEVNAME=\"ufs:da0s1a\" options VFP # vfp/neon +options PLATFORM options PREEMPTION -options PLATFORM -device bpf -device loop +device loop +device snp + +# NAND for rootfs +# device nand # Ethernet -device ether -device mii -device mii_bitbang -device smc -device smcphy +device ether +device mii +device mii_bitbang +device smc +device smcphy # Serial -device uart -device pty +device uart +device pty # NOTE: serial console is disabled if syscons enabled # Comment following lines for headless setup -device sc -device kbdmux -options SC_DFLT_FONT # compile font in -makeoptions SC_DFLT_FONT=cp437 - +device sc +device kbdmux +options SC_DFLT_FONT # compile font in +makeoptions SC_DFLT_FONT=cp437 + +options STACK +makeoptions WITH_CTF=1 +options DDB_CTF options KDB +options KDB_TRACE options DDB #Enable the kernel debugger -options VERBOSE_SYSINIT -options DIAGNOSTIC -#options INVARIANTS #Enable calls of extra sanity checking -#options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS +options VERBOSE_SYSINIT +options DIAGNOSTIC +options DEBUG +options INVARIANTS #Enable calls of extra sanity checking +options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS +options KLD_DEBUG + +options MUTEX_NOINLINE +options RWLOCK_NOINLINE +options NO_SWAPPING +#options WITNESS +#options WITNESS_SKIPSPIN -device md -device random # Entropy device +device md +device random # Entropy device # Flattened Device Tree -options FDT -options FDT_DTB_STATIC -makeoptions FDT_DTS_FILE=goldfish.dts - -#options MD_ROOT -#options MD_ROOT_SIZE=5120 -#makeoptions MFS_IMAGE=/root/handhelds/myroot.img -#options ROOTDEVNAME=\"/dev/md0\" +options FDT +options FDT_DTB_STATIC +makeoptions FDT_DTS_FILE=goldfish.dts + +options MD_ROOT +options MD_ROOT_SIZE=5120 +makeoptions MFS_IMAGE=/root/handhelds/myroot.img +options ROOTDEVNAME=\"/dev/md0\" #boot from NFS -#options NFSCL -#options NFSCLIENT -#options NFS_ROOT -#options BOOTP_COMPAT -#options BOOTP -#options BOOTP_NFSV3 -#options BOOTP_WIRED_TO=smc0 -#options ROOTDEVNAME=\"nfs:192.168.1.51:/srv/nfs3/bsd/\" +#options NFSCL +#options NFSCLIENT +#options NFS_ROOT +#options BOOTP_COMPAT +#options BOOTP +#options BOOTP_NFSV3 +#options BOOTP_WIRED_TO=smc0 +#options ROOTDEVNAME=\"nfs:192.168.1.51:/srv/nfs3/bsd/\" Modified: soc2014/astarasikov/head/sys/arm/goldfish/files.goldfish ============================================================================== --- soc2014/astarasikov/head/sys/arm/goldfish/files.goldfish Wed Aug 6 01:38:02 2014 (r271978) +++ soc2014/astarasikov/head/sys/arm/goldfish/files.goldfish Wed Aug 6 01:39:24 2014 (r271979) @@ -1,16 +1,16 @@ arm/arm/bus_space_asm_generic.S standard arm/arm/bus_space_generic.c standard arm/arm/bus_space-v6.c standard -arm/arm/cpufunc_asm_armv5.S standard + arm/arm/cpufunc_asm_arm11.S standard +arm/arm/cpufunc_asm_armv6.S standard arm/arm/cpufunc_asm_armv7.S standard kern/kern_clocksource.c standard -arm/goldfish/goldfish_fb.c optional sc +arm/goldfish/goldfish_fb.c optional sc arm/goldfish/goldfish_machdep.c standard arm/goldfish/goldfish_mmc.c standard -arm/goldfish/goldfish_nand.c standard arm/goldfish/goldfish_pic.c standard arm/goldfish/goldfish_pdev.c standard arm/goldfish/goldfish_timer.c standard Modified: soc2014/astarasikov/head/sys/arm/goldfish/goldfish_mmc.c ============================================================================== --- soc2014/astarasikov/head/sys/arm/goldfish/goldfish_mmc.c Wed Aug 6 01:38:02 2014 (r271978) +++ soc2014/astarasikov/head/sys/arm/goldfish/goldfish_mmc.c Wed Aug 6 01:39:24 2014 (r271979) @@ -67,7 +67,7 @@ goldfish_mmc_probe(device_t dev) { - if (!ofw_bus_is_compatible(dev, "arm,goldfish-mmc")) + if (1 || !ofw_bus_is_compatible(dev, "arm,goldfish-mmc")) return (ENXIO); device_set_desc(dev, "Goldfish MMC"); Modified: soc2014/astarasikov/head/sys/arm/goldfish/goldfish_nand.c ============================================================================== --- soc2014/astarasikov/head/sys/arm/goldfish/goldfish_nand.c Wed Aug 6 01:38:02 2014 (r271978) +++ soc2014/astarasikov/head/sys/arm/goldfish/goldfish_nand.c Wed Aug 6 01:39:24 2014 (r271979) @@ -45,90 +45,199 @@ #include <dev/ofw/ofw_bus.h> #include <dev/ofw/ofw_bus_subr.h> +#include <dev/nand/nand.h> +#include <dev/nand/nandbus.h> +#include "nfc_if.h" + +enum goldfish_nand_cmd { + GOLGDFISH_NAND_CMD_GET_DEV_NAME = 0, + GOLGDFISH_NAND_CMD_READ = 1, + GOLGDFISH_NAND_CMD_WRITE = 2, + GOLGDFISH_NAND_CMD_ERASE = 3, + GOLGDFISH_NAND_CMD_BLOCK_IS_BAD = 4, + GOLGDFISH_NAND_CMD_BLOCK_MARK_BAD = 5, +}; + +enum goldfish_nand_reg { + GOLGDFISH_NAND_VERSION = 0x00, + GOLGDFISH_NAND_NUM_DEV = 0x04, + GOLGDFISH_NAND_DEV = 0x08, + + GOLGDFISH_NAND_DEV_FLAGS = 0x10, + GOLGDFISH_NAND_DEV_NAME_LEN = 0x14, + GOLGDFISH_NAND_DEV_PAGE_SIZE = 0x18, + GOLGDFISH_NAND_DEV_EXTRA_SIZE = 0x1c, + GOLGDFISH_NAND_DEV_ERASE_SIZE = 0x20, + GOLGDFISH_NAND_DEV_SIZE_LOW = 0x28, + GOLGDFISH_NAND_DEV_SIZE_HIGH = 0x2c, + + GOLGDFISH_NAND_RESULT = 0x40, + GOLGDFISH_NAND_COMMAND = 0x44, + GOLGDFISH_NAND_DATA = 0x48, + GOLGDFISH_NAND_TRANSFER_SIZE = 0x4c, + GOLGDFISH_NAND_ADDR_LOW = 0x50, + GOLGDFISH_NAND_ADDR_HIGH = 0x54, +}; + +enum goldfish_nand_constants { + GOLGDFISH_NAND_DEV_FLAG_RO = 0x1, + GOLGDFISH_NAND_VERSION_CURRENT = 0x1, +}; + struct goldfish_nand_softc { - struct resource * li_res; - bus_space_tag_t li_bst; - bus_space_handle_t li_bsh; - struct resource* irq_res; - void* intr_hl; -}; - -static int goldfish_nand_probe(device_t); -static int goldfish_nand_attach(device_t); - -static struct goldfish_nand_softc *nand_softc = NULL; - -#define nand_read_4(reg) \ - bus_space_read_4(nand_softc->li_bst, nand_softc->li_bsh, reg) -#define nand_write_4(reg, val) \ - bus_space_write_4(nand_softc->li_bst, nand_softc->li_bsh, reg, val) + struct nand_softc nand_dev; + bus_space_handle_t sc_handle; + bus_space_tag_t sc_tag; + struct resource *res; + int rid; +}; + +#define intc_read_4(reg) \ + bus_space_read_4(intc_softc->li_bst, intc_softc->li_bsh, reg) +#define intc_write_4(reg, val) \ + bus_space_write_4(intc_softc->li_bst, intc_softc->li_bsh, reg, val) + +static int goldfish_nand_attach(device_t); +static int goldfish_nand_probe(device_t); +static int goldfish_nand_send_command(device_t, uint8_t); +static int goldfish_nand_send_address(device_t, uint8_t); +static uint8_t goldfish_nand_read_byte(device_t); +static void goldfish_nand_read_buf(device_t, void *, uint32_t); +static void goldfish_nand_write_buf(device_t, void *, uint32_t); +static int goldfish_nand_select_cs(device_t, uint8_t); +static int goldfish_nand_read_rnb(device_t); + +static device_method_t goldfish_nand_methods[] = { + DEVMETHOD(device_probe, goldfish_nand_probe), + DEVMETHOD(device_attach, goldfish_nand_attach), + + DEVMETHOD(nfc_send_command, goldfish_nand_send_command), + DEVMETHOD(nfc_send_address, goldfish_nand_send_address), + DEVMETHOD(nfc_read_byte, goldfish_nand_read_byte), + DEVMETHOD(nfc_read_buf, goldfish_nand_read_buf), + DEVMETHOD(nfc_write_buf, goldfish_nand_write_buf), + DEVMETHOD(nfc_select_cs, goldfish_nand_select_cs), + DEVMETHOD(nfc_read_rnb, goldfish_nand_read_rnb), + + { 0, 0 }, +}; + +static driver_t goldfish_nand_driver = { + "nand", + goldfish_nand_methods, + sizeof(struct goldfish_nand_softc), +}; + +static devclass_t goldfish_nand_devclass; +DRIVER_MODULE(goldfish_nand, localbus, goldfish_nand_driver, goldfish_nand_devclass, 0, 0); + +static uint32_t +goldfish_nand_mmio_cmd(device_t dev, enum goldfish_nand_cmd cmd, + uint64_t addr, uint32_t length, void *data) +{ + struct goldfish_nand_softc *sc; + uint32_t ret; + sc = device_get_softc(dev); + + //XXX: lock + + bus_space_write_4(sc->sc_tag, sc->sc_handle, GOLGDFISH_NAND_DEV, 0); //FIXME: multiple devices? + bus_space_write_4(sc->sc_tag, sc->sc_handle, GOLGDFISH_NAND_ADDR_HIGH, + (uint32_t)(addr >> 32)); + bus_space_write_4(sc->sc_tag, sc->sc_handle, GOLGDFISH_NAND_ADDR_LOW, + (uint32_t)addr); + bus_space_write_4(sc->sc_tag, sc->sc_handle, GOLGDFISH_NAND_TRANSFER_SIZE, length); + bus_space_write_4(sc->sc_tag, sc->sc_handle, GOLGDFISH_NAND_DATA, (uint32_t)data); + bus_space_write_4(sc->sc_tag, sc->sc_handle, GOLGDFISH_NAND_COMMAND, (uint32_t)cmd); + ret = bus_space_read_4(sc->sc_tag, sc->sc_handle, GOLGDFISH_NAND_RESULT); + + //XXX: unlock + return ret; +} static int goldfish_nand_probe(device_t dev) { - - if (!ofw_bus_is_compatible(dev, "arm,goldfish-nand")) + //if (!ofw_bus_is_compatible(dev, "arm,goldfish-nand")) return (ENXIO); - device_set_desc(dev, "Goldfish NAND"); + device_set_desc(dev, "Goldfish NAND controller"); return (BUS_PROBE_DEFAULT); } static int -goldfish_nand_intr(void *arg) +goldfish_nand_attach(device_t dev) { - printf("%s: irq\n", __func__); - return (FILTER_HANDLED); + struct goldfish_nand_softc *sc; + int err; + uint32_t num_dev = 0; + uint32_t version = 0; + + sc = device_get_softc(dev); + sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->rid, + RF_ACTIVE); + if (sc->res == NULL) { + device_printf(dev, "could not allocate resources!\n"); + return (ENXIO); + } + + sc->sc_tag = rman_get_bustag(sc->res); + sc->sc_handle = rman_get_bushandle(sc->res); + + version = bus_space_read_4(sc->sc_tag, sc->sc_handle, GOLGDFISH_NAND_VERSION); + num_dev = bus_space_read_4(sc->sc_tag, sc->sc_handle, GOLGDFISH_NAND_NUM_DEV); + + device_printf(dev, "version %d num_devices=%d\n", version, num_dev); + + nand_init(&sc->nand_dev, dev, NAND_ECC_SOFT, 0, 0, NULL, NULL); + + err = nandbus_create(dev); + + return (err); } static int -goldfish_nand_attach(device_t dev) +goldfish_nand_send_command(device_t dev, uint8_t command) { - struct goldfish_nand_softc *sc = device_get_softc(dev); - int li_rid = 0, irq_rid = 0; - - if (nand_softc) - return (ENXIO); - - sc->li_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &li_rid, RF_ACTIVE); - if (!sc->li_res) - goto fail; - - sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &irq_rid, RF_ACTIVE); - if (!sc->irq_res) - goto fail; - - if (bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC, - goldfish_nand_intr, NULL, sc, &sc->intr_hl) != 0) - goto fail; - - sc->li_bst = rman_get_bustag(sc->li_res); - sc->li_bsh = rman_get_bushandle(sc->li_res); - nand_softc = sc; + return (0); +} +static int +goldfish_nand_send_address(device_t dev, uint8_t addr) +{ return (0); +} -fail: - if (sc->irq_res) - bus_release_resource(dev, SYS_RES_IRQ, irq_rid, sc->irq_res); +static uint8_t +goldfish_nand_read_byte(device_t dev) +{ + return (0); +} - if (sc->li_res) - bus_release_resource(dev, SYS_RES_MEMORY, li_rid, sc->li_res); +static void +goldfish_nand_read_buf(device_t dev, void* buf, uint32_t len) +{ +} - return (ENXIO); +static void +goldfish_nand_write_buf(device_t dev, void* buf, uint32_t len) +{ } -static device_method_t goldfish_nand_methods[] = { - DEVMETHOD(device_probe, goldfish_nand_probe), - DEVMETHOD(device_attach, goldfish_nand_attach), - { 0, 0 } -}; +static int +goldfish_nand_select_cs(device_t dev, uint8_t cs) +{ -static driver_t goldfish_nand_driver = { - "nand", - goldfish_nand_methods, - sizeof(struct goldfish_nand_softc), -}; + if (cs > 0) + return (ENODEV); -static devclass_t goldfish_nand_devclass; -DRIVER_MODULE(nand, simplebus, goldfish_nand_driver, goldfish_nand_devclass, 0, 0); + return (0); +} + +static int +goldfish_nand_read_rnb(device_t dev) +{ + + /* no-op */ + return (0); /* ready */ +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201408060139.s761dPQD016450>