From patchwork Mon May 5 01:27:53 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gavin Shan X-Patchwork-Id: 345555 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 ABEDF140B04 for ; Mon, 5 May 2014 11:29:10 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754230AbaEEB3I (ORCPT ); Sun, 4 May 2014 21:29:08 -0400 Received: from e23smtp07.au.ibm.com ([202.81.31.140]:47553 "EHLO e23smtp07.au.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753951AbaEEB16 (ORCPT ); Sun, 4 May 2014 21:27:58 -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:27:56 +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:27:54 +1000 Received: from d23relay03.au.ibm.com (d23relay03.au.ibm.com [9.190.235.21]) by d23dlp02.au.ibm.com (Postfix) with ESMTP id 1F3C32BB0040; Mon, 5 May 2014 11:27:54 +1000 (EST) Received: from d23av01.au.ibm.com (d23av01.au.ibm.com [9.190.234.96]) by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id s451RdTr6881736; Mon, 5 May 2014 11:27:39 +1000 Received: from d23av01.au.ibm.com (localhost [127.0.0.1]) by d23av01.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s451Rrga011461; Mon, 5 May 2014 11:27:53 +1000 Received: from ozlabs.au.ibm.com (ozlabs.au.ibm.com [9.190.163.12]) by d23av01.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id s451RrN9011458; Mon, 5 May 2014 11:27:53 +1000 Received: from shangw (haven.au.ibm.com [9.190.164.82]) by ozlabs.au.ibm.com (Postfix) with ESMTP id E758BA0117; Mon, 5 May 2014 11:27:52 +1000 (EST) Received: by shangw (Postfix, from userid 1000) id D71CB3E0370; Mon, 5 May 2014 11:28:14 +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 04/22] powerpc/eeh: Search EEH PE by guest address Date: Mon, 5 May 2014 11:27:53 +1000 Message-Id: <1399253291-3975-5-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-000004E1DA47 Sender: kvm-ppc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm-ppc@vger.kernel.org The patch introduces function eeh_vfio_pe_get() to search the EEH PE according to its guest address, which is made up of KVM indicator, PHB ID and PE configuration address. The function will be useful in backends for EEH RTAS emulation. Signed-off-by: Gavin Shan --- arch/powerpc/include/asm/eeh.h | 1 + arch/powerpc/kernel/eeh_pe.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/arch/powerpc/include/asm/eeh.h b/arch/powerpc/include/asm/eeh.h index b12e3e9..3807167 100644 --- a/arch/powerpc/include/asm/eeh.h +++ b/arch/powerpc/include/asm/eeh.h @@ -387,6 +387,7 @@ static inline void eeh_remove_device(struct pci_dev *dev) { } #ifdef CONFIG_KVM_EEH struct eeh_dev *eeh_vfio_dev_get(struct eeh_vfio_pci_addr *addr); +struct eeh_pe *eeh_vfio_pe_get(struct eeh_vfio_pci_addr *addr); #endif /* CONFIG_KVM_EEH */ diff --git a/arch/powerpc/kernel/eeh_pe.c b/arch/powerpc/kernel/eeh_pe.c index dba7c82..1bd7b1f 100644 --- a/arch/powerpc/kernel/eeh_pe.c +++ b/arch/powerpc/kernel/eeh_pe.c @@ -249,6 +249,46 @@ struct eeh_pe *eeh_pe_get(struct eeh_dev *edev) } #ifdef CONFIG_KVM_EEH +static void *__eeh_vfio_pe_get(void *data, void *flag) +{ + struct eeh_pe *pe = (struct eeh_pe *)data; + struct eeh_vfio_pci_addr *addr = (struct eeh_vfio_pci_addr *)flag; + + if (!eeh_pe_passed(pe)) + return NULL; + + /* Comparing the address */ + if (addr->kvm == pe->gaddr.kvm && + addr->buid_hi == pe->gaddr.buid_hi && + addr->buid_lo == pe->gaddr.buid_lo && + addr->pe_addr == pe->gaddr.pe_addr) + return pe; + + return NULL; +} + +/** + * eeh_vfio_pe_get - Search EEH PE based on guest's address + * @addr: EEH PE guest address + * + * Search the EEH PE according to the guest address, which + * is made up of VM indicator, PHB BUID, and PE configuration + * address. + */ +struct eeh_pe *eeh_vfio_pe_get(struct eeh_vfio_pci_addr *addr) +{ + struct eeh_pe *root; + struct eeh_pe *pe; + + list_for_each_entry(root, &eeh_phb_pe, child) { + pe = eeh_pe_traverse(root, __eeh_vfio_pe_get, addr); + if (pe) + return pe; + } + + return NULL; +} + static void *__eeh_vfio_dev_get(void *data, void *flag) { struct eeh_pe *pe = (struct eeh_pe *)data;