1 1.77 skrll /* $NetBSD: sdmmc_mem.c,v 1.77 2024/10/24 10:50:31 skrll Exp $ */ 2 1.1 nonaka /* $OpenBSD: sdmmc_mem.c,v 1.10 2009/01/09 10:55:22 jsg 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.18 nonaka * Copyright (C) 2007, 2008, 2009, 2010 NONAKA Kimihiro <nonaka (at) netbsd.org> 22 1.1 nonaka * All rights reserved. 23 1.1 nonaka * 24 1.1 nonaka * Redistribution and use in source and binary forms, with or without 25 1.1 nonaka * modification, are permitted provided that the following conditions 26 1.1 nonaka * are met: 27 1.1 nonaka * 1. Redistributions of source code must retain the above copyright 28 1.1 nonaka * notice, this list of conditions and the following disclaimer. 29 1.1 nonaka * 2. Redistributions in binary form must reproduce the above copyright 30 1.1 nonaka * notice, this list of conditions and the following disclaimer in the 31 1.1 nonaka * documentation and/or other materials provided with the distribution. 32 1.1 nonaka * 33 1.18 nonaka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 34 1.18 nonaka * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 35 1.18 nonaka * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 36 1.18 nonaka * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 37 1.18 nonaka * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 38 1.18 nonaka * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 39 1.18 nonaka * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 40 1.18 nonaka * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 41 1.18 nonaka * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 42 1.18 nonaka * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 43 1.1 nonaka */ 44 1.1 nonaka 45 1.1 nonaka /* Routines for SD/MMC memory cards. */ 46 1.1 nonaka 47 1.1 nonaka #include <sys/cdefs.h> 48 1.77 skrll __KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.77 2024/10/24 10:50:31 skrll Exp $"); 49 1.20 matt 50 1.20 matt #ifdef _KERNEL_OPT 51 1.20 matt #include "opt_sdmmc.h" 52 1.20 matt #endif 53 1.1 nonaka 54 1.1 nonaka #include <sys/param.h> 55 1.1 nonaka #include <sys/kernel.h> 56 1.1 nonaka #include <sys/malloc.h> 57 1.1 nonaka #include <sys/systm.h> 58 1.1 nonaka #include <sys/device.h> 59 1.49 jmcneill #include <sys/bitops.h> 60 1.49 jmcneill #include <sys/evcnt.h> 61 1.1 nonaka 62 1.1 nonaka #include <dev/sdmmc/sdmmcchip.h> 63 1.1 nonaka #include <dev/sdmmc/sdmmcreg.h> 64 1.1 nonaka #include <dev/sdmmc/sdmmcvar.h> 65 1.1 nonaka 66 1.1 nonaka #ifdef SDMMC_DEBUG 67 1.1 nonaka #define DPRINTF(s) do { printf s; } while (/*CONSTCOND*/0) 68 1.1 nonaka #else 69 1.1 nonaka #define DPRINTF(s) do {} while (/*CONSTCOND*/0) 70 1.1 nonaka #endif 71 1.1 nonaka 72 1.26 jakllsch typedef struct { uint32_t _bits[512/32]; } __packed __aligned(4) sdmmc_bitfield512_t; 73 1.26 jakllsch 74 1.13 kiyohara static int sdmmc_mem_sd_init(struct sdmmc_softc *, struct sdmmc_function *); 75 1.13 kiyohara static int sdmmc_mem_mmc_init(struct sdmmc_softc *, struct sdmmc_function *); 76 1.4 nonaka static int sdmmc_mem_send_cid(struct sdmmc_softc *, sdmmc_response *); 77 1.4 nonaka static int sdmmc_mem_send_csd(struct sdmmc_softc *, struct sdmmc_function *, 78 1.4 nonaka sdmmc_response *); 79 1.4 nonaka static int sdmmc_mem_send_scr(struct sdmmc_softc *, struct sdmmc_function *, 80 1.31 nonaka uint32_t *scr); 81 1.4 nonaka static int sdmmc_mem_decode_scr(struct sdmmc_softc *, struct sdmmc_function *); 82 1.59 jmcneill static int sdmmc_mem_send_ssr(struct sdmmc_softc *, struct sdmmc_function *, 83 1.59 jmcneill sdmmc_bitfield512_t *); 84 1.59 jmcneill static int sdmmc_mem_decode_ssr(struct sdmmc_softc *, struct sdmmc_function *, 85 1.59 jmcneill sdmmc_bitfield512_t *); 86 1.76 jmcneill static int sdmmc_mem_decode_general_info(struct sdmmc_softc *, 87 1.76 jmcneill struct sdmmc_function * ,const uint8_t *); 88 1.76 jmcneill static int sdmmc_mem_pef_enable_cache(struct sdmmc_softc *, 89 1.76 jmcneill struct sdmmc_function *); 90 1.4 nonaka static int sdmmc_mem_send_cxd_data(struct sdmmc_softc *, int, void *, size_t); 91 1.76 jmcneill static int sdmmc_mem_read_extr_single(struct sdmmc_softc *, struct sdmmc_function *, 92 1.76 jmcneill uint8_t, uint8_t, uint32_t, uint16_t, void *); 93 1.76 jmcneill static int sdmmc_mem_write_extr_single(struct sdmmc_softc *, struct sdmmc_function *, 94 1.76 jmcneill uint8_t, uint8_t, uint32_t, uint8_t, bool); 95 1.4 nonaka static int sdmmc_set_bus_width(struct sdmmc_function *, int); 96 1.26 jakllsch static int sdmmc_mem_sd_switch(struct sdmmc_function *, int, int, int, sdmmc_bitfield512_t *); 97 1.4 nonaka static int sdmmc_mem_mmc_switch(struct sdmmc_function *, uint8_t, uint8_t, 98 1.61 jmcneill uint8_t, bool); 99 1.44 jmcneill static int sdmmc_mem_signal_voltage(struct sdmmc_softc *, int); 100 1.4 nonaka static int sdmmc_mem_spi_read_ocr(struct sdmmc_softc *, uint32_t, uint32_t *); 101 1.4 nonaka static int sdmmc_mem_single_read_block(struct sdmmc_function *, uint32_t, 102 1.4 nonaka u_char *, size_t); 103 1.4 nonaka static int sdmmc_mem_single_write_block(struct sdmmc_function *, uint32_t, 104 1.4 nonaka u_char *, size_t); 105 1.34 nonaka static int sdmmc_mem_single_segment_dma_read_block(struct sdmmc_function *, 106 1.34 nonaka uint32_t, u_char *, size_t); 107 1.34 nonaka static int sdmmc_mem_single_segment_dma_write_block(struct sdmmc_function *, 108 1.34 nonaka uint32_t, u_char *, size_t); 109 1.34 nonaka static int sdmmc_mem_read_block_subr(struct sdmmc_function *, bus_dmamap_t, 110 1.34 nonaka uint32_t, u_char *, size_t); 111 1.34 nonaka static int sdmmc_mem_write_block_subr(struct sdmmc_function *, bus_dmamap_t, 112 1.34 nonaka uint32_t, u_char *, size_t); 113 1.1 nonaka 114 1.39 jmcneill static const struct { 115 1.39 jmcneill const char *name; 116 1.39 jmcneill int v; 117 1.39 jmcneill int freq; 118 1.39 jmcneill } switch_group0_functions[] = { 119 1.39 jmcneill /* Default/SDR12 */ 120 1.39 jmcneill { "Default/SDR12", 0, 25000 }, 121 1.39 jmcneill 122 1.39 jmcneill /* High-Speed/SDR25 */ 123 1.39 jmcneill { "High-Speed/SDR25", SMC_CAPS_SD_HIGHSPEED, 50000 }, 124 1.39 jmcneill 125 1.39 jmcneill /* SDR50 */ 126 1.39 jmcneill { "SDR50", SMC_CAPS_UHS_SDR50, 100000 }, 127 1.39 jmcneill 128 1.39 jmcneill /* SDR104 */ 129 1.39 jmcneill { "SDR104", SMC_CAPS_UHS_SDR104, 208000 }, 130 1.39 jmcneill 131 1.39 jmcneill /* DDR50 */ 132 1.39 jmcneill { "DDR50", SMC_CAPS_UHS_DDR50, 50000 }, 133 1.39 jmcneill }; 134 1.39 jmcneill 135 1.68 jmcneill static const int sdmmc_mmc_timings[] = { 136 1.68 jmcneill [EXT_CSD_HS_TIMING_LEGACY] = 26000, 137 1.68 jmcneill [EXT_CSD_HS_TIMING_HIGHSPEED] = 52000, 138 1.68 jmcneill [EXT_CSD_HS_TIMING_HS200] = 200000 139 1.68 jmcneill }; 140 1.68 jmcneill 141 1.1 nonaka /* 142 1.1 nonaka * Initialize SD/MMC memory cards and memory in SDIO "combo" cards. 143 1.1 nonaka */ 144 1.1 nonaka int 145 1.1 nonaka sdmmc_mem_enable(struct sdmmc_softc *sc) 146 1.1 nonaka { 147 1.1 nonaka uint32_t host_ocr; 148 1.1 nonaka uint32_t card_ocr; 149 1.35 jmcneill uint32_t new_ocr; 150 1.4 nonaka uint32_t ocr = 0; 151 1.1 nonaka int error; 152 1.1 nonaka 153 1.1 nonaka SDMMC_LOCK(sc); 154 1.1 nonaka 155 1.1 nonaka /* Set host mode to SD "combo" card or SD memory-only. */ 156 1.41 jmcneill CLR(sc->sc_flags, SMF_UHS_MODE); 157 1.1 nonaka SET(sc->sc_flags, SMF_SD_MODE|SMF_MEM_MODE); 158 1.1 nonaka 159 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 160 1.4 nonaka sdmmc_spi_chip_initialize(sc->sc_spi_sct, sc->sc_sch); 161 1.4 nonaka 162 1.44 jmcneill /* Reset memory (*must* do that before CMD55 or CMD1). */ 163 1.44 jmcneill sdmmc_go_idle_state(sc); 164 1.44 jmcneill 165 1.31 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 166 1.31 nonaka /* Check SD Ver.2 */ 167 1.31 nonaka error = sdmmc_mem_send_if_cond(sc, 0x1aa, &card_ocr); 168 1.31 nonaka if (error == 0 && card_ocr == 0x1aa) 169 1.31 nonaka SET(ocr, MMC_OCR_HCS); 170 1.31 nonaka } 171 1.4 nonaka 172 1.1 nonaka /* 173 1.1 nonaka * Read the SD/MMC memory OCR value by issuing CMD55 followed 174 1.1 nonaka * by ACMD41 to read the OCR value from memory-only SD cards. 175 1.1 nonaka * MMC cards will not respond to CMD55 or ACMD41 and this is 176 1.1 nonaka * how we distinguish them from SD cards. 177 1.1 nonaka */ 178 1.1 nonaka mmc_mode: 179 1.4 nonaka error = sdmmc_mem_send_op_cond(sc, 180 1.31 nonaka ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE) ? ocr : 0, &card_ocr); 181 1.1 nonaka if (error) { 182 1.1 nonaka if (ISSET(sc->sc_flags, SMF_SD_MODE) && 183 1.1 nonaka !ISSET(sc->sc_flags, SMF_IO_MODE)) { 184 1.1 nonaka /* Not a SD card, switch to MMC mode. */ 185 1.1 nonaka DPRINTF(("%s: switch to MMC mode\n", SDMMCDEVNAME(sc))); 186 1.1 nonaka CLR(sc->sc_flags, SMF_SD_MODE); 187 1.1 nonaka goto mmc_mode; 188 1.1 nonaka } 189 1.1 nonaka if (!ISSET(sc->sc_flags, SMF_SD_MODE)) { 190 1.1 nonaka DPRINTF(("%s: couldn't read memory OCR\n", 191 1.1 nonaka SDMMCDEVNAME(sc))); 192 1.1 nonaka goto out; 193 1.1 nonaka } else { 194 1.1 nonaka /* Not a "combo" card. */ 195 1.1 nonaka CLR(sc->sc_flags, SMF_MEM_MODE); 196 1.1 nonaka error = 0; 197 1.1 nonaka goto out; 198 1.1 nonaka } 199 1.1 nonaka } 200 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 201 1.4 nonaka /* get card OCR */ 202 1.4 nonaka error = sdmmc_mem_spi_read_ocr(sc, ocr, &card_ocr); 203 1.4 nonaka if (error) { 204 1.4 nonaka DPRINTF(("%s: couldn't read SPI memory OCR\n", 205 1.4 nonaka SDMMCDEVNAME(sc))); 206 1.4 nonaka goto out; 207 1.4 nonaka } 208 1.4 nonaka } 209 1.1 nonaka 210 1.1 nonaka /* Set the lowest voltage supported by the card and host. */ 211 1.1 nonaka host_ocr = sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch); 212 1.1 nonaka error = sdmmc_set_bus_power(sc, host_ocr, card_ocr); 213 1.1 nonaka if (error) { 214 1.1 nonaka DPRINTF(("%s: couldn't supply voltage requested by card\n", 215 1.1 nonaka SDMMCDEVNAME(sc))); 216 1.1 nonaka goto out; 217 1.1 nonaka } 218 1.31 nonaka 219 1.32 jmcneill DPRINTF(("%s: host_ocr 0x%08x\n", SDMMCDEVNAME(sc), host_ocr)); 220 1.32 jmcneill DPRINTF(("%s: card_ocr 0x%08x\n", SDMMCDEVNAME(sc), card_ocr)); 221 1.32 jmcneill 222 1.31 nonaka host_ocr &= card_ocr; /* only allow the common voltages */ 223 1.31 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 224 1.46 jmcneill if (ISSET(sc->sc_flags, SMF_SD_MODE)) { 225 1.51 tsutsui /* Tell the card(s) to enter the idle state (again). */ 226 1.51 tsutsui sdmmc_go_idle_state(sc); 227 1.46 jmcneill /* Check SD Ver.2 */ 228 1.46 jmcneill error = sdmmc_mem_send_if_cond(sc, 0x1aa, &card_ocr); 229 1.46 jmcneill if (error == 0 && card_ocr == 0x1aa) 230 1.46 jmcneill SET(ocr, MMC_OCR_HCS); 231 1.35 jmcneill 232 1.46 jmcneill if (sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch) & MMC_OCR_S18A) 233 1.46 jmcneill SET(ocr, MMC_OCR_S18A); 234 1.46 jmcneill } else { 235 1.46 jmcneill SET(ocr, MMC_OCR_ACCESS_MODE_SECTOR); 236 1.46 jmcneill } 237 1.31 nonaka } 238 1.4 nonaka host_ocr |= ocr; 239 1.1 nonaka 240 1.1 nonaka /* Send the new OCR value until all cards are ready. */ 241 1.35 jmcneill error = sdmmc_mem_send_op_cond(sc, host_ocr, &new_ocr); 242 1.1 nonaka if (error) { 243 1.1 nonaka DPRINTF(("%s: couldn't send memory OCR\n", SDMMCDEVNAME(sc))); 244 1.1 nonaka goto out; 245 1.1 nonaka } 246 1.1 nonaka 247 1.46 jmcneill if (ISSET(sc->sc_flags, SMF_SD_MODE) && ISSET(new_ocr, MMC_OCR_S18A)) { 248 1.35 jmcneill /* 249 1.35 jmcneill * Card and host support low voltage mode, begin switch 250 1.35 jmcneill * sequence. 251 1.35 jmcneill */ 252 1.35 jmcneill struct sdmmc_command cmd; 253 1.35 jmcneill memset(&cmd, 0, sizeof(cmd)); 254 1.35 jmcneill cmd.c_arg = 0; 255 1.35 jmcneill cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1; 256 1.35 jmcneill cmd.c_opcode = SD_VOLTAGE_SWITCH; 257 1.43 jmcneill DPRINTF(("%s: switching card to 1.8V\n", SDMMCDEVNAME(sc))); 258 1.35 jmcneill error = sdmmc_mmc_command(sc, &cmd); 259 1.35 jmcneill if (error) { 260 1.35 jmcneill DPRINTF(("%s: voltage switch command failed\n", 261 1.35 jmcneill SDMMCDEVNAME(sc))); 262 1.35 jmcneill goto out; 263 1.35 jmcneill } 264 1.35 jmcneill 265 1.44 jmcneill error = sdmmc_mem_signal_voltage(sc, SDMMC_SIGNAL_VOLTAGE_180); 266 1.73 mlelstv if (error) { 267 1.73 mlelstv DPRINTF(("%s: voltage change on host failed\n", 268 1.73 mlelstv SDMMCDEVNAME(sc))); 269 1.35 jmcneill goto out; 270 1.73 mlelstv } 271 1.35 jmcneill 272 1.35 jmcneill SET(sc->sc_flags, SMF_UHS_MODE); 273 1.35 jmcneill } 274 1.35 jmcneill 275 1.1 nonaka out: 276 1.1 nonaka SDMMC_UNLOCK(sc); 277 1.1 nonaka 278 1.1 nonaka return error; 279 1.1 nonaka } 280 1.1 nonaka 281 1.44 jmcneill static int 282 1.44 jmcneill sdmmc_mem_signal_voltage(struct sdmmc_softc *sc, int signal_voltage) 283 1.44 jmcneill { 284 1.44 jmcneill int error; 285 1.44 jmcneill 286 1.44 jmcneill /* 287 1.44 jmcneill * Stop the clock 288 1.44 jmcneill */ 289 1.44 jmcneill error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, 290 1.44 jmcneill SDMMC_SDCLK_OFF, false); 291 1.44 jmcneill if (error) 292 1.44 jmcneill goto out; 293 1.44 jmcneill 294 1.44 jmcneill delay(1000); 295 1.44 jmcneill 296 1.44 jmcneill /* 297 1.44 jmcneill * Card switch command was successful, update host controller 298 1.44 jmcneill * signal voltage setting. 299 1.44 jmcneill */ 300 1.44 jmcneill DPRINTF(("%s: switching host to %s\n", SDMMCDEVNAME(sc), 301 1.44 jmcneill signal_voltage == SDMMC_SIGNAL_VOLTAGE_180 ? "1.8V" : "3.3V")); 302 1.44 jmcneill error = sdmmc_chip_signal_voltage(sc->sc_sct, 303 1.44 jmcneill sc->sc_sch, signal_voltage); 304 1.44 jmcneill if (error) 305 1.44 jmcneill goto out; 306 1.44 jmcneill 307 1.44 jmcneill delay(5000); 308 1.44 jmcneill 309 1.44 jmcneill /* 310 1.44 jmcneill * Switch to SDR12 timing 311 1.44 jmcneill */ 312 1.44 jmcneill error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, 25000, 313 1.44 jmcneill false); 314 1.44 jmcneill if (error) 315 1.44 jmcneill goto out; 316 1.44 jmcneill 317 1.44 jmcneill delay(1000); 318 1.44 jmcneill 319 1.44 jmcneill out: 320 1.44 jmcneill return error; 321 1.44 jmcneill } 322 1.44 jmcneill 323 1.1 nonaka /* 324 1.1 nonaka * Read the CSD and CID from all cards and assign each card a unique 325 1.1 nonaka * relative card address (RCA). CMD2 is ignored by SDIO-only cards. 326 1.1 nonaka */ 327 1.1 nonaka void 328 1.1 nonaka sdmmc_mem_scan(struct sdmmc_softc *sc) 329 1.1 nonaka { 330 1.4 nonaka sdmmc_response resp; 331 1.1 nonaka struct sdmmc_function *sf; 332 1.1 nonaka uint16_t next_rca; 333 1.1 nonaka int error; 334 1.1 nonaka int retry; 335 1.1 nonaka 336 1.1 nonaka SDMMC_LOCK(sc); 337 1.1 nonaka 338 1.1 nonaka /* 339 1.1 nonaka * CMD2 is a broadcast command understood by SD cards and MMC 340 1.1 nonaka * cards. All cards begin to respond to the command, but back 341 1.1 nonaka * off if another card drives the CMD line to a different level. 342 1.1 nonaka * Only one card will get its entire response through. That 343 1.1 nonaka * card remains silent once it has been assigned a RCA. 344 1.1 nonaka */ 345 1.1 nonaka for (retry = 0; retry < 100; retry++) { 346 1.4 nonaka error = sdmmc_mem_send_cid(sc, &resp); 347 1.4 nonaka if (error) { 348 1.4 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE) && 349 1.4 nonaka error == ETIMEDOUT) { 350 1.4 nonaka /* No more cards there. */ 351 1.4 nonaka break; 352 1.4 nonaka } 353 1.1 nonaka DPRINTF(("%s: couldn't read CID\n", SDMMCDEVNAME(sc))); 354 1.1 nonaka break; 355 1.1 nonaka } 356 1.1 nonaka 357 1.1 nonaka /* In MMC mode, find the next available RCA. */ 358 1.1 nonaka next_rca = 1; 359 1.1 nonaka if (!ISSET(sc->sc_flags, SMF_SD_MODE)) { 360 1.1 nonaka SIMPLEQ_FOREACH(sf, &sc->sf_head, sf_list) 361 1.1 nonaka next_rca++; 362 1.1 nonaka } 363 1.1 nonaka 364 1.1 nonaka /* Allocate a sdmmc_function structure. */ 365 1.1 nonaka sf = sdmmc_function_alloc(sc); 366 1.1 nonaka sf->rca = next_rca; 367 1.1 nonaka 368 1.1 nonaka /* 369 1.1 nonaka * Remember the CID returned in the CMD2 response for 370 1.1 nonaka * later decoding. 371 1.1 nonaka */ 372 1.4 nonaka memcpy(sf->raw_cid, resp, sizeof(sf->raw_cid)); 373 1.1 nonaka 374 1.1 nonaka /* 375 1.1 nonaka * Silence the card by assigning it a unique RCA, or 376 1.1 nonaka * querying it for its RCA in the case of SD. 377 1.1 nonaka */ 378 1.4 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 379 1.4 nonaka if (sdmmc_set_relative_addr(sc, sf) != 0) { 380 1.4 nonaka aprint_error_dev(sc->sc_dev, 381 1.4 nonaka "couldn't set mem RCA\n"); 382 1.4 nonaka sdmmc_function_free(sf); 383 1.4 nonaka break; 384 1.4 nonaka } 385 1.1 nonaka } 386 1.1 nonaka 387 1.1 nonaka /* 388 1.1 nonaka * If this is a memory-only card, the card responding 389 1.1 nonaka * first becomes an alias for SDIO function 0. 390 1.1 nonaka */ 391 1.1 nonaka if (sc->sc_fn0 == NULL) 392 1.1 nonaka sc->sc_fn0 = sf; 393 1.1 nonaka 394 1.1 nonaka SIMPLEQ_INSERT_TAIL(&sc->sf_head, sf, sf_list); 395 1.4 nonaka 396 1.4 nonaka /* only one function in SPI mode */ 397 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 398 1.4 nonaka break; 399 1.1 nonaka } 400 1.1 nonaka 401 1.13 kiyohara if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 402 1.13 kiyohara /* Go to Data Transfer Mode, if possible. */ 403 1.13 kiyohara sdmmc_chip_bus_rod(sc->sc_sct, sc->sc_sch, 0); 404 1.13 kiyohara 405 1.1 nonaka /* 406 1.1 nonaka * All cards are either inactive or awaiting further commands. 407 1.1 nonaka * Read the CSDs and decode the raw CID for each card. 408 1.1 nonaka */ 409 1.1 nonaka SIMPLEQ_FOREACH(sf, &sc->sf_head, sf_list) { 410 1.4 nonaka error = sdmmc_mem_send_csd(sc, sf, &resp); 411 1.4 nonaka if (error) { 412 1.1 nonaka SET(sf->flags, SFF_ERROR); 413 1.1 nonaka continue; 414 1.1 nonaka } 415 1.1 nonaka 416 1.4 nonaka if (sdmmc_decode_csd(sc, resp, sf) != 0 || 417 1.1 nonaka sdmmc_decode_cid(sc, sf->raw_cid, sf) != 0) { 418 1.1 nonaka SET(sf->flags, SFF_ERROR); 419 1.1 nonaka continue; 420 1.1 nonaka } 421 1.1 nonaka 422 1.1 nonaka #ifdef SDMMC_DEBUG 423 1.1 nonaka printf("%s: CID: ", SDMMCDEVNAME(sc)); 424 1.1 nonaka sdmmc_print_cid(&sf->cid); 425 1.1 nonaka #endif 426 1.1 nonaka } 427 1.1 nonaka 428 1.1 nonaka SDMMC_UNLOCK(sc); 429 1.1 nonaka } 430 1.1 nonaka 431 1.1 nonaka int 432 1.1 nonaka sdmmc_decode_csd(struct sdmmc_softc *sc, sdmmc_response resp, 433 1.1 nonaka struct sdmmc_function *sf) 434 1.1 nonaka { 435 1.1 nonaka /* TRAN_SPEED(2:0): transfer rate exponent */ 436 1.1 nonaka static const int speed_exponent[8] = { 437 1.1 nonaka 100 * 1, /* 100 Kbits/s */ 438 1.1 nonaka 1 * 1000, /* 1 Mbits/s */ 439 1.1 nonaka 10 * 1000, /* 10 Mbits/s */ 440 1.1 nonaka 100 * 1000, /* 100 Mbits/s */ 441 1.1 nonaka 0, 442 1.1 nonaka 0, 443 1.1 nonaka 0, 444 1.1 nonaka 0, 445 1.1 nonaka }; 446 1.1 nonaka /* TRAN_SPEED(6:3): time mantissa */ 447 1.1 nonaka static const int speed_mantissa[16] = { 448 1.1 nonaka 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80, 449 1.1 nonaka }; 450 1.1 nonaka struct sdmmc_csd *csd = &sf->csd; 451 1.1 nonaka int e, m; 452 1.1 nonaka 453 1.1 nonaka if (ISSET(sc->sc_flags, SMF_SD_MODE)) { 454 1.1 nonaka /* 455 1.1 nonaka * CSD version 1.0 corresponds to SD system 456 1.1 nonaka * specification version 1.0 - 1.10. (SanDisk, 3.5.3) 457 1.1 nonaka */ 458 1.1 nonaka csd->csdver = SD_CSD_CSDVER(resp); 459 1.1 nonaka switch (csd->csdver) { 460 1.1 nonaka case SD_CSD_CSDVER_2_0: 461 1.1 nonaka DPRINTF(("%s: SD Ver.2.0\n", SDMMCDEVNAME(sc))); 462 1.2 nonaka SET(sf->flags, SFF_SDHC); 463 1.1 nonaka csd->capacity = SD_CSD_V2_CAPACITY(resp); 464 1.1 nonaka csd->read_bl_len = SD_CSD_V2_BL_LEN; 465 1.1 nonaka break; 466 1.1 nonaka 467 1.1 nonaka case SD_CSD_CSDVER_1_0: 468 1.1 nonaka DPRINTF(("%s: SD Ver.1.0\n", SDMMCDEVNAME(sc))); 469 1.1 nonaka csd->capacity = SD_CSD_CAPACITY(resp); 470 1.1 nonaka csd->read_bl_len = SD_CSD_READ_BL_LEN(resp); 471 1.1 nonaka break; 472 1.1 nonaka 473 1.1 nonaka default: 474 1.1 nonaka aprint_error_dev(sc->sc_dev, 475 1.1 nonaka "unknown SD CSD structure version 0x%x\n", 476 1.1 nonaka csd->csdver); 477 1.1 nonaka return 1; 478 1.1 nonaka } 479 1.1 nonaka 480 1.1 nonaka csd->mmcver = SD_CSD_MMCVER(resp); 481 1.1 nonaka csd->write_bl_len = SD_CSD_WRITE_BL_LEN(resp); 482 1.1 nonaka csd->r2w_factor = SD_CSD_R2W_FACTOR(resp); 483 1.1 nonaka e = SD_CSD_SPEED_EXP(resp); 484 1.1 nonaka m = SD_CSD_SPEED_MANT(resp); 485 1.1 nonaka csd->tran_speed = speed_exponent[e] * speed_mantissa[m] / 10; 486 1.25 jakllsch csd->ccc = SD_CSD_CCC(resp); 487 1.1 nonaka } else { 488 1.1 nonaka csd->csdver = MMC_CSD_CSDVER(resp); 489 1.16 nonaka if (csd->csdver == MMC_CSD_CSDVER_1_0) { 490 1.1 nonaka aprint_error_dev(sc->sc_dev, 491 1.1 nonaka "unknown MMC CSD structure version 0x%x\n", 492 1.1 nonaka csd->csdver); 493 1.1 nonaka return 1; 494 1.1 nonaka } 495 1.1 nonaka 496 1.1 nonaka csd->mmcver = MMC_CSD_MMCVER(resp); 497 1.1 nonaka csd->capacity = MMC_CSD_CAPACITY(resp); 498 1.1 nonaka csd->read_bl_len = MMC_CSD_READ_BL_LEN(resp); 499 1.1 nonaka csd->write_bl_len = MMC_CSD_WRITE_BL_LEN(resp); 500 1.1 nonaka csd->r2w_factor = MMC_CSD_R2W_FACTOR(resp); 501 1.1 nonaka e = MMC_CSD_TRAN_SPEED_EXP(resp); 502 1.1 nonaka m = MMC_CSD_TRAN_SPEED_MANT(resp); 503 1.1 nonaka csd->tran_speed = speed_exponent[e] * speed_mantissa[m] / 10; 504 1.1 nonaka } 505 1.3 nonaka if ((1 << csd->read_bl_len) > SDMMC_SECTOR_SIZE) 506 1.3 nonaka csd->capacity *= (1 << csd->read_bl_len) / SDMMC_SECTOR_SIZE; 507 1.1 nonaka 508 1.1 nonaka #ifdef SDMMC_DUMP_CSD 509 1.1 nonaka sdmmc_print_csd(resp, csd); 510 1.1 nonaka #endif 511 1.1 nonaka 512 1.1 nonaka return 0; 513 1.1 nonaka } 514 1.1 nonaka 515 1.1 nonaka int 516 1.1 nonaka sdmmc_decode_cid(struct sdmmc_softc *sc, sdmmc_response resp, 517 1.1 nonaka struct sdmmc_function *sf) 518 1.1 nonaka { 519 1.1 nonaka struct sdmmc_cid *cid = &sf->cid; 520 1.1 nonaka 521 1.1 nonaka if (ISSET(sc->sc_flags, SMF_SD_MODE)) { 522 1.1 nonaka cid->mid = SD_CID_MID(resp); 523 1.1 nonaka cid->oid = SD_CID_OID(resp); 524 1.1 nonaka SD_CID_PNM_CPY(resp, cid->pnm); 525 1.1 nonaka cid->rev = SD_CID_REV(resp); 526 1.1 nonaka cid->psn = SD_CID_PSN(resp); 527 1.1 nonaka cid->mdt = SD_CID_MDT(resp); 528 1.1 nonaka } else { 529 1.1 nonaka switch(sf->csd.mmcver) { 530 1.1 nonaka case MMC_CSD_MMCVER_1_0: 531 1.1 nonaka case MMC_CSD_MMCVER_1_4: 532 1.1 nonaka cid->mid = MMC_CID_MID_V1(resp); 533 1.1 nonaka MMC_CID_PNM_V1_CPY(resp, cid->pnm); 534 1.1 nonaka cid->rev = MMC_CID_REV_V1(resp); 535 1.1 nonaka cid->psn = MMC_CID_PSN_V1(resp); 536 1.1 nonaka cid->mdt = MMC_CID_MDT_V1(resp); 537 1.1 nonaka break; 538 1.1 nonaka case MMC_CSD_MMCVER_2_0: 539 1.1 nonaka case MMC_CSD_MMCVER_3_1: 540 1.1 nonaka case MMC_CSD_MMCVER_4_0: 541 1.1 nonaka cid->mid = MMC_CID_MID_V2(resp); 542 1.1 nonaka cid->oid = MMC_CID_OID_V2(resp); 543 1.1 nonaka MMC_CID_PNM_V2_CPY(resp, cid->pnm); 544 1.1 nonaka cid->psn = MMC_CID_PSN_V2(resp); 545 1.1 nonaka break; 546 1.1 nonaka default: 547 1.1 nonaka aprint_error_dev(sc->sc_dev, "unknown MMC version %d\n", 548 1.1 nonaka sf->csd.mmcver); 549 1.1 nonaka return 1; 550 1.1 nonaka } 551 1.1 nonaka } 552 1.1 nonaka return 0; 553 1.1 nonaka } 554 1.1 nonaka 555 1.1 nonaka void 556 1.1 nonaka sdmmc_print_cid(struct sdmmc_cid *cid) 557 1.1 nonaka { 558 1.1 nonaka 559 1.1 nonaka printf("mid=0x%02x oid=0x%04x pnm=\"%s\" rev=0x%02x psn=0x%08x" 560 1.1 nonaka " mdt=%03x\n", cid->mid, cid->oid, cid->pnm, cid->rev, cid->psn, 561 1.1 nonaka cid->mdt); 562 1.1 nonaka } 563 1.1 nonaka 564 1.1 nonaka #ifdef SDMMC_DUMP_CSD 565 1.4 nonaka void 566 1.1 nonaka sdmmc_print_csd(sdmmc_response resp, struct sdmmc_csd *csd) 567 1.1 nonaka { 568 1.1 nonaka 569 1.1 nonaka printf("csdver = %d\n", csd->csdver); 570 1.1 nonaka printf("mmcver = %d\n", csd->mmcver); 571 1.15 nonaka printf("capacity = 0x%08x\n", csd->capacity); 572 1.1 nonaka printf("read_bl_len = %d\n", csd->read_bl_len); 573 1.24 kiyohara printf("write_bl_len = %d\n", csd->write_bl_len); 574 1.1 nonaka printf("r2w_factor = %d\n", csd->r2w_factor); 575 1.1 nonaka printf("tran_speed = %d\n", csd->tran_speed); 576 1.15 nonaka printf("ccc = 0x%x\n", csd->ccc); 577 1.1 nonaka } 578 1.1 nonaka #endif 579 1.1 nonaka 580 1.1 nonaka /* 581 1.1 nonaka * Initialize a SD/MMC memory card. 582 1.1 nonaka */ 583 1.1 nonaka int 584 1.1 nonaka sdmmc_mem_init(struct sdmmc_softc *sc, struct sdmmc_function *sf) 585 1.1 nonaka { 586 1.13 kiyohara int error = 0; 587 1.1 nonaka 588 1.1 nonaka SDMMC_LOCK(sc); 589 1.1 nonaka 590 1.4 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 591 1.4 nonaka error = sdmmc_select_card(sc, sf); 592 1.4 nonaka if (error) 593 1.4 nonaka goto out; 594 1.4 nonaka } 595 1.1 nonaka 596 1.31 nonaka error = sdmmc_mem_set_blocklen(sc, sf, SDMMC_SECTOR_SIZE); 597 1.31 nonaka if (error) 598 1.31 nonaka goto out; 599 1.1 nonaka 600 1.13 kiyohara if (ISSET(sc->sc_flags, SMF_SD_MODE)) 601 1.13 kiyohara error = sdmmc_mem_sd_init(sc, sf); 602 1.13 kiyohara else 603 1.13 kiyohara error = sdmmc_mem_mmc_init(sc, sf); 604 1.4 nonaka 605 1.67 jmcneill if (error != 0) 606 1.67 jmcneill SET(sf->flags, SFF_ERROR); 607 1.67 jmcneill 608 1.1 nonaka out: 609 1.1 nonaka SDMMC_UNLOCK(sc); 610 1.1 nonaka 611 1.1 nonaka return error; 612 1.1 nonaka } 613 1.1 nonaka 614 1.1 nonaka /* 615 1.1 nonaka * Get or set the card's memory OCR value (SD or MMC). 616 1.1 nonaka */ 617 1.4 nonaka int 618 1.1 nonaka sdmmc_mem_send_op_cond(struct sdmmc_softc *sc, uint32_t ocr, uint32_t *ocrp) 619 1.1 nonaka { 620 1.1 nonaka struct sdmmc_command cmd; 621 1.1 nonaka int error; 622 1.1 nonaka int retry; 623 1.1 nonaka 624 1.1 nonaka /* Don't lock */ 625 1.1 nonaka 626 1.32 jmcneill DPRINTF(("%s: sdmmc_mem_send_op_cond: ocr=%#x\n", 627 1.32 jmcneill SDMMCDEVNAME(sc), ocr)); 628 1.32 jmcneill 629 1.1 nonaka /* 630 1.1 nonaka * If we change the OCR value, retry the command until the OCR 631 1.1 nonaka * we receive in response has the "CARD BUSY" bit set, meaning 632 1.1 nonaka * that all cards are ready for identification. 633 1.1 nonaka */ 634 1.1 nonaka for (retry = 0; retry < 100; retry++) { 635 1.1 nonaka memset(&cmd, 0, sizeof(cmd)); 636 1.4 nonaka cmd.c_arg = !ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE) ? 637 1.4 nonaka ocr : (ocr & MMC_OCR_HCS); 638 1.50 mlelstv cmd.c_flags = SCF_CMD_BCR | SCF_RSP_R3 | SCF_RSP_SPI_R1 639 1.50 mlelstv | SCF_TOUT_OK; 640 1.1 nonaka 641 1.1 nonaka if (ISSET(sc->sc_flags, SMF_SD_MODE)) { 642 1.1 nonaka cmd.c_opcode = SD_APP_OP_COND; 643 1.4 nonaka error = sdmmc_app_command(sc, NULL, &cmd); 644 1.1 nonaka } else { 645 1.1 nonaka cmd.c_opcode = MMC_SEND_OP_COND; 646 1.1 nonaka error = sdmmc_mmc_command(sc, &cmd); 647 1.1 nonaka } 648 1.1 nonaka if (error) 649 1.1 nonaka break; 650 1.4 nonaka 651 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 652 1.4 nonaka if (!ISSET(MMC_SPI_R1(cmd.c_resp), R1_SPI_IDLE)) 653 1.4 nonaka break; 654 1.4 nonaka } else { 655 1.4 nonaka if (ISSET(MMC_R3(cmd.c_resp), MMC_OCR_MEM_READY) || 656 1.4 nonaka ocr == 0) 657 1.4 nonaka break; 658 1.4 nonaka } 659 1.1 nonaka 660 1.1 nonaka error = ETIMEDOUT; 661 1.69 mlelstv sdmmc_pause(10000, NULL); 662 1.1 nonaka } 663 1.64 bouyer if (ocrp != NULL) { 664 1.64 bouyer if (error == 0 && 665 1.64 bouyer !ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 666 1.64 bouyer *ocrp = MMC_R3(cmd.c_resp); 667 1.64 bouyer } else { 668 1.64 bouyer *ocrp = ocr; 669 1.64 bouyer } 670 1.64 bouyer } 671 1.4 nonaka DPRINTF(("%s: sdmmc_mem_send_op_cond: error=%d, ocr=%#x\n", 672 1.4 nonaka SDMMCDEVNAME(sc), error, MMC_R3(cmd.c_resp))); 673 1.1 nonaka return error; 674 1.1 nonaka } 675 1.1 nonaka 676 1.4 nonaka int 677 1.1 nonaka sdmmc_mem_send_if_cond(struct sdmmc_softc *sc, uint32_t ocr, uint32_t *ocrp) 678 1.1 nonaka { 679 1.1 nonaka struct sdmmc_command cmd; 680 1.1 nonaka int error; 681 1.1 nonaka 682 1.1 nonaka /* Don't lock */ 683 1.1 nonaka 684 1.1 nonaka memset(&cmd, 0, sizeof(cmd)); 685 1.1 nonaka cmd.c_arg = ocr; 686 1.71 mlelstv cmd.c_flags = SCF_CMD_BCR | SCF_RSP_R7 | SCF_RSP_SPI_R7 | SCF_TOUT_OK; 687 1.1 nonaka cmd.c_opcode = SD_SEND_IF_COND; 688 1.1 nonaka 689 1.1 nonaka error = sdmmc_mmc_command(sc, &cmd); 690 1.4 nonaka if (error == 0 && ocrp != NULL) { 691 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 692 1.4 nonaka *ocrp = MMC_SPI_R7(cmd.c_resp); 693 1.4 nonaka } else { 694 1.4 nonaka *ocrp = MMC_R7(cmd.c_resp); 695 1.4 nonaka } 696 1.4 nonaka DPRINTF(("%s: sdmmc_mem_send_if_cond: error=%d, ocr=%#x\n", 697 1.4 nonaka SDMMCDEVNAME(sc), error, *ocrp)); 698 1.4 nonaka } 699 1.1 nonaka return error; 700 1.1 nonaka } 701 1.1 nonaka 702 1.1 nonaka /* 703 1.1 nonaka * Set the read block length appropriately for this card, according to 704 1.1 nonaka * the card CSD register value. 705 1.1 nonaka */ 706 1.4 nonaka int 707 1.31 nonaka sdmmc_mem_set_blocklen(struct sdmmc_softc *sc, struct sdmmc_function *sf, 708 1.31 nonaka int block_len) 709 1.1 nonaka { 710 1.1 nonaka struct sdmmc_command cmd; 711 1.1 nonaka int error; 712 1.1 nonaka 713 1.1 nonaka /* Don't lock */ 714 1.1 nonaka 715 1.1 nonaka memset(&cmd, 0, sizeof(cmd)); 716 1.1 nonaka cmd.c_opcode = MMC_SET_BLOCKLEN; 717 1.31 nonaka cmd.c_arg = block_len; 718 1.4 nonaka cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1 | SCF_RSP_SPI_R1; 719 1.1 nonaka 720 1.1 nonaka error = sdmmc_mmc_command(sc, &cmd); 721 1.1 nonaka 722 1.1 nonaka DPRINTF(("%s: sdmmc_mem_set_blocklen: read_bl_len=%d sector_size=%d\n", 723 1.31 nonaka SDMMCDEVNAME(sc), 1 << sf->csd.read_bl_len, block_len)); 724 1.1 nonaka 725 1.1 nonaka return error; 726 1.1 nonaka } 727 1.1 nonaka 728 1.26 jakllsch /* make 512-bit BE quantity __bitfield()-compatible */ 729 1.26 jakllsch static void 730 1.26 jakllsch sdmmc_be512_to_bitfield512(sdmmc_bitfield512_t *buf) { 731 1.26 jakllsch size_t i; 732 1.26 jakllsch uint32_t tmp0, tmp1; 733 1.26 jakllsch const size_t bitswords = __arraycount(buf->_bits); 734 1.26 jakllsch for (i = 0; i < bitswords/2; i++) { 735 1.26 jakllsch tmp0 = buf->_bits[i]; 736 1.26 jakllsch tmp1 = buf->_bits[bitswords - 1 - i]; 737 1.26 jakllsch buf->_bits[i] = be32toh(tmp1); 738 1.26 jakllsch buf->_bits[bitswords - 1 - i] = be32toh(tmp0); 739 1.26 jakllsch } 740 1.26 jakllsch } 741 1.26 jakllsch 742 1.1 nonaka static int 743 1.39 jmcneill sdmmc_mem_select_transfer_mode(struct sdmmc_softc *sc, int support_func) 744 1.39 jmcneill { 745 1.39 jmcneill if (ISSET(sc->sc_flags, SMF_UHS_MODE)) { 746 1.39 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_UHS_SDR104) && 747 1.42 jmcneill ISSET(support_func, 1 << SD_ACCESS_MODE_SDR104)) { 748 1.39 jmcneill return SD_ACCESS_MODE_SDR104; 749 1.39 jmcneill } 750 1.39 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_UHS_DDR50) && 751 1.42 jmcneill ISSET(support_func, 1 << SD_ACCESS_MODE_DDR50)) { 752 1.39 jmcneill return SD_ACCESS_MODE_DDR50; 753 1.39 jmcneill } 754 1.39 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_UHS_SDR50) && 755 1.42 jmcneill ISSET(support_func, 1 << SD_ACCESS_MODE_SDR50)) { 756 1.39 jmcneill return SD_ACCESS_MODE_SDR50; 757 1.39 jmcneill } 758 1.39 jmcneill } 759 1.39 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_SD_HIGHSPEED) && 760 1.42 jmcneill ISSET(support_func, 1 << SD_ACCESS_MODE_SDR25)) { 761 1.39 jmcneill return SD_ACCESS_MODE_SDR25; 762 1.39 jmcneill } 763 1.39 jmcneill return SD_ACCESS_MODE_SDR12; 764 1.39 jmcneill } 765 1.39 jmcneill 766 1.39 jmcneill static int 767 1.45 jmcneill sdmmc_mem_execute_tuning(struct sdmmc_softc *sc, struct sdmmc_function *sf) 768 1.45 jmcneill { 769 1.45 jmcneill int timing = -1; 770 1.45 jmcneill 771 1.45 jmcneill if (ISSET(sc->sc_flags, SMF_SD_MODE)) { 772 1.45 jmcneill if (!ISSET(sc->sc_flags, SMF_UHS_MODE)) 773 1.45 jmcneill return 0; 774 1.45 jmcneill 775 1.45 jmcneill switch (sf->csd.tran_speed) { 776 1.45 jmcneill case 100000: 777 1.45 jmcneill timing = SDMMC_TIMING_UHS_SDR50; 778 1.45 jmcneill break; 779 1.45 jmcneill case 208000: 780 1.45 jmcneill timing = SDMMC_TIMING_UHS_SDR104; 781 1.70 mlelstv break; 782 1.45 jmcneill default: 783 1.45 jmcneill return 0; 784 1.45 jmcneill } 785 1.45 jmcneill } else { 786 1.45 jmcneill switch (sf->csd.tran_speed) { 787 1.45 jmcneill case 200000: 788 1.45 jmcneill timing = SDMMC_TIMING_MMC_HS200; 789 1.45 jmcneill break; 790 1.45 jmcneill default: 791 1.45 jmcneill return 0; 792 1.45 jmcneill } 793 1.45 jmcneill } 794 1.45 jmcneill 795 1.45 jmcneill DPRINTF(("%s: execute tuning for timing %d\n", SDMMCDEVNAME(sc), 796 1.45 jmcneill timing)); 797 1.45 jmcneill 798 1.45 jmcneill return sdmmc_chip_execute_tuning(sc->sc_sct, sc->sc_sch, timing); 799 1.45 jmcneill } 800 1.45 jmcneill 801 1.45 jmcneill static int 802 1.13 kiyohara sdmmc_mem_sd_init(struct sdmmc_softc *sc, struct sdmmc_function *sf) 803 1.13 kiyohara { 804 1.39 jmcneill int support_func, best_func, bus_clock, error, i; 805 1.59 jmcneill sdmmc_bitfield512_t status; 806 1.39 jmcneill bool ddr = false; 807 1.13 kiyohara 808 1.31 nonaka /* change bus clock */ 809 1.65 riastrad bus_clock = uimin(sc->sc_busclk, sf->csd.tran_speed); 810 1.39 jmcneill error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, bus_clock, false); 811 1.31 nonaka if (error) { 812 1.31 nonaka aprint_error_dev(sc->sc_dev, "can't change bus clock\n"); 813 1.31 nonaka return error; 814 1.31 nonaka } 815 1.31 nonaka 816 1.13 kiyohara error = sdmmc_mem_send_scr(sc, sf, sf->raw_scr); 817 1.13 kiyohara if (error) { 818 1.13 kiyohara aprint_error_dev(sc->sc_dev, "SD_SEND_SCR send failed.\n"); 819 1.13 kiyohara return error; 820 1.13 kiyohara } 821 1.13 kiyohara error = sdmmc_mem_decode_scr(sc, sf); 822 1.13 kiyohara if (error) 823 1.13 kiyohara return error; 824 1.13 kiyohara 825 1.13 kiyohara if (ISSET(sc->sc_caps, SMC_CAPS_4BIT_MODE) && 826 1.13 kiyohara ISSET(sf->scr.bus_width, SCR_SD_BUS_WIDTHS_4BIT)) { 827 1.15 nonaka DPRINTF(("%s: change bus width\n", SDMMCDEVNAME(sc))); 828 1.13 kiyohara error = sdmmc_set_bus_width(sf, 4); 829 1.13 kiyohara if (error) { 830 1.13 kiyohara aprint_error_dev(sc->sc_dev, 831 1.13 kiyohara "can't change bus width (%d bit)\n", 4); 832 1.13 kiyohara return error; 833 1.13 kiyohara } 834 1.13 kiyohara sf->width = 4; 835 1.15 nonaka } 836 1.13 kiyohara 837 1.39 jmcneill best_func = 0; 838 1.13 kiyohara if (sf->scr.sd_spec >= SCR_SD_SPEC_VER_1_10 && 839 1.13 kiyohara ISSET(sf->csd.ccc, SD_CSD_CCC_SWITCH)) { 840 1.15 nonaka DPRINTF(("%s: switch func mode 0\n", SDMMCDEVNAME(sc))); 841 1.26 jakllsch error = sdmmc_mem_sd_switch(sf, 0, 1, 0, &status); 842 1.13 kiyohara if (error) { 843 1.72 jdc if (error == ENOTSUP) { 844 1.72 jdc /* Not supported by controller */ 845 1.72 jdc goto skipswitchfuncs; 846 1.72 jdc } else { 847 1.72 jdc aprint_error_dev(sc->sc_dev, 848 1.72 jdc "switch func mode 0 failed\n"); 849 1.72 jdc return error; 850 1.72 jdc } 851 1.13 kiyohara } 852 1.13 kiyohara 853 1.26 jakllsch support_func = SFUNC_STATUS_GROUP(&status, 1); 854 1.39 jmcneill 855 1.44 jmcneill if (!ISSET(sc->sc_flags, SMF_UHS_MODE) && support_func & 0x1c) { 856 1.44 jmcneill /* XXX UHS-I card started in 1.8V mode, switch now */ 857 1.44 jmcneill error = sdmmc_mem_signal_voltage(sc, 858 1.44 jmcneill SDMMC_SIGNAL_VOLTAGE_180); 859 1.44 jmcneill if (error) { 860 1.44 jmcneill aprint_error_dev(sc->sc_dev, 861 1.44 jmcneill "failed to recover UHS card\n"); 862 1.44 jmcneill return error; 863 1.44 jmcneill } 864 1.44 jmcneill SET(sc->sc_flags, SMF_UHS_MODE); 865 1.44 jmcneill } 866 1.44 jmcneill 867 1.39 jmcneill for (i = 0; i < __arraycount(switch_group0_functions); i++) { 868 1.39 jmcneill if (!(support_func & (1 << i))) 869 1.13 kiyohara continue; 870 1.39 jmcneill DPRINTF(("%s: card supports mode %s\n", 871 1.39 jmcneill SDMMCDEVNAME(sc), 872 1.39 jmcneill switch_group0_functions[i].name)); 873 1.13 kiyohara } 874 1.39 jmcneill 875 1.39 jmcneill best_func = sdmmc_mem_select_transfer_mode(sc, support_func); 876 1.39 jmcneill 877 1.39 jmcneill DPRINTF(("%s: using mode %s\n", SDMMCDEVNAME(sc), 878 1.39 jmcneill switch_group0_functions[best_func].name)); 879 1.39 jmcneill 880 1.39 jmcneill if (best_func != 0) { 881 1.15 nonaka DPRINTF(("%s: switch func mode 1(func=%d)\n", 882 1.15 nonaka SDMMCDEVNAME(sc), best_func)); 883 1.13 kiyohara error = 884 1.26 jakllsch sdmmc_mem_sd_switch(sf, 1, 1, best_func, &status); 885 1.13 kiyohara if (error) { 886 1.13 kiyohara aprint_error_dev(sc->sc_dev, 887 1.13 kiyohara "switch func mode 1 failed:" 888 1.13 kiyohara " group 1 function %d(0x%2x)\n", 889 1.13 kiyohara best_func, support_func); 890 1.13 kiyohara return error; 891 1.13 kiyohara } 892 1.13 kiyohara sf->csd.tran_speed = 893 1.13 kiyohara switch_group0_functions[best_func].freq; 894 1.13 kiyohara 895 1.39 jmcneill if (best_func == SD_ACCESS_MODE_DDR50) 896 1.39 jmcneill ddr = true; 897 1.39 jmcneill 898 1.23 matt /* Wait 400KHz x 8 clock (2.5us * 8 + slop) */ 899 1.23 matt delay(25); 900 1.15 nonaka } 901 1.15 nonaka } 902 1.72 jdc skipswitchfuncs: 903 1.13 kiyohara 904 1.31 nonaka /* update bus clock */ 905 1.15 nonaka if (sc->sc_busclk > sf->csd.tran_speed) 906 1.15 nonaka sc->sc_busclk = sf->csd.tran_speed; 907 1.77 skrll if (sc->sc_busclk != bus_clock || sc->sc_busddr != ddr) { 908 1.77 skrll /* change bus clock */ 909 1.77 skrll error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, sc->sc_busclk, 910 1.77 skrll ddr); 911 1.77 skrll if (error) { 912 1.77 skrll aprint_error_dev(sc->sc_dev, "can't change bus clock\n"); 913 1.77 skrll return error; 914 1.77 skrll } 915 1.31 nonaka 916 1.77 skrll sc->sc_transfer_mode = switch_group0_functions[best_func].name; 917 1.77 skrll sc->sc_busddr = ddr; 918 1.13 kiyohara } 919 1.13 kiyohara 920 1.59 jmcneill /* get card status */ 921 1.59 jmcneill error = sdmmc_mem_send_ssr(sc, sf, &status); 922 1.59 jmcneill if (error) { 923 1.59 jmcneill aprint_error_dev(sc->sc_dev, "can't get SD status: %d\n", 924 1.59 jmcneill error); 925 1.59 jmcneill return error; 926 1.59 jmcneill } 927 1.59 jmcneill sdmmc_mem_decode_ssr(sc, sf, &status); 928 1.59 jmcneill 929 1.45 jmcneill /* execute tuning (UHS) */ 930 1.45 jmcneill error = sdmmc_mem_execute_tuning(sc, sf); 931 1.45 jmcneill if (error) { 932 1.45 jmcneill aprint_error_dev(sc->sc_dev, "can't execute SD tuning\n"); 933 1.45 jmcneill return error; 934 1.45 jmcneill } 935 1.45 jmcneill 936 1.76 jmcneill /* detect extended functions */ 937 1.76 jmcneill if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE) && sf->scr.support_cmd48) { 938 1.76 jmcneill uint8_t ginfo[512]; 939 1.76 jmcneill error = sdmmc_mem_read_extr_single(sc, sf, SD_EXTR_MIO_MEM, 0, 0, 940 1.76 jmcneill sizeof(ginfo), ginfo); 941 1.76 jmcneill if (error == 0) { 942 1.76 jmcneill sdmmc_mem_decode_general_info(sc, sf, ginfo); 943 1.76 jmcneill } 944 1.76 jmcneill } 945 1.76 jmcneill 946 1.76 jmcneill /* enable card cache if supported */ 947 1.76 jmcneill if (sf->ssr.cache && sf->ext_sd.pef.valid) { 948 1.76 jmcneill error = sdmmc_mem_pef_enable_cache(sc, sf); 949 1.76 jmcneill if (error != 0) { 950 1.76 jmcneill aprint_error_dev(sc->sc_dev, 951 1.76 jmcneill "can't enable cache: %d", error); 952 1.76 jmcneill } else { 953 1.76 jmcneill SET(sf->flags, SFF_CACHE_ENABLED); 954 1.76 jmcneill } 955 1.76 jmcneill } 956 1.76 jmcneill 957 1.13 kiyohara return 0; 958 1.13 kiyohara } 959 1.13 kiyohara 960 1.13 kiyohara static int 961 1.13 kiyohara sdmmc_mem_mmc_init(struct sdmmc_softc *sc, struct sdmmc_function *sf) 962 1.13 kiyohara { 963 1.31 nonaka int width, value, hs_timing, bus_clock, error; 964 1.52 nonaka uint8_t ext_csd[512]; 965 1.32 jmcneill uint32_t sectors = 0; 966 1.54 nonaka bool ddr = false; 967 1.39 jmcneill 968 1.39 jmcneill sc->sc_transfer_mode = NULL; 969 1.13 kiyohara 970 1.31 nonaka /* change bus clock */ 971 1.65 riastrad bus_clock = uimin(sc->sc_busclk, sf->csd.tran_speed); 972 1.39 jmcneill error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, bus_clock, false); 973 1.31 nonaka if (error) { 974 1.31 nonaka aprint_error_dev(sc->sc_dev, "can't change bus clock\n"); 975 1.31 nonaka return error; 976 1.31 nonaka } 977 1.31 nonaka 978 1.13 kiyohara if (sf->csd.mmcver >= MMC_CSD_MMCVER_4_0) { 979 1.13 kiyohara error = sdmmc_mem_send_cxd_data(sc, 980 1.13 kiyohara MMC_SEND_EXT_CSD, ext_csd, sizeof(ext_csd)); 981 1.13 kiyohara if (error) { 982 1.31 nonaka aprint_error_dev(sc->sc_dev, 983 1.31 nonaka "can't read EXT_CSD (error=%d)\n", error); 984 1.13 kiyohara return error; 985 1.13 kiyohara } 986 1.17 nonaka if ((sf->csd.csdver == MMC_CSD_CSDVER_EXT_CSD) && 987 1.16 nonaka (ext_csd[EXT_CSD_STRUCTURE] > EXT_CSD_STRUCTURE_VER_1_2)) { 988 1.13 kiyohara aprint_error_dev(sc->sc_dev, 989 1.16 nonaka "unrecognised future version (%d)\n", 990 1.16 nonaka ext_csd[EXT_CSD_STRUCTURE]); 991 1.33 christos return ENOTSUP; 992 1.13 kiyohara } 993 1.55 nonaka sf->ext_csd.rev = ext_csd[EXT_CSD_REV]; 994 1.13 kiyohara 995 1.39 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_MMC_HS200) && 996 1.36 jmcneill ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_F_HS200_1_8V) { 997 1.53 nonaka hs_timing = EXT_CSD_HS_TIMING_HS200; 998 1.54 nonaka } else if (ISSET(sc->sc_caps, SMC_CAPS_MMC_DDR52) && 999 1.54 nonaka ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_F_DDR52_1_8V) { 1000 1.54 nonaka hs_timing = EXT_CSD_HS_TIMING_HIGHSPEED; 1001 1.54 nonaka ddr = true; 1002 1.36 jmcneill } else if (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_F_52M) { 1003 1.53 nonaka hs_timing = EXT_CSD_HS_TIMING_HIGHSPEED; 1004 1.32 jmcneill } else if (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_F_26M) { 1005 1.53 nonaka hs_timing = EXT_CSD_HS_TIMING_LEGACY; 1006 1.32 jmcneill } else { 1007 1.16 nonaka aprint_error_dev(sc->sc_dev, 1008 1.28 matt "unknown CARD_TYPE: 0x%x\n", 1009 1.16 nonaka ext_csd[EXT_CSD_CARD_TYPE]); 1010 1.33 christos return ENOTSUP; 1011 1.16 nonaka } 1012 1.16 nonaka 1013 1.39 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_8BIT_MODE)) { 1014 1.39 jmcneill width = 8; 1015 1.39 jmcneill value = EXT_CSD_BUS_WIDTH_8; 1016 1.39 jmcneill } else if (ISSET(sc->sc_caps, SMC_CAPS_4BIT_MODE)) { 1017 1.39 jmcneill width = 4; 1018 1.39 jmcneill value = EXT_CSD_BUS_WIDTH_4; 1019 1.39 jmcneill } else { 1020 1.39 jmcneill width = 1; 1021 1.39 jmcneill value = EXT_CSD_BUS_WIDTH_1; 1022 1.39 jmcneill } 1023 1.39 jmcneill 1024 1.39 jmcneill if (width != 1) { 1025 1.39 jmcneill error = sdmmc_mem_mmc_switch(sf, EXT_CSD_CMD_SET_NORMAL, 1026 1.61 jmcneill EXT_CSD_BUS_WIDTH, value, false); 1027 1.39 jmcneill if (error == 0) 1028 1.39 jmcneill error = sdmmc_chip_bus_width(sc->sc_sct, 1029 1.39 jmcneill sc->sc_sch, width); 1030 1.39 jmcneill else { 1031 1.39 jmcneill DPRINTF(("%s: can't change bus width" 1032 1.39 jmcneill " (%d bit)\n", SDMMCDEVNAME(sc), width)); 1033 1.39 jmcneill return error; 1034 1.39 jmcneill } 1035 1.39 jmcneill 1036 1.39 jmcneill /* XXXX: need bus test? (using by CMD14 & CMD19) */ 1037 1.46 jmcneill delay(10000); 1038 1.39 jmcneill } 1039 1.39 jmcneill sf->width = width; 1040 1.39 jmcneill 1041 1.53 nonaka if (hs_timing == EXT_CSD_HS_TIMING_HIGHSPEED && 1042 1.39 jmcneill !ISSET(sc->sc_caps, SMC_CAPS_MMC_HIGHSPEED)) { 1043 1.53 nonaka hs_timing = EXT_CSD_HS_TIMING_LEGACY; 1044 1.16 nonaka } 1045 1.68 jmcneill 1046 1.68 jmcneill const int target_timing = hs_timing; 1047 1.53 nonaka if (hs_timing != EXT_CSD_HS_TIMING_LEGACY) { 1048 1.68 jmcneill while (hs_timing >= EXT_CSD_HS_TIMING_LEGACY) { 1049 1.68 jmcneill error = sdmmc_mem_mmc_switch(sf, EXT_CSD_CMD_SET_NORMAL, 1050 1.68 jmcneill EXT_CSD_HS_TIMING, hs_timing, false); 1051 1.68 jmcneill if (error == 0 || hs_timing == EXT_CSD_HS_TIMING_LEGACY) 1052 1.68 jmcneill break; 1053 1.68 jmcneill hs_timing--; 1054 1.13 kiyohara } 1055 1.16 nonaka } 1056 1.68 jmcneill if (hs_timing != target_timing) { 1057 1.68 jmcneill aprint_debug_dev(sc->sc_dev, 1058 1.68 jmcneill "card failed to switch to timing mode %d, using %d\n", 1059 1.68 jmcneill target_timing, hs_timing); 1060 1.68 jmcneill } 1061 1.68 jmcneill 1062 1.68 jmcneill KASSERT(hs_timing < __arraycount(sdmmc_mmc_timings)); 1063 1.68 jmcneill sf->csd.tran_speed = sdmmc_mmc_timings[hs_timing]; 1064 1.13 kiyohara 1065 1.13 kiyohara if (sc->sc_busclk > sf->csd.tran_speed) 1066 1.13 kiyohara sc->sc_busclk = sf->csd.tran_speed; 1067 1.31 nonaka if (sc->sc_busclk != bus_clock) { 1068 1.31 nonaka error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, 1069 1.39 jmcneill sc->sc_busclk, false); 1070 1.31 nonaka if (error) { 1071 1.31 nonaka aprint_error_dev(sc->sc_dev, 1072 1.31 nonaka "can't change bus clock\n"); 1073 1.31 nonaka return error; 1074 1.31 nonaka } 1075 1.13 kiyohara } 1076 1.16 nonaka 1077 1.53 nonaka if (hs_timing != EXT_CSD_HS_TIMING_LEGACY) { 1078 1.13 kiyohara error = sdmmc_mem_send_cxd_data(sc, 1079 1.13 kiyohara MMC_SEND_EXT_CSD, ext_csd, sizeof(ext_csd)); 1080 1.13 kiyohara if (error) { 1081 1.13 kiyohara aprint_error_dev(sc->sc_dev, 1082 1.13 kiyohara "can't re-read EXT_CSD\n"); 1083 1.13 kiyohara return error; 1084 1.13 kiyohara } 1085 1.13 kiyohara if (ext_csd[EXT_CSD_HS_TIMING] != hs_timing) { 1086 1.13 kiyohara aprint_error_dev(sc->sc_dev, 1087 1.13 kiyohara "HS_TIMING set failed\n"); 1088 1.13 kiyohara return EINVAL; 1089 1.13 kiyohara } 1090 1.13 kiyohara } 1091 1.13 kiyohara 1092 1.54 nonaka /* 1093 1.69 mlelstv * HS_TIMING must be set to 0x1 before setting BUS_WIDTH 1094 1.54 nonaka * for dual data rate operation 1095 1.54 nonaka */ 1096 1.54 nonaka if (ddr && 1097 1.54 nonaka hs_timing == EXT_CSD_HS_TIMING_HIGHSPEED && 1098 1.54 nonaka width > 1) { 1099 1.54 nonaka error = sdmmc_mem_mmc_switch(sf, 1100 1.54 nonaka EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, 1101 1.54 nonaka (width == 8) ? EXT_CSD_BUS_WIDTH_8_DDR : 1102 1.61 jmcneill EXT_CSD_BUS_WIDTH_4_DDR, false); 1103 1.54 nonaka if (error) { 1104 1.54 nonaka DPRINTF(("%s: can't switch to DDR" 1105 1.54 nonaka " (%d bit)\n", SDMMCDEVNAME(sc), width)); 1106 1.54 nonaka return error; 1107 1.54 nonaka } 1108 1.54 nonaka 1109 1.54 nonaka delay(10000); 1110 1.54 nonaka 1111 1.54 nonaka error = sdmmc_mem_signal_voltage(sc, 1112 1.54 nonaka SDMMC_SIGNAL_VOLTAGE_180); 1113 1.54 nonaka if (error) { 1114 1.54 nonaka aprint_error_dev(sc->sc_dev, 1115 1.54 nonaka "can't switch signaling voltage\n"); 1116 1.54 nonaka return error; 1117 1.54 nonaka } 1118 1.54 nonaka 1119 1.54 nonaka error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, 1120 1.54 nonaka sc->sc_busclk, ddr); 1121 1.54 nonaka if (error) { 1122 1.54 nonaka aprint_error_dev(sc->sc_dev, 1123 1.54 nonaka "can't change bus clock\n"); 1124 1.54 nonaka return error; 1125 1.54 nonaka } 1126 1.54 nonaka 1127 1.54 nonaka delay(10000); 1128 1.54 nonaka 1129 1.54 nonaka sc->sc_transfer_mode = "DDR52"; 1130 1.54 nonaka sc->sc_busddr = ddr; 1131 1.54 nonaka } 1132 1.54 nonaka 1133 1.32 jmcneill sectors = ext_csd[EXT_CSD_SEC_COUNT + 0] << 0 | 1134 1.32 jmcneill ext_csd[EXT_CSD_SEC_COUNT + 1] << 8 | 1135 1.32 jmcneill ext_csd[EXT_CSD_SEC_COUNT + 2] << 16 | 1136 1.32 jmcneill ext_csd[EXT_CSD_SEC_COUNT + 3] << 24; 1137 1.32 jmcneill if (sectors > (2u * 1024 * 1024 * 1024) / 512) { 1138 1.32 jmcneill SET(sf->flags, SFF_SDHC); 1139 1.32 jmcneill sf->csd.capacity = sectors; 1140 1.32 jmcneill } 1141 1.32 jmcneill 1142 1.53 nonaka if (hs_timing == EXT_CSD_HS_TIMING_HS200) { 1143 1.39 jmcneill sc->sc_transfer_mode = "HS200"; 1144 1.45 jmcneill 1145 1.45 jmcneill /* execute tuning (HS200) */ 1146 1.45 jmcneill error = sdmmc_mem_execute_tuning(sc, sf); 1147 1.45 jmcneill if (error) { 1148 1.45 jmcneill aprint_error_dev(sc->sc_dev, 1149 1.45 jmcneill "can't execute MMC tuning\n"); 1150 1.45 jmcneill return error; 1151 1.45 jmcneill } 1152 1.13 kiyohara } 1153 1.55 nonaka 1154 1.55 nonaka if (sf->ext_csd.rev >= 5) { 1155 1.55 nonaka sf->ext_csd.rst_n_function = 1156 1.55 nonaka ext_csd[EXT_CSD_RST_N_FUNCTION]; 1157 1.55 nonaka } 1158 1.61 jmcneill 1159 1.61 jmcneill if (sf->ext_csd.rev >= 6) { 1160 1.61 jmcneill sf->ext_csd.cache_size = 1161 1.61 jmcneill le32dec(&ext_csd[EXT_CSD_CACHE_SIZE]) * 1024; 1162 1.61 jmcneill } 1163 1.61 jmcneill if (sf->ext_csd.cache_size > 0) { 1164 1.61 jmcneill /* eMMC cache present, enable it */ 1165 1.61 jmcneill error = sdmmc_mem_mmc_switch(sf, 1166 1.61 jmcneill EXT_CSD_CMD_SET_NORMAL, EXT_CSD_CACHE_CTRL, 1167 1.61 jmcneill EXT_CSD_CACHE_CTRL_CACHE_EN, false); 1168 1.61 jmcneill if (error) { 1169 1.61 jmcneill aprint_error_dev(sc->sc_dev, 1170 1.61 jmcneill "can't enable cache: %d\n", error); 1171 1.61 jmcneill } else { 1172 1.61 jmcneill SET(sf->flags, SFF_CACHE_ENABLED); 1173 1.61 jmcneill } 1174 1.61 jmcneill } 1175 1.13 kiyohara } else { 1176 1.13 kiyohara if (sc->sc_busclk > sf->csd.tran_speed) 1177 1.13 kiyohara sc->sc_busclk = sf->csd.tran_speed; 1178 1.31 nonaka if (sc->sc_busclk != bus_clock) { 1179 1.31 nonaka error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, 1180 1.39 jmcneill sc->sc_busclk, false); 1181 1.31 nonaka if (error) { 1182 1.31 nonaka aprint_error_dev(sc->sc_dev, 1183 1.31 nonaka "can't change bus clock\n"); 1184 1.31 nonaka return error; 1185 1.31 nonaka } 1186 1.13 kiyohara } 1187 1.13 kiyohara } 1188 1.13 kiyohara 1189 1.13 kiyohara return 0; 1190 1.13 kiyohara } 1191 1.13 kiyohara 1192 1.13 kiyohara static int 1193 1.4 nonaka sdmmc_mem_send_cid(struct sdmmc_softc *sc, sdmmc_response *resp) 1194 1.4 nonaka { 1195 1.4 nonaka struct sdmmc_command cmd; 1196 1.4 nonaka int error; 1197 1.4 nonaka 1198 1.4 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 1199 1.4 nonaka memset(&cmd, 0, sizeof cmd); 1200 1.4 nonaka cmd.c_opcode = MMC_ALL_SEND_CID; 1201 1.47 mlelstv cmd.c_flags = SCF_CMD_BCR | SCF_RSP_R2 | SCF_TOUT_OK; 1202 1.4 nonaka 1203 1.4 nonaka error = sdmmc_mmc_command(sc, &cmd); 1204 1.4 nonaka } else { 1205 1.4 nonaka error = sdmmc_mem_send_cxd_data(sc, MMC_SEND_CID, &cmd.c_resp, 1206 1.4 nonaka sizeof(cmd.c_resp)); 1207 1.4 nonaka } 1208 1.4 nonaka 1209 1.4 nonaka #ifdef SDMMC_DEBUG 1210 1.31 nonaka if (error == 0) 1211 1.31 nonaka sdmmc_dump_data("CID", cmd.c_resp, sizeof(cmd.c_resp)); 1212 1.4 nonaka #endif 1213 1.4 nonaka if (error == 0 && resp != NULL) 1214 1.4 nonaka memcpy(resp, &cmd.c_resp, sizeof(*resp)); 1215 1.4 nonaka return error; 1216 1.4 nonaka } 1217 1.4 nonaka 1218 1.4 nonaka static int 1219 1.4 nonaka sdmmc_mem_send_csd(struct sdmmc_softc *sc, struct sdmmc_function *sf, 1220 1.4 nonaka sdmmc_response *resp) 1221 1.4 nonaka { 1222 1.4 nonaka struct sdmmc_command cmd; 1223 1.4 nonaka int error; 1224 1.4 nonaka 1225 1.4 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 1226 1.4 nonaka memset(&cmd, 0, sizeof cmd); 1227 1.4 nonaka cmd.c_opcode = MMC_SEND_CSD; 1228 1.4 nonaka cmd.c_arg = MMC_ARG_RCA(sf->rca); 1229 1.4 nonaka cmd.c_flags = SCF_CMD_AC | SCF_RSP_R2; 1230 1.4 nonaka 1231 1.4 nonaka error = sdmmc_mmc_command(sc, &cmd); 1232 1.4 nonaka } else { 1233 1.4 nonaka error = sdmmc_mem_send_cxd_data(sc, MMC_SEND_CSD, &cmd.c_resp, 1234 1.4 nonaka sizeof(cmd.c_resp)); 1235 1.4 nonaka } 1236 1.4 nonaka 1237 1.4 nonaka #ifdef SDMMC_DEBUG 1238 1.31 nonaka if (error == 0) 1239 1.31 nonaka sdmmc_dump_data("CSD", cmd.c_resp, sizeof(cmd.c_resp)); 1240 1.4 nonaka #endif 1241 1.4 nonaka if (error == 0 && resp != NULL) 1242 1.4 nonaka memcpy(resp, &cmd.c_resp, sizeof(*resp)); 1243 1.4 nonaka return error; 1244 1.4 nonaka } 1245 1.4 nonaka 1246 1.4 nonaka static int 1247 1.4 nonaka sdmmc_mem_send_scr(struct sdmmc_softc *sc, struct sdmmc_function *sf, 1248 1.31 nonaka uint32_t *scr) 1249 1.4 nonaka { 1250 1.4 nonaka struct sdmmc_command cmd; 1251 1.4 nonaka bus_dma_segment_t ds[1]; 1252 1.4 nonaka void *ptr = NULL; 1253 1.4 nonaka int datalen = 8; 1254 1.4 nonaka int rseg; 1255 1.4 nonaka int error = 0; 1256 1.4 nonaka 1257 1.4 nonaka /* Don't lock */ 1258 1.4 nonaka 1259 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1260 1.4 nonaka error = bus_dmamem_alloc(sc->sc_dmat, datalen, PAGE_SIZE, 0, 1261 1.4 nonaka ds, 1, &rseg, BUS_DMA_NOWAIT); 1262 1.4 nonaka if (error) 1263 1.4 nonaka goto out; 1264 1.4 nonaka error = bus_dmamem_map(sc->sc_dmat, ds, 1, datalen, &ptr, 1265 1.4 nonaka BUS_DMA_NOWAIT); 1266 1.4 nonaka if (error) 1267 1.4 nonaka goto dmamem_free; 1268 1.4 nonaka error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, ptr, datalen, 1269 1.4 nonaka NULL, BUS_DMA_NOWAIT|BUS_DMA_STREAMING|BUS_DMA_READ); 1270 1.4 nonaka if (error) 1271 1.4 nonaka goto dmamem_unmap; 1272 1.4 nonaka 1273 1.4 nonaka bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1274 1.4 nonaka BUS_DMASYNC_PREREAD); 1275 1.4 nonaka } else { 1276 1.4 nonaka ptr = malloc(datalen, M_DEVBUF, M_NOWAIT | M_ZERO); 1277 1.4 nonaka if (ptr == NULL) 1278 1.4 nonaka goto out; 1279 1.4 nonaka } 1280 1.4 nonaka 1281 1.4 nonaka memset(&cmd, 0, sizeof(cmd)); 1282 1.4 nonaka cmd.c_data = ptr; 1283 1.4 nonaka cmd.c_datalen = datalen; 1284 1.4 nonaka cmd.c_blklen = datalen; 1285 1.4 nonaka cmd.c_arg = 0; 1286 1.4 nonaka cmd.c_flags = SCF_CMD_ADTC | SCF_CMD_READ | SCF_RSP_R1 | SCF_RSP_SPI_R1; 1287 1.4 nonaka cmd.c_opcode = SD_APP_SEND_SCR; 1288 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 1289 1.4 nonaka cmd.c_dmamap = sc->sc_dmap; 1290 1.4 nonaka 1291 1.4 nonaka error = sdmmc_app_command(sc, sf, &cmd); 1292 1.4 nonaka if (error == 0) { 1293 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1294 1.4 nonaka bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1295 1.4 nonaka BUS_DMASYNC_POSTREAD); 1296 1.4 nonaka } 1297 1.6 kiyohara memcpy(scr, ptr, datalen); 1298 1.4 nonaka } 1299 1.4 nonaka 1300 1.4 nonaka out: 1301 1.4 nonaka if (ptr != NULL) { 1302 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1303 1.4 nonaka bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 1304 1.4 nonaka dmamem_unmap: 1305 1.4 nonaka bus_dmamem_unmap(sc->sc_dmat, ptr, datalen); 1306 1.4 nonaka dmamem_free: 1307 1.4 nonaka bus_dmamem_free(sc->sc_dmat, ds, rseg); 1308 1.4 nonaka } else { 1309 1.4 nonaka free(ptr, M_DEVBUF); 1310 1.4 nonaka } 1311 1.4 nonaka } 1312 1.4 nonaka DPRINTF(("%s: sdmem_mem_send_scr: error = %d\n", SDMMCDEVNAME(sc), 1313 1.4 nonaka error)); 1314 1.9 kiyohara 1315 1.4 nonaka #ifdef SDMMC_DEBUG 1316 1.9 kiyohara if (error == 0) 1317 1.31 nonaka sdmmc_dump_data("SCR", scr, datalen); 1318 1.4 nonaka #endif 1319 1.4 nonaka return error; 1320 1.4 nonaka } 1321 1.4 nonaka 1322 1.4 nonaka static int 1323 1.4 nonaka sdmmc_mem_decode_scr(struct sdmmc_softc *sc, struct sdmmc_function *sf) 1324 1.4 nonaka { 1325 1.4 nonaka sdmmc_response resp; 1326 1.4 nonaka int ver; 1327 1.4 nonaka 1328 1.4 nonaka memset(resp, 0, sizeof(resp)); 1329 1.8 kiyohara /* 1330 1.8 kiyohara * Change the raw-scr received from the DMA stream to resp. 1331 1.8 kiyohara */ 1332 1.19 matt resp[0] = be32toh(sf->raw_scr[1]) >> 8; // LSW 1333 1.19 matt resp[1] = be32toh(sf->raw_scr[0]); // MSW 1334 1.19 matt resp[0] |= (resp[1] & 0xff) << 24; 1335 1.19 matt resp[1] >>= 8; 1336 1.4 nonaka 1337 1.4 nonaka ver = SCR_STRUCTURE(resp); 1338 1.4 nonaka sf->scr.sd_spec = SCR_SD_SPEC(resp); 1339 1.76 jmcneill if (sf->scr.sd_spec == 2) { 1340 1.76 jmcneill sf->scr.sd_spec3 = SCR_SD_SPEC3(resp); 1341 1.76 jmcneill if (sf->scr.sd_spec3) { 1342 1.76 jmcneill sf->scr.sd_spec4 = SCR_SD_SPEC4(resp); 1343 1.76 jmcneill } 1344 1.76 jmcneill } 1345 1.4 nonaka sf->scr.bus_width = SCR_SD_BUS_WIDTHS(resp); 1346 1.76 jmcneill if (sf->scr.sd_spec4) { 1347 1.76 jmcneill sf->scr.support_cmd48 = SCR_CMD_SUPPORT_CMD48(resp); 1348 1.76 jmcneill } 1349 1.4 nonaka 1350 1.76 jmcneill DPRINTF(("%s: sdmmc_mem_decode_scr: %08x%08x ver=%d, spec=%d,%d,%d, bus width=%d\n", 1351 1.19 matt SDMMCDEVNAME(sc), resp[1], resp[0], 1352 1.76 jmcneill ver, sf->scr.sd_spec, sf->scr.sd_spec3, sf->scr.sd_spec4, sf->scr.bus_width)); 1353 1.4 nonaka 1354 1.39 jmcneill if (ver != 0 && ver != 1) { 1355 1.4 nonaka DPRINTF(("%s: unknown structure version: %d\n", 1356 1.4 nonaka SDMMCDEVNAME(sc), ver)); 1357 1.4 nonaka return EINVAL; 1358 1.4 nonaka } 1359 1.4 nonaka return 0; 1360 1.4 nonaka } 1361 1.4 nonaka 1362 1.4 nonaka static int 1363 1.59 jmcneill sdmmc_mem_send_ssr(struct sdmmc_softc *sc, struct sdmmc_function *sf, 1364 1.59 jmcneill sdmmc_bitfield512_t *ssr) 1365 1.59 jmcneill { 1366 1.59 jmcneill struct sdmmc_command cmd; 1367 1.59 jmcneill bus_dma_segment_t ds[1]; 1368 1.59 jmcneill void *ptr = NULL; 1369 1.59 jmcneill int datalen = 64; 1370 1.59 jmcneill int rseg; 1371 1.59 jmcneill int error = 0; 1372 1.59 jmcneill 1373 1.59 jmcneill /* Don't lock */ 1374 1.59 jmcneill 1375 1.59 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1376 1.59 jmcneill error = bus_dmamem_alloc(sc->sc_dmat, datalen, PAGE_SIZE, 0, 1377 1.59 jmcneill ds, 1, &rseg, BUS_DMA_NOWAIT); 1378 1.59 jmcneill if (error) 1379 1.59 jmcneill goto out; 1380 1.59 jmcneill error = bus_dmamem_map(sc->sc_dmat, ds, 1, datalen, &ptr, 1381 1.59 jmcneill BUS_DMA_NOWAIT); 1382 1.59 jmcneill if (error) 1383 1.59 jmcneill goto dmamem_free; 1384 1.59 jmcneill error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, ptr, datalen, 1385 1.59 jmcneill NULL, BUS_DMA_NOWAIT|BUS_DMA_STREAMING|BUS_DMA_READ); 1386 1.59 jmcneill if (error) 1387 1.59 jmcneill goto dmamem_unmap; 1388 1.59 jmcneill 1389 1.59 jmcneill bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1390 1.59 jmcneill BUS_DMASYNC_PREREAD); 1391 1.59 jmcneill } else { 1392 1.59 jmcneill ptr = malloc(datalen, M_DEVBUF, M_NOWAIT | M_ZERO); 1393 1.59 jmcneill if (ptr == NULL) 1394 1.59 jmcneill goto out; 1395 1.59 jmcneill } 1396 1.59 jmcneill 1397 1.59 jmcneill memset(&cmd, 0, sizeof(cmd)); 1398 1.59 jmcneill cmd.c_data = ptr; 1399 1.59 jmcneill cmd.c_datalen = datalen; 1400 1.59 jmcneill cmd.c_blklen = datalen; 1401 1.59 jmcneill cmd.c_arg = 0; 1402 1.59 jmcneill cmd.c_flags = SCF_CMD_ADTC | SCF_CMD_READ | SCF_RSP_R1 | SCF_RSP_SPI_R1; 1403 1.59 jmcneill cmd.c_opcode = SD_APP_SD_STATUS; 1404 1.59 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 1405 1.59 jmcneill cmd.c_dmamap = sc->sc_dmap; 1406 1.59 jmcneill 1407 1.59 jmcneill error = sdmmc_app_command(sc, sf, &cmd); 1408 1.59 jmcneill if (error == 0) { 1409 1.59 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1410 1.59 jmcneill bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1411 1.59 jmcneill BUS_DMASYNC_POSTREAD); 1412 1.59 jmcneill } 1413 1.59 jmcneill memcpy(ssr, ptr, datalen); 1414 1.59 jmcneill } 1415 1.59 jmcneill 1416 1.59 jmcneill out: 1417 1.59 jmcneill if (ptr != NULL) { 1418 1.59 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1419 1.59 jmcneill bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 1420 1.59 jmcneill dmamem_unmap: 1421 1.59 jmcneill bus_dmamem_unmap(sc->sc_dmat, ptr, datalen); 1422 1.59 jmcneill dmamem_free: 1423 1.59 jmcneill bus_dmamem_free(sc->sc_dmat, ds, rseg); 1424 1.59 jmcneill } else { 1425 1.59 jmcneill free(ptr, M_DEVBUF); 1426 1.59 jmcneill } 1427 1.59 jmcneill } 1428 1.59 jmcneill DPRINTF(("%s: sdmem_mem_send_ssr: error = %d\n", SDMMCDEVNAME(sc), 1429 1.59 jmcneill error)); 1430 1.59 jmcneill 1431 1.59 jmcneill if (error == 0) 1432 1.59 jmcneill sdmmc_be512_to_bitfield512(ssr); 1433 1.59 jmcneill 1434 1.59 jmcneill #ifdef SDMMC_DEBUG 1435 1.59 jmcneill if (error == 0) 1436 1.59 jmcneill sdmmc_dump_data("SSR", ssr, datalen); 1437 1.59 jmcneill #endif 1438 1.59 jmcneill return error; 1439 1.59 jmcneill } 1440 1.59 jmcneill 1441 1.59 jmcneill static int 1442 1.59 jmcneill sdmmc_mem_decode_ssr(struct sdmmc_softc *sc, struct sdmmc_function *sf, 1443 1.59 jmcneill sdmmc_bitfield512_t *ssr_bitfield) 1444 1.59 jmcneill { 1445 1.59 jmcneill uint32_t *ssr = (uint32_t *)ssr_bitfield; 1446 1.59 jmcneill int speed_class_val, bus_width_val; 1447 1.59 jmcneill 1448 1.59 jmcneill const int bus_width = SSR_DAT_BUS_WIDTH(ssr); 1449 1.59 jmcneill const int speed_class = SSR_SPEED_CLASS(ssr); 1450 1.59 jmcneill const int uhs_speed_grade = SSR_UHS_SPEED_GRADE(ssr); 1451 1.59 jmcneill const int video_speed_class = SSR_VIDEO_SPEED_CLASS(ssr); 1452 1.59 jmcneill const int app_perf_class = SSR_APP_PERF_CLASS(ssr); 1453 1.76 jmcneill const uint64_t perf_enhance = SSR_PERFORMANCE_ENHANCE(ssr); 1454 1.59 jmcneill 1455 1.59 jmcneill switch (speed_class) { 1456 1.59 jmcneill case SSR_SPEED_CLASS_0: speed_class_val = 0; break; 1457 1.59 jmcneill case SSR_SPEED_CLASS_2: speed_class_val = 2; break; 1458 1.59 jmcneill case SSR_SPEED_CLASS_4: speed_class_val = 4; break; 1459 1.59 jmcneill case SSR_SPEED_CLASS_6: speed_class_val = 6; break; 1460 1.59 jmcneill case SSR_SPEED_CLASS_10: speed_class_val = 10; break; 1461 1.59 jmcneill default: speed_class_val = -1; break; 1462 1.59 jmcneill } 1463 1.59 jmcneill 1464 1.59 jmcneill switch (bus_width) { 1465 1.59 jmcneill case SSR_DAT_BUS_WIDTH_1: bus_width_val = 1; break; 1466 1.59 jmcneill case SSR_DAT_BUS_WIDTH_4: bus_width_val = 4; break; 1467 1.59 jmcneill default: bus_width_val = -1; 1468 1.59 jmcneill } 1469 1.59 jmcneill 1470 1.76 jmcneill if (ISSET(perf_enhance, SSR_PERFORMANCE_ENHANCE_CACHE)) { 1471 1.76 jmcneill sf->ssr.cache = true; 1472 1.76 jmcneill } 1473 1.76 jmcneill 1474 1.59 jmcneill /* 1475 1.59 jmcneill * Log card status 1476 1.59 jmcneill */ 1477 1.59 jmcneill device_printf(sc->sc_dev, "SD card status:"); 1478 1.59 jmcneill if (bus_width_val != -1) 1479 1.59 jmcneill printf(" %d-bit", bus_width_val); 1480 1.59 jmcneill else 1481 1.59 jmcneill printf(" unknown bus width"); 1482 1.59 jmcneill if (speed_class_val != -1) 1483 1.59 jmcneill printf(", C%d", speed_class_val); 1484 1.59 jmcneill if (uhs_speed_grade) 1485 1.59 jmcneill printf(", U%d", uhs_speed_grade); 1486 1.59 jmcneill if (video_speed_class) 1487 1.59 jmcneill printf(", V%d", video_speed_class); 1488 1.59 jmcneill if (app_perf_class) 1489 1.59 jmcneill printf(", A%d", app_perf_class); 1490 1.76 jmcneill if (ISSET(perf_enhance, SSR_PERFORMANCE_ENHANCE_CACHE)) 1491 1.76 jmcneill printf(", Cache"); 1492 1.76 jmcneill if (ISSET(perf_enhance, SSR_PERFORMANCE_ENHANCE_HOST_MAINT| 1493 1.76 jmcneill SSR_PERFORMANCE_ENHANCE_CARD_MAINT)) { 1494 1.76 jmcneill printf(", %s self-maintenance", 1495 1.76 jmcneill perf_enhance == SSR_PERFORMANCE_ENHANCE_HOST_MAINT ? "Host" : 1496 1.76 jmcneill perf_enhance == SSR_PERFORMANCE_ENHANCE_CARD_MAINT ? "Card" : 1497 1.76 jmcneill "Host/Card"); 1498 1.76 jmcneill } 1499 1.59 jmcneill printf("\n"); 1500 1.59 jmcneill 1501 1.59 jmcneill return 0; 1502 1.59 jmcneill } 1503 1.59 jmcneill 1504 1.59 jmcneill static int 1505 1.76 jmcneill sdmmc_mem_decode_general_info(struct sdmmc_softc *sc, struct sdmmc_function *sf, 1506 1.76 jmcneill const uint8_t *ginfo) 1507 1.76 jmcneill { 1508 1.76 jmcneill uint16_t len = SD_GENERAL_INFO_HDR_LENGTH(ginfo); 1509 1.76 jmcneill unsigned num_ext = SD_GENERAL_INFO_HDR_NUM_EXT(ginfo); 1510 1.76 jmcneill unsigned index = SD_GENERAL_INFO_EXT_FIRST; 1511 1.76 jmcneill unsigned ext; 1512 1.76 jmcneill 1513 1.76 jmcneill DPRINTF(("%s: sdmmc_mem_decode_general_info: rev=%u, len=%u, num_ext=%u\n", 1514 1.76 jmcneill SDMMCDEVNAME(sc), SD_GENERAL_INFO_HDR_REVISION(ginfo), 1515 1.76 jmcneill len, num_ext)); 1516 1.76 jmcneill 1517 1.76 jmcneill /* 1518 1.76 jmcneill * General Information Length can span more than one page, but for 1519 1.76 jmcneill * now just parse the first one. 1520 1.76 jmcneill */ 1521 1.76 jmcneill len = uimin(SDMMC_SECTOR_SIZE, len); 1522 1.76 jmcneill 1523 1.76 jmcneill for (ext = 0; ext < num_ext && index < len && index != 0; ext++) { 1524 1.76 jmcneill uint16_t sfc = SD_EXTENSION_INFO_SFC(ginfo, index); 1525 1.76 jmcneill unsigned num_reg = SD_EXTENSION_INFO_NUM_REG(ginfo, index); 1526 1.76 jmcneill uint32_t reg; 1527 1.76 jmcneill 1528 1.76 jmcneill if (num_reg == 0) { 1529 1.76 jmcneill goto next_ext; 1530 1.76 jmcneill } 1531 1.76 jmcneill reg = SD_EXTENSION_INFO_REG(ginfo, index, 0); 1532 1.76 jmcneill 1533 1.76 jmcneill DPRINTF(("%s: sdmmc_mem_decode_general_info: sfc=0x%04x, reg=0x%08x\n", 1534 1.76 jmcneill SDMMCDEVNAME(sc), sfc, reg)); 1535 1.76 jmcneill 1536 1.76 jmcneill switch (sfc) { 1537 1.76 jmcneill case SD_SFC_PEF: 1538 1.76 jmcneill sf->ext_sd.pef.valid = true; 1539 1.76 jmcneill sf->ext_sd.pef.fno = 1540 1.76 jmcneill SD_EXTENSION_INFO_REG_FNO(reg); 1541 1.76 jmcneill sf->ext_sd.pef.start_addr = 1542 1.76 jmcneill SD_EXTENSION_INFO_REG_START_ADDR(reg); 1543 1.76 jmcneill break; 1544 1.76 jmcneill } 1545 1.76 jmcneill 1546 1.76 jmcneill next_ext: 1547 1.76 jmcneill index = SD_EXTENSION_INFO_NEXT(ginfo, index); 1548 1.76 jmcneill } 1549 1.76 jmcneill 1550 1.76 jmcneill return 0; 1551 1.76 jmcneill } 1552 1.76 jmcneill 1553 1.76 jmcneill static int 1554 1.76 jmcneill sdmmc_mem_pef_enable_cache(struct sdmmc_softc *sc, 1555 1.76 jmcneill struct sdmmc_function *sf) 1556 1.76 jmcneill { 1557 1.76 jmcneill uint8_t data[512]; 1558 1.76 jmcneill int error; 1559 1.76 jmcneill 1560 1.76 jmcneill error = sdmmc_mem_read_extr_single(sc, sf, SD_EXTR_MIO_MEM, 1561 1.76 jmcneill sf->ext_sd.pef.fno, sf->ext_sd.pef.start_addr, 1562 1.76 jmcneill sizeof(data), data); 1563 1.76 jmcneill if (error != 0) { 1564 1.76 jmcneill return error; 1565 1.76 jmcneill } 1566 1.76 jmcneill 1567 1.76 jmcneill if (SD_PEF_CACHE_ENABLE(data)) { 1568 1.76 jmcneill /* Cache is already enabled. */ 1569 1.76 jmcneill return 0; 1570 1.76 jmcneill } 1571 1.76 jmcneill 1572 1.76 jmcneill error = sdmmc_mem_write_extr_single(sc, sf, SD_EXTR_MIO_MEM, 1573 1.76 jmcneill sf->ext_sd.pef.fno, 1574 1.76 jmcneill sf->ext_sd.pef.start_addr + SD_PEF_CACHE_ENABLE_OFFSET, 1, 1575 1.76 jmcneill false); 1576 1.76 jmcneill if (error != 0) { 1577 1.76 jmcneill device_printf(sc->sc_dev, 1578 1.76 jmcneill "setting cache enable failed: %d\n", error); 1579 1.76 jmcneill return error; 1580 1.76 jmcneill } 1581 1.76 jmcneill 1582 1.76 jmcneill device_printf(sc->sc_dev, "cache enabled\n"); 1583 1.76 jmcneill 1584 1.76 jmcneill return 0; 1585 1.76 jmcneill } 1586 1.76 jmcneill 1587 1.76 jmcneill static int 1588 1.4 nonaka sdmmc_mem_send_cxd_data(struct sdmmc_softc *sc, int opcode, void *data, 1589 1.4 nonaka size_t datalen) 1590 1.4 nonaka { 1591 1.4 nonaka struct sdmmc_command cmd; 1592 1.4 nonaka bus_dma_segment_t ds[1]; 1593 1.4 nonaka void *ptr = NULL; 1594 1.4 nonaka int rseg; 1595 1.4 nonaka int error = 0; 1596 1.4 nonaka 1597 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1598 1.4 nonaka error = bus_dmamem_alloc(sc->sc_dmat, datalen, PAGE_SIZE, 0, ds, 1599 1.4 nonaka 1, &rseg, BUS_DMA_NOWAIT); 1600 1.4 nonaka if (error) 1601 1.4 nonaka goto out; 1602 1.4 nonaka error = bus_dmamem_map(sc->sc_dmat, ds, 1, datalen, &ptr, 1603 1.4 nonaka BUS_DMA_NOWAIT); 1604 1.4 nonaka if (error) 1605 1.4 nonaka goto dmamem_free; 1606 1.4 nonaka error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, ptr, datalen, 1607 1.4 nonaka NULL, BUS_DMA_NOWAIT|BUS_DMA_STREAMING|BUS_DMA_READ); 1608 1.4 nonaka if (error) 1609 1.4 nonaka goto dmamem_unmap; 1610 1.4 nonaka 1611 1.4 nonaka bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1612 1.4 nonaka BUS_DMASYNC_PREREAD); 1613 1.4 nonaka } else { 1614 1.4 nonaka ptr = malloc(datalen, M_DEVBUF, M_NOWAIT | M_ZERO); 1615 1.4 nonaka if (ptr == NULL) 1616 1.4 nonaka goto out; 1617 1.4 nonaka } 1618 1.4 nonaka 1619 1.4 nonaka memset(&cmd, 0, sizeof(cmd)); 1620 1.4 nonaka cmd.c_data = ptr; 1621 1.4 nonaka cmd.c_datalen = datalen; 1622 1.4 nonaka cmd.c_blklen = datalen; 1623 1.4 nonaka cmd.c_opcode = opcode; 1624 1.4 nonaka cmd.c_arg = 0; 1625 1.4 nonaka cmd.c_flags = SCF_CMD_ADTC | SCF_CMD_READ | SCF_RSP_SPI_R1; 1626 1.4 nonaka if (opcode == MMC_SEND_EXT_CSD) 1627 1.4 nonaka SET(cmd.c_flags, SCF_RSP_R1); 1628 1.4 nonaka else 1629 1.4 nonaka SET(cmd.c_flags, SCF_RSP_R2); 1630 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 1631 1.4 nonaka cmd.c_dmamap = sc->sc_dmap; 1632 1.4 nonaka 1633 1.4 nonaka error = sdmmc_mmc_command(sc, &cmd); 1634 1.4 nonaka if (error == 0) { 1635 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1636 1.4 nonaka bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1637 1.4 nonaka BUS_DMASYNC_POSTREAD); 1638 1.4 nonaka } 1639 1.6 kiyohara memcpy(data, ptr, datalen); 1640 1.16 nonaka #ifdef SDMMC_DEBUG 1641 1.16 nonaka sdmmc_dump_data("CXD", data, datalen); 1642 1.16 nonaka #endif 1643 1.4 nonaka } 1644 1.4 nonaka 1645 1.4 nonaka out: 1646 1.4 nonaka if (ptr != NULL) { 1647 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1648 1.4 nonaka bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 1649 1.4 nonaka dmamem_unmap: 1650 1.4 nonaka bus_dmamem_unmap(sc->sc_dmat, ptr, datalen); 1651 1.4 nonaka dmamem_free: 1652 1.4 nonaka bus_dmamem_free(sc->sc_dmat, ds, rseg); 1653 1.4 nonaka } else { 1654 1.4 nonaka free(ptr, M_DEVBUF); 1655 1.4 nonaka } 1656 1.4 nonaka } 1657 1.4 nonaka return error; 1658 1.4 nonaka } 1659 1.4 nonaka 1660 1.4 nonaka static int 1661 1.76 jmcneill sdmmc_mem_read_extr_single(struct sdmmc_softc *sc, struct sdmmc_function *sf, 1662 1.76 jmcneill uint8_t mio, uint8_t fno, uint32_t addr, uint16_t datalen, void *data) 1663 1.76 jmcneill { 1664 1.76 jmcneill struct sdmmc_command cmd; 1665 1.76 jmcneill bus_dma_segment_t ds[1]; 1666 1.76 jmcneill void *ptr = NULL; 1667 1.76 jmcneill int rseg; 1668 1.76 jmcneill int error = 0; 1669 1.76 jmcneill 1670 1.76 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1671 1.76 jmcneill error = bus_dmamem_alloc(sc->sc_dmat, datalen, PAGE_SIZE, 0, ds, 1672 1.76 jmcneill 1, &rseg, BUS_DMA_NOWAIT); 1673 1.76 jmcneill if (error) 1674 1.76 jmcneill goto out; 1675 1.76 jmcneill error = bus_dmamem_map(sc->sc_dmat, ds, 1, datalen, &ptr, 1676 1.76 jmcneill BUS_DMA_NOWAIT); 1677 1.76 jmcneill if (error) 1678 1.76 jmcneill goto dmamem_free; 1679 1.76 jmcneill error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, ptr, datalen, 1680 1.76 jmcneill NULL, BUS_DMA_NOWAIT|BUS_DMA_STREAMING|BUS_DMA_READ); 1681 1.76 jmcneill if (error) 1682 1.76 jmcneill goto dmamem_unmap; 1683 1.76 jmcneill 1684 1.76 jmcneill bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1685 1.76 jmcneill BUS_DMASYNC_PREREAD); 1686 1.76 jmcneill } else { 1687 1.76 jmcneill ptr = data; 1688 1.76 jmcneill } 1689 1.76 jmcneill 1690 1.76 jmcneill memset(&cmd, 0, sizeof(cmd)); 1691 1.76 jmcneill cmd.c_data = ptr; 1692 1.76 jmcneill cmd.c_datalen = datalen; 1693 1.76 jmcneill cmd.c_blklen = SDMMC_SECTOR_SIZE; 1694 1.76 jmcneill cmd.c_opcode = SD_READ_EXTR_SINGLE; 1695 1.76 jmcneill cmd.c_arg = __SHIFTIN((uint32_t)mio, SD_EXTR_MIO) | 1696 1.76 jmcneill __SHIFTIN((uint32_t)fno, SD_EXTR_FNO) | 1697 1.76 jmcneill __SHIFTIN(addr, SD_EXTR_ADDR) | 1698 1.76 jmcneill __SHIFTIN(datalen - 1, SD_EXTR_LEN); 1699 1.76 jmcneill cmd.c_flags = SCF_CMD_ADTC | SCF_CMD_READ | SCF_RSP_R1; 1700 1.76 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 1701 1.76 jmcneill cmd.c_dmamap = sc->sc_dmap; 1702 1.76 jmcneill 1703 1.76 jmcneill error = sdmmc_mmc_command(sc, &cmd); 1704 1.76 jmcneill if (error == 0) { 1705 1.76 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1706 1.76 jmcneill bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 1707 1.76 jmcneill BUS_DMASYNC_POSTREAD); 1708 1.76 jmcneill memcpy(data, ptr, datalen); 1709 1.76 jmcneill } 1710 1.76 jmcneill #ifdef SDMMC_DEBUG 1711 1.76 jmcneill sdmmc_dump_data("EXT", data, datalen); 1712 1.76 jmcneill #endif 1713 1.76 jmcneill } 1714 1.76 jmcneill 1715 1.76 jmcneill out: 1716 1.76 jmcneill if (ptr != NULL) { 1717 1.76 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1718 1.76 jmcneill bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 1719 1.76 jmcneill dmamem_unmap: 1720 1.76 jmcneill bus_dmamem_unmap(sc->sc_dmat, ptr, datalen); 1721 1.76 jmcneill dmamem_free: 1722 1.76 jmcneill bus_dmamem_free(sc->sc_dmat, ds, rseg); 1723 1.76 jmcneill } 1724 1.76 jmcneill } 1725 1.76 jmcneill return error; 1726 1.76 jmcneill } 1727 1.76 jmcneill 1728 1.76 jmcneill static int 1729 1.76 jmcneill sdmmc_mem_write_extr_single(struct sdmmc_softc *sc, struct sdmmc_function *sf, 1730 1.76 jmcneill uint8_t mio, uint8_t fno, uint32_t addr, uint8_t value, bool poll) 1731 1.76 jmcneill { 1732 1.76 jmcneill struct sdmmc_command cmd; 1733 1.76 jmcneill bus_dma_segment_t ds[1]; 1734 1.76 jmcneill uint8_t buf[512]; 1735 1.76 jmcneill uint16_t buflen = sizeof(buf); 1736 1.76 jmcneill void *ptr = NULL; 1737 1.76 jmcneill int rseg; 1738 1.76 jmcneill int error = 0; 1739 1.76 jmcneill 1740 1.76 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1741 1.76 jmcneill error = bus_dmamem_alloc(sc->sc_dmat, buflen, PAGE_SIZE, 0, ds, 1742 1.76 jmcneill 1, &rseg, BUS_DMA_NOWAIT); 1743 1.76 jmcneill if (error) 1744 1.76 jmcneill goto out; 1745 1.76 jmcneill error = bus_dmamem_map(sc->sc_dmat, ds, 1, buflen, &ptr, 1746 1.76 jmcneill BUS_DMA_NOWAIT); 1747 1.76 jmcneill if (error) 1748 1.76 jmcneill goto dmamem_free; 1749 1.76 jmcneill error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, ptr, buflen, 1750 1.76 jmcneill NULL, BUS_DMA_NOWAIT|BUS_DMA_STREAMING|BUS_DMA_WRITE); 1751 1.76 jmcneill if (error) 1752 1.76 jmcneill goto dmamem_unmap; 1753 1.76 jmcneill 1754 1.76 jmcneill memset(ptr, 0, buflen); 1755 1.76 jmcneill *(uint8_t *)ptr = value; 1756 1.76 jmcneill 1757 1.76 jmcneill bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, buflen, 1758 1.76 jmcneill BUS_DMASYNC_PREWRITE); 1759 1.76 jmcneill } else { 1760 1.76 jmcneill buf[0] = value; 1761 1.76 jmcneill ptr = buf; 1762 1.76 jmcneill } 1763 1.76 jmcneill 1764 1.76 jmcneill memset(&cmd, 0, sizeof(cmd)); 1765 1.76 jmcneill cmd.c_data = ptr; 1766 1.76 jmcneill cmd.c_datalen = buflen; 1767 1.76 jmcneill cmd.c_blklen = SDMMC_SECTOR_SIZE; 1768 1.76 jmcneill cmd.c_opcode = SD_WRITE_EXTR_SINGLE; 1769 1.76 jmcneill cmd.c_arg = __SHIFTIN((uint32_t)mio, SD_EXTR_MIO) | 1770 1.76 jmcneill __SHIFTIN((uint32_t)fno, SD_EXTR_FNO) | 1771 1.76 jmcneill __SHIFTIN(addr, SD_EXTR_ADDR) | 1772 1.76 jmcneill __SHIFTIN(0, SD_EXTR_LEN); 1773 1.76 jmcneill cmd.c_flags = SCF_CMD_ADTC | SCF_RSP_R1; 1774 1.76 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 1775 1.76 jmcneill cmd.c_dmamap = sc->sc_dmap; 1776 1.76 jmcneill 1777 1.76 jmcneill error = sdmmc_mmc_command(sc, &cmd); 1778 1.76 jmcneill if (error == 0) { 1779 1.76 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1780 1.76 jmcneill bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, buflen, 1781 1.76 jmcneill BUS_DMASYNC_POSTWRITE); 1782 1.76 jmcneill } 1783 1.76 jmcneill } 1784 1.76 jmcneill 1785 1.76 jmcneill out: 1786 1.76 jmcneill if (ptr != NULL) { 1787 1.76 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1788 1.76 jmcneill bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 1789 1.76 jmcneill dmamem_unmap: 1790 1.76 jmcneill bus_dmamem_unmap(sc->sc_dmat, ptr, buflen); 1791 1.76 jmcneill dmamem_free: 1792 1.76 jmcneill bus_dmamem_free(sc->sc_dmat, ds, rseg); 1793 1.76 jmcneill } 1794 1.76 jmcneill } 1795 1.76 jmcneill 1796 1.76 jmcneill if (!error) { 1797 1.76 jmcneill do { 1798 1.76 jmcneill memset(&cmd, 0, sizeof(cmd)); 1799 1.76 jmcneill cmd.c_opcode = MMC_SEND_STATUS; 1800 1.76 jmcneill cmd.c_arg = MMC_ARG_RCA(sf->rca); 1801 1.76 jmcneill cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1 | SCF_RSP_SPI_R2 | 1802 1.76 jmcneill SCF_TOUT_OK; 1803 1.76 jmcneill if (poll) { 1804 1.76 jmcneill cmd.c_flags |= SCF_POLL; 1805 1.76 jmcneill } 1806 1.76 jmcneill error = sdmmc_mmc_command(sc, &cmd); 1807 1.76 jmcneill if (error) 1808 1.76 jmcneill break; 1809 1.76 jmcneill /* XXX time out */ 1810 1.76 jmcneill } while (!ISSET(MMC_R1(cmd.c_resp), MMC_R1_READY_FOR_DATA)); 1811 1.76 jmcneill 1812 1.76 jmcneill if (error) { 1813 1.76 jmcneill aprint_error_dev(sc->sc_dev, 1814 1.76 jmcneill "error waiting for data ready after ext write : %d\n", 1815 1.76 jmcneill error); 1816 1.76 jmcneill } 1817 1.76 jmcneill } 1818 1.76 jmcneill 1819 1.76 jmcneill return error; 1820 1.76 jmcneill } 1821 1.76 jmcneill 1822 1.76 jmcneill static int 1823 1.4 nonaka sdmmc_set_bus_width(struct sdmmc_function *sf, int width) 1824 1.4 nonaka { 1825 1.4 nonaka struct sdmmc_softc *sc = sf->sc; 1826 1.4 nonaka struct sdmmc_command cmd; 1827 1.4 nonaka int error; 1828 1.4 nonaka 1829 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 1830 1.4 nonaka return ENODEV; 1831 1.4 nonaka 1832 1.4 nonaka memset(&cmd, 0, sizeof(cmd)); 1833 1.4 nonaka cmd.c_opcode = SD_APP_SET_BUS_WIDTH; 1834 1.4 nonaka cmd.c_flags = SCF_RSP_R1 | SCF_CMD_AC; 1835 1.4 nonaka 1836 1.4 nonaka switch (width) { 1837 1.4 nonaka case 1: 1838 1.4 nonaka cmd.c_arg = SD_ARG_BUS_WIDTH_1; 1839 1.4 nonaka break; 1840 1.4 nonaka 1841 1.4 nonaka case 4: 1842 1.4 nonaka cmd.c_arg = SD_ARG_BUS_WIDTH_4; 1843 1.4 nonaka break; 1844 1.4 nonaka 1845 1.4 nonaka default: 1846 1.4 nonaka return EINVAL; 1847 1.4 nonaka } 1848 1.4 nonaka 1849 1.4 nonaka error = sdmmc_app_command(sc, sf, &cmd); 1850 1.4 nonaka if (error == 0) 1851 1.4 nonaka error = sdmmc_chip_bus_width(sc->sc_sct, sc->sc_sch, width); 1852 1.4 nonaka return error; 1853 1.4 nonaka } 1854 1.4 nonaka 1855 1.4 nonaka static int 1856 1.13 kiyohara sdmmc_mem_sd_switch(struct sdmmc_function *sf, int mode, int group, 1857 1.26 jakllsch int function, sdmmc_bitfield512_t *status) 1858 1.13 kiyohara { 1859 1.13 kiyohara struct sdmmc_softc *sc = sf->sc; 1860 1.13 kiyohara struct sdmmc_command cmd; 1861 1.13 kiyohara bus_dma_segment_t ds[1]; 1862 1.13 kiyohara void *ptr = NULL; 1863 1.13 kiyohara int gsft, rseg, error = 0; 1864 1.13 kiyohara const int statlen = 64; 1865 1.13 kiyohara 1866 1.13 kiyohara if (sf->scr.sd_spec >= SCR_SD_SPEC_VER_1_10 && 1867 1.13 kiyohara !ISSET(sf->csd.ccc, SD_CSD_CCC_SWITCH)) 1868 1.13 kiyohara return EINVAL; 1869 1.13 kiyohara 1870 1.13 kiyohara if (group <= 0 || group > 6 || 1871 1.27 jakllsch function < 0 || function > 15) 1872 1.13 kiyohara return EINVAL; 1873 1.13 kiyohara 1874 1.13 kiyohara gsft = (group - 1) << 2; 1875 1.13 kiyohara 1876 1.13 kiyohara if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1877 1.13 kiyohara error = bus_dmamem_alloc(sc->sc_dmat, statlen, PAGE_SIZE, 0, ds, 1878 1.13 kiyohara 1, &rseg, BUS_DMA_NOWAIT); 1879 1.13 kiyohara if (error) 1880 1.13 kiyohara goto out; 1881 1.13 kiyohara error = bus_dmamem_map(sc->sc_dmat, ds, 1, statlen, &ptr, 1882 1.13 kiyohara BUS_DMA_NOWAIT); 1883 1.13 kiyohara if (error) 1884 1.13 kiyohara goto dmamem_free; 1885 1.13 kiyohara error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, ptr, statlen, 1886 1.13 kiyohara NULL, BUS_DMA_NOWAIT|BUS_DMA_STREAMING|BUS_DMA_READ); 1887 1.13 kiyohara if (error) 1888 1.13 kiyohara goto dmamem_unmap; 1889 1.13 kiyohara 1890 1.13 kiyohara bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, statlen, 1891 1.13 kiyohara BUS_DMASYNC_PREREAD); 1892 1.13 kiyohara } else { 1893 1.13 kiyohara ptr = malloc(statlen, M_DEVBUF, M_NOWAIT | M_ZERO); 1894 1.13 kiyohara if (ptr == NULL) 1895 1.13 kiyohara goto out; 1896 1.13 kiyohara } 1897 1.13 kiyohara 1898 1.13 kiyohara memset(&cmd, 0, sizeof(cmd)); 1899 1.13 kiyohara cmd.c_data = ptr; 1900 1.13 kiyohara cmd.c_datalen = statlen; 1901 1.13 kiyohara cmd.c_blklen = statlen; 1902 1.13 kiyohara cmd.c_opcode = SD_SEND_SWITCH_FUNC; 1903 1.74 msaitoh cmd.c_arg = ((uint32_t)!!mode << 31) | 1904 1.74 msaitoh (function << gsft) | (0x00ffffff & ~(0xf << gsft)); 1905 1.13 kiyohara cmd.c_flags = SCF_CMD_ADTC | SCF_CMD_READ | SCF_RSP_R1 | SCF_RSP_SPI_R1; 1906 1.13 kiyohara if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 1907 1.13 kiyohara cmd.c_dmamap = sc->sc_dmap; 1908 1.13 kiyohara 1909 1.13 kiyohara error = sdmmc_mmc_command(sc, &cmd); 1910 1.13 kiyohara if (error == 0) { 1911 1.13 kiyohara if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1912 1.13 kiyohara bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, statlen, 1913 1.13 kiyohara BUS_DMASYNC_POSTREAD); 1914 1.13 kiyohara } 1915 1.13 kiyohara memcpy(status, ptr, statlen); 1916 1.13 kiyohara } 1917 1.13 kiyohara 1918 1.13 kiyohara out: 1919 1.13 kiyohara if (ptr != NULL) { 1920 1.13 kiyohara if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 1921 1.13 kiyohara bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 1922 1.13 kiyohara dmamem_unmap: 1923 1.13 kiyohara bus_dmamem_unmap(sc->sc_dmat, ptr, statlen); 1924 1.13 kiyohara dmamem_free: 1925 1.13 kiyohara bus_dmamem_free(sc->sc_dmat, ds, rseg); 1926 1.13 kiyohara } else { 1927 1.13 kiyohara free(ptr, M_DEVBUF); 1928 1.13 kiyohara } 1929 1.13 kiyohara } 1930 1.26 jakllsch 1931 1.26 jakllsch if (error == 0) 1932 1.26 jakllsch sdmmc_be512_to_bitfield512(status); 1933 1.26 jakllsch 1934 1.13 kiyohara return error; 1935 1.13 kiyohara } 1936 1.13 kiyohara 1937 1.13 kiyohara static int 1938 1.4 nonaka sdmmc_mem_mmc_switch(struct sdmmc_function *sf, uint8_t set, uint8_t index, 1939 1.61 jmcneill uint8_t value, bool poll) 1940 1.4 nonaka { 1941 1.4 nonaka struct sdmmc_softc *sc = sf->sc; 1942 1.4 nonaka struct sdmmc_command cmd; 1943 1.48 jmcneill int error; 1944 1.4 nonaka 1945 1.4 nonaka memset(&cmd, 0, sizeof(cmd)); 1946 1.4 nonaka cmd.c_opcode = MMC_SWITCH; 1947 1.4 nonaka cmd.c_arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | 1948 1.4 nonaka (index << 16) | (value << 8) | set; 1949 1.4 nonaka cmd.c_flags = SCF_RSP_SPI_R1B | SCF_RSP_R1B | SCF_CMD_AC; 1950 1.4 nonaka 1951 1.61 jmcneill if (poll) 1952 1.61 jmcneill cmd.c_flags |= SCF_POLL; 1953 1.61 jmcneill 1954 1.48 jmcneill error = sdmmc_mmc_command(sc, &cmd); 1955 1.48 jmcneill if (error) 1956 1.48 jmcneill return error; 1957 1.48 jmcneill 1958 1.66 jmcneill if (index == EXT_CSD_FLUSH_CACHE || (index == EXT_CSD_HS_TIMING && value >= 2)) { 1959 1.48 jmcneill do { 1960 1.48 jmcneill memset(&cmd, 0, sizeof(cmd)); 1961 1.48 jmcneill cmd.c_opcode = MMC_SEND_STATUS; 1962 1.48 jmcneill if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 1963 1.48 jmcneill cmd.c_arg = MMC_ARG_RCA(sf->rca); 1964 1.48 jmcneill cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1 | SCF_RSP_SPI_R2; 1965 1.61 jmcneill if (poll) 1966 1.61 jmcneill cmd.c_flags |= SCF_POLL; 1967 1.48 jmcneill error = sdmmc_mmc_command(sc, &cmd); 1968 1.48 jmcneill if (error) 1969 1.48 jmcneill break; 1970 1.48 jmcneill if (ISSET(MMC_R1(cmd.c_resp), MMC_R1_SWITCH_ERROR)) { 1971 1.48 jmcneill aprint_error_dev(sc->sc_dev, "switch error\n"); 1972 1.48 jmcneill return EINVAL; 1973 1.48 jmcneill } 1974 1.48 jmcneill /* XXX time out */ 1975 1.48 jmcneill } while (!ISSET(MMC_R1(cmd.c_resp), MMC_R1_READY_FOR_DATA)); 1976 1.48 jmcneill 1977 1.48 jmcneill if (error) { 1978 1.48 jmcneill aprint_error_dev(sc->sc_dev, 1979 1.66 jmcneill "error waiting for data ready after switch command: %d\n", 1980 1.48 jmcneill error); 1981 1.48 jmcneill return error; 1982 1.48 jmcneill } 1983 1.48 jmcneill } 1984 1.48 jmcneill 1985 1.48 jmcneill return 0; 1986 1.4 nonaka } 1987 1.4 nonaka 1988 1.4 nonaka /* 1989 1.4 nonaka * SPI mode function 1990 1.4 nonaka */ 1991 1.4 nonaka static int 1992 1.4 nonaka sdmmc_mem_spi_read_ocr(struct sdmmc_softc *sc, uint32_t hcs, uint32_t *card_ocr) 1993 1.4 nonaka { 1994 1.4 nonaka struct sdmmc_command cmd; 1995 1.4 nonaka int error; 1996 1.4 nonaka 1997 1.4 nonaka memset(&cmd, 0, sizeof(cmd)); 1998 1.4 nonaka cmd.c_opcode = MMC_READ_OCR; 1999 1.4 nonaka cmd.c_arg = hcs ? MMC_OCR_HCS : 0; 2000 1.4 nonaka cmd.c_flags = SCF_RSP_SPI_R3; 2001 1.4 nonaka 2002 1.4 nonaka error = sdmmc_mmc_command(sc, &cmd); 2003 1.4 nonaka if (error == 0 && card_ocr != NULL) 2004 1.4 nonaka *card_ocr = cmd.c_resp[1]; 2005 1.4 nonaka DPRINTF(("%s: sdmmc_mem_spi_read_ocr: error=%d, ocr=%#x\n", 2006 1.4 nonaka SDMMCDEVNAME(sc), error, cmd.c_resp[1])); 2007 1.4 nonaka return error; 2008 1.4 nonaka } 2009 1.4 nonaka 2010 1.4 nonaka /* 2011 1.4 nonaka * read/write function 2012 1.4 nonaka */ 2013 1.4 nonaka /* read */ 2014 1.4 nonaka static int 2015 1.4 nonaka sdmmc_mem_single_read_block(struct sdmmc_function *sf, uint32_t blkno, 2016 1.4 nonaka u_char *data, size_t datalen) 2017 1.4 nonaka { 2018 1.34 nonaka struct sdmmc_softc *sc = sf->sc; 2019 1.4 nonaka int error = 0; 2020 1.4 nonaka int i; 2021 1.4 nonaka 2022 1.4 nonaka KASSERT((datalen % SDMMC_SECTOR_SIZE) == 0); 2023 1.12 kiyohara KASSERT(!ISSET(sc->sc_caps, SMC_CAPS_DMA)); 2024 1.4 nonaka 2025 1.4 nonaka for (i = 0; i < datalen / SDMMC_SECTOR_SIZE; i++) { 2026 1.34 nonaka error = sdmmc_mem_read_block_subr(sf, sc->sc_dmap, blkno + i, 2027 1.4 nonaka data + i * SDMMC_SECTOR_SIZE, SDMMC_SECTOR_SIZE); 2028 1.4 nonaka if (error) 2029 1.4 nonaka break; 2030 1.4 nonaka } 2031 1.4 nonaka return error; 2032 1.4 nonaka } 2033 1.4 nonaka 2034 1.34 nonaka /* 2035 1.34 nonaka * Simulate multi-segment dma transfer. 2036 1.34 nonaka */ 2037 1.4 nonaka static int 2038 1.34 nonaka sdmmc_mem_single_segment_dma_read_block(struct sdmmc_function *sf, 2039 1.34 nonaka uint32_t blkno, u_char *data, size_t datalen) 2040 1.34 nonaka { 2041 1.34 nonaka struct sdmmc_softc *sc = sf->sc; 2042 1.34 nonaka bool use_bbuf = false; 2043 1.34 nonaka int error = 0; 2044 1.34 nonaka int i; 2045 1.34 nonaka 2046 1.34 nonaka for (i = 0; i < sc->sc_dmap->dm_nsegs; i++) { 2047 1.34 nonaka size_t len = sc->sc_dmap->dm_segs[i].ds_len; 2048 1.34 nonaka if ((len % SDMMC_SECTOR_SIZE) != 0) { 2049 1.34 nonaka use_bbuf = true; 2050 1.34 nonaka break; 2051 1.34 nonaka } 2052 1.34 nonaka } 2053 1.34 nonaka if (use_bbuf) { 2054 1.34 nonaka bus_dmamap_sync(sc->sc_dmat, sf->bbuf_dmap, 0, datalen, 2055 1.34 nonaka BUS_DMASYNC_PREREAD); 2056 1.34 nonaka 2057 1.34 nonaka error = sdmmc_mem_read_block_subr(sf, sf->bbuf_dmap, 2058 1.34 nonaka blkno, data, datalen); 2059 1.34 nonaka if (error) { 2060 1.34 nonaka bus_dmamap_unload(sc->sc_dmat, sf->bbuf_dmap); 2061 1.34 nonaka return error; 2062 1.34 nonaka } 2063 1.34 nonaka 2064 1.34 nonaka bus_dmamap_sync(sc->sc_dmat, sf->bbuf_dmap, 0, datalen, 2065 1.34 nonaka BUS_DMASYNC_POSTREAD); 2066 1.34 nonaka 2067 1.34 nonaka /* Copy from bounce buffer */ 2068 1.34 nonaka memcpy(data, sf->bbuf, datalen); 2069 1.34 nonaka 2070 1.34 nonaka return 0; 2071 1.34 nonaka } 2072 1.34 nonaka 2073 1.34 nonaka for (i = 0; i < sc->sc_dmap->dm_nsegs; i++) { 2074 1.34 nonaka size_t len = sc->sc_dmap->dm_segs[i].ds_len; 2075 1.34 nonaka 2076 1.34 nonaka error = bus_dmamap_load(sc->sc_dmat, sf->sseg_dmap, 2077 1.34 nonaka data, len, NULL, BUS_DMA_NOWAIT|BUS_DMA_READ); 2078 1.34 nonaka if (error) 2079 1.34 nonaka return error; 2080 1.34 nonaka 2081 1.34 nonaka bus_dmamap_sync(sc->sc_dmat, sf->sseg_dmap, 0, len, 2082 1.34 nonaka BUS_DMASYNC_PREREAD); 2083 1.34 nonaka 2084 1.34 nonaka error = sdmmc_mem_read_block_subr(sf, sf->sseg_dmap, 2085 1.34 nonaka blkno, data, len); 2086 1.34 nonaka if (error) { 2087 1.34 nonaka bus_dmamap_unload(sc->sc_dmat, sf->sseg_dmap); 2088 1.34 nonaka return error; 2089 1.34 nonaka } 2090 1.34 nonaka 2091 1.34 nonaka bus_dmamap_sync(sc->sc_dmat, sf->sseg_dmap, 0, len, 2092 1.34 nonaka BUS_DMASYNC_POSTREAD); 2093 1.34 nonaka 2094 1.34 nonaka bus_dmamap_unload(sc->sc_dmat, sf->sseg_dmap); 2095 1.34 nonaka 2096 1.34 nonaka blkno += len / SDMMC_SECTOR_SIZE; 2097 1.34 nonaka data += len; 2098 1.34 nonaka } 2099 1.34 nonaka return 0; 2100 1.34 nonaka } 2101 1.34 nonaka 2102 1.34 nonaka static int 2103 1.34 nonaka sdmmc_mem_read_block_subr(struct sdmmc_function *sf, bus_dmamap_t dmap, 2104 1.34 nonaka uint32_t blkno, u_char *data, size_t datalen) 2105 1.1 nonaka { 2106 1.1 nonaka struct sdmmc_softc *sc = sf->sc; 2107 1.1 nonaka struct sdmmc_command cmd; 2108 1.34 nonaka int error; 2109 1.1 nonaka 2110 1.4 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 2111 1.4 nonaka error = sdmmc_select_card(sc, sf); 2112 1.4 nonaka if (error) 2113 1.4 nonaka goto out; 2114 1.4 nonaka } 2115 1.1 nonaka 2116 1.1 nonaka memset(&cmd, 0, sizeof(cmd)); 2117 1.1 nonaka cmd.c_data = data; 2118 1.1 nonaka cmd.c_datalen = datalen; 2119 1.3 nonaka cmd.c_blklen = SDMMC_SECTOR_SIZE; 2120 1.1 nonaka cmd.c_opcode = (cmd.c_datalen / cmd.c_blklen) > 1 ? 2121 1.1 nonaka MMC_READ_BLOCK_MULTIPLE : MMC_READ_BLOCK_SINGLE; 2122 1.1 nonaka cmd.c_arg = blkno; 2123 1.1 nonaka if (!ISSET(sf->flags, SFF_SDHC)) 2124 1.3 nonaka cmd.c_arg <<= SDMMC_SECTOR_SIZE_SB; 2125 1.4 nonaka cmd.c_flags = SCF_CMD_ADTC | SCF_CMD_READ | SCF_RSP_R1 | SCF_RSP_SPI_R1; 2126 1.57 jmcneill if (ISSET(sf->flags, SFF_SDHC)) 2127 1.57 jmcneill cmd.c_flags |= SCF_XFER_SDHC; 2128 1.34 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 2129 1.34 nonaka cmd.c_dmamap = dmap; 2130 1.1 nonaka 2131 1.49 jmcneill sc->sc_ev_xfer.ev_count++; 2132 1.49 jmcneill 2133 1.1 nonaka error = sdmmc_mmc_command(sc, &cmd); 2134 1.49 jmcneill if (error) { 2135 1.49 jmcneill sc->sc_ev_xfer_error.ev_count++; 2136 1.1 nonaka goto out; 2137 1.49 jmcneill } 2138 1.49 jmcneill 2139 1.49 jmcneill const u_int counter = __builtin_ctz(cmd.c_datalen); 2140 1.49 jmcneill if (counter >= 9 && counter <= 16) { 2141 1.49 jmcneill sc->sc_ev_xfer_aligned[counter - 9].ev_count++; 2142 1.49 jmcneill } else { 2143 1.49 jmcneill sc->sc_ev_xfer_unaligned.ev_count++; 2144 1.49 jmcneill } 2145 1.1 nonaka 2146 1.1 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_AUTO_STOP)) { 2147 1.1 nonaka if (cmd.c_opcode == MMC_READ_BLOCK_MULTIPLE) { 2148 1.1 nonaka memset(&cmd, 0, sizeof cmd); 2149 1.1 nonaka cmd.c_opcode = MMC_STOP_TRANSMISSION; 2150 1.1 nonaka cmd.c_arg = MMC_ARG_RCA(sf->rca); 2151 1.4 nonaka cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1B | SCF_RSP_SPI_R1B; 2152 1.1 nonaka error = sdmmc_mmc_command(sc, &cmd); 2153 1.1 nonaka if (error) 2154 1.1 nonaka goto out; 2155 1.1 nonaka } 2156 1.1 nonaka } 2157 1.1 nonaka 2158 1.4 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 2159 1.4 nonaka do { 2160 1.4 nonaka memset(&cmd, 0, sizeof(cmd)); 2161 1.4 nonaka cmd.c_opcode = MMC_SEND_STATUS; 2162 1.4 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 2163 1.4 nonaka cmd.c_arg = MMC_ARG_RCA(sf->rca); 2164 1.4 nonaka cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1 | SCF_RSP_SPI_R2; 2165 1.4 nonaka error = sdmmc_mmc_command(sc, &cmd); 2166 1.4 nonaka if (error) 2167 1.4 nonaka break; 2168 1.4 nonaka /* XXX time out */ 2169 1.4 nonaka } while (!ISSET(MMC_R1(cmd.c_resp), MMC_R1_READY_FOR_DATA)); 2170 1.4 nonaka } 2171 1.1 nonaka 2172 1.1 nonaka out: 2173 1.1 nonaka return error; 2174 1.1 nonaka } 2175 1.1 nonaka 2176 1.1 nonaka int 2177 1.1 nonaka sdmmc_mem_read_block(struct sdmmc_function *sf, uint32_t blkno, u_char *data, 2178 1.1 nonaka size_t datalen) 2179 1.1 nonaka { 2180 1.1 nonaka struct sdmmc_softc *sc = sf->sc; 2181 1.1 nonaka int error; 2182 1.1 nonaka 2183 1.1 nonaka SDMMC_LOCK(sc); 2184 1.38 mlelstv mutex_enter(&sc->sc_mtx); 2185 1.1 nonaka 2186 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_SINGLE_ONLY)) { 2187 1.4 nonaka error = sdmmc_mem_single_read_block(sf, blkno, data, datalen); 2188 1.4 nonaka goto out; 2189 1.4 nonaka } 2190 1.4 nonaka 2191 1.1 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 2192 1.34 nonaka error = sdmmc_mem_read_block_subr(sf, sc->sc_dmap, blkno, data, 2193 1.34 nonaka datalen); 2194 1.1 nonaka goto out; 2195 1.1 nonaka } 2196 1.1 nonaka 2197 1.1 nonaka /* DMA transfer */ 2198 1.1 nonaka error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, data, datalen, NULL, 2199 1.4 nonaka BUS_DMA_NOWAIT|BUS_DMA_READ); 2200 1.1 nonaka if (error) 2201 1.1 nonaka goto out; 2202 1.1 nonaka 2203 1.4 nonaka #ifdef SDMMC_DEBUG 2204 1.34 nonaka printf("data=%p, datalen=%zu\n", data, datalen); 2205 1.4 nonaka for (int i = 0; i < sc->sc_dmap->dm_nsegs; i++) { 2206 1.4 nonaka printf("seg#%d: addr=%#lx, size=%#lx\n", i, 2207 1.4 nonaka (u_long)sc->sc_dmap->dm_segs[i].ds_addr, 2208 1.4 nonaka (u_long)sc->sc_dmap->dm_segs[i].ds_len); 2209 1.4 nonaka } 2210 1.4 nonaka #endif 2211 1.4 nonaka 2212 1.34 nonaka if (sc->sc_dmap->dm_nsegs > 1 2213 1.34 nonaka && !ISSET(sc->sc_caps, SMC_CAPS_MULTI_SEG_DMA)) { 2214 1.34 nonaka error = sdmmc_mem_single_segment_dma_read_block(sf, blkno, 2215 1.34 nonaka data, datalen); 2216 1.34 nonaka goto unload; 2217 1.34 nonaka } 2218 1.34 nonaka 2219 1.1 nonaka bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 2220 1.1 nonaka BUS_DMASYNC_PREREAD); 2221 1.1 nonaka 2222 1.34 nonaka error = sdmmc_mem_read_block_subr(sf, sc->sc_dmap, blkno, data, 2223 1.34 nonaka datalen); 2224 1.1 nonaka if (error) 2225 1.1 nonaka goto unload; 2226 1.1 nonaka 2227 1.1 nonaka bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 2228 1.1 nonaka BUS_DMASYNC_POSTREAD); 2229 1.1 nonaka unload: 2230 1.1 nonaka bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 2231 1.1 nonaka 2232 1.1 nonaka out: 2233 1.38 mlelstv mutex_exit(&sc->sc_mtx); 2234 1.1 nonaka SDMMC_UNLOCK(sc); 2235 1.1 nonaka 2236 1.1 nonaka return error; 2237 1.1 nonaka } 2238 1.1 nonaka 2239 1.4 nonaka /* write */ 2240 1.4 nonaka static int 2241 1.4 nonaka sdmmc_mem_single_write_block(struct sdmmc_function *sf, uint32_t blkno, 2242 1.4 nonaka u_char *data, size_t datalen) 2243 1.4 nonaka { 2244 1.34 nonaka struct sdmmc_softc *sc = sf->sc; 2245 1.4 nonaka int error = 0; 2246 1.4 nonaka int i; 2247 1.4 nonaka 2248 1.4 nonaka KASSERT((datalen % SDMMC_SECTOR_SIZE) == 0); 2249 1.12 kiyohara KASSERT(!ISSET(sc->sc_caps, SMC_CAPS_DMA)); 2250 1.4 nonaka 2251 1.4 nonaka for (i = 0; i < datalen / SDMMC_SECTOR_SIZE; i++) { 2252 1.34 nonaka error = sdmmc_mem_write_block_subr(sf, sc->sc_dmap, blkno + i, 2253 1.4 nonaka data + i * SDMMC_SECTOR_SIZE, SDMMC_SECTOR_SIZE); 2254 1.4 nonaka if (error) 2255 1.4 nonaka break; 2256 1.4 nonaka } 2257 1.4 nonaka return error; 2258 1.4 nonaka } 2259 1.4 nonaka 2260 1.34 nonaka /* 2261 1.34 nonaka * Simulate multi-segment dma transfer. 2262 1.34 nonaka */ 2263 1.34 nonaka static int 2264 1.34 nonaka sdmmc_mem_single_segment_dma_write_block(struct sdmmc_function *sf, 2265 1.34 nonaka uint32_t blkno, u_char *data, size_t datalen) 2266 1.34 nonaka { 2267 1.34 nonaka struct sdmmc_softc *sc = sf->sc; 2268 1.34 nonaka bool use_bbuf = false; 2269 1.34 nonaka int error = 0; 2270 1.34 nonaka int i; 2271 1.34 nonaka 2272 1.34 nonaka for (i = 0; i < sc->sc_dmap->dm_nsegs; i++) { 2273 1.34 nonaka size_t len = sc->sc_dmap->dm_segs[i].ds_len; 2274 1.34 nonaka if ((len % SDMMC_SECTOR_SIZE) != 0) { 2275 1.34 nonaka use_bbuf = true; 2276 1.34 nonaka break; 2277 1.34 nonaka } 2278 1.34 nonaka } 2279 1.34 nonaka if (use_bbuf) { 2280 1.34 nonaka /* Copy to bounce buffer */ 2281 1.34 nonaka memcpy(sf->bbuf, data, datalen); 2282 1.34 nonaka 2283 1.34 nonaka bus_dmamap_sync(sc->sc_dmat, sf->bbuf_dmap, 0, datalen, 2284 1.34 nonaka BUS_DMASYNC_PREWRITE); 2285 1.34 nonaka 2286 1.34 nonaka error = sdmmc_mem_write_block_subr(sf, sf->bbuf_dmap, 2287 1.34 nonaka blkno, data, datalen); 2288 1.34 nonaka if (error) { 2289 1.34 nonaka bus_dmamap_unload(sc->sc_dmat, sf->bbuf_dmap); 2290 1.34 nonaka return error; 2291 1.34 nonaka } 2292 1.34 nonaka 2293 1.34 nonaka bus_dmamap_sync(sc->sc_dmat, sf->bbuf_dmap, 0, datalen, 2294 1.34 nonaka BUS_DMASYNC_POSTWRITE); 2295 1.34 nonaka 2296 1.34 nonaka return 0; 2297 1.34 nonaka } 2298 1.34 nonaka 2299 1.34 nonaka for (i = 0; i < sc->sc_dmap->dm_nsegs; i++) { 2300 1.34 nonaka size_t len = sc->sc_dmap->dm_segs[i].ds_len; 2301 1.34 nonaka 2302 1.34 nonaka error = bus_dmamap_load(sc->sc_dmat, sf->sseg_dmap, 2303 1.34 nonaka data, len, NULL, BUS_DMA_NOWAIT|BUS_DMA_WRITE); 2304 1.34 nonaka if (error) 2305 1.34 nonaka return error; 2306 1.34 nonaka 2307 1.34 nonaka bus_dmamap_sync(sc->sc_dmat, sf->sseg_dmap, 0, len, 2308 1.34 nonaka BUS_DMASYNC_PREWRITE); 2309 1.34 nonaka 2310 1.34 nonaka error = sdmmc_mem_write_block_subr(sf, sf->sseg_dmap, 2311 1.34 nonaka blkno, data, len); 2312 1.34 nonaka if (error) { 2313 1.34 nonaka bus_dmamap_unload(sc->sc_dmat, sf->sseg_dmap); 2314 1.34 nonaka return error; 2315 1.34 nonaka } 2316 1.34 nonaka 2317 1.34 nonaka bus_dmamap_sync(sc->sc_dmat, sf->sseg_dmap, 0, len, 2318 1.34 nonaka BUS_DMASYNC_POSTWRITE); 2319 1.34 nonaka 2320 1.34 nonaka bus_dmamap_unload(sc->sc_dmat, sf->sseg_dmap); 2321 1.34 nonaka 2322 1.34 nonaka blkno += len / SDMMC_SECTOR_SIZE; 2323 1.34 nonaka data += len; 2324 1.34 nonaka } 2325 1.34 nonaka 2326 1.34 nonaka return error; 2327 1.34 nonaka } 2328 1.34 nonaka 2329 1.1 nonaka static int 2330 1.34 nonaka sdmmc_mem_write_block_subr(struct sdmmc_function *sf, bus_dmamap_t dmap, 2331 1.34 nonaka uint32_t blkno, u_char *data, size_t datalen) 2332 1.1 nonaka { 2333 1.1 nonaka struct sdmmc_softc *sc = sf->sc; 2334 1.1 nonaka struct sdmmc_command cmd; 2335 1.34 nonaka int error; 2336 1.1 nonaka 2337 1.4 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 2338 1.4 nonaka error = sdmmc_select_card(sc, sf); 2339 1.4 nonaka if (error) 2340 1.4 nonaka goto out; 2341 1.4 nonaka } 2342 1.1 nonaka 2343 1.63 jmcneill const int nblk = howmany(datalen, SDMMC_SECTOR_SIZE); 2344 1.63 jmcneill if (ISSET(sc->sc_flags, SMF_SD_MODE) && nblk > 1) { 2345 1.63 jmcneill /* Set the number of write blocks to be pre-erased */ 2346 1.63 jmcneill memset(&cmd, 0, sizeof(cmd)); 2347 1.63 jmcneill cmd.c_opcode = SD_APP_SET_WR_BLK_ERASE_COUNT; 2348 1.63 jmcneill cmd.c_flags = SCF_RSP_R1 | SCF_RSP_SPI_R1 | SCF_CMD_AC; 2349 1.63 jmcneill cmd.c_arg = nblk; 2350 1.63 jmcneill error = sdmmc_app_command(sc, sf, &cmd); 2351 1.63 jmcneill if (error) 2352 1.63 jmcneill goto out; 2353 1.63 jmcneill } 2354 1.63 jmcneill 2355 1.1 nonaka memset(&cmd, 0, sizeof(cmd)); 2356 1.1 nonaka cmd.c_data = data; 2357 1.1 nonaka cmd.c_datalen = datalen; 2358 1.3 nonaka cmd.c_blklen = SDMMC_SECTOR_SIZE; 2359 1.1 nonaka cmd.c_opcode = (cmd.c_datalen / cmd.c_blklen) > 1 ? 2360 1.1 nonaka MMC_WRITE_BLOCK_MULTIPLE : MMC_WRITE_BLOCK_SINGLE; 2361 1.1 nonaka cmd.c_arg = blkno; 2362 1.1 nonaka if (!ISSET(sf->flags, SFF_SDHC)) 2363 1.3 nonaka cmd.c_arg <<= SDMMC_SECTOR_SIZE_SB; 2364 1.1 nonaka cmd.c_flags = SCF_CMD_ADTC | SCF_RSP_R1; 2365 1.57 jmcneill if (ISSET(sf->flags, SFF_SDHC)) 2366 1.57 jmcneill cmd.c_flags |= SCF_XFER_SDHC; 2367 1.34 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) 2368 1.34 nonaka cmd.c_dmamap = dmap; 2369 1.1 nonaka 2370 1.49 jmcneill sc->sc_ev_xfer.ev_count++; 2371 1.49 jmcneill 2372 1.1 nonaka error = sdmmc_mmc_command(sc, &cmd); 2373 1.49 jmcneill if (error) { 2374 1.49 jmcneill sc->sc_ev_xfer_error.ev_count++; 2375 1.1 nonaka goto out; 2376 1.49 jmcneill } 2377 1.49 jmcneill 2378 1.49 jmcneill const u_int counter = __builtin_ctz(cmd.c_datalen); 2379 1.49 jmcneill if (counter >= 9 && counter <= 16) { 2380 1.49 jmcneill sc->sc_ev_xfer_aligned[counter - 9].ev_count++; 2381 1.49 jmcneill } else { 2382 1.49 jmcneill sc->sc_ev_xfer_unaligned.ev_count++; 2383 1.49 jmcneill } 2384 1.1 nonaka 2385 1.1 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_AUTO_STOP)) { 2386 1.1 nonaka if (cmd.c_opcode == MMC_WRITE_BLOCK_MULTIPLE) { 2387 1.1 nonaka memset(&cmd, 0, sizeof(cmd)); 2388 1.1 nonaka cmd.c_opcode = MMC_STOP_TRANSMISSION; 2389 1.4 nonaka cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1B | SCF_RSP_SPI_R1B; 2390 1.1 nonaka error = sdmmc_mmc_command(sc, &cmd); 2391 1.1 nonaka if (error) 2392 1.1 nonaka goto out; 2393 1.1 nonaka } 2394 1.1 nonaka } 2395 1.1 nonaka 2396 1.4 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 2397 1.4 nonaka do { 2398 1.4 nonaka memset(&cmd, 0, sizeof(cmd)); 2399 1.4 nonaka cmd.c_opcode = MMC_SEND_STATUS; 2400 1.4 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 2401 1.4 nonaka cmd.c_arg = MMC_ARG_RCA(sf->rca); 2402 1.4 nonaka cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1 | SCF_RSP_SPI_R2; 2403 1.4 nonaka error = sdmmc_mmc_command(sc, &cmd); 2404 1.4 nonaka if (error) 2405 1.4 nonaka break; 2406 1.4 nonaka /* XXX time out */ 2407 1.4 nonaka } while (!ISSET(MMC_R1(cmd.c_resp), MMC_R1_READY_FOR_DATA)); 2408 1.4 nonaka } 2409 1.1 nonaka 2410 1.1 nonaka out: 2411 1.1 nonaka return error; 2412 1.1 nonaka } 2413 1.1 nonaka 2414 1.1 nonaka int 2415 1.1 nonaka sdmmc_mem_write_block(struct sdmmc_function *sf, uint32_t blkno, u_char *data, 2416 1.1 nonaka size_t datalen) 2417 1.1 nonaka { 2418 1.1 nonaka struct sdmmc_softc *sc = sf->sc; 2419 1.1 nonaka int error; 2420 1.1 nonaka 2421 1.1 nonaka SDMMC_LOCK(sc); 2422 1.38 mlelstv mutex_enter(&sc->sc_mtx); 2423 1.1 nonaka 2424 1.75 jmcneill if (ISSET(sc->sc_flags, SMF_SD_MODE) && 2425 1.75 jmcneill sdmmc_chip_write_protect(sc->sc_sct, sc->sc_sch)) { 2426 1.1 nonaka aprint_normal_dev(sc->sc_dev, "write-protected\n"); 2427 1.1 nonaka error = EIO; 2428 1.1 nonaka goto out; 2429 1.1 nonaka } 2430 1.1 nonaka 2431 1.4 nonaka if (ISSET(sc->sc_caps, SMC_CAPS_SINGLE_ONLY)) { 2432 1.4 nonaka error = sdmmc_mem_single_write_block(sf, blkno, data, datalen); 2433 1.4 nonaka goto out; 2434 1.4 nonaka } 2435 1.4 nonaka 2436 1.1 nonaka if (!ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 2437 1.34 nonaka error = sdmmc_mem_write_block_subr(sf, sc->sc_dmap, blkno, data, 2438 1.34 nonaka datalen); 2439 1.1 nonaka goto out; 2440 1.1 nonaka } 2441 1.1 nonaka 2442 1.1 nonaka /* DMA transfer */ 2443 1.1 nonaka error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap, data, datalen, NULL, 2444 1.4 nonaka BUS_DMA_NOWAIT|BUS_DMA_WRITE); 2445 1.1 nonaka if (error) 2446 1.1 nonaka goto out; 2447 1.1 nonaka 2448 1.4 nonaka #ifdef SDMMC_DEBUG 2449 1.34 nonaka aprint_normal_dev(sc->sc_dev, "%s: data=%p, datalen=%zu\n", 2450 1.34 nonaka __func__, data, datalen); 2451 1.4 nonaka for (int i = 0; i < sc->sc_dmap->dm_nsegs; i++) { 2452 1.34 nonaka aprint_normal_dev(sc->sc_dev, 2453 1.34 nonaka "%s: seg#%d: addr=%#lx, size=%#lx\n", __func__, i, 2454 1.4 nonaka (u_long)sc->sc_dmap->dm_segs[i].ds_addr, 2455 1.4 nonaka (u_long)sc->sc_dmap->dm_segs[i].ds_len); 2456 1.4 nonaka } 2457 1.4 nonaka #endif 2458 1.4 nonaka 2459 1.34 nonaka if (sc->sc_dmap->dm_nsegs > 1 2460 1.34 nonaka && !ISSET(sc->sc_caps, SMC_CAPS_MULTI_SEG_DMA)) { 2461 1.34 nonaka error = sdmmc_mem_single_segment_dma_write_block(sf, blkno, 2462 1.34 nonaka data, datalen); 2463 1.34 nonaka goto unload; 2464 1.34 nonaka } 2465 1.34 nonaka 2466 1.1 nonaka bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 2467 1.1 nonaka BUS_DMASYNC_PREWRITE); 2468 1.1 nonaka 2469 1.34 nonaka error = sdmmc_mem_write_block_subr(sf, sc->sc_dmap, blkno, data, 2470 1.34 nonaka datalen); 2471 1.1 nonaka if (error) 2472 1.1 nonaka goto unload; 2473 1.1 nonaka 2474 1.1 nonaka bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap, 0, datalen, 2475 1.1 nonaka BUS_DMASYNC_POSTWRITE); 2476 1.1 nonaka unload: 2477 1.1 nonaka bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap); 2478 1.1 nonaka 2479 1.1 nonaka out: 2480 1.38 mlelstv mutex_exit(&sc->sc_mtx); 2481 1.1 nonaka SDMMC_UNLOCK(sc); 2482 1.1 nonaka 2483 1.1 nonaka return error; 2484 1.1 nonaka } 2485 1.58 jmcneill 2486 1.58 jmcneill int 2487 1.62 mlelstv sdmmc_mem_discard(struct sdmmc_function *sf, uint32_t sblkno, uint32_t eblkno) 2488 1.58 jmcneill { 2489 1.58 jmcneill struct sdmmc_softc *sc = sf->sc; 2490 1.58 jmcneill struct sdmmc_command cmd; 2491 1.58 jmcneill int error; 2492 1.58 jmcneill 2493 1.58 jmcneill if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) 2494 1.58 jmcneill return ENODEV; /* XXX not tested */ 2495 1.58 jmcneill 2496 1.62 mlelstv if (eblkno < sblkno) 2497 1.58 jmcneill return EINVAL; 2498 1.58 jmcneill 2499 1.58 jmcneill SDMMC_LOCK(sc); 2500 1.58 jmcneill mutex_enter(&sc->sc_mtx); 2501 1.58 jmcneill 2502 1.58 jmcneill /* Set the address of the first write block to be erased */ 2503 1.58 jmcneill memset(&cmd, 0, sizeof(cmd)); 2504 1.58 jmcneill cmd.c_opcode = ISSET(sc->sc_flags, SMF_SD_MODE) ? 2505 1.58 jmcneill SD_ERASE_WR_BLK_START : MMC_TAG_ERASE_GROUP_START; 2506 1.58 jmcneill cmd.c_arg = sblkno; 2507 1.58 jmcneill if (!ISSET(sf->flags, SFF_SDHC)) 2508 1.58 jmcneill cmd.c_arg <<= SDMMC_SECTOR_SIZE_SB; 2509 1.58 jmcneill cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1; 2510 1.58 jmcneill error = sdmmc_mmc_command(sc, &cmd); 2511 1.58 jmcneill if (error) 2512 1.58 jmcneill goto out; 2513 1.58 jmcneill 2514 1.58 jmcneill /* Set the address of the last write block to be erased */ 2515 1.58 jmcneill memset(&cmd, 0, sizeof(cmd)); 2516 1.58 jmcneill cmd.c_opcode = ISSET(sc->sc_flags, SMF_SD_MODE) ? 2517 1.58 jmcneill SD_ERASE_WR_BLK_END : MMC_TAG_ERASE_GROUP_END; 2518 1.58 jmcneill cmd.c_arg = eblkno; 2519 1.58 jmcneill if (!ISSET(sf->flags, SFF_SDHC)) 2520 1.58 jmcneill cmd.c_arg <<= SDMMC_SECTOR_SIZE_SB; 2521 1.58 jmcneill cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1; 2522 1.58 jmcneill error = sdmmc_mmc_command(sc, &cmd); 2523 1.58 jmcneill if (error) 2524 1.58 jmcneill goto out; 2525 1.58 jmcneill 2526 1.58 jmcneill /* Start the erase operation */ 2527 1.58 jmcneill memset(&cmd, 0, sizeof(cmd)); 2528 1.58 jmcneill cmd.c_opcode = MMC_ERASE; 2529 1.58 jmcneill cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1B; 2530 1.58 jmcneill error = sdmmc_mmc_command(sc, &cmd); 2531 1.58 jmcneill if (error) 2532 1.58 jmcneill goto out; 2533 1.58 jmcneill 2534 1.58 jmcneill out: 2535 1.58 jmcneill mutex_exit(&sc->sc_mtx); 2536 1.58 jmcneill SDMMC_UNLOCK(sc); 2537 1.58 jmcneill 2538 1.58 jmcneill #ifdef SDMMC_DEBUG 2539 1.58 jmcneill device_printf(sc->sc_dev, "discard blk %u-%u error %d\n", 2540 1.58 jmcneill sblkno, eblkno, error); 2541 1.58 jmcneill #endif 2542 1.58 jmcneill 2543 1.58 jmcneill return error; 2544 1.58 jmcneill } 2545 1.61 jmcneill 2546 1.61 jmcneill int 2547 1.61 jmcneill sdmmc_mem_flush_cache(struct sdmmc_function *sf, bool poll) 2548 1.61 jmcneill { 2549 1.61 jmcneill struct sdmmc_softc *sc = sf->sc; 2550 1.61 jmcneill int error; 2551 1.61 jmcneill 2552 1.61 jmcneill if (!ISSET(sf->flags, SFF_CACHE_ENABLED)) 2553 1.61 jmcneill return 0; 2554 1.61 jmcneill 2555 1.61 jmcneill SDMMC_LOCK(sc); 2556 1.61 jmcneill mutex_enter(&sc->sc_mtx); 2557 1.61 jmcneill 2558 1.76 jmcneill if (ISSET(sc->sc_flags, SMF_SD_MODE)) { 2559 1.76 jmcneill KASSERT(sf->ext_sd.pef.valid); 2560 1.76 jmcneill error = sdmmc_mem_write_extr_single(sc, sf, SD_EXTR_MIO_MEM, 2561 1.76 jmcneill sf->ext_sd.pef.fno, 2562 1.76 jmcneill sf->ext_sd.pef.start_addr + SD_PEF_CACHE_FLUSH_OFFSET, 1, 2563 1.76 jmcneill poll); 2564 1.76 jmcneill if (error == 0) { 2565 1.76 jmcneill uint8_t data[512]; 2566 1.76 jmcneill 2567 1.76 jmcneill error = sdmmc_mem_read_extr_single(sc, sf, SD_EXTR_MIO_MEM, 2568 1.76 jmcneill sf->ext_sd.pef.fno, sf->ext_sd.pef.start_addr, 2569 1.76 jmcneill sizeof(data), data); 2570 1.76 jmcneill if (error == 0 && SD_PEF_CACHE_FLUSH(data) != 0) { 2571 1.76 jmcneill device_printf(sc->sc_dev, "cache flush failed\n"); 2572 1.76 jmcneill } 2573 1.76 jmcneill } 2574 1.76 jmcneill } else { 2575 1.76 jmcneill error = sdmmc_mem_mmc_switch(sf, 2576 1.76 jmcneill EXT_CSD_CMD_SET_NORMAL, EXT_CSD_FLUSH_CACHE, 2577 1.76 jmcneill EXT_CSD_FLUSH_CACHE_FLUSH, poll); 2578 1.76 jmcneill } 2579 1.61 jmcneill 2580 1.61 jmcneill mutex_exit(&sc->sc_mtx); 2581 1.61 jmcneill SDMMC_UNLOCK(sc); 2582 1.61 jmcneill 2583 1.61 jmcneill #ifdef SDMMC_DEBUG 2584 1.76 jmcneill device_printf(sc->sc_dev, "flush cache error %d\n", error); 2585 1.61 jmcneill #endif 2586 1.61 jmcneill 2587 1.61 jmcneill return error; 2588 1.61 jmcneill } 2589