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:
Liav A 2023-04-13 11:06:52 +03:00 committed by Andrew Kaster
parent c8f27d7cb8
commit 475ef6965a
4 changed files with 17 additions and 1 deletions

View file

@ -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`**

View file

@ -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);

View file

@ -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;

View file

@ -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);