2 * Copyright (c) 2014 Ruslan Bukin <br@bsdpad.com>
5 * This software was developed by SRI International and the University of
6 * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
7 * ("CTSRD"), as part of the DARPA CRASH research programme.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * Synopsys DesignWare Mobile Storage Host Controller
33 * Chapter 14, Altera Cyclone V Device Handbook (CV-5V2 2014.07.22)
36 #include <sys/cdefs.h>
37 __FBSDID("$FreeBSD$");
39 #include <sys/param.h>
40 #include <sys/systm.h>
42 #include <sys/kernel.h>
44 #include <sys/module.h>
45 #include <sys/malloc.h>
46 #include <sys/mutex.h>
49 #include <dev/mmc/bridge.h>
50 #include <dev/mmc/mmcbrvar.h>
52 #include <dev/fdt/fdt_common.h>
53 #include <dev/ofw/openfirm.h>
54 #include <dev/ofw/ofw_bus.h>
55 #include <dev/ofw/ofw_bus_subr.h>
57 #include <machine/bus.h>
58 #include <machine/cpu.h>
59 #include <machine/intr.h>
62 #include <dev/extres/clk/clk.h>
65 #include <dev/mmc/host/dwmmc_reg.h>
66 #include <dev/mmc/host/dwmmc_var.h>
68 #include "opt_mmccam.h"
72 #define dprintf(x, arg...)
74 #define READ4(_sc, _reg) \
75 bus_read_4((_sc)->res[0], _reg)
76 #define WRITE4(_sc, _reg, _val) \
77 bus_write_4((_sc)->res[0], _reg, _val)
79 #define DIV_ROUND_UP(n, d) howmany(n, d)
81 #define DWMMC_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
82 #define DWMMC_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
83 #define DWMMC_LOCK_INIT(_sc) \
84 mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->dev), \
86 #define DWMMC_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx);
87 #define DWMMC_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED);
88 #define DWMMC_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED);
90 #define PENDING_CMD 0x01
91 #define PENDING_STOP 0x02
92 #define CARD_INIT_DONE 0x04
94 #define DWMMC_DATA_ERR_FLAGS (SDMMC_INTMASK_DRT | SDMMC_INTMASK_DCRC \
95 |SDMMC_INTMASK_HTO | SDMMC_INTMASK_SBE \
97 #define DWMMC_CMD_ERR_FLAGS (SDMMC_INTMASK_RTO | SDMMC_INTMASK_RCRC \
99 #define DWMMC_ERR_FLAGS (DWMMC_DATA_ERR_FLAGS | DWMMC_CMD_ERR_FLAGS \
102 #define DES0_DIC (1 << 1)
103 #define DES0_LD (1 << 2)
104 #define DES0_FS (1 << 3)
105 #define DES0_CH (1 << 4)
106 #define DES0_ER (1 << 5)
107 #define DES0_CES (1 << 30)
108 #define DES0_OWN (1 << 31)
110 #define DES1_BS1_MASK 0xfff
111 #define DES1_BS1_SHIFT 0
114 uint32_t des0; /* control */
115 uint32_t des1; /* bufsize */
116 uint32_t des2; /* buf1 phys addr */
117 uint32_t des3; /* buf2 phys addr or next descr */
121 #define DESC_SIZE (sizeof(struct idmac_desc) * DESC_MAX)
122 #define DEF_MSIZE 0x2 /* Burst size of multiple transaction */
124 static void dwmmc_next_operation(struct dwmmc_softc *);
125 static int dwmmc_setup_bus(struct dwmmc_softc *, int);
126 static int dma_done(struct dwmmc_softc *, struct mmc_command *);
127 static int dma_stop(struct dwmmc_softc *);
128 static void pio_read(struct dwmmc_softc *, struct mmc_command *);
129 static void pio_write(struct dwmmc_softc *, struct mmc_command *);
131 static struct resource_spec dwmmc_spec[] = {
132 { SYS_RES_MEMORY, 0, RF_ACTIVE },
133 { SYS_RES_IRQ, 0, RF_ACTIVE },
137 #define HWTYPE_MASK (0x0000ffff)
138 #define HWFLAG_MASK (0xffff << 16)
141 dwmmc_get1paddr(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
146 *(bus_addr_t *)arg = segs[0].ds_addr;
150 dwmmc_ring_setup(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
152 struct dwmmc_softc *sc;
160 dprintf("nsegs %d seg0len %lu\n", nsegs, segs[0].ds_len);
162 for (idx = 0; idx < nsegs; idx++) {
163 sc->desc_ring[idx].des0 = (DES0_OWN | DES0_DIC | DES0_CH);
164 sc->desc_ring[idx].des1 = segs[idx].ds_len;
165 sc->desc_ring[idx].des2 = segs[idx].ds_addr;
168 sc->desc_ring[idx].des0 |= DES0_FS;
170 if (idx == (nsegs - 1)) {
171 sc->desc_ring[idx].des0 &= ~(DES0_DIC | DES0_CH);
172 sc->desc_ring[idx].des0 |= DES0_LD;
178 dwmmc_ctrl_reset(struct dwmmc_softc *sc, int reset_bits)
183 reg = READ4(sc, SDMMC_CTRL);
185 WRITE4(sc, SDMMC_CTRL, reg);
187 /* Wait reset done */
188 for (i = 0; i < 100; i++) {
189 if (!(READ4(sc, SDMMC_CTRL) & reset_bits))
194 device_printf(sc->dev, "Reset failed\n");
200 dma_setup(struct dwmmc_softc *sc)
207 * Set up TX descriptor ring, descriptors, and dma maps.
209 error = bus_dma_tag_create(
210 bus_get_dma_tag(sc->dev), /* Parent tag. */
211 4096, 0, /* alignment, boundary */
212 BUS_SPACE_MAXADDR_32BIT, /* lowaddr */
213 BUS_SPACE_MAXADDR, /* highaddr */
214 NULL, NULL, /* filter, filterarg */
215 DESC_SIZE, 1, /* maxsize, nsegments */
216 DESC_SIZE, /* maxsegsize */
218 NULL, NULL, /* lockfunc, lockarg */
221 device_printf(sc->dev,
222 "could not create ring DMA tag.\n");
226 error = bus_dmamem_alloc(sc->desc_tag, (void**)&sc->desc_ring,
227 BUS_DMA_COHERENT | BUS_DMA_WAITOK | BUS_DMA_ZERO,
230 device_printf(sc->dev,
231 "could not allocate descriptor ring.\n");
235 error = bus_dmamap_load(sc->desc_tag, sc->desc_map,
236 sc->desc_ring, DESC_SIZE, dwmmc_get1paddr,
237 &sc->desc_ring_paddr, 0);
239 device_printf(sc->dev,
240 "could not load descriptor ring map.\n");
244 for (idx = 0; idx < sc->desc_count; idx++) {
245 sc->desc_ring[idx].des0 = DES0_CH;
246 sc->desc_ring[idx].des1 = 0;
247 nidx = (idx + 1) % sc->desc_count;
248 sc->desc_ring[idx].des3 = sc->desc_ring_paddr + \
249 (nidx * sizeof(struct idmac_desc));
252 error = bus_dma_tag_create(
253 bus_get_dma_tag(sc->dev), /* Parent tag. */
254 4096, 0, /* alignment, boundary */
255 BUS_SPACE_MAXADDR_32BIT, /* lowaddr */
256 BUS_SPACE_MAXADDR, /* highaddr */
257 NULL, NULL, /* filter, filterarg */
258 sc->desc_count * MMC_SECTOR_SIZE, /* maxsize */
259 sc->desc_count, /* nsegments */
260 MMC_SECTOR_SIZE, /* maxsegsize */
262 NULL, NULL, /* lockfunc, lockarg */
265 device_printf(sc->dev,
266 "could not create ring DMA tag.\n");
270 error = bus_dmamap_create(sc->buf_tag, 0,
273 device_printf(sc->dev,
274 "could not create TX buffer DMA map.\n");
282 dwmmc_cmd_done(struct dwmmc_softc *sc)
284 struct mmc_command *cmd;
290 if (cmd->flags & MMC_RSP_PRESENT) {
291 if (cmd->flags & MMC_RSP_136) {
292 cmd->resp[3] = READ4(sc, SDMMC_RESP0);
293 cmd->resp[2] = READ4(sc, SDMMC_RESP1);
294 cmd->resp[1] = READ4(sc, SDMMC_RESP2);
295 cmd->resp[0] = READ4(sc, SDMMC_RESP3);
300 cmd->resp[0] = READ4(sc, SDMMC_RESP0);
306 dwmmc_tasklet(struct dwmmc_softc *sc)
308 struct mmc_command *cmd;
317 if (cmd->error != MMC_ERR_NONE || !cmd->data) {
318 dwmmc_next_operation(sc);
319 } else if (cmd->data && sc->dto_rcvd) {
320 if ((cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK ||
321 cmd->opcode == MMC_READ_MULTIPLE_BLOCK) &&
324 dwmmc_next_operation(sc);
326 dwmmc_next_operation(sc);
332 dwmmc_intr(void *arg)
334 struct mmc_command *cmd;
335 struct dwmmc_softc *sc;
344 /* First handle SDMMC controller interrupts */
345 reg = READ4(sc, SDMMC_MINTSTS);
347 dprintf("%s 0x%08x\n", __func__, reg);
349 if (reg & DWMMC_CMD_ERR_FLAGS) {
350 dprintf("cmd err 0x%08x cmd 0x%08x\n",
352 cmd->error = MMC_ERR_TIMEOUT;
355 if (reg & DWMMC_DATA_ERR_FLAGS) {
356 dprintf("data err 0x%08x cmd 0x%08x\n",
358 cmd->error = MMC_ERR_FAILED;
365 if (reg & SDMMC_INTMASK_CMD_DONE) {
370 if (reg & SDMMC_INTMASK_ACD)
373 if (reg & SDMMC_INTMASK_DTO)
376 if (reg & SDMMC_INTMASK_CD) {
377 /* XXX: Handle card detect */
382 WRITE4(sc, SDMMC_RINTSTS, reg);
385 if (reg & (SDMMC_INTMASK_RXDR|SDMMC_INTMASK_DTO)) {
388 if (reg & (SDMMC_INTMASK_TXDR|SDMMC_INTMASK_DTO)) {
392 /* Now handle DMA interrupts */
393 reg = READ4(sc, SDMMC_IDSTS);
395 dprintf("dma intr 0x%08x\n", reg);
396 if (reg & (SDMMC_IDINTEN_TI | SDMMC_IDINTEN_RI)) {
397 WRITE4(sc, SDMMC_IDSTS, (SDMMC_IDINTEN_TI |
399 WRITE4(sc, SDMMC_IDSTS, SDMMC_IDINTEN_NI);
411 parse_fdt(struct dwmmc_softc *sc)
413 pcell_t dts_value[3];
415 uint32_t bus_hz = 0, bus_width;
421 if ((node = ofw_bus_get_node(sc->dev)) == -1)
425 if (OF_getencprop(node, "bus-width", &bus_width, sizeof(uint32_t)) <= 0)
428 sc->host.caps |= MMC_CAP_4_BIT_DATA;
430 sc->host.caps |= MMC_CAP_8_BIT_DATA;
433 if (OF_getencprop(node, "max-frequency", &sc->max_hz, sizeof(uint32_t)) <= 0)
434 sc->max_hz = 200000000;
437 if ((len = OF_getproplen(node, "fifo-depth")) > 0) {
438 OF_getencprop(node, "fifo-depth", dts_value, len);
439 sc->fifo_depth = dts_value[0];
442 /* num-slots (Deprecated) */
444 if ((len = OF_getproplen(node, "num-slots")) > 0) {
445 device_printf(sc->dev, "num-slots property is deprecated\n");
446 OF_getencprop(node, "num-slots", dts_value, len);
447 sc->num_slots = dts_value[0];
450 /* clock-frequency */
451 if ((len = OF_getproplen(node, "clock-frequency")) > 0) {
452 OF_getencprop(node, "clock-frequency", dts_value, len);
453 bus_hz = dts_value[0];
457 /* BIU (Bus Interface Unit clock) is optional */
458 error = clk_get_by_ofw_name(sc->dev, 0, "biu", &sc->biu);
460 error = clk_enable(sc->biu);
462 device_printf(sc->dev, "cannot enable biu clock\n");
468 * CIU (Controller Interface Unit clock) is mandatory
469 * if no clock-frequency property is given
471 error = clk_get_by_ofw_name(sc->dev, 0, "ciu", &sc->ciu);
473 error = clk_enable(sc->ciu);
475 device_printf(sc->dev, "cannot enable ciu clock\n");
479 error = clk_set_freq(sc->ciu, bus_hz, 0);
481 device_printf(sc->dev,
482 "cannot set ciu clock to %u\n", bus_hz);
484 clk_get_freq(sc->ciu, &sc->bus_hz);
486 #endif /* EXT_RESOURCES */
488 if (sc->bus_hz == 0) {
489 device_printf(sc->dev, "No bus speed provided\n");
500 dwmmc_attach(device_t dev)
502 struct dwmmc_softc *sc;
506 sc = device_get_softc(dev);
510 /* Why not to use Auto Stop? It save a hundred of irq per second */
511 sc->use_auto_stop = 1;
513 error = parse_fdt(sc);
515 device_printf(dev, "Can't get FDT property.\n");
521 if (bus_alloc_resources(dev, dwmmc_spec, sc->res)) {
522 device_printf(dev, "could not allocate resources\n");
526 /* Setup interrupt handler. */
527 error = bus_setup_intr(dev, sc->res[1], INTR_TYPE_NET | INTR_MPSAFE,
528 NULL, dwmmc_intr, sc, &sc->intr_cookie);
530 device_printf(dev, "could not setup interrupt handler.\n");
534 device_printf(dev, "Hardware version ID is %04x\n",
535 READ4(sc, SDMMC_VERID) & 0xffff);
537 if (sc->desc_count == 0)
538 sc->desc_count = DESC_MAX;
540 /* XXX: we support operation for slot index 0 only */
542 if (sc->pwren_inverted) {
543 WRITE4(sc, SDMMC_PWREN, (0 << slot));
545 WRITE4(sc, SDMMC_PWREN, (1 << slot));
549 if (dwmmc_ctrl_reset(sc, (SDMMC_CTRL_RESET |
550 SDMMC_CTRL_FIFO_RESET |
551 SDMMC_CTRL_DMA_RESET)))
554 dwmmc_setup_bus(sc, sc->host.f_min);
556 if (sc->fifo_depth == 0) {
558 ((READ4(sc, SDMMC_FIFOTH) >> SDMMC_FIFOTH_RXWMARK_S) & 0xfff);
559 device_printf(dev, "No fifo-depth, using FIFOTH %x\n",
567 /* Install desc base */
568 WRITE4(sc, SDMMC_DBADDR, sc->desc_ring_paddr);
570 /* Enable DMA interrupts */
571 WRITE4(sc, SDMMC_IDSTS, SDMMC_IDINTEN_MASK);
572 WRITE4(sc, SDMMC_IDINTEN, (SDMMC_IDINTEN_NI |
577 /* Clear and disable interrups for a while */
578 WRITE4(sc, SDMMC_RINTSTS, 0xffffffff);
579 WRITE4(sc, SDMMC_INTMASK, 0);
581 /* Maximum timeout */
582 WRITE4(sc, SDMMC_TMOUT, 0xffffffff);
584 /* Enable interrupts */
585 WRITE4(sc, SDMMC_RINTSTS, 0xffffffff);
586 WRITE4(sc, SDMMC_INTMASK, (SDMMC_INTMASK_CMD_DONE |
593 WRITE4(sc, SDMMC_CTRL, SDMMC_CTRL_INT_ENABLE);
595 sc->host.f_min = 400000;
596 sc->host.f_max = sc->max_hz;
597 sc->host.host_ocr = MMC_OCR_320_330 | MMC_OCR_330_340;
598 sc->host.caps |= MMC_CAP_HSPEED;
599 sc->host.caps |= MMC_CAP_SIGNALING_330;
601 device_add_child(dev, "mmc", -1);
602 return (bus_generic_attach(dev));
606 dwmmc_setup_bus(struct dwmmc_softc *sc, int freq)
612 WRITE4(sc, SDMMC_CLKENA, 0);
613 WRITE4(sc, SDMMC_CMD, (SDMMC_CMD_WAIT_PRVDATA |
614 SDMMC_CMD_UPD_CLK_ONLY | SDMMC_CMD_START));
619 device_printf(sc->dev, "Failed update clk\n");
622 } while (READ4(sc, SDMMC_CMD) & SDMMC_CMD_START);
627 WRITE4(sc, SDMMC_CLKENA, 0);
628 WRITE4(sc, SDMMC_CLKSRC, 0);
630 div = (sc->bus_hz != freq) ? DIV_ROUND_UP(sc->bus_hz, 2 * freq) : 0;
632 WRITE4(sc, SDMMC_CLKDIV, div);
633 WRITE4(sc, SDMMC_CMD, (SDMMC_CMD_WAIT_PRVDATA |
634 SDMMC_CMD_UPD_CLK_ONLY | SDMMC_CMD_START));
639 device_printf(sc->dev, "Failed to update clk");
642 } while (READ4(sc, SDMMC_CMD) & SDMMC_CMD_START);
644 WRITE4(sc, SDMMC_CLKENA, (SDMMC_CLKENA_CCLK_EN | SDMMC_CLKENA_LP));
645 WRITE4(sc, SDMMC_CMD, SDMMC_CMD_WAIT_PRVDATA |
646 SDMMC_CMD_UPD_CLK_ONLY | SDMMC_CMD_START);
651 device_printf(sc->dev, "Failed to enable clk\n");
654 } while (READ4(sc, SDMMC_CMD) & SDMMC_CMD_START);
660 dwmmc_update_ios(device_t brdev, device_t reqdev)
662 struct dwmmc_softc *sc;
667 sc = device_get_softc(brdev);
670 dprintf("Setting up clk %u bus_width %d\n",
671 ios->clock, ios->bus_width);
673 if (ios->bus_width == bus_width_8)
674 WRITE4(sc, SDMMC_CTYPE, SDMMC_CTYPE_8BIT);
675 else if (ios->bus_width == bus_width_4)
676 WRITE4(sc, SDMMC_CTYPE, SDMMC_CTYPE_4BIT);
678 WRITE4(sc, SDMMC_CTYPE, 0);
680 if ((sc->hwtype & HWTYPE_MASK) == HWTYPE_EXYNOS) {
681 /* XXX: take care about DDR or SDR use here */
682 WRITE4(sc, SDMMC_CLKSEL, sc->sdr_timing);
686 reg = READ4(sc, SDMMC_UHS_REG);
687 if (ios->timing == bus_timing_uhs_ddr50 ||
688 ios->timing == bus_timing_mmc_ddr52 ||
689 ios->timing == bus_timing_mmc_hs400)
690 reg |= (SDMMC_UHS_REG_DDR);
692 reg &= ~(SDMMC_UHS_REG_DDR);
693 WRITE4(sc, SDMMC_UHS_REG, reg);
696 ret = sc->update_ios(sc, ios);
698 dwmmc_setup_bus(sc, ios->clock);
704 dma_done(struct dwmmc_softc *sc, struct mmc_command *cmd)
706 struct mmc_data *data;
710 if (data->flags & MMC_DATA_WRITE)
711 bus_dmamap_sync(sc->buf_tag, sc->buf_map,
712 BUS_DMASYNC_POSTWRITE);
714 bus_dmamap_sync(sc->buf_tag, sc->buf_map,
715 BUS_DMASYNC_POSTREAD);
717 bus_dmamap_sync(sc->desc_tag, sc->desc_map,
718 BUS_DMASYNC_POSTWRITE);
720 bus_dmamap_unload(sc->buf_tag, sc->buf_map);
726 dma_stop(struct dwmmc_softc *sc)
730 reg = READ4(sc, SDMMC_CTRL);
731 reg &= ~(SDMMC_CTRL_USE_IDMAC);
732 reg |= (SDMMC_CTRL_DMA_RESET);
733 WRITE4(sc, SDMMC_CTRL, reg);
735 reg = READ4(sc, SDMMC_BMOD);
736 reg &= ~(SDMMC_BMOD_DE | SDMMC_BMOD_FB);
737 reg |= (SDMMC_BMOD_SWR);
738 WRITE4(sc, SDMMC_BMOD, reg);
744 dma_prepare(struct dwmmc_softc *sc, struct mmc_command *cmd)
746 struct mmc_data *data;
752 reg = READ4(sc, SDMMC_INTMASK);
753 reg &= ~(SDMMC_INTMASK_TXDR | SDMMC_INTMASK_RXDR);
754 WRITE4(sc, SDMMC_INTMASK, reg);
756 err = bus_dmamap_load(sc->buf_tag, sc->buf_map,
757 data->data, data->len, dwmmc_ring_setup,
760 panic("dmamap_load failed\n");
762 /* Ensure the device can see the desc */
763 bus_dmamap_sync(sc->desc_tag, sc->desc_map,
764 BUS_DMASYNC_PREWRITE);
766 if (data->flags & MMC_DATA_WRITE)
767 bus_dmamap_sync(sc->buf_tag, sc->buf_map,
768 BUS_DMASYNC_PREWRITE);
770 bus_dmamap_sync(sc->buf_tag, sc->buf_map,
771 BUS_DMASYNC_PREREAD);
773 reg = (DEF_MSIZE << SDMMC_FIFOTH_MSIZE_S);
774 reg |= ((sc->fifo_depth / 2) - 1) << SDMMC_FIFOTH_RXWMARK_S;
775 reg |= (sc->fifo_depth / 2) << SDMMC_FIFOTH_TXWMARK_S;
777 WRITE4(sc, SDMMC_FIFOTH, reg);
780 reg = READ4(sc, SDMMC_CTRL);
781 reg |= (SDMMC_CTRL_USE_IDMAC | SDMMC_CTRL_DMA_ENABLE);
782 WRITE4(sc, SDMMC_CTRL, reg);
785 reg = READ4(sc, SDMMC_BMOD);
786 reg |= (SDMMC_BMOD_DE | SDMMC_BMOD_FB);
787 WRITE4(sc, SDMMC_BMOD, reg);
790 WRITE4(sc, SDMMC_PLDMND, 1);
796 pio_prepare(struct dwmmc_softc *sc, struct mmc_command *cmd)
798 struct mmc_data *data;
804 reg = (DEF_MSIZE << SDMMC_FIFOTH_MSIZE_S);
805 reg |= ((sc->fifo_depth / 2) - 1) << SDMMC_FIFOTH_RXWMARK_S;
806 reg |= (sc->fifo_depth / 2) << SDMMC_FIFOTH_TXWMARK_S;
808 WRITE4(sc, SDMMC_FIFOTH, reg);
815 pio_read(struct dwmmc_softc *sc, struct mmc_command *cmd)
817 struct mmc_data *data;
820 if (cmd == NULL || cmd->data == NULL)
824 if ((data->flags & MMC_DATA_READ) == 0)
827 KASSERT((data->xfer_len & 3) == 0, ("xfer_len not aligned"));
828 p = (uint32_t *)data->data + (data->xfer_len >> 2);
830 while (data->xfer_len < data->len) {
831 status = READ4(sc, SDMMC_STATUS);
832 if (status & SDMMC_STATUS_FIFO_EMPTY)
834 *p++ = READ4(sc, SDMMC_DATA);
838 WRITE4(sc, SDMMC_RINTSTS, SDMMC_INTMASK_RXDR);
842 pio_write(struct dwmmc_softc *sc, struct mmc_command *cmd)
844 struct mmc_data *data;
847 if (cmd == NULL || cmd->data == NULL)
851 if ((data->flags & MMC_DATA_WRITE) == 0)
854 KASSERT((data->xfer_len & 3) == 0, ("xfer_len not aligned"));
855 p = (uint32_t *)data->data + (data->xfer_len >> 2);
857 while (data->xfer_len < data->len) {
858 status = READ4(sc, SDMMC_STATUS);
859 if (status & SDMMC_STATUS_FIFO_FULL)
861 WRITE4(sc, SDMMC_DATA, *p++);
865 WRITE4(sc, SDMMC_RINTSTS, SDMMC_INTMASK_TXDR);
869 dwmmc_start_cmd(struct dwmmc_softc *sc, struct mmc_command *cmd)
871 struct mmc_data *data;
878 if ((sc->hwtype & HWTYPE_MASK) == HWTYPE_ROCKCHIP)
879 dwmmc_setup_bus(sc, sc->host.ios.clock);
881 /* XXX Upper layers don't always set this */
884 /* Begin setting up command register. */
888 dprintf("cmd->opcode 0x%08x\n", cmd->opcode);
890 if (cmd->opcode == MMC_STOP_TRANSMISSION ||
891 cmd->opcode == MMC_GO_IDLE_STATE ||
892 cmd->opcode == MMC_GO_INACTIVE_STATE)
893 cmdr |= SDMMC_CMD_STOP_ABORT;
894 else if (cmd->opcode != MMC_SEND_STATUS && data)
895 cmdr |= SDMMC_CMD_WAIT_PRVDATA;
897 /* Set up response handling. */
898 if (MMC_RSP(cmd->flags) != MMC_RSP_NONE) {
899 cmdr |= SDMMC_CMD_RESP_EXP;
900 if (cmd->flags & MMC_RSP_136)
901 cmdr |= SDMMC_CMD_RESP_LONG;
904 if (cmd->flags & MMC_RSP_CRC)
905 cmdr |= SDMMC_CMD_RESP_CRC;
908 * XXX: Not all platforms want this.
910 cmdr |= SDMMC_CMD_USE_HOLD_REG;
912 if ((sc->flags & CARD_INIT_DONE) == 0) {
913 sc->flags |= (CARD_INIT_DONE);
914 cmdr |= SDMMC_CMD_SEND_INIT;
918 if ((cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK ||
919 cmd->opcode == MMC_READ_MULTIPLE_BLOCK) &&
921 cmdr |= SDMMC_CMD_SEND_ASTOP;
923 cmdr |= SDMMC_CMD_DATA_EXP;
924 if (data->flags & MMC_DATA_STREAM)
925 cmdr |= SDMMC_CMD_MODE_STREAM;
926 if (data->flags & MMC_DATA_WRITE)
927 cmdr |= SDMMC_CMD_DATA_WRITE;
929 WRITE4(sc, SDMMC_TMOUT, 0xffffffff);
930 WRITE4(sc, SDMMC_BYTCNT, data->len);
931 blksz = (data->len < MMC_SECTOR_SIZE) ? \
932 data->len : MMC_SECTOR_SIZE;
933 WRITE4(sc, SDMMC_BLKSIZ, blksz);
936 pio_prepare(sc, cmd);
938 dma_prepare(sc, cmd);
943 dprintf("cmdr 0x%08x\n", cmdr);
945 WRITE4(sc, SDMMC_CMDARG, cmd->arg);
947 WRITE4(sc, SDMMC_CMD, cmdr | SDMMC_CMD_START);
951 dwmmc_next_operation(struct dwmmc_softc *sc)
953 struct mmc_request *req;
964 * XXX: Wait until card is still busy.
965 * We do need this to prevent data timeouts,
966 * mostly caused by multi-block write command
967 * followed by single-read.
969 while(READ4(sc, SDMMC_STATUS) & (SDMMC_STATUS_DATA_BUSY))
972 if (sc->flags & PENDING_CMD) {
973 sc->flags &= ~PENDING_CMD;
974 dwmmc_start_cmd(sc, req->cmd);
976 } else if (sc->flags & PENDING_STOP && !sc->use_auto_stop) {
977 sc->flags &= ~PENDING_STOP;
978 dwmmc_start_cmd(sc, req->stop);
988 dwmmc_request(device_t brdev, device_t reqdev, struct mmc_request *req)
990 struct dwmmc_softc *sc;
992 sc = device_get_softc(brdev);
994 dprintf("%s\n", __func__);
998 if (sc->req != NULL) {
1004 sc->flags |= PENDING_CMD;
1006 sc->flags |= PENDING_STOP;
1007 dwmmc_next_operation(sc);
1014 dwmmc_get_ro(device_t brdev, device_t reqdev)
1017 dprintf("%s\n", __func__);
1023 dwmmc_acquire_host(device_t brdev, device_t reqdev)
1025 struct dwmmc_softc *sc;
1027 sc = device_get_softc(brdev);
1030 while (sc->bus_busy)
1031 msleep(sc, &sc->sc_mtx, PZERO, "dwmmcah", hz / 5);
1038 dwmmc_release_host(device_t brdev, device_t reqdev)
1040 struct dwmmc_softc *sc;
1042 sc = device_get_softc(brdev);
1052 dwmmc_read_ivar(device_t bus, device_t child, int which, uintptr_t *result)
1054 struct dwmmc_softc *sc;
1056 sc = device_get_softc(bus);
1061 case MMCBR_IVAR_BUS_MODE:
1062 *(int *)result = sc->host.ios.bus_mode;
1064 case MMCBR_IVAR_BUS_WIDTH:
1065 *(int *)result = sc->host.ios.bus_width;
1067 case MMCBR_IVAR_CHIP_SELECT:
1068 *(int *)result = sc->host.ios.chip_select;
1070 case MMCBR_IVAR_CLOCK:
1071 *(int *)result = sc->host.ios.clock;
1073 case MMCBR_IVAR_F_MIN:
1074 *(int *)result = sc->host.f_min;
1076 case MMCBR_IVAR_F_MAX:
1077 *(int *)result = sc->host.f_max;
1079 case MMCBR_IVAR_HOST_OCR:
1080 *(int *)result = sc->host.host_ocr;
1082 case MMCBR_IVAR_MODE:
1083 *(int *)result = sc->host.mode;
1085 case MMCBR_IVAR_OCR:
1086 *(int *)result = sc->host.ocr;
1088 case MMCBR_IVAR_POWER_MODE:
1089 *(int *)result = sc->host.ios.power_mode;
1091 case MMCBR_IVAR_VDD:
1092 *(int *)result = sc->host.ios.vdd;
1094 case MMCBR_IVAR_CAPS:
1095 *(int *)result = sc->host.caps;
1097 case MMCBR_IVAR_MAX_DATA:
1098 *(int *)result = sc->desc_count;
1104 dwmmc_write_ivar(device_t bus, device_t child, int which, uintptr_t value)
1106 struct dwmmc_softc *sc;
1108 sc = device_get_softc(bus);
1113 case MMCBR_IVAR_BUS_MODE:
1114 sc->host.ios.bus_mode = value;
1116 case MMCBR_IVAR_BUS_WIDTH:
1117 sc->host.ios.bus_width = value;
1119 case MMCBR_IVAR_CHIP_SELECT:
1120 sc->host.ios.chip_select = value;
1122 case MMCBR_IVAR_CLOCK:
1123 sc->host.ios.clock = value;
1125 case MMCBR_IVAR_MODE:
1126 sc->host.mode = value;
1128 case MMCBR_IVAR_OCR:
1129 sc->host.ocr = value;
1131 case MMCBR_IVAR_POWER_MODE:
1132 sc->host.ios.power_mode = value;
1134 case MMCBR_IVAR_VDD:
1135 sc->host.ios.vdd = value;
1137 /* These are read-only */
1138 case MMCBR_IVAR_CAPS:
1139 case MMCBR_IVAR_HOST_OCR:
1140 case MMCBR_IVAR_F_MIN:
1141 case MMCBR_IVAR_F_MAX:
1142 case MMCBR_IVAR_MAX_DATA:
1148 static device_method_t dwmmc_methods[] = {
1150 DEVMETHOD(bus_read_ivar, dwmmc_read_ivar),
1151 DEVMETHOD(bus_write_ivar, dwmmc_write_ivar),
1154 DEVMETHOD(mmcbr_update_ios, dwmmc_update_ios),
1155 DEVMETHOD(mmcbr_request, dwmmc_request),
1156 DEVMETHOD(mmcbr_get_ro, dwmmc_get_ro),
1157 DEVMETHOD(mmcbr_acquire_host, dwmmc_acquire_host),
1158 DEVMETHOD(mmcbr_release_host, dwmmc_release_host),
1163 DEFINE_CLASS_0(dwmmc, dwmmc_driver, dwmmc_methods,
1164 sizeof(struct dwmmc_softc));