sPAPR: Don't enable EEH on emulated PCI devices

There might have emulated PCI devices, together with VFIO PCI
devices under one PHB. The EEH capability shouldn't enabled
on emulated PCI devices.

The patch returns error when enabling EEH capability on emulated
PCI devices by RTAS call "ibm,set-eeh-option".

Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
Gavin Shan 2015-07-02 16:23:26 +10:00 committed by Alexander Graf
parent e275934d2d
commit 7cb180079e

View File

@ -429,6 +429,7 @@ static void rtas_ibm_set_eeh_option(PowerPCCPU *cpu,
{ {
sPAPRPHBState *sphb; sPAPRPHBState *sphb;
sPAPRPHBClass *spc; sPAPRPHBClass *spc;
PCIDevice *pdev;
uint32_t addr, option; uint32_t addr, option;
uint64_t buid; uint64_t buid;
int ret; int ret;
@ -446,6 +447,12 @@ static void rtas_ibm_set_eeh_option(PowerPCCPU *cpu,
goto param_error_exit; goto param_error_exit;
} }
pdev = pci_find_device(PCI_HOST_BRIDGE(sphb)->bus,
(addr >> 16) & 0xFF, (addr >> 8) & 0xFF);
if (!pdev || !object_dynamic_cast(OBJECT(pdev), "vfio-pci")) {
goto param_error_exit;
}
spc = SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb); spc = SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb);
if (!spc->eeh_set_option) { if (!spc->eeh_set_option) {
goto param_error_exit; goto param_error_exit;