wifi: brcmfmac: chip: Handle 1024-unit sizes for TCM blocks
authorHector Martin <marcan@marcan.st>
Tue, 14 Feb 2023 09:24:15 +0000 (18:24 +0900)
committerKalle Valo <kvalo@kernel.org>
Mon, 27 Feb 2023 14:59:34 +0000 (16:59 +0200)
BCM4387 has trailing odd-sized blocks as part of TCM which have
their size described as a multiple of 1024 instead of 8192. Handle this
so we can compute the TCM size properly.

Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Hector Martin <marcan@marcan.st>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230214092423.15175-2-marcan@marcan.st
drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c

index a623905..50e0c01 100644 (file)
@@ -212,8 +212,9 @@ struct sbsocramregs {
 #define        ARMCR4_TCBANB_MASK      0xf
 #define        ARMCR4_TCBANB_SHIFT     0
 
-#define        ARMCR4_BSZ_MASK         0x3f
+#define        ARMCR4_BSZ_MASK         0x7f
 #define        ARMCR4_BSZ_MULT         8192
+#define        ARMCR4_BLK_1K_MASK      0x200
 
 struct brcmf_core_priv {
        struct brcmf_core pub;
@@ -684,6 +685,7 @@ static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4)
        u32 nbb;
        u32 totb;
        u32 bxinfo;
+       u32 blksize;
        u32 idx;
 
        corecap = brcmf_chip_core_read32(cr4, ARMCR4_CAP);
@@ -695,7 +697,11 @@ static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4)
        for (idx = 0; idx < totb; idx++) {
                brcmf_chip_core_write32(cr4, ARMCR4_BANKIDX, idx);
                bxinfo = brcmf_chip_core_read32(cr4, ARMCR4_BANKINFO);
-               memsize += ((bxinfo & ARMCR4_BSZ_MASK) + 1) * ARMCR4_BSZ_MULT;
+               blksize = ARMCR4_BSZ_MULT;
+               if (bxinfo & ARMCR4_BLK_1K_MASK)
+                       blksize >>= 3;
+
+               memsize += ((bxinfo & ARMCR4_BSZ_MASK) + 1) * blksize;
        }
 
        return memsize;