From patchwork Wed Jan 24 18:26:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 125701 Delivered-To: patch@linaro.org Received: by 10.46.66.141 with SMTP id h13csp588044ljf; Wed, 24 Jan 2018 10:29:04 -0800 (PST) X-Google-Smtp-Source: AH8x225g3RO8aK2xTUagCVsoSO5x1U8FxSSCuuHQasnqHbcldcOavoQbFihZ+qDHoV1FoTd42TEh X-Received: by 10.36.65.202 with SMTP id b71mr9320352itd.56.1516818543993; Wed, 24 Jan 2018 10:29:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516818543; cv=none; d=google.com; s=arc-20160816; b=Vl2epBMQBHIAHxad+eh9YmTBpfQnn67tjDm8vE+vh2NpvmcHCcklc5muj0BnOmZ8U3 ZJOldP+1UbCOdZiWFn9/uUeDEtov12DvwqwuX72rbtWCqENBCgUwNyCNdt1RHka1FqFG tAHyvuXgJpnqlUZLbPzXYI/yhKgcmp24ty29ryvKXhr9eZ8oiiNGl+Zh6eYWwCxIVcQU djsL2gz5rE98a67kA2d5MrVrXfoXO3CPt4qlKcA2W0MttSJHJtyMGEFS9bbubBXER+ON 62/dir1kF0zmC6Dy8xY0vEEpIF9dAG1NqSVOhwBd/RoICR7/KG4j9mvs9nowD7TwMB3v fOqA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-unsubscribe:list-id :precedence:subject:cc:references:in-reply-to:message-id:date:to :from:dkim-signature:arc-authentication-results; bh=pK35n0gIc+gs0T5Cdn1v5urhFpYtAv3LFsB2Nn3wLrY=; b=ewCddxSRlShaO6WkfW2NhAdaASxoyfcecVBDqUM/I3zN60nGW4yUuzSbo015wKoqCI nzWbKWxs27S6YyxjEdG2LzEpBrpLfd2QaEdyP9accbF4Mxv/hMSdG1Qn7RBXN+J7XfFf E3aqUAMJ7DiC8Wri4Eb+2UESYLaNNTV4fzPeogqhYQJK07NsdNzmPTori8E9+ypNuwat ieYdqAiyJ0O1YP1b4aR5rA0FbEE1ARiSTKjBIDanjUly/E86vvAj03EU8Ic07iTK+9XE BnTdfUZXTnjgIjF9cR5FfSWtNRJLUPSp19Za4boDP2IpSL6k2l+lvr0BnskvxQnLBTn9 L2zQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=WepwLA9o; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id w24si646771ioi.319.2018.01.24.10.29.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 Jan 2018 10:29:03 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=WepwLA9o; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.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 1eePkf-0000Yh-8f; Wed, 24 Jan 2018 18:26:25 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eePke-0000YV-9Y for xen-devel@lists.xen.org; Wed, 24 Jan 2018 18:26:24 +0000 X-Inumbo-ID: 10ce15b7-0134-11e8-ba59-bc764e045a96 Received: from mail-wr0-x244.google.com (unknown [2a00:1450:400c:c0c::244]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 10ce15b7-0134-11e8-ba59-bc764e045a96; Wed, 24 Jan 2018 19:26:17 +0100 (CET) Received: by mail-wr0-x244.google.com with SMTP id a1so337702wri.5 for ; Wed, 24 Jan 2018 10:26:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=6yurMlyoXPztG9hyHFTEp5mVCDSmJovsf3FLmqV+u1g=; b=WepwLA9oxrxo+Ss0hzKcZugL/O+0tppCvTRc2pweeBAVjTyaW559B0thXiTjq6uhQM VFlXo4cD8jNydI+O1QlRJzqab3+o68iVy8qk9F83+tcf0ok5ijXqW940mc2DcrtMUYKS kyCLARcFprougMI4gZf3hYRXNKIxSlzVy7TbI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=6yurMlyoXPztG9hyHFTEp5mVCDSmJovsf3FLmqV+u1g=; b=APQ8Z6d+6fIgvDM4DiitAiPYuY8FI/H3ARrVugxxKwIRKU8YGvXc8YrNeTS77O7V9U aSQWlrwfmAsitTaJ4lG5rAJPL76YQBJO5RZ6M/xEg8nHK9X9LbWx/tHptRPQgtxle8Fc tZFOMfeMW7Pn6cnypvfj5RTtAg1yLffzn3eWL5ESbr0JqCTd/yvIzu0wN+xLeTNlq4Rz k3uopGZPINGEkJkfS7Fb9yjYqr3pluEbaz7y1ddKrSwFkhjG2V/ZEeLvZ+75m1HRbRPC khij8E08mg4haDxIHqXWVDwIcKx9/4SNvUWbjoZwe/z9wapw8wgrEY8yAumubAdUG/5e N0Ng== X-Gm-Message-State: AKwxyteXCqsXwXrQ5OqaeJ+9iqhX31HIy+NwxVhPdqHOikyunpDc5+OF 2gLUlHVbFG1e5s5Qs6bc+bTp2oqz+TU= X-Received: by 10.223.129.135 with SMTP id 7mr6711497wra.40.1516818379766; Wed, 24 Jan 2018 10:26:19 -0800 (PST) Received: from e108454-lin.cambridge.arm.com ([2001:41d0:1:6c23::1]) by smtp.gmail.com with ESMTPSA id k35sm6523047wrc.2.2018.01.24.10.26.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 Jan 2018 10:26:19 -0800 (PST) From: Julien Grall To: xen-devel@lists.xen.org Date: Wed, 24 Jan 2018 18:26:15 +0000 Message-Id: <20180124182616.3384-2-julien.grall@linaro.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180124182616.3384-1-julien.grall@linaro.org> References: <20180124182616.3384-1-julien.grall@linaro.org> Cc: sstabellini@kernel.org, Julien Grall , andre.przywara@linaro.org Subject: [Xen-devel] [PATCH v2 1/2] xen/arm: GICv3: Parse ITS information from the firmware tables later on X-BeenThere: xen-devel@lists.xenproject.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.xenproject.org Sender: "Xen-devel" There are Device Tree (e.g for the Foundation Model) out that describes the ITS but LPIs is not supported by the platform. Booting with such DT will result to an early Data Abort. The same DT is booting fine with a baremetal Linux because ITS will be initialized only when LPIs is supported. While this is a bug in the DT, I think Xen should be boot with the same hardware level support (e.g ITS will not be used) as with a baremetal Linux. The slight problem is Xen is relying on gicv3_its_host_has_its() to know if ITS can be used. The list is populated by gicv3_its_{dt,acpi}_init(). It would theoritical be possible to gate those with a check of GICD_TYPER.LPIS because we don't know yet whether the HW is an actual GICv3/GICv4. Looking at the callers of gicv3_its_host_has_its(), they will only be done after gicv3_its_init() is called. Therefore move the parsing of ITS information from firmware tables later on. Note that gicv3_its_init() has been moved at the end of the file to avoid forward declaration. Signed-off-by: Julien Grall Reviewed-by: Stefano Stabellini --- I can move the code movement in a separate patch if necessary. It was small enough that I thought it would not be worth. Changes in v2: - Actually test compilation and boot of this patch... --- xen/arch/arm/gic-v3-its.c | 47 +++++++++++++++++++++++++--------------- xen/arch/arm/gic-v3.c | 5 ----- xen/include/asm-arm/gic_v3_its.h | 12 ---------- 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/xen/arch/arm/gic-v3-its.c b/xen/arch/arm/gic-v3-its.c index e57ae05771..6127894d0b 100644 --- a/xen/arch/arm/gic-v3-its.c +++ b/xen/arch/arm/gic-v3-its.c @@ -515,21 +515,6 @@ static int gicv3_its_init_single_its(struct host_its *hw_its) return 0; } -int gicv3_its_init(void) -{ - struct host_its *hw_its; - int ret; - - list_for_each_entry(hw_its, &host_its_list, entry) - { - ret = gicv3_its_init_single_its(hw_its); - if ( ret ) - return ret; - } - - return 0; -} - /* * TODO: Investigate the interaction when a guest removes a device while * some LPIs are still in flight. @@ -1019,7 +1004,7 @@ static void add_to_host_its_list(paddr_t addr, paddr_t size, } /* Scan the DT for any ITS nodes and create a list of host ITSes out of it. */ -void gicv3_its_dt_init(const struct dt_device_node *node) +static void gicv3_its_dt_init(const struct dt_device_node *node) { const struct dt_device_node *its = NULL; @@ -1056,7 +1041,7 @@ static int gicv3_its_acpi_probe(struct acpi_subtable_header *header, return 0; } -void gicv3_its_acpi_init(void) +static void gicv3_its_acpi_init(void) { /* Parse ITS information */ acpi_table_parse_madt(ACPI_MADT_TYPE_GENERIC_TRANSLATOR, @@ -1081,8 +1066,36 @@ unsigned long gicv3_its_make_hwdom_madt(const struct domain *d, void *base_ptr) return sizeof(struct acpi_madt_generic_translator) * vgic_v3_its_count(d); } +#else /* !CONFIG_ACPI */ + +static void gicv3_its_acpi_init(void) +{ + ASSERT_UNREACHABLE(); +} + #endif +int gicv3_its_init(void) +{ + struct host_its *hw_its; + int ret; + + if ( acpi_disabled ) + gicv3_its_dt_init(dt_interrupt_controller); + else + gicv3_its_acpi_init(); + + list_for_each_entry(hw_its, &host_its_list, entry) + { + ret = gicv3_its_init_single_its(hw_its); + if ( ret ) + return ret; + } + + return 0; +} + + /* * Local variables: * mode: C diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c index a0d290b55c..9f9cf59f82 100644 --- a/xen/arch/arm/gic-v3.c +++ b/xen/arch/arm/gic-v3.c @@ -1314,9 +1314,6 @@ static void __init gicv3_dt_init(void) if ( !res ) dt_device_get_address(node, 1 + gicv3.rdist_count + 2, &vbase, &vsize); - - /* Check for ITS child nodes and build the host ITS list accordingly. */ - gicv3_its_dt_init(node); } static int gicv3_iomem_deny_access(const struct domain *d) @@ -1608,8 +1605,6 @@ static void __init gicv3_acpi_init(void) gicv3.rdist_stride = 0; - gicv3_its_acpi_init(); - /* * In ACPI, 0 is considered as the invalid address. However the rest * of the initialization rely on the invalid address to be diff --git a/xen/include/asm-arm/gic_v3_its.h b/xen/include/asm-arm/gic_v3_its.h index 40dffdc0fa..78a9bb14de 100644 --- a/xen/include/asm-arm/gic_v3_its.h +++ b/xen/include/asm-arm/gic_v3_its.h @@ -133,11 +133,7 @@ struct host_its { extern struct list_head host_its_list; -/* Parse the host DT and pick up all host ITSes. */ -void gicv3_its_dt_init(const struct dt_device_node *node); - #ifdef CONFIG_ACPI -void gicv3_its_acpi_init(void); unsigned long gicv3_its_make_hwdom_madt(const struct domain *d, void *base_ptr); #endif @@ -202,15 +198,7 @@ void gicv3_lpi_update_host_entry(uint32_t host_lpi, int domain_id, #else -static inline void gicv3_its_dt_init(const struct dt_device_node *node) -{ -} - #ifdef CONFIG_ACPI -static inline void gicv3_its_acpi_init(void) -{ -} - static inline unsigned long gicv3_its_make_hwdom_madt(const struct domain *d, void *base_ptr) {