@@ -34,6 +34,7 @@
#include <libfdt/libfdt.h>
#include <timer.h>
#include <ipmi.h>
+#include <pldm.h>
#include <sensor.h>
#include <xive.h>
#include <nvram.h>
@@ -1372,7 +1373,11 @@ void __noreturn __nomcount main_cpu_entry(const void *fdt)
/* Setup ibm,firmware-versions if able */
if (platform.bmc) {
flash_dt_add_fw_version();
+#ifdef CONFIG_PLDM
+ pldm_fru_dt_add_bmc_version();
+#else
ipmi_dt_add_bmc_info();
+#endif
}
ipmi_set_fw_progress_sensor(IPMI_FW_PCI_INIT);
@@ -10,6 +10,13 @@
#include <ast.h>
#include "pldm.h"
+bool pldm_enabled;
+
+bool pldm_present(void)
+{
+ return pldm_enabled;
+}
+
/*
* Print content of PLDM message in hex mode.
* 15 bytes per line.
@@ -155,6 +162,8 @@ int pldm_mctp_init(void)
if (rc)
prlog(PR_ERR, "Failed to retrieve File io data\n");
+ pldm_enabled = true;
+
out:
prlog(PR_NOTICE, "%s - done, rc: %d\n", __func__, rc);
return rc;
@@ -162,6 +171,8 @@ out:
void pldm_mctp_exit(void)
{
+ pldm_enabled = false;
+
pldm_platform_exit();
ast_mctp_exit();
@@ -7,6 +7,8 @@
#include <skiboot.h>
+bool pldm_present(void);
+
/**
* PLDM over MCTP initialization
*/
@@ -96,6 +96,10 @@ extern const struct bmc_platform bmc_plat_ast2600_openbmc;
extern void astbmc_early_init(void);
extern int64_t astbmc_ipmi_reboot(void);
extern int64_t astbmc_ipmi_power_down(uint64_t request);
+#ifdef CONFIG_PLDM
+extern int astbmc_pldm_init(void);
+extern int pnor_pldm_init(void);
+#endif
extern void astbmc_init(void);
extern void astbmc_ext_irq_serirq_cpld(unsigned int chip_id);
extern int pnor_init(void);
@@ -9,6 +9,7 @@
#include <xscom.h>
#include <ast.h>
#include <ipmi.h>
+#include <pldm.h>
#include <bt.h>
#include <errorlog.h>
#include <lpc.h>
@@ -104,6 +105,43 @@ static int astbmc_fru_init(void)
return 0;
}
+#ifdef CONFIG_PLDM
+int astbmc_pldm_init(void)
+{
+ int rc;
+
+ /* PLDM over MCTP */
+ rc = pldm_mctp_init();
+ if (rc)
+ goto err;
+
+ /* Initialize PNOR/NVRAM */
+ rc = pnor_pldm_init();
+ if (rc)
+ goto err;
+
+ /* Update or create terminus locator in the given repo */
+ rc = pldm_platform_terminus_locator_pdr();
+ if (rc)
+ goto err;
+
+ /* Initialize elog */
+ elog_init();
+
+ pldm_watchdog_init();
+ pldm_rtc_init();
+ /*pldm_opal_init(); FIXME */
+
+ /* Setup UART console for use by Linux via OPAL API */
+ set_opal_console(&uart_opal_con);
+
+ return OPAL_SUCCESS;
+
+err:
+ prlog(PR_WARNING, "Failed to configure PLDM\n");
+ return rc;
+}
+#endif
void astbmc_init(void)
{
@@ -501,6 +539,10 @@ void astbmc_early_init(void)
void astbmc_exit(void)
{
+#ifdef CONFIG_PLDM
+ if (pldm_present())
+ return;
+#endif
ipmi_wdt_final_reset();
}
@@ -5,6 +5,7 @@
#include <device.h>
#include <console.h>
#include <opal.h>
+#include <pldm.h>
#include <libflash/ipmi-hiomap.h>
#include <libflash/mbox-flash.h>
#include <libflash/libflash.h>
@@ -32,6 +33,30 @@ static enum ast_flash_style ast_flash_get_fallback_style(void)
return raw_mem;
}
+#ifdef CONFIG_PLDM
+int pnor_pldm_init(void)
+{
+ struct blocklevel_device *bl = NULL;
+ int rc = 0;
+
+ rc = pldm_lid_files_init(&bl);
+ if (rc) {
+ prerror("PLAT: Failed to init PNOR driver\n");
+ goto fail;
+ }
+
+ rc = flash_register(bl);
+ if (!rc)
+ return 0;
+
+fail:
+ if (bl)
+ pldm_lid_files_exit(bl);
+
+ return rc;
+}
+#endif
+
int pnor_init(void)
{
struct spi_flash_ctrl *pnor_ctrl = NULL;
@@ -6,6 +6,7 @@
#include <skiboot.h>
#include <device.h>
#include <ipmi.h>
+#include <pldm.h>
#include <pau.h>
#include <chip.h>
#include <i2c.h>
@@ -321,9 +322,33 @@ static void rainier_pau_create_i2c_bus(void)
}
}
+static int64_t rainier_power_down(uint64_t request)
+{
+#ifdef CONFIG_PLDM
+ /* Issue a PLDM request for a Off-Soft Graceful */
+ if (pldm_present())
+ return pldm_platform_power_off();
+#endif
+ return astbmc_ipmi_power_down(request);
+}
+
+static int64_t rainier_reboot(void)
+{
+#ifdef CONFIG_PLDM
+ /* Issue a PLDM request for a graceful restart */
+ if (pldm_present())
+ return pldm_platform_restart();
+#endif
+ return astbmc_ipmi_reboot();
+}
+
static void rainier_init(void)
{
- astbmc_init();
+#ifdef CONFIG_PLDM
+ if (astbmc_pldm_init())
+#endif
+ astbmc_init();
+
rainier_init_slot_power();
}
@@ -365,9 +390,9 @@ DECLARE_PLATFORM(rainier) = {
.start_preload_resource = flash_start_preload_resource,
.resource_loaded = flash_resource_loaded,
.bmc = &bmc_plat_ast2600_openbmc,
- .cec_power_down = astbmc_ipmi_power_down,
- .cec_reboot = astbmc_ipmi_reboot,
- .elog_commit = ipmi_elog_commit,
+ .cec_power_down = rainier_power_down,
+ .cec_reboot = rainier_reboot,
+ .elog_commit = ipmi_elog_commit, /* FIXME */
.pau_device_detect = rainier_pau_device_detect,
.ocapi = &rainier_ocapi,
.exit = astbmc_exit,
Last BMC firmware is available with a complete PLDM support on Rainier system. This patch allows initially to: - Initialize the MCTP core. - Enable the mctp binding over LPC bus interface and new wrappers to send and receive PLDM messages over the mctp library. - Retrieve all needed PLDM data. - "Virtualize" the content of a BMC flash based on lid files. Then, others mandatory support (watchdog, opal rtc, opal ipmi) are enabled. Signed-off-by: Christophe Lombard <clombard@linux.vnet.ibm.com> --- core/init.c | 5 +++++ core/pldm/pldm-common.c | 11 ++++++++++ include/pldm.h | 2 ++ platforms/astbmc/astbmc.h | 4 ++++ platforms/astbmc/common.c | 42 ++++++++++++++++++++++++++++++++++++++ platforms/astbmc/pnor.c | 25 +++++++++++++++++++++++ platforms/astbmc/rainier.c | 33 ++++++++++++++++++++++++++---- 7 files changed, 118 insertions(+), 4 deletions(-)