arm/css/scpi: Don't panic if the SCP fails to respond

Instead, pass back the error to the calling function. This allows
platform code to fall back to another PSCI implementation if
scpi_wait_ready() or a later SCPI command fails.

Signed-off-by: Samuel Holland <samuel@sholland.org>
Change-Id: Ib4411e63c2512857f09ffffe1c405358dddeb4a6
This commit is contained in:
Samuel Holland 2018-10-21 12:44:24 -05:00
parent 51d72d3adb
commit 98367c8061
1 changed files with 16 additions and 6 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2014-2020, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@ -51,7 +51,7 @@ static void scpi_secure_message_send(size_t payload_size)
mhu_secure_message_send(SCPI_MHU_SLOT_ID);
}
static void scpi_secure_message_receive(scpi_cmd_t *cmd)
static int scpi_secure_message_receive(scpi_cmd_t *cmd)
{
uint32_t mhu_status;
@ -63,7 +63,7 @@ static void scpi_secure_message_receive(scpi_cmd_t *cmd)
if (mhu_status != (1 << SCPI_MHU_SLOT_ID)) {
ERROR("MHU: Unexpected protocol (MHU status: 0x%x)\n",
mhu_status);
panic();
return -1;
}
/*
@ -74,6 +74,8 @@ static void scpi_secure_message_receive(scpi_cmd_t *cmd)
dmbld();
memcpy(cmd, (void *) SCPI_SHARED_MEM_SCP_TO_AP, sizeof(*cmd));
return 0;
}
static void scpi_secure_message_end(void)
@ -84,14 +86,19 @@ static void scpi_secure_message_end(void)
int scpi_wait_ready(void)
{
scpi_cmd_t scpi_cmd;
int rc;
VERBOSE("Waiting for SCP_READY command...\n");
/* Get a message from the SCP */
scpi_secure_message_start();
scpi_secure_message_receive(&scpi_cmd);
rc = scpi_secure_message_receive(&scpi_cmd);
scpi_secure_message_end();
/* If no message was received, don't send a response */
if (rc != 0)
return rc;
/* We are expecting 'SCP Ready', produce correct error if it's not */
scpi_status_t status = SCP_OK;
if (scpi_cmd.id != SCPI_CMD_SCP_READY) {
@ -209,7 +216,8 @@ int scpi_get_css_power_state(unsigned int mpidr, unsigned int *cpu_state_p,
* Send message and wait for SCP's response
*/
scpi_secure_message_send(0);
scpi_secure_message_receive(&response);
if (scpi_secure_message_receive(&response) != 0)
goto exit;
if (response.status != SCP_OK)
goto exit;
@ -254,7 +262,9 @@ uint32_t scpi_sys_power_state(scpi_system_state_t system_state)
*payload_addr = system_state & 0xff;
scpi_secure_message_send(sizeof(*payload_addr));
scpi_secure_message_receive(&response);
/* If no response is received, fill in an error status */
if (scpi_secure_message_receive(&response) != 0)
response.status = SCP_E_TIMEOUT;
scpi_secure_message_end();