Instead of requiring exactly one serial device and assuming ttyS0, extract the COM port index from the ACPI device path and use the uart I/O port address format for the console= kernel argument. On x86, the ACPI UID for PNP0501 (16550 UART) maps directly to the COM port number: UID 0 = COM1 (0x3F8), UID 1 = COM2 (0x2F8), etc. The I/O port addresses are fixed in the kernel (see arch/x86/include/asm/serial.h). Using the console=uart,io,<addr> format (see Documentation/admin-guide/kernel-parameters.txt) addresses the UART by I/O port directly rather than relying on ttyS naming, and also provides early console output before the full serial driver loads. Restrict the entire serial console auto-detection to x86. On non-x86 (e.g. ARM with PL011 UARTs), displays may be available without GOP (e.g. simple-framebuffer via device tree), serial device indices are assigned dynamically during probe rather than being fixed to I/O port addresses, and the kernel has its own console auto-detection via DT stdout-path. When ConOut has no device path (ConSplitter), all text output handles are enumerated. If multiple handles have PNP0501 UART nodes with different UIDs, bail out rather than guessing. Add ACPI_DP device path subtype, ACPI_HID_DEVICE_PATH struct, and EISA_PNP_ID() macro to device-path.h for parsing ACPI device path nodes. Remove MSG_UART_DP, device_path_has_uart(), count_serial_devices() and proto/serial-io.h (no longer needed). Move all the console logic to console.c as well.
40 lines
1.7 KiB
C
40 lines
1.7 KiB
C
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
#pragma once
|
|
|
|
#include "efi.h"
|
|
#include "proto/simple-text-io.h"
|
|
|
|
enum {
|
|
EFI_SHIFT_PRESSED = EFI_RIGHT_SHIFT_PRESSED|EFI_LEFT_SHIFT_PRESSED,
|
|
EFI_CONTROL_PRESSED = EFI_RIGHT_CONTROL_PRESSED|EFI_LEFT_CONTROL_PRESSED,
|
|
EFI_ALT_PRESSED = EFI_RIGHT_ALT_PRESSED|EFI_LEFT_ALT_PRESSED,
|
|
EFI_LOGO_PRESSED = EFI_RIGHT_LOGO_PRESSED|EFI_LEFT_LOGO_PRESSED,
|
|
};
|
|
|
|
#define KEYPRESS(keys, scan, uni) ((((uint64_t)keys) << 32) | (((uint64_t)scan) << 16) | (uni))
|
|
#define KEYCHAR(k) ((char16_t)(k))
|
|
#define CHAR_CTRL(c) ((c) - 'a' + 1)
|
|
|
|
enum {
|
|
/* Console mode is a int32_t in EFI. We use int64_t to make room for our special values. */
|
|
CONSOLE_MODE_RANGE_MIN = 0,
|
|
CONSOLE_MODE_RANGE_MAX = INT32_MAX, /* This is just the theoretical limit. */
|
|
CONSOLE_MODE_INVALID = -1, /* UEFI uses -1 if the device is not in a valid text mode. */
|
|
|
|
CONSOLE_MODE_80_25 = 0, /* 80x25 is required by UEFI spec. */
|
|
CONSOLE_MODE_80_50 = 1, /* 80x50 may be supported. */
|
|
CONSOLE_MODE_FIRMWARE_FIRST = 2, /* First custom mode, if supported. */
|
|
|
|
/* These are our own mode values that map to concrete values at runtime. */
|
|
CONSOLE_MODE_KEEP = CONSOLE_MODE_RANGE_MAX + 1LL,
|
|
CONSOLE_MODE_NEXT,
|
|
CONSOLE_MODE_AUTO,
|
|
CONSOLE_MODE_FIRMWARE_MAX, /* 'max' in config. */
|
|
};
|
|
|
|
EFI_STATUS console_key_read(uint64_t *ret_key, uint64_t timeout_usec);
|
|
EFI_STATUS console_set_mode(int64_t mode);
|
|
EFI_STATUS console_query_mode(size_t *x_max, size_t *y_max);
|
|
EFI_STATUS query_screen_resolution(uint32_t *ret_width, uint32_t *ret_height);
|
|
void cmdline_append_console(char16_t **cmdline);
|