summary refs log tree commit diff
path: root/drivers/net
diff options
context:
space:
mode:
authorneil.shi <neil.shi@quectel.com>2023-05-23 17:12:37 +0800
committerPierre-Loup A. Griffais <pgriffais@valvesoftware.com>2023-11-02 16:05:16 -0700
commit1a7c107bca98a23107dfe80f33d6ca22783fb278 (patch)
treea22fa6b916a713fdf39ed532b755d446fcaf2fda /drivers/net
parent0c44377061058585deefb92f6d49829f4c38fa3d (diff)
downloadlinux-1a7c107bca98a23107dfe80f33d6ca22783fb278.tar.gz
wifi: ath11k: prepare RDDM info for dumping
 Firmware ramdump data is represented by mhi_controller->rddm_image of MHI
 driver. When firmware crashes, firmware will fill ram data into the buffer
 of mhi_controller->rddm_image, then Host driver will download firmware
 ramdump data and store it into ath11k_pci->mhi_fw_crash_data.
 This patch prepares ramdump data structures and helper functions for dumping.

Signed-off-by: neil.shi <neil.shi@quectel.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/ath/ath11k/coredump_fw.c43
-rw-r--r--drivers/net/wireless/ath/ath11k/coredump_fw.h5
2 files changed, 48 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath11k/coredump_fw.c b/drivers/net/wireless/ath/ath11k/coredump_fw.c
index 54686512165c..73ae511b6ce7 100644
--- a/drivers/net/wireless/ath/ath11k/coredump_fw.c
+++ b/drivers/net/wireless/ath/ath11k/coredump_fw.c
@@ -60,3 +60,46 @@ int ath11k_coredump_fw_paging_dump(struct ath11k_pci *ab_pci, struct mhi_control
 
 	return 0;
 }
+
+int ath11k_coredump_fw_rddm_dump(struct ath11k_pci *ab_pci, struct mhi_controller *mhi_cntrl)
+{
+	struct ath11k_mhi_fw_crash_data *crash_data = &ab_pci->mhi_fw_crash_data;
+	struct image_info *img = mhi_cntrl->rddm_image;
+	char *buf = NULL;
+	unsigned int size = 0;
+	int seg = 0;
+	u32 offset = 0;
+	u32 rddm_vec_entry_num;
+	u32 entries = mhi_cntrl->rddm_image->entries;
+
+	rddm_vec_entry_num = DIV_ROUND_UP(RDDM_DUMP_SIZE,
+					  mhi_cntrl->seg_len);
+	crash_data->ramdump_buf_len = (entries - 1) * mhi_cntrl->seg_len +
+				      rddm_vec_entry_num * sizeof(struct ath11k_vec_entry);
+
+	ath11k_info(ab_pci->ab, "rddm_vec_entry_num=%d entries=%d\n",
+		    rddm_vec_entry_num, img->entries);
+
+	crash_data->ramdump_buf = vzalloc(crash_data->ramdump_buf_len);
+	if (!crash_data->ramdump_buf)
+		return -ENOMEM;
+
+	for (seg = 0; seg < rddm_vec_entry_num; seg++) {
+		buf = img->mhi_buf[seg].buf;
+		size = img->mhi_buf[seg].len;
+		ath11k_info(ab_pci->ab,
+			    "write rddm memory: mem: 0x%p, size: 0x%x\n",
+			    buf, size);
+		memcpy(crash_data->ramdump_buf + offset, buf, size);
+		offset += size;
+	}
+
+	buf = crash_data->ramdump_buf + offset;
+	size = img->mhi_buf[img->entries - 1].len;
+	ath11k_info(ab_pci->ab,
+		    "to write vector table block: mem: 0x%p, size: 0x%x\n",
+		    buf, size);
+	memcpy(buf, img->mhi_buf[img->entries - 1].buf, size);
+
+	return 0;
+}
diff --git a/drivers/net/wireless/ath/ath11k/coredump_fw.h b/drivers/net/wireless/ath/ath11k/coredump_fw.h
index 99ebb571d911..e254ceec7d93 100644
--- a/drivers/net/wireless/ath/ath11k/coredump_fw.h
+++ b/drivers/net/wireless/ath/ath11k/coredump_fw.h
@@ -10,6 +10,8 @@
 
 struct ath11k_pci;
 
+#define RDDM_DUMP_SIZE				0x420000
+
 struct ath11k_vec_entry {
 	u64 dma_addr;
 	u64 size;
@@ -18,8 +20,11 @@ struct ath11k_vec_entry {
 struct ath11k_mhi_fw_crash_data {
 	u8 *paging_dump_buf;
 	size_t paging_dump_buf_len;
+	u8 *ramdump_buf;
+	size_t ramdump_buf_len;
 };
 
 int ath11k_coredump_fw_paging_dump(struct ath11k_pci *ab_pci, struct mhi_controller *mhi_cntrl);
+int ath11k_coredump_fw_rddm_dump(struct ath11k_pci *ab_pci, struct mhi_controller *mhi_cntrl);
 
 #endif