From patchwork Wed Apr 15 16:02:13 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg Bellows X-Patchwork-Id: 47223 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-lb0-f197.google.com (mail-lb0-f197.google.com [209.85.217.197]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 28DD02121F for ; Wed, 15 Apr 2015 16:08:57 +0000 (UTC) Received: by lbbrr5 with SMTP id rr5sf10651671lbb.3 for ; Wed, 15 Apr 2015 09:08:56 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:date :message-id:in-reply-to:references:cc:subject:precedence:list-id :list-unsubscribe:list-archive:list-post:list-help:list-subscribe :errors-to:sender:x-original-sender :x-original-authentication-results:mailing-list; bh=Qcf5KW+havjf/uXbBggwH8f8pSVYGoXZQNGgdUNK9TY=; b=W/ZTFbIB151f6DP1d6nzo1acvwKej9idypcIXSc+dBQihzcuNs/KhIinN9NjsUe+01 vNZl6KPs/iMDVmZyaTxtds/ecPNV52TSSpCRICwmkh4jfUGKfcmM/Z1G5vryWSN/+LN1 wn4j1aoAzYmv7tXmsmVSRv6GjcooMpC3mdnqcZ0xO/yBXRonzD6jtRwJBEz819KPtppq Rk8sGuS83X576naWHc3fXU+c2rNaNGkNiqTn2Wuq6IZzV4dTGNHN8HdeodaHLKwnJhde P2fRcj8jlpn3Dl4Dv9giCnkwWbiL9b+FbDvNi7EmQg3DqwYoM/thwIPBASYWfMxlkRoI SvUw== X-Gm-Message-State: ALoCoQlPUvRLBy9vWac8E6Sf0qy194kdQPgk95TWLsl94+1xTEwVf3safzPjb3xrDiaJsVyQ64S2 X-Received: by 10.112.130.71 with SMTP id oc7mr5463151lbb.23.1429114136165; Wed, 15 Apr 2015 09:08:56 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.7.72 with SMTP id h8ls221971laa.71.gmail; Wed, 15 Apr 2015 09:08:56 -0700 (PDT) X-Received: by 10.152.36.227 with SMTP id t3mr24929116laj.12.1429114136019; Wed, 15 Apr 2015 09:08:56 -0700 (PDT) Received: from mail-lb0-f175.google.com (mail-lb0-f175.google.com. [209.85.217.175]) by mx.google.com with ESMTPS id bd7si4234980lab.77.2015.04.15.09.08.56 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 15 Apr 2015 09:08:56 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.175 as permitted sender) client-ip=209.85.217.175; Received: by lbbqq2 with SMTP id qq2so37775332lbb.3 for ; Wed, 15 Apr 2015 09:08:55 -0700 (PDT) X-Received: by 10.152.163.35 with SMTP id yf3mr24544267lab.86.1429114135931; Wed, 15 Apr 2015 09:08:55 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.67.65 with SMTP id l1csp2609097lbt; Wed, 15 Apr 2015 09:08:55 -0700 (PDT) X-Received: by 10.55.31.218 with SMTP id n87mr51708595qkh.99.1429114134518; Wed, 15 Apr 2015 09:08:54 -0700 (PDT) Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id u96si5051394qgu.115.2015.04.15.09.08.53 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 15 Apr 2015 09:08:54 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Received: from localhost ([::1]:32985 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YiPrw-0002NU-Ke for patch@linaro.org; Wed, 15 Apr 2015 12:08:52 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52196) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YiPmU-0002O0-5G for qemu-devel@nongnu.org; Wed, 15 Apr 2015 12:03:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YiPmN-0001wN-Dc for qemu-devel@nongnu.org; Wed, 15 Apr 2015 12:03:14 -0400 Received: from mail-oi0-f51.google.com ([209.85.218.51]:36660) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YiPmN-0001wG-5l for qemu-devel@nongnu.org; Wed, 15 Apr 2015 12:03:07 -0400 Received: by oift201 with SMTP id t201so29231128oif.3 for ; Wed, 15 Apr 2015 09:03:06 -0700 (PDT) X-Received: by 10.202.104.234 with SMTP id o103mr16317824oik.19.1429113762945; Wed, 15 Apr 2015 09:02:42 -0700 (PDT) Received: from gbellows-linaro.gateway.pace.com (99-179-1-214.lightspeed.austtx.sbcglobal.net. [99.179.1.214]) by mx.google.com with ESMTPSA id x142sm2567707oie.19.2015.04.15.09.02.41 (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 15 Apr 2015 09:02:41 -0700 (PDT) From: Greg Bellows To: qemu-devel@nongnu.org, peter.maydell@linaro.org Date: Wed, 15 Apr 2015 11:02:13 -0500 Message-Id: <1429113742-8371-8-git-send-email-greg.bellows@linaro.org> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1429113742-8371-1-git-send-email-greg.bellows@linaro.org> References: <1429113742-8371-1-git-send-email-greg.bellows@linaro.org> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.218.51 Cc: Fabian Aggeler , Greg Bellows Subject: [Qemu-devel] [PATCH v3 07/16] hw/intc/arm_gic: Make ICDDCR/GICD_CTLR banked X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: greg.bellows@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.175 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 From: Fabian Aggeler ICDDCR/GICD_CTLR is banked in GICv1 implementations with Security Extensions or in GICv2 in independent from Security Extensions. This makes it possible to enable forwarding of interrupts from Distributor to the CPU interfaces for Group0 and Group1. EnableGroup0 (Bit [1]) in GICv1 is IMPDEF. Since this bit (Enable Non-secure) is present in the integrated IC of the Cortex-A9 MPCore, which implements the GICv1 profile, we support this bit in GICv1 too. Signed-off-by: Fabian Aggeler Signed-off-by: Greg Bellows --- v2 -> v3 - Added missing return in gic_dist_readb() - Fixed typos v1 -> v2 - Fix gic_dist_writeb() update of GICD_CTRL to only use bit[0] of the EnableGrp1 field not bit[1]. - Add clarifying comments --- hw/intc/arm_gic.c | 50 ++++++++++++++++++++++++++++++++++++---- hw/intc/arm_gic_common.c | 2 +- include/hw/intc/arm_gic_common.h | 7 +++++- 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c index aa4402e..b9dfde3 100644 --- a/hw/intc/arm_gic.c +++ b/hw/intc/arm_gic.c @@ -302,8 +302,26 @@ static uint32_t gic_dist_readb(void *opaque, hwaddr offset) cpu = gic_get_current_cpu(s); cm = 1 << cpu; if (offset < 0x100) { - if (offset == 0) - return s->enabled; + if (offset == 0) { /* GICD_CTLR */ + res = 0; + if ((s->revision == 2 && !s->security_extn) + || (s->security_extn && !ns_access())) { + /* In this case the GICD_CTLR contains both a group0 and group1 + * enable bit, so we create the resuling value by aggregating + * the bits from the two enable values. + * The group0 enable bit is only visible to secure accesses. + * The group1 enable bit (bit[1]) is an alias of bit[0] in + * the non-secure copy (enabled_grp[1]). + */ + res = (s->enabled_grp[1] << 1) | s->enabled_grp[0]; + } else if (s->security_extn && ns_access()) { + res = s->enabled_grp[1]; + } else { + /* Neither GICv2 nor Security Extensions present */ + res = s->enabled; + } + return res; + } if (offset == 4) /* Interrupt Controller Type Register */ return ((s->num_irq / 32) - 1) @@ -471,8 +489,32 @@ static void gic_dist_writeb(void *opaque, hwaddr offset, cpu = gic_get_current_cpu(s); if (offset < 0x100) { if (offset == 0) { - s->enabled = (value & 1); - DPRINTF("Distribution %sabled\n", s->enabled ? "En" : "Dis"); + if ((s->revision == 2 && !s->security_extn) + || (s->security_extn && !ns_access())) { + s->enabled_grp[0] = value & (1U << 0); /* EnableGrp0 */ + /* For a GICv1 with Security Extn "EnableGrp1" is IMPDEF. */ + /* We only use the first bit of the enabled_grp vars to + * indicate enabled or disabled. In this case we have to shift + * the incoming value down to the low bit because the group1 + * enabled bit is bit[1] in the secure/GICv2 GICD_CTLR. + */ + s->enabled_grp[1] = (value >> 1) & 0x1; /* EnableGrp1 */ + DPRINTF("Group0 distribution %sabled\n" + "Group1 distribution %sabled\n", + s->enabled_grp[0] ? "En" : "Dis", + s->enabled_grp[1] ? "En" : "Dis"); + } else if (s->security_extn && ns_access()) { + /* If we are non-secure only the group1 enable bit is visible + * as bit[0] in the GICD_CTLR. + */ + s->enabled_grp[1] = (value & 0x1); + DPRINTF("Group1 distribution %sabled\n", + s->enabled_grp[1] ? "En" : "Dis"); + } else { + /* Neither GICv2 nor Security Extensions present */ + s->enabled = (value & 0x1); + DPRINTF("Distribution %sabled\n", s->enabled ? "En" : "Dis"); + } } else if (offset < 4) { /* ignored. */ } else if (offset >= 0x80) { diff --git a/hw/intc/arm_gic_common.c b/hw/intc/arm_gic_common.c index 28f3b2a..c44050d 100644 --- a/hw/intc/arm_gic_common.c +++ b/hw/intc/arm_gic_common.c @@ -64,7 +64,7 @@ static const VMStateDescription vmstate_gic = { .pre_save = gic_pre_save, .post_load = gic_post_load, .fields = (VMStateField[]) { - VMSTATE_BOOL(enabled, GICState), + VMSTATE_UINT8_ARRAY(enabled_grp, GICState, GIC_NR_GROUP), VMSTATE_BOOL_ARRAY(cpu_enabled, GICState, GIC_NCPU), VMSTATE_STRUCT_ARRAY(irq_state, GICState, GIC_MAXIRQ, 1, vmstate_gic_irq_state, gic_irq_state), diff --git a/include/hw/intc/arm_gic_common.h b/include/hw/intc/arm_gic_common.h index b78981e..16e193d 100644 --- a/include/hw/intc/arm_gic_common.h +++ b/include/hw/intc/arm_gic_common.h @@ -30,6 +30,8 @@ #define GIC_NR_SGIS 16 /* Maximum number of possible CPU interfaces, determined by GIC architecture */ #define GIC_NCPU 8 +/* Number of Groups (Group0 [Secure], Group1 [Non-secure]) */ +#define GIC_NR_GROUP 2 #define MAX_NR_GROUP_PRIO 128 #define GIC_NR_APRS (MAX_NR_GROUP_PRIO / 32) @@ -52,7 +54,10 @@ typedef struct GICState { qemu_irq parent_irq[GIC_NCPU]; qemu_irq parent_fiq[GIC_NCPU]; - bool enabled; + union { + uint8_t enabled; + uint8_t enabled_grp[GIC_NR_GROUP]; /* EnableGrp0 and EnableGrp1 */ + }; bool cpu_enabled[GIC_NCPU]; gic_irq_state irq_state[GIC_MAXIRQ];