Contributors: 12
Author |
Tokens |
Token Proportion |
Commits |
Commit Proportion |
Ard Biesheuvel |
146 |
48.50% |
1 |
5.56% |
Will Deacon |
102 |
33.89% |
1 |
5.56% |
Rob Herring |
20 |
6.64% |
4 |
22.22% |
David Daney |
11 |
3.65% |
2 |
11.11% |
Jayachandran C |
6 |
1.99% |
2 |
11.11% |
Jeff Johnson |
5 |
1.66% |
1 |
5.56% |
Jan Kiszka |
4 |
1.33% |
1 |
5.56% |
Björn Helgaas |
2 |
0.66% |
2 |
11.11% |
Linus Torvalds (pre-git) |
2 |
0.66% |
1 |
5.56% |
Uwe Kleine-König |
1 |
0.33% |
1 |
5.56% |
Patrick Mochel |
1 |
0.33% |
1 |
5.56% |
Paul Gortmaker |
1 |
0.33% |
1 |
5.56% |
Total |
301 |
|
18 |
|
// SPDX-License-Identifier: GPL-2.0
/*
* Simple, generic PCI host controller driver targeting firmware-initialised
* systems and virtual machines (e.g. the PCI emulation provided by kvmtool).
*
* Copyright (C) 2014 ARM Limited
*
* Author: Will Deacon <will.deacon@arm.com>
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/pci-ecam.h>
#include <linux/platform_device.h>
static const struct pci_ecam_ops gen_pci_cfg_cam_bus_ops = {
.bus_shift = 16,
.pci_ops = {
.map_bus = pci_ecam_map_bus,
.read = pci_generic_config_read,
.write = pci_generic_config_write,
}
};
static bool pci_dw_valid_device(struct pci_bus *bus, unsigned int devfn)
{
struct pci_config_window *cfg = bus->sysdata;
/*
* The Synopsys DesignWare PCIe controller in ECAM mode will not filter
* type 0 config TLPs sent to devices 1 and up on its downstream port,
* resulting in devices appearing multiple times on bus 0 unless we
* filter out those accesses here.
*/
if (bus->number == cfg->busr.start && PCI_SLOT(devfn) > 0)
return false;
return true;
}
static void __iomem *pci_dw_ecam_map_bus(struct pci_bus *bus,
unsigned int devfn, int where)
{
if (!pci_dw_valid_device(bus, devfn))
return NULL;
return pci_ecam_map_bus(bus, devfn, where);
}
static const struct pci_ecam_ops pci_dw_ecam_bus_ops = {
.pci_ops = {
.map_bus = pci_dw_ecam_map_bus,
.read = pci_generic_config_read,
.write = pci_generic_config_write,
}
};
static const struct of_device_id gen_pci_of_match[] = {
{ .compatible = "pci-host-cam-generic",
.data = &gen_pci_cfg_cam_bus_ops },
{ .compatible = "pci-host-ecam-generic",
.data = &pci_generic_ecam_ops },
{ .compatible = "marvell,armada8k-pcie-ecam",
.data = &pci_dw_ecam_bus_ops },
{ .compatible = "socionext,synquacer-pcie-ecam",
.data = &pci_dw_ecam_bus_ops },
{ .compatible = "snps,dw-pcie-ecam",
.data = &pci_dw_ecam_bus_ops },
{ },
};
MODULE_DEVICE_TABLE(of, gen_pci_of_match);
static struct platform_driver gen_pci_driver = {
.driver = {
.name = "pci-host-generic",
.of_match_table = gen_pci_of_match,
},
.probe = pci_host_common_probe,
.remove_new = pci_host_common_remove,
};
module_platform_driver(gen_pci_driver);
MODULE_DESCRIPTION("Generic PCI host controller driver");
MODULE_LICENSE("GPL v2");