vc/amd,soc/amd/mendocino: Add SVC_CMD_GET_PREV_BOOT_STATUS
Add an SVC command to get the previous boot status. If there is any pre-x86 boot failure in the previous boot cycle, PSP stores it in warm reset persistent register and triggers a warm reset. PSP verstage on the subsequent boot gets the previous boot status and reports any failure to the vboot before a FW slot is selected. BUG=b:242825052 TEST=Build Skyrim BIOS image and boot to OS in Skyrim. Trigger a failure scenario by corrupting certain firmware blobs and observe that PSP reports the failure boot status. On a normal boot, observed that PSP reports successful boot. Change-Id: I440deee560b72c80491bfdd7fda38a1c3a4299e5 Signed-off-by: Karthikeyan Ramasubramanian <kramasub@google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/70381 Reviewed-by: Raul Rangel <rrangel@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
committed by
Felix Held
parent
a0ff874489
commit
7b49d1b198
@ -215,3 +215,13 @@ uint32_t svc_set_fw_hash_table(struct psp_fw_hash_table *hash_table)
|
|||||||
SVC_CALL2(SVC_VERSTAGE_CMD, CMD_SET_FW_HASH_TABLE, (void *)¶m, retval);
|
SVC_CALL2(SVC_VERSTAGE_CMD, CMD_SET_FW_HASH_TABLE, (void *)¶m, retval);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t svc_get_prev_boot_status(uint32_t *boot_status)
|
||||||
|
{
|
||||||
|
uint32_t retval = 0;
|
||||||
|
struct cmd_param_get_prev_boot_status param = {
|
||||||
|
.ptr_boot_status = boot_status,
|
||||||
|
};
|
||||||
|
SVC_CALL2(SVC_VERSTAGE_CMD, CMD_GET_PREV_BOOT_STATUS, (void *)¶m, retval);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
@ -94,4 +94,8 @@ struct cmd_param_set_fw_hash_table {
|
|||||||
struct psp_fw_hash_table *ptr_psp_fw_hash_table;
|
struct psp_fw_hash_table *ptr_psp_fw_hash_table;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct cmd_param_get_prev_boot_status {
|
||||||
|
unsigned int *ptr_boot_status;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* PSP_VERSTAGE_SVC_H */
|
#endif /* PSP_VERSTAGE_SVC_H */
|
||||||
|
@ -343,6 +343,15 @@ uint32_t svc_ccp_dma(uint32_t spi_rom_offset, void *dest, uint32_t size);
|
|||||||
-----------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------*/
|
||||||
uint32_t svc_set_platform_boot_mode(enum chrome_platform_boot_mode boot_mode);
|
uint32_t svc_set_platform_boot_mode(enum chrome_platform_boot_mode boot_mode);
|
||||||
|
|
||||||
|
/* Get the previous boot status.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* - boot_status - Address where the boot status is read into
|
||||||
|
*
|
||||||
|
* Return value: BL_OK or error code
|
||||||
|
*/
|
||||||
|
uint32_t svc_get_prev_boot_status(uint32_t *boot_status);
|
||||||
|
|
||||||
/* C entry point for the Bootloader Userspace Application */
|
/* C entry point for the Bootloader Userspace Application */
|
||||||
void Main(void);
|
void Main(void);
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ enum verstage_cmd_id {
|
|||||||
CMD_CCP_DMA,
|
CMD_CCP_DMA,
|
||||||
CMD_SET_PLATFORM_BOOT_MODE,
|
CMD_SET_PLATFORM_BOOT_MODE,
|
||||||
CMD_SET_FW_HASH_TABLE,
|
CMD_SET_FW_HASH_TABLE,
|
||||||
|
CMD_GET_PREV_BOOT_STATUS,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mod_exp_params {
|
struct mod_exp_params {
|
||||||
@ -369,6 +370,15 @@ uint32_t svc_set_platform_boot_mode(enum chrome_platform_boot_mode boot_mode);
|
|||||||
*/
|
*/
|
||||||
uint32_t svc_set_fw_hash_table(struct psp_fw_hash_table *hash_table);
|
uint32_t svc_set_fw_hash_table(struct psp_fw_hash_table *hash_table);
|
||||||
|
|
||||||
|
/* Get the previous boot status.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* - boot_status - Address where the boot status is read into
|
||||||
|
*
|
||||||
|
* Return value: BL_OK or error code
|
||||||
|
*/
|
||||||
|
uint32_t svc_get_prev_boot_status(uint32_t *boot_status);
|
||||||
|
|
||||||
/* C entry point for the Bootloader Userspace Application */
|
/* C entry point for the Bootloader Userspace Application */
|
||||||
void Main(void);
|
void Main(void);
|
||||||
|
|
||||||
|
@ -410,6 +410,15 @@ static inline uint32_t svc_ccp_dma(uint32_t spi_rom_offset, void *dest, uint32_t
|
|||||||
return BL_ERR_UNSUPPORTED_PLATFORM;
|
return BL_ERR_UNSUPPORTED_PLATFORM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get the previous boot status.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* - boot_status - Address where the boot status is read into
|
||||||
|
*
|
||||||
|
* Return value: BL_OK or error code
|
||||||
|
*/
|
||||||
|
uint32_t svc_get_prev_boot_status(uint32_t *boot_status);
|
||||||
|
|
||||||
/* C entry point for the Bootloader Userspace Application */
|
/* C entry point for the Bootloader Userspace Application */
|
||||||
void Main(void);
|
void Main(void);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user