blob: b8f078bdd422341c61c23e1fd9eafe9ea6927372 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Komal Seelam644263d2016-02-22 20:45:49 +05302 * Copyright (c) 2013-2014, 2016 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28#include "hif_io32.h"
29#include "hif_debug.h"
30
31/*chaninfo*/
32#define CHANINFOMEM_S2_READ_MASK 0x00000008
33#define CHANINFO_CTRL_CAPTURE_CHAN_INFO_MASK 0x00000001
34#define CHANINFO_CTRL_CHANINFOMEM_BW_MASK 0x00000030
35#define MULTICHAIN_ENABLE_RX_CHAIN_MASK_MASK 0x00000007
36
37/*agc*/
38#define GAINS_MIN_OFFSETS_CF_AGC_HIST_ENABLE_MASK 0x00040000
39#define GAINS_MIN_OFFSETS_CF_AGC_HIST_GC_MASK 0x00080000
40#define GAINS_MIN_OFFSETS_CF_AGC_HIST_VOTING_MASK 0x00100000
41#define GAINS_MIN_OFFSETS_CF_AGC_HIST_PHY_ERR_MASK 0x00200000
42#define AGC_HISTORY_DUMP_MASK (\
43 GAINS_MIN_OFFSETS_CF_AGC_HIST_ENABLE_MASK| \
44 GAINS_MIN_OFFSETS_CF_AGC_HIST_GC_MASK| \
45 GAINS_MIN_OFFSETS_CF_AGC_HIST_VOTING_MASK| \
46 GAINS_MIN_OFFSETS_CF_AGC_HIST_PHY_ERR_MASK \
47 )
48
49#define BB_chaninfo_ctrl 0x1a370
50#define BB_multichain_enable 0x1a2a0
51#define BB_chn_tables_intf_addr 0x19894
52#define BB_chn1_tables_intf_addr 0x1a894
53#define BB_chn_tables_intf_data 0x19898
54#define BB_chn1_tables_intf_data 0x1a898
55#define BB_gains_min_offsets 0x19e08
56#define BB_chaninfo_tab_b0 0x03200
57#define BB_chaninfo_tab_b1 0x03300
58#define BB_watchdog_status 0x1a7c0
59#define BB_watchdog_ctrl_1 0x1a7c4
60#define BB_watchdog_ctrl_2 0x1a7c8
61#define BB_watchdog_status_B 0x1a7e0
62
Rajeev Kumar1a65e582015-11-23 11:36:53 -080063
64#define PHY_BB_CHN_TABLES_INTF_ADDR 0x19894
65#define PHY_BB_CHN_TABLES_INTF_DATA 0x19898
66
67#define PHY_BB_CHN1_TABLES_INTF_ADDR 0x1a894
68#define PHY_BB_CHN1_TABLES_INTF_DATA 0x1a898
69
70
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080071struct priv_ctrl_ctx {
72 uint32_t chaninfo_ctrl_orig;
73 uint32_t gain_min_offsets_orig;
74 uint32_t anyreg_start;
75 uint32_t anyreg_len;
76};
77
78static struct priv_ctrl_ctx g_priv_dump_ctx;
79
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +053080static inline void set_target_reg_bits(void __iomem *mem, uint32_t reg,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080081 uint32_t bitmask, uint32_t val)
82{
83 uint32_t value = hif_read32_mb(mem + (reg));
84 uint32_t shift = 0;
85 value &= ~(bitmask);
86 while (!((bitmask >> shift) & 0x01))
87 shift++;
88
89 value |= (((val) << shift) & (bitmask));
90 hif_write32_mb(mem + (reg), value);
91}
92
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +053093static inline uint32_t get_target_reg_bits(void __iomem *mem,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080094 uint32_t reg, uint32_t bitmask)
95{
96 uint32_t value = hif_read32_mb(mem + (reg));
97 uint32_t shift = 0;
98 while (!((bitmask >> shift) & 0x01))
99 shift++;
100
101 return (value >> shift) & bitmask;
102}
103
Komal Seelam644263d2016-02-22 20:45:49 +0530104void priv_start_cap_chaninfo(struct hif_softc *scn)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800105{
106 set_target_reg_bits(scn->mem, BB_chaninfo_ctrl,
107 CHANINFO_CTRL_CAPTURE_CHAN_INFO_MASK, 1);
108}
109
Komal Seelam644263d2016-02-22 20:45:49 +0530110void priv_start_agc(struct hif_softc *scn)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800111{
112 g_priv_dump_ctx.gain_min_offsets_orig =
113 hif_read32_mb(scn->mem + BB_gains_min_offsets);
114 set_target_reg_bits(scn->mem, BB_gains_min_offsets,
115 AGC_HISTORY_DUMP_MASK,
116 0x0f);
117}
118
Komal Seelam644263d2016-02-22 20:45:49 +0530119void priv_stop_agc(struct hif_softc *scn)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800120{
121 set_target_reg_bits(scn->mem, BB_gains_min_offsets,
122 AGC_HISTORY_DUMP_MASK,
123 0);
124}
125
Komal Seelam644263d2016-02-22 20:45:49 +0530126void priv_dump_chaninfo(struct hif_softc *scn)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800127{
128 uint32_t bw, val;
129 uint32_t len, i, tmp;
130 uint32_t chain_mask;
131 uint32_t chain0, chain1;
132
133 chain_mask =
134 get_target_reg_bits(scn->mem, BB_multichain_enable,
135 MULTICHAIN_ENABLE_RX_CHAIN_MASK_MASK);
136 chain0 = chain_mask & 1;
137 chain1 = chain_mask & 2;
138
139 HIF_TRACE("%s: E", __func__);
140 bw = get_target_reg_bits(scn->mem, BB_chaninfo_ctrl,
141 CHANINFO_CTRL_CHANINFOMEM_BW_MASK);
142
143 if (bw == 0)
144 len = 53;
145 else if (bw == 1)
146 len = 57;
147 else if (bw == 2)
148 len = 59 * 2 - 1;
149 else
150 len = 60 * 2 + 61 * 2;
151
152 /*
153 * each tone is 16 bit valid, write to 32bit buffer each.
154 * bw==0(legacy20): 53 tones.
155 * bw==1(ht/vht20): 57 tones.
156 * bw==2(ht/vht40): 59+58 tones.
157 * bw==3(vht80): 60*2+61*2 tones.
158 */
159
160 if (chain0) {
161 hif_write32_mb(scn->mem + BB_chn_tables_intf_addr,
162 0x80003200);
163 }
164 if (chain1) {
165 hif_write32_mb(scn->mem + BB_chn1_tables_intf_addr,
166 0x80003200);
167 }
168
169 set_target_reg_bits(scn->mem, BB_chaninfo_ctrl,
170 CHANINFOMEM_S2_READ_MASK, 0);
171
172 if (chain0) {
173 if (bw < 2) {
174 len = (bw == 0) ? 53 : 57;
175 for (i = 0; i < len; i++) {
176 val =
177 hif_read32_mb(scn->mem +
178 BB_chn_tables_intf_data) &
179 0x0000ffff;
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530180 qdf_print("0x%x\t", val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800181 if (i % 4 == 0)
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530182 qdf_print("\n");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800183 }
184 } else {
185 len = (bw == 2) ? 59 : 60;
186 for (i = 0; i < len; i++) {
187 tmp =
188 hif_read32_mb(scn->mem +
189 BB_chn_tables_intf_data);
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530190 qdf_print("0x%x\t", ((tmp >> 16) & 0x0000ffff));
191 qdf_print("0x%x\t", (tmp & 0x0000ffff));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800192 if (i % 2 == 0)
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530193 qdf_print("\n");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800194 }
195 if (bw > 2) {
196 /* bw == 3 for vht80 */
197 hif_write32_mb(scn->mem +
198 BB_chn_tables_intf_addr,
199 0x80003300);
200 len = 61;
201 for (i = 0; i < len; i++) {
202 tmp =
203 hif_read32_mb(scn->mem +
204 BB_chn_tables_intf_data);
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530205 qdf_print("0x%x\t",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800206 ((tmp >> 16) & 0x0000ffff));
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530207 qdf_print("0x%x\t", (tmp & 0x0000ffff));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800208 if (i % 2 == 0)
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530209 qdf_print("\n");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800210 }
211 }
212 }
213 }
214 if (chain1) {
215 if (bw < 2) {
216 len = (bw == 0) ? 53 : 57;
217 for (i = 0; i < len; i++) {
218 val =
219 hif_read32_mb(scn->mem +
220 BB_chn1_tables_intf_data) &
221 0x0000ffff;
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530222 qdf_print("0x%x\t", val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800223 if (i % 4 == 0)
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530224 qdf_print("\n");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800225 }
226 } else {
227 len = (bw == 2) ? 59 : 60;
228 for (i = 0; i < len; i++) {
229 tmp =
230 hif_read32_mb(scn->mem +
231 BB_chn1_tables_intf_data);
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530232 qdf_print("0x%x\n", (tmp >> 16) & 0x0000ffff);
233 qdf_print("0x%x\n", tmp & 0x0000ffff);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800234 if (i % 2 == 0)
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530235 qdf_print("\n");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800236 }
237 if (bw > 2) {
238 /* bw == 3 for vht80 */
239 hif_write32_mb(scn->mem +
240 BB_chn1_tables_intf_addr,
241 0x80003300);
242 len = 61;
243 for (i = 0; i < len; i++) {
244 tmp =
245 hif_read32_mb(scn->mem +
246 BB_chn1_tables_intf_data);
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530247 qdf_print("0x%x\t",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800248 ((tmp >> 16) & 0x0000ffff));
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530249 qdf_print("0x%x\t", (tmp & 0x0000ffff));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800250 if (i % 2 == 0)
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530251 qdf_print("\n");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800252 }
253 }
254 }
255 }
256 HIF_TRACE("%s: X", __func__);
257}
258
Komal Seelam644263d2016-02-22 20:45:49 +0530259void priv_dump_agc(struct hif_softc *scn)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800260{
261 int i, len = 30; /* check this value for Rome and Peregrine */
262 uint32_t chain0, chain1, chain_mask, val;
263
Houston Hoffmanbac94542016-03-14 21:11:59 -0700264 if (Q_TARGET_ACCESS_BEGIN(scn) < 0)
265 return;
Rajeev Kumar1a65e582015-11-23 11:36:53 -0800266
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800267 chain_mask =
268 get_target_reg_bits(scn->mem, BB_multichain_enable,
269 MULTICHAIN_ENABLE_RX_CHAIN_MASK_MASK);
270 chain0 = chain_mask & 1;
271 chain1 = chain_mask & 2;
272
273 len = len << 1; /* each agc item is 64bit, total*2 */
274 priv_stop_agc(scn);
275
276 set_target_reg_bits(scn->mem, BB_chaninfo_ctrl,
277 CHANINFOMEM_S2_READ_MASK, 0);
278
279 HIF_TRACE("%s: AGC history buffer dump: E", __func__);
280 if (chain0) {
281 for (i = 0; i < len; i++) {
Rajeev Kumar1a65e582015-11-23 11:36:53 -0800282 hif_write32_mb(scn->mem +
283 PHY_BB_CHN_TABLES_INTF_ADDR,
284 BB_chaninfo_tab_b0 + i * 4);
285 val = hif_read32_mb(scn->mem +
286 PHY_BB_CHN_TABLES_INTF_DATA);
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530287 qdf_print("0x%x\t", val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800288 if (i % 4 == 0)
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530289 qdf_print("\n");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800290 }
291 }
292 if (chain1) {
293 for (i = 0; i < len; i++) {
Rajeev Kumar1a65e582015-11-23 11:36:53 -0800294 hif_write32_mb(scn->mem +
295 PHY_BB_CHN1_TABLES_INTF_ADDR,
296 BB_chaninfo_tab_b0 + i * 4);
297 val = hif_read32_mb(scn->mem +
298 PHY_BB_CHN1_TABLES_INTF_DATA);
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530299 qdf_print("0x%x\t", val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800300 if (i % 4 == 0)
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530301 qdf_print("\n");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800302 }
303 }
304 HIF_TRACE("%s: AGC history buffer dump X", __func__);
305 /* restore original value */
306 hif_write32_mb(scn->mem + BB_gains_min_offsets,
307 g_priv_dump_ctx.gain_min_offsets_orig);
Rajeev Kumar1a65e582015-11-23 11:36:53 -0800308
Houston Hoffmanbac94542016-03-14 21:11:59 -0700309 Q_TARGET_ACCESS_END(scn);
Rajeev Kumar1a65e582015-11-23 11:36:53 -0800310
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800311 return;
312}
313
Komal Seelam644263d2016-02-22 20:45:49 +0530314void priv_dump_bbwatchdog(struct hif_softc *scn)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800315{
316 uint32_t val;
317
318 HIF_TRACE("%s: BB watchdog dump E", __func__);
319 val = hif_read32_mb(scn->mem + BB_watchdog_status);
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530320 qdf_print("0x%x\t", val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800321 val = hif_read32_mb(scn->mem + BB_watchdog_ctrl_1);
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530322 qdf_print("0x%x\t", val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800323 val = hif_read32_mb(scn->mem + BB_watchdog_ctrl_2);
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530324 qdf_print("0x%x\t", val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800325 val = hif_read32_mb(scn->mem + BB_watchdog_status_B);
Chouhan, Anuragfc06aa92016-03-03 19:05:05 +0530326 qdf_print("0x%x", val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800327 HIF_TRACE("%s: BB watchdog dump X", __func__);
328}