]> git.ozlabs.org Git - petitboot/blobdiff - discover/platform-powerpc.c
discover/ipmi: Increase IPMI timeout to a reasonable value
[petitboot] / discover / platform-powerpc.c
index d777bc0e5b108e1ebfc8b99eb8d9d79a91d1da10..23e63c1be152bdbf7e1b4bc0cd3e0e69c4f20eda 100644 (file)
@@ -22,7 +22,7 @@
 static const char *partition = "common";
 static const char *sysparams_dir = "/sys/firmware/opal/sysparams/";
 static const char *devtree_dir = "/proc/device-tree/";
-static const int ipmi_timeout = 500; /* milliseconds */
+static const int ipmi_timeout = 5000; /* milliseconds. */
 
 struct param {
        char                    *name;
@@ -39,7 +39,8 @@ struct platform_powerpc {
                                struct platform_powerpc *platform,
                                uint8_t *bootdev, bool *persistent);
        int             (*clear_ipmi_bootdev)(
-                               struct platform_powerpc *platform);
+                               struct platform_powerpc *platform,
+                               bool persistent);
        int             (*set_os_boot_sensor)(
                                struct platform_powerpc *platform);
 };
@@ -52,6 +53,8 @@ static const char *known_params[] = {
        "petitboot,bootdevs",
        "petitboot,language",
        "petitboot,debug?",
+       "petitboot,write?",
+       "petitboot,snapshots?",
        NULL,
 };
 
@@ -547,6 +550,14 @@ static void populate_config(struct platform_powerpc *platform,
                val = get_param(platform, "petitboot,debug?");
                config->debug = val && !strcmp(val, "true");
        }
+
+       val = get_param(platform, "petitboot,write?");
+       if (val)
+               config->allow_writes = !strcmp(val, "true");
+
+       val = get_param(platform, "petitboot,snapshots?");
+       if (val)
+               config->disable_snapshots = !strcmp(val, "false");
 }
 
 static char *iface_config_str(void *ctx, struct interface_config *config)
@@ -663,7 +674,7 @@ static void update_bootdev_config(struct platform_powerpc *platform,
                                                opt->uuid, delim);
                                break;
                        }
-                       tmp = val = talloc_asprintf_append(val, boot_str);
+                       tmp = val = talloc_asprintf_append(val, "%s", boot_str);
        }
 
        update_string_config(platform, "petitboot,bootdevs", val);
@@ -691,6 +702,14 @@ static int update_config(struct platform_powerpc *platform,
                val = tmp = talloc_asprintf(platform, "%d",
                                config->autoboot_timeout_sec);
 
+       if (config->ipmi_bootdev == IPMI_BOOTDEV_INVALID &&
+           platform->clear_ipmi_bootdev) {
+               platform->clear_ipmi_bootdev(platform,
+                               config->ipmi_bootdev_persistent);
+               config->ipmi_bootdev = IPMI_BOOTDEV_NONE;
+               config->ipmi_bootdev_persistent = false;
+       }
+
        update_string_config(platform, "petitboot,timeout", val);
        if (tmp)
                talloc_free(tmp);
@@ -698,6 +717,12 @@ static int update_config(struct platform_powerpc *platform,
        val = config->lang ?: "";
        update_string_config(platform, "petitboot,language", val);
 
+       if (config->allow_writes == defaults->allow_writes)
+               val = "";
+       else
+               val = config->allow_writes ? "true" : "false";
+       update_string_config(platform, "petitboot,write?", val);
+
        update_network_config(platform, config);
 
        update_bootdev_config(platform, config);
@@ -806,10 +831,16 @@ static int write_bootdev_sysparam(const char *name, uint8_t val)
 }
 
 static int clear_ipmi_bootdev_sysparams(
-               struct platform_powerpc *platform __attribute__((unused)))
+               struct platform_powerpc *platform __attribute__((unused)),
+               bool persistent)
 {
-       /* invalidate next-boot-device setting */
-       write_bootdev_sysparam("next-boot-device", 0xff);
+       if (persistent) {
+               /* invalidate default-boot-device setting */
+               write_bootdev_sysparam("default-boot-device", 0xff);
+       } else {
+               /* invalidate next-boot-device setting */
+               write_bootdev_sysparam("next-boot-device", 0xff);
+       }
        return 0;
 }
 
@@ -836,7 +867,8 @@ static int get_ipmi_bootdev_sysparams(
        return 0;
 }
 
-static int clear_ipmi_bootdev_ipmi(struct platform_powerpc *platform)
+static int clear_ipmi_bootdev_ipmi(struct platform_powerpc *platform,
+                                  bool persistent __attribute__((unused)))
 {
        uint16_t resp_len;
        uint8_t resp[1];
@@ -1001,7 +1033,7 @@ static void pre_boot(struct platform *p, const struct config *config)
        struct platform_powerpc *platform = to_platform_powerpc(p);
 
        if (!config->ipmi_bootdev_persistent && platform->clear_ipmi_bootdev)
-               platform->clear_ipmi_bootdev(platform);
+               platform->clear_ipmi_bootdev(platform, false);
 
        if (platform->set_os_boot_sensor)
                platform->set_os_boot_sensor(platform);