Module Name: src Committed By: jmcneill Date: Sat Aug 8 14:01:44 UTC 2015
Modified Files: src/sys/arch/arm/amlogic: amlogic_io.c amlogic_sdhc.c amlogic_sdio.c src/sys/arch/evbarm/conf: ODROID-C1 Log Message: We have two SD controllers with different capabilities. Use the fast "SDHC" controller for the card that the bootloader marked as the boot device, and the slower "SDIO" controller for the other card if present. The controller to slot mappings can be wired down in the kernel config with the "port" locator if necessary. To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/amlogic/amlogic_io.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/arm/amlogic/amlogic_sdhc.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/amlogic/amlogic_sdio.c cvs rdiff -u -r1.19 -r1.20 src/sys/arch/evbarm/conf/ODROID-C1 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/amlogic/amlogic_io.c diff -u src/sys/arch/arm/amlogic/amlogic_io.c:1.11 src/sys/arch/arm/amlogic/amlogic_io.c:1.12 --- src/sys/arch/arm/amlogic/amlogic_io.c:1.11 Sat Apr 25 14:41:33 2015 +++ src/sys/arch/arm/amlogic/amlogic_io.c Sat Aug 8 14:01:44 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: amlogic_io.c,v 1.11 2015/04/25 14:41:33 jmcneill Exp $ */ +/* $NetBSD: amlogic_io.c,v 1.12 2015/08/08 14:01:44 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -29,7 +29,7 @@ #include "opt_amlogic.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amlogic_io.c,v 1.11 2015/04/25 14:41:33 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amlogic_io.c,v 1.12 2015/08/08 14:01:44 jmcneill Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -76,13 +76,9 @@ static const struct amlogic_locators aml { "awge", AMLOGIC_GMAC_OFFSET, AMLOGIC_GMAC_SIZE, NOPORT, AMLOGIC_INTR_GMAC }, { "amlogicsdio", - AMLOGIC_SDIO_OFFSET, AMLOGIC_SDIO_SIZE, 1, AMLOGIC_INTR_SDIO }, - { "amlogicsdio", - AMLOGIC_SDIO_OFFSET, AMLOGIC_SDIO_SIZE, 2, AMLOGIC_INTR_SDIO }, - { "amlogicsdhc", - AMLOGIC_SDHC_OFFSET, AMLOGIC_SDHC_SIZE, 1, AMLOGIC_INTR_SDHC }, + AMLOGIC_SDIO_OFFSET, AMLOGIC_SDIO_SIZE, NOPORT, AMLOGIC_INTR_SDIO }, { "amlogicsdhc", - AMLOGIC_SDHC_OFFSET, AMLOGIC_SDHC_SIZE, 2, AMLOGIC_INTR_SDHC }, + AMLOGIC_SDHC_OFFSET, AMLOGIC_SDHC_SIZE, NOPORT, AMLOGIC_INTR_SDHC }, { "amlogicrtc", AMLOGIC_RTC_OFFSET, AMLOGIC_RTC_SIZE, NOPORT, AMLOGIC_INTR_RTC }, }; Index: src/sys/arch/arm/amlogic/amlogic_sdhc.c diff -u src/sys/arch/arm/amlogic/amlogic_sdhc.c:1.8 src/sys/arch/arm/amlogic/amlogic_sdhc.c:1.9 --- src/sys/arch/arm/amlogic/amlogic_sdhc.c:1.8 Sat Aug 8 10:51:50 2015 +++ src/sys/arch/arm/amlogic/amlogic_sdhc.c Sat Aug 8 14:01:44 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: amlogic_sdhc.c,v 1.8 2015/08/08 10:51:50 jmcneill Exp $ */ +/* $NetBSD: amlogic_sdhc.c,v 1.9 2015/08/08 14:01:44 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -29,7 +29,7 @@ #include "locators.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amlogic_sdhc.c,v 1.8 2015/08/08 10:51:50 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amlogic_sdhc.c,v 1.9 2015/08/08 14:01:44 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -69,7 +69,7 @@ struct amlogic_sdhc_softc { bus_dma_segment_t sc_segs[1]; void *sc_bbuf; - u_int sc_port; + int sc_port; int sc_signal_voltage; }; @@ -121,12 +121,6 @@ static struct sdmmc_chip_functions amlog static int amlogic_sdhc_match(device_t parent, cfdata_t cf, void *aux) { - struct amlogicio_attach_args * const aio = aux; - const struct amlogic_locators * const loc = &aio->aio_loc; - - if (loc->loc_port == AMLOGICIOCF_PORT_DEFAULT) - return 0; - return 1; } @@ -136,6 +130,8 @@ amlogic_sdhc_attach(device_t parent, dev struct amlogic_sdhc_softc * const sc = device_private(self); struct amlogicio_attach_args * const aio = aux; const struct amlogic_locators * const loc = &aio->aio_loc; + prop_dictionary_t cfg = device_properties(self); + uint32_t boot_id; sc->sc_dev = self; sc->sc_bst = aio->aio_core_bst; @@ -147,14 +143,27 @@ amlogic_sdhc_attach(device_t parent, dev sc->sc_port = loc->loc_port; sc->sc_signal_voltage = SDMMC_SIGNAL_VOLTAGE_330; + if (sc->sc_port == AMLOGICIOCF_PORT_DEFAULT) { + if (!prop_dictionary_get_uint32(cfg, "boot_id", &boot_id)) { + aprint_error(": no port selected\n"); + return; + } + /* Booted device goes on SDHC controller */ + if (boot_id == 0) { + sc->sc_port = AMLOGIC_SDHC_PORT_C; /* eMMC */ + } else { + sc->sc_port = AMLOGIC_SDHC_PORT_B; /* SD card */ + } + } + amlogic_sdhc_init(); - if (amlogic_sdhc_select_port(loc->loc_port) != 0) { - aprint_error(": couldn't select port %d\n", loc->loc_port); + if (amlogic_sdhc_select_port(sc->sc_port) != 0) { + aprint_error(": couldn't select port %d\n", sc->sc_port); return; } aprint_naive("\n"); - aprint_normal(": SDHC controller\n"); + aprint_normal(": SDHC controller (port %c)\n", sc->sc_port + 'A'); sc->sc_ih = intr_establish(loc->loc_intr, IPL_BIO, IST_EDGE, amlogic_sdhc_intr, sc); Index: src/sys/arch/arm/amlogic/amlogic_sdio.c diff -u src/sys/arch/arm/amlogic/amlogic_sdio.c:1.3 src/sys/arch/arm/amlogic/amlogic_sdio.c:1.4 --- src/sys/arch/arm/amlogic/amlogic_sdio.c:1.3 Sat Aug 8 10:55:14 2015 +++ src/sys/arch/arm/amlogic/amlogic_sdio.c Sat Aug 8 14:01:44 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: amlogic_sdio.c,v 1.3 2015/08/08 10:55:14 jmcneill Exp $ */ +/* $NetBSD: amlogic_sdio.c,v 1.4 2015/08/08 14:01:44 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -29,7 +29,7 @@ #include "locators.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amlogic_sdio.c,v 1.3 2015/08/08 10:55:14 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amlogic_sdio.c,v 1.4 2015/08/08 14:01:44 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -61,7 +61,7 @@ struct amlogic_sdio_softc { uint32_t sc_bus_freq; u_int sc_cur_width; - u_int sc_cur_port; + int sc_cur_port; device_t sc_sdmmc_dev; kmutex_t sc_intr_lock; @@ -119,12 +119,6 @@ static struct sdmmc_chip_functions amlog static int amlogic_sdio_match(device_t parent, cfdata_t cf, void *aux) { - struct amlogicio_attach_args * const aio = aux; - const struct amlogic_locators * const loc = &aio->aio_loc; - - if (loc->loc_port == AMLOGICIOCF_PORT_DEFAULT) - return 0; - return 1; } @@ -134,6 +128,8 @@ amlogic_sdio_attach(device_t parent, dev struct amlogic_sdio_softc * const sc = device_private(self); struct amlogicio_attach_args * const aio = aux; const struct amlogic_locators * const loc = &aio->aio_loc; + prop_dictionary_t cfg = device_properties(self); + uint32_t boot_id; sc->sc_dev = self; sc->sc_bst = aio->aio_core_bst; @@ -144,14 +140,27 @@ amlogic_sdio_attach(device_t parent, dev mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_BIO); cv_init(&sc->sc_intr_cv, "sdiointr"); + if (sc->sc_cur_port == AMLOGICIOCF_PORT_DEFAULT) { + if (!prop_dictionary_get_uint32(cfg, "boot_id", &boot_id)) { + aprint_error(": no port selected\n"); + return; + } + /* Non-booted device goes on SDIO controller */ + if (boot_id == 0) { + sc->sc_cur_port = AMLOGIC_SDIO_PORT_B; /* SD card */ + } else { + sc->sc_cur_port = AMLOGIC_SDIO_PORT_C; /* eMMC */ + } + } + amlogic_sdio_init(); - if (amlogic_sdio_select_port(loc->loc_port) != 0) { - aprint_error(": couldn't select port %d\n", loc->loc_port); + if (amlogic_sdio_select_port(sc->sc_cur_port) != 0) { + aprint_error(": couldn't select port %d\n", sc->sc_cur_port); return; } aprint_naive("\n"); - aprint_normal(": SDIO controller\n"); + aprint_normal(": SDIO controller (port %c)\n", sc->sc_cur_port + 'A'); sc->sc_ih = intr_establish(loc->loc_intr, IPL_BIO, IST_EDGE, amlogic_sdio_intr, sc); Index: src/sys/arch/evbarm/conf/ODROID-C1 diff -u src/sys/arch/evbarm/conf/ODROID-C1:1.19 src/sys/arch/evbarm/conf/ODROID-C1:1.20 --- src/sys/arch/evbarm/conf/ODROID-C1:1.19 Sat Aug 8 10:56:55 2015 +++ src/sys/arch/evbarm/conf/ODROID-C1 Sat Aug 8 14:01:44 2015 @@ -1,5 +1,5 @@ # -# $NetBSD: ODROID-C1,v 1.19 2015/08/08 10:56:55 jmcneill Exp $ +# $NetBSD: ODROID-C1,v 1.20 2015/08/08 14:01:44 jmcneill Exp $ # # Hardkernel ODROID-C1 (Amlogic S805) based SBC (Single Board Computer) # @@ -63,10 +63,12 @@ amlogicrng0 at amlogicio0 amlogicrtc0 at amlogicio0 # SDHC controller -amlogicsdhc0 at amlogicio0 port 1 -sdmmc* at amlogicsdhc? -amlogicsdio0 at amlogicio0 port 2 -sdmmc* at amlogicsdio? +amlogicsdhc0 at amlogicio0 +amlogicsdio0 at amlogicio0 +sdmmc0 at amlogicsdhc0 +sdmmc1 at amlogicsdio0 +ld0 at sdmmc0 +ld1 at sdmmc1 ld* at sdmmc? # Gigabit ethernet