Merge branch 'remotes/lorenzo/pci/host-generic'
- Constify struct pci_ecam_ops (Rob Herring) - Support building as modules (Rob Herring) - Eliminate wrappers for pci_host_common_probe() by using DT match table data (Rob Herring) * remotes/lorenzo/pci/host-generic: PCI: host-generic: Eliminate pci_host_common_probe wrappers PCI: host-generic: Support building as modules PCI: Constify struct pci_ecam_ops # Conflicts: # drivers/pci/controller/dwc/pcie-hisi.c
This commit is contained in:
@@ -117,7 +117,7 @@ pci_acpi_setup_ecam_mapping(struct acpi_pci_root *root)
|
|||||||
struct device *dev = &root->device->dev;
|
struct device *dev = &root->device->dev;
|
||||||
struct resource *bus_res = &root->secondary;
|
struct resource *bus_res = &root->secondary;
|
||||||
u16 seg = root->segment;
|
u16 seg = root->segment;
|
||||||
struct pci_ecam_ops *ecam_ops;
|
const struct pci_ecam_ops *ecam_ops;
|
||||||
struct resource cfgres;
|
struct resource cfgres;
|
||||||
struct acpi_device *adev;
|
struct acpi_device *adev;
|
||||||
struct pci_config_window *cfg;
|
struct pci_config_window *cfg;
|
||||||
@@ -185,7 +185,7 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
|
|||||||
|
|
||||||
root_ops->release_info = pci_acpi_generic_release_info;
|
root_ops->release_info = pci_acpi_generic_release_info;
|
||||||
root_ops->prepare_resources = pci_acpi_root_prepare_resources;
|
root_ops->prepare_resources = pci_acpi_root_prepare_resources;
|
||||||
root_ops->pci_ops = &ri->cfg->ops->pci_ops;
|
root_ops->pci_ops = (struct pci_ops *)&ri->cfg->ops->pci_ops;
|
||||||
bus = acpi_pci_root_create(root, root_ops, &ri->common, ri->cfg);
|
bus = acpi_pci_root_create(root, root_ops, &ri->common, ri->cfg);
|
||||||
if (!bus)
|
if (!bus)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@@ -29,7 +29,7 @@ struct mcfg_fixup {
|
|||||||
u32 oem_revision;
|
u32 oem_revision;
|
||||||
u16 segment;
|
u16 segment;
|
||||||
struct resource bus_range;
|
struct resource bus_range;
|
||||||
struct pci_ecam_ops *ops;
|
const struct pci_ecam_ops *ops;
|
||||||
struct resource cfgres;
|
struct resource cfgres;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -165,7 +165,7 @@ static int pci_mcfg_quirk_matches(struct mcfg_fixup *f, u16 segment,
|
|||||||
|
|
||||||
static void pci_mcfg_apply_quirks(struct acpi_pci_root *root,
|
static void pci_mcfg_apply_quirks(struct acpi_pci_root *root,
|
||||||
struct resource *cfgres,
|
struct resource *cfgres,
|
||||||
struct pci_ecam_ops **ecam_ops)
|
const struct pci_ecam_ops **ecam_ops)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_PCI_QUIRKS
|
#ifdef CONFIG_PCI_QUIRKS
|
||||||
u16 segment = root->segment;
|
u16 segment = root->segment;
|
||||||
@@ -191,9 +191,9 @@ static void pci_mcfg_apply_quirks(struct acpi_pci_root *root,
|
|||||||
static LIST_HEAD(pci_mcfg_list);
|
static LIST_HEAD(pci_mcfg_list);
|
||||||
|
|
||||||
int pci_mcfg_lookup(struct acpi_pci_root *root, struct resource *cfgres,
|
int pci_mcfg_lookup(struct acpi_pci_root *root, struct resource *cfgres,
|
||||||
struct pci_ecam_ops **ecam_ops)
|
const struct pci_ecam_ops **ecam_ops)
|
||||||
{
|
{
|
||||||
struct pci_ecam_ops *ops = &pci_generic_ecam_ops;
|
const struct pci_ecam_ops *ops = &pci_generic_ecam_ops;
|
||||||
struct resource *bus_res = &root->secondary;
|
struct resource *bus_res = &root->secondary;
|
||||||
u16 seg = root->segment;
|
u16 seg = root->segment;
|
||||||
struct mcfg_entry *e;
|
struct mcfg_entry *e;
|
||||||
|
@@ -62,11 +62,11 @@ config PCIE_RCAR
|
|||||||
Say Y here if you want PCIe controller support on R-Car SoCs.
|
Say Y here if you want PCIe controller support on R-Car SoCs.
|
||||||
|
|
||||||
config PCI_HOST_COMMON
|
config PCI_HOST_COMMON
|
||||||
bool
|
tristate
|
||||||
select PCI_ECAM
|
select PCI_ECAM
|
||||||
|
|
||||||
config PCI_HOST_GENERIC
|
config PCI_HOST_GENERIC
|
||||||
bool "Generic PCI host controller"
|
tristate "Generic PCI host controller"
|
||||||
depends on OF
|
depends on OF
|
||||||
select PCI_HOST_COMMON
|
select PCI_HOST_COMMON
|
||||||
select IRQ_DOMAIN
|
select IRQ_DOMAIN
|
||||||
|
@@ -80,7 +80,7 @@ static int al_pcie_init(struct pci_config_window *cfg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pci_ecam_ops al_pcie_ops = {
|
const struct pci_ecam_ops al_pcie_ops = {
|
||||||
.bus_shift = 20,
|
.bus_shift = 20,
|
||||||
.init = al_pcie_init,
|
.init = al_pcie_init,
|
||||||
.pci_ops = {
|
.pci_ops = {
|
||||||
|
@@ -104,7 +104,7 @@ static int hisi_pcie_init(struct pci_config_window *cfg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pci_ecam_ops hisi_pcie_ops = {
|
const struct pci_ecam_ops hisi_pcie_ops = {
|
||||||
.bus_shift = 20,
|
.bus_shift = 20,
|
||||||
.init = hisi_pcie_init,
|
.init = hisi_pcie_init,
|
||||||
.pci_ops = {
|
.pci_ops = {
|
||||||
@@ -332,15 +332,6 @@ static struct platform_driver hisi_pcie_driver = {
|
|||||||
};
|
};
|
||||||
builtin_platform_driver(hisi_pcie_driver);
|
builtin_platform_driver(hisi_pcie_driver);
|
||||||
|
|
||||||
static int hisi_pcie_almost_ecam_probe(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
struct device *dev = &pdev->dev;
|
|
||||||
struct pci_ecam_ops *ops;
|
|
||||||
|
|
||||||
ops = (struct pci_ecam_ops *)of_device_get_match_data(dev);
|
|
||||||
return pci_host_common_probe(pdev, ops);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int hisi_pcie_platform_init(struct pci_config_window *cfg)
|
static int hisi_pcie_platform_init(struct pci_config_window *cfg)
|
||||||
{
|
{
|
||||||
struct device *dev = cfg->parent;
|
struct device *dev = cfg->parent;
|
||||||
@@ -362,7 +353,7 @@ static int hisi_pcie_platform_init(struct pci_config_window *cfg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pci_ecam_ops hisi_pcie_platform_ops = {
|
static const struct pci_ecam_ops hisi_pcie_platform_ops = {
|
||||||
.bus_shift = 20,
|
.bus_shift = 20,
|
||||||
.init = hisi_pcie_platform_init,
|
.init = hisi_pcie_platform_init,
|
||||||
.pci_ops = {
|
.pci_ops = {
|
||||||
@@ -375,17 +366,17 @@ static struct pci_ecam_ops hisi_pcie_platform_ops = {
|
|||||||
static const struct of_device_id hisi_pcie_almost_ecam_of_match[] = {
|
static const struct of_device_id hisi_pcie_almost_ecam_of_match[] = {
|
||||||
{
|
{
|
||||||
.compatible = "hisilicon,hip06-pcie-ecam",
|
.compatible = "hisilicon,hip06-pcie-ecam",
|
||||||
.data = (void *) &hisi_pcie_platform_ops,
|
.data = &hisi_pcie_platform_ops,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "hisilicon,hip07-pcie-ecam",
|
.compatible = "hisilicon,hip07-pcie-ecam",
|
||||||
.data = (void *) &hisi_pcie_platform_ops,
|
.data = &hisi_pcie_platform_ops,
|
||||||
},
|
},
|
||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_driver hisi_pcie_almost_ecam_driver = {
|
static struct platform_driver hisi_pcie_almost_ecam_driver = {
|
||||||
.probe = hisi_pcie_almost_ecam_probe,
|
.probe = pci_host_common_probe,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "hisi-pcie-almost-ecam",
|
.name = "hisi-pcie-almost-ecam",
|
||||||
.of_match_table = hisi_pcie_almost_ecam_of_match,
|
.of_match_table = hisi_pcie_almost_ecam_of_match,
|
||||||
|
@@ -8,7 +8,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/module.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
#include <linux/of_pci.h>
|
#include <linux/of_pci.h>
|
||||||
#include <linux/pci-ecam.h>
|
#include <linux/pci-ecam.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
@@ -19,7 +21,7 @@ static void gen_pci_unmap_cfg(void *ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct pci_config_window *gen_pci_init(struct device *dev,
|
static struct pci_config_window *gen_pci_init(struct device *dev,
|
||||||
struct list_head *resources, struct pci_ecam_ops *ops)
|
struct list_head *resources, const struct pci_ecam_ops *ops)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
struct resource cfgres;
|
struct resource cfgres;
|
||||||
@@ -54,15 +56,19 @@ err_out:
|
|||||||
return ERR_PTR(err);
|
return ERR_PTR(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
int pci_host_common_probe(struct platform_device *pdev,
|
int pci_host_common_probe(struct platform_device *pdev)
|
||||||
struct pci_ecam_ops *ops)
|
|
||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
struct pci_host_bridge *bridge;
|
struct pci_host_bridge *bridge;
|
||||||
struct pci_config_window *cfg;
|
struct pci_config_window *cfg;
|
||||||
struct list_head resources;
|
struct list_head resources;
|
||||||
|
const struct pci_ecam_ops *ops;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
ops = of_device_get_match_data(&pdev->dev);
|
||||||
|
if (!ops)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
bridge = devm_pci_alloc_host_bridge(dev, 0);
|
bridge = devm_pci_alloc_host_bridge(dev, 0);
|
||||||
if (!bridge)
|
if (!bridge)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@@ -82,7 +88,7 @@ int pci_host_common_probe(struct platform_device *pdev,
|
|||||||
bridge->dev.parent = dev;
|
bridge->dev.parent = dev;
|
||||||
bridge->sysdata = cfg;
|
bridge->sysdata = cfg;
|
||||||
bridge->busnr = cfg->busr.start;
|
bridge->busnr = cfg->busr.start;
|
||||||
bridge->ops = &ops->pci_ops;
|
bridge->ops = (struct pci_ops *)&ops->pci_ops;
|
||||||
bridge->map_irq = of_irq_parse_and_map_pci;
|
bridge->map_irq = of_irq_parse_and_map_pci;
|
||||||
bridge->swizzle_irq = pci_common_swizzle;
|
bridge->swizzle_irq = pci_common_swizzle;
|
||||||
|
|
||||||
@@ -95,6 +101,7 @@ int pci_host_common_probe(struct platform_device *pdev,
|
|||||||
platform_set_drvdata(pdev, bridge->bus);
|
platform_set_drvdata(pdev, bridge->bus);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pci_host_common_probe);
|
||||||
|
|
||||||
int pci_host_common_remove(struct platform_device *pdev)
|
int pci_host_common_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
@@ -107,3 +114,6 @@ int pci_host_common_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pci_host_common_remove);
|
||||||
|
|
||||||
|
MODULE_LICENSE("GPL v2");
|
||||||
|
@@ -10,12 +10,11 @@
|
|||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of_pci.h>
|
|
||||||
#include <linux/pci-ecam.h>
|
#include <linux/pci-ecam.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
static struct pci_ecam_ops gen_pci_cfg_cam_bus_ops = {
|
static const struct pci_ecam_ops gen_pci_cfg_cam_bus_ops = {
|
||||||
.bus_shift = 16,
|
.bus_shift = 16,
|
||||||
.pci_ops = {
|
.pci_ops = {
|
||||||
.map_bus = pci_ecam_map_bus,
|
.map_bus = pci_ecam_map_bus,
|
||||||
@@ -49,7 +48,7 @@ static void __iomem *pci_dw_ecam_map_bus(struct pci_bus *bus,
|
|||||||
return pci_ecam_map_bus(bus, devfn, where);
|
return pci_ecam_map_bus(bus, devfn, where);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pci_ecam_ops pci_dw_ecam_bus_ops = {
|
static const struct pci_ecam_ops pci_dw_ecam_bus_ops = {
|
||||||
.bus_shift = 20,
|
.bus_shift = 20,
|
||||||
.pci_ops = {
|
.pci_ops = {
|
||||||
.map_bus = pci_dw_ecam_map_bus,
|
.map_bus = pci_dw_ecam_map_bus,
|
||||||
@@ -76,25 +75,16 @@ static const struct of_device_id gen_pci_of_match[] = {
|
|||||||
|
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, gen_pci_of_match);
|
||||||
static int gen_pci_probe(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
const struct of_device_id *of_id;
|
|
||||||
struct pci_ecam_ops *ops;
|
|
||||||
|
|
||||||
of_id = of_match_node(gen_pci_of_match, pdev->dev.of_node);
|
|
||||||
ops = (struct pci_ecam_ops *)of_id->data;
|
|
||||||
|
|
||||||
return pci_host_common_probe(pdev, ops);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct platform_driver gen_pci_driver = {
|
static struct platform_driver gen_pci_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "pci-host-generic",
|
.name = "pci-host-generic",
|
||||||
.of_match_table = gen_pci_of_match,
|
.of_match_table = gen_pci_of_match,
|
||||||
.suppress_bind_attrs = true,
|
|
||||||
},
|
},
|
||||||
.probe = gen_pci_probe,
|
.probe = pci_host_common_probe,
|
||||||
.remove = pci_host_common_remove,
|
.remove = pci_host_common_remove,
|
||||||
};
|
};
|
||||||
builtin_platform_driver(gen_pci_driver);
|
module_platform_driver(gen_pci_driver);
|
||||||
|
|
||||||
|
MODULE_LICENSE("GPL v2");
|
||||||
|
@@ -345,7 +345,7 @@ static int thunder_ecam_config_write(struct pci_bus *bus, unsigned int devfn,
|
|||||||
return pci_generic_config_write(bus, devfn, where, size, val);
|
return pci_generic_config_write(bus, devfn, where, size, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pci_ecam_ops pci_thunder_ecam_ops = {
|
const struct pci_ecam_ops pci_thunder_ecam_ops = {
|
||||||
.bus_shift = 20,
|
.bus_shift = 20,
|
||||||
.pci_ops = {
|
.pci_ops = {
|
||||||
.map_bus = pci_ecam_map_bus,
|
.map_bus = pci_ecam_map_bus,
|
||||||
@@ -357,22 +357,20 @@ struct pci_ecam_ops pci_thunder_ecam_ops = {
|
|||||||
#ifdef CONFIG_PCI_HOST_THUNDER_ECAM
|
#ifdef CONFIG_PCI_HOST_THUNDER_ECAM
|
||||||
|
|
||||||
static const struct of_device_id thunder_ecam_of_match[] = {
|
static const struct of_device_id thunder_ecam_of_match[] = {
|
||||||
{ .compatible = "cavium,pci-host-thunder-ecam" },
|
{
|
||||||
|
.compatible = "cavium,pci-host-thunder-ecam",
|
||||||
|
.data = &pci_thunder_ecam_ops,
|
||||||
|
},
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
||||||
static int thunder_ecam_probe(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
return pci_host_common_probe(pdev, &pci_thunder_ecam_ops);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct platform_driver thunder_ecam_driver = {
|
static struct platform_driver thunder_ecam_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = KBUILD_MODNAME,
|
.name = KBUILD_MODNAME,
|
||||||
.of_match_table = thunder_ecam_of_match,
|
.of_match_table = thunder_ecam_of_match,
|
||||||
.suppress_bind_attrs = true,
|
.suppress_bind_attrs = true,
|
||||||
},
|
},
|
||||||
.probe = thunder_ecam_probe,
|
.probe = pci_host_common_probe,
|
||||||
};
|
};
|
||||||
builtin_platform_driver(thunder_ecam_driver);
|
builtin_platform_driver(thunder_ecam_driver);
|
||||||
|
|
||||||
|
@@ -403,7 +403,7 @@ static int thunder_pem_acpi_init(struct pci_config_window *cfg)
|
|||||||
return thunder_pem_init(dev, cfg, res_pem);
|
return thunder_pem_init(dev, cfg, res_pem);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pci_ecam_ops thunder_pem_ecam_ops = {
|
const struct pci_ecam_ops thunder_pem_ecam_ops = {
|
||||||
.bus_shift = 24,
|
.bus_shift = 24,
|
||||||
.init = thunder_pem_acpi_init,
|
.init = thunder_pem_acpi_init,
|
||||||
.pci_ops = {
|
.pci_ops = {
|
||||||
@@ -440,7 +440,7 @@ static int thunder_pem_platform_init(struct pci_config_window *cfg)
|
|||||||
return thunder_pem_init(dev, cfg, res_pem);
|
return thunder_pem_init(dev, cfg, res_pem);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pci_ecam_ops pci_thunder_pem_ops = {
|
static const struct pci_ecam_ops pci_thunder_pem_ops = {
|
||||||
.bus_shift = 24,
|
.bus_shift = 24,
|
||||||
.init = thunder_pem_platform_init,
|
.init = thunder_pem_platform_init,
|
||||||
.pci_ops = {
|
.pci_ops = {
|
||||||
@@ -451,22 +451,20 @@ static struct pci_ecam_ops pci_thunder_pem_ops = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct of_device_id thunder_pem_of_match[] = {
|
static const struct of_device_id thunder_pem_of_match[] = {
|
||||||
{ .compatible = "cavium,pci-host-thunder-pem" },
|
{
|
||||||
|
.compatible = "cavium,pci-host-thunder-pem",
|
||||||
|
.data = &pci_thunder_pem_ops,
|
||||||
|
},
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
||||||
static int thunder_pem_probe(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
return pci_host_common_probe(pdev, &pci_thunder_pem_ops);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct platform_driver thunder_pem_driver = {
|
static struct platform_driver thunder_pem_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = KBUILD_MODNAME,
|
.name = KBUILD_MODNAME,
|
||||||
.of_match_table = thunder_pem_of_match,
|
.of_match_table = thunder_pem_of_match,
|
||||||
.suppress_bind_attrs = true,
|
.suppress_bind_attrs = true,
|
||||||
},
|
},
|
||||||
.probe = thunder_pem_probe,
|
.probe = pci_host_common_probe,
|
||||||
};
|
};
|
||||||
builtin_platform_driver(thunder_pem_driver);
|
builtin_platform_driver(thunder_pem_driver);
|
||||||
|
|
||||||
|
@@ -256,7 +256,7 @@ static int xgene_v1_pcie_ecam_init(struct pci_config_window *cfg)
|
|||||||
return xgene_pcie_ecam_init(cfg, XGENE_PCIE_IP_VER_1);
|
return xgene_pcie_ecam_init(cfg, XGENE_PCIE_IP_VER_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pci_ecam_ops xgene_v1_pcie_ecam_ops = {
|
const struct pci_ecam_ops xgene_v1_pcie_ecam_ops = {
|
||||||
.bus_shift = 16,
|
.bus_shift = 16,
|
||||||
.init = xgene_v1_pcie_ecam_init,
|
.init = xgene_v1_pcie_ecam_init,
|
||||||
.pci_ops = {
|
.pci_ops = {
|
||||||
@@ -271,7 +271,7 @@ static int xgene_v2_pcie_ecam_init(struct pci_config_window *cfg)
|
|||||||
return xgene_pcie_ecam_init(cfg, XGENE_PCIE_IP_VER_2);
|
return xgene_pcie_ecam_init(cfg, XGENE_PCIE_IP_VER_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pci_ecam_ops xgene_v2_pcie_ecam_ops = {
|
const struct pci_ecam_ops xgene_v2_pcie_ecam_ops = {
|
||||||
.bus_shift = 16,
|
.bus_shift = 16,
|
||||||
.init = xgene_v2_pcie_ecam_init,
|
.init = xgene_v2_pcie_ecam_init,
|
||||||
.pci_ops = {
|
.pci_ops = {
|
||||||
|
@@ -207,7 +207,7 @@ static int smp8759_config_write(struct pci_bus *bus, unsigned int devfn,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pci_ecam_ops smp8759_ecam_ops = {
|
static const struct pci_ecam_ops smp8759_ecam_ops = {
|
||||||
.bus_shift = 20,
|
.bus_shift = 20,
|
||||||
.pci_ops = {
|
.pci_ops = {
|
||||||
.map_bus = pci_ecam_map_bus,
|
.map_bus = pci_ecam_map_bus,
|
||||||
@@ -295,11 +295,14 @@ static int tango_pcie_probe(struct platform_device *pdev)
|
|||||||
spin_lock_init(&pcie->used_msi_lock);
|
spin_lock_init(&pcie->used_msi_lock);
|
||||||
irq_set_chained_handler_and_data(virq, tango_msi_isr, pcie);
|
irq_set_chained_handler_and_data(virq, tango_msi_isr, pcie);
|
||||||
|
|
||||||
return pci_host_common_probe(pdev, &smp8759_ecam_ops);
|
return pci_host_common_probe(pdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id tango_pcie_ids[] = {
|
static const struct of_device_id tango_pcie_ids[] = {
|
||||||
{ .compatible = "sigma,smp8759-pcie" },
|
{
|
||||||
|
.compatible = "sigma,smp8759-pcie",
|
||||||
|
.data = &smp8759_ecam_ops,
|
||||||
|
},
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -26,7 +26,7 @@ static const bool per_bus_mapping = !IS_ENABLED(CONFIG_64BIT);
|
|||||||
*/
|
*/
|
||||||
struct pci_config_window *pci_ecam_create(struct device *dev,
|
struct pci_config_window *pci_ecam_create(struct device *dev,
|
||||||
struct resource *cfgres, struct resource *busr,
|
struct resource *cfgres, struct resource *busr,
|
||||||
struct pci_ecam_ops *ops)
|
const struct pci_ecam_ops *ops)
|
||||||
{
|
{
|
||||||
struct pci_config_window *cfg;
|
struct pci_config_window *cfg;
|
||||||
unsigned int bus_range, bus_range_max, bsz;
|
unsigned int bus_range, bus_range_max, bsz;
|
||||||
@@ -101,6 +101,7 @@ err_exit:
|
|||||||
pci_ecam_free(cfg);
|
pci_ecam_free(cfg);
|
||||||
return ERR_PTR(err);
|
return ERR_PTR(err);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pci_ecam_create);
|
||||||
|
|
||||||
void pci_ecam_free(struct pci_config_window *cfg)
|
void pci_ecam_free(struct pci_config_window *cfg)
|
||||||
{
|
{
|
||||||
@@ -121,6 +122,7 @@ void pci_ecam_free(struct pci_config_window *cfg)
|
|||||||
release_resource(&cfg->res);
|
release_resource(&cfg->res);
|
||||||
kfree(cfg);
|
kfree(cfg);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pci_ecam_free);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Function to implement the pci_ops ->map_bus method
|
* Function to implement the pci_ops ->map_bus method
|
||||||
@@ -143,9 +145,10 @@ void __iomem *pci_ecam_map_bus(struct pci_bus *bus, unsigned int devfn,
|
|||||||
base = cfg->win + (busn << cfg->ops->bus_shift);
|
base = cfg->win + (busn << cfg->ops->bus_shift);
|
||||||
return base + (devfn << devfn_shift) + where;
|
return base + (devfn << devfn_shift) + where;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pci_ecam_map_bus);
|
||||||
|
|
||||||
/* ECAM ops */
|
/* ECAM ops */
|
||||||
struct pci_ecam_ops pci_generic_ecam_ops = {
|
const struct pci_ecam_ops pci_generic_ecam_ops = {
|
||||||
.bus_shift = 20,
|
.bus_shift = 20,
|
||||||
.pci_ops = {
|
.pci_ops = {
|
||||||
.map_bus = pci_ecam_map_bus,
|
.map_bus = pci_ecam_map_bus,
|
||||||
@@ -153,10 +156,11 @@ struct pci_ecam_ops pci_generic_ecam_ops = {
|
|||||||
.write = pci_generic_config_write,
|
.write = pci_generic_config_write,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
EXPORT_SYMBOL_GPL(pci_generic_ecam_ops);
|
||||||
|
|
||||||
#if defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS)
|
#if defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS)
|
||||||
/* ECAM ops for 32-bit access only (non-compliant) */
|
/* ECAM ops for 32-bit access only (non-compliant) */
|
||||||
struct pci_ecam_ops pci_32b_ops = {
|
const struct pci_ecam_ops pci_32b_ops = {
|
||||||
.bus_shift = 20,
|
.bus_shift = 20,
|
||||||
.pci_ops = {
|
.pci_ops = {
|
||||||
.map_bus = pci_ecam_map_bus,
|
.map_bus = pci_ecam_map_bus,
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
#include "pci.h"
|
#include "pci.h"
|
||||||
|
|
||||||
unsigned int pci_flags;
|
unsigned int pci_flags;
|
||||||
|
EXPORT_SYMBOL_GPL(pci_flags);
|
||||||
|
|
||||||
struct pci_dev_resource {
|
struct pci_dev_resource {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
|
@@ -27,7 +27,7 @@ extern phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle);
|
|||||||
|
|
||||||
struct pci_ecam_ops;
|
struct pci_ecam_ops;
|
||||||
extern int pci_mcfg_lookup(struct acpi_pci_root *root, struct resource *cfgres,
|
extern int pci_mcfg_lookup(struct acpi_pci_root *root, struct resource *cfgres,
|
||||||
struct pci_ecam_ops **ecam_ops);
|
const struct pci_ecam_ops **ecam_ops);
|
||||||
|
|
||||||
static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev)
|
static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
|
@@ -29,7 +29,7 @@ struct pci_config_window {
|
|||||||
struct resource res;
|
struct resource res;
|
||||||
struct resource busr;
|
struct resource busr;
|
||||||
void *priv;
|
void *priv;
|
||||||
struct pci_ecam_ops *ops;
|
const struct pci_ecam_ops *ops;
|
||||||
union {
|
union {
|
||||||
void __iomem *win; /* 64-bit single mapping */
|
void __iomem *win; /* 64-bit single mapping */
|
||||||
void __iomem **winp; /* 32-bit per-bus mapping */
|
void __iomem **winp; /* 32-bit per-bus mapping */
|
||||||
@@ -40,29 +40,28 @@ struct pci_config_window {
|
|||||||
/* create and free pci_config_window */
|
/* create and free pci_config_window */
|
||||||
struct pci_config_window *pci_ecam_create(struct device *dev,
|
struct pci_config_window *pci_ecam_create(struct device *dev,
|
||||||
struct resource *cfgres, struct resource *busr,
|
struct resource *cfgres, struct resource *busr,
|
||||||
struct pci_ecam_ops *ops);
|
const struct pci_ecam_ops *ops);
|
||||||
void pci_ecam_free(struct pci_config_window *cfg);
|
void pci_ecam_free(struct pci_config_window *cfg);
|
||||||
|
|
||||||
/* map_bus when ->sysdata is an instance of pci_config_window */
|
/* map_bus when ->sysdata is an instance of pci_config_window */
|
||||||
void __iomem *pci_ecam_map_bus(struct pci_bus *bus, unsigned int devfn,
|
void __iomem *pci_ecam_map_bus(struct pci_bus *bus, unsigned int devfn,
|
||||||
int where);
|
int where);
|
||||||
/* default ECAM ops */
|
/* default ECAM ops */
|
||||||
extern struct pci_ecam_ops pci_generic_ecam_ops;
|
extern const struct pci_ecam_ops pci_generic_ecam_ops;
|
||||||
|
|
||||||
#if defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS)
|
#if defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS)
|
||||||
extern struct pci_ecam_ops pci_32b_ops; /* 32-bit accesses only */
|
extern const struct pci_ecam_ops pci_32b_ops; /* 32-bit accesses only */
|
||||||
extern struct pci_ecam_ops hisi_pcie_ops; /* HiSilicon */
|
extern const struct pci_ecam_ops hisi_pcie_ops; /* HiSilicon */
|
||||||
extern struct pci_ecam_ops thunder_pem_ecam_ops; /* Cavium ThunderX 1.x & 2.x */
|
extern const struct pci_ecam_ops thunder_pem_ecam_ops; /* Cavium ThunderX 1.x & 2.x */
|
||||||
extern struct pci_ecam_ops pci_thunder_ecam_ops; /* Cavium ThunderX 1.x */
|
extern const struct pci_ecam_ops pci_thunder_ecam_ops; /* Cavium ThunderX 1.x */
|
||||||
extern struct pci_ecam_ops xgene_v1_pcie_ecam_ops; /* APM X-Gene PCIe v1 */
|
extern const struct pci_ecam_ops xgene_v1_pcie_ecam_ops; /* APM X-Gene PCIe v1 */
|
||||||
extern struct pci_ecam_ops xgene_v2_pcie_ecam_ops; /* APM X-Gene PCIe v2.x */
|
extern const struct pci_ecam_ops xgene_v2_pcie_ecam_ops; /* APM X-Gene PCIe v2.x */
|
||||||
extern struct pci_ecam_ops al_pcie_ops; /* Amazon Annapurna Labs PCIe */
|
extern const struct pci_ecam_ops al_pcie_ops; /* Amazon Annapurna Labs PCIe */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_PCI_HOST_COMMON
|
#if IS_ENABLED(CONFIG_PCI_HOST_COMMON)
|
||||||
/* for DT-based PCI controllers that support ECAM */
|
/* for DT-based PCI controllers that support ECAM */
|
||||||
int pci_host_common_probe(struct platform_device *pdev,
|
int pci_host_common_probe(struct platform_device *pdev);
|
||||||
struct pci_ecam_ops *ops);
|
|
||||||
int pci_host_common_remove(struct platform_device *pdev);
|
int pci_host_common_remove(struct platform_device *pdev);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user