Commit 71466535 authored by Thomas Gleixner's avatar Thomas Gleixner

irqchip/gic: Use IRQD_FORWARDED_TO_VCPU flag

Get rid of the handler_data abuse.
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
parent fc569712
...@@ -145,29 +145,10 @@ static inline bool cascading_gic_irq(struct irq_data *d) ...@@ -145,29 +145,10 @@ static inline bool cascading_gic_irq(struct irq_data *d)
void *data = irq_data_get_irq_handler_data(d); void *data = irq_data_get_irq_handler_data(d);
/* /*
* If handler_data pointing to one of the secondary GICs, then * If handler_data is set, this is a cascading interrupt, and
* this is a cascading interrupt, and it cannot possibly be * it cannot possibly be forwarded.
* forwarded.
*/ */
if (data >= (void *)(gic_data + 1) && return data != NULL;
data < (void *)(gic_data + MAX_GIC_NR))
return true;
return false;
}
static inline bool forwarded_irq(struct irq_data *d)
{
/*
* A forwarded interrupt:
* - is on the primary GIC
* - has its handler_data set to a value
* - that isn't a secondary GIC
*/
if (d->handler_data && !cascading_gic_irq(d))
return true;
return false;
} }
/* /*
...@@ -201,7 +182,7 @@ static void gic_eoimode1_mask_irq(struct irq_data *d) ...@@ -201,7 +182,7 @@ static void gic_eoimode1_mask_irq(struct irq_data *d)
* disabled/masked will not get "stuck", because there is * disabled/masked will not get "stuck", because there is
* noone to deactivate it (guest is being terminated). * noone to deactivate it (guest is being terminated).
*/ */
if (forwarded_irq(d)) if (irqd_is_forwarded_to_vcpu(d))
gic_poke_irq(d, GIC_DIST_ACTIVE_CLEAR); gic_poke_irq(d, GIC_DIST_ACTIVE_CLEAR);
} }
...@@ -218,7 +199,7 @@ static void gic_eoi_irq(struct irq_data *d) ...@@ -218,7 +199,7 @@ static void gic_eoi_irq(struct irq_data *d)
static void gic_eoimode1_eoi_irq(struct irq_data *d) static void gic_eoimode1_eoi_irq(struct irq_data *d)
{ {
/* Do not deactivate an IRQ forwarded to a vcpu. */ /* Do not deactivate an IRQ forwarded to a vcpu. */
if (forwarded_irq(d)) if (irqd_is_forwarded_to_vcpu(d))
return; return;
writel_relaxed(gic_irq(d), gic_cpu_base(d) + GIC_CPU_DEACTIVATE); writel_relaxed(gic_irq(d), gic_cpu_base(d) + GIC_CPU_DEACTIVATE);
...@@ -296,7 +277,10 @@ static int gic_irq_set_vcpu_affinity(struct irq_data *d, void *vcpu) ...@@ -296,7 +277,10 @@ static int gic_irq_set_vcpu_affinity(struct irq_data *d, void *vcpu)
if (cascading_gic_irq(d)) if (cascading_gic_irq(d))
return -EINVAL; return -EINVAL;
d->handler_data = vcpu; if (vcpu)
irqd_set_forwarded_to_vcpu(d);
else
irqd_clr_forwarded_to_vcpu(d);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment