Merge "ASoC: wcd934x: skip mutex lock for WDSP boot timeout debug dump"
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
8e4d9058d3
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
@@ -839,21 +839,20 @@ static int wdsp_ssr_handler(struct wdsp_mgr_priv *wdsp, void *arg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_FS
|
#ifdef CONFIG_DEBUG_FS
|
||||||
static int wdsp_debug_dump_handler(struct wdsp_mgr_priv *wdsp, void *arg)
|
static int __wdsp_dbg_dump_locked(struct wdsp_mgr_priv *wdsp, void *arg)
|
||||||
{
|
{
|
||||||
struct wdsp_err_signal_arg *err_data;
|
struct wdsp_err_signal_arg *err_data;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex);
|
|
||||||
/* If there is no SSR, set the SSR type to collect ramdumps */
|
/* If there is no SSR, set the SSR type to collect ramdumps */
|
||||||
if (wdsp->ssr_type == WDSP_SSR_TYPE_NO_SSR) {
|
if (wdsp->ssr_type == WDSP_SSR_TYPE_NO_SSR) {
|
||||||
wdsp->ssr_type = WDSP_SSR_TYPE_WDSP_DOWN;
|
wdsp->ssr_type = WDSP_SSR_TYPE_WDSP_DOWN;
|
||||||
} else {
|
} else {
|
||||||
WDSP_DBG(wdsp, "SSR handling is running, skip debug ramdump");
|
WDSP_DBG(wdsp, "SSR handling is running, skip debug ramdump");
|
||||||
ret = 0;
|
ret = 0;
|
||||||
WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex);
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arg) {
|
if (arg) {
|
||||||
err_data = (struct wdsp_err_signal_arg *) arg;
|
err_data = (struct wdsp_err_signal_arg *) arg;
|
||||||
memcpy(&wdsp->dump_data.err_data, err_data,
|
memcpy(&wdsp->dump_data.err_data, err_data,
|
||||||
@@ -861,16 +860,29 @@ static int wdsp_debug_dump_handler(struct wdsp_mgr_priv *wdsp, void *arg)
|
|||||||
} else {
|
} else {
|
||||||
WDSP_DBG(wdsp, "Invalid input, arg is NULL");
|
WDSP_DBG(wdsp, "Invalid input, arg is NULL");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex);
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
wdsp_collect_ramdumps(wdsp);
|
wdsp_collect_ramdumps(wdsp);
|
||||||
wdsp->ssr_type = WDSP_SSR_TYPE_NO_SSR;
|
wdsp->ssr_type = WDSP_SSR_TYPE_NO_SSR;
|
||||||
WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex);
|
|
||||||
done:
|
done:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
static int wdsp_debug_dump_handler(struct wdsp_mgr_priv *wdsp, void *arg)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->ssr_mutex);
|
||||||
|
ret = __wdsp_dbg_dump_locked(wdsp, arg);
|
||||||
|
WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->ssr_mutex);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
|
static int __wdsp_dbg_dump_locked(struct wdsp_mgr_priv *wdsp, void *arg)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int wdsp_debug_dump_handler(struct wdsp_mgr_priv *wdsp, void *arg)
|
static int wdsp_debug_dump_handler(struct wdsp_mgr_priv *wdsp, void *arg)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@@ -887,7 +899,13 @@ static int wdsp_signal_handler(struct device *wdsp_dev,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
wdsp = dev_get_drvdata(wdsp_dev);
|
wdsp = dev_get_drvdata(wdsp_dev);
|
||||||
|
|
||||||
|
#ifdef CONFIG_DEBUG_FS
|
||||||
|
if (signal != WDSP_DEBUG_DUMP_INTERNAL)
|
||||||
|
WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->api_mutex);
|
||||||
|
#else
|
||||||
WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->api_mutex);
|
WDSP_MGR_MUTEX_LOCK(wdsp, wdsp->api_mutex);
|
||||||
|
#endif
|
||||||
|
|
||||||
WDSP_DBG(wdsp, "Raised signal %d", signal);
|
WDSP_DBG(wdsp, "Raised signal %d", signal);
|
||||||
|
|
||||||
@@ -908,6 +926,9 @@ static int wdsp_signal_handler(struct device *wdsp_dev,
|
|||||||
case WDSP_DEBUG_DUMP:
|
case WDSP_DEBUG_DUMP:
|
||||||
ret = wdsp_debug_dump_handler(wdsp, arg);
|
ret = wdsp_debug_dump_handler(wdsp, arg);
|
||||||
break;
|
break;
|
||||||
|
case WDSP_DEBUG_DUMP_INTERNAL:
|
||||||
|
ret = __wdsp_dbg_dump_locked(wdsp, arg);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
break;
|
break;
|
||||||
@@ -916,7 +937,13 @@ static int wdsp_signal_handler(struct device *wdsp_dev,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
WDSP_ERR(wdsp, "handling signal %d failed with error %d",
|
WDSP_ERR(wdsp, "handling signal %d failed with error %d",
|
||||||
signal, ret);
|
signal, ret);
|
||||||
|
|
||||||
|
#ifdef CONFIG_DEBUG_FS
|
||||||
|
if (signal != WDSP_DEBUG_DUMP_INTERNAL)
|
||||||
|
WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->api_mutex);
|
||||||
|
#else
|
||||||
WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->api_mutex);
|
WDSP_MGR_MUTEX_UNLOCK(wdsp, wdsp->api_mutex);
|
||||||
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@@ -101,6 +101,7 @@ static u16 wdsp_reg_for_debug_dump[] = {
|
|||||||
WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL,
|
WCD934X_CPE_SS_SOC_SW_COLLAPSE_CTL,
|
||||||
WCD934X_CPE_SS_MAD_CTL,
|
WCD934X_CPE_SS_MAD_CTL,
|
||||||
WCD934X_CPE_SS_CPAR_CTL,
|
WCD934X_CPE_SS_CPAR_CTL,
|
||||||
|
WCD934X_CPE_SS_CPAR_CFG,
|
||||||
WCD934X_CPE_SS_WDOG_CFG,
|
WCD934X_CPE_SS_WDOG_CFG,
|
||||||
WCD934X_CPE_SS_STATUS,
|
WCD934X_CPE_SS_STATUS,
|
||||||
WCD934X_CPE_SS_SS_ERROR_INT_MASK_0A,
|
WCD934X_CPE_SS_SS_ERROR_INT_MASK_0A,
|
||||||
@@ -113,10 +114,12 @@ static u16 wdsp_reg_for_debug_dump[] = {
|
|||||||
WCD934X_CPE_SS_SS_ERROR_INT_STATUS_1B,
|
WCD934X_CPE_SS_SS_ERROR_INT_STATUS_1B,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void wcd_cntl_collect_debug_dumps(struct wcd_dsp_cntl *cntl)
|
static void wcd_cntl_collect_debug_dumps(struct wcd_dsp_cntl *cntl,
|
||||||
|
bool internal)
|
||||||
{
|
{
|
||||||
struct snd_soc_codec *codec = cntl->codec;
|
struct snd_soc_codec *codec = cntl->codec;
|
||||||
struct wdsp_err_signal_arg arg;
|
struct wdsp_err_signal_arg arg;
|
||||||
|
enum wdsp_signal signal;
|
||||||
int i;
|
int i;
|
||||||
u8 val;
|
u8 val;
|
||||||
|
|
||||||
@@ -146,8 +149,8 @@ static void wcd_cntl_collect_debug_dumps(struct wcd_dsp_cntl *cntl)
|
|||||||
arg.mem_dumps_enabled = cntl->ramdump_enable;
|
arg.mem_dumps_enabled = cntl->ramdump_enable;
|
||||||
arg.remote_start_addr = WCD_934X_RAMDUMP_START_ADDR;
|
arg.remote_start_addr = WCD_934X_RAMDUMP_START_ADDR;
|
||||||
arg.dump_size = WCD_934X_RAMDUMP_SIZE;
|
arg.dump_size = WCD_934X_RAMDUMP_SIZE;
|
||||||
cntl->m_ops->signal_handler(cntl->m_dev, WDSP_DEBUG_DUMP,
|
signal = internal ? WDSP_DEBUG_DUMP_INTERNAL : WDSP_DEBUG_DUMP;
|
||||||
&arg);
|
cntl->m_ops->signal_handler(cntl->m_dev, signal, &arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unmask the fatal irqs */
|
/* Unmask the fatal irqs */
|
||||||
@@ -161,7 +164,8 @@ static void wcd_cntl_collect_debug_dumps(struct wcd_dsp_cntl *cntl)
|
|||||||
#else
|
#else
|
||||||
#define WCD_CNTL_SET_ERR_IRQ_FLAG(cntl) 0
|
#define WCD_CNTL_SET_ERR_IRQ_FLAG(cntl) 0
|
||||||
#define WCD_CNTL_CLR_ERR_IRQ_FLAG(cntl) do {} while (0)
|
#define WCD_CNTL_CLR_ERR_IRQ_FLAG(cntl) do {} while (0)
|
||||||
static void wcd_cntl_collect_debug_dumps(struct wcd_dsp_cntl *cntl)
|
static void wcd_cntl_collect_debug_dumps(struct wcd_dsp_cntl *cntl,
|
||||||
|
bool internal)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -753,7 +757,7 @@ static int wcd_cntl_do_boot(struct wcd_dsp_cntl *cntl)
|
|||||||
if (!ret) {
|
if (!ret) {
|
||||||
dev_err(codec->dev, "%s: WDSP boot timed out\n",
|
dev_err(codec->dev, "%s: WDSP boot timed out\n",
|
||||||
__func__);
|
__func__);
|
||||||
wcd_cntl_collect_debug_dumps(cntl);
|
wcd_cntl_collect_debug_dumps(cntl, true);
|
||||||
ret = -ETIMEDOUT;
|
ret = -ETIMEDOUT;
|
||||||
goto err_boot;
|
goto err_boot;
|
||||||
} else {
|
} else {
|
||||||
@@ -1041,7 +1045,7 @@ static ssize_t wcd_miscdev_write(struct file *filep, const char __user *ubuf,
|
|||||||
} else if (!strcmp(val, "DEBUG_DUMP")) {
|
} else if (!strcmp(val, "DEBUG_DUMP")) {
|
||||||
dev_dbg(cntl->codec->dev,
|
dev_dbg(cntl->codec->dev,
|
||||||
"%s: Collect dumps for debug use\n", __func__);
|
"%s: Collect dumps for debug use\n", __func__);
|
||||||
wcd_cntl_collect_debug_dumps(cntl);
|
wcd_cntl_collect_debug_dumps(cntl, false);
|
||||||
goto done;
|
goto done;
|
||||||
} else {
|
} else {
|
||||||
dev_err(cntl->codec->dev, "%s: Invalid value %s\n",
|
dev_err(cntl->codec->dev, "%s: Invalid value %s\n",
|
||||||
|
Reference in New Issue
Block a user