xref: /illumos-gate/usr/src/uts/common/io/sdcard/adapters/sdhost/sdhost.c (revision 46b592853d0f4f11781b6b0a7533f267c6aee132)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #include "sdhost.h"
27 
28 typedef	struct sdstats	sdstats_t;
29 typedef	struct sdslot	sdslot_t;
30 typedef	struct sdhost	sdhost_t;
31 
32 struct sdstats {
33 	kstat_named_t	ks_ncmd;
34 	kstat_named_t	ks_ixfr;
35 	kstat_named_t	ks_oxfr;
36 	kstat_named_t	ks_ibytes;
37 	kstat_named_t	ks_obytes;
38 	kstat_named_t	ks_npio;
39 	kstat_named_t	ks_ndma;
40 	kstat_named_t	ks_nmulti;
41 	kstat_named_t	ks_baseclk;
42 	kstat_named_t	ks_cardclk;
43 	kstat_named_t	ks_tmusecs;
44 	kstat_named_t	ks_width;
45 	kstat_named_t	ks_flags;
46 	kstat_named_t	ks_capab;
47 };
48 
49 #define	SDFLAG_FORCE_PIO		(1U << 0)
50 #define	SDFLAG_FORCE_DMA		(1U << 1)
51 
52 /*
53  * Per slot state.
54  */
55 struct sdslot {
56 	sda_host_t		*ss_host;
57 	int			ss_num;
58 	ddi_acc_handle_t	ss_acch;
59 	caddr_t 		ss_regva;
60 	kmutex_t		ss_lock;
61 	uint8_t			ss_tmoutclk;
62 	uint32_t		ss_ocr;		/* OCR formatted voltages */
63 	uint16_t		ss_mode;
64 	boolean_t		ss_suspended;
65 	sdstats_t		ss_stats;
66 #define	ss_ncmd			ss_stats.ks_ncmd.value.ui64
67 #define	ss_ixfr			ss_stats.ks_ixfr.value.ui64
68 #define	ss_oxfr			ss_stats.ks_oxfr.value.ui64
69 #define	ss_ibytes		ss_stats.ks_ibytes.value.ui64
70 #define	ss_obytes		ss_stats.ks_obytes.value.ui64
71 #define	ss_ndma			ss_stats.ks_ndma.value.ui64
72 #define	ss_npio			ss_stats.ks_npio.value.ui64
73 #define	ss_nmulti		ss_stats.ks_nmulti.value.ui64
74 
75 #define	ss_baseclk		ss_stats.ks_baseclk.value.ui32
76 #define	ss_cardclk		ss_stats.ks_cardclk.value.ui32
77 #define	ss_tmusecs		ss_stats.ks_tmusecs.value.ui32
78 #define	ss_width		ss_stats.ks_width.value.ui32
79 #define	ss_flags		ss_stats.ks_flags.value.ui32
80 #define	ss_capab		ss_stats.ks_capab.value.ui32
81 	kstat_t			*ss_ksp;
82 
83 	/*
84 	 * Command in progress
85 	 */
86 	uint8_t			*ss_kvaddr;
87 	int			ss_blksz;
88 	uint16_t		ss_resid;	/* in blocks */
89 	int			ss_rcnt;
90 
91 	/* scratch buffer, to receive extra PIO data */
92 	caddr_t			ss_bounce;
93 	ddi_dma_handle_t	ss_bufdmah;
94 	ddi_acc_handle_t	ss_bufacch;
95 	ddi_dma_cookie_t	ss_bufdmac;
96 };
97 
98 /*
99  * This allocates a rather large chunk of contiguous memory for DMA.
100  * But doing so means that we'll almost never have to resort to PIO.
101  */
102 #define	SDHOST_BOUNCESZ		65536
103 
104 /*
105  * Per controller state.
106  */
107 struct sdhost {
108 	int			sh_numslots;
109 	ddi_dma_attr_t		sh_dmaattr;
110 	sdslot_t		sh_slots[SDHOST_MAXSLOTS];
111 	sda_host_t		*sh_host;
112 
113 	/*
114 	 * Interrupt related information.
115 	 */
116 	ddi_intr_handle_t	sh_ihandle;
117 	int			sh_icap;
118 	uint_t			sh_ipri;
119 };
120 
121 #define	PROPSET(x)							\
122 	(ddi_prop_get_int(DDI_DEV_T_ANY, dip,				\
123 	DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, x, 0) != 0)
124 
125 
126 static int sdhost_attach(dev_info_t *, ddi_attach_cmd_t);
127 static int sdhost_detach(dev_info_t *, ddi_detach_cmd_t);
128 static int sdhost_quiesce(dev_info_t *);
129 static int sdhost_suspend(dev_info_t *);
130 static int sdhost_resume(dev_info_t *);
131 
132 static void sdhost_enable_interrupts(sdslot_t *);
133 static void sdhost_disable_interrupts(sdslot_t *);
134 static int sdhost_setup_intr(dev_info_t *, sdhost_t *);
135 static uint_t sdhost_intr(caddr_t, caddr_t);
136 static int sdhost_init_slot(dev_info_t *, sdhost_t *, int, int);
137 static void sdhost_uninit_slot(sdhost_t *, int);
138 static sda_err_t sdhost_soft_reset(sdslot_t *, uint8_t);
139 static sda_err_t sdhost_set_clock(sdslot_t *, uint32_t);
140 static void sdhost_xfer_done(sdslot_t *, sda_err_t);
141 static sda_err_t sdhost_wait_cmd(sdslot_t *, sda_cmd_t *);
142 static uint_t sdhost_slot_intr(sdslot_t *);
143 
144 static sda_err_t sdhost_cmd(void *, sda_cmd_t *);
145 static sda_err_t sdhost_getprop(void *, sda_prop_t, uint32_t *);
146 static sda_err_t sdhost_setprop(void *, sda_prop_t, uint32_t);
147 static sda_err_t sdhost_poll(void *);
148 static sda_err_t sdhost_reset(void *);
149 static sda_err_t sdhost_halt(void *);
150 
151 static struct dev_ops sdhost_dev_ops = {
152 	DEVO_REV,			/* devo_rev */
153 	0,				/* devo_refcnt */
154 	ddi_no_info,			/* devo_getinfo */
155 	nulldev,			/* devo_identify */
156 	nulldev,			/* devo_probe */
157 	sdhost_attach,			/* devo_attach */
158 	sdhost_detach,			/* devo_detach */
159 	nodev,				/* devo_reset */
160 	NULL,				/* devo_cb_ops */
161 	NULL,				/* devo_bus_ops */
162 	NULL,				/* devo_power */
163 	sdhost_quiesce,			/* devo_quiesce */
164 };
165 
166 static struct modldrv sdhost_modldrv = {
167 	&mod_driverops,			/* drv_modops */
168 	"Standard SD Host Controller",	/* drv_linkinfo */
169 	&sdhost_dev_ops			/* drv_dev_ops */
170 };
171 
172 static struct modlinkage modlinkage = {
173 	MODREV_1,			/* ml_rev */
174 	{ &sdhost_modldrv, NULL }	/* ml_linkage */
175 };
176 
177 static struct sda_ops sdhost_ops = {
178 	SDA_OPS_VERSION,
179 	sdhost_cmd,			/* so_cmd */
180 	sdhost_getprop,			/* so_getprop */
181 	sdhost_setprop,			/* so_setprop */
182 	sdhost_poll,			/* so_poll */
183 	sdhost_reset,			/* so_reset */
184 	sdhost_halt,			/* so_halt */
185 };
186 
187 static ddi_device_acc_attr_t sdhost_regattr = {
188 	DDI_DEVICE_ATTR_V0,	/* devacc_attr_version */
189 	DDI_STRUCTURE_LE_ACC,	/* devacc_attr_endian_flags */
190 	DDI_STRICTORDER_ACC,	/* devacc_attr_dataorder */
191 	DDI_DEFAULT_ACC,	/* devacc_attr_access */
192 };
193 static ddi_device_acc_attr_t sdhost_bufattr = {
194 	DDI_DEVICE_ATTR_V0,	/* devacc_attr_version */
195 	DDI_NEVERSWAP_ACC,	/* devacc_attr_endian_flags */
196 	DDI_STRICTORDER_ACC,	/* devacc_attr_dataorder */
197 	DDI_DEFAULT_ACC,	/* devacc_attr_access */
198 };
199 
200 #define	GET16(ss, reg)	\
201 	ddi_get16(ss->ss_acch, (void *)(ss->ss_regva + reg))
202 #define	PUT16(ss, reg, val)	\
203 	ddi_put16(ss->ss_acch, (void *)(ss->ss_regva + reg), val)
204 #define	GET32(ss, reg)	\
205 	ddi_get32(ss->ss_acch, (void *)(ss->ss_regva + reg))
206 #define	PUT32(ss, reg, val)	\
207 	ddi_put32(ss->ss_acch, (void *)(ss->ss_regva + reg), val)
208 #define	GET64(ss, reg)	\
209 	ddi_get64(ss->ss_acch, (void *)(ss->ss_regva + reg))
210 
211 #define	GET8(ss, reg)	\
212 	ddi_get8(ss->ss_acch, (void *)(ss->ss_regva + reg))
213 #define	PUT8(ss, reg, val)	\
214 	ddi_put8(ss->ss_acch, (void *)(ss->ss_regva + reg), val)
215 
216 #define	CLR8(ss, reg, mask)	PUT8(ss, reg, GET8(ss, reg) & ~(mask))
217 #define	SET8(ss, reg, mask)	PUT8(ss, reg, GET8(ss, reg) | (mask))
218 
219 /*
220  * If ever anyone uses PIO on SPARC, we have to endian-swap.  But we
221  * think that SD Host Controllers are likely to be uncommon on SPARC,
222  * and hopefully when they exist at all they will be able to use DMA.
223  */
224 #ifdef	_BIG_ENDIAN
225 #define	sw32(x)		ddi_swap32(x)
226 #define	sw16(x)		ddi_swap16(x)
227 #else
228 #define	sw32(x)		(x)
229 #define	sw16(x)		(x)
230 #endif
231 
232 #define	GETDATA32(ss)		sw32(GET32(ss, REG_DATA))
233 #define	GETDATA16(ss)		sw16(GET16(ss, REG_DATA))
234 #define	GETDATA8(ss)		GET8(ss, REG_DATA)
235 
236 #define	PUTDATA32(ss, val)	PUT32(ss, REG_DATA, sw32(val))
237 #define	PUTDATA16(ss, val)	PUT16(ss, REG_DATA, sw16(val))
238 #define	PUTDATA8(ss, val)	PUT8(ss, REG_DATA, val)
239 
240 #define	CHECK_STATE(ss, nm)	\
241 	((GET32(ss, REG_PRS) & PRS_ ## nm) != 0)
242 
243 int
244 _init(void)
245 {
246 	int	rv;
247 
248 	sda_host_init_ops(&sdhost_dev_ops);
249 
250 	if ((rv = mod_install(&modlinkage)) != 0) {
251 		sda_host_fini_ops(&sdhost_dev_ops);
252 	}
253 
254 	return (rv);
255 }
256 
257 int
258 _fini(void)
259 {
260 	int	rv;
261 
262 	if ((rv = mod_remove(&modlinkage)) == 0) {
263 		sda_host_fini_ops(&sdhost_dev_ops);
264 	}
265 	return (rv);
266 }
267 
268 int
269 _info(struct modinfo *modinfop)
270 {
271 	return (mod_info(&modlinkage, modinfop));
272 }
273 
274 int
275 sdhost_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
276 {
277 	sdhost_t		*shp;
278 	ddi_acc_handle_t	pcih;
279 	uint8_t			slotinfo;
280 	uint8_t			bar;
281 	int			i;
282 	int			rv;
283 
284 	switch (cmd) {
285 	case DDI_ATTACH:
286 		break;
287 
288 	case DDI_RESUME:
289 		return (sdhost_resume(dip));
290 
291 	default:
292 		return (DDI_FAILURE);
293 	}
294 
295 	/*
296 	 * Soft state allocation.
297 	 */
298 	shp = kmem_zalloc(sizeof (*shp), KM_SLEEP);
299 	ddi_set_driver_private(dip, shp);
300 
301 	/*
302 	 * Reset the "slot number", so uninit slot works properly.
303 	 */
304 	for (i = 0; i < SDHOST_MAXSLOTS; i++) {
305 		shp->sh_slots[i].ss_num = -1;
306 	}
307 
308 	/*
309 	 * Initialize DMA attributes.  For now we initialize as for
310 	 * SDMA.  If we add ADMA support we can improve this.
311 	 */
312 	shp->sh_dmaattr.dma_attr_version = DMA_ATTR_V0;
313 	shp->sh_dmaattr.dma_attr_addr_lo = 0;
314 	shp->sh_dmaattr.dma_attr_addr_hi = 0xffffffffU;
315 	shp->sh_dmaattr.dma_attr_count_max = 0xffffffffU;
316 	shp->sh_dmaattr.dma_attr_align = 4096;		/* Ricoh needs it */
317 	shp->sh_dmaattr.dma_attr_burstsizes = 0;	/* for now! */
318 	shp->sh_dmaattr.dma_attr_minxfer = 1;
319 	shp->sh_dmaattr.dma_attr_maxxfer = 0x7ffffU;
320 	shp->sh_dmaattr.dma_attr_sgllen = 1;		/* no scatter/gather */
321 	shp->sh_dmaattr.dma_attr_seg = 0x7ffffU;	/* not to cross 512K */
322 	shp->sh_dmaattr.dma_attr_granular = 1;
323 	shp->sh_dmaattr.dma_attr_flags = 0;
324 
325 	/*
326 	 * PCI configuration access to figure out number of slots present.
327 	 */
328 	if (pci_config_setup(dip, &pcih) != DDI_SUCCESS) {
329 		cmn_err(CE_WARN, "pci_config_setup failed");
330 		goto failed;
331 	}
332 
333 	slotinfo = pci_config_get8(pcih, SLOTINFO);
334 	shp->sh_numslots = SLOTINFO_NSLOT(slotinfo);
335 
336 	if (shp->sh_numslots > SDHOST_MAXSLOTS) {
337 		cmn_err(CE_WARN, "Host reports to have too many slots: %d",
338 		    shp->sh_numslots);
339 		pci_config_teardown(&pcih);
340 		goto failed;
341 	}
342 
343 	/*
344 	 * Enable master accesses and DMA.
345 	 */
346 	pci_config_put16(pcih, PCI_CONF_COMM,
347 	    pci_config_get16(pcih, PCI_CONF_COMM) |
348 	    PCI_COMM_MAE | PCI_COMM_ME);
349 
350 	/*
351 	 * Figure out which BAR to use.  Note that we number BARs from
352 	 * 1, although PCI and SD Host numbers from 0.  (We number
353 	 * from 1, because register number 0 means PCI configuration
354 	 * space in Solaris.)
355 	 */
356 	bar = SLOTINFO_BAR(slotinfo) + 1;
357 
358 	pci_config_teardown(&pcih);
359 
360 	/*
361 	 * Setup interrupts ... supports the new DDI interrupt API.  This
362 	 * will support MSI or MSI-X interrupts if a device is found to
363 	 * support it.
364 	 */
365 	if (sdhost_setup_intr(dip, shp) != DDI_SUCCESS) {
366 		cmn_err(CE_WARN, "Failed to setup interrupts");
367 		goto failed;
368 	}
369 
370 	shp->sh_host = sda_host_alloc(dip, shp->sh_numslots, &sdhost_ops,
371 	    &shp->sh_dmaattr);
372 	if (shp->sh_host == NULL) {
373 		cmn_err(CE_WARN, "Failed allocating SD host structure");
374 		goto failed;
375 	}
376 
377 	/*
378 	 * Configure slots, this also maps registers, enables
379 	 * interrupts, etc.  Most of the hardware setup is done here.
380 	 */
381 	for (i = 0; i < shp->sh_numslots; i++) {
382 		if (sdhost_init_slot(dip, shp, i, bar + i) != DDI_SUCCESS) {
383 			cmn_err(CE_WARN, "Failed initializing slot %d", i);
384 			goto failed;
385 		}
386 	}
387 
388 	ddi_report_dev(dip);
389 
390 	/*
391 	 * Enable device interrupts at the DDI layer.
392 	 */
393 	if (shp->sh_icap & DDI_INTR_FLAG_BLOCK) {
394 		rv = ddi_intr_block_enable(&shp->sh_ihandle, 1);
395 	} else {
396 		rv = ddi_intr_enable(shp->sh_ihandle);
397 	}
398 	if (rv != DDI_SUCCESS) {
399 		cmn_err(CE_WARN, "Failed enabling interrupts");
400 		goto failed;
401 	}
402 
403 	/*
404 	 * Mark the slots online with the framework.  This will cause
405 	 * the framework to probe them for the presence of cards.
406 	 */
407 	if (sda_host_attach(shp->sh_host) != DDI_SUCCESS) {
408 		cmn_err(CE_WARN, "Failed attaching to SDA framework");
409 		if (shp->sh_icap & DDI_INTR_FLAG_BLOCK) {
410 			(void) ddi_intr_block_disable(&shp->sh_ihandle, 1);
411 		} else {
412 			(void) ddi_intr_disable(shp->sh_ihandle);
413 		}
414 		goto failed;
415 	}
416 
417 	return (DDI_SUCCESS);
418 
419 failed:
420 	if (shp->sh_ihandle != NULL) {
421 		(void) ddi_intr_remove_handler(shp->sh_ihandle);
422 		(void) ddi_intr_free(shp->sh_ihandle);
423 	}
424 	for (i = 0; i < shp->sh_numslots; i++)
425 		sdhost_uninit_slot(shp, i);
426 	if (shp->sh_host != NULL)
427 		sda_host_free(shp->sh_host);
428 	kmem_free(shp, sizeof (*shp));
429 
430 	return (DDI_FAILURE);
431 }
432 
433 int
434 sdhost_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
435 {
436 	sdhost_t	*shp;
437 	int		i;
438 
439 	switch (cmd) {
440 	case DDI_DETACH:
441 		break;
442 
443 	case DDI_SUSPEND:
444 		return (sdhost_suspend(dip));
445 
446 	default:
447 		return (DDI_FAILURE);
448 	}
449 
450 	shp = ddi_get_driver_private(dip);
451 
452 	/*
453 	 * Take host offline with the framework.
454 	 */
455 	sda_host_detach(shp->sh_host);
456 
457 	/*
458 	 * Tear down interrupts.
459 	 */
460 	if (shp->sh_ihandle != NULL) {
461 		if (shp->sh_icap & DDI_INTR_FLAG_BLOCK) {
462 			(void) ddi_intr_block_disable(&shp->sh_ihandle, 1);
463 		} else {
464 			(void) ddi_intr_disable(shp->sh_ihandle);
465 		}
466 		(void) ddi_intr_remove_handler(shp->sh_ihandle);
467 		(void) ddi_intr_free(shp->sh_ihandle);
468 	}
469 
470 	/*
471 	 * Tear down register mappings, etc.
472 	 */
473 	for (i = 0; i < shp->sh_numslots; i++)
474 		sdhost_uninit_slot(shp, i);
475 	sda_host_free(shp->sh_host);
476 	kmem_free(shp, sizeof (*shp));
477 
478 	return (DDI_SUCCESS);
479 }
480 
481 int
482 sdhost_quiesce(dev_info_t *dip)
483 {
484 	sdhost_t	*shp;
485 	sdslot_t	*ss;
486 
487 	shp = ddi_get_driver_private(dip);
488 
489 	/* reset each slot separately */
490 	for (int i = 0; i < shp->sh_numslots; i++) {
491 		ss = &shp->sh_slots[i];
492 		if (ss->ss_acch == NULL)
493 			continue;
494 
495 		(void) sdhost_soft_reset(ss, SOFT_RESET_ALL);
496 	}
497 	return (DDI_SUCCESS);
498 }
499 
500 int
501 sdhost_suspend(dev_info_t *dip)
502 {
503 	sdhost_t	*shp;
504 	sdslot_t	*ss;
505 	int		i;
506 
507 	shp = ddi_get_driver_private(dip);
508 
509 	sda_host_suspend(shp->sh_host);
510 
511 	for (i = 0; i < shp->sh_numslots; i++) {
512 		ss = &shp->sh_slots[i];
513 		mutex_enter(&ss->ss_lock);
514 		ss->ss_suspended = B_TRUE;
515 		sdhost_disable_interrupts(ss);
516 		(void) sdhost_soft_reset(ss, SOFT_RESET_ALL);
517 		mutex_exit(&ss->ss_lock);
518 	}
519 	return (DDI_SUCCESS);
520 }
521 
522 int
523 sdhost_resume(dev_info_t *dip)
524 {
525 	sdhost_t	*shp;
526 	sdslot_t	*ss;
527 	int		i;
528 
529 	shp = ddi_get_driver_private(dip);
530 
531 	for (i = 0; i < shp->sh_numslots; i++) {
532 		ss = &shp->sh_slots[i];
533 		mutex_enter(&ss->ss_lock);
534 		ss->ss_suspended = B_FALSE;
535 		(void) sdhost_soft_reset(ss, SOFT_RESET_ALL);
536 		sdhost_enable_interrupts(ss);
537 		mutex_exit(&ss->ss_lock);
538 	}
539 
540 	sda_host_resume(shp->sh_host);
541 
542 	return (DDI_SUCCESS);
543 }
544 
545 sda_err_t
546 sdhost_set_clock(sdslot_t *ss, uint32_t hz)
547 {
548 	uint16_t	div;
549 	uint32_t	val;
550 	uint32_t	clk;
551 	int		count;
552 
553 	/*
554 	 * Shut off the clock to begin.
555 	 */
556 	ss->ss_cardclk = 0;
557 	PUT16(ss, REG_CLOCK_CONTROL, 0);
558 	if (hz == 0) {
559 		return (SDA_EOK);
560 	}
561 
562 	if (ss->ss_baseclk == 0) {
563 		sda_host_log(ss->ss_host, ss->ss_num,
564 		    "Base clock frequency not established.");
565 		return (SDA_EINVAL);
566 	}
567 
568 	if ((hz > 25000000) && ((ss->ss_capab & CAPAB_HIGH_SPEED) != 0)) {
569 		/* this clock requires high speed timings! */
570 		SET8(ss, REG_HOST_CONTROL, HOST_CONTROL_HIGH_SPEED_EN);
571 	} else {
572 		/* don't allow clock to run faster than 25MHz */
573 		hz = min(hz, 25000000);
574 		CLR8(ss, REG_HOST_CONTROL, HOST_CONTROL_HIGH_SPEED_EN);
575 	}
576 
577 	/* figure out the divider */
578 	clk = ss->ss_baseclk;
579 	div  = 1;
580 	while (clk > hz) {
581 		if (div > 0x80)
582 			break;
583 		clk >>= 1;	/* divide clock by two */
584 		div <<= 1;	/* divider goes up by one */
585 	}
586 	div >>= 1;	/* 0 == divide by 1, 1 = divide by 2 */
587 
588 	/*
589 	 * Set the internal clock divider first, without enabling the
590 	 * card clock yet.
591 	 */
592 	PUT16(ss, REG_CLOCK_CONTROL,
593 	    (div << CLOCK_CONTROL_FREQ_SHIFT) | CLOCK_CONTROL_INT_CLOCK_EN);
594 
595 	/*
596 	 * Wait up to 100 msec for the internal clock to stabilize.
597 	 * (The spec does not seem to indicate a maximum timeout, but
598 	 * it also suggests that an infinite loop be used, which is
599 	 * not appropriate for hardened Solaris drivers.)
600 	 */
601 	for (count = 100000; count; count -= 10) {
602 
603 		val = GET16(ss, REG_CLOCK_CONTROL);
604 
605 		if (val & CLOCK_CONTROL_INT_CLOCK_STABLE) {
606 			/* if clock is stable, enable the SD clock pin */
607 			PUT16(ss, REG_CLOCK_CONTROL, val |
608 			    CLOCK_CONTROL_SD_CLOCK_EN);
609 
610 			ss->ss_cardclk = clk;
611 			return (SDA_EOK);
612 		}
613 
614 		drv_usecwait(10);
615 	}
616 
617 	return (SDA_ETIME);
618 }
619 
620 sda_err_t
621 sdhost_soft_reset(sdslot_t *ss, uint8_t bits)
622 {
623 	int	count;
624 
625 	/*
626 	 * There appears to be a bug where Ricoh hosts might have a
627 	 * problem if the host frequency is not set.  If the card
628 	 * isn't present, or we are doing a master reset, just enable
629 	 * the internal clock at its native speed.  (No dividers, and
630 	 * not exposed to card.).
631 	 */
632 	if ((bits == SOFT_RESET_ALL) || !(CHECK_STATE(ss, CARD_INSERTED))) {
633 		PUT16(ss, REG_CLOCK_CONTROL, CLOCK_CONTROL_INT_CLOCK_EN);
634 		/* simple 1msec wait, don't wait for clock to stabilize */
635 		drv_usecwait(1000);
636 		/*
637 		 * reset the card clock & width -- master reset also
638 		 * resets these
639 		 */
640 		ss->ss_cardclk = 0;
641 		ss->ss_width = 1;
642 	}
643 
644 
645 	PUT8(ss, REG_SOFT_RESET, bits);
646 	for (count = 100000; count != 0; count -= 10) {
647 		if ((GET8(ss, REG_SOFT_RESET) & bits) == 0) {
648 			return (SDA_EOK);
649 		}
650 		drv_usecwait(10);
651 	}
652 
653 	return (SDA_ETIME);
654 }
655 
656 void
657 sdhost_disable_interrupts(sdslot_t *ss)
658 {
659 	/* disable slot interrupts for card insert and remove */
660 	PUT16(ss, REG_INT_MASK, 0);
661 	PUT16(ss, REG_INT_EN, 0);
662 
663 	/* disable error interrupts */
664 	PUT16(ss, REG_ERR_MASK, 0);
665 	PUT16(ss, REG_ERR_EN, 0);
666 }
667 
668 void
669 sdhost_enable_interrupts(sdslot_t *ss)
670 {
671 	/*
672 	 * Note that we want to enable reading of the CMD related
673 	 * bits, but we do not want them to generate an interrupt.
674 	 * (The busy wait for typical CMD stuff will normally be less
675 	 * than 10usec, so its simpler/easier to just poll.  Even in
676 	 * the worst case of 100 kHz, the poll is at worst 2 msec.)
677 	 */
678 
679 	/* enable slot interrupts for card insert and remove */
680 	PUT16(ss, REG_INT_MASK, INT_MASK);
681 	PUT16(ss, REG_INT_EN, INT_ENAB);
682 
683 	/* enable error interrupts */
684 	PUT16(ss, REG_ERR_MASK, ERR_MASK);
685 	PUT16(ss, REG_ERR_EN, ERR_ENAB);
686 }
687 
688 int
689 sdhost_setup_intr(dev_info_t *dip, sdhost_t *shp)
690 {
691 	int		itypes;
692 	int		itype;
693 
694 	/*
695 	 * Set up interrupt handler.
696 	 */
697 	if (ddi_intr_get_supported_types(dip, &itypes) != DDI_SUCCESS) {
698 		cmn_err(CE_WARN, "ddi_intr_get_supported_types failed");
699 		return (DDI_FAILURE);
700 	}
701 
702 	/*
703 	 * It turns out that some controllers don't properly implement MSI,
704 	 * but advertise MSI capability in their  PCI config space.
705 	 *
706 	 * While this is really a chip-specific bug, the simplest solution
707 	 * is to just suppress MSI for now by default -- every device seen
708 	 * so far can use FIXED interrupts.
709 	 *
710 	 * We offer an override property, though, just in case someone really
711 	 * wants to force it.
712 	 *
713 	 * We don't do this if the FIXED type isn't supported though!
714 	 */
715 	if (itypes & DDI_INTR_TYPE_FIXED) {
716 		if (!PROPSET(SDHOST_PROP_ENABLE_MSI)) {
717 			itypes &= ~DDI_INTR_TYPE_MSI;
718 		}
719 		if (!PROPSET(SDHOST_PROP_ENABLE_MSIX)) {
720 			itypes &= ~DDI_INTR_TYPE_MSIX;
721 		}
722 	}
723 
724 	/*
725 	 * Interrupt types are bits in a mask.  We know about these ones:
726 	 * FIXED = 1
727 	 * MSI = 2
728 	 * MSIX = 4
729 	 */
730 	for (itype = DDI_INTR_TYPE_MSIX; itype != 0; itype >>= 1) {
731 
732 		int			count;
733 
734 		if ((itypes & itype) == 0) {
735 			/* this type is not supported on this device! */
736 			continue;
737 		}
738 
739 		if ((ddi_intr_get_nintrs(dip, itype, &count) != DDI_SUCCESS) ||
740 		    (count == 0)) {
741 			cmn_err(CE_WARN, "ddi_intr_get_nintrs failed");
742 			continue;
743 		}
744 
745 		/*
746 		 * We have not seen a host device with multiple
747 		 * interrupts (one per slot?), and the spec does not
748 		 * indicate that they exist.  But if one ever occurs,
749 		 * we spew a warning to help future debugging/support
750 		 * efforts.
751 		 */
752 		if (count > 1) {
753 			cmn_err(CE_WARN, "Controller offers %d interrupts, "
754 			    "but driver only supports one", count);
755 			continue;
756 		}
757 
758 		if ((ddi_intr_alloc(dip, &shp->sh_ihandle, itype, 0, 1,
759 		    &count, DDI_INTR_ALLOC_NORMAL) != DDI_SUCCESS) ||
760 		    (count != 1)) {
761 			cmn_err(CE_WARN, "ddi_intr_alloc failed");
762 			continue;
763 		}
764 
765 		if (ddi_intr_get_pri(shp->sh_ihandle, &shp->sh_ipri) !=
766 		    DDI_SUCCESS) {
767 			cmn_err(CE_WARN, "ddi_intr_get_pri failed");
768 			(void) ddi_intr_free(shp->sh_ihandle);
769 			shp->sh_ihandle = NULL;
770 			continue;
771 		}
772 
773 		if (shp->sh_ipri >= ddi_intr_get_hilevel_pri()) {
774 			cmn_err(CE_WARN, "Hi level interrupt not supported");
775 			(void) ddi_intr_free(shp->sh_ihandle);
776 			shp->sh_ihandle = NULL;
777 			continue;
778 		}
779 
780 		if (ddi_intr_get_cap(shp->sh_ihandle, &shp->sh_icap) !=
781 		    DDI_SUCCESS) {
782 			cmn_err(CE_WARN, "ddi_intr_get_cap failed");
783 			(void) ddi_intr_free(shp->sh_ihandle);
784 			shp->sh_ihandle = NULL;
785 			continue;
786 		}
787 
788 		if (ddi_intr_add_handler(shp->sh_ihandle, sdhost_intr,
789 		    shp, NULL) != DDI_SUCCESS) {
790 			cmn_err(CE_WARN, "ddi_intr_add_handler failed");
791 			(void) ddi_intr_free(shp->sh_ihandle);
792 			shp->sh_ihandle = NULL;
793 			continue;
794 		}
795 
796 		return (DDI_SUCCESS);
797 	}
798 
799 	return (DDI_FAILURE);
800 }
801 
802 void
803 sdhost_xfer_done(sdslot_t *ss, sda_err_t errno)
804 {
805 	if ((errno == SDA_EOK) && (ss->ss_resid != 0)) {
806 		/* an unexpected partial transfer was found */
807 		errno = SDA_ERESID;
808 	}
809 	ss->ss_blksz = 0;
810 	ss->ss_resid = 0;
811 
812 	if (errno != SDA_EOK) {
813 		(void) sdhost_soft_reset(ss, SOFT_RESET_CMD);
814 		(void) sdhost_soft_reset(ss, SOFT_RESET_DAT);
815 
816 		/* send a STOP command if necessary */
817 		if (ss->ss_mode & XFR_MODE_AUTO_CMD12) {
818 			PUT32(ss, REG_ARGUMENT, 0);
819 			PUT16(ss, REG_COMMAND,
820 			    (CMD_STOP_TRANSMIT << 8) |
821 			    COMMAND_TYPE_NORM | COMMAND_INDEX_CHECK_EN |
822 			    COMMAND_CRC_CHECK_EN | COMMAND_RESP_48_BUSY);
823 		}
824 	}
825 
826 	sda_host_transfer(ss->ss_host, ss->ss_num, errno);
827 }
828 
829 uint_t
830 sdhost_slot_intr(sdslot_t *ss)
831 {
832 	uint16_t	intr;
833 	uint16_t	errs;
834 	caddr_t		data;
835 	int		count;
836 
837 	mutex_enter(&ss->ss_lock);
838 
839 	if (ss->ss_suspended) {
840 		mutex_exit(&ss->ss_lock);
841 		return (DDI_INTR_UNCLAIMED);
842 	}
843 
844 	intr = GET16(ss, REG_INT_STAT);
845 	if (intr == 0) {
846 		mutex_exit(&ss->ss_lock);
847 		return (DDI_INTR_UNCLAIMED);
848 	}
849 	errs = GET16(ss, REG_ERR_STAT);
850 
851 	if (intr & (INT_REM | INT_INS)) {
852 
853 		PUT16(ss, REG_INT_STAT, intr);
854 		mutex_exit(&ss->ss_lock);
855 
856 		sda_host_detect(ss->ss_host, ss->ss_num);
857 		/* no further interrupt processing this cycle */
858 		return (DDI_INTR_CLAIMED);
859 	}
860 
861 	if (intr & INT_DMA) {
862 		/*
863 		 * We have crossed a DMA/page boundary.  Cope with it.
864 		 */
865 		/*
866 		 * Apparently some sdhost controllers issue a final
867 		 * DMA interrupt if the DMA completes on a boundary,
868 		 * even though there is no further data to transfer.
869 		 *
870 		 * There might be a risk here of the controller
871 		 * continuing to access the same data over and over
872 		 * again, but we accept the risk.
873 		 */
874 		PUT16(ss, REG_INT_STAT, INT_DMA);
875 	}
876 
877 	if (intr & INT_RD) {
878 		/*
879 		 * PIO read!  PIO is quite suboptimal, but we expect
880 		 * performance critical applications to use DMA
881 		 * whenever possible.  We have to stage this through
882 		 * the bounce buffer to meet alignment considerations.
883 		 */
884 
885 		PUT16(ss, REG_INT_STAT, INT_RD);
886 
887 		while ((ss->ss_resid > 0) && CHECK_STATE(ss, BUF_RD_EN)) {
888 
889 			data = ss->ss_bounce;
890 			count = ss->ss_blksz;
891 
892 			ASSERT(count > 0);
893 			ASSERT(ss->ss_kvaddr != NULL);
894 
895 			while (count >= sizeof (uint32_t)) {
896 				*(uint32_t *)(void *)data = GETDATA32(ss);
897 				data += sizeof (uint32_t);
898 				count -= sizeof (uint32_t);
899 			}
900 			while (count >= sizeof (uint16_t)) {
901 				*(uint16_t *)(void *)data = GETDATA16(ss);
902 				data += sizeof (uint16_t);
903 				count -= sizeof (uint16_t);
904 			}
905 			while (count >= sizeof (uint8_t)) {
906 				*(uint8_t *)data = GETDATA8(ss);
907 				data += sizeof (uint8_t);
908 				count -= sizeof (uint8_t);
909 			}
910 
911 			bcopy(ss->ss_bounce, ss->ss_kvaddr, ss->ss_blksz);
912 			ss->ss_kvaddr += ss->ss_blksz;
913 			ss->ss_resid--;
914 		}
915 	}
916 
917 	if (intr & INT_WR) {
918 		/*
919 		 * PIO write!  PIO is quite suboptimal, but we expect
920 		 * performance critical applications to use DMA
921 		 * whenever possible.  We have to stage this through
922 		 * the bounce buffer to meet alignment considerations.
923 		 */
924 
925 		PUT16(ss, REG_INT_STAT, INT_WR);
926 
927 		while ((ss->ss_resid > 0) && CHECK_STATE(ss, BUF_WR_EN)) {
928 
929 			data = ss->ss_bounce;
930 			count = ss->ss_blksz;
931 
932 			ASSERT(count > 0);
933 			ASSERT(ss->ss_kvaddr != NULL);
934 
935 			bcopy(ss->ss_kvaddr, data, count);
936 			while (count >= sizeof (uint32_t)) {
937 				PUTDATA32(ss, *(uint32_t *)(void *)data);
938 				data += sizeof (uint32_t);
939 				count -= sizeof (uint32_t);
940 			}
941 			while (count >= sizeof (uint16_t)) {
942 				PUTDATA16(ss, *(uint16_t *)(void *)data);
943 				data += sizeof (uint16_t);
944 				count -= sizeof (uint16_t);
945 			}
946 			while (count >= sizeof (uint8_t)) {
947 				PUTDATA8(ss, *(uint8_t *)data);
948 				data += sizeof (uint8_t);
949 				count -= sizeof (uint8_t);
950 			}
951 
952 			ss->ss_kvaddr += ss->ss_blksz;
953 			ss->ss_resid--;
954 		}
955 	}
956 
957 	if (intr & INT_XFR) {
958 		if ((ss->ss_mode & (XFR_MODE_READ | XFR_MODE_DMA_EN)) ==
959 		    (XFR_MODE_READ | XFR_MODE_DMA_EN)) {
960 			(void) ddi_dma_sync(ss->ss_bufdmah, 0, 0,
961 			    DDI_DMA_SYNC_FORKERNEL);
962 			bcopy(ss->ss_bounce, ss->ss_kvaddr, ss->ss_rcnt);
963 			ss->ss_rcnt = 0;
964 		}
965 		PUT16(ss, REG_INT_STAT, INT_XFR);
966 
967 		sdhost_xfer_done(ss, SDA_EOK);
968 	}
969 
970 	if (intr & INT_ERR) {
971 		PUT16(ss, REG_ERR_STAT, errs);
972 		PUT16(ss, REG_INT_STAT, INT_ERR);
973 
974 		if (errs & ERR_DAT) {
975 			if ((errs & ERR_DAT_END) == ERR_DAT_END) {
976 				sdhost_xfer_done(ss, SDA_EPROTO);
977 			} else if ((errs & ERR_DAT_CRC) == ERR_DAT_CRC) {
978 				sdhost_xfer_done(ss, SDA_ECRC7);
979 			} else {
980 				sdhost_xfer_done(ss, SDA_ETIME);
981 			}
982 
983 		} else if (errs & ERR_ACMD12) {
984 			/*
985 			 * Generally, this is bad news.  we need a full
986 			 * reset to recover properly.
987 			 */
988 			sdhost_xfer_done(ss, SDA_ECMD12);
989 		}
990 
991 		/*
992 		 * This asynchronous error leaves the slot more or less
993 		 * useless.  Report it to the framework.
994 		 */
995 		if (errs & ERR_CURRENT) {
996 			sda_host_fault(ss->ss_host, ss->ss_num,
997 			    SDA_FAULT_CURRENT);
998 		}
999 	}
1000 
1001 	mutex_exit(&ss->ss_lock);
1002 
1003 	return (DDI_INTR_CLAIMED);
1004 }
1005 
1006 /*ARGSUSED1*/
1007 uint_t
1008 sdhost_intr(caddr_t arg1, caddr_t arg2)
1009 {
1010 	sdhost_t	*shp = (void *)arg1;
1011 	int		rv = DDI_INTR_UNCLAIMED;
1012 	int		num;
1013 
1014 	/* interrupt for each of the slots present in the system */
1015 	for (num = 0; num < shp->sh_numslots; num++) {
1016 		if (sdhost_slot_intr(&shp->sh_slots[num]) ==
1017 		    DDI_INTR_CLAIMED) {
1018 			rv = DDI_INTR_CLAIMED;
1019 		}
1020 	}
1021 	return (rv);
1022 }
1023 
1024 int
1025 sdhost_init_slot(dev_info_t *dip, sdhost_t *shp, int num, int bar)
1026 {
1027 	sdslot_t	*ss;
1028 	uint32_t	capab;
1029 	uint32_t	clk;
1030 	char		ksname[16];
1031 	size_t		blen;
1032 	unsigned	ndmac;
1033 	int		rv;
1034 
1035 	/*
1036 	 * Register the private state.
1037 	 */
1038 	ss = &shp->sh_slots[num];
1039 	ss->ss_host = shp->sh_host;
1040 	ss->ss_num = num;
1041 	sda_host_set_private(shp->sh_host, num, ss);
1042 	/*
1043 	 * Initialize core data structure, locks, etc.
1044 	 */
1045 	mutex_init(&ss->ss_lock, NULL, MUTEX_DRIVER,
1046 	    DDI_INTR_PRI(shp->sh_ipri));
1047 
1048 	/*
1049 	 * Set up DMA.
1050 	 */
1051 	rv = ddi_dma_alloc_handle(dip, &shp->sh_dmaattr,
1052 	    DDI_DMA_SLEEP, NULL, &ss->ss_bufdmah);
1053 	if (rv != DDI_SUCCESS) {
1054 		cmn_err(CE_WARN, "Failed to alloc dma handle (%d)!", rv);
1055 		return (DDI_FAILURE);
1056 	}
1057 
1058 	rv = ddi_dma_mem_alloc(ss->ss_bufdmah, SDHOST_BOUNCESZ,
1059 	    &sdhost_bufattr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
1060 	    &ss->ss_bounce, &blen, &ss->ss_bufacch);
1061 	if (rv != DDI_SUCCESS) {
1062 		cmn_err(CE_WARN, "Failed to alloc bounce buffer (%d)!", rv);
1063 		return (DDI_FAILURE);
1064 	}
1065 
1066 	rv = ddi_dma_addr_bind_handle(ss->ss_bufdmah, NULL, ss->ss_bounce,
1067 	    blen, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
1068 	    &ss->ss_bufdmac, &ndmac);
1069 	if ((rv != DDI_DMA_MAPPED) || (ndmac != 1)) {
1070 		cmn_err(CE_WARN, "Failed to bind DMA bounce buffer (%d, %u)!",
1071 		    rv, ndmac);
1072 		return (DDI_FAILURE);
1073 	}
1074 
1075 	/*
1076 	 * Set up virtual kstats.
1077 	 */
1078 	(void) snprintf(ksname, sizeof (ksname), "slot%d", num);
1079 	ss->ss_ksp = kstat_create(ddi_driver_name(dip), ddi_get_instance(dip),
1080 	    ksname, "misc", KSTAT_TYPE_NAMED,
1081 	    sizeof (sdstats_t) / sizeof (kstat_named_t), KSTAT_FLAG_VIRTUAL);
1082 	if (ss->ss_ksp != NULL) {
1083 		sdstats_t	*sp = &ss->ss_stats;
1084 		ss->ss_ksp->ks_data = sp;
1085 		ss->ss_ksp->ks_private = ss;
1086 		ss->ss_ksp->ks_lock = &ss->ss_lock;
1087 		/* counters are 64 bits wide */
1088 		kstat_named_init(&sp->ks_ncmd, "ncmd", KSTAT_DATA_UINT64);
1089 		kstat_named_init(&sp->ks_ixfr, "ixfr", KSTAT_DATA_UINT64);
1090 		kstat_named_init(&sp->ks_oxfr, "oxfr", KSTAT_DATA_UINT64);
1091 		kstat_named_init(&sp->ks_ibytes, "ibytes", KSTAT_DATA_UINT64);
1092 		kstat_named_init(&sp->ks_obytes, "obytes", KSTAT_DATA_UINT64);
1093 		kstat_named_init(&sp->ks_npio, "npio", KSTAT_DATA_UINT64);
1094 		kstat_named_init(&sp->ks_ndma, "ndma", KSTAT_DATA_UINT64);
1095 		kstat_named_init(&sp->ks_nmulti, "nmulti", KSTAT_DATA_UINT64);
1096 		/* these aren't counters -- leave them at 32 bits */
1097 		kstat_named_init(&sp->ks_baseclk, "baseclk", KSTAT_DATA_UINT32);
1098 		kstat_named_init(&sp->ks_cardclk, "cardclk", KSTAT_DATA_UINT32);
1099 		kstat_named_init(&sp->ks_tmusecs, "tmusecs", KSTAT_DATA_UINT32);
1100 		kstat_named_init(&sp->ks_width, "width", KSTAT_DATA_UINT32);
1101 		kstat_named_init(&sp->ks_flags, "flags", KSTAT_DATA_UINT32);
1102 		kstat_named_init(&sp->ks_capab, "capab", KSTAT_DATA_UINT32);
1103 		kstat_install(ss->ss_ksp);
1104 	}
1105 
1106 	if (PROPSET(SDHOST_PROP_FORCE_PIO)) {
1107 		ss->ss_flags |= SDFLAG_FORCE_PIO;
1108 	}
1109 	if (PROPSET(SDHOST_PROP_FORCE_DMA)) {
1110 		ss->ss_flags |= SDFLAG_FORCE_DMA;
1111 	}
1112 
1113 	if (ddi_regs_map_setup(dip, bar, &ss->ss_regva, 0, 0, &sdhost_regattr,
1114 	    &ss->ss_acch) != DDI_SUCCESS) {
1115 		cmn_err(CE_WARN, "Failed to map registers!");
1116 		return (DDI_FAILURE);
1117 	}
1118 
1119 	/* reset before reading capabilities */
1120 	if (sdhost_soft_reset(ss, SOFT_RESET_ALL) != SDA_EOK)
1121 		return (DDI_FAILURE);
1122 
1123 	capab = GET64(ss, REG_CAPAB) & 0xffffffffU; /* upper bits reserved */
1124 	ss->ss_capab = capab;
1125 
1126 	/* host voltages in OCR format */
1127 	ss->ss_ocr = 0;
1128 	if (capab & CAPAB_18V)
1129 		ss->ss_ocr |= OCR_18_19V;	/* 1.8V */
1130 	if (capab & CAPAB_30V)
1131 		ss->ss_ocr |= OCR_30_31V;
1132 	if (capab & CAPAB_33V)
1133 		ss->ss_ocr |= OCR_32_33V;
1134 
1135 	/* base clock */
1136 	ss->ss_baseclk =
1137 	    ((capab & CAPAB_BASE_FREQ_MASK) >> CAPAB_BASE_FREQ_SHIFT);
1138 	ss->ss_baseclk *= 1000000;
1139 
1140 	/*
1141 	 * Timeout clock.  We can calculate this using the following
1142 	 * formula:
1143 	 *
1144 	 * (1000000 usec/1sec) * (1sec/tmoutclk) * base factor = clock time
1145 	 *
1146 	 * Clock time is the length of the base clock in usecs.
1147 	 *
1148 	 * Our base factor is 2^13, which is the shortest clock we
1149 	 * can count.
1150 	 *
1151 	 * To simplify the math and avoid overflow, we cancel out the
1152 	 * zeros for kHz or MHz.  Since we want to wait more clocks, not
1153 	 * less, on error, we truncate the result rather than rounding
1154 	 * up.
1155 	 */
1156 	clk = ((capab & CAPAB_TIMEOUT_FREQ_MASK) >> CAPAB_TIMEOUT_FREQ_SHIFT);
1157 	if ((ss->ss_baseclk == 0) || (clk == 0)) {
1158 		cmn_err(CE_WARN, "Unable to determine clock frequencies");
1159 		return (DDI_FAILURE);
1160 	}
1161 
1162 	if (capab & CAPAB_TIMEOUT_UNITS) {
1163 		/* MHz */
1164 		ss->ss_tmusecs = (1 << 13) / clk;
1165 		clk *= 1000000;
1166 	} else {
1167 		/* kHz */
1168 		ss->ss_tmusecs = (1000 * (1 << 13)) / clk;
1169 		clk *= 1000;
1170 	}
1171 
1172 	/*
1173 	 * Calculation of the timeout.
1174 	 *
1175 	 * SDIO cards use a 1sec timeout, and SDHC cards use fixed
1176 	 * 100msec for read and 250 msec for write.
1177 	 *
1178 	 * Legacy cards running at 375kHz have a worst case of about
1179 	 * 15 seconds.  Running at 25MHz (the standard speed) it is
1180 	 * about 100msec for read, and about 3.2 sec for write.
1181 	 * Typical values are 1/100th that, or about 1msec for read,
1182 	 * and 32 msec for write.
1183 	 *
1184 	 * No transaction at full speed should ever take more than 4
1185 	 * seconds.  (Some slow legacy cards might have trouble, but
1186 	 * we'll worry about them if they ever are seen.  Nobody wants
1187 	 * to wait 4 seconds to access a single block anyway!)
1188 	 *
1189 	 * To get to 4 seconds, we continuously double usec until we
1190 	 * get to the maximum value, or a timeout greater than 4
1191 	 * seconds.
1192 	 *
1193 	 * Note that for high-speed timeout clocks, we might not be
1194 	 * able to get to the full 4 seconds.  E.g. with a 48MHz
1195 	 * timeout clock, we can only get to about 2.8 seconds.  Its
1196 	 * possible that there could be some slow MMC cards that will
1197 	 * timeout at this clock rate, but it seems unlikely.  (The
1198 	 * device would have to be pressing the very worst times,
1199 	 * against the 100-fold "permissive" window allowed, and
1200 	 * running at only 12.5MHz.)
1201 	 *
1202 	 * XXX: this could easily be a tunable.  Someone dealing with only
1203 	 * reasonable cards could set this to just 1 second.
1204 	 */
1205 	for (ss->ss_tmoutclk = 0; ss->ss_tmoutclk < 14; ss->ss_tmoutclk++) {
1206 		if ((ss->ss_tmusecs * (1 << ss->ss_tmoutclk)) >= 4000000) {
1207 			break;
1208 		}
1209 	}
1210 
1211 	/*
1212 	 * Enable slot interrupts.
1213 	 */
1214 	sdhost_enable_interrupts(ss);
1215 
1216 	return (DDI_SUCCESS);
1217 }
1218 
1219 void
1220 sdhost_uninit_slot(sdhost_t *shp, int num)
1221 {
1222 	sdslot_t	*ss;
1223 
1224 	ss = &shp->sh_slots[num];
1225 
1226 	if (ss->ss_acch != NULL)
1227 		(void) sdhost_soft_reset(ss, SOFT_RESET_ALL);
1228 
1229 	if (ss->ss_bufdmac.dmac_address)
1230 		(void) ddi_dma_unbind_handle(ss->ss_bufdmah);
1231 
1232 	if (ss->ss_bufacch != NULL)
1233 		ddi_dma_mem_free(&ss->ss_bufacch);
1234 
1235 	if (ss->ss_bufdmah != NULL)
1236 		ddi_dma_free_handle(&ss->ss_bufdmah);
1237 
1238 	if (ss->ss_ksp != NULL)
1239 		kstat_delete(ss->ss_ksp);
1240 
1241 	if (ss->ss_acch != NULL)
1242 		ddi_regs_map_free(&ss->ss_acch);
1243 
1244 	if (ss->ss_num != -1)
1245 		mutex_destroy(&ss->ss_lock);
1246 }
1247 
1248 void
1249 sdhost_get_response(sdslot_t *ss, sda_cmd_t *cmdp)
1250 {
1251 	uint32_t	*resp = cmdp->sc_response;
1252 	int		i;
1253 
1254 	resp[0] = GET32(ss, REG_RESP1);
1255 	resp[1] = GET32(ss, REG_RESP2);
1256 	resp[2] = GET32(ss, REG_RESP3);
1257 	resp[3] = GET32(ss, REG_RESP4);
1258 
1259 	/*
1260 	 * Response 2 is goofy because the host drops the low
1261 	 * order CRC bits.  This makes it a bit awkward, so we
1262 	 * have to shift the bits to make it work out right.
1263 	 *
1264 	 * Note that the framework expects the 32 bit
1265 	 * words to be ordered in LE fashion.  (The
1266 	 * bits within the words are in native order).
1267 	 */
1268 	if (cmdp->sc_rtype == R2) {
1269 		for (i = 3; i > 0; i--) {
1270 			resp[i] <<= 8;
1271 			resp[i] |= (resp[i - 1] >> 24);
1272 		}
1273 		resp[0] <<= 8;
1274 	}
1275 }
1276 
1277 sda_err_t
1278 sdhost_wait_cmd(sdslot_t *ss, sda_cmd_t *cmdp)
1279 {
1280 	int		i;
1281 	uint16_t	errs;
1282 	sda_err_t	rv;
1283 
1284 	/*
1285 	 * Worst case for 100kHz timeout is 2msec (200 clocks), we add
1286 	 * a tiny bit for safety.  (Generally timeout will be far, far
1287 	 * less than that.)
1288 	 *
1289 	 * Note that at more typical 12MHz (and normally it will be
1290 	 * even faster than that!) that the device timeout is only
1291 	 * 16.67 usec.  We could be smarter and reduce the delay time,
1292 	 * but that would require putting more intelligence into the
1293 	 * code, and we don't expect CMD timeout to normally occur
1294 	 * except during initialization.  (At which time we need the
1295 	 * full timeout anyway.)
1296 	 *
1297 	 * Checking the ERR_STAT will normally cause the timeout to
1298 	 * terminate to finish early if the device is healthy, anyway.
1299 	 */
1300 
1301 	for (i = 3000; i > 0; i -= 5) {
1302 		if (GET16(ss, REG_INT_STAT) & INT_CMD) {
1303 
1304 			PUT16(ss, REG_INT_STAT, INT_CMD);
1305 
1306 			/* command completed */
1307 			sdhost_get_response(ss, cmdp);
1308 			return (SDA_EOK);
1309 		}
1310 
1311 		if ((errs = (GET16(ss, REG_ERR_STAT) & ERR_CMD)) != 0) {
1312 			PUT16(ss, REG_ERR_STAT, errs);
1313 
1314 			/* command timeout isn't a host failure */
1315 			if ((errs & ERR_CMD_TMO) == ERR_CMD_TMO) {
1316 				rv = SDA_ETIME;
1317 			} else if ((errs & ERR_CMD_CRC) == ERR_CMD_CRC) {
1318 				rv = SDA_ECRC7;
1319 			} else {
1320 				rv = SDA_EPROTO;
1321 			}
1322 			goto error;
1323 		}
1324 
1325 		drv_usecwait(5);
1326 	}
1327 
1328 	rv = SDA_ETIME;
1329 
1330 error:
1331 	/*
1332 	 * NB: We need to soft reset the CMD and DAT
1333 	 * lines after a failure of this sort.
1334 	 */
1335 	(void) sdhost_soft_reset(ss, SOFT_RESET_CMD);
1336 	(void) sdhost_soft_reset(ss, SOFT_RESET_DAT);
1337 
1338 	return (rv);
1339 }
1340 
1341 sda_err_t
1342 sdhost_poll(void *arg)
1343 {
1344 	sdslot_t	*ss = arg;
1345 
1346 	(void) sdhost_slot_intr(ss);
1347 	return (SDA_EOK);
1348 }
1349 
1350 sda_err_t
1351 sdhost_cmd(void *arg, sda_cmd_t *cmdp)
1352 {
1353 	sdslot_t	*ss = arg;
1354 	uint16_t	command;
1355 	uint16_t	mode;
1356 	sda_err_t	rv;
1357 
1358 	/*
1359 	 * Command register:
1360 	 * bit 13-8	= command index
1361 	 * bit 7-6	= command type (always zero for us!)
1362 	 * bit 5	= data present select
1363 	 * bit 4	= command index check (always on!)
1364 	 * bit 3	= command CRC check enable
1365 	 * bit 2	= reserved
1366 	 * bit 1-0	= response type
1367 	 */
1368 
1369 	command = ((uint16_t)cmdp->sc_index << 8);
1370 	command |= COMMAND_TYPE_NORM |
1371 	    COMMAND_INDEX_CHECK_EN | COMMAND_CRC_CHECK_EN;
1372 
1373 	switch (cmdp->sc_rtype) {
1374 	case R0:
1375 		command |= COMMAND_RESP_NONE;
1376 		break;
1377 	case R1:
1378 	case R5:
1379 	case R6:
1380 	case R7:
1381 		command |= COMMAND_RESP_48;
1382 		break;
1383 	case R1b:
1384 	case R5b:
1385 		command |= COMMAND_RESP_48_BUSY;
1386 		break;
1387 	case R2:
1388 		command |= COMMAND_RESP_136;
1389 		command &= ~(COMMAND_INDEX_CHECK_EN | COMMAND_CRC_CHECK_EN);
1390 		break;
1391 	case R3:
1392 	case R4:
1393 		command |= COMMAND_RESP_48;
1394 		command &= ~COMMAND_CRC_CHECK_EN;
1395 		command &= ~COMMAND_INDEX_CHECK_EN;
1396 		break;
1397 	default:
1398 		return (SDA_EINVAL);
1399 	}
1400 
1401 	mutex_enter(&ss->ss_lock);
1402 	if (ss->ss_suspended) {
1403 		mutex_exit(&ss->ss_lock);
1404 		return (SDA_ESUSPENDED);
1405 	}
1406 
1407 	if (cmdp->sc_nblks != 0) {
1408 		uint16_t	blksz;
1409 		uint16_t	nblks;
1410 
1411 		blksz = cmdp->sc_blksz;
1412 		nblks = cmdp->sc_nblks;
1413 
1414 		/*
1415 		 * Ensure that we have good data.
1416 		 */
1417 		if ((blksz < 1) || (blksz > 2048)) {
1418 			mutex_exit(&ss->ss_lock);
1419 			return (SDA_EINVAL);
1420 		}
1421 		command |= COMMAND_DATA_PRESENT;
1422 
1423 		ss->ss_blksz = blksz;
1424 
1425 		ss->ss_kvaddr = (void *)cmdp->sc_kvaddr;
1426 		ss->ss_rcnt = 0;
1427 		ss->ss_resid = 0;
1428 
1429 		/*
1430 		 * Only SDMA for now.  We can investigate ADMA2 later.
1431 		 * (Right now we don't have ADMA2 capable hardware.)
1432 		 * We always use a bounce buffer, which solves weird
1433 		 * problems with certain controllers.  Doing this with
1434 		 * a large contiguous buffer may be faster than
1435 		 * servicing all the little per-page interrupts
1436 		 * anyway. (Bcopy of 64 K vs. 16 interrupts.)
1437 		 */
1438 		if (((ss->ss_capab & CAPAB_SDMA) != 0) &&
1439 		    ((ss->ss_flags & SDFLAG_FORCE_PIO) == 0) &&
1440 		    ((blksz * nblks) <= SDHOST_BOUNCESZ)) {
1441 
1442 			if (cmdp->sc_flags & SDA_CMDF_WRITE) {
1443 				/*
1444 				 * if we're writing, prepare initial round
1445 				 * of data
1446 				 */
1447 				bcopy(cmdp->sc_kvaddr, ss->ss_bounce,
1448 				    nblks * blksz);
1449 				(void) ddi_dma_sync(ss->ss_bufdmah, 0, 0,
1450 				    DDI_DMA_SYNC_FORDEV);
1451 			} else {
1452 				ss->ss_rcnt = nblks * blksz;
1453 			}
1454 			PUT32(ss, REG_SDMA_ADDR, ss->ss_bufdmac.dmac_address);
1455 			mode = XFR_MODE_DMA_EN;
1456 			PUT16(ss, REG_BLKSZ, BLKSZ_BOUNDARY_512K | blksz);
1457 			ss->ss_ndma++;
1458 
1459 		} else {
1460 			mode = 0;
1461 			ss->ss_npio++;
1462 			ss->ss_resid = nblks;
1463 			PUT16(ss, REG_BLKSZ, blksz);
1464 		}
1465 
1466 		if (nblks > 1) {
1467 			mode |= XFR_MODE_MULTI | XFR_MODE_COUNT;
1468 			if (cmdp->sc_flags & SDA_CMDF_AUTO_CMD12)
1469 				mode |= XFR_MODE_AUTO_CMD12;
1470 			ss->ss_nmulti++;
1471 		}
1472 		if ((cmdp->sc_flags & SDA_CMDF_READ) != 0) {
1473 			mode |= XFR_MODE_READ;
1474 			ss->ss_ixfr++;
1475 			ss->ss_ibytes += nblks * blksz;
1476 		} else {
1477 			ss->ss_oxfr++;
1478 			ss->ss_obytes += nblks * blksz;
1479 		}
1480 
1481 		ss->ss_mode = mode;
1482 
1483 		PUT8(ss, REG_TIMEOUT_CONTROL, ss->ss_tmoutclk);
1484 		PUT16(ss, REG_BLOCK_COUNT, nblks);
1485 		PUT16(ss, REG_XFR_MODE, mode);
1486 	}
1487 
1488 	PUT32(ss, REG_ARGUMENT, cmdp->sc_argument);
1489 	PUT16(ss, REG_COMMAND, command);
1490 
1491 	ss->ss_ncmd++;
1492 	rv = sdhost_wait_cmd(ss, cmdp);
1493 
1494 	mutex_exit(&ss->ss_lock);
1495 
1496 	return (rv);
1497 }
1498 
1499 sda_err_t
1500 sdhost_getprop(void *arg, sda_prop_t prop, uint32_t *val)
1501 {
1502 	sdslot_t	*ss = arg;
1503 	sda_err_t	rv = 0;
1504 
1505 	mutex_enter(&ss->ss_lock);
1506 
1507 	if (ss->ss_suspended) {
1508 		mutex_exit(&ss->ss_lock);
1509 		return (SDA_ESUSPENDED);
1510 	}
1511 	switch (prop) {
1512 	case SDA_PROP_INSERTED:
1513 		if (CHECK_STATE(ss, CARD_INSERTED)) {
1514 			*val = B_TRUE;
1515 		} else {
1516 			*val = B_FALSE;
1517 		}
1518 		break;
1519 
1520 	case SDA_PROP_WPROTECT:
1521 		if (CHECK_STATE(ss, WRITE_ENABLE)) {
1522 			*val = B_FALSE;
1523 		} else {
1524 			*val = B_TRUE;
1525 		}
1526 		break;
1527 
1528 	case SDA_PROP_OCR:
1529 		*val = ss->ss_ocr;
1530 		break;
1531 
1532 	case SDA_PROP_CLOCK:
1533 		*val = ss->ss_cardclk;
1534 		break;
1535 
1536 	case SDA_PROP_CAP_HISPEED:
1537 		if ((ss->ss_capab & CAPAB_HIGH_SPEED) != 0) {
1538 			*val = B_TRUE;
1539 		} else {
1540 			*val = B_FALSE;
1541 		}
1542 		break;
1543 
1544 	case SDA_PROP_CAP_4BITS:
1545 		*val = B_TRUE;
1546 		break;
1547 
1548 	case SDA_PROP_CAP_NOPIO:
1549 		/*
1550 		 * We might have to use PIO for buffers that don't
1551 		 * have reasonable alignments.  A few controllers seem
1552 		 * not to deal with granularity or alignments of
1553 		 * something other 32-bits.
1554 		 */
1555 		*val = B_FALSE;
1556 		break;
1557 
1558 	case SDA_PROP_CAP_INTR:
1559 	case SDA_PROP_CAP_8BITS:
1560 		*val = B_FALSE;
1561 		break;
1562 
1563 	default:
1564 		rv = SDA_ENOTSUP;
1565 		break;
1566 	}
1567 	mutex_exit(&ss->ss_lock);
1568 
1569 	return (rv);
1570 }
1571 
1572 sda_err_t
1573 sdhost_setprop(void *arg, sda_prop_t prop, uint32_t val)
1574 {
1575 	sdslot_t	*ss = arg;
1576 	sda_err_t	rv = SDA_EOK;
1577 
1578 	mutex_enter(&ss->ss_lock);
1579 
1580 	if (ss->ss_suspended) {
1581 		mutex_exit(&ss->ss_lock);
1582 		return (SDA_ESUSPENDED);
1583 	}
1584 
1585 	switch (prop) {
1586 	case SDA_PROP_LED:
1587 		if (val) {
1588 			SET8(ss, REG_HOST_CONTROL, HOST_CONTROL_LED_ON);
1589 		} else {
1590 			CLR8(ss, REG_HOST_CONTROL, HOST_CONTROL_LED_ON);
1591 		}
1592 		break;
1593 
1594 	case SDA_PROP_CLOCK:
1595 		rv = sdhost_set_clock(arg, val);
1596 		break;
1597 
1598 	case SDA_PROP_BUSWIDTH:
1599 		switch (val) {
1600 		case 1:
1601 			ss->ss_width = val;
1602 			CLR8(ss, REG_HOST_CONTROL, HOST_CONTROL_DATA_WIDTH);
1603 			break;
1604 		case 4:
1605 			ss->ss_width = val;
1606 			SET8(ss, REG_HOST_CONTROL, HOST_CONTROL_DATA_WIDTH);
1607 			break;
1608 		default:
1609 			rv = SDA_EINVAL;
1610 		}
1611 		break;
1612 
1613 	case SDA_PROP_OCR:
1614 		val &= ss->ss_ocr;
1615 
1616 		if (val & OCR_17_18V) {
1617 			PUT8(ss, REG_POWER_CONTROL, POWER_CONTROL_18V);
1618 			PUT8(ss, REG_POWER_CONTROL, POWER_CONTROL_18V |
1619 			    POWER_CONTROL_BUS_POWER);
1620 		} else if (val & OCR_29_30V) {
1621 			PUT8(ss, REG_POWER_CONTROL, POWER_CONTROL_30V);
1622 			PUT8(ss, REG_POWER_CONTROL, POWER_CONTROL_30V |
1623 			    POWER_CONTROL_BUS_POWER);
1624 		} else if (val & OCR_32_33V) {
1625 			PUT8(ss, REG_POWER_CONTROL, POWER_CONTROL_33V);
1626 			PUT8(ss, REG_POWER_CONTROL, POWER_CONTROL_33V |
1627 			    POWER_CONTROL_BUS_POWER);
1628 		} else if (val == 0) {
1629 			/* turn off power */
1630 			PUT8(ss, REG_POWER_CONTROL, 0);
1631 		} else {
1632 			rv = SDA_EINVAL;
1633 		}
1634 		break;
1635 
1636 	case SDA_PROP_HISPEED:
1637 		if (val) {
1638 			SET8(ss, REG_HOST_CONTROL, HOST_CONTROL_HIGH_SPEED_EN);
1639 		} else {
1640 			CLR8(ss, REG_HOST_CONTROL, HOST_CONTROL_HIGH_SPEED_EN);
1641 		}
1642 		/* give clocks time to settle */
1643 		drv_usecwait(10);
1644 		break;
1645 
1646 	default:
1647 		rv = SDA_ENOTSUP;
1648 		break;
1649 	}
1650 
1651 	/*
1652 	 * Apparently some controllers (ENE) have issues with changing
1653 	 * certain parameters (bus width seems to be one), requiring
1654 	 * a reset of the DAT and CMD lines.
1655 	 */
1656 	if (rv == SDA_EOK) {
1657 		(void) sdhost_soft_reset(ss, SOFT_RESET_CMD);
1658 		(void) sdhost_soft_reset(ss, SOFT_RESET_DAT);
1659 	}
1660 	mutex_exit(&ss->ss_lock);
1661 	return (rv);
1662 }
1663 
1664 sda_err_t
1665 sdhost_reset(void *arg)
1666 {
1667 	sdslot_t	*ss = arg;
1668 
1669 	mutex_enter(&ss->ss_lock);
1670 	if (!ss->ss_suspended) {
1671 		if (sdhost_soft_reset(ss, SOFT_RESET_ALL) != SDA_EOK) {
1672 			mutex_exit(&ss->ss_lock);
1673 			return (SDA_ETIME);
1674 		}
1675 		sdhost_enable_interrupts(ss);
1676 	}
1677 	mutex_exit(&ss->ss_lock);
1678 	return (SDA_EOK);
1679 }
1680 
1681 sda_err_t
1682 sdhost_halt(void *arg)
1683 {
1684 	sdslot_t	*ss = arg;
1685 
1686 	mutex_enter(&ss->ss_lock);
1687 	if (!ss->ss_suspended) {
1688 		sdhost_disable_interrupts(ss);
1689 		/* this has the side effect of removing power from the card */
1690 		if (sdhost_soft_reset(ss, SOFT_RESET_ALL) != SDA_EOK) {
1691 			mutex_exit(&ss->ss_lock);
1692 			return (SDA_ETIME);
1693 		}
1694 	}
1695 	mutex_exit(&ss->ss_lock);
1696 	return (SDA_EOK);
1697 }
1698