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 <sieu.mun.tang@intel.com>
Change-Id: I1ce4b7b4c741d88de88778f8fbed7dfe83a39fbc
This commit is contained in:
Sieu Mun Tang 2022-05-13 14:55:05 +08:00
parent 762c34a85d
commit 673afd6f8e
2 changed files with 31 additions and 10 deletions

View File

@ -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);

View File

@ -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: