Received: by 10.192.165.148 with SMTP id m20csp3579389imm; Mon, 30 Apr 2018 02:46:02 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrwgWuuIECHzJ5fwvdKWVP46dUCuZEFDutVPQZX6XImfxE7diNlcb0cOa9GufeRH0F+/iPs X-Received: by 2002:a17:902:6b09:: with SMTP id o9-v6mr12091596plk.256.1525081562111; Mon, 30 Apr 2018 02:46:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525081562; cv=none; d=google.com; s=arc-20160816; b=FyymK2imH+62kkWYOlrhOAX3xoicCq8Ge8p8VmH85XCjW6G78aiOmIuW67i4VbXmNf ApxsCvd6bpwwXxyohQWfxv4T2tLmlc73u7rJtxL/KWczguicC1mGJAJwhVlpIwXgs2lE LRja9s7hID6Dt4SglPClzAovVtOu/cfszfx0Z2VwIHCADsJEpnAtlDHVMhDcBnDzh3qo uz4XBJgmn0l32NvGmYnAUuILkD36eESbW+X0nDSFQu5dAkOZHB59j2MV+SHCiVpeWLUi mrXijkG3tnrrYdVksl5ujCwNA7DtzWJ/N2aTyMHE5EPXURyQsJ2f8NQjT6iryoD0P2T9 z+BA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:arc-authentication-results; bh=PtgkxMpjDpk0fCNbWV1VzLnqWh5rTnCBx+dFsE7wbf4=; b=rtO3bjZgS5XAsEkRp7jD16yAfJtfr4ytAUWUpFx2ugdqxOS1/DnpNToyoviItPhgV+ berKrtyGm9mmjGD8UBw1onGwupxiVvTYtE2NtSLUusGmPDMagoikrsBWmKVbRVWlX0Ps 2V3pJD9L1kW69xTa7EKpm0o32fIfVk3QEO8gP+MR/qinQuZ8ayAX0V4t6q45ntTk9vEE eDLIFzYnawgDU4f1Cm3DZHUOZKVvpBTK3GnmPP4fwV3RtfsCS8Wl0inFZgaGRa8BsNPF x6o7g8A5na/zzmSweb5x+0s1LPXoe6drD4fahpbOAd8B/P+XW5EoB+dqqYjBdky6APbY Akdg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id bi12-v6si2689712plb.546.2018.04.30.02.45.48; Mon, 30 Apr 2018 02:46:02 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753645AbeD3Jos (ORCPT + 99 others); Mon, 30 Apr 2018 05:44:48 -0400 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:56992 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753258AbeD3Joq (ORCPT ); Mon, 30 Apr 2018 05:44:46 -0400 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 9C78015AB; Mon, 30 Apr 2018 02:44:45 -0700 (PDT) Received: from localhost (unknown [10.37.8.121]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3BD733F587; Mon, 30 Apr 2018 02:44:30 -0700 (PDT) Date: Mon, 30 Apr 2018 11:44:17 +0200 From: Christoffer Dall To: Eric Auger Cc: eric.auger.pro@gmail.com, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, marc.zyngier@arm.com, cdall@kernel.org, peter.maydell@linaro.org, andre.przywara@arm.com Subject: Re: [PATCH v5 11/12] KVM: arm/arm64: Implement KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION Message-ID: <20180430094417.GC12204@C02W217FHV2R.local> References: <1525079264-25533-1-git-send-email-eric.auger@redhat.com> <1525079264-25533-12-git-send-email-eric.auger@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1525079264-25533-12-git-send-email-eric.auger@redhat.com> User-Agent: Mutt/1.9.4 (2018-02-28) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Apr 30, 2018 at 11:07:43AM +0200, Eric Auger wrote: > Now all the internals are ready to handle multiple redistributor > regions, let's allow the userspace to register them. > > Signed-off-by: Eric Auger Reviewed-by: Christoffer Dall > > --- > v4 -> v5: > - s/uint_t/u > - fix KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION read > - fix read path > - return -ENOENT instead of -ENODEV when reading the > attributes of a region that does not exist > > v3 -> v4: > - vgic_v3_rdist_region_from_index is introduced in this patch > > v2 -> v3: > - early exit if vgic_v3_rdist_region_from_index() fails > --- > virt/kvm/arm/vgic/vgic-kvm-device.c | 40 ++++++++++++++++++++++++++++++++++++- > virt/kvm/arm/vgic/vgic-mmio-v3.c | 4 ++-- > virt/kvm/arm/vgic/vgic-v3.c | 14 +++++++++++++ > virt/kvm/arm/vgic/vgic.h | 13 +++++++++++- > 4 files changed, 67 insertions(+), 4 deletions(-) > > diff --git a/virt/kvm/arm/vgic/vgic-kvm-device.c b/virt/kvm/arm/vgic/vgic-kvm-device.c > index 76ab369..6ada243 100644 > --- a/virt/kvm/arm/vgic/vgic-kvm-device.c > +++ b/virt/kvm/arm/vgic/vgic-kvm-device.c > @@ -92,7 +92,7 @@ int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write) > if (r) > break; > if (write) { > - r = vgic_v3_set_redist_base(kvm, *addr); > + r = vgic_v3_set_redist_base(kvm, 0, *addr, 0); > goto out; > } > rdreg = list_first_entry(&vgic->rd_regions, > @@ -103,6 +103,43 @@ int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write) > addr_ptr = &rdreg->base; > break; > } > + case KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION: > + { > + struct vgic_redist_region *rdreg; > + u8 index; > + > + r = vgic_check_type(kvm, KVM_DEV_TYPE_ARM_VGIC_V3); > + if (r) > + break; > + > + index = *addr & KVM_VGIC_V3_RDIST_INDEX_MASK; > + > + if (write) { > + gpa_t base = *addr & KVM_VGIC_V3_RDIST_BASE_MASK; > + u32 count = (*addr & KVM_VGIC_V3_RDIST_COUNT_MASK) > + >> KVM_VGIC_V3_RDIST_COUNT_SHIFT; > + u8 flags = (*addr & KVM_VGIC_V3_RDIST_FLAGS_MASK) > + >> KVM_VGIC_V3_RDIST_FLAGS_SHIFT; > + > + if (!count || flags) > + r = -EINVAL; > + else > + r = vgic_v3_set_redist_base(kvm, index, > + base, count); > + goto out; > + } > + > + rdreg = vgic_v3_rdist_region_from_index(kvm, index); > + if (!rdreg) { > + r = -ENOENT; > + goto out; > + } > + > + *addr = index; > + *addr |= rdreg->base; > + *addr |= (u64)rdreg->count << KVM_VGIC_V3_RDIST_COUNT_SHIFT; > + goto out; > + } > default: > r = -ENODEV; > } > @@ -674,6 +711,7 @@ static int vgic_v3_has_attr(struct kvm_device *dev, > switch (attr->attr) { > case KVM_VGIC_V3_ADDR_TYPE_DIST: > case KVM_VGIC_V3_ADDR_TYPE_REDIST: > + case KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION: > return 0; > } > break; > diff --git a/virt/kvm/arm/vgic/vgic-mmio-v3.c b/virt/kvm/arm/vgic/vgic-mmio-v3.c > index 1b1e07f..fcebd42 100644 > --- a/virt/kvm/arm/vgic/vgic-mmio-v3.c > +++ b/virt/kvm/arm/vgic/vgic-mmio-v3.c > @@ -764,11 +764,11 @@ static int vgic_v3_insert_redist_region(struct kvm *kvm, uint32_t index, > return ret; > } > > -int vgic_v3_set_redist_base(struct kvm *kvm, u64 addr) > +int vgic_v3_set_redist_base(struct kvm *kvm, u32 index, u64 addr, u32 count) > { > int ret; > > - ret = vgic_v3_insert_redist_region(kvm, 0, addr, 0); > + ret = vgic_v3_insert_redist_region(kvm, index, addr, count); > if (ret) > return ret; > > diff --git a/virt/kvm/arm/vgic/vgic-v3.c b/virt/kvm/arm/vgic/vgic-v3.c > index 5563671..70d5ba1 100644 > --- a/virt/kvm/arm/vgic/vgic-v3.c > +++ b/virt/kvm/arm/vgic/vgic-v3.c > @@ -482,6 +482,20 @@ struct vgic_redist_region *vgic_v3_rdist_free_slot(struct list_head *rd_regions) > return NULL; > } > > +struct vgic_redist_region *vgic_v3_rdist_region_from_index(struct kvm *kvm, > + u32 index) > +{ > + struct list_head *rd_regions = &kvm->arch.vgic.rd_regions; > + struct vgic_redist_region *rdreg; > + > + list_for_each_entry(rdreg, rd_regions, list) { > + if (rdreg->index == index) > + return rdreg; > + } > + return NULL; > +} > + > + > int vgic_v3_map_resources(struct kvm *kvm) > { > struct vgic_dist *dist = &kvm->arch.vgic; > diff --git a/virt/kvm/arm/vgic/vgic.h b/virt/kvm/arm/vgic/vgic.h > index 6af7d8a..375aa66 100644 > --- a/virt/kvm/arm/vgic/vgic.h > +++ b/virt/kvm/arm/vgic/vgic.h > @@ -96,6 +96,13 @@ > /* we only support 64 kB translation table page size */ > #define KVM_ITS_L1E_ADDR_MASK GENMASK_ULL(51, 16) > > +#define KVM_VGIC_V3_RDIST_INDEX_MASK GENMASK_ULL(11, 0) > +#define KVM_VGIC_V3_RDIST_FLAGS_MASK GENMASK_ULL(15, 12) > +#define KVM_VGIC_V3_RDIST_FLAGS_SHIFT 12 > +#define KVM_VGIC_V3_RDIST_BASE_MASK GENMASK_ULL(51, 16) > +#define KVM_VGIC_V3_RDIST_COUNT_MASK GENMASK_ULL(63, 52) > +#define KVM_VGIC_V3_RDIST_COUNT_SHIFT 52 > + > /* Requires the irq_lock to be held by the caller. */ > static inline bool irq_is_pending(struct vgic_irq *irq) > { > @@ -201,7 +208,7 @@ int vgic_v3_probe(const struct gic_kvm_info *info); > int vgic_v3_map_resources(struct kvm *kvm); > int vgic_v3_lpi_sync_pending_status(struct kvm *kvm, struct vgic_irq *irq); > int vgic_v3_save_pending_tables(struct kvm *kvm); > -int vgic_v3_set_redist_base(struct kvm *kvm, u64 addr); > +int vgic_v3_set_redist_base(struct kvm *kvm, u32 index, u64 addr, u32 count); > int vgic_register_redist_iodev(struct kvm_vcpu *vcpu); > bool vgic_v3_check_base(struct kvm *kvm); > > @@ -270,6 +277,10 @@ vgic_v3_rd_region_size(struct kvm *kvm, struct vgic_redist_region *rdreg) > else > return rdreg->count * KVM_VGIC_V3_REDIST_SIZE; > } > + > +struct vgic_redist_region *vgic_v3_rdist_region_from_index(struct kvm *kvm, > + u32 index); > + > bool vgic_v3_rdist_overlap(struct kvm *kvm, gpa_t base, size_t size); > > static inline bool vgic_dist_overlap(struct kvm *kvm, gpa_t base, size_t size) > -- > 2.5.5 > > _______________________________________________ > kvmarm mailing list > kvmarm@lists.cs.columbia.edu > https://lists.cs.columbia.edu/mailman/listinfo/kvmarm