mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 00:27:45 +00:00
Kernel: Allow to reboot in ACPI via PCI or MMIO access
Also, we determine if ACPI reboot is supported by checking the FADT flags' field.
This commit is contained in:
parent
8639ee2640
commit
0f45a1b5e7
9 changed files with 183 additions and 25 deletions
|
@ -107,11 +107,30 @@ void PCI::Access::disable_bus_mastering(Address address)
|
|||
}
|
||||
|
||||
namespace PCI {
|
||||
|
||||
void enumerate_all(Function<void(Address, ID)> callback)
|
||||
{
|
||||
PCI::Access::the().enumerate_all(callback);
|
||||
}
|
||||
|
||||
void raw_access(Address address, u32 field, size_t access_size, u32 value)
|
||||
{
|
||||
ASSERT(access_size != 0);
|
||||
if (access_size == 1) {
|
||||
PCI::Access::the().write8_field(address, field, value);
|
||||
return;
|
||||
}
|
||||
if (access_size == 2) {
|
||||
PCI::Access::the().write16_field(address, field, value);
|
||||
return;
|
||||
}
|
||||
if (access_size == 4) {
|
||||
PCI::Access::the().write32_field(address, field, value);
|
||||
return;
|
||||
}
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
ID get_id(Address address)
|
||||
{
|
||||
return PCI::Access::the().get_id(address);
|
||||
|
|
|
@ -85,16 +85,16 @@ public:
|
|||
virtual uint8_t get_segment_end_bus(u32 segment) = 0;
|
||||
virtual String get_access_type() = 0;
|
||||
|
||||
virtual void write8_field(Address address, u32 field, u8 value) = 0;
|
||||
virtual void write16_field(Address address, u32 field, u16 value) = 0;
|
||||
virtual void write32_field(Address address, u32 field, u32 value) = 0;
|
||||
|
||||
protected:
|
||||
Access();
|
||||
|
||||
virtual u8 read8_field(Address address, u32 field) = 0;
|
||||
virtual u16 read16_field(Address address, u32 field) = 0;
|
||||
virtual u32 read32_field(Address address, u32 field) = 0;
|
||||
|
||||
virtual void write8_field(Address address, u32 field, u8 value) = 0;
|
||||
virtual void write16_field(Address address, u32 field, u16 value) = 0;
|
||||
virtual void write32_field(Address address, u32 field, u32 value) = 0;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -174,6 +174,7 @@ namespace PCI {
|
|||
void enable_interrupt_line(Address);
|
||||
void disable_interrupt_line(Address);
|
||||
u8 get_interrupt_line(Address);
|
||||
void raw_access(Address, u32, size_t, u32);
|
||||
u32 get_BAR0(Address);
|
||||
u32 get_BAR1(Address);
|
||||
u32 get_BAR2(Address);
|
||||
|
|
|
@ -37,6 +37,10 @@ public:
|
|||
virtual String get_access_type() override final { return "IO-Access"; };
|
||||
virtual uint32_t get_segments_count() { return 1; };
|
||||
|
||||
virtual void write8_field(Address address, u32, u8) override final;
|
||||
virtual void write16_field(Address address, u32, u16) override final;
|
||||
virtual void write32_field(Address address, u32, u32) override final;
|
||||
|
||||
protected:
|
||||
IOAccess();
|
||||
|
||||
|
@ -44,13 +48,9 @@ private:
|
|||
virtual u8 read8_field(Address address, u32) override final;
|
||||
virtual u16 read16_field(Address address, u32) override final;
|
||||
virtual u32 read32_field(Address address, u32) override final;
|
||||
virtual void write8_field(Address address, u32, u8) override final;
|
||||
virtual void write16_field(Address address, u32, u16) override final;
|
||||
virtual void write32_field(Address address, u32, u32) override final;
|
||||
|
||||
virtual uint8_t get_segment_start_bus(u32) { return 0x0; };
|
||||
virtual uint8_t get_segment_end_bus(u32) { return 0xFF; };
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -45,6 +45,10 @@ public:
|
|||
virtual String get_access_type() override final { return "MMIO-Access"; };
|
||||
virtual u32 get_segments_count();
|
||||
|
||||
virtual void write8_field(Address address, u32, u8) override final;
|
||||
virtual void write16_field(Address address, u32, u16) override final;
|
||||
virtual void write32_field(Address address, u32, u32) override final;
|
||||
|
||||
protected:
|
||||
explicit MMIOAccess(PhysicalAddress mcfg);
|
||||
|
||||
|
@ -52,9 +56,6 @@ private:
|
|||
virtual u8 read8_field(Address address, u32) override final;
|
||||
virtual u16 read16_field(Address address, u32) override final;
|
||||
virtual u32 read32_field(Address address, u32) override final;
|
||||
virtual void write8_field(Address address, u32, u8) override final;
|
||||
virtual void write16_field(Address address, u32, u16) override final;
|
||||
virtual void write32_field(Address address, u32, u32) override final;
|
||||
|
||||
void map_device(Address address);
|
||||
virtual u8 get_segment_start_bus(u32);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue