summaryrefslogtreecommitdiff
path: root/src/soc/amd
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/amd')
-rw-r--r--src/soc/amd/common/block/psp/psp.c59
-rw-r--r--src/soc/amd/common/block/psp/psp_def.h2
-rw-r--r--src/soc/amd/common/block/psp/psp_gen1.c54
3 files changed, 59 insertions, 56 deletions
diff --git a/src/soc/amd/common/block/psp/psp.c b/src/soc/amd/common/block/psp/psp.c
index 22404be6d6..479c28bc33 100644
--- a/src/soc/amd/common/block/psp/psp.c
+++ b/src/soc/amd/common/block/psp/psp.c
@@ -3,8 +3,6 @@
#include <device/mmio.h>
#include <cpu/x86/msr.h>
-#include <cbfs.h>
-#include <region_file.h>
#include <timer.h>
#include <bootstate.h>
#include <console/console.h>
@@ -50,7 +48,7 @@ static u32 rd_resp_sts(struct mbox_default_buffer *buffer)
* Print meaningful status to the console. Caller only passes a pointer to a
* buffer if it's expected to contain its own status.
*/
-static void print_cmd_status(int cmd_status, struct mbox_default_buffer *buffer)
+void psp_print_cmd_status(int cmd_status, struct mbox_default_buffer *buffer)
{
if (buffer && rd_resp_sts(buffer))
printk(BIOS_DEBUG, "buffer status=0x%x ", rd_resp_sts(buffer));
@@ -79,7 +77,7 @@ int psp_notify_dram(void)
cmd_status = send_psp_command(MBOX_BIOS_CMD_DRAM_INFO, &buffer);
/* buffer's status shouldn't change but report it if it does */
- print_cmd_status(cmd_status, &buffer);
+ psp_print_cmd_status(cmd_status, &buffer);
return cmd_status;
}
@@ -103,58 +101,7 @@ static void psp_notify_boot_done(void *unused)
cmd_status = send_psp_command(MBOX_BIOS_CMD_BOOT_DONE, &buffer);
/* buffer's status shouldn't change but report it if it does */
- print_cmd_status(cmd_status, &buffer);
-}
-
-/*
- * Tell the PSP to load a firmware blob from a location in the BIOS image.
- */
-int psp_load_named_blob(enum psp_blob_type type, const char *name)
-{
- int cmd_status;
- u32 command;
- void *blob;
- struct cbfsf cbfs_file;
- struct region_device rdev;
-
- switch (type) {
- case BLOB_SMU_FW:
- command = MBOX_BIOS_CMD_SMU_FW;
- break;
- case BLOB_SMU_FW2:
- command = MBOX_BIOS_CMD_SMU_FW2;
- break;
- default:
- printk(BIOS_ERR, "BUG: Invalid PSP blob type %x\n", type);
- return -PSPSTS_INVALID_BLOB;
- }
-
- /* type can only be BLOB_SMU_FW or BLOB_SMU_FW2 here, so don't re-check for this */
- if (!CONFIG(SOC_AMD_PSP_SELECTABLE_SMU_FW)) {
- printk(BIOS_ERR, "BUG: Selectable firmware is not supported\n");
- return -PSPSTS_UNSUPPORTED;
- }
-
- if (cbfs_boot_locate(&cbfs_file, name, NULL)) {
- printk(BIOS_ERR, "BUG: Cannot locate blob for PSP loading\n");
- return -PSPSTS_INVALID_NAME;
- }
-
- cbfs_file_data(&rdev, &cbfs_file);
- blob = rdev_mmap_full(&rdev);
- if (!blob) {
- printk(BIOS_ERR, "BUG: Cannot map blob for PSP loading\n");
- return -PSPSTS_INVALID_NAME;
- }
-
- printk(BIOS_DEBUG, "PSP: Load blob type %x from @%p... ", type, blob);
-
- /* Blob commands use the buffer registers as data, not pointer to buf */
- cmd_status = send_psp_command(command, blob);
- print_cmd_status(cmd_status, NULL);
-
- rdev_munmap(&rdev, blob);
- return cmd_status;
+ psp_print_cmd_status(cmd_status, &buffer);
}
BOOT_STATE_INIT_ENTRY(BS_PAYLOAD_BOOT, BS_ON_ENTRY,
diff --git a/src/soc/amd/common/block/psp/psp_def.h b/src/soc/amd/common/block/psp/psp_def.h
index 37755166f0..f3ac5c2181 100644
--- a/src/soc/amd/common/block/psp/psp_def.h
+++ b/src/soc/amd/common/block/psp/psp_def.h
@@ -89,6 +89,8 @@ struct mbox_cmd_sx_info_buffer {
#define PSP_INIT_TIMEOUT 10000 /* 10 seconds */
#define PSP_CMD_TIMEOUT 1000 /* 1 second */
+void psp_print_cmd_status(int cmd_status, struct mbox_default_buffer *buffer);
+
/* This command needs to be implemented by the generation specific code. */
int send_psp_command(u32 command, void *buffer);
diff --git a/src/soc/amd/common/block/psp/psp_gen1.c b/src/soc/amd/common/block/psp/psp_gen1.c
index 0e5aa30154..b707933553 100644
--- a/src/soc/amd/common/block/psp/psp_gen1.c
+++ b/src/soc/amd/common/block/psp/psp_gen1.c
@@ -2,8 +2,11 @@
/* This file is part of the coreboot project. */
#include <device/mmio.h>
+#include <cbfs.h>
+#include <region_file.h>
#include <timer.h>
#include <bootstate.h>
+#include <console/console.h>
#include <amdblocks/psp.h>
#include <soc/iomap.h>
#include <soc/northbridge.h>
@@ -91,3 +94,54 @@ int send_psp_command(u32 command, void *buffer)
return 0;
}
+
+/*
+ * Tell the PSP to load a firmware blob from a location in the BIOS image.
+ */
+int psp_load_named_blob(enum psp_blob_type type, const char *name)
+{
+ int cmd_status;
+ u32 command;
+ void *blob;
+ struct cbfsf cbfs_file;
+ struct region_device rdev;
+
+ switch (type) {
+ case BLOB_SMU_FW:
+ command = MBOX_BIOS_CMD_SMU_FW;
+ break;
+ case BLOB_SMU_FW2:
+ command = MBOX_BIOS_CMD_SMU_FW2;
+ break;
+ default:
+ printk(BIOS_ERR, "BUG: Invalid PSP blob type %x\n", type);
+ return -PSPSTS_INVALID_BLOB;
+ }
+
+ /* type can only be BLOB_SMU_FW or BLOB_SMU_FW2 here, so don't re-check for this */
+ if (!CONFIG(SOC_AMD_PSP_SELECTABLE_SMU_FW)) {
+ printk(BIOS_ERR, "BUG: Selectable firmware is not supported\n");
+ return -PSPSTS_UNSUPPORTED;
+ }
+
+ if (cbfs_boot_locate(&cbfs_file, name, NULL)) {
+ printk(BIOS_ERR, "BUG: Cannot locate blob for PSP loading\n");
+ return -PSPSTS_INVALID_NAME;
+ }
+
+ cbfs_file_data(&rdev, &cbfs_file);
+ blob = rdev_mmap_full(&rdev);
+ if (!blob) {
+ printk(BIOS_ERR, "BUG: Cannot map blob for PSP loading\n");
+ return -PSPSTS_INVALID_NAME;
+ }
+
+ printk(BIOS_DEBUG, "PSP: Load blob type %x from @%p... ", type, blob);
+
+ /* Blob commands use the buffer registers as data, not pointer to buf */
+ cmd_status = send_psp_command(command, blob);
+ psp_print_cmd_status(cmd_status, NULL);
+
+ rdev_munmap(&rdev, blob);
+ return cmd_status;
+}