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 ef95db9..237e166 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 b57d280..d051eea 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 d289a4d..7585003 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;
        }