Merge "ASoC: wcd934x: skip mutex lock for WDSP boot timeout debug dump"

This commit is contained in:
Linux Build Service Account
2018-07-09 11:56:34 -07:00
committed by Gerrit - the friendly Code Review server
2 changed files with 43 additions and 12 deletions

View File

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

View File

@@ -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",