The emulation for EEH RTAS requests from guest isn't covered
by QEMU yet and the patch implements them.
The patch defines constants used by EEH RTAS calls and adds
callback sPAPRPHBClass::eeh_handler, which is going to be used
this way:
1. RTAS calls are received in spapr_pci.c, sanity check is done
there.
2. RTAS handlers handle what they can. If there is something it
cannot handle and sPAPRPHBClass::eeh_handler callback is defined,
it is called.
3. sPAPRPHBClass::eeh_handler is only implemented for VFIO now. It
does ioctl() to the IOMMU container fd to complete the call. Error
codes from that ioctl() are transferred back to the guest.
This adds 6 RTAS handlers, all defined in SPAPR specification:
1) ibm,set-eeh-option: disables/enables EEH on a device, removes PE from
stopped state;
2) ibm,get-config-addr-info2 - returns fabric configuration address (upper
PCI bridge or PHB if there is no bridge);
3) ibm,read-slot-reset-state2 - retrieve PE state;
4) ibm,set-slot-reset - issue PE reset;
5) ibm,configure-pe - configure PCI bridges in the affected PE;
6) ibm,slot-error-detail - retrieve EEH error log;
All calls use fabric configuration address (a.k.a. PE address) as a target
address except ibm,get-config-addr-info2 and one case (enable EEH on the
specified PCI function) for ibm,set-eeh-option.
Signed-off-by: Gavin Shan <address@hidden>
---
hw/ppc/spapr_pci.c | 248 ++++++++++++++++++++++++++++++++++++++++++++
include/hw/pci-host/spapr.h | 7 ++
include/hw/ppc/spapr.h | 33 ++++++
3 files changed, 288 insertions(+)
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index a9f307a..423e4ff 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -422,6 +422,241 @@ static void
rtas_ibm_query_interrupt_source_number(PowerPCCPU *cpu,
rtas_st(rets, 2, 1);/* 0 == level; 1 == edge */
}
+static int rtas_finish_eeh_request(sPAPRPHBState *sphb,
+ uint32_t req, uint32_t opt,
+ target_ulong rets)