diff --git a/plat/intel/soc/common/soc/socfpga_mailbox.c b/plat/intel/soc/common/soc/socfpga_mailbox.c index 3bb2561..4bae66e 100644 --- a/plat/intel/soc/common/soc/socfpga_mailbox.c +++ b/plat/intel/soc/common/soc/socfpga_mailbox.c @@ -46,6 +46,7 @@ int rin = 0; int rout = 0; int resp_data = 0; + int ret_resp_len; if (mmio_read_32(MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM)) mmio_write_32(MBOX_OFFSET + MBOX_DOORBELL_FROM_SDM, 0); @@ -67,13 +68,19 @@ *job_id = MBOX_RESP_JOB_ID(resp_data); + ret_resp_len = MBOX_RESP_LEN(resp_data); + + if (ret_resp_len != 0) { + ret_resp_len = iterate_resp(ret_resp_len, response, + resp_len); + } + if (MBOX_RESP_ERR(resp_data) > 0) { INFO("Error in response: %x\n", resp_data); return -resp_data; } - return iterate_resp(MBOX_RESP_LEN(resp_data), - response, resp_len); + return ret_resp_len; } return MBOX_NO_RESPONSE; } @@ -86,6 +93,7 @@ int rin = 0; int rout = 0; int resp_data = 0; + int ret_resp_len; while (1) { @@ -130,13 +138,20 @@ || MBOX_RESP_JOB_ID(resp_data) != job_id) continue; + ret_resp_len = MBOX_RESP_LEN(resp_data); + + if (ret_resp_len != 0) { + ret_resp_len = iterate_resp(ret_resp_len, + response, + resp_len); + } + if (MBOX_RESP_ERR(resp_data) > 0) { INFO("Error in response: %x\n", resp_data); return -MBOX_RESP_ERR(resp_data); } - return iterate_resp(MBOX_RESP_LEN(resp_data), - response, resp_len); + return ret_resp_len; } } }