Ian Campbell
2013-Nov-22 16:24 UTC
[PATCH v2 05/15] xen: arm: allow platform code to select dom0 event channel irq
Currently the hardcoded use of GUEST_EVTCHN_PPI is problematic if that is a real PPI on the platform. We really need to be smarter about selecting an unused PPI but in the meantime we can at least give the platform code the option of hardcoding a number which works for the platform. Hardcode a suitable PPI on the Xgene platform. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- xen/arch/arm/domain.c | 7 +++++-- xen/arch/arm/platform.c | 7 +++++++ xen/arch/arm/platforms/xgene-storm.c | 1 + xen/include/asm-arm/platform.h | 5 +++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 2f57d01..52d2403 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -31,6 +31,7 @@ #include <asm/processor-ca15.h> #include <asm/gic.h> +#include <asm/platform.h> #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 0fbbdc7..a7f9ee4 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 d185a4a..8658996 100644 --- a/xen/arch/arm/platforms/xgene-storm.c +++ b/xen/arch/arm/platforms/xgene-storm.c @@ -40,6 +40,7 @@ static const char const *xgene_storm_dt_compat[] __initdata 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 c9314e5..5900ee4 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 \ -- 1.7.10.4
George Dunlap
2013-Nov-22 16:48 UTC
Re: [PATCH v2 05/15] xen: arm: allow platform code to select dom0 event channel irq
On Fri, Nov 22, 2013 at 4:24 PM, Ian Campbell <ian.campbell@citrix.com> wrote:> Currently the hardcoded use of GUEST_EVTCHN_PPI is problematic if that is a > real PPI on the platform. > > We really need to be smarter about selecting an unused PPI but in the meantime > we can at least give the platform code the option of hardcoding a number which > works for the platform. > > Hardcode a suitable PPI on the Xgene platform. > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>Release-acked-by: George Dunlap <george.dunlap@eu.citrix.com>> --- > xen/arch/arm/domain.c | 7 +++++-- > xen/arch/arm/platform.c | 7 +++++++ > xen/arch/arm/platforms/xgene-storm.c | 1 + > xen/include/asm-arm/platform.h | 5 +++++ > 4 files changed, 18 insertions(+), 2 deletions(-) > > diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c > index 2f57d01..52d2403 100644 > --- a/xen/arch/arm/domain.c > +++ b/xen/arch/arm/domain.c > @@ -31,6 +31,7 @@ > #include <asm/processor-ca15.h> > > #include <asm/gic.h> > +#include <asm/platform.h> > #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 0fbbdc7..a7f9ee4 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 d185a4a..8658996 100644 > --- a/xen/arch/arm/platforms/xgene-storm.c > +++ b/xen/arch/arm/platforms/xgene-storm.c > @@ -40,6 +40,7 @@ static const char const *xgene_storm_dt_compat[] __initdata > 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 c9314e5..5900ee4 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 \ > -- > 1.7.10.4 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel
Julien Grall
2013-Nov-22 17:01 UTC
Re: [PATCH v2 05/15] xen: arm: allow platform code to select dom0 event channel irq
On 11/22/2013 04:24 PM, Ian Campbell wrote:> Currently the hardcoded use of GUEST_EVTCHN_PPI is problematic if that is a > real PPI on the platform. > > We really need to be smarter about selecting an unused PPI but in the meantime > we can at least give the platform code the option of hardcoding a number which > works for the platform. > > Hardcode a suitable PPI on the Xgene platform. > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>I have a patch somewhere to find a free PPI, I forget to rework it... and it''s a bit invasive for 4.4. Acked-by: Julien Grall <julien.grall@linaro.org>> --- > xen/arch/arm/domain.c | 7 +++++-- > xen/arch/arm/platform.c | 7 +++++++ > xen/arch/arm/platforms/xgene-storm.c | 1 + > xen/include/asm-arm/platform.h | 5 +++++ > 4 files changed, 18 insertions(+), 2 deletions(-) > > diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c > index 2f57d01..52d2403 100644 > --- a/xen/arch/arm/domain.c > +++ b/xen/arch/arm/domain.c > @@ -31,6 +31,7 @@ > #include <asm/processor-ca15.h> > > #include <asm/gic.h> > +#include <asm/platform.h> > #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 0fbbdc7..a7f9ee4 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 d185a4a..8658996 100644 > --- a/xen/arch/arm/platforms/xgene-storm.c > +++ b/xen/arch/arm/platforms/xgene-storm.c > @@ -40,6 +40,7 @@ static const char const *xgene_storm_dt_compat[] __initdata > 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 c9314e5..5900ee4 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 \ >-- Julien Grall