[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] xen/arm: gic-v3: Implement correctly the callback send_SGI
commit 8c1ed6d0c08c8139c42ce0a12121b268ea144a52 Author: Julien Grall <julien.grall@xxxxxxxxxx> AuthorDate: Fri May 8 18:01:12 2015 +0100 Commit: Ian Campbell <ian.campbell@xxxxxxxxxx> CommitDate: Thu May 21 15:12:10 2015 +0100 xen/arm: gic-v3: Implement correctly the callback send_SGI Currently, the GICv3 driver is only able to send an SGI when the cpumask is provided. Although with the modes SGI_TARGET_OTHERS and SGI_TARGET_SELF, no cpumask is provided. Any usage of those modes will crash the hypersivor. Rename gicv3_send_sgi to gicv3_send_sgi_list and implement the different modes: - SGI_TARGET_OTHERS: Set the Interrupt Routing Mode (bit 40) to 1 (see Table 4 on Section 4.2.6 PRD03-GENC-010745 24.0) - SGI_TARGET_SELF: Unlike GICv2, the GICv3 SGI registers don't provide a specific field. So use gicv3_send_sgi_list and pass the cpumask of the current CPU - SGI_TARGET_LIST: Directly call gicv3_send_sgi_list with the given cpumask Also, use WRITE_SYSREG64 to write into ICC_SGI1R_EL1 the access is 64-bit on all the architectures. Reported-by: Chen Baozi <baozich@xxxxxxxxx> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> Tested-by: Chen Baozi <baozich@xxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- xen/arch/arm/gic-v3.c | 27 ++++++++++++++++++++++++--- xen/include/asm-arm/gic_v3_defs.h | 2 +- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c index db498ed..30682cf 100644 --- a/xen/arch/arm/gic-v3.c +++ b/xen/arch/arm/gic-v3.c @@ -808,8 +808,7 @@ out: return tlist; } -static void gicv3_send_sgi(enum gic_sgi sgi, enum gic_sgi_mode mode, - const cpumask_t *cpumask) +static void gicv3_send_sgi_list(enum gic_sgi sgi, const cpumask_t *cpumask) { int cpu = 0; uint64_t val; @@ -833,12 +832,34 @@ static void gicv3_send_sgi(enum gic_sgi sgi, enum gic_sgi_mode mode, MPIDR_AFFINITY_LEVEL(cluster_id, 1) << 16 | tlist); - WRITE_SYSREG(val, ICC_SGI1R_EL1); + WRITE_SYSREG64(val, ICC_SGI1R_EL1); } /* Force above writes to ICC_SGI1R_EL1 */ isb(); } +static void gicv3_send_sgi(enum gic_sgi sgi, enum gic_sgi_mode mode, + const cpumask_t *cpumask) +{ + switch ( mode ) + { + case SGI_TARGET_OTHERS: + WRITE_SYSREG64(ICH_SGI_TARGET_OTHERS << ICH_SGI_IRQMODE_SHIFT | + (uint64_t)sgi << ICH_SGI_IRQ_SHIFT, + ICC_SGI1R_EL1); + isb(); + break; + case SGI_TARGET_SELF: + gicv3_send_sgi_list(sgi, cpumask_of(smp_processor_id())); + break; + case SGI_TARGET_LIST: + gicv3_send_sgi_list(sgi, cpumask); + break; + default: + BUG(); + } +} + /* Shut down the per-CPU GIC interface */ static void gicv3_disable_interface(void) { diff --git a/xen/include/asm-arm/gic_v3_defs.h b/xen/include/asm-arm/gic_v3_defs.h index b8a1c2e..556f114 100644 --- a/xen/include/asm-arm/gic_v3_defs.h +++ b/xen/include/asm-arm/gic_v3_defs.h @@ -147,7 +147,7 @@ #define ICH_SGI_IRQMODE_SHIFT 40 #define ICH_SGI_IRQMODE_MASK 0x1 -#define ICH_SGI_TARGET_OTHERS 1 +#define ICH_SGI_TARGET_OTHERS 1UL #define ICH_SGI_TARGET_LIST 0 #define ICH_SGI_IRQ_SHIFT 24 #define ICH_SGI_IRQ_MASK 0xf -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |