[PATCH openpower-host-ipmi-oem] Add IPMI interface to allow FW updates from Host
Cyril Bur
cyrilbur at gmail.com
Wed Mar 9 16:34:35 AEDT 2016
On Fri, 4 Mar 2016 12:20:26 -0600
OpenBMC Patches <openbmc-patches at stwcx.xyz> wrote:
> From: Adriana Kobylak <anoo at us.ibm.com>
>
> New OEM IPMI command to execute commands that would allow the Host to have access to the BMC to perform a FW update.
> ---
> Makefile | 2 +-
> oemhandler.C | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> oemhandler.h | 1 +
> 3 files changed, 54 insertions(+), 1 deletion(-)
>
> diff --git a/Makefile b/Makefile
> index eaa7324..bacdef9 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -10,7 +10,7 @@ CXXFLAGS += -fPIC -Wall
> all: $(LIB_OEM)
>
> %.o: %.C
> - $(CXX) -c $< $(CXXFLAGS) -o $@
> + $(CXX) -std=c++14 -c $< $(CXXFLAGS) -o $@
>
This isn't a CXXFLAGS thing?
> $(LIB_OEM): $(LIB_OEM_OBJ)
> $(CXX) $^ -shared $(LDFLAGS) -o $@
> diff --git a/oemhandler.C b/oemhandler.C
> index f577d67..22452d6 100644
> --- a/oemhandler.C
> +++ b/oemhandler.C
> @@ -1,7 +1,9 @@
> #include "oemhandler.h"
> #include <host-ipmid/ipmid-api.h>
> +#include <fstream>
> #include <stdio.h>
> #include <string.h>
> +#include <systemd/sd-bus.h>
>
> void register_netfn_oem_partial_esel() __attribute__((constructor));
>
> @@ -70,10 +72,60 @@ ipmi_ret_t ipmi_ibm_oem_partial_esel(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
> return rc;
> }
>
> +// Prepare for FW Update.
> +// Execute needed commands to prepare the system for a fw update from the host.
> +ipmi_ret_t ipmi_ibm_oem_prep_fw_update(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
> + ipmi_request_t request, ipmi_response_t response,
> + ipmi_data_len_t data_len, ipmi_context_t context)
> +{
> + ipmi_ret_t ipmi_rc = IPMI_CC_OK;
> + *data_len = 0;
> +
> + int rc = 0;
> + std::ofstream rwfs_file;
> + const char *busname = "org.openbmc.control.Bmc";
> + const char *objname = "/org/openbmc/control/bmc0";
> + const char *iface = "org.openbmc.control.Bmc";
> + sd_bus *bus = ipmid_get_sd_bus_connection();
> + sd_bus_message *reply = NULL;
> + sd_bus_error error = SD_BUS_ERROR_NULL;
> + int r = 0;
> +
> + // Set one time flag
> + rc = system("fw_setenv openbmconce copy-files-to-ram copy-base-filesystem-to-ram");
> + rc = WEXITSTATUS(rc);
> + if (rc != 0) {
> + fprintf(stderr, "fw_setenv openbmconce failed with rc=%d\n", rc);
> + return IPMI_CC_UNSPECIFIED_ERROR;
> + }
> +
> + // Touch the image-rwfs file to perform an empty update to force the save
> + // in case we're already in ram and the flash is the same causing the ram files
> + // to not be copied back to flash
> + rwfs_file.open("/run/initramfs/image-rwfs", std::ofstream::out | std::ofstream::app);
> + rwfs_file.close();
> +
> + // Reboot the BMC for settings to take effect
> + r = sd_bus_call_method(bus, busname, objname, iface,
> + "warmReset", &error, &reply, NULL);
> + if (r < 0) {
> + fprintf(stderr, "Failed to reset BMC: %s\n", strerror(-r));
> + return -1;
> + }
> + printf("Warning: BMC is going down for reboot!\n");
> + sd_bus_error_free(&error);
> + reply = sd_bus_message_unref(reply);
> +
> + return ipmi_rc;
> +}
>
> void register_netfn_oem_partial_esel()
> {
> printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_OEM, IPMI_CMD_PESEL);
> ipmi_register_callback(NETFUN_OEM, IPMI_CMD_PESEL, NULL, ipmi_ibm_oem_partial_esel);
> +
> + printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n", NETFUN_OEM, IPMI_CMD_PREP_FW_UPDATE);
> + ipmi_register_callback(NETFUN_OEM, IPMI_CMD_PREP_FW_UPDATE, NULL, ipmi_ibm_oem_prep_fw_update);
> +
> return;
> }
> diff --git a/oemhandler.h b/oemhandler.h
> index 9cc397f..71ae01c 100644
> --- a/oemhandler.h
> +++ b/oemhandler.h
> @@ -8,6 +8,7 @@
> // IPMI commands for net functions.
> enum ipmi_netfn_oem_cmds
> {
> + IPMI_CMD_PREP_FW_UPDATE = 0x10,
> IPMI_CMD_PESEL = 0xF0,
> };
>
More information about the openbmc
mailing list