From: Siew Chin Lim <[email protected]> commit cda742d28bc9236a17b2eb89b09e15925ba64c24 from https://github.com/altera-opensource/linux-socfpga.git socfpga-6.1.68-lts.
Change INTEL_SIP_SMC_FCS_GET_PROVISION_DATA's SMC call to async from sync to avoid long runtime which may cause the watchdog timeout issue. Signed-off-by: Richard Gong <[email protected]> Signed-off-by: Siew Chin Lim <[email protected]> Signed-off-by: Liwei Song <[email protected]> --- drivers/crypto/intel_fcs_main.c | 60 +++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/drivers/crypto/intel_fcs_main.c b/drivers/crypto/intel_fcs_main.c index 05ca55ca1032..94bee786ee51 100644 --- a/drivers/crypto/intel_fcs_main.c +++ b/drivers/crypto/intel_fcs_main.c @@ -688,33 +688,59 @@ static long fcs_ioctl(struct file *file, unsigned int cmd, } msg->command = COMMAND_FCS_GET_PROVISION_DATA; - msg->payload = s_buf; - msg->payload_length = data->com_paras.gp_data.size; - priv->client.receive_cb = fcs_data_callback; + msg->payload = NULL; + msg->payload_length = 0; + priv->client.receive_cb = fcs_vab_callback; ret = fcs_request_service(priv, (void *)msg, FCS_REQUEST_TIMEOUT); if (!ret && !priv->status) { - if (!priv->kbuf) { - dev_err(dev, "failure on kbuf\n"); - fcs_close_services(priv, s_buf, NULL); - return -EFAULT; - } - data->com_paras.gp_data.size = priv->size; - ret = copy_to_user(data->com_paras.gp_data.addr, - priv->kbuf, priv->size); - if (ret) { - dev_err(dev, "failure on copy_to_user\n"); - fcs_close_services(priv, s_buf, NULL); - return -EFAULT; + /* to query the complete status */ + msg->arg[0] = ASYNC_POLL_SERVICE; + msg->payload = s_buf; + msg->payload_length = data->com_paras.gp_data.size; + msg->command = COMMAND_POLL_SERVICE_STATUS_ASYNC; + priv->client.receive_cb = fcs_data_callback; + + timeout = 100; + while (timeout != 0) { + ret = fcs_request_service(priv, (void *)msg, + FCS_REQUEST_TIMEOUT); + dev_dbg(dev, "request service ret=%d\n", ret); + + if (!ret && !priv->status) { + if (priv->size) { + if (!priv->kbuf) { + dev_err(dev, "failure on kbuf\n"); + fcs_close_services(priv, s_buf, NULL); + return -EFAULT; + } + + data->com_paras.gp_data.size = priv->size; + ret = copy_to_user(data->com_paras.gp_data.addr, + priv->kbuf, priv->size); + if (ret) { + dev_err(dev, "failure on copy_to_user\n"); + fcs_close_services(priv, s_buf, NULL); + return -EFAULT; + } + break; + } + } else { + data->com_paras.gp_data.addr = NULL; + data->com_paras.gp_data.size = 0; + break; + } + timeout--; + mdelay(500); } - data->status = 0; } else { data->com_paras.gp_data.addr = NULL; data->com_paras.gp_data.size = 0; - data->status = priv->status; } + data->status = priv->status; + if (copy_to_user((void __user *)arg, data, sizeof(*data))) { dev_err(dev, "failure on copy_to_user\n"); fcs_close_services(priv, s_buf, NULL); -- 2.35.5
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#14057): https://lists.yoctoproject.org/g/linux-yocto/message/14057 Mute This Topic: https://lists.yoctoproject.org/mt/106736320/21656 Mute #18015689699-2:https://lists.yoctoproject.org/g/linux-yocto/mutehashtag/18015689699-2 Group Owner: [email protected] Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
