Module Name: src Committed By: hkenken Date: Wed Oct 23 05:20:52 UTC 2019
Modified Files: src/sys/arch/arm/imx/fdt: imx6_sdhc.c src/sys/dev/sdmmc: sdhc.c sdhcreg.h sdhcvar.h sdmmc.c sdmmcchip.h sdmmcvar.h Log Message: Add SDHC flags. + SDHC_FLAG_BROKEN_ADMA2_ZEROLEN Broken ADMA2 Zero length descriptor. Can't 64K Byte data transfer. + SDHC_FLAG_NO_1_8_V Support no 1.8V Supply. Disable UHS-I bus speed mode (SDR50, DDR50, SDR104). To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/imx/fdt/imx6_sdhc.c cvs rdiff -u -r1.103 -r1.104 src/sys/dev/sdmmc/sdhc.c cvs rdiff -u -r1.19 -r1.20 src/sys/dev/sdmmc/sdhcreg.h cvs rdiff -u -r1.30 -r1.31 src/sys/dev/sdmmc/sdhcvar.h cvs rdiff -u -r1.37 -r1.38 src/sys/dev/sdmmc/sdmmc.c cvs rdiff -u -r1.9 -r1.10 src/sys/dev/sdmmc/sdmmcchip.h cvs rdiff -u -r1.31 -r1.32 src/sys/dev/sdmmc/sdmmcvar.h 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/imx/fdt/imx6_sdhc.c diff -u src/sys/arch/arm/imx/fdt/imx6_sdhc.c:1.3 src/sys/arch/arm/imx/fdt/imx6_sdhc.c:1.4 --- src/sys/arch/arm/imx/fdt/imx6_sdhc.c:1.3 Fri Sep 27 02:54:57 2019 +++ src/sys/arch/arm/imx/fdt/imx6_sdhc.c Wed Oct 23 05:20:52 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_sdhc.c,v 1.3 2019/09/27 02:54:57 hkenken Exp $ */ +/* $NetBSD: imx6_sdhc.c,v 1.4 2019/10/23 05:20:52 hkenken Exp $ */ /*- * Copyright (c) 2019 Genetec Corporation. All rights reserved. * Written by Hashimoto Kenichi for Genetec Corporation. @@ -25,7 +25,7 @@ * SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: imx6_sdhc.c,v 1.3 2019/09/27 02:54:57 hkenken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: imx6_sdhc.c,v 1.4 2019/10/23 05:20:52 hkenken Exp $"); #include "opt_fdt.h" @@ -120,10 +120,13 @@ imx6_sdhc_attach(device_t parent, device SDHC_FLAG_32BIT_ACCESS | SDHC_FLAG_USE_ADMA2 | SDHC_FLAG_USDHC | - SDHC_FLAG_NO_BUSY_INTR; + SDHC_FLAG_NO_BUSY_INTR | + SDHC_FLAG_BROKEN_ADMA2_ZEROLEN; if (bus_width == 8) sc->sc_sdhc.sc_flags |= SDHC_FLAG_8BIT_MODE; + if (of_hasprop(faa->faa_phandle, "no-1-8-v")) + sc->sc_sdhc.sc_flags |= SDHC_FLAG_NO_1_8_V; sc->sc_sdhc.sc_host = &sc->sc_host; Index: src/sys/dev/sdmmc/sdhc.c diff -u src/sys/dev/sdmmc/sdhc.c:1.103 src/sys/dev/sdmmc/sdhc.c:1.104 --- src/sys/dev/sdmmc/sdhc.c:1.103 Wed Jul 3 23:10:08 2019 +++ src/sys/dev/sdmmc/sdhc.c Wed Oct 23 05:20:52 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sdhc.c,v 1.103 2019/07/03 23:10:08 jmcneill Exp $ */ +/* $NetBSD: sdhc.c,v 1.104 2019/10/23 05:20:52 hkenken Exp $ */ /* $OpenBSD: sdhc.c,v 1.25 2009/01/13 19:44:20 grange Exp $ */ /* @@ -23,7 +23,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sdhc.c,v 1.103 2019/07/03 23:10:08 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sdhc.c,v 1.104 2019/10/23 05:20:52 hkenken Exp $"); #ifdef _KERNEL_OPT #include "opt_sdmmc.h" @@ -476,21 +476,23 @@ sdhc_host_found(struct sdhc_softc *sc, b SET(hp->ocr, MMC_OCR_HCS); aprint_normal(" HS"); } - if (ISSET(caps2, SDHC_SDR50_SUPP)) { - SET(hp->ocr, MMC_OCR_S18A); - aprint_normal(" SDR50"); - } - if (ISSET(caps2, SDHC_DDR50_SUPP)) { - SET(hp->ocr, MMC_OCR_S18A); - aprint_normal(" DDR50"); - } - if (ISSET(caps2, SDHC_SDR104_SUPP)) { - SET(hp->ocr, MMC_OCR_S18A); - aprint_normal(" SDR104 HS200"); - } - if (ISSET(caps, SDHC_VOLTAGE_SUPP_1_8V)) { - SET(hp->ocr, MMC_OCR_1_65V_1_95V); - aprint_normal(" 1.8V"); + if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_NO_1_8_V)) { + if (ISSET(caps2, SDHC_SDR50_SUPP)) { + SET(hp->ocr, MMC_OCR_S18A); + aprint_normal(" SDR50"); + } + if (ISSET(caps2, SDHC_DDR50_SUPP)) { + SET(hp->ocr, MMC_OCR_S18A); + aprint_normal(" DDR50"); + } + if (ISSET(caps2, SDHC_SDR104_SUPP)) { + SET(hp->ocr, MMC_OCR_S18A); + aprint_normal(" SDR104 HS200"); + } + if (ISSET(caps, SDHC_VOLTAGE_SUPP_1_8V)) { + SET(hp->ocr, MMC_OCR_1_65V_1_95V); + aprint_normal(" 1.8V"); + } } if (ISSET(caps, SDHC_VOLTAGE_SUPP_3_0V)) { SET(hp->ocr, MMC_OCR_2_9V_3_0V | MMC_OCR_3_0V_3_1V); @@ -620,6 +622,10 @@ adma_done: saa.saa_caps |= SMC_CAPS_SINGLE_ONLY; if (ISSET(sc->sc_flags, SDHC_FLAG_POLL_CARD_DET)) saa.saa_caps |= SMC_CAPS_POLL_CARD_DET; + + if (ISSET(sc->sc_flags, SDHC_FLAG_BROKEN_ADMA2_ZEROLEN)) + saa.saa_max_seg = 65535; + hp->sdmmc = config_found(sc->sc_dev, &saa, sdhc_cfprint); return 0; @@ -1818,12 +1824,9 @@ sdhc_start_command(struct sdhc_host *hp, if (ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) { /* mode bits is in MIX_CTRL register on uSDHC */ HWRITE4(hp, SDHC_MIX_CTRL, mode | - (HREAD4(hp, SDHC_MIX_CTRL) & - ~(SDHC_MULTI_BLOCK_MODE | - SDHC_READ_MODE | - SDHC_AUTO_CMD12_ENABLE | - SDHC_BLOCK_COUNT_ENABLE | - SDHC_DMA_ENABLE))); + (HREAD4(hp, SDHC_MIX_CTRL) & ~SDHC_TRANSFER_MODE_MASK)); + if (cmd->c_opcode == MMC_STOP_TRANSMISSION) + command |= SDHC_COMMAND_TYPE_ABORT; HWRITE4(hp, SDHC_TRANSFER_MODE, command << 16); } else { HWRITE4(hp, SDHC_TRANSFER_MODE, mode | (command << 16)); Index: src/sys/dev/sdmmc/sdhcreg.h diff -u src/sys/dev/sdmmc/sdhcreg.h:1.19 src/sys/dev/sdmmc/sdhcreg.h:1.20 --- src/sys/dev/sdmmc/sdhcreg.h:1.19 Fri Jun 23 08:43:59 2017 +++ src/sys/dev/sdmmc/sdhcreg.h Wed Oct 23 05:20:52 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sdhcreg.h,v 1.19 2017/06/23 08:43:59 ryo Exp $ */ +/* $NetBSD: sdhcreg.h,v 1.20 2019/10/23 05:20:52 hkenken Exp $ */ /* $OpenBSD: sdhcreg.h,v 1.4 2006/07/30 17:20:40 fgsch Exp $ */ /* @@ -29,6 +29,7 @@ #define SDHC_BLOCK_COUNT_MAX 512 #define SDHC_ARGUMENT 0x08 #define SDHC_TRANSFER_MODE 0x0c +#define SDHC_TRANSFER_MODE_MASK 0xb7 #define SDHC_MULTI_BLOCK_MODE (1<<5) #define SDHC_READ_MODE (1<<4) #define SDHC_AUTO_CMD12_ENABLE (1<<2) @@ -228,6 +229,7 @@ #define SDHC_DMA_CTL 0x40c /* eSDHC */ #define SDHC_DMA_SNOOP 0x40 #define SDHC_MIX_CTRL 0x48 /* uSDHC */ +#define SDHC_USDHC_NIBBLE_POS (1<<6) #define SDHC_USDHC_DDR_EN (1<<3) #define SDHC_VEND_SPEC 0xc0 /* uSDHC */ #define SDHC_VEND_SPEC_MBO (1<<29) Index: src/sys/dev/sdmmc/sdhcvar.h diff -u src/sys/dev/sdmmc/sdhcvar.h:1.30 src/sys/dev/sdmmc/sdhcvar.h:1.31 --- src/sys/dev/sdmmc/sdhcvar.h:1.30 Wed Mar 13 12:16:49 2019 +++ src/sys/dev/sdmmc/sdhcvar.h Wed Oct 23 05:20:52 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sdhcvar.h,v 1.30 2019/03/13 12:16:49 jmcneill Exp $ */ +/* $NetBSD: sdhcvar.h,v 1.31 2019/10/23 05:20:52 hkenken Exp $ */ /* $OpenBSD: sdhcvar.h,v 1.3 2007/09/06 08:01:01 jsg Exp $ */ /* @@ -62,6 +62,11 @@ struct sdhc_softc { #define SDHC_FLAG_NO_AUTO_STOP 0x01000000 /* No auto CMD12 */ #define SDHC_FLAG_NO_BUSY_INTR 0x02000000 /* No intr when RESP_BUSY */ #define SDHC_FLAG_STOP_WITH_TC 0x04000000 /* CMD12 can set xfer complete w/o SCF_RSP_BSY */ +#define SDHC_FLAG_BROKEN_ADMA2_ZEROLEN 0x08000000 /* + * Broken ADMA2 zero length descriptor + * Can't 64K Byte data transfer + */ +#define SDHC_FLAG_NO_1_8_V 0x10000000 /* No 1.8V supply */ uint32_t sc_clkbase; int sc_clkmsk; /* Mask for SDCLK */ Index: src/sys/dev/sdmmc/sdmmc.c diff -u src/sys/dev/sdmmc/sdmmc.c:1.37 src/sys/dev/sdmmc/sdmmc.c:1.38 --- src/sys/dev/sdmmc/sdmmc.c:1.37 Sun Sep 1 05:45:42 2019 +++ src/sys/dev/sdmmc/sdmmc.c Wed Oct 23 05:20:52 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sdmmc.c,v 1.37 2019/09/01 05:45:42 mlelstv Exp $ */ +/* $NetBSD: sdmmc.c,v 1.38 2019/10/23 05:20:52 hkenken Exp $ */ /* $OpenBSD: sdmmc.c,v 1.18 2009/01/09 10:58:38 jsg Exp $ */ /* @@ -49,7 +49,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sdmmc.c,v 1.37 2019/09/01 05:45:42 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sdmmc.c,v 1.38 2019/10/23 05:20:52 hkenken Exp $"); #ifdef _KERNEL_OPT #include "opt_sdmmc.h" @@ -130,10 +130,11 @@ sdmmc_attach(device_t parent, device_t s sc->sc_busclk = sc->sc_clkmax; sc->sc_buswidth = 1; sc->sc_caps = saa->saa_caps; + sc->sc_max_seg = saa->saa_max_seg ? saa->saa_max_seg : MAXPHYS; if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { error = bus_dmamap_create(sc->sc_dmat, MAXPHYS, SDMMC_MAXNSEGS, - MAXPHYS, 0, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, &sc->sc_dmap); + sc->sc_max_seg, 0, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, &sc->sc_dmap); if (error) { aprint_error_dev(sc->sc_dev, "couldn't create dma map. (error=%d)\n", error); Index: src/sys/dev/sdmmc/sdmmcchip.h diff -u src/sys/dev/sdmmc/sdmmcchip.h:1.9 src/sys/dev/sdmmc/sdmmcchip.h:1.10 --- src/sys/dev/sdmmc/sdmmcchip.h:1.9 Fri Feb 17 10:51:48 2017 +++ src/sys/dev/sdmmc/sdmmcchip.h Wed Oct 23 05:20:52 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sdmmcchip.h,v 1.9 2017/02/17 10:51:48 nonaka Exp $ */ +/* $NetBSD: sdmmcchip.h,v 1.10 2019/10/23 05:20:52 hkenken Exp $ */ /* $OpenBSD: sdmmcchip.h,v 1.3 2007/05/31 10:09:01 uwe Exp $ */ /* @@ -137,6 +137,7 @@ struct sdmmcbus_attach_args { u_int saa_clkmin; u_int saa_clkmax; uint32_t saa_caps; /* see sdmmc_softc.sc_caps */ + uint32_t saa_max_seg; }; void sdmmc_needs_discover(device_t); Index: src/sys/dev/sdmmc/sdmmcvar.h diff -u src/sys/dev/sdmmc/sdmmcvar.h:1.31 src/sys/dev/sdmmc/sdmmcvar.h:1.32 --- src/sys/dev/sdmmc/sdmmcvar.h:1.31 Sun Sep 1 05:45:42 2019 +++ src/sys/dev/sdmmc/sdmmcvar.h Wed Oct 23 05:20:52 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sdmmcvar.h,v 1.31 2019/09/01 05:45:42 mlelstv Exp $ */ +/* $NetBSD: sdmmcvar.h,v 1.32 2019/10/23 05:20:52 hkenken Exp $ */ /* $OpenBSD: sdmmcvar.h,v 1.13 2009/01/09 10:55:22 jsg Exp $ */ /* @@ -291,6 +291,8 @@ struct sdmmc_softc { struct evcnt sc_ev_xfer_aligned[8]; /* aligned xfer counts */ struct evcnt sc_ev_xfer_unaligned; /* unaligned xfer count */ struct evcnt sc_ev_xfer_error; /* error xfer count */ + + uint32_t sc_max_seg; /* maximum segment size */ }; /*