From patchwork Wed Jul 27 13:58:29 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 72868 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp328700qga; Wed, 27 Jul 2016 07:01:17 -0700 (PDT) X-Received: by 10.36.58.8 with SMTP id m8mr103098178itm.95.1469628077360; Wed, 27 Jul 2016 07:01:17 -0700 (PDT) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id v74si7457979itb.96.2016.07.27.07.01.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Jul 2016 07:01:17 -0700 (PDT) Received-SPF: neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) client-ip=192.237.175.120; Authentication-Results: mx.google.com; spf=neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) smtp.mailfrom=xen-devel-bounces@lists.xen.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bSPMK-0006Qf-Od; Wed, 27 Jul 2016 13:58:52 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bSPMJ-0006OS-9g for xen-devel@lists.xen.org; Wed, 27 Jul 2016 13:58:51 +0000 Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id 19/BE-30284-A1EB8975; Wed, 27 Jul 2016 13:58:50 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrILMWRWlGSWpSXmKPExsVysyfVTVdq34x wg7vTGS2WfFzM4sDocXT3b6YAxijWzLyk/IoE1oz7Ny+wFOxWrnj1YQlrA+MRqS5GLg4hgY2M Ej8nvWPqYuQEck4zSqyaHQRiswloStz5/AksLiIgLXHt82VGEJtZYCGjxNvdISC2sICLRPO1u 8wgNouAqsT6H71gNq+As8T2OWvBeiUE5CROHpvMCmJzAtX3XrrECLHLWeLM342sExi5FzAyrG JUL04tKkst0jXVSyrKTM8oyU3MzNE1NDDVy00tLk5MT81JTCrWS87P3cQI9C4DEOxg/NLvfIh RkoNJSZR3keOMcCG+pPyUyozE4oz4otKc1OJDjBocHAKb166+wCjFkpefl6okwXtzD1CdYFFq empFWmYOMPxgSiU4eJREeGfuBkrzFhck5hZnpkOkTjEqSonzCuwFSgiAJDJK8+DaYCF/iVFWS piXEegoIZ6C1KLczBJU+VeM4hyMSsK8P0C282TmlcBNfwW0mAlocXEs2OKSRISUVAOjp/DGT/ c9cv5Pcr34qdBU3b2K4/rO5fbrfPr1LkUYtv5yiX/9rtWD7VNHaOVmp711ZkvWZIaZvFy14V/ 3o0Tb6nvfRBt/ai9Y9sjb78hKrty+8zw2V7KN96/pyL+/5sueLa6LXtpKK3fcqOf6f27OI467 686ukTBWOjSt0+5tqqz2HNNZ8zfMU2Ipzkg01GIuKk4EAKD6ZCp0AgAA X-Env-Sender: julien.grall@arm.com X-Msg-Ref: server-7.tower-206.messagelabs.com!1469627929!51458714!1 X-Originating-IP: [217.140.101.70] X-SpamReason: No, hits=0.0 required=7.0 tests=SUBJECT_RANDOMQ X-StarScan-Received: X-StarScan-Version: 8.77; banners=-,-,- X-VirusChecked: Checked Received: (qmail 51891 invoked from network); 27 Jul 2016 13:58:49 -0000 Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by server-7.tower-206.messagelabs.com with SMTP; 27 Jul 2016 13:58:49 -0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3D18B28; Wed, 27 Jul 2016 07:00:05 -0700 (PDT) Received: from e108454-lin.cambridge.arm.com (e108454-lin.cambridge.arm.com [10.1.218.32]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B637F3F25F; Wed, 27 Jul 2016 06:58:47 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xen.org Date: Wed, 27 Jul 2016 14:58:29 +0100 Message-Id: <1469627910-3902-9-git-send-email-julien.grall@arm.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1469627910-3902-1-git-send-email-julien.grall@arm.com> References: <1469627910-3902-1-git-send-email-julien.grall@arm.com> Cc: sstabellini@kernel.org, steve.capper@arm.com, Julien Grall , shannon.zhao@linaro.org, shankerd@codeaurora.org, wei.chen@linaro.org Subject: [Xen-devel] [PATCH v3 8/9] xen/arm: acpi: route all unused IRQs to DOM0 X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" It is not possible to know which IRQs will be used by DOM0 when ACPI is inuse. The approach implemented by this patch, will route all unused IRQs to DOM0 before it has booted. The number of IRQs routed is based on the maximum SPIs supported by the hardware (up to ~1000). However, some of them might not be wired. So we would allocate resource for nothing. For each IRQ routed, Xen is allocating memory for irqaction (40 bytes) and irq_guest (16 bytes). So in the worst case scenario ~54KB of memory will be allocated. Given that ACPI will mostly be used by server, I think it is a small drawback. map_irq_to_domain is slightly reworked to remove the dependency on device-tree. So the function can be also be used for ACPI and will avoid code duplication. Signed-off-by: Julien Grall Reviewed-by: Stefano Stabellini Tested-by: Shanker Donthineni --- Changes in v3: - Add Stefano's reviewed-by - Tested by Shanker on QDF2XXX server Changes in v2: - Rename acpi_permit_spi_access to acpi_route_spis - Update the comment in the function acpi_route_spis --- xen/arch/arm/domain_build.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 60db9e4..5b2f8ad 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -903,11 +903,10 @@ static int make_timer_node(const struct domain *d, void *fdt, return res; } -static int map_irq_to_domain(const struct dt_device_node *dev, - struct domain *d, unsigned int irq) +static int map_irq_to_domain(struct domain *d, unsigned int irq, + bool_t need_mapping, const char *devname) { - bool_t need_mapping = !dt_device_for_passthrough(dev); int res; res = irq_permit_access(d, irq); @@ -927,7 +926,7 @@ static int map_irq_to_domain(const struct dt_device_node *dev, */ vgic_reserve_virq(d, irq); - res = route_irq_to_guest(d, irq, irq, dt_node_name(dev)); + res = route_irq_to_guest(d, irq, irq, devname); if ( res < 0 ) { printk(XENLOG_ERR "Unable to map IRQ%"PRId32" to dom%d\n", @@ -947,6 +946,7 @@ static int map_dt_irq_to_domain(const struct dt_device_node *dev, struct domain *d = data; unsigned int irq = dt_irq->irq; int res; + bool_t need_mapping = !dt_device_for_passthrough(dev); if ( irq < NR_LOCAL_IRQS ) { @@ -965,7 +965,7 @@ static int map_dt_irq_to_domain(const struct dt_device_node *dev, return res; } - res = map_irq_to_domain(dev, d, irq); + res = map_irq_to_domain(d, irq, need_mapping, dt_node_name(dev)); return 0; } @@ -1103,7 +1103,7 @@ static int handle_device(struct domain *d, struct dt_device_node *dev) return res; } - res = map_irq_to_domain(dev, d, res); + res = map_irq_to_domain(d, res, need_mapping, dt_node_name(dev)); if ( res ) return res; } @@ -1343,15 +1343,14 @@ static int acpi_iomem_deny_access(struct domain *d) return gic_iomem_deny_access(d); } -static int acpi_permit_spi_access(struct domain *d) +static int acpi_route_spis(struct domain *d) { int i, res; struct irq_desc *desc; /* - * Here just permit Dom0 to access the SPIs which Xen doesn't use. Then when - * Dom0 configures the interrupt, set the interrupt type and route it to - * Dom0. + * Route the IRQ to hardware domain and permit the access. + * The interrupt type will be set by set by the hardware domain. */ for( i = NR_LOCAL_IRQS; i < vgic_num_irqs(d); i++ ) { @@ -1362,13 +1361,10 @@ static int acpi_permit_spi_access(struct domain *d) if ( desc->action != NULL) continue; - res = irq_permit_access(d, i); + /* XXX: Shall we use a proper devname? */ + res = map_irq_to_domain(d, i, true, "ACPI"); if ( res ) - { - printk(XENLOG_ERR "Unable to permit to dom%u access to IRQ %u\n", - d->domain_id, i); return res; - } } return 0; @@ -1902,7 +1898,7 @@ static int prepare_acpi(struct domain *d, struct kernel_info *kinfo) if ( rc != 0 ) return rc; - rc = acpi_permit_spi_access(d); + rc = acpi_route_spis(d); if ( rc != 0 ) return rc;