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