mv_sata.c revision 238873
1/*-
2 * Copyright (C) 2008-2009 Semihalf
3 * All rights reserved.
4 *
5 * Initial version developed by Ilya Bakulin. Full functionality and bringup
6 * by Piotr Ziecik.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD: head/sys/arm/mv/mv_sata.c 238873 2012-07-28 21:56:24Z hrs $");
32
33#include <sys/param.h>
34#include <sys/bus.h>
35#include <sys/lock.h>
36#include <sys/resource.h>
37#include <sys/systm.h>
38#include <sys/rman.h>
39#include <sys/kernel.h>
40#include <sys/module.h>
41#include <sys/mutex.h>
42#include <sys/endian.h>
43#include <sys/sema.h>
44#include <sys/taskqueue.h>
45#include <vm/uma.h>
46#include <machine/bus.h>
47#include <machine/resource.h>
48
49#include <sys/ata.h>
50#include <dev/ata/ata-all.h>
51#include <dev/ofw/ofw_bus.h>
52#include <dev/ofw/ofw_bus_subr.h>
53
54#include "ata_if.h"
55
56#include "mvreg.h"
57#include "mvvar.h"
58
59/* Useful macros */
60#define EDMA_TIMEOUT		100000 /* 100 ms */
61#define SATA_INL(sc, reg)	ATA_INL((sc)->sc_mem_res, reg)
62#define SATA_OUTL(sc, reg, val)	ATA_OUTL((sc)->sc_mem_res, reg, val)
63
64/* HW-related data structures */
65struct sata_prdentry {
66	uint32_t	prd_addrlo;
67	uint32_t	prd_count;
68	uint32_t	prd_addrhi;
69	uint32_t	prd_reserved;
70};
71
72struct sata_crqb {
73	uint32_t	crqb_prdlo;
74	uint32_t	crqb_prdhi;
75	uint32_t	crqb_flags;
76	uint16_t	crqb_count;
77	uint16_t	crqb_reserved1[2];
78	uint8_t		crqb_ata_command;
79	uint8_t		crqb_ata_feature;
80	uint8_t		crqb_ata_lba_low;
81	uint8_t		crqb_ata_lba_mid;
82	uint8_t		crqb_ata_lba_high;
83	uint8_t		crqb_ata_device;
84	uint8_t		crqb_ata_lba_low_p;
85	uint8_t		crqb_ata_lba_mid_p;
86	uint8_t		crqb_ata_lba_high_p;
87	uint8_t		crqb_ata_feature_p;
88	uint8_t		crqb_ata_count;
89	uint8_t		crqb_ata_count_p;
90	uint16_t	crqb_reserved2;
91};
92
93struct sata_crpb {
94	uint8_t		crpb_tag;
95	uint8_t		crpb_reserved;
96	uint8_t		crpb_edma_status;
97	uint8_t		crpb_dev_status;
98	uint32_t	crpb_timestamp;
99};
100
101/* Identification section. */
102struct sata_softc {
103	device_t		sc_dev;
104	unsigned int		sc_version;
105	unsigned int		sc_edma_qlen;
106	uint32_t		sc_edma_reqis_mask;
107	uint32_t		sc_edma_resos_mask;
108	struct resource		*sc_mem_res;
109	bus_space_tag_t		sc_mem_res_bustag;
110	bus_space_handle_t	sc_mem_res_bushdl;
111	struct resource		*sc_irq_res;
112	void			*sc_irq_cookiep;
113	struct {
114		void	(*function)(void *);
115		void	*argument;
116	} sc_interrupt[SATA_CHAN_NUM];
117};
118
119/* Controller functions */
120static int	sata_probe(device_t dev);
121static int	sata_attach(device_t dev);
122static int	sata_detach(device_t dev);
123static void	sata_intr(void*);
124static struct resource * sata_alloc_resource(device_t dev, device_t child,
125    int type, int *rid, u_long start, u_long end, u_long count, u_int flags);
126static int	sata_release_resource(device_t dev, device_t child, int type,
127    int rid, struct resource *r);
128static int	sata_setup_intr(device_t dev, device_t child,
129    struct resource *irq, int flags, driver_filter_t *filt,
130    driver_intr_t *function, void *argument, void **cookiep);
131static int	sata_teardown_intr(device_t dev, device_t child,
132    struct resource *irq, void *cookie);
133
134/* Channel functions */
135static int	sata_channel_probe(device_t dev);
136static int	sata_channel_attach(device_t dev);
137static int	sata_channel_detach(device_t dev);
138static int	sata_channel_begin_transaction(struct ata_request *request);
139static int	sata_channel_end_transaction(struct ata_request *request);
140static int	sata_channel_status(device_t dev);
141static int	sata_channel_setmode(device_t dev, int target, int mode);
142static int	sata_channel_getrev(device_t dev, int target);
143static void	sata_channel_reset(device_t dev);
144static void	sata_channel_dmasetprd(void *xsc, bus_dma_segment_t *segs,
145    int nsegs, int error);
146
147/* EDMA functions */
148static int	sata_edma_ctrl(device_t dev, int on);
149static int	sata_edma_is_running(device_t);
150
151static device_method_t sata_methods[] = {
152	/* Device method */
153	DEVMETHOD(device_probe,		sata_probe),
154	DEVMETHOD(device_attach,	sata_attach),
155	DEVMETHOD(device_detach,	sata_detach),
156	DEVMETHOD(device_shutdown,	bus_generic_shutdown),
157	DEVMETHOD(device_suspend,	bus_generic_suspend),
158	DEVMETHOD(device_resume,	bus_generic_resume),
159
160	/* ATA bus methods. */
161	DEVMETHOD(bus_alloc_resource,		sata_alloc_resource),
162	DEVMETHOD(bus_release_resource,		sata_release_resource),
163	DEVMETHOD(bus_activate_resource,	bus_generic_activate_resource),
164	DEVMETHOD(bus_deactivate_resource,	bus_generic_deactivate_resource),
165	DEVMETHOD(bus_setup_intr,		sata_setup_intr),
166	DEVMETHOD(bus_teardown_intr,		sata_teardown_intr),
167	{ 0, 0 },
168};
169
170static driver_t sata_driver = {
171	"sata",
172	sata_methods,
173	sizeof(struct sata_softc),
174};
175
176devclass_t sata_devclass;
177
178DRIVER_MODULE(sata, simplebus, sata_driver, sata_devclass, 0, 0);
179MODULE_VERSION(sata, 1);
180MODULE_DEPEND(sata, ata, 1, 1, 1);
181
182static int
183sata_probe(device_t dev)
184{
185	struct sata_softc *sc;
186	uint32_t d, r;
187
188	if (!ofw_bus_is_compatible(dev, "mrvl,sata"))
189		return (ENXIO);
190
191	soc_id(&d, &r);
192	sc = device_get_softc(dev);
193
194	switch(d) {
195	case MV_DEV_88F5182:
196		sc->sc_version = 1;
197		sc->sc_edma_qlen = 128;
198		break;
199	case MV_DEV_88F6281:
200	case MV_DEV_88F6282:
201	case MV_DEV_MV78100:
202	case MV_DEV_MV78100_Z0:
203		sc->sc_version = 2;
204		sc->sc_edma_qlen = 32;
205		break;
206	default:
207		device_printf(dev, "unsupported SoC (ID: 0x%08X)!\n", d);
208		return (ENXIO);
209	}
210
211	sc->sc_edma_reqis_mask = (sc->sc_edma_qlen - 1) << SATA_EDMA_REQIS_OFS;
212	sc->sc_edma_resos_mask = (sc->sc_edma_qlen - 1) << SATA_EDMA_RESOS_OFS;
213
214	device_set_desc(dev, "Marvell Integrated SATA Controller");
215	return (0);
216}
217
218static int
219sata_attach(device_t dev)
220{
221	struct sata_softc *sc;
222	int mem_id, irq_id, error, i;
223	device_t ata_chan;
224	uint32_t reg;
225
226	sc = device_get_softc(dev);
227	sc->sc_dev = dev;
228	mem_id = 0;
229	irq_id = 0;
230
231	/* Allocate resources */
232	sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
233	    &mem_id, RF_ACTIVE);
234	if (sc->sc_mem_res == NULL) {
235		device_printf(dev, "could not allocate memory.\n");
236		return (ENOMEM);
237	}
238
239	sc->sc_mem_res_bustag = rman_get_bustag(sc->sc_mem_res);
240	sc->sc_mem_res_bushdl = rman_get_bushandle(sc->sc_mem_res);
241	KASSERT(sc->sc_mem_res_bustag && sc->sc_mem_res_bushdl,
242	    ("cannot get bus handle or tag."));
243
244	sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &irq_id,
245	    RF_ACTIVE);
246	if (sc->sc_irq_res == NULL) {
247		device_printf(dev, "could not allocate IRQ.\n");
248		error = ENOMEM;
249		goto err;
250	}
251
252	error = bus_setup_intr(dev, sc->sc_irq_res,
253	    INTR_TYPE_BIO | INTR_MPSAFE | INTR_ENTROPY,
254	    NULL, sata_intr, sc, &sc->sc_irq_cookiep);
255	if (error != 0) {
256		device_printf(dev, "could not setup interrupt.\n");
257		goto err;
258	}
259
260	/* Attach channels */
261	for (i = 0; i < SATA_CHAN_NUM; i++) {
262		ata_chan = device_add_child(dev, "ata",
263		    devclass_find_free_unit(ata_devclass, 0));
264
265		if (!ata_chan) {
266			device_printf(dev, "cannot add channel %d.\n", i);
267			error = ENOMEM;
268			goto err;
269		}
270	}
271
272	/* Disable interrupt coalescing */
273	reg = SATA_INL(sc, SATA_CR);
274	for (i = 0; i < SATA_CHAN_NUM; i++)
275		reg |= SATA_CR_COALDIS(i);
276
277	/* Disable DMA byte swapping */
278	if (sc->sc_version == 2)
279		reg |= SATA_CR_NODMABS | SATA_CR_NOEDMABS |
280		    SATA_CR_NOPRDPBS;
281
282	SATA_OUTL(sc, SATA_CR, reg);
283
284	/* Clear and mask all interrupts */
285	SATA_OUTL(sc, SATA_ICR, 0);
286	SATA_OUTL(sc, SATA_MIMR, 0);
287
288	return(bus_generic_attach(dev));
289
290err:
291	sata_detach(dev);
292	return (error);
293}
294
295static int
296sata_detach(device_t dev)
297{
298	struct sata_softc *sc;
299
300	sc = device_get_softc(dev);
301
302	if (device_is_attached(dev))
303		bus_generic_detach(dev);
304
305	if (sc->sc_mem_res != NULL) {
306		bus_release_resource(dev, SYS_RES_MEMORY,
307		    rman_get_rid(sc->sc_mem_res), sc->sc_mem_res);
308		sc->sc_mem_res = NULL;
309	}
310
311	if (sc->sc_irq_res != NULL) {
312		bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_irq_cookiep);
313		bus_release_resource(dev, SYS_RES_IRQ,
314		    rman_get_rid(sc->sc_irq_res), sc->sc_irq_res);
315		sc->sc_irq_res = NULL;
316	}
317
318	return (0);
319}
320
321static struct resource *
322sata_alloc_resource(device_t dev, device_t child, int type, int *rid,
323    u_long start, u_long end, u_long count, u_int flags)
324{
325	struct sata_softc *sc;
326
327	sc = device_get_softc(dev);
328
329	KASSERT(type == SYS_RES_IRQ && *rid == ATA_IRQ_RID,
330	    ("illegal resource request (type %u, rid %u).",
331	    type, *rid));
332
333	return (sc->sc_irq_res);
334}
335
336static int
337sata_release_resource(device_t dev, device_t child, int type, int rid,
338    struct resource *r)
339{
340
341	KASSERT(type == SYS_RES_IRQ && rid == ATA_IRQ_RID,
342	    ("strange type %u and/or rid %u while releasing resource.", type,
343	    rid));
344
345	return (0);
346}
347
348static int
349sata_setup_intr(device_t dev, device_t child, struct resource *irq, int flags,
350    driver_filter_t *filt, driver_intr_t *function, void *argument,
351    void **cookiep)
352{
353	struct sata_softc *sc;
354	struct ata_channel *ch;
355
356	sc = device_get_softc(dev);
357	ch = device_get_softc(child);
358
359	if (filt != NULL) {
360		device_printf(dev, "filter interrupts are not supported.\n");
361		return (EINVAL);
362	}
363
364	sc->sc_interrupt[ch->unit].function = function;
365	sc->sc_interrupt[ch->unit].argument = argument;
366	*cookiep = sc;
367
368	return (0);
369}
370
371static int
372sata_teardown_intr(device_t dev, device_t child, struct resource *irq,
373    void *cookie)
374{
375	struct sata_softc *sc;
376	struct ata_channel *ch;
377
378	sc = device_get_softc(dev);
379	ch = device_get_softc(child);
380
381	sc->sc_interrupt[ch->unit].function = NULL;
382	sc->sc_interrupt[ch->unit].argument = NULL;
383
384	return (0);
385}
386
387static void
388sata_intr(void *xsc)
389{
390	struct sata_softc *sc;
391	int unit;
392
393	sc = xsc;
394
395	/*
396	 * Behave like ata_generic_intr() for PCI controllers.
397	 * Simply invoke ISRs on all channels.
398	 */
399	for (unit = 0; unit < SATA_CHAN_NUM; unit++)
400		if (sc->sc_interrupt[unit].function != NULL)
401			sc->sc_interrupt[unit].function(
402			    sc->sc_interrupt[unit].argument);
403}
404
405static int
406sata_channel_probe(device_t dev)
407{
408
409	device_set_desc(dev, "Marvell Integrated SATA Channel");
410	return (ata_probe(dev));
411}
412
413static int
414sata_channel_attach(device_t dev)
415{
416	struct sata_softc *sc;
417	struct ata_channel *ch;
418	uint64_t work;
419	int error, i;
420
421	sc = device_get_softc(device_get_parent(dev));
422	ch = device_get_softc(dev);
423
424	if (ch->attached)
425		return (0);
426
427	ch->dev = dev;
428	ch->unit = device_get_unit(dev);
429	ch->flags |= ATA_USE_16BIT | ATA_NO_SLAVE | ATA_SATA;
430
431	/* Set legacy ATA resources. */
432	for (i = ATA_DATA; i <= ATA_COMMAND; i++) {
433		ch->r_io[i].res = sc->sc_mem_res;
434		ch->r_io[i].offset = SATA_SHADOWR_BASE(ch->unit) + (i << 2);
435	}
436
437	ch->r_io[ATA_CONTROL].res = sc->sc_mem_res;
438	ch->r_io[ATA_CONTROL].offset = SATA_SHADOWR_CONTROL(ch->unit);
439
440	ch->r_io[ATA_IDX_ADDR].res = sc->sc_mem_res;
441	ata_default_registers(dev);
442
443	/* Set SATA resources. */
444	ch->r_io[ATA_SSTATUS].res = sc->sc_mem_res;
445	ch->r_io[ATA_SSTATUS].offset = SATA_SATA_SSTATUS(ch->unit);
446	ch->r_io[ATA_SERROR].res = sc->sc_mem_res;
447	ch->r_io[ATA_SERROR].offset = SATA_SATA_SERROR(ch->unit);
448	ch->r_io[ATA_SCONTROL].res = sc->sc_mem_res;
449	ch->r_io[ATA_SCONTROL].offset = SATA_SATA_SCONTROL(ch->unit);
450	ata_generic_hw(dev);
451
452	ch->hw.begin_transaction = sata_channel_begin_transaction;
453	ch->hw.end_transaction = sata_channel_end_transaction;
454	ch->hw.status = sata_channel_status;
455
456	/* Set DMA resources */
457	ata_dmainit(dev);
458	ch->dma.setprd = sata_channel_dmasetprd;
459
460	/* Clear work area */
461	KASSERT(sc->sc_edma_qlen * (sizeof(struct sata_crqb) +
462	    sizeof(struct sata_crpb)) <= ch->dma.max_iosize,
463	    ("insufficient DMA memory for request/response queues.\n"));
464	bzero(ch->dma.work, sc->sc_edma_qlen * (sizeof(struct sata_crqb) +
465	    sizeof(struct sata_crpb)));
466	bus_dmamap_sync(ch->dma.work_tag, ch->dma.work_map,
467	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
468
469	/* Turn off EDMA engine */
470	error = sata_edma_ctrl(dev, 0);
471	if (error) {
472		ata_dmafini(dev);
473		return (error);
474	}
475
476	/*
477	 * Initialize EDMA engine:
478	 *	- Native Command Queuing off,
479	 *	- Non-Queued operation,
480	 *	- Host Queue Cache enabled.
481	 */
482	SATA_OUTL(sc, SATA_EDMA_CFG(ch->unit), SATA_EDMA_CFG_HQCACHE |
483	    (sc->sc_version == 1) ? SATA_EDMA_CFG_QL128 : 0);
484
485	/* Set request queue pointers */
486	work = ch->dma.work_bus;
487	SATA_OUTL(sc, SATA_EDMA_REQBAHR(ch->unit), work >> 32);
488	SATA_OUTL(sc, SATA_EDMA_REQIPR(ch->unit), work & 0xFFFFFFFF);
489	SATA_OUTL(sc, SATA_EDMA_REQOPR(ch->unit), work & 0xFFFFFFFF);
490
491	/* Set response queue pointers */
492	work += sc->sc_edma_qlen * sizeof(struct sata_crqb);
493	SATA_OUTL(sc, SATA_EDMA_RESBAHR(ch->unit), work >> 32);
494	SATA_OUTL(sc, SATA_EDMA_RESIPR(ch->unit), work & 0xFFFFFFFF);
495	SATA_OUTL(sc, SATA_EDMA_RESOPR(ch->unit), work & 0xFFFFFFFF);
496
497	/* Clear any outstanding interrupts */
498	ATA_IDX_OUTL(ch, ATA_SERROR, ATA_IDX_INL(ch, ATA_SERROR));
499	SATA_OUTL(sc, SATA_SATA_FISICR(ch->unit), 0);
500	SATA_OUTL(sc, SATA_EDMA_IECR(ch->unit), 0);
501	SATA_OUTL(sc, SATA_ICR,
502	    ~(SATA_ICR_DEV(ch->unit) | SATA_ICR_DMADONE(ch->unit)));
503
504	/* Umask channel interrupts */
505	SATA_OUTL(sc, SATA_EDMA_IEMR(ch->unit), 0xFFFFFFFF);
506	SATA_OUTL(sc, SATA_MIMR, SATA_INL(sc, SATA_MIMR) |
507	    SATA_MICR_DONE(ch->unit) | SATA_MICR_DMADONE(ch->unit) |
508	    SATA_MICR_ERR(ch->unit));
509
510	ch->attached = 1;
511
512	return (ata_attach(dev));
513}
514
515static int
516sata_channel_detach(device_t dev)
517{
518	struct sata_softc *sc;
519	struct ata_channel *ch;
520	int error;
521
522	sc = device_get_softc(device_get_parent(dev));
523	ch = device_get_softc(dev);
524
525	if (!ch->attached)
526		return (0);
527
528	/* Turn off EDMA engine */
529	sata_edma_ctrl(dev, 0);
530
531	/* Mask chanel interrupts */
532	SATA_OUTL(sc, SATA_EDMA_IEMR(ch->unit), 0);
533	SATA_OUTL(sc, SATA_MIMR, SATA_INL(sc, SATA_MIMR) & ~(
534	    SATA_MICR_DONE(ch->unit) | SATA_MICR_DMADONE(ch->unit) |
535	    SATA_MICR_ERR(ch->unit)));
536
537	error = ata_detach(dev);
538	ata_dmafini(dev);
539
540	ch->attached = 0;
541
542	return (error);
543}
544
545static int
546sata_channel_begin_transaction(struct ata_request *request)
547{
548	struct sata_softc *sc;
549	struct ata_channel *ch;
550	struct sata_crqb *crqb;
551	uint32_t req_in;
552	int error, slot;
553
554	sc = device_get_softc(device_get_parent(request->parent));
555	ch = device_get_softc(request->parent);
556
557	mtx_assert(&ch->state_mtx, MA_OWNED);
558
559	/* Only DMA R/W goes through the EDMA machine. */
560	if (request->u.ata.command != ATA_READ_DMA &&
561	    request->u.ata.command != ATA_WRITE_DMA &&
562	    request->u.ata.command != ATA_READ_DMA48 &&
563	    request->u.ata.command != ATA_WRITE_DMA48) {
564
565		/* Disable EDMA before accessing legacy registers */
566		if (sata_edma_is_running(request->parent)) {
567			error = sata_edma_ctrl(request->parent, 0);
568			if (error) {
569				request->result = error;
570				return (ATA_OP_FINISHED);
571			}
572		}
573
574		return (ata_begin_transaction(request));
575	}
576
577	/* Prepare data for DMA */
578	if ((error = ch->dma.load(request, NULL, NULL))) {
579		device_printf(request->parent, "setting up DMA failed!\n");
580		request->result = error;
581		return ATA_OP_FINISHED;
582	}
583
584	/* Get next free queue slot */
585	req_in = SATA_INL(sc, SATA_EDMA_REQIPR(ch->unit));
586	slot = (req_in & sc->sc_edma_reqis_mask) >> SATA_EDMA_REQIS_OFS;
587	crqb = (struct sata_crqb *)(ch->dma.work +
588	    (slot << SATA_EDMA_REQIS_OFS));
589
590	/* Fill in request */
591	bus_dmamap_sync(ch->dma.work_tag, ch->dma.work_map,
592	    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
593
594	crqb->crqb_prdlo = htole32((uint64_t)request->dma->sg_bus & 0xFFFFFFFF);
595	crqb->crqb_prdhi = htole32((uint64_t)request->dma->sg_bus >> 32);
596	crqb->crqb_flags = htole32((request->flags & ATA_R_READ ? 0x01 : 0x00) |
597	    (request->tag << 1));
598
599	crqb->crqb_ata_command = request->u.ata.command;
600	crqb->crqb_ata_feature = request->u.ata.feature;
601	crqb->crqb_ata_lba_low = request->u.ata.lba;
602	crqb->crqb_ata_lba_mid = request->u.ata.lba >> 8;
603	crqb->crqb_ata_lba_high = request->u.ata.lba >> 16;
604	crqb->crqb_ata_device = ((request->u.ata.lba >> 24) & 0x0F) | (1 << 6);
605	crqb->crqb_ata_lba_low_p = request->u.ata.lba >> 24;
606	crqb->crqb_ata_lba_mid_p = request->u.ata.lba >> 32;
607	crqb->crqb_ata_lba_high_p = request->u.ata.lba >> 40;
608	crqb->crqb_ata_feature_p = request->u.ata.feature >> 8;
609	crqb->crqb_ata_count = request->u.ata.count;
610	crqb->crqb_ata_count_p = request->u.ata.count >> 8;
611
612	bus_dmamap_sync(ch->dma.work_tag, ch->dma.work_map,
613	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
614
615	/* Enable EDMA if disabled */
616	if (!sata_edma_is_running(request->parent)) {
617		error = sata_edma_ctrl(request->parent, 1);
618		if (error) {
619			ch->dma.unload(request);
620			request->result = error;
621			return (ATA_OP_FINISHED);
622		}
623	}
624
625	/* Tell EDMA about new request */
626	req_in = (req_in & ~sc->sc_edma_reqis_mask) | (((slot + 1) <<
627	    SATA_EDMA_REQIS_OFS) & sc->sc_edma_reqis_mask);
628
629	SATA_OUTL(sc, SATA_EDMA_REQIPR(ch->unit), req_in);
630
631	return (ATA_OP_CONTINUES);
632}
633
634static int
635sata_channel_end_transaction(struct ata_request *request)
636{
637	struct sata_softc *sc;
638	struct ata_channel *ch;
639	struct sata_crpb *crpb;
640	uint32_t res_in, res_out, icr;
641	int slot;
642
643	sc = device_get_softc(device_get_parent(request->parent));
644	ch = device_get_softc(request->parent);
645
646	mtx_assert(&ch->state_mtx, MA_OWNED);
647
648	icr = SATA_INL(sc, SATA_ICR);
649	if (icr & SATA_ICR_DMADONE(ch->unit)) {
650		/* Get current response slot */
651		res_out = SATA_INL(sc, SATA_EDMA_RESOPR(ch->unit));
652		slot = (res_out & sc->sc_edma_resos_mask) >>
653		    SATA_EDMA_RESOS_OFS;
654		crpb = (struct sata_crpb *)(ch->dma.work +
655		    (sc->sc_edma_qlen * sizeof(struct sata_crqb)) +
656		    (slot << SATA_EDMA_RESOS_OFS));
657
658		/* Record this request status */
659		bus_dmamap_sync(ch->dma.work_tag, ch->dma.work_map,
660		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
661
662		request->status = crpb->crpb_dev_status;
663		request->error = 0;
664
665		bus_dmamap_sync(ch->dma.work_tag, ch->dma.work_map,
666		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
667
668		/* Update response queue pointer */
669		res_out = (res_out & ~sc->sc_edma_resos_mask) | (((slot + 1) <<
670		    SATA_EDMA_RESOS_OFS) & sc->sc_edma_resos_mask);
671
672		SATA_OUTL(sc, SATA_EDMA_RESOPR(ch->unit), res_out);
673
674		/* Ack DMA interrupt if there is nothing more to do */
675		res_in = SATA_INL(sc, SATA_EDMA_RESIPR(ch->unit));
676		res_in &= sc->sc_edma_resos_mask;
677		res_out &= sc->sc_edma_resos_mask;
678
679		if (res_in == res_out)
680			SATA_OUTL(sc, SATA_ICR,
681			    ~SATA_ICR_DMADONE(ch->unit));
682
683		/* Update progress */
684		if (!(request->status & ATA_S_ERROR) &&
685		    !(request->flags & ATA_R_TIMEOUT))
686			request->donecount = request->bytecount;
687
688		/* Unload DMA data */
689		ch->dma.unload(request);
690
691		return(ATA_OP_FINISHED);
692	}
693
694	/* Legacy ATA interrupt */
695	return (ata_end_transaction(request));
696}
697
698static int
699sata_channel_status(device_t dev)
700{
701	struct sata_softc *sc;
702	struct ata_channel *ch;
703	uint32_t icr, iecr;
704
705	sc = device_get_softc(device_get_parent(dev));
706	ch = device_get_softc(dev);
707
708	icr = SATA_INL(sc, SATA_ICR);
709	iecr = SATA_INL(sc, SATA_EDMA_IECR(ch->unit));
710
711	if ((icr & SATA_ICR_DEV(ch->unit)) || iecr) {
712		/* Disable EDMA before accessing SATA registers */
713		sata_edma_ctrl(dev, 0);
714		ata_sata_phy_check_events(dev, -1);
715
716		/* Ack device and error interrupt */
717		SATA_OUTL(sc, SATA_ICR, ~SATA_ICR_DEV(ch->unit));
718		SATA_OUTL(sc, SATA_EDMA_IECR(ch->unit), 0);
719	}
720
721	icr &= SATA_ICR_DEV(ch->unit) | SATA_ICR_DMADONE(ch->unit);
722	return (icr);
723}
724
725static void
726sata_channel_reset(device_t dev)
727{
728	struct sata_softc *sc;
729	struct ata_channel *ch;
730
731	sc = device_get_softc(device_get_parent(dev));
732	ch = device_get_softc(dev);
733
734	/* Disable EDMA before using legacy registers */
735	sata_edma_ctrl(dev, 0);
736
737	/* Mask all EDMA interrups */
738	SATA_OUTL(sc, SATA_EDMA_IEMR(ch->unit), 0);
739
740	/* Reset EDMA */
741	SATA_OUTL(sc, SATA_EDMA_CMD(ch->unit), SATA_EDMA_CMD_RESET);
742	DELAY(25);
743	SATA_OUTL(sc, SATA_EDMA_CMD(ch->unit), 0);
744
745	/* Reset PHY and device */
746	if (ata_sata_phy_reset(dev, -1, 1))
747		ata_generic_reset(dev);
748	else
749		ch->devices = 0;
750
751	/* Clear EDMA errors */
752	SATA_OUTL(sc, SATA_SATA_FISICR(ch->unit), 0);
753	SATA_OUTL(sc, SATA_EDMA_IECR(ch->unit), 0);
754
755	/* Unmask all EDMA interrups */
756	SATA_OUTL(sc, SATA_EDMA_IEMR(ch->unit), 0xFFFFFFFF);
757}
758
759static int
760sata_channel_setmode(device_t parent, int target, int mode)
761{
762
763	/* Disable EDMA before using legacy registers */
764	sata_edma_ctrl(parent, 0);
765	return (ata_sata_setmode(parent, target, mode));
766}
767
768static int
769sata_channel_getrev(device_t parent, int target)
770{
771
772	/* Disable EDMA before using legacy registers */
773	sata_edma_ctrl(parent, 0);
774	return (ata_sata_getrev(parent, target));
775}
776
777static void
778sata_channel_dmasetprd(void *xsc, bus_dma_segment_t *segs, int nsegs,
779    int error)
780{
781	struct ata_dmasetprd_args *args;
782	struct sata_prdentry *prd;
783	int i;
784
785	args = xsc;
786	prd = args->dmatab;
787
788	if ((args->error = error))
789		return;
790
791	for (i = 0; i < nsegs; i++) {
792		prd[i].prd_addrlo = htole32(segs[i].ds_addr);
793		prd[i].prd_addrhi = htole32((uint64_t)segs[i].ds_addr >> 32);
794		prd[i].prd_count = htole32(segs[i].ds_len);
795	}
796
797	prd[i - 1].prd_count |= htole32(ATA_DMA_EOT);
798	KASSERT(nsegs <= ATA_DMA_ENTRIES, ("too many DMA segment entries.\n"));
799	args->nsegs = nsegs;
800}
801
802static int
803sata_edma_ctrl(device_t dev, int on)
804{
805	struct sata_softc *sc;
806	struct ata_channel *ch;
807	int bit, timeout;
808	uint32_t reg;
809
810	sc = device_get_softc(device_get_parent(dev));
811	ch = device_get_softc(dev);
812	bit = on ? SATA_EDMA_CMD_ENABLE : SATA_EDMA_CMD_DISABLE;
813	timeout = EDMA_TIMEOUT;
814
815	SATA_OUTL(sc, SATA_EDMA_CMD(ch->unit), bit);
816
817	while (1) {
818		DELAY(1);
819
820		reg = SATA_INL(sc, SATA_EDMA_CMD(ch->unit));
821
822		/* Enable bit will be 1 after disable command completion */
823		if (on && (reg & SATA_EDMA_CMD_ENABLE))
824			break;
825
826		/* Disable bit will be 0 after disable command completion */
827		if (!on && !(reg & SATA_EDMA_CMD_DISABLE))
828			break;
829
830		if (timeout-- <= 0) {
831			device_printf(dev, "EDMA command timeout!\n");
832			return (ETIMEDOUT);
833		}
834	}
835
836	return (0);
837}
838
839static int
840sata_edma_is_running(device_t dev)
841{
842	struct sata_softc *sc;
843	struct ata_channel *ch;
844
845	sc = device_get_softc(device_get_parent(dev));
846	ch = device_get_softc(dev);
847
848	return (SATA_INL(sc, SATA_EDMA_CMD(ch->unit)) & SATA_EDMA_CMD_ENABLE);
849}
850
851static device_method_t sata_channel_methods[] = {
852	/* Device interface. */
853	DEVMETHOD(device_probe,		sata_channel_probe),
854	DEVMETHOD(device_attach,	sata_channel_attach),
855	DEVMETHOD(device_detach,	sata_channel_detach),
856	DEVMETHOD(device_shutdown,	bus_generic_shutdown),
857	DEVMETHOD(device_suspend,	ata_suspend),
858	DEVMETHOD(device_resume,	ata_resume),
859
860	/* ATA channel interface */
861	DEVMETHOD(ata_reset,		sata_channel_reset),
862	DEVMETHOD(ata_setmode,		sata_channel_setmode),
863	DEVMETHOD(ata_getrev,		sata_channel_getrev),
864	{ 0, 0 }
865};
866
867driver_t sata_channel_driver = {
868	"ata",
869	sata_channel_methods,
870	sizeof(struct ata_channel),
871};
872
873DRIVER_MODULE(ata, sata, sata_channel_driver, ata_devclass, 0, 0);
874