mirror of
https://github.com/apache/nuttx.git
synced 2026-06-02 01:21:26 +08:00
arch/x86_64/intel64: up_disable_irq should work from any CPU
simplify interrupt logic and allow any CPU to disable interrupt, not only CPU that enabled it. Signed-off-by: p-szafonimateusz <p-szafonimateusz@xiaomi.com>
This commit is contained in:
committed by
Xiang Xiao
parent
ef313755e7
commit
894b0f956b
@@ -165,8 +165,10 @@ void x86_64_ap_boot(void)
|
|||||||
|
|
||||||
irq_attach(SMP_IPI_CALL_IRQ, x86_64_smp_call_handler, NULL);
|
irq_attach(SMP_IPI_CALL_IRQ, x86_64_smp_call_handler, NULL);
|
||||||
irq_attach(SMP_IPI_SCHED_IRQ, x86_64_smp_sched_handler, NULL);
|
irq_attach(SMP_IPI_SCHED_IRQ, x86_64_smp_sched_handler, NULL);
|
||||||
up_enable_irq(SMP_IPI_CALL_IRQ);
|
|
||||||
up_enable_irq(SMP_IPI_SCHED_IRQ);
|
/* NOTE: IPC interrupts don't use IOAPIC but interrupts are sent
|
||||||
|
* directly to CPU, so we don't use up_enable_irq() API here.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef CONFIG_STACK_COLORATION
|
#ifdef CONFIG_STACK_COLORATION
|
||||||
/* If stack debug is enabled, then fill the stack with a
|
/* If stack debug is enabled, then fill the stack with a
|
||||||
|
|||||||
@@ -56,8 +56,8 @@
|
|||||||
|
|
||||||
struct intel64_irq_priv_s
|
struct intel64_irq_priv_s
|
||||||
{
|
{
|
||||||
cpu_set_t busy;
|
bool busy;
|
||||||
bool msi;
|
bool msi;
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -512,12 +512,7 @@ void up_disable_irq(int irq)
|
|||||||
#ifndef CONFIG_ARCH_INTEL64_DISABLE_INT_INIT
|
#ifndef CONFIG_ARCH_INTEL64_DISABLE_INT_INIT
|
||||||
irqstate_t flags = spin_lock_irqsave(&g_irq_spinlock);
|
irqstate_t flags = spin_lock_irqsave(&g_irq_spinlock);
|
||||||
|
|
||||||
if (irq > IRQ255)
|
DEBUGASSERT(irq <= IRQ255);
|
||||||
{
|
|
||||||
/* Not supported yet */
|
|
||||||
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do nothing if this is MSI/MSI-X */
|
/* Do nothing if this is MSI/MSI-X */
|
||||||
|
|
||||||
@@ -527,9 +522,7 @@ void up_disable_irq(int irq)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CPU_CLR(this_cpu(), &g_irq_priv[irq].busy);
|
if (g_irq_priv[irq].busy)
|
||||||
|
|
||||||
if (CPU_COUNT(&g_irq_priv[irq].busy) == 0)
|
|
||||||
{
|
{
|
||||||
/* One time disable */
|
/* One time disable */
|
||||||
|
|
||||||
@@ -537,6 +530,8 @@ void up_disable_irq(int irq)
|
|||||||
{
|
{
|
||||||
up_ioapic_mask_pin(irq - IRQ0);
|
up_ioapic_mask_pin(irq - IRQ0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_irq_priv[irq].busy = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(&g_irq_spinlock, flags);
|
spin_unlock_irqrestore(&g_irq_spinlock, flags);
|
||||||
@@ -556,14 +551,7 @@ void up_enable_irq(int irq)
|
|||||||
#ifndef CONFIG_ARCH_INTEL64_DISABLE_INT_INIT
|
#ifndef CONFIG_ARCH_INTEL64_DISABLE_INT_INIT
|
||||||
irqstate_t flags = spin_lock_irqsave(&g_irq_spinlock);
|
irqstate_t flags = spin_lock_irqsave(&g_irq_spinlock);
|
||||||
|
|
||||||
# ifndef CONFIG_IRQCHAIN
|
DEBUGASSERT(irq <= IRQ255);
|
||||||
/* Check if IRQ is free if we don't support IRQ chains */
|
|
||||||
|
|
||||||
if (CPU_ISSET(this_cpu(), &g_irq_priv[irq].busy))
|
|
||||||
{
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
/* Do nothing if this is MSI/MSI-X */
|
/* Do nothing if this is MSI/MSI-X */
|
||||||
|
|
||||||
@@ -573,14 +561,16 @@ void up_enable_irq(int irq)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (irq > IRQ255)
|
# ifndef CONFIG_IRQCHAIN
|
||||||
{
|
/* Check if IRQ is free if we don't support IRQ chains */
|
||||||
/* Not supported yet */
|
|
||||||
|
|
||||||
|
if (g_irq_priv[irq].busy)
|
||||||
|
{
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
if (CPU_COUNT(&g_irq_priv[irq].busy) == 0)
|
if (!g_irq_priv[irq].busy)
|
||||||
{
|
{
|
||||||
/* One time enable */
|
/* One time enable */
|
||||||
|
|
||||||
@@ -588,9 +578,9 @@ void up_enable_irq(int irq)
|
|||||||
{
|
{
|
||||||
up_ioapic_unmask_pin(irq - IRQ0);
|
up_ioapic_unmask_pin(irq - IRQ0);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
CPU_SET(this_cpu(), &g_irq_priv[irq].busy);
|
g_irq_priv[irq].busy = true;
|
||||||
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(&g_irq_spinlock, flags);
|
spin_unlock_irqrestore(&g_irq_spinlock, flags);
|
||||||
#endif
|
#endif
|
||||||
@@ -693,8 +683,9 @@ int up_alloc_irq_msi(uint8_t busno, uint32_t devfn, int *pirq, int num)
|
|||||||
|
|
||||||
for (i = 0; i < num; i++)
|
for (i = 0; i < num; i++)
|
||||||
{
|
{
|
||||||
ASSERT(CPU_COUNT(&g_irq_priv[irq + i].busy) == 0);
|
ASSERT(g_irq_priv[irq + i].busy == false);
|
||||||
g_irq_priv[irq + i].msi = true;
|
g_irq_priv[irq + i].busy = true;
|
||||||
|
g_irq_priv[irq + i].msi = true;
|
||||||
pirq[i] = irq + i;
|
pirq[i] = irq + i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -720,7 +711,8 @@ void up_release_irq_msi(int *irq, int num)
|
|||||||
|
|
||||||
for (i = 0; i < num; i++)
|
for (i = 0; i < num; i++)
|
||||||
{
|
{
|
||||||
g_irq_priv[irq[i]].msi = false;
|
g_irq_priv[irq[i]].busy = false;
|
||||||
|
g_irq_priv[irq[i]].msi = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(&g_irq_spinlock, flags);
|
spin_unlock_irqrestore(&g_irq_spinlock, flags);
|
||||||
|
|||||||
Reference in New Issue
Block a user