From patchwork Mon May 5 01:28:05 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gavin Shan X-Patchwork-Id: 345545 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 5BA271402FB for ; Mon, 5 May 2014 11:28:46 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753926AbaEEB2m (ORCPT ); Sun, 4 May 2014 21:28:42 -0400 Received: from e23smtp07.au.ibm.com ([202.81.31.140]:47578 "EHLO e23smtp07.au.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754076AbaEEB2C (ORCPT ); Sun, 4 May 2014 21:28:02 -0400 Received: from /spool/local by e23smtp07.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 5 May 2014 11:28:01 +1000 Received: from d23dlp02.au.ibm.com (202.81.31.213) by e23smtp07.au.ibm.com (202.81.31.204) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 5 May 2014 11:28:00 +1000 Received: from d23relay03.au.ibm.com (d23relay03.au.ibm.com [9.190.235.21]) by d23dlp02.au.ibm.com (Postfix) with ESMTP id 590CA2BB0056; Mon, 5 May 2014 11:27:59 +1000 (EST) Received: from d23av03.au.ibm.com (d23av03.au.ibm.com [9.190.234.97]) by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id s451Riq162783624; Mon, 5 May 2014 11:27:44 +1000 Received: from d23av03.au.ibm.com (localhost [127.0.0.1]) by d23av03.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s451RwBr013849; Mon, 5 May 2014 11:27:59 +1000 Received: from ozlabs.au.ibm.com (ozlabs.au.ibm.com [9.190.163.12]) by d23av03.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id s451Rwu4013844; Mon, 5 May 2014 11:27:58 +1000 Received: from shangw (haven.au.ibm.com [9.190.164.82]) by ozlabs.au.ibm.com (Postfix) with ESMTP id 421EDA0117; Mon, 5 May 2014 11:27:58 +1000 (EST) Received: by shangw (Postfix, from userid 1000) id 2E9EC3E0370; Mon, 5 May 2014 11:28:20 +1000 (EST) From: Gavin Shan To: linuxppc-dev@lists.ozlabs.org, kvm@vger.kernel.org, kvm-ppc@vger.kernel.org Cc: alex.williamson@redhat.com, benh@kernel.crashing.org, aik@ozlabs.ru, qiudayu@linux.vnet.ibm.com, Gavin Shan Subject: [PATCH 16/22] powerpc/eeh: Emulate RTAS call ibm,configure-pe Date: Mon, 5 May 2014 11:28:05 +1000 Message-Id: <1399253291-3975-17-git-send-email-gwshan@linux.vnet.ibm.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1399253291-3975-1-git-send-email-gwshan@linux.vnet.ibm.com> References: <1399253291-3975-1-git-send-email-gwshan@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 14050501-0260-0000-0000-000004E1DA5D Sender: kvm-ppc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm-ppc@vger.kernel.org The RTAS call "ibm,configure-pe" is being used to restore everything after PE reset. The patch implements the backend to emulate the RTAS call. In that, we restores BARs for the affected PCI device in host side because the guest might not have full access to the config space. Signed-off-by: Gavin Shan --- arch/powerpc/platforms/powernv/eeh-rtas.c | 49 +++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/arch/powerpc/platforms/powernv/eeh-rtas.c b/arch/powerpc/platforms/powernv/eeh-rtas.c index 8934564..a663cd8 100644 --- a/arch/powerpc/platforms/powernv/eeh-rtas.c +++ b/arch/powerpc/platforms/powernv/eeh-rtas.c @@ -462,6 +462,52 @@ out: return ret; } +static int kvmppc_eeh_configure_pe(struct kvm_vcpu *vcpu, + struct rtas_args *args) +{ + struct pci_controller *hose; + struct pnv_phb *phb; + struct eeh_dev *edev; + struct eeh_pe *pe; + struct eeh_vfio_pci_addr addr; + int ret = 0; + + /* Sanity check on parameter */ + if (args->nargs != 3 || args->nret != 1) { + pr_warn("%s: Non-matched arguments (%d, %d) - (3, 1)\n", + __func__, args->nargs, args->nret); + ret = -3; + goto out; + } + + /* Figure out the address */ + if (kvmppc_eeh_format_addr(vcpu, args, &addr, false, &edev, &pe)) { + ret = -3; + goto out; + } + + /* Make sure that the EEH stuff has been initialized */ + hose = pe->phb; + phb = hose->private_data; + if (!(phb->flags & PNV_PHB_FLAG_EEH)) { + pr_warn("%s: EEH disabled on PHB#%x\n", + __func__, hose->global_number); + ret = -3; + goto out; + } + + /* + * The access to PCI config space on VFIO device has some + * limitations. Part of PCI config space, including BAR + * registers are not readable and writable. So the guest + * should have stale values for those registers and we have + * to restore them in host side. + */ + eeh_pe_restore_bars(pe); +out: + return ret; +} + /** * kvmppc_eeh_rtas - Backend for EEH RTAS emulation * @vcpu: KVM virtual CPU @@ -493,6 +539,9 @@ void kvmppc_eeh_rtas(struct kvm_vcpu *vcpu, struct rtas_args *args, int op) case eeh_rtas_slot_error_detail: ret = kvmppc_eeh_get_error(vcpu, args); break; + case eeh_rtas_configure_pe: + ret = kvmppc_eeh_configure_pe(vcpu, args); + break; default: pr_warn("%s: Unsupported EEH RTAS service#%d\n", __func__, op);