Lines Matching refs:ctlr

114 	struct ahci_controller *ctlr = device_get_softc(dev);  in ahci_ctlr_setup()  local
116 ATA_OUTL(ctlr->r_mem, AHCI_IS, ATA_INL(ctlr->r_mem, AHCI_IS)); in ahci_ctlr_setup()
118 if (ctlr->ccc) { in ahci_ctlr_setup()
119 ATA_OUTL(ctlr->r_mem, AHCI_CCCP, ATA_INL(ctlr->r_mem, AHCI_PI)); in ahci_ctlr_setup()
120 ATA_OUTL(ctlr->r_mem, AHCI_CCCC, in ahci_ctlr_setup()
121 (ctlr->ccc << AHCI_CCCC_TV_SHIFT) | in ahci_ctlr_setup()
124 ctlr->cccv = (ATA_INL(ctlr->r_mem, AHCI_CCCC) & in ahci_ctlr_setup()
129 ctlr->ccc, ctlr->cccv); in ahci_ctlr_setup()
133 ATA_OUTL(ctlr->r_mem, AHCI_GHC, in ahci_ctlr_setup()
134 ATA_INL(ctlr->r_mem, AHCI_GHC) | AHCI_GHC_IE); in ahci_ctlr_setup()
141 struct ahci_controller *ctlr = device_get_softc(dev); in ahci_ctlr_reset() local
146 if ((ATA_INL(ctlr->r_mem, AHCI_VS) >= 0x00010200) && in ahci_ctlr_reset()
147 (ATA_INL(ctlr->r_mem, AHCI_CAP2) & AHCI_CAP2_BOH) && in ahci_ctlr_reset()
148 ((v = ATA_INL(ctlr->r_mem, AHCI_BOHC)) & AHCI_BOHC_OOS) == 0) { in ahci_ctlr_reset()
150 ATA_OUTL(ctlr->r_mem, AHCI_BOHC, v | AHCI_BOHC_OOS); in ahci_ctlr_reset()
155 v = ATA_INL(ctlr->r_mem, AHCI_BOHC); in ahci_ctlr_reset()
164 ATA_OUTL(ctlr->r_mem, AHCI_GHC, AHCI_GHC_AE); in ahci_ctlr_reset()
166 ATA_OUTL(ctlr->r_mem, AHCI_GHC, AHCI_GHC_AE|AHCI_GHC_HR); in ahci_ctlr_reset()
169 if ((ATA_INL(ctlr->r_mem, AHCI_GHC) & AHCI_GHC_HR) == 0) in ahci_ctlr_reset()
177 ATA_OUTL(ctlr->r_mem, AHCI_GHC, AHCI_GHC_AE); in ahci_ctlr_reset()
179 if (ctlr->quirks & AHCI_Q_RESTORE_CAP) { in ahci_ctlr_reset()
187 ATA_OUTL(ctlr->r_mem, AHCI_CAP, ctlr->caps); in ahci_ctlr_reset()
196 struct ahci_controller *ctlr = device_get_softc(dev); in ahci_attach() local
201 ctlr->dev = dev; in ahci_attach()
202 ctlr->ccc = 0; in ahci_attach()
204 device_get_unit(dev), "ccc", &ctlr->ccc); in ahci_attach()
205 mtx_init(&ctlr->ch_mtx, "AHCI channels lock", NULL, MTX_DEF); in ahci_attach()
208 ctlr->sc_iomem.rm_start = rman_get_start(ctlr->r_mem); in ahci_attach()
209 ctlr->sc_iomem.rm_end = rman_get_end(ctlr->r_mem); in ahci_attach()
210 ctlr->sc_iomem.rm_type = RMAN_ARRAY; in ahci_attach()
211 ctlr->sc_iomem.rm_descr = "I/O memory addresses"; in ahci_attach()
212 if ((error = rman_init(&ctlr->sc_iomem)) != 0) { in ahci_attach()
216 if ((error = rman_manage_region(&ctlr->sc_iomem, in ahci_attach()
217 rman_get_start(ctlr->r_mem), rman_get_end(ctlr->r_mem))) != 0) { in ahci_attach()
219 rman_fini(&ctlr->sc_iomem); in ahci_attach()
223 version = ATA_INL(ctlr->r_mem, AHCI_VS); in ahci_attach()
224 ctlr->caps = ATA_INL(ctlr->r_mem, AHCI_CAP); in ahci_attach()
226 ctlr->caps2 = ATA_INL(ctlr->r_mem, AHCI_CAP2); in ahci_attach()
227 if (ctlr->caps & AHCI_CAP_EMS) in ahci_attach()
228 ctlr->capsem = ATA_INL(ctlr->r_mem, AHCI_EM_CTL); in ahci_attach()
230 if (ctlr->quirks & AHCI_Q_FORCE_PI) { in ahci_attach()
237 int nports = (ctlr->caps & AHCI_CAP_NPMASK) + 1; in ahci_attach()
240 ATA_OUTL(ctlr->r_mem, AHCI_PI, nmask); in ahci_attach()
245 ctlr->ichannels = ATA_INL(ctlr->r_mem, AHCI_PI); in ahci_attach()
248 if ((ctlr->quirks & AHCI_Q_ALTSIG) && in ahci_attach()
249 (ctlr->caps & AHCI_CAP_SPM) == 0) in ahci_attach()
250 ctlr->quirks |= AHCI_Q_NOBSYRES; in ahci_attach()
252 if (ctlr->quirks & AHCI_Q_1CH) { in ahci_attach()
253 ctlr->caps &= ~AHCI_CAP_NPMASK; in ahci_attach()
254 ctlr->ichannels &= 0x01; in ahci_attach()
256 if (ctlr->quirks & AHCI_Q_2CH) { in ahci_attach()
257 ctlr->caps &= ~AHCI_CAP_NPMASK; in ahci_attach()
258 ctlr->caps |= 1; in ahci_attach()
259 ctlr->ichannels &= 0x03; in ahci_attach()
261 if (ctlr->quirks & AHCI_Q_4CH) { in ahci_attach()
262 ctlr->caps &= ~AHCI_CAP_NPMASK; in ahci_attach()
263 ctlr->caps |= 3; in ahci_attach()
264 ctlr->ichannels &= 0x0f; in ahci_attach()
266 ctlr->channels = MAX(flsl(ctlr->ichannels), in ahci_attach()
267 (ctlr->caps & AHCI_CAP_NPMASK) + 1); in ahci_attach()
268 if (ctlr->quirks & AHCI_Q_NOPMP) in ahci_attach()
269 ctlr->caps &= ~AHCI_CAP_SPM; in ahci_attach()
270 if (ctlr->quirks & AHCI_Q_NONCQ) in ahci_attach()
271 ctlr->caps &= ~AHCI_CAP_SNCQ; in ahci_attach()
272 if ((ctlr->caps & AHCI_CAP_CCCS) == 0) in ahci_attach()
273 ctlr->ccc = 0; in ahci_attach()
274 ctlr->emloc = ATA_INL(ctlr->r_mem, AHCI_EM_LOC); in ahci_attach()
278 (ctlr->caps & AHCI_CAP_64BIT) ? BUS_SPACE_MAXADDR : in ahci_attach()
281 ctlr->dma_coherent ? BUS_DMA_COHERENT : 0, NULL, NULL, in ahci_attach()
282 &ctlr->dma_tag)) { in ahci_attach()
284 rman_fini(&ctlr->sc_iomem); in ahci_attach()
292 bus_dma_tag_destroy(ctlr->dma_tag); in ahci_attach()
294 rman_fini(&ctlr->sc_iomem); in ahci_attach()
299 for (u = ctlr->ichannels; u != 0; u >>= 1) in ahci_attach()
301 ctlr->direct = (ctlr->msi && (ctlr->numirqs > 1 || i <= 3)); in ahci_attach()
303 "direct", &ctlr->direct); in ahci_attach()
305 speed = (ctlr->caps & AHCI_CAP_ISS) >> AHCI_CAP_ISS_SHIFT; in ahci_attach()
310 (ctlr->caps & AHCI_CAP_NPMASK) + 1, in ahci_attach()
313 (ctlr->caps & AHCI_CAP_SPM) ? in ahci_attach()
315 (ctlr->caps & AHCI_CAP_FBSS) ? in ahci_attach()
317 if (ctlr->quirks != 0) { in ahci_attach()
318 device_printf(dev, "quirks=0x%b\n", ctlr->quirks, in ahci_attach()
323 (ctlr->caps & AHCI_CAP_64BIT) ? " 64bit":"", in ahci_attach()
324 (ctlr->caps & AHCI_CAP_SNCQ) ? " NCQ":"", in ahci_attach()
325 (ctlr->caps & AHCI_CAP_SSNTF) ? " SNTF":"", in ahci_attach()
326 (ctlr->caps & AHCI_CAP_SMPS) ? " MPS":"", in ahci_attach()
327 (ctlr->caps & AHCI_CAP_SSS) ? " SS":"", in ahci_attach()
328 (ctlr->caps & AHCI_CAP_SALP) ? " ALP":"", in ahci_attach()
329 (ctlr->caps & AHCI_CAP_SAL) ? " AL":"", in ahci_attach()
330 (ctlr->caps & AHCI_CAP_SCLO) ? " CLO":"", in ahci_attach()
334 (ctlr->caps & AHCI_CAP_SAM) ? " AM":"", in ahci_attach()
335 (ctlr->caps & AHCI_CAP_SPM) ? " PM":"", in ahci_attach()
336 (ctlr->caps & AHCI_CAP_FBSS) ? " FBS":"", in ahci_attach()
337 (ctlr->caps & AHCI_CAP_PMD) ? " PMD":"", in ahci_attach()
338 (ctlr->caps & AHCI_CAP_SSC) ? " SSC":"", in ahci_attach()
339 (ctlr->caps & AHCI_CAP_PSC) ? " PSC":"", in ahci_attach()
340 ((ctlr->caps & AHCI_CAP_NCS) >> AHCI_CAP_NCS_SHIFT) + 1, in ahci_attach()
341 (ctlr->caps & AHCI_CAP_CCCS) ? " CCC":"", in ahci_attach()
342 (ctlr->caps & AHCI_CAP_EMS) ? " EM":"", in ahci_attach()
343 (ctlr->caps & AHCI_CAP_SXS) ? " eSATA":"", in ahci_attach()
344 (ctlr->caps & AHCI_CAP_NPMASK) + 1); in ahci_attach()
348 (ctlr->caps2 & AHCI_CAP2_DESO) ? " DESO":"", in ahci_attach()
349 (ctlr->caps2 & AHCI_CAP2_SADM) ? " SADM":"", in ahci_attach()
350 (ctlr->caps2 & AHCI_CAP2_SDS) ? " SDS":"", in ahci_attach()
351 (ctlr->caps2 & AHCI_CAP2_APST) ? " APST":"", in ahci_attach()
352 (ctlr->caps2 & AHCI_CAP2_NVMP) ? " NVMP":"", in ahci_attach()
353 (ctlr->caps2 & AHCI_CAP2_BOH) ? " BOH":""); in ahci_attach()
356 for (unit = 0; unit < ctlr->channels; unit++) { in ahci_attach()
363 if ((ctlr->ichannels & (1 << unit)) == 0) in ahci_attach()
367 for (; unit < ctlr->channels + ctlr->remapped_devices; unit++) { in ahci_attach()
376 int em = (ctlr->caps & AHCI_CAP_EMS) != 0; in ahci_attach()
393 struct ahci_controller *ctlr = device_get_softc(dev); in ahci_detach() local
402 for (i = 0; i < ctlr->numirqs; i++) { in ahci_detach()
403 if (ctlr->irqs[i].r_irq) { in ahci_detach()
404 bus_teardown_intr(dev, ctlr->irqs[i].r_irq, in ahci_detach()
405 ctlr->irqs[i].handle); in ahci_detach()
407 ctlr->irqs[i].r_irq_rid, ctlr->irqs[i].r_irq); in ahci_detach()
410 bus_dma_tag_destroy(ctlr->dma_tag); in ahci_detach()
412 rman_fini(&ctlr->sc_iomem); in ahci_detach()
414 mtx_destroy(&ctlr->ch_mtx); in ahci_detach()
421 struct ahci_controller *ctlr = device_get_softc(dev); in ahci_free_mem() local
424 if (ctlr->r_mem) in ahci_free_mem()
425 bus_release_resource(dev, SYS_RES_MEMORY, ctlr->r_rid, ctlr->r_mem); in ahci_free_mem()
426 if (ctlr->r_msix_table) in ahci_free_mem()
428 ctlr->r_msix_tab_rid, ctlr->r_msix_table); in ahci_free_mem()
429 if (ctlr->r_msix_pba) in ahci_free_mem()
431 ctlr->r_msix_pba_rid, ctlr->r_msix_pba); in ahci_free_mem()
433 ctlr->r_msix_pba = ctlr->r_mem = ctlr->r_msix_table = NULL; in ahci_free_mem()
439 struct ahci_controller *ctlr = device_get_softc(dev); in ahci_setup_interrupt() local
443 if (ctlr->numirqs > 1 && in ahci_setup_interrupt()
444 (ATA_INL(ctlr->r_mem, AHCI_GHC) & AHCI_GHC_MRSM) != 0) { in ahci_setup_interrupt()
446 ctlr->numirqs = 1; in ahci_setup_interrupt()
450 if (ctlr->numirqs > AHCI_MAX_IRQS) { in ahci_setup_interrupt()
452 ctlr->numirqs, AHCI_MAX_IRQS); in ahci_setup_interrupt()
453 ctlr->numirqs = AHCI_MAX_IRQS; in ahci_setup_interrupt()
457 for (i = 0; i < ctlr->numirqs; i++) { in ahci_setup_interrupt()
458 ctlr->irqs[i].ctlr = ctlr; in ahci_setup_interrupt()
459 ctlr->irqs[i].r_irq_rid = i + (ctlr->msi ? 1 : 0); in ahci_setup_interrupt()
460 if (ctlr->channels == 1 && !ctlr->ccc && ctlr->msi) in ahci_setup_interrupt()
461 ctlr->irqs[i].mode = AHCI_IRQ_MODE_ONE; in ahci_setup_interrupt()
462 else if (ctlr->numirqs == 1 || i >= ctlr->channels || in ahci_setup_interrupt()
463 (ctlr->ccc && i == ctlr->cccv)) in ahci_setup_interrupt()
464 ctlr->irqs[i].mode = AHCI_IRQ_MODE_ALL; in ahci_setup_interrupt()
465 else if (ctlr->channels > ctlr->numirqs && in ahci_setup_interrupt()
466 i == ctlr->numirqs - 1) in ahci_setup_interrupt()
467 ctlr->irqs[i].mode = AHCI_IRQ_MODE_AFTER; in ahci_setup_interrupt()
469 ctlr->irqs[i].mode = AHCI_IRQ_MODE_ONE; in ahci_setup_interrupt()
470 if (!(ctlr->irqs[i].r_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, in ahci_setup_interrupt()
471 &ctlr->irqs[i].r_irq_rid, RF_SHAREABLE | RF_ACTIVE))) { in ahci_setup_interrupt()
475 if ((bus_setup_intr(dev, ctlr->irqs[i].r_irq, ATA_INTR_FLAGS, NULL, in ahci_setup_interrupt()
476 (ctlr->irqs[i].mode != AHCI_IRQ_MODE_ONE) ? ahci_intr : in ahci_setup_interrupt()
477 ((ctlr->quirks & AHCI_Q_EDGEIS) ? ahci_intr_one_edge : in ahci_setup_interrupt()
479 &ctlr->irqs[i], &ctlr->irqs[i].handle))) { in ahci_setup_interrupt()
484 if (ctlr->numirqs > 1) { in ahci_setup_interrupt()
485 bus_describe_intr(dev, ctlr->irqs[i].r_irq, in ahci_setup_interrupt()
486 ctlr->irqs[i].handle, in ahci_setup_interrupt()
487 ctlr->irqs[i].mode == AHCI_IRQ_MODE_ONE ? in ahci_setup_interrupt()
501 struct ahci_controller *ctlr = irq->ctlr; in ahci_intr() local
508 if (ctlr->ccc) in ahci_intr()
509 is = ctlr->ichannels; in ahci_intr()
511 is = ATA_INL(ctlr->r_mem, AHCI_IS); in ahci_intr()
514 is = ATA_INL(ctlr->r_mem, AHCI_IS); in ahci_intr()
518 if (ctlr->ccc) in ahci_intr()
519 ise = 1 << ctlr->cccv; in ahci_intr()
521 if (ctlr->quirks & AHCI_Q_EDGEIS) in ahci_intr()
524 ATA_OUTL(ctlr->r_mem, AHCI_IS, ise); in ahci_intr()
525 for (; unit < ctlr->channels; unit++) { in ahci_intr()
527 (arg = ctlr->interrupt[unit].argument)) { in ahci_intr()
528 ctlr->interrupt[unit].function(arg); in ahci_intr()
531 for (; unit < ctlr->channels + ctlr->remapped_devices; unit++) { in ahci_intr()
532 if ((arg = ctlr->interrupt[unit].argument)) { in ahci_intr()
533 ctlr->interrupt[unit].function(arg); in ahci_intr()
538 if (!(ctlr->quirks & AHCI_Q_EDGEIS)) in ahci_intr()
539 ATA_OUTL(ctlr->r_mem, AHCI_IS, is); in ahci_intr()
540 ATA_RBL(ctlr->r_mem, AHCI_IS); in ahci_intr()
550 struct ahci_controller *ctlr = irq->ctlr; in ahci_intr_one() local
555 if ((arg = ctlr->interrupt[unit].argument)) in ahci_intr_one()
556 ctlr->interrupt[unit].function(arg); in ahci_intr_one()
558 ATA_OUTL(ctlr->r_mem, AHCI_IS, 1 << unit); in ahci_intr_one()
559 ATA_RBL(ctlr->r_mem, AHCI_IS); in ahci_intr_one()
566 struct ahci_controller *ctlr = irq->ctlr; in ahci_intr_one_edge() local
572 ATA_OUTL(ctlr->r_mem, AHCI_IS, 1 << unit); in ahci_intr_one_edge()
573 if ((arg = ctlr->interrupt[unit].argument)) in ahci_intr_one_edge()
574 ctlr->interrupt[unit].function(arg); in ahci_intr_one_edge()
575 ATA_RBL(ctlr->r_mem, AHCI_IS); in ahci_intr_one_edge()
582 struct ahci_controller *ctlr = device_get_softc(dev); in ahci_alloc_resource() local
592 unit -= ctlr->channels; in ahci_alloc_resource()
602 offset = ctlr->remap_offset + unit * ctlr->remap_size; in ahci_alloc_resource()
603 size = ctlr->remap_size; in ahci_alloc_resource()
607 } else if ((ctlr->caps & AHCI_CAP_EMS) == 0) { in ahci_alloc_resource()
613 offset = (ctlr->emloc & 0xffff0000) >> 14; in ahci_alloc_resource()
614 size = (ctlr->emloc & 0x0000ffff) << 2; in ahci_alloc_resource()
616 if (*rid == 2 && (ctlr->capsem & in ahci_alloc_resource()
623 st = rman_get_start(ctlr->r_mem); in ahci_alloc_resource()
624 res = rman_reserve_resource(&ctlr->sc_iomem, st + offset, in ahci_alloc_resource()
629 bsh = rman_get_bushandle(ctlr->r_mem); in ahci_alloc_resource()
630 bst = rman_get_bustag(ctlr->r_mem); in ahci_alloc_resource()
638 res = ctlr->irqs[0].r_irq; in ahci_alloc_resource()
665 struct ahci_controller *ctlr = device_get_softc(dev); in ahci_setup_intr() local
672 ctlr->interrupt[unit].function = function; in ahci_setup_intr()
673 ctlr->interrupt[unit].argument = argument; in ahci_setup_intr()
681 struct ahci_controller *ctlr = device_get_softc(dev); in ahci_teardown_intr() local
684 ctlr->interrupt[unit].function = NULL; in ahci_teardown_intr()
685 ctlr->interrupt[unit].argument = NULL; in ahci_teardown_intr()
717 struct ahci_controller *ctlr = device_get_softc(dev); in ahci_get_dma_tag() local
719 return (ctlr->dma_tag); in ahci_get_dma_tag()
725 struct ahci_controller *ctlr = device_get_softc(dev); in ahci_attached() local
727 mtx_lock(&ctlr->ch_mtx); in ahci_attached()
728 ctlr->ch[ch->unit] = ch; in ahci_attached()
729 mtx_unlock(&ctlr->ch_mtx); in ahci_attached()
735 struct ahci_controller *ctlr = device_get_softc(dev); in ahci_detached() local
737 mtx_lock(&ctlr->ch_mtx); in ahci_detached()
739 ctlr->ch[ch->unit] = NULL; in ahci_detached()
741 mtx_unlock(&ctlr->ch_mtx); in ahci_detached()
747 struct ahci_controller *ctlr = device_get_softc(dev); in ahci_getch() local
751 mtx_lock(&ctlr->ch_mtx); in ahci_getch()
752 ch = ctlr->ch[n]; in ahci_getch()
755 mtx_unlock(&ctlr->ch_mtx); in ahci_getch()
802 struct ahci_controller *ctlr = device_get_softc(device_get_parent(dev)); in ahci_ch_attach() local
812 ch->caps = ctlr->caps; in ahci_ch_attach()
813 ch->caps2 = ctlr->caps2; in ahci_ch_attach()
814 ch->start = ctlr->ch_start; in ahci_ch_attach()
815 ch->quirks = ctlr->quirks; in ahci_ch_attach()
816 ch->vendorid = ctlr->vendorid; in ahci_ch_attach()
817 ch->deviceid = ctlr->deviceid; in ahci_ch_attach()
818 ch->subvendorid = ctlr->subvendorid; in ahci_ch_attach()
819 ch->subdeviceid = ctlr->subdeviceid; in ahci_ch_attach()
830 if ((ctlr->quirks & AHCI_Q_SATA1_UNIT0) && ch->unit == 0) in ahci_ch_attach()
856 version = ATA_INL(ctlr->r_mem, AHCI_VS); in ahci_ch_attach()
857 if (version < 0x00010200 && (ctlr->caps & AHCI_CAP_FBSS)) in ahci_ch_attach()
882 ctlr->direct ? ahci_ch_intr_direct : ahci_ch_intr, in ahci_ch_attach()
2457 struct ahci_controller *ctlr = device_get_softc(device_get_parent(ch->dev)); in ahci_reset() local
2535 AHCI_P_IX_DP | AHCI_P_IX_UF | (ctlr->ccc ? 0 : AHCI_P_IX_SDB) | in ahci_reset()
2536 AHCI_P_IX_DS | AHCI_P_IX_PS | (ctlr->ccc ? 0 : AHCI_P_IX_DHR))); in ahci_reset()