From patchwork Fri Feb 9 14:39:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 127839 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp679820ljc; Fri, 9 Feb 2018 06:42:10 -0800 (PST) X-Google-Smtp-Source: AH8x225KtMQ5k9RJiwFJqu2vRbNBa6FyqwyDF0xBbOd+m8ufheej/0rvuF1kVcz3JW+WRHjqGyLH X-Received: by 10.107.130.25 with SMTP id e25mr3572911iod.245.1518187330743; Fri, 09 Feb 2018 06:42:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518187330; cv=none; d=google.com; s=arc-20160816; b=FIexsSydWzvHRa5q35uU9v8TKTKPOP6BjYrH7AWAdbVCjeqpsarSgjOBr+qahMmarS tHWvpVrvuKuuSmXbBxa5X9kYdotBk4SsIgK84j4bexyqcg0aI/T+oJIJNGU4dsTlVVHQ eNDD0mAKjgLpdJ4oO5eWVWVOq9t3vcFHalDLFarJeAfM+L7PNMuyTteh67pxZHWaphnK AilpF/VP+TzjFlGuY/deKWBqhX7CxSJDxVX/yvSnDcWPZkmb7Yaw0dH/Pvz8dw4jWUAV dVcOeKIslQNgH6hABbkKbotXGWs4R8Ec0n/EZUxPZU1c2qVD3wGOVlQypDV3DqxkJfZB zOSA== 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:references:in-reply-to:message-id:date:to:from :dkim-signature:arc-authentication-results; bh=aCAHGnmWL7wB07D1my9WOrLsAFCuG5lS07JUrm7XTbA=; b=0+gyaMnoCYYHazMzTQ7FmOGIafsju/euunCLbD1j7aTVYMsy3rKckkSAYv1Jw+WA24 aaMBsXrZf3r/RMTTnDkf7j7jUO6ERW71fHlPmo0gC7CbJ8IL6wJX/kDMaCmqIZp0TclD 3LHhTlqtCmMkCgAPHTypDVUznwEiCHuaNOH8BALPG6GSHOhlt6DzGF7JlmdQtszLNyzC DOcNxP3w89wPbU5o3hPmmzObJuZqrI8qUssWP7OvKHGzgupY2MUEi4hyXZMXIWR6R5AJ r3kcATHGYpPMzGaER+39p/tACedWmmnqiexXbrp6svxp2c281fhabpY7Lsf4QVXH2X27 G4OQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=d9KSHqk0; 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 n132si1573857ita.144.2018.02.09.06.42.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 09 Feb 2018 06:42:10 -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=d9KSHqk0; 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 1ek9qU-0000c0-2x; Fri, 09 Feb 2018 14:40:10 +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 1ek9qT-0000Yy-0G for xen-devel@lists.xenproject.org; Fri, 09 Feb 2018 14:40:09 +0000 X-Inumbo-ID: 0e3cfeb2-0da7-11e8-ba59-bc764e045a96 Received: from mail-wr0-x241.google.com (unknown [2a00:1450:400c:c0c::241]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 0e3cfeb2-0da7-11e8-ba59-bc764e045a96; Fri, 09 Feb 2018 15:39:39 +0100 (CET) Received: by mail-wr0-x241.google.com with SMTP id b52so8443679wrd.10 for ; Fri, 09 Feb 2018 06:40:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references; bh=pxT8YLwA5eXKn+IXcpkUnpO2wLpxyvvSxAu5r0fBGkY=; b=d9KSHqk01q17tI52VfOdaRnIqgimwDkrmoTgCtwmCbxlI8Ey0sdSpKFbeKlufZTILf yKAjn+9+IDkEZTOT5nDpFxrufyJuTO1X6ATsQymY278l2ghHNnZfeRhpM3ghJY4tI7SE UMthWlBTJT/C+BPMhxPUA9AqoI7QaAtgQ0JHg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=pxT8YLwA5eXKn+IXcpkUnpO2wLpxyvvSxAu5r0fBGkY=; b=fzxMoGir+2H+ELOlaLZohSHhH/OzGQEzIzYQv6lTRXaK2wCG1aPm7KMaOiGcnPoQqi tNtrhOsrBgDz1bevTx3MJ+B60zVaeIEowGBKh7sDM9UWku/qtONS+GvdRCElp1UIy5bU KNPoX6bom0+IqfXs7lULhgdqzJmGZCwMV6Q6kA8GujnzswxBH6FIfdu6UcaWfZZFOmqd 1d7BKyhpYqKRauCFWowE2xu9uUi5tuTQzXKiFSes1wyYnwHywl3Kj6j1qQkqlPoP8v4x VB0pgjf/0LJctZ9iv/Rsu1RMcq8vCs+Y78UZWThKVX6KjUIpv3p++yOH8w84nsu8YYHC qX1Q== X-Gm-Message-State: APf1xPDeIlPu6613gxPLlVdP437LAp0DOUisX07ZaOltY6GcfpGXgDUg GAJN8E7rkTCDmsUlvBthlT+I4D6E1cU= X-Received: by 10.223.166.133 with SMTP id t5mr2674619wrc.106.1518187206131; Fri, 09 Feb 2018 06:40:06 -0800 (PST) Received: from e104803-lin.lan (mail.andrep.de. [217.160.17.100]) by smtp.gmail.com with ESMTPSA id b35sm2552229wra.13.2018.02.09.06.40.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 09 Feb 2018 06:40:05 -0800 (PST) From: Andre Przywara To: Stefano Stabellini , Julien Grall , xen-devel@lists.xenproject.org Date: Fri, 9 Feb 2018 14:39:08 +0000 Message-Id: <20180209143937.28866-21-andre.przywara@linaro.org> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180209143937.28866-1-andre.przywara@linaro.org> References: <20180209143937.28866-1-andre.przywara@linaro.org> Subject: [Xen-devel] [RFC PATCH 20/49] ARM: new VGIC: Add data structure definitions 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" Add a new header file for the new and improved GIC implementation. The big change is that we now have a struct vgic_irq per IRQ instead of spreading all the information over various bitmaps in the ranks. We include this new header conditionally from within the old header file for the time being to avoid touching all the users. This is based on Linux commit b18b57787f5e, written by Christoffer Dall. Signed-off-by: Andre Przywara --- xen/include/asm-arm/arm_vgic.h | 269 +++++++++++++++++++++++++++++++++++++++++ xen/include/asm-arm/domain.h | 4 + xen/include/asm-arm/vgic.h | 6 + 3 files changed, 279 insertions(+) create mode 100644 xen/include/asm-arm/arm_vgic.h diff --git a/xen/include/asm-arm/arm_vgic.h b/xen/include/asm-arm/arm_vgic.h new file mode 100644 index 0000000000..865e9ee5bc --- /dev/null +++ b/xen/include/asm-arm/arm_vgic.h @@ -0,0 +1,269 @@ +/* + * Copyright (C) 2015, 2016 ARM Ltd. + * + * 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 __KVM_ARM_VGIC_H +#define __KVM_ARM_VGIC_H + +#include +#include +#include +#include + +#define VGIC_V3_MAX_CPUS 255 +#define VGIC_V2_MAX_CPUS 8 +#define VGIC_NR_IRQS_LEGACY 256 +#define VGIC_NR_SGIS 16 +#define VGIC_NR_PPIS 16 +#define VGIC_NR_PRIVATE_IRQS (VGIC_NR_SGIS + VGIC_NR_PPIS) +#define VGIC_MAX_PRIVATE (VGIC_NR_PRIVATE_IRQS - 1) +#define VGIC_MAX_SPI 1019 +#define VGIC_MAX_RESERVED 1023 +#define VGIC_MIN_LPI 8192 + +#define irq_is_ppi(irq) ((irq) >= VGIC_NR_SGIS && (irq) < VGIC_NR_PRIVATE_IRQS) +#define irq_is_spi(irq) ((irq) >= VGIC_NR_PRIVATE_IRQS && \ + (irq) <= VGIC_MAX_SPI) + +enum vgic_type { + VGIC_V2, /* Good ol' GICv2 */ + VGIC_V3, /* New fancy GICv3 */ +}; + +#define VGIC_V2_MAX_LRS (1 << 6) +#define VGIC_V3_MAX_LRS 16 +#define VGIC_V3_LR_INDEX(lr) (VGIC_V3_MAX_LRS - 1 - lr) + +enum vgic_irq_config { + VGIC_CONFIG_EDGE = 0, + VGIC_CONFIG_LEVEL +}; + +struct vgic_irq { + spinlock_t irq_lock; /* Protects the content of the struct */ + struct list_head lpi_list; /* Used to link all LPIs together */ + struct list_head ap_list; + + struct vcpu *vcpu; /* + * SGIs and PPIs: The VCPU + * SPIs and LPIs: The VCPU whose ap_list + * this is queued on. + */ + + struct vcpu *target_vcpu; /* + * The VCPU that this interrupt should + * be sent to, as a result of the + * targets reg (v2) or the affinity reg (v3). + */ + + u32 intid; /* Guest visible INTID */ + bool line_level; /* Level only */ + bool pending_latch; /* + * The pending latch state used to + * calculate the pending state for both + * level and edge triggered IRQs. + */ + bool active; /* not used for LPIs */ + bool enabled; + bool hw; /* Tied to HW IRQ */ + atomic_t refcount; /* Used for LPIs */ + u32 hwintid; /* HW INTID number */ + union + { + u8 targets; /* GICv2 target VCPUs mask */ + u32 mpidr; /* GICv3 target VCPU */ + }; + u8 source; /* GICv2 SGIs only */ + u8 priority; + enum vgic_irq_config config; /* Level or edge */ +}; + +struct vgic_register_region; +struct vgic_its; + +enum iodev_type { + IODEV_CPUIF, + IODEV_DIST, + IODEV_REDIST, + IODEV_ITS +}; + +struct vgic_io_device { + paddr_t base_addr; + union + { + struct vcpu *redist_vcpu; + struct vgic_its *its; + }; + const struct vgic_register_region *regions; + enum iodev_type iodev_type; + int nr_regions; +}; + +struct vgic_its { + /* The base address of the ITS control register frame */ + paddr_t vgic_its_base; + + bool enabled; + struct vgic_io_device iodev; + + /* These registers correspond to GITS_BASER{0,1} */ + u64 baser_device_table; + u64 baser_coll_table; + + /* Protects the command queue */ + spinlock_t cmd_lock; + u64 cbaser; + u32 creadr; + u32 cwriter; + + /* migration ABI revision in use */ + u32 abi_rev; + + /* Protects the device and collection lists */ + spinlock_t its_lock; + struct list_head device_list; + struct list_head collection_list; +}; + +struct vgic_dist { + bool ready; + bool initialized; + + /* vGIC model the kernel emulates for the guest (GICv2 or GICv3) */ + u32 version; + + /* Do injected MSIs require an additional device ID? */ + bool msis_require_devid; + + int nr_spis; + + /* base addresses in guest physical address space: */ + paddr_t vgic_dist_base; /* distributor */ + union + { + /* either a GICv2 CPU interface */ + paddr_t vgic_cpu_base; + /* or a number of GICv3 redistributor regions */ + struct + { + paddr_t vgic_redist_base; + paddr_t vgic_redist_free_offset; + }; + }; + + /* distributor enabled */ + bool enabled; + + struct vgic_irq *spis; + unsigned long *allocated_irqs; /* bitmap of IRQs allocated */ + + struct vgic_io_device dist_iodev; + + bool has_its; + + /* + * Contains the attributes and gpa of the LPI configuration table. + * Since we report GICR_TYPER.CommonLPIAff as 0b00, we can share + * one address across all redistributors. + * GICv3 spec: 6.1.2 "LPI Configuration tables" + */ + u64 propbaser; + + /* Protects the lpi_list and the count value below. */ + spinlock_t lpi_list_lock; + struct list_head lpi_list_head; + int lpi_list_count; +}; + +struct vgic_v2_cpu_if { + u32 vgic_hcr; + u32 vgic_vmcr; + u64 vgic_elrsr; /* Saved only */ + u32 vgic_apr; + u32 vgic_lr[VGIC_V2_MAX_LRS]; +}; + +struct vgic_v3_cpu_if { + u32 vgic_hcr; + u32 vgic_vmcr; + u32 vgic_sre; /* Restored only, change ignored */ + u32 vgic_elrsr; /* Saved only */ + u32 vgic_ap0r[4]; + u32 vgic_ap1r[4]; + u64 vgic_lr[VGIC_V3_MAX_LRS]; +}; + +struct vgic_cpu { + /* CPU vif control registers for world switch */ + union + { + struct vgic_v2_cpu_if vgic_v2; + struct vgic_v3_cpu_if vgic_v3; + }; + + unsigned int used_lrs; + struct vgic_irq private_irqs[VGIC_NR_PRIVATE_IRQS]; + + spinlock_t ap_list_lock; /* Protects the ap_list */ + + /* + * List of IRQs that this VCPU should consider because they are either + * Active or Pending (hence the name; AP list), or because they recently + * were one of the two and need to be migrated off this list to another + * VCPU. + */ + struct list_head ap_list_head; + + /* + * Members below are used with GICv3 emulation only and represent + * parts of the redistributor. + */ + struct vgic_io_device rd_iodev; + struct vgic_io_device sgi_iodev; + + /* Contains the attributes and gpa of the LPI pending tables. */ + u64 pendbaser; + + bool lpis_enabled; + + /* Cache guest priority bits */ + u32 num_pri_bits; + + /* Cache guest interrupt ID bits */ + u32 num_id_bits; +}; + +extern struct static_key_false vgic_v2_cpuif_trap; +extern struct static_key_false vgic_v3_cpuif_trap; + +#define vgic_initialized(k) ((k)->arch.vgic.initialized) +#define vgic_ready(k) ((k)->arch.vgic.ready) +#define vgic_valid_spi(k, i) (((i) >= VGIC_NR_PRIVATE_IRQS) && \ + ((i) < (k)->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS)) + +bool vgic_emulate(struct cpu_user_regs *regs, union hsr hsr); +bool vgic_v3_emulate(struct cpu_user_regs *regs, union hsr hsr); + +void vgic_clear_pending_irqs(struct vcpu *v); + +void vgic_v2_setup_hw(paddr_t dbase, paddr_t cbase, paddr_t csize, + paddr_t vbase, void __iomem *hbase, + uint32_t aliased_offset); +struct rdist_region; +void vgic_v3_setup_hw(paddr_t dbase, unsigned int nr_rdist_regions, + const struct rdist_region *regions, + unsigned int intid_bits); + +#endif /* __KVM_ARM_VGIC_H */ diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index 968ffb0c81..e8f2917140 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -198,7 +198,11 @@ struct arch_vcpu union gic_state_data gic; uint64_t lr_mask; +#ifdef CONFIG_NEW_VGIC + struct vgic_cpu vgic_cpu; +#else struct vgic_cpu vgic; +#endif /* Timer registers */ uint32_t cntkctl; diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h index 85ad2aca79..96b99f5c85 100644 --- a/xen/include/asm-arm/vgic.h +++ b/xen/include/asm-arm/vgic.h @@ -18,6 +18,10 @@ #ifndef __ASM_ARM_VGIC_H__ #define __ASM_ARM_VGIC_H__ +#ifdef CONFIG_NEW_VGIC +#include +#else + #include #include #include @@ -313,6 +317,8 @@ void vgic_v3_setup_hw(paddr_t dbase, unsigned int intid_bits); #endif +#endif /* !CONFIG_NEW_VGIC */ + /*** Common VGIC functions used by Xen arch code ****/ /*