Re: [PATCH 2/3] remoteproc: qcom: Add capability to collect minidumps

2020-08-07 Thread kernel test robot
Hi Gurbir,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on next-20200807]
[cannot apply to linux/master linus/master v5.8 v5.8-rc7 v5.8-rc6 v5.8]
[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/0day-ci/linux/commits/Gurbir-Arora/Introduce-mini-dump-support-for-remoteproc/20200808-073315
base:471e638c4c5df4c0035a76a561ada4d28228e5fd
config: i386-allyesconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce (this is a W=1 build):
# save the attached .config to linux build tree
make W=1 ARCH=i386 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

All errors (new ones prefixed by >>):

   In file included from arch/x86/include/asm/page_32.h:35,
from arch/x86/include/asm/page.h:14,
from arch/x86/include/asm/thread_info.h:12,
from include/linux/thread_info.h:38,
from arch/x86/include/asm/preempt.h:7,
from include/linux/preempt.h:78,
from include/linux/spinlock.h:51,
from include/linux/swait.h:7,
from include/linux/completion.h:12,
from drivers/remoteproc/remoteproc_coredump.c:8:
   In function 'memcpy',
   inlined from 'add_minidump_segments' at 
drivers/remoteproc/remoteproc_coredump.c:491:4,
   inlined from 'rproc_minidump' at 
drivers/remoteproc/remoteproc_coredump.c:530:10:
>> include/linux/string.h:393:4: error: call to '__write_overflow' declared 
>> with attribute error: detected write beyond size of object passed as 1st 
>> parameter
 393 |__write_overflow();
 |^~

vim +/__write_overflow +393 include/linux/string.h

6974f0c4555e28 Daniel Micay  2017-07-12  386  
6974f0c4555e28 Daniel Micay  2017-07-12  387  __FORTIFY_INLINE void 
*memcpy(void *p, const void *q, __kernel_size_t size)
6974f0c4555e28 Daniel Micay  2017-07-12  388  {
6974f0c4555e28 Daniel Micay  2017-07-12  389size_t p_size = 
__builtin_object_size(p, 0);
6974f0c4555e28 Daniel Micay  2017-07-12  390size_t q_size = 
__builtin_object_size(q, 0);
6974f0c4555e28 Daniel Micay  2017-07-12  391if (__builtin_constant_p(size)) 
{
6974f0c4555e28 Daniel Micay  2017-07-12  392if (p_size < size)
6974f0c4555e28 Daniel Micay  2017-07-12 @393
__write_overflow();
6974f0c4555e28 Daniel Micay  2017-07-12  394if (q_size < size)
6974f0c4555e28 Daniel Micay  2017-07-12  395
__read_overflow2();
6974f0c4555e28 Daniel Micay  2017-07-12  396}
6974f0c4555e28 Daniel Micay  2017-07-12  397if (p_size < size || q_size < 
size)
6974f0c4555e28 Daniel Micay  2017-07-12  398fortify_panic(__func__);
47227d27e2fcb0 Daniel Axtens 2020-06-03  399return __underlying_memcpy(p, 
q, size);
6974f0c4555e28 Daniel Micay  2017-07-12  400  }
6974f0c4555e28 Daniel Micay  2017-07-12  401  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org


.config.gz
Description: application/gzip


Re: [PATCH 2/3] remoteproc: qcom: Add capability to collect minidumps

2020-08-07 Thread kernel test robot
Hi Gurbir,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on next-20200807]
[cannot apply to linux/master linus/master v5.8 v5.8-rc7 v5.8-rc6 v5.8]
[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/0day-ci/linux/commits/Gurbir-Arora/Introduce-mini-dump-support-for-remoteproc/20200808-073315
base:471e638c4c5df4c0035a76a561ada4d28228e5fd
config: x86_64-randconfig-s022-20200807 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.2-118-ge1578773-dirty
# save the attached .config to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

All errors (new ones prefixed by >>):

   ld: drivers/remoteproc/remoteproc_coredump.o: in function `rproc_minidump':
>> drivers/remoteproc/remoteproc_coredump.c:510: undefined reference to 
>> `qcom_smem_get'

sparse warnings: (new ones prefixed by >>)

>> drivers/remoteproc/remoteproc_coredump.c:489:25: sparse: sparse: incorrect 
>> type in argument 2 (different address spaces) @@ expected void const 
>> *from @@ got struct md_ss_region [noderef] __iomem *[assigned] 
>> region_info @@
>> drivers/remoteproc/remoteproc_coredump.c:489:25: sparse: expected void 
>> const *from
>> drivers/remoteproc/remoteproc_coredump.c:489:25: sparse: got struct 
>> md_ss_region [noderef] __iomem *[assigned] region_info
>> drivers/remoteproc/remoteproc_coredump.c:491:25: sparse: sparse: incorrect 
>> type in argument 2 (different address spaces) @@ expected void const 
>> *from @@ got void [noderef] __iomem *[assigned] offset @@
   drivers/remoteproc/remoteproc_coredump.c:491:25: sparse: expected void 
const *from
>> drivers/remoteproc/remoteproc_coredump.c:491:25: sparse: got void 
>> [noderef] __iomem *[assigned] offset
   drivers/remoteproc/remoteproc_coredump.c:493:25: sparse: sparse: incorrect 
type in argument 2 (different address spaces) @@ expected void const *from 
@@ got void [noderef] __iomem *[assigned] offset @@
   drivers/remoteproc/remoteproc_coredump.c:493:25: sparse: expected void 
const *from
   drivers/remoteproc/remoteproc_coredump.c:493:25: sparse: got void 
[noderef] __iomem *[assigned] offset

vim +510 drivers/remoteproc/remoteproc_coredump.c

   460  
   461  static void add_minidump_segments(struct rproc *rproc, struct md_ss_toc 
*minidump_ss)
   462  {
   463  struct md_ss_region __iomem *region_info, *ptr;
   464  int i, seg_cnt = minidump_ss->ss_region_count;
   465  void __iomem *offset;
   466  dma_addr_t da;
   467  size_t size;
   468  char *name;
   469  
   470  if (!list_empty(&rproc->dump_segments))
   471  goto minidump;
   472  
   473  region_info = ioremap((unsigned 
long)minidump_ss->md_ss_smem_regions_baseptr,
   474seg_cnt * sizeof(struct md_ss_region));
   475  
   476  if (!region_info) {
   477  dev_err(&rproc->dev, "invalid minidump subsystem 
table\n");
   478  return;
   479  }
   480  
   481  /* Iterate over the subsystem's segments and create rproc 
custom dump segments */
   482  ptr = region_info;
   483  offset = ptr;
   484  for (i = 0; i < seg_cnt; i++) {
   485  offset = region_info;
   486  offset += sizeof(region_info->name) + 
sizeof(region_info->seq_num);
   487  if (__raw_readl(offset) == MD_REGION_VALID) {
   488  name = kmalloc(MAX_REGION_NAME_LENGTH, 
GFP_KERNEL);
 > 489  memcpy(name, region_info, 
 > sizeof(region_info->name));
   490  offset += sizeof(region_info->md_valid);
 > 491  memcpy(&da, offset, 
 > sizeof(region_info->region_base_address));
   492  offset += 
sizeof(region_info->region_base_address);
   493  memcpy(&size, offset, 
sizeof(region_info->region_size));
   494  rproc_coredump_add_custom_segment(rproc, da, 
size, NULL, name);
   495  }
   496  region_info++;
   497  }
   498  
   499  minidump:
   500  return do_rproc_minidump(rproc);
   501  }
   502  
   503  void rproc_minidump(struct rproc *rproc)
   504  {
   505  struct md_ss_toc *minidump_ss;
   506  size_t size;
   507  
   508  /* Get Global minidump ToC*/
   509  if (!g_md_toc)
 > 510  g_md_toc = qcom_smem_get(QCOM_SMEM_HOST_ANY,

---
0-DAY CI Kernel Test Service, Intel Corporation
https://l

Re: [PATCH 2/3] remoteproc: qcom: Add capability to collect minidumps

2020-08-07 Thread kernel test robot
Hi Gurbir,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on next-20200807]
[cannot apply to linux/master linus/master v5.8 v5.8-rc7 v5.8-rc6 v5.8]
[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/0day-ci/linux/commits/Gurbir-Arora/Introduce-mini-dump-support-for-remoteproc/20200808-073315
base:471e638c4c5df4c0035a76a561ada4d28228e5fd
config: nios2-randconfig-s032-20200807 (attached as .config)
compiler: nios2-linux-gcc (GCC) 9.3.0
reproduce:
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# apt-get install sparse
# sparse version: v0.6.2-118-ge1578773-dirty
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1 
CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=nios2 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 


sparse warnings: (new ones prefixed by >>)

>> drivers/remoteproc/remoteproc_coredump.c:489:38: sparse: sparse: incorrect 
>> type in argument 2 (different address spaces) @@ expected void const *s 
>> @@ got struct md_ss_region [noderef] __iomem *[assigned] region_info @@
>> drivers/remoteproc/remoteproc_coredump.c:489:38: sparse: expected void 
>> const *s
   drivers/remoteproc/remoteproc_coredump.c:489:38: sparse: got struct 
md_ss_region [noderef] __iomem *[assigned] region_info
>> drivers/remoteproc/remoteproc_coredump.c:491:37: sparse: sparse: incorrect 
>> type in argument 2 (different address spaces) @@ expected void const *s 
>> @@ got void [noderef] __iomem *[assigned] offset @@
   drivers/remoteproc/remoteproc_coredump.c:491:37: sparse: expected void 
const *s
   drivers/remoteproc/remoteproc_coredump.c:491:37: sparse: got void 
[noderef] __iomem *[assigned] offset
   drivers/remoteproc/remoteproc_coredump.c:493:39: sparse: sparse: incorrect 
type in argument 2 (different address spaces) @@ expected void const *s @@  
   got void [noderef] __iomem *[assigned] offset @@
   drivers/remoteproc/remoteproc_coredump.c:493:39: sparse: expected void 
const *s
   drivers/remoteproc/remoteproc_coredump.c:493:39: sparse: got void 
[noderef] __iomem *[assigned] offset

vim +489 drivers/remoteproc/remoteproc_coredump.c

   460  
   461  static void add_minidump_segments(struct rproc *rproc, struct md_ss_toc 
*minidump_ss)
   462  {
   463  struct md_ss_region __iomem *region_info, *ptr;
   464  int i, seg_cnt = minidump_ss->ss_region_count;
   465  void __iomem *offset;
   466  dma_addr_t da;
   467  size_t size;
   468  char *name;
   469  
   470  if (!list_empty(&rproc->dump_segments))
   471  goto minidump;
   472  
   473  region_info = ioremap((unsigned 
long)minidump_ss->md_ss_smem_regions_baseptr,
   474seg_cnt * sizeof(struct md_ss_region));
   475  
   476  if (!region_info) {
   477  dev_err(&rproc->dev, "invalid minidump subsystem 
table\n");
   478  return;
   479  }
   480  
   481  /* Iterate over the subsystem's segments and create rproc 
custom dump segments */
   482  ptr = region_info;
   483  offset = ptr;
   484  for (i = 0; i < seg_cnt; i++) {
   485  offset = region_info;
   486  offset += sizeof(region_info->name) + 
sizeof(region_info->seq_num);
   487  if (__raw_readl(offset) == MD_REGION_VALID) {
   488  name = kmalloc(MAX_REGION_NAME_LENGTH, 
GFP_KERNEL);
 > 489  memcpy(name, region_info, 
 > sizeof(region_info->name));
   490  offset += sizeof(region_info->md_valid);
 > 491  memcpy(&da, offset, 
 > sizeof(region_info->region_base_address));
   492  offset += 
sizeof(region_info->region_base_address);
   493  memcpy(&size, offset, 
sizeof(region_info->region_size));
   494  rproc_coredump_add_custom_segment(rproc, da, 
size, NULL, name);
   495  }
   496  region_info++;
   497  }
   498  
   499  minidump:
   500  return do_rproc_minidump(rproc);
   501  }
   502  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org


.config.gz
Description: application/gzip


[PATCH 2/3] remoteproc: qcom: Add capability to collect minidumps

2020-08-07 Thread Gurbir Arora
This patch adds support for collecting minidump in the
event of remoteproc crash. Parse the minidump table
based on remoteproc's unique minidump-id, read all
memory regions from the remoteproc's minidump table
entry and expose the memory to userspace.
The remoteproc platform driver can choose to collect
a full/mini dump by specifying the coredump op.

Signed-off-by: Rishabh Bhatnagar 
Signed-off-by: Gurbir Arora 
---
 drivers/remoteproc/qcom_minidump.h  |  64 +
 drivers/remoteproc/qcom_q6v5_pas.c  |  20 ++-
 drivers/remoteproc/remoteproc_core.c|   1 +
 drivers/remoteproc/remoteproc_coredump.c| 211 +++-
 drivers/remoteproc/remoteproc_elf_helpers.h |  27 
 drivers/remoteproc/remoteproc_internal.h|   2 +
 include/linux/remoteproc.h  |   2 +
 7 files changed, 324 insertions(+), 3 deletions(-)
 create mode 100644 drivers/remoteproc/qcom_minidump.h

diff --git a/drivers/remoteproc/qcom_minidump.h 
b/drivers/remoteproc/qcom_minidump.h
new file mode 100644
index 000..437e030
--- /dev/null
+++ b/drivers/remoteproc/qcom_minidump.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef __QCOM_MINIDUMP_H
+#define __QCOM_MINIDUMP_H
+
+#define MAX_NUM_OF_SS   10
+#define MAX_REGION_NAME_LENGTH  16
+#define SBL_MINIDUMP_SMEM_ID   602
+#define MD_REGION_VALID('V' << 24 | 'A' << 16 | 'L' << 8 | 'I' 
<< 0)
+#define MD_SS_ENCR_DONE('D' << 24 | 'O' << 16 | 'N' << 8 | 'E' 
<< 0)
+#define MD_SS_ENABLED  ('E' << 24 | 'N' << 16 | 'B' << 8 | 'L' << 0)
+
+/**
+ * md_ss_region - Minidump region
+ * @name   : Name of the region to be dumped
+ * @seq_num:   : Use to differentiate regions with same name.
+ * @md_valid   : This entry to be dumped (if set to 1)
+ * @region_base_address: Physical address of region to be dumped
+ * @region_size: Size of the region
+ */
+struct md_ss_region {
+   charname[MAX_REGION_NAME_LENGTH];
+   u32 seq_num;
+   u32 md_valid;
+   u64 region_base_address;
+   u64 region_size;
+};
+
+/**
+ * md_ss_toc: Subsystem's SMEM Table of content
+ * @md_ss_toc_init : Subsystem toc init status
+ * @md_ss_enable_status : if set to 1, this region would be copied during 
coredump
+ * @encryption_status: Encryption status for this subsystem
+ * @encryption_required : Decides to encrypt the subsystem regions or not
+ * @ss_region_count : Number of regions added in this subsystem toc
+ * @md_ss_smem_regions_baseptr : regions base pointer of the subsystem
+ */
+struct md_ss_toc {
+   u32 md_ss_toc_init;
+   u32 md_ss_enable_status;
+   u32 encryption_status;
+   u32 encryption_required;
+   u32 ss_region_count;
+   u64 md_ss_smem_regions_baseptr;
+};
+
+/**
+ * md_global_toc: Global Table of Content
+ * @md_toc_init : Global Minidump init status
+ * @md_revision : Minidump revision
+ * @md_enable_status : Minidump enable status
+ * @md_ss_toc : Array of subsystems toc
+ */
+struct md_global_toc {
+   u32 md_toc_init;
+   u32 md_revision;
+   u32 md_enable_status;
+   struct md_ss_tocmd_ss_toc[MAX_NUM_OF_SS];
+};
+
+#endif
diff --git a/drivers/remoteproc/qcom_q6v5_pas.c 
b/drivers/remoteproc/qcom_q6v5_pas.c
index 3837f23..270c640 100644
--- a/drivers/remoteproc/qcom_q6v5_pas.c
+++ b/drivers/remoteproc/qcom_q6v5_pas.c
@@ -33,6 +33,7 @@ struct adsp_data {
int crash_reason_smem;
const char *firmware_name;
int pas_id;
+   int minidump_id;
bool has_aggre2_clk;
bool auto_boot;
 
@@ -258,6 +259,15 @@ static unsigned long adsp_panic(struct rproc *rproc)
.panic = adsp_panic,
 };
 
+static struct rproc_ops adsp_minidump_ops = {
+   .start = adsp_start,
+   .stop = adsp_stop,
+   .da_to_va = adsp_da_to_va,
+   .load = adsp_load,
+   .coredump = rproc_minidump,
+   .panic = adsp_panic,
+};
+
 static int adsp_init_clock(struct qcom_adsp *adsp)
 {
int ret;
@@ -398,14 +408,20 @@ static int adsp_probe(struct platform_device *pdev)
if (ret < 0 && ret != -EINVAL)
return ret;
 
-   rproc = rproc_alloc(&pdev->dev, pdev->name, &adsp_ops,
-   fw_name, sizeof(*adsp));
+   if (desc->minidump_id)
+   rproc = rproc_alloc(&pdev->dev, pdev->name, &adsp_minidump_ops,
+   fw_name, sizeof(*adsp));
+   else
+   rproc = rproc_alloc(&pdev->dev, pdev->name, &adsp_ops, fw_name,
+   sizeof(*adsp));
+
if (!rproc) {
dev_err(&pdev->dev, "unable to allocate remoteproc\n");