At present the AHCI SCSI driver only supports PCI with driver model.
Rename the existing function to indicate this and add support for adding
a non-PCI controller .

Signed-off-by: Simon Glass <s...@chromium.org>
---

 arch/x86/cpu/ivybridge/sata.c |  2 +-
 drivers/ata/ahci.c            | 26 +++++++++++++++++---------
 include/ahci.h                | 14 +++++++++++++-
 3 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/arch/x86/cpu/ivybridge/sata.c b/arch/x86/cpu/ivybridge/sata.c
index 462b7c09dd..7febb8cf88 100644
--- a/arch/x86/cpu/ivybridge/sata.c
+++ b/arch/x86/cpu/ivybridge/sata.c
@@ -236,7 +236,7 @@ static int bd82x6x_sata_probe(struct udevice *dev)
                bd82x6x_sata_enable(dev);
        else {
                bd82x6x_sata_init(dev, pch);
-               ret = ahci_probe_scsi(dev);
+               ret = ahci_probe_scsi_pci(dev);
                if (ret)
                        return ret;
        }
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 6da412d178..035db85b45 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -431,7 +431,7 @@ static void ahci_print_info(struct ahci_uc_priv *uc_priv)
               cap2 & (1 << 0) ? "boh " : "");
 }
 
-#ifndef CONFIG_SCSI_AHCI_PLAT
+#if defined(CONFIG_DM_SCSI) || !defined(CONFIG_SCSI_AHCI_PLAT)
 # if defined(CONFIG_DM_PCI) || defined(CONFIG_DM_SCSI)
 static int ahci_init_one(struct ahci_uc_priv *uc_priv, struct udevice *dev)
 # else
@@ -1158,11 +1158,8 @@ int ahci_bind_scsi(struct udevice *ahci_dev, struct 
udevice **devp)
        return 0;
 }
 
-int ahci_probe_scsi(struct udevice *ahci_dev)
+int ahci_probe_scsi(struct udevice *ahci_dev, ulong base)
 {
-#ifdef CONFIG_SCSI_AHCI_PLAT
-       return -ENOSYS;  /* TODO(s...@chromium.org): Support non-PCI AHCI */
-#else
        struct ahci_uc_priv *uc_priv;
        struct scsi_platdata *uc_plat;
        struct udevice *dev;
@@ -1172,11 +1169,11 @@ int ahci_probe_scsi(struct udevice *ahci_dev)
        if (!dev)
                return -ENODEV;
        uc_plat = dev_get_uclass_platdata(dev);
-       uc_plat->base = (ulong)dm_pci_map_bar(ahci_dev, PCI_BASE_ADDRESS_5,
-                                             PCI_REGION_MEM);
+       uc_plat->base = base;
        uc_plat->max_lun = 1;
        uc_plat->max_id = 2;
-       uc_priv = dev_get_uclass_priv(dev);
+
+       uc_priv = dev_get_uclass_priv(ahci_dev);
        ret = ahci_init_one(uc_priv, dev);
        if (ret)
                return ret;
@@ -1188,11 +1185,22 @@ int ahci_probe_scsi(struct udevice *ahci_dev)
        ret = scsi_scan_dev(dev, true);
        if (ret)
                return ret;
-#endif
 
        return 0;
 }
 
+#ifdef CONFIG_DM_PCI
+int ahci_probe_scsi_pci(struct udevice *ahci_dev)
+{
+       ulong base;
+
+       base = (ulong)dm_pci_map_bar(ahci_dev, PCI_BASE_ADDRESS_5,
+                                    PCI_REGION_MEM);
+
+       return ahci_probe_scsi(ahci_dev, base);
+}
+#endif
+
 struct scsi_ops scsi_ops = {
        .exec           = ahci_scsi_exec,
        .bus_reset      = ahci_scsi_bus_reset,
diff --git a/include/ahci.h b/include/ahci.h
index 818f34464e..29f4ba1d13 100644
--- a/include/ahci.h
+++ b/include/ahci.h
@@ -218,8 +218,20 @@ int ahci_bind_scsi(struct udevice *ahci_dev, struct 
udevice **devp);
  * devices it finds.
  *
  * @ahci_dev: AHCI parent device
+ * @base: Base address of AHCI port
  * @return 0 if OK, -ve on error
  */
-int ahci_probe_scsi(struct udevice *ahci_dev);
+int ahci_probe_scsi(struct udevice *ahci_dev, ulong base);
+
+/**
+ * ahci_probe_scsi_pci() - probe and scan the attached SCSI bus on PCI
+ *
+ * Note that the SCSI device will itself bind block devices for any storage
+ * devices it finds.
+ *
+ * @ahci_dev: AHCI parent device
+ * @return 0 if OK, -ve on error
+ */
+int ahci_probe_scsi_pci(struct udevice *ahci_dev);
 
 #endif
-- 
2.13.1.518.g3df882009-goog

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to