Skip to content

Commit 63adf81

Browse files
committed
ioapic: extend interface for flexibility and irq masking
- We need a configure_irq because SCI has special polarity and trigger mode - We need mask_irq to implement ACPICA handler removal Signed-off-by: Sandro Rüegge <[email protected]>
1 parent af41ef9 commit 63adf81

File tree

2 files changed

+39
-4
lines changed

2 files changed

+39
-4
lines changed

arch/x86/ioapic.c

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,12 +275,11 @@ static ioapic_t *find_ioapic_for_irq(uint32_t irq_src) {
275275
return NULL;
276276
}
277277

278-
void configure_isa_irq(unsigned irq_src, uint8_t vector, ioapic_dest_mode_t dst_mode,
279-
uint8_t dst_ids) {
278+
void configure_irq(unsigned irq_src, uint8_t vector, ioapic_dest_mode_t dst_mode,
279+
uint8_t dst_ids, ioapic_polarity_t polarity,
280+
ioapic_trigger_mode_t trigger_mode) {
280281
irq_override_t *irq_override = get_system_isa_bus_irq(IOAPIC_IRQ_TYPE_INT, irq_src);
281282
ioapic_redirtbl_entry_t entry;
282-
ioapic_polarity_t polarity = IOAPIC_POLARITY_AH;
283-
ioapic_trigger_mode_t trigger_mode = IOAPIC_TRIGGER_MODE_EDGE;
284283
ioapic_t *ioapic;
285284

286285
if (irq_override) {
@@ -293,9 +292,13 @@ void configure_isa_irq(unsigned irq_src, uint8_t vector, ioapic_dest_mode_t dst_
293292

294293
if (irq_override->polarity == IOAPIC_IRQ_OVR_POLARITY_AL)
295294
polarity = IOAPIC_POLARITY_AL;
295+
else if (irq_override->polarity == IOAPIC_IRQ_OVR_POLARITY_AH)
296+
polarity = IOAPIC_POLARITY_AH;
296297

297298
if (irq_override->trigger_mode == IOAPIC_IRQ_OVR_TRIGGER_LT)
298299
trigger_mode = IOAPIC_TRIGGER_MODE_LEVEL;
300+
else if (irq_override->trigger_mode == IOAPIC_IRQ_OVR_TRIGGER_ET)
301+
trigger_mode = IOAPIC_TRIGGER_MODE_EDGE;
299302
}
300303
else {
301304
ioapic = find_ioapic_for_irq(irq_src);
@@ -311,3 +314,31 @@ void configure_isa_irq(unsigned irq_src, uint8_t vector, ioapic_dest_mode_t dst_
311314
entry.int_mask = IOAPIC_INT_UNMASK;
312315
set_ioapic_redirtbl_entry(ioapic, irq_src, &entry);
313316
}
317+
318+
void configure_isa_irq(unsigned irq_src, uint8_t vector, ioapic_dest_mode_t dst_mode,
319+
uint8_t dst_ids) {
320+
configure_irq(irq_src, vector, dst_mode, dst_ids, IOAPIC_POLARITY_AH,
321+
IOAPIC_TRIGGER_MODE_EDGE);
322+
}
323+
324+
void mask_irq(unsigned irq_src) {
325+
irq_override_t *irq_override = get_system_isa_bus_irq(IOAPIC_IRQ_TYPE_INT, irq_src);
326+
ioapic_redirtbl_entry_t entry;
327+
ioapic_t *ioapic;
328+
329+
if (irq_override) {
330+
irq_src = irq_override->dst;
331+
332+
if (irq_override->dst_id == IOAPIC_DEST_ID_UNKNOWN)
333+
ioapic = find_ioapic_for_irq(irq_src);
334+
else
335+
ioapic = get_ioapic(irq_override->dst_id);
336+
}
337+
else {
338+
ioapic = find_ioapic_for_irq(irq_src);
339+
}
340+
341+
get_ioapic_redirtbl_entry(ioapic, irq_src, &entry);
342+
entry.int_mask = IOAPIC_INT_MASK;
343+
set_ioapic_redirtbl_entry(ioapic, irq_src, &entry);
344+
}

include/arch/x86/ioapic.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,12 @@ extern int get_ioapic_redirtbl_entry(ioapic_t *ioapic, unsigned n,
216216
extern int set_ioapic_redirtbl_entry(ioapic_t *ioapic, unsigned n,
217217
ioapic_redirtbl_entry_t *entry);
218218
extern void set_ioapic_irq_mask(ioapic_t *ioapic, unsigned irq, ioapic_int_mask_t mask);
219+
extern void configure_irq(unsigned irq_src, uint8_t vector, ioapic_dest_mode_t dst_mode,
220+
uint8_t dst_ids, ioapic_polarity_t polarity,
221+
ioapic_trigger_mode_t trigger_mode);
219222
extern void configure_isa_irq(unsigned irq_src, uint8_t vector,
220223
ioapic_dest_mode_t dst_mode, uint8_t dst_ids);
224+
extern void mask_irq(unsigned irq_src);
221225

222226
/* Static declarations */
223227

0 commit comments

Comments
 (0)