summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/soc/amd/cezanne/smihandler.c1
-rw-r--r--src/soc/amd/common/block/include/amdblocks/psp.h6
-rw-r--r--src/soc/amd/common/block/psp/Kconfig19
-rw-r--r--src/soc/amd/common/block/psp/Makefile.mk1
-rw-r--r--src/soc/amd/common/block/psp/psp_smi.c7
-rw-r--r--src/soc/amd/common/block/psp/psp_smm.c5
-rw-r--r--src/soc/amd/genoa_poc/smihandler.c1
-rw-r--r--src/soc/amd/glinda/smihandler.c1
-rw-r--r--src/soc/amd/mendocino/smihandler.c1
-rw-r--r--src/soc/amd/phoenix/smihandler.c1
-rw-r--r--src/soc/amd/picasso/smihandler.c1
11 files changed, 44 insertions, 0 deletions
diff --git a/src/soc/amd/cezanne/smihandler.c b/src/soc/amd/cezanne/smihandler.c
index 2c5489f03b..8b8382cf89 100644
--- a/src/soc/amd/cezanne/smihandler.c
+++ b/src/soc/amd/cezanne/smihandler.c
@@ -112,6 +112,7 @@ static void fch_slp_typ_handler(void)
static const struct smi_sources_t smi_sources[] = {
{ .type = SMITYPE_SMI_CMD_PORT, .handler = fch_apmc_smi_handler },
{ .type = SMITYPE_SLP_TYP, .handler = fch_slp_typ_handler},
+ { .type = SMITYPE_PSP, .handler = psp_smi_handler },
};
void *get_smi_source_handler(int source)
diff --git a/src/soc/amd/common/block/include/amdblocks/psp.h b/src/soc/amd/common/block/include/amdblocks/psp.h
index abdb762af8..061e79def5 100644
--- a/src/soc/amd/common/block/include/amdblocks/psp.h
+++ b/src/soc/amd/common/block/include/amdblocks/psp.h
@@ -57,6 +57,12 @@ int psp_notify_dram(void);
int psp_notify_smm(void);
+#if (CONFIG(SOC_AMD_COMMON_BLOCK_PSP_SMI))
+void psp_smi_handler(void);
+#else
+static inline void psp_smi_handler(void) {}
+#endif
+
/*
* type: identical to the corresponding PSP command, e.g. pass
* MBOX_BIOS_CMD_SMU_FW2 to load SMU FW2 blob.
diff --git a/src/soc/amd/common/block/psp/Kconfig b/src/soc/amd/common/block/psp/Kconfig
index 266a6ba10e..34a0642893 100644
--- a/src/soc/amd/common/block/psp/Kconfig
+++ b/src/soc/amd/common/block/psp/Kconfig
@@ -88,6 +88,25 @@ config PSP_PLATFORM_SECURE_BOOT
Refer AMD PSB user guide doc# 56654, Revision# 1.00, this document is
only available with NDA customers.
+config SOC_AMD_COMMON_BLOCK_PSP_SMI
+ bool
+ default n
+ select SPI_FLASH_SMM if BOOT_DEVICE_SPI_FLASH_RW_NOMMAP
+ help
+ Add PSP SMI handler for SPI flash access.
+
+ When ROM armor isn't enabled, the x86 part owns the SPI controller,
+ so when the PSP wants to access the SPI flash, it sends an SMI to the
+ x86 side and the corresponding SMI handler will do the SPI flash
+ access for the PSP.
+
+ WARNING: Since the flash access in the SMI handler is a blocking
+ operation during which all cores stay in SMM, an erase operation may
+ lock up the system for a long enough time to be noticeable. Reads and
+ writes with small data sizes are less problematic. This is AMD
+ specific design and should be enabled when PSP requires to access the
+ SPI flash after the BOOT_DONE PSP command.
+
config PSP_INCLUDES_HSP
bool
depends on SOC_AMD_COMMON_BLOCK_PSP
diff --git a/src/soc/amd/common/block/psp/Makefile.mk b/src/soc/amd/common/block/psp/Makefile.mk
index d0fbcbe452..c16a73b698 100644
--- a/src/soc/amd/common/block/psp/Makefile.mk
+++ b/src/soc/amd/common/block/psp/Makefile.mk
@@ -4,6 +4,7 @@ ifeq ($(CONFIG_SOC_AMD_COMMON_BLOCK_PSP),y)
romstage-y += psp.c
ramstage-y += psp.c
smm-y += psp.c
+smm-$(CONFIG_SOC_AMD_COMMON_BLOCK_PSP_SMI) += psp_smi.c
smm-y += psp_smm.c
bootblock-y += psp_efs.c
diff --git a/src/soc/amd/common/block/psp/psp_smi.c b/src/soc/amd/common/block/psp/psp_smi.c
new file mode 100644
index 0000000000..b94366ca5a
--- /dev/null
+++ b/src/soc/amd/common/block/psp/psp_smi.c
@@ -0,0 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <amdblocks/psp.h>
+
+void psp_smi_handler(void)
+{
+}
diff --git a/src/soc/amd/common/block/psp/psp_smm.c b/src/soc/amd/common/block/psp/psp_smm.c
index f3b90ae81e..4f76ebc421 100644
--- a/src/soc/amd/common/block/psp/psp_smm.c
+++ b/src/soc/amd/common/block/psp/psp_smm.c
@@ -6,6 +6,7 @@
#include <region_file.h>
#include <console/console.h>
#include <amdblocks/psp.h>
+#include <amdblocks/smi.h>
#include <soc/iomap.h>
#include <string.h>
@@ -89,6 +90,10 @@ int psp_notify_smm(void)
soc_fill_smm_reg_info(&buffer.req.smm_reg_info);
#endif
+ if (CONFIG(SOC_AMD_COMMON_BLOCK_PSP_SMI)) {
+ configure_psp_smi();
+ }
+
printk(BIOS_DEBUG, "PSP: Notify SMM info... ");
cmd_status = send_psp_command_smm(MBOX_BIOS_CMD_SMM_INFO, &buffer);
diff --git a/src/soc/amd/genoa_poc/smihandler.c b/src/soc/amd/genoa_poc/smihandler.c
index a4b6173184..1eb051317b 100644
--- a/src/soc/amd/genoa_poc/smihandler.c
+++ b/src/soc/amd/genoa_poc/smihandler.c
@@ -81,6 +81,7 @@ static void fch_slp_typ_handler(void)
static const struct smi_sources_t smi_sources[] = {
{ .type = SMITYPE_SMI_CMD_PORT, .handler = fch_apmc_smi_handler },
{ .type = SMITYPE_SLP_TYP, .handler = fch_slp_typ_handler},
+ { .type = SMITYPE_PSP, .handler = psp_smi_handler },
};
void *get_smi_source_handler(int source)
diff --git a/src/soc/amd/glinda/smihandler.c b/src/soc/amd/glinda/smihandler.c
index 9cf754a782..8591de766c 100644
--- a/src/soc/amd/glinda/smihandler.c
+++ b/src/soc/amd/glinda/smihandler.c
@@ -112,6 +112,7 @@ static void fch_slp_typ_handler(void)
static const struct smi_sources_t smi_sources[] = {
{ .type = SMITYPE_SMI_CMD_PORT, .handler = fch_apmc_smi_handler },
{ .type = SMITYPE_SLP_TYP, .handler = fch_slp_typ_handler},
+ { .type = SMITYPE_PSP, .handler = psp_smi_handler },
};
void *get_smi_source_handler(int source)
diff --git a/src/soc/amd/mendocino/smihandler.c b/src/soc/amd/mendocino/smihandler.c
index a973658def..12b958cd29 100644
--- a/src/soc/amd/mendocino/smihandler.c
+++ b/src/soc/amd/mendocino/smihandler.c
@@ -112,6 +112,7 @@ static void fch_slp_typ_handler(void)
static const struct smi_sources_t smi_sources[] = {
{ .type = SMITYPE_SMI_CMD_PORT, .handler = fch_apmc_smi_handler },
{ .type = SMITYPE_SLP_TYP, .handler = fch_slp_typ_handler},
+ { .type = SMITYPE_PSP, .handler = psp_smi_handler },
};
void *get_smi_source_handler(int source)
diff --git a/src/soc/amd/phoenix/smihandler.c b/src/soc/amd/phoenix/smihandler.c
index a0099cfe94..454dadd719 100644
--- a/src/soc/amd/phoenix/smihandler.c
+++ b/src/soc/amd/phoenix/smihandler.c
@@ -112,6 +112,7 @@ static void fch_slp_typ_handler(void)
static const struct smi_sources_t smi_sources[] = {
{ .type = SMITYPE_SMI_CMD_PORT, .handler = fch_apmc_smi_handler },
{ .type = SMITYPE_SLP_TYP, .handler = fch_slp_typ_handler},
+ { .type = SMITYPE_PSP, .handler = psp_smi_handler },
};
void *get_smi_source_handler(int source)
diff --git a/src/soc/amd/picasso/smihandler.c b/src/soc/amd/picasso/smihandler.c
index 247a159df5..507068edaf 100644
--- a/src/soc/amd/picasso/smihandler.c
+++ b/src/soc/amd/picasso/smihandler.c
@@ -114,6 +114,7 @@ static void fch_slp_typ_handler(void)
static const struct smi_sources_t smi_sources[] = {
{ .type = SMITYPE_SMI_CMD_PORT, .handler = fch_apmc_smi_handler },
{ .type = SMITYPE_SLP_TYP, .handler = fch_slp_typ_handler},
+ { .type = SMITYPE_PSP, .handler = psp_smi_handler },
};
void *get_smi_source_handler(int source)