Skip to content

Commit 7249164

Browse files
committed
genirq/irqdomain: Update irq_domain_ops.activate() signature
The irq_domain_ops.activate() callback has no return value and no way to tell the function that the activation is early. The upcoming changes to support a reservation scheme which allows to assign interrupt vectors on x86 only when the interrupt is actually requested requires: - A return value, so activation can fail at request_irq() time - Information that the activate invocation is early, i.e. before request_irq(). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Juergen Gross <jgross@suse.com> Tested-by: Yu Chen <yu.c.chen@intel.com> Acked-by: Juergen Gross <jgross@suse.com> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: Tony Luck <tony.luck@intel.com> Cc: Marc Zyngier <marc.zyngier@arm.com> Cc: Alok Kataria <akataria@vmware.com> Cc: Joerg Roedel <joro@8bytes.org> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Christoph Hellwig <hch@lst.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Rui Zhang <rui.zhang@intel.com> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Arjan van de Ven <arjan@linux.intel.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Len Brown <lenb@kernel.org> Link: https://lkml.kernel.org/r/20170913213152.848490816@linutronix.de
1 parent c942cee commit 7249164

File tree

12 files changed

+36
-25
lines changed

12 files changed

+36
-25
lines changed

arch/x86/include/asm/irqdomain.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ extern int mp_irqdomain_alloc(struct irq_domain *domain, unsigned int virq,
4141
unsigned int nr_irqs, void *arg);
4242
extern void mp_irqdomain_free(struct irq_domain *domain, unsigned int virq,
4343
unsigned int nr_irqs);
44-
extern void mp_irqdomain_activate(struct irq_domain *domain,
45-
struct irq_data *irq_data);
44+
extern int mp_irqdomain_activate(struct irq_domain *domain,
45+
struct irq_data *irq_data, bool early);
4646
extern void mp_irqdomain_deactivate(struct irq_domain *domain,
4747
struct irq_data *irq_data);
4848
extern int mp_irqdomain_ioapic_idx(struct irq_domain *domain);

arch/x86/kernel/apic/htirq.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ static void htirq_domain_free(struct irq_domain *domain, unsigned int virq,
112112
irq_domain_free_irqs_top(domain, virq, nr_irqs);
113113
}
114114

115-
static void htirq_domain_activate(struct irq_domain *domain,
116-
struct irq_data *irq_data)
115+
static int htirq_domain_activate(struct irq_domain *domain,
116+
struct irq_data *irq_data, bool early)
117117
{
118118
struct ht_irq_msg msg;
119119
struct irq_cfg *cfg = irqd_cfg(irq_data);
@@ -132,6 +132,7 @@ static void htirq_domain_activate(struct irq_domain *domain,
132132
HT_IRQ_LOW_MT_ARBITRATED) |
133133
HT_IRQ_LOW_IRQ_MASKED;
134134
write_ht_irq_msg(irq_data->irq, &msg);
135+
return 0;
135136
}
136137

137138
static void htirq_domain_deactivate(struct irq_domain *domain,

arch/x86/kernel/apic/io_apic.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2977,8 +2977,8 @@ void mp_irqdomain_free(struct irq_domain *domain, unsigned int virq,
29772977
irq_domain_free_irqs_top(domain, virq, nr_irqs);
29782978
}
29792979

2980-
void mp_irqdomain_activate(struct irq_domain *domain,
2981-
struct irq_data *irq_data)
2980+
int mp_irqdomain_activate(struct irq_domain *domain,
2981+
struct irq_data *irq_data, bool early)
29822982
{
29832983
unsigned long flags;
29842984
struct irq_pin_list *entry;
@@ -2988,6 +2988,7 @@ void mp_irqdomain_activate(struct irq_domain *domain,
29882988
for_each_irq_pin(entry, data->irq_2_pin)
29892989
__ioapic_write_entry(entry->apic, entry->pin, data->entry);
29902990
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
2991+
return 0;
29912992
}
29922993

29932994
void mp_irqdomain_deactivate(struct irq_domain *domain,

arch/x86/platform/uv/uv_irq.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,11 @@ static void uv_domain_free(struct irq_domain *domain, unsigned int virq,
127127
* Re-target the irq to the specified CPU and enable the specified MMR located
128128
* on the specified blade to allow the sending of MSIs to the specified CPU.
129129
*/
130-
static void uv_domain_activate(struct irq_domain *domain,
131-
struct irq_data *irq_data)
130+
static int uv_domain_activate(struct irq_domain *domain,
131+
struct irq_data *irq_data, bool early)
132132
{
133133
uv_program_mmr(irqd_cfg(irq_data), irq_data->chip_data);
134+
return 0;
134135
}
135136

136137
/*

drivers/gpio/gpio-xgene-sb.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,9 @@ static int xgene_gpio_sb_to_irq(struct gpio_chip *gc, u32 gpio)
140140
return irq_create_fwspec_mapping(&fwspec);
141141
}
142142

143-
static void xgene_gpio_sb_domain_activate(struct irq_domain *d,
144-
struct irq_data *irq_data)
143+
static int xgene_gpio_sb_domain_activate(struct irq_domain *d,
144+
struct irq_data *irq_data,
145+
bool early)
145146
{
146147
struct xgene_gpio_sb *priv = d->host_data;
147148
u32 gpio = HWIRQ_TO_GPIO(priv, irq_data->hwirq);
@@ -150,11 +151,12 @@ static void xgene_gpio_sb_domain_activate(struct irq_domain *d,
150151
dev_err(priv->gc.parent,
151152
"Unable to configure XGene GPIO standby pin %d as IRQ\n",
152153
gpio);
153-
return;
154+
return -ENOSPC;
154155
}
155156

156157
xgene_gpio_set_bit(&priv->gc, priv->regs + MPA_GPIO_SEL_LO,
157158
gpio * 2, 1);
159+
return 0;
158160
}
159161

160162
static void xgene_gpio_sb_domain_deactivate(struct irq_domain *d,

drivers/iommu/amd_iommu.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4170,8 +4170,8 @@ static void irq_remapping_free(struct irq_domain *domain, unsigned int virq,
41704170
irq_domain_free_irqs_common(domain, virq, nr_irqs);
41714171
}
41724172

4173-
static void irq_remapping_activate(struct irq_domain *domain,
4174-
struct irq_data *irq_data)
4173+
static int irq_remapping_activate(struct irq_domain *domain,
4174+
struct irq_data *irq_data, bool early)
41754175
{
41764176
struct amd_ir_data *data = irq_data->chip_data;
41774177
struct irq_2_irte *irte_info = &data->irq_2_irte;
@@ -4180,6 +4180,7 @@ static void irq_remapping_activate(struct irq_domain *domain,
41804180
if (iommu)
41814181
iommu->irte_ops->activate(data->entry, irte_info->devid,
41824182
irte_info->index);
4183+
return 0;
41834184
}
41844185

41854186
static void irq_remapping_deactivate(struct irq_domain *domain,

drivers/iommu/intel_irq_remapping.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,12 +1389,13 @@ static void intel_irq_remapping_free(struct irq_domain *domain,
13891389
irq_domain_free_irqs_common(domain, virq, nr_irqs);
13901390
}
13911391

1392-
static void intel_irq_remapping_activate(struct irq_domain *domain,
1393-
struct irq_data *irq_data)
1392+
static int intel_irq_remapping_activate(struct irq_domain *domain,
1393+
struct irq_data *irq_data, bool early)
13941394
{
13951395
struct intel_ir_data *data = irq_data->chip_data;
13961396

13971397
modify_irte(&data->irq_2_iommu, &data->irte_entry);
1398+
return 0;
13981399
}
13991400

14001401
static void intel_irq_remapping_deactivate(struct irq_domain *domain,

drivers/irqchip/irq-gic-v3-its.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2186,8 +2186,8 @@ static int its_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
21862186
return 0;
21872187
}
21882188

2189-
static void its_irq_domain_activate(struct irq_domain *domain,
2190-
struct irq_data *d)
2189+
static int its_irq_domain_activate(struct irq_domain *domain,
2190+
struct irq_data *d, bool early)
21912191
{
21922192
struct its_device *its_dev = irq_data_get_irq_chip_data(d);
21932193
u32 event = its_get_event_id(d);
@@ -2205,6 +2205,7 @@ static void its_irq_domain_activate(struct irq_domain *domain,
22052205

22062206
/* Map the GIC IRQ and event to the device */
22072207
its_send_mapti(its_dev, d->hwirq, event);
2208+
return 0;
22082209
}
22092210

22102211
static void its_irq_domain_deactivate(struct irq_domain *domain,
@@ -2678,15 +2679,16 @@ static int its_vpe_irq_domain_alloc(struct irq_domain *domain, unsigned int virq
26782679
return err;
26792680
}
26802681

2681-
static void its_vpe_irq_domain_activate(struct irq_domain *domain,
2682-
struct irq_data *d)
2682+
static int its_vpe_irq_domain_activate(struct irq_domain *domain,
2683+
struct irq_data *d, bool early)
26832684
{
26842685
struct its_vpe *vpe = irq_data_get_irq_chip_data(d);
26852686

26862687
/* Map the VPE to the first possible CPU */
26872688
vpe->col_idx = cpumask_first(cpu_online_mask);
26882689
its_send_vmapp(vpe, true);
26892690
its_send_vinvall(vpe);
2691+
return 0;
26902692
}
26912693

26922694
static void its_vpe_irq_domain_deactivate(struct irq_domain *domain,

drivers/pinctrl/stm32/pinctrl-stm32.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,13 +289,14 @@ static int stm32_gpio_domain_translate(struct irq_domain *d,
289289
return 0;
290290
}
291291

292-
static void stm32_gpio_domain_activate(struct irq_domain *d,
293-
struct irq_data *irq_data)
292+
static int stm32_gpio_domain_activate(struct irq_domain *d,
293+
struct irq_data *irq_data, bool early)
294294
{
295295
struct stm32_gpio_bank *bank = d->host_data;
296296
struct stm32_pinctrl *pctl = dev_get_drvdata(bank->gpio_chip.parent);
297297

298298
regmap_field_write(pctl->irqmux[irq_data->hwirq], bank->bank_nr);
299+
return 0;
299300
}
300301

301302
static int stm32_gpio_domain_alloc(struct irq_domain *d,

include/linux/irqdomain.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ struct irq_domain_ops {
111111
unsigned int nr_irqs, void *arg);
112112
void (*free)(struct irq_domain *d, unsigned int virq,
113113
unsigned int nr_irqs);
114-
void (*activate)(struct irq_domain *d, struct irq_data *irq_data);
114+
int (*activate)(struct irq_domain *d, struct irq_data *irqd, bool early);
115115
void (*deactivate)(struct irq_domain *d, struct irq_data *irq_data);
116116
int (*translate)(struct irq_domain *d, struct irq_fwspec *fwspec,
117117
unsigned long *out_hwirq, unsigned int *out_type);

kernel/irq/irqdomain.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1690,7 +1690,7 @@ static void __irq_domain_activate_irq(struct irq_data *irq_data)
16901690
if (irq_data->parent_data)
16911691
__irq_domain_activate_irq(irq_data->parent_data);
16921692
if (domain->ops->activate)
1693-
domain->ops->activate(domain, irq_data);
1693+
domain->ops->activate(domain, irq_data, false);
16941694
}
16951695
}
16961696

kernel/irq/msi.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,14 @@ int msi_domain_set_affinity(struct irq_data *irq_data,
102102
return ret;
103103
}
104104

105-
static void msi_domain_activate(struct irq_domain *domain,
106-
struct irq_data *irq_data)
105+
static int msi_domain_activate(struct irq_domain *domain,
106+
struct irq_data *irq_data, bool early)
107107
{
108108
struct msi_msg msg;
109109

110110
BUG_ON(irq_chip_compose_msi_msg(irq_data, &msg));
111111
irq_chip_write_msi_msg(irq_data, &msg);
112+
return 0;
112113
}
113114

114115
static void msi_domain_deactivate(struct irq_domain *domain,

0 commit comments

Comments
 (0)