mirror of
https://github.com/torvalds/linux.git
synced 2026-05-04 06:22:40 -04:00
In case of firmware assert snapshot of firmware memory is essential for debugging. Add firmware coredump collection support for PCI bus. Collect RDDM and firmware paging dumps from MHI and pack them in TLV format and also pack various memory shared during QMI phase in separate TLVs. Add necessary header and share the dumps to user space using dev coredump framework. Coredump collection is controlled by CONFIG_DEV_COREDUMP. Dump collected for a radio is 55 MB approximately. The changeset is mostly copied from: https://lore.kernel.org/all/20240325183414.4016663-1-quic_ssreeela@quicinc.com/. Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-04358-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1 Signed-off-by: Miaoqing Pan <quic_miaoqing@quicinc.com> Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com> Link: https://patch.msgid.link/20240813013028.2708111-2-quic_miaoqing@quicinc.com Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
53 lines
1.3 KiB
C
53 lines
1.3 KiB
C
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
|
/*
|
|
* Copyright (c) 2020 The Linux Foundation. All rights reserved.
|
|
* Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
*/
|
|
#include <linux/devcoredump.h>
|
|
#include "hif.h"
|
|
#include "coredump.h"
|
|
#include "debug.h"
|
|
|
|
enum
|
|
ath11k_fw_crash_dump_type ath11k_coredump_get_dump_type(int type)
|
|
{
|
|
enum ath11k_fw_crash_dump_type dump_type;
|
|
|
|
switch (type) {
|
|
case HOST_DDR_REGION_TYPE:
|
|
dump_type = FW_CRASH_DUMP_REMOTE_MEM_DATA;
|
|
break;
|
|
case M3_DUMP_REGION_TYPE:
|
|
dump_type = FW_CRASH_DUMP_M3_DUMP;
|
|
break;
|
|
case PAGEABLE_MEM_REGION_TYPE:
|
|
dump_type = FW_CRASH_DUMP_PAGEABLE_DATA;
|
|
break;
|
|
case BDF_MEM_REGION_TYPE:
|
|
case CALDB_MEM_REGION_TYPE:
|
|
dump_type = FW_CRASH_DUMP_NONE;
|
|
break;
|
|
default:
|
|
dump_type = FW_CRASH_DUMP_TYPE_MAX;
|
|
break;
|
|
}
|
|
|
|
return dump_type;
|
|
}
|
|
EXPORT_SYMBOL(ath11k_coredump_get_dump_type);
|
|
|
|
void ath11k_coredump_upload(struct work_struct *work)
|
|
{
|
|
struct ath11k_base *ab = container_of(work, struct ath11k_base, dump_work);
|
|
|
|
ath11k_info(ab, "Uploading coredump\n");
|
|
/* dev_coredumpv() takes ownership of the buffer */
|
|
dev_coredumpv(ab->dev, ab->dump_data, ab->ath11k_coredump_len, GFP_KERNEL);
|
|
ab->dump_data = NULL;
|
|
}
|
|
|
|
void ath11k_coredump_collect(struct ath11k_base *ab)
|
|
{
|
|
ath11k_hif_coredump_download(ab);
|
|
}
|