mirror of
https://github.com/SerenityOS/serenity.git
synced 2026-11-07 04:29:30 -10:00
Kernel: Split out the IRQHandler from ACPI parser and move IRQ lookup
Splitting it off allows initializing the later than right after Parser creation, which allows us to move more resposibility to the Parser instead of mapping the FADT twice.
This commit is contained in:
1 parent
4ac5026d2c
commit
3a825ccec0
3 files changed
+40
-16
No files matched your search
@@ -28,10 +28,7 @@ UNMAP_AFTER_INIT ErrorOr<void> initialize()
|
||||
if (!facp.has_value())
|
||||
return ENOENT;
|
||||
|
||||
auto facp_table = TRY(Memory::map_typed<::ACPI::Structures::FADT>(facp.value()));
|
||||
InterruptNumber irq_line = facp_table->sci_int;
|
||||
|
||||
TRY(Parser::initialize(rsdp.value(), facp.value(), irq_line));
|
||||
TRY(Parser::initialize(rsdp.value(), facp.value()));
|
||||
|
||||
if (kernel_command_line().acpi_feature_level() == AcpiFeatureLevel::Enabled)
|
||||
Parser::the()->enable_aml_parsing();
|
||||
|
||||
@@ -34,7 +34,7 @@ Parser* Parser::the()
|
||||
return s_acpi_parser;
|
||||
}
|
||||
|
||||
ErrorOr<void> Parser::initialize(PhysicalAddress rsdp, PhysicalAddress fadt, InterruptNumber irq_number)
|
||||
ErrorOr<void> Parser::initialize(PhysicalAddress rsdp, PhysicalAddress fadt)
|
||||
{
|
||||
VERIFY(!s_acpi_parser);
|
||||
|
||||
@@ -44,7 +44,7 @@ ErrorOr<void> Parser::initialize(PhysicalAddress rsdp, PhysicalAddress fadt, Int
|
||||
s_acpi_parser = nullptr;
|
||||
};
|
||||
|
||||
s_acpi_parser = new (nothrow) Parser(rsdp, fadt, irq_number);
|
||||
s_acpi_parser = new (nothrow) Parser(rsdp, fadt);
|
||||
if (!s_acpi_parser)
|
||||
return ENOMEM;
|
||||
|
||||
@@ -164,7 +164,7 @@ UNMAP_AFTER_INIT Optional<PhysicalAddress> Parser::find_table(StringView signatu
|
||||
return {};
|
||||
}
|
||||
|
||||
bool Parser::handle_irq()
|
||||
bool Parser::handle_interrupt()
|
||||
{
|
||||
TODO();
|
||||
}
|
||||
@@ -217,6 +217,8 @@ UNMAP_AFTER_INIT ErrorOr<void> Parser::process_fadt_data()
|
||||
m_hardware_flags.wbinvd = (sdt->flags & (u32)::ACPI::FADTFlags::FeatureFlags::WBINVD);
|
||||
m_hardware_flags.wbinvd_flush = (sdt->flags & (u32)::ACPI::FADTFlags::FeatureFlags::WBINVD_FLUSH);
|
||||
|
||||
m_interrupt_handler = TRY(InterruptHandler::create(*this, sdt->sci_int));
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
@@ -421,9 +423,8 @@ UNMAP_AFTER_INIT ErrorOr<void> Parser::locate_main_system_description_table()
|
||||
return {};
|
||||
}
|
||||
|
||||
UNMAP_AFTER_INIT Parser::Parser(PhysicalAddress rsdp, PhysicalAddress fadt, InterruptNumber irq_number)
|
||||
: IRQHandler(irq_number)
|
||||
, m_rsdp(rsdp)
|
||||
UNMAP_AFTER_INIT Parser::Parser(PhysicalAddress rsdp, PhysicalAddress fadt)
|
||||
: m_rsdp(rsdp)
|
||||
, m_fadt(fadt)
|
||||
{
|
||||
dmesgln("ACPI: Using RSDP @ {}", rsdp);
|
||||
|
||||
@@ -48,14 +48,11 @@ protected:
|
||||
NonnullOwnPtr<KString> m_table_name;
|
||||
};
|
||||
|
||||
class Parser final : public IRQHandler {
|
||||
class Parser final {
|
||||
public:
|
||||
static Parser* the();
|
||||
|
||||
static ErrorOr<void> initialize(PhysicalAddress rsdp, PhysicalAddress fadt, InterruptNumber irq_number);
|
||||
|
||||
virtual StringView purpose() const override { return "ACPI Parser"sv; }
|
||||
virtual bool handle_irq() override;
|
||||
static ErrorOr<void> initialize(PhysicalAddress rsdp, PhysicalAddress fadt);
|
||||
|
||||
Optional<PhysicalAddress> find_table(StringView signature);
|
||||
|
||||
@@ -83,7 +80,34 @@ public:
|
||||
~Parser() = default;
|
||||
|
||||
private:
|
||||
Parser(PhysicalAddress rsdp, PhysicalAddress fadt, InterruptNumber irq_number);
|
||||
class InterruptHandler final : public IRQHandler {
|
||||
public:
|
||||
static ErrorOr<NonnullOwnPtr<InterruptHandler>> create(Parser& parser, InterruptNumber interrupt_number)
|
||||
{
|
||||
auto interrupt_handler = TRY(adopt_nonnull_own_or_enomem(new (nothrow) InterruptHandler(parser, interrupt_number)));
|
||||
// TODO: interrupt_handler->enable_irq();
|
||||
return interrupt_handler;
|
||||
}
|
||||
|
||||
private:
|
||||
InterruptHandler(Parser& parser, InterruptNumber interrupt_number)
|
||||
: IRQHandler(interrupt_number)
|
||||
, m_parser(parser)
|
||||
{
|
||||
}
|
||||
|
||||
virtual StringView purpose() const override { return "ACPI Parser Handler"sv; }
|
||||
virtual bool handle_irq() override
|
||||
{
|
||||
return m_parser.handle_interrupt();
|
||||
}
|
||||
|
||||
Parser& m_parser;
|
||||
};
|
||||
|
||||
Parser(PhysicalAddress rsdp, PhysicalAddress fadt);
|
||||
|
||||
bool handle_interrupt();
|
||||
|
||||
ErrorOr<void> locate_static_data();
|
||||
ErrorOr<void> locate_main_system_description_table();
|
||||
@@ -95,6 +119,8 @@ private:
|
||||
bool validate_reset_register(Memory::TypedMapping<::ACPI::Structures::FADT> const&);
|
||||
ErrorOr<void> access_generic_address(::ACPI::Structures::GenericAddressStructure const&, u32 value);
|
||||
|
||||
OwnPtr<InterruptHandler> m_interrupt_handler;
|
||||
|
||||
PhysicalAddress m_rsdp;
|
||||
PhysicalAddress m_main_system_description_table;
|
||||
|
||||
|
||||
Reference in new issue
Block a user