diff mbox series

[V3,15/15] platforms/astbmc: Enable PLDM support

Message ID 20220913102724.65563-16-clombard@linux.vnet.ibm.com
State Superseded
Headers show
Series Complete PLDM responder and enable PLDM support | expand

Commit Message

Christophe Lombard Sept. 13, 2022, 10:27 a.m. UTC
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(-)

Comments

Abhishek Singh Tomar Oct. 3, 2022, 5:35 a.m. UTC | #1
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
Abhishek Singh Tomar Oct. 3, 2022, 5:37 a.m. UTC | #2
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 mbox series

Patch

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
 	}
 }