From patchwork Mon Dec 5 21:46:42 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Auger X-Patchwork-Id: 9461625 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 0C0D86022E for ; Mon, 5 Dec 2016 21:53:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0242428178 for ; Mon, 5 Dec 2016 21:53:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EAC262817F; Mon, 5 Dec 2016 21:53:18 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 9DABC28178 for ; Mon, 5 Dec 2016 21:53:18 +0000 (UTC) Received: from localhost ([::1]:44542 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cE1CH-0002RQ-HV for patchwork-qemu-devel@patchwork.kernel.org; Mon, 05 Dec 2016 16:53:17 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35379) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cE175-0006wZ-6i for qemu-devel@nongnu.org; Mon, 05 Dec 2016 16:47:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cE170-0002L9-8z for qemu-devel@nongnu.org; Mon, 05 Dec 2016 16:47:55 -0500 Received: from mx1.redhat.com ([209.132.183.28]:33432) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cE16w-0002Jk-5Z; Mon, 05 Dec 2016 16:47:46 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3F023C05AA41; Mon, 5 Dec 2016 21:47:45 +0000 (UTC) Received: from localhost.localdomain.com (vpn1-4-120.ams2.redhat.com [10.36.4.120]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id uB5LksKf019596; Mon, 5 Dec 2016 16:47:41 -0500 From: Eric Auger To: eric.auger.pro@gmail.com, eric.auger@redhat.com, kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, qemu-devel@nongnu.org, qemu-arm@nongnu.org, drjones@redhat.com, marc.zyngier@arm.com, christoffer.dall@linaro.org Date: Mon, 5 Dec 2016 22:46:42 +0100 Message-Id: <1480974406-29345-12-git-send-email-eric.auger@redhat.com> In-Reply-To: <1480974406-29345-1-git-send-email-eric.auger@redhat.com> References: <1480974406-29345-1-git-send-email-eric.auger@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 05 Dec 2016 21:47:45 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [kvm-unit-tests RFC 11/15] arm/arm64: ITS: create device X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: andre.przywara@arm.com, pbonzini@redhat.com, alex.bennee@linaro.org, peter.maydell@linaro.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Introduce an helper function that registers a new device candidate to send MSIs on the ITS. The device is characterized by its device id, the number of event ids. This dimensions the associated interrupt translation table (ITT), allocated by this function. Signed-off-by: Eric Auger --- lib/arm/asm/gic-v3-its.h | 11 +++++++++++ lib/arm/gic-v3-its.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/lib/arm/asm/gic-v3-its.h b/lib/arm/asm/gic-v3-its.h index b73736c..31589d6 100644 --- a/lib/arm/asm/gic-v3-its.h +++ b/lib/arm/asm/gic-v3-its.h @@ -124,6 +124,8 @@ #define ITS_FLAGS_CMDQ_NEEDS_FLUSHING (1ULL << 0) +#define GITS_MAX_DEVICES 8 + struct its_baser { unsigned int index; int type; @@ -154,6 +156,12 @@ struct its_typer { bool virt_lpi; }; +struct its_device { + u32 device_id; + u32 nr_ites; + void *itt; +}; + struct its_collection { u64 target_address; u16 col_id; @@ -164,9 +172,11 @@ struct its_data { struct its_cmd_block *cmd_base; struct its_cmd_block *cmd_write; struct its_cmd_block *cmd_readr; + struct its_device devices[GITS_MAX_DEVICES]; struct its_baser baser[GITS_BASER_NR_REGS]; struct its_typer typer; struct its_collection *collections; + u32 nb_devices; u64 flags; }; @@ -179,6 +189,7 @@ extern int its_parse_baser(int i, struct its_baser *baser); extern void its_setup_baser(int i, struct its_baser *baser); extern void enable_lpi(u32 redist); extern void its_enable_defaults(void); +extern struct its_device *its_create_device(u32 dev_id, int nvecs); #endif /* !__ASSEMBLY__ */ diff --git a/lib/arm/gic-v3-its.c b/lib/arm/gic-v3-its.c index ecb8f98..c230959 100644 --- a/lib/arm/gic-v3-its.c +++ b/lib/arm/gic-v3-its.c @@ -80,6 +80,19 @@ int its_parse_baser(int i, struct its_baser *baser) return 0; } +static struct its_baser *its_lookup_baser(int type) +{ + int i; + + for (i = 0; i < GITS_BASER_NR_REGS; i++) { + struct its_baser *baser = &its_data.baser[i]; + + if (baser->type == type) + return baser; + } + return NULL; +} + void its_setup_baser(int i, struct its_baser *baser) { void *reg_addr = gicv3_its_base() + GITS_BASER + i * 8; @@ -258,3 +271,18 @@ void its_enable_defaults(void) writel(GITS_CTLR_ENABLE, its_data.base + GITS_CTLR); } + +struct its_device *its_create_device(u32 device_id, int nvecs) +{ + struct its_device *new = &its_data.devices[its_data.nb_devices]; + struct its_baser *baser = its_lookup_baser(GITS_BASER_TYPE_DEVICE); + + if (!baser) + return NULL; + + new->device_id = device_id; + new->nr_ites = nvecs; + new->itt = (void *)phys_zalloc(new->nr_ites * baser->esz); + its_data.nb_devices++; + return new; +}