pci: Add pci_get_devfn() to extract devfn from the fdt_pci_addr

This function will be used by the Marvell Armada XP/38x PCIe driver,
which is moved to DM right now. So let's extract the functionality
from pci_uclass_child_post_bind() to make it available.

Signed-off-by: Stefan Roese <sr@denx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
Stefan Roese 2019-01-25 11:52:42 +01:00
parent e5fd39c886
commit b52142004f
2 changed files with 29 additions and 9 deletions

View File

@ -1007,10 +1007,25 @@ static int pci_uclass_post_probe(struct udevice *bus)
return 0;
}
int pci_get_devfn(struct udevice *dev)
{
struct fdt_pci_addr addr;
int ret;
/* Extract the devfn from fdt_pci_addr */
ret = ofnode_read_pci_addr(dev_ofnode(dev), FDT_PCI_SPACE_CONFIG,
"reg", &addr);
if (ret) {
if (ret != -ENOENT)
return -EINVAL;
}
return addr.phys_hi & 0xff00;
}
static int pci_uclass_child_post_bind(struct udevice *dev)
{
struct pci_child_platdata *pplat;
struct fdt_pci_addr addr;
int ret;
if (!dev_of_valid(dev))
@ -1022,14 +1037,9 @@ static int pci_uclass_child_post_bind(struct udevice *dev)
ofnode_read_pci_vendev(dev_ofnode(dev), &pplat->vendor, &pplat->device);
/* Extract the devfn from fdt_pci_addr */
ret = ofnode_read_pci_addr(dev_ofnode(dev), FDT_PCI_SPACE_CONFIG, "reg",
&addr);
if (ret) {
if (ret != -ENOENT)
return -EINVAL;
} else {
pplat->devfn = addr.phys_hi & 0xff00;
}
pplat->devfn = pci_get_devfn(dev);
if (ret < 0)
return ret;
return 0;
}

View File

@ -1560,6 +1560,16 @@ struct dm_pci_emul_ops {
int sandbox_pci_get_emul(struct udevice *bus, pci_dev_t find_devfn,
struct udevice **containerp, struct udevice **emulp);
/**
* pci_get_devfn() - Extract the devfn from fdt_pci_addr of the device
*
* Get devfn from fdt_pci_addr of the specifified device
*
* @dev: PCI device
* @return devfn in bits 15...8 if found, -ENODEV if not found
*/
int pci_get_devfn(struct udevice *dev);
#endif /* CONFIG_DM_PCI */
/**