This function looks up the controller and returns a pointer to each region
type.

Signed-off-by: Simon Glass <s...@chromium.org>
Acked-by: Stephen Warren <swar...@nvidia.com>
---

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/pci/pci-uclass.c | 30 ++++++++++++++++++++++++++++++
 include/pci.h            | 12 ++++++++++++
 2 files changed, 42 insertions(+)

diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c
index f3f5f00..5fe3072 100644
--- a/drivers/pci/pci-uclass.c
+++ b/drivers/pci/pci-uclass.c
@@ -974,6 +974,36 @@ ulong pci_conv_size_to_32(ulong old, ulong value, uint 
offset,
        return value;
 }
 
+int pci_get_regions(struct udevice *dev, struct pci_region **iop,
+                   struct pci_region **memp, struct pci_region **prefp)
+{
+       struct udevice *bus = pci_get_controller(dev);
+       struct pci_controller *hose = dev_get_uclass_priv(bus);
+       int i;
+
+       *iop = NULL;
+       *memp = NULL;
+       *prefp = NULL;
+       for (i = 0; i < hose->region_count; i++) {
+               switch (hose->regions[i].flags) {
+               case PCI_REGION_IO:
+                       if (!*iop || (*iop)->size < hose->regions[i].size)
+                               *iop = hose->regions + i;
+                       break;
+               case PCI_REGION_MEM:
+                       if (!*memp || (*memp)->size < hose->regions[i].size)
+                               *memp = hose->regions + i;
+                       break;
+               case (PCI_REGION_MEM | PCI_REGION_PREFETCH):
+                       if (!*prefp || (*prefp)->size < hose->regions[i].size)
+                               *prefp = hose->regions + i;
+                       break;
+               }
+       }
+
+       return (*iop != NULL) + (*memp != NULL) + (*prefp != NULL);
+}
+
 UCLASS_DRIVER(pci) = {
        .id             = UCLASS_PCI,
        .name           = "pci",
diff --git a/include/pci.h b/include/pci.h
index f3dda70..9c19482 100644
--- a/include/pci.h
+++ b/include/pci.h
@@ -1131,6 +1131,18 @@ ulong pci_conv_size_to_32(ulong old, ulong value, uint 
offset,
 struct udevice *pci_get_controller(struct udevice *dev);
 
 /**
+ * pci_get_regions() - obtain pointers to all the region types
+ *
+ * @dev:       Device to check
+ * @iop:       Returns a pointer to the I/O region, or NULL if none
+ * @memp:      Returns a pointer to the memory region, or NULL if none
+ * @prefp:     Returns a pointer to the pre-fetch region, or NULL if none
+ * @return the number of non-NULL regions returned, normally 3
+ */
+int pci_get_regions(struct udevice *dev, struct pci_region **iop,
+                   struct pci_region **memp, struct pci_region **prefp);
+
+/**
  * struct dm_pci_emul_ops - PCI device emulator operations
  */
 struct dm_pci_emul_ops {
-- 
2.6.0.rc2.230.g3dd15c0

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

Reply via email to