343-brcmfmac-extract-ram-size-info-from-internal-memory-.patch 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. From: Arend van Spriel <[email protected]>
  2. Date: Wed, 11 Mar 2015 16:11:31 +0100
  3. Subject: [PATCH] brcmfmac: extract ram size info from internal memory
  4. registers
  5. Instead of hard-coded memory sizes it is possible to obtain that
  6. information from the internal memory registers.
  7. Reviewed-by: Hante Meuleman <[email protected]>
  8. Reviewed-by: Franky (Zhenhui) Lin <[email protected]>
  9. Reviewed-by: Pieter-Paul Giesberts <[email protected]>
  10. Signed-off-by: Arend van Spriel <[email protected]>
  11. Signed-off-by: Kalle Valo <[email protected]>
  12. ---
  13. --- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
  14. +++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
  15. @@ -100,9 +100,6 @@
  16. #define BCM4329_CORE_SOCRAM_BASE 0x18003000
  17. /* ARM Cortex M3 core, ID 0x82a */
  18. #define BCM4329_CORE_ARM_BASE 0x18002000
  19. -#define BCM4329_RAMSIZE 0x48000
  20. -/* bcm43143 */
  21. -#define BCM43143_RAMSIZE 0x70000
  22. #define CORE_SB(base, field) \
  23. (base + SBCONFIGOFF + offsetof(struct sbconfig, field))
  24. @@ -150,6 +147,78 @@ struct sbconfig {
  25. u32 sbidhigh; /* identification */
  26. };
  27. +/* bankidx and bankinfo reg defines corerev >= 8 */
  28. +#define SOCRAM_BANKINFO_RETNTRAM_MASK 0x00010000
  29. +#define SOCRAM_BANKINFO_SZMASK 0x0000007f
  30. +#define SOCRAM_BANKIDX_ROM_MASK 0x00000100
  31. +
  32. +#define SOCRAM_BANKIDX_MEMTYPE_SHIFT 8
  33. +/* socram bankinfo memtype */
  34. +#define SOCRAM_MEMTYPE_RAM 0
  35. +#define SOCRAM_MEMTYPE_R0M 1
  36. +#define SOCRAM_MEMTYPE_DEVRAM 2
  37. +
  38. +#define SOCRAM_BANKINFO_SZBASE 8192
  39. +#define SRCI_LSS_MASK 0x00f00000
  40. +#define SRCI_LSS_SHIFT 20
  41. +#define SRCI_SRNB_MASK 0xf0
  42. +#define SRCI_SRNB_SHIFT 4
  43. +#define SRCI_SRBSZ_MASK 0xf
  44. +#define SRCI_SRBSZ_SHIFT 0
  45. +#define SR_BSZ_BASE 14
  46. +
  47. +struct sbsocramregs {
  48. + u32 coreinfo;
  49. + u32 bwalloc;
  50. + u32 extracoreinfo;
  51. + u32 biststat;
  52. + u32 bankidx;
  53. + u32 standbyctrl;
  54. +
  55. + u32 errlogstatus; /* rev 6 */
  56. + u32 errlogaddr; /* rev 6 */
  57. + /* used for patching rev 3 & 5 */
  58. + u32 cambankidx;
  59. + u32 cambankstandbyctrl;
  60. + u32 cambankpatchctrl;
  61. + u32 cambankpatchtblbaseaddr;
  62. + u32 cambankcmdreg;
  63. + u32 cambankdatareg;
  64. + u32 cambankmaskreg;
  65. + u32 PAD[1];
  66. + u32 bankinfo; /* corev 8 */
  67. + u32 bankpda;
  68. + u32 PAD[14];
  69. + u32 extmemconfig;
  70. + u32 extmemparitycsr;
  71. + u32 extmemparityerrdata;
  72. + u32 extmemparityerrcnt;
  73. + u32 extmemwrctrlandsize;
  74. + u32 PAD[84];
  75. + u32 workaround;
  76. + u32 pwrctl; /* corerev >= 2 */
  77. + u32 PAD[133];
  78. + u32 sr_control; /* corerev >= 15 */
  79. + u32 sr_status; /* corerev >= 15 */
  80. + u32 sr_address; /* corerev >= 15 */
  81. + u32 sr_data; /* corerev >= 15 */
  82. +};
  83. +
  84. +#define SOCRAMREGOFFS(_f) offsetof(struct sbsocramregs, _f)
  85. +
  86. +#define ARMCR4_CAP (0x04)
  87. +#define ARMCR4_BANKIDX (0x40)
  88. +#define ARMCR4_BANKINFO (0x44)
  89. +#define ARMCR4_BANKPDA (0x4C)
  90. +
  91. +#define ARMCR4_TCBBNB_MASK 0xf0
  92. +#define ARMCR4_TCBBNB_SHIFT 4
  93. +#define ARMCR4_TCBANB_MASK 0xf
  94. +#define ARMCR4_TCBANB_SHIFT 0
  95. +
  96. +#define ARMCR4_BSZ_MASK 0x3f
  97. +#define ARMCR4_BSZ_MULT 8192
  98. +
  99. struct brcmf_core_priv {
  100. struct brcmf_core pub;
  101. u32 wrapbase;
  102. @@ -443,10 +512,6 @@ static int brcmf_chip_cores_check(struct
  103. break;
  104. case BCMA_CORE_ARM_CR4:
  105. cpu_found = true;
  106. - if (ci->pub.rambase == 0) {
  107. - brcmf_err("RAM base not provided with ARM CR4 core\n");
  108. - return -ENOMEM;
  109. - }
  110. break;
  111. default:
  112. break;
  113. @@ -462,60 +527,160 @@ static int brcmf_chip_cores_check(struct
  114. brcmf_err("RAM core not provided with ARM CM3 core\n");
  115. return -ENODEV;
  116. }
  117. - if (!ci->pub.ramsize) {
  118. - brcmf_err("RAM size is undetermined\n");
  119. - return -ENOMEM;
  120. - }
  121. return 0;
  122. }
  123. -static void brcmf_chip_get_raminfo(struct brcmf_chip_priv *ci)
  124. +static u32 brcmf_chip_core_read32(struct brcmf_core_priv *core, u16 reg)
  125. {
  126. - switch (ci->pub.chip) {
  127. - case BRCM_CC_4329_CHIP_ID:
  128. - ci->pub.ramsize = BCM4329_RAMSIZE;
  129. - break;
  130. - case BRCM_CC_43143_CHIP_ID:
  131. - ci->pub.ramsize = BCM43143_RAMSIZE;
  132. - break;
  133. - case BRCM_CC_43241_CHIP_ID:
  134. - ci->pub.ramsize = 0x90000;
  135. - break;
  136. - case BRCM_CC_4330_CHIP_ID:
  137. - ci->pub.ramsize = 0x48000;
  138. - break;
  139. + return core->chip->ops->read32(core->chip->ctx, core->pub.base + reg);
  140. +}
  141. +
  142. +static void brcmf_chip_core_write32(struct brcmf_core_priv *core,
  143. + u16 reg, u32 val)
  144. +{
  145. + core->chip->ops->write32(core->chip->ctx, core->pub.base + reg, val);
  146. +}
  147. +
  148. +static bool brcmf_chip_socram_banksize(struct brcmf_core_priv *core, u8 idx,
  149. + u32 *banksize)
  150. +{
  151. + u32 bankinfo;
  152. + u32 bankidx = (SOCRAM_MEMTYPE_RAM << SOCRAM_BANKIDX_MEMTYPE_SHIFT);
  153. +
  154. + bankidx |= idx;
  155. + brcmf_chip_core_write32(core, SOCRAMREGOFFS(bankidx), bankidx);
  156. + bankinfo = brcmf_chip_core_read32(core, SOCRAMREGOFFS(bankinfo));
  157. + *banksize = (bankinfo & SOCRAM_BANKINFO_SZMASK) + 1;
  158. + *banksize *= SOCRAM_BANKINFO_SZBASE;
  159. + return !!(bankinfo & SOCRAM_BANKINFO_RETNTRAM_MASK);
  160. +}
  161. +
  162. +static void brcmf_chip_socram_ramsize(struct brcmf_core_priv *sr, u32 *ramsize,
  163. + u32 *srsize)
  164. +{
  165. + u32 coreinfo;
  166. + uint nb, banksize, lss;
  167. + bool retent;
  168. + int i;
  169. +
  170. + *ramsize = 0;
  171. + *srsize = 0;
  172. +
  173. + if (WARN_ON(sr->pub.rev < 4))
  174. + return;
  175. +
  176. + if (!brcmf_chip_iscoreup(&sr->pub))
  177. + brcmf_chip_resetcore(&sr->pub, 0, 0, 0);
  178. +
  179. + /* Get info for determining size */
  180. + coreinfo = brcmf_chip_core_read32(sr, SOCRAMREGOFFS(coreinfo));
  181. + nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT;
  182. +
  183. + if ((sr->pub.rev <= 7) || (sr->pub.rev == 12)) {
  184. + banksize = (coreinfo & SRCI_SRBSZ_MASK);
  185. + lss = (coreinfo & SRCI_LSS_MASK) >> SRCI_LSS_SHIFT;
  186. + if (lss != 0)
  187. + nb--;
  188. + *ramsize = nb * (1 << (banksize + SR_BSZ_BASE));
  189. + if (lss != 0)
  190. + *ramsize += (1 << ((lss - 1) + SR_BSZ_BASE));
  191. + } else {
  192. + nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT;
  193. + for (i = 0; i < nb; i++) {
  194. + retent = brcmf_chip_socram_banksize(sr, i, &banksize);
  195. + *ramsize += banksize;
  196. + if (retent)
  197. + *srsize += banksize;
  198. + }
  199. + }
  200. +
  201. + /* hardcoded save&restore memory sizes */
  202. + switch (sr->chip->pub.chip) {
  203. case BRCM_CC_4334_CHIP_ID:
  204. - case BRCM_CC_43340_CHIP_ID:
  205. - ci->pub.ramsize = 0x80000;
  206. + if (sr->chip->pub.chiprev < 2)
  207. + *srsize = (32 * 1024);
  208. break;
  209. - case BRCM_CC_4335_CHIP_ID:
  210. - ci->pub.ramsize = 0xc0000;
  211. - ci->pub.rambase = 0x180000;
  212. - break;
  213. - case BRCM_CC_43362_CHIP_ID:
  214. - ci->pub.ramsize = 0x3c000;
  215. + default:
  216. break;
  217. + }
  218. +}
  219. +
  220. +/** Return the TCM-RAM size of the ARMCR4 core. */
  221. +static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4)
  222. +{
  223. + u32 corecap;
  224. + u32 memsize = 0;
  225. + u32 nab;
  226. + u32 nbb;
  227. + u32 totb;
  228. + u32 bxinfo;
  229. + u32 idx;
  230. +
  231. + corecap = brcmf_chip_core_read32(cr4, ARMCR4_CAP);
  232. +
  233. + nab = (corecap & ARMCR4_TCBANB_MASK) >> ARMCR4_TCBANB_SHIFT;
  234. + nbb = (corecap & ARMCR4_TCBBNB_MASK) >> ARMCR4_TCBBNB_SHIFT;
  235. + totb = nab + nbb;
  236. +
  237. + for (idx = 0; idx < totb; idx++) {
  238. + brcmf_chip_core_write32(cr4, ARMCR4_BANKIDX, idx);
  239. + bxinfo = brcmf_chip_core_read32(cr4, ARMCR4_BANKINFO);
  240. + memsize += ((bxinfo & ARMCR4_BSZ_MASK) + 1) * ARMCR4_BSZ_MULT;
  241. + }
  242. +
  243. + return memsize;
  244. +}
  245. +
  246. +static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
  247. +{
  248. + switch (ci->pub.chip) {
  249. case BRCM_CC_4345_CHIP_ID:
  250. - ci->pub.ramsize = 0xc8000;
  251. - ci->pub.rambase = 0x198000;
  252. - break;
  253. + return 0x198000;
  254. + case BRCM_CC_4335_CHIP_ID:
  255. case BRCM_CC_4339_CHIP_ID:
  256. case BRCM_CC_4354_CHIP_ID:
  257. case BRCM_CC_4356_CHIP_ID:
  258. case BRCM_CC_43567_CHIP_ID:
  259. case BRCM_CC_43569_CHIP_ID:
  260. case BRCM_CC_43570_CHIP_ID:
  261. - ci->pub.ramsize = 0xc0000;
  262. - ci->pub.rambase = 0x180000;
  263. - break;
  264. case BRCM_CC_43602_CHIP_ID:
  265. - ci->pub.ramsize = 0xf0000;
  266. - ci->pub.rambase = 0x180000;
  267. - break;
  268. + return 0x180000;
  269. default:
  270. brcmf_err("unknown chip: %s\n", ci->pub.name);
  271. break;
  272. }
  273. + return 0;
  274. +}
  275. +
  276. +static int brcmf_chip_get_raminfo(struct brcmf_chip_priv *ci)
  277. +{
  278. + struct brcmf_core_priv *mem_core;
  279. + struct brcmf_core *mem;
  280. +
  281. + mem = brcmf_chip_get_core(&ci->pub, BCMA_CORE_ARM_CR4);
  282. + if (mem) {
  283. + mem_core = container_of(mem, struct brcmf_core_priv, pub);
  284. + ci->pub.ramsize = brcmf_chip_tcm_ramsize(mem_core);
  285. + ci->pub.rambase = brcmf_chip_tcm_rambase(ci);
  286. + if (!ci->pub.rambase) {
  287. + brcmf_err("RAM base not provided with ARM CR4 core\n");
  288. + return -EINVAL;
  289. + }
  290. + } else {
  291. + mem = brcmf_chip_get_core(&ci->pub, BCMA_CORE_INTERNAL_MEM);
  292. + mem_core = container_of(mem, struct brcmf_core_priv, pub);
  293. + brcmf_chip_socram_ramsize(mem_core, &ci->pub.ramsize,
  294. + &ci->pub.srsize);
  295. + }
  296. + brcmf_dbg(INFO, "RAM: base=0x%x size=%d (0x%x) sr=%d (0x%x)\n",
  297. + ci->pub.rambase, ci->pub.ramsize, ci->pub.ramsize,
  298. + ci->pub.srsize, ci->pub.srsize);
  299. +
  300. + if (!ci->pub.ramsize) {
  301. + brcmf_err("RAM size is undetermined\n");
  302. + return -ENOMEM;
  303. + }
  304. + return 0;
  305. }
  306. static u32 brcmf_chip_dmp_get_desc(struct brcmf_chip_priv *ci, u32 *eromaddr,
  307. @@ -668,6 +833,7 @@ static int brcmf_chip_recognition(struct
  308. struct brcmf_core *core;
  309. u32 regdata;
  310. u32 socitype;
  311. + int ret;
  312. /* Get CC core rev
  313. * Chipid is assume to be at offset 0 from SI_ENUM_BASE
  314. @@ -720,9 +886,13 @@ static int brcmf_chip_recognition(struct
  315. return -ENODEV;
  316. }
  317. - brcmf_chip_get_raminfo(ci);
  318. -
  319. - return brcmf_chip_cores_check(ci);
  320. + ret = brcmf_chip_cores_check(ci);
  321. + if (ret)
  322. + return ret;
  323. +
  324. + /* assure chip is passive for core access */
  325. + brcmf_chip_set_passive(&ci->pub);
  326. + return brcmf_chip_get_raminfo(ci);
  327. }
  328. static void brcmf_chip_disable_arm(struct brcmf_chip_priv *chip, u16 id)
  329. @@ -827,8 +997,6 @@ struct brcmf_chip *brcmf_chip_attach(voi
  330. if (err < 0)
  331. goto fail;
  332. - /* assure chip is passive for download */
  333. - brcmf_chip_set_passive(&chip->pub);
  334. return &chip->pub;
  335. fail:
  336. --- a/drivers/net/wireless/brcm80211/brcmfmac/chip.h
  337. +++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.h
  338. @@ -30,7 +30,8 @@
  339. * @pmucaps: PMU capabilities.
  340. * @pmurev: PMU revision.
  341. * @rambase: RAM base address (only applicable for ARM CR4 chips).
  342. - * @ramsize: amount of RAM on chip.
  343. + * @ramsize: amount of RAM on chip including retention.
  344. + * @srsize: amount of retention RAM on chip.
  345. * @name: string representation of the chip identifier.
  346. */
  347. struct brcmf_chip {
  348. @@ -41,6 +42,7 @@ struct brcmf_chip {
  349. u32 pmurev;
  350. u32 rambase;
  351. u32 ramsize;
  352. + u32 srsize;
  353. char name[8];
  354. };