2023-01-23 20:13:57 +02:00
|
|
|
#include <BAN/Errors.h>
|
|
|
|
#include <kernel/InterruptController.h>
|
|
|
|
#include <kernel/APIC.h>
|
|
|
|
#include <kernel/PIC.h>
|
|
|
|
|
2023-09-28 12:30:27 +03:00
|
|
|
#include <lai/helpers/sci.h>
|
|
|
|
|
2023-10-05 18:53:45 +03:00
|
|
|
namespace Kernel
|
2023-01-23 20:13:57 +02:00
|
|
|
{
|
|
|
|
|
2023-10-05 18:53:45 +03:00
|
|
|
static InterruptController* s_instance = nullptr;
|
|
|
|
|
|
|
|
InterruptController& InterruptController::get()
|
|
|
|
{
|
|
|
|
ASSERT(s_instance);
|
|
|
|
return *s_instance;
|
|
|
|
}
|
2023-01-23 20:13:57 +02:00
|
|
|
|
2023-10-05 18:53:45 +03:00
|
|
|
void InterruptController::initialize(bool force_pic)
|
2023-09-28 12:30:27 +03:00
|
|
|
{
|
2023-10-05 18:53:45 +03:00
|
|
|
ASSERT(s_instance == nullptr);
|
|
|
|
|
|
|
|
PIC::mask_all();
|
|
|
|
PIC::remap();
|
|
|
|
|
|
|
|
if (!force_pic)
|
2023-09-28 12:30:27 +03:00
|
|
|
{
|
2023-10-05 18:53:45 +03:00
|
|
|
s_instance = APIC::create();
|
|
|
|
if (s_instance)
|
|
|
|
{
|
|
|
|
s_instance->m_using_apic = true;
|
|
|
|
return;
|
|
|
|
}
|
2023-09-28 12:30:27 +03:00
|
|
|
}
|
|
|
|
|
2023-10-05 18:53:45 +03:00
|
|
|
dprintln("Using PIC instead of APIC");
|
|
|
|
s_instance = PIC::create();
|
|
|
|
ASSERT(s_instance);
|
2023-09-28 12:30:27 +03:00
|
|
|
|
2023-10-05 18:53:45 +03:00
|
|
|
s_instance->m_using_apic = false;
|
|
|
|
}
|
2023-09-28 12:30:27 +03:00
|
|
|
|
2023-10-05 18:53:45 +03:00
|
|
|
void InterruptController::enter_acpi_mode()
|
|
|
|
{
|
2024-03-22 13:32:07 +02:00
|
|
|
#if ARCH(x86_64)
|
2023-10-05 18:53:45 +03:00
|
|
|
if (lai_enable_acpi(m_using_apic ? 1 : 0) != 0)
|
2024-03-22 13:32:07 +02:00
|
|
|
#endif
|
2023-10-05 18:53:45 +03:00
|
|
|
dwarnln("could not enter acpi mode");
|
|
|
|
}
|
|
|
|
|
2023-09-28 12:30:27 +03:00
|
|
|
}
|