aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@openbsd.org>2022-04-19 21:20:31 +0200
committerTom Rini <trini@konsulko.com>2022-04-22 15:56:39 -0400
commita609353e82fd757b7635d18ed6a0828fff657d59 (patch)
tree264c39d01f071f308b3b7f8bc88b20cb09681653
parent4a8d07114e4b5e18469d9cfc3c27a3fada9c22dd (diff)
downloadu-boot-a609353e82fd757b7635d18ed6a0828fff657d59.zip
u-boot-a609353e82fd757b7635d18ed6a0828fff657d59.tar.gz
u-boot-a609353e82fd757b7635d18ed6a0828fff657d59.tar.bz2
arm: apple: Point stdout-path to framebuffer when keyboard presentWIP/2022-04-22-assorted-updates
Unless you have a spare Apple Silicon machine, getting access to the serial port on Apple Silicon machines requires special hardware. Given that most machines come with a built-in screen the framebuffer is likely to be the most convenient output device for most users. While U-Boot will output to both serial and framebuffer, OSes might not. Therefore set stdout-path to point at /chosen/framebuffer when a keyboard is connected to the machine. This behaviour can be overridden by setting the "stdout" variable in the U-Boot environment. I addition to that keep the serial console as the default when running under the m1n1 hypervisor. The m1n1 hypervisor virtualizes the serial port such that it can be easily accessed from any other machine with a USB port. Signed-off-by: Mark Kettenis <kettenis@openbsd.org> Reviewed-by: Janne Grunau <j@jannau.net> Tested-by: Janne Grunau <j@jannau.net>
-rw-r--r--arch/arm/Kconfig1
-rw-r--r--arch/arm/mach-apple/board.c40
2 files changed, 41 insertions, 0 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 3243bd0..57946f6 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1021,6 +1021,7 @@ config ARCH_APPLE
select DM_VIDEO
select IOMMU
select LINUX_KERNEL_IMAGE_HEADER
+ select OF_BOARD_SETUP
select OF_CONTROL
select PINCTRL
select POSITION_INDEPENDENT
diff --git a/arch/arm/mach-apple/board.c b/arch/arm/mach-apple/board.c
index ffc1301..1525a9e 100644
--- a/arch/arm/mach-apple/board.c
+++ b/arch/arm/mach-apple/board.c
@@ -5,6 +5,7 @@
#include <common.h>
#include <dm.h>
+#include <dm/uclass-internal.h>
#include <efi_loader.h>
#include <lmb.h>
@@ -461,3 +462,42 @@ int board_late_init(void)
return 0;
}
+
+int ft_board_setup(void *blob, struct bd_info *bd)
+{
+ struct udevice *dev;
+ const char *stdoutname;
+ int node, ret;
+
+ /*
+ * Modify the "stdout-path" property under "/chosen" to point
+ * at "/chosen/framebuffer if a keyboard is available and
+ * we're not running under the m1n1 hypervisor.
+ * Developers can override this behaviour by dropping
+ * "vidconsole" from the "stdout" environment variable.
+ */
+
+ /* EL1 means we're running under the m1n1 hypervisor. */
+ if (current_el() == 1)
+ return 0;
+
+ ret = uclass_find_device(UCLASS_KEYBOARD, 0, &dev);
+ if (ret < 0)
+ return 0;
+
+ stdoutname = env_get("stdout");
+ if (!stdoutname || !strstr(stdoutname, "vidconsole"))
+ return 0;
+
+ /* Make sure we actually have a framebuffer. */
+ node = fdt_path_offset(blob, "/chosen/framebuffer");
+ if (node < 0 || !fdtdec_get_is_enabled(blob, node))
+ return 0;
+
+ node = fdt_path_offset(blob, "/chosen");
+ if (node < 0)
+ return 0;
+ fdt_setprop_string(blob, node, "stdout-path", "/chosen/framebuffer");
+
+ return 0;
+}