From 673afd6f8e7266900b00a7cbeb275fe1a3d69cce Mon Sep 17 00:00:00 2001 From: Sieu Mun Tang Date: Fri, 13 May 2022 14:55:05 +0800 Subject: [PATCH] fix(intel): fix configuration status based on start request This patch is to fix configuration status command now returns the result based on the last config start command made to the runtime software. The status type can be either: - NO_REQUEST (default) - RECONFIGURATION - BITSTREAM_AUTH Signed-off-by: Sieu Mun Tang Change-Id: I1ce4b7b4c741d88de88778f8fbed7dfe83a39fbc --- .../soc/common/include/socfpga_sip_svc.h | 6 ++++ plat/intel/soc/common/socfpga_sip_svc.c | 35 +++++++++++++------ 2 files changed, 31 insertions(+), 10 deletions(-) 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: