diff mbox series

[v2,22/35] brcmfmac: chip: Handle 1024-unit sizes for TCM blocks

Message ID 20220104072658.69756-23-marcan@marcan.st
State New
Headers show
Series brcmfmac: Support Apple T2 and M1 platforms | expand

Commit Message

Hector Martin Jan. 4, 2022, 7:26 a.m. UTC
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>
Signed-off-by: Hector Martin <marcan@marcan.st>
---
 .../wireless/broadcom/brcm80211/brcmfmac/chip.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

Comments

Arend van Spriel Jan. 19, 2022, 12:36 p.m. UTC | #1
On 1/4/2022 8:26 AM, Hector Martin wrote:
> 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: Arend van Spriel <arend.vanspriel@broadcom.com>
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> Signed-off-by: Hector Martin <marcan@marcan.st>
> ---
>   .../wireless/broadcom/brcm80211/brcmfmac/chip.c | 17 ++++++++++++-----
>   1 file changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
> index 713546cebd5a..cfa93e3ef1a1 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
> @@ -212,8 +212,8 @@ struct sbsocramregs {
>   #define	ARMCR4_TCBANB_MASK	0xf
>   #define	ARMCR4_TCBANB_SHIFT	0
>   
> -#define	ARMCR4_BSZ_MASK		0x3f
> -#define	ARMCR4_BSZ_MULT		8192
> +#define	ARMCR4_BSZ_MASK		0x7f
> +#define	ARMCR4_BLK_1K_MASK	0x200
>   
>   struct brcmf_core_priv {
>   	struct brcmf_core pub;
> @@ -675,7 +675,8 @@ static u32 brcmf_chip_sysmem_ramsize(struct brcmf_core_priv *sysmem)
>   }
>   
>   /** Return the TCM-RAM size of the ARMCR4 core. */
> -static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4)
> +static u32 brcmf_chip_tcm_ramsize(struct brcmf_chip_priv *ci,
> +				  struct brcmf_core_priv *cr4)

Not sure why you add ci parameter here. It is not used below or am I 
overlooking something.

>   {
>   	u32 corecap;
>   	u32 memsize = 0;
> @@ -683,6 +684,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);
> @@ -694,7 +696,12 @@ 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;
> +		if (bxinfo & ARMCR4_BLK_1K_MASK)
> +			blksize = 1024;
> +		else
> +			blksize = 8192;
> +
> +		memsize += ((bxinfo & ARMCR4_BSZ_MASK) + 1) * blksize;
>   	}
>   
>   	return memsize;
Arend van Spriel Jan. 20, 2022, 8:49 a.m. UTC | #2
On 1/19/2022 1:36 PM, Arend van Spriel wrote:
> On 1/4/2022 8:26 AM, Hector Martin wrote:
>> 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.

So that is the deal. Wish someone over here told me about that :-p Gave 
my blessing already, but do have some remarks.

> Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
>> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
>> Signed-off-by: Hector Martin <marcan@marcan.st>
>> ---
>>   .../wireless/broadcom/brcm80211/brcmfmac/chip.c | 17 ++++++++++++-----
>>   1 file changed, 12 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c 
>> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
>> index 713546cebd5a..cfa93e3ef1a1 100644
>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
>> @@ -212,8 +212,8 @@ struct sbsocramregs {
>>   #define    ARMCR4_TCBANB_MASK    0xf
>>   #define    ARMCR4_TCBANB_SHIFT    0
>> -#define    ARMCR4_BSZ_MASK        0x3f
>> -#define    ARMCR4_BSZ_MULT        8192

Instead of deleting can we leave it here and...

>> +#define    ARMCR4_BSZ_MASK        0x7f
>> +#define    ARMCR4_BLK_1K_MASK    0x200
>>   struct brcmf_core_priv {
>>       struct brcmf_core pub;
>> @@ -675,7 +675,8 @@ static u32 brcmf_chip_sysmem_ramsize(struct 
>> brcmf_core_priv *sysmem)
>>   }
>>   /** Return the TCM-RAM size of the ARMCR4 core. */
>> -static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4)
>> +static u32 brcmf_chip_tcm_ramsize(struct brcmf_chip_priv *ci,
>> +                  struct brcmf_core_priv *cr4)
> 
> Not sure why you add ci parameter here. It is not used below or am I 
> overlooking something.
> 
>>   {
>>       u32 corecap;
>>       u32 memsize = 0;
>> @@ -683,6 +684,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);
>> @@ -694,7 +696,12 @@ 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;
>> +        if (bxinfo & ARMCR4_BLK_1K_MASK)
>> +            blksize = 1024;
>> +        else
>> +            blksize = 8192;

... do following here instead:

		blksize = 8192;
		if (bxinfo & ARMCR4_BLK_1K_MASK)
			blksize >>= 3;

[not sure if mailreader is screwing with indentation or what]

>> +
>> +        memsize += ((bxinfo & ARMCR4_BSZ_MASK) + 1) * blksize;
>>       }
>>       return memsize;
diff mbox series

Patch

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
index 713546cebd5a..cfa93e3ef1a1 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
@@ -212,8 +212,8 @@  struct sbsocramregs {
 #define	ARMCR4_TCBANB_MASK	0xf
 #define	ARMCR4_TCBANB_SHIFT	0
 
-#define	ARMCR4_BSZ_MASK		0x3f
-#define	ARMCR4_BSZ_MULT		8192
+#define	ARMCR4_BSZ_MASK		0x7f
+#define	ARMCR4_BLK_1K_MASK	0x200
 
 struct brcmf_core_priv {
 	struct brcmf_core pub;
@@ -675,7 +675,8 @@  static u32 brcmf_chip_sysmem_ramsize(struct brcmf_core_priv *sysmem)
 }
 
 /** Return the TCM-RAM size of the ARMCR4 core. */
-static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4)
+static u32 brcmf_chip_tcm_ramsize(struct brcmf_chip_priv *ci,
+				  struct brcmf_core_priv *cr4)
 {
 	u32 corecap;
 	u32 memsize = 0;
@@ -683,6 +684,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);
@@ -694,7 +696,12 @@  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;
+		if (bxinfo & ARMCR4_BLK_1K_MASK)
+			blksize = 1024;
+		else
+			blksize = 8192;
+
+		memsize += ((bxinfo & ARMCR4_BSZ_MASK) + 1) * blksize;
 	}
 
 	return memsize;
@@ -752,7 +759,7 @@  int brcmf_chip_get_raminfo(struct brcmf_chip *pub)
 	mem = brcmf_chip_get_core(&ci->pub, BCMA_CORE_ARM_CR4);
 	if (mem) {
 		mem_core = container_of(mem, struct brcmf_core_priv, pub);
-		ci->pub.ramsize = brcmf_chip_tcm_ramsize(mem_core);
+		ci->pub.ramsize = brcmf_chip_tcm_ramsize(ci, mem_core);
 		ci->pub.rambase = brcmf_chip_tcm_rambase(ci);
 		if (ci->pub.rambase == INVALID_RAMBASE) {
 			brcmf_err("RAM base not provided with ARM CR4 core\n");