diff options
author | neil.shi <neil.shi@quectel.com> | 2023-05-23 17:12:37 +0800 |
---|---|---|
committer | Pierre-Loup A. Griffais <pgriffais@valvesoftware.com> | 2023-11-02 16:05:16 -0700 |
commit | 1a7c107bca98a23107dfe80f33d6ca22783fb278 (patch) | |
tree | a22fa6b916a713fdf39ed532b755d446fcaf2fda /drivers/net | |
parent | 0c44377061058585deefb92f6d49829f4c38fa3d (diff) | |
download | linux-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.c | 43 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath11k/coredump_fw.h | 5 |
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 |