The patch intends to connect the KVM module with the backend for EEH RTAS emulation. In turn, we can handle the EEH RTAS services from the guest. Signed-off-by: Gavin Shan <gwshan@xxxxxxxxxxxxxxxxxx> --- arch/powerpc/include/asm/kvm_ppc.h | 7 +++++++ arch/powerpc/kvm/book3s_rtas.c | 40 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index 4096f16..18b51a1 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h @@ -29,6 +29,9 @@ #include <linux/kvm_types.h> #include <linux/kvm_host.h> #include <linux/bug.h> +#ifdef CONFIG_KVM_EEH +#include <asm/rtas.h> +#endif #ifdef CONFIG_PPC_BOOK3S #include <asm/kvm_book3s.h> #else @@ -166,6 +169,10 @@ int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, struct kvm_interrupt *irq); extern int kvm_vm_ioctl_rtas_define_token(struct kvm *kvm, void __user *argp); extern int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu); extern void kvmppc_rtas_tokens_free(struct kvm *kvm); +#ifdef CONFIG_KVM_EEH +extern void kvmppc_eeh_rtas(struct kvm_vcpu *vcpu, + struct rtas_args *args, int flag); +#endif extern int kvmppc_xics_set_xive(struct kvm *kvm, u32 irq, u32 server, u32 priority); extern int kvmppc_xics_get_xive(struct kvm *kvm, u32 irq, u32 *server, diff --git a/arch/powerpc/kvm/book3s_rtas.c b/arch/powerpc/kvm/book3s_rtas.c index 7a05315..17bdb4a 100644 --- a/arch/powerpc/kvm/book3s_rtas.c +++ b/arch/powerpc/kvm/book3s_rtas.c @@ -16,6 +16,8 @@ #include <asm/kvm_ppc.h> #include <asm/hvcall.h> #include <asm/rtas.h> +#include <asm/ppc-pci.h> +#include <asm/eeh.h> #ifdef CONFIG_KVM_XICS static void kvm_rtas_set_xive(struct kvm_vcpu *vcpu, struct rtas_args *args) @@ -103,6 +105,24 @@ out: } #endif /* CONFIG_KVM_XICS */ +#ifdef CONFIG_KVM_EEH + +#define KVM_RTAS_EEH_FUNC(name, flag) \ +static void kvm_rtas_eeh_##name(struct kvm_vcpu *vcpu, \ + struct rtas_args *args) \ +{ \ + kvmppc_eeh_rtas(vcpu, args, flag); \ +} + +KVM_RTAS_EEH_FUNC(set_option, eeh_rtas_set_option) +KVM_RTAS_EEH_FUNC(set_reset, eeh_rtas_set_slot_reset) +KVM_RTAS_EEH_FUNC(read_state2, eeh_rtas_read_slot_reset_state2) +KVM_RTAS_EEH_FUNC(addr_info2, eeh_rtas_get_config_addr_info2) +KVM_RTAS_EEH_FUNC(error_detail, eeh_rtas_slot_error_detail) +KVM_RTAS_EEH_FUNC(configure_pe, eeh_rtas_configure_pe) + +#endif /* CONFIG_KVM_EEH */ + struct rtas_handler { void (*handler)(struct kvm_vcpu *vcpu, struct rtas_args *args); char *name; @@ -115,6 +135,26 @@ static struct rtas_handler rtas_handlers[] = { { .name = "ibm,int-off", .handler = kvm_rtas_int_off }, { .name = "ibm,int-on", .handler = kvm_rtas_int_on }, #endif +#ifdef CONFIG_KVM_EEH + { .name = "ibm,set-eeh-option", + .handler = kvm_rtas_eeh_set_option + }, + { .name = "ibm,set-slot-reset", + .handler = kvm_rtas_eeh_set_reset + }, + { .name = "ibm,read-slot-reset-state2", + .handler = kvm_rtas_eeh_read_state2 + }, + { .name = "ibm,get-config-addr-info2", + .handler = kvm_rtas_eeh_addr_info2 + }, + { .name = "ibm,slot-error-detail", + .handler = kvm_rtas_eeh_error_detail + }, + { .name = "ibm,configure-pe", + .handler = kvm_rtas_eeh_configure_pe + } +#endif /* CONFIG_KVM_EEH */ }; struct rtas_token_definition { -- 1.8.3.2 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html