@ -1,5 +1,5 @@
/*
* Copyright ( c ) 2020 , Intel Corporation . All rights reserved .
* Copyright ( c ) 2020 - 2022 , Intel Corporation . All rights reserved .
*
* SPDX - License - Identifier : BSD - 3 - Clause
*/
@ -59,9 +59,7 @@ static int write_mailbox_cmd_buffer(uint32_t *cin, uint32_t cout,
}
mdelay ( 10U ) ;
} else {
mmio_write_32 ( MBOX_OFFSET + MBOX_CMD_BUFFER +
( * cin * 4 ) , data ) ;
( * cin ) + + ;
mmio_write_32 ( MBOX_ENTRY_TO_ADDR ( CMD , ( * cin ) + + ) , data ) ;
* cin % = MBOX_CMD_BUFFER_SIZE ;
mmio_write_32 ( MBOX_OFFSET + MBOX_CIN , * cin ) ;
break ;
@ -107,9 +105,7 @@ static int fill_mailbox_circular_buffer(uint32_t header_cmd, uint32_t *args,
}
}
if ( ! is_doorbell_triggered ) {
mmio_write_32 ( MBOX_OFFSET + MBOX_DOORBELL_TO_SDM , 1U ) ;
}
mmio_write_32 ( MBOX_OFFSET + MBOX_DOORBELL_TO_SDM , 1U ) ;
return MBOX_RET_OK ;
@ -131,7 +127,7 @@ restart_mailbox:
}
int mailbox_read_response ( unsigned int * job_id , uint32_t * response ,
unsigned int resp_len )
unsigned int * resp_len )
{
uint32_t rin ;
uint32_t rout ;
@ -146,8 +142,7 @@ int mailbox_read_response(unsigned int *job_id, uint32_t *response,
rout = mmio_read_32 ( MBOX_OFFSET + MBOX_ROUT ) ;
if ( rout ! = rin ) {
resp_data = mmio_read_32 ( MBOX_OFFSET +
MBOX_RESP_BUFFER + ( ( rout + + ) * 4U ) ) ;
resp_data = mmio_read_32 ( MBOX_ENTRY_TO_ADDR ( RESP , ( rout ) + + ) ) ;
rout % = MBOX_RESP_BUFFER_SIZE ;
mmio_write_32 ( MBOX_OFFSET + MBOX_ROUT , rout ) ;
@ -161,9 +156,9 @@ int mailbox_read_response(unsigned int *job_id, uint32_t *response,
ret_resp_len = MBOX_RESP_LEN ( resp_data ) ;
if ( ret_resp_len ! = 0U ) {
ret_resp_len = iterate_resp ( ret_resp_len , response ,
resp_len ) ;
if ( iterate_resp ( ret_resp_len , response , resp_len )
! = MBOX_RET_OK ) {
return MBOX_TIMEOUT ;
}
if ( MBOX_RESP_ERR ( resp_data ) > 0U ) {
@ -171,14 +166,14 @@ int mailbox_read_response(unsigned int *job_id, uint32_t *response,
return - MBOX_RESP_ERR ( resp_data ) ;
}
return ret_resp_len ;
return MBOX_RET_OK ;
}
return MBOX_NO_RESPONSE ;
}
int mailbox_poll_response ( uint32_t job_id , uint32_t urgent , uint32_t * response ,
unsigned int resp_len )
unsigned int * resp_len )
{
unsigned int timeout = 40U ;
unsigned int sdm_loop = 255U ;
@ -221,8 +216,8 @@ int mailbox_poll_response(uint32_t job_id, uint32_t urgent, uint32_t *response,
rout = mmio_read_32 ( MBOX_OFFSET + MBOX_ROUT ) ;
while ( rout ! = rin ) {
resp_data = mmio_read_32 ( MBOX_OFFSET +
MBOX_RESP_BUFFER + ( ( rout + + ) * 4U ) ) ;
resp_data = mmio_read_32 ( MBOX_ENTRY_TO_ADDR ( RESP ,
( rout ) + + ) ) ;
rout % = MBOX_RESP_BUFFER_SIZE ;
mmio_write_32 ( MBOX_OFFSET + MBOX_ROUT , rout ) ;
@ -234,10 +229,9 @@ int mailbox_poll_response(uint32_t job_id, uint32_t urgent, uint32_t *response,
ret_resp_len = MBOX_RESP_LEN ( resp_data ) ;
if ( ret_resp_len ! = 0U ) {
ret_resp_len = iterate_resp ( ret_resp_len ,
response ,
resp_len ) ;
if ( iterate_resp ( ret_resp_len , response , resp_len )
! = MBOX_RET_OK ) {
return MBOX_TIMEOUT ;
}
if ( MBOX_RESP_ERR ( resp_data ) > 0U ) {
@ -245,7 +239,7 @@ int mailbox_poll_response(uint32_t job_id, uint32_t urgent, uint32_t *response,
return - MBOX_RESP_ERR ( resp_data ) ;
}
return ret_resp_len ;
return MBOX_RET_OK ;
}
sdm_loop - - ;
@ -255,8 +249,8 @@ int mailbox_poll_response(uint32_t job_id, uint32_t urgent, uint32_t *response,
return MBOX_TIMEOUT ;
}
unsigned int iterate_resp ( uint32_t mbox_resp_len , uint32_t * resp_buf ,
unsigned int resp_len )
int iterate_resp ( uint32_t mbox_resp_len , uint32_t * resp_buf ,
unsigned int * resp_len )
{
unsigned int timeout , total_resp_len = 0U ;
uint32_t resp_data ;
@ -266,17 +260,15 @@ unsigned int iterate_resp(uint32_t mbox_resp_len, uint32_t *resp_buf,
while ( mbox_resp_len > 0U ) {
timeout = 100U ;
mbox_resp_len - - ;
resp_data = mmio_read_32 ( MBOX_OFFSET +
MBOX_RESP_BUFFER +
( rout ) * 4U ) ;
resp_data = mmio_read_32 ( MBOX_ENTRY_TO_ADDR ( RESP , ( rout ) + + ) ) ;
if ( ( resp_buf ! = NULL ) & & ( resp_len ! = 0U ) ) {
if ( ( resp_buf ! = NULL ) & & ( resp_len ! = NULL )
& & ( * resp_len ! = 0U ) ) {
* ( resp_buf + total_resp_len )
= resp_data ;
resp_len - - ;
* resp_len = * resp_len - 1 ;
total_resp_len + + ;
}
rout + + ;
rout % = MBOX_RESP_BUFFER_SIZE ;
mmio_write_32 ( MBOX_OFFSET + MBOX_ROUT , rout ) ;
@ -295,7 +287,11 @@ unsigned int iterate_resp(uint32_t mbox_resp_len, uint32_t *resp_buf,
return MBOX_TIMEOUT ;
}
}
return total_resp_len ;
if ( resp_len )
* resp_len = total_resp_len ;
return MBOX_RET_OK ;
}
int mailbox_send_cmd_async ( uint32_t * job_id , uint32_t cmd , uint32_t * args ,
@ -320,7 +316,7 @@ int mailbox_send_cmd_async(uint32_t *job_id, uint32_t cmd, uint32_t *args,
int mailbox_send_cmd ( uint32_t job_id , uint32_t cmd , uint32_t * args ,
unsigned int len , uint32_t urgent , uint32_t * response ,
unsigned int resp_len )
unsigned int * resp_len )
{
int status = 0 ;
@ -366,20 +362,20 @@ void mailbox_set_qspi_open(void)
{
mailbox_set_int ( MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE ) ;
mailbox_send_cmd ( MBOX_JOB_ID , MBOX_CMD_QSPI_OPEN , NULL , 0U ,
CMD_CASUAL , NULL , 0U ) ;
CMD_CASUAL , NULL , NULL ) ;
}
void mailbox_set_qspi_direct ( void )
{
mailbox_send_cmd ( MBOX_JOB_ID , MBOX_CMD_QSPI_DIRECT , NULL , 0U ,
CMD_CASUAL , NULL , 0U ) ;
CMD_CASUAL , NULL , NULL ) ;
}
void mailbox_set_qspi_close ( void )
{
mailbox_set_int ( MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE ) ;
mailbox_send_cmd ( MBOX_JOB_ID , MBOX_CMD_QSPI_CLOSE , NULL , 0U ,
CMD_CASUAL , NULL , 0U ) ;
CMD_CASUAL , NULL , NULL ) ;
}
void mailbox_qspi_set_cs ( uint32_t device_select )
@ -390,7 +386,7 @@ void mailbox_qspi_set_cs(uint32_t device_select)
cs_setting = ( device_select < < 28 ) ;
mailbox_set_int ( MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE ) ;
mailbox_send_cmd ( MBOX_JOB_ID , MBOX_CMD_QSPI_SET_CS , & cs_setting ,
1U , CMD_CASUAL , NULL , 0U ) ;
1U , CMD_CASUAL , NULL , NULL ) ;
}
void mailbox_hps_qspi_enable ( void )
@ -403,14 +399,14 @@ void mailbox_reset_cold(void)
{
mailbox_set_int ( MBOX_INT_FLAG_COE | MBOX_INT_FLAG_RIE ) ;
mailbox_send_cmd ( MBOX_JOB_ID , MBOX_CMD_REBOOT_HPS , NULL , 0U ,
CMD_CASUAL , NULL , 0U ) ;
CMD_CASUAL , NULL , NULL ) ;
}
int mailbox_rsu_get_spt_offset ( uint32_t * resp_buf , unsigned int resp_buf_len )
{
return mailbox_send_cmd ( MBOX_JOB_ID , MBOX_GET_SUBPARTITION_TABLE ,
NULL , 0U , CMD_CASUAL , resp_buf ,
resp_buf_len ) ;
& resp_buf_len ) ;
}
struct rsu_status_info {
@ -432,7 +428,7 @@ int mailbox_rsu_status(uint32_t *resp_buf, unsigned int resp_buf_len)
ret = mailbox_send_cmd ( MBOX_JOB_ID , MBOX_RSU_STATUS , NULL , 0U ,
CMD_CASUAL , resp_buf ,
resp_buf_len ) ;
& resp_buf_len ) ;
if ( ret < 0 ) {
return ret ;
@ -451,14 +447,14 @@ int mailbox_rsu_update(uint32_t *flash_offset)
{
return mailbox_send_cmd ( MBOX_JOB_ID , MBOX_RSU_UPDATE ,
flash_offset , 2U ,
CMD_CASUAL , NULL , 0U ) ;
CMD_CASUAL , NULL , NULL ) ;
}
int mailbox_hps_stage_notify ( uint32_t execution_stage )
{
return mailbox_send_cmd ( MBOX_JOB_ID , MBOX_HPS_STAGE_NOTIFY ,
& execution_stage , 1U , CMD_CASUAL ,
NULL , 0U ) ;
NULL , NULL ) ;
}
int mailbox_init ( void )
@ -471,7 +467,7 @@ int mailbox_init(void)
mmio_write_32 ( MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM , 0U ) ;
status = mailbox_send_cmd ( 0U , MBOX_CMD_RESTART , NULL , 0U ,
CMD_URGENT , NULL , 0U ) ;
CMD_URGENT , NULL , NULL ) ;
if ( status ! = 0 ) {
return status ;
@ -483,13 +479,14 @@ int mailbox_init(void)
return MBOX_RET_OK ;
}
int intel_mailbox_get_config_status ( uint32_t cmd )
int intel_mailbox_get_config_status ( uint32_t cmd , bool init_done )
{
int status ;
uint32_t res , response [ 6 ] ;
unsigned int resp_len = ARRAY_SIZE ( response ) ;
status = mailbox_send_cmd ( MBOX_JOB_ID , cmd , NULL , 0U , CMD_CASUAL ,
response , ARRAY_SIZE ( response ) ) ;
response , & resp_len ) ;
if ( status < 0 ) {
return status ;
@ -510,20 +507,22 @@ int intel_mailbox_get_config_status(uint32_t cmd)
return MBOX_CFGSTAT_STATE_ERROR_HARDWARE ;
}
if ( ( res & SOFTFUNC_STATUS_CONF_DONE ) ! = 0U & &
( res & SOFTFUNC_STATUS_INIT_DONE ) ! = 0U ) {
return MBOX_RET_OK ;
}
if ( ( res & SOFTFUNC_STATUS_CONF_DONE ) = = 0U )
return MBOX_CFGSTAT_STATE_CONFIG ;
return MBOX_CFGSTAT_STATE_CONFIG ;
if ( init_done & & ( res & SOFTFUNC_STATUS_INIT_DONE ) = = 0U )
return MBOX_CFGSTAT_STATE_CONFIG ;
return MBOX_RET_OK ;
}
int intel_mailbox_is_fpga_not_ready ( void )
{
int ret = intel_mailbox_get_config_status ( MBOX_RECONFIG_STATUS ) ;
int ret = intel_mailbox_get_config_status ( MBOX_RECONFIG_STATUS , true ) ;
if ( ( ret ! = MBOX_RET_OK ) & & ( ret ! = MBOX_CFGSTAT_STATE_CONFIG ) ) {
ret = intel_mailbox_get_config_status ( MBOX_CONFIG_STATUS ) ;
ret = intel_mailbox_get_config_status ( MBOX_CONFIG_STATUS ,
false ) ;
}
return ret ;