libata: Add MMIO support to pata_sil680
PATCH 1/1 libata: Add MMIO support to pata_sil680
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.
---
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(-)
drivers/ata/pata_sil680.c +62 -8
@@ -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_depci_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_dereturn 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); }
Quoted 10 lines · Benjamin Herrenschmidt
This patch adds MMIO support to the
pata_sil680for 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 <[email protected]>
All we need now is >4GB support and its perfection ..
Quoted 8 lines · Alan Cox
Quoted 7 lines · Benjamin Herrenschmidt
This patch adds MMIO support to the
pata_sil680for 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.
Quoted 7 lines
Quoted 3 lines
I've tested it on a Cell blade and it seems to work fine.
Signed-off-by Benjamin Herrenschmidt <[email protected]>Acked-by Alan Cox <[email protected]>All we need now is >4GB support and its perfection ..
Sorry, I have an iommu :-)
Ben.
Jeff Garzik
AppliedQuoted 9 lines · Benjamin Herrenschmidt
This patch adds MMIO support to the
pata_sil680for 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.
Quoted 8 lines
Signed-off-by Benjamin Herrenschmidt <[email protected]>---
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(-)
applied to #upstream (queued for 2.6.23)