diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 2f57d019e2..52d2403345 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -31,6 +31,7 @@ #include #include +#include #include "vtimer.h" #include "vuart.h" @@ -526,8 +527,10 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags) if ( (rc = vcpu_domain_init(d)) != 0 ) goto fail; - /* XXX dom0 needs more intelligent selection of PPI */ - d->arch.evtchn_irq = GUEST_EVTCHN_PPI; + if ( d->domain_id ) + d->arch.evtchn_irq = GUEST_EVTCHN_PPI; + else + d->arch.evtchn_irq = platform_dom0_evtchn_ppi(); /* * Virtual UART is only used by linux early printk and decompress code. diff --git a/xen/arch/arm/platform.c b/xen/arch/arm/platform.c index 0fbbdc7e21..a7f9ee413d 100644 --- a/xen/arch/arm/platform.c +++ b/xen/arch/arm/platform.c @@ -156,6 +156,13 @@ bool_t platform_device_is_blacklisted(const struct dt_device_node *node) return dt_match_node(blacklist, node); } +unsigned int platform_dom0_evtchn_ppi(void) +{ + if ( platform && platform->dom0_evtchn_ppi ) + return platform->dom0_evtchn_ppi; + return GUEST_EVTCHN_PPI; +} + /* * Local variables: * mode: C diff --git a/xen/arch/arm/platforms/xgene-storm.c b/xen/arch/arm/platforms/xgene-storm.c index 23ec46deb6..f416da3dac 100644 --- a/xen/arch/arm/platforms/xgene-storm.c +++ b/xen/arch/arm/platforms/xgene-storm.c @@ -36,6 +36,7 @@ static const char * const xgene_storm_dt_compat[] __initconst = PLATFORM_START(xgene_storm, "APM X-GENE STORM") .compatible = xgene_storm_dt_compat, .quirks = xgene_storm_quirks, + .dom0_evtchn_ppi = 24, PLATFORM_END /* diff --git a/xen/include/asm-arm/platform.h b/xen/include/asm-arm/platform.h index c9314e5e9d..5900ee407c 100644 --- a/xen/include/asm-arm/platform.h +++ b/xen/include/asm-arm/platform.h @@ -37,6 +37,10 @@ struct platform_desc { * List of devices which must not pass-through to a guest */ const struct dt_device_match *blacklist_dev; + /* + * The IRQ (PPI) to use to inject event channels to dom0. + */ + unsigned int dom0_evtchn_ppi; }; /* @@ -61,6 +65,7 @@ void platform_reset(void); void platform_poweroff(void); bool_t platform_has_quirk(uint32_t quirk); bool_t platform_device_is_blacklisted(const struct dt_device_node *node); +unsigned int platform_dom0_evtchn_ppi(void); #define PLATFORM_START(_name, _namestr) \ static const struct platform_desc __plat_desc_##_name __used \