Lines Matching +full:pdc +full:- +full:global
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * pdc_adma.c - Pacific Digital Corporation ADMA
10 * as Documentation/driver-api/libata.rst
12 * Supports ATA disks in single-packet ADMA mode.
41 ADMA_REGS((ap)->host->iomap[ADMA_MMIO_BAR], ap->port_no)
53 /* global register offsets */
56 /* per-channel register offsets */
104 board_1841_idx = 0, /* ADMA 2-port controller */
160 { PCI_VDEVICE(PDC, 0x1841), board_1841_idx },
190 struct adma_port_priv *pp = ap->private_data; in adma_reinit_engine()
194 writeb(ATA_NIEN, ap->ioaddr.ctl_addr); in adma_reinit_engine()
200 /* set in-FIFO threshold to 0x100 */ in adma_reinit_engine()
204 writel((u32)pp->pkt_dma, chan + ADMA_CPB_NEXT); in adma_reinit_engine()
206 /* set out-FIFO threshold to 0x100 */ in adma_reinit_engine()
229 writeb(ATA_NIEN, ap->ioaddr.ctl_addr); in adma_freeze()
246 struct ata_port *ap = link->ap; in adma_prereset()
247 struct adma_port_priv *pp = ap->private_data; in adma_prereset()
249 if (pp->state != adma_state_idle) /* healthy paranoia */ in adma_prereset()
250 pp->state = adma_state_mmio; in adma_prereset()
259 struct ata_port *ap = qc->ap; in adma_fill_sg()
260 struct adma_port_priv *pp = ap->private_data; in adma_fill_sg()
261 u8 *buf = pp->pkt, *last_buf = NULL; in adma_fill_sg()
263 u8 pFLAGS = pORD | ((qc->tf.flags & ATA_TFLAG_WRITE) ? pDIRO : 0); in adma_fill_sg()
266 for_each_sg(qc->sg, sg, qc->n_elem, si) { in adma_fill_sg()
280 buf[i++] = qc->dev->dma_mode & 0xf; in adma_fill_sg()
285 (pFLAGS & pEND) ? 0 : cpu_to_le32(pp->pkt_dma + i + 4); in adma_fill_sg()
300 struct adma_port_priv *pp = qc->ap->private_data; in adma_qc_prep()
301 u8 *buf = pp->pkt; in adma_qc_prep()
302 u32 pkt_dma = (u32)pp->pkt_dma; in adma_qc_prep()
307 adma_enter_reg_mode(qc->ap); in adma_qc_prep()
308 if (qc->tf.protocol != ATA_PROT_DMA) in adma_qc_prep()
326 buf[i++] = qc->tf.device; in adma_qc_prep()
328 if ((qc->tf.flags & ATA_TFLAG_LBA48)) { in adma_qc_prep()
329 buf[i++] = qc->tf.hob_nsect; in adma_qc_prep()
331 buf[i++] = qc->tf.hob_lbal; in adma_qc_prep()
333 buf[i++] = qc->tf.hob_lbam; in adma_qc_prep()
335 buf[i++] = qc->tf.hob_lbah; in adma_qc_prep()
338 buf[i++] = qc->tf.nsect; in adma_qc_prep()
340 buf[i++] = qc->tf.lbal; in adma_qc_prep()
342 buf[i++] = qc->tf.lbam; in adma_qc_prep()
344 buf[i++] = qc->tf.lbah; in adma_qc_prep()
350 buf[i++] = qc->tf.command; in adma_qc_prep()
353 buf[3] = (i >> 3) - 2; /* cLEN */ in adma_qc_prep()
379 struct ata_port *ap = qc->ap; in adma_packet_start()
390 struct adma_port_priv *pp = qc->ap->private_data; in adma_qc_issue()
392 switch (qc->tf.protocol) { in adma_qc_issue()
394 pp->state = adma_state_pkt; in adma_qc_issue()
406 pp->state = adma_state_mmio; in adma_qc_issue()
414 for (port_no = 0; port_no < host->n_ports; ++port_no) { in adma_intr_pkt()
415 struct ata_port *ap = host->ports[port_no]; in adma_intr_pkt()
425 pp = ap->private_data; in adma_intr_pkt()
426 if (!pp || pp->state != adma_state_pkt) in adma_intr_pkt()
428 qc = ata_qc_from_tag(ap, ap->link.active_tag); in adma_intr_pkt()
429 if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) { in adma_intr_pkt()
431 qc->err_mask |= AC_ERR_HOST_BUS; in adma_intr_pkt()
433 qc->err_mask |= AC_ERR_OTHER; in adma_intr_pkt()
435 if (pp->pkt[0] & cATERR) in adma_intr_pkt()
436 qc->err_mask |= AC_ERR_DEV; in adma_intr_pkt()
437 else if (pp->pkt[0] != cDONE) in adma_intr_pkt()
438 qc->err_mask |= AC_ERR_OTHER; in adma_intr_pkt()
440 if (!qc->err_mask) in adma_intr_pkt()
443 struct ata_eh_info *ehi = &ap->link.eh_info; in adma_intr_pkt()
446 "ADMA-status 0x%02X", status); in adma_intr_pkt()
448 "pkt[0] 0x%02X", pp->pkt[0]); in adma_intr_pkt()
450 if (qc->err_mask == AC_ERR_DEV) in adma_intr_pkt()
464 for (port_no = 0; port_no < host->n_ports; ++port_no) { in adma_intr_mmio()
465 struct ata_port *ap = host->ports[port_no]; in adma_intr_mmio()
466 struct adma_port_priv *pp = ap->private_data; in adma_intr_mmio()
469 if (!pp || pp->state != adma_state_mmio) in adma_intr_mmio()
471 qc = ata_qc_from_tag(ap, ap->link.active_tag); in adma_intr_mmio()
472 if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) { in adma_intr_mmio()
479 ap->print_id, qc->tf.protocol, status); in adma_intr_mmio()
482 pp->state = adma_state_idle; in adma_intr_mmio()
483 qc->err_mask |= ac_err_mask(status); in adma_intr_mmio()
484 if (!qc->err_mask) in adma_intr_mmio()
487 struct ata_eh_info *ehi = &ap->link.eh_info; in adma_intr_mmio()
491 if (qc->err_mask == AC_ERR_DEV) in adma_intr_mmio()
509 spin_lock(&host->lock); in adma_intr()
511 spin_unlock(&host->lock); in adma_intr()
520 port->cmd_addr = in adma_ata_setup_port()
521 port->data_addr = base + 0x000; in adma_ata_setup_port()
522 port->error_addr = in adma_ata_setup_port()
523 port->feature_addr = base + 0x004; in adma_ata_setup_port()
524 port->nsect_addr = base + 0x008; in adma_ata_setup_port()
525 port->lbal_addr = base + 0x00c; in adma_ata_setup_port()
526 port->lbam_addr = base + 0x010; in adma_ata_setup_port()
527 port->lbah_addr = base + 0x014; in adma_ata_setup_port()
528 port->device_addr = base + 0x018; in adma_ata_setup_port()
529 port->status_addr = in adma_ata_setup_port()
530 port->command_addr = base + 0x01c; in adma_ata_setup_port()
531 port->altstatus_addr = in adma_ata_setup_port()
532 port->ctl_addr = base + 0x038; in adma_ata_setup_port()
537 struct device *dev = ap->host->dev; in adma_port_start()
543 return -ENOMEM; in adma_port_start()
544 pp->pkt = dmam_alloc_coherent(dev, ADMA_PKT_BYTES, &pp->pkt_dma, in adma_port_start()
546 if (!pp->pkt) in adma_port_start()
547 return -ENOMEM; in adma_port_start()
549 if ((pp->pkt_dma & 7) != 0) { in adma_port_start()
550 printk(KERN_ERR "bad alignment for pp->pkt_dma: %08x\n", in adma_port_start()
551 (u32)pp->pkt_dma); in adma_port_start()
552 return -ENOMEM; in adma_port_start()
554 ap->private_data = pp; in adma_port_start()
569 writeb(7, host->iomap[ADMA_MMIO_BAR] + ADMA_MODE_LOCK); in adma_host_init()
573 adma_reset_engine(host->ports[port_no]); in adma_host_init()
579 unsigned int board_idx = (unsigned int) ent->driver_data; in adma_ata_init_one()
585 ata_print_version_once(&pdev->dev, DRV_VERSION); in adma_ata_init_one()
588 host = ata_host_alloc_pinfo(&pdev->dev, ppi, ADMA_PORTS); in adma_ata_init_one()
590 return -ENOMEM; in adma_ata_init_one()
598 return -ENODEV; in adma_ata_init_one()
603 host->iomap = pcim_iomap_table(pdev); in adma_ata_init_one()
604 mmio_base = host->iomap[ADMA_MMIO_BAR]; in adma_ata_init_one()
606 rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); in adma_ata_init_one()
608 dev_err(&pdev->dev, "32-bit DMA enable failed\n"); in adma_ata_init_one()
613 struct ata_port *ap = host->ports[port_no]; in adma_ata_init_one()
615 unsigned int offset = port_base - mmio_base; in adma_ata_init_one()
617 adma_ata_setup_port(&ap->ioaddr, port_base); in adma_ata_init_one()
619 ata_port_pbar_desc(ap, ADMA_MMIO_BAR, -1, "mmio"); in adma_ata_init_one()
627 return ata_host_activate(host, pdev->irq, adma_intr, IRQF_SHARED, in adma_ata_init_one()
634 MODULE_DESCRIPTION("Pacific Digital Corporation ADMA low-level driver");