ppc patch queue 2019-04-09
This is a small, hard freeze, pull request which fixes a regression on the pseries machine handling of PCI-E extended config space accesses. -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEdfRlhq5hpmzETofcbDjKyiDZs5IFAlysQxQACgkQbDjKyiDZ s5KZkxAAgVi1n2oBroYnXwqJoalm5WYntJhkKBzmQqLFaOFqnhK7110eQ/Vyc2OZ rn9QUODczxuUH0McdW3McfXa0J/ZHP9sZhmtl06okfVodT8Yx3UXq11pYFzRbhrx SWpCzgWK04SfDsKxak5d9uah/p6vOkmojCLI8+s0npb4uv3hBpOScQ3OCrwyqvZL R4715SiqV2T2J4BBhBpsXNE4NRFKuA3AQlKDqt15iWHpKkk11NMscXP+n5cKsIUl ZXcjSByYNhAGHUCMZvK1Oht64+FSnkZg1Z7l3SWvLT5wxyHHvfuFBAxlSysveqvE 7quWpoHsjMn2sgyolUM4PY2IdEFmgnxBN4nYJVxhAQmgRteIAa8ybT/yYEJA9gx2 Dyl7D5eBW9SAwEfETa8Ilf0JqHeWwZcs7hY8za/si+CQ9syCI/TMI6PYpUY7PUqx UjeyilcmFfzloS5Ex9GYFYQVICJ1EEczUZbTJgIcSizjJFNyi7tgAofEydrGon9e 98HMCz9MIlOzINNf0gleS5UsaKnQGQtusPuplN8/9kAhhgEMYLCwFgHyNJb8BmFa SBy4m18P5idDC+ljh7bQ043RJwrY4+JDO6+7z/lU19Im7ZYz9EZuIHGobmWf0jg0 AQSuR7PLbG92NwYHjTU/JDSNomLM+B+QOfr/Qg81cQ08w/41oPo= =56np -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/dgibson/tags/ppc-for-4.0-20190409' into staging ppc patch queue 2019-04-09 This is a small, hard freeze, pull request which fixes a regression on the pseries machine handling of PCI-E extended config space accesses. # gpg: Signature made Tue 09 Apr 2019 08:00:36 BST # gpg: using RSA key 75F46586AE61A66CC44E87DC6C38CACA20D9B392 # gpg: Good signature from "David Gibson <david@gibson.dropbear.id.au>" [full] # gpg: aka "David Gibson (Red Hat) <dgibson@redhat.com>" [full] # gpg: aka "David Gibson (ozlabs.org) <dgibson@ozlabs.org>" [full] # gpg: aka "David Gibson (kernel.org) <dwg@kernel.org>" [unknown] # Primary key fingerprint: 75F4 6586 AE61 A66C C44E 87DC 6C38 CACA 20D9 B392 * remotes/dgibson/tags/ppc-for-4.0-20190409: spapr_pci: Fix extended config space accesses pci: Allow PCI bus subtypes to support extended config space accesses Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
120cba7ff1
24
hw/pci/pci.c
24
hw/pci/pci.c
@ -147,6 +147,11 @@ static uint16_t pcibus_numa_node(PCIBus *bus)
|
||||
return NUMA_NODE_UNASSIGNED;
|
||||
}
|
||||
|
||||
static bool pcibus_allows_extended_config_space(PCIBus *bus)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void pci_bus_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
BusClass *k = BUS_CLASS(klass);
|
||||
@ -162,6 +167,7 @@ static void pci_bus_class_init(ObjectClass *klass, void *data)
|
||||
pbc->is_root = pcibus_is_root;
|
||||
pbc->bus_num = pcibus_num;
|
||||
pbc->numa_node = pcibus_numa_node;
|
||||
pbc->allows_extended_config_space = pcibus_allows_extended_config_space;
|
||||
}
|
||||
|
||||
static const TypeInfo pci_bus_info = {
|
||||
@ -182,9 +188,22 @@ static const TypeInfo conventional_pci_interface_info = {
|
||||
.parent = TYPE_INTERFACE,
|
||||
};
|
||||
|
||||
static bool pciebus_allows_extended_config_space(PCIBus *bus)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
static void pcie_bus_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
PCIBusClass *pbc = PCI_BUS_CLASS(klass);
|
||||
|
||||
pbc->allows_extended_config_space = pciebus_allows_extended_config_space;
|
||||
}
|
||||
|
||||
static const TypeInfo pcie_bus_info = {
|
||||
.name = TYPE_PCIE_BUS,
|
||||
.parent = TYPE_PCI_BUS,
|
||||
.class_init = pcie_bus_class_init,
|
||||
};
|
||||
|
||||
static PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num);
|
||||
@ -401,6 +420,11 @@ bool pci_bus_is_root(PCIBus *bus)
|
||||
return PCI_BUS_GET_CLASS(bus)->is_root(bus);
|
||||
}
|
||||
|
||||
bool pci_bus_allows_extended_config_space(PCIBus *bus)
|
||||
{
|
||||
return PCI_BUS_GET_CLASS(bus)->allows_extended_config_space(bus);
|
||||
}
|
||||
|
||||
void pci_root_bus_new_inplace(PCIBus *bus, size_t bus_size, DeviceState *parent,
|
||||
const char *name,
|
||||
MemoryRegion *address_space_mem,
|
||||
|
@ -54,7 +54,7 @@ static inline PCIDevice *pci_dev_find_by_addr(PCIBus *bus, uint32_t addr)
|
||||
static void pci_adjust_config_limit(PCIBus *bus, uint32_t *limit)
|
||||
{
|
||||
if (*limit > PCI_CONFIG_SPACE_SIZE) {
|
||||
if (!pci_bus_is_express(bus)) {
|
||||
if (!pci_bus_allows_extended_config_space(bus)) {
|
||||
*limit = PCI_CONFIG_SPACE_SIZE;
|
||||
return;
|
||||
}
|
||||
|
@ -1638,6 +1638,28 @@ static void spapr_phb_unrealize(DeviceState *dev, Error **errp)
|
||||
memory_region_del_subregion(get_system_memory(), &sphb->mem32window);
|
||||
}
|
||||
|
||||
static bool spapr_phb_allows_extended_config_space(PCIBus *bus)
|
||||
{
|
||||
SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(BUS(bus)->parent);
|
||||
|
||||
return sphb->pcie_ecs;
|
||||
}
|
||||
|
||||
static void spapr_phb_root_bus_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
PCIBusClass *pbc = PCI_BUS_CLASS(klass);
|
||||
|
||||
pbc->allows_extended_config_space = spapr_phb_allows_extended_config_space;
|
||||
}
|
||||
|
||||
#define TYPE_SPAPR_PHB_ROOT_BUS "spapr-pci-host-bridge-root-bus"
|
||||
|
||||
static const TypeInfo spapr_phb_root_bus_info = {
|
||||
.name = TYPE_SPAPR_PHB_ROOT_BUS,
|
||||
.parent = TYPE_PCI_BUS,
|
||||
.class_init = spapr_phb_root_bus_class_init,
|
||||
};
|
||||
|
||||
static void spapr_phb_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
/* We don't use SPAPR_MACHINE() in order to exit gracefully if the user
|
||||
@ -1739,10 +1761,11 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
|
||||
memory_region_add_subregion(get_system_memory(), sphb->io_win_addr,
|
||||
&sphb->iowindow);
|
||||
|
||||
bus = pci_register_root_bus(dev, NULL,
|
||||
bus = pci_register_root_bus(dev, "pci.0",
|
||||
pci_spapr_set_irq, pci_spapr_map_irq, sphb,
|
||||
&sphb->memspace, &sphb->iospace,
|
||||
PCI_DEVFN(0, 0), PCI_NUM_PINS, TYPE_PCI_BUS);
|
||||
PCI_DEVFN(0, 0), PCI_NUM_PINS,
|
||||
TYPE_SPAPR_PHB_ROOT_BUS);
|
||||
phb->bus = bus;
|
||||
qbus_set_hotplug_handler(BUS(phb->bus), OBJECT(sphb), NULL);
|
||||
|
||||
@ -2325,6 +2348,7 @@ void spapr_pci_rtas_init(void)
|
||||
static void spapr_pci_register_types(void)
|
||||
{
|
||||
type_register_static(&spapr_phb_info);
|
||||
type_register_static(&spapr_phb_root_bus_info);
|
||||
}
|
||||
|
||||
type_init(spapr_pci_register_types)
|
||||
|
@ -396,6 +396,8 @@ typedef PCIINTxRoute (*pci_route_irq_fn)(void *opaque, int pin);
|
||||
|
||||
bool pci_bus_is_express(PCIBus *bus);
|
||||
bool pci_bus_is_root(PCIBus *bus);
|
||||
bool pci_bus_allows_extended_config_space(PCIBus *bus);
|
||||
|
||||
void pci_root_bus_new_inplace(PCIBus *bus, size_t bus_size, DeviceState *parent,
|
||||
const char *name,
|
||||
MemoryRegion *address_space_mem,
|
||||
|
@ -18,6 +18,7 @@ typedef struct PCIBusClass {
|
||||
bool (*is_root)(PCIBus *bus);
|
||||
int (*bus_num)(PCIBus *bus);
|
||||
uint16_t (*numa_node)(PCIBus *bus);
|
||||
bool (*allows_extended_config_space)(PCIBus *bus);
|
||||
} PCIBusClass;
|
||||
|
||||
struct PCIBus {
|
||||
|
Loading…
Reference in New Issue
Block a user