mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 06:04:57 +00:00
Kernel: Add boot parameter to determine i8042 first port translation
This can be used mainly for bare metal hardware, if the user experiences problems with output from the PS2 keyboard.
This commit is contained in:
parent
c8f27d7cb8
commit
475ef6965a
4 changed files with 17 additions and 1 deletions
|
@ -67,6 +67,10 @@ has set up before booting the Kernel, don't initialize any driver.
|
|||
**`none`** - Assume there's no i8042 controller in the system.
|
||||
**`force`** - Assume there's i8042 controller in the system.
|
||||
|
||||
* **`i8042_first_port_translation`** - This parameter expects **`on`** or **`off`** and is by default set to **`off`**.
|
||||
When set to **`off`**, the kernel will not enable first PS2 port translation.
|
||||
When set to **`on`**, the kernel will enable first PS2 port translation.
|
||||
|
||||
* **`panic`** - This parameter expects **`halt`** or **`shutdown`**. This is particularly useful in CI contexts.
|
||||
|
||||
* **`pci`** - This parameter expects **`ecam`**, **`io`** or **`none`**. When selecting **`none`**
|
||||
|
|
|
@ -131,6 +131,16 @@ UNMAP_AFTER_INIT bool CommandLine::is_early_boot_console_disabled() const
|
|||
PANIC("Unknown early_boot_console setting: {}", value);
|
||||
}
|
||||
|
||||
UNMAP_AFTER_INIT bool CommandLine::i8042_enable_first_port_translation() const
|
||||
{
|
||||
auto value = lookup("i8042_first_port_translation"sv).value_or("off"sv);
|
||||
if (value == "off"sv)
|
||||
return false;
|
||||
if (value == "on"sv)
|
||||
return true;
|
||||
PANIC("Unknown i8042_enable_first_port_translation setting: {}", value);
|
||||
}
|
||||
|
||||
UNMAP_AFTER_INIT I8042PresenceMode CommandLine::i8042_presence_mode() const
|
||||
{
|
||||
auto value = lookup("i8042_presence_mode"sv).value_or("auto"sv);
|
||||
|
|
|
@ -82,6 +82,7 @@ public:
|
|||
[[nodiscard]] bool is_pci_disabled() const;
|
||||
[[nodiscard]] bool is_legacy_time_enabled() const;
|
||||
[[nodiscard]] bool is_pc_speaker_enabled() const;
|
||||
[[nodiscard]] bool i8042_enable_first_port_translation() const;
|
||||
[[nodiscard]] GraphicsSubsystemMode graphics_subsystem_mode() const;
|
||||
[[nodiscard]] I8042PresenceMode i8042_presence_mode() const;
|
||||
[[nodiscard]] bool is_force_pio() const;
|
||||
|
|
|
@ -167,7 +167,8 @@ UNMAP_AFTER_INIT ErrorOr<void> HIDManagement::enumerate()
|
|||
// Note: If we happen to not have i8042 just return "gracefully" for now.
|
||||
if (!has_i8042_controller)
|
||||
return {};
|
||||
if (auto result_or_error = i8042_controller->detect_devices(I8042Controller::EnableKeyboardFirstPortTranslation::No); result_or_error.is_error())
|
||||
auto i8042_enable_first_port_translation = kernel_command_line().i8042_enable_first_port_translation() ? I8042Controller::EnableKeyboardFirstPortTranslation::Yes : I8042Controller::EnableKeyboardFirstPortTranslation::No;
|
||||
if (auto result_or_error = i8042_controller->detect_devices(i8042_enable_first_port_translation); result_or_error.is_error())
|
||||
return {};
|
||||
m_hid_serial_io_controllers.with([&](auto& list) {
|
||||
list.append(i8042_controller);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue