[U-Boot] [PATCH v2 21/26] dm: ahci: Convert to use new DM PCI API
Bin Meng
bmeng.cn at gmail.com
Mon Dec 7 12:27:50 CET 2015
On Mon, Nov 30, 2015 at 4:18 AM, Simon Glass <sjg at chromium.org> wrote:
> Convert this driver to use the new driver model PCI API.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> Changes in v2:
> - Fix use of 'pdev' instead of 'dev'
> - Get the vendor from the PCI parent platdata
> - Use pci_bus_find_bdf()
>
> drivers/block/ahci.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++------
> include/ahci.h | 4 +++
> 2 files changed, 67 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/block/ahci.c b/drivers/block/ahci.c
> index 1ad638e..e5f4a04 100644
> --- a/drivers/block/ahci.c
> +++ b/drivers/block/ahci.c
> @@ -10,6 +10,7 @@
> #include <common.h>
>
> #include <command.h>
> +#include <dm.h>
> #include <pci.h>
> #include <asm/processor.h>
> #include <asm/errno.h>
> @@ -168,9 +169,14 @@ int ahci_reset(void __iomem *base)
> static int ahci_host_init(struct ahci_probe_ent *probe_ent)
> {
> #ifndef CONFIG_SCSI_AHCI_PLAT
> +# ifdef CONFIG_DM_PCI
> + struct udevice *dev = probe_ent->dev;
> + struct pci_child_platdata *pplat = dev_get_parent_platdata(dev);
> +# else
> pci_dev_t pdev = probe_ent->dev;
> - u16 tmp16;
> unsigned short vendor;
> +# endif
> + u16 tmp16;
> #endif
> void __iomem *mmio = probe_ent->mmio_base;
> u32 tmp, cap_save, cmd;
> @@ -193,6 +199,14 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
> writel_with_flush(0xf, mmio + HOST_PORTS_IMPL);
>
> #ifndef CONFIG_SCSI_AHCI_PLAT
> +# ifdef CONFIG_DM_PCI
> + if (pplat->vendor == PCI_VENDOR_ID_INTEL) {
> + u16 tmp16;
> +
> + dm_pci_read_config16(dev, 0x92, &tmp16);
> + dm_pci_write_config16(dev, 0x92, tmp16 | 0xf);
> + }
> +# else
> pci_read_config_word(pdev, PCI_VENDOR_ID, &vendor);
>
> if (vendor == PCI_VENDOR_ID_INTEL) {
> @@ -201,6 +215,7 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
> tmp16 |= 0xf;
> pci_write_config_word(pdev, 0x92, tmp16);
> }
> +# endif
> #endif
> probe_ent->cap = readl(mmio + HOST_CAP);
> probe_ent->port_map = readl(mmio + HOST_PORTS_IMPL);
> @@ -313,9 +328,15 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
> tmp = readl(mmio + HOST_CTL);
> debug("HOST_CTL 0x%x\n", tmp);
> #ifndef CONFIG_SCSI_AHCI_PLAT
> +# ifdef CONFIG_DM_PCI
> + dm_pci_read_config16(dev, PCI_COMMAND, &tmp16);
> + tmp |= PCI_COMMAND_MASTER;
> + dm_pci_write_config16(dev, PCI_COMMAND, tmp16);
> +# else
> pci_read_config_word(pdev, PCI_COMMAND, &tmp16);
> tmp |= PCI_COMMAND_MASTER;
> pci_write_config_word(pdev, PCI_COMMAND, tmp16);
> +# endif
> #endif
> return 0;
> }
> @@ -324,7 +345,11 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
> static void ahci_print_info(struct ahci_probe_ent *probe_ent)
> {
> #ifndef CONFIG_SCSI_AHCI_PLAT
> +# ifdef CONFIG_DM_PCI
> + struct udevice *dev = probe_ent->dev;
> +# else
> pci_dev_t pdev = probe_ent->dev;
> +# endif
> u16 cc;
> #endif
> void __iomem *mmio = probe_ent->mmio_base;
> @@ -350,7 +375,11 @@ static void ahci_print_info(struct ahci_probe_ent *probe_ent)
> #ifdef CONFIG_SCSI_AHCI_PLAT
> scc_s = "SATA";
> #else
> +# ifdef CONFIG_DM_PCI
> + dm_pci_read_config16(dev, 0x0a, &cc);
> +# else
> pci_read_config_word(pdev, 0x0a, &cc);
> +# endif
> if (cc == 0x0101)
> scc_s = "IDE";
> else if (cc == 0x0106)
> @@ -395,7 +424,11 @@ static void ahci_print_info(struct ahci_probe_ent *probe_ent)
> }
>
> #ifndef CONFIG_SCSI_AHCI_PLAT
> -static int ahci_init_one(pci_dev_t pdev)
> +# ifdef CONFIG_DM_PCI
> +static int ahci_init_one(struct udevice *dev)
> +# else
> +static int ahci_init_one(pci_dev_t dev)
> +# endif
> {
> u16 vendor;
> int rc;
> @@ -407,7 +440,7 @@ static int ahci_init_one(pci_dev_t pdev)
> }
>
> memset(probe_ent, 0, sizeof(struct ahci_probe_ent));
> - probe_ent->dev = pdev;
> + probe_ent->dev = dev;
>
> probe_ent->host_flags = ATA_FLAG_SATA
> | ATA_FLAG_NO_LEGACY
> @@ -417,18 +450,31 @@ static int ahci_init_one(pci_dev_t pdev)
> probe_ent->pio_mask = 0x1f;
> probe_ent->udma_mask = 0x7f; /*Fixme,assume to support UDMA6 */
>
> - probe_ent->mmio_base = pci_map_bar(pdev, PCI_BASE_ADDRESS_5,
> +#ifdef CONFIG_DM_PCI
> + probe_ent->mmio_base = dm_pci_map_bar(dev, PCI_BASE_ADDRESS_5,
> + PCI_REGION_MEM);
> +
> + /* Take from kernel:
> + * JMicron-specific fixup:
> + * make sure we're in AHCI mode
> + */
> + dm_pci_read_config16(dev, PCI_VENDOR_ID, &vendor);
> + if (vendor == 0x197b)
> + dm_pci_write_config8(dev, 0x41, 0xa1);
> +#else
> + probe_ent->mmio_base = pci_map_bar(dev, PCI_BASE_ADDRESS_5,
> PCI_REGION_MEM);
> - debug("ahci mmio_base=0x%p\n", probe_ent->mmio_base);
>
> /* Take from kernel:
> * JMicron-specific fixup:
> * make sure we're in AHCI mode
> */
> - pci_read_config_word(pdev, PCI_VENDOR_ID, &vendor);
> + pci_read_config_word(dev, PCI_VENDOR_ID, &vendor);
> if (vendor == 0x197b)
> - pci_write_config_byte(pdev, 0x41, 0xa1);
> + pci_write_config_byte(dev, 0x41, 0xa1);
> +#endif
>
> + debug("ahci mmio_base=0x%p\n", probe_ent->mmio_base);
> /* initialize adapter */
> rc = ahci_host_init(probe_ent);
> if (rc)
> @@ -915,7 +961,17 @@ void scsi_low_level_init(int busdevfunc)
> u32 linkmap;
>
> #ifndef CONFIG_SCSI_AHCI_PLAT
> +# ifdef CONFIG_DM_PCI
> + struct udevice *dev;
> + int ret;
> +
> + ret = dm_pci_bus_find_bdf(busdevfunc, &dev);
> + if (ret)
> + return;
> + ahci_init_one(dev);
> +# else
> ahci_init_one(busdevfunc);
> +# endif
> #endif
>
> linkmap = probe_ent->link_port_map;
> diff --git a/include/ahci.h b/include/ahci.h
> index 0bdedac..a956c6f 100644
> --- a/include/ahci.h
> +++ b/include/ahci.h
> @@ -145,7 +145,11 @@ struct ahci_ioports {
> };
>
> struct ahci_probe_ent {
> +#ifdef CONFIG_DM_PCI
> + struct udevice *dev;
> +#else
> pci_dev_t dev;
> +#endif
> struct ahci_ioports port[AHCI_MAX_PORTS];
> u32 n_ports;
> u32 hard_port_no;
> --
Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
More information about the U-Boot
mailing list