@@ -1862,26 +1862,36 @@ static void ioapic_ir_ack_level(struct irq_data *irq_data)
1862
1862
eoi_ioapic_pin (data -> entry .vector , data );
1863
1863
}
1864
1864
1865
+ static void ioapic_configure_entry (struct irq_data * irqd )
1866
+ {
1867
+ struct mp_chip_data * mpd = irqd -> chip_data ;
1868
+ struct irq_cfg * cfg = irqd_cfg (irqd );
1869
+ struct irq_pin_list * entry ;
1870
+
1871
+ /*
1872
+ * Only update when the parent is the vector domain, don't touch it
1873
+ * if the parent is the remapping domain. Check the installed
1874
+ * ioapic chip to verify that.
1875
+ */
1876
+ if (irqd -> chip == & ioapic_chip ) {
1877
+ mpd -> entry .dest = cfg -> dest_apicid ;
1878
+ mpd -> entry .vector = cfg -> vector ;
1879
+ }
1880
+ for_each_irq_pin (entry , mpd -> irq_2_pin )
1881
+ __ioapic_write_entry (entry -> apic , entry -> pin , mpd -> entry );
1882
+ }
1883
+
1865
1884
static int ioapic_set_affinity (struct irq_data * irq_data ,
1866
1885
const struct cpumask * mask , bool force )
1867
1886
{
1868
1887
struct irq_data * parent = irq_data -> parent_data ;
1869
- struct mp_chip_data * data = irq_data -> chip_data ;
1870
- struct irq_pin_list * entry ;
1871
- struct irq_cfg * cfg ;
1872
1888
unsigned long flags ;
1873
1889
int ret ;
1874
1890
1875
1891
ret = parent -> chip -> irq_set_affinity (parent , mask , force );
1876
1892
raw_spin_lock_irqsave (& ioapic_lock , flags );
1877
- if (ret >= 0 && ret != IRQ_SET_MASK_OK_DONE ) {
1878
- cfg = irqd_cfg (irq_data );
1879
- data -> entry .dest = cfg -> dest_apicid ;
1880
- data -> entry .vector = cfg -> vector ;
1881
- for_each_irq_pin (entry , data -> irq_2_pin )
1882
- __ioapic_write_entry (entry -> apic , entry -> pin ,
1883
- data -> entry );
1884
- }
1893
+ if (ret >= 0 && ret != IRQ_SET_MASK_OK_DONE )
1894
+ ioapic_configure_entry (irq_data );
1885
1895
raw_spin_unlock_irqrestore (& ioapic_lock , flags );
1886
1896
1887
1897
return ret ;
@@ -2980,12 +2990,9 @@ int mp_irqdomain_activate(struct irq_domain *domain,
2980
2990
struct irq_data * irq_data , bool early )
2981
2991
{
2982
2992
unsigned long flags ;
2983
- struct irq_pin_list * entry ;
2984
- struct mp_chip_data * data = irq_data -> chip_data ;
2985
2993
2986
2994
raw_spin_lock_irqsave (& ioapic_lock , flags );
2987
- for_each_irq_pin (entry , data -> irq_2_pin )
2988
- __ioapic_write_entry (entry -> apic , entry -> pin , data -> entry );
2995
+ ioapic_configure_entry (irq_data );
2989
2996
raw_spin_unlock_irqrestore (& ioapic_lock , flags );
2990
2997
return 0 ;
2991
2998
}
0 commit comments