diff --git a/plat/intel/soc/common/include/socfpga_mailbox.h b/plat/intel/soc/common/include/socfpga_mailbox.h index 1ba09bc..399ac57 100644 --- a/plat/intel/soc/common/include/socfpga_mailbox.h +++ b/plat/intel/soc/common/include/socfpga_mailbox.h @@ -85,6 +85,7 @@ #define MBOX_CFGSTAT_STATE_CONFIG 0x10000000 /* Mailbox reconfiguration commands */ +#define MBOX_CONFIG_STATUS 4 #define MBOX_RECONFIG 6 #define MBOX_RECONFIG_DATA 8 #define MBOX_RECONFIG_STATUS 9 @@ -102,5 +103,6 @@ int mailbox_read_response(int job_id, uint32_t *response); int mailbox_get_qspi_clock(void); void mailbox_reset_cold(void); +uint32_t intel_mailbox_get_config_status(uint32_t cmd); #endif /* SOCFPGA_MBOX_H */ diff --git a/plat/intel/soc/common/soc/socfpga_mailbox.c b/plat/intel/soc/common/soc/socfpga_mailbox.c index 27838bf..b972c44 100644 --- a/plat/intel/soc/common/soc/socfpga_mailbox.c +++ b/plat/intel/soc/common/soc/socfpga_mailbox.c @@ -8,6 +8,7 @@ #include #include "socfpga_mailbox.h" +#include "socfpga_sip_svc.h" static int fill_mailbox_circular_buffer(uint32_t header_cmd, uint32_t *args, int len) @@ -278,3 +279,31 @@ return 0; } +uint32_t intel_mailbox_get_config_status(uint32_t cmd) +{ + uint32_t status, res; + uint32_t response[6]; + + status = mailbox_send_cmd(1, cmd, NULL, 0, 0, response); + + if (status < 0) + return INTEL_SIP_SMC_STATUS_ERROR; + + res = response[RECONFIG_STATUS_STATE]; + if (res && res != MBOX_CFGSTAT_STATE_CONFIG) + return INTEL_SIP_SMC_STATUS_ERROR; + + res = response[RECONFIG_STATUS_PIN_STATUS]; + if (!(res & PIN_STATUS_NSTATUS)) + return INTEL_SIP_SMC_STATUS_ERROR; + + res = response[RECONFIG_STATUS_SOFTFUNC_STATUS]; + if (res & SOFTFUNC_STATUS_SEU_ERROR) + return INTEL_SIP_SMC_STATUS_ERROR; + + if ((res & SOFTFUNC_STATUS_CONF_DONE) && + (res & SOFTFUNC_STATUS_INIT_DONE)) + return INTEL_SIP_SMC_STATUS_OK; + + return MBOX_CFGSTAT_STATE_CONFIG; +} diff --git a/plat/intel/soc/common/socfpga_sip_svc.c b/plat/intel/soc/common/socfpga_sip_svc.c index 61218eb..421fa44 100644 --- a/plat/intel/soc/common/socfpga_sip_svc.c +++ b/plat/intel/soc/common/socfpga_sip_svc.c @@ -100,34 +100,7 @@ uint32_t intel_mailbox_fpga_config_isdone(void) { - uint32_t args[2]; - uint32_t response[6]; - int status; - - status = mailbox_send_cmd(1, MBOX_RECONFIG_STATUS, args, 0, 0, - response); - - if (status < 0) - return INTEL_SIP_SMC_STATUS_ERROR; - - if (response[RECONFIG_STATUS_STATE] && - response[RECONFIG_STATUS_STATE] != MBOX_CFGSTAT_STATE_CONFIG) - return INTEL_SIP_SMC_STATUS_ERROR; - - if (!(response[RECONFIG_STATUS_PIN_STATUS] & PIN_STATUS_NSTATUS)) - return INTEL_SIP_SMC_STATUS_ERROR; - - if (response[RECONFIG_STATUS_SOFTFUNC_STATUS] & - SOFTFUNC_STATUS_SEU_ERROR) - return INTEL_SIP_SMC_STATUS_ERROR; - - if ((response[RECONFIG_STATUS_SOFTFUNC_STATUS] & - SOFTFUNC_STATUS_CONF_DONE) && - (response[RECONFIG_STATUS_SOFTFUNC_STATUS] & - SOFTFUNC_STATUS_INIT_DONE)) - return INTEL_SIP_SMC_STATUS_OK; - - return INTEL_SIP_SMC_STATUS_ERROR; + return intel_mailbox_get_config_status(MBOX_RECONFIG_STATUS); } static int mark_last_buffer_xfer_completed(uint32_t *buffer_addr_completed)