[PATCH v3 58/62] xen/acpi: Fix event-channel interrupt when booting with ACPI
Stefano Stabellini
stefano.stabellini at eu.citrix.com
Fri Nov 27 07:12:23 PST 2015
On Tue, 17 Nov 2015, shannon.zhao at linaro.org wrote:
> From: Shannon Zhao <shannon.zhao at linaro.org>
>
> When booting with ACPI, store the event-channel interrupt number and
> flag in HVM parameter HVM_PARAM_CALLBACK_IRQ. Then Dom0 could get it
> through hypercall HVMOP_get_param.
>
> Signed-off-by: Shannon Zhao <shannon.zhao at linaro.org>
> ---
> xen/arch/arm/domain_build.c | 45 ++++++++++++++++++++++++++++-----------------
> 1 file changed, 28 insertions(+), 17 deletions(-)
>
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 9532807..36917be 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -2067,23 +2067,34 @@ static void evtchn_fixup(struct domain *d, struct kernel_info *kinfo)
> printk("Allocating PPI %u for event channel interrupt\n",
> d->arch.evtchn_irq);
>
> - /* Fix up "interrupts" in /hypervisor node */
> - node = fdt_path_offset(kinfo->fdt, "/hypervisor");
> - if ( node < 0 )
> - panic("Cannot find the /hypervisor node");
> -
> - /* Interrupt event channel upcall:
> - * - Active-low level-sensitive
> - * - All CPUs
> - *
> - * TODO: Handle properly the cpumask
> - */
> - set_interrupt_ppi(intr, d->arch.evtchn_irq, 0xf,
> - DT_IRQ_TYPE_LEVEL_LOW);
> - res = fdt_setprop_inplace(kinfo->fdt, node, "interrupts",
> - &intr, sizeof(intr));
> - if ( res )
> - panic("Cannot fix up \"interrupts\" property of the hypervisor node");
> + if ( acpi_disabled )
> + {
> + /* Fix up "interrupts" in /hypervisor node */
> + node = fdt_path_offset(kinfo->fdt, "/hypervisor");
> + if ( node < 0 )
> + panic("Cannot find the /hypervisor node");
> +
> + /* Interrupt event channel upcall:
> + * - Active-low level-sensitive
> + * - All CPUs
> + *
> + * TODO: Handle properly the cpumask
> + */
> + set_interrupt_ppi(intr, d->arch.evtchn_irq, 0xf,
> + DT_IRQ_TYPE_LEVEL_LOW);
> + res = fdt_setprop_inplace(kinfo->fdt, node, "interrupts",
> + &intr, sizeof(intr));
> + if ( res )
> + panic("Cannot fix up \"interrupts\" property of the hypervisor node");
This code could be moved out to a dt_set_evtchn_irq function
> + }
> + else
> + {
> + int type = 3;
> + int flag = 2; /* Active-low level-sensitive */
> + d->arch.hvm_domain.params[HVM_PARAM_CALLBACK_IRQ] = (u64)type << 56
> + | flag << 8
> + | d->arch.evtchn_irq;
> + }
> }
Actually there is no point in setting HVM_PARAM_CALLBACK_IRQ only on
ACPI: I would just set it on all cases.
More information about the linux-arm-kernel
mailing list