artsata.c revision 1.11 1 /* $NetBSD: artsata.c,v 1.11 2006/06/26 17:55:49 xtraeme Exp $ */
2
3 /*-
4 * Copyright (c) 2003 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Jason R. Thorpe of Wasabi Systems, Inc.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the NetBSD
21 * Foundation, Inc. and its contributors.
22 * 4. Neither the name of The NetBSD Foundation nor the names of its
23 * contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39 #include "opt_pciide.h"
40
41 #include <sys/cdefs.h>
42 __KERNEL_RCSID(0, "$NetBSD: artsata.c,v 1.11 2006/06/26 17:55:49 xtraeme Exp $");
43
44 #include <sys/param.h>
45 #include <sys/systm.h>
46 #include <sys/malloc.h>
47
48 #include <dev/pci/pcivar.h>
49 #include <dev/pci/pcidevs.h>
50 #include <dev/pci/pciidereg.h>
51 #include <dev/pci/pciidevar.h>
52 #include <dev/pci/pciide_i31244_reg.h>
53
54 #include <dev/ata/satareg.h>
55 #include <dev/ata/satavar.h>
56 #include <dev/ata/atareg.h>
57 #include <dev/ata/atavar.h>
58
59 static void artisea_chip_map(struct pciide_softc*, struct pci_attach_args *);
60
61 static int artsata_match(struct device *, struct cfdata *, void *);
62 static void artsata_attach(struct device *, struct device *, void *);
63
64 static const struct pciide_product_desc pciide_artsata_products[] = {
65 { PCI_PRODUCT_INTEL_31244,
66 0,
67 "Intel 31244 Serial ATA Controller",
68 artisea_chip_map,
69 },
70 { 0,
71 0,
72 NULL,
73 NULL
74 }
75 };
76
77 struct artisea_cmd_map
78 {
79 u_int8_t offset;
80 u_int8_t size;
81 };
82
83 static const struct artisea_cmd_map artisea_dpa_cmd_map[] =
84 {
85 {ARTISEA_SUPDDR, 4}, /* 0 Data */
86 {ARTISEA_SUPDER, 1}, /* 1 Error */
87 {ARTISEA_SUPDCSR, 2}, /* 2 Sector Count */
88 {ARTISEA_SUPDSNR, 2}, /* 3 Sector Number */
89 {ARTISEA_SUPDCLR, 2}, /* 4 Cylinder Low */
90 {ARTISEA_SUPDCHR, 2}, /* 5 Cylinder High */
91 {ARTISEA_SUPDDHR, 1}, /* 6 Device/Head */
92 {ARTISEA_SUPDCR, 1}, /* 7 Command */
93 {ARTISEA_SUPDSR, 1}, /* 8 Status */
94 {ARTISEA_SUPDFR, 2} /* 9 Feature */
95 };
96
97 #define ARTISEA_NUM_CHAN 4
98
99 CFATTACH_DECL(artsata, sizeof(struct pciide_softc),
100 artsata_match, artsata_attach, NULL, NULL);
101
102 static int
103 artsata_match(struct device *parent, struct cfdata *match, void *aux)
104 {
105 struct pci_attach_args *pa = aux;
106
107 if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL) {
108 if (pciide_lookup_product(pa->pa_id, pciide_artsata_products))
109 return (2);
110 }
111 return (0);
112 }
113
114 static void
115 artsata_attach(struct device *parent, struct device *self, void *aux)
116 {
117 struct pci_attach_args *pa = aux;
118 struct pciide_softc *sc = (struct pciide_softc *)self;
119
120 pciide_common_attach(sc, pa,
121 pciide_lookup_product(pa->pa_id, pciide_artsata_products));
122
123 }
124
125 static void
126 artisea_drv_probe(struct ata_channel *chp)
127 {
128 struct pciide_softc *sc = CHAN_TO_PCIIDE(chp);
129 struct wdc_regs *wdr = CHAN_TO_WDC_REGS(chp);
130 uint32_t scontrol, sstatus;
131 uint16_t scnt, sn, cl, ch;
132 int i, s;
133
134 /* XXX This should be done by other code. */
135 for (i = 0; i < 2; i++) {
136 chp->ch_drive[i].chnl_softc = chp;
137 chp->ch_drive[i].drive = i;
138 }
139
140 /*
141 * First we have to bring the PHYs online, in case the firmware
142 * has not already done so. The 31244 leaves the disks off-line
143 * on reset to avoid excessive power surges due to multiple spindle
144 * spin up.
145 *
146 * The work-around for errata #1 says that we must write 0 to the
147 * port first to be sure of correctly initializing the device.
148 *
149 * XXX will this try to bring multiple disks on-line too quickly?
150 */
151 bus_space_write_4 (wdr->cmd_iot, wdr->cmd_baseioh,
152 ARTISEA_SUPERSET_DPA_OFF + ARTISEA_SUPDSSCR, 0);
153 scontrol = SControl_IPM_NONE | SControl_SPD_ANY | SControl_DET_INIT;
154 bus_space_write_4 (wdr->cmd_iot, wdr->cmd_baseioh,
155 ARTISEA_SUPERSET_DPA_OFF + ARTISEA_SUPDSSCR, scontrol);
156
157 scontrol &= ~SControl_DET_INIT;
158 bus_space_write_4 (wdr->cmd_iot, wdr->cmd_baseioh,
159 ARTISEA_SUPERSET_DPA_OFF + ARTISEA_SUPDSSCR, scontrol);
160
161 delay(50 * 1000);
162 sstatus = bus_space_read_4(wdr->cmd_iot, wdr->cmd_baseioh,
163 ARTISEA_SUPERSET_DPA_OFF + ARTISEA_SUPDSSSR);
164
165 switch (sstatus & SStatus_DET_mask) {
166 case SStatus_DET_NODEV:
167 /* No Device; be silent. */
168 break;
169
170 case SStatus_DET_DEV_NE:
171 aprint_error("%s: port %d: device connected, but "
172 "communication not established\n",
173 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, chp->ch_channel);
174 break;
175
176 case SStatus_DET_OFFLINE:
177 aprint_error("%s: port %d: PHY offline\n",
178 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, chp->ch_channel);
179 break;
180
181 case SStatus_DET_DEV:
182 bus_space_write_1(wdr->cmd_iot, wdr->cmd_iohs[wd_sdh], 0,
183 WDSD_IBM);
184 delay(10); /* 400ns delay */
185 scnt = bus_space_read_2(wdr->cmd_iot,
186 wdr->cmd_iohs[wd_seccnt], 0);
187 sn = bus_space_read_2(wdr->cmd_iot,
188 wdr->cmd_iohs[wd_sector], 0);
189 cl = bus_space_read_2(wdr->cmd_iot,
190 wdr->cmd_iohs[wd_cyl_lo], 0);
191 ch = bus_space_read_2(wdr->cmd_iot,
192 wdr->cmd_iohs[wd_cyl_hi], 0);
193 printf("%s: port %d: scnt=0x%x sn=0x%x cl=0x%x ch=0x%x\n",
194 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, chp->ch_channel,
195 scnt, sn, cl, ch);
196 /*
197 * scnt and sn are supposed to be 0x1 for ATAPI, but in some
198 * cases we get wrong values here, so ignore it.
199 */
200 s = splbio();
201 if (cl == 0x14 && ch == 0xeb)
202 chp->ch_drive[0].drive_flags |= DRIVE_ATAPI;
203 else
204 chp->ch_drive[0].drive_flags |= DRIVE_ATA;
205 splx(s);
206
207 aprint_normal("%s: port %d: device present, speed: %s\n",
208 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, chp->ch_channel,
209 sata_speed(sstatus));
210 break;
211
212 default:
213 aprint_error("%s: port %d: unknown SStatus: 0x%08x\n",
214 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, chp->ch_channel,
215 sstatus);
216 }
217
218 }
219
220 static void
221 artisea_mapregs(struct pci_attach_args *pa, struct pciide_channel *cp,
222 bus_size_t *cmdsizep, bus_size_t *ctlsizep, int (*pci_intr)(void *))
223 {
224 struct pciide_softc *sc = CHAN_TO_PCIIDE(&cp->ata_channel);
225 struct ata_channel *wdc_cp = &cp->ata_channel;
226 struct wdc_regs *wdr = CHAN_TO_WDC_REGS(wdc_cp);
227 const char *intrstr;
228 pci_intr_handle_t intrhandle;
229 int i;
230
231 cp->compat = 0;
232
233 if (sc->sc_pci_ih == NULL) {
234 if (pci_intr_map(pa, &intrhandle) != 0) {
235 aprint_error("%s: couldn't map native-PCI interrupt\n",
236 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname);
237 goto bad;
238 }
239 intrstr = pci_intr_string(pa->pa_pc, intrhandle);
240 sc->sc_pci_ih = pci_intr_establish(pa->pa_pc,
241 intrhandle, IPL_BIO, pci_intr, sc);
242 if (sc->sc_pci_ih != NULL) {
243 aprint_normal("%s: using %s for native-PCI interrupt\n",
244 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname,
245 intrstr ? intrstr : "unknown interrupt");
246 } else {
247 aprint_error(
248 "%s: couldn't establish native-PCI interrupt",
249 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname);
250 if (intrstr != NULL)
251 aprint_normal(" at %s", intrstr);
252 aprint_normal("\n");
253 goto bad;
254 }
255 }
256 cp->ih = sc->sc_pci_ih;
257 wdr->cmd_iot = sc->sc_ba5_st;
258 if (bus_space_subregion (sc->sc_ba5_st, sc->sc_ba5_sh,
259 ARTISEA_DPA_PORT_BASE(wdc_cp->ch_channel), 0x200,
260 &wdr->cmd_baseioh) != 0) {
261 aprint_error("%s: couldn't map %s channel cmd regs\n",
262 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, cp->name);
263 goto bad;
264 }
265
266 wdr->ctl_iot = sc->sc_ba5_st;
267 if (bus_space_subregion(wdr->cmd_iot, wdr->cmd_baseioh,
268 ARTISEA_SUPDDCTLR, 1, &cp->ctl_baseioh) != 0) {
269 aprint_error("%s: couldn't map %s channel ctl regs\n",
270 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, cp->name);
271 goto bad;
272 }
273 wdr->ctl_ioh = cp->ctl_baseioh;
274
275 for (i = 0; i < WDC_NREG + 2; i++) {
276
277 if (bus_space_subregion(wdr->cmd_iot, wdr->cmd_baseioh,
278 artisea_dpa_cmd_map[i].offset, artisea_dpa_cmd_map[i].size,
279 &wdr->cmd_iohs[i]) != 0) {
280 aprint_error("%s: couldn't subregion %s channel "
281 "cmd regs\n",
282 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, cp->name);
283 goto bad;
284 }
285 }
286 wdr->data32iot = wdr->cmd_iot;
287 wdr->data32ioh = wdr->cmd_iohs[0];
288
289 wdcattach(wdc_cp);
290 return;
291
292 bad:
293 cp->ata_channel.ch_flags |= ATACH_DISABLED;
294 return;
295 }
296
297 static int
298 artisea_chansetup(struct pciide_softc *sc, int channel, pcireg_t interface)
299 {
300 struct pciide_channel *cp = &sc->pciide_channels[channel];
301 sc->wdc_chanarray[channel] = &cp->ata_channel;
302 cp->name = PCIIDE_CHANNEL_NAME(channel);
303 cp->ata_channel.ch_channel = channel;
304 cp->ata_channel.ch_atac = &sc->sc_wdcdev.sc_atac;
305 cp->ata_channel.ch_queue =
306 malloc(sizeof(struct ata_queue), M_DEVBUF, M_NOWAIT);
307 cp->ata_channel.ch_ndrive = 2;
308 if (cp->ata_channel.ch_queue == NULL) {
309 aprint_error("%s %s channel: "
310 "can't allocate memory for command queue",
311 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, cp->name);
312 return 0;
313 }
314 return 1;
315 }
316
317 static void
318 artisea_mapreg_dma(struct pciide_softc *sc, struct pci_attach_args *pa)
319 {
320 struct pciide_channel *pc;
321 int chan;
322 u_int32_t dma_ctl;
323 u_int32_t cacheline_len;
324
325 aprint_normal("%s: bus-master DMA support present",
326 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname);
327
328 sc->sc_dma_ok = 1;
329
330 /*
331 * Errata #4 says that if the cacheline length is not set correctly,
332 * we can get corrupt MWI and Memory-Block-Write transactions.
333 */
334 cacheline_len = PCI_CACHELINE(pci_conf_read (pa->pa_pc, pa->pa_tag,
335 PCI_BHLC_REG));
336 if (cacheline_len == 0) {
337 aprint_normal(", but unused (cacheline size not set in PCI conf)\n");
338 sc->sc_dma_ok = 0;
339 return;
340 }
341
342 /*
343 * Final step of the work-around is to force the DMA engine to use
344 * the cache-line length information.
345 */
346 dma_ctl = pci_conf_read(pa->pa_pc, pa->pa_tag, ARTISEA_PCI_SUDCSCR);
347 dma_ctl |= SUDCSCR_DMA_WCAE | SUDCSCR_DMA_RCAE;
348 pci_conf_write(pa->pa_pc, pa->pa_tag, ARTISEA_PCI_SUDCSCR, dma_ctl);
349
350 sc->sc_wdcdev.dma_arg = sc;
351 sc->sc_wdcdev.dma_init = pciide_dma_init;
352 sc->sc_wdcdev.dma_start = pciide_dma_start;
353 sc->sc_wdcdev.dma_finish = pciide_dma_finish;
354 sc->sc_dma_iot = sc->sc_ba5_st;
355 sc->sc_dmat = pa->pa_dmat;
356
357 if (device_cfdata(&sc->sc_wdcdev.sc_atac.atac_dev)->cf_flags &
358 PCIIDE_OPTIONS_NODMA) {
359 aprint_normal(
360 ", but unused (forced off by config file)\n");
361 sc->sc_dma_ok = 0;
362 return;
363 }
364
365 /*
366 * Set up the default handles for the DMA registers.
367 * Just reserve 32 bits for each handle, unless space
368 * doesn't permit it.
369 */
370 for (chan = 0; chan < ARTISEA_NUM_CHAN; chan++) {
371 pc = &sc->pciide_channels[chan];
372 if (bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh,
373 ARTISEA_DPA_PORT_BASE(chan) + ARTISEA_SUPDDCMDR, 2,
374 &pc->dma_iohs[IDEDMA_CMD]) != 0 ||
375 bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh,
376 ARTISEA_DPA_PORT_BASE(chan) + ARTISEA_SUPDDSR, 1,
377 &pc->dma_iohs[IDEDMA_CTL]) != 0 ||
378 bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh,
379 ARTISEA_DPA_PORT_BASE(chan) + ARTISEA_SUPDDDTPR, 4,
380 &pc->dma_iohs[IDEDMA_TBL]) != 0) {
381 sc->sc_dma_ok = 0;
382 aprint_normal(", but can't subregion registers\n");
383 return;
384 }
385 }
386
387 aprint_normal("\n");
388 }
389
390 static void
391 artisea_chip_map_dpa(struct pciide_softc *sc, struct pci_attach_args *pa)
392 {
393 struct pciide_channel *cp;
394 bus_size_t cmdsize, ctlsize;
395 pcireg_t interface;
396 int channel;
397
398 interface = PCI_INTERFACE(pa->pa_class);
399
400 aprint_normal("%s: interface wired in DPA mode\n",
401 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname);
402
403 if (pci_mapreg_map(pa, ARTISEA_PCI_DPA_BASE, PCI_MAPREG_MEM_TYPE_64BIT,
404 0, &sc->sc_ba5_st, &sc->sc_ba5_sh, NULL, NULL) != 0)
405 return;
406
407 artisea_mapreg_dma(sc, pa);
408
409 sc->sc_wdcdev.cap = WDC_CAPABILITY_WIDEREGS;
410
411 sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DATA16 | ATAC_CAP_DATA32;
412 sc->sc_wdcdev.sc_atac.atac_pio_cap = 4;
413 if (sc->sc_dma_ok) {
414 sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DMA | ATAC_CAP_UDMA;
415 sc->sc_wdcdev.irqack = pciide_irqack;
416 sc->sc_wdcdev.sc_atac.atac_dma_cap = 2;
417 sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
418 }
419 sc->sc_wdcdev.sc_atac.atac_set_modes = sata_setup_channel;
420
421 sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray;
422 sc->sc_wdcdev.sc_atac.atac_nchannels = ARTISEA_NUM_CHAN;
423 sc->sc_wdcdev.sc_atac.atac_probe = artisea_drv_probe;
424
425 wdc_allocate_regs(&sc->sc_wdcdev);
426
427 /*
428 * Perform a quick check to ensure that the device isn't configured
429 * in Spread-spectrum clocking mode. This feature is buggy and has
430 * been removed from the latest documentation.
431 *
432 * Note that although this bit is in the Channel regs, it's the same
433 * for all channels, so we check it just once here.
434 */
435 if ((bus_space_read_4 (sc->sc_ba5_st, sc->sc_ba5_sh,
436 ARTISEA_DPA_PORT_BASE(0) + ARTISEA_SUPERSET_DPA_OFF +
437 ARTISEA_SUPDPFR) & SUPDPFR_SSCEN) != 0) {
438 aprint_error("%s: Spread-specturm clocking not supported by device\n",
439 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname);
440 return;
441 }
442
443 /* Clear the LED0-only bit. */
444 pci_conf_write (pa->pa_pc, pa->pa_tag, ARTISEA_PCI_SUECSR0,
445 pci_conf_read (pa->pa_pc, pa->pa_tag, ARTISEA_PCI_SUECSR0) &
446 ~SUECSR0_LED0_ONLY);
447
448 for (channel = 0; channel < sc->sc_wdcdev.sc_atac.atac_nchannels;
449 channel++) {
450 cp = &sc->pciide_channels[channel];
451 if (artisea_chansetup(sc, channel, interface) == 0)
452 continue;
453 /* XXX We can probably do interrupts more efficiently. */
454 artisea_mapregs(pa, cp, &cmdsize, &ctlsize, pciide_pci_intr);
455 }
456 }
457
458 static void
459 artisea_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
460 {
461 struct pciide_channel *cp;
462 bus_size_t cmdsize, ctlsize;
463 pcireg_t interface;
464 int channel;
465
466 if (pciide_chipen(sc, pa) == 0)
467 return;
468
469 interface = PCI_INTERFACE(pa->pa_class);
470
471 if (interface == 0) {
472 artisea_chip_map_dpa (sc, pa);
473 return;
474 }
475
476 aprint_normal("%s: bus-master DMA support present",
477 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname);
478 #ifdef PCIIDE_I31244_DISABLEDMA
479 if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_31244 &&
480 PCI_REVISION(pa->pa_class) == 0) {
481 aprint_normal(" but disabled due to rev. 0");
482 sc->sc_dma_ok = 0;
483 } else
484 #endif
485 pciide_mapreg_dma(sc, pa);
486 aprint_normal("\n");
487
488 /*
489 * XXX Configure LEDs to show activity.
490 */
491
492 sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DATA16 | ATAC_CAP_DATA32;
493 sc->sc_wdcdev.sc_atac.atac_pio_cap = 4;
494 if (sc->sc_dma_ok) {
495 sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DMA | ATAC_CAP_UDMA;
496 sc->sc_wdcdev.irqack = pciide_irqack;
497 sc->sc_wdcdev.sc_atac.atac_dma_cap = 2;
498 sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
499 }
500 sc->sc_wdcdev.sc_atac.atac_set_modes = sata_setup_channel;
501
502 sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray;
503 sc->sc_wdcdev.sc_atac.atac_nchannels = PCIIDE_NUM_CHANNELS;
504
505 wdc_allocate_regs(&sc->sc_wdcdev);
506
507 for (channel = 0; channel < sc->sc_wdcdev.sc_atac.atac_nchannels;
508 channel++) {
509 cp = &sc->pciide_channels[channel];
510 if (pciide_chansetup(sc, channel, interface) == 0)
511 continue;
512 pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
513 pciide_pci_intr);
514 }
515 }
516