Skip to content
Snippets Groups Projects
Commit f9260336 authored by Simon Glass's avatar Simon Glass
Browse files

dm: pci: Add a function to find the regions for a PCI bus


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

Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
Acked-by: default avatarStephen Warren <swarren@nvidia.com>
Tested-by: default avatarStephen Warren <swarren@nvidia.com>
parent 9f60fb0d
No related branches found
No related tags found
No related merge requests found
...@@ -974,6 +974,36 @@ ulong pci_conv_size_to_32(ulong old, ulong value, uint offset, ...@@ -974,6 +974,36 @@ ulong pci_conv_size_to_32(ulong old, ulong value, uint offset,
return value; 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) = { UCLASS_DRIVER(pci) = {
.id = UCLASS_PCI, .id = UCLASS_PCI,
.name = "pci", .name = "pci",
......
...@@ -1130,6 +1130,18 @@ ulong pci_conv_size_to_32(ulong old, ulong value, uint offset, ...@@ -1130,6 +1130,18 @@ ulong pci_conv_size_to_32(ulong old, ulong value, uint offset,
*/ */
struct udevice *pci_get_controller(struct udevice *dev); 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 - PCI device emulator operations
*/ */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment