From: Julien Grall <julien.grall@linaro.org>
To: vijay.kilari@gmail.com, Ian.Campbell@citrix.com,
stefano.stabellini@eu.citrix.com, stefano.stabellini@citrix.com,
xen-devel@lists.xen.org
Cc: "Keir (Xen.org)" <keir@xen.org>,
Prasun.Kapoor@caviumnetworks.com,
Ian Jackson <ian.jackson@eu.citrix.com>,
vijaya.kumar@caviumnetworks.com, Tim Deegan <tim@xen.org>,
Jan Beulich <jbeulich@suse.com>
Subject: Re: [PATCH v4 13/16] xen/arm: Add support for GIC v3
Date: Tue, 27 May 2014 20:47:07 +0100 [thread overview]
Message-ID: <5384EBBB.3070607@linaro.org> (raw)
In-Reply-To: <1401100009-7326-14-git-send-email-vijay.kilari@gmail.com>
Hi Vijay,
On 05/26/2014 11:26 AM, vijay.kilari@gmail.com wrote:
> From: Vijaya Kumar K <Vijaya.Kumar@caviumnetworks.com>
>
> Add support for GIC v3 specification System register access(SRE)
> is enabled to access cpu and virtual interface regiseters based
s/regiseters/register/
[..]
> +#include <xen/config.h>
> +#include <xen/lib.h>
> +#include <xen/init.h>
> +#include <xen/cpu.h>
> +#include <xen/mm.h>
> +#include <xen/irq.h>
> +#include <xen/sched.h>
> +#include <xen/errno.h>
> +#include <xen/delay.h>
> +#include <xen/device_tree.h>
> +#include <xen/libfdt/libfdt.h>
NIT: I don't think you need this include...
> +#include <asm/p2m.h>
> +#include <asm/domain.h>
> +#include <asm/platform.h>
Same here.
> +#include <asm/io.h>
> +#include <asm/device.h>
> +#include <asm/gic.h>
> +#include <asm/gic_v3_defs.h>
> +
> +struct rdist_region {
> + paddr_t base;
> + paddr_t size;
> + void __iomem *map_base;
> +};
> +
> +/* Global state */
> +static struct {
> + paddr_t dbase; /* Address of distributor registers */
> + paddr_t dbase_size;
> + void __iomem *map_dbase; /* Mapped address of distributor registers */
> + struct rdist_region *rdist_regions;
> + uint32_t rdist_stride;
> + unsigned int rdist_count; /* Number of rdist regions count */
> + unsigned int nr_priorities;
> + spinlock_t lock;
> +}gicv3;
Missing after the brace.
> +
> +static struct gic_info gicv3_info;
> +/*
> + * System Register Enable (SRE). Enable to access CPU & Virtual
> + * interface registers as system registers in EL2
> + */
> +static void gicv3_enable_sre(void)
> +{
> + uint32_t val;
> +
> + val = READ_SYSREG32(ICC_SRE_EL2);
> + val |= GICC_SRE_EL2_SRE | GICC_SRE_EL2_ENEL1 |
> + GICC_SRE_EL2_DFB | GICC_SRE_EL2_DIB;
Please add a bit of comment explaining why you choose to enable those bits.
It's clear for SRE and ENEL1 but not DFB and DIB...
[..]
> +static void gicv3_save_state(struct vcpu *v)
> +{
> +
> + /* No need for spinlocks here because interrupts are disabled around
> + * this call and it only accesses struct vcpu fields that cannot be
> + * accessed simultaneously by another pCPU.
> + */
> + dsb(sy);
Why a dsb here? I don't think it's useful. Hence it was not there on v3.
> + gicv3_save_lr(gicv3_info.nr_lrs, v);
You are saving multiple LRs, so gicv3_save_lrs sounds a better name.
[..]
> +static void gicv3_disable_irq(struct irq_desc *irqd)
> +{
> + /* Disable routing */
> + if ( irqd->irq < NR_GIC_LOCAL_IRQS )
> + writel_relaxed((1u << irqd->irq),
> + GICD_RDIST_SGI_BASE + GICR_ICENABLER0);
> + else
> + writel_relaxed(1u << (irqd->irq % 32),
> + GICD + GICD_ICENABLER + ((irqd->irq / 32) * 4));
Don't you forget gicv3_wait_for_rwp here?
The code of gicv3_disable_irq is very similar to gicv3_enable_irq. I
would create an helper here (see gic_poke_irq) on GICv3 for Linux.
> +}
> +
> +static void gicv3_eoi_irq(struct irq_desc *irqd)
> +{
> + /* Lower the priority */
> + WRITE_SYSREG32(irqd->irq, ICC_EOIR1_EL1);
Write to a sysreg register requires an isb after.
> +}
> +
> +static void gicv3_dir_irq(int irq)
> +{
> + /* Deactivate */
> + WRITE_SYSREG32(irq, ICC_DIR_EL1);
isb();
> +}
> +
> +static unsigned int gicv3_read_irq(void)
> +{
> + return (READ_SYSREG32(ICC_IAR1_EL1) & GICC_IA_IRQ);
> +}
> +
> +static inline uint64_t gicv3_mpidr_to_affinity(uint64_t mpidr)
As said on V3, you are using
gicv3_mpidr_to_affinity(cpu_logical_map(foo)) every where.
You can rework this function to get a cpu in parameter and return the
affinity.
It will avoid you duplicate code.
> +{
> + return (MPIDR_AFFINITY_LEVEL(mpidr, 3) << 32 |
> + MPIDR_AFFINITY_LEVEL(mpidr, 2) << 16 |
> + MPIDR_AFFINITY_LEVEL(mpidr, 1) << 8 |
> + MPIDR_AFFINITY_LEVEL(mpidr, 0));
> +}
> +
> +static void gicv3_set_irq_properties(struct irq_desc *desc,
> + const cpumask_t *cpu_mask,
> + unsigned int priority)
> +{
> + unsigned long flags;
> + uint32_t cfg, edgebit;
> + uint64_t affinity;
> + void __iomem *base;
> + unsigned int cpu = gicv3_get_cpu_from_mask(cpu_mask);
> + unsigned int irq = desc->irq;
> + unsigned int type = desc->arch.type;
> +
> + spin_lock_irqsave(&gicv3.lock, flags);
> +
> + /* SGI's are always edge-triggered not need to call GICD_ICFGR0 */
> + if ( irq >= NR_GIC_SGI )
> + {
gicv3_set_irq_properties is never called on SGI. Except adding another
indentation this is not useful.
> + if ( irq < NR_GIC_LOCAL_IRQS)
> + base = GICD + GICD_ICFGR + (irq / 16) * 4;
> + else
> + base = GICD_RDIST_SGI_BASE + GICR_ICFGR1;
> +
> + cfg = readl_relaxed(base);
> +
> + edgebit = 2u << (2 * (irq % 16));
> + if ( type & DT_IRQ_TYPE_LEVEL_MASK )
> + cfg &= ~edgebit;
> + else if ( type & DT_IRQ_TYPE_EDGE_BOTH )
> + cfg |= edgebit;
> +
> + writel_relaxed(cfg, base);
> + }
> +
> + affinity = gicv3_mpidr_to_affinity(cpu_logical_map(cpu));
> + /* Make sure we don't broadcast the interrupt */
> + affinity &= ~GICD_IROUTER_SPI_MODE_ANY;
> +
> + if ( irq >= NR_GIC_LOCAL_IRQS )
Sometimes you use this define and sometime the hardcode 32... Please be
consistent.
[..]
> +static int gicv3_enable_redist(void)
> +{
> + uint32_t val;
> + bool_t timeout = 0;
> + s_time_t deadline = NOW() + MILLISECS(1000);
> +
> + /* Wake up this CPU redistributor */
> + val = readl_relaxed(GICD_RDIST_BASE + GICR_WAKER);
> + val &= ~GICR_WAKER_ProcessorSleep;
> + writel_relaxed(val, GICD_RDIST_BASE + GICR_WAKER);
> +
> + do {
> + val = readl_relaxed(GICD_RDIST_BASE + GICR_WAKER);
> + if ( !(val & GICR_WAKER_ChildrenAsleep) )
> + break;
> + if ( NOW() > deadline )
> + {
> + timeout = 1;
> + break;
> + }
> + cpu_relax();
> + udelay(1);
> + } while ( timeout );
> +
> + if ( timeout )
> + dprintk(XENLOG_ERR, "GICv3: Redist enable RWP timeout\n");
> +
> + return 0;
Shouldn't you return an error if we timeout?
> +}
> +
> +static int __init gicv3_populate_rdist(void)
> +{
> + int i;
> + uint32_t aff;
> + uint32_t reg;
> + uint64_t typer;
> + uint64_t mpidr = cpu_logical_map(smp_processor_id());
> +
> + aff = gicv3_mpidr_to_affinity(mpidr);
This function is returning an uint64_t but you are using a uint32_t to
store the value. Is it normal?
> +
> + for ( i = 0; i < gicv3.rdist_count; i++ )
> + {
> + void __iomem *ptr = gicv3.rdist_regions[i].map_base;
> +
> + reg = readl_relaxed(ptr + GICR_PIDR2) & GICR_PIDR2_ARCH_MASK;
> + if ( reg != (GICV3_GICR_PIDR2 & GICR_PIDR2_ARCH_MASK) )
GICV3_GICR_PIDR2 is used for the emulation. You can't use this value to
test hardware stuff. Please use 0x30 (GICv3) which is clearer.
> + {
> + dprintk(XENLOG_ERR,
> + "GICv3: No redistributor present @%"PRIpaddr"\n",
> + gicv3.rdist_regions[i].base);
> + break;
> + }
> +
> + do {
> + typer = readq_relaxed(ptr + GICR_TYPER);
> +
> + if ( (typer >> 32) == aff )
> + {
Hrrmmm... now I understand why aff is 32 bits. Computing manually
(rather than using gicv3_mpidr_to_affinity function) was right on v3.
This was because TYPER doesn't exactly match the affinity field.
While you add again the correct affinity, please also add a comment such
as: "Convert affinity to a 32bit value that can be matched to GICR_TYPER
bits [63:32]."
> + this_cpu(rbase) = ptr;
> + printk("GICv3: CPU%d: Found redistributor in region %d @%p\n",
> + smp_processor_id(), i, ptr);
> + return 0;
> + }
> +
> + ptr += gicv3.rdist_stride;
> + if ( typer & GICR_TYPER_VLPIS )
> + ptr += SZ_64K * 2; /* Skip VLPI_base + reserved page */
You differ from Linux code here (even though VLPIS is RAZ on GIcv3). The
Linux driver is only check VLPIS when rdist_stride is equal to 0.
Actually, you set rdist_stride to SZ_64K * 2 if the property is not
existent. I guess you have to check with Marc Zyngier what's the correct
solution.
[..]
> + /* No priority grouping */
> + WRITE_SYSREG32(0, ICC_BPR1_EL1);
> +
> + /* Set priority mask register */
> + WRITE_SYSREG32(DEFAULT_PMR_VALUE, ICC_PMR_EL1);
> +
> + /* EOI drops priority too (mode 0) */
> + WRITE_SYSREG32(GICC_CTLR_EL1_EOImode_drop, ICC_CTLR_EL1);
isb() ?
> +
> + /* Enable Group1 interrupts */
> + WRITE_SYSREG32(1, ICC_IGRPEN1_EL1);
isb() ?
> +
> + return 0;
> +}
> +
> +static void gicv3_cpu_disable(void)
> +{
> + WRITE_SYSREG32(0, ICC_CTLR_EL1);
isb() ?
> +}
> +
> +static void __cpuinit gicv3_hyp_init(void)
> +{
> + uint32_t vtr;
> +
> + vtr = READ_SYSREG32(ICH_VTR_EL2);
> + gicv3_info.nr_lrs = (vtr & GICH_VTR_NRLRGS) + 1;
> + gicv3.nr_priorities = ((vtr >> GICH_VTR_PRIBITS_SHIFT) &
> + GICH_VTR_PRIBITS_MASK) + 1;
> +
> + ASSERT((gicv3.nr_priorities > 4 && gicv3.nr_priorities < 8));
For hardware "feature" checking, it's better to print a correct error
message than ASSERT (which is not enabled on non-debug build).
> +
> + WRITE_SYSREG32(GICH_VMCR_EOI | GICH_VMCR_VENG1, ICH_VMCR_EL2);
> + WRITE_SYSREG32(GICH_HCR_EN, ICH_HCR_EL2);
isb()?
[..]
> +static void __cpuinit gicv3_hyp_disable(void)
> +{
> + uint32_t vtr;
> +
> + vtr = READ_SYSREG32(ICH_HCR_EL2);
> + vtr &= ~0x1;
> + WRITE_SYSREG32( vtr, ICH_HCR_EL2);
isb() ?
[..]
> +static void gicv3_send_sgi(const cpumask_t *cpumask, enum gic_sgi sgi,
> + uint8_t mode)
> +{
> + int cpu = 0;
> + uint64_t val;
> +
> + dsb(sy);
Why a dsb there?
[..]
> +static void gicv3_update_lr(int lr, const struct pending_irq *p,
> + unsigned int state)
> +{
> + uint64_t grp = GICH_LR_GRP1;
> + uint64_t val = 0;
> +
> + BUG_ON(lr >= gicv3_info.nr_lrs);
> + BUG_ON(lr < 0);
> +
> + val = (((uint64_t)state & 0x3) << GICH_LR_STATE_SHIFT) | grp;
> + val |= ((uint64_t)p->priority & 0xff) << GICH_LR_PRIORITY_SHIFT;
> + val |= ((uint64_t)p->irq & GICH_LR_VIRTUAL_MASK) << GICH_LR_VIRTUAL_SHIFT;
> +
> + if ( p->desc != NULL )
> + val |= GICH_LR_HW | (((uint64_t)p->desc->irq & GICH_LR_PHYSICAL_MASK)
> + << GICH_LR_PHYSICAL_SHIFT);
> +
> + gicv3_ich_write_lr(lr, val);
isb() ? Might be better directly in gicv3_ich_write_lr.
> +}
> +
> +static void gicv3_clear_lr(int lr)
> +{
> + gicv3_ich_write_lr(lr, 0);
Same question here and ...
[..]
> +static void gicv3_write_lr(int lr_reg, const struct gic_lr *lr)
> +{
> + uint64_t lrv = 0;
> +
> + lrv = ( ((u64)(lr->pirq & GICH_LR_PHYSICAL_MASK) << GICH_LR_PHYSICAL_SHIFT)|
> + ((u64)(lr->virq & GICH_LR_VIRTUAL_MASK) << GICH_LR_VIRTUAL_SHIFT) |
> + ((u64)(lr->priority & GICH_LR_PRIORITY_MASK) << GICH_LR_PRIORITY_SHIFT)|
> + ((u64)(lr->state & GICH_LR_STATE_MASK) << GICH_LR_STATE_SHIFT) |
> + ((u64)(lr->hw_status & GICH_LR_HW_MASK) << GICH_LR_HW_SHIFT) |
> + ((u64)(lr->grp & GICH_LR_GRP_MASK) << GICH_LR_GRP_SHIFT) );
> +
> + gicv3_ich_write_lr(lr_reg, lrv);
here.
> +}
> +
> +static int gicv_v3_init(struct domain *d)
> +{
> + int i;
> +
> + /*
> + * Domain 0 gets the hardware address.
> + * Guests get the virtual platform layout.
> + */
> + if ( d->domain_id == 0 )
is_hardware_domain(d)
[..]
> +static void gicv3_hcr_status(uint32_t flag, bool_t status)
> +{
> + uint32_t hcr;
> +
> + hcr = READ_SYSREG32(ICH_HCR_EL2);
> + if ( status )
> + WRITE_SYSREG32(hcr | flag, ICH_HCR_EL2);
> + else
> + WRITE_SYSREG32(hcr & (~flag), ICH_HCR_EL2);
isb()?
> +static void gicv3_host_irq_end(struct irq_desc *desc)
> +{
> + /* Lower the priority */
> + gicv3_eoi_irq(desc);
> + /* Deactivate */
> + gicv3_dir_irq(desc->irq);
You are not consistent between the 2 function. One is taking an irq_desc
the other an unsigned int.
[..]
> +const static hw_irq_controller gicv3_host_irq_type = {
[..]
> +const static hw_irq_controller gicv3_guest_irq_type = {
[..]
> +const static struct gic_hw_operations gicv3_ops = {
We tend to use static const rather than "const static".
> +
> +/* Set up the GIC */
> +static int __init gicv3_init(struct dt_device_node *node, const void *data)
> +{
> + struct rdist_region *rdist_regs;
> + int res, i;
> + uint32_t reg;
> +
> + dt_device_set_used_by(node, DOMID_XEN);
> +
> + res = dt_device_get_address(node, 0, &gicv3.dbase, &gicv3.dbase_size);
> + if ( res || !gicv3.dbase )
> + panic("GICv3: Cannot find a valid distributor address");
> +
> + if ( (gicv3.dbase & ~PAGE_MASK) || (gicv3.dbase_size & ~PAGE_MASK) )
> + panic("GICv3: Found unaligned distributor address %"PRIpaddr"",
> + gicv3.dbase);
> +
> + gicv3.map_dbase = ioremap_nocache(gicv3.dbase, gicv3.dbase_size);
> + if ( !gicv3.map_dbase )
> + panic("GICv3: Failed to ioremap for GIC distributor\n");
> +
> + reg = readl_relaxed(GICD + GICD_PIDR2) & GICD_PIDR2_ARCH_MASK;
> + if ( reg != (GICV3_GICD_PIDR2 & GICD_PIDR2_ARCH_MASK) )
> + panic("GICv3: no distributor detected\n");
> +
> + if ( !dt_property_read_u32(node, "#redistributor-regions",
> + &gicv3.rdist_count) )
> + gicv3.rdist_count = 1;
> +
> + if ( gicv3.rdist_count > MAX_RDIST_COUNT )
> + panic("GICv3: Number of redistributor regions is more than \
You have to end the line with a " then beginning the new one with a ".
With your solution the compiler will drop append the second line from
the beginning, i.e with all the space...
> + %d (Increase MAX_RDIST_COUNT!!)\n", MAX_RDIST_COUNT);
> +
> + rdist_regs = xzalloc_array(struct rdist_region, gicv3.rdist_count);
> + if ( !rdist_regs )
> + panic("GICv3: Failed to allocate memory for rdist regions\n");
> +
> + for ( i = 0; i < gicv3.rdist_count; i++ )
> + {
> + uint64_t rdist_base, rdist_size;
> +
> + res = dt_device_get_address(node, 1 + i, &rdist_base, &rdist_size);
> + if ( res || !rdist_base )
> + panic("GICv3: No rdist base found for region %d\n", i);
> +
> + rdist_regs[i].base = rdist_base;
> + rdist_regs[i].size = rdist_size;
> + }
> +
> + /* If stride is not set in dt. Set default to 2 * SZ_64K */
> + if ( !dt_property_read_u32(node, "redistributor-stride", &gicv3.rdist_stride) )
> + gicv3.rdist_stride = 2 * SZ_64K;
I don't think this is right, see my comment a bit above for the function
gicv3_populate_rdist.
[..]
> diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h
> index 1369b2b..499a798 100644
> --- a/xen/include/xen/lib.h
> +++ b/xen/include/xen/lib.h
> @@ -67,6 +67,8 @@ do { \
>
> #define reserve_bootmem(_p,_l) ((void)0)
>
> +#define SZ_64K 0x00010000
> +
> struct domain;
>
> void cmdline_parse(const char *cmdline);
>
Same remark as on patch #10, you have to cc the relevant maintenairs for
every file you've modified (cced them).
You can use script/get_maintainers.pl for this purpose.
Regards,
--
Julien Grall
next prev parent reply other threads:[~2014-05-27 19:47 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-26 10:26 [PATCH v4 00/16] xen/arm: Add GICv3 support vijay.kilari
2014-05-26 10:26 ` [PATCH v4 01/16] xen/arm: move io.h as mmio.h to include folder vijay.kilari
2014-05-26 11:28 ` Julien Grall
2014-05-28 13:55 ` Stefano Stabellini
2014-05-26 10:26 ` [PATCH v4 02/16] xen/arm: make mmio handlers domain specific vijay.kilari
2014-05-26 12:33 ` Julien Grall
2014-05-28 14:05 ` Stefano Stabellini
2014-05-28 14:11 ` Julien Grall
2014-05-26 10:26 ` [PATCH v4 03/16] xen/arm: make sgi handling generic vijay.kilari
2014-05-26 12:41 ` Julien Grall
2014-05-26 12:45 ` Julien Grall
2014-05-28 14:10 ` Stefano Stabellini
2014-06-09 9:58 ` Vijay Kilari
2014-05-26 10:26 ` [PATCH v4 04/16] xen/arm: remove unused parameter in do_sgi call vijay.kilari
2014-05-26 12:48 ` Julien Grall
2014-05-26 10:26 ` [PATCH v4 05/16] xen/arm: use ioremap to map gic-v2 registers vijay.kilari
2014-05-26 13:10 ` Julien Grall
2014-05-30 12:54 ` Vijay Kilari
2014-05-28 14:26 ` Stefano Stabellini
2014-06-09 10:29 ` Vijay Kilari
2014-05-26 10:26 ` [PATCH v4 06/16] xen/arm: segregate and split GIC low level functionality vijay.kilari
2014-05-26 14:09 ` Julien Grall
2014-05-27 19:13 ` Julien Grall
2014-05-28 14:43 ` Stefano Stabellini
2014-05-26 10:26 ` [PATCH v4 07/16] arm/xen: move GIC context data structure to gic driver vijay.kilari
2014-05-26 14:32 ` Julien Grall
2014-05-28 14:49 ` Stefano Stabellini
2014-05-26 10:26 ` [PATCH v4 08/16] xen/arm: use device api to detect GIC version vijay.kilari
2014-05-26 14:39 ` Julien Grall
2014-05-28 14:52 ` Stefano Stabellini
2014-05-26 10:26 ` [PATCH v4 09/16] xen/arm: move vgic rank data to gic header file vijay.kilari
2014-05-27 11:32 ` Julien Grall
2014-05-28 14:54 ` Stefano Stabellini
2014-05-26 10:26 ` [PATCH v4 10/16] xen/arm: move vgic defines to vgic " vijay.kilari
2014-05-27 11:49 ` Julien Grall
2014-06-10 8:30 ` Vijay Kilari
2014-05-26 10:26 ` [PATCH v4 11/16] xen/arm: calculate vgic irq rank based on register size vijay.kilari
2014-05-27 11:56 ` Julien Grall
2014-05-30 8:59 ` Vijay Kilari
2014-05-30 9:58 ` Julien Grall
2014-05-30 10:24 ` Vijay Kilari
2014-05-30 10:36 ` Julien Grall
2014-05-30 10:51 ` Vijay Kilari
2014-05-30 10:54 ` Julien Grall
2014-05-26 10:26 ` [PATCH v4 12/16] xen/arm: split vgic driver into generic and vgic-v2 driver vijay.kilari
2014-05-27 16:50 ` Julien Grall
2014-05-26 10:26 ` [PATCH v4 13/16] xen/arm: Add support for GIC v3 vijay.kilari
2014-05-27 19:47 ` Julien Grall [this message]
2014-06-02 17:33 ` Stefano Stabellini
2014-06-03 8:54 ` Ian Campbell
2014-06-03 9:05 ` Julien Grall
2014-06-03 9:07 ` Ian Campbell
2014-06-03 10:43 ` Stefano Stabellini
2014-06-03 10:46 ` Stefano Stabellini
2014-05-26 10:26 ` [PATCH v4 14/16] xen/arm: Add virtual GICv3 support vijay.kilari
2014-06-02 15:50 ` Stefano Stabellini
2014-06-11 11:36 ` Vijay Kilari
2014-06-11 12:44 ` Stefano Stabellini
2014-06-02 16:10 ` Julien Grall
2014-06-02 16:15 ` Ian Campbell
2014-06-02 16:18 ` Julien Grall
2014-06-02 16:38 ` Ian Campbell
2014-06-02 16:46 ` Julien Grall
2014-05-26 10:26 ` [PATCH v4 15/16] xen/arm: Update Dom0 GIC dt node with GICv3 information vijay.kilari
2014-05-26 10:26 ` [PATCH v4 16/16] xen/arm: add SGI handling for GICv3 vijay.kilari
2014-06-02 16:05 ` Stefano Stabellini
2014-06-02 16:13 ` Ian Campbell
2014-06-11 12:34 ` Vijay Kilari
2014-06-02 16:17 ` Julien Grall
2014-06-11 12:35 ` Vijay Kilari
2014-06-11 12:38 ` Julien Grall
2014-06-12 6:53 ` Vijay Kilari
2014-06-12 21:56 ` Julien Grall
2014-06-13 8:34 ` Ian Campbell
2014-06-15 18:44 ` Julien Grall
2014-06-20 8:48 ` Vijay Kilari
2014-05-28 10:26 ` [PATCH v4 00/16] xen/arm: Add GICv3 support Ian Campbell
2014-05-28 12:34 ` Ian Campbell
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=5384EBBB.3070607@linaro.org \
--to=julien.grall@linaro.org \
--cc=Ian.Campbell@citrix.com \
--cc=Prasun.Kapoor@caviumnetworks.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=keir@xen.org \
--cc=stefano.stabellini@citrix.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=tim@xen.org \
--cc=vijay.kilari@gmail.com \
--cc=vijaya.kumar@caviumnetworks.com \
--cc=xen-devel@lists.xen.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.