2022-05-24 18:13:20

by Sibi Sankar

[permalink] [raw]
Subject: [PATCH 0/7] Miscellaneous PAS fixes

A collection of misc. fixes for the remoteproc PAS driver in general
and SM8450 remoteprocs in paticular.

Sibi Sankar (1):
remoteproc: qcom: pas: Add decrypt shutdown support for modem

Siddharth Gupta (5):
remoteproc: qcom: pas: Mark va as io memory
remoteproc: qcom: pas: Mark devices as wakeup capable
remoteproc: qcom: pas: Check if coredump is enabled
remoteproc: qcom: Check elf class before minidump
remoteproc: q6v5: Set q6 state to offline on receiving wdog irq

Yogesh Lal (1):
remoteproc: qcom: pas: Fixup the elf class for SM8450 remoteprocs

drivers/remoteproc/qcom_common.c | 6 +-
drivers/remoteproc/qcom_q6v5.c | 4 ++
drivers/remoteproc/qcom_q6v5_pas.c | 127 +++++++++++++++++++++++++++++++++++--
3 files changed, 131 insertions(+), 6 deletions(-)

--
2.7.4



2022-05-24 20:04:28

by Sibi Sankar

[permalink] [raw]
Subject: [PATCH 2/7] remoteproc: qcom: pas: Add decrypt shutdown support for modem

The initial shutdown request to modem on SM8450 SoCs would start the
decryption process and will keep returning errors until the modem shutdown
is complete. Fix this by retrying shutdowns in fixed intervals.

Err Logs on modem shutdown:
qcom_q6v5_pas 4080000.remoteproc: failed to shutdown: -22
remoteproc remoteproc3: can't stop rproc: -22

Fixes: 5cef9b48458d ("remoteproc: qcom: pas: Add SM8450 remoteproc support")
Signed-off-by: Sibi Sankar <[email protected]>
---
drivers/remoteproc/qcom_q6v5_pas.c | 49 ++++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)

diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c
index 8ce68d0bb1bc..7313fc0a3c01 100644
--- a/drivers/remoteproc/qcom_q6v5_pas.c
+++ b/drivers/remoteproc/qcom_q6v5_pas.c
@@ -8,6 +8,7 @@
*/

#include <linux/clk.h>
+#include <linux/delay.h>
#include <linux/firmware.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
@@ -29,6 +30,8 @@
#include "qcom_q6v5.h"
#include "remoteproc_internal.h"

+#define ADSP_DECRYPT_SHUTDOWN_DELAY_MS 100
+
struct adsp_data {
int crash_reason_smem;
const char *firmware_name;
@@ -37,6 +40,7 @@ struct adsp_data {
bool uses_elf64;
bool has_aggre2_clk;
bool auto_boot;
+ bool decrypt_shutdown;

char **proxy_pd_names;

@@ -66,6 +70,7 @@ struct qcom_adsp {
unsigned int minidump_id;
int crash_reason_smem;
bool has_aggre2_clk;
+ bool decrypt_shutdown;
const char *info_name;

struct completion start_done;
@@ -129,6 +134,20 @@ static void adsp_pds_disable(struct qcom_adsp *adsp, struct device **pds,
}
}

+static int adsp_decrypt_shutdown(struct qcom_adsp *adsp)
+{
+ int retry_num = 50;
+ int ret = -EINVAL;
+
+ while (retry_num && ret) {
+ msleep(ADSP_DECRYPT_SHUTDOWN_DELAY_MS);
+ ret = qcom_scm_pas_shutdown(adsp->pas_id);
+ retry_num--;
+ }
+
+ return ret;
+}
+
static int adsp_unprepare(struct rproc *rproc)
{
struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
@@ -250,6 +269,9 @@ static int adsp_stop(struct rproc *rproc)
dev_err(adsp->dev, "timed out on wait\n");

ret = qcom_scm_pas_shutdown(adsp->pas_id);
+ if (ret && adsp->decrypt_shutdown)
+ ret = adsp_decrypt_shutdown(adsp);
+
if (ret)
dev_err(adsp->dev, "failed to shutdown: %d\n", ret);

@@ -464,6 +486,7 @@ static int adsp_probe(struct platform_device *pdev)
adsp->pas_id = desc->pas_id;
adsp->has_aggre2_clk = desc->has_aggre2_clk;
adsp->info_name = desc->sysmon_name;
+ adsp->decrypt_shutdown = desc->decrypt_shutdown;
platform_set_drvdata(pdev, adsp);

device_wakeup_enable(adsp->dev);
@@ -538,6 +561,7 @@ static const struct adsp_data adsp_resource_init = {
.pas_id = 1,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.ssr_name = "lpass",
.sysmon_name = "adsp",
.ssctl_id = 0x14,
@@ -549,6 +573,7 @@ static const struct adsp_data sdm845_adsp_resource_init = {
.pas_id = 1,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.load_state = "adsp",
.ssr_name = "lpass",
.sysmon_name = "adsp",
@@ -561,6 +586,7 @@ static const struct adsp_data sm6350_adsp_resource = {
.pas_id = 1,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"lcx",
"lmx",
@@ -578,6 +604,7 @@ static const struct adsp_data sm8150_adsp_resource = {
.pas_id = 1,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"cx",
NULL
@@ -594,6 +621,7 @@ static const struct adsp_data sm8250_adsp_resource = {
.pas_id = 1,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"lcx",
"lmx",
@@ -611,6 +639,7 @@ static const struct adsp_data sm8350_adsp_resource = {
.pas_id = 1,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"lcx",
"lmx",
@@ -629,6 +658,7 @@ static const struct adsp_data sm8450_adsp_resource = {
.uses_elf64 = true,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"lcx",
"lmx",
@@ -646,6 +676,7 @@ static const struct adsp_data msm8996_adsp_resource = {
.pas_id = 1,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"cx",
NULL
@@ -661,6 +692,7 @@ static const struct adsp_data cdsp_resource_init = {
.pas_id = 18,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.ssr_name = "cdsp",
.sysmon_name = "cdsp",
.ssctl_id = 0x17,
@@ -672,6 +704,7 @@ static const struct adsp_data sdm845_cdsp_resource_init = {
.pas_id = 18,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.load_state = "cdsp",
.ssr_name = "cdsp",
.sysmon_name = "cdsp",
@@ -684,6 +717,7 @@ static const struct adsp_data sm6350_cdsp_resource = {
.pas_id = 18,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"cx",
"mx",
@@ -701,6 +735,7 @@ static const struct adsp_data sm8150_cdsp_resource = {
.pas_id = 18,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"cx",
NULL
@@ -717,6 +752,7 @@ static const struct adsp_data sm8250_cdsp_resource = {
.pas_id = 18,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"cx",
NULL
@@ -733,6 +769,7 @@ static const struct adsp_data sc8280xp_nsp0_resource = {
.pas_id = 18,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"nsp",
NULL
@@ -748,6 +785,7 @@ static const struct adsp_data sc8280xp_nsp1_resource = {
.pas_id = 30,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"nsp",
NULL
@@ -763,6 +801,7 @@ static const struct adsp_data sm8350_cdsp_resource = {
.pas_id = 18,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"cx",
"mxc",
@@ -781,6 +820,7 @@ static const struct adsp_data sm8450_cdsp_resource = {
.uses_elf64 = true,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"cx",
"mxc",
@@ -799,6 +839,7 @@ static const struct adsp_data mpss_resource_init = {
.minidump_id = 3,
.has_aggre2_clk = false,
.auto_boot = false,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"cx",
"mss",
@@ -816,6 +857,7 @@ static const struct adsp_data sc8180x_mpss_resource = {
.pas_id = 4,
.has_aggre2_clk = false,
.auto_boot = false,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"cx",
NULL
@@ -834,6 +876,7 @@ static const struct adsp_data sm8450_mpss_resource = {
.uses_elf64 = true,
.has_aggre2_clk = false,
.auto_boot = false,
+ .decrypt_shutdown = true,
.proxy_pd_names = (char*[]){
"cx",
"mss",
@@ -851,6 +894,7 @@ static const struct adsp_data slpi_resource_init = {
.pas_id = 12,
.has_aggre2_clk = true,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"ssc_cx",
NULL
@@ -866,6 +910,7 @@ static const struct adsp_data sm8150_slpi_resource = {
.pas_id = 12,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"lcx",
"lmx",
@@ -883,6 +928,7 @@ static const struct adsp_data sm8250_slpi_resource = {
.pas_id = 12,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"lcx",
"lmx",
@@ -900,6 +946,7 @@ static const struct adsp_data sm8350_slpi_resource = {
.pas_id = 12,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"lcx",
"lmx",
@@ -916,6 +963,7 @@ static const struct adsp_data wcss_resource_init = {
.firmware_name = "wcnss.mdt",
.pas_id = 6,
.auto_boot = true,
+ .decrypt_shutdown = false,
.ssr_name = "mpss",
.sysmon_name = "wcnss",
.ssctl_id = 0x12,
@@ -927,6 +975,7 @@ static const struct adsp_data sdx55_mpss_resource = {
.pas_id = 4,
.has_aggre2_clk = false,
.auto_boot = true,
+ .decrypt_shutdown = false,
.proxy_pd_names = (char*[]){
"cx",
"mss",
--
2.7.4


2022-05-25 06:06:35

by Sibi Sankar

[permalink] [raw]
Subject: [PATCH 6/7] remoteproc: qcom: Check elf class before minidump

From: Siddharth Gupta <[email protected]>

When the minidump is done with the elf64 class we need to create
the dumps using the section headers, otherwise we need to default
to dump creation using the program headers.

Fixes: 8ed8485c4f05 ("remoteproc: qcom: Add capability to collect minidumps")
Signed-off-by: Siddharth Gupta <[email protected]>
Signed-off-by: Sibi Sankar <[email protected]>
---
drivers/remoteproc/qcom_common.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/remoteproc/qcom_common.c b/drivers/remoteproc/qcom_common.c
index 4b91e3c9eafa..959fb24d57ec 100644
--- a/drivers/remoteproc/qcom_common.c
+++ b/drivers/remoteproc/qcom_common.c
@@ -174,7 +174,11 @@ void qcom_minidump(struct rproc *rproc, unsigned int minidump_id)
dev_err(&rproc->dev, "Failed with error: %d while adding minidump entries\n", ret);
goto clean_minidump;
}
- rproc_coredump_using_sections(rproc);
+
+ if (rproc->elf_class == ELFCLASS64)
+ rproc_coredump_using_sections(rproc);
+ else
+ rproc_coredump(rproc);
clean_minidump:
qcom_minidump_cleanup(rproc);
}
--
2.7.4


2022-05-25 06:26:25

by Sibi Sankar

[permalink] [raw]
Subject: [PATCH 1/7] remoteproc: qcom: pas: Fixup the elf class for SM8450 remoteprocs

From: Yogesh Lal <[email protected]>

The coredumps for the ADSP,CDSP and MPSS subsystems will be 64 bit from
SM8450 SoCs onward. Update the elf class as elf64 accordingly.

Fixes: 5cef9b48458d ("remoteproc: qcom: pas: Add SM8450 remoteproc support")
Signed-off-by: Yogesh Lal <[email protected]>
Signed-off-by: Sibi Sankar <[email protected]>
---
drivers/remoteproc/qcom_q6v5_pas.c | 68 +++++++++++++++++++++++++++++++++++---
1 file changed, 64 insertions(+), 4 deletions(-)

diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c
index 6ae39c5653b1..8ce68d0bb1bc 100644
--- a/drivers/remoteproc/qcom_q6v5_pas.c
+++ b/drivers/remoteproc/qcom_q6v5_pas.c
@@ -34,6 +34,7 @@ struct adsp_data {
const char *firmware_name;
int pas_id;
unsigned int minidump_id;
+ bool uses_elf64;
bool has_aggre2_clk;
bool auto_boot;

@@ -450,7 +451,11 @@ static int adsp_probe(struct platform_device *pdev)
}

rproc->auto_boot = desc->auto_boot;
- rproc_coredump_set_elf_info(rproc, ELFCLASS32, EM_NONE);
+
+ if (desc->uses_elf64)
+ rproc_coredump_set_elf_info(rproc, ELFCLASS64, EM_NONE);
+ else
+ rproc_coredump_set_elf_info(rproc, ELFCLASS32, EM_NONE);

adsp = (struct qcom_adsp *)rproc->priv;
adsp->dev = &pdev->dev;
@@ -617,6 +622,24 @@ static const struct adsp_data sm8350_adsp_resource = {
.ssctl_id = 0x14,
};

+static const struct adsp_data sm8450_adsp_resource = {
+ .crash_reason_smem = 423,
+ .firmware_name = "adsp.mdt",
+ .pas_id = 1,
+ .uses_elf64 = true,
+ .has_aggre2_clk = false,
+ .auto_boot = true,
+ .proxy_pd_names = (char*[]){
+ "lcx",
+ "lmx",
+ NULL
+ },
+ .load_state = "adsp",
+ .ssr_name = "lpass",
+ .sysmon_name = "adsp",
+ .ssctl_id = 0x14,
+};
+
static const struct adsp_data msm8996_adsp_resource = {
.crash_reason_smem = 423,
.firmware_name = "adsp.mdt",
@@ -751,6 +774,24 @@ static const struct adsp_data sm8350_cdsp_resource = {
.ssctl_id = 0x17,
};

+static const struct adsp_data sm8450_cdsp_resource = {
+ .crash_reason_smem = 601,
+ .firmware_name = "cdsp.mdt",
+ .pas_id = 18,
+ .uses_elf64 = true,
+ .has_aggre2_clk = false,
+ .auto_boot = true,
+ .proxy_pd_names = (char*[]){
+ "cx",
+ "mxc",
+ NULL
+ },
+ .load_state = "cdsp",
+ .ssr_name = "cdsp",
+ .sysmon_name = "cdsp",
+ .ssctl_id = 0x17,
+};
+
static const struct adsp_data mpss_resource_init = {
.crash_reason_smem = 421,
.firmware_name = "modem.mdt",
@@ -785,6 +826,25 @@ static const struct adsp_data sc8180x_mpss_resource = {
.ssctl_id = 0x12,
};

+static const struct adsp_data sm8450_mpss_resource = {
+ .crash_reason_smem = 421,
+ .firmware_name = "modem.mdt",
+ .pas_id = 4,
+ .minidump_id = 3,
+ .uses_elf64 = true,
+ .has_aggre2_clk = false,
+ .auto_boot = false,
+ .proxy_pd_names = (char*[]){
+ "cx",
+ "mss",
+ NULL
+ },
+ .load_state = "modem",
+ .ssr_name = "mpss",
+ .sysmon_name = "modem",
+ .ssctl_id = 0x12,
+};
+
static const struct adsp_data slpi_resource_init = {
.crash_reason_smem = 424,
.firmware_name = "slpi.mdt",
@@ -913,10 +973,10 @@ static const struct of_device_id adsp_of_match[] = {
{ .compatible = "qcom,sm8350-cdsp-pas", .data = &sm8350_cdsp_resource},
{ .compatible = "qcom,sm8350-slpi-pas", .data = &sm8350_slpi_resource},
{ .compatible = "qcom,sm8350-mpss-pas", .data = &mpss_resource_init},
- { .compatible = "qcom,sm8450-adsp-pas", .data = &sm8350_adsp_resource},
- { .compatible = "qcom,sm8450-cdsp-pas", .data = &sm8350_cdsp_resource},
+ { .compatible = "qcom,sm8450-adsp-pas", .data = &sm8450_adsp_resource},
+ { .compatible = "qcom,sm8450-cdsp-pas", .data = &sm8450_cdsp_resource},
{ .compatible = "qcom,sm8450-slpi-pas", .data = &sm8350_slpi_resource},
- { .compatible = "qcom,sm8450-mpss-pas", .data = &mpss_resource_init},
+ { .compatible = "qcom,sm8450-mpss-pas", .data = &sm8450_mpss_resource},
{ },
};
MODULE_DEVICE_TABLE(of, adsp_of_match);
--
2.7.4


2022-05-25 06:35:06

by Sibi Sankar

[permalink] [raw]
Subject: [PATCH 5/7] remoteproc: qcom: pas: Check if coredump is enabled

From: Siddharth Gupta <[email protected]>

Client drivers need to check if coredump is enabled for the rproc before
continuing with coredump generation. This change adds a check in the PAS
driver.

Fixes: 8ed8485c4f05 ("remoteproc: qcom: Add capability to collect minidumps")
Signed-off-by: Siddharth Gupta <[email protected]>
Signed-off-by: Sibi Sankar <[email protected]>
---
drivers/remoteproc/qcom_q6v5_pas.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c
index e25b9315c26d..815ef2c14475 100644
--- a/drivers/remoteproc/qcom_q6v5_pas.c
+++ b/drivers/remoteproc/qcom_q6v5_pas.c
@@ -93,6 +93,9 @@ static void adsp_minidump(struct rproc *rproc)
{
struct qcom_adsp *adsp = rproc->priv;

+ if (rproc->dump_conf == RPROC_COREDUMP_DISABLED)
+ return;
+
qcom_minidump(rproc, adsp->minidump_id);
}

--
2.7.4


2022-05-25 18:21:29

by Sibi Sankar

[permalink] [raw]
Subject: [PATCH 4/7] remoteproc: qcom: pas: Mark devices as wakeup capable

From: Siddharth Gupta <[email protected]>

device_wakeup_enable() on its own is not capable of setting
device as wakeup capable, it needs to be used in conjunction
with device_set_wakeup_capable(). The device_init_wakeup()
calls both these functions on the device passed.

Fixes: a781e5aa5911 ("remoteproc: core: Prevent system suspend during remoteproc recovery")
Signed-off-by: Siddharth Gupta <[email protected]>
Signed-off-by: Sibi Sankar <[email protected]>
---
drivers/remoteproc/qcom_q6v5_pas.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c
index a53f8a04f4af..e25b9315c26d 100644
--- a/drivers/remoteproc/qcom_q6v5_pas.c
+++ b/drivers/remoteproc/qcom_q6v5_pas.c
@@ -492,7 +492,9 @@ static int adsp_probe(struct platform_device *pdev)
adsp->decrypt_shutdown = desc->decrypt_shutdown;
platform_set_drvdata(pdev, adsp);

- device_wakeup_enable(adsp->dev);
+ ret = device_init_wakeup(adsp->dev, true);
+ if (ret)
+ goto free_rproc;

ret = adsp_alloc_memory_region(adsp);
if (ret)
--
2.7.4


2022-05-26 18:49:07

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 6/7] remoteproc: qcom: Check elf class before minidump

Hi Sibi,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on remoteproc/rproc-next]
[cannot apply to linux/master linus/master v5.18]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/intel-lab-lkp/linux/commits/Sibi-Sankar/Miscellaneous-PAS-fixes/20220524-211743
base: git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux.git rproc-next
config: arm-allmodconfig (https://download.01.org/0day-ci/archive/20220526/[email protected]/config)
compiler: arm-linux-gnueabi-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/0db77918ce08718d9dbaadd1ceed8dcfb6488abf
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Sibi-Sankar/Miscellaneous-PAS-fixes/20220524-211743
git checkout 0db77918ce08718d9dbaadd1ceed8dcfb6488abf
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <[email protected]>

All errors (new ones prefixed by >>, old ones prefixed by <<):

>> ERROR: modpost: "rproc_coredump" [drivers/remoteproc/qcom_common.ko] undefined!

--
0-DAY CI Kernel Test Service
https://01.org/lkp