2 * Copyright (c) 2014 Broadcom Corporation
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 #include <linux/kernel.h>
17 #include <linux/delay.h>
18 #include <linux/list.h>
19 #include <linux/ssb/ssb_regs.h>
20 #include <linux/bcma/bcma.h>
21 #include <linux/bcma/bcma_regs.h>
25 #include <brcm_hw_ids.h>
26 #include <brcmu_utils.h>
27 #include <chipcommon.h>
31 /* SOC Interconnect types (aka chip types) */
35 /* PL-368 DMP definitions */
36 #define DMP_DESC_TYPE_MSK 0x0000000F
37 #define DMP_DESC_EMPTY 0x00000000
38 #define DMP_DESC_VALID 0x00000001
39 #define DMP_DESC_COMPONENT 0x00000001
40 #define DMP_DESC_MASTER_PORT 0x00000003
41 #define DMP_DESC_ADDRESS 0x00000005
42 #define DMP_DESC_ADDRSIZE_GT32 0x00000008
43 #define DMP_DESC_EOT 0x0000000F
45 #define DMP_COMP_DESIGNER 0xFFF00000
46 #define DMP_COMP_DESIGNER_S 20
47 #define DMP_COMP_PARTNUM 0x000FFF00
48 #define DMP_COMP_PARTNUM_S 8
49 #define DMP_COMP_CLASS 0x000000F0
50 #define DMP_COMP_CLASS_S 4
51 #define DMP_COMP_REVISION 0xFF000000
52 #define DMP_COMP_REVISION_S 24
53 #define DMP_COMP_NUM_SWRAP 0x00F80000
54 #define DMP_COMP_NUM_SWRAP_S 19
55 #define DMP_COMP_NUM_MWRAP 0x0007C000
56 #define DMP_COMP_NUM_MWRAP_S 14
57 #define DMP_COMP_NUM_SPORT 0x00003E00
58 #define DMP_COMP_NUM_SPORT_S 9
59 #define DMP_COMP_NUM_MPORT 0x000001F0
60 #define DMP_COMP_NUM_MPORT_S 4
62 #define DMP_MASTER_PORT_UID 0x0000FF00
63 #define DMP_MASTER_PORT_UID_S 8
64 #define DMP_MASTER_PORT_NUM 0x000000F0
65 #define DMP_MASTER_PORT_NUM_S 4
67 #define DMP_SLAVE_ADDR_BASE 0xFFFFF000
68 #define DMP_SLAVE_ADDR_BASE_S 12
69 #define DMP_SLAVE_PORT_NUM 0x00000F00
70 #define DMP_SLAVE_PORT_NUM_S 8
71 #define DMP_SLAVE_TYPE 0x000000C0
72 #define DMP_SLAVE_TYPE_S 6
73 #define DMP_SLAVE_TYPE_SLAVE 0
74 #define DMP_SLAVE_TYPE_BRIDGE 1
75 #define DMP_SLAVE_TYPE_SWRAP 2
76 #define DMP_SLAVE_TYPE_MWRAP 3
77 #define DMP_SLAVE_SIZE_TYPE 0x00000030
78 #define DMP_SLAVE_SIZE_TYPE_S 4
79 #define DMP_SLAVE_SIZE_4K 0
80 #define DMP_SLAVE_SIZE_8K 1
81 #define DMP_SLAVE_SIZE_16K 2
82 #define DMP_SLAVE_SIZE_DESC 3
85 #define CIB_REV_MASK 0xff000000
86 #define CIB_REV_SHIFT 24
88 /* ARM CR4 core specific control flag bits */
89 #define ARMCR4_BCMA_IOCTL_CPUHALT 0x0020
91 /* D11 core specific control flag bits */
92 #define D11_BCMA_IOCTL_PHYCLOCKEN 0x0004
93 #define D11_BCMA_IOCTL_PHYRESET 0x0008
95 /* chip core base & ramsize */
97 /* SDIO device core, ID 0x829 */
98 #define BCM4329_CORE_BUS_BASE 0x18011000
99 /* internal memory core, ID 0x80e */
100 #define BCM4329_CORE_SOCRAM_BASE 0x18003000
101 /* ARM Cortex M3 core, ID 0x82a */
102 #define BCM4329_CORE_ARM_BASE 0x18002000
104 /* Max possibly supported memory size (limited by IO mapped memory) */
105 #define BRCMF_CHIP_MAX_MEMSIZE (4 * 1024 * 1024)
107 #define CORE_SB(base, field) \
108 (base + SBCONFIGOFF + offsetof(struct sbconfig, field))
109 #define SBCOREREV(sbidh) \
110 ((((sbidh) & SSB_IDHIGH_RCHI) >> SSB_IDHIGH_RCHI_SHIFT) | \
111 ((sbidh) & SSB_IDHIGH_RCLO))
115 u32 sbipsflag
; /* initiator port ocp slave flag */
117 u32 sbtpsflag
; /* target port ocp slave flag */
119 u32 sbtmerrloga
; /* (sonics >= 2.3) */
121 u32 sbtmerrlog
; /* (sonics >= 2.3) */
123 u32 sbadmatch3
; /* address match3 */
125 u32 sbadmatch2
; /* address match2 */
127 u32 sbadmatch1
; /* address match1 */
129 u32 sbimstate
; /* initiator agent state */
130 u32 sbintvec
; /* interrupt mask */
131 u32 sbtmstatelow
; /* target state */
132 u32 sbtmstatehigh
; /* target state */
133 u32 sbbwa0
; /* bandwidth allocation table0 */
135 u32 sbimconfiglow
; /* initiator configuration */
136 u32 sbimconfighigh
; /* initiator configuration */
137 u32 sbadmatch0
; /* address match0 */
139 u32 sbtmconfiglow
; /* target configuration */
140 u32 sbtmconfighigh
; /* target configuration */
141 u32 sbbconfig
; /* broadcast configuration */
143 u32 sbbstate
; /* broadcast state */
145 u32 sbactcnfg
; /* activate configuration */
147 u32 sbflagst
; /* current sbflags */
149 u32 sbidlow
; /* identification */
150 u32 sbidhigh
; /* identification */
153 /* bankidx and bankinfo reg defines corerev >= 8 */
154 #define SOCRAM_BANKINFO_RETNTRAM_MASK 0x00010000
155 #define SOCRAM_BANKINFO_SZMASK 0x0000007f
156 #define SOCRAM_BANKIDX_ROM_MASK 0x00000100
158 #define SOCRAM_BANKIDX_MEMTYPE_SHIFT 8
159 /* socram bankinfo memtype */
160 #define SOCRAM_MEMTYPE_RAM 0
161 #define SOCRAM_MEMTYPE_R0M 1
162 #define SOCRAM_MEMTYPE_DEVRAM 2
164 #define SOCRAM_BANKINFO_SZBASE 8192
165 #define SRCI_LSS_MASK 0x00f00000
166 #define SRCI_LSS_SHIFT 20
167 #define SRCI_SRNB_MASK 0xf0
168 #define SRCI_SRNB_SHIFT 4
169 #define SRCI_SRBSZ_MASK 0xf
170 #define SRCI_SRBSZ_SHIFT 0
171 #define SR_BSZ_BASE 14
173 struct sbsocramregs
{
181 u32 errlogstatus
; /* rev 6 */
182 u32 errlogaddr
; /* rev 6 */
183 /* used for patching rev 3 & 5 */
185 u32 cambankstandbyctrl
;
186 u32 cambankpatchctrl
;
187 u32 cambankpatchtblbaseaddr
;
192 u32 bankinfo
; /* corev 8 */
197 u32 extmemparityerrdata
;
198 u32 extmemparityerrcnt
;
199 u32 extmemwrctrlandsize
;
202 u32 pwrctl
; /* corerev >= 2 */
204 u32 sr_control
; /* corerev >= 15 */
205 u32 sr_status
; /* corerev >= 15 */
206 u32 sr_address
; /* corerev >= 15 */
207 u32 sr_data
; /* corerev >= 15 */
210 #define SOCRAMREGOFFS(_f) offsetof(struct sbsocramregs, _f)
211 #define SYSMEMREGOFFS(_f) offsetof(struct sbsocramregs, _f)
213 #define ARMCR4_CAP (0x04)
214 #define ARMCR4_BANKIDX (0x40)
215 #define ARMCR4_BANKINFO (0x44)
216 #define ARMCR4_BANKPDA (0x4C)
218 #define ARMCR4_TCBBNB_MASK 0xf0
219 #define ARMCR4_TCBBNB_SHIFT 4
220 #define ARMCR4_TCBANB_MASK 0xf
221 #define ARMCR4_TCBANB_SHIFT 0
223 #define ARMCR4_BSZ_MASK 0x3f
224 #define ARMCR4_BSZ_MULT 8192
226 struct brcmf_core_priv
{
227 struct brcmf_core pub
;
229 struct list_head list
;
230 struct brcmf_chip_priv
*chip
;
233 struct brcmf_chip_priv
{
234 struct brcmf_chip pub
;
235 const struct brcmf_buscore_ops
*ops
;
237 /* assured first core is chipcommon, second core is buscore */
238 struct list_head cores
;
241 bool (*iscoreup
)(struct brcmf_core_priv
*core
);
242 void (*coredisable
)(struct brcmf_core_priv
*core
, u32 prereset
,
244 void (*resetcore
)(struct brcmf_core_priv
*core
, u32 prereset
, u32 reset
,
248 static void brcmf_chip_sb_corerev(struct brcmf_chip_priv
*ci
,
249 struct brcmf_core
*core
)
253 regdata
= ci
->ops
->read32(ci
->ctx
, CORE_SB(core
->base
, sbidhigh
));
254 core
->rev
= SBCOREREV(regdata
);
257 static bool brcmf_chip_sb_iscoreup(struct brcmf_core_priv
*core
)
259 struct brcmf_chip_priv
*ci
;
264 address
= CORE_SB(core
->pub
.base
, sbtmstatelow
);
265 regdata
= ci
->ops
->read32(ci
->ctx
, address
);
266 regdata
&= (SSB_TMSLOW_RESET
| SSB_TMSLOW_REJECT
|
267 SSB_IMSTATE_REJECT
| SSB_TMSLOW_CLOCK
);
268 return SSB_TMSLOW_CLOCK
== regdata
;
271 static bool brcmf_chip_ai_iscoreup(struct brcmf_core_priv
*core
)
273 struct brcmf_chip_priv
*ci
;
278 regdata
= ci
->ops
->read32(ci
->ctx
, core
->wrapbase
+ BCMA_IOCTL
);
279 ret
= (regdata
& (BCMA_IOCTL_FGC
| BCMA_IOCTL_CLK
)) == BCMA_IOCTL_CLK
;
281 regdata
= ci
->ops
->read32(ci
->ctx
, core
->wrapbase
+ BCMA_RESET_CTL
);
282 ret
= ret
&& ((regdata
& BCMA_RESET_CTL_RESET
) == 0);
287 static void brcmf_chip_sb_coredisable(struct brcmf_core_priv
*core
,
288 u32 prereset
, u32 reset
)
290 struct brcmf_chip_priv
*ci
;
294 base
= core
->pub
.base
;
295 val
= ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
));
296 if (val
& SSB_TMSLOW_RESET
)
299 val
= ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
));
300 if ((val
& SSB_TMSLOW_CLOCK
) != 0) {
302 * set target reject and spin until busy is clear
303 * (preserve core-specific bits)
305 val
= ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
));
306 ci
->ops
->write32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
),
307 val
| SSB_TMSLOW_REJECT
);
309 val
= ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
));
311 SPINWAIT((ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbtmstatehigh
))
312 & SSB_TMSHIGH_BUSY
), 100000);
314 val
= ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbtmstatehigh
));
315 if (val
& SSB_TMSHIGH_BUSY
)
316 brcmf_err("core state still busy\n");
318 val
= ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbidlow
));
319 if (val
& SSB_IDLOW_INITIATOR
) {
320 val
= ci
->ops
->read32(ci
->ctx
,
321 CORE_SB(base
, sbimstate
));
322 val
|= SSB_IMSTATE_REJECT
;
323 ci
->ops
->write32(ci
->ctx
,
324 CORE_SB(base
, sbimstate
), val
);
325 val
= ci
->ops
->read32(ci
->ctx
,
326 CORE_SB(base
, sbimstate
));
328 SPINWAIT((ci
->ops
->read32(ci
->ctx
,
329 CORE_SB(base
, sbimstate
)) &
330 SSB_IMSTATE_BUSY
), 100000);
333 /* set reset and reject while enabling the clocks */
334 val
= SSB_TMSLOW_FGC
| SSB_TMSLOW_CLOCK
|
335 SSB_TMSLOW_REJECT
| SSB_TMSLOW_RESET
;
336 ci
->ops
->write32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
), val
);
337 val
= ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
));
340 /* clear the initiator reject bit */
341 val
= ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbidlow
));
342 if (val
& SSB_IDLOW_INITIATOR
) {
343 val
= ci
->ops
->read32(ci
->ctx
,
344 CORE_SB(base
, sbimstate
));
345 val
&= ~SSB_IMSTATE_REJECT
;
346 ci
->ops
->write32(ci
->ctx
,
347 CORE_SB(base
, sbimstate
), val
);
351 /* leave reset and reject asserted */
352 ci
->ops
->write32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
),
353 (SSB_TMSLOW_REJECT
| SSB_TMSLOW_RESET
));
357 static void brcmf_chip_ai_coredisable(struct brcmf_core_priv
*core
,
358 u32 prereset
, u32 reset
)
360 struct brcmf_chip_priv
*ci
;
365 /* if core is already in reset, skip reset */
366 regdata
= ci
->ops
->read32(ci
->ctx
, core
->wrapbase
+ BCMA_RESET_CTL
);
367 if ((regdata
& BCMA_RESET_CTL_RESET
) != 0)
368 goto in_reset_configure
;
370 /* configure reset */
371 ci
->ops
->write32(ci
->ctx
, core
->wrapbase
+ BCMA_IOCTL
,
372 prereset
| BCMA_IOCTL_FGC
| BCMA_IOCTL_CLK
);
373 ci
->ops
->read32(ci
->ctx
, core
->wrapbase
+ BCMA_IOCTL
);
376 ci
->ops
->write32(ci
->ctx
, core
->wrapbase
+ BCMA_RESET_CTL
,
377 BCMA_RESET_CTL_RESET
);
378 usleep_range(10, 20);
380 /* wait till reset is 1 */
381 SPINWAIT(ci
->ops
->read32(ci
->ctx
, core
->wrapbase
+ BCMA_RESET_CTL
) !=
382 BCMA_RESET_CTL_RESET
, 300);
385 /* in-reset configure */
386 ci
->ops
->write32(ci
->ctx
, core
->wrapbase
+ BCMA_IOCTL
,
387 reset
| BCMA_IOCTL_FGC
| BCMA_IOCTL_CLK
);
388 ci
->ops
->read32(ci
->ctx
, core
->wrapbase
+ BCMA_IOCTL
);
391 static void brcmf_chip_sb_resetcore(struct brcmf_core_priv
*core
, u32 prereset
,
392 u32 reset
, u32 postreset
)
394 struct brcmf_chip_priv
*ci
;
399 base
= core
->pub
.base
;
401 * Must do the disable sequence first to work for
402 * arbitrary current core state.
404 brcmf_chip_sb_coredisable(core
, 0, 0);
407 * Now do the initialization sequence.
408 * set reset while enabling the clock and
409 * forcing them on throughout the core
411 ci
->ops
->write32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
),
412 SSB_TMSLOW_FGC
| SSB_TMSLOW_CLOCK
|
414 regdata
= ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
));
417 /* clear any serror */
418 regdata
= ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbtmstatehigh
));
419 if (regdata
& SSB_TMSHIGH_SERR
)
420 ci
->ops
->write32(ci
->ctx
, CORE_SB(base
, sbtmstatehigh
), 0);
422 regdata
= ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbimstate
));
423 if (regdata
& (SSB_IMSTATE_IBE
| SSB_IMSTATE_TO
)) {
424 regdata
&= ~(SSB_IMSTATE_IBE
| SSB_IMSTATE_TO
);
425 ci
->ops
->write32(ci
->ctx
, CORE_SB(base
, sbimstate
), regdata
);
428 /* clear reset and allow it to propagate throughout the core */
429 ci
->ops
->write32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
),
430 SSB_TMSLOW_FGC
| SSB_TMSLOW_CLOCK
);
431 regdata
= ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
));
434 /* leave clock enabled */
435 ci
->ops
->write32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
),
437 regdata
= ci
->ops
->read32(ci
->ctx
, CORE_SB(base
, sbtmstatelow
));
441 static void brcmf_chip_ai_resetcore(struct brcmf_core_priv
*core
, u32 prereset
,
442 u32 reset
, u32 postreset
)
444 struct brcmf_chip_priv
*ci
;
449 /* must disable first to work for arbitrary current core state */
450 brcmf_chip_ai_coredisable(core
, prereset
, reset
);
453 while (ci
->ops
->read32(ci
->ctx
, core
->wrapbase
+ BCMA_RESET_CTL
) &
454 BCMA_RESET_CTL_RESET
) {
455 ci
->ops
->write32(ci
->ctx
, core
->wrapbase
+ BCMA_RESET_CTL
, 0);
459 usleep_range(40, 60);
462 ci
->ops
->write32(ci
->ctx
, core
->wrapbase
+ BCMA_IOCTL
,
463 postreset
| BCMA_IOCTL_CLK
);
464 ci
->ops
->read32(ci
->ctx
, core
->wrapbase
+ BCMA_IOCTL
);
467 static char *brcmf_chip_name(uint chipid
, char *buf
, uint len
)
471 fmt
= ((chipid
> 0xa000) || (chipid
< 0x4000)) ? "%d" : "%x";
472 snprintf(buf
, len
, fmt
, chipid
);
476 static struct brcmf_core
*brcmf_chip_add_core(struct brcmf_chip_priv
*ci
,
477 u16 coreid
, u32 base
,
480 struct brcmf_core_priv
*core
;
482 core
= kzalloc(sizeof(*core
), GFP_KERNEL
);
484 return ERR_PTR(-ENOMEM
);
486 core
->pub
.id
= coreid
;
487 core
->pub
.base
= base
;
489 core
->wrapbase
= wrapbase
;
491 list_add_tail(&core
->list
, &ci
->cores
);
495 /* safety check for chipinfo */
496 static int brcmf_chip_cores_check(struct brcmf_chip_priv
*ci
)
498 struct brcmf_core_priv
*core
;
499 bool need_socram
= false;
500 bool has_socram
= false;
501 bool cpu_found
= false;
504 list_for_each_entry(core
, &ci
->cores
, list
) {
505 brcmf_dbg(INFO
, " [%-2d] core 0x%x:%-2d base 0x%08x wrap 0x%08x\n",
506 idx
++, core
->pub
.id
, core
->pub
.rev
, core
->pub
.base
,
509 switch (core
->pub
.id
) {
510 case BCMA_CORE_ARM_CM3
:
514 case BCMA_CORE_INTERNAL_MEM
:
517 case BCMA_CORE_ARM_CR4
:
520 case BCMA_CORE_ARM_CA7
:
529 brcmf_err("CPU core not detected\n");
532 /* check RAM core presence for ARM CM3 core */
533 if (need_socram
&& !has_socram
) {
534 brcmf_err("RAM core not provided with ARM CM3 core\n");
540 static u32
brcmf_chip_core_read32(struct brcmf_core_priv
*core
, u16 reg
)
542 return core
->chip
->ops
->read32(core
->chip
->ctx
, core
->pub
.base
+ reg
);
545 static void brcmf_chip_core_write32(struct brcmf_core_priv
*core
,
548 core
->chip
->ops
->write32(core
->chip
->ctx
, core
->pub
.base
+ reg
, val
);
551 static bool brcmf_chip_socram_banksize(struct brcmf_core_priv
*core
, u8 idx
,
555 u32 bankidx
= (SOCRAM_MEMTYPE_RAM
<< SOCRAM_BANKIDX_MEMTYPE_SHIFT
);
558 brcmf_chip_core_write32(core
, SOCRAMREGOFFS(bankidx
), bankidx
);
559 bankinfo
= brcmf_chip_core_read32(core
, SOCRAMREGOFFS(bankinfo
));
560 *banksize
= (bankinfo
& SOCRAM_BANKINFO_SZMASK
) + 1;
561 *banksize
*= SOCRAM_BANKINFO_SZBASE
;
562 return !!(bankinfo
& SOCRAM_BANKINFO_RETNTRAM_MASK
);
565 static void brcmf_chip_socram_ramsize(struct brcmf_core_priv
*sr
, u32
*ramsize
,
569 uint nb
, banksize
, lss
;
576 if (WARN_ON(sr
->pub
.rev
< 4))
579 if (!brcmf_chip_iscoreup(&sr
->pub
))
580 brcmf_chip_resetcore(&sr
->pub
, 0, 0, 0);
582 /* Get info for determining size */
583 coreinfo
= brcmf_chip_core_read32(sr
, SOCRAMREGOFFS(coreinfo
));
584 nb
= (coreinfo
& SRCI_SRNB_MASK
) >> SRCI_SRNB_SHIFT
;
586 if ((sr
->pub
.rev
<= 7) || (sr
->pub
.rev
== 12)) {
587 banksize
= (coreinfo
& SRCI_SRBSZ_MASK
);
588 lss
= (coreinfo
& SRCI_LSS_MASK
) >> SRCI_LSS_SHIFT
;
591 *ramsize
= nb
* (1 << (banksize
+ SR_BSZ_BASE
));
593 *ramsize
+= (1 << ((lss
- 1) + SR_BSZ_BASE
));
595 nb
= (coreinfo
& SRCI_SRNB_MASK
) >> SRCI_SRNB_SHIFT
;
596 for (i
= 0; i
< nb
; i
++) {
597 retent
= brcmf_chip_socram_banksize(sr
, i
, &banksize
);
598 *ramsize
+= banksize
;
604 /* hardcoded save&restore memory sizes */
605 switch (sr
->chip
->pub
.chip
) {
606 case BRCM_CC_4334_CHIP_ID
:
607 if (sr
->chip
->pub
.chiprev
< 2)
608 *srsize
= (32 * 1024);
610 case BRCM_CC_43430_CHIP_ID
:
611 /* assume sr for now as we can not check
612 * firmware sr capability at this point.
614 *srsize
= (64 * 1024);
621 /** Return the SYS MEM size */
622 static u32
brcmf_chip_sysmem_ramsize(struct brcmf_core_priv
*sysmem
)
630 if (!brcmf_chip_iscoreup(&sysmem
->pub
))
631 brcmf_chip_resetcore(&sysmem
->pub
, 0, 0, 0);
633 coreinfo
= brcmf_chip_core_read32(sysmem
, SYSMEMREGOFFS(coreinfo
));
634 nb
= (coreinfo
& SRCI_SRNB_MASK
) >> SRCI_SRNB_SHIFT
;
636 for (idx
= 0; idx
< nb
; idx
++) {
637 brcmf_chip_socram_banksize(sysmem
, idx
, &banksize
);
644 /** Return the TCM-RAM size of the ARMCR4 core. */
645 static u32
brcmf_chip_tcm_ramsize(struct brcmf_core_priv
*cr4
)
655 corecap
= brcmf_chip_core_read32(cr4
, ARMCR4_CAP
);
657 nab
= (corecap
& ARMCR4_TCBANB_MASK
) >> ARMCR4_TCBANB_SHIFT
;
658 nbb
= (corecap
& ARMCR4_TCBBNB_MASK
) >> ARMCR4_TCBBNB_SHIFT
;
661 for (idx
= 0; idx
< totb
; idx
++) {
662 brcmf_chip_core_write32(cr4
, ARMCR4_BANKIDX
, idx
);
663 bxinfo
= brcmf_chip_core_read32(cr4
, ARMCR4_BANKINFO
);
664 memsize
+= ((bxinfo
& ARMCR4_BSZ_MASK
) + 1) * ARMCR4_BSZ_MULT
;
670 static u32
brcmf_chip_tcm_rambase(struct brcmf_chip_priv
*ci
)
672 switch (ci
->pub
.chip
) {
673 case BRCM_CC_4345_CHIP_ID
:
675 case BRCM_CC_4335_CHIP_ID
:
676 case BRCM_CC_4339_CHIP_ID
:
677 case BRCM_CC_4350_CHIP_ID
:
678 case BRCM_CC_4354_CHIP_ID
:
679 case BRCM_CC_4356_CHIP_ID
:
680 case BRCM_CC_43567_CHIP_ID
:
681 case BRCM_CC_43569_CHIP_ID
:
682 case BRCM_CC_43570_CHIP_ID
:
683 case BRCM_CC_4358_CHIP_ID
:
684 case BRCM_CC_4359_CHIP_ID
:
685 case BRCM_CC_43602_CHIP_ID
:
686 case BRCM_CC_4371_CHIP_ID
:
688 case BRCM_CC_43465_CHIP_ID
:
689 case BRCM_CC_43525_CHIP_ID
:
690 case BRCM_CC_4365_CHIP_ID
:
691 case BRCM_CC_4366_CHIP_ID
:
693 case CY_CC_4373_CHIP_ID
:
696 brcmf_err("unknown chip: %s\n", ci
->pub
.name
);
702 static int brcmf_chip_get_raminfo(struct brcmf_chip_priv
*ci
)
704 struct brcmf_core_priv
*mem_core
;
705 struct brcmf_core
*mem
;
707 mem
= brcmf_chip_get_core(&ci
->pub
, BCMA_CORE_ARM_CR4
);
709 mem_core
= container_of(mem
, struct brcmf_core_priv
, pub
);
710 ci
->pub
.ramsize
= brcmf_chip_tcm_ramsize(mem_core
);
711 ci
->pub
.rambase
= brcmf_chip_tcm_rambase(ci
);
712 if (!ci
->pub
.rambase
) {
713 brcmf_err("RAM base not provided with ARM CR4 core\n");
717 mem
= brcmf_chip_get_core(&ci
->pub
, BCMA_CORE_SYS_MEM
);
719 mem_core
= container_of(mem
, struct brcmf_core_priv
,
721 ci
->pub
.ramsize
= brcmf_chip_sysmem_ramsize(mem_core
);
722 ci
->pub
.rambase
= brcmf_chip_tcm_rambase(ci
);
723 if (!ci
->pub
.rambase
) {
724 brcmf_err("RAM base not provided with ARM CA7 core\n");
728 mem
= brcmf_chip_get_core(&ci
->pub
,
729 BCMA_CORE_INTERNAL_MEM
);
731 brcmf_err("No memory cores found\n");
734 mem_core
= container_of(mem
, struct brcmf_core_priv
,
736 brcmf_chip_socram_ramsize(mem_core
, &ci
->pub
.ramsize
,
740 brcmf_dbg(INFO
, "RAM: base=0x%x size=%d (0x%x) sr=%d (0x%x)\n",
741 ci
->pub
.rambase
, ci
->pub
.ramsize
, ci
->pub
.ramsize
,
742 ci
->pub
.srsize
, ci
->pub
.srsize
);
744 if (!ci
->pub
.ramsize
) {
745 brcmf_err("RAM size is undetermined\n");
749 if (ci
->pub
.ramsize
> BRCMF_CHIP_MAX_MEMSIZE
) {
750 brcmf_err("RAM size is incorrect\n");
757 static u32
brcmf_chip_dmp_get_desc(struct brcmf_chip_priv
*ci
, u32
*eromaddr
,
762 /* read next descriptor */
763 val
= ci
->ops
->read32(ci
->ctx
, *eromaddr
);
769 /* determine descriptor type */
770 *type
= (val
& DMP_DESC_TYPE_MSK
);
771 if ((*type
& ~DMP_DESC_ADDRSIZE_GT32
) == DMP_DESC_ADDRESS
)
772 *type
= DMP_DESC_ADDRESS
;
777 static int brcmf_chip_dmp_get_regaddr(struct brcmf_chip_priv
*ci
, u32
*eromaddr
,
778 u32
*regbase
, u32
*wrapbase
)
783 u8 stype
, sztype
, wraptype
;
788 val
= brcmf_chip_dmp_get_desc(ci
, eromaddr
, &desc
);
789 if (desc
== DMP_DESC_MASTER_PORT
) {
790 mpnum
= (val
& DMP_MASTER_PORT_NUM
) >> DMP_MASTER_PORT_NUM_S
;
791 wraptype
= DMP_SLAVE_TYPE_MWRAP
;
792 } else if (desc
== DMP_DESC_ADDRESS
) {
793 /* revert erom address */
795 wraptype
= DMP_SLAVE_TYPE_SWRAP
;
802 /* locate address descriptor */
804 val
= brcmf_chip_dmp_get_desc(ci
, eromaddr
, &desc
);
805 /* unexpected table end */
806 if (desc
== DMP_DESC_EOT
) {
810 } while (desc
!= DMP_DESC_ADDRESS
&&
811 desc
!= DMP_DESC_COMPONENT
);
813 /* stop if we crossed current component border */
814 if (desc
== DMP_DESC_COMPONENT
) {
819 /* skip upper 32-bit address descriptor */
820 if (val
& DMP_DESC_ADDRSIZE_GT32
)
821 brcmf_chip_dmp_get_desc(ci
, eromaddr
, NULL
);
823 sztype
= (val
& DMP_SLAVE_SIZE_TYPE
) >> DMP_SLAVE_SIZE_TYPE_S
;
825 /* next size descriptor can be skipped */
826 if (sztype
== DMP_SLAVE_SIZE_DESC
) {
827 val
= brcmf_chip_dmp_get_desc(ci
, eromaddr
, NULL
);
828 /* skip upper size descriptor if present */
829 if (val
& DMP_DESC_ADDRSIZE_GT32
)
830 brcmf_chip_dmp_get_desc(ci
, eromaddr
, NULL
);
833 /* only look for 4K register regions */
834 if (sztype
!= DMP_SLAVE_SIZE_4K
)
837 stype
= (val
& DMP_SLAVE_TYPE
) >> DMP_SLAVE_TYPE_S
;
839 /* only regular slave and wrapper */
840 if (*regbase
== 0 && stype
== DMP_SLAVE_TYPE_SLAVE
)
841 *regbase
= val
& DMP_SLAVE_ADDR_BASE
;
842 if (*wrapbase
== 0 && stype
== wraptype
)
843 *wrapbase
= val
& DMP_SLAVE_ADDR_BASE
;
844 } while (*regbase
== 0 || *wrapbase
== 0);
850 int brcmf_chip_dmp_erom_scan(struct brcmf_chip_priv
*ci
)
852 struct brcmf_core
*core
;
857 u8 nmp
, nsp
, nmw
, nsw
, rev
;
861 eromaddr
= ci
->ops
->read32(ci
->ctx
, CORE_CC_REG(SI_ENUM_BASE
, eromptr
));
863 while (desc_type
!= DMP_DESC_EOT
) {
864 val
= brcmf_chip_dmp_get_desc(ci
, &eromaddr
, &desc_type
);
865 if (!(val
& DMP_DESC_VALID
))
868 if (desc_type
== DMP_DESC_EMPTY
)
871 /* need a component descriptor */
872 if (desc_type
!= DMP_DESC_COMPONENT
)
875 id
= (val
& DMP_COMP_PARTNUM
) >> DMP_COMP_PARTNUM_S
;
877 /* next descriptor must be component as well */
878 val
= brcmf_chip_dmp_get_desc(ci
, &eromaddr
, &desc_type
);
879 if (WARN_ON((val
& DMP_DESC_TYPE_MSK
) != DMP_DESC_COMPONENT
))
882 /* only look at cores with master port(s) */
883 nmp
= (val
& DMP_COMP_NUM_MPORT
) >> DMP_COMP_NUM_MPORT_S
;
884 nsp
= (val
& DMP_COMP_NUM_SPORT
) >> DMP_COMP_NUM_SPORT_S
;
885 nmw
= (val
& DMP_COMP_NUM_MWRAP
) >> DMP_COMP_NUM_MWRAP_S
;
886 nsw
= (val
& DMP_COMP_NUM_SWRAP
) >> DMP_COMP_NUM_SWRAP_S
;
887 rev
= (val
& DMP_COMP_REVISION
) >> DMP_COMP_REVISION_S
;
889 /* need core with ports */
890 if (nmw
+ nsw
== 0 &&
894 /* try to obtain register address info */
895 err
= brcmf_chip_dmp_get_regaddr(ci
, &eromaddr
, &base
, &wrap
);
899 /* finally a core to be added */
900 core
= brcmf_chip_add_core(ci
, id
, base
, wrap
);
902 return PTR_ERR(core
);
910 static int brcmf_chip_recognition(struct brcmf_chip_priv
*ci
)
912 struct brcmf_core
*core
;
918 * Chipid is assume to be at offset 0 from SI_ENUM_BASE
919 * For different chiptypes or old sdio hosts w/o chipcommon,
920 * other ways of recognition should be added here.
922 regdata
= ci
->ops
->read32(ci
->ctx
, CORE_CC_REG(SI_ENUM_BASE
, chipid
));
923 ci
->pub
.chip
= regdata
& CID_ID_MASK
;
924 ci
->pub
.chiprev
= (regdata
& CID_REV_MASK
) >> CID_REV_SHIFT
;
925 socitype
= (regdata
& CID_TYPE_MASK
) >> CID_TYPE_SHIFT
;
927 brcmf_chip_name(ci
->pub
.chip
, ci
->pub
.name
, sizeof(ci
->pub
.name
));
928 brcmf_dbg(INFO
, "found %s chip: BCM%s, rev=%d\n",
929 socitype
== SOCI_SB
? "SB" : "AXI", ci
->pub
.name
,
932 if (socitype
== SOCI_SB
) {
933 if (ci
->pub
.chip
!= BRCM_CC_4329_CHIP_ID
) {
934 brcmf_err("SB chip is not supported\n");
937 ci
->iscoreup
= brcmf_chip_sb_iscoreup
;
938 ci
->coredisable
= brcmf_chip_sb_coredisable
;
939 ci
->resetcore
= brcmf_chip_sb_resetcore
;
941 core
= brcmf_chip_add_core(ci
, BCMA_CORE_CHIPCOMMON
,
943 brcmf_chip_sb_corerev(ci
, core
);
944 core
= brcmf_chip_add_core(ci
, BCMA_CORE_SDIO_DEV
,
945 BCM4329_CORE_BUS_BASE
, 0);
946 brcmf_chip_sb_corerev(ci
, core
);
947 core
= brcmf_chip_add_core(ci
, BCMA_CORE_INTERNAL_MEM
,
948 BCM4329_CORE_SOCRAM_BASE
, 0);
949 brcmf_chip_sb_corerev(ci
, core
);
950 core
= brcmf_chip_add_core(ci
, BCMA_CORE_ARM_CM3
,
951 BCM4329_CORE_ARM_BASE
, 0);
952 brcmf_chip_sb_corerev(ci
, core
);
954 core
= brcmf_chip_add_core(ci
, BCMA_CORE_80211
, 0x18001000, 0);
955 brcmf_chip_sb_corerev(ci
, core
);
956 } else if (socitype
== SOCI_AI
) {
957 ci
->iscoreup
= brcmf_chip_ai_iscoreup
;
958 ci
->coredisable
= brcmf_chip_ai_coredisable
;
959 ci
->resetcore
= brcmf_chip_ai_resetcore
;
961 brcmf_chip_dmp_erom_scan(ci
);
963 brcmf_err("chip backplane type %u is not supported\n",
968 ret
= brcmf_chip_cores_check(ci
);
972 /* assure chip is passive for core access */
973 brcmf_chip_set_passive(&ci
->pub
);
975 /* Call bus specific reset function now. Cores have been determined
976 * but further access may require a chip specific reset at this point.
978 if (ci
->ops
->reset
) {
979 ci
->ops
->reset(ci
->ctx
, &ci
->pub
);
980 brcmf_chip_set_passive(&ci
->pub
);
983 return brcmf_chip_get_raminfo(ci
);
986 static void brcmf_chip_disable_arm(struct brcmf_chip_priv
*chip
, u16 id
)
988 struct brcmf_core
*core
;
989 struct brcmf_core_priv
*cpu
;
993 core
= brcmf_chip_get_core(&chip
->pub
, id
);
998 case BCMA_CORE_ARM_CM3
:
999 brcmf_chip_coredisable(core
, 0, 0);
1001 case BCMA_CORE_ARM_CR4
:
1002 case BCMA_CORE_ARM_CA7
:
1003 cpu
= container_of(core
, struct brcmf_core_priv
, pub
);
1005 /* clear all IOCTL bits except HALT bit */
1006 val
= chip
->ops
->read32(chip
->ctx
, cpu
->wrapbase
+ BCMA_IOCTL
);
1007 val
&= ARMCR4_BCMA_IOCTL_CPUHALT
;
1008 brcmf_chip_resetcore(core
, val
, ARMCR4_BCMA_IOCTL_CPUHALT
,
1009 ARMCR4_BCMA_IOCTL_CPUHALT
);
1012 brcmf_err("unknown id: %u\n", id
);
1017 static int brcmf_chip_setup(struct brcmf_chip_priv
*chip
)
1019 struct brcmf_chip
*pub
;
1020 struct brcmf_core_priv
*cc
;
1021 struct brcmf_core
*pmu
;
1027 cc
= list_first_entry(&chip
->cores
, struct brcmf_core_priv
, list
);
1028 base
= cc
->pub
.base
;
1030 /* get chipcommon capabilites */
1031 pub
->cc_caps
= chip
->ops
->read32(chip
->ctx
,
1032 CORE_CC_REG(base
, capabilities
));
1033 pub
->cc_caps_ext
= chip
->ops
->read32(chip
->ctx
,
1037 /* get pmu caps & rev */
1038 pmu
= brcmf_chip_get_pmu(pub
); /* after reading cc_caps_ext */
1039 if (pub
->cc_caps
& CC_CAP_PMU
) {
1040 val
= chip
->ops
->read32(chip
->ctx
,
1041 CORE_CC_REG(pmu
->base
, pmucapabilities
));
1042 pub
->pmurev
= val
& PCAP_REV_MASK
;
1046 brcmf_dbg(INFO
, "ccrev=%d, pmurev=%d, pmucaps=0x%x\n",
1047 cc
->pub
.rev
, pub
->pmurev
, pub
->pmucaps
);
1049 /* execute bus core specific setup */
1050 if (chip
->ops
->setup
)
1051 ret
= chip
->ops
->setup(chip
->ctx
, pub
);
1056 struct brcmf_chip
*brcmf_chip_attach(void *ctx
,
1057 const struct brcmf_buscore_ops
*ops
)
1059 struct brcmf_chip_priv
*chip
;
1062 if (WARN_ON(!ops
->read32
))
1064 if (WARN_ON(!ops
->write32
))
1066 if (WARN_ON(!ops
->prepare
))
1068 if (WARN_ON(!ops
->activate
))
1071 return ERR_PTR(-EINVAL
);
1073 chip
= kzalloc(sizeof(*chip
), GFP_KERNEL
);
1075 return ERR_PTR(-ENOMEM
);
1077 INIT_LIST_HEAD(&chip
->cores
);
1078 chip
->num_cores
= 0;
1082 err
= ops
->prepare(ctx
);
1086 err
= brcmf_chip_recognition(chip
);
1090 err
= brcmf_chip_setup(chip
);
1097 brcmf_chip_detach(&chip
->pub
);
1098 return ERR_PTR(err
);
1101 void brcmf_chip_detach(struct brcmf_chip
*pub
)
1103 struct brcmf_chip_priv
*chip
;
1104 struct brcmf_core_priv
*core
;
1105 struct brcmf_core_priv
*tmp
;
1107 chip
= container_of(pub
, struct brcmf_chip_priv
, pub
);
1108 list_for_each_entry_safe(core
, tmp
, &chip
->cores
, list
) {
1109 list_del(&core
->list
);
1115 struct brcmf_core
*brcmf_chip_get_core(struct brcmf_chip
*pub
, u16 coreid
)
1117 struct brcmf_chip_priv
*chip
;
1118 struct brcmf_core_priv
*core
;
1120 chip
= container_of(pub
, struct brcmf_chip_priv
, pub
);
1121 list_for_each_entry(core
, &chip
->cores
, list
)
1122 if (core
->pub
.id
== coreid
)
1128 struct brcmf_core
*brcmf_chip_get_chipcommon(struct brcmf_chip
*pub
)
1130 struct brcmf_chip_priv
*chip
;
1131 struct brcmf_core_priv
*cc
;
1133 chip
= container_of(pub
, struct brcmf_chip_priv
, pub
);
1134 cc
= list_first_entry(&chip
->cores
, struct brcmf_core_priv
, list
);
1135 if (WARN_ON(!cc
|| cc
->pub
.id
!= BCMA_CORE_CHIPCOMMON
))
1136 return brcmf_chip_get_core(pub
, BCMA_CORE_CHIPCOMMON
);
1140 struct brcmf_core
*brcmf_chip_get_pmu(struct brcmf_chip
*pub
)
1142 struct brcmf_core
*cc
= brcmf_chip_get_chipcommon(pub
);
1143 struct brcmf_core
*pmu
;
1145 /* See if there is separated PMU core available */
1146 if (cc
->rev
>= 35 &&
1147 pub
->cc_caps_ext
& BCMA_CC_CAP_EXT_AOB_PRESENT
) {
1148 pmu
= brcmf_chip_get_core(pub
, BCMA_CORE_PMU
);
1153 /* Fallback to ChipCommon core for older hardware */
1157 bool brcmf_chip_iscoreup(struct brcmf_core
*pub
)
1159 struct brcmf_core_priv
*core
;
1161 core
= container_of(pub
, struct brcmf_core_priv
, pub
);
1162 return core
->chip
->iscoreup(core
);
1165 void brcmf_chip_coredisable(struct brcmf_core
*pub
, u32 prereset
, u32 reset
)
1167 struct brcmf_core_priv
*core
;
1169 core
= container_of(pub
, struct brcmf_core_priv
, pub
);
1170 core
->chip
->coredisable(core
, prereset
, reset
);
1173 void brcmf_chip_resetcore(struct brcmf_core
*pub
, u32 prereset
, u32 reset
,
1176 struct brcmf_core_priv
*core
;
1178 core
= container_of(pub
, struct brcmf_core_priv
, pub
);
1179 core
->chip
->resetcore(core
, prereset
, reset
, postreset
);
1183 brcmf_chip_cm3_set_passive(struct brcmf_chip_priv
*chip
)
1185 struct brcmf_core
*core
;
1186 struct brcmf_core_priv
*sr
;
1188 brcmf_chip_disable_arm(chip
, BCMA_CORE_ARM_CM3
);
1189 core
= brcmf_chip_get_core(&chip
->pub
, BCMA_CORE_80211
);
1190 brcmf_chip_resetcore(core
, D11_BCMA_IOCTL_PHYRESET
|
1191 D11_BCMA_IOCTL_PHYCLOCKEN
,
1192 D11_BCMA_IOCTL_PHYCLOCKEN
,
1193 D11_BCMA_IOCTL_PHYCLOCKEN
);
1194 core
= brcmf_chip_get_core(&chip
->pub
, BCMA_CORE_INTERNAL_MEM
);
1195 brcmf_chip_resetcore(core
, 0, 0, 0);
1197 /* disable bank #3 remap for this device */
1198 if (chip
->pub
.chip
== BRCM_CC_43430_CHIP_ID
) {
1199 sr
= container_of(core
, struct brcmf_core_priv
, pub
);
1200 brcmf_chip_core_write32(sr
, SOCRAMREGOFFS(bankidx
), 3);
1201 brcmf_chip_core_write32(sr
, SOCRAMREGOFFS(bankpda
), 0);
1205 static bool brcmf_chip_cm3_set_active(struct brcmf_chip_priv
*chip
)
1207 struct brcmf_core
*core
;
1209 core
= brcmf_chip_get_core(&chip
->pub
, BCMA_CORE_INTERNAL_MEM
);
1210 if (!brcmf_chip_iscoreup(core
)) {
1211 brcmf_err("SOCRAM core is down after reset?\n");
1215 chip
->ops
->activate(chip
->ctx
, &chip
->pub
, 0);
1217 core
= brcmf_chip_get_core(&chip
->pub
, BCMA_CORE_ARM_CM3
);
1218 brcmf_chip_resetcore(core
, 0, 0, 0);
1224 brcmf_chip_cr4_set_passive(struct brcmf_chip_priv
*chip
)
1226 struct brcmf_core
*core
;
1228 brcmf_chip_disable_arm(chip
, BCMA_CORE_ARM_CR4
);
1230 core
= brcmf_chip_get_core(&chip
->pub
, BCMA_CORE_80211
);
1231 brcmf_chip_resetcore(core
, D11_BCMA_IOCTL_PHYRESET
|
1232 D11_BCMA_IOCTL_PHYCLOCKEN
,
1233 D11_BCMA_IOCTL_PHYCLOCKEN
,
1234 D11_BCMA_IOCTL_PHYCLOCKEN
);
1237 static bool brcmf_chip_cr4_set_active(struct brcmf_chip_priv
*chip
, u32 rstvec
)
1239 struct brcmf_core
*core
;
1241 chip
->ops
->activate(chip
->ctx
, &chip
->pub
, rstvec
);
1244 core
= brcmf_chip_get_core(&chip
->pub
, BCMA_CORE_ARM_CR4
);
1245 brcmf_chip_resetcore(core
, ARMCR4_BCMA_IOCTL_CPUHALT
, 0, 0);
1251 brcmf_chip_ca7_set_passive(struct brcmf_chip_priv
*chip
)
1253 struct brcmf_core
*core
;
1255 brcmf_chip_disable_arm(chip
, BCMA_CORE_ARM_CA7
);
1257 core
= brcmf_chip_get_core(&chip
->pub
, BCMA_CORE_80211
);
1258 brcmf_chip_resetcore(core
, D11_BCMA_IOCTL_PHYRESET
|
1259 D11_BCMA_IOCTL_PHYCLOCKEN
,
1260 D11_BCMA_IOCTL_PHYCLOCKEN
,
1261 D11_BCMA_IOCTL_PHYCLOCKEN
);
1264 static bool brcmf_chip_ca7_set_active(struct brcmf_chip_priv
*chip
, u32 rstvec
)
1266 struct brcmf_core
*core
;
1268 chip
->ops
->activate(chip
->ctx
, &chip
->pub
, rstvec
);
1271 core
= brcmf_chip_get_core(&chip
->pub
, BCMA_CORE_ARM_CA7
);
1272 brcmf_chip_resetcore(core
, ARMCR4_BCMA_IOCTL_CPUHALT
, 0, 0);
1277 void brcmf_chip_set_passive(struct brcmf_chip
*pub
)
1279 struct brcmf_chip_priv
*chip
;
1280 struct brcmf_core
*arm
;
1282 brcmf_dbg(TRACE
, "Enter\n");
1284 chip
= container_of(pub
, struct brcmf_chip_priv
, pub
);
1285 arm
= brcmf_chip_get_core(pub
, BCMA_CORE_ARM_CR4
);
1287 brcmf_chip_cr4_set_passive(chip
);
1290 arm
= brcmf_chip_get_core(pub
, BCMA_CORE_ARM_CA7
);
1292 brcmf_chip_ca7_set_passive(chip
);
1295 arm
= brcmf_chip_get_core(pub
, BCMA_CORE_ARM_CM3
);
1297 brcmf_chip_cm3_set_passive(chip
);
1302 bool brcmf_chip_set_active(struct brcmf_chip
*pub
, u32 rstvec
)
1304 struct brcmf_chip_priv
*chip
;
1305 struct brcmf_core
*arm
;
1307 brcmf_dbg(TRACE
, "Enter\n");
1309 chip
= container_of(pub
, struct brcmf_chip_priv
, pub
);
1310 arm
= brcmf_chip_get_core(pub
, BCMA_CORE_ARM_CR4
);
1312 return brcmf_chip_cr4_set_active(chip
, rstvec
);
1313 arm
= brcmf_chip_get_core(pub
, BCMA_CORE_ARM_CA7
);
1315 return brcmf_chip_ca7_set_active(chip
, rstvec
);
1316 arm
= brcmf_chip_get_core(pub
, BCMA_CORE_ARM_CM3
);
1318 return brcmf_chip_cm3_set_active(chip
);
1323 bool brcmf_chip_sr_capable(struct brcmf_chip
*pub
)
1325 u32 base
, addr
, reg
, pmu_cc3_mask
= ~0;
1326 struct brcmf_chip_priv
*chip
;
1327 struct brcmf_core
*pmu
= brcmf_chip_get_pmu(pub
);
1329 brcmf_dbg(TRACE
, "Enter\n");
1331 /* old chips with PMU version less than 17 don't support save restore */
1332 if (pub
->pmurev
< 17)
1335 base
= brcmf_chip_get_chipcommon(pub
)->base
;
1336 chip
= container_of(pub
, struct brcmf_chip_priv
, pub
);
1338 switch (pub
->chip
) {
1339 case BRCM_CC_4354_CHIP_ID
:
1340 case BRCM_CC_4356_CHIP_ID
:
1341 case BRCM_CC_4345_CHIP_ID
:
1342 /* explicitly check SR engine enable bit */
1343 pmu_cc3_mask
= BIT(2);
1345 case BRCM_CC_43241_CHIP_ID
:
1346 case BRCM_CC_4335_CHIP_ID
:
1347 case BRCM_CC_4339_CHIP_ID
:
1348 /* read PMU chipcontrol register 3 */
1349 addr
= CORE_CC_REG(pmu
->base
, chipcontrol_addr
);
1350 chip
->ops
->write32(chip
->ctx
, addr
, 3);
1351 addr
= CORE_CC_REG(pmu
->base
, chipcontrol_data
);
1352 reg
= chip
->ops
->read32(chip
->ctx
, addr
);
1353 return (reg
& pmu_cc3_mask
) != 0;
1354 case BRCM_CC_43430_CHIP_ID
:
1355 addr
= CORE_CC_REG(base
, sr_control1
);
1356 reg
= chip
->ops
->read32(chip
->ctx
, addr
);
1359 addr
= CORE_CC_REG(pmu
->base
, pmucapabilities_ext
);
1360 reg
= chip
->ops
->read32(chip
->ctx
, addr
);
1361 if ((reg
& PCAPEXT_SR_SUPPORTED_MASK
) == 0)
1364 addr
= CORE_CC_REG(pmu
->base
, retention_ctl
);
1365 reg
= chip
->ops
->read32(chip
->ctx
, addr
);
1366 return (reg
& (PMU_RCTL_MACPHY_DISABLE_MASK
|
1367 PMU_RCTL_LOGIC_DISABLE_MASK
)) == 0;