[Skiboot] [PATCH V3 15/15] platforms/astbmc: Enable PLDM support
Abhishek SIngh Tomar
abhishek at linux.ibm.com
Mon Oct 3 16:37:41 AEDT 2022
On Mon, Oct 03, 2022 at 11:05:55AM +0530, Abhishek SIngh Tomar wrote:
> On Tue, Sep 13, 2022 at 12:27:24PM +0200, Christophe Lombard wrote:
> > 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 at linux.vnet.ibm.com>
> Reviewed-by : Abhisheek Singh Tomar <abhishek at linux.ibm.com>
> > ---
> > core/init.c | 29 ++++++++++++++++++++++++++---
> > core/pldm/pldm-mctp.c | 11 +++++++++++
> > include/pldm.h | 2 ++
> > platforms/astbmc/astbmc.h | 4 ++++
> > platforms/astbmc/common.c | 35 +++++++++++++++++++++++++++++++++++
> > platforms/astbmc/pnor.c | 25 +++++++++++++++++++++++++
> > platforms/qemu/qemu.c | 6 ++++++
> > 7 files changed, 109 insertions(+), 3 deletions(-)
> >
> > diff --git a/core/init.c b/core/init.c
> > index 005ecf31..e32e87a8 100644
> > --- a/core/init.c
> > +++ b/core/init.c
> > @@ -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>
> > @@ -562,8 +563,15 @@ void __noreturn load_and_boot_kernel(bool is_reboot)
> >
> > trustedboot_exit_boot_services();
> >
> > +#ifdef CONFIG_PLDM
> > + if (pldm_present())
> > + pldm_platform_send_progress_state_change(
> > + PLDM_STATE_SET_BOOT_PROG_STATE_STARTING_OP_SYS);
> > + else
> > + ipmi_set_fw_progress_sensor(IPMI_FW_OS_BOOT);
> > +#else
> > ipmi_set_fw_progress_sensor(IPMI_FW_OS_BOOT);
> > -
> > +#endif
> >
> > if (!is_reboot) {
> > /* We wait for the nvram read to complete here so we can
> > @@ -1410,10 +1418,25 @@ void __noreturn __nomcount main_cpu_entry(const void *fdt)
> > /* Setup ibm,firmware-versions if able */
> > if (platform.bmc) {
> > flash_dt_add_fw_version();
> > - ipmi_dt_add_bmc_info();
> > +#ifdef CONFIG_PLDM
> > + if (pldm_present())
> > + pldm_fru_dt_add_bmc_version();
> > + else
> > + ipmi_dt_add_bmc_info();
> > +#else
> > + ipmi_dt_add_bmc_info();
> > +#endif
> > }
> >
> > - ipmi_set_fw_progress_sensor(IPMI_FW_PCI_INIT);
> > +#ifdef CONFIG_PLDM
> > + if (pldm_present())
> > + pldm_platform_send_progress_state_change(
> > + PLDM_STATE_SET_BOOT_PROG_STATE_PCI_RESORUCE_CONFIG);
> > + else
> > + ipmi_set_fw_progress_sensor(IPMI_FW_PCI_INIT);
> > +#else
> > + ipmi_set_fw_progress_sensor(IPMI_FW_PCI_INIT);
> > +#endif
> >
> > /*
> > * These last few things must be done as late as possible
> > diff --git a/core/pldm/pldm-mctp.c b/core/pldm/pldm-mctp.c
> > index 1d1d1b37..972a23e5 100644
> > --- a/core/pldm/pldm-mctp.c
> > +++ b/core/pldm/pldm-mctp.c
> > @@ -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.
> > @@ -139,6 +146,8 @@ int pldm_mctp_init(uint8_t mode)
> > goto out;
> > }
> >
> > + pldm_enabled = true;
> > +
> > /* Get PDRs data */
> > rc = pldm_platform_init();
> > if (rc) {
> > @@ -172,6 +181,8 @@ out:
> >
> > void pldm_mctp_exit(void)
> > {
> > + pldm_enabled = false;
> > +
> > pldm_platform_exit();
> >
> > ast_mctp_exit();
> > diff --git a/include/pldm.h b/include/pldm.h
> > index cb9cee08..8aa14a4f 100644
> > --- a/include/pldm.h
> > +++ b/include/pldm.h
> > @@ -8,6 +8,8 @@
> > #include <skiboot.h>
> > #include <pldm/libpldm/state_set.h>
> >
> > +bool pldm_present(void);
> > +
> > /**
> > * PLDM over MCTP initialization
> > */
> > diff --git a/platforms/astbmc/astbmc.h b/platforms/astbmc/astbmc.h
> > index 00f22123..5d0509b8 100644
> > --- a/platforms/astbmc/astbmc.h
> > +++ b/platforms/astbmc/astbmc.h
> > @@ -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(uint8_t mode);
> > +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);
> > diff --git a/platforms/astbmc/common.c b/platforms/astbmc/common.c
> > index 83ef70ad..e360a7bd 100644
> > --- a/platforms/astbmc/common.c
> > +++ b/platforms/astbmc/common.c
> > @@ -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,36 @@ static int astbmc_fru_init(void)
> > return 0;
> > }
> >
> > +#ifdef CONFIG_PLDM
> > +int astbmc_pldm_init(uint8_t mode)
> > +{
> > + int rc = OPAL_SUCCESS;
> > +
> > + /* PLDM over MCTP */
> > + rc = pldm_mctp_init(mode);
> > + if (!rc) {
> > + /* Initialize PNOR/NVRAM */
> > + rc = pnor_pldm_init();
> > +
> > + if (!rc) {
> > + pldm_watchdog_init();
> > + pldm_rtc_init();
> > + pldm_opal_init();
> > + }
> > + }
> > +
> > + /* Initialize elog */
> > + elog_init();
> > +
> > + /* Setup UART console for use by Linux via OPAL API */
> > + set_opal_console(&uart_opal_con);
> > +
> > + if (rc)
> > + prlog(PR_WARNING, "Failed to configure PLDM\n");
> > +
> > + return rc;
> > +}
> > +#endif
> >
> > void astbmc_init(void)
> > {
> > @@ -501,6 +532,10 @@ void astbmc_early_init(void)
> >
> > void astbmc_exit(void)
> > {
> > +#ifdef CONFIG_PLDM
> > + if (pldm_present())
> > + return;
> > +#endif
> > ipmi_wdt_final_reset();
> > }
> >
> > diff --git a/platforms/astbmc/pnor.c b/platforms/astbmc/pnor.c
> > index 64f2249d..853da467 100644
> > --- a/platforms/astbmc/pnor.c
> > +++ b/platforms/astbmc/pnor.c
> > @@ -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;
> > diff --git a/platforms/qemu/qemu.c b/platforms/qemu/qemu.c
> > index 96153e85..81c5e5e1 100644
> > --- a/platforms/qemu/qemu.c
> > +++ b/platforms/qemu/qemu.c
> > @@ -4,6 +4,7 @@
> > #include <skiboot.h>
> > #include <console.h>
> > #include <device.h>
> > +#include <ast.h>
> > #include <ipmi.h>
> >
> > #include <platforms/astbmc/astbmc.h>
> > @@ -80,7 +81,12 @@ static void qemu_init(void)
> > if (!bt_device_present) {
> > set_opal_console(&uart_opal_con);
> > } else {
> > +#ifdef CONFIG_PLDM
> > + /* need to be checked according platform: P10, P11 ... */
> > + astbmc_pldm_init(MCTP_BINDING_ASTLPC_MODE);
> > +#else
> > astbmc_init();
> > +#endif
> > }
> > }
> >
> > --
> > 2.37.3
> >
> > _______________________________________________
> > Skiboot mailing list
> > Skiboot at lists.ozlabs.org
> > https://lists.ozlabs.org/listinfo/skiboot
> _______________________________________________
> Skiboot mailing list
> Skiboot at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/skiboot
More information about the Skiboot
mailing list