1
0
Fork 0
mirror of https://github.com/CTCaer/hekate.git synced 2024-11-22 18:06:40 +00:00

bdk: irq: remove ack source

HW interrupts can't be managed by FIR.
Only actual hw can clear the interrupt.
This commit is contained in:
CTCaer 2024-06-02 07:46:18 +03:00
parent 05db43a97c
commit b01cc2432f

View file

@ -1,7 +1,7 @@
/* /*
* BPMP-Lite IRQ driver for Tegra X1 * BPMP-Lite IRQ driver for Tegra X1
* *
* Copyright (c) 2019 CTCaer * Copyright (c) 2019-2024 CTCaer
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
@ -71,19 +71,9 @@ static void _irq_disable_and_ack_all()
{ {
u32 enabled_irqs = ICTLR(ctrl_idx, PRI_ICTLR_COP_IER); u32 enabled_irqs = ICTLR(ctrl_idx, PRI_ICTLR_COP_IER);
ICTLR(ctrl_idx, PRI_ICTLR_COP_IER_CLR) = enabled_irqs; ICTLR(ctrl_idx, PRI_ICTLR_COP_IER_CLR) = enabled_irqs;
ICTLR(ctrl_idx, PRI_ICTLR_FIR_CLR) = enabled_irqs;
} }
} }
static void _irq_ack_source(u32 irq)
{
u32 ctrl_idx = irq >> 5;
u32 bit = irq % 32;
// Force stop the interrupt as it's serviced here.
ICTLR(ctrl_idx, PRI_ICTLR_FIR_CLR) = BIT(bit);
}
void irq_free(u32 irq) void irq_free(u32 irq)
{ {
for (u32 idx = 0; idx < IRQ_MAX_HANDLERS; idx++) for (u32 idx = 0; idx < IRQ_MAX_HANDLERS; idx++)
@ -121,7 +111,6 @@ static irq_status_t _irq_handle_source(u32 irq)
int status = IRQ_NONE; int status = IRQ_NONE;
_irq_disable_source(irq); _irq_disable_source(irq);
_irq_ack_source(irq);
u32 idx; u32 idx;
for (idx = 0; idx < IRQ_MAX_HANDLERS; idx++) for (idx = 0; idx < IRQ_MAX_HANDLERS; idx++)
@ -155,7 +144,6 @@ void irq_handler()
if (!irq_init_done) if (!irq_init_done)
{ {
_irq_disable_source(irq); _irq_disable_source(irq);
_irq_ack_source(irq);
return; return;
} }
@ -197,7 +185,6 @@ void irq_wait_event(u32 irq)
FLOW_CTLR(FLOW_CTLR_HALT_COP_EVENTS) = HALT_MODE_STOP_UNTIL_IRQ; FLOW_CTLR(FLOW_CTLR_HALT_COP_EVENTS) = HALT_MODE_STOP_UNTIL_IRQ;
_irq_disable_source(irq); _irq_disable_source(irq);
_irq_ack_source(irq);
irq_enable_cpu_irq_exceptions(); irq_enable_cpu_irq_exceptions();
} }