Message ID | 20230518101546.27998-3-quic_mpubbise@quicinc.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Kalle Valo |
Headers | show |
Series | wifi: ath11k: Add coredump support | expand |
Hi Manikanta, kernel test robot noticed the following build warnings: [auto build test WARNING on 610b78b97bad8f3e77c27a15e9a03cbbb4109697] url: https://github.com/intel-lab-lkp/linux/commits/Manikanta-Pubbisetty/wifi-ath11k-Add-coredump-support/20230518-182743 base: 610b78b97bad8f3e77c27a15e9a03cbbb4109697 patch link: https://lore.kernel.org/r/20230518101546.27998-3-quic_mpubbise%40quicinc.com patch subject: [PATCH 2/2] wifi: ath11k: Add coredump support of MSA region for WCN6750 config: m68k-allyesconfig compiler: m68k-linux-gcc (GCC) 12.1.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/bc44b3e938250b717bcfa936b5378d2e77f504a5 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Manikanta-Pubbisetty/wifi-ath11k-Add-coredump-support/20230518-182743 git checkout bc44b3e938250b717bcfa936b5378d2e77f504a5 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k SHELL=/bin/bash drivers/net/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202305182058.82T6b5mp-lkp@intel.com/ All warnings (new ones prefixed by >>): In file included from include/linux/swab.h:5, from include/uapi/linux/byteorder/big_endian.h:14, from include/linux/byteorder/big_endian.h:5, from arch/m68k/include/uapi/asm/byteorder.h:5, from include/asm-generic/bitops/le.h:6, from arch/m68k/include/asm/bitops.h:545, from include/linux/bitops.h:68, from include/linux/thread_info.h:27, from include/asm-generic/preempt.h:5, from ./arch/m68k/include/generated/asm/preempt.h:1, from include/linux/preempt.h:78, from arch/m68k/include/asm/irqflags.h:6, from include/linux/irqflags.h:16, from arch/m68k/include/asm/atomic.h:6, from include/linux/atomic.h:7, from include/linux/mm_types_task.h:13, from include/linux/mm_types.h:5, from include/linux/buildid.h:5, from include/linux/module.h:14, from drivers/net/wireless/ath/ath11k/ahb.c:7: drivers/net/wireless/ath/ath11k/ahb.c: In function 'ath11k_ahb_coredump_msa': >> drivers/net/wireless/ath/ath11k/ahb.c:975:34: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^ include/uapi/linux/swab.h:131:38: note: in definition of macro '__swab64' 131 | (__u64)(__builtin_constant_p(x) ? \ | ^ include/linux/byteorder/generic.h:86:21: note: in expansion of macro '__cpu_to_le64' 86 | #define cpu_to_le64 __cpu_to_le64 | ^~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/ahb.c:975:22: note: in expansion of macro 'cpu_to_le64' 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^~~~~~~~~~~ >> drivers/net/wireless/ath/ath11k/ahb.c:975:34: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^ include/uapi/linux/swab.h:25:19: note: in definition of macro '___constant_swab64' 25 | (((__u64)(x) & (__u64)0x00000000000000ffULL) << 56) | \ | ^ include/uapi/linux/byteorder/big_endian.h:32:43: note: in expansion of macro '__swab64' 32 | #define __cpu_to_le64(x) ((__force __le64)__swab64((x))) | ^~~~~~~~ include/linux/byteorder/generic.h:86:21: note: in expansion of macro '__cpu_to_le64' 86 | #define cpu_to_le64 __cpu_to_le64 | ^~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/ahb.c:975:22: note: in expansion of macro 'cpu_to_le64' 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^~~~~~~~~~~ >> drivers/net/wireless/ath/ath11k/ahb.c:975:34: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^ include/uapi/linux/swab.h:26:19: note: in definition of macro '___constant_swab64' 26 | (((__u64)(x) & (__u64)0x000000000000ff00ULL) << 40) | \ | ^ include/uapi/linux/byteorder/big_endian.h:32:43: note: in expansion of macro '__swab64' 32 | #define __cpu_to_le64(x) ((__force __le64)__swab64((x))) | ^~~~~~~~ include/linux/byteorder/generic.h:86:21: note: in expansion of macro '__cpu_to_le64' 86 | #define cpu_to_le64 __cpu_to_le64 | ^~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/ahb.c:975:22: note: in expansion of macro 'cpu_to_le64' 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^~~~~~~~~~~ >> drivers/net/wireless/ath/ath11k/ahb.c:975:34: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^ include/uapi/linux/swab.h:27:19: note: in definition of macro '___constant_swab64' 27 | (((__u64)(x) & (__u64)0x0000000000ff0000ULL) << 24) | \ | ^ include/uapi/linux/byteorder/big_endian.h:32:43: note: in expansion of macro '__swab64' 32 | #define __cpu_to_le64(x) ((__force __le64)__swab64((x))) | ^~~~~~~~ include/linux/byteorder/generic.h:86:21: note: in expansion of macro '__cpu_to_le64' 86 | #define cpu_to_le64 __cpu_to_le64 | ^~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/ahb.c:975:22: note: in expansion of macro 'cpu_to_le64' 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^~~~~~~~~~~ >> drivers/net/wireless/ath/ath11k/ahb.c:975:34: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^ include/uapi/linux/swab.h:28:19: note: in definition of macro '___constant_swab64' 28 | (((__u64)(x) & (__u64)0x00000000ff000000ULL) << 8) | \ | ^ include/uapi/linux/byteorder/big_endian.h:32:43: note: in expansion of macro '__swab64' 32 | #define __cpu_to_le64(x) ((__force __le64)__swab64((x))) | ^~~~~~~~ include/linux/byteorder/generic.h:86:21: note: in expansion of macro '__cpu_to_le64' 86 | #define cpu_to_le64 __cpu_to_le64 | ^~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/ahb.c:975:22: note: in expansion of macro 'cpu_to_le64' 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^~~~~~~~~~~ >> drivers/net/wireless/ath/ath11k/ahb.c:975:34: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^ include/uapi/linux/swab.h:29:19: note: in definition of macro '___constant_swab64' 29 | (((__u64)(x) & (__u64)0x000000ff00000000ULL) >> 8) | \ | ^ include/uapi/linux/byteorder/big_endian.h:32:43: note: in expansion of macro '__swab64' 32 | #define __cpu_to_le64(x) ((__force __le64)__swab64((x))) | ^~~~~~~~ include/linux/byteorder/generic.h:86:21: note: in expansion of macro '__cpu_to_le64' 86 | #define cpu_to_le64 __cpu_to_le64 | ^~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/ahb.c:975:22: note: in expansion of macro 'cpu_to_le64' 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^~~~~~~~~~~ >> drivers/net/wireless/ath/ath11k/ahb.c:975:34: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^ include/uapi/linux/swab.h:30:19: note: in definition of macro '___constant_swab64' 30 | (((__u64)(x) & (__u64)0x0000ff0000000000ULL) >> 24) | \ | ^ include/uapi/linux/byteorder/big_endian.h:32:43: note: in expansion of macro '__swab64' 32 | #define __cpu_to_le64(x) ((__force __le64)__swab64((x))) | ^~~~~~~~ include/linux/byteorder/generic.h:86:21: note: in expansion of macro '__cpu_to_le64' 86 | #define cpu_to_le64 __cpu_to_le64 | ^~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/ahb.c:975:22: note: in expansion of macro 'cpu_to_le64' 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^~~~~~~~~~~ >> drivers/net/wireless/ath/ath11k/ahb.c:975:34: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^ include/uapi/linux/swab.h:31:19: note: in definition of macro '___constant_swab64' 31 | (((__u64)(x) & (__u64)0x00ff000000000000ULL) >> 40) | \ | ^ include/uapi/linux/byteorder/big_endian.h:32:43: note: in expansion of macro '__swab64' 32 | #define __cpu_to_le64(x) ((__force __le64)__swab64((x))) | ^~~~~~~~ include/linux/byteorder/generic.h:86:21: note: in expansion of macro '__cpu_to_le64' 86 | #define cpu_to_le64 __cpu_to_le64 | ^~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/ahb.c:975:22: note: in expansion of macro 'cpu_to_le64' 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^~~~~~~~~~~ >> drivers/net/wireless/ath/ath11k/ahb.c:975:34: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^ include/uapi/linux/swab.h:32:19: note: in definition of macro '___constant_swab64' 32 | (((__u64)(x) & (__u64)0xff00000000000000ULL) >> 56))) | ^ include/uapi/linux/byteorder/big_endian.h:32:43: note: in expansion of macro '__swab64' 32 | #define __cpu_to_le64(x) ((__force __le64)__swab64((x))) | ^~~~~~~~ include/linux/byteorder/generic.h:86:21: note: in expansion of macro '__cpu_to_le64' 86 | #define cpu_to_le64 __cpu_to_le64 | ^~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/ahb.c:975:22: note: in expansion of macro 'cpu_to_le64' 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^~~~~~~~~~~ >> drivers/net/wireless/ath/ath11k/ahb.c:975:34: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^ include/uapi/linux/swab.h:133:19: note: in definition of macro '__swab64' 133 | __fswab64(x)) | ^ include/linux/byteorder/generic.h:86:21: note: in expansion of macro '__cpu_to_le64' 86 | #define cpu_to_le64 __cpu_to_le64 | ^~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/ahb.c:975:22: note: in expansion of macro 'cpu_to_le64' 975 | hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); | ^~~~~~~~~~~ vim +975 drivers/net/wireless/ath/ath11k/ahb.c 939 940 static void ath11k_ahb_coredump_msa(struct ath11k_base *ab) 941 { 942 struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); 943 const struct ath11k_hw_mem_layout *mem_layout; 944 struct ath11k_fw_crash_data *crash_data; 945 const struct ath11k_mem_region *current_region; 946 struct ath11k_ramdump_hdr *hdr; 947 size_t buf_len; 948 u8 *buf; 949 950 mutex_lock(&ab->dump_mutex); 951 952 crash_data = ath11k_coredump_new(ab); 953 if (!crash_data) 954 goto out_unlock; 955 956 if (!crash_data->ramdump_buf) 957 goto out_unlock; 958 959 mem_layout = ath11k_coredump_get_mem_layout(ab); 960 if (!mem_layout) 961 goto out_unlock; 962 963 current_region = &mem_layout->region_table.regions[0]; 964 965 buf = crash_data->ramdump_buf; 966 buf_len = crash_data->ramdump_buf_len; 967 memset(buf, 0, buf_len); 968 969 /* Reserve space for the header. */ 970 hdr = (void *)buf; 971 buf += sizeof(*hdr); 972 buf_len -= sizeof(*hdr); 973 974 hdr->region_type = cpu_to_le32(current_region->type); > 975 hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); 976 977 if (current_region->len < ab_ahb->fw.msa_size) { 978 memcpy(buf, ab_ahb->fw.msa_vaddr, current_region->len); 979 hdr->length = cpu_to_le32(current_region->len); 980 981 ath11k_warn(ab, "msa dump length is less than msa size %x, %x\n", 982 current_region->len, ab_ahb->fw.msa_size); 983 } else { 984 memcpy(buf, ab_ahb->fw.msa_vaddr, ab_ahb->fw.msa_size); 985 hdr->length = cpu_to_le32(ab_ahb->fw.msa_size); 986 } 987 988 out_unlock: 989 mutex_unlock(&ab->dump_mutex); 990 } 991
diff --git a/drivers/net/wireless/ath/ath11k/ahb.c b/drivers/net/wireless/ath/ath11k/ahb.c index 5cbba9a8b6ba..e404466ab049 100644 --- a/drivers/net/wireless/ath/ath11k/ahb.c +++ b/drivers/net/wireless/ath/ath11k/ahb.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear /* * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/module.h> @@ -18,6 +18,8 @@ #include "pcic.h" #include <linux/soc/qcom/smem.h> #include <linux/soc/qcom/smem_state.h> +#include <linux/remoteproc/qcom_rproc.h> +#include "coredump.h" static const struct of_device_id ath11k_ahb_of_match[] = { /* TODO: Should we change the compatible string to something similar @@ -935,6 +937,114 @@ static int ath11k_ahb_setup_resources(struct ath11k_base *ab) return 0; } +static void ath11k_ahb_coredump_msa(struct ath11k_base *ab) +{ + struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); + const struct ath11k_hw_mem_layout *mem_layout; + struct ath11k_fw_crash_data *crash_data; + const struct ath11k_mem_region *current_region; + struct ath11k_ramdump_hdr *hdr; + size_t buf_len; + u8 *buf; + + mutex_lock(&ab->dump_mutex); + + crash_data = ath11k_coredump_new(ab); + if (!crash_data) + goto out_unlock; + + if (!crash_data->ramdump_buf) + goto out_unlock; + + mem_layout = ath11k_coredump_get_mem_layout(ab); + if (!mem_layout) + goto out_unlock; + + current_region = &mem_layout->region_table.regions[0]; + + buf = crash_data->ramdump_buf; + buf_len = crash_data->ramdump_buf_len; + memset(buf, 0, buf_len); + + /* Reserve space for the header. */ + hdr = (void *)buf; + buf += sizeof(*hdr); + buf_len -= sizeof(*hdr); + + hdr->region_type = cpu_to_le32(current_region->type); + hdr->start = cpu_to_le64((u64)ab_ahb->fw.msa_vaddr); + + if (current_region->len < ab_ahb->fw.msa_size) { + memcpy(buf, ab_ahb->fw.msa_vaddr, current_region->len); + hdr->length = cpu_to_le32(current_region->len); + + ath11k_warn(ab, "msa dump length is less than msa size %x, %x\n", + current_region->len, ab_ahb->fw.msa_size); + } else { + memcpy(buf, ab_ahb->fw.msa_vaddr, ab_ahb->fw.msa_size); + hdr->length = cpu_to_le32(ab_ahb->fw.msa_size); + } + +out_unlock: + mutex_unlock(&ab->dump_mutex); +} + +static int ath11k_ahb_ssr_notifier(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct ath11k_ahb *ab_ahb = container_of(nb, struct ath11k_ahb, nb); + struct ath11k_base *ab = ab_ahb->ab; + struct qcom_ssr_notify_data *notify_data = data; + + switch (action) { + case QCOM_SSR_BEFORE_POWERUP: + break; + case QCOM_SSR_AFTER_POWERUP: + break; + case QCOM_SSR_BEFORE_SHUTDOWN: + if (notify_data->crashed) + ath11k_ahb_coredump_msa(ab); + break; + case QCOM_SSR_AFTER_SHUTDOWN: + break; + default: + ath11k_err(ab, "received unrecognized event %lu\n", action); + break; + } + + return NOTIFY_OK; +} + +static int ath11k_ahb_register_ssr_notifier(struct ath11k_base *ab) +{ + struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); + void *notifier; + int ret; + + ab_ahb->nb.notifier_call = ath11k_ahb_ssr_notifier; + + notifier = qcom_register_ssr_notifier("wpss", &ab_ahb->nb); + if (IS_ERR(notifier)) { + ret = PTR_ERR(notifier); + ath11k_err(ab, "failed to initialize SSR notifier: %d\n", ret); + return ret; + } + + ab_ahb->notifier = notifier; + + return 0; +} + +static void ath11k_ahb_unregister_ssr_notifier(struct ath11k_base *ab) +{ + struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); + int ret; + + ret = qcom_unregister_ssr_notifier(ab_ahb->notifier, &ab_ahb->nb); + if (ret) + ath11k_err(ab, "error %d unregistering notifier\n", ret); +} + static int ath11k_ahb_setup_msa_resources(struct ath11k_base *ab) { struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); @@ -956,6 +1066,14 @@ static int ath11k_ahb_setup_msa_resources(struct ath11k_base *ab) ab_ahb->fw.msa_paddr = r.start; ab_ahb->fw.msa_size = resource_size(&r); + ab_ahb->fw.msa_vaddr = devm_memremap(dev, ab_ahb->fw.msa_paddr, + ab_ahb->fw.msa_size, + MEMREMAP_WB); + if (IS_ERR(ab_ahb->fw.msa_vaddr)) { + dev_err(dev, "failed to map memory region: %pa\n", + &r.start); + return PTR_ERR(ab_ahb->fw.msa_vaddr); + } node = of_parse_phandle(dev->of_node, "memory-region", 1); if (!node) @@ -971,7 +1089,7 @@ static int ath11k_ahb_setup_msa_resources(struct ath11k_base *ab) ab_ahb->fw.ce_paddr = r.start; ab_ahb->fw.ce_size = resource_size(&r); - return 0; + return ath11k_ahb_register_ssr_notifier(ab); } static int ath11k_ahb_fw_resources_init(struct ath11k_base *ab) @@ -1087,6 +1205,8 @@ static int ath11k_ahb_fw_resource_deinit(struct ath11k_base *ab) if (ab_ahb->fw.use_tz) return 0; + ath11k_ahb_unregister_ssr_notifier(ab); + iommu = ab_ahb->fw.iommu_domain; unmapped_size = iommu_unmap(iommu, ab_ahb->fw.msa_paddr, ab_ahb->fw.msa_size); @@ -1110,6 +1230,7 @@ static int ath11k_ahb_fw_resource_deinit(struct ath11k_base *ab) static int ath11k_ahb_probe(struct platform_device *pdev) { struct ath11k_base *ab; + struct ath11k_ahb *ab_ahb; const struct of_device_id *of_id; const struct ath11k_hif_ops *hif_ops; const struct ath11k_pci_ops *pci_ops; @@ -1156,6 +1277,8 @@ static int ath11k_ahb_probe(struct platform_device *pdev) ab->pdev = pdev; ab->hw_rev = hw_rev; platform_set_drvdata(pdev, ab); + ab_ahb = ath11k_ahb_priv(ab); + ab_ahb->ab = ab; ret = ath11k_pcic_register_pci_ops(ab, pci_ops); if (ret) { diff --git a/drivers/net/wireless/ath/ath11k/ahb.h b/drivers/net/wireless/ath/ath11k/ahb.h index 415ddfd26654..812d5aa8e87c 100644 --- a/drivers/net/wireless/ath/ath11k/ahb.h +++ b/drivers/net/wireless/ath/ath11k/ahb.h @@ -1,11 +1,12 @@ /* SPDX-License-Identifier: BSD-3-Clause-Clear */ /* * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. - * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef ATH11K_AHB_H #define ATH11K_AHB_H +#include <linux/notifier.h> #include "core.h" #define ATH11K_AHB_RECOVERY_TIMEOUT (3 * HZ) @@ -23,11 +24,13 @@ struct ath11k_base; struct ath11k_ahb { struct rproc *tgt_rproc; + struct ath11k_base *ab; struct { struct device *dev; struct iommu_domain *iommu_domain; dma_addr_t msa_paddr; u32 msa_size; + void *msa_vaddr; dma_addr_t ce_paddr; u32 ce_size; bool use_tz; @@ -37,6 +40,9 @@ struct ath11k_ahb { unsigned int smem_bit; struct qcom_smem_state *smem_state; } smp2p_info; + + struct notifier_block nb; + void *notifier; }; static inline struct ath11k_ahb *ath11k_ahb_priv(struct ath11k_base *ab) diff --git a/drivers/net/wireless/ath/ath11k/coredump.c b/drivers/net/wireless/ath/ath11k/coredump.c index 1e5a58ec673e..1253b07806f4 100644 --- a/drivers/net/wireless/ath/ath11k/coredump.c +++ b/drivers/net/wireless/ath/ath11k/coredump.c @@ -12,8 +12,24 @@ #include "coredump.h" #include "debug.h" +static const struct ath11k_mem_region wcn6750_hw10_mem_regions[] = { + { + /* MSA region start is not fixed, hence it is assigned at runtime */ + .type = ATH11K_MEM_REGION_TYPE_MSA, + .len = 0xC00000, + .name = "MSA", + }, +}; + static const struct ath11k_hw_mem_layout hw_mem_layouts[] = { - /* HW memory layouts shall be defined here */ + { + .hw_rev = ATH11K_HW_WCN6750_HW10, + .bus = ATH11K_BUS_AHB, + .region_table = { + .regions = wcn6750_hw10_mem_regions, + .size = ARRAY_SIZE(wcn6750_hw10_mem_regions), + }, + } }; const struct ath11k_hw_mem_layout *
In the context of WCN6750, MSA is a 12MB reserved memory region entirely used by WCN6750 firmware for it's operation. This memory carries useful information required to debug firmware/hardware issues. Therefore add coredump support to dump MSA region during firmware assert for WCN6750. Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1 Signed-off-by: Manikanta Pubbisetty <quic_mpubbise@quicinc.com> --- drivers/net/wireless/ath/ath11k/ahb.c | 127 ++++++++++++++++++++- drivers/net/wireless/ath/ath11k/ahb.h | 8 +- drivers/net/wireless/ath/ath11k/coredump.c | 18 ++- 3 files changed, 149 insertions(+), 4 deletions(-)