1 1.21 mlelstv /* $NetBSD: sdmmc_io.c,v 1.21 2020/10/17 09:36:45 mlelstv Exp $ */ 2 1.1 nonaka /* $OpenBSD: sdmmc_io.c,v 1.10 2007/09/17 01:33:33 krw 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 /* Routines for SD I/O cards. */ 21 1.1 nonaka 22 1.1 nonaka #include <sys/cdefs.h> 23 1.21 mlelstv __KERNEL_RCSID(0, "$NetBSD: sdmmc_io.c,v 1.21 2020/10/17 09:36:45 mlelstv Exp $"); 24 1.7 matt 25 1.7 matt #ifdef _KERNEL_OPT 26 1.7 matt #include "opt_sdmmc.h" 27 1.7 matt #endif 28 1.1 nonaka 29 1.1 nonaka #include <sys/param.h> 30 1.1 nonaka #include <sys/kernel.h> 31 1.1 nonaka #include <sys/malloc.h> 32 1.1 nonaka #include <sys/proc.h> 33 1.1 nonaka #include <sys/systm.h> 34 1.1 nonaka 35 1.1 nonaka #include <dev/sdmmc/sdmmc_ioreg.h> 36 1.1 nonaka #include <dev/sdmmc/sdmmcchip.h> 37 1.1 nonaka #include <dev/sdmmc/sdmmcreg.h> 38 1.1 nonaka #include <dev/sdmmc/sdmmcvar.h> 39 1.1 nonaka 40 1.1 nonaka #ifdef SDMMC_DEBUG 41 1.1 nonaka #define DPRINTF(s) do { printf s; } while (0) 42 1.1 nonaka #else 43 1.1 nonaka #define DPRINTF(s) do {} while (0) 44 1.1 nonaka #endif 45 1.1 nonaka 46 1.1 nonaka struct sdmmc_intr_handler { 47 1.1 nonaka struct sdmmc_softc *ih_softc; 48 1.1 nonaka char *ih_name; 49 1.1 nonaka int (*ih_fun)(void *); 50 1.1 nonaka void *ih_arg; 51 1.1 nonaka TAILQ_ENTRY(sdmmc_intr_handler) entry; 52 1.1 nonaka }; 53 1.1 nonaka 54 1.1 nonaka static int sdmmc_io_rw_direct(struct sdmmc_softc *, 55 1.19 mlelstv struct sdmmc_function *, int, u_char *, int, bool); 56 1.1 nonaka static int sdmmc_io_rw_extended(struct sdmmc_softc *, 57 1.1 nonaka struct sdmmc_function *, int, u_char *, int, int); 58 1.1 nonaka #if 0 59 1.1 nonaka static int sdmmc_io_xchg(struct sdmmc_softc *, struct sdmmc_function *, 60 1.1 nonaka int, u_char *); 61 1.1 nonaka #endif 62 1.1 nonaka static void sdmmc_io_reset(struct sdmmc_softc *); 63 1.1 nonaka static int sdmmc_io_send_op_cond(struct sdmmc_softc *, uint32_t, 64 1.1 nonaka uint32_t *); 65 1.1 nonaka 66 1.1 nonaka /* 67 1.1 nonaka * Initialize SD I/O card functions (before memory cards). The host 68 1.1 nonaka * system and controller must support card interrupts in order to use 69 1.1 nonaka * I/O functions. 70 1.1 nonaka */ 71 1.1 nonaka int 72 1.1 nonaka sdmmc_io_enable(struct sdmmc_softc *sc) 73 1.1 nonaka { 74 1.1 nonaka uint32_t host_ocr; 75 1.1 nonaka uint32_t card_ocr; 76 1.1 nonaka int error; 77 1.1 nonaka 78 1.1 nonaka SDMMC_LOCK(sc); 79 1.1 nonaka 80 1.1 nonaka /* Set host mode to SD "combo" card. */ 81 1.1 nonaka SET(sc->sc_flags, SMF_SD_MODE|SMF_IO_MODE|SMF_MEM_MODE); 82 1.1 nonaka 83 1.1 nonaka /* Reset I/O functions. */ 84 1.1 nonaka sdmmc_io_reset(sc); 85 1.1 nonaka 86 1.1 nonaka /* 87 1.1 nonaka * Read the I/O OCR value, determine the number of I/O 88 1.1 nonaka * functions and whether memory is also present (a "combo 89 1.1 nonaka * card") by issuing CMD5. SD memory-only and MMC cards 90 1.1 nonaka * do not respond to CMD5. 91 1.1 nonaka */ 92 1.1 nonaka error = sdmmc_io_send_op_cond(sc, 0, &card_ocr); 93 1.1 nonaka if (error) { 94 1.1 nonaka /* No SDIO card; switch to SD memory-only mode. */ 95 1.1 nonaka CLR(sc->sc_flags, SMF_IO_MODE); 96 1.1 nonaka error = 0; 97 1.1 nonaka goto out; 98 1.1 nonaka } 99 1.1 nonaka 100 1.1 nonaka /* Parse the additional bits in the I/O OCR value. */ 101 1.1 nonaka if (!ISSET(card_ocr, SD_IO_OCR_MEM_PRESENT)) { 102 1.1 nonaka /* SDIO card without memory (not a "combo card"). */ 103 1.1 nonaka DPRINTF(("%s: no memory present\n", SDMMCDEVNAME(sc))); 104 1.1 nonaka CLR(sc->sc_flags, SMF_MEM_MODE); 105 1.1 nonaka } 106 1.1 nonaka sc->sc_function_count = SD_IO_OCR_NUM_FUNCTIONS(card_ocr); 107 1.1 nonaka if (sc->sc_function_count == 0) { 108 1.1 nonaka /* Useless SDIO card without any I/O functions. */ 109 1.1 nonaka DPRINTF(("%s: no I/O functions\n", SDMMCDEVNAME(sc))); 110 1.1 nonaka CLR(sc->sc_flags, SMF_IO_MODE); 111 1.1 nonaka error = 0; 112 1.1 nonaka goto out; 113 1.1 nonaka } 114 1.1 nonaka card_ocr &= SD_IO_OCR_MASK; 115 1.1 nonaka 116 1.1 nonaka /* Set the lowest voltage supported by the card and host. */ 117 1.1 nonaka host_ocr = sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch); 118 1.1 nonaka error = sdmmc_set_bus_power(sc, host_ocr, card_ocr); 119 1.1 nonaka if (error) { 120 1.1 nonaka aprint_error_dev(sc->sc_dev, 121 1.1 nonaka "couldn't supply voltage requested by card\n"); 122 1.1 nonaka goto out; 123 1.1 nonaka } 124 1.1 nonaka 125 1.1 nonaka /* Send the new OCR value until all cards are ready. */ 126 1.1 nonaka error = sdmmc_io_send_op_cond(sc, host_ocr, NULL); 127 1.1 nonaka if (error) { 128 1.1 nonaka aprint_error_dev(sc->sc_dev, "couldn't send I/O OCR\n"); 129 1.1 nonaka goto out; 130 1.1 nonaka } 131 1.1 nonaka 132 1.1 nonaka out: 133 1.1 nonaka SDMMC_UNLOCK(sc); 134 1.1 nonaka 135 1.1 nonaka return error; 136 1.1 nonaka } 137 1.1 nonaka 138 1.1 nonaka /* 139 1.1 nonaka * Allocate sdmmc_function structures for SD card I/O function 140 1.1 nonaka * (including function 0). 141 1.1 nonaka */ 142 1.1 nonaka void 143 1.1 nonaka sdmmc_io_scan(struct sdmmc_softc *sc) 144 1.1 nonaka { 145 1.1 nonaka struct sdmmc_function *sf0, *sf; 146 1.1 nonaka int error; 147 1.1 nonaka int i; 148 1.1 nonaka 149 1.1 nonaka SDMMC_LOCK(sc); 150 1.1 nonaka 151 1.1 nonaka sf0 = sdmmc_function_alloc(sc); 152 1.1 nonaka sf0->number = 0; 153 1.1 nonaka error = sdmmc_set_relative_addr(sc, sf0); 154 1.1 nonaka if (error) { 155 1.1 nonaka aprint_error_dev(sc->sc_dev, "couldn't set I/O RCA\n"); 156 1.1 nonaka SET(sf0->flags, SFF_ERROR); 157 1.1 nonaka goto out; 158 1.1 nonaka } 159 1.1 nonaka sc->sc_fn0 = sf0; 160 1.1 nonaka SIMPLEQ_INSERT_TAIL(&sc->sf_head, sf0, sf_list); 161 1.1 nonaka 162 1.3 kiyohara /* Go to Data Transfer Mode, if possible. */ 163 1.3 kiyohara sdmmc_chip_bus_rod(sc->sc_sct, sc->sc_sch, 0); 164 1.3 kiyohara 165 1.1 nonaka /* Verify that the RCA has been set by selecting the card. */ 166 1.1 nonaka error = sdmmc_select_card(sc, sf0); 167 1.1 nonaka if (error) { 168 1.1 nonaka aprint_error_dev(sc->sc_dev, "couldn't select I/O RCA %d\n", 169 1.1 nonaka sf0->rca); 170 1.1 nonaka SET(sf0->flags, SFF_ERROR); 171 1.1 nonaka goto out; 172 1.1 nonaka } 173 1.1 nonaka 174 1.1 nonaka for (i = 1; i <= sc->sc_function_count; i++) { 175 1.1 nonaka sf = sdmmc_function_alloc(sc); 176 1.1 nonaka sf->number = i; 177 1.1 nonaka sf->rca = sf0->rca; 178 1.1 nonaka SIMPLEQ_INSERT_TAIL(&sc->sf_head, sf, sf_list); 179 1.1 nonaka } 180 1.1 nonaka 181 1.1 nonaka out: 182 1.1 nonaka SDMMC_UNLOCK(sc); 183 1.1 nonaka } 184 1.1 nonaka 185 1.1 nonaka /* 186 1.1 nonaka * Initialize SDIO card functions. 187 1.1 nonaka */ 188 1.1 nonaka int 189 1.1 nonaka sdmmc_io_init(struct sdmmc_softc *sc, struct sdmmc_function *sf) 190 1.1 nonaka { 191 1.5 kiyohara struct sdmmc_function *sf0 = sc->sc_fn0; 192 1.1 nonaka int error = 0; 193 1.5 kiyohara uint8_t reg; 194 1.1 nonaka 195 1.1 nonaka SDMMC_LOCK(sc); 196 1.1 nonaka 197 1.15 mlelstv sf->blklen = sdmmc_chip_host_maxblklen(sc->sc_sct, sc->sc_sch); 198 1.15 mlelstv 199 1.1 nonaka if (sf->number == 0) { 200 1.5 kiyohara reg = sdmmc_io_read_1(sf, SD_IO_CCCR_CAPABILITY); 201 1.5 kiyohara if (!(reg & CCCR_CAPS_LSC) || (reg & CCCR_CAPS_4BLS)) { 202 1.5 kiyohara sdmmc_io_write_1(sf, SD_IO_CCCR_BUS_WIDTH, 203 1.5 kiyohara CCCR_BUS_WIDTH_4); 204 1.5 kiyohara sf->width = 4; 205 1.13 jmcneill error = sdmmc_chip_bus_width(sc->sc_sct, sc->sc_sch, 206 1.13 jmcneill sf->width); 207 1.13 jmcneill if (error) 208 1.13 jmcneill aprint_error_dev(sc->sc_dev, 209 1.13 jmcneill "can't change bus width\n"); 210 1.5 kiyohara } 211 1.1 nonaka 212 1.1 nonaka error = sdmmc_read_cis(sf, &sf->cis); 213 1.1 nonaka if (error) { 214 1.1 nonaka aprint_error_dev(sc->sc_dev, "couldn't read CIS\n"); 215 1.1 nonaka SET(sf->flags, SFF_ERROR); 216 1.1 nonaka goto out; 217 1.1 nonaka } 218 1.1 nonaka 219 1.1 nonaka sdmmc_check_cis_quirks(sf); 220 1.1 nonaka 221 1.1 nonaka #ifdef SDMMC_DEBUG 222 1.1 nonaka if (sdmmcdebug) 223 1.1 nonaka sdmmc_print_cis(sf); 224 1.1 nonaka #endif 225 1.3 kiyohara 226 1.5 kiyohara reg = sdmmc_io_read_1(sf, SD_IO_CCCR_HIGH_SPEED); 227 1.5 kiyohara if (reg & CCCR_HIGH_SPEED_SHS) { 228 1.5 kiyohara reg |= CCCR_HIGH_SPEED_EHS; 229 1.5 kiyohara sdmmc_io_write_1(sf, SD_IO_CCCR_HIGH_SPEED, reg); 230 1.5 kiyohara sf->csd.tran_speed = 50000; /* 50MHz */ 231 1.5 kiyohara 232 1.5 kiyohara /* Wait 400KHz x 8 clock */ 233 1.17 mlelstv sdmmc_delay(20); 234 1.5 kiyohara } 235 1.3 kiyohara if (sc->sc_busclk > sf->csd.tran_speed) 236 1.3 kiyohara sc->sc_busclk = sf->csd.tran_speed; 237 1.3 kiyohara error = 238 1.10 jmcneill sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, sc->sc_busclk, 239 1.10 jmcneill false); 240 1.3 kiyohara if (error) 241 1.3 kiyohara aprint_error_dev(sc->sc_dev, 242 1.3 kiyohara "can't change bus clock\n"); 243 1.17 mlelstv 244 1.17 mlelstv aprint_normal_dev(sc->sc_dev, "%u-bit width,", sf->width); 245 1.17 mlelstv if ((sc->sc_busclk / 1000) != 0) 246 1.17 mlelstv aprint_normal(" %u.%03u MHz\n", 247 1.17 mlelstv sc->sc_busclk / 1000, sc->sc_busclk % 1000); 248 1.17 mlelstv else 249 1.17 mlelstv aprint_normal(" %u KHz\n", sc->sc_busclk % 1000); 250 1.17 mlelstv 251 1.17 mlelstv 252 1.5 kiyohara } else { 253 1.5 kiyohara reg = sdmmc_io_read_1(sf0, SD_IO_FBR(sf->number) + 0x000); 254 1.5 kiyohara sf->interface = FBR_STD_FUNC_IF_CODE(reg); 255 1.5 kiyohara if (sf->interface == 0x0f) 256 1.5 kiyohara sf->interface = 257 1.5 kiyohara sdmmc_io_read_1(sf0, SD_IO_FBR(sf->number) + 0x001); 258 1.5 kiyohara error = sdmmc_read_cis(sf, &sf->cis); 259 1.5 kiyohara if (error) { 260 1.5 kiyohara aprint_error_dev(sc->sc_dev, "couldn't read CIS\n"); 261 1.5 kiyohara SET(sf->flags, SFF_ERROR); 262 1.5 kiyohara goto out; 263 1.5 kiyohara } 264 1.5 kiyohara 265 1.5 kiyohara sdmmc_check_cis_quirks(sf); 266 1.5 kiyohara 267 1.5 kiyohara #ifdef SDMMC_DEBUG 268 1.5 kiyohara if (sdmmcdebug) 269 1.5 kiyohara sdmmc_print_cis(sf); 270 1.5 kiyohara #endif 271 1.1 nonaka } 272 1.1 nonaka 273 1.1 nonaka out: 274 1.1 nonaka SDMMC_UNLOCK(sc); 275 1.1 nonaka 276 1.1 nonaka return error; 277 1.1 nonaka } 278 1.1 nonaka 279 1.1 nonaka /* 280 1.1 nonaka * Indicate whether the function is ready to operate. 281 1.1 nonaka */ 282 1.1 nonaka static int 283 1.1 nonaka sdmmc_io_function_ready(struct sdmmc_function *sf) 284 1.1 nonaka { 285 1.1 nonaka struct sdmmc_softc *sc = sf->sc; 286 1.1 nonaka struct sdmmc_function *sf0 = sc->sc_fn0; 287 1.1 nonaka uint8_t reg; 288 1.1 nonaka 289 1.1 nonaka if (sf->number == 0) 290 1.1 nonaka return 1; /* FN0 is always ready */ 291 1.1 nonaka 292 1.1 nonaka SDMMC_LOCK(sc); 293 1.1 nonaka reg = sdmmc_io_read_1(sf0, SD_IO_CCCR_FN_IOREADY); 294 1.1 nonaka SDMMC_UNLOCK(sc); 295 1.1 nonaka return (reg & (1 << sf->number)) != 0; 296 1.1 nonaka } 297 1.1 nonaka 298 1.1 nonaka int 299 1.1 nonaka sdmmc_io_function_enable(struct sdmmc_function *sf) 300 1.1 nonaka { 301 1.1 nonaka struct sdmmc_softc *sc = sf->sc; 302 1.1 nonaka struct sdmmc_function *sf0 = sc->sc_fn0; 303 1.1 nonaka uint8_t reg; 304 1.1 nonaka int retry; 305 1.1 nonaka 306 1.1 nonaka if (sf->number == 0) 307 1.1 nonaka return 0; /* FN0 is always enabled */ 308 1.1 nonaka 309 1.1 nonaka SDMMC_LOCK(sc); 310 1.1 nonaka reg = sdmmc_io_read_1(sf0, SD_IO_CCCR_FN_ENABLE); 311 1.1 nonaka SET(reg, (1U << sf->number)); 312 1.1 nonaka sdmmc_io_write_1(sf0, SD_IO_CCCR_FN_ENABLE, reg); 313 1.1 nonaka SDMMC_UNLOCK(sc); 314 1.4 kiyohara 315 1.1 nonaka retry = 5; 316 1.1 nonaka while (!sdmmc_io_function_ready(sf) && retry-- > 0) 317 1.2 pooka kpause("pause", false, hz, NULL); 318 1.1 nonaka return (retry >= 0) ? 0 : ETIMEDOUT; 319 1.1 nonaka } 320 1.1 nonaka 321 1.1 nonaka /* 322 1.1 nonaka * Disable the I/O function. Return zero if the function was 323 1.1 nonaka * disabled successfully. 324 1.1 nonaka */ 325 1.1 nonaka void 326 1.1 nonaka sdmmc_io_function_disable(struct sdmmc_function *sf) 327 1.1 nonaka { 328 1.1 nonaka struct sdmmc_softc *sc = sf->sc; 329 1.1 nonaka struct sdmmc_function *sf0 = sc->sc_fn0; 330 1.1 nonaka uint8_t reg; 331 1.1 nonaka 332 1.1 nonaka if (sf->number == 0) 333 1.1 nonaka return; /* FN0 is always enabled */ 334 1.1 nonaka 335 1.1 nonaka SDMMC_LOCK(sc); 336 1.1 nonaka reg = sdmmc_io_read_1(sf0, SD_IO_CCCR_FN_ENABLE); 337 1.1 nonaka CLR(reg, (1U << sf->number)); 338 1.1 nonaka sdmmc_io_write_1(sf0, SD_IO_CCCR_FN_ENABLE, reg); 339 1.1 nonaka SDMMC_UNLOCK(sc); 340 1.1 nonaka } 341 1.1 nonaka 342 1.1 nonaka static int 343 1.1 nonaka sdmmc_io_rw_direct(struct sdmmc_softc *sc, struct sdmmc_function *sf, 344 1.19 mlelstv int reg, u_char *datap, int arg, bool toutok) 345 1.1 nonaka { 346 1.1 nonaka struct sdmmc_command cmd; 347 1.1 nonaka int error; 348 1.1 nonaka 349 1.1 nonaka /* Don't lock */ 350 1.1 nonaka 351 1.1 nonaka /* Make sure the card is selected. */ 352 1.1 nonaka error = sdmmc_select_card(sc, sf); 353 1.1 nonaka if (error) 354 1.1 nonaka return error; 355 1.1 nonaka 356 1.1 nonaka arg |= ((sf == NULL ? 0 : sf->number) & SD_ARG_CMD52_FUNC_MASK) << 357 1.1 nonaka SD_ARG_CMD52_FUNC_SHIFT; 358 1.1 nonaka arg |= (reg & SD_ARG_CMD52_REG_MASK) << 359 1.1 nonaka SD_ARG_CMD52_REG_SHIFT; 360 1.1 nonaka arg |= (*datap & SD_ARG_CMD52_DATA_MASK) << 361 1.1 nonaka SD_ARG_CMD52_DATA_SHIFT; 362 1.1 nonaka 363 1.1 nonaka memset(&cmd, 0, sizeof cmd); 364 1.1 nonaka cmd.c_opcode = SD_IO_RW_DIRECT; 365 1.1 nonaka cmd.c_arg = arg; 366 1.1 nonaka cmd.c_flags = SCF_CMD_AC | SCF_RSP_R5; 367 1.19 mlelstv if (toutok) 368 1.19 mlelstv cmd.c_flags |= SCF_TOUT_OK; 369 1.1 nonaka 370 1.1 nonaka error = sdmmc_mmc_command(sc, &cmd); 371 1.17 mlelstv if (error == 0) 372 1.17 mlelstv *datap = SD_R5_DATA(cmd.c_resp); 373 1.17 mlelstv 374 1.19 mlelstv if (error && error != ETIMEDOUT) { 375 1.17 mlelstv device_printf(sc->sc_dev, 376 1.17 mlelstv "direct I/O error %d, r=%d p=%p %s\n", 377 1.17 mlelstv error, reg, datap, 378 1.21 mlelstv ISSET(arg, SD_ARG_CMD52_WRITE) ? "write" : "read"); 379 1.17 mlelstv } 380 1.1 nonaka 381 1.1 nonaka return error; 382 1.1 nonaka } 383 1.1 nonaka 384 1.1 nonaka /* 385 1.1 nonaka * Useful values of `arg' to pass in are either SD_ARG_CMD53_READ or 386 1.1 nonaka * SD_ARG_CMD53_WRITE. SD_ARG_CMD53_INCREMENT may be ORed into `arg' 387 1.1 nonaka * to access successive register locations instead of accessing the 388 1.1 nonaka * same register many times. 389 1.1 nonaka */ 390 1.1 nonaka static int 391 1.1 nonaka sdmmc_io_rw_extended(struct sdmmc_softc *sc, struct sdmmc_function *sf, 392 1.1 nonaka int reg, u_char *datap, int datalen, int arg) 393 1.1 nonaka { 394 1.1 nonaka struct sdmmc_command cmd; 395 1.1 nonaka int error; 396 1.1 nonaka 397 1.1 nonaka /* Don't lock */ 398 1.1 nonaka 399 1.1 nonaka #if 0 400 1.1 nonaka /* Make sure the card is selected. */ 401 1.1 nonaka error = sdmmc_select_card(sc, sf); 402 1.1 nonaka if (error) 403 1.1 nonaka return error; 404 1.1 nonaka #endif 405 1.1 nonaka 406 1.1 nonaka arg |= (((sf == NULL) ? 0 : sf->number) & SD_ARG_CMD53_FUNC_MASK) << 407 1.1 nonaka SD_ARG_CMD53_FUNC_SHIFT; 408 1.1 nonaka arg |= (reg & SD_ARG_CMD53_REG_MASK) << 409 1.1 nonaka SD_ARG_CMD53_REG_SHIFT; 410 1.1 nonaka arg |= (datalen & SD_ARG_CMD53_LENGTH_MASK) << 411 1.1 nonaka SD_ARG_CMD53_LENGTH_SHIFT; 412 1.1 nonaka 413 1.1 nonaka memset(&cmd, 0, sizeof cmd); 414 1.1 nonaka cmd.c_opcode = SD_IO_RW_EXTENDED; 415 1.1 nonaka cmd.c_arg = arg; 416 1.16 jmcneill cmd.c_flags = SCF_CMD_ADTC | SCF_RSP_R5; 417 1.1 nonaka cmd.c_data = datap; 418 1.1 nonaka cmd.c_datalen = datalen; 419 1.15 mlelstv cmd.c_blklen = MIN(datalen, sf->blklen); 420 1.15 mlelstv 421 1.1 nonaka if (!ISSET(arg, SD_ARG_CMD53_WRITE)) 422 1.1 nonaka cmd.c_flags |= SCF_CMD_READ; 423 1.1 nonaka 424 1.1 nonaka error = sdmmc_mmc_command(sc, &cmd); 425 1.1 nonaka 426 1.17 mlelstv if (error) { 427 1.17 mlelstv device_printf(sc->sc_dev, 428 1.17 mlelstv "extended I/O error %d, r=%d p=%p l=%d %s\n", 429 1.17 mlelstv error, reg, datap, datalen, 430 1.17 mlelstv ISSET(arg, SD_ARG_CMD53_WRITE) ? "write" : "read"); 431 1.17 mlelstv } 432 1.17 mlelstv 433 1.1 nonaka return error; 434 1.1 nonaka } 435 1.1 nonaka 436 1.1 nonaka uint8_t 437 1.1 nonaka sdmmc_io_read_1(struct sdmmc_function *sf, int reg) 438 1.1 nonaka { 439 1.1 nonaka uint8_t data = 0; 440 1.1 nonaka 441 1.1 nonaka /* Don't lock */ 442 1.4 kiyohara 443 1.1 nonaka (void)sdmmc_io_rw_direct(sf->sc, sf, reg, (u_char *)&data, 444 1.19 mlelstv SD_ARG_CMD52_READ, false); 445 1.1 nonaka return data; 446 1.1 nonaka } 447 1.1 nonaka 448 1.1 nonaka void 449 1.1 nonaka sdmmc_io_write_1(struct sdmmc_function *sf, int reg, uint8_t data) 450 1.1 nonaka { 451 1.1 nonaka 452 1.1 nonaka /* Don't lock */ 453 1.1 nonaka 454 1.1 nonaka (void)sdmmc_io_rw_direct(sf->sc, sf, reg, (u_char *)&data, 455 1.19 mlelstv SD_ARG_CMD52_WRITE, false); 456 1.1 nonaka } 457 1.1 nonaka 458 1.1 nonaka uint16_t 459 1.1 nonaka sdmmc_io_read_2(struct sdmmc_function *sf, int reg) 460 1.1 nonaka { 461 1.1 nonaka uint16_t data = 0; 462 1.1 nonaka 463 1.1 nonaka /* Don't lock */ 464 1.1 nonaka 465 1.1 nonaka (void)sdmmc_io_rw_extended(sf->sc, sf, reg, (u_char *)&data, 2, 466 1.1 nonaka SD_ARG_CMD53_READ | SD_ARG_CMD53_INCREMENT); 467 1.1 nonaka return data; 468 1.1 nonaka } 469 1.1 nonaka 470 1.1 nonaka void 471 1.1 nonaka sdmmc_io_write_2(struct sdmmc_function *sf, int reg, uint16_t data) 472 1.1 nonaka { 473 1.1 nonaka 474 1.1 nonaka /* Don't lock */ 475 1.1 nonaka 476 1.1 nonaka (void)sdmmc_io_rw_extended(sf->sc, sf, reg, (u_char *)&data, 2, 477 1.1 nonaka SD_ARG_CMD53_WRITE | SD_ARG_CMD53_INCREMENT); 478 1.1 nonaka } 479 1.1 nonaka 480 1.1 nonaka uint32_t 481 1.1 nonaka sdmmc_io_read_4(struct sdmmc_function *sf, int reg) 482 1.1 nonaka { 483 1.1 nonaka uint32_t data = 0; 484 1.1 nonaka 485 1.1 nonaka /* Don't lock */ 486 1.4 kiyohara 487 1.1 nonaka (void)sdmmc_io_rw_extended(sf->sc, sf, reg, (u_char *)&data, 4, 488 1.1 nonaka SD_ARG_CMD53_READ | SD_ARG_CMD53_INCREMENT); 489 1.1 nonaka return data; 490 1.1 nonaka } 491 1.1 nonaka 492 1.1 nonaka void 493 1.1 nonaka sdmmc_io_write_4(struct sdmmc_function *sf, int reg, uint32_t data) 494 1.1 nonaka { 495 1.1 nonaka 496 1.1 nonaka /* Don't lock */ 497 1.1 nonaka 498 1.1 nonaka (void)sdmmc_io_rw_extended(sf->sc, sf, reg, (u_char *)&data, 4, 499 1.1 nonaka SD_ARG_CMD53_WRITE | SD_ARG_CMD53_INCREMENT); 500 1.1 nonaka } 501 1.1 nonaka 502 1.1 nonaka 503 1.1 nonaka int 504 1.1 nonaka sdmmc_io_read_multi_1(struct sdmmc_function *sf, int reg, u_char *data, 505 1.1 nonaka int datalen) 506 1.1 nonaka { 507 1.15 mlelstv int blocks, bytes, error = 0; 508 1.1 nonaka 509 1.1 nonaka /* Don't lock */ 510 1.1 nonaka 511 1.15 mlelstv while (datalen >= sf->blklen) { 512 1.15 mlelstv //blocks = imin(datalen / sf->blklen, 513 1.15 mlelstv // SD_ARG_CMD53_LENGTH_MAX); 514 1.15 mlelstv blocks = 1; 515 1.15 mlelstv bytes = blocks * sf->blklen; 516 1.1 nonaka error = sdmmc_io_rw_extended(sf->sc, sf, reg, data, 517 1.15 mlelstv bytes, SD_ARG_CMD53_READ); 518 1.1 nonaka if (error) 519 1.1 nonaka goto error; 520 1.15 mlelstv data += bytes; 521 1.15 mlelstv datalen -= bytes; 522 1.1 nonaka } 523 1.1 nonaka 524 1.15 mlelstv if (datalen) 525 1.15 mlelstv error = sdmmc_io_rw_extended(sf->sc, sf, reg, data, datalen, 526 1.15 mlelstv SD_ARG_CMD53_READ); 527 1.1 nonaka error: 528 1.1 nonaka return error; 529 1.1 nonaka } 530 1.1 nonaka 531 1.1 nonaka int 532 1.1 nonaka sdmmc_io_write_multi_1(struct sdmmc_function *sf, int reg, u_char *data, 533 1.1 nonaka int datalen) 534 1.1 nonaka { 535 1.15 mlelstv int blocks, bytes, error = 0; 536 1.15 mlelstv 537 1.15 mlelstv /* Don't lock */ 538 1.15 mlelstv 539 1.15 mlelstv while (datalen >= sf->blklen) { 540 1.15 mlelstv //blocks = imin(datalen / sf->blklen, 541 1.15 mlelstv // SD_ARG_CMD53_LENGTH_MAX); 542 1.15 mlelstv blocks = 1; 543 1.15 mlelstv bytes = blocks * sf->blklen; 544 1.15 mlelstv error = sdmmc_io_rw_extended(sf->sc, sf, reg, data, 545 1.15 mlelstv bytes, SD_ARG_CMD53_WRITE); 546 1.15 mlelstv if (error) 547 1.15 mlelstv goto error; 548 1.15 mlelstv data += bytes; 549 1.15 mlelstv datalen -= bytes; 550 1.15 mlelstv } 551 1.15 mlelstv 552 1.15 mlelstv if (datalen) 553 1.15 mlelstv error = sdmmc_io_rw_extended(sf->sc, sf, reg, data, datalen, 554 1.15 mlelstv SD_ARG_CMD53_WRITE); 555 1.15 mlelstv error: 556 1.15 mlelstv return error; 557 1.15 mlelstv } 558 1.15 mlelstv 559 1.15 mlelstv 560 1.15 mlelstv int 561 1.15 mlelstv sdmmc_io_read_region_1(struct sdmmc_function *sf, int reg, u_char *data, 562 1.15 mlelstv int datalen) 563 1.15 mlelstv { 564 1.15 mlelstv int blocks, bytes, error = 0; 565 1.15 mlelstv 566 1.15 mlelstv /* Don't lock */ 567 1.15 mlelstv 568 1.15 mlelstv while (datalen >= sf->blklen) { 569 1.15 mlelstv //blocks = imin(datalen / sf->blklen, 570 1.15 mlelstv // SD_ARG_CMD53_LENGTH_MAX); 571 1.15 mlelstv blocks = 1; 572 1.15 mlelstv bytes = blocks * sf->blklen; 573 1.15 mlelstv error = sdmmc_io_rw_extended(sf->sc, sf, reg, data, 574 1.15 mlelstv bytes, SD_ARG_CMD53_READ | SD_ARG_CMD53_INCREMENT); 575 1.15 mlelstv if (error) 576 1.15 mlelstv goto error; 577 1.15 mlelstv reg += bytes; 578 1.15 mlelstv data += bytes; 579 1.15 mlelstv datalen -= bytes; 580 1.15 mlelstv } 581 1.15 mlelstv 582 1.15 mlelstv if (datalen) 583 1.15 mlelstv error = sdmmc_io_rw_extended(sf->sc, sf, reg, data, datalen, 584 1.15 mlelstv SD_ARG_CMD53_READ | SD_ARG_CMD53_INCREMENT); 585 1.15 mlelstv error: 586 1.15 mlelstv return error; 587 1.15 mlelstv } 588 1.15 mlelstv 589 1.15 mlelstv int 590 1.15 mlelstv sdmmc_io_write_region_1(struct sdmmc_function *sf, int reg, u_char *data, 591 1.15 mlelstv int datalen) 592 1.15 mlelstv { 593 1.15 mlelstv int blocks, bytes, error = 0; 594 1.1 nonaka 595 1.1 nonaka /* Don't lock */ 596 1.1 nonaka 597 1.15 mlelstv while (datalen >= sf->blklen) { 598 1.15 mlelstv //blocks = imin(datalen / sf->blklen, 599 1.15 mlelstv // SD_ARG_CMD53_LENGTH_MAX); 600 1.15 mlelstv blocks = 1; 601 1.15 mlelstv bytes = blocks * sf->blklen; 602 1.1 nonaka error = sdmmc_io_rw_extended(sf->sc, sf, reg, data, 603 1.15 mlelstv bytes, SD_ARG_CMD53_WRITE | SD_ARG_CMD53_INCREMENT); 604 1.1 nonaka if (error) 605 1.1 nonaka goto error; 606 1.15 mlelstv reg += bytes; 607 1.15 mlelstv data += bytes; 608 1.15 mlelstv datalen -= bytes; 609 1.1 nonaka } 610 1.1 nonaka 611 1.15 mlelstv if (datalen) 612 1.15 mlelstv error = sdmmc_io_rw_extended(sf->sc, sf, reg, data, datalen, 613 1.15 mlelstv SD_ARG_CMD53_WRITE | SD_ARG_CMD53_INCREMENT); 614 1.1 nonaka error: 615 1.1 nonaka return error; 616 1.1 nonaka } 617 1.1 nonaka 618 1.1 nonaka #if 0 619 1.1 nonaka static int 620 1.1 nonaka sdmmc_io_xchg(struct sdmmc_softc *sc, struct sdmmc_function *sf, 621 1.1 nonaka int reg, u_char *datap) 622 1.1 nonaka { 623 1.1 nonaka 624 1.1 nonaka /* Don't lock */ 625 1.1 nonaka 626 1.1 nonaka return sdmmc_io_rw_direct(sc, sf, reg, datap, 627 1.19 mlelstv SD_ARG_CMD52_WRITE|SD_ARG_CMD52_EXCHANGE, false); 628 1.1 nonaka } 629 1.1 nonaka #endif 630 1.1 nonaka 631 1.1 nonaka /* 632 1.17 mlelstv * Abort I/O function of the card 633 1.17 mlelstv */ 634 1.17 mlelstv int 635 1.17 mlelstv sdmmc_io_function_abort(struct sdmmc_function *sf) 636 1.17 mlelstv { 637 1.17 mlelstv u_char data = CCCR_CTL_AS(sf->number); 638 1.17 mlelstv 639 1.17 mlelstv return sdmmc_io_rw_direct(sf->sc, NULL, SD_IO_CCCR_CTL, &data, 640 1.19 mlelstv SD_ARG_CMD52_WRITE, true); 641 1.17 mlelstv } 642 1.17 mlelstv 643 1.17 mlelstv /* 644 1.1 nonaka * Reset the I/O functions of the card. 645 1.1 nonaka */ 646 1.1 nonaka static void 647 1.1 nonaka sdmmc_io_reset(struct sdmmc_softc *sc) 648 1.1 nonaka { 649 1.13 jmcneill u_char data = CCCR_CTL_RES; 650 1.1 nonaka 651 1.15 mlelstv if (sdmmc_io_rw_direct(sc, NULL, SD_IO_CCCR_CTL, &data, 652 1.19 mlelstv SD_ARG_CMD52_WRITE, true) == 0) 653 1.17 mlelstv sdmmc_pause(100000, NULL); /* XXX SDMMC_LOCK */ 654 1.1 nonaka } 655 1.1 nonaka 656 1.1 nonaka /* 657 1.1 nonaka * Get or set the card's I/O OCR value (SDIO). 658 1.1 nonaka */ 659 1.1 nonaka static int 660 1.1 nonaka sdmmc_io_send_op_cond(struct sdmmc_softc *sc, u_int32_t ocr, u_int32_t *ocrp) 661 1.1 nonaka { 662 1.1 nonaka struct sdmmc_command cmd; 663 1.1 nonaka int error; 664 1.1 nonaka int retry; 665 1.1 nonaka 666 1.1 nonaka DPRINTF(("sdmmc_io_send_op_cond: ocr = %#x\n", ocr)); 667 1.1 nonaka 668 1.1 nonaka /* Don't lock */ 669 1.1 nonaka 670 1.1 nonaka /* 671 1.1 nonaka * If we change the OCR value, retry the command until the OCR 672 1.1 nonaka * we receive in response has the "CARD BUSY" bit set, meaning 673 1.1 nonaka * that all cards are ready for identification. 674 1.1 nonaka */ 675 1.1 nonaka for (retry = 0; retry < 100; retry++) { 676 1.1 nonaka memset(&cmd, 0, sizeof cmd); 677 1.1 nonaka cmd.c_opcode = SD_IO_SEND_OP_COND; 678 1.1 nonaka cmd.c_arg = ocr; 679 1.12 mlelstv cmd.c_flags = SCF_CMD_BCR | SCF_RSP_R4 | SCF_TOUT_OK; 680 1.1 nonaka 681 1.1 nonaka error = sdmmc_mmc_command(sc, &cmd); 682 1.1 nonaka if (error) 683 1.1 nonaka break; 684 1.1 nonaka if (ISSET(MMC_R4(cmd.c_resp), SD_IO_OCR_MEM_READY) || ocr == 0) 685 1.1 nonaka break; 686 1.1 nonaka 687 1.1 nonaka error = ETIMEDOUT; 688 1.17 mlelstv sdmmc_pause(10000, NULL); 689 1.1 nonaka } 690 1.1 nonaka if (error == 0 && ocrp != NULL) 691 1.1 nonaka *ocrp = MMC_R4(cmd.c_resp); 692 1.1 nonaka 693 1.1 nonaka DPRINTF(("sdmmc_io_send_op_cond: error = %d\n", error)); 694 1.1 nonaka 695 1.1 nonaka return error; 696 1.1 nonaka } 697 1.1 nonaka 698 1.1 nonaka /* 699 1.1 nonaka * Card interrupt handling 700 1.1 nonaka */ 701 1.1 nonaka 702 1.1 nonaka void 703 1.1 nonaka sdmmc_intr_enable(struct sdmmc_function *sf) 704 1.1 nonaka { 705 1.1 nonaka struct sdmmc_softc *sc = sf->sc; 706 1.1 nonaka struct sdmmc_function *sf0 = sc->sc_fn0; 707 1.1 nonaka uint8_t reg; 708 1.1 nonaka 709 1.1 nonaka SDMMC_LOCK(sc); 710 1.1 nonaka reg = sdmmc_io_read_1(sf0, SD_IO_CCCR_FN_INTEN); 711 1.1 nonaka reg |= 1 << sf->number; 712 1.1 nonaka sdmmc_io_write_1(sf0, SD_IO_CCCR_FN_INTEN, reg); 713 1.1 nonaka SDMMC_UNLOCK(sc); 714 1.1 nonaka } 715 1.1 nonaka 716 1.1 nonaka void 717 1.1 nonaka sdmmc_intr_disable(struct sdmmc_function *sf) 718 1.1 nonaka { 719 1.1 nonaka struct sdmmc_softc *sc = sf->sc; 720 1.1 nonaka struct sdmmc_function *sf0 = sc->sc_fn0; 721 1.1 nonaka uint8_t reg; 722 1.1 nonaka 723 1.1 nonaka SDMMC_LOCK(sc); 724 1.1 nonaka reg = sdmmc_io_read_1(sf0, SD_IO_CCCR_FN_INTEN); 725 1.1 nonaka reg &= ~(1 << sf->number); 726 1.1 nonaka sdmmc_io_write_1(sf0, SD_IO_CCCR_FN_INTEN, reg); 727 1.1 nonaka SDMMC_UNLOCK(sc); 728 1.1 nonaka } 729 1.1 nonaka 730 1.1 nonaka /* 731 1.1 nonaka * Establish a handler for the SDIO card interrupt. Because the 732 1.1 nonaka * interrupt may be shared with different SDIO functions, multiple 733 1.1 nonaka * handlers can be established. 734 1.1 nonaka */ 735 1.1 nonaka void * 736 1.1 nonaka sdmmc_intr_establish(device_t dev, int (*fun)(void *), void *arg, 737 1.1 nonaka const char *name) 738 1.1 nonaka { 739 1.1 nonaka struct sdmmc_softc *sc = device_private(dev); 740 1.1 nonaka struct sdmmc_intr_handler *ih; 741 1.1 nonaka 742 1.1 nonaka if (sc->sc_sct->card_enable_intr == NULL) 743 1.1 nonaka return NULL; 744 1.1 nonaka 745 1.14 jdolecek ih = malloc(sizeof *ih, M_DEVBUF, M_WAITOK|M_ZERO); 746 1.1 nonaka if (ih == NULL) 747 1.1 nonaka return NULL; 748 1.1 nonaka 749 1.14 jdolecek ih->ih_name = malloc(strlen(name) + 1, M_DEVBUF, M_WAITOK|M_ZERO); 750 1.1 nonaka if (ih->ih_name == NULL) { 751 1.1 nonaka free(ih, M_DEVBUF); 752 1.1 nonaka return NULL; 753 1.1 nonaka } 754 1.1 nonaka strlcpy(ih->ih_name, name, strlen(name)); 755 1.1 nonaka ih->ih_softc = sc; 756 1.1 nonaka ih->ih_fun = fun; 757 1.1 nonaka ih->ih_arg = arg; 758 1.1 nonaka 759 1.9 mlelstv mutex_enter(&sc->sc_mtx); 760 1.1 nonaka if (TAILQ_EMPTY(&sc->sc_intrq)) { 761 1.1 nonaka sdmmc_intr_enable(sc->sc_fn0); 762 1.1 nonaka sdmmc_chip_card_enable_intr(sc->sc_sct, sc->sc_sch, 1); 763 1.1 nonaka } 764 1.1 nonaka TAILQ_INSERT_TAIL(&sc->sc_intrq, ih, entry); 765 1.9 mlelstv mutex_exit(&sc->sc_mtx); 766 1.1 nonaka 767 1.1 nonaka return ih; 768 1.1 nonaka } 769 1.1 nonaka 770 1.1 nonaka /* 771 1.1 nonaka * Disestablish the given handler. 772 1.1 nonaka */ 773 1.1 nonaka void 774 1.1 nonaka sdmmc_intr_disestablish(void *cookie) 775 1.1 nonaka { 776 1.1 nonaka struct sdmmc_intr_handler *ih = cookie; 777 1.1 nonaka struct sdmmc_softc *sc = ih->ih_softc; 778 1.1 nonaka 779 1.1 nonaka if (sc->sc_sct->card_enable_intr == NULL) 780 1.1 nonaka return; 781 1.1 nonaka 782 1.9 mlelstv mutex_enter(&sc->sc_mtx); 783 1.1 nonaka TAILQ_REMOVE(&sc->sc_intrq, ih, entry); 784 1.1 nonaka if (TAILQ_EMPTY(&sc->sc_intrq)) { 785 1.1 nonaka sdmmc_chip_card_enable_intr(sc->sc_sct, sc->sc_sch, 0); 786 1.1 nonaka sdmmc_intr_disable(sc->sc_fn0); 787 1.1 nonaka } 788 1.9 mlelstv mutex_exit(&sc->sc_mtx); 789 1.1 nonaka 790 1.1 nonaka free(ih->ih_name, M_DEVBUF); 791 1.1 nonaka free(ih, M_DEVBUF); 792 1.1 nonaka } 793 1.1 nonaka 794 1.1 nonaka /* 795 1.1 nonaka * Call established SDIO card interrupt handlers. The host controller 796 1.1 nonaka * must call this function from its own interrupt handler to handle an 797 1.1 nonaka * SDIO interrupt from the card. 798 1.1 nonaka */ 799 1.1 nonaka void 800 1.1 nonaka sdmmc_card_intr(device_t dev) 801 1.1 nonaka { 802 1.1 nonaka struct sdmmc_softc *sc = device_private(dev); 803 1.1 nonaka 804 1.8 mlelstv if (sc->sc_sct->card_enable_intr == NULL) 805 1.8 mlelstv return; 806 1.8 mlelstv 807 1.20 riastrad sdmmc_add_task(sc, &sc->sc_intr_task); 808 1.1 nonaka } 809 1.1 nonaka 810 1.1 nonaka void 811 1.1 nonaka sdmmc_intr_task(void *arg) 812 1.1 nonaka { 813 1.1 nonaka struct sdmmc_softc *sc = (struct sdmmc_softc *)arg; 814 1.1 nonaka struct sdmmc_intr_handler *ih; 815 1.1 nonaka 816 1.9 mlelstv mutex_enter(&sc->sc_mtx); 817 1.1 nonaka TAILQ_FOREACH(ih, &sc->sc_intrq, entry) { 818 1.1 nonaka /* XXX examine return value and do evcount stuff*/ 819 1.1 nonaka (void)(*ih->ih_fun)(ih->ih_arg); 820 1.1 nonaka } 821 1.11 mlelstv mutex_exit(&sc->sc_mtx); 822 1.11 mlelstv 823 1.1 nonaka sdmmc_chip_card_intr_ack(sc->sc_sct, sc->sc_sch); 824 1.1 nonaka } 825 1.15 mlelstv 826 1.15 mlelstv int 827 1.18 mlelstv sdmmc_io_set_blocklen(struct sdmmc_function *sf, 828 1.15 mlelstv int blklen) 829 1.15 mlelstv { 830 1.18 mlelstv struct sdmmc_softc *sc = sf->sc; 831 1.15 mlelstv struct sdmmc_function *sf0 = sc->sc_fn0; 832 1.15 mlelstv int error = EINVAL; 833 1.15 mlelstv 834 1.15 mlelstv SDMMC_LOCK(sc); 835 1.15 mlelstv 836 1.15 mlelstv if (blklen <= 0 || 837 1.15 mlelstv blklen > sdmmc_chip_host_maxblklen(sc->sc_sct, sc->sc_sch)) 838 1.15 mlelstv goto err; 839 1.15 mlelstv 840 1.15 mlelstv sdmmc_io_write_1(sf0, SD_IO_FBR(sf->number) + 841 1.15 mlelstv SD_IO_FBR_BLOCKLEN, blklen & 0xff); 842 1.15 mlelstv sdmmc_io_write_1(sf0, SD_IO_FBR(sf->number) + 843 1.15 mlelstv SD_IO_FBR_BLOCKLEN + 1, (blklen >> 8) & 0xff); 844 1.15 mlelstv 845 1.15 mlelstv sf->blklen = blklen; 846 1.15 mlelstv error = 0; 847 1.15 mlelstv 848 1.15 mlelstv err: 849 1.15 mlelstv SDMMC_UNLOCK(sc); 850 1.15 mlelstv 851 1.15 mlelstv return error; 852 1.15 mlelstv } 853 1.17 mlelstv 854