@@ -66,6 +66,7 @@ struct pci_host_bridge {
uint16_t segment; /* Segment number */
struct pci_config_window* cfg; /* Pointer to the bridge config window */
const struct pci_ops *ops;
+ void *priv; /* Private data of the bridge. */
};
struct pci_ops {
@@ -95,7 +96,8 @@ struct pci_ecam_ops {
extern const struct pci_ecam_ops pci_generic_ecam_ops;
int pci_host_common_probe(struct dt_device_node *dev,
- const struct pci_ecam_ops *ops);
+ const struct pci_ecam_ops *ops,
+ size_t priv_sz);
int pci_generic_config_read(struct pci_host_bridge *bridge, pci_sbdf_t sbdf,
uint32_t reg, uint32_t len, uint32_t *value);
int pci_generic_config_write(struct pci_host_bridge *bridge, pci_sbdf_t sbdf,
@@ -209,7 +209,8 @@ static int pci_bus_find_domain_nr(struct dt_device_node *dev)
}
int pci_host_common_probe(struct dt_device_node *dev,
- const struct pci_ecam_ops *ops)
+ const struct pci_ecam_ops *ops,
+ size_t priv_sz)
{
struct pci_host_bridge *bridge;
struct pci_config_window *cfg;
@@ -241,11 +242,26 @@ int pci_host_common_probe(struct dt_device_node *dev,
printk(XENLOG_ERR "Inconsistent \"linux,pci-domain\" property in DT\n");
BUG();
}
+
bridge->segment = domain;
+
+ if ( priv_sz )
+ {
+ bridge->priv = xzalloc_bytes(priv_sz);
+ if ( !bridge->priv )
+ {
+ err = -ENOMEM;
+ goto err_priv;
+ }
+ }
+
pci_add_host_bridge(bridge);
return 0;
+err_priv:
+ xfree(bridge->priv);
+
err_exit:
xfree(bridge);
@@ -29,7 +29,7 @@ static const struct dt_device_match __initconstrel gen_pci_dt_match[] =
static int __init pci_host_generic_probe(struct dt_device_node *dev,
const void *data)
{
- return pci_host_common_probe(dev, &pci_generic_ecam_ops);
+ return pci_host_common_probe(dev, &pci_generic_ecam_ops, 0);
}
DT_DEVICE_START(pci_gen, "PCI HOST GENERIC", DEVICE_PCI_HOSTBRIDGE)
@@ -47,7 +47,7 @@ static const struct dt_device_match __initconstrel nwl_pcie_dt_match[] =
static int __init pci_host_generic_probe(struct dt_device_node *dev,
const void *data)
{
- return pci_host_common_probe(dev, &nwl_pcie_ops);
+ return pci_host_common_probe(dev, &nwl_pcie_ops, 0);
}
DT_DEVICE_START(pci_gen, "PCI HOST ZYNQMP", DEVICE_PCI_HOSTBRIDGE)