Re: [PATCH 2/3] remoteproc: qcom: Add capability to collect minidumps
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
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
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
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");