blob: 7fd7681c4956ec6cd26a1b551fdebe0d36e55c6f [file] [log] [blame]
From 07a550ff7fbfb8702d7c6adfa0c7fd4ade9bf15b Mon Sep 17 00:00:00 2001
From: Rex Lu <rex.lu@mediatek.com>
Date: Mon, 25 Dec 2023 15:17:49 +0800
Subject: [PATCH 1017/1044] mtk: wifi: mt76: mt7996: Add mt7992 coredump
support
1. Add mt7992 coredump support
2. fixed if new ic have not support coredump, it may cause crash when remove module
Signed-off-by: Rex Lu <rex.lu@mediatek.com>
---
mt7996/coredump.c | 80 ++++++++++++++++++++++++++++++++++++++---------
mt7996/mt7996.h | 1 +
2 files changed, 67 insertions(+), 14 deletions(-)
diff --git a/mt7996/coredump.c b/mt7996/coredump.c
index a7f91b56..d09bcd4b 100644
--- a/mt7996/coredump.c
+++ b/mt7996/coredump.c
@@ -67,6 +67,44 @@ static const struct mt7996_mem_region mt7996_wa_mem_regions[] = {
},
};
+static const struct mt7996_mem_region mt7992_wm_mem_regions[] = {
+ {
+ .start = 0x00800000,
+ .len = 0x0004bfff,
+ .name = "ULM0",
+ },
+ {
+ .start = 0x00900000,
+ .len = 0x00035fff,
+ .name = "ULM1",
+ },
+ {
+ .start = 0x02200000,
+ .len = 0x0003ffff,
+ .name = "ULM2",
+ },
+ {
+ .start = 0x00400000,
+ .len = 0x00027fff,
+ .name = "SRAM",
+ },
+ {
+ .start = 0xe0000000,
+ .len = 0x0015ffff,
+ .name = "CRAM0",
+ },
+ {
+ .start = 0xe0160000,
+ .len = 0x00c7fff,
+ .name = "CRAM1",
+ },
+ {
+ .start = 0x7c050000,
+ .len = 0x00007fff,
+ .name = "CONN_INFRA",
+ },
+};
+
const struct mt7996_mem_region*
mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u8 type, u32 *num)
{
@@ -80,6 +118,14 @@ mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u8 type, u32 *num)
*num = ARRAY_SIZE(mt7996_wm_mem_regions);
return &mt7996_wm_mem_regions[0];
+ case 0x7992:
+ if (type == MT7996_RAM_TYPE_WA) {
+ /* mt7992 wa memory regions is the same as mt7996 */
+ *num = ARRAY_SIZE(mt7996_wa_mem_regions);
+ return &mt7996_wa_mem_regions[0];
+ }
+ *num = ARRAY_SIZE(mt7992_wm_mem_regions);
+ return &mt7992_wm_mem_regions[0];
default:
return NULL;
}
@@ -115,7 +161,7 @@ struct mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev, u8 type)
lockdep_assert_held(&dev->dump_mutex);
- if (!coredump_memdump)
+ if (!coredump_memdump || !crash_data->supported)
return NULL;
guid_gen(&crash_data->guid);
@@ -289,40 +335,46 @@ int mt7996_coredump_register(struct mt7996_dev *dev)
for (i = 0; i < MT7996_COREDUMP_MAX; i++) {
crash_data = vzalloc(sizeof(*dev->coredump.crash_data[i]));
if (!crash_data)
- return -ENOMEM;
+ goto nomem;
dev->coredump.crash_data[i] = crash_data;
+ crash_data->supported = false;
if (coredump_memdump) {
crash_data->memdump_buf_len = mt7996_coredump_get_mem_size(dev, i);
if (!crash_data->memdump_buf_len)
/* no memory content */
- return 0;
+ continue;
crash_data->memdump_buf = vzalloc(crash_data->memdump_buf_len);
- if (!crash_data->memdump_buf) {
- vfree(crash_data);
- return -ENOMEM;
- }
+ if (!crash_data->memdump_buf)
+ goto nomem;
+
+ crash_data->supported = true;
}
}
return 0;
+nomem:
+ mt7996_coredump_unregister(dev);
+ return -ENOMEM;
}
void mt7996_coredump_unregister(struct mt7996_dev *dev)
{
int i;
+ struct mt7996_crash_data *crash_data;
for (i = 0; i < MT7996_COREDUMP_MAX; i++) {
- if (dev->coredump.crash_data[i]->memdump_buf) {
- vfree(dev->coredump.crash_data[i]->memdump_buf);
- dev->coredump.crash_data[i]->memdump_buf = NULL;
- dev->coredump.crash_data[i]->memdump_buf_len = 0;
- }
+ crash_data = dev->coredump.crash_data[i];
+
+ if (!crash_data)
+ continue;
+
+ if (crash_data->memdump_buf)
+ vfree(crash_data->memdump_buf);
- vfree(dev->coredump.crash_data[i]);
- dev->coredump.crash_data[i] = NULL;
+ vfree(crash_data);
}
}
diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
index dd9aa9e2..7ca9d57e 100644
--- a/mt7996/mt7996.h
+++ b/mt7996/mt7996.h
@@ -230,6 +230,7 @@ struct mt7996_vif {
struct mt7996_crash_data {
guid_t guid;
struct timespec64 timestamp;
+ bool supported;
u8 *memdump_buf;
size_t memdump_buf_len;
--
2.18.0