From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: jgarzik@pobox.com
Cc: Alan Cox <alan@redhat.com>, Linux IDE <linux-ide@vger.kernel.org>
Subject: [PATCH] libata: Add MMIO support to pata_sil680
Date: Wed, 16 May 2007 10:21:34 +1000 [thread overview]
Message-ID: <20070516002204.B4AF6DDEC2@ozlabs.org> (raw)
This patch adds MMIO support to the pata_sil680 for taskfile IOs,
based on what the old siimage does.
I haven't bothered changing the chip setup stuff from PCI config
cycles to MMIO though (siimage does it), I don't think it matters,
I've only adapted it to use MMIO for taskfile accesses.
I've tested it on a Cell blade and it seems to work fine.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
This version uses a better name "use_ioports" for the fallback
label in the probe code.
drivers/ata/pata_sil680.c | 70 ++++++++++++++++++++++++++++++++++++++++------
1 file changed, 62 insertions(+), 8 deletions(-)
Index: linux-cell/drivers/ata/pata_sil680.c
===================================================================
--- linux-cell.orig/drivers/ata/pata_sil680.c 2007-05-15 16:15:11.000000000 +1000
+++ linux-cell/drivers/ata/pata_sil680.c 2007-05-16 10:15:43.000000000 +1000
@@ -35,6 +35,8 @@
#define DRV_NAME "pata_sil680"
#define DRV_VERSION "0.4.6"
+#define SIL680_MMIO_BAR 5
+
/**
* sil680_selreg - return register base
* @hwif: interface
@@ -278,7 +280,7 @@ static struct ata_port_operations sil680
* Returns the final clock settings.
*/
-static u8 sil680_init_chip(struct pci_dev *pdev)
+static u8 sil680_init_chip(struct pci_dev *pdev, int *try_mmio)
{
u32 class_rev = 0;
u8 tmpbyte = 0;
@@ -293,8 +295,10 @@ static u8 sil680_init_chip(struct pci_de
pci_read_config_byte(pdev, 0x8A, &tmpbyte);
- printk(KERN_INFO "sil680: BA5_EN = %d clock = %02X\n",
- tmpbyte & 1, tmpbyte & 0x30);
+ dev_dbg(&pdev->dev, "sil680: BA5_EN = %d clock = %02X\n",
+ tmpbyte & 1, tmpbyte & 0x30);
+
+ *try_mmio = (tmpbyte & 1) || pci_resource_start(pdev, 5);
switch(tmpbyte & 0x30) {
case 0x00:
@@ -315,8 +319,8 @@ static u8 sil680_init_chip(struct pci_de
}
pci_read_config_byte(pdev, 0x8A, &tmpbyte);
- printk(KERN_INFO "sil680: BA5_EN = %d clock = %02X\n",
- tmpbyte & 1, tmpbyte & 0x30);
+ dev_dbg(&pdev->dev, "sil680: BA5_EN = %d clock = %02X\n",
+ tmpbyte & 1, tmpbyte & 0x30);
pci_write_config_byte(pdev, 0xA1, 0x72);
pci_write_config_word(pdev, 0xA2, 0x328A);
@@ -339,7 +343,8 @@ static u8 sil680_init_chip(struct pci_de
return tmpbyte & 0x30;
}
-static int sil680_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
+static int __devinit sil680_init_one(struct pci_dev *pdev,
+ const struct pci_device_id *id)
{
static const struct ata_port_info info = {
.sht = &sil680_sht,
@@ -359,18 +364,67 @@ static int sil680_init_one(struct pci_de
};
const struct ata_port_info *ppi[] = { &info, NULL };
static int printed_version;
+ struct ata_host *host;
+ void __iomem *mmio_base;
+ int rc, try_mmio;
if (!printed_version++)
dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
- switch(sil680_init_chip(pdev))
- {
+ switch(sil680_init_chip(pdev, &try_mmio)) {
case 0:
ppi[0] = &info_slow;
break;
case 0x30:
return -ENODEV;
}
+
+ if (!try_mmio)
+ goto use_ioports;
+
+ /* Try to acquire MMIO resources and fallback to PIO if
+ * that fails
+ */
+ rc = pcim_enable_device(pdev);
+ if (rc)
+ return rc;
+ rc = pcim_iomap_regions(pdev, 1 << SIL680_MMIO_BAR, DRV_NAME);
+ if (rc)
+ goto use_ioports;
+
+ /* Allocate host and set it up */
+ host = ata_host_alloc_pinfo(&pdev->dev, ppi, 2);
+ if (!host)
+ return -ENOMEM;
+ host->iomap = pcim_iomap_table(pdev);
+
+ /* Setup DMA masks */
+ rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
+ if (rc)
+ return rc;
+ rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
+ if (rc)
+ return rc;
+ pci_set_master(pdev);
+
+ /* Get MMIO base and initialize port addresses */
+ mmio_base = host->iomap[SIL680_MMIO_BAR];
+ host->ports[0]->ioaddr.bmdma_addr = mmio_base + 0x00;
+ host->ports[0]->ioaddr.cmd_addr = mmio_base + 0x80;
+ host->ports[0]->ioaddr.ctl_addr = mmio_base + 0x8a;
+ host->ports[0]->ioaddr.altstatus_addr = mmio_base + 0x8a;
+ ata_std_ports(&host->ports[0]->ioaddr);
+ host->ports[1]->ioaddr.bmdma_addr = mmio_base + 0x08;
+ host->ports[1]->ioaddr.cmd_addr = mmio_base + 0xc0;
+ host->ports[1]->ioaddr.ctl_addr = mmio_base + 0xca;
+ host->ports[1]->ioaddr.altstatus_addr = mmio_base + 0xca;
+ ata_std_ports(&host->ports[1]->ioaddr);
+
+ /* Register & activate */
+ return ata_host_activate(host, pdev->irq, ata_interrupt, IRQF_SHARED,
+ &sil680_sht);
+
+use_ioports:
return ata_pci_init_one(pdev, ppi);
}
next reply other threads:[~2007-05-16 0:22 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-16 0:21 Benjamin Herrenschmidt [this message]
2007-05-16 12:05 ` [PATCH] libata: Add MMIO support to pata_sil680 Alan Cox
2007-05-16 12:12 ` Benjamin Herrenschmidt
2007-05-18 1:00 ` Jeff Garzik
-- strict thread matches above, loose matches on Subject: below --
2008-02-12 15:58 Tim Ellis
2008-02-12 21:02 ` Benjamin Herrenschmidt
2008-02-12 21:42 ` Alan Cox
2008-02-15 15:52 ` Guennadi Liakhovetski
2008-02-15 15:53 ` Alan Cox
2008-02-15 21:45 ` Benjamin Herrenschmidt
2008-02-15 22:27 ` Alan Cox
2008-02-15 22:55 ` Benjamin Herrenschmidt
2008-02-15 23:56 ` Tim Ellis
2008-02-25 22:57 ` Jeff Garzik
2008-02-25 23:06 ` Guennadi Liakhovetski
2008-02-26 0:58 ` Benjamin Herrenschmidt
2008-02-15 21:36 ` Benjamin Herrenschmidt
2007-05-15 6:12 Benjamin Herrenschmidt
2007-05-15 6:14 ` Benjamin Herrenschmidt
2007-05-23 13:42 ` Alan Cox
2007-05-23 22:48 ` Benjamin Herrenschmidt
2007-05-23 23:31 ` Alan Cox
2007-05-23 23:43 ` Benjamin Herrenschmidt
2007-05-24 0:13 ` Alan Cox
2007-05-24 3:42 ` Benjamin Herrenschmidt
2007-05-24 9:54 ` Alan Cox
2007-05-24 10:52 ` Jeff Garzik
2007-05-24 11:09 ` Alan Cox
2007-05-24 11:09 ` Jeff Garzik
2007-05-25 0:29 ` Jeff Garzik
2007-05-25 0:40 ` Alan Cox
2007-05-25 0:51 ` Jeff Garzik
2007-05-25 14:20 ` Alan Cox
2007-05-28 2:21 ` Jeff Garzik
2007-05-24 6:02 ` Jeff Garzik
2007-05-24 9:33 ` Alan Cox
2007-05-24 9:55 ` Jeff Garzik
2007-05-24 10:08 ` Benjamin Herrenschmidt
2007-05-24 20:56 ` Mark Lord
2007-05-24 22:52 ` Benjamin Herrenschmidt
2007-05-25 11:32 ` Mark Lord
2007-05-24 10:06 ` Benjamin Herrenschmidt
2007-05-15 6:11 Benjamin Herrenschmidt
2007-05-15 6:14 ` Benjamin Herrenschmidt
2007-05-15 11:08 ` Alan Cox
2007-05-15 20:32 ` Benjamin Herrenschmidt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070516002204.B4AF6DDEC2@ozlabs.org \
--to=benh@kernel.crashing.org \
--cc=alan@redhat.com \
--cc=jgarzik@pobox.com \
--cc=linux-ide@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.