rtsx.c revision 1.1 1 /* $NetBSD: rtsx.c,v 1.1 2014/03/19 15:26:41 nonaka Exp $ */
2 /* $OpenBSD: rtsx.c,v 1.7 2013/12/08 18:31:03 stsp Exp $ */
3
4 /*
5 * Copyright (c) 2006 Uwe Stuehler <uwe (at) openbsd.org>
6 * Copyright (c) 2012 Stefan Sperling <stsp (at) openbsd.org>
7 *
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 */
20
21 /*
22 * Realtek RTS5209/RTS5229 Card Reader driver.
23 */
24
25 #include <sys/cdefs.h>
26 __KERNEL_RCSID(0, "$NetBSD: rtsx.c,v 1.1 2014/03/19 15:26:41 nonaka Exp $");
27
28 #include <sys/param.h>
29 #include <sys/device.h>
30 #include <sys/kernel.h>
31 #include <sys/systm.h>
32 #include <sys/proc.h>
33 #include <sys/mutex.h>
34
35 #include <dev/ic/rtsxreg.h>
36 #include <dev/ic/rtsxvar.h>
37
38 #include <dev/sdmmc/sdmmcvar.h>
39 #include <dev/sdmmc/sdmmc_ioreg.h>
40
41 /*
42 * We use two DMA buffers, a command buffer and a data buffer.
43 *
44 * The command buffer contains a command queue for the host controller,
45 * which describes SD/MMC commands to run, and other parameters. The chip
46 * runs the command queue when a special bit in the RTSX_HCBAR register is set
47 * and signals completion with the TRANS_OK interrupt.
48 * Each command is encoded as a 4 byte sequence containing command number
49 * (read, write, or check a host controller register), a register address,
50 * and a data bit-mask and value.
51 *
52 * The data buffer is used to transfer data sectors to or from the SD card.
53 * Data transfer is controlled via the RTSX_HDBAR register. Completion is
54 * also signalled by the TRANS_OK interrupt.
55 *
56 * The chip is unable to perform DMA above 4GB.
57 *
58 * SD/MMC commands which do not transfer any data from/to the card only use
59 * the command buffer.
60 */
61
62 #define RTSX_DMA_MAX_SEGSIZE 0x80000
63 #define RTSX_HOSTCMD_MAX 256
64 #define RTSX_HOSTCMD_BUFSIZE (sizeof(uint32_t) * RTSX_HOSTCMD_MAX)
65 #define RTSX_DMA_DATA_BUFSIZE MAXPHYS
66
67 #define READ4(sc, reg) \
68 (bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, (reg)))
69 #define WRITE4(sc, reg, val) \
70 bus_space_write_4((sc)->sc_iot, (sc)->sc_ioh, (reg), (val))
71
72 #define RTSX_READ(sc, reg, val) \
73 do { \
74 int err = rtsx_read((sc), (reg), (val)); \
75 if (err) \
76 return err; \
77 } while (/*CONSTCOND*/0)
78
79 #define RTSX_WRITE(sc, reg, val) \
80 do { \
81 int err = rtsx_write((sc), (reg), 0xff, (val)); \
82 if (err) \
83 return err; \
84 } while (/*CONSTCOND*/0)
85
86 #define RTSX_CLR(sc, reg, bits) \
87 do { \
88 int err = rtsx_write((sc), (reg), (bits), 0); \
89 if (err) \
90 return err; \
91 } while (/*CONSTCOND*/0)
92
93 #define RTSX_SET(sc, reg, bits) \
94 do { \
95 int err = rtsx_write((sc), (reg), (bits), 0xff);\
96 if (err) \
97 return err; \
98 } while (/*CONSTCOND*/0)
99
100 static int rtsx_host_reset(sdmmc_chipset_handle_t);
101 static uint32_t rtsx_host_ocr(sdmmc_chipset_handle_t);
102 static int rtsx_host_maxblklen(sdmmc_chipset_handle_t);
103 static int rtsx_card_detect(sdmmc_chipset_handle_t);
104 static int rtsx_write_protect(sdmmc_chipset_handle_t);
105 static int rtsx_bus_power(sdmmc_chipset_handle_t, uint32_t);
106 static int rtsx_bus_clock(sdmmc_chipset_handle_t, int);
107 static int rtsx_bus_width(sdmmc_chipset_handle_t, int);
108 static int rtsx_bus_rod(sdmmc_chipset_handle_t, int);
109 static void rtsx_exec_command(sdmmc_chipset_handle_t,
110 struct sdmmc_command *);
111 static int rtsx_init(struct rtsx_softc *, int);
112 static void rtsx_soft_reset(struct rtsx_softc *);
113 static int rtsx_bus_power_off(struct rtsx_softc *);
114 static int rtsx_bus_power_on(struct rtsx_softc *);
115 static int rtsx_set_bus_width(struct rtsx_softc *, int);
116 static int rtsx_stop_sd_clock(struct rtsx_softc *);
117 static int rtsx_switch_sd_clock(struct rtsx_softc *, uint8_t, int, int);
118 static int rtsx_wait_intr(struct rtsx_softc *, int, int);
119 static int rtsx_read(struct rtsx_softc *, uint16_t, uint8_t *);
120 static int rtsx_write(struct rtsx_softc *, uint16_t, uint8_t, uint8_t);
121 #ifdef notyet
122 static int rtsx_read_phy(struct rtsx_softc *, uint8_t, uint16_t *);
123 #endif
124 static int rtsx_write_phy(struct rtsx_softc *, uint8_t, uint16_t);
125 static int rtsx_read_cfg(struct rtsx_softc *, uint8_t, uint16_t,
126 uint32_t *);
127 #ifdef notyet
128 static int rtsx_write_cfg(struct rtsx_softc *, uint8_t, uint16_t, uint32_t,
129 uint32_t);
130 #endif
131 static void rtsx_hostcmd(uint32_t *, int *, uint8_t, uint16_t, uint8_t,
132 uint8_t);
133 static int rtsx_hostcmd_send(struct rtsx_softc *, int);
134 static uint8_t rtsx_response_type(uint16_t);
135 static int rtsx_read_ppbuf(struct rtsx_softc *, struct sdmmc_command *,
136 uint32_t *);
137 static int rtsx_write_ppbuf(struct rtsx_softc *, struct sdmmc_command *,
138 uint32_t *);
139 static int rtsx_exec_short_xfer(struct rtsx_softc *,
140 struct sdmmc_command *, uint32_t *, uint8_t);
141 static int rtsx_xfer(struct rtsx_softc *, struct sdmmc_command *,
142 uint32_t *);
143 static void rtsx_card_insert(struct rtsx_softc *);
144 static void rtsx_card_eject(struct rtsx_softc *);
145 static int rtsx_led_enable(struct rtsx_softc *);
146 static int rtsx_led_disable(struct rtsx_softc *);
147 static void rtsx_save_regs(struct rtsx_softc *);
148 static void rtsx_restore_regs(struct rtsx_softc *);
149
150 #ifdef RTSX_DEBUG
151 int rtsxdebug = 0;
152 #define DPRINTF(n,s) do { if ((n) <= rtsxdebug) printf s; } while (0)
153 #else
154 #define DPRINTF(n,s) /**/
155 #endif
156
157 #define DEVNAME(sc) SDMMCDEVNAME(sc)
158
159 static struct sdmmc_chip_functions rtsx_chip_functions = {
160 /* host controller reset */
161 .host_reset = rtsx_host_reset,
162
163 /* host controller capabilities */
164 .host_ocr = rtsx_host_ocr,
165 .host_maxblklen = rtsx_host_maxblklen,
166
167 /* card detection */
168 .card_detect = rtsx_card_detect,
169
170 /* write protect */
171 .write_protect = rtsx_write_protect,
172
173 /* bus power, clock frequency, width and ROD(OpenDrain/PushPull) */
174 .bus_power = rtsx_bus_power,
175 .bus_clock = rtsx_bus_clock,
176 .bus_width = rtsx_bus_width,
177 .bus_rod = rtsx_bus_rod,
178
179 /* command execution */
180 .exec_command = rtsx_exec_command,
181
182 /* card interrupt */
183 .card_enable_intr = NULL,
184 .card_intr_ack = NULL,
185 };
186
187 /*
188 * Called by attachment driver.
189 */
190 int
191 rtsx_attach(struct rtsx_softc *sc, bus_space_tag_t iot,
192 bus_space_handle_t ioh, bus_size_t iosize, bus_dma_tag_t dmat, int flags)
193 {
194 struct sdmmcbus_attach_args saa;
195 uint32_t sdio_cfg;
196
197 sc->sc_iot = iot;
198 sc->sc_ioh = ioh;
199 sc->sc_iosize = iosize;
200 sc->sc_dmat = dmat;
201 sc->sc_flags = flags;
202
203 mutex_init(&sc->sc_host_mtx, MUTEX_DEFAULT, IPL_SDMMC);
204 mutex_init(&sc->sc_intr_mtx, MUTEX_DEFAULT, IPL_SDMMC);
205 cv_init(&sc->sc_intr_cv, "rtsxintr");
206
207 if (rtsx_init(sc, 1))
208 goto error;
209
210 if (rtsx_read_cfg(sc, 0, RTSX_SDIOCFG_REG, &sdio_cfg) == 0) {
211 if (sdio_cfg & (RTSX_SDIOCFG_SDIO_ONLY|RTSX_SDIOCFG_HAVE_SDIO)){
212 sc->sc_flags |= RTSX_F_SDIO_SUPPORT;
213 }
214 }
215
216 if (bus_dmamap_create(sc->sc_dmat, RTSX_HOSTCMD_BUFSIZE, 1,
217 RTSX_DMA_MAX_SEGSIZE, 0, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, &sc->sc_dmap_cmd) != 0)
218 goto error;
219
220 /*
221 * Attach the generic SD/MMC bus driver. (The bus driver must
222 * not invoke any chipset functions before it is attached.)
223 */
224 memset(&saa, 0, sizeof(saa));
225 saa.saa_busname = "sdmmc";
226 saa.saa_sct = &rtsx_chip_functions;
227 saa.saa_spi_sct = NULL;
228 saa.saa_sch = sc;
229 saa.saa_dmat = sc->sc_dmat;
230 saa.saa_clkmin = SDMMC_SDCLK_400K;
231 saa.saa_clkmax = 25000;
232 saa.saa_caps = SMC_CAPS_DMA|SMC_CAPS_4BIT_MODE;
233
234 sc->sc_sdmmc = config_found(sc->sc_dev, &saa, NULL);
235 if (sc->sc_sdmmc == NULL)
236 goto destroy_dmamap_cmd;
237
238 /* Now handle cards discovered during attachment. */
239 if (ISSET(sc->sc_flags, RTSX_F_CARD_PRESENT))
240 rtsx_card_insert(sc);
241
242 return 0;
243
244 destroy_dmamap_cmd:
245 bus_dmamap_destroy(sc->sc_dmat, sc->sc_dmap_cmd);
246 error:
247 cv_destroy(&sc->sc_intr_cv);
248 mutex_destroy(&sc->sc_intr_mtx);
249 mutex_destroy(&sc->sc_host_mtx);
250 return 1;
251 }
252
253 int
254 rtsx_detach(struct rtsx_softc *sc, int flags)
255 {
256 int rv;
257
258 if (sc->sc_sdmmc != NULL) {
259 rv = config_detach(sc->sc_sdmmc, flags);
260 if (rv != 0)
261 return rv;
262 sc->sc_sdmmc = NULL;
263 }
264
265 /* disable interrupts */
266 if ((flags & DETACH_FORCE) == 0) {
267 WRITE4(sc, RTSX_BIER, 0);
268 rtsx_soft_reset(sc);
269 }
270
271 bus_dmamap_destroy(sc->sc_dmat, sc->sc_dmap_cmd);
272 cv_destroy(&sc->sc_intr_cv);
273 mutex_destroy(&sc->sc_intr_mtx);
274 mutex_destroy(&sc->sc_host_mtx);
275 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_iosize);
276
277 return 0;
278 }
279
280 bool
281 rtsx_suspend(device_t dev, const pmf_qual_t *qual)
282 {
283 struct rtsx_softc *sc = device_private(dev);
284
285 /* Save the host controller state. */
286 rtsx_save_regs(sc);
287
288 return true;
289 }
290
291 bool
292 rtsx_resume(device_t dev, const pmf_qual_t *qual)
293 {
294 struct rtsx_softc *sc = device_private(dev);
295
296 /* Restore the host controller state. */
297 rtsx_restore_regs(sc);
298
299 if (READ4(sc, RTSX_BIPR) & RTSX_SD_EXIST)
300 rtsx_card_insert(sc);
301 else
302 rtsx_card_eject(sc);
303
304 return true;
305 }
306
307 bool
308 rtsx_shutdown(device_t dev, int flags)
309 {
310 struct rtsx_softc *sc = device_private(dev);
311
312 /* XXX chip locks up if we don't disable it before reboot. */
313 (void)rtsx_host_reset(sc);
314
315 return true;
316 }
317
318 static int
319 rtsx_init(struct rtsx_softc *sc, int attaching)
320 {
321 uint32_t status;
322 uint8_t ver;
323 int error;
324
325 /* Read IC version from dummy register. */
326 if (sc->sc_flags & RTSX_F_5229) {
327 RTSX_READ(sc, RTSX_DUMMY_REG, &ver);
328 switch (ver & 0x0f) {
329 case RTSX_IC_VERSION_A:
330 case RTSX_IC_VERSION_B:
331 case RTSX_IC_VERSION_D:
332 break;
333 case RTSX_IC_VERSION_C:
334 sc->sc_flags |= RTSX_F_5229_TYPE_C;
335 break;
336 default:
337 aprint_error_dev(sc->sc_dev, "unknown ic %02x\n", ver);
338 return 1;
339 }
340 }
341
342 /* Enable interrupt write-clear (default is read-clear). */
343 RTSX_CLR(sc, RTSX_NFTS_TX_CTRL, RTSX_INT_READ_CLR);
344
345 /* Clear any pending interrupts. */
346 status = READ4(sc, RTSX_BIPR);
347 WRITE4(sc, RTSX_BIPR, status);
348
349 /* Check for cards already inserted at attach time. */
350 if (attaching && (status & RTSX_SD_EXIST))
351 sc->sc_flags |= RTSX_F_CARD_PRESENT;
352
353 /* Enable interrupts. */
354 WRITE4(sc, RTSX_BIER,
355 RTSX_TRANS_OK_INT_EN | RTSX_TRANS_FAIL_INT_EN | RTSX_SD_INT_EN);
356
357 /* Power on SSC clock. */
358 RTSX_CLR(sc, RTSX_FPDCTL, RTSX_SSC_POWER_DOWN);
359 delay(200);
360
361 /* XXX magic numbers from linux driver */
362 if (sc->sc_flags & RTSX_F_5209)
363 error = rtsx_write_phy(sc, 0x00, 0xB966);
364 else
365 error = rtsx_write_phy(sc, 0x00, 0xBA42);
366 if (error) {
367 aprint_error_dev(sc->sc_dev, "couldn't write phy register\n");
368 return 1;
369 }
370
371 RTSX_SET(sc, RTSX_CLK_DIV, 0x07);
372
373 /* Disable sleep mode. */
374 RTSX_CLR(sc, RTSX_HOST_SLEEP_STATE,
375 RTSX_HOST_ENTER_S1 | RTSX_HOST_ENTER_S3);
376
377 /* Disable card clock. */
378 RTSX_CLR(sc, RTSX_CARD_CLK_EN, RTSX_CARD_CLK_EN_ALL);
379
380 RTSX_CLR(sc, RTSX_CHANGE_LINK_STATE,
381 RTSX_FORCE_RST_CORE_EN | RTSX_NON_STICKY_RST_N_DBG | 0x04);
382 RTSX_WRITE(sc, RTSX_SD30_DRIVE_SEL, RTSX_SD30_DRIVE_SEL_3V3);
383
384 /* Enable SSC clock. */
385 RTSX_WRITE(sc, RTSX_SSC_CTL1, RTSX_SSC_8X_EN | RTSX_SSC_SEL_4M);
386 RTSX_WRITE(sc, RTSX_SSC_CTL2, 0x12);
387
388 RTSX_SET(sc, RTSX_CHANGE_LINK_STATE, RTSX_MAC_PHY_RST_N_DBG);
389 RTSX_SET(sc, RTSX_IRQSTAT0, RTSX_LINK_READY_INT);
390
391 RTSX_WRITE(sc, RTSX_PERST_GLITCH_WIDTH, 0x80);
392
393 /* Set RC oscillator to 400K. */
394 RTSX_CLR(sc, RTSX_RCCTL, RTSX_RCCTL_F_2M);
395
396 /* Request clock by driving CLKREQ pin to zero. */
397 RTSX_SET(sc, RTSX_PETXCFG, RTSX_PETXCFG_CLKREQ_PIN);
398
399 /* Set up LED GPIO. */
400 if (sc->sc_flags & RTSX_F_5209) {
401 RTSX_WRITE(sc, RTSX_CARD_GPIO, 0x03);
402 RTSX_WRITE(sc, RTSX_CARD_GPIO_DIR, 0x03);
403 } else {
404 RTSX_SET(sc, RTSX_GPIO_CTL, RTSX_GPIO_LED_ON);
405 /* Switch LDO3318 source from DV33 to 3V3. */
406 RTSX_CLR(sc, RTSX_LDO_PWR_SEL, RTSX_LDO_PWR_SEL_DV33);
407 RTSX_SET(sc, RTSX_LDO_PWR_SEL, RTSX_LDO_PWR_SEL_3V3);
408 /* Set default OLT blink period. */
409 RTSX_SET(sc, RTSX_OLT_LED_CTL, RTSX_OLT_LED_PERIOD);
410 }
411
412 return 0;
413 }
414
415 int
416 rtsx_led_enable(struct rtsx_softc *sc)
417 {
418
419 if (sc->sc_flags & RTSX_F_5209) {
420 RTSX_CLR(sc, RTSX_CARD_GPIO, RTSX_CARD_GPIO_LED_OFF);
421 RTSX_WRITE(sc, RTSX_CARD_AUTO_BLINK,
422 RTSX_LED_BLINK_EN | RTSX_LED_BLINK_SPEED);
423 } else {
424 RTSX_SET(sc, RTSX_GPIO_CTL, RTSX_GPIO_LED_ON);
425 RTSX_SET(sc, RTSX_OLT_LED_CTL, RTSX_OLT_LED_AUTOBLINK);
426 }
427
428 return 0;
429 }
430
431 int
432 rtsx_led_disable(struct rtsx_softc *sc)
433 {
434
435 if (sc->sc_flags & RTSX_F_5209) {
436 RTSX_CLR(sc, RTSX_CARD_AUTO_BLINK, RTSX_LED_BLINK_EN);
437 RTSX_WRITE(sc, RTSX_CARD_GPIO, RTSX_CARD_GPIO_LED_OFF);
438 } else {
439 RTSX_CLR(sc, RTSX_OLT_LED_CTL, RTSX_OLT_LED_AUTOBLINK);
440 RTSX_CLR(sc, RTSX_GPIO_CTL, RTSX_GPIO_LED_ON);
441 }
442
443 return 0;
444 }
445
446 /*
447 * Reset the host controller. Called during initialization, when
448 * cards are removed, upon resume, and during error recovery.
449 */
450 int
451 rtsx_host_reset(sdmmc_chipset_handle_t sch)
452 {
453 struct rtsx_softc *sc = sch;
454 int error;
455
456 DPRINTF(1,("%s: host reset\n", DEVNAME(sc)));
457
458 mutex_enter(&sc->sc_host_mtx);
459
460 if (ISSET(sc->sc_flags, RTSX_F_CARD_PRESENT))
461 rtsx_soft_reset(sc);
462
463 error = rtsx_init(sc, 0);
464
465 mutex_exit(&sc->sc_host_mtx);
466
467 return error;
468 }
469
470 static uint32_t
471 rtsx_host_ocr(sdmmc_chipset_handle_t sch)
472 {
473
474 return RTSX_SUPPORT_VOLTAGE;
475 }
476
477 static int
478 rtsx_host_maxblklen(sdmmc_chipset_handle_t sch)
479 {
480
481 return 512;
482 }
483
484 /*
485 * Return non-zero if the card is currently inserted.
486 */
487 static int
488 rtsx_card_detect(sdmmc_chipset_handle_t sch)
489 {
490 struct rtsx_softc *sc = sch;
491
492 return ISSET(sc->sc_flags, RTSX_F_CARD_PRESENT);
493 }
494
495 static int
496 rtsx_write_protect(sdmmc_chipset_handle_t sch)
497 {
498
499 return 0; /* XXX */
500 }
501
502 /*
503 * Notice that the meaning of RTSX_PWR_GATE_CTRL changes between RTS5209 and
504 * RTS5229. In RTS5209 it is a mask of disabled power gates, while in RTS5229
505 * it is a mask of *enabled* gates.
506 */
507
508 static int
509 rtsx_bus_power_off(struct rtsx_softc *sc)
510 {
511 int error;
512 uint8_t disable3;
513
514 error = rtsx_stop_sd_clock(sc);
515 if (error)
516 return error;
517
518 /* Disable SD output. */
519 RTSX_CLR(sc, RTSX_CARD_OE, RTSX_CARD_OUTPUT_EN);
520
521 /* Turn off power. */
522 disable3 = RTSX_PULL_CTL_DISABLE3;
523 if (sc->sc_flags & RTSX_F_5209)
524 RTSX_SET(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_OFF);
525 else {
526 RTSX_CLR(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_VCC1 |
527 RTSX_LDO3318_VCC2);
528 if (sc->sc_flags & RTSX_F_5229_TYPE_C)
529 disable3 = RTSX_PULL_CTL_DISABLE3_TYPE_C;
530 }
531
532 RTSX_SET(sc, RTSX_CARD_PWR_CTL, RTSX_SD_PWR_OFF);
533 RTSX_CLR(sc, RTSX_CARD_PWR_CTL, RTSX_PMOS_STRG_800mA);
534
535 /* Disable pull control. */
536 RTSX_WRITE(sc, RTSX_CARD_PULL_CTL1, RTSX_PULL_CTL_DISABLE12);
537 RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, RTSX_PULL_CTL_DISABLE12);
538 RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, disable3);
539
540 return 0;
541 }
542
543 static int
544 rtsx_bus_power_on(struct rtsx_softc *sc)
545 {
546 uint8_t enable3;
547
548 /* Select SD card. */
549 RTSX_WRITE(sc, RTSX_CARD_SELECT, RTSX_SD_MOD_SEL);
550 RTSX_WRITE(sc, RTSX_CARD_SHARE_MODE, RTSX_CARD_SHARE_48_SD);
551 RTSX_SET(sc, RTSX_CARD_CLK_EN, RTSX_SD_CLK_EN);
552
553 /* Enable pull control. */
554 RTSX_WRITE(sc, RTSX_CARD_PULL_CTL1, RTSX_PULL_CTL_ENABLE12);
555 RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, RTSX_PULL_CTL_ENABLE12);
556 if (sc->sc_flags & RTSX_F_5229_TYPE_C)
557 enable3 = RTSX_PULL_CTL_ENABLE3_TYPE_C;
558 else
559 enable3 = RTSX_PULL_CTL_ENABLE3;
560 RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, enable3);
561
562 /*
563 * To avoid a current peak, enable card power in two phases with a
564 * delay in between.
565 */
566
567 /* Partial power. */
568 RTSX_SET(sc, RTSX_CARD_PWR_CTL, RTSX_SD_PARTIAL_PWR_ON);
569 if (sc->sc_flags & RTSX_F_5209)
570 RTSX_SET(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_SUSPEND);
571 else
572 RTSX_SET(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_VCC1);
573
574 delay(200);
575
576 /* Full power. */
577 RTSX_CLR(sc, RTSX_CARD_PWR_CTL, RTSX_SD_PWR_OFF);
578 if (sc->sc_flags & RTSX_F_5209)
579 RTSX_CLR(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_OFF);
580 else
581 RTSX_SET(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_VCC2);
582
583 /* Enable SD card output. */
584 RTSX_WRITE(sc, RTSX_CARD_OE, RTSX_SD_OUTPUT_EN);
585
586 return 0;
587 }
588
589 static int
590 rtsx_set_bus_width(struct rtsx_softc *sc, int width)
591 {
592 uint32_t bus_width;
593
594 DPRINTF(1,("%s: bus width=%d\n", DEVNAME(sc), width));
595
596 switch (width) {
597 case 8:
598 bus_width = RTSX_BUS_WIDTH_8;
599 break;
600 case 4:
601 bus_width = RTSX_BUS_WIDTH_4;
602 break;
603 case 1:
604 bus_width = RTSX_BUS_WIDTH_1;
605 break;
606 default:
607 return EINVAL;
608 }
609
610 if (bus_width == RTSX_BUS_WIDTH_1)
611 RTSX_CLR(sc, RTSX_SD_CFG1, RTSX_BUS_WIDTH_MASK);
612 else
613 RTSX_SET(sc, RTSX_SD_CFG1, bus_width);
614
615 return 0;
616 }
617
618 static int
619 rtsx_stop_sd_clock(struct rtsx_softc *sc)
620 {
621
622 RTSX_CLR(sc, RTSX_CARD_CLK_EN, RTSX_CARD_CLK_EN_ALL);
623 RTSX_SET(sc, RTSX_SD_BUS_STAT, RTSX_SD_CLK_FORCE_STOP);
624
625 return 0;
626 }
627
628 static int
629 rtsx_switch_sd_clock(struct rtsx_softc *sc, uint8_t n, int div, int mcu)
630 {
631
632 /* Enable SD 2.0 mode. */
633 RTSX_CLR(sc, RTSX_SD_CFG1, RTSX_SD_MODE_MASK);
634
635 RTSX_SET(sc, RTSX_CLK_CTL, RTSX_CLK_LOW_FREQ);
636
637 RTSX_WRITE(sc, RTSX_CARD_CLK_SOURCE,
638 RTSX_CRC_FIX_CLK | RTSX_SD30_VAR_CLK0 | RTSX_SAMPLE_VAR_CLK1);
639 RTSX_CLR(sc, RTSX_SD_SAMPLE_POINT_CTL, RTSX_SD20_RX_SEL_MASK);
640 RTSX_WRITE(sc, RTSX_SD_PUSH_POINT_CTL, RTSX_SD20_TX_NEG_EDGE);
641 RTSX_WRITE(sc, RTSX_CLK_DIV, (div << 4) | mcu);
642 RTSX_CLR(sc, RTSX_SSC_CTL1, RTSX_RSTB);
643 RTSX_CLR(sc, RTSX_SSC_CTL2, RTSX_SSC_DEPTH_MASK);
644 RTSX_WRITE(sc, RTSX_SSC_DIV_N_0, n);
645 RTSX_SET(sc, RTSX_SSC_CTL1, RTSX_RSTB);
646 delay(100);
647
648 RTSX_CLR(sc, RTSX_CLK_CTL, RTSX_CLK_LOW_FREQ);
649
650 return 0;
651 }
652
653 /*
654 * Set or change SD bus voltage and enable or disable SD bus power.
655 * Return zero on success.
656 */
657 static int
658 rtsx_bus_power(sdmmc_chipset_handle_t sch, uint32_t ocr)
659 {
660 struct rtsx_softc *sc = sch;
661 int error = 0;
662
663 DPRINTF(1,("%s: voltage change ocr=0x%x\n", DEVNAME(sc), ocr));
664
665 mutex_enter(&sc->sc_host_mtx);
666
667 /*
668 * Disable bus power before voltage change.
669 */
670 error = rtsx_bus_power_off(sc);
671 if (error)
672 goto ret;
673
674 delay(200);
675
676 /* If power is disabled, reset the host and return now. */
677 if (ocr == 0) {
678 mutex_exit(&sc->sc_host_mtx);
679 (void)rtsx_host_reset(sc);
680 return 0;
681 }
682
683 if (!ISSET(ocr, RTSX_SUPPORT_VOLTAGE)) {
684 /* Unsupported voltage level requested. */
685 DPRINTF(1,("%s: unsupported voltage ocr=0x%x\n",
686 DEVNAME(sc), ocr));
687 error = EINVAL;
688 goto ret;
689 }
690
691 error = rtsx_set_bus_width(sc, 1);
692 if (error)
693 goto ret;
694
695 error = rtsx_bus_power_on(sc);
696 ret:
697 mutex_exit(&sc->sc_host_mtx);
698
699 return error;
700 }
701
702 /*
703 * Set or change SDCLK frequency or disable the SD clock.
704 * Return zero on success.
705 */
706 static int
707 rtsx_bus_clock(sdmmc_chipset_handle_t sch, int freq)
708 {
709 struct rtsx_softc *sc = sch;
710 uint8_t n;
711 int div;
712 int mcu;
713 int error = 0;
714
715 DPRINTF(1,("%s: bus clock change freq=%d\n", DEVNAME(sc), freq));
716
717 mutex_enter(&sc->sc_host_mtx);
718
719 if (freq == SDMMC_SDCLK_OFF) {
720 error = rtsx_stop_sd_clock(sc);
721 goto ret;
722 }
723
724 /*
725 * Configure the clock frequency.
726 */
727 switch (freq) {
728 case SDMMC_SDCLK_400K:
729 n = 80; /* minimum */
730 div = RTSX_CLK_DIV_8;
731 mcu = 7;
732 RTSX_SET(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_128);
733 break;
734 case 20000:
735 n = 80;
736 div = RTSX_CLK_DIV_4;
737 mcu = 7;
738 RTSX_CLR(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK);
739 break;
740 case 25000:
741 n = 100;
742 div = RTSX_CLK_DIV_4;
743 mcu = 7;
744 RTSX_CLR(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK);
745 break;
746 case 30000:
747 n = 120;
748 div = RTSX_CLK_DIV_4;
749 mcu = 7;
750 RTSX_CLR(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK);
751 break;
752 case 40000:
753 n = 80;
754 div = RTSX_CLK_DIV_2;
755 mcu = 7;
756 RTSX_CLR(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK);
757 break;
758 case 50000:
759 n = 100;
760 div = RTSX_CLK_DIV_2;
761 mcu = 6;
762 RTSX_CLR(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK);
763 break;
764 default:
765 error = EINVAL;
766 goto ret;
767 }
768
769 /*
770 * Enable SD clock.
771 */
772 error = rtsx_switch_sd_clock(sc, n, div, mcu);
773 ret:
774 mutex_exit(&sc->sc_host_mtx);
775
776 return error;
777 }
778
779 static int
780 rtsx_bus_width(sdmmc_chipset_handle_t sch, int width)
781 {
782 struct rtsx_softc *sc = sch;
783
784 return rtsx_set_bus_width(sc, width);
785 }
786
787 static int
788 rtsx_bus_rod(sdmmc_chipset_handle_t sch, int on)
789 {
790
791 /* Not support */
792 return -1;
793 }
794
795 static int
796 rtsx_read(struct rtsx_softc *sc, uint16_t addr, uint8_t *val)
797 {
798 int tries = 1024;
799 uint32_t reg;
800
801 WRITE4(sc, RTSX_HAIMR, RTSX_HAIMR_BUSY |
802 (uint32_t)((addr & 0x3FFF) << 16));
803
804 while (tries--) {
805 reg = READ4(sc, RTSX_HAIMR);
806 if (!(reg & RTSX_HAIMR_BUSY))
807 break;
808 }
809
810 *val = (reg & 0xff);
811 return (tries == 0) ? ETIMEDOUT : 0;
812 }
813
814 static int
815 rtsx_write(struct rtsx_softc *sc, uint16_t addr, uint8_t mask, uint8_t val)
816 {
817 int tries = 1024;
818 uint32_t reg;
819
820 WRITE4(sc, RTSX_HAIMR,
821 RTSX_HAIMR_BUSY | RTSX_HAIMR_WRITE |
822 (uint32_t)(((addr & 0x3FFF) << 16) |
823 (mask << 8) | val));
824
825 while (tries--) {
826 reg = READ4(sc, RTSX_HAIMR);
827 if (!(reg & RTSX_HAIMR_BUSY)) {
828 if (val != (reg & 0xff))
829 return EIO;
830 return 0;
831 }
832 }
833 return ETIMEDOUT;
834 }
835
836 #ifdef notyet
837 static int
838 rtsx_read_phy(struct rtsx_softc *sc, uint8_t addr, uint16_t *val)
839 {
840 int timeout = 100000;
841 uint8_t data0;
842 uint8_t data1;
843 uint8_t rwctl;
844
845 RTSX_WRITE(sc, RTSX_PHY_ADDR, addr);
846 RTSX_WRITE(sc, RTSX_PHY_RWCTL, RTSX_PHY_BUSY|RTSX_PHY_READ);
847
848 while (timeout--) {
849 RTSX_READ(sc, RTSX_PHY_RWCTL, &rwctl);
850 if (!(rwctl & RTSX_PHY_BUSY))
851 break;
852 }
853 if (timeout == 0)
854 return ETIMEDOUT;
855
856 RTSX_READ(sc, RTSX_PHY_DATA0, &data0);
857 RTSX_READ(sc, RTSX_PHY_DATA1, &data1);
858 *val = data0 | (data1 << 8);
859
860 return 0;
861 }
862 #endif
863
864 static int
865 rtsx_write_phy(struct rtsx_softc *sc, uint8_t addr, uint16_t val)
866 {
867 int timeout = 100000;
868 uint8_t rwctl;
869
870 RTSX_WRITE(sc, RTSX_PHY_DATA0, val);
871 RTSX_WRITE(sc, RTSX_PHY_DATA1, val >> 8);
872 RTSX_WRITE(sc, RTSX_PHY_ADDR, addr);
873 RTSX_WRITE(sc, RTSX_PHY_RWCTL, RTSX_PHY_BUSY|RTSX_PHY_WRITE);
874
875 while (timeout--) {
876 RTSX_READ(sc, RTSX_PHY_RWCTL, &rwctl);
877 if (!(rwctl & RTSX_PHY_BUSY))
878 break;
879 }
880 if (timeout == 0)
881 return ETIMEDOUT;
882
883 return 0;
884 }
885
886 static int
887 rtsx_read_cfg(struct rtsx_softc *sc, uint8_t func, uint16_t addr, uint32_t *val)
888 {
889 int tries = 1024;
890 uint8_t data0, data1, data2, data3, rwctl;
891
892 RTSX_WRITE(sc, RTSX_CFGADDR0, addr);
893 RTSX_WRITE(sc, RTSX_CFGADDR1, addr >> 8);
894 RTSX_WRITE(sc, RTSX_CFGRWCTL, RTSX_CFG_BUSY | (func & 0x03 << 4));
895
896 while (tries--) {
897 RTSX_READ(sc, RTSX_CFGRWCTL, &rwctl);
898 if (!(rwctl & RTSX_CFG_BUSY))
899 break;
900 }
901 if (tries == 0)
902 return EIO;
903
904 RTSX_READ(sc, RTSX_CFGDATA0, &data0);
905 RTSX_READ(sc, RTSX_CFGDATA1, &data1);
906 RTSX_READ(sc, RTSX_CFGDATA2, &data2);
907 RTSX_READ(sc, RTSX_CFGDATA3, &data3);
908 *val = (data3 << 24) | (data2 << 16) | (data1 << 8) | data0;
909
910 return 0;
911 }
912
913 #ifdef notyet
914 static int
915 rtsx_write_cfg(struct rtsx_softc *sc, uint8_t func, uint16_t addr,
916 uint32_t mask, uint32_t val)
917 {
918 uint32_t writemask = 0;
919 int i, tries = 1024;
920 uint8_t rwctl;
921
922 for (i = 0; i < 4; i++) {
923 if (mask & 0xff) {
924 RTSX_WRITE(sc, RTSX_CFGDATA0 + i, val & mask & 0xff);
925 writemask |= (1 << i);
926 }
927 mask >>= 8;
928 val >>= 8;
929 }
930
931 if (writemask) {
932 RTSX_WRITE(sc, RTSX_CFGADDR0, addr);
933 RTSX_WRITE(sc, RTSX_CFGADDR1, addr >> 8);
934 RTSX_WRITE(sc, RTSX_CFGRWCTL,
935 RTSX_CFG_BUSY | writemask | (func & 0x03 << 4));
936 }
937
938 while (tries--) {
939 RTSX_READ(sc, RTSX_CFGRWCTL, &rwctl);
940 if (!(rwctl & RTSX_CFG_BUSY))
941 break;
942 }
943 if (tries == 0)
944 return EIO;
945
946 return 0;
947 }
948 #endif
949
950 /* Append a properly encoded host command to the host command buffer. */
951 static void
952 rtsx_hostcmd(uint32_t *cmdbuf, int *n, uint8_t cmd, uint16_t reg,
953 uint8_t mask, uint8_t data)
954 {
955
956 KASSERT(*n < RTSX_HOSTCMD_MAX);
957
958 cmdbuf[(*n)++] = htole32((uint32_t)(cmd & 0x3) << 30) |
959 ((uint32_t)(reg & 0x3fff) << 16) |
960 ((uint32_t)(mask) << 8) |
961 ((uint32_t)data);
962 }
963
964 static void
965 rtsx_save_regs(struct rtsx_softc *sc)
966 {
967 int i;
968 uint16_t reg;
969
970 mutex_enter(&sc->sc_host_mtx);
971
972 i = 0;
973 for (reg = 0xFDA0; reg < 0xFDAE; reg++)
974 (void)rtsx_read(sc, reg, &sc->sc_regs[i++]);
975 for (reg = 0xFD52; reg < 0xFD69; reg++)
976 (void)rtsx_read(sc, reg, &sc->sc_regs[i++]);
977 for (reg = 0xFE20; reg < 0xFE34; reg++)
978 (void)rtsx_read(sc, reg, &sc->sc_regs[i++]);
979
980 sc->sc_regs4[0] = READ4(sc, RTSX_HCBAR);
981 sc->sc_regs4[1] = READ4(sc, RTSX_HCBCTLR);
982 sc->sc_regs4[2] = READ4(sc, RTSX_HDBAR);
983 sc->sc_regs4[3] = READ4(sc, RTSX_HDBCTLR);
984 sc->sc_regs4[4] = READ4(sc, RTSX_HAIMR);
985 sc->sc_regs4[5] = READ4(sc, RTSX_BIER);
986 /* Not saving RTSX_BIPR. */
987
988 mutex_exit(&sc->sc_host_mtx);
989 }
990
991 static void
992 rtsx_restore_regs(struct rtsx_softc *sc)
993 {
994 int i;
995 uint16_t reg;
996
997 mutex_enter(&sc->sc_host_mtx);
998
999 WRITE4(sc, RTSX_HCBAR, sc->sc_regs4[0]);
1000 WRITE4(sc, RTSX_HCBCTLR, sc->sc_regs4[1]);
1001 WRITE4(sc, RTSX_HDBAR, sc->sc_regs4[2]);
1002 WRITE4(sc, RTSX_HDBCTLR, sc->sc_regs4[3]);
1003 WRITE4(sc, RTSX_HAIMR, sc->sc_regs4[4]);
1004 WRITE4(sc, RTSX_BIER, sc->sc_regs4[5]);
1005 /* Not writing RTSX_BIPR since doing so would clear it. */
1006
1007 i = 0;
1008 for (reg = 0xFDA0; reg < 0xFDAE; reg++)
1009 (void)rtsx_write(sc, reg, 0xff, sc->sc_regs[i++]);
1010 for (reg = 0xFD52; reg < 0xFD69; reg++)
1011 (void)rtsx_write(sc, reg, 0xff, sc->sc_regs[i++]);
1012 for (reg = 0xFE20; reg < 0xFE34; reg++)
1013 (void)rtsx_write(sc, reg, 0xff, sc->sc_regs[i++]);
1014
1015 mutex_exit(&sc->sc_host_mtx);
1016 }
1017
1018 static uint8_t
1019 rtsx_response_type(uint16_t sdmmc_rsp)
1020 {
1021 static const struct rsp_type {
1022 uint16_t sdmmc_rsp;
1023 uint8_t rtsx_rsp;
1024 } rsp_types[] = {
1025 { SCF_RSP_R0, RTSX_SD_RSP_TYPE_R0 },
1026 { SCF_RSP_R1, RTSX_SD_RSP_TYPE_R1 },
1027 { SCF_RSP_R1B, RTSX_SD_RSP_TYPE_R1B },
1028 { SCF_RSP_R2, RTSX_SD_RSP_TYPE_R2 },
1029 { SCF_RSP_R3, RTSX_SD_RSP_TYPE_R3 },
1030 { SCF_RSP_R4, RTSX_SD_RSP_TYPE_R4 },
1031 { SCF_RSP_R5, RTSX_SD_RSP_TYPE_R5 },
1032 { SCF_RSP_R6, RTSX_SD_RSP_TYPE_R6 },
1033 { SCF_RSP_R7, RTSX_SD_RSP_TYPE_R7 }
1034 };
1035 size_t i;
1036
1037 for (i = 0; i < __arraycount(rsp_types); i++) {
1038 if (sdmmc_rsp == rsp_types[i].sdmmc_rsp)
1039 return rsp_types[i].rtsx_rsp;
1040 }
1041 return 0;
1042 }
1043
1044 static int
1045 rtsx_hostcmd_send(struct rtsx_softc *sc, int ncmd)
1046 {
1047
1048 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap_cmd, 0, RTSX_HOSTCMD_BUFSIZE,
1049 BUS_DMASYNC_PREWRITE);
1050
1051 mutex_enter(&sc->sc_host_mtx);
1052
1053 /* Tell the chip where the command buffer is and run the commands. */
1054 WRITE4(sc, RTSX_HCBAR, sc->sc_dmap_cmd->dm_segs[0].ds_addr);
1055 WRITE4(sc, RTSX_HCBCTLR,
1056 ((ncmd * 4) & 0x00ffffff) | RTSX_START_CMD | RTSX_HW_AUTO_RSP);
1057
1058 mutex_exit(&sc->sc_host_mtx);
1059
1060 return 0;
1061 }
1062
1063 static int
1064 rtsx_read_ppbuf(struct rtsx_softc *sc, struct sdmmc_command *cmd,
1065 uint32_t *cmdbuf)
1066 {
1067 uint8_t *ptr;
1068 int ncmd, remain;
1069 uint16_t reg;
1070 int error;
1071 int i, j;
1072
1073 DPRINTF(3,("%s: read %d bytes from ppbuf2\n", DEVNAME(sc),
1074 cmd->c_datalen));
1075
1076 reg = RTSX_PPBUF_BASE2;
1077 ptr = cmd->c_data;
1078 remain = cmd->c_datalen;
1079 for (j = 0; j < cmd->c_datalen / RTSX_HOSTCMD_MAX; j++) {
1080 ncmd = 0;
1081 for (i = 0; i < RTSX_HOSTCMD_MAX; i++) {
1082 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_READ_REG_CMD, reg++,
1083 0, 0);
1084 }
1085 error = rtsx_hostcmd_send(sc, ncmd);
1086 if (error == 0)
1087 error = rtsx_wait_intr(sc, RTSX_TRANS_OK_INT, hz / 4);
1088 if (error)
1089 goto ret;
1090 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap_cmd, 0,
1091 RTSX_HOSTCMD_BUFSIZE, BUS_DMASYNC_POSTREAD);
1092 memcpy(ptr, cmdbuf, RTSX_HOSTCMD_MAX);
1093 ptr += RTSX_HOSTCMD_MAX;
1094 remain -= RTSX_HOSTCMD_MAX;
1095 }
1096 if (remain > 0) {
1097 ncmd = 0;
1098 for (i = 0; i < remain; i++) {
1099 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_READ_REG_CMD, reg++,
1100 0, 0);
1101 }
1102 error = rtsx_hostcmd_send(sc, ncmd);
1103 if (error == 0)
1104 error = rtsx_wait_intr(sc, RTSX_TRANS_OK_INT, hz / 4);
1105 if (error)
1106 goto ret;
1107 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap_cmd, 0,
1108 RTSX_HOSTCMD_BUFSIZE, BUS_DMASYNC_POSTREAD);
1109 memcpy(ptr, cmdbuf, remain);
1110 }
1111 ret:
1112 return error;
1113 }
1114
1115 static int
1116 rtsx_write_ppbuf(struct rtsx_softc *sc, struct sdmmc_command *cmd,
1117 uint32_t *cmdbuf)
1118 {
1119 const uint8_t *ptr;
1120 int ncmd, remain;
1121 uint16_t reg;
1122 int error;
1123 int i, j;
1124
1125 DPRINTF(3,("%s: write %d bytes to ppbuf2\n", DEVNAME(sc),
1126 cmd->c_datalen));
1127
1128 reg = RTSX_PPBUF_BASE2;
1129 ptr = cmd->c_data;
1130 remain = cmd->c_datalen;
1131 for (j = 0; j < cmd->c_datalen / RTSX_HOSTCMD_MAX; j++) {
1132 ncmd = 0;
1133 for (i = 0; i < RTSX_HOSTCMD_MAX; i++) {
1134 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, reg++,
1135 0xff, *ptr++);
1136 }
1137 error = rtsx_hostcmd_send(sc, ncmd);
1138 if (error == 0)
1139 error = rtsx_wait_intr(sc, RTSX_TRANS_OK_INT, hz / 4);
1140 if (error)
1141 goto ret;
1142 remain -= RTSX_HOSTCMD_MAX;
1143 }
1144 if (remain > 0) {
1145 ncmd = 0;
1146 for (i = 0; i < remain; i++) {
1147 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, reg++,
1148 0xff, *ptr++);
1149 }
1150 error = rtsx_hostcmd_send(sc, ncmd);
1151 if (error == 0)
1152 error = rtsx_wait_intr(sc, RTSX_TRANS_OK_INT, hz / 4);
1153 if (error)
1154 goto ret;
1155 }
1156 ret:
1157 return error;
1158 }
1159
1160 static int
1161 rtsx_exec_short_xfer(struct rtsx_softc *sc, struct sdmmc_command *cmd,
1162 uint32_t *cmdbuf, uint8_t rsp_type)
1163 {
1164 int read = ISSET(cmd->c_flags, SCF_CMD_READ);
1165 int ncmd;
1166 uint8_t tmode = read ? RTSX_TM_NORMAL_READ : RTSX_TM_AUTO_WRITE2;
1167 int error;
1168
1169 DPRINTF(3,("%s: %s short xfer: %d bytes with block size %d\n",
1170 DEVNAME(sc), read ? "read" : "write", cmd->c_datalen,
1171 cmd->c_blklen));
1172
1173 if (cmd->c_datalen > 512) {
1174 DPRINTF(3, ("%s: cmd->c_datalen too large: %d > %d\n",
1175 DEVNAME(sc), cmd->c_datalen, 512));
1176 return ENOMEM;
1177 }
1178
1179 if (!read && cmd->c_data != NULL && cmd->c_datalen > 0) {
1180 error = rtsx_write_ppbuf(sc, cmd, cmdbuf);
1181 if (error)
1182 goto ret;
1183 }
1184
1185 /* The command buffer queues commands the host controller will
1186 * run asynchronously. */
1187 ncmd = 0;
1188
1189 /* Queue commands to set SD command index and argument. */
1190 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_CMD0,
1191 0xff, 0x40 | cmd->c_opcode);
1192 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_CMD1,
1193 0xff, cmd->c_arg >> 24);
1194 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_CMD2,
1195 0xff, cmd->c_arg >> 16);
1196 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_CMD3,
1197 0xff, cmd->c_arg >> 8);
1198 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_CMD4,
1199 0xff, cmd->c_arg);
1200
1201 /* Queue commands to configure data transfer size. */
1202 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_BYTE_CNT_L,
1203 0xff, cmd->c_datalen);
1204 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_BYTE_CNT_H,
1205 0xff, cmd->c_datalen >> 8);
1206 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_BLOCK_CNT_L,
1207 0xff, 0x01);
1208 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_BLOCK_CNT_H,
1209 0xff, 0x00);
1210
1211 /* Queue command to set response type. */
1212 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_CFG2,
1213 0xff, rsp_type);
1214
1215 if (tmode == RTSX_TM_NORMAL_READ) {
1216 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD,
1217 RTSX_CARD_DATA_SOURCE, 0x01, RTSX_PINGPONG_BUFFER);
1218 }
1219
1220 /* Queue commands to perform SD transfer. */
1221 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_TRANSFER,
1222 0xff, tmode | RTSX_SD_TRANSFER_START);
1223 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_CHECK_REG_CMD, RTSX_SD_TRANSFER,
1224 RTSX_SD_TRANSFER_END, RTSX_SD_TRANSFER_END);
1225
1226 /* Run the command queue and wait for completion. */
1227 error = rtsx_hostcmd_send(sc, ncmd);
1228 if (error == 0)
1229 error = rtsx_wait_intr(sc, RTSX_TRANS_OK_INT, 2 * hz);
1230 if (error)
1231 goto ret;
1232
1233 if (read && cmd->c_data != NULL && cmd->c_datalen > 0)
1234 error = rtsx_read_ppbuf(sc, cmd, cmdbuf);
1235 ret:
1236 DPRINTF(3,("%s: short xfer done, error=%d\n", DEVNAME(sc), error));
1237 return error;
1238 }
1239
1240 static int
1241 rtsx_xfer(struct rtsx_softc *sc, struct sdmmc_command *cmd, uint32_t *cmdbuf)
1242 {
1243 int ncmd, dma_dir, error, tmode;
1244 int read = ISSET(cmd->c_flags, SCF_CMD_READ);
1245 uint8_t cfg2;
1246
1247 DPRINTF(3,("%s: %s xfer: %d bytes with block size %d\n", DEVNAME(sc),
1248 read ? "read" : "write", cmd->c_datalen, cmd->c_blklen));
1249
1250 if (cmd->c_datalen > RTSX_DMA_DATA_BUFSIZE) {
1251 DPRINTF(3, ("%s: cmd->c_datalen too large: %d > %d\n",
1252 DEVNAME(sc), cmd->c_datalen, RTSX_DMA_DATA_BUFSIZE));
1253 return ENOMEM;
1254 }
1255
1256 /* Configure DMA transfer mode parameters. */
1257 cfg2 = RTSX_SD_NO_CHECK_WAIT_CRC_TO | RTSX_SD_CHECK_CRC16 |
1258 RTSX_SD_NO_WAIT_BUSY_END | RTSX_SD_RSP_LEN_0;
1259 if (read) {
1260 dma_dir = RTSX_DMA_DIR_FROM_CARD;
1261 /* Use transfer mode AUTO_READ3, which assumes we've already
1262 * sent the read command and gotten the response, and will
1263 * send CMD 12 manually after reading multiple blocks. */
1264 tmode = RTSX_TM_AUTO_READ3;
1265 cfg2 |= RTSX_SD_CALCULATE_CRC7 | RTSX_SD_CHECK_CRC7;
1266 } else {
1267 dma_dir = RTSX_DMA_DIR_TO_CARD;
1268 /* Use transfer mode AUTO_WRITE3, which assumes we've already
1269 * sent the write command and gotten the response, and will
1270 * send CMD 12 manually after writing multiple blocks. */
1271 tmode = RTSX_TM_AUTO_WRITE3;
1272 cfg2 |= RTSX_SD_NO_CALCULATE_CRC7 | RTSX_SD_NO_CHECK_CRC7;
1273 }
1274
1275 /* The command buffer queues commands the host controller will
1276 * run asynchronously. */
1277 ncmd = 0;
1278
1279 /* Queue command to set response type. */
1280 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_CFG2,
1281 0xff, cfg2);
1282
1283 /* Queue commands to configure data transfer size. */
1284 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_BYTE_CNT_L,
1285 0xff, 0x00);
1286 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_BYTE_CNT_H,
1287 0xff, 0x02);
1288 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_BLOCK_CNT_L,
1289 0xff, cmd->c_datalen / cmd->c_blklen);
1290 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_BLOCK_CNT_H,
1291 0xff, (cmd->c_datalen / cmd->c_blklen) >> 8);
1292
1293 /* Use the DMA ring buffer for commands which transfer data. */
1294 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_CARD_DATA_SOURCE,
1295 0x01, RTSX_RING_BUFFER);
1296
1297 /* Configure DMA controller. */
1298 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_IRQSTAT0,
1299 RTSX_DMA_DONE_INT, RTSX_DMA_DONE_INT);
1300 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_DMATC3,
1301 0xff, cmd->c_datalen >> 24);
1302 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_DMATC2,
1303 0xff, cmd->c_datalen >> 16);
1304 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_DMATC1,
1305 0xff, cmd->c_datalen >> 8);
1306 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_DMATC0,
1307 0xff, cmd->c_datalen);
1308 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_DMACTL,
1309 RTSX_DMA_EN | RTSX_DMA_DIR | RTSX_DMA_PACK_SIZE_MASK,
1310 RTSX_DMA_EN | dma_dir | RTSX_DMA_512);
1311
1312 /* Queue commands to perform SD transfer. */
1313 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_TRANSFER,
1314 0xff, tmode | RTSX_SD_TRANSFER_START);
1315 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_CHECK_REG_CMD, RTSX_SD_TRANSFER,
1316 RTSX_SD_TRANSFER_END, RTSX_SD_TRANSFER_END);
1317
1318 error = rtsx_hostcmd_send(sc, ncmd);
1319 if (error)
1320 goto ret;
1321
1322 mutex_enter(&sc->sc_host_mtx);
1323
1324 /* Tell the chip where the data buffer is and run the transfer. */
1325 WRITE4(sc, RTSX_HDBAR, cmd->c_dmamap->dm_segs[0].ds_addr);
1326 WRITE4(sc, RTSX_HDBCTLR, RTSX_TRIG_DMA | (read ? RTSX_DMA_READ : 0) |
1327 (cmd->c_dmamap->dm_segs[0].ds_len & 0x00ffffff));
1328
1329 mutex_exit(&sc->sc_host_mtx);
1330
1331 /* Wait for completion. */
1332 error = rtsx_wait_intr(sc, RTSX_TRANS_OK_INT, 10*hz);
1333 ret:
1334 DPRINTF(3,("%s: xfer done, error=%d\n", DEVNAME(sc), error));
1335 return error;
1336 }
1337
1338 static void
1339 rtsx_exec_command(sdmmc_chipset_handle_t sch, struct sdmmc_command *cmd)
1340 {
1341 struct rtsx_softc *sc = sch;
1342 bus_dma_segment_t segs[1];
1343 int rsegs;
1344 void *cmdkvap;
1345 uint32_t *cmdbuf;
1346 uint8_t rsp_type;
1347 uint16_t r;
1348 int ncmd;
1349 int error = 0;
1350
1351 DPRINTF(3,("%s: executing cmd %hu\n", DEVNAME(sc), cmd->c_opcode));
1352
1353 /* Refuse SDIO probe if the chip doesn't support SDIO. */
1354 if (cmd->c_opcode == SD_IO_SEND_OP_COND &&
1355 !ISSET(sc->sc_flags, RTSX_F_SDIO_SUPPORT)) {
1356 error = ENOTSUP;
1357 goto ret;
1358 }
1359
1360 rsp_type = rtsx_response_type(cmd->c_flags & SCF_RSP_MASK);
1361 if (rsp_type == 0) {
1362 aprint_error_dev(sc->sc_dev, "unknown response type 0x%x\n",
1363 cmd->c_flags & SCF_RSP_MASK);
1364 error = EINVAL;
1365 goto ret;
1366 }
1367
1368 /* Allocate and map the host command buffer. */
1369 error = bus_dmamem_alloc(sc->sc_dmat, RTSX_HOSTCMD_BUFSIZE, 0, 0,
1370 segs, 1, &rsegs, BUS_DMA_WAITOK);
1371 if (error)
1372 goto ret;
1373 error = bus_dmamem_map(sc->sc_dmat, segs, rsegs, RTSX_HOSTCMD_BUFSIZE,
1374 &cmdkvap, BUS_DMA_WAITOK|BUS_DMA_COHERENT);
1375 if (error)
1376 goto free_cmdbuf;
1377
1378 /* Load command DMA buffer. */
1379 error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmap_cmd, cmdkvap,
1380 RTSX_HOSTCMD_BUFSIZE, NULL, BUS_DMA_WAITOK);
1381 if (error)
1382 goto unmap_cmdbuf;
1383
1384 /* Use another transfer method when data size < 512. */
1385 if (cmd->c_data != NULL && cmd->c_datalen < 512) {
1386 error = rtsx_exec_short_xfer(sch, cmd, cmdkvap, rsp_type);
1387 goto unload_cmdbuf;
1388 }
1389
1390 /* The command buffer queues commands the host controller will
1391 * run asynchronously. */
1392 cmdbuf = cmdkvap;
1393 ncmd = 0;
1394
1395 /* Queue commands to set SD command index and argument. */
1396 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_CMD0,
1397 0xff, 0x40 | cmd->c_opcode);
1398 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_CMD1,
1399 0xff, cmd->c_arg >> 24);
1400 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_CMD2,
1401 0xff, cmd->c_arg >> 16);
1402 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_CMD3,
1403 0xff, cmd->c_arg >> 8);
1404 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_CMD4,
1405 0xff, cmd->c_arg);
1406
1407 /* Queue command to set response type. */
1408 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_CFG2,
1409 0xff, rsp_type);
1410
1411 /* Use the ping-pong buffer for commands which do not transfer data. */
1412 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_CARD_DATA_SOURCE,
1413 0x01, RTSX_PINGPONG_BUFFER);
1414
1415 /* Queue commands to perform SD transfer. */
1416 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_TRANSFER,
1417 0xff, RTSX_TM_CMD_RSP | RTSX_SD_TRANSFER_START);
1418 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_CHECK_REG_CMD, RTSX_SD_TRANSFER,
1419 RTSX_SD_TRANSFER_END | RTSX_SD_STAT_IDLE,
1420 RTSX_SD_TRANSFER_END | RTSX_SD_STAT_IDLE);
1421
1422 /* Queue commands to read back card status response.*/
1423 if (rsp_type == RTSX_SD_RSP_TYPE_R2) {
1424 for (r = RTSX_PPBUF_BASE2 + 15; r > RTSX_PPBUF_BASE2; r--)
1425 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_READ_REG_CMD, r, 0, 0);
1426 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_READ_REG_CMD, RTSX_SD_CMD5,
1427 0, 0);
1428 } else if (rsp_type != RTSX_SD_RSP_TYPE_R0) {
1429 for (r = RTSX_SD_CMD0; r <= RTSX_SD_CMD4; r++)
1430 rtsx_hostcmd(cmdbuf, &ncmd, RTSX_READ_REG_CMD, r, 0, 0);
1431 }
1432
1433 /* Run the command queue and wait for completion. */
1434 error = rtsx_hostcmd_send(sc, ncmd);
1435 if (error == 0)
1436 error = rtsx_wait_intr(sc, RTSX_TRANS_OK_INT, hz);
1437 if (error)
1438 goto unload_cmdbuf;
1439
1440 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmap_cmd, 0, RTSX_HOSTCMD_BUFSIZE,
1441 BUS_DMASYNC_POSTREAD);
1442
1443 /* Copy card response into sdmmc response buffer. */
1444 if (ISSET(cmd->c_flags, SCF_RSP_PRESENT)) {
1445 /* Copy bytes like sdhc(4), which on little-endian uses
1446 * different byte order for short and long responses... */
1447 if (ISSET(cmd->c_flags, SCF_RSP_136)) {
1448 uint8_t *resp = cmdkvap;
1449 memcpy(cmd->c_resp, resp + 1, sizeof(cmd->c_resp));
1450 } else {
1451 /* First byte is CHECK_REG_CMD return value, second
1452 * one is the command op code -- we skip those. */
1453 cmd->c_resp[0] =
1454 ((be32toh(cmdbuf[0]) & 0x0000ffff) << 16) |
1455 ((be32toh(cmdbuf[1]) & 0xffff0000) >> 16);
1456 }
1457 }
1458
1459 if (cmd->c_data) {
1460 error = rtsx_xfer(sc, cmd, cmdbuf);
1461 if (error) {
1462 uint8_t stat1;
1463 if (rtsx_read(sc, RTSX_SD_STAT1, &stat1) == 0 &&
1464 (stat1 & RTSX_SD_CRC_ERR)) {
1465 aprint_error_dev(sc->sc_dev,
1466 "CRC error (stat=0x%x)\n", stat1);
1467 }
1468 }
1469 }
1470
1471 unload_cmdbuf:
1472 bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap_cmd);
1473 unmap_cmdbuf:
1474 bus_dmamem_unmap(sc->sc_dmat, cmdkvap, RTSX_HOSTCMD_BUFSIZE);
1475 free_cmdbuf:
1476 bus_dmamem_free(sc->sc_dmat, segs, rsegs);
1477 ret:
1478 SET(cmd->c_flags, SCF_ITSDONE);
1479 cmd->c_error = error;
1480 }
1481
1482 /* Prepare for another command. */
1483 static void
1484 rtsx_soft_reset(struct rtsx_softc *sc)
1485 {
1486
1487 DPRINTF(1,("%s: soft reset\n", DEVNAME(sc)));
1488
1489 /* Stop command transfer. */
1490 WRITE4(sc, RTSX_HCBCTLR, RTSX_STOP_CMD);
1491
1492 (void)rtsx_write(sc, RTSX_CARD_STOP, RTSX_SD_STOP|RTSX_SD_CLR_ERR,
1493 RTSX_SD_STOP|RTSX_SD_CLR_ERR);
1494
1495 /* Stop DMA transfer. */
1496 WRITE4(sc, RTSX_HDBCTLR, RTSX_STOP_DMA);
1497 (void)rtsx_write(sc, RTSX_DMACTL, RTSX_DMA_RST, RTSX_DMA_RST);
1498
1499 (void)rtsx_write(sc, RTSX_RBCTL, RTSX_RB_FLUSH, RTSX_RB_FLUSH);
1500 }
1501
1502 static int
1503 rtsx_wait_intr(struct rtsx_softc *sc, int mask, int timo)
1504 {
1505 int status;
1506 int error = 0;
1507
1508 mask |= RTSX_TRANS_FAIL_INT;
1509
1510 mutex_enter(&sc->sc_intr_mtx);
1511
1512 status = sc->sc_intr_status & mask;
1513 while (status == 0) {
1514 if (cv_timedwait(&sc->sc_intr_cv, &sc->sc_intr_mtx, timo)
1515 == EWOULDBLOCK) {
1516 rtsx_soft_reset(sc);
1517 error = ETIMEDOUT;
1518 break;
1519 }
1520 status = sc->sc_intr_status & mask;
1521 }
1522 sc->sc_intr_status &= ~status;
1523
1524 /* Has the card disappeared? */
1525 if (!ISSET(sc->sc_flags, RTSX_F_CARD_PRESENT))
1526 error = ENODEV;
1527
1528 mutex_exit(&sc->sc_intr_mtx);
1529
1530 if (error == 0 && (status & RTSX_TRANS_FAIL_INT))
1531 error = EIO;
1532 return error;
1533 }
1534
1535 static void
1536 rtsx_card_insert(struct rtsx_softc *sc)
1537 {
1538
1539 DPRINTF(1, ("%s: card inserted\n", DEVNAME(sc)));
1540
1541 sc->sc_flags |= RTSX_F_CARD_PRESENT;
1542 (void)rtsx_led_enable(sc);
1543
1544 /* Schedule card discovery task. */
1545 sdmmc_needs_discover(sc->sc_sdmmc);
1546 }
1547
1548 static void
1549 rtsx_card_eject(struct rtsx_softc *sc)
1550 {
1551
1552 DPRINTF(1, ("%s: card ejected\n", DEVNAME(sc)));
1553
1554 sc->sc_flags &= ~RTSX_F_CARD_PRESENT;
1555 (void)rtsx_led_disable(sc);
1556
1557 /* Schedule card discovery task. */
1558 sdmmc_needs_discover(sc->sc_sdmmc);
1559 }
1560
1561 /*
1562 * Established by attachment driver at interrupt priority IPL_SDMMC.
1563 */
1564 int
1565 rtsx_intr(void *arg)
1566 {
1567 struct rtsx_softc *sc = arg;
1568 uint32_t enabled, status;
1569
1570 enabled = READ4(sc, RTSX_BIER);
1571 status = READ4(sc, RTSX_BIPR);
1572
1573 /* Ack interrupts. */
1574 WRITE4(sc, RTSX_BIPR, status);
1575
1576 if (((enabled & status) == 0) || status == 0xffffffff)
1577 return 0;
1578
1579 mutex_enter(&sc->sc_intr_mtx);
1580
1581 if (status & RTSX_SD_INT) {
1582 if (status & RTSX_SD_EXIST) {
1583 if (!ISSET(sc->sc_flags, RTSX_F_CARD_PRESENT))
1584 rtsx_card_insert(sc);
1585 } else {
1586 rtsx_card_eject(sc);
1587 }
1588 }
1589
1590 if (status & (RTSX_TRANS_OK_INT | RTSX_TRANS_FAIL_INT)) {
1591 sc->sc_intr_status |= status;
1592 cv_broadcast(&sc->sc_intr_cv);
1593 }
1594
1595 mutex_exit(&sc->sc_intr_mtx);
1596
1597 return 1;
1598 }
1599