From patchwork Mon Feb 1 09:26:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: vijayak@caviumnetworks.com X-Patchwork-Id: 8177251 Return-Path: X-Original-To: patchwork-xen-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id DA8379FE7C for ; Mon, 1 Feb 2016 09:33:10 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0579920412 for ; Mon, 1 Feb 2016 09:33:05 +0000 (UTC) Received: from lists.xen.org (lists.xenproject.org [50.57.142.19]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 664F420434 for ; Mon, 1 Feb 2016 09:32:59 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aQAoW-0006sd-Sl; Mon, 01 Feb 2016 09:30:28 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aQAnA-0006it-MJ for xen-devel@lists.xen.org; Mon, 01 Feb 2016 09:29:04 +0000 Received: from [85.158.137.68] by server-15.bemta-3.messagelabs.com id FD/CD-12946-F552FA65; Mon, 01 Feb 2016 09:29:03 +0000 X-Env-Sender: Vijaya.Kumar@caviumnetworks.com X-Msg-Ref: server-2.tower-31.messagelabs.com!1454318940!19390674!1 X-Originating-IP: [207.46.100.79] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 7.35.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 31415 invoked from network); 1 Feb 2016 09:29:02 -0000 Received: from mail-by2on0079.outbound.protection.outlook.com (HELO na01-by2-obe.outbound.protection.outlook.com) (207.46.100.79) by server-2.tower-31.messagelabs.com with AES256-SHA256 encrypted SMTP; 1 Feb 2016 09:29:02 -0000 Received: from cavium-Vostro-2520.caveonetworks.com (111.93.218.67) by BN3PR0701MB1688.namprd07.prod.outlook.com (10.163.39.154) with Microsoft SMTP Server (TLS) id 15.1.396.15; Mon, 1 Feb 2016 09:28:55 +0000 From: To: , , , , , Date: Mon, 1 Feb 2016 14:56:25 +0530 Message-ID: <1454318798-31913-16-git-send-email-vijayak@caviumnetworks.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1454318798-31913-1-git-send-email-vijayak@caviumnetworks.com> References: <1454318798-31913-1-git-send-email-vijayak@caviumnetworks.com> MIME-Version: 1.0 X-Originating-IP: [111.93.218.67] X-ClientProxiedBy: BM1PR01CA0026.INDPRD01.PROD.OUTLOOK.COM (25.163.198.161) To BN3PR0701MB1688.namprd07.prod.outlook.com (25.163.39.154) X-Microsoft-Exchange-Diagnostics: 1; BN3PR0701MB1688; 2:Ij33jwsIwYI1BZcEEC1mGLftGb2uc8PdHGKKB6erTQYCMpH4vqx8nMFCEm+5+J1TUMHmWTQS/rhzx76r9Okzu6W21w9vR1KDUzPdM/eFUnCEfrr3peAWLwqdE5zzsxMKyJ17hhr7A9pyvzzIdq7U0g==; 3:vwzdwRSC06BeLk84U5bl+IGn8JjdFiCKpCC+79B+OZlg6KYPrfCDHQxENNaG8pZfyeJVeHf9CeNK4x4f/MdvTtIAQh4qMmgNcFWQWwfIAm7VYYeaET4b38byWHdwWLRH; 25:nVKl1A1NvX9kuscmxZt3one6PSc6icv+ATTGz35fIG6oh6xRMb7RpQVheAVR2tjSno0JSdJULD3Cv/IVpS6Gf917FynUYv4X9WkxL3Q7c2r5w+h8xwYjpEnPdu2+uFxHo9BP0l7pTGERceUkTZPEyJZPNmCLXZs2tOThXGB5J/Ojm9b7B5Adi3hl1ecq39FagAjMORbEtZdyAKJqnTxCU8eFlKxDQroqyiqIxPzEZjbnCaDbemCGZRHMdT5rOE6R X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN3PR0701MB1688; X-MS-Office365-Filtering-Correlation-Id: 3d0c637d-36f7-4f5b-fe0d-08d32aea1d70 X-Microsoft-Exchange-Diagnostics: 1; BN3PR0701MB1688; 20:7Z/hwBYJ7zRuJWvF8nvf/iMLM+vEoaEwpT2ewJbnyDFushG0amCRFKyp7U177rIaYm8YezmkGYMF+BCK5UuEEckaiMzjmP6V1iuDmilH8u2djtlF4ZyWJTBaeXFwh15fWpIlI0OGpo9k0Di16+eXIDY3++HmCaNAwpAr0UMICTu4ShUbZjyvDjf81iZ9/D9cZqbTBs7t3pBhPVUNJjFV62spqVTspuW20BvJKf/8C2O5u4ueZaolFA0SZlii6OiapjZRXpxT9wpunxrS3UC5xxXr1OPhCMUNOZtUW4ohfhExZSHSYuFuPDewHKzloo64ww87ZWpyXDvXjCkOInHh2x0iQYMGGWQ1EtB+EuqLcrS/cXvdik4mQFz6a7ySTcev39cV1lKRryg6F6pgm2axTct+LTNtz/af84fuSQZo2mZJf3kL+gGqaYOmkx145WjmvBiM4b4TTZ0oqlUnI3MQoHT1qWU61MKYB4joRr5UMBzcbPbscuNYYTkAhs7NyYVNjsMjdzStSQ6U7+yW0U11SS24F1njlm6zscNIoZVbpgPi9+DSHDrNIyClT/fdtV1xMniX719ekEpR2SEm9Twwk1gDZJjCItOOuzVxTErwtkU= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046); SRVR:BN3PR0701MB1688; BCL:0; PCL:0; RULEID:; SRVR:BN3PR0701MB1688; X-Microsoft-Exchange-Diagnostics: 1; BN3PR0701MB1688; 4:V/RquKsJ471kjMS+XLtpqEzD8k8BQfykou2p3vZvu0HlWSTxfl8tn1MlbHZFVCj8mQZtDYrgv/S1xwiiDz3wpo4Nz31XhKttGWa3KeEjJa+mocovoGxJbc5VwHg9nCUHw1J9e7IA6mJANgOzDYAPCqNPfdDMn6OFDF+/C+OmyMKXg4++0cY23NA4S1kOoJNltIJ7DPF4S71YMjQlfDA1rcM4uknCK09WZnNOf5FBP7zKEFthhie2WuLJkfwjiPRqixQmgRrl++w+0oD7tZfPAKACdf/QSru+ak6L0WhURguU1jpZcHDAVA1hDUikVGlCthHqBtso2fReLAGnJ3npgTZyOKogUbGh6PSX+2+Lbis= X-Forefront-PRVS: 0839D067E7 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(3846002)(5009440100003)(4001430100002)(586003)(1096002)(76176999)(50986999)(36756003)(189998001)(92566002)(5004730100002)(2950100001)(229853001)(50226001)(87976001)(86152002)(107886002)(2201001)(5001960100002)(77096005)(15975445007)(53416004)(48376002)(19580395003)(19580405001)(5003940100001)(5001770100001)(42186005)(33646002)(66066001)(47776003)(2906002)(2876002)(4326007)(122386002)(3470700001)(5008740100001)(50466002)(40100003)(7099028)(7059030)(2004002)(2101003); DIR:OUT; SFP:1101; SCL:1; SRVR:BN3PR0701MB1688; H:cavium-Vostro-2520.caveonetworks.com; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN3PR0701MB1688; 23:h9IrTyZ/ej53cwKFphUMPNWy+Z1riT69cqez+yB?= =?us-ascii?Q?Gfy/6HEct/OYavQUBuElDOJXOjlFgi8MXPxFCNJz8FSklZN5RgHugCeeDXup?= =?us-ascii?Q?siayzELi+zKoRec9g7c2M7sH1GNdfu54YkxP/AmDE7ScOkbTX/Ep3Vrf4Ijk?= =?us-ascii?Q?9hBfuNuUh+4ugnh6Wdgyk/+36HGRPQ0L0pK/VByalXxeJ+1lbVpvmeRSiJj5?= =?us-ascii?Q?bugloeqlgvojqBW6PhAHJaFslDPI6g3nGsUcgR+fxBq/eudJBs1jh4FhVbCG?= =?us-ascii?Q?F2+9XebHmth116Ip1lvTzuXG7iPkANZmFkYRxK82o8T6XIldsMpxwOlcy38r?= =?us-ascii?Q?U1DXJXkJJMlNRhgb3AfP7M7uSxZ7UBKW2zZR4WQ96oAMb70egNfQrBHgJXx0?= =?us-ascii?Q?6s7XCJyX4waWPCanSF1CxoooaOvCBun+qOAvOtUmsRa2GD1aYdmxpHRQes+B?= =?us-ascii?Q?6bWl9408LjUM2I5cdUYaEXXOyTcxYu8UBsEfvna7+FDUXxOFNCNYAu0/yN7l?= =?us-ascii?Q?GSKzXhPF/ygYOFwpFHidOWTqeSG7av9vedifVA1bd26W1jhsXqsDUZ/MUOd2?= =?us-ascii?Q?aI1QGPaECUgAxtmR8goBsZ7aHTrsvppZu/j5KW40eiMne5O80bEbjnxizILX?= =?us-ascii?Q?1Ov+8gvsxrYgwf4dm0S/ncGqixPqzbq4I8EEZ2pyTow/JbfTAc3PWAyYj4WI?= =?us-ascii?Q?v3x47T5BK3Cp0IvereM+cT2AXhatxZLQUi63grEynLO/aTEznt3BtJfaaJWp?= =?us-ascii?Q?E6OLISvOhnWERn3iqGC9X+FSV+g2dfY5UD7c+GFtuW7ma+z/Ms4qnXxw1QTK?= =?us-ascii?Q?sd1kkGEYc88Gq/hEyn2ifHymsFpc3oMcivO3q1mtoMX3N5+4Ji01j8+2mDRB?= =?us-ascii?Q?l661lgySe3qUn985bf0BYXHUDEJtnLUfO+PmOaLquc4tn1ulTUehw9at4hLC?= =?us-ascii?Q?USBCxFe7hs46r4o1MaJ9pqitOYYam6MXYzl+ZBPcqc4LGmAGP+Snxc8qAexI?= =?us-ascii?Q?J3qORW5L0NnvYriTb5tj80cAGemL3Zaarmv34br7hcqbpmdFHJV8FMFV6MVH?= =?us-ascii?Q?Q1an7w1rmd/xOZocPb0Dwd8pfMJyoSbisbksvyo9eK9UoFJdmqljiLlmWyCP?= =?us-ascii?Q?DgOP7IOT4d7dY3UU7+l64JHSDxcvdbFZBPpito1mddRHMxOVlVyDtKotW611?= =?us-ascii?Q?fNJMk+WNUWbbc9dw=3D?= X-Microsoft-Exchange-Diagnostics: 1; BN3PR0701MB1688; 5:tHuMkIm3nuLu5Vpcqv4caurIqvTkuIrdeD+SG/TDFnblKaDoONDAU3ZZC3UjlsSAFWRAgkFUSQ7y5BZAzQDAGmyI9GDn72Vr4TfAb9kqI+cfZe0fw3JfywVUmGxBHAuEuO1y5A6FbbGzlERXDbE8Zw==; 24:GBEjduomipkr4pDVH+NqsKbq9r91FelHOGDOiCCuifmtd3PsapMzpWryuda8dNbYJzqiGd0Sb7PAPVjcdlarpS4q5f0h8CFIfjpSScKBkj8= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Feb 2016 09:28:55.4458 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR0701MB1688 X-Mailman-Approved-At: Mon, 01 Feb 2016 09:30:20 +0000 Cc: Prasun.Kapoor@caviumnetworks.com, manish.jaggi@caviumnetworks.com, Vijaya Kumar K , vijay.kilari@gmail.com Subject: [Xen-devel] [PATCH v8 15/28] xen/arm: ITS: Add virtual ITS driver X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAD_ENC_HEADER,BAYES_00, RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Vijaya Kumar K This patch introduces virtual ITS driver with following functionality - Introduces helper functions to manage device table and ITT table in guest memory - Helper function to handle virtual ITS devices assigned to domain Signed-off-by: Vijaya Kumar K Reviewed-by: Julien Grall --- v7: - Moved vits_access_guest_table() from vgic-v3-its.c to vgic.c and renamed as vgic_access_guest_memory(). - Renamed entry paramter in vgic_access_guest_memory() to gipa - Introduced new header file vits.h for vITS and moved vits structures from gic-its.h to vits.h v6: - Exported vits_access_guest_memory() api v5: - Removed RB tree that manages vitual ITS devices v4: - Rename functions {find,remove,insert}_vits_* to vits_{find,remove,insert}. - Add common helper function to map and read/write dt or vitt table entry. - Removed unused code --- xen/arch/arm/vgic-v3-its.c | 123 ++++++++++++++++++++++++++++++++++++++++++ xen/arch/arm/vgic.c | 39 ++++++++++++++ xen/include/asm-arm/domain.h | 2 + xen/include/asm-arm/vits.h | 68 +++++++++++++++++++++++ 4 files changed, 232 insertions(+) diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c new file mode 100644 index 0000000..df54ce5 --- /dev/null +++ b/xen/arch/arm/vgic-v3-its.c @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2015 Cavium Inc. + * Vijaya Kumar K + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* ITS device table helper functions */ +static int vits_vdevice_entry(struct domain *d, uint32_t dev_id, + struct vdevice_table *entry, bool_t set) +{ + uint64_t offset; + paddr_t dt_entry; + const struct vgic_its *vits = d->arch.vgic.vits; + + BUILD_BUG_ON(sizeof(struct vdevice_table) != 16); + + offset = dev_id * sizeof(struct vdevice_table); + if ( offset > vits->dt_size ) + { + printk(XENLOG_G_ERR + "d%d: vITS: Out of range off 0x%"PRIx64" id 0x%"PRIx32"\n", + d->domain_id, offset, dev_id); + return -EINVAL; + } + + dt_entry = vits->dt_ipa + offset; + + return vgic_access_guest_memory(d, dt_entry, entry, + sizeof(struct vdevice_table), set); +} + +static int vits_set_vdevice_entry(struct domain *d, uint32_t devid, + struct vdevice_table *entry) +{ + return vits_vdevice_entry(d, devid, entry, 1); +} + +int vits_get_vdevice_entry(struct domain *d, uint32_t devid, + struct vdevice_table *entry) +{ + return vits_vdevice_entry(d, devid, entry, 0); +} + +static int vits_vitt_entry(struct domain *d, uint32_t devid, + uint32_t event, struct vitt *entry, bool_t set) +{ + struct vdevice_table dt_entry; + paddr_t vitt_entry; + uint64_t offset; + + BUILD_BUG_ON(sizeof(struct vitt) != 8); + + if ( vits_get_vdevice_entry(d, devid, &dt_entry) ) + { + printk(XENLOG_G_ERR + "d%d: vITS: Fail to get vdevice for vdevid 0x%"PRIx32"\n", + d->domain_id, devid); + return -EINVAL; + } + + /* dt_entry has been validated in vits_get_vdevice_entry */ + offset = event * sizeof(struct vitt); + if ( offset > dt_entry.vitt_size ) + { + printk(XENLOG_G_ERR "d%d: vITS: ITT out of range\n", d->domain_id); + return -EINVAL; + } + + vitt_entry = dt_entry.vitt_ipa + offset; + + return vgic_access_guest_memory(d, vitt_entry, entry, + sizeof(struct vitt), set); +} + +static int vits_set_vitt_entry(struct domain *d, uint32_t devid, + uint32_t event, struct vitt *entry) +{ + return vits_vitt_entry(d, devid, event, entry, 1); +} + +int vits_get_vitt_entry(struct domain *d, uint32_t devid, + uint32_t event, struct vitt *entry) +{ + return vits_vitt_entry(d, devid, event, entry, 0); +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c index 8cb3b06..f813931 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -570,6 +571,44 @@ void vgic_free_virq(struct domain *d, unsigned int virq) clear_bit(virq, d->arch.vgic.allocated_irqs); } +int vgic_access_guest_memory(struct domain *d, paddr_t gipa, void *addr, + uint32_t size, bool_t set) +{ + struct page_info *page; + uint64_t offset; + p2m_type_t p2mt; + void *p; + + page = get_page_from_gfn(d, paddr_to_pfn(gipa), &p2mt, P2M_ALLOC); + if ( !page ) + { + printk(XENLOG_G_ERR "d%d: vITS: Failed to get table entry\n", + d->domain_id); + return -EINVAL; + } + + if ( !p2m_is_ram(p2mt) ) + { + put_page(page); + printk(XENLOG_G_ERR "d%d: vITS: with wrong attributes\n", d->domain_id); + return -EINVAL; + } + + p = __map_domain_page(page); + /* Offset within the mapped page */ + offset = gipa & ~PAGE_MASK; + + if ( set ) + memcpy(p + offset, addr, size); + else + memcpy(addr, p + offset, size); + + unmap_domain_page(p); + put_page(page); + + return 0; +} + /* * Local variables: * mode: C diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index aa7f283..0ac62d9 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -112,6 +112,8 @@ struct arch_domain } rdist_regions[MAX_RDIST_COUNT]; int nr_regions; /* Number of rdist regions */ uint32_t rdist_stride; /* Re-Distributor stride */ + /* Virtual ITS */ + struct vgic_its *vits; #endif } vgic; diff --git a/xen/include/asm-arm/vits.h b/xen/include/asm-arm/vits.h new file mode 100644 index 0000000..6cb5d01 --- /dev/null +++ b/xen/include/asm-arm/vits.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2015 Cavium Inc. + * Vijaya Kumar K + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __ASM_ARM_VITS_H__ +#define __ASM_ARM_VITS_H__ + +/* + * Per domain virtual ITS structure. + */ +struct vgic_its +{ + /* vITT device table ipa */ + paddr_t dt_ipa; + /* vITT device table size */ + uint64_t dt_size; +}; + +/* + * struct vdevice_table and struct vitt are typically stored in memory + * which has been provided by the guest out of its own address space + * and which remains accessible to the guest. + * + * Therefore great care _must_ be taken when accessing an entry in + * either table to validate the sanity of any values which are used. + */ +struct vdevice_table { + uint64_t vitt_ipa; + uint32_t vitt_size; + uint32_t padding; +}; + +struct vitt { + uint16_t valid:1; + uint16_t pad:15; + uint16_t vcollection; + uint32_t vlpi; +}; + +int vgic_access_guest_memory(struct domain *d, paddr_t gipa, void *addr, + uint32_t size, bool_t set); +int vits_get_vitt_entry(struct domain *d, uint32_t devid, uint32_t event, + struct vitt *entry); +int vits_get_vdevice_entry(struct domain *d, uint32_t devid, + struct vdevice_table *entry); + +#endif /* __ASM_ARM_VITS_H__ */ +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */