diff mbox

[2/6] discover: Add petitboot,tty and track available consoles

Message ID 20160608062812.14480-3-sam@mendozajonas.com
State Accepted
Headers show

Commit Message

samjonas June 8, 2016, 6:28 a.m. UTC
Add the NVRAM parameter petitboot,tty which sets the default console to
use when booting a kernel.
In load_config() construct a list of available consoles depending on the
current platform. A future patch depending on firmware changes will
allow this list to be constructed dynamically.

Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
---
 discover/platform-powerpc.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 discover/platform.c         | 10 ++++++++++
 2 files changed, 53 insertions(+)
diff mbox

Patch

diff --git a/discover/platform-powerpc.c b/discover/platform-powerpc.c
index 1961304..3956a7e 100644
--- a/discover/platform-powerpc.c
+++ b/discover/platform-powerpc.c
@@ -59,6 +59,7 @@  static const char *known_params[] = {
 	"petitboot,debug?",
 	"petitboot,write?",
 	"petitboot,snapshots?",
+	"petitboot,tty",
 	NULL,
 };
 
@@ -565,6 +566,10 @@  static void populate_config(struct platform_powerpc *platform,
 	val = get_param(platform, "petitboot,snapshots?");
 	if (val)
 		config->disable_snapshots = !strcmp(val, "false");
+
+	val = get_param(platform, "petitboot,tty");
+	if (val)
+		config->boot_tty = talloc_strdup(config, val);
 }
 
 static char *iface_config_str(void *ctx, struct interface_config *config)
@@ -732,6 +737,9 @@  static int update_config(struct platform_powerpc *platform,
 		val = config->allow_writes ? "true" : "false";
 	update_string_config(platform, "petitboot,write?", val);
 
+	val = config->boot_tty ?: "";
+	update_string_config(platform, "petitboot,tty", val);
+
 	update_network_config(platform, config);
 
 	update_bootdev_config(platform, config);
@@ -1217,6 +1225,39 @@  static void get_ipmi_network_override(struct platform_powerpc *platform,
 	}
 }
 
+static void get_active_consoles(struct config *config)
+{
+	struct stat sbuf;
+	char *fsp_prop = NULL;
+
+	config->n_tty = 2;
+	config->tty_list = talloc_array(config, char *, config->n_tty);
+	if (!config->tty_list)
+		goto err;
+
+	config->tty_list[0] = talloc_asprintf(config->tty_list,
+					"IPMI: /dev/hvc0");
+	config->tty_list[1] = talloc_asprintf(config->tty_list,
+					"VGA: /dev/tty1");
+
+	fsp_prop = talloc_asprintf(config, "%sfsps", devtree_dir);
+	if (stat(fsp_prop, &sbuf) == 0) {
+		/* FSP based machines also have a separate serial console */
+		config->tty_list = talloc_realloc(config, config->tty_list,
+						char *,	config->n_tty + 1);
+		if (!config->tty_list)
+			goto err;
+		config->tty_list[config->n_tty++] = talloc_asprintf(
+						config->tty_list,
+						"Serial: /dev/hvc1");
+	}
+
+	return;
+err:
+	config->n_tty = 0;
+	pb_log("Failed to allocate memory for tty_list\n");
+}
+
 static int load_config(struct platform *p, struct config *config)
 {
 	struct platform_powerpc *platform = to_platform_powerpc(p);
@@ -1241,6 +1282,8 @@  static int load_config(struct platform *p, struct config *config)
 	if (platform->ipmi)
 		get_ipmi_network_override(platform, config);
 
+	get_active_consoles(config);
+
 	return 0;
 }
 
diff --git a/discover/platform.c b/discover/platform.c
index fc0930d..254da97 100644
--- a/discover/platform.c
+++ b/discover/platform.c
@@ -79,6 +79,12 @@  static void dump_config(struct config *config)
 	pb_log("  IPMI boot device 0x%02x%s\n", config->ipmi_bootdev,
 			config->ipmi_bootdev_persistent ? " (persistent)" : "");
 
+	pb_log("  Modifications allowed to disks: %s\n",
+			config->allow_writes ? "yes" : "no");
+
+	pb_log("  Default UI to boot on: %s\n",
+		config->boot_tty ?: "none set");
+
 
 	pb_log(" language: %s\n", config->lang ?: "");
 }
@@ -117,6 +123,10 @@  void config_set_defaults(struct config *config)
 	config->allow_writes = true;
 	config->disable_snapshots = false;
 
+	config->n_tty = 0;
+	config->tty_list = NULL;
+	config->boot_tty = NULL;
+
 	config->n_autoboot_opts = 2;
 	config->autoboot_opts = talloc_array(config, struct autoboot_option,
 						config->n_autoboot_opts);