Lines Matching +full:hba +full:- +full:cap

1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * acard-ahci.c - ACard AHCI SATA support
7 * Please ALWAYS copy linux-ide@vger.kernel.org
13 * as Documentation/driver-api/libata.rst
26 #include <linux/dma-mapping.h>
35 #define DRV_NAME "acard-ahci"
70 AHCI_SHT("acard-ahci"),
115 struct ahci_host_priv *hpriv = host->private_data; in acard_ahci_pci_device_suspend()
116 void __iomem *mmio = hpriv->mmio; in acard_ahci_pci_device_suspend()
120 hpriv->flags & AHCI_HFLAG_NO_SUSPEND) { in acard_ahci_pci_device_suspend()
121 dev_err(&pdev->dev, in acard_ahci_pci_device_suspend()
123 return -EIO; in acard_ahci_pci_device_suspend()
129 * transition of the HBA to D3 state. in acard_ahci_pci_device_suspend()
149 if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) { in acard_ahci_pci_device_resume()
165 struct pci_dev *pdev = to_pci_dev(host->dev); in acard_ahci_pci_print_info()
191 for_each_sg(qc->sg, sg, qc->n_elem, si) { in acard_ahci_fill_sg()
197 * We must set an end-of-table (EOT) bit, in acard_ahci_fill_sg()
213 struct ata_port *ap = qc->ap; in acard_ahci_qc_prep()
214 struct ahci_port_priv *pp = ap->private_data; in acard_ahci_qc_prep()
215 int is_atapi = ata_is_atapi(qc->tf.protocol); in acard_ahci_qc_prep()
222 * a SATA Register - Host to Device command FIS. in acard_ahci_qc_prep()
224 cmd_tbl = pp->cmd_tbl + qc->hw_tag * AHCI_CMD_TBL_SZ; in acard_ahci_qc_prep()
226 ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, cmd_tbl); in acard_ahci_qc_prep()
229 memcpy(cmd_tbl + AHCI_CMD_TBL_CDB, qc->cdb, qc->dev->cdb_len); in acard_ahci_qc_prep()
232 if (qc->flags & ATA_QCFLAG_DMAMAP) in acard_ahci_qc_prep()
240 opts = cmd_fis_len | (qc->dev->link->pmp << 12); in acard_ahci_qc_prep()
241 if (qc->tf.flags & ATA_TFLAG_WRITE) in acard_ahci_qc_prep()
246 ahci_fill_cmd_slot(pp, qc->hw_tag, opts); in acard_ahci_qc_prep()
253 struct ahci_port_priv *pp = qc->ap->private_data; in acard_ahci_qc_fill_rtf()
254 u8 *rx_fis = pp->rx_fis; in acard_ahci_qc_fill_rtf()
256 if (pp->fbs_enabled) in acard_ahci_qc_fill_rtf()
257 rx_fis += qc->dev->link->pmp * ACARD_AHCI_RX_FIS_SZ; in acard_ahci_qc_fill_rtf()
260 * After a successful execution of an ATA PIO data-in command, in acard_ahci_qc_fill_rtf()
265 if (qc->tf.protocol == ATA_PROT_PIO && qc->dma_dir == DMA_FROM_DEVICE && in acard_ahci_qc_fill_rtf()
266 !(qc->flags & ATA_QCFLAG_EH)) { in acard_ahci_qc_fill_rtf()
267 ata_tf_from_fis(rx_fis + RX_FIS_PIO_SETUP, &qc->result_tf); in acard_ahci_qc_fill_rtf()
268 qc->result_tf.status = (rx_fis + RX_FIS_PIO_SETUP)[15]; in acard_ahci_qc_fill_rtf()
270 ata_tf_from_fis(rx_fis + RX_FIS_D2H_REG, &qc->result_tf); in acard_ahci_qc_fill_rtf()
275 struct ahci_host_priv *hpriv = ap->host->private_data; in acard_ahci_port_start()
276 struct device *dev = ap->host->dev; in acard_ahci_port_start()
284 return -ENOMEM; in acard_ahci_port_start()
287 if ((hpriv->cap & HOST_CAP_FBS) && sata_pmp_supported(ap)) { in acard_ahci_port_start()
291 pp->fbs_supported = true; in acard_ahci_port_start()
292 else if (hpriv->flags & AHCI_HFLAG_YES_FBS) { in acard_ahci_port_start()
294 ap->port_no); in acard_ahci_port_start()
295 pp->fbs_supported = true; in acard_ahci_port_start()
298 ap->port_no); in acard_ahci_port_start()
301 if (pp->fbs_supported) { in acard_ahci_port_start()
311 return -ENOMEM; in acard_ahci_port_start()
314 * First item in chunk of DMA memory: 32-slot command table, in acard_ahci_port_start()
317 pp->cmd_slot = mem; in acard_ahci_port_start()
318 pp->cmd_slot_dma = mem_dma; in acard_ahci_port_start()
324 * Second item: Received-FIS area in acard_ahci_port_start()
326 pp->rx_fis = mem; in acard_ahci_port_start()
327 pp->rx_fis_dma = mem_dma; in acard_ahci_port_start()
334 * and its scatter-gather table in acard_ahci_port_start()
336 pp->cmd_tbl = mem; in acard_ahci_port_start()
337 pp->cmd_tbl_dma = mem_dma; in acard_ahci_port_start()
343 pp->intr_mask = DEF_PORT_IRQ; in acard_ahci_port_start()
345 ap->private_data = pp; in acard_ahci_port_start()
353 unsigned int board_id = ent->driver_data; in acard_ahci_init_one()
356 struct device *dev = &pdev->dev; in acard_ahci_init_one()
363 ata_print_version_once(&pdev->dev, DRV_VERSION); in acard_ahci_init_one()
374 if (rc == -EBUSY) in acard_ahci_init_one()
381 return -ENOMEM; in acard_ahci_init_one()
383 hpriv->irq = pdev->irq; in acard_ahci_init_one()
384 hpriv->flags |= (unsigned long)pi.private_data; in acard_ahci_init_one()
386 if (!(hpriv->flags & AHCI_HFLAG_NO_MSI)) in acard_ahci_init_one()
389 hpriv->mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR]; in acard_ahci_init_one()
392 ahci_save_initial_config(&pdev->dev, hpriv); in acard_ahci_init_one()
395 if (hpriv->cap & HOST_CAP_NCQ) in acard_ahci_init_one()
398 if (hpriv->cap & HOST_CAP_PMP) in acard_ahci_init_one()
403 /* CAP.NP sometimes indicate the index of the last enabled in acard_ahci_init_one()
406 * both CAP.NP and port_map. in acard_ahci_init_one()
408 n_ports = max(ahci_nr_ports(hpriv->cap), fls(hpriv->port_map)); in acard_ahci_init_one()
410 host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports); in acard_ahci_init_one()
412 return -ENOMEM; in acard_ahci_init_one()
413 host->private_data = hpriv; in acard_ahci_init_one()
415 if (!(hpriv->cap & HOST_CAP_SSS) || ahci_ignore_sss) in acard_ahci_init_one()
416 host->flags |= ATA_HOST_PARALLEL_SCAN; in acard_ahci_init_one()
420 for (i = 0; i < host->n_ports; i++) { in acard_ahci_init_one()
421 struct ata_port *ap = host->ports[i]; in acard_ahci_init_one()
423 ata_port_pbar_desc(ap, AHCI_PCI_BAR, -1, "abar"); in acard_ahci_init_one()
425 0x100 + ap->port_no * 0x80, "port"); in acard_ahci_init_one()
429 ap->pm_policy = NOT_AVAILABLE; in acard_ahci_init_one()
431 /* disabled/not-implemented port */ in acard_ahci_init_one()
432 if (!(hpriv->port_map & (1 << i))) in acard_ahci_init_one()
433 ap->ops = &ata_dummy_port_ops; in acard_ahci_init_one()
437 rc = dma_set_mask_and_coherent(&pdev->dev, in acard_ahci_init_one()
438 DMA_BIT_MASK((hpriv->cap & HOST_CAP_64) ? 64 : 32)); in acard_ahci_init_one()
440 dev_err(&pdev->dev, "DMA enable failed\n"); in acard_ahci_init_one()
458 MODULE_DESCRIPTION("ACard AHCI SATA low-level driver");