1 /*
2  * Copyright 2023, Cypress Semiconductor Corporation (an Infineon company)
3  * SPDX-License-Identifier: Apache-2.0
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #include "whd_chip_constants.h"
19 #include "whd_wlioctl.h"
20 #include "whd_int.h"
21 #include "whd_types_int.h"
22 #include "bus_protocols/whd_chip_reg.h"
23 
24 /******************************************************
25 *               Function Definitions
26 ******************************************************/
27 
whd_chip_set_chip_id(whd_driver_t whd_driver,uint16_t id)28 uint32_t whd_chip_set_chip_id(whd_driver_t whd_driver, uint16_t id)
29 {
30     whd_driver->chip_info.chip_id = id;
31 
32     return 0;
33 }
34 
whd_chip_get_chip_id(whd_driver_t whd_driver)35 uint16_t whd_chip_get_chip_id(whd_driver_t whd_driver)
36 {
37     return whd_driver->chip_info.chip_id;
38 }
39 
get_whd_var(whd_driver_t whd_driver,chip_var_t var)40 uint32_t get_whd_var(whd_driver_t whd_driver, chip_var_t var)
41 {
42     uint32_t val = 0;
43 
44     uint16_t wlan_chip_id = whd_chip_get_chip_id(whd_driver);
45     switch (var)
46     {
47         case ARM_CORE_BASE_ADDRESS:
48             CHECK_RETURN(get_arm_core_base_address(wlan_chip_id, &val) );
49             break;
50         case SOCSRAM_BASE_ADDRESS:
51             CHECK_RETURN(get_socsram_base_address(wlan_chip_id, &val, false) );
52             break;
53         case SOCSRAM_WRAPPER_BASE_ADDRESS:
54             CHECK_RETURN(get_socsram_base_address(wlan_chip_id, &val, true) );
55             break;
56         case SDIOD_CORE_BASE_ADDRESS:
57             CHECK_RETURN(get_sdiod_core_base_address(wlan_chip_id, &val) );
58             break;
59         case PMU_BASE_ADDRESS:
60             CHECK_RETURN(get_pmu_base_address(wlan_chip_id, &val) );
61             break;
62         case CHIP_RAM_SIZE:
63             CHECK_RETURN(get_chip_ram_size(wlan_chip_id, &val) );
64             break;
65         case ATCM_RAM_BASE_ADDRESS:
66             CHECK_RETURN(get_atcm_ram_base_address(wlan_chip_id, &val) );
67             break;
68         case SOCRAM_SRMEM_SIZE:
69             CHECK_RETURN(get_socsram_srmem_size(wlan_chip_id, &val) );
70             break;
71         case CHANSPEC_BAND_MASK:
72             CHECK_RETURN(get_wl_chanspec_band_mask(wlan_chip_id, &val) );
73             break;
74         case CHANSPEC_BAND_2G:
75             CHECK_RETURN(get_wl_chanspec_band_2G(wlan_chip_id, &val) );
76             break;
77         case CHANSPEC_BAND_5G:
78             CHECK_RETURN(get_wl_chanspec_band_5G(wlan_chip_id, &val) );
79             break;
80         case CHANSPEC_BAND_SHIFT:
81             CHECK_RETURN(get_wl_chanspec_band_shift(wlan_chip_id, &val) );
82             break;
83         case CHANSPEC_BW_10:
84             CHECK_RETURN(get_wl_chanspec_bw_10(wlan_chip_id, &val) );
85             break;
86         case CHANSPEC_BW_20:
87             CHECK_RETURN(get_wl_chanspec_bw_20(wlan_chip_id, &val) );
88             break;
89         case CHANSPEC_BW_40:
90             CHECK_RETURN(get_wl_chanspec_bw_40(wlan_chip_id, &val) );
91             break;
92         case CHANSPEC_BW_MASK:
93             CHECK_RETURN(get_wl_chanspec_bw_mask(wlan_chip_id, &val) );
94             break;
95         case CHANSPEC_BW_SHIFT:
96             CHECK_RETURN(get_wl_chanspec_bw_shift(wlan_chip_id, &val) );
97             break;
98         case CHANSPEC_CTL_SB_LOWER:
99             CHECK_RETURN(get_wl_chanspec_ctl_sb_lower(wlan_chip_id, &val) );
100             break;
101         case CHANSPEC_CTL_SB_UPPER:
102             CHECK_RETURN(get_wl_chanspec_ctl_sb_upper(wlan_chip_id, &val) );
103             break;
104         case CHANSPEC_CTL_SB_NONE:
105             CHECK_RETURN(get_wl_chanspec_ctl_sb_none(wlan_chip_id, &val) );
106             break;
107         case CHANSPEC_CTL_SB_MASK:
108             CHECK_RETURN(get_wl_chanspec_ctl_sb_mask(wlan_chip_id, &val) );
109             break;
110         default:
111             break;
112     }
113     return val;
114 }
115 
get_arm_core_base_address(uint16_t wlan_chip_id,uint32_t * addr)116 whd_result_t get_arm_core_base_address(uint16_t wlan_chip_id, uint32_t *addr)
117 {
118     switch (wlan_chip_id)
119     {
120         case 0x4373:
121             *addr = 0x18002000 + WRAPPER_REGISTER_OFFSET;
122             break;
123         case 43012:
124         case 43430:
125         case 43439:
126             *addr = 0x18003000 + WRAPPER_REGISTER_OFFSET;
127             break;
128         case 43909:
129         case 43907:
130         case 54907:
131             *addr = 0x18011000 + WRAPPER_REGISTER_OFFSET;
132             break;
133         default:
134             return WHD_BADARG;
135     }
136     return WHD_SUCCESS;
137 }
138 
get_socsram_base_address(uint16_t wlan_chip_id,uint32_t * addr,whd_bool_t wrapper)139 whd_result_t get_socsram_base_address(uint16_t wlan_chip_id, uint32_t *addr, whd_bool_t wrapper)
140 {
141     uint32_t offset = 0;
142     if (wrapper)
143     {
144         offset = WRAPPER_REGISTER_OFFSET;
145     }
146     switch (wlan_chip_id)
147     {
148         case 43012:
149         case 43430:
150         case 43439:
151             *addr = 0x18004000 + offset;
152             break;
153         default:
154             return WHD_BADARG;
155     }
156     return WHD_SUCCESS;
157 }
158 
get_sdiod_core_base_address(uint16_t wlan_chip_id,uint32_t * addr)159 whd_result_t get_sdiod_core_base_address(uint16_t wlan_chip_id, uint32_t *addr)
160 {
161     switch (wlan_chip_id)
162     {
163         case 0x4373:
164             *addr = 0x18005000;
165             break;
166         case 43012:
167         case 43430:
168         case 43439:
169             *addr = 0x18002000;
170             break;
171         default:
172             return WHD_BADARG;
173     }
174     return WHD_SUCCESS;
175 }
176 
get_pmu_base_address(uint16_t wlan_chip_id,uint32_t * addr)177 whd_result_t get_pmu_base_address(uint16_t wlan_chip_id, uint32_t *addr)
178 {
179     switch (wlan_chip_id)
180     {
181         case 0x4373:
182         case 43430:
183         case 43439:
184             *addr = CHIPCOMMON_BASE_ADDRESS;
185             break;
186         case 43012:
187             *addr = 0x18012000;
188             break;
189         case 43909:
190         case 43907:
191         case 54907:
192             *addr = 0x18011000;
193             break;
194         default:
195             return WHD_BADARG;
196     }
197     return WHD_SUCCESS;
198 }
199 
get_chip_ram_size(uint16_t wlan_chip_id,uint32_t * size)200 whd_result_t get_chip_ram_size(uint16_t wlan_chip_id, uint32_t *size)
201 {
202     *size = 0;
203     if ( (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) || (wlan_chip_id == 43430) ||
204          (wlan_chip_id == 43439) )
205     {
206         *size = (512 * 1024);
207     }
208     else if ( (wlan_chip_id == 43362) || (wlan_chip_id == 4390) )
209     {
210         *size = 0x3C000;
211     }
212     else if ( (wlan_chip_id == 43909) || (wlan_chip_id == 43907) || (wlan_chip_id == 54907) )
213     {
214         *size = 0x90000;
215     }
216     else if (wlan_chip_id == 43012)
217     {
218         *size = 0xA0000;
219     }
220     else if (wlan_chip_id == 0x4373)
221     {
222         *size = 0xE0000;
223     }
224     else
225     {
226         *size = 0x80000;
227     }
228     return WHD_SUCCESS;
229 }
230 
get_atcm_ram_base_address(uint16_t wlan_chip_id,uint32_t * size)231 whd_result_t get_atcm_ram_base_address(uint16_t wlan_chip_id, uint32_t *size)
232 {
233     *size = 0;
234     if (wlan_chip_id == 0x4373)
235     {
236         *size = 0x160000;
237     }
238     else if ( (wlan_chip_id == 43909) || (wlan_chip_id == 43907) || (wlan_chip_id == 54907) )
239     {
240         *size = 0x1B0000;
241     }
242     else
243     {
244         *size = 0;
245     }
246     return WHD_SUCCESS;
247 }
248 
get_socsram_srmem_size(uint16_t wlan_chip_id,uint32_t * mem_size)249 whd_result_t get_socsram_srmem_size(uint16_t wlan_chip_id, uint32_t *mem_size)
250 {
251     *mem_size = 0;
252     if ( (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
253     {
254         *mem_size = (32 * 1024);
255     }
256     else if ( (wlan_chip_id == 43430) || (wlan_chip_id == 43439) )
257     {
258         *mem_size = (64 * 1024);
259     }
260     else
261     {
262         *mem_size = 0;
263     }
264     return WHD_SUCCESS;
265 }
266 
get_wl_chanspec_band_mask(uint16_t wlan_chip_id,uint32_t * band_mask)267 whd_result_t get_wl_chanspec_band_mask(uint16_t wlan_chip_id, uint32_t *band_mask)
268 {
269     *band_mask = 0;
270     if ( (wlan_chip_id == 43362) || (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
271     {
272         *band_mask = 0xf000;
273     }
274     else
275     {
276         *band_mask = 0xc000;
277     }
278     return WHD_SUCCESS;
279 }
280 
get_wl_chanspec_band_2G(uint16_t wlan_chip_id,uint32_t * band_2g)281 whd_result_t get_wl_chanspec_band_2G(uint16_t wlan_chip_id, uint32_t *band_2g)
282 {
283     *band_2g = 0;
284     if ( (wlan_chip_id == 43362) || (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
285     {
286         *band_2g = 0x2000;
287     }
288     else
289     {
290         *band_2g = 0x0000;
291     }
292     return WHD_SUCCESS;
293 }
294 
get_wl_chanspec_band_5G(uint16_t wlan_chip_id,uint32_t * band_5g)295 whd_result_t get_wl_chanspec_band_5G(uint16_t wlan_chip_id, uint32_t *band_5g)
296 {
297     *band_5g = 0;
298     if ( (wlan_chip_id == 43362) || (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
299     {
300         *band_5g = 0x1000;
301     }
302     else
303     {
304         *band_5g = 0xc000;
305     }
306     return WHD_SUCCESS;
307 }
308 
get_wl_chanspec_band_shift(uint16_t wlan_chip_id,uint32_t * band_shift)309 whd_result_t get_wl_chanspec_band_shift(uint16_t wlan_chip_id, uint32_t *band_shift)
310 {
311     *band_shift = 0;
312     if ( (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
313     {
314         *band_shift = 12;
315     }
316     else
317     {
318         *band_shift = 14;
319     }
320     return WHD_SUCCESS;
321 }
322 
get_wl_chanspec_bw_10(uint16_t wlan_chip_id,uint32_t * bw_10)323 whd_result_t get_wl_chanspec_bw_10(uint16_t wlan_chip_id, uint32_t *bw_10)
324 {
325     *bw_10 = 0;
326     if ( (wlan_chip_id == 43362) || (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
327     {
328         *bw_10 = 0x0400;
329     }
330     else
331     {
332         *bw_10 = 0x0800;
333     }
334     return WHD_SUCCESS;
335 }
336 
get_wl_chanspec_bw_20(uint16_t wlan_chip_id,uint32_t * bw_20)337 whd_result_t get_wl_chanspec_bw_20(uint16_t wlan_chip_id, uint32_t *bw_20)
338 {
339     *bw_20 = 0;
340     if ( (wlan_chip_id == 43362) || (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
341     {
342         *bw_20 = 0x0800;
343     }
344     else
345     {
346         *bw_20 = 0x1000;
347     }
348     return WHD_SUCCESS;
349 }
350 
get_wl_chanspec_bw_40(uint16_t wlan_chip_id,uint32_t * bw_40)351 whd_result_t get_wl_chanspec_bw_40(uint16_t wlan_chip_id, uint32_t *bw_40)
352 {
353     *bw_40 = 0;
354     if ( (wlan_chip_id == 43362) || (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
355     {
356         *bw_40 = 0x0C00;
357     }
358     else
359     {
360         *bw_40 = 0x1800;
361     }
362     return WHD_SUCCESS;
363 }
364 
get_wl_chanspec_bw_mask(uint16_t wlan_chip_id,uint32_t * bw_mask)365 whd_result_t get_wl_chanspec_bw_mask(uint16_t wlan_chip_id, uint32_t *bw_mask)
366 {
367     *bw_mask = 0;
368     if ( (wlan_chip_id == 43362) || (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
369     {
370         *bw_mask = 0x0C00;
371     }
372     else
373     {
374         *bw_mask = 0x3800;
375     }
376     return WHD_SUCCESS;
377 }
378 
get_wl_chanspec_bw_shift(uint16_t wlan_chip_id,uint32_t * bw_shift)379 whd_result_t get_wl_chanspec_bw_shift(uint16_t wlan_chip_id, uint32_t *bw_shift)
380 {
381     *bw_shift = 0;
382     if ( (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
383     {
384         *bw_shift = 10;
385     }
386     else
387     {
388         *bw_shift = 11;
389     }
390     return WHD_SUCCESS;
391 }
392 
get_wl_chanspec_ctl_sb_lower(uint16_t wlan_chip_id,uint32_t * sb_lower)393 whd_result_t get_wl_chanspec_ctl_sb_lower(uint16_t wlan_chip_id, uint32_t *sb_lower)
394 {
395     *sb_lower = 0;
396     if ( (wlan_chip_id == 43362) || (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
397     {
398         *sb_lower = 0x0100;
399     }
400     else
401     {
402         *sb_lower = WL_CHANSPEC_CTL_SB_LLL;
403     }
404     return WHD_SUCCESS;
405 }
406 
get_wl_chanspec_ctl_sb_upper(uint16_t wlan_chip_id,uint32_t * sb_upper)407 whd_result_t get_wl_chanspec_ctl_sb_upper(uint16_t wlan_chip_id, uint32_t *sb_upper)
408 {
409     *sb_upper = 0;
410     if ( (wlan_chip_id == 43362) || (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
411     {
412         *sb_upper = 0x0200;
413     }
414     else
415     {
416         *sb_upper = WL_CHANSPEC_CTL_SB_LLU;
417     }
418     return WHD_SUCCESS;
419 }
420 
get_wl_chanspec_ctl_sb_none(uint16_t wlan_chip_id,uint32_t * sb_none)421 whd_result_t get_wl_chanspec_ctl_sb_none(uint16_t wlan_chip_id, uint32_t *sb_none)
422 {
423     *sb_none = 0;
424     if ( (wlan_chip_id == 43362) || (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
425     {
426         *sb_none = 0x0300;
427     }
428     else
429     {
430         *sb_none = WL_CHANSPEC_CTL_SB_LLL;
431     }
432     return WHD_SUCCESS;
433 }
434 
get_wl_chanspec_ctl_sb_mask(uint16_t wlan_chip_id,uint32_t * sb_mask)435 whd_result_t get_wl_chanspec_ctl_sb_mask(uint16_t wlan_chip_id, uint32_t *sb_mask)
436 {
437     *sb_mask = 0;
438     if ( (wlan_chip_id == 43362) || (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
439     {
440         *sb_mask = 0x0300;
441     }
442     else
443     {
444         *sb_mask = 0x0700;
445     }
446     return WHD_SUCCESS;
447 }
448 
449