soc/amd/common/psp: add and call PSP SMI SPI access function stubs

Add stub functions for the SPI flash access from the PSP SMI handler
and call them for the corresponding P2C mailbox commands.

Parts of this patch are taken from CB:65523.

Document #55758 Rev. 2.04 was used as a reference.

Test=When selecting SOC_AMD_COMMON_BLOCK_PSP_SMI, Mandolin still builds

Signed-off-by: Felix Held <felix-coreboot@felixheld.de>
Signed-off-by: Ritul Guru <ritul.bits@gmail.com>
Change-Id: Iedbc9d41eb0d4e8d81eeba9c01281161eb839991
Reviewed-on: https://review.coreboot.org/c/coreboot/+/83756
Reviewed-by: Martin Roth <martin.roth@amd.corp-partner.google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Felix Held 2024-08-02 02:48:13 +02:00
parent 2b6070bed4
commit 4ea3bfd1bc
4 changed files with 58 additions and 0 deletions

View File

@ -5,6 +5,7 @@ romstage-y += psp.c
ramstage-y += psp.c
smm-y += psp.c
smm-$(CONFIG_SOC_AMD_COMMON_BLOCK_PSP_SMI) += psp_smi.c
smm-$(CONFIG_SOC_AMD_COMMON_BLOCK_PSP_SMI) += psp_smi_flash.c
smm-y += psp_smm.c
bootblock-y += psp_efs.c

View File

@ -133,4 +133,9 @@ enum cb_err soc_read_c2p38(uint32_t *msg_38_value);
void enable_psp_smi(void);
enum mbox_p2c_status psp_smi_spi_get_info(struct mbox_default_buffer *buffer);
enum mbox_p2c_status psp_smi_spi_read(struct mbox_default_buffer *buffer);
enum mbox_p2c_status psp_smi_spi_write(struct mbox_default_buffer *buffer);
enum mbox_p2c_status psp_smi_spi_erase(struct mbox_default_buffer *buffer);
#endif /* __AMD_PSP_DEF_H__ */

View File

@ -8,6 +8,12 @@
#include <types.h>
#include "psp_def.h"
/* PSP to x86 commands */
#define MBOX_PSP_CMD_SPI_INFO 0x83
#define MBOX_PSP_CMD_SPI_READ 0x84
#define MBOX_PSP_CMD_SPI_WRITE 0x85
#define MBOX_PSP_CMD_SPI_ERASE 0x86
extern struct {
u8 buffer[P2C_BUFFER_MAXSIZE];
} __aligned(32) p2c_buffer;
@ -126,6 +132,7 @@ static void handle_psp_command(void)
{
enum mbox_p2c_status status;
u32 cmd;
struct mbox_default_buffer *const buffer = get_psp_command_buffer();
status = check_psp_command();
if (status != MBOX_PSP_SUCCESS)
@ -134,6 +141,18 @@ static void handle_psp_command(void)
cmd = get_psp_command();
switch (cmd) {
case MBOX_PSP_CMD_SPI_INFO:
status = psp_smi_spi_get_info(buffer);
break;
case MBOX_PSP_CMD_SPI_READ:
status = psp_smi_spi_read(buffer);
break;
case MBOX_PSP_CMD_SPI_WRITE:
status = psp_smi_spi_write(buffer);
break;
case MBOX_PSP_CMD_SPI_ERASE:
status = psp_smi_spi_erase(buffer);
break;
default:
printk(BIOS_ERR, "PSP: Unknown command %d\n", cmd);
status = MBOX_PSP_UNSUPPORTED;

View File

@ -0,0 +1,33 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <console/console.h>
#include <types.h>
#include "psp_def.h"
enum mbox_p2c_status psp_smi_spi_get_info(struct mbox_default_buffer *buffer)
{
printk(BIOS_SPEW, "PSP: SPI info request\n");
return MBOX_PSP_UNSUPPORTED;
}
enum mbox_p2c_status psp_smi_spi_read(struct mbox_default_buffer *buffer)
{
printk(BIOS_SPEW, "PSP: SPI read request\n");
return MBOX_PSP_UNSUPPORTED;
}
enum mbox_p2c_status psp_smi_spi_write(struct mbox_default_buffer *buffer)
{
printk(BIOS_SPEW, "PSP: SPI write request\n");
return MBOX_PSP_UNSUPPORTED;
}
enum mbox_p2c_status psp_smi_spi_erase(struct mbox_default_buffer *buffer)
{
printk(BIOS_SPEW, "PSP: SPI erase request\n");
return MBOX_PSP_UNSUPPORTED;
}