wil6210: add debugfs blobs for UCODE code and data
authorLior David <qca_liord@qca.qualcomm.com>
Mon, 28 Nov 2016 11:49:02 +0000 (13:49 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Thu, 1 Dec 2016 11:20:36 +0000 (13:20 +0200)
Added new areas to fw_mappings area for UCODE code
and data areas.
The new areas are only exposed through debugfs blobs,
and mainly needed to access UCODE logs.
The change does not affect crash dumps because the
newly added areas overlap with the "upper" area which
is already dumped.

Signed-off-by: Lior David <qca_liord@qca.qualcomm.com>
Signed-off-by: Maya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/wil6210/wil6210.h
drivers/net/wireless/ath/wil6210/wil_crash_dump.c
drivers/net/wireless/ath/wil6210/wmi.c

index ef95db977bc6d6a20a11ef17f1410468a02dfc85..237e1666df2da1efcb2832515e1df8f16adfcade 100644 (file)
@@ -276,10 +276,11 @@ struct fw_map {
        u32 to;   /* linker address - to, exclusive */
        u32 host; /* PCI/Host address - BAR0 + 0x880000 */
        const char *name; /* for debugfs */
+       bool fw; /* true if FW mapping, false if UCODE mapping */
 };
 
 /* array size should be in sync with actual definition in the wmi.c */
-extern const struct fw_map fw_mapping[8];
+extern const struct fw_map fw_mapping[10];
 
 /**
  * mk_cidxtid - construct @cidxtid field
index b57d280946e05d0c6c1b5bceb99505950094d613..d051eea47a54ec58af7a154f411d5c0c9e6d3288 100644 (file)
@@ -36,6 +36,9 @@ static int wil_fw_get_crash_dump_bounds(struct wil6210_priv *wil,
        for (i = 1; i < ARRAY_SIZE(fw_mapping); i++) {
                map = &fw_mapping[i];
 
+               if (!map->fw)
+                       continue;
+
                if (map->host < host_min)
                        host_min = map->host;
 
@@ -73,6 +76,9 @@ int wil_fw_copy_crash_dump(struct wil6210_priv *wil, void *dest, u32 size)
        for (i = 0; i < ARRAY_SIZE(fw_mapping); i++) {
                map = &fw_mapping[i];
 
+               if (!map->fw)
+                       continue;
+
                data = (void * __force)wil->csr + HOSTADDR(map->host);
                len = map->to - map->from;
                offset = map->host - host_min;
index d289a4d999b72162302d9623370fbe06ac1f0609..7585003bef67cb867263ab5460aaef90c6d01d47 100644 (file)
@@ -84,19 +84,29 @@ MODULE_PARM_DESC(led_id,
  * array size should be in sync with the declaration in the wil6210.h
  */
 const struct fw_map fw_mapping[] = {
-       {0x000000, 0x040000, 0x8c0000, "fw_code"}, /* FW code RAM      256k */
-       {0x800000, 0x808000, 0x900000, "fw_data"}, /* FW data RAM       32k */
-       {0x840000, 0x860000, 0x908000, "fw_peri"}, /* periph. data RAM 128k */
-       {0x880000, 0x88a000, 0x880000, "rgf"},     /* various RGF       40k */
-       {0x88a000, 0x88b000, 0x88a000, "AGC_tbl"}, /* AGC table          4k */
-       {0x88b000, 0x88c000, 0x88b000, "rgf_ext"}, /* Pcie_ext_rgf       4k */
-       {0x88c000, 0x88c200, 0x88c000, "mac_rgf_ext"}, /* mac_ext_rgf  512b */
-       {0x8c0000, 0x949000, 0x8c0000, "upper"},   /* upper area       548k */
-       /*
-        * 920000..930000 ucode code RAM
-        * 930000..932000 ucode data RAM
-        * 932000..949000 back-door debug data
+       /* FW code RAM 256k */
+       {0x000000, 0x040000, 0x8c0000, "fw_code", true},
+       /* FW data RAM 32k */
+       {0x800000, 0x808000, 0x900000, "fw_data", true},
+       /* periph data 128k */
+       {0x840000, 0x860000, 0x908000, "fw_peri", true},
+       /* various RGF 40k */
+       {0x880000, 0x88a000, 0x880000, "rgf", true},
+       /* AGC table   4k */
+       {0x88a000, 0x88b000, 0x88a000, "AGC_tbl", true},
+       /* Pcie_ext_rgf 4k */
+       {0x88b000, 0x88c000, 0x88b000, "rgf_ext", true},
+       /* mac_ext_rgf 512b */
+       {0x88c000, 0x88c200, 0x88c000, "mac_rgf_ext", true},
+       /* upper area 548k */
+       {0x8c0000, 0x949000, 0x8c0000, "upper", true},
+       /* UCODE areas - accessible by debugfs blobs but not by
+        * wmi_addr_remap. UCODE areas MUST be added AFTER FW areas!
         */
+       /* ucode code RAM 128k */
+       {0x000000, 0x020000, 0x920000, "uc_code", false},
+       /* ucode data RAM 16k */
+       {0x800000, 0x804000, 0x940000, "uc_data", false},
 };
 
 struct blink_on_off_time led_blink_time[] = {
@@ -108,7 +118,7 @@ struct blink_on_off_time led_blink_time[] = {
 u8 led_polarity = LED_POLARITY_LOW_ACTIVE;
 
 /**
- * return AHB address for given firmware/ucode internal (linker) address
+ * return AHB address for given firmware internal (linker) address
  * @x - internal address
  * If address have no valid AHB mapping, return 0
  */
@@ -117,7 +127,8 @@ static u32 wmi_addr_remap(u32 x)
        uint i;
 
        for (i = 0; i < ARRAY_SIZE(fw_mapping); i++) {
-               if ((x >= fw_mapping[i].from) && (x < fw_mapping[i].to))
+               if (fw_mapping[i].fw &&
+                   ((x >= fw_mapping[i].from) && (x < fw_mapping[i].to)))
                        return x + fw_mapping[i].host - fw_mapping[i].from;
        }