From: Julien Grall <julien.grall@arm.com>
To: Andre Przywara <andre.przywara@linaro.org>,
Stefano Stabellini <sstabellini@kernel.org>
Cc: xen-devel@lists.xenproject.org
Subject: Re: [PATCH 53/57] ARM: new VGIC: vgic-init: implement vgic_init
Date: Fri, 9 Mar 2018 18:24:11 +0000 [thread overview]
Message-ID: <46959edd-58d7-8f1f-c488-8e48e83fd363@arm.com> (raw)
In-Reply-To: <20180305160415.16760-54-andre.przywara@linaro.org>
Hi Andre,
On 05/03/18 16:04, Andre Przywara wrote:
> This patch allocates and initializes the data structures used to model
> the vgic distributor and virtual cpu interfaces. At that stage the
> number of IRQs and number of virtual CPUs is frozen.
> Implement the various functions that the Xen arch code is expecting to
> call during domain and VCPU setup to initialize the VGIC.
> Their prototypes are already in existing header files.
>
> This is based on Linux commit ad275b8bb1e6, written by Eric Auger.
>
> Signed-off-by: Andre Przywara <andre.przywara@linaro.org>
> ---
> Changelog RFC ... v1:
> - adapt to former changes
> - add missing comment line
> - extend commit message
>
> xen/arch/arm/vgic/vgic-init.c | 196 ++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 196 insertions(+)
>
> diff --git a/xen/arch/arm/vgic/vgic-init.c b/xen/arch/arm/vgic/vgic-init.c
> index d091c92ed0..8bc83f677b 100644
> --- a/xen/arch/arm/vgic/vgic-init.c
> +++ b/xen/arch/arm/vgic/vgic-init.c
> @@ -20,6 +20,77 @@
>
> #include "vgic.h"
>
> +/*
> + * Initialization rules: there are multiple stages to the vgic
> + * initialization, both for the distributor and the CPU interfaces. The basic
> + * idea is that even though the VGIC is not functional or not requested from
> + * user space, the critical path of the run loop can still call VGIC functions
> + * that just won't do anything, without them having to check additional
> + * initialization flags to ensure they don't look at uninitialized data
> + * structures.
> + *
> + * Distributor:
> + *
> + * - vgic_early_init(): initialization of static data that doesn't
> + * depend on any sizing information or emulation type. No allocation
> + * is allowed there.
> + *
> + * - vgic_init(): allocation and initialization of the generic data
> + * structures that depend on sizing information (number of CPUs,
> + * number of interrupts). Also initializes the vcpu specific data
> + * structures. Can be executed lazily for GICv2.
> + *
> + * CPU Interface:
> + *
> + * - kvm_vgic_vcpu_early_init(): initialization of static data that
> + * doesn't depend on any sizing information or emulation type. No
> + * allocation is allowed there.
> + */
> +
> +/**
> + * vgic_vcpu_early_init() - Initialize static VGIC VCPU data structures
> + * @vcpu: The VCPU whose VGIC data structures whould be initialized
> + *
> + * Only do initialization, but do not actually enable the VGIC CPU interface
> + * yet.
> + */
> +static void vgic_vcpu_early_init(struct vcpu *vcpu)
> +{
> + struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic;
> + int i;
unsigned please.
> +
> + INIT_LIST_HEAD(&vgic_cpu->ap_list_head);
> + spin_lock_init(&vgic_cpu->ap_list_lock);
Do we need something similar to 23b40df6f098e3bcb2f105a4909860240976e40f
"xen/arm: vgic: Make sure the number of SPIs is a multiple of 32"?
> +
> + /*
> + * Enable and configure all SGIs to be edge-triggered and
> + * configure all PPIs as level-triggered.
> + */
> + for ( i = 0; i < VGIC_NR_PRIVATE_IRQS; i++ )
> + {
> + struct vgic_irq *irq = &vgic_cpu->private_irqs[i];
> +
> + INIT_LIST_HEAD(&irq->ap_list);
> + spin_lock_init(&irq->irq_lock);
> + irq->intid = i;
> + irq->vcpu = NULL;
> + irq->target_vcpu = vcpu;
> + irq->targets = 1U << vcpu->vcpu_id;
> + atomic_set(&irq->refcount, 0);
> + if ( vgic_irq_is_sgi(i) )
> + {
> + /* SGIs */
> + irq->enabled = 1;
> + irq->config = VGIC_CONFIG_EDGE;
> + }
> + else
> + {
> + /* PPIs */
> + irq->config = VGIC_CONFIG_LEVEL;
> + }
> + }
> +}
> +
> /* CREATION */
>
> /**
> @@ -50,6 +121,131 @@ int domain_vgic_register(struct domain *d, int *mmio_count)
> return 0;
> }
>
> +/* INIT/DESTROY */
> +
> +/**
> + * domain_vgic_init: initialize the dist data structures
> + * @d: domain pointer
> + * @nr_spis: number of SPIs
> + */
> +int domain_vgic_init(struct domain *d, unsigned int nr_spis)
> +{
> + struct vgic_dist *dist = &d->arch.vgic;
> + int i, ret;
Ditto for i.
> +
> + /* Limit the number of virtual SPIs supported to (1020 - 32) = 988 */
> + if ( nr_spis > (1020 - NR_LOCAL_IRQS) )
> + return -EINVAL;
> +
> + dist->nr_spis = nr_spis;
> + dist->spis = xzalloc_array(struct vgic_irq, nr_spis);
> + if ( !dist->spis )
> + return -ENOMEM;
> +
> + /*
> + * In the following code we do not take the irq struct lock since
> + * no other action on irq structs can happen while the VGIC is
> + * not initialized yet:
> + * If someone wants to inject an interrupt or does a MMIO access, we
> + * require prior initialization in case of a virtual GICv3 or trigger
> + * initialization when using a virtual GICv2.
> + */
> + for ( i = 0; i < nr_spis; i++ )
> + {
> + struct vgic_irq *irq = &dist->spis[i];
> +
> + irq->intid = i + VGIC_NR_PRIVATE_IRQS;
> + INIT_LIST_HEAD(&irq->ap_list);
> + spin_lock_init(&irq->irq_lock);
> + irq->vcpu = NULL;
> + irq->target_vcpu = NULL;
> + atomic_set(&irq->refcount, 0);
> + if ( dist->version == GIC_V2 )
> + irq->targets = 0;
> + else
> + irq->mpidr = 0;
> + }
> +
> + INIT_LIST_HEAD(&dist->lpi_list_head);
> + spin_lock_init(&dist->lpi_list_lock);
> +
> + if ( dist->version == GIC_V2 )
> + ret = vgic_v2_map_resources(d);
> + else
> + ret = -ENXIO;
> +
> + if ( ret )
> + return ret;
> +
> + /* allocated_irqs() is used by Xen to find available vIRQs */
> + d->arch.vgic.allocated_irqs =
> + xzalloc_array(unsigned long, BITS_TO_LONGS(vgic_num_irqs(d)));
> + if ( !d->arch.vgic.allocated_irqs )
> + return -ENOMEM;
> +
> + /* vIRQ0-15 (SGIs) are reserved */
> + for ( i = 0; i < NR_GIC_SGI; i++ )
> + set_bit(i, d->arch.vgic.allocated_irqs);
> +
> + return 0;
> +}
> +
> +/**
> + * vcpu_vgic_init() - Register VCPU-specific KVM iodevs
> + * was: kvm_vgic_vcpu_init()
> + * Xen: adding vgic_vx_enable() call
> + * @vcpu: pointer to the VCPU being created and initialized
> + */
> +int vcpu_vgic_init(struct vcpu *vcpu)
> +{
> + int ret = 0;
> +
> + vgic_vcpu_early_init(vcpu);
> +
> + if ( gic_hw_version() == GIC_V2 )
> + vgic_v2_enable(vcpu);
> + else
> + ret = -ENXIO;
> +
> + return ret;
> +}
> +
> +void domain_vgic_free(struct domain *d)
> +{
> + struct vgic_dist *dist = &d->arch.vgic;
> + int i, ret;
> +
> + for ( i = 0; i < dist->nr_spis; i++ )
> + {
> + struct vgic_irq *irq = vgic_get_irq(d, NULL, 32 + i);
> +
> + if ( !irq->hw )
> + continue;
> +
> + ret = release_guest_irq(d, irq->hwintid);
> + if ( ret )
> + dprintk(XENLOG_G_WARNING,
> + "d%u: Failed to release virq %u ret = %d\n",
> + d->domain_id, 32 + i, ret);
Indentation looks wrong.
> + }
> +
> + dist->ready = false;
> + dist->initialized = false;
> +
> + xfree(dist->spis);
> + xfree(dist->allocated_irqs);
> + dist->nr_spis = 0;
> +}
> +
> +int vcpu_vgic_free(struct vcpu *vcpu)
> +{
> + struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic;
> +
> + INIT_LIST_HEAD(&vgic_cpu->ap_list_head);
> +
> + return 0;
> +}
> +
> /*
> * Local variables:
> * mode: C
>
Cheers,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2018-03-09 18:24 UTC|newest]
Thread overview: 146+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-05 16:03 [PATCH 00/57] New VGIC(-v2) implementation Andre Przywara
2018-03-05 16:03 ` [PATCH 01/57] tools: ARM: vGICv3: Avoid inserting optional DT properties Andre Przywara
2018-03-05 16:39 ` Julien Grall
2018-03-05 17:18 ` Wei Liu
2018-03-06 11:16 ` Julien Grall
2018-03-05 16:03 ` [PATCH 02/57] ARM: vGICv3: clarify on GUEST_GICV3_RDIST_REGIONS symbol Andre Przywara
2018-03-05 16:40 ` Julien Grall
2018-03-05 16:03 ` [PATCH 03/57] ARM: GICv3: use hardware GICv3 redistributor values for Dom0 Andre Przywara
2018-03-05 16:44 ` Julien Grall
2018-03-05 16:03 ` [PATCH 04/57] ARM: GICv3: simplify GICv3 redistributor stride handling Andre Przywara
2018-03-05 17:08 ` Julien Grall
2018-03-06 13:49 ` Julien Grall
2018-03-08 12:40 ` Andre Przywara
2018-03-08 15:29 ` Julien Grall
2018-03-05 16:03 ` [PATCH 05/57] ARM: vGICv3: always use architected redist stride Andre Przywara
2018-03-05 16:03 ` [PATCH 06/57] ARM: vGICv3: remove rdist_stride from VGIC structure Andre Przywara
2018-03-05 16:03 ` [PATCH 07/57] ARM: VGIC: rename gic_inject() and gic_clear_lrs() Andre Przywara
2018-03-05 17:09 ` Julien Grall
2018-03-05 16:03 ` [PATCH 08/57] ARM: VGIC: Move gic_remove_from_lr_pending() prototype Andre Przywara
2018-03-05 16:03 ` [PATCH 09/57] ARM: VGIC: Move domain_max_vcpus() to be VGIC specific Andre Przywara
2018-03-05 17:14 ` Julien Grall
2018-03-05 16:03 ` [PATCH 10/57] ARM: VGIC: rename gic_event_needs_delivery() Andre Przywara
2018-03-06 11:46 ` Julien Grall
2018-03-05 16:03 ` [PATCH 11/57] ARM: VGIC: change to level-IRQ compatible IRQ injection interface Andre Przywara
2018-03-06 11:53 ` Julien Grall
2018-03-05 16:03 ` [PATCH 12/57] ARM: VGIC: carve out struct vgic_cpu and struct vgic_dist Andre Przywara
2018-03-06 11:56 ` Julien Grall
2018-03-05 16:03 ` [PATCH 13/57] ARM: VGIC: reorder prototypes in vgic.h Andre Przywara
2018-03-05 16:03 ` [PATCH 14/57] ARM: VGIC: Introduce gic_get_nr_lrs() Andre Przywara
2018-03-06 14:02 ` Julien Grall
2018-03-05 16:03 ` [PATCH 15/57] ARM: GICv2: Extend and adjust register definitions Andre Przywara
2018-03-06 14:12 ` Julien Grall
2018-03-05 16:03 ` [PATCH 16/57] ARM: GICv3: rename HYP interface definitions to use ICH_ prefix Andre Przywara
2018-03-06 15:12 ` Julien Grall
2018-03-05 16:03 ` [PATCH 17/57] ARM: Introduce kick_vcpu() Andre Przywara
2018-03-06 15:21 ` Julien Grall
2018-03-05 16:03 ` [PATCH 18/57] ARM: GICv2: introduce gicv2_poke_irq() Andre Przywara
2018-03-06 15:23 ` Julien Grall
2018-03-06 15:25 ` Julien Grall
2018-03-05 16:03 ` [PATCH 19/57] ARM: GICv3: poke_irq: make RWP optional Andre Przywara
2018-03-06 15:37 ` Julien Grall
2018-03-05 16:03 ` [PATCH 20/57] ARM: GICv2: fix GICH_V2_LR definitions Andre Przywara
2018-03-06 15:46 ` Julien Grall
2018-03-06 15:58 ` Andre Przywara
2018-03-06 16:18 ` Julien Grall
2018-03-05 16:03 ` [PATCH 21/57] ARM: GICv2: extend LR read/write functions to cover EOI and source Andre Przywara
2018-03-06 16:06 ` Julien Grall
2018-03-08 16:25 ` Andre Przywara
2018-03-08 16:41 ` Julien Grall
2018-03-08 16:59 ` Julien Grall
2018-03-05 16:03 ` [PATCH 22/57] ARM: GIC: Allow tweaking the active and pending state of an IRQ Andre Przywara
2018-03-06 16:38 ` Julien Grall
2018-03-05 16:03 ` [PATCH 23/57] ARM: GIC: allow reading pending state of a hardware IRQ Andre Przywara
2018-03-06 16:57 ` Julien Grall
2018-03-05 16:03 ` [PATCH 24/57] ARM: timer: Handle level triggered IRQs correctly Andre Przywara
2018-03-06 17:15 ` Julien Grall
2018-03-06 17:20 ` Julien Grall
2018-03-05 16:03 ` [PATCH 25/57] ARM: evtchn: " Andre Przywara
2018-03-05 16:03 ` [PATCH 26/57] ARM: vPL011: Use the VGIC's level triggered IRQs handling if available Andre Przywara
2018-03-06 17:23 ` Julien Grall
2018-03-05 16:03 ` [PATCH 27/57] ARM: new VGIC: Add data structure definitions Andre Przywara
2018-03-06 17:46 ` Julien Grall
2018-03-06 18:01 ` Andre Przywara
2018-03-07 10:45 ` Julien Grall
2018-03-05 16:03 ` [PATCH 28/57] ARM: new VGIC: Add acccessor to new struct vgic_irq instance Andre Przywara
2018-03-06 18:13 ` Julien Grall
2018-03-19 17:32 ` Andre Przywara
2018-03-19 21:53 ` Julien Grall
2018-03-20 10:58 ` Andre Przywara
2018-03-20 11:07 ` Julien Grall
2018-03-05 16:03 ` [PATCH 29/57] ARM: new VGIC: Implement virtual IRQ injection Andre Przywara
2018-03-07 11:02 ` Julien Grall
2018-03-07 11:22 ` Andre Przywara
2018-03-07 11:41 ` Julien Grall
2018-03-05 16:03 ` [PATCH 30/57] ARM: new VGIC: Add IRQ sorting Andre Przywara
2018-03-07 11:06 ` Julien Grall
2018-03-05 16:03 ` [PATCH 31/57] ARM: new VGIC: Add IRQ sync/flush framework Andre Przywara
2018-03-07 11:47 ` Julien Grall
2018-03-07 12:20 ` Andre Przywara
2018-03-05 16:03 ` [PATCH 32/57] ARM: new VGIC: Add GICv2 world switch backend Andre Przywara
2018-03-07 12:10 ` Julien Grall
2018-03-07 12:31 ` Andre Przywara
2018-03-05 16:03 ` [PATCH 33/57] ARM: new VGIC: Implement vgic_vcpu_pending_irq Andre Przywara
2018-03-05 16:03 ` [PATCH 34/57] ARM: new VGIC: Add MMIO handling framework Andre Przywara
2018-03-05 16:56 ` [FIXUP] replace LOG_2 with ilog2 Andre Przywara
2018-03-07 14:54 ` [PATCH 34/57] ARM: new VGIC: Add MMIO handling framework Julien Grall
2018-03-05 16:03 ` [PATCH 35/57] ARM: new VGIC: Add GICv2 " Andre Przywara
2018-03-07 15:00 ` Julien Grall
2018-03-05 16:03 ` [PATCH 36/57] ARM: new VGIC: Add CTLR, TYPER and IIDR handlers Andre Przywara
2018-03-07 16:48 ` Julien Grall
2018-03-05 16:03 ` [PATCH 37/57] ARM: new VGIC: Add ENABLE registers handlers Andre Przywara
2018-03-07 17:01 ` Julien Grall
2018-03-07 18:20 ` Andre Przywara
2018-03-07 18:33 ` Julien Grall
2018-03-05 16:03 ` [PATCH 38/57] ARM: new VGIC: Add PENDING " Andre Przywara
2018-03-07 17:21 ` Julien Grall
2018-03-05 16:03 ` [PATCH 39/57] ARM: new VGIC: Add ACTIVE " Andre Przywara
2018-03-08 15:39 ` Julien Grall
2018-03-13 17:02 ` Andre Przywara
2018-03-13 17:14 ` Julien Grall
2018-03-13 17:16 ` Julien Grall
2018-03-13 17:34 ` Andre Przywara
2018-03-13 17:42 ` Julien Grall
2018-03-14 14:30 ` Andre Przywara
2018-03-14 14:40 ` Julien Grall
2018-03-05 16:03 ` [PATCH 40/57] ARM: new VGIC: Add PRIORITY " Andre Przywara
2018-03-08 15:48 ` Julien Grall
2018-03-08 16:21 ` Andre Przywara
2018-03-08 16:25 ` Julien Grall
2018-03-05 16:03 ` [PATCH 41/57] ARM: new VGIC: Add CONFIG " Andre Przywara
2018-03-08 16:12 ` Julien Grall
2018-03-05 16:04 ` [PATCH 42/57] ARM: new VGIC: Add TARGET " Andre Przywara
2018-03-08 16:18 ` Julien Grall
2018-03-08 16:30 ` Andre Przywara
2018-03-05 16:04 ` [PATCH 43/57] ARM: new VGIC: Add SGIR register handler Andre Przywara
2018-03-08 16:30 ` Julien Grall
2018-03-05 16:04 ` [PATCH 44/57] ARM: new VGIC: Add SGIPENDR register handlers Andre Przywara
2018-03-08 16:36 ` Julien Grall
2018-03-05 16:04 ` [PATCH 45/57] ARM: new VGIC: Handle hardware mapped IRQs Andre Przywara
2018-03-09 17:27 ` Julien Grall
2018-03-05 16:04 ` [PATCH 46/57] ARM: new VGIC: Add event channel IRQ handling Andre Przywara
2018-03-09 17:40 ` Julien Grall
2018-03-05 16:04 ` [PATCH 47/57] ARM: new VGIC: Handle virtual IRQ allocation/reservation Andre Przywara
2018-03-09 17:52 ` Julien Grall
2018-03-05 16:04 ` [PATCH 48/57] ARM: new VGIC: Dump virtual IRQ info Andre Przywara
2018-03-09 17:53 ` Julien Grall
2018-03-05 16:04 ` [PATCH 49/57] ARM: new VGIC: provide system register emulation stub Andre Przywara
2018-03-09 17:53 ` Julien Grall
2018-03-05 16:04 ` [PATCH 50/57] ARM: new VGIC: Implement arch_move_irqs() Andre Przywara
2018-03-09 17:55 ` Julien Grall
2018-03-05 16:04 ` [PATCH 51/57] ARM: new VGIC: Add preliminary stub implementation Andre Przywara
2018-03-09 18:18 ` Julien Grall
2018-03-13 15:55 ` Andre Przywara
2018-03-14 13:29 ` Julien Grall
2018-03-05 16:04 ` [PATCH 52/57] ARM: new VGIC: vgic-init: register VGIC Andre Przywara
2018-03-05 16:04 ` [PATCH 53/57] ARM: new VGIC: vgic-init: implement vgic_init Andre Przywara
2018-03-09 18:24 ` Julien Grall [this message]
2018-03-05 16:04 ` [PATCH 54/57] ARM: new VGIC: vgic-init: implement map_resources Andre Przywara
2018-03-09 18:27 ` Julien Grall
2018-03-05 16:04 ` [PATCH 55/57] ARM: new VGIC: Add vgic_v2_enable Andre Przywara
2018-03-09 18:29 ` Julien Grall
2018-03-05 16:04 ` [PATCH 56/57] ARM: allocate two pages for struct vcpu Andre Przywara
2018-03-09 18:30 ` Julien Grall
2018-03-05 16:04 ` [PATCH 57/57] ARM: VGIC: wire new VGIC(-v2) files into Xen build system Andre Przywara
2018-03-09 18:34 ` Julien Grall
2018-03-05 17:34 ` [PATCH 00/57] New VGIC(-v2) implementation Andre Przywara
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=46959edd-58d7-8f1f-c488-8e48e83fd363@arm.com \
--to=julien.grall@arm.com \
--cc=andre.przywara@linaro.org \
--cc=sstabellini@kernel.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).