Message ID | 20220913102724.65563-16-clombard@linux.vnet.ibm.com |
---|---|
State | Superseded |
Headers | show |
Series | Complete PLDM responder and enable PLDM support | expand |
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@linux.vnet.ibm.com> Reviewed-by : Abhisheek Singh Tomar <abhishek@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@lists.ozlabs.org > https://lists.ozlabs.org/listinfo/skiboot
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@linux.vnet.ibm.com> > Reviewed-by : Abhisheek Singh Tomar <abhishek@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@lists.ozlabs.org > > https://lists.ozlabs.org/listinfo/skiboot > _______________________________________________ > Skiboot mailing list > Skiboot@lists.ozlabs.org > https://lists.ozlabs.org/listinfo/skiboot
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 } }
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 | 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(-)