diff --git a/plat/intel/soc/common/include/socfpga_sip_svc.h b/plat/intel/soc/common/include/socfpga_sip_svc.h index f9a6ffdec..0803eb5db 100644 --- a/plat/intel/soc/common/include/socfpga_sip_svc.h +++ b/plat/intel/soc/common/include/socfpga_sip_svc.h @@ -180,6 +180,12 @@ struct fpga_config_info { int block_number; }; +typedef enum { + NO_REQUEST = 0, + RECONFIGURATION, + BITSTREAM_AUTH +} config_type; + /* Function Definitions */ bool is_size_4_bytes_aligned(uint32_t size); bool is_address_in_ddr_range(uint64_t addr, uint64_t size); diff --git a/plat/intel/soc/common/socfpga_sip_svc.c b/plat/intel/soc/common/socfpga_sip_svc.c index f7dd3929a..f079349f3 100644 --- a/plat/intel/soc/common/socfpga_sip_svc.c +++ b/plat/intel/soc/common/socfpga_sip_svc.c @@ -19,6 +19,7 @@ /* Total buffer the driver can hold */ #define FPGA_CONFIG_BUFFER_SIZE 4 +static config_type request_type = NO_REQUEST; static int current_block, current_buffer; static int read_block, max_blocks; static uint32_t send_id, rcv_id; @@ -27,10 +28,8 @@ static bool bridge_disable; /* RSU static variables */ static uint32_t rsu_dcmf_ver[4] = {0}; - -/* RSU Max Retry */ -static uint32_t rsu_max_retry; static uint16_t rsu_dcmf_stat[4] = {0}; +static uint32_t rsu_max_retry; /* SiP Service UUID */ DEFINE_SVC_UUID2(intl_svc_uid, @@ -89,28 +88,39 @@ static int intel_fpga_sdm_write_all(void) return 0; } -static uint32_t intel_mailbox_fpga_config_isdone(uint32_t query_type) +static uint32_t intel_mailbox_fpga_config_isdone(void) { uint32_t ret; - if (query_type == 1U) { - ret = intel_mailbox_get_config_status(MBOX_CONFIG_STATUS, false); - } else { - ret = intel_mailbox_get_config_status(MBOX_RECONFIG_STATUS, true); + switch (request_type) { + case RECONFIGURATION: + ret = intel_mailbox_get_config_status(MBOX_RECONFIG_STATUS, + true); + break; + case BITSTREAM_AUTH: + ret = intel_mailbox_get_config_status(MBOX_RECONFIG_STATUS, + false); + break; + default: + ret = intel_mailbox_get_config_status(MBOX_CONFIG_STATUS, + false); + break; } if (ret != 0U) { if (ret == MBOX_CFGSTAT_STATE_CONFIG) { return INTEL_SIP_SMC_STATUS_BUSY; } else { + request_type = NO_REQUEST; return INTEL_SIP_SMC_STATUS_ERROR; } } - if (bridge_disable) { + if (bridge_disable != 0U) { socfpga_bridges_enable(~0); /* Enable bridge */ bridge_disable = false; } + request_type = NO_REQUEST; return INTEL_SIP_SMC_STATUS_OK; } @@ -169,6 +179,7 @@ static int intel_fpga_config_completed_write(uint32_t *completed_addr, if (status != MBOX_NO_RESPONSE && status != MBOX_TIMEOUT && resp_len != 0) { mailbox_clear_response(); + request_type = NO_REQUEST; return INTEL_SIP_SMC_STATUS_ERROR; } @@ -205,6 +216,8 @@ static int intel_fpga_config_start(uint32_t flag) unsigned int size = 0; unsigned int resp_len = ARRAY_SIZE(response); + request_type = RECONFIGURATION; + if (!CONFIG_TEST_FLAG(flag, PARTIAL_CONFIG)) { bridge_disable = true; } @@ -212,6 +225,7 @@ static int intel_fpga_config_start(uint32_t flag) if (CONFIG_TEST_FLAG(flag, AUTHENTICATION)) { size = 1; bridge_disable = false; + request_type = BITSTREAM_AUTH; } mailbox_clear_response(); @@ -224,6 +238,7 @@ static int intel_fpga_config_start(uint32_t flag) if (status < 0) { bridge_disable = false; + request_type = NO_REQUEST; return INTEL_SIP_SMC_STATUS_ERROR; } @@ -644,7 +659,7 @@ uintptr_t sip_smc_handler_v1(uint32_t smc_fid, SMC_UUID_RET(handle, intl_svc_uid); case INTEL_SIP_SMC_FPGA_CONFIG_ISDONE: - status = intel_mailbox_fpga_config_isdone(x1); + status = intel_mailbox_fpga_config_isdone(); SMC_RET4(handle, status, 0, 0, 0); case INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM: