Merge "dsp : Update timeout for spf_apm_ready_check"
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
c4a89a1cda
@@ -26,6 +26,7 @@
|
||||
#define SSR_RESET_CMD 1
|
||||
#define IMAGE_UNLOAD_CMD 0
|
||||
#define MAX_FW_IMAGES 4
|
||||
#define ADSP_LOADER_APM_TIMEOUT_MS 10000
|
||||
|
||||
enum spf_subsys_state {
|
||||
SPF_SUBSYS_DOWN,
|
||||
@@ -137,7 +138,7 @@ static void adsp_load_fw(struct work_struct *adsp_ldr_work)
|
||||
|
||||
load_adsp:
|
||||
{
|
||||
adsp_state = spf_core_is_apm_ready();
|
||||
adsp_state = spf_core_is_apm_ready(ADSP_LOADER_APM_TIMEOUT_MS);
|
||||
if (adsp_state == SPF_SUBSYS_DOWN) {
|
||||
if (!priv->adsp_fw_name) {
|
||||
dev_info(&pdev->dev, "%s: Load default ADSP\n",
|
||||
|
@@ -22,6 +22,7 @@
|
||||
#define TIMEOUT_MS 500
|
||||
#define MAX_RETRY_COUNT 3
|
||||
#define APM_READY_WAIT_DURATION 2
|
||||
#define GPR_SEND_PKT_APM_TIMEOUT_MS 0
|
||||
|
||||
struct audio_prm {
|
||||
struct gpr_device *adev;
|
||||
@@ -104,7 +105,8 @@ static int prm_gpr_send_pkt(struct gpr_pkt *pkt, wait_queue_head_t *wait)
|
||||
(gpr_get_q6_state() == GPR_SUBSYS_LOADED)) {
|
||||
pr_info("%s: apm ready check not done\n", __func__);
|
||||
retry = 0;
|
||||
while (!spf_core_is_apm_ready() && retry < MAX_RETRY_COUNT) {
|
||||
while (!spf_core_is_apm_ready(GPR_SEND_PKT_APM_TIMEOUT_MS) &&
|
||||
retry < MAX_RETRY_COUNT) {
|
||||
msleep(APM_READY_WAIT_DURATION);
|
||||
++retry;
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <dsp/spf-core.h>
|
||||
#include <dsp/digital-cdc-rsc-mgr.h>
|
||||
|
||||
#define APM_STATE_READY_TIMEOUT_MS 10000
|
||||
#define Q6_READY_TIMEOUT_MS 1000
|
||||
#define Q6_CLOSE_ALL_TIMEOUT_MS 5000
|
||||
#define APM_CMD_GET_SPF_STATE 0x01001021
|
||||
@@ -32,6 +31,7 @@
|
||||
#define APM_CMD_RSP_GET_SPF_STATE 0x02001007
|
||||
#define APM_MODULE_INSTANCE_ID 0x00000001
|
||||
#define GPR_SVC_ADSP_CORE 0x3
|
||||
#define ADD_CHILD_DEVICES_APM_TIMEOUT_MS 5000
|
||||
|
||||
struct spf_core {
|
||||
struct gpr_device *adev;
|
||||
@@ -158,7 +158,7 @@ done:
|
||||
*
|
||||
* Return: Will return true if apm is ready and false if not.
|
||||
*/
|
||||
bool spf_core_is_apm_ready(void)
|
||||
bool spf_core_is_apm_ready(int timeout_ms)
|
||||
{
|
||||
unsigned long timeout;
|
||||
bool ret = false;
|
||||
@@ -172,13 +172,16 @@ bool spf_core_is_apm_ready(void)
|
||||
if (!core)
|
||||
goto done;
|
||||
|
||||
timeout = jiffies + msecs_to_jiffies(APM_STATE_READY_TIMEOUT_MS);
|
||||
timeout = jiffies + msecs_to_jiffies(timeout_ms);
|
||||
mutex_lock(&core->lock);
|
||||
for (;;) {
|
||||
if (__spf_core_is_apm_ready(core)) {
|
||||
ret = true;
|
||||
break;
|
||||
}
|
||||
if (!timeout_ms)
|
||||
break;
|
||||
|
||||
usleep_range(50000, 50050);
|
||||
if (!time_after(timeout, jiffies)) {
|
||||
ret = false;
|
||||
@@ -336,7 +339,7 @@ static void spf_core_add_child_devices(struct work_struct *work)
|
||||
int ret;
|
||||
pr_err("%s:enumarate machine driver\n", __func__);
|
||||
|
||||
if(spf_core_is_apm_ready()) {
|
||||
if (spf_core_is_apm_ready(ADD_CHILD_DEVICES_APM_TIMEOUT_MS)) {
|
||||
dev_err(spf_core_priv->dev, "%s: apm is up\n",
|
||||
__func__);
|
||||
} else {
|
||||
|
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -14,7 +15,7 @@
|
||||
#define __SPF_CORE_H__
|
||||
#include <ipc/gpr-lite.h>
|
||||
|
||||
bool spf_core_is_apm_ready(void);
|
||||
bool spf_core_is_apm_ready(int timeout_ms);
|
||||
void spf_core_apm_close_all(void);
|
||||
|
||||
#endif
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/* Copyright (c) 2011-2017, 2019-2021 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2018, Linaro Limited
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -95,6 +95,11 @@ int gpr_send_pkt(struct gpr_device *adev, struct gpr_pkt *pkt)
|
||||
uint32_t pkt_size;
|
||||
int ret;
|
||||
|
||||
if (gpr_get_q6_state() == GPR_SUBSYS_DOWN) {
|
||||
pr_err_ratelimited("%s: q6 state is down\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if(!adev)
|
||||
{
|
||||
pr_err_ratelimited("%s: enter pointer adev[%pK] \n", __func__, adev);
|
||||
@@ -118,13 +123,11 @@ int gpr_send_pkt(struct gpr_device *adev, struct gpr_pkt *pkt)
|
||||
|
||||
if ((adev->domain_id == GPR_DOMAIN_ADSP) &&
|
||||
(gpr_get_q6_state() != GPR_SUBSYS_LOADED)) {
|
||||
dev_err_ratelimited(gpr->dev, "%s: domain_id[%d], Still Dsp is not Up\n",
|
||||
__func__, adev->domain_id);
|
||||
dev_err_ratelimited(gpr->dev, "%s: Still Dsp is not Up\n", __func__);
|
||||
return -ENETRESET;
|
||||
} else if ((adev->domain_id == GPR_DOMAIN_MODEM) &&
|
||||
} else if ((adev->domain_id == GPR_DOMAIN_MODEM) &&
|
||||
(gpr_get_modem_state() == GPR_SUBSYS_DOWN)) {
|
||||
dev_err_ratelimited(gpr->dev, "%s: domain_id[%d], Still Modem is not Up\n",
|
||||
__func__, adev->domain_id );
|
||||
dev_err_ratelimited(gpr->dev, "%s: Still Modem is not Up\n", __func__);
|
||||
return -ENETRESET;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user