1 1.122 jmcneill /* $NetBSD: sdhc.c,v 1.122 2025/09/02 22:22:14 jmcneill Exp $ */ 2 1.1 nonaka /* $OpenBSD: sdhc.c,v 1.25 2009/01/13 19:44:20 grange Exp $ */ 3 1.1 nonaka 4 1.1 nonaka /* 5 1.1 nonaka * Copyright (c) 2006 Uwe Stuehler <uwe (at) openbsd.org> 6 1.1 nonaka * 7 1.1 nonaka * Permission to use, copy, modify, and distribute this software for any 8 1.1 nonaka * purpose with or without fee is hereby granted, provided that the above 9 1.1 nonaka * copyright notice and this permission notice appear in all copies. 10 1.1 nonaka * 11 1.1 nonaka * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 1.1 nonaka * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 1.1 nonaka * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 1.1 nonaka * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 1.1 nonaka * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 1.1 nonaka * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 1.1 nonaka * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 1.1 nonaka */ 19 1.1 nonaka 20 1.1 nonaka /* 21 1.1 nonaka * SD Host Controller driver based on the SD Host Controller Standard 22 1.1 nonaka * Simplified Specification Version 1.00 (www.sdcard.com). 23 1.1 nonaka */ 24 1.1 nonaka 25 1.1 nonaka #include <sys/cdefs.h> 26 1.122 jmcneill __KERNEL_RCSID(0, "$NetBSD: sdhc.c,v 1.122 2025/09/02 22:22:14 jmcneill Exp $"); 27 1.10 nonaka 28 1.10 nonaka #ifdef _KERNEL_OPT 29 1.10 nonaka #include "opt_sdmmc.h" 30 1.10 nonaka #endif 31 1.1 nonaka 32 1.1 nonaka #include <sys/param.h> 33 1.1 nonaka #include <sys/device.h> 34 1.1 nonaka #include <sys/kernel.h> 35 1.1 nonaka #include <sys/malloc.h> 36 1.1 nonaka #include <sys/systm.h> 37 1.1 nonaka #include <sys/mutex.h> 38 1.1 nonaka #include <sys/condvar.h> 39 1.80 jmcneill #include <sys/atomic.h> 40 1.1 nonaka 41 1.1 nonaka #include <dev/sdmmc/sdhcreg.h> 42 1.1 nonaka #include <dev/sdmmc/sdhcvar.h> 43 1.1 nonaka #include <dev/sdmmc/sdmmcchip.h> 44 1.1 nonaka #include <dev/sdmmc/sdmmcreg.h> 45 1.1 nonaka #include <dev/sdmmc/sdmmcvar.h> 46 1.1 nonaka 47 1.1 nonaka #ifdef SDHC_DEBUG 48 1.1 nonaka int sdhcdebug = 1; 49 1.1 nonaka #define DPRINTF(n,s) do { if ((n) <= sdhcdebug) printf s; } while (0) 50 1.1 nonaka void sdhc_dump_regs(struct sdhc_host *); 51 1.1 nonaka #else 52 1.1 nonaka #define DPRINTF(n,s) do {} while (0) 53 1.1 nonaka #endif 54 1.1 nonaka 55 1.1 nonaka #define SDHC_COMMAND_TIMEOUT hz 56 1.1 nonaka #define SDHC_BUFFER_TIMEOUT hz 57 1.1 nonaka #define SDHC_TRANSFER_TIMEOUT hz 58 1.61 jmcneill #define SDHC_DMA_TIMEOUT (hz*3) 59 1.79 jmcneill #define SDHC_TUNING_TIMEOUT hz 60 1.1 nonaka 61 1.1 nonaka struct sdhc_host { 62 1.1 nonaka struct sdhc_softc *sc; /* host controller device */ 63 1.1 nonaka 64 1.1 nonaka bus_space_tag_t iot; /* host register set tag */ 65 1.1 nonaka bus_space_handle_t ioh; /* host register set handle */ 66 1.36 jakllsch bus_size_t ios; /* host register space size */ 67 1.1 nonaka bus_dma_tag_t dmat; /* host DMA tag */ 68 1.1 nonaka 69 1.1 nonaka device_t sdmmc; /* generic SD/MMC device */ 70 1.1 nonaka 71 1.1 nonaka u_int clkbase; /* base clock frequency in KHz */ 72 1.1 nonaka int maxblklen; /* maximum block length */ 73 1.1 nonaka uint32_t ocr; /* OCR value from capabilities */ 74 1.1 nonaka 75 1.1 nonaka uint8_t regs[14]; /* host controller state */ 76 1.1 nonaka 77 1.1 nonaka uint16_t intr_status; /* soft interrupt status */ 78 1.1 nonaka uint16_t intr_error_status; /* soft error status */ 79 1.65 jmcneill kmutex_t intr_lock; 80 1.114 mrg kmutex_t bus_clock_lock; 81 1.65 jmcneill kcondvar_t intr_cv; 82 1.1 nonaka 83 1.80 jmcneill callout_t tuning_timer; 84 1.80 jmcneill int tuning_timing; 85 1.80 jmcneill u_int tuning_timer_count; 86 1.80 jmcneill u_int tuning_timer_pending; 87 1.80 jmcneill 88 1.12 nonaka int specver; /* spec. version */ 89 1.12 nonaka 90 1.1 nonaka uint32_t flags; /* flags for this host */ 91 1.1 nonaka #define SHF_USE_DMA 0x0001 92 1.1 nonaka #define SHF_USE_4BIT_MODE 0x0002 93 1.11 matt #define SHF_USE_8BIT_MODE 0x0004 94 1.55 bouyer #define SHF_MODE_DMAEN 0x0008 /* needs SDHC_DMA_ENABLE in mode */ 95 1.63 jmcneill #define SHF_USE_ADMA2_32 0x0010 96 1.63 jmcneill #define SHF_USE_ADMA2_64 0x0020 97 1.63 jmcneill #define SHF_USE_ADMA2_MASK 0x0030 98 1.63 jmcneill 99 1.63 jmcneill bus_dmamap_t adma_map; 100 1.63 jmcneill bus_dma_segment_t adma_segs[1]; 101 1.63 jmcneill void *adma2; 102 1.105 mlelstv 103 1.105 mlelstv uint8_t vdd; /* last vdd setting */ 104 1.1 nonaka }; 105 1.1 nonaka 106 1.1 nonaka #define HDEVNAME(hp) (device_xname((hp)->sc->sc_dev)) 107 1.1 nonaka 108 1.11 matt static uint8_t 109 1.11 matt hread1(struct sdhc_host *hp, bus_size_t reg) 110 1.11 matt { 111 1.12 nonaka 112 1.11 matt if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_32BIT_ACCESS)) 113 1.11 matt return bus_space_read_1(hp->iot, hp->ioh, reg); 114 1.11 matt return bus_space_read_4(hp->iot, hp->ioh, reg & -4) >> (8 * (reg & 3)); 115 1.11 matt } 116 1.11 matt 117 1.11 matt static uint16_t 118 1.11 matt hread2(struct sdhc_host *hp, bus_size_t reg) 119 1.11 matt { 120 1.12 nonaka 121 1.11 matt if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_32BIT_ACCESS)) 122 1.11 matt return bus_space_read_2(hp->iot, hp->ioh, reg); 123 1.11 matt return bus_space_read_4(hp->iot, hp->ioh, reg & -4) >> (8 * (reg & 2)); 124 1.11 matt } 125 1.11 matt 126 1.11 matt #define HREAD1(hp, reg) hread1(hp, reg) 127 1.11 matt #define HREAD2(hp, reg) hread2(hp, reg) 128 1.11 matt #define HREAD4(hp, reg) \ 129 1.1 nonaka (bus_space_read_4((hp)->iot, (hp)->ioh, (reg))) 130 1.11 matt 131 1.11 matt 132 1.11 matt static void 133 1.11 matt hwrite1(struct sdhc_host *hp, bus_size_t o, uint8_t val) 134 1.11 matt { 135 1.12 nonaka 136 1.11 matt if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_32BIT_ACCESS)) { 137 1.11 matt bus_space_write_1(hp->iot, hp->ioh, o, val); 138 1.11 matt } else { 139 1.11 matt const size_t shift = 8 * (o & 3); 140 1.11 matt o &= -4; 141 1.11 matt uint32_t tmp = bus_space_read_4(hp->iot, hp->ioh, o); 142 1.110 msaitoh tmp = (val << shift) | (tmp & ~(0xffU << shift)); 143 1.11 matt bus_space_write_4(hp->iot, hp->ioh, o, tmp); 144 1.11 matt } 145 1.11 matt } 146 1.11 matt 147 1.11 matt static void 148 1.11 matt hwrite2(struct sdhc_host *hp, bus_size_t o, uint16_t val) 149 1.11 matt { 150 1.12 nonaka 151 1.11 matt if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_32BIT_ACCESS)) { 152 1.11 matt bus_space_write_2(hp->iot, hp->ioh, o, val); 153 1.11 matt } else { 154 1.11 matt const size_t shift = 8 * (o & 2); 155 1.11 matt o &= -4; 156 1.11 matt uint32_t tmp = bus_space_read_4(hp->iot, hp->ioh, o); 157 1.110 msaitoh tmp = (val << shift) | (tmp & ~(0xffffU << shift)); 158 1.11 matt bus_space_write_4(hp->iot, hp->ioh, o, tmp); 159 1.11 matt } 160 1.11 matt } 161 1.11 matt 162 1.105 mlelstv static void 163 1.105 mlelstv hwrite4(struct sdhc_host *hp, bus_size_t o, uint32_t val) 164 1.105 mlelstv { 165 1.105 mlelstv 166 1.105 mlelstv bus_space_write_4(hp->iot, hp->ioh, o, val); 167 1.105 mlelstv } 168 1.105 mlelstv 169 1.11 matt #define HWRITE1(hp, reg, val) hwrite1(hp, reg, val) 170 1.11 matt #define HWRITE2(hp, reg, val) hwrite2(hp, reg, val) 171 1.105 mlelstv #define HWRITE4(hp, reg, val) hwrite4(hp, reg, val) 172 1.11 matt 173 1.1 nonaka #define HCLR1(hp, reg, bits) \ 174 1.106 joerg do if ((bits) != 0) HWRITE1((hp), (reg), HREAD1((hp), (reg)) & ~(bits)); while (0) 175 1.1 nonaka #define HCLR2(hp, reg, bits) \ 176 1.106 joerg do if ((bits) != 0) HWRITE2((hp), (reg), HREAD2((hp), (reg)) & ~(bits)); while (0) 177 1.11 matt #define HCLR4(hp, reg, bits) \ 178 1.106 joerg do if ((bits) != 0) HWRITE4((hp), (reg), HREAD4((hp), (reg)) & ~(bits)); while (0) 179 1.1 nonaka #define HSET1(hp, reg, bits) \ 180 1.106 joerg do if ((bits) != 0) HWRITE1((hp), (reg), HREAD1((hp), (reg)) | (bits)); while (0) 181 1.1 nonaka #define HSET2(hp, reg, bits) \ 182 1.106 joerg do if ((bits) != 0) HWRITE2((hp), (reg), HREAD2((hp), (reg)) | (bits)); while (0) 183 1.11 matt #define HSET4(hp, reg, bits) \ 184 1.106 joerg do if ((bits) != 0) HWRITE4((hp), (reg), HREAD4((hp), (reg)) | (bits)); while (0) 185 1.1 nonaka 186 1.1 nonaka static int sdhc_host_reset(sdmmc_chipset_handle_t); 187 1.1 nonaka static int sdhc_host_reset1(sdmmc_chipset_handle_t); 188 1.1 nonaka static uint32_t sdhc_host_ocr(sdmmc_chipset_handle_t); 189 1.1 nonaka static int sdhc_host_maxblklen(sdmmc_chipset_handle_t); 190 1.1 nonaka static int sdhc_card_detect(sdmmc_chipset_handle_t); 191 1.1 nonaka static int sdhc_write_protect(sdmmc_chipset_handle_t); 192 1.1 nonaka static int sdhc_bus_power(sdmmc_chipset_handle_t, uint32_t); 193 1.76 jmcneill static int sdhc_bus_clock_ddr(sdmmc_chipset_handle_t, int, bool); 194 1.1 nonaka static int sdhc_bus_width(sdmmc_chipset_handle_t, int); 195 1.8 kiyohara static int sdhc_bus_rod(sdmmc_chipset_handle_t, int); 196 1.1 nonaka static void sdhc_card_enable_intr(sdmmc_chipset_handle_t, int); 197 1.1 nonaka static void sdhc_card_intr_ack(sdmmc_chipset_handle_t); 198 1.1 nonaka static void sdhc_exec_command(sdmmc_chipset_handle_t, 199 1.1 nonaka struct sdmmc_command *); 200 1.71 jmcneill static int sdhc_signal_voltage(sdmmc_chipset_handle_t, int); 201 1.83 mlelstv static int sdhc_execute_tuning1(struct sdhc_host *, int); 202 1.79 jmcneill static int sdhc_execute_tuning(sdmmc_chipset_handle_t, int); 203 1.80 jmcneill static void sdhc_tuning_timer(void *); 204 1.99 nonaka static void sdhc_hw_reset(sdmmc_chipset_handle_t); 205 1.1 nonaka static int sdhc_start_command(struct sdhc_host *, struct sdmmc_command *); 206 1.1 nonaka static int sdhc_wait_state(struct sdhc_host *, uint32_t, uint32_t); 207 1.1 nonaka static int sdhc_soft_reset(struct sdhc_host *, int); 208 1.88 mlelstv static int sdhc_wait_intr(struct sdhc_host *, int, int, bool); 209 1.1 nonaka static void sdhc_transfer_data(struct sdhc_host *, struct sdmmc_command *); 210 1.7 nonaka static int sdhc_transfer_data_dma(struct sdhc_host *, struct sdmmc_command *); 211 1.1 nonaka static int sdhc_transfer_data_pio(struct sdhc_host *, struct sdmmc_command *); 212 1.11 matt static void sdhc_read_data_pio(struct sdhc_host *, uint8_t *, u_int); 213 1.11 matt static void sdhc_write_data_pio(struct sdhc_host *, uint8_t *, u_int); 214 1.11 matt static void esdhc_read_data_pio(struct sdhc_host *, uint8_t *, u_int); 215 1.11 matt static void esdhc_write_data_pio(struct sdhc_host *, uint8_t *, u_int); 216 1.11 matt 217 1.1 nonaka static struct sdmmc_chip_functions sdhc_functions = { 218 1.1 nonaka /* host controller reset */ 219 1.60 skrll .host_reset = sdhc_host_reset, 220 1.1 nonaka 221 1.1 nonaka /* host controller capabilities */ 222 1.60 skrll .host_ocr = sdhc_host_ocr, 223 1.60 skrll .host_maxblklen = sdhc_host_maxblklen, 224 1.1 nonaka 225 1.1 nonaka /* card detection */ 226 1.60 skrll .card_detect = sdhc_card_detect, 227 1.1 nonaka 228 1.1 nonaka /* write protect */ 229 1.60 skrll .write_protect = sdhc_write_protect, 230 1.1 nonaka 231 1.60 skrll /* bus power, clock frequency, width and ROD(OpenDrain/PushPull) */ 232 1.60 skrll .bus_power = sdhc_bus_power, 233 1.76 jmcneill .bus_clock = NULL, /* see sdhc_bus_clock_ddr */ 234 1.60 skrll .bus_width = sdhc_bus_width, 235 1.60 skrll .bus_rod = sdhc_bus_rod, 236 1.1 nonaka 237 1.1 nonaka /* command execution */ 238 1.60 skrll .exec_command = sdhc_exec_command, 239 1.1 nonaka 240 1.1 nonaka /* card interrupt */ 241 1.60 skrll .card_enable_intr = sdhc_card_enable_intr, 242 1.71 jmcneill .card_intr_ack = sdhc_card_intr_ack, 243 1.71 jmcneill 244 1.71 jmcneill /* UHS functions */ 245 1.71 jmcneill .signal_voltage = sdhc_signal_voltage, 246 1.76 jmcneill .bus_clock_ddr = sdhc_bus_clock_ddr, 247 1.79 jmcneill .execute_tuning = sdhc_execute_tuning, 248 1.99 nonaka .hw_reset = sdhc_hw_reset, 249 1.1 nonaka }; 250 1.1 nonaka 251 1.17 jakllsch static int 252 1.17 jakllsch sdhc_cfprint(void *aux, const char *pnp) 253 1.17 jakllsch { 254 1.31 joerg const struct sdmmcbus_attach_args * const saa = aux; 255 1.17 jakllsch const struct sdhc_host * const hp = saa->saa_sch; 256 1.47 skrll 257 1.17 jakllsch if (pnp) { 258 1.17 jakllsch aprint_normal("sdmmc at %s", pnp); 259 1.17 jakllsch } 260 1.41 jakllsch for (size_t host = 0; host < hp->sc->sc_nhosts; host++) { 261 1.41 jakllsch if (hp->sc->sc_host[host] == hp) { 262 1.41 jakllsch aprint_normal(" slot %zu", host); 263 1.41 jakllsch } 264 1.41 jakllsch } 265 1.17 jakllsch 266 1.17 jakllsch return UNCONF; 267 1.17 jakllsch } 268 1.17 jakllsch 269 1.1 nonaka /* 270 1.1 nonaka * Called by attachment driver. For each SD card slot there is one SD 271 1.1 nonaka * host controller standard register set. (1.3) 272 1.1 nonaka */ 273 1.1 nonaka int 274 1.1 nonaka sdhc_host_found(struct sdhc_softc *sc, bus_space_tag_t iot, 275 1.1 nonaka bus_space_handle_t ioh, bus_size_t iosize) 276 1.1 nonaka { 277 1.1 nonaka struct sdmmcbus_attach_args saa; 278 1.1 nonaka struct sdhc_host *hp; 279 1.71 jmcneill uint32_t caps, caps2; 280 1.1 nonaka uint16_t sdhcver; 281 1.63 jmcneill int error; 282 1.1 nonaka 283 1.33 riastrad /* Allocate one more host structure. */ 284 1.33 riastrad hp = malloc(sizeof(struct sdhc_host), M_DEVBUF, M_WAITOK|M_ZERO); 285 1.33 riastrad if (hp == NULL) { 286 1.33 riastrad aprint_error_dev(sc->sc_dev, 287 1.33 riastrad "couldn't alloc memory (sdhc host)\n"); 288 1.33 riastrad goto err1; 289 1.33 riastrad } 290 1.33 riastrad sc->sc_host[sc->sc_nhosts++] = hp; 291 1.33 riastrad 292 1.33 riastrad /* Fill in the new host structure. */ 293 1.33 riastrad hp->sc = sc; 294 1.33 riastrad hp->iot = iot; 295 1.33 riastrad hp->ioh = ioh; 296 1.36 jakllsch hp->ios = iosize; 297 1.33 riastrad hp->dmat = sc->sc_dmat; 298 1.33 riastrad 299 1.65 jmcneill mutex_init(&hp->intr_lock, MUTEX_DEFAULT, IPL_SDMMC); 300 1.114 mrg mutex_init(&hp->bus_clock_lock, MUTEX_DEFAULT, IPL_NONE); 301 1.33 riastrad cv_init(&hp->intr_cv, "sdhcintr"); 302 1.80 jmcneill callout_init(&hp->tuning_timer, CALLOUT_MPSAFE); 303 1.80 jmcneill callout_setfunc(&hp->tuning_timer, sdhc_tuning_timer, hp); 304 1.33 riastrad 305 1.101 ryo if (ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) { 306 1.101 ryo sdhcver = SDHC_SPEC_VERS_300 << SDHC_SPEC_VERS_SHIFT; 307 1.101 ryo } else if (ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED)) { 308 1.101 ryo sdhcver = HREAD4(hp, SDHC_ESDHC_HOST_CTL_VERSION); 309 1.101 ryo } else if (iosize <= SDHC_HOST_CTL_VERSION) { 310 1.101 ryo sdhcver = SDHC_SPEC_NOVERS << SDHC_SPEC_VERS_SHIFT; 311 1.101 ryo } else { 312 1.101 ryo sdhcver = HREAD2(hp, SDHC_HOST_CTL_VERSION); 313 1.101 ryo } 314 1.101 ryo aprint_normal_dev(sc->sc_dev, "SDHC "); 315 1.101 ryo hp->specver = SDHC_SPEC_VERSION(sdhcver); 316 1.101 ryo switch (SDHC_SPEC_VERSION(sdhcver)) { 317 1.101 ryo case SDHC_SPEC_VERS_100: 318 1.101 ryo aprint_normal("1.0"); 319 1.101 ryo break; 320 1.101 ryo case SDHC_SPEC_VERS_200: 321 1.101 ryo aprint_normal("2.0"); 322 1.101 ryo break; 323 1.101 ryo case SDHC_SPEC_VERS_300: 324 1.101 ryo aprint_normal("3.0"); 325 1.101 ryo break; 326 1.101 ryo case SDHC_SPEC_VERS_400: 327 1.101 ryo aprint_normal("4.0"); 328 1.101 ryo break; 329 1.107 msaitoh case SDHC_SPEC_VERS_410: 330 1.107 msaitoh aprint_normal("4.1"); 331 1.107 msaitoh break; 332 1.107 msaitoh case SDHC_SPEC_VERS_420: 333 1.107 msaitoh aprint_normal("4.2"); 334 1.107 msaitoh break; 335 1.101 ryo case SDHC_SPEC_NOVERS: 336 1.96 kiyohara hp->specver = -1; 337 1.101 ryo aprint_normal("NO-VERS"); 338 1.101 ryo break; 339 1.101 ryo default: 340 1.101 ryo aprint_normal("unknown version(0x%x)", 341 1.101 ryo SDHC_SPEC_VERSION(sdhcver)); 342 1.101 ryo break; 343 1.101 ryo } 344 1.101 ryo if (SDHC_SPEC_VERSION(sdhcver) != SDHC_SPEC_NOVERS) 345 1.96 kiyohara aprint_normal(", rev %u", SDHC_VENDOR_VERSION(sdhcver)); 346 1.1 nonaka 347 1.1 nonaka /* 348 1.3 uebayasi * Reset the host controller and enable interrupts. 349 1.1 nonaka */ 350 1.1 nonaka (void)sdhc_host_reset(hp); 351 1.1 nonaka 352 1.93 ryo if (ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) { 353 1.93 ryo /* init uSDHC registers */ 354 1.93 ryo HWRITE4(hp, SDHC_MMC_BOOT, 0); 355 1.93 ryo HWRITE4(hp, SDHC_HOST_CTL, SDHC_USDHC_BURST_LEN_EN | 356 1.93 ryo SDHC_USDHC_HOST_CTL_RESV23 | SDHC_USDHC_EMODE_LE); 357 1.93 ryo HWRITE4(hp, SDHC_WATERMARK_LEVEL, 358 1.93 ryo (0x10 << SDHC_WATERMARK_WR_BRST_SHIFT) | 359 1.93 ryo (0x40 << SDHC_WATERMARK_WRITE_SHIFT) | 360 1.93 ryo (0x10 << SDHC_WATERMARK_RD_BRST_SHIFT) | 361 1.93 ryo (0x40 << SDHC_WATERMARK_READ_SHIFT)); 362 1.93 ryo HSET4(hp, SDHC_VEND_SPEC, 363 1.93 ryo SDHC_VEND_SPEC_MBO | 364 1.93 ryo SDHC_VEND_SPEC_CARD_CLK_SOFT_EN | 365 1.93 ryo SDHC_VEND_SPEC_IPG_PERCLK_SOFT_EN | 366 1.93 ryo SDHC_VEND_SPEC_HCLK_SOFT_EN | 367 1.93 ryo SDHC_VEND_SPEC_IPG_CLK_SOFT_EN | 368 1.93 ryo SDHC_VEND_SPEC_AC12_WR_CHKBUSY_EN | 369 1.93 ryo SDHC_VEND_SPEC_FRC_SDCLK_ON); 370 1.93 ryo } 371 1.93 ryo 372 1.1 nonaka /* Determine host capabilities. */ 373 1.24 skrll if (ISSET(sc->sc_flags, SDHC_FLAG_HOSTCAPS)) { 374 1.24 skrll caps = sc->sc_caps; 375 1.72 jmcneill caps2 = sc->sc_caps2; 376 1.93 ryo } else if (ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) { 377 1.93 ryo /* uSDHC capability register is little bit different */ 378 1.93 ryo caps = HREAD4(hp, SDHC_CAPABILITIES); 379 1.93 ryo caps |= SDHC_8BIT_SUPP; 380 1.93 ryo if (caps & SDHC_ADMA1_SUPP) 381 1.93 ryo caps |= SDHC_ADMA2_SUPP; 382 1.93 ryo sc->sc_caps = caps; 383 1.93 ryo /* uSDHC has no SDHC_CAPABILITIES2 register */ 384 1.93 ryo caps2 = sc->sc_caps2 = SDHC_SDR50_SUPP | SDHC_DDR50_SUPP; 385 1.24 skrll } else { 386 1.79 jmcneill caps = sc->sc_caps = HREAD4(hp, SDHC_CAPABILITIES); 387 1.72 jmcneill if (hp->specver >= SDHC_SPEC_VERS_300) { 388 1.79 jmcneill caps2 = sc->sc_caps2 = HREAD4(hp, SDHC_CAPABILITIES2); 389 1.72 jmcneill } else { 390 1.79 jmcneill caps2 = sc->sc_caps2 = 0; 391 1.72 jmcneill } 392 1.71 jmcneill } 393 1.1 nonaka 394 1.108 mlelstv aprint_verbose(", caps <%08x/%08x>", caps, caps2); 395 1.108 mlelstv 396 1.80 jmcneill const u_int retuning_mode = (caps2 >> SDHC_RETUNING_MODES_SHIFT) & 397 1.80 jmcneill SDHC_RETUNING_MODES_MASK; 398 1.80 jmcneill if (retuning_mode == SDHC_RETUNING_MODE_1) { 399 1.80 jmcneill hp->tuning_timer_count = (caps2 >> SDHC_TIMER_COUNT_SHIFT) & 400 1.80 jmcneill SDHC_TIMER_COUNT_MASK; 401 1.80 jmcneill if (hp->tuning_timer_count == 0xf) 402 1.80 jmcneill hp->tuning_timer_count = 0; 403 1.80 jmcneill if (hp->tuning_timer_count) 404 1.80 jmcneill hp->tuning_timer_count = 405 1.80 jmcneill 1 << (hp->tuning_timer_count - 1); 406 1.80 jmcneill } 407 1.80 jmcneill 408 1.55 bouyer /* 409 1.55 bouyer * Use DMA if the host system and the controller support it. 410 1.112 msaitoh * Supports integrated or external DMA egine, with or without 411 1.55 bouyer * SDHC_DMA_ENABLE in the command. 412 1.55 bouyer */ 413 1.28 matt if (ISSET(sc->sc_flags, SDHC_FLAG_FORCE_DMA) || 414 1.27 jakllsch (ISSET(sc->sc_flags, SDHC_FLAG_USE_DMA && 415 1.28 matt ISSET(caps, SDHC_DMA_SUPPORT)))) { 416 1.1 nonaka SET(hp->flags, SHF_USE_DMA); 417 1.63 jmcneill 418 1.116 jmcneill if (ISSET(caps, SDHC_ADMA2_SUPP) && 419 1.116 jmcneill !ISSET(sc->sc_flags, SDHC_FLAG_BROKEN_ADMA)) { 420 1.55 bouyer SET(hp->flags, SHF_MODE_DMAEN); 421 1.63 jmcneill /* 422 1.63 jmcneill * 64-bit mode was present in the 2.00 spec, removed 423 1.63 jmcneill * from 3.00, and re-added in 4.00 with a different 424 1.63 jmcneill * descriptor layout. We only support 2.00 and 3.00 425 1.63 jmcneill * descriptors for now. 426 1.63 jmcneill */ 427 1.63 jmcneill if (hp->specver == SDHC_SPEC_VERS_200 && 428 1.63 jmcneill ISSET(caps, SDHC_64BIT_SYS_BUS)) { 429 1.63 jmcneill SET(hp->flags, SHF_USE_ADMA2_64); 430 1.63 jmcneill aprint_normal(", 64-bit ADMA2"); 431 1.63 jmcneill } else { 432 1.63 jmcneill SET(hp->flags, SHF_USE_ADMA2_32); 433 1.63 jmcneill aprint_normal(", 32-bit ADMA2"); 434 1.63 jmcneill } 435 1.63 jmcneill } else { 436 1.63 jmcneill if (!ISSET(sc->sc_flags, SDHC_FLAG_EXTERNAL_DMA) || 437 1.63 jmcneill ISSET(sc->sc_flags, SDHC_FLAG_EXTDMA_DMAEN)) 438 1.63 jmcneill SET(hp->flags, SHF_MODE_DMAEN); 439 1.64 jmcneill if (sc->sc_vendor_transfer_data_dma) { 440 1.64 jmcneill aprint_normal(", platform DMA"); 441 1.64 jmcneill } else { 442 1.64 jmcneill aprint_normal(", SDMA"); 443 1.64 jmcneill } 444 1.63 jmcneill } 445 1.58 jmcneill } else { 446 1.58 jmcneill aprint_normal(", PIO"); 447 1.1 nonaka } 448 1.1 nonaka 449 1.1 nonaka /* 450 1.1 nonaka * Determine the base clock frequency. (2.2.24) 451 1.1 nonaka */ 452 1.56 jmcneill if (hp->specver >= SDHC_SPEC_VERS_300) { 453 1.30 matt hp->clkbase = SDHC_BASE_V3_FREQ_KHZ(caps); 454 1.30 matt } else { 455 1.30 matt hp->clkbase = SDHC_BASE_FREQ_KHZ(caps); 456 1.30 matt } 457 1.56 jmcneill if (hp->clkbase == 0 || 458 1.56 jmcneill ISSET(sc->sc_flags, SDHC_FLAG_NO_CLKBASE)) { 459 1.9 matt if (sc->sc_clkbase == 0) { 460 1.9 matt /* The attachment driver must tell us. */ 461 1.12 nonaka aprint_error_dev(sc->sc_dev, 462 1.12 nonaka "unknown base clock frequency\n"); 463 1.9 matt goto err; 464 1.9 matt } 465 1.9 matt hp->clkbase = sc->sc_clkbase; 466 1.9 matt } 467 1.9 matt if (hp->clkbase < 10000 || hp->clkbase > 10000 * 256) { 468 1.1 nonaka /* SDHC 1.0 supports only 10-63 MHz. */ 469 1.1 nonaka aprint_error_dev(sc->sc_dev, 470 1.1 nonaka "base clock frequency out of range: %u MHz\n", 471 1.1 nonaka hp->clkbase / 1000); 472 1.1 nonaka goto err; 473 1.1 nonaka } 474 1.58 jmcneill aprint_normal(", %u kHz", hp->clkbase); 475 1.1 nonaka 476 1.1 nonaka /* 477 1.1 nonaka * XXX Set the data timeout counter value according to 478 1.1 nonaka * capabilities. (2.2.15) 479 1.1 nonaka */ 480 1.1 nonaka HWRITE1(hp, SDHC_TIMEOUT_CTL, SDHC_TIMEOUT_MAX); 481 1.29 matt #if 1 482 1.11 matt if (ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED)) 483 1.11 matt HWRITE4(hp, SDHC_NINTR_STATUS, SDHC_CMD_TIMEOUT_ERROR << 16); 484 1.11 matt #endif 485 1.1 nonaka 486 1.58 jmcneill if (ISSET(caps, SDHC_EMBEDDED_SLOT)) 487 1.58 jmcneill aprint_normal(", embedded slot"); 488 1.58 jmcneill 489 1.1 nonaka /* 490 1.1 nonaka * Determine SD bus voltage levels supported by the controller. 491 1.1 nonaka */ 492 1.58 jmcneill aprint_normal(","); 493 1.66 jmcneill if (ISSET(caps, SDHC_HIGH_SPEED_SUPP)) { 494 1.66 jmcneill SET(hp->ocr, MMC_OCR_HCS); 495 1.71 jmcneill aprint_normal(" HS"); 496 1.71 jmcneill } 497 1.104 hkenken if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_NO_1_8_V)) { 498 1.104 hkenken if (ISSET(caps2, SDHC_SDR50_SUPP)) { 499 1.104 hkenken SET(hp->ocr, MMC_OCR_S18A); 500 1.104 hkenken aprint_normal(" SDR50"); 501 1.104 hkenken } 502 1.104 hkenken if (ISSET(caps2, SDHC_DDR50_SUPP)) { 503 1.104 hkenken SET(hp->ocr, MMC_OCR_S18A); 504 1.104 hkenken aprint_normal(" DDR50"); 505 1.104 hkenken } 506 1.104 hkenken if (ISSET(caps2, SDHC_SDR104_SUPP)) { 507 1.104 hkenken SET(hp->ocr, MMC_OCR_S18A); 508 1.104 hkenken aprint_normal(" SDR104 HS200"); 509 1.104 hkenken } 510 1.104 hkenken if (ISSET(caps, SDHC_VOLTAGE_SUPP_1_8V)) { 511 1.104 hkenken SET(hp->ocr, MMC_OCR_1_65V_1_95V); 512 1.104 hkenken aprint_normal(" 1.8V"); 513 1.104 hkenken } 514 1.11 matt } 515 1.11 matt if (ISSET(caps, SDHC_VOLTAGE_SUPP_3_0V)) { 516 1.1 nonaka SET(hp->ocr, MMC_OCR_2_9V_3_0V | MMC_OCR_3_0V_3_1V); 517 1.58 jmcneill aprint_normal(" 3.0V"); 518 1.11 matt } 519 1.11 matt if (ISSET(caps, SDHC_VOLTAGE_SUPP_3_3V)) { 520 1.1 nonaka SET(hp->ocr, MMC_OCR_3_2V_3_3V | MMC_OCR_3_3V_3_4V); 521 1.58 jmcneill aprint_normal(" 3.3V"); 522 1.11 matt } 523 1.80 jmcneill if (hp->specver >= SDHC_SPEC_VERS_300) { 524 1.80 jmcneill aprint_normal(", re-tuning mode %d", retuning_mode + 1); 525 1.80 jmcneill if (hp->tuning_timer_count) 526 1.80 jmcneill aprint_normal(" (%us timer)", hp->tuning_timer_count); 527 1.80 jmcneill } 528 1.1 nonaka 529 1.1 nonaka /* 530 1.1 nonaka * Determine the maximum block length supported by the host 531 1.1 nonaka * controller. (2.2.24) 532 1.1 nonaka */ 533 1.1 nonaka switch((caps >> SDHC_MAX_BLK_LEN_SHIFT) & SDHC_MAX_BLK_LEN_MASK) { 534 1.1 nonaka case SDHC_MAX_BLK_LEN_512: 535 1.1 nonaka hp->maxblklen = 512; 536 1.1 nonaka break; 537 1.1 nonaka 538 1.1 nonaka case SDHC_MAX_BLK_LEN_1024: 539 1.1 nonaka hp->maxblklen = 1024; 540 1.1 nonaka break; 541 1.1 nonaka 542 1.1 nonaka case SDHC_MAX_BLK_LEN_2048: 543 1.1 nonaka hp->maxblklen = 2048; 544 1.1 nonaka break; 545 1.1 nonaka 546 1.9 matt case SDHC_MAX_BLK_LEN_4096: 547 1.9 matt hp->maxblklen = 4096; 548 1.9 matt break; 549 1.9 matt 550 1.1 nonaka default: 551 1.1 nonaka aprint_error_dev(sc->sc_dev, "max block length unknown\n"); 552 1.1 nonaka goto err; 553 1.1 nonaka } 554 1.58 jmcneill aprint_normal(", %u byte blocks", hp->maxblklen); 555 1.58 jmcneill aprint_normal("\n"); 556 1.1 nonaka 557 1.63 jmcneill if (ISSET(hp->flags, SHF_USE_ADMA2_MASK)) { 558 1.63 jmcneill int rseg; 559 1.63 jmcneill 560 1.63 jmcneill /* Allocate ADMA2 descriptor memory */ 561 1.63 jmcneill error = bus_dmamem_alloc(sc->sc_dmat, PAGE_SIZE, PAGE_SIZE, 562 1.63 jmcneill PAGE_SIZE, hp->adma_segs, 1, &rseg, BUS_DMA_WAITOK); 563 1.63 jmcneill if (error) { 564 1.63 jmcneill aprint_error_dev(sc->sc_dev, 565 1.63 jmcneill "ADMA2 dmamem_alloc failed (%d)\n", error); 566 1.63 jmcneill goto adma_done; 567 1.63 jmcneill } 568 1.63 jmcneill error = bus_dmamem_map(sc->sc_dmat, hp->adma_segs, rseg, 569 1.63 jmcneill PAGE_SIZE, (void **)&hp->adma2, BUS_DMA_WAITOK); 570 1.63 jmcneill if (error) { 571 1.63 jmcneill aprint_error_dev(sc->sc_dev, 572 1.63 jmcneill "ADMA2 dmamem_map failed (%d)\n", error); 573 1.63 jmcneill goto adma_done; 574 1.63 jmcneill } 575 1.63 jmcneill error = bus_dmamap_create(sc->sc_dmat, PAGE_SIZE, 1, PAGE_SIZE, 576 1.63 jmcneill 0, BUS_DMA_WAITOK, &hp->adma_map); 577 1.63 jmcneill if (error) { 578 1.63 jmcneill aprint_error_dev(sc->sc_dev, 579 1.63 jmcneill "ADMA2 dmamap_create failed (%d)\n", error); 580 1.63 jmcneill goto adma_done; 581 1.63 jmcneill } 582 1.63 jmcneill error = bus_dmamap_load(sc->sc_dmat, hp->adma_map, 583 1.63 jmcneill hp->adma2, PAGE_SIZE, NULL, 584 1.63 jmcneill BUS_DMA_WAITOK|BUS_DMA_WRITE); 585 1.63 jmcneill if (error) { 586 1.63 jmcneill aprint_error_dev(sc->sc_dev, 587 1.63 jmcneill "ADMA2 dmamap_load failed (%d)\n", error); 588 1.63 jmcneill goto adma_done; 589 1.63 jmcneill } 590 1.63 jmcneill 591 1.63 jmcneill memset(hp->adma2, 0, PAGE_SIZE); 592 1.63 jmcneill 593 1.63 jmcneill adma_done: 594 1.63 jmcneill if (error) 595 1.63 jmcneill CLR(hp->flags, SHF_USE_ADMA2_MASK); 596 1.63 jmcneill } 597 1.63 jmcneill 598 1.1 nonaka /* 599 1.1 nonaka * Attach the generic SD/MMC bus driver. (The bus driver must 600 1.1 nonaka * not invoke any chipset functions before it is attached.) 601 1.1 nonaka */ 602 1.1 nonaka memset(&saa, 0, sizeof(saa)); 603 1.1 nonaka saa.saa_busname = "sdmmc"; 604 1.1 nonaka saa.saa_sct = &sdhc_functions; 605 1.1 nonaka saa.saa_sch = hp; 606 1.1 nonaka saa.saa_dmat = hp->dmat; 607 1.1 nonaka saa.saa_clkmax = hp->clkbase; 608 1.11 matt if (ISSET(sc->sc_flags, SDHC_FLAG_HAVE_CGM)) 609 1.38 jakllsch saa.saa_clkmin = hp->clkbase / 256 / 2046; 610 1.11 matt else if (ISSET(sc->sc_flags, SDHC_FLAG_HAVE_DVS)) 611 1.38 jakllsch saa.saa_clkmin = hp->clkbase / 256 / 16; 612 1.38 jakllsch else if (hp->sc->sc_clkmsk != 0) 613 1.38 jakllsch saa.saa_clkmin = hp->clkbase / (hp->sc->sc_clkmsk >> 614 1.38 jakllsch (ffs(hp->sc->sc_clkmsk) - 1)); 615 1.56 jmcneill else if (hp->specver >= SDHC_SPEC_VERS_300) 616 1.38 jakllsch saa.saa_clkmin = hp->clkbase / 0x3ff; 617 1.38 jakllsch else 618 1.38 jakllsch saa.saa_clkmin = hp->clkbase / 256; 619 1.97 kiyohara if (!ISSET(sc->sc_flags, SDHC_FLAG_NO_AUTO_STOP)) 620 1.97 kiyohara saa.saa_caps |= SMC_CAPS_AUTO_STOP; 621 1.97 kiyohara saa.saa_caps |= SMC_CAPS_4BIT_MODE; 622 1.11 matt if (ISSET(sc->sc_flags, SDHC_FLAG_8BIT_MODE)) 623 1.11 matt saa.saa_caps |= SMC_CAPS_8BIT_MODE; 624 1.11 matt if (ISSET(caps, SDHC_HIGH_SPEED_SUPP)) 625 1.113 jmcneill saa.saa_caps |= SMC_CAPS_SD_HIGHSPEED | 626 1.113 jmcneill SMC_CAPS_MMC_HIGHSPEED; 627 1.76 jmcneill if (ISSET(caps2, SDHC_SDR104_SUPP)) 628 1.76 jmcneill saa.saa_caps |= SMC_CAPS_UHS_SDR104 | 629 1.76 jmcneill SMC_CAPS_UHS_SDR50 | 630 1.76 jmcneill SMC_CAPS_MMC_HS200; 631 1.76 jmcneill if (ISSET(caps2, SDHC_SDR50_SUPP)) 632 1.76 jmcneill saa.saa_caps |= SMC_CAPS_UHS_SDR50; 633 1.76 jmcneill if (ISSET(caps2, SDHC_DDR50_SUPP)) 634 1.76 jmcneill saa.saa_caps |= SMC_CAPS_UHS_DDR50; 635 1.26 matt if (ISSET(hp->flags, SHF_USE_DMA)) { 636 1.54 nonaka saa.saa_caps |= SMC_CAPS_DMA; 637 1.54 nonaka if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED)) 638 1.54 nonaka saa.saa_caps |= SMC_CAPS_MULTI_SEG_DMA; 639 1.26 matt } 640 1.32 kiyohara if (ISSET(sc->sc_flags, SDHC_FLAG_SINGLE_ONLY)) 641 1.32 kiyohara saa.saa_caps |= SMC_CAPS_SINGLE_ONLY; 642 1.77 jmcneill if (ISSET(sc->sc_flags, SDHC_FLAG_POLL_CARD_DET)) 643 1.77 jmcneill saa.saa_caps |= SMC_CAPS_POLL_CARD_DET; 644 1.104 hkenken 645 1.104 hkenken if (ISSET(sc->sc_flags, SDHC_FLAG_BROKEN_ADMA2_ZEROLEN)) 646 1.104 hkenken saa.saa_max_seg = 65535; 647 1.104 hkenken 648 1.111 thorpej hp->sdmmc = config_found(sc->sc_dev, &saa, sdhc_cfprint, CFARGS_NONE); 649 1.1 nonaka 650 1.1 nonaka return 0; 651 1.1 nonaka 652 1.1 nonaka err: 653 1.80 jmcneill callout_destroy(&hp->tuning_timer); 654 1.1 nonaka cv_destroy(&hp->intr_cv); 655 1.114 mrg mutex_destroy(&hp->bus_clock_lock); 656 1.65 jmcneill mutex_destroy(&hp->intr_lock); 657 1.1 nonaka free(hp, M_DEVBUF); 658 1.1 nonaka sc->sc_host[--sc->sc_nhosts] = NULL; 659 1.1 nonaka err1: 660 1.1 nonaka return 1; 661 1.1 nonaka } 662 1.1 nonaka 663 1.7 nonaka int 664 1.36 jakllsch sdhc_detach(struct sdhc_softc *sc, int flags) 665 1.7 nonaka { 666 1.36 jakllsch struct sdhc_host *hp; 667 1.7 nonaka int rv = 0; 668 1.7 nonaka 669 1.36 jakllsch for (size_t n = 0; n < sc->sc_nhosts; n++) { 670 1.36 jakllsch hp = sc->sc_host[n]; 671 1.36 jakllsch if (hp == NULL) 672 1.36 jakllsch continue; 673 1.36 jakllsch if (hp->sdmmc != NULL) { 674 1.36 jakllsch rv = config_detach(hp->sdmmc, flags); 675 1.36 jakllsch if (rv) 676 1.36 jakllsch break; 677 1.36 jakllsch hp->sdmmc = NULL; 678 1.36 jakllsch } 679 1.36 jakllsch /* disable interrupts */ 680 1.36 jakllsch if ((flags & DETACH_FORCE) == 0) { 681 1.78 mlelstv mutex_enter(&hp->intr_lock); 682 1.36 jakllsch if (ISSET(hp->sc->sc_flags, SDHC_FLAG_32BIT_ACCESS)) { 683 1.36 jakllsch HWRITE4(hp, SDHC_NINTR_SIGNAL_EN, 0); 684 1.36 jakllsch } else { 685 1.36 jakllsch HWRITE2(hp, SDHC_NINTR_SIGNAL_EN, 0); 686 1.36 jakllsch } 687 1.36 jakllsch sdhc_soft_reset(hp, SDHC_RESET_ALL); 688 1.78 mlelstv mutex_exit(&hp->intr_lock); 689 1.36 jakllsch } 690 1.80 jmcneill callout_halt(&hp->tuning_timer, NULL); 691 1.80 jmcneill callout_destroy(&hp->tuning_timer); 692 1.36 jakllsch cv_destroy(&hp->intr_cv); 693 1.65 jmcneill mutex_destroy(&hp->intr_lock); 694 1.36 jakllsch if (hp->ios > 0) { 695 1.36 jakllsch bus_space_unmap(hp->iot, hp->ioh, hp->ios); 696 1.36 jakllsch hp->ios = 0; 697 1.36 jakllsch } 698 1.63 jmcneill if (ISSET(hp->flags, SHF_USE_ADMA2_MASK)) { 699 1.63 jmcneill bus_dmamap_unload(sc->sc_dmat, hp->adma_map); 700 1.63 jmcneill bus_dmamap_destroy(sc->sc_dmat, hp->adma_map); 701 1.63 jmcneill bus_dmamem_unmap(sc->sc_dmat, hp->adma2, PAGE_SIZE); 702 1.63 jmcneill bus_dmamem_free(sc->sc_dmat, hp->adma_segs, 1); 703 1.63 jmcneill } 704 1.36 jakllsch free(hp, M_DEVBUF); 705 1.36 jakllsch sc->sc_host[n] = NULL; 706 1.36 jakllsch } 707 1.7 nonaka 708 1.7 nonaka return rv; 709 1.7 nonaka } 710 1.7 nonaka 711 1.1 nonaka bool 712 1.6 dyoung sdhc_suspend(device_t dev, const pmf_qual_t *qual) 713 1.1 nonaka { 714 1.1 nonaka struct sdhc_softc *sc = device_private(dev); 715 1.1 nonaka struct sdhc_host *hp; 716 1.12 nonaka size_t i; 717 1.1 nonaka 718 1.1 nonaka /* XXX poll for command completion or suspend command 719 1.1 nonaka * in progress */ 720 1.1 nonaka 721 1.1 nonaka /* Save the host controller state. */ 722 1.11 matt for (size_t n = 0; n < sc->sc_nhosts; n++) { 723 1.1 nonaka hp = sc->sc_host[n]; 724 1.11 matt if (ISSET(sc->sc_flags, SDHC_FLAG_32BIT_ACCESS)) { 725 1.12 nonaka for (i = 0; i < sizeof hp->regs; i += 4) { 726 1.11 matt uint32_t v = HREAD4(hp, i); 727 1.12 nonaka hp->regs[i + 0] = (v >> 0); 728 1.12 nonaka hp->regs[i + 1] = (v >> 8); 729 1.13 bouyer if (i + 3 < sizeof hp->regs) { 730 1.13 bouyer hp->regs[i + 2] = (v >> 16); 731 1.13 bouyer hp->regs[i + 3] = (v >> 24); 732 1.13 bouyer } 733 1.11 matt } 734 1.11 matt } else { 735 1.12 nonaka for (i = 0; i < sizeof hp->regs; i++) { 736 1.11 matt hp->regs[i] = HREAD1(hp, i); 737 1.11 matt } 738 1.11 matt } 739 1.1 nonaka } 740 1.1 nonaka return true; 741 1.1 nonaka } 742 1.1 nonaka 743 1.1 nonaka bool 744 1.6 dyoung sdhc_resume(device_t dev, const pmf_qual_t *qual) 745 1.1 nonaka { 746 1.1 nonaka struct sdhc_softc *sc = device_private(dev); 747 1.1 nonaka struct sdhc_host *hp; 748 1.12 nonaka size_t i; 749 1.1 nonaka 750 1.1 nonaka /* Restore the host controller state. */ 751 1.11 matt for (size_t n = 0; n < sc->sc_nhosts; n++) { 752 1.1 nonaka hp = sc->sc_host[n]; 753 1.1 nonaka (void)sdhc_host_reset(hp); 754 1.11 matt if (ISSET(sc->sc_flags, SDHC_FLAG_32BIT_ACCESS)) { 755 1.12 nonaka for (i = 0; i < sizeof hp->regs; i += 4) { 756 1.13 bouyer if (i + 3 < sizeof hp->regs) { 757 1.13 bouyer HWRITE4(hp, i, 758 1.13 bouyer (hp->regs[i + 0] << 0) 759 1.13 bouyer | (hp->regs[i + 1] << 8) 760 1.13 bouyer | (hp->regs[i + 2] << 16) 761 1.13 bouyer | (hp->regs[i + 3] << 24)); 762 1.13 bouyer } else { 763 1.13 bouyer HWRITE4(hp, i, 764 1.13 bouyer (hp->regs[i + 0] << 0) 765 1.13 bouyer | (hp->regs[i + 1] << 8)); 766 1.13 bouyer } 767 1.11 matt } 768 1.11 matt } else { 769 1.12 nonaka for (i = 0; i < sizeof hp->regs; i++) { 770 1.11 matt HWRITE1(hp, i, hp->regs[i]); 771 1.11 matt } 772 1.11 matt } 773 1.1 nonaka } 774 1.1 nonaka return true; 775 1.1 nonaka } 776 1.1 nonaka 777 1.1 nonaka bool 778 1.1 nonaka sdhc_shutdown(device_t dev, int flags) 779 1.1 nonaka { 780 1.1 nonaka struct sdhc_softc *sc = device_private(dev); 781 1.1 nonaka struct sdhc_host *hp; 782 1.1 nonaka 783 1.1 nonaka /* XXX chip locks up if we don't disable it before reboot. */ 784 1.11 matt for (size_t i = 0; i < sc->sc_nhosts; i++) { 785 1.1 nonaka hp = sc->sc_host[i]; 786 1.1 nonaka (void)sdhc_host_reset(hp); 787 1.1 nonaka } 788 1.1 nonaka return true; 789 1.1 nonaka } 790 1.1 nonaka 791 1.1 nonaka /* 792 1.1 nonaka * Reset the host controller. Called during initialization, when 793 1.1 nonaka * cards are removed, upon resume, and during error recovery. 794 1.1 nonaka */ 795 1.1 nonaka static int 796 1.1 nonaka sdhc_host_reset1(sdmmc_chipset_handle_t sch) 797 1.1 nonaka { 798 1.1 nonaka struct sdhc_host *hp = (struct sdhc_host *)sch; 799 1.11 matt uint32_t sdhcimask; 800 1.1 nonaka int error; 801 1.1 nonaka 802 1.65 jmcneill KASSERT(mutex_owned(&hp->intr_lock)); 803 1.1 nonaka 804 1.1 nonaka /* Disable all interrupts. */ 805 1.11 matt if (ISSET(hp->sc->sc_flags, SDHC_FLAG_32BIT_ACCESS)) { 806 1.11 matt HWRITE4(hp, SDHC_NINTR_SIGNAL_EN, 0); 807 1.11 matt } else { 808 1.11 matt HWRITE2(hp, SDHC_NINTR_SIGNAL_EN, 0); 809 1.11 matt } 810 1.1 nonaka 811 1.105 mlelstv /* Let sdhc_bus_power restore power */ 812 1.105 mlelstv hp->vdd = 0; 813 1.105 mlelstv 814 1.1 nonaka /* 815 1.1 nonaka * Reset the entire host controller and wait up to 100ms for 816 1.1 nonaka * the controller to clear the reset bit. 817 1.1 nonaka */ 818 1.1 nonaka error = sdhc_soft_reset(hp, SDHC_RESET_ALL); 819 1.1 nonaka if (error) 820 1.1 nonaka goto out; 821 1.1 nonaka 822 1.1 nonaka /* Set data timeout counter value to max for now. */ 823 1.1 nonaka HWRITE1(hp, SDHC_TIMEOUT_CTL, SDHC_TIMEOUT_MAX); 824 1.29 matt #if 1 825 1.11 matt if (ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED)) 826 1.11 matt HWRITE4(hp, SDHC_NINTR_STATUS, SDHC_CMD_TIMEOUT_ERROR << 16); 827 1.11 matt #endif 828 1.1 nonaka 829 1.1 nonaka /* Enable interrupts. */ 830 1.1 nonaka sdhcimask = SDHC_CARD_REMOVAL | SDHC_CARD_INSERTION | 831 1.1 nonaka SDHC_BUFFER_READ_READY | SDHC_BUFFER_WRITE_READY | 832 1.1 nonaka SDHC_DMA_INTERRUPT | SDHC_BLOCK_GAP_EVENT | 833 1.1 nonaka SDHC_TRANSFER_COMPLETE | SDHC_COMMAND_COMPLETE; 834 1.11 matt if (ISSET(hp->sc->sc_flags, SDHC_FLAG_32BIT_ACCESS)) { 835 1.11 matt sdhcimask |= SDHC_EINTR_STATUS_MASK << 16; 836 1.11 matt HWRITE4(hp, SDHC_NINTR_STATUS_EN, sdhcimask); 837 1.11 matt sdhcimask ^= 838 1.11 matt (SDHC_EINTR_STATUS_MASK ^ SDHC_EINTR_SIGNAL_MASK) << 16; 839 1.11 matt sdhcimask ^= SDHC_BUFFER_READ_READY ^ SDHC_BUFFER_WRITE_READY; 840 1.11 matt HWRITE4(hp, SDHC_NINTR_SIGNAL_EN, sdhcimask); 841 1.11 matt } else { 842 1.11 matt HWRITE2(hp, SDHC_NINTR_STATUS_EN, sdhcimask); 843 1.11 matt HWRITE2(hp, SDHC_EINTR_STATUS_EN, SDHC_EINTR_STATUS_MASK); 844 1.11 matt sdhcimask ^= SDHC_BUFFER_READ_READY ^ SDHC_BUFFER_WRITE_READY; 845 1.11 matt HWRITE2(hp, SDHC_NINTR_SIGNAL_EN, sdhcimask); 846 1.11 matt HWRITE2(hp, SDHC_EINTR_SIGNAL_EN, SDHC_EINTR_SIGNAL_MASK); 847 1.11 matt } 848 1.1 nonaka 849 1.1 nonaka out: 850 1.1 nonaka return error; 851 1.1 nonaka } 852 1.1 nonaka 853 1.1 nonaka static int 854 1.1 nonaka sdhc_host_reset(sdmmc_chipset_handle_t sch) 855 1.1 nonaka { 856 1.1 nonaka struct sdhc_host *hp = (struct sdhc_host *)sch; 857 1.1 nonaka int error; 858 1.1 nonaka 859 1.65 jmcneill mutex_enter(&hp->intr_lock); 860 1.1 nonaka error = sdhc_host_reset1(sch); 861 1.65 jmcneill mutex_exit(&hp->intr_lock); 862 1.1 nonaka 863 1.1 nonaka return error; 864 1.1 nonaka } 865 1.1 nonaka 866 1.1 nonaka static uint32_t 867 1.1 nonaka sdhc_host_ocr(sdmmc_chipset_handle_t sch) 868 1.1 nonaka { 869 1.1 nonaka struct sdhc_host *hp = (struct sdhc_host *)sch; 870 1.1 nonaka 871 1.1 nonaka return hp->ocr; 872 1.1 nonaka } 873 1.1 nonaka 874 1.1 nonaka static int 875 1.1 nonaka sdhc_host_maxblklen(sdmmc_chipset_handle_t sch) 876 1.1 nonaka { 877 1.1 nonaka struct sdhc_host *hp = (struct sdhc_host *)sch; 878 1.1 nonaka 879 1.1 nonaka return hp->maxblklen; 880 1.1 nonaka } 881 1.1 nonaka 882 1.1 nonaka /* 883 1.1 nonaka * Return non-zero if the card is currently inserted. 884 1.1 nonaka */ 885 1.1 nonaka static int 886 1.1 nonaka sdhc_card_detect(sdmmc_chipset_handle_t sch) 887 1.1 nonaka { 888 1.1 nonaka struct sdhc_host *hp = (struct sdhc_host *)sch; 889 1.1 nonaka int r; 890 1.1 nonaka 891 1.119 dyoung if (ISSET(hp->sc->sc_flags, SDHC_FLAG_NON_REMOVABLE)) 892 1.119 dyoung return 1; 893 1.119 dyoung 894 1.32 kiyohara if (hp->sc->sc_vendor_card_detect) 895 1.32 kiyohara return (*hp->sc->sc_vendor_card_detect)(hp->sc); 896 1.32 kiyohara 897 1.1 nonaka r = ISSET(HREAD4(hp, SDHC_PRESENT_STATE), SDHC_CARD_INSERTED); 898 1.1 nonaka 899 1.11 matt return r ? 1 : 0; 900 1.1 nonaka } 901 1.1 nonaka 902 1.1 nonaka /* 903 1.1 nonaka * Return non-zero if the card is currently write-protected. 904 1.1 nonaka */ 905 1.1 nonaka static int 906 1.1 nonaka sdhc_write_protect(sdmmc_chipset_handle_t sch) 907 1.1 nonaka { 908 1.1 nonaka struct sdhc_host *hp = (struct sdhc_host *)sch; 909 1.1 nonaka int r; 910 1.1 nonaka 911 1.32 kiyohara if (hp->sc->sc_vendor_write_protect) 912 1.32 kiyohara return (*hp->sc->sc_vendor_write_protect)(hp->sc); 913 1.32 kiyohara 914 1.1 nonaka r = ISSET(HREAD4(hp, SDHC_PRESENT_STATE), SDHC_WRITE_PROTECT_SWITCH); 915 1.1 nonaka 916 1.12 nonaka return r ? 0 : 1; 917 1.1 nonaka } 918 1.1 nonaka 919 1.1 nonaka /* 920 1.1 nonaka * Set or change SD bus voltage and enable or disable SD bus power. 921 1.1 nonaka * Return zero on success. 922 1.1 nonaka */ 923 1.1 nonaka static int 924 1.1 nonaka sdhc_bus_power(sdmmc_chipset_handle_t sch, uint32_t ocr) 925 1.1 nonaka { 926 1.1 nonaka struct sdhc_host *hp = (struct sdhc_host *)sch; 927 1.1 nonaka uint8_t vdd; 928 1.1 nonaka int error = 0; 929 1.32 kiyohara const uint32_t pcmask = 930 1.32 kiyohara ~(SDHC_BUS_POWER | (SDHC_VOLTAGE_MASK << SDHC_VOLTAGE_SHIFT)); 931 1.105 mlelstv uint32_t reg; 932 1.1 nonaka 933 1.65 jmcneill mutex_enter(&hp->intr_lock); 934 1.1 nonaka 935 1.1 nonaka /* 936 1.1 nonaka * Disable bus power before voltage change. 937 1.1 nonaka */ 938 1.122 jmcneill if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_NO_PWR0)) { 939 1.105 mlelstv hp->vdd = 0; 940 1.1 nonaka HWRITE1(hp, SDHC_POWER_CTL, 0); 941 1.105 mlelstv } 942 1.1 nonaka 943 1.1 nonaka /* If power is disabled, reset the host and return now. */ 944 1.1 nonaka if (ocr == 0) { 945 1.1 nonaka (void)sdhc_host_reset1(hp); 946 1.80 jmcneill callout_halt(&hp->tuning_timer, &hp->intr_lock); 947 1.1 nonaka goto out; 948 1.1 nonaka } 949 1.1 nonaka 950 1.1 nonaka /* 951 1.1 nonaka * Select the lowest voltage according to capabilities. 952 1.1 nonaka */ 953 1.1 nonaka ocr &= hp->ocr; 954 1.95 nonaka if (ISSET(ocr, MMC_OCR_1_65V_1_95V)) { 955 1.1 nonaka vdd = SDHC_VOLTAGE_1_8V; 956 1.11 matt } else if (ISSET(ocr, MMC_OCR_2_9V_3_0V|MMC_OCR_3_0V_3_1V)) { 957 1.1 nonaka vdd = SDHC_VOLTAGE_3_0V; 958 1.11 matt } else if (ISSET(ocr, MMC_OCR_3_2V_3_3V|MMC_OCR_3_3V_3_4V)) { 959 1.1 nonaka vdd = SDHC_VOLTAGE_3_3V; 960 1.11 matt } else { 961 1.1 nonaka /* Unsupported voltage level requested. */ 962 1.1 nonaka error = EINVAL; 963 1.1 nonaka goto out; 964 1.1 nonaka } 965 1.1 nonaka 966 1.105 mlelstv /* 967 1.105 mlelstv * Did voltage change ? 968 1.105 mlelstv */ 969 1.105 mlelstv if (vdd == hp->vdd) 970 1.105 mlelstv goto out; 971 1.105 mlelstv 972 1.11 matt if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED)) { 973 1.11 matt /* 974 1.11 matt * Enable bus power. Wait at least 1 ms (or 74 clocks) plus 975 1.11 matt * voltage ramp until power rises. 976 1.11 matt */ 977 1.57 jmcneill 978 1.57 jmcneill if (ISSET(hp->sc->sc_flags, SDHC_FLAG_SINGLE_POWER_WRITE)) { 979 1.57 jmcneill HWRITE1(hp, SDHC_POWER_CTL, 980 1.57 jmcneill (vdd << SDHC_VOLTAGE_SHIFT) | SDHC_BUS_POWER); 981 1.57 jmcneill } else { 982 1.105 mlelstv reg = HREAD1(hp, SDHC_POWER_CTL) & pcmask; 983 1.105 mlelstv HWRITE1(hp, SDHC_POWER_CTL, reg); 984 1.57 jmcneill sdmmc_delay(1); 985 1.105 mlelstv reg |= (vdd << SDHC_VOLTAGE_SHIFT); 986 1.105 mlelstv HWRITE1(hp, SDHC_POWER_CTL, reg); 987 1.57 jmcneill sdmmc_delay(1); 988 1.105 mlelstv reg |= SDHC_BUS_POWER; 989 1.105 mlelstv HWRITE1(hp, SDHC_POWER_CTL, reg); 990 1.57 jmcneill sdmmc_delay(10000); 991 1.57 jmcneill } 992 1.1 nonaka 993 1.11 matt /* 994 1.11 matt * The host system may not power the bus due to battery low, 995 1.11 matt * etc. In that case, the host controller should clear the 996 1.11 matt * bus power bit. 997 1.11 matt */ 998 1.11 matt if (!ISSET(HREAD1(hp, SDHC_POWER_CTL), SDHC_BUS_POWER)) { 999 1.11 matt error = ENXIO; 1000 1.11 matt goto out; 1001 1.11 matt } 1002 1.1 nonaka } 1003 1.1 nonaka 1004 1.105 mlelstv /* power successfully changed */ 1005 1.105 mlelstv hp->vdd = vdd; 1006 1.105 mlelstv 1007 1.1 nonaka out: 1008 1.65 jmcneill mutex_exit(&hp->intr_lock); 1009 1.1 nonaka 1010 1.1 nonaka return error; 1011 1.1 nonaka } 1012 1.1 nonaka 1013 1.1 nonaka /* 1014 1.1 nonaka * Return the smallest possible base clock frequency divisor value 1015 1.1 nonaka * for the CLOCK_CTL register to produce `freq' (KHz). 1016 1.1 nonaka */ 1017 1.11 matt static bool 1018 1.11 matt sdhc_clock_divisor(struct sdhc_host *hp, u_int freq, u_int *divp) 1019 1.1 nonaka { 1020 1.11 matt u_int div; 1021 1.1 nonaka 1022 1.11 matt if (ISSET(hp->sc->sc_flags, SDHC_FLAG_HAVE_CGM)) { 1023 1.11 matt for (div = hp->clkbase / freq; div <= 0x3ff; div++) { 1024 1.11 matt if ((hp->clkbase / div) <= freq) { 1025 1.11 matt *divp = SDHC_SDCLK_CGM 1026 1.11 matt | ((div & 0x300) << SDHC_SDCLK_XDIV_SHIFT) 1027 1.11 matt | ((div & 0x0ff) << SDHC_SDCLK_DIV_SHIFT); 1028 1.18 jakllsch //freq = hp->clkbase / div; 1029 1.11 matt return true; 1030 1.11 matt } 1031 1.11 matt } 1032 1.11 matt /* No divisor found. */ 1033 1.11 matt return false; 1034 1.11 matt } 1035 1.11 matt if (ISSET(hp->sc->sc_flags, SDHC_FLAG_HAVE_DVS)) { 1036 1.11 matt u_int dvs = (hp->clkbase + freq - 1) / freq; 1037 1.11 matt u_int roundup = dvs & 1; 1038 1.11 matt for (dvs >>= 1, div = 1; div <= 256; div <<= 1, dvs >>= 1) { 1039 1.11 matt if (dvs + roundup <= 16) { 1040 1.11 matt dvs += roundup - 1; 1041 1.11 matt *divp = (div << SDHC_SDCLK_DIV_SHIFT) 1042 1.11 matt | (dvs << SDHC_SDCLK_DVS_SHIFT); 1043 1.11 matt DPRINTF(2, 1044 1.11 matt ("%s: divisor for freq %u is %u * %u\n", 1045 1.11 matt HDEVNAME(hp), freq, div * 2, dvs + 1)); 1046 1.18 jakllsch //freq = hp->clkbase / (div * 2) * (dvs + 1); 1047 1.11 matt return true; 1048 1.9 matt } 1049 1.11 matt /* 1050 1.11 matt * If we drop bits, we need to round up the divisor. 1051 1.11 matt */ 1052 1.11 matt roundup |= dvs & 1; 1053 1.9 matt } 1054 1.18 jakllsch /* No divisor found. */ 1055 1.18 jakllsch return false; 1056 1.38 jakllsch } 1057 1.38 jakllsch if (hp->sc->sc_clkmsk != 0) { 1058 1.38 jakllsch div = howmany(hp->clkbase, freq); 1059 1.38 jakllsch if (div > (hp->sc->sc_clkmsk >> (ffs(hp->sc->sc_clkmsk) - 1))) 1060 1.38 jakllsch return false; 1061 1.38 jakllsch *divp = div << (ffs(hp->sc->sc_clkmsk) - 1); 1062 1.38 jakllsch //freq = hp->clkbase / div; 1063 1.38 jakllsch return true; 1064 1.38 jakllsch } 1065 1.56 jmcneill if (hp->specver >= SDHC_SPEC_VERS_300) { 1066 1.38 jakllsch div = howmany(hp->clkbase, freq); 1067 1.50 mlelstv div = div > 1 ? howmany(div, 2) : 0; 1068 1.38 jakllsch if (div > 0x3ff) 1069 1.38 jakllsch return false; 1070 1.38 jakllsch *divp = (((div >> 8) & SDHC_SDCLK_XDIV_MASK) 1071 1.38 jakllsch << SDHC_SDCLK_XDIV_SHIFT) | 1072 1.38 jakllsch (((div >> 0) & SDHC_SDCLK_DIV_MASK) 1073 1.38 jakllsch << SDHC_SDCLK_DIV_SHIFT); 1074 1.67 mlelstv //freq = hp->clkbase / (div ? div * 2 : 1); 1075 1.38 jakllsch return true; 1076 1.9 matt } else { 1077 1.38 jakllsch for (div = 1; div <= 256; div *= 2) { 1078 1.38 jakllsch if ((hp->clkbase / div) <= freq) { 1079 1.38 jakllsch *divp = (div / 2) << SDHC_SDCLK_DIV_SHIFT; 1080 1.38 jakllsch //freq = hp->clkbase / div; 1081 1.38 jakllsch return true; 1082 1.38 jakllsch } 1083 1.38 jakllsch } 1084 1.38 jakllsch /* No divisor found. */ 1085 1.38 jakllsch return false; 1086 1.9 matt } 1087 1.1 nonaka /* No divisor found. */ 1088 1.11 matt return false; 1089 1.1 nonaka } 1090 1.1 nonaka 1091 1.1 nonaka /* 1092 1.1 nonaka * Set or change SDCLK frequency or disable the SD clock. 1093 1.1 nonaka * Return zero on success. 1094 1.1 nonaka */ 1095 1.1 nonaka static int 1096 1.76 jmcneill sdhc_bus_clock_ddr(sdmmc_chipset_handle_t sch, int freq, bool ddr) 1097 1.1 nonaka { 1098 1.1 nonaka struct sdhc_host *hp = (struct sdhc_host *)sch; 1099 1.11 matt u_int div; 1100 1.11 matt u_int timo; 1101 1.32 kiyohara int16_t reg; 1102 1.1 nonaka int error = 0; 1103 1.65 jmcneill bool present __diagused; 1104 1.65 jmcneill 1105 1.2 cegger #ifdef DIAGNOSTIC 1106 1.12 nonaka present = ISSET(HREAD4(hp, SDHC_PRESENT_STATE), SDHC_CMD_INHIBIT_MASK); 1107 1.1 nonaka 1108 1.1 nonaka /* Must not stop the clock if commands are in progress. */ 1109 1.12 nonaka if (present && sdhc_card_detect(hp)) { 1110 1.26 matt aprint_normal_dev(hp->sc->sc_dev, 1111 1.26 matt "%s: command in progress\n", __func__); 1112 1.12 nonaka } 1113 1.1 nonaka #endif 1114 1.1 nonaka 1115 1.34 matt if (hp->sc->sc_vendor_bus_clock) { 1116 1.114 mrg mutex_enter(&hp->bus_clock_lock); 1117 1.34 matt error = (*hp->sc->sc_vendor_bus_clock)(hp->sc, freq); 1118 1.114 mrg mutex_exit(&hp->bus_clock_lock); 1119 1.34 matt if (error != 0) 1120 1.114 mrg return error; 1121 1.34 matt } 1122 1.34 matt 1123 1.114 mrg mutex_enter(&hp->intr_lock); 1124 1.114 mrg 1125 1.1 nonaka /* 1126 1.1 nonaka * Stop SD clock before changing the frequency. 1127 1.1 nonaka */ 1128 1.93 ryo if (ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) { 1129 1.93 ryo HCLR4(hp, SDHC_VEND_SPEC, 1130 1.93 ryo SDHC_VEND_SPEC_CARD_CLK_SOFT_EN | 1131 1.93 ryo SDHC_VEND_SPEC_FRC_SDCLK_ON); 1132 1.93 ryo if (freq == SDMMC_SDCLK_OFF) { 1133 1.93 ryo goto out; 1134 1.93 ryo } 1135 1.93 ryo } else if (ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED)) { 1136 1.11 matt HCLR4(hp, SDHC_CLOCK_CTL, 0xfff8); 1137 1.11 matt if (freq == SDMMC_SDCLK_OFF) { 1138 1.11 matt HSET4(hp, SDHC_CLOCK_CTL, 0x80f0); 1139 1.11 matt goto out; 1140 1.11 matt } 1141 1.11 matt } else { 1142 1.32 kiyohara HCLR2(hp, SDHC_CLOCK_CTL, SDHC_SDCLK_ENABLE); 1143 1.11 matt if (freq == SDMMC_SDCLK_OFF) 1144 1.11 matt goto out; 1145 1.11 matt } 1146 1.1 nonaka 1147 1.93 ryo if (ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) { 1148 1.93 ryo if (ddr) 1149 1.93 ryo HSET4(hp, SDHC_MIX_CTRL, SDHC_USDHC_DDR_EN); 1150 1.93 ryo else 1151 1.93 ryo HCLR4(hp, SDHC_MIX_CTRL, SDHC_USDHC_DDR_EN); 1152 1.93 ryo } else if (hp->specver >= SDHC_SPEC_VERS_300) { 1153 1.71 jmcneill HCLR2(hp, SDHC_HOST_CTL2, SDHC_UHS_MODE_SELECT_MASK); 1154 1.71 jmcneill if (freq > 100000) { 1155 1.71 jmcneill HSET2(hp, SDHC_HOST_CTL2, SDHC_UHS_MODE_SELECT_SDR104); 1156 1.71 jmcneill } else if (freq > 50000) { 1157 1.98 nonaka if (ddr) { 1158 1.98 nonaka HSET2(hp, SDHC_HOST_CTL2, 1159 1.98 nonaka SDHC_UHS_MODE_SELECT_DDR50); 1160 1.98 nonaka } else { 1161 1.98 nonaka HSET2(hp, SDHC_HOST_CTL2, 1162 1.98 nonaka SDHC_UHS_MODE_SELECT_SDR50); 1163 1.98 nonaka } 1164 1.71 jmcneill } else if (freq > 25000) { 1165 1.76 jmcneill if (ddr) { 1166 1.76 jmcneill HSET2(hp, SDHC_HOST_CTL2, 1167 1.76 jmcneill SDHC_UHS_MODE_SELECT_DDR50); 1168 1.76 jmcneill } else { 1169 1.76 jmcneill HSET2(hp, SDHC_HOST_CTL2, 1170 1.76 jmcneill SDHC_UHS_MODE_SELECT_SDR25); 1171 1.76 jmcneill } 1172 1.74 jmcneill } else if (freq > 400) { 1173 1.71 jmcneill HSET2(hp, SDHC_HOST_CTL2, SDHC_UHS_MODE_SELECT_SDR12); 1174 1.71 jmcneill } 1175 1.71 jmcneill } 1176 1.71 jmcneill 1177 1.1 nonaka /* 1178 1.82 mlelstv * Slow down Ricoh 5U823 controller that isn't reliable 1179 1.82 mlelstv * at 100MHz bus clock. 1180 1.82 mlelstv */ 1181 1.82 mlelstv if (ISSET(hp->sc->sc_flags, SDHC_FLAG_SLOW_SDR50)) { 1182 1.82 mlelstv if (freq == 100000) 1183 1.82 mlelstv --freq; 1184 1.82 mlelstv } 1185 1.82 mlelstv 1186 1.82 mlelstv /* 1187 1.1 nonaka * Set the minimum base clock frequency divisor. 1188 1.1 nonaka */ 1189 1.11 matt if (!sdhc_clock_divisor(hp, freq, &div)) { 1190 1.1 nonaka /* Invalid base clock frequency or `freq' value. */ 1191 1.68 mlelstv aprint_error_dev(hp->sc->sc_dev, 1192 1.68 mlelstv "Invalid bus clock %d kHz\n", freq); 1193 1.1 nonaka error = EINVAL; 1194 1.1 nonaka goto out; 1195 1.1 nonaka } 1196 1.93 ryo if (ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) { 1197 1.93 ryo if (ddr) { 1198 1.93 ryo /* in ddr mode, divisor >>= 1 */ 1199 1.93 ryo div = ((div >> 1) & (SDHC_SDCLK_DIV_MASK << 1200 1.93 ryo SDHC_SDCLK_DIV_SHIFT)) | 1201 1.93 ryo (div & (SDHC_SDCLK_DVS_MASK << 1202 1.93 ryo SDHC_SDCLK_DVS_SHIFT)); 1203 1.93 ryo } 1204 1.93 ryo for (timo = 1000; timo > 0; timo--) { 1205 1.93 ryo if (ISSET(HREAD4(hp, SDHC_PRESENT_STATE), SDHC_SDSTB)) 1206 1.93 ryo break; 1207 1.93 ryo sdmmc_delay(10); 1208 1.93 ryo } 1209 1.93 ryo HWRITE4(hp, SDHC_CLOCK_CTL, 1210 1.93 ryo div | (SDHC_TIMEOUT_MAX << 16) | 0x0f); 1211 1.93 ryo } else if (ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED)) { 1212 1.11 matt HWRITE4(hp, SDHC_CLOCK_CTL, 1213 1.11 matt div | (SDHC_TIMEOUT_MAX << 16)); 1214 1.11 matt } else { 1215 1.32 kiyohara reg = HREAD2(hp, SDHC_CLOCK_CTL); 1216 1.32 kiyohara reg &= (SDHC_INTCLK_STABLE | SDHC_INTCLK_ENABLE); 1217 1.32 kiyohara HWRITE2(hp, SDHC_CLOCK_CTL, reg | div); 1218 1.11 matt } 1219 1.1 nonaka 1220 1.1 nonaka /* 1221 1.1 nonaka * Start internal clock. Wait 10ms for stabilization. 1222 1.1 nonaka */ 1223 1.93 ryo if (ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) { 1224 1.93 ryo HSET4(hp, SDHC_VEND_SPEC, 1225 1.93 ryo SDHC_VEND_SPEC_CARD_CLK_SOFT_EN | 1226 1.93 ryo SDHC_VEND_SPEC_FRC_SDCLK_ON); 1227 1.93 ryo } else if (ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED)) { 1228 1.11 matt sdmmc_delay(10000); 1229 1.12 nonaka HSET4(hp, SDHC_CLOCK_CTL, 1230 1.12 nonaka 8 | SDHC_INTCLK_ENABLE | SDHC_INTCLK_STABLE); 1231 1.11 matt } else { 1232 1.11 matt HSET2(hp, SDHC_CLOCK_CTL, SDHC_INTCLK_ENABLE); 1233 1.11 matt for (timo = 1000; timo > 0; timo--) { 1234 1.12 nonaka if (ISSET(HREAD2(hp, SDHC_CLOCK_CTL), 1235 1.12 nonaka SDHC_INTCLK_STABLE)) 1236 1.11 matt break; 1237 1.11 matt sdmmc_delay(10); 1238 1.11 matt } 1239 1.11 matt if (timo == 0) { 1240 1.11 matt error = ETIMEDOUT; 1241 1.84 mlelstv DPRINTF(1,("%s: timeout\n", __func__)); 1242 1.11 matt goto out; 1243 1.11 matt } 1244 1.1 nonaka } 1245 1.1 nonaka 1246 1.93 ryo if (ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED | SDHC_FLAG_USDHC)) { 1247 1.11 matt HSET1(hp, SDHC_SOFTWARE_RESET, SDHC_INIT_ACTIVE); 1248 1.11 matt /* 1249 1.11 matt * Sending 80 clocks at 400kHz takes 200us. 1250 1.11 matt * So delay for that time + slop and then 1251 1.11 matt * check a few times for completion. 1252 1.11 matt */ 1253 1.11 matt sdmmc_delay(210); 1254 1.11 matt for (timo = 10; timo > 0; timo--) { 1255 1.11 matt if (!ISSET(HREAD1(hp, SDHC_SOFTWARE_RESET), 1256 1.11 matt SDHC_INIT_ACTIVE)) 1257 1.11 matt break; 1258 1.11 matt sdmmc_delay(10); 1259 1.11 matt } 1260 1.11 matt DPRINTF(2,("%s: %u init spins\n", __func__, 10 - timo)); 1261 1.12 nonaka 1262 1.11 matt /* 1263 1.11 matt * Enable SD clock. 1264 1.11 matt */ 1265 1.93 ryo if (ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) { 1266 1.93 ryo HSET4(hp, SDHC_VEND_SPEC, 1267 1.93 ryo SDHC_VEND_SPEC_CARD_CLK_SOFT_EN | 1268 1.93 ryo SDHC_VEND_SPEC_FRC_SDCLK_ON); 1269 1.93 ryo } else { 1270 1.93 ryo HSET4(hp, SDHC_CLOCK_CTL, SDHC_SDCLK_ENABLE); 1271 1.93 ryo } 1272 1.11 matt } else { 1273 1.11 matt /* 1274 1.11 matt * Enable SD clock. 1275 1.11 matt */ 1276 1.11 matt HSET2(hp, SDHC_CLOCK_CTL, SDHC_SDCLK_ENABLE); 1277 1.1 nonaka 1278 1.43 jmcneill if (freq > 25000 && 1279 1.43 jmcneill !ISSET(hp->sc->sc_flags, SDHC_FLAG_NO_HS_BIT)) 1280 1.11 matt HSET1(hp, SDHC_HOST_CTL, SDHC_HIGH_SPEED); 1281 1.11 matt else 1282 1.11 matt HCLR1(hp, SDHC_HOST_CTL, SDHC_HIGH_SPEED); 1283 1.11 matt } 1284 1.8 kiyohara 1285 1.114 mrg mutex_exit(&hp->intr_lock); 1286 1.114 mrg 1287 1.102 jmcneill if (hp->sc->sc_vendor_bus_clock_post) { 1288 1.114 mrg mutex_enter(&hp->bus_clock_lock); 1289 1.102 jmcneill error = (*hp->sc->sc_vendor_bus_clock_post)(hp->sc, freq); 1290 1.114 mrg mutex_exit(&hp->bus_clock_lock); 1291 1.102 jmcneill } 1292 1.114 mrg return error; 1293 1.102 jmcneill 1294 1.1 nonaka out: 1295 1.65 jmcneill mutex_exit(&hp->intr_lock); 1296 1.1 nonaka 1297 1.1 nonaka return error; 1298 1.1 nonaka } 1299 1.1 nonaka 1300 1.1 nonaka static int 1301 1.1 nonaka sdhc_bus_width(sdmmc_chipset_handle_t sch, int width) 1302 1.1 nonaka { 1303 1.1 nonaka struct sdhc_host *hp = (struct sdhc_host *)sch; 1304 1.1 nonaka int reg; 1305 1.1 nonaka 1306 1.1 nonaka switch (width) { 1307 1.1 nonaka case 1: 1308 1.1 nonaka case 4: 1309 1.1 nonaka break; 1310 1.1 nonaka 1311 1.11 matt case 8: 1312 1.11 matt if (ISSET(hp->sc->sc_flags, SDHC_FLAG_8BIT_MODE)) 1313 1.11 matt break; 1314 1.11 matt /* FALLTHROUGH */ 1315 1.1 nonaka default: 1316 1.1 nonaka DPRINTF(0,("%s: unsupported bus width (%d)\n", 1317 1.1 nonaka HDEVNAME(hp), width)); 1318 1.1 nonaka return 1; 1319 1.1 nonaka } 1320 1.1 nonaka 1321 1.89 jmcneill if (hp->sc->sc_vendor_bus_width) { 1322 1.89 jmcneill const int error = hp->sc->sc_vendor_bus_width(hp->sc, width); 1323 1.89 jmcneill if (error != 0) 1324 1.89 jmcneill return error; 1325 1.89 jmcneill } 1326 1.89 jmcneill 1327 1.65 jmcneill mutex_enter(&hp->intr_lock); 1328 1.65 jmcneill 1329 1.5 uebayasi reg = HREAD1(hp, SDHC_HOST_CTL); 1330 1.93 ryo if (ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED | SDHC_FLAG_USDHC)) { 1331 1.12 nonaka reg &= ~(SDHC_4BIT_MODE|SDHC_ESDHC_8BIT_MODE); 1332 1.11 matt if (width == 4) 1333 1.11 matt reg |= SDHC_4BIT_MODE; 1334 1.11 matt else if (width == 8) 1335 1.12 nonaka reg |= SDHC_ESDHC_8BIT_MODE; 1336 1.11 matt } else { 1337 1.11 matt reg &= ~SDHC_4BIT_MODE; 1338 1.59 jmcneill if (hp->specver >= SDHC_SPEC_VERS_300) { 1339 1.59 jmcneill reg &= ~SDHC_8BIT_MODE; 1340 1.59 jmcneill } 1341 1.59 jmcneill if (width == 4) { 1342 1.11 matt reg |= SDHC_4BIT_MODE; 1343 1.59 jmcneill } else if (width == 8 && hp->specver >= SDHC_SPEC_VERS_300) { 1344 1.59 jmcneill reg |= SDHC_8BIT_MODE; 1345 1.59 jmcneill } 1346 1.11 matt } 1347 1.5 uebayasi HWRITE1(hp, SDHC_HOST_CTL, reg); 1348 1.65 jmcneill 1349 1.65 jmcneill mutex_exit(&hp->intr_lock); 1350 1.1 nonaka 1351 1.1 nonaka return 0; 1352 1.1 nonaka } 1353 1.1 nonaka 1354 1.8 kiyohara static int 1355 1.8 kiyohara sdhc_bus_rod(sdmmc_chipset_handle_t sch, int on) 1356 1.8 kiyohara { 1357 1.32 kiyohara struct sdhc_host *hp = (struct sdhc_host *)sch; 1358 1.32 kiyohara 1359 1.32 kiyohara if (hp->sc->sc_vendor_rod) 1360 1.32 kiyohara return (*hp->sc->sc_vendor_rod)(hp->sc, on); 1361 1.8 kiyohara 1362 1.8 kiyohara return 0; 1363 1.8 kiyohara } 1364 1.8 kiyohara 1365 1.1 nonaka static void 1366 1.1 nonaka sdhc_card_enable_intr(sdmmc_chipset_handle_t sch, int enable) 1367 1.1 nonaka { 1368 1.1 nonaka struct sdhc_host *hp = (struct sdhc_host *)sch; 1369 1.1 nonaka 1370 1.93 ryo if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED | SDHC_FLAG_USDHC)) { 1371 1.65 jmcneill mutex_enter(&hp->intr_lock); 1372 1.11 matt if (enable) { 1373 1.11 matt HSET2(hp, SDHC_NINTR_STATUS_EN, SDHC_CARD_INTERRUPT); 1374 1.11 matt HSET2(hp, SDHC_NINTR_SIGNAL_EN, SDHC_CARD_INTERRUPT); 1375 1.11 matt } else { 1376 1.11 matt HCLR2(hp, SDHC_NINTR_SIGNAL_EN, SDHC_CARD_INTERRUPT); 1377 1.11 matt HCLR2(hp, SDHC_NINTR_STATUS_EN, SDHC_CARD_INTERRUPT); 1378 1.11 matt } 1379 1.65 jmcneill mutex_exit(&hp->intr_lock); 1380 1.1 nonaka } 1381 1.1 nonaka } 1382 1.1 nonaka 1383 1.47 skrll static void 1384 1.1 nonaka sdhc_card_intr_ack(sdmmc_chipset_handle_t sch) 1385 1.1 nonaka { 1386 1.1 nonaka struct sdhc_host *hp = (struct sdhc_host *)sch; 1387 1.1 nonaka 1388 1.93 ryo if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED | SDHC_FLAG_USDHC)) { 1389 1.65 jmcneill mutex_enter(&hp->intr_lock); 1390 1.11 matt HSET2(hp, SDHC_NINTR_STATUS_EN, SDHC_CARD_INTERRUPT); 1391 1.65 jmcneill mutex_exit(&hp->intr_lock); 1392 1.11 matt } 1393 1.1 nonaka } 1394 1.1 nonaka 1395 1.1 nonaka static int 1396 1.71 jmcneill sdhc_signal_voltage(sdmmc_chipset_handle_t sch, int signal_voltage) 1397 1.71 jmcneill { 1398 1.71 jmcneill struct sdhc_host *hp = (struct sdhc_host *)sch; 1399 1.100 jmcneill int error = 0; 1400 1.71 jmcneill 1401 1.98 nonaka if (hp->specver < SDHC_SPEC_VERS_300) 1402 1.98 nonaka return EINVAL; 1403 1.98 nonaka 1404 1.78 mlelstv mutex_enter(&hp->intr_lock); 1405 1.71 jmcneill switch (signal_voltage) { 1406 1.71 jmcneill case SDMMC_SIGNAL_VOLTAGE_180: 1407 1.100 jmcneill if (hp->sc->sc_vendor_signal_voltage != NULL) { 1408 1.100 jmcneill error = hp->sc->sc_vendor_signal_voltage(hp->sc, 1409 1.100 jmcneill signal_voltage); 1410 1.100 jmcneill if (error != 0) 1411 1.100 jmcneill break; 1412 1.100 jmcneill } 1413 1.93 ryo if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) 1414 1.93 ryo HSET2(hp, SDHC_HOST_CTL2, SDHC_1_8V_SIGNAL_EN); 1415 1.71 jmcneill break; 1416 1.71 jmcneill case SDMMC_SIGNAL_VOLTAGE_330: 1417 1.93 ryo if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) 1418 1.93 ryo HCLR2(hp, SDHC_HOST_CTL2, SDHC_1_8V_SIGNAL_EN); 1419 1.100 jmcneill if (hp->sc->sc_vendor_signal_voltage != NULL) { 1420 1.100 jmcneill error = hp->sc->sc_vendor_signal_voltage(hp->sc, 1421 1.100 jmcneill signal_voltage); 1422 1.100 jmcneill if (error != 0) 1423 1.100 jmcneill break; 1424 1.100 jmcneill } 1425 1.71 jmcneill break; 1426 1.71 jmcneill default: 1427 1.100 jmcneill error = EINVAL; 1428 1.100 jmcneill break; 1429 1.71 jmcneill } 1430 1.78 mlelstv mutex_exit(&hp->intr_lock); 1431 1.71 jmcneill 1432 1.100 jmcneill return error; 1433 1.71 jmcneill } 1434 1.71 jmcneill 1435 1.79 jmcneill /* 1436 1.79 jmcneill * Sampling clock tuning procedure (UHS) 1437 1.79 jmcneill */ 1438 1.79 jmcneill static int 1439 1.83 mlelstv sdhc_execute_tuning1(struct sdhc_host *hp, int timing) 1440 1.79 jmcneill { 1441 1.79 jmcneill struct sdmmc_command cmd; 1442 1.79 jmcneill uint8_t hostctl; 1443 1.79 jmcneill int opcode, error, retry = 40; 1444 1.79 jmcneill 1445 1.83 mlelstv KASSERT(mutex_owned(&hp->intr_lock)); 1446 1.83 mlelstv 1447 1.80 jmcneill hp->tuning_timing = timing; 1448 1.80 jmcneill 1449 1.79 jmcneill switch (timing) { 1450 1.79 jmcneill case SDMMC_TIMING_MMC_HS200: 1451 1.79 jmcneill opcode = MMC_SEND_TUNING_BLOCK_HS200; 1452 1.79 jmcneill break; 1453 1.79 jmcneill case SDMMC_TIMING_UHS_SDR50: 1454 1.79 jmcneill if (!ISSET(hp->sc->sc_caps2, SDHC_TUNING_SDR50)) 1455 1.79 jmcneill return 0; 1456 1.79 jmcneill /* FALLTHROUGH */ 1457 1.79 jmcneill case SDMMC_TIMING_UHS_SDR104: 1458 1.79 jmcneill opcode = MMC_SEND_TUNING_BLOCK; 1459 1.79 jmcneill break; 1460 1.79 jmcneill default: 1461 1.79 jmcneill return EINVAL; 1462 1.79 jmcneill } 1463 1.79 jmcneill 1464 1.79 jmcneill hostctl = HREAD1(hp, SDHC_HOST_CTL); 1465 1.79 jmcneill 1466 1.79 jmcneill /* enable buffer read ready interrupt */ 1467 1.79 jmcneill HSET2(hp, SDHC_NINTR_SIGNAL_EN, SDHC_BUFFER_READ_READY); 1468 1.79 jmcneill HSET2(hp, SDHC_NINTR_STATUS_EN, SDHC_BUFFER_READ_READY); 1469 1.79 jmcneill 1470 1.79 jmcneill /* disable DMA */ 1471 1.79 jmcneill HCLR1(hp, SDHC_HOST_CTL, SDHC_DMA_SELECT); 1472 1.79 jmcneill 1473 1.79 jmcneill /* reset tuning circuit */ 1474 1.79 jmcneill HCLR2(hp, SDHC_HOST_CTL2, SDHC_SAMPLING_CLOCK_SEL); 1475 1.79 jmcneill 1476 1.79 jmcneill /* start of tuning */ 1477 1.79 jmcneill HWRITE2(hp, SDHC_HOST_CTL2, SDHC_EXECUTE_TUNING); 1478 1.79 jmcneill 1479 1.79 jmcneill do { 1480 1.79 jmcneill memset(&cmd, 0, sizeof(cmd)); 1481 1.79 jmcneill cmd.c_opcode = opcode; 1482 1.79 jmcneill cmd.c_arg = 0; 1483 1.79 jmcneill cmd.c_flags = SCF_CMD_ADTC | SCF_CMD_READ | SCF_RSP_R1; 1484 1.79 jmcneill if (ISSET(hostctl, SDHC_8BIT_MODE)) { 1485 1.79 jmcneill cmd.c_blklen = cmd.c_datalen = 128; 1486 1.79 jmcneill } else { 1487 1.79 jmcneill cmd.c_blklen = cmd.c_datalen = 64; 1488 1.79 jmcneill } 1489 1.79 jmcneill 1490 1.79 jmcneill error = sdhc_start_command(hp, &cmd); 1491 1.79 jmcneill if (error) 1492 1.79 jmcneill break; 1493 1.79 jmcneill 1494 1.79 jmcneill if (!sdhc_wait_intr(hp, SDHC_BUFFER_READ_READY, 1495 1.88 mlelstv SDHC_TUNING_TIMEOUT, false)) { 1496 1.79 jmcneill break; 1497 1.79 jmcneill } 1498 1.79 jmcneill 1499 1.79 jmcneill delay(1000); 1500 1.79 jmcneill } while (HREAD2(hp, SDHC_HOST_CTL2) & SDHC_EXECUTE_TUNING && --retry); 1501 1.79 jmcneill 1502 1.79 jmcneill /* disable buffer read ready interrupt */ 1503 1.79 jmcneill HCLR2(hp, SDHC_NINTR_SIGNAL_EN, SDHC_BUFFER_READ_READY); 1504 1.79 jmcneill HCLR2(hp, SDHC_NINTR_STATUS_EN, SDHC_BUFFER_READ_READY); 1505 1.79 jmcneill 1506 1.79 jmcneill if (HREAD2(hp, SDHC_HOST_CTL2) & SDHC_EXECUTE_TUNING) { 1507 1.79 jmcneill HCLR2(hp, SDHC_HOST_CTL2, 1508 1.79 jmcneill SDHC_SAMPLING_CLOCK_SEL|SDHC_EXECUTE_TUNING); 1509 1.79 jmcneill sdhc_soft_reset(hp, SDHC_RESET_DAT|SDHC_RESET_CMD); 1510 1.79 jmcneill aprint_error_dev(hp->sc->sc_dev, 1511 1.79 jmcneill "tuning did not complete, using fixed sampling clock\n"); 1512 1.103 jmcneill return 0; /* tuning did not complete */ 1513 1.79 jmcneill } 1514 1.79 jmcneill 1515 1.79 jmcneill if ((HREAD2(hp, SDHC_HOST_CTL2) & SDHC_SAMPLING_CLOCK_SEL) == 0) { 1516 1.79 jmcneill HCLR2(hp, SDHC_HOST_CTL2, 1517 1.79 jmcneill SDHC_SAMPLING_CLOCK_SEL|SDHC_EXECUTE_TUNING); 1518 1.79 jmcneill sdhc_soft_reset(hp, SDHC_RESET_DAT|SDHC_RESET_CMD); 1519 1.79 jmcneill aprint_error_dev(hp->sc->sc_dev, 1520 1.79 jmcneill "tuning failed, using fixed sampling clock\n"); 1521 1.103 jmcneill return 0; /* tuning failed */ 1522 1.79 jmcneill } 1523 1.79 jmcneill 1524 1.80 jmcneill if (hp->tuning_timer_count) { 1525 1.80 jmcneill callout_schedule(&hp->tuning_timer, 1526 1.80 jmcneill hz * hp->tuning_timer_count); 1527 1.80 jmcneill } 1528 1.80 jmcneill 1529 1.79 jmcneill return 0; /* tuning completed */ 1530 1.79 jmcneill } 1531 1.79 jmcneill 1532 1.83 mlelstv static int 1533 1.83 mlelstv sdhc_execute_tuning(sdmmc_chipset_handle_t sch, int timing) 1534 1.83 mlelstv { 1535 1.83 mlelstv struct sdhc_host *hp = (struct sdhc_host *)sch; 1536 1.83 mlelstv int error; 1537 1.83 mlelstv 1538 1.83 mlelstv mutex_enter(&hp->intr_lock); 1539 1.83 mlelstv error = sdhc_execute_tuning1(hp, timing); 1540 1.83 mlelstv mutex_exit(&hp->intr_lock); 1541 1.83 mlelstv return error; 1542 1.83 mlelstv } 1543 1.83 mlelstv 1544 1.80 jmcneill static void 1545 1.80 jmcneill sdhc_tuning_timer(void *arg) 1546 1.80 jmcneill { 1547 1.80 jmcneill struct sdhc_host *hp = arg; 1548 1.80 jmcneill 1549 1.80 jmcneill atomic_swap_uint(&hp->tuning_timer_pending, 1); 1550 1.80 jmcneill } 1551 1.80 jmcneill 1552 1.99 nonaka static void 1553 1.99 nonaka sdhc_hw_reset(sdmmc_chipset_handle_t sch) 1554 1.99 nonaka { 1555 1.99 nonaka struct sdhc_host *hp = (struct sdhc_host *)sch; 1556 1.99 nonaka struct sdhc_softc *sc = hp->sc; 1557 1.99 nonaka 1558 1.99 nonaka if (sc->sc_vendor_hw_reset != NULL) 1559 1.99 nonaka sc->sc_vendor_hw_reset(sc, hp); 1560 1.99 nonaka } 1561 1.99 nonaka 1562 1.71 jmcneill static int 1563 1.1 nonaka sdhc_wait_state(struct sdhc_host *hp, uint32_t mask, uint32_t value) 1564 1.1 nonaka { 1565 1.121 jmcneill struct timeval start, diff; 1566 1.1 nonaka uint32_t state; 1567 1.1 nonaka 1568 1.121 jmcneill microuptime(&start); 1569 1.121 jmcneill for (;;) { 1570 1.121 jmcneill state = HREAD4(hp, SDHC_PRESENT_STATE); 1571 1.121 jmcneill if ((state & mask) == value) { 1572 1.1 nonaka return 0; 1573 1.121 jmcneill } 1574 1.121 jmcneill microuptime(&diff); 1575 1.121 jmcneill timersub(&diff, &start, &diff); 1576 1.121 jmcneill if (diff.tv_sec != 0) { 1577 1.121 jmcneill aprint_error_dev(hp->sc->sc_dev, 1578 1.121 jmcneill "timeout waiting for mask %#x value %#x " 1579 1.121 jmcneill "(state=%#x)\n", 1580 1.121 jmcneill mask, value, state); 1581 1.121 jmcneill return ETIMEDOUT; 1582 1.121 jmcneill } 1583 1.1 nonaka } 1584 1.1 nonaka } 1585 1.1 nonaka 1586 1.1 nonaka static void 1587 1.1 nonaka sdhc_exec_command(sdmmc_chipset_handle_t sch, struct sdmmc_command *cmd) 1588 1.1 nonaka { 1589 1.1 nonaka struct sdhc_host *hp = (struct sdhc_host *)sch; 1590 1.1 nonaka int error; 1591 1.88 mlelstv bool probing; 1592 1.1 nonaka 1593 1.83 mlelstv mutex_enter(&hp->intr_lock); 1594 1.83 mlelstv 1595 1.80 jmcneill if (atomic_cas_uint(&hp->tuning_timer_pending, 1, 0) == 1) { 1596 1.83 mlelstv (void)sdhc_execute_tuning1(hp, hp->tuning_timing); 1597 1.80 jmcneill } 1598 1.80 jmcneill 1599 1.93 ryo if (cmd->c_data && 1600 1.93 ryo ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED | SDHC_FLAG_USDHC)) { 1601 1.11 matt const uint16_t ready = SDHC_BUFFER_READ_READY | SDHC_BUFFER_WRITE_READY; 1602 1.11 matt if (ISSET(hp->flags, SHF_USE_DMA)) { 1603 1.11 matt HCLR2(hp, SDHC_NINTR_SIGNAL_EN, ready); 1604 1.11 matt HCLR2(hp, SDHC_NINTR_STATUS_EN, ready); 1605 1.11 matt } else { 1606 1.11 matt HSET2(hp, SDHC_NINTR_SIGNAL_EN, ready); 1607 1.11 matt HSET2(hp, SDHC_NINTR_STATUS_EN, ready); 1608 1.47 skrll } 1609 1.11 matt } 1610 1.11 matt 1611 1.61 jmcneill if (ISSET(hp->sc->sc_flags, SDHC_FLAG_NO_TIMEOUT)) { 1612 1.61 jmcneill const uint16_t eintr = SDHC_CMD_TIMEOUT_ERROR; 1613 1.61 jmcneill if (cmd->c_data != NULL) { 1614 1.61 jmcneill HCLR2(hp, SDHC_EINTR_SIGNAL_EN, eintr); 1615 1.61 jmcneill HCLR2(hp, SDHC_EINTR_STATUS_EN, eintr); 1616 1.61 jmcneill } else { 1617 1.61 jmcneill HSET2(hp, SDHC_EINTR_SIGNAL_EN, eintr); 1618 1.61 jmcneill HSET2(hp, SDHC_EINTR_STATUS_EN, eintr); 1619 1.61 jmcneill } 1620 1.61 jmcneill } 1621 1.61 jmcneill 1622 1.102 jmcneill if (ISSET(hp->sc->sc_flags, SDHC_FLAG_STOP_WITH_TC)) { 1623 1.102 jmcneill if (cmd->c_opcode == MMC_STOP_TRANSMISSION) 1624 1.102 jmcneill SET(cmd->c_flags, SCF_RSP_BSY); 1625 1.102 jmcneill } 1626 1.102 jmcneill 1627 1.1 nonaka /* 1628 1.1 nonaka * Start the MMC command, or mark `cmd' as failed and return. 1629 1.1 nonaka */ 1630 1.1 nonaka error = sdhc_start_command(hp, cmd); 1631 1.1 nonaka if (error) { 1632 1.1 nonaka cmd->c_error = error; 1633 1.1 nonaka goto out; 1634 1.1 nonaka } 1635 1.1 nonaka 1636 1.1 nonaka /* 1637 1.1 nonaka * Wait until the command phase is done, or until the command 1638 1.1 nonaka * is marked done for any other reason. 1639 1.1 nonaka */ 1640 1.88 mlelstv probing = (cmd->c_flags & SCF_TOUT_OK) != 0; 1641 1.105 mlelstv if (!sdhc_wait_intr(hp, SDHC_COMMAND_COMPLETE, SDHC_COMMAND_TIMEOUT*3, probing)) { 1642 1.84 mlelstv DPRINTF(1,("%s: timeout for command\n", __func__)); 1643 1.94 kiyohara sdmmc_delay(50); 1644 1.1 nonaka cmd->c_error = ETIMEDOUT; 1645 1.1 nonaka goto out; 1646 1.1 nonaka } 1647 1.1 nonaka 1648 1.1 nonaka /* 1649 1.1 nonaka * The host controller removes bits [0:7] from the response 1650 1.1 nonaka * data (CRC) and we pass the data up unchanged to the bus 1651 1.1 nonaka * driver (without padding). 1652 1.1 nonaka */ 1653 1.1 nonaka if (cmd->c_error == 0 && ISSET(cmd->c_flags, SCF_RSP_PRESENT)) { 1654 1.23 matt cmd->c_resp[0] = HREAD4(hp, SDHC_RESPONSE + 0); 1655 1.23 matt if (ISSET(cmd->c_flags, SCF_RSP_136)) { 1656 1.23 matt cmd->c_resp[1] = HREAD4(hp, SDHC_RESPONSE + 4); 1657 1.23 matt cmd->c_resp[2] = HREAD4(hp, SDHC_RESPONSE + 8); 1658 1.23 matt cmd->c_resp[3] = HREAD4(hp, SDHC_RESPONSE + 12); 1659 1.32 kiyohara if (ISSET(hp->sc->sc_flags, SDHC_FLAG_RSP136_CRC)) { 1660 1.32 kiyohara cmd->c_resp[0] = (cmd->c_resp[0] >> 8) | 1661 1.32 kiyohara (cmd->c_resp[1] << 24); 1662 1.32 kiyohara cmd->c_resp[1] = (cmd->c_resp[1] >> 8) | 1663 1.32 kiyohara (cmd->c_resp[2] << 24); 1664 1.32 kiyohara cmd->c_resp[2] = (cmd->c_resp[2] >> 8) | 1665 1.32 kiyohara (cmd->c_resp[3] << 24); 1666 1.32 kiyohara cmd->c_resp[3] = (cmd->c_resp[3] >> 8); 1667 1.32 kiyohara } 1668 1.1 nonaka } 1669 1.1 nonaka } 1670 1.25 matt DPRINTF(1,("%s: resp = %08x\n", HDEVNAME(hp), cmd->c_resp[0])); 1671 1.1 nonaka 1672 1.1 nonaka /* 1673 1.1 nonaka * If the command has data to transfer in any direction, 1674 1.1 nonaka * execute the transfer now. 1675 1.1 nonaka */ 1676 1.1 nonaka if (cmd->c_error == 0 && cmd->c_data != NULL) 1677 1.1 nonaka sdhc_transfer_data(hp, cmd); 1678 1.42 jakllsch else if (ISSET(cmd->c_flags, SCF_RSP_BSY)) { 1679 1.97 kiyohara if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_NO_BUSY_INTR) && 1680 1.97 kiyohara !sdhc_wait_intr(hp, SDHC_TRANSFER_COMPLETE, hz * 10, false)) { 1681 1.85 mlelstv DPRINTF(1,("%s: sdhc_exec_command: RSP_BSY\n", 1682 1.85 mlelstv HDEVNAME(hp))); 1683 1.42 jakllsch cmd->c_error = ETIMEDOUT; 1684 1.42 jakllsch goto out; 1685 1.42 jakllsch } 1686 1.42 jakllsch } 1687 1.1 nonaka 1688 1.1 nonaka out: 1689 1.14 matt if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED) 1690 1.14 matt && !ISSET(hp->sc->sc_flags, SDHC_FLAG_NO_LED_ON)) { 1691 1.11 matt /* Turn off the LED. */ 1692 1.11 matt HCLR1(hp, SDHC_HOST_CTL, SDHC_LED_ON); 1693 1.11 matt } 1694 1.1 nonaka SET(cmd->c_flags, SCF_ITSDONE); 1695 1.1 nonaka 1696 1.97 kiyohara if (ISSET(hp->sc->sc_flags, SDHC_FLAG_NO_AUTO_STOP) && 1697 1.97 kiyohara cmd->c_opcode == MMC_STOP_TRANSMISSION) 1698 1.97 kiyohara (void)sdhc_soft_reset(hp, SDHC_RESET_CMD|SDHC_RESET_DAT); 1699 1.97 kiyohara 1700 1.65 jmcneill mutex_exit(&hp->intr_lock); 1701 1.65 jmcneill 1702 1.1 nonaka DPRINTF(1,("%s: cmd %d %s (flags=%08x error=%d)\n", HDEVNAME(hp), 1703 1.1 nonaka cmd->c_opcode, (cmd->c_error == 0) ? "done" : "abort", 1704 1.1 nonaka cmd->c_flags, cmd->c_error)); 1705 1.1 nonaka } 1706 1.1 nonaka 1707 1.1 nonaka static int 1708 1.1 nonaka sdhc_start_command(struct sdhc_host *hp, struct sdmmc_command *cmd) 1709 1.1 nonaka { 1710 1.11 matt struct sdhc_softc * const sc = hp->sc; 1711 1.1 nonaka uint16_t blksize = 0; 1712 1.1 nonaka uint16_t blkcount = 0; 1713 1.1 nonaka uint16_t mode; 1714 1.1 nonaka uint16_t command; 1715 1.84 mlelstv uint32_t pmask; 1716 1.1 nonaka int error; 1717 1.1 nonaka 1718 1.65 jmcneill KASSERT(mutex_owned(&hp->intr_lock)); 1719 1.65 jmcneill 1720 1.11 matt DPRINTF(1,("%s: start cmd %d arg=%08x data=%p dlen=%d flags=%08x, status=%#x\n", 1721 1.7 nonaka HDEVNAME(hp), cmd->c_opcode, cmd->c_arg, cmd->c_data, 1722 1.11 matt cmd->c_datalen, cmd->c_flags, HREAD4(hp, SDHC_NINTR_STATUS))); 1723 1.1 nonaka 1724 1.1 nonaka /* 1725 1.1 nonaka * The maximum block length for commands should be the minimum 1726 1.1 nonaka * of the host buffer size and the card buffer size. (1.7.2) 1727 1.1 nonaka */ 1728 1.1 nonaka 1729 1.1 nonaka /* Fragment the data into proper blocks. */ 1730 1.1 nonaka if (cmd->c_datalen > 0) { 1731 1.1 nonaka blksize = MIN(cmd->c_datalen, cmd->c_blklen); 1732 1.1 nonaka blkcount = cmd->c_datalen / blksize; 1733 1.1 nonaka if (cmd->c_datalen % blksize > 0) { 1734 1.1 nonaka /* XXX: Split this command. (1.7.4) */ 1735 1.11 matt aprint_error_dev(sc->sc_dev, 1736 1.1 nonaka "data not a multiple of %u bytes\n", blksize); 1737 1.1 nonaka return EINVAL; 1738 1.1 nonaka } 1739 1.1 nonaka } 1740 1.1 nonaka 1741 1.1 nonaka /* Check limit imposed by 9-bit block count. (1.7.2) */ 1742 1.1 nonaka if (blkcount > SDHC_BLOCK_COUNT_MAX) { 1743 1.11 matt aprint_error_dev(sc->sc_dev, "too much data\n"); 1744 1.1 nonaka return EINVAL; 1745 1.1 nonaka } 1746 1.1 nonaka 1747 1.1 nonaka /* Prepare transfer mode register value. (2.2.5) */ 1748 1.108 mlelstv mode = 0; 1749 1.1 nonaka if (ISSET(cmd->c_flags, SCF_CMD_READ)) 1750 1.1 nonaka mode |= SDHC_READ_MODE; 1751 1.108 mlelstv if (blkcount > 0) { 1752 1.108 mlelstv mode |= SDHC_BLOCK_COUNT_ENABLE; 1753 1.108 mlelstv if (blkcount > 1) { 1754 1.108 mlelstv mode |= SDHC_MULTI_BLOCK_MODE; 1755 1.108 mlelstv if (!ISSET(sc->sc_flags, SDHC_FLAG_NO_AUTO_STOP) 1756 1.108 mlelstv && !ISSET(cmd->c_flags, SCF_NO_STOP)) 1757 1.108 mlelstv mode |= SDHC_AUTO_CMD12_ENABLE; 1758 1.108 mlelstv } 1759 1.1 nonaka } 1760 1.45 jakllsch if (cmd->c_dmamap != NULL && cmd->c_datalen > 0 && 1761 1.55 bouyer ISSET(hp->flags, SHF_MODE_DMAEN)) { 1762 1.19 jakllsch mode |= SDHC_DMA_ENABLE; 1763 1.7 nonaka } 1764 1.1 nonaka 1765 1.1 nonaka /* 1766 1.1 nonaka * Prepare command register value. (2.2.6) 1767 1.1 nonaka */ 1768 1.12 nonaka command = (cmd->c_opcode & SDHC_COMMAND_INDEX_MASK) << SDHC_COMMAND_INDEX_SHIFT; 1769 1.1 nonaka 1770 1.1 nonaka if (ISSET(cmd->c_flags, SCF_RSP_CRC)) 1771 1.1 nonaka command |= SDHC_CRC_CHECK_ENABLE; 1772 1.1 nonaka if (ISSET(cmd->c_flags, SCF_RSP_IDX)) 1773 1.1 nonaka command |= SDHC_INDEX_CHECK_ENABLE; 1774 1.79 jmcneill if (cmd->c_datalen > 0) 1775 1.1 nonaka command |= SDHC_DATA_PRESENT_SELECT; 1776 1.1 nonaka 1777 1.1 nonaka if (!ISSET(cmd->c_flags, SCF_RSP_PRESENT)) 1778 1.1 nonaka command |= SDHC_NO_RESPONSE; 1779 1.1 nonaka else if (ISSET(cmd->c_flags, SCF_RSP_136)) 1780 1.1 nonaka command |= SDHC_RESP_LEN_136; 1781 1.1 nonaka else if (ISSET(cmd->c_flags, SCF_RSP_BSY)) 1782 1.1 nonaka command |= SDHC_RESP_LEN_48_CHK_BUSY; 1783 1.1 nonaka else 1784 1.1 nonaka command |= SDHC_RESP_LEN_48; 1785 1.1 nonaka 1786 1.84 mlelstv /* Wait until command and optionally data inhibit bits are clear. (1.5) */ 1787 1.84 mlelstv pmask = SDHC_CMD_INHIBIT_CMD; 1788 1.91 mlelstv if (cmd->c_flags & (SCF_CMD_ADTC|SCF_RSP_BSY)) 1789 1.84 mlelstv pmask |= SDHC_CMD_INHIBIT_DAT; 1790 1.84 mlelstv error = sdhc_wait_state(hp, pmask, 0); 1791 1.68 mlelstv if (error) { 1792 1.84 mlelstv (void) sdhc_soft_reset(hp, SDHC_RESET_DAT|SDHC_RESET_CMD); 1793 1.84 mlelstv device_printf(sc->sc_dev, "command or data phase inhibited\n"); 1794 1.1 nonaka return error; 1795 1.68 mlelstv } 1796 1.1 nonaka 1797 1.1 nonaka DPRINTF(1,("%s: writing cmd: blksize=%d blkcnt=%d mode=%04x cmd=%04x\n", 1798 1.1 nonaka HDEVNAME(hp), blksize, blkcount, mode, command)); 1799 1.1 nonaka 1800 1.93 ryo if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED | SDHC_FLAG_USDHC)) { 1801 1.44 hkenken blksize |= (MAX(0, PAGE_SHIFT - 12) & SDHC_DMA_BOUNDARY_MASK) << 1802 1.44 hkenken SDHC_DMA_BOUNDARY_SHIFT; /* PAGE_SIZE DMA boundary */ 1803 1.44 hkenken } 1804 1.19 jakllsch 1805 1.11 matt if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED)) { 1806 1.11 matt /* Alert the user not to remove the card. */ 1807 1.11 matt HSET1(hp, SDHC_HOST_CTL, SDHC_LED_ON); 1808 1.11 matt } 1809 1.1 nonaka 1810 1.7 nonaka /* Set DMA start address. */ 1811 1.79 jmcneill if (ISSET(hp->flags, SHF_USE_ADMA2_MASK) && cmd->c_data != NULL) { 1812 1.63 jmcneill for (int seg = 0; seg < cmd->c_dmamap->dm_nsegs; seg++) { 1813 1.69 jmcneill bus_addr_t paddr = 1814 1.63 jmcneill cmd->c_dmamap->dm_segs[seg].ds_addr; 1815 1.63 jmcneill uint16_t len = 1816 1.63 jmcneill cmd->c_dmamap->dm_segs[seg].ds_len == 65536 ? 1817 1.63 jmcneill 0 : cmd->c_dmamap->dm_segs[seg].ds_len; 1818 1.63 jmcneill uint16_t attr = 1819 1.63 jmcneill SDHC_ADMA2_VALID | SDHC_ADMA2_ACT_TRANS; 1820 1.63 jmcneill if (seg == cmd->c_dmamap->dm_nsegs - 1) { 1821 1.63 jmcneill attr |= SDHC_ADMA2_END; 1822 1.63 jmcneill } 1823 1.63 jmcneill if (ISSET(hp->flags, SHF_USE_ADMA2_32)) { 1824 1.63 jmcneill struct sdhc_adma2_descriptor32 *desc = 1825 1.63 jmcneill hp->adma2; 1826 1.63 jmcneill desc[seg].attribute = htole16(attr); 1827 1.63 jmcneill desc[seg].length = htole16(len); 1828 1.63 jmcneill desc[seg].address = htole32(paddr); 1829 1.63 jmcneill } else { 1830 1.63 jmcneill struct sdhc_adma2_descriptor64 *desc = 1831 1.63 jmcneill hp->adma2; 1832 1.63 jmcneill desc[seg].attribute = htole16(attr); 1833 1.63 jmcneill desc[seg].length = htole16(len); 1834 1.63 jmcneill desc[seg].address = htole32(paddr & 0xffffffff); 1835 1.63 jmcneill desc[seg].address_hi = htole32( 1836 1.63 jmcneill (uint64_t)paddr >> 32); 1837 1.63 jmcneill } 1838 1.63 jmcneill } 1839 1.63 jmcneill if (ISSET(hp->flags, SHF_USE_ADMA2_32)) { 1840 1.63 jmcneill struct sdhc_adma2_descriptor32 *desc = hp->adma2; 1841 1.63 jmcneill desc[cmd->c_dmamap->dm_nsegs].attribute = htole16(0); 1842 1.63 jmcneill } else { 1843 1.63 jmcneill struct sdhc_adma2_descriptor64 *desc = hp->adma2; 1844 1.63 jmcneill desc[cmd->c_dmamap->dm_nsegs].attribute = htole16(0); 1845 1.63 jmcneill } 1846 1.63 jmcneill bus_dmamap_sync(sc->sc_dmat, hp->adma_map, 0, PAGE_SIZE, 1847 1.63 jmcneill BUS_DMASYNC_PREWRITE); 1848 1.117 jmcneill 1849 1.117 jmcneill const bus_addr_t desc_addr = hp->adma_map->dm_segs[0].ds_addr; 1850 1.117 jmcneill HWRITE4(hp, SDHC_ADMA_SYSTEM_ADDR, desc_addr & 0xffffffff); 1851 1.117 jmcneill if (ISSET(hp->flags, SHF_USE_ADMA2_64)) { 1852 1.117 jmcneill HWRITE4(hp, SDHC_ADMA_SYSTEM_ADDR + 4, 1853 1.117 jmcneill (uint64_t)desc_addr >> 32); 1854 1.117 jmcneill } 1855 1.117 jmcneill 1856 1.93 ryo if (ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) { 1857 1.93 ryo HCLR4(hp, SDHC_HOST_CTL, SDHC_USDHC_DMA_SELECT); 1858 1.93 ryo HSET4(hp, SDHC_HOST_CTL, SDHC_USDHC_DMA_SELECT_ADMA2); 1859 1.93 ryo } else { 1860 1.93 ryo HCLR1(hp, SDHC_HOST_CTL, SDHC_DMA_SELECT); 1861 1.93 ryo HSET1(hp, SDHC_HOST_CTL, SDHC_DMA_SELECT_ADMA2); 1862 1.93 ryo } 1863 1.63 jmcneill } else if (ISSET(mode, SDHC_DMA_ENABLE) && 1864 1.63 jmcneill !ISSET(sc->sc_flags, SDHC_FLAG_EXTERNAL_DMA)) { 1865 1.93 ryo if (ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) { 1866 1.93 ryo HCLR4(hp, SDHC_HOST_CTL, SDHC_USDHC_DMA_SELECT); 1867 1.93 ryo } 1868 1.7 nonaka HWRITE4(hp, SDHC_DMA_ADDR, cmd->c_dmamap->dm_segs[0].ds_addr); 1869 1.63 jmcneill } 1870 1.7 nonaka 1871 1.1 nonaka /* 1872 1.1 nonaka * Start a CPU data transfer. Writing to the high order byte 1873 1.1 nonaka * of the SDHC_COMMAND register triggers the SD command. (1.5) 1874 1.1 nonaka */ 1875 1.11 matt if (ISSET(hp->sc->sc_flags, SDHC_FLAG_32BIT_ACCESS)) { 1876 1.11 matt HWRITE4(hp, SDHC_BLOCK_SIZE, blksize | (blkcount << 16)); 1877 1.11 matt HWRITE4(hp, SDHC_ARGUMENT, cmd->c_arg); 1878 1.93 ryo if (ISSET(hp->sc->sc_flags, SDHC_FLAG_USDHC)) { 1879 1.93 ryo /* mode bits is in MIX_CTRL register on uSDHC */ 1880 1.93 ryo HWRITE4(hp, SDHC_MIX_CTRL, mode | 1881 1.104 hkenken (HREAD4(hp, SDHC_MIX_CTRL) & ~SDHC_TRANSFER_MODE_MASK)); 1882 1.104 hkenken if (cmd->c_opcode == MMC_STOP_TRANSMISSION) 1883 1.104 hkenken command |= SDHC_COMMAND_TYPE_ABORT; 1884 1.93 ryo HWRITE4(hp, SDHC_TRANSFER_MODE, command << 16); 1885 1.93 ryo } else { 1886 1.93 ryo HWRITE4(hp, SDHC_TRANSFER_MODE, mode | (command << 16)); 1887 1.93 ryo } 1888 1.11 matt } else { 1889 1.11 matt HWRITE2(hp, SDHC_BLOCK_SIZE, blksize); 1890 1.15 jakllsch HWRITE2(hp, SDHC_BLOCK_COUNT, blkcount); 1891 1.11 matt HWRITE4(hp, SDHC_ARGUMENT, cmd->c_arg); 1892 1.15 jakllsch HWRITE2(hp, SDHC_TRANSFER_MODE, mode); 1893 1.11 matt HWRITE2(hp, SDHC_COMMAND, command); 1894 1.11 matt } 1895 1.1 nonaka 1896 1.1 nonaka return 0; 1897 1.1 nonaka } 1898 1.1 nonaka 1899 1.1 nonaka static void 1900 1.1 nonaka sdhc_transfer_data(struct sdhc_host *hp, struct sdmmc_command *cmd) 1901 1.1 nonaka { 1902 1.51 jmcneill struct sdhc_softc *sc = hp->sc; 1903 1.1 nonaka int error; 1904 1.1 nonaka 1905 1.65 jmcneill KASSERT(mutex_owned(&hp->intr_lock)); 1906 1.65 jmcneill 1907 1.1 nonaka DPRINTF(1,("%s: data transfer: resp=%08x datalen=%u\n", HDEVNAME(hp), 1908 1.1 nonaka MMC_R1(cmd->c_resp), cmd->c_datalen)); 1909 1.1 nonaka 1910 1.1 nonaka #ifdef SDHC_DEBUG 1911 1.1 nonaka /* XXX I forgot why I wanted to know when this happens :-( */ 1912 1.1 nonaka if ((cmd->c_opcode == 52 || cmd->c_opcode == 53) && 1913 1.1 nonaka ISSET(MMC_R1(cmd->c_resp), 0xcb00)) { 1914 1.1 nonaka aprint_error_dev(hp->sc->sc_dev, 1915 1.1 nonaka "CMD52/53 error response flags %#x\n", 1916 1.1 nonaka MMC_R1(cmd->c_resp) & 0xff00); 1917 1.1 nonaka } 1918 1.1 nonaka #endif 1919 1.1 nonaka 1920 1.47 skrll if (cmd->c_dmamap != NULL) { 1921 1.47 skrll if (hp->sc->sc_vendor_transfer_data_dma != NULL) { 1922 1.51 jmcneill error = hp->sc->sc_vendor_transfer_data_dma(sc, cmd); 1923 1.47 skrll if (error == 0 && !sdhc_wait_intr(hp, 1924 1.88 mlelstv SDHC_TRANSFER_COMPLETE, SDHC_DMA_TIMEOUT, false)) { 1925 1.84 mlelstv DPRINTF(1,("%s: timeout\n", __func__)); 1926 1.47 skrll error = ETIMEDOUT; 1927 1.47 skrll } 1928 1.47 skrll } else { 1929 1.47 skrll error = sdhc_transfer_data_dma(hp, cmd); 1930 1.47 skrll } 1931 1.47 skrll } else 1932 1.7 nonaka error = sdhc_transfer_data_pio(hp, cmd); 1933 1.1 nonaka if (error) 1934 1.1 nonaka cmd->c_error = error; 1935 1.1 nonaka SET(cmd->c_flags, SCF_ITSDONE); 1936 1.1 nonaka 1937 1.1 nonaka DPRINTF(1,("%s: data transfer done (error=%d)\n", 1938 1.1 nonaka HDEVNAME(hp), cmd->c_error)); 1939 1.1 nonaka } 1940 1.1 nonaka 1941 1.1 nonaka static int 1942 1.7 nonaka sdhc_transfer_data_dma(struct sdhc_host *hp, struct sdmmc_command *cmd) 1943 1.7 nonaka { 1944 1.19 jakllsch bus_dma_segment_t *dm_segs = cmd->c_dmamap->dm_segs; 1945 1.19 jakllsch bus_addr_t posaddr; 1946 1.19 jakllsch bus_addr_t segaddr; 1947 1.19 jakllsch bus_size_t seglen; 1948 1.19 jakllsch u_int seg = 0; 1949 1.7 nonaka int error = 0; 1950 1.19 jakllsch int status; 1951 1.7 nonaka 1952 1.65 jmcneill KASSERT(mutex_owned(&hp->intr_lock)); 1953 1.11 matt KASSERT(HREAD2(hp, SDHC_NINTR_STATUS_EN) & SDHC_DMA_INTERRUPT); 1954 1.11 matt KASSERT(HREAD2(hp, SDHC_NINTR_SIGNAL_EN) & SDHC_DMA_INTERRUPT); 1955 1.11 matt KASSERT(HREAD2(hp, SDHC_NINTR_STATUS_EN) & SDHC_TRANSFER_COMPLETE); 1956 1.11 matt KASSERT(HREAD2(hp, SDHC_NINTR_SIGNAL_EN) & SDHC_TRANSFER_COMPLETE); 1957 1.11 matt 1958 1.7 nonaka for (;;) { 1959 1.19 jakllsch status = sdhc_wait_intr(hp, 1960 1.7 nonaka SDHC_DMA_INTERRUPT|SDHC_TRANSFER_COMPLETE, 1961 1.88 mlelstv SDHC_DMA_TIMEOUT, false); 1962 1.19 jakllsch 1963 1.19 jakllsch if (status & SDHC_TRANSFER_COMPLETE) { 1964 1.19 jakllsch break; 1965 1.19 jakllsch } 1966 1.19 jakllsch if (!status) { 1967 1.84 mlelstv DPRINTF(1,("%s: timeout\n", __func__)); 1968 1.7 nonaka error = ETIMEDOUT; 1969 1.7 nonaka break; 1970 1.7 nonaka } 1971 1.63 jmcneill 1972 1.63 jmcneill if (ISSET(hp->flags, SHF_USE_ADMA2_MASK)) { 1973 1.63 jmcneill continue; 1974 1.63 jmcneill } 1975 1.63 jmcneill 1976 1.19 jakllsch if ((status & SDHC_DMA_INTERRUPT) == 0) { 1977 1.19 jakllsch continue; 1978 1.19 jakllsch } 1979 1.19 jakllsch 1980 1.19 jakllsch /* DMA Interrupt (boundary crossing) */ 1981 1.7 nonaka 1982 1.19 jakllsch segaddr = dm_segs[seg].ds_addr; 1983 1.19 jakllsch seglen = dm_segs[seg].ds_len; 1984 1.19 jakllsch posaddr = HREAD4(hp, SDHC_DMA_ADDR); 1985 1.7 nonaka 1986 1.19 jakllsch if ((seg == (cmd->c_dmamap->dm_nsegs-1)) && (posaddr == (segaddr + seglen))) { 1987 1.37 jakllsch continue; 1988 1.19 jakllsch } 1989 1.19 jakllsch if ((posaddr >= segaddr) && (posaddr < (segaddr + seglen))) 1990 1.19 jakllsch HWRITE4(hp, SDHC_DMA_ADDR, posaddr); 1991 1.19 jakllsch else if ((posaddr >= segaddr) && (posaddr == (segaddr + seglen)) && (seg + 1) < cmd->c_dmamap->dm_nsegs) 1992 1.19 jakllsch HWRITE4(hp, SDHC_DMA_ADDR, dm_segs[++seg].ds_addr); 1993 1.19 jakllsch KASSERT(seg < cmd->c_dmamap->dm_nsegs); 1994 1.7 nonaka } 1995 1.7 nonaka 1996 1.63 jmcneill if (ISSET(hp->flags, SHF_USE_ADMA2_MASK)) { 1997 1.63 jmcneill bus_dmamap_sync(hp->sc->sc_dmat, hp->adma_map, 0, 1998 1.63 jmcneill PAGE_SIZE, BUS_DMASYNC_POSTWRITE); 1999 1.63 jmcneill } 2000 1.63 jmcneill 2001 1.7 nonaka return error; 2002 1.7 nonaka } 2003 1.7 nonaka 2004 1.7 nonaka static int 2005 1.1 nonaka sdhc_transfer_data_pio(struct sdhc_host *hp, struct sdmmc_command *cmd) 2006 1.1 nonaka { 2007 1.1 nonaka uint8_t *data = cmd->c_data; 2008 1.12 nonaka void (*pio_func)(struct sdhc_host *, uint8_t *, u_int); 2009 1.11 matt u_int len, datalen; 2010 1.11 matt u_int imask; 2011 1.11 matt u_int pmask; 2012 1.1 nonaka int error = 0; 2013 1.1 nonaka 2014 1.78 mlelstv KASSERT(mutex_owned(&hp->intr_lock)); 2015 1.78 mlelstv 2016 1.11 matt if (ISSET(cmd->c_flags, SCF_CMD_READ)) { 2017 1.11 matt imask = SDHC_BUFFER_READ_READY; 2018 1.11 matt pmask = SDHC_BUFFER_READ_ENABLE; 2019 1.93 ryo if (ISSET(hp->sc->sc_flags, 2020 1.93 ryo SDHC_FLAG_ENHANCED | SDHC_FLAG_USDHC)) { 2021 1.11 matt pio_func = esdhc_read_data_pio; 2022 1.11 matt } else { 2023 1.11 matt pio_func = sdhc_read_data_pio; 2024 1.11 matt } 2025 1.11 matt } else { 2026 1.11 matt imask = SDHC_BUFFER_WRITE_READY; 2027 1.11 matt pmask = SDHC_BUFFER_WRITE_ENABLE; 2028 1.93 ryo if (ISSET(hp->sc->sc_flags, 2029 1.93 ryo SDHC_FLAG_ENHANCED | SDHC_FLAG_USDHC)) { 2030 1.11 matt pio_func = esdhc_write_data_pio; 2031 1.11 matt } else { 2032 1.11 matt pio_func = sdhc_write_data_pio; 2033 1.11 matt } 2034 1.11 matt } 2035 1.1 nonaka datalen = cmd->c_datalen; 2036 1.1 nonaka 2037 1.65 jmcneill KASSERT(mutex_owned(&hp->intr_lock)); 2038 1.11 matt KASSERT(HREAD2(hp, SDHC_NINTR_STATUS_EN) & imask); 2039 1.11 matt KASSERT(HREAD2(hp, SDHC_NINTR_STATUS_EN) & SDHC_TRANSFER_COMPLETE); 2040 1.11 matt KASSERT(HREAD2(hp, SDHC_NINTR_SIGNAL_EN) & SDHC_TRANSFER_COMPLETE); 2041 1.11 matt 2042 1.1 nonaka while (datalen > 0) { 2043 1.92 ryo if (!ISSET(HREAD4(hp, SDHC_PRESENT_STATE), pmask)) { 2044 1.11 matt if (ISSET(hp->sc->sc_flags, SDHC_FLAG_32BIT_ACCESS)) { 2045 1.11 matt HSET4(hp, SDHC_NINTR_SIGNAL_EN, imask); 2046 1.11 matt } else { 2047 1.11 matt HSET2(hp, SDHC_NINTR_SIGNAL_EN, imask); 2048 1.11 matt } 2049 1.88 mlelstv if (!sdhc_wait_intr(hp, imask, SDHC_BUFFER_TIMEOUT, false)) { 2050 1.84 mlelstv DPRINTF(1,("%s: timeout\n", __func__)); 2051 1.11 matt error = ETIMEDOUT; 2052 1.11 matt break; 2053 1.11 matt } 2054 1.11 matt 2055 1.11 matt error = sdhc_wait_state(hp, pmask, pmask); 2056 1.11 matt if (error) 2057 1.11 matt break; 2058 1.1 nonaka } 2059 1.1 nonaka 2060 1.1 nonaka len = MIN(datalen, cmd->c_blklen); 2061 1.11 matt (*pio_func)(hp, data, len); 2062 1.11 matt DPRINTF(2,("%s: pio data transfer %u @ %p\n", 2063 1.11 matt HDEVNAME(hp), len, data)); 2064 1.1 nonaka 2065 1.1 nonaka data += len; 2066 1.1 nonaka datalen -= len; 2067 1.1 nonaka } 2068 1.1 nonaka 2069 1.1 nonaka if (error == 0 && !sdhc_wait_intr(hp, SDHC_TRANSFER_COMPLETE, 2070 1.88 mlelstv SDHC_TRANSFER_TIMEOUT, false)) { 2071 1.84 mlelstv DPRINTF(1,("%s: timeout for transfer\n", __func__)); 2072 1.1 nonaka error = ETIMEDOUT; 2073 1.84 mlelstv } 2074 1.1 nonaka 2075 1.1 nonaka return error; 2076 1.1 nonaka } 2077 1.1 nonaka 2078 1.1 nonaka static void 2079 1.11 matt sdhc_read_data_pio(struct sdhc_host *hp, uint8_t *data, u_int datalen) 2080 1.1 nonaka { 2081 1.1 nonaka 2082 1.1 nonaka if (((__uintptr_t)data & 3) == 0) { 2083 1.1 nonaka while (datalen > 3) { 2084 1.29 matt *(uint32_t *)data = le32toh(HREAD4(hp, SDHC_DATA)); 2085 1.1 nonaka data += 4; 2086 1.1 nonaka datalen -= 4; 2087 1.1 nonaka } 2088 1.1 nonaka if (datalen > 1) { 2089 1.29 matt *(uint16_t *)data = le16toh(HREAD2(hp, SDHC_DATA)); 2090 1.1 nonaka data += 2; 2091 1.1 nonaka datalen -= 2; 2092 1.1 nonaka } 2093 1.1 nonaka if (datalen > 0) { 2094 1.1 nonaka *data = HREAD1(hp, SDHC_DATA); 2095 1.1 nonaka data += 1; 2096 1.1 nonaka datalen -= 1; 2097 1.1 nonaka } 2098 1.1 nonaka } else if (((__uintptr_t)data & 1) == 0) { 2099 1.1 nonaka while (datalen > 1) { 2100 1.29 matt *(uint16_t *)data = le16toh(HREAD2(hp, SDHC_DATA)); 2101 1.1 nonaka data += 2; 2102 1.1 nonaka datalen -= 2; 2103 1.1 nonaka } 2104 1.1 nonaka if (datalen > 0) { 2105 1.1 nonaka *data = HREAD1(hp, SDHC_DATA); 2106 1.1 nonaka data += 1; 2107 1.1 nonaka datalen -= 1; 2108 1.1 nonaka } 2109 1.1 nonaka } else { 2110 1.1 nonaka while (datalen > 0) { 2111 1.1 nonaka *data = HREAD1(hp, SDHC_DATA); 2112 1.1 nonaka data += 1; 2113 1.1 nonaka datalen -= 1; 2114 1.1 nonaka } 2115 1.1 nonaka } 2116 1.1 nonaka } 2117 1.1 nonaka 2118 1.1 nonaka static void 2119 1.11 matt sdhc_write_data_pio(struct sdhc_host *hp, uint8_t *data, u_int datalen) 2120 1.1 nonaka { 2121 1.1 nonaka 2122 1.1 nonaka if (((__uintptr_t)data & 3) == 0) { 2123 1.1 nonaka while (datalen > 3) { 2124 1.29 matt HWRITE4(hp, SDHC_DATA, htole32(*(uint32_t *)data)); 2125 1.1 nonaka data += 4; 2126 1.1 nonaka datalen -= 4; 2127 1.1 nonaka } 2128 1.1 nonaka if (datalen > 1) { 2129 1.29 matt HWRITE2(hp, SDHC_DATA, htole16(*(uint16_t *)data)); 2130 1.1 nonaka data += 2; 2131 1.1 nonaka datalen -= 2; 2132 1.1 nonaka } 2133 1.1 nonaka if (datalen > 0) { 2134 1.1 nonaka HWRITE1(hp, SDHC_DATA, *data); 2135 1.1 nonaka data += 1; 2136 1.1 nonaka datalen -= 1; 2137 1.1 nonaka } 2138 1.1 nonaka } else if (((__uintptr_t)data & 1) == 0) { 2139 1.1 nonaka while (datalen > 1) { 2140 1.29 matt HWRITE2(hp, SDHC_DATA, htole16(*(uint16_t *)data)); 2141 1.1 nonaka data += 2; 2142 1.1 nonaka datalen -= 2; 2143 1.1 nonaka } 2144 1.1 nonaka if (datalen > 0) { 2145 1.1 nonaka HWRITE1(hp, SDHC_DATA, *data); 2146 1.1 nonaka data += 1; 2147 1.1 nonaka datalen -= 1; 2148 1.1 nonaka } 2149 1.1 nonaka } else { 2150 1.1 nonaka while (datalen > 0) { 2151 1.1 nonaka HWRITE1(hp, SDHC_DATA, *data); 2152 1.1 nonaka data += 1; 2153 1.1 nonaka datalen -= 1; 2154 1.1 nonaka } 2155 1.1 nonaka } 2156 1.1 nonaka } 2157 1.1 nonaka 2158 1.11 matt static void 2159 1.11 matt esdhc_read_data_pio(struct sdhc_host *hp, uint8_t *data, u_int datalen) 2160 1.11 matt { 2161 1.11 matt uint16_t status = HREAD2(hp, SDHC_NINTR_STATUS); 2162 1.12 nonaka uint32_t v; 2163 1.12 nonaka 2164 1.23 matt const size_t watermark = (HREAD4(hp, SDHC_WATERMARK_LEVEL) >> SDHC_WATERMARK_READ_SHIFT) & SDHC_WATERMARK_READ_MASK; 2165 1.23 matt size_t count = 0; 2166 1.23 matt 2167 1.11 matt while (datalen > 3 && !ISSET(status, SDHC_TRANSFER_COMPLETE)) { 2168 1.23 matt if (count == 0) { 2169 1.23 matt /* 2170 1.23 matt * If we've drained "watermark" words, we need to wait 2171 1.23 matt * a little bit so the read FIFO can refill. 2172 1.23 matt */ 2173 1.23 matt sdmmc_delay(10); 2174 1.23 matt count = watermark; 2175 1.23 matt } 2176 1.12 nonaka v = HREAD4(hp, SDHC_DATA); 2177 1.11 matt v = le32toh(v); 2178 1.11 matt *(uint32_t *)data = v; 2179 1.11 matt data += 4; 2180 1.11 matt datalen -= 4; 2181 1.11 matt status = HREAD2(hp, SDHC_NINTR_STATUS); 2182 1.23 matt count--; 2183 1.11 matt } 2184 1.11 matt if (datalen > 0 && !ISSET(status, SDHC_TRANSFER_COMPLETE)) { 2185 1.23 matt if (count == 0) { 2186 1.23 matt sdmmc_delay(10); 2187 1.23 matt } 2188 1.12 nonaka v = HREAD4(hp, SDHC_DATA); 2189 1.11 matt v = le32toh(v); 2190 1.11 matt do { 2191 1.11 matt *data++ = v; 2192 1.11 matt v >>= 8; 2193 1.11 matt } while (--datalen > 0); 2194 1.11 matt } 2195 1.11 matt } 2196 1.11 matt 2197 1.11 matt static void 2198 1.11 matt esdhc_write_data_pio(struct sdhc_host *hp, uint8_t *data, u_int datalen) 2199 1.11 matt { 2200 1.11 matt uint16_t status = HREAD2(hp, SDHC_NINTR_STATUS); 2201 1.12 nonaka uint32_t v; 2202 1.12 nonaka 2203 1.23 matt const size_t watermark = (HREAD4(hp, SDHC_WATERMARK_LEVEL) >> SDHC_WATERMARK_WRITE_SHIFT) & SDHC_WATERMARK_WRITE_MASK; 2204 1.23 matt size_t count = watermark; 2205 1.23 matt 2206 1.11 matt while (datalen > 3 && !ISSET(status, SDHC_TRANSFER_COMPLETE)) { 2207 1.23 matt if (count == 0) { 2208 1.23 matt sdmmc_delay(10); 2209 1.23 matt count = watermark; 2210 1.23 matt } 2211 1.12 nonaka v = *(uint32_t *)data; 2212 1.11 matt v = htole32(v); 2213 1.11 matt HWRITE4(hp, SDHC_DATA, v); 2214 1.11 matt data += 4; 2215 1.11 matt datalen -= 4; 2216 1.11 matt status = HREAD2(hp, SDHC_NINTR_STATUS); 2217 1.23 matt count--; 2218 1.11 matt } 2219 1.11 matt if (datalen > 0 && !ISSET(status, SDHC_TRANSFER_COMPLETE)) { 2220 1.23 matt if (count == 0) { 2221 1.23 matt sdmmc_delay(10); 2222 1.23 matt } 2223 1.12 nonaka v = *(uint32_t *)data; 2224 1.11 matt v = htole32(v); 2225 1.11 matt HWRITE4(hp, SDHC_DATA, v); 2226 1.11 matt } 2227 1.11 matt } 2228 1.11 matt 2229 1.1 nonaka /* Prepare for another command. */ 2230 1.1 nonaka static int 2231 1.1 nonaka sdhc_soft_reset(struct sdhc_host *hp, int mask) 2232 1.1 nonaka { 2233 1.1 nonaka int timo; 2234 1.1 nonaka 2235 1.78 mlelstv KASSERT(mutex_owned(&hp->intr_lock)); 2236 1.78 mlelstv 2237 1.1 nonaka DPRINTF(1,("%s: software reset reg=%08x\n", HDEVNAME(hp), mask)); 2238 1.1 nonaka 2239 1.35 riastrad /* Request the reset. */ 2240 1.1 nonaka HWRITE1(hp, SDHC_SOFTWARE_RESET, mask); 2241 1.35 riastrad 2242 1.35 riastrad /* 2243 1.35 riastrad * If necessary, wait for the controller to set the bits to 2244 1.35 riastrad * acknowledge the reset. 2245 1.35 riastrad */ 2246 1.35 riastrad if (ISSET(hp->sc->sc_flags, SDHC_FLAG_WAIT_RESET) && 2247 1.35 riastrad ISSET(mask, (SDHC_RESET_DAT | SDHC_RESET_CMD))) { 2248 1.35 riastrad for (timo = 10000; timo > 0; timo--) { 2249 1.35 riastrad if (ISSET(HREAD1(hp, SDHC_SOFTWARE_RESET), mask)) 2250 1.35 riastrad break; 2251 1.35 riastrad /* Short delay because I worry we may miss it... */ 2252 1.35 riastrad sdmmc_delay(1); 2253 1.35 riastrad } 2254 1.90 mlelstv if (timo == 0) { 2255 1.84 mlelstv DPRINTF(1,("%s: timeout for reset on\n", __func__)); 2256 1.35 riastrad return ETIMEDOUT; 2257 1.90 mlelstv } 2258 1.35 riastrad } 2259 1.35 riastrad 2260 1.35 riastrad /* 2261 1.35 riastrad * Wait for the controller to clear the bits to indicate that 2262 1.35 riastrad * the reset has completed. 2263 1.35 riastrad */ 2264 1.1 nonaka for (timo = 10; timo > 0; timo--) { 2265 1.1 nonaka if (!ISSET(HREAD1(hp, SDHC_SOFTWARE_RESET), mask)) 2266 1.1 nonaka break; 2267 1.1 nonaka sdmmc_delay(10000); 2268 1.1 nonaka } 2269 1.1 nonaka if (timo == 0) { 2270 1.1 nonaka DPRINTF(1,("%s: timeout reg=%08x\n", HDEVNAME(hp), 2271 1.1 nonaka HREAD1(hp, SDHC_SOFTWARE_RESET))); 2272 1.1 nonaka return ETIMEDOUT; 2273 1.1 nonaka } 2274 1.1 nonaka 2275 1.11 matt if (ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED)) { 2276 1.53 nonaka HSET4(hp, SDHC_DMA_CTL, SDHC_DMA_SNOOP); 2277 1.11 matt } 2278 1.11 matt 2279 1.1 nonaka return 0; 2280 1.1 nonaka } 2281 1.1 nonaka 2282 1.1 nonaka static int 2283 1.88 mlelstv sdhc_wait_intr(struct sdhc_host *hp, int mask, int timo, bool probing) 2284 1.1 nonaka { 2285 1.84 mlelstv int status, error, nointr; 2286 1.1 nonaka 2287 1.65 jmcneill KASSERT(mutex_owned(&hp->intr_lock)); 2288 1.65 jmcneill 2289 1.1 nonaka mask |= SDHC_ERROR_INTERRUPT; 2290 1.1 nonaka 2291 1.84 mlelstv nointr = 0; 2292 1.1 nonaka status = hp->intr_status & mask; 2293 1.1 nonaka while (status == 0) { 2294 1.65 jmcneill if (cv_timedwait(&hp->intr_cv, &hp->intr_lock, timo) 2295 1.1 nonaka == EWOULDBLOCK) { 2296 1.84 mlelstv nointr = 1; 2297 1.1 nonaka break; 2298 1.1 nonaka } 2299 1.1 nonaka status = hp->intr_status & mask; 2300 1.1 nonaka } 2301 1.84 mlelstv error = hp->intr_error_status; 2302 1.84 mlelstv 2303 1.84 mlelstv DPRINTF(2,("%s: intr status %#x error %#x\n", HDEVNAME(hp), status, 2304 1.84 mlelstv error)); 2305 1.84 mlelstv 2306 1.1 nonaka hp->intr_status &= ~status; 2307 1.84 mlelstv hp->intr_error_status &= ~error; 2308 1.1 nonaka 2309 1.84 mlelstv if (ISSET(status, SDHC_ERROR_INTERRUPT)) { 2310 1.84 mlelstv if (ISSET(error, SDHC_DMA_ERROR)) 2311 1.84 mlelstv device_printf(hp->sc->sc_dev,"dma error\n"); 2312 1.84 mlelstv if (ISSET(error, SDHC_ADMA_ERROR)) 2313 1.84 mlelstv device_printf(hp->sc->sc_dev,"adma error\n"); 2314 1.84 mlelstv if (ISSET(error, SDHC_AUTO_CMD12_ERROR)) 2315 1.84 mlelstv device_printf(hp->sc->sc_dev,"auto_cmd12 error\n"); 2316 1.84 mlelstv if (ISSET(error, SDHC_CURRENT_LIMIT_ERROR)) 2317 1.84 mlelstv device_printf(hp->sc->sc_dev,"current limit error\n"); 2318 1.84 mlelstv if (ISSET(error, SDHC_DATA_END_BIT_ERROR)) 2319 1.84 mlelstv device_printf(hp->sc->sc_dev,"data end bit error\n"); 2320 1.84 mlelstv if (ISSET(error, SDHC_DATA_CRC_ERROR)) 2321 1.84 mlelstv device_printf(hp->sc->sc_dev,"data crc error\n"); 2322 1.84 mlelstv if (ISSET(error, SDHC_DATA_TIMEOUT_ERROR)) 2323 1.84 mlelstv device_printf(hp->sc->sc_dev,"data timeout error\n"); 2324 1.84 mlelstv if (ISSET(error, SDHC_CMD_INDEX_ERROR)) 2325 1.84 mlelstv device_printf(hp->sc->sc_dev,"cmd index error\n"); 2326 1.84 mlelstv if (ISSET(error, SDHC_CMD_END_BIT_ERROR)) 2327 1.84 mlelstv device_printf(hp->sc->sc_dev,"cmd end bit error\n"); 2328 1.84 mlelstv if (ISSET(error, SDHC_CMD_CRC_ERROR)) 2329 1.84 mlelstv device_printf(hp->sc->sc_dev,"cmd crc error\n"); 2330 1.88 mlelstv if (ISSET(error, SDHC_CMD_TIMEOUT_ERROR)) { 2331 1.88 mlelstv if (!probing) 2332 1.88 mlelstv device_printf(hp->sc->sc_dev,"cmd timeout error\n"); 2333 1.88 mlelstv #ifdef SDHC_DEBUG 2334 1.88 mlelstv else if (sdhcdebug > 0) 2335 1.88 mlelstv device_printf(hp->sc->sc_dev,"cmd timeout (expected)\n"); 2336 1.88 mlelstv #endif 2337 1.88 mlelstv } 2338 1.84 mlelstv if ((error & ~SDHC_EINTR_STATUS_MASK) != 0) 2339 1.84 mlelstv device_printf(hp->sc->sc_dev,"vendor error %#x\n", 2340 1.84 mlelstv (error & ~SDHC_EINTR_STATUS_MASK)); 2341 1.84 mlelstv if (error == 0) 2342 1.84 mlelstv device_printf(hp->sc->sc_dev,"no error\n"); 2343 1.84 mlelstv 2344 1.84 mlelstv /* Command timeout has higher priority than command complete. */ 2345 1.84 mlelstv if (ISSET(error, SDHC_CMD_TIMEOUT_ERROR)) 2346 1.84 mlelstv CLR(status, SDHC_COMMAND_COMPLETE); 2347 1.84 mlelstv 2348 1.84 mlelstv /* Transfer complete has higher priority than data timeout. */ 2349 1.84 mlelstv if (ISSET(status, SDHC_TRANSFER_COMPLETE)) 2350 1.84 mlelstv CLR(error, SDHC_DATA_TIMEOUT_ERROR); 2351 1.84 mlelstv } 2352 1.47 skrll 2353 1.84 mlelstv if (nointr || 2354 1.84 mlelstv (ISSET(status, SDHC_ERROR_INTERRUPT) && error)) { 2355 1.84 mlelstv if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED)) 2356 1.84 mlelstv (void)sdhc_soft_reset(hp, SDHC_RESET_CMD|SDHC_RESET_DAT); 2357 1.1 nonaka hp->intr_error_status = 0; 2358 1.1 nonaka status = 0; 2359 1.1 nonaka } 2360 1.1 nonaka 2361 1.1 nonaka return status; 2362 1.1 nonaka } 2363 1.1 nonaka 2364 1.1 nonaka /* 2365 1.1 nonaka * Established by attachment driver at interrupt priority IPL_SDMMC. 2366 1.1 nonaka */ 2367 1.1 nonaka int 2368 1.1 nonaka sdhc_intr(void *arg) 2369 1.1 nonaka { 2370 1.1 nonaka struct sdhc_softc *sc = (struct sdhc_softc *)arg; 2371 1.1 nonaka struct sdhc_host *hp; 2372 1.1 nonaka int done = 0; 2373 1.1 nonaka uint16_t status; 2374 1.1 nonaka uint16_t error; 2375 1.1 nonaka 2376 1.1 nonaka /* We got an interrupt, but we don't know from which slot. */ 2377 1.11 matt for (size_t host = 0; host < sc->sc_nhosts; host++) { 2378 1.1 nonaka hp = sc->sc_host[host]; 2379 1.1 nonaka if (hp == NULL) 2380 1.1 nonaka continue; 2381 1.1 nonaka 2382 1.65 jmcneill mutex_enter(&hp->intr_lock); 2383 1.65 jmcneill 2384 1.11 matt if (ISSET(sc->sc_flags, SDHC_FLAG_32BIT_ACCESS)) { 2385 1.11 matt /* Find out which interrupts are pending. */ 2386 1.11 matt uint32_t xstatus = HREAD4(hp, SDHC_NINTR_STATUS); 2387 1.11 matt status = xstatus; 2388 1.11 matt error = xstatus >> 16; 2389 1.93 ryo if (ISSET(sc->sc_flags, SDHC_FLAG_USDHC) && 2390 1.93 ryo (xstatus & SDHC_TRANSFER_COMPLETE) && 2391 1.93 ryo !(xstatus & SDHC_DMA_INTERRUPT)) { 2392 1.93 ryo /* read again due to uSDHC errata */ 2393 1.93 ryo status = xstatus = HREAD4(hp, 2394 1.93 ryo SDHC_NINTR_STATUS); 2395 1.93 ryo error = xstatus >> 16; 2396 1.93 ryo } 2397 1.93 ryo if (ISSET(sc->sc_flags, 2398 1.93 ryo SDHC_FLAG_ENHANCED | SDHC_FLAG_USDHC)) { 2399 1.87 mlelstv if ((error & SDHC_NINTR_STATUS_MASK) != 0) 2400 1.87 mlelstv SET(status, SDHC_ERROR_INTERRUPT); 2401 1.87 mlelstv } 2402 1.22 matt if (error) 2403 1.22 matt xstatus |= SDHC_ERROR_INTERRUPT; 2404 1.22 matt else if (!ISSET(status, SDHC_NINTR_STATUS_MASK)) 2405 1.65 jmcneill goto next_port; /* no interrupt for us */ 2406 1.11 matt /* Acknowledge the interrupts we are about to handle. */ 2407 1.11 matt HWRITE4(hp, SDHC_NINTR_STATUS, xstatus); 2408 1.11 matt } else { 2409 1.11 matt /* Find out which interrupts are pending. */ 2410 1.11 matt error = 0; 2411 1.11 matt status = HREAD2(hp, SDHC_NINTR_STATUS); 2412 1.11 matt if (!ISSET(status, SDHC_NINTR_STATUS_MASK)) 2413 1.65 jmcneill goto next_port; /* no interrupt for us */ 2414 1.11 matt /* Acknowledge the interrupts we are about to handle. */ 2415 1.11 matt HWRITE2(hp, SDHC_NINTR_STATUS, status); 2416 1.11 matt if (ISSET(status, SDHC_ERROR_INTERRUPT)) { 2417 1.11 matt /* Acknowledge error interrupts. */ 2418 1.11 matt error = HREAD2(hp, SDHC_EINTR_STATUS); 2419 1.11 matt HWRITE2(hp, SDHC_EINTR_STATUS, error); 2420 1.11 matt } 2421 1.11 matt } 2422 1.47 skrll 2423 1.11 matt DPRINTF(2,("%s: interrupt status=%x error=%x\n", HDEVNAME(hp), 2424 1.11 matt status, error)); 2425 1.1 nonaka 2426 1.1 nonaka /* Claim this interrupt. */ 2427 1.1 nonaka done = 1; 2428 1.1 nonaka 2429 1.84 mlelstv if (ISSET(status, SDHC_ERROR_INTERRUPT) && 2430 1.84 mlelstv ISSET(error, SDHC_ADMA_ERROR)) { 2431 1.63 jmcneill uint8_t adma_err = HREAD1(hp, SDHC_ADMA_ERROR_STATUS); 2432 1.63 jmcneill printf("%s: ADMA error, status %02x\n", HDEVNAME(hp), 2433 1.63 jmcneill adma_err); 2434 1.63 jmcneill } 2435 1.63 jmcneill 2436 1.1 nonaka /* 2437 1.1 nonaka * Wake up the sdmmc event thread to scan for cards. 2438 1.1 nonaka */ 2439 1.9 matt if (ISSET(status, SDHC_CARD_REMOVAL|SDHC_CARD_INSERTION)) { 2440 1.46 jakllsch if (hp->sdmmc != NULL) { 2441 1.46 jakllsch sdmmc_needs_discover(hp->sdmmc); 2442 1.46 jakllsch } 2443 1.93 ryo if (ISSET(sc->sc_flags, 2444 1.93 ryo SDHC_FLAG_ENHANCED | SDHC_FLAG_USDHC)) { 2445 1.11 matt HCLR4(hp, SDHC_NINTR_STATUS_EN, 2446 1.11 matt status & (SDHC_CARD_REMOVAL|SDHC_CARD_INSERTION)); 2447 1.11 matt HCLR4(hp, SDHC_NINTR_SIGNAL_EN, 2448 1.11 matt status & (SDHC_CARD_REMOVAL|SDHC_CARD_INSERTION)); 2449 1.11 matt } 2450 1.9 matt } 2451 1.1 nonaka 2452 1.1 nonaka /* 2453 1.80 jmcneill * Schedule re-tuning process (UHS). 2454 1.80 jmcneill */ 2455 1.80 jmcneill if (ISSET(status, SDHC_RETUNING_EVENT)) { 2456 1.80 jmcneill atomic_swap_uint(&hp->tuning_timer_pending, 1); 2457 1.80 jmcneill } 2458 1.80 jmcneill 2459 1.80 jmcneill /* 2460 1.1 nonaka * Wake up the blocking process to service command 2461 1.1 nonaka * related interrupt(s). 2462 1.1 nonaka */ 2463 1.86 mlelstv if (ISSET(status, SDHC_COMMAND_COMPLETE|SDHC_ERROR_INTERRUPT| 2464 1.11 matt SDHC_BUFFER_READ_READY|SDHC_BUFFER_WRITE_READY| 2465 1.1 nonaka SDHC_TRANSFER_COMPLETE|SDHC_DMA_INTERRUPT)) { 2466 1.84 mlelstv hp->intr_error_status |= error; 2467 1.1 nonaka hp->intr_status |= status; 2468 1.93 ryo if (ISSET(sc->sc_flags, 2469 1.93 ryo SDHC_FLAG_ENHANCED | SDHC_FLAG_USDHC)) { 2470 1.11 matt HCLR4(hp, SDHC_NINTR_SIGNAL_EN, 2471 1.11 matt status & (SDHC_BUFFER_READ_READY|SDHC_BUFFER_WRITE_READY)); 2472 1.11 matt } 2473 1.1 nonaka cv_broadcast(&hp->intr_cv); 2474 1.1 nonaka } 2475 1.1 nonaka 2476 1.1 nonaka /* 2477 1.1 nonaka * Service SD card interrupts. 2478 1.1 nonaka */ 2479 1.93 ryo if (!ISSET(sc->sc_flags, SDHC_FLAG_ENHANCED | SDHC_FLAG_USDHC) 2480 1.11 matt && ISSET(status, SDHC_CARD_INTERRUPT)) { 2481 1.1 nonaka DPRINTF(0,("%s: card interrupt\n", HDEVNAME(hp))); 2482 1.1 nonaka HCLR2(hp, SDHC_NINTR_STATUS_EN, SDHC_CARD_INTERRUPT); 2483 1.1 nonaka sdmmc_card_intr(hp->sdmmc); 2484 1.1 nonaka } 2485 1.65 jmcneill next_port: 2486 1.65 jmcneill mutex_exit(&hp->intr_lock); 2487 1.1 nonaka } 2488 1.1 nonaka 2489 1.1 nonaka return done; 2490 1.1 nonaka } 2491 1.1 nonaka 2492 1.65 jmcneill kmutex_t * 2493 1.65 jmcneill sdhc_host_lock(struct sdhc_host *hp) 2494 1.65 jmcneill { 2495 1.65 jmcneill return &hp->intr_lock; 2496 1.65 jmcneill } 2497 1.65 jmcneill 2498 1.99 nonaka uint8_t 2499 1.99 nonaka sdhc_host_read_1(struct sdhc_host *hp, int reg) 2500 1.99 nonaka { 2501 1.99 nonaka return HREAD1(hp, reg); 2502 1.99 nonaka } 2503 1.99 nonaka 2504 1.99 nonaka uint16_t 2505 1.99 nonaka sdhc_host_read_2(struct sdhc_host *hp, int reg) 2506 1.99 nonaka { 2507 1.99 nonaka return HREAD2(hp, reg); 2508 1.99 nonaka } 2509 1.99 nonaka 2510 1.99 nonaka uint32_t 2511 1.99 nonaka sdhc_host_read_4(struct sdhc_host *hp, int reg) 2512 1.99 nonaka { 2513 1.99 nonaka return HREAD4(hp, reg); 2514 1.99 nonaka } 2515 1.99 nonaka 2516 1.99 nonaka void 2517 1.99 nonaka sdhc_host_write_1(struct sdhc_host *hp, int reg, uint8_t val) 2518 1.99 nonaka { 2519 1.99 nonaka HWRITE1(hp, reg, val); 2520 1.99 nonaka } 2521 1.99 nonaka 2522 1.99 nonaka void 2523 1.99 nonaka sdhc_host_write_2(struct sdhc_host *hp, int reg, uint16_t val) 2524 1.99 nonaka { 2525 1.99 nonaka HWRITE2(hp, reg, val); 2526 1.99 nonaka } 2527 1.99 nonaka 2528 1.99 nonaka void 2529 1.99 nonaka sdhc_host_write_4(struct sdhc_host *hp, int reg, uint32_t val) 2530 1.99 nonaka { 2531 1.99 nonaka HWRITE4(hp, reg, val); 2532 1.99 nonaka } 2533 1.99 nonaka 2534 1.1 nonaka #ifdef SDHC_DEBUG 2535 1.1 nonaka void 2536 1.1 nonaka sdhc_dump_regs(struct sdhc_host *hp) 2537 1.1 nonaka { 2538 1.1 nonaka 2539 1.1 nonaka printf("0x%02x PRESENT_STATE: %x\n", SDHC_PRESENT_STATE, 2540 1.1 nonaka HREAD4(hp, SDHC_PRESENT_STATE)); 2541 1.11 matt if (!ISSET(hp->sc->sc_flags, SDHC_FLAG_ENHANCED)) 2542 1.11 matt printf("0x%02x POWER_CTL: %x\n", SDHC_POWER_CTL, 2543 1.11 matt HREAD1(hp, SDHC_POWER_CTL)); 2544 1.1 nonaka printf("0x%02x NINTR_STATUS: %x\n", SDHC_NINTR_STATUS, 2545 1.1 nonaka HREAD2(hp, SDHC_NINTR_STATUS)); 2546 1.1 nonaka printf("0x%02x EINTR_STATUS: %x\n", SDHC_EINTR_STATUS, 2547 1.1 nonaka HREAD2(hp, SDHC_EINTR_STATUS)); 2548 1.1 nonaka printf("0x%02x NINTR_STATUS_EN: %x\n", SDHC_NINTR_STATUS_EN, 2549 1.1 nonaka HREAD2(hp, SDHC_NINTR_STATUS_EN)); 2550 1.1 nonaka printf("0x%02x EINTR_STATUS_EN: %x\n", SDHC_EINTR_STATUS_EN, 2551 1.1 nonaka HREAD2(hp, SDHC_EINTR_STATUS_EN)); 2552 1.1 nonaka printf("0x%02x NINTR_SIGNAL_EN: %x\n", SDHC_NINTR_SIGNAL_EN, 2553 1.1 nonaka HREAD2(hp, SDHC_NINTR_SIGNAL_EN)); 2554 1.1 nonaka printf("0x%02x EINTR_SIGNAL_EN: %x\n", SDHC_EINTR_SIGNAL_EN, 2555 1.1 nonaka HREAD2(hp, SDHC_EINTR_SIGNAL_EN)); 2556 1.1 nonaka printf("0x%02x CAPABILITIES: %x\n", SDHC_CAPABILITIES, 2557 1.1 nonaka HREAD4(hp, SDHC_CAPABILITIES)); 2558 1.1 nonaka printf("0x%02x MAX_CAPABILITIES: %x\n", SDHC_MAX_CAPABILITIES, 2559 1.1 nonaka HREAD4(hp, SDHC_MAX_CAPABILITIES)); 2560 1.1 nonaka } 2561 1.1 nonaka #endif 2562