Felix Held has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/40360 )
Change subject: soc/amd/common/block/psp: move psp_load_named_blob to psp_gen1.c ......................................................................
soc/amd/common/block/psp: move psp_load_named_blob to psp_gen1.c
This function is only needed and valid for the 1st generation PSP interface used on stoneyridge.
BUG=b:153677737
Change-Id: Ia1be09c32271fe9480a0acbe324c4a45d8620882 Signed-off-by: Felix Held felix-coreboot@felixheld.de --- M src/soc/amd/common/block/psp/psp.c M src/soc/amd/common/block/psp/psp_def.h M src/soc/amd/common/block/psp/psp_gen1.c 3 files changed, 59 insertions(+), 56 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/60/40360/1
diff --git a/src/soc/amd/common/block/psp/psp.c b/src/soc/amd/common/block/psp/psp.c index 22404be..479c28b 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 @@ * 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 @@ 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 @@ 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 3775516..f3ac5c2 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 @@ #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 0e5aa30..b707933 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 @@
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; +}
Raul Rangel has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/40360 )
Change subject: soc/amd/common/block/psp: move psp_load_named_blob to psp_gen1.c ......................................................................
Patch Set 1: Code-Review+2
Angel Pons has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/40360 )
Change subject: soc/amd/common/block/psp: move psp_load_named_blob to psp_gen1.c ......................................................................
Patch Set 1: Code-Review+2
Felix Held has submitted this change. ( https://review.coreboot.org/c/coreboot/+/40360 )
Change subject: soc/amd/common/block/psp: move psp_load_named_blob to psp_gen1.c ......................................................................
soc/amd/common/block/psp: move psp_load_named_blob to psp_gen1.c
This function is only needed and valid for the 1st generation PSP interface used on stoneyridge.
BUG=b:153677737
Change-Id: Ia1be09c32271fe9480a0acbe324c4a45d8620882 Signed-off-by: Felix Held felix-coreboot@felixheld.de Reviewed-on: https://review.coreboot.org/c/coreboot/+/40360 Tested-by: build bot (Jenkins) no-reply@coreboot.org Reviewed-by: Raul Rangel rrangel@chromium.org Reviewed-by: Angel Pons th3fanbus@gmail.com --- M src/soc/amd/common/block/psp/psp.c M src/soc/amd/common/block/psp/psp_def.h M src/soc/amd/common/block/psp/psp_gen1.c 3 files changed, 59 insertions(+), 56 deletions(-)
Approvals: build bot (Jenkins): Verified Raul Rangel: Looks good to me, approved Angel Pons: Looks good to me, approved
diff --git a/src/soc/amd/common/block/psp/psp.c b/src/soc/amd/common/block/psp/psp.c index 22404be..479c28b 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 @@ * 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 @@ 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 @@ 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 3775516..f3ac5c2 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 @@ #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 0e5aa30..b707933 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 @@
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; +}