mtk_scp.c 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // Copyright (c) 2019 MediaTek Inc.
  4. #include <asm/barrier.h>
  5. #include <linux/clk.h>
  6. #include <linux/dma-mapping.h>
  7. #include <linux/err.h>
  8. #include <linux/interrupt.h>
  9. #include <linux/kernel.h>
  10. #include <linux/module.h>
  11. #include <linux/of_address.h>
  12. #include <linux/of_platform.h>
  13. #include <linux/of_reserved_mem.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/remoteproc.h>
  16. #include <linux/remoteproc/mtk_scp.h>
  17. #include <linux/rpmsg/mtk_rpmsg.h>
  18. #include <linux/string.h>
  19. #include "mtk_common.h"
  20. #include "remoteproc_internal.h"
  21. #define SECTION_NAME_IPI_BUFFER ".ipi_buffer"
  22. /**
  23. * scp_get() - get a reference to SCP.
  24. *
  25. * @pdev: the platform device of the module requesting SCP platform
  26. * device for using SCP API.
  27. *
  28. * Return: Return NULL if failed. otherwise reference to SCP.
  29. **/
  30. struct mtk_scp *scp_get(struct platform_device *pdev)
  31. {
  32. struct device *dev = &pdev->dev;
  33. struct device_node *scp_node;
  34. struct platform_device *scp_pdev;
  35. scp_node = of_parse_phandle(dev->of_node, "mediatek,scp", 0);
  36. if (!scp_node) {
  37. dev_err(dev, "can't get SCP node\n");
  38. return NULL;
  39. }
  40. scp_pdev = of_find_device_by_node(scp_node);
  41. of_node_put(scp_node);
  42. if (WARN_ON(!scp_pdev)) {
  43. dev_err(dev, "SCP pdev failed\n");
  44. return NULL;
  45. }
  46. return platform_get_drvdata(scp_pdev);
  47. }
  48. EXPORT_SYMBOL_GPL(scp_get);
  49. /**
  50. * scp_put() - "free" the SCP
  51. *
  52. * @scp: mtk_scp structure from scp_get().
  53. **/
  54. void scp_put(struct mtk_scp *scp)
  55. {
  56. put_device(scp->dev);
  57. }
  58. EXPORT_SYMBOL_GPL(scp_put);
  59. static void scp_wdt_handler(struct mtk_scp *scp, u32 scp_to_host)
  60. {
  61. struct mtk_scp_of_cluster *scp_cluster = scp->cluster;
  62. struct mtk_scp *scp_node;
  63. dev_err(scp->dev, "SCP watchdog timeout! 0x%x", scp_to_host);
  64. /* report watchdog timeout to all cores */
  65. list_for_each_entry(scp_node, &scp_cluster->mtk_scp_list, elem)
  66. rproc_report_crash(scp_node->rproc, RPROC_WATCHDOG);
  67. }
  68. static void scp_init_ipi_handler(void *data, unsigned int len, void *priv)
  69. {
  70. struct mtk_scp *scp = priv;
  71. struct scp_run *run = data;
  72. scp->run.signaled = run->signaled;
  73. strscpy(scp->run.fw_ver, run->fw_ver, SCP_FW_VER_LEN);
  74. scp->run.dec_capability = run->dec_capability;
  75. scp->run.enc_capability = run->enc_capability;
  76. wake_up_interruptible(&scp->run.wq);
  77. }
  78. static void scp_ipi_handler(struct mtk_scp *scp)
  79. {
  80. struct mtk_share_obj __iomem *rcv_obj = scp->recv_buf;
  81. struct scp_ipi_desc *ipi_desc = scp->ipi_desc;
  82. scp_ipi_handler_t handler;
  83. u32 id = readl(&rcv_obj->id);
  84. u32 len = readl(&rcv_obj->len);
  85. const struct mtk_scp_sizes_data *scp_sizes;
  86. scp_sizes = scp->data->scp_sizes;
  87. if (len > scp_sizes->ipi_share_buffer_size) {
  88. dev_err(scp->dev, "ipi message too long (len %d, max %zd)", len,
  89. scp_sizes->ipi_share_buffer_size);
  90. return;
  91. }
  92. if (id >= SCP_IPI_MAX) {
  93. dev_err(scp->dev, "No such ipi id = %d\n", id);
  94. return;
  95. }
  96. scp_ipi_lock(scp, id);
  97. handler = ipi_desc[id].handler;
  98. if (!handler) {
  99. dev_err(scp->dev, "No handler for ipi id = %d\n", id);
  100. scp_ipi_unlock(scp, id);
  101. return;
  102. }
  103. memcpy_fromio(scp->share_buf, &rcv_obj->share_buf, len);
  104. memset(&scp->share_buf[len], 0, scp_sizes->ipi_share_buffer_size - len);
  105. handler(scp->share_buf, len, ipi_desc[id].priv);
  106. scp_ipi_unlock(scp, id);
  107. scp->ipi_id_ack[id] = true;
  108. wake_up(&scp->ack_wq);
  109. }
  110. static int scp_elf_read_ipi_buf_addr(struct mtk_scp *scp,
  111. const struct firmware *fw,
  112. size_t *offset);
  113. static int scp_ipi_init(struct mtk_scp *scp, const struct firmware *fw)
  114. {
  115. int ret;
  116. size_t buf_sz, offset;
  117. size_t share_buf_offset;
  118. const struct mtk_scp_sizes_data *scp_sizes;
  119. /* read the ipi buf addr from FW itself first */
  120. ret = scp_elf_read_ipi_buf_addr(scp, fw, &offset);
  121. if (ret) {
  122. /* use default ipi buf addr if the FW doesn't have it */
  123. offset = scp->data->ipi_buf_offset;
  124. if (!offset)
  125. return ret;
  126. }
  127. dev_info(scp->dev, "IPI buf addr %#010zx\n", offset);
  128. /* Make sure IPI buffer fits in the L2TCM range assigned to this core */
  129. buf_sz = sizeof(*scp->recv_buf) + sizeof(*scp->send_buf);
  130. if (scp->sram_size < buf_sz + offset) {
  131. dev_err(scp->dev, "IPI buffer does not fit in SRAM.\n");
  132. return -EOVERFLOW;
  133. }
  134. scp_sizes = scp->data->scp_sizes;
  135. scp->recv_buf = (struct mtk_share_obj __iomem *)
  136. (scp->sram_base + offset);
  137. share_buf_offset = sizeof(scp->recv_buf->id)
  138. + sizeof(scp->recv_buf->len) + scp_sizes->ipi_share_buffer_size;
  139. scp->send_buf = (struct mtk_share_obj __iomem *)
  140. (scp->sram_base + offset + share_buf_offset);
  141. memset_io(scp->recv_buf, 0, share_buf_offset);
  142. memset_io(scp->send_buf, 0, share_buf_offset);
  143. return 0;
  144. }
  145. static void mt8183_scp_reset_assert(struct mtk_scp *scp)
  146. {
  147. u32 val;
  148. val = readl(scp->cluster->reg_base + MT8183_SW_RSTN);
  149. val &= ~MT8183_SW_RSTN_BIT;
  150. writel(val, scp->cluster->reg_base + MT8183_SW_RSTN);
  151. }
  152. static void mt8183_scp_reset_deassert(struct mtk_scp *scp)
  153. {
  154. u32 val;
  155. val = readl(scp->cluster->reg_base + MT8183_SW_RSTN);
  156. val |= MT8183_SW_RSTN_BIT;
  157. writel(val, scp->cluster->reg_base + MT8183_SW_RSTN);
  158. }
  159. static void mt8192_scp_reset_assert(struct mtk_scp *scp)
  160. {
  161. writel(1, scp->cluster->reg_base + MT8192_CORE0_SW_RSTN_SET);
  162. }
  163. static void mt8192_scp_reset_deassert(struct mtk_scp *scp)
  164. {
  165. writel(1, scp->cluster->reg_base + MT8192_CORE0_SW_RSTN_CLR);
  166. }
  167. static void mt8195_scp_c1_reset_assert(struct mtk_scp *scp)
  168. {
  169. writel(1, scp->cluster->reg_base + MT8195_CORE1_SW_RSTN_SET);
  170. }
  171. static void mt8195_scp_c1_reset_deassert(struct mtk_scp *scp)
  172. {
  173. writel(1, scp->cluster->reg_base + MT8195_CORE1_SW_RSTN_CLR);
  174. }
  175. static void mt8183_scp_irq_handler(struct mtk_scp *scp)
  176. {
  177. u32 scp_to_host;
  178. scp_to_host = readl(scp->cluster->reg_base + MT8183_SCP_TO_HOST);
  179. if (scp_to_host & MT8183_SCP_IPC_INT_BIT)
  180. scp_ipi_handler(scp);
  181. else
  182. scp_wdt_handler(scp, scp_to_host);
  183. /* SCP won't send another interrupt until we set SCP_TO_HOST to 0. */
  184. writel(MT8183_SCP_IPC_INT_BIT | MT8183_SCP_WDT_INT_BIT,
  185. scp->cluster->reg_base + MT8183_SCP_TO_HOST);
  186. }
  187. static void mt8192_scp_irq_handler(struct mtk_scp *scp)
  188. {
  189. u32 scp_to_host;
  190. scp_to_host = readl(scp->cluster->reg_base + MT8192_SCP2APMCU_IPC_SET);
  191. if (scp_to_host & MT8192_SCP_IPC_INT_BIT) {
  192. scp_ipi_handler(scp);
  193. /*
  194. * SCP won't send another interrupt until we clear
  195. * MT8192_SCP2APMCU_IPC.
  196. */
  197. writel(MT8192_SCP_IPC_INT_BIT,
  198. scp->cluster->reg_base + MT8192_SCP2APMCU_IPC_CLR);
  199. } else {
  200. scp_wdt_handler(scp, scp_to_host);
  201. writel(1, scp->cluster->reg_base + MT8192_CORE0_WDT_IRQ);
  202. }
  203. }
  204. static void mt8195_scp_irq_handler(struct mtk_scp *scp)
  205. {
  206. u32 scp_to_host;
  207. scp_to_host = readl(scp->cluster->reg_base + MT8192_SCP2APMCU_IPC_SET);
  208. if (scp_to_host & MT8192_SCP_IPC_INT_BIT) {
  209. scp_ipi_handler(scp);
  210. } else {
  211. u32 reason = readl(scp->cluster->reg_base + MT8195_SYS_STATUS);
  212. if (reason & MT8195_CORE0_WDT)
  213. writel(1, scp->cluster->reg_base + MT8192_CORE0_WDT_IRQ);
  214. if (reason & MT8195_CORE1_WDT)
  215. writel(1, scp->cluster->reg_base + MT8195_CORE1_WDT_IRQ);
  216. scp_wdt_handler(scp, reason);
  217. }
  218. writel(scp_to_host, scp->cluster->reg_base + MT8192_SCP2APMCU_IPC_CLR);
  219. }
  220. static void mt8195_scp_c1_irq_handler(struct mtk_scp *scp)
  221. {
  222. u32 scp_to_host;
  223. scp_to_host = readl(scp->cluster->reg_base + MT8195_SSHUB2APMCU_IPC_SET);
  224. if (scp_to_host & MT8192_SCP_IPC_INT_BIT)
  225. scp_ipi_handler(scp);
  226. writel(scp_to_host, scp->cluster->reg_base + MT8195_SSHUB2APMCU_IPC_CLR);
  227. }
  228. static irqreturn_t scp_irq_handler(int irq, void *priv)
  229. {
  230. struct mtk_scp *scp = priv;
  231. int ret;
  232. ret = clk_enable(scp->clk);
  233. if (ret) {
  234. dev_err(scp->dev, "failed to enable clocks\n");
  235. return IRQ_NONE;
  236. }
  237. scp->data->scp_irq_handler(scp);
  238. clk_disable(scp->clk);
  239. return IRQ_HANDLED;
  240. }
  241. static int scp_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
  242. {
  243. struct device *dev = &rproc->dev;
  244. struct elf32_hdr *ehdr;
  245. struct elf32_phdr *phdr;
  246. int i, ret = 0;
  247. const u8 *elf_data = fw->data;
  248. ehdr = (struct elf32_hdr *)elf_data;
  249. phdr = (struct elf32_phdr *)(elf_data + ehdr->e_phoff);
  250. /* go through the available ELF segments */
  251. for (i = 0; i < ehdr->e_phnum; i++, phdr++) {
  252. u32 da = phdr->p_paddr;
  253. u32 memsz = phdr->p_memsz;
  254. u32 filesz = phdr->p_filesz;
  255. u32 offset = phdr->p_offset;
  256. void __iomem *ptr;
  257. dev_dbg(dev, "phdr: type %d da 0x%x memsz 0x%x filesz 0x%x\n",
  258. phdr->p_type, da, memsz, filesz);
  259. if (phdr->p_type != PT_LOAD)
  260. continue;
  261. if (!filesz)
  262. continue;
  263. if (filesz > memsz) {
  264. dev_err(dev, "bad phdr filesz 0x%x memsz 0x%x\n",
  265. filesz, memsz);
  266. ret = -EINVAL;
  267. break;
  268. }
  269. if (offset + filesz > fw->size) {
  270. dev_err(dev, "truncated fw: need 0x%x avail 0x%zx\n",
  271. offset + filesz, fw->size);
  272. ret = -EINVAL;
  273. break;
  274. }
  275. /* grab the kernel address for this device address */
  276. ptr = (void __iomem *)rproc_da_to_va(rproc, da, memsz, NULL);
  277. if (!ptr) {
  278. dev_err(dev, "bad phdr da 0x%x mem 0x%x\n", da, memsz);
  279. ret = -EINVAL;
  280. break;
  281. }
  282. /* put the segment where the remote processor expects it */
  283. scp_memcpy_aligned(ptr, elf_data + phdr->p_offset, filesz);
  284. }
  285. return ret;
  286. }
  287. static int scp_elf_read_ipi_buf_addr(struct mtk_scp *scp,
  288. const struct firmware *fw,
  289. size_t *offset)
  290. {
  291. struct elf32_hdr *ehdr;
  292. struct elf32_shdr *shdr, *shdr_strtab;
  293. int i;
  294. const u8 *elf_data = fw->data;
  295. const char *strtab;
  296. ehdr = (struct elf32_hdr *)elf_data;
  297. shdr = (struct elf32_shdr *)(elf_data + ehdr->e_shoff);
  298. shdr_strtab = shdr + ehdr->e_shstrndx;
  299. strtab = (const char *)(elf_data + shdr_strtab->sh_offset);
  300. for (i = 0; i < ehdr->e_shnum; i++, shdr++) {
  301. if (strcmp(strtab + shdr->sh_name,
  302. SECTION_NAME_IPI_BUFFER) == 0) {
  303. *offset = shdr->sh_addr;
  304. return 0;
  305. }
  306. }
  307. return -ENOENT;
  308. }
  309. static int mt8183_scp_clk_get(struct mtk_scp *scp)
  310. {
  311. struct device *dev = scp->dev;
  312. int ret = 0;
  313. scp->clk = devm_clk_get(dev, "main");
  314. if (IS_ERR(scp->clk)) {
  315. dev_err(dev, "Failed to get clock\n");
  316. ret = PTR_ERR(scp->clk);
  317. }
  318. return ret;
  319. }
  320. static int mt8192_scp_clk_get(struct mtk_scp *scp)
  321. {
  322. return mt8183_scp_clk_get(scp);
  323. }
  324. static int mt8195_scp_clk_get(struct mtk_scp *scp)
  325. {
  326. scp->clk = NULL;
  327. return 0;
  328. }
  329. static int mt8183_scp_before_load(struct mtk_scp *scp)
  330. {
  331. /* Clear SCP to host interrupt */
  332. writel(MT8183_SCP_IPC_INT_BIT, scp->cluster->reg_base + MT8183_SCP_TO_HOST);
  333. /* Reset clocks before loading FW */
  334. writel(0x0, scp->cluster->reg_base + MT8183_SCP_CLK_SW_SEL);
  335. writel(0x0, scp->cluster->reg_base + MT8183_SCP_CLK_DIV_SEL);
  336. /* Initialize TCM before loading FW. */
  337. writel(0x0, scp->cluster->reg_base + MT8183_SCP_L1_SRAM_PD);
  338. writel(0x0, scp->cluster->reg_base + MT8183_SCP_TCM_TAIL_SRAM_PD);
  339. /* Turn on the power of SCP's SRAM before using it. */
  340. writel(0x0, scp->cluster->reg_base + MT8183_SCP_SRAM_PDN);
  341. /*
  342. * Set I-cache and D-cache size before loading SCP FW.
  343. * SCP SRAM logical address may change when cache size setting differs.
  344. */
  345. writel(MT8183_SCP_CACHE_CON_WAYEN | MT8183_SCP_CACHESIZE_8KB,
  346. scp->cluster->reg_base + MT8183_SCP_CACHE_CON);
  347. writel(MT8183_SCP_CACHESIZE_8KB, scp->cluster->reg_base + MT8183_SCP_DCACHE_CON);
  348. return 0;
  349. }
  350. static void scp_sram_power_on(void __iomem *addr, u32 reserved_mask)
  351. {
  352. int i;
  353. for (i = 31; i >= 0; i--)
  354. writel(GENMASK(i, 0) & ~reserved_mask, addr);
  355. writel(0, addr);
  356. }
  357. static void scp_sram_power_off(void __iomem *addr, u32 reserved_mask)
  358. {
  359. int i;
  360. writel(0, addr);
  361. for (i = 0; i < 32; i++)
  362. writel(GENMASK(i, 0) & ~reserved_mask, addr);
  363. }
  364. static int mt8186_scp_before_load(struct mtk_scp *scp)
  365. {
  366. /* Clear SCP to host interrupt */
  367. writel(MT8183_SCP_IPC_INT_BIT, scp->cluster->reg_base + MT8183_SCP_TO_HOST);
  368. /* Reset clocks before loading FW */
  369. writel(0x0, scp->cluster->reg_base + MT8183_SCP_CLK_SW_SEL);
  370. writel(0x0, scp->cluster->reg_base + MT8183_SCP_CLK_DIV_SEL);
  371. /* Turn on the power of SCP's SRAM before using it. Enable 1 block per time*/
  372. scp_sram_power_on(scp->cluster->reg_base + MT8183_SCP_SRAM_PDN, 0);
  373. /* Initialize TCM before loading FW. */
  374. writel(0x0, scp->cluster->reg_base + MT8183_SCP_L1_SRAM_PD);
  375. writel(0x0, scp->cluster->reg_base + MT8183_SCP_TCM_TAIL_SRAM_PD);
  376. writel(0x0, scp->cluster->reg_base + MT8186_SCP_L1_SRAM_PD_P1);
  377. writel(0x0, scp->cluster->reg_base + MT8186_SCP_L1_SRAM_PD_p2);
  378. /*
  379. * Set I-cache and D-cache size before loading SCP FW.
  380. * SCP SRAM logical address may change when cache size setting differs.
  381. */
  382. writel(MT8183_SCP_CACHE_CON_WAYEN | MT8183_SCP_CACHESIZE_8KB,
  383. scp->cluster->reg_base + MT8183_SCP_CACHE_CON);
  384. writel(MT8183_SCP_CACHESIZE_8KB, scp->cluster->reg_base + MT8183_SCP_DCACHE_CON);
  385. return 0;
  386. }
  387. static int mt8188_scp_l2tcm_on(struct mtk_scp *scp)
  388. {
  389. struct mtk_scp_of_cluster *scp_cluster = scp->cluster;
  390. mutex_lock(&scp_cluster->cluster_lock);
  391. if (scp_cluster->l2tcm_refcnt == 0) {
  392. /* clear SPM interrupt, SCP2SPM_IPC_CLR */
  393. writel(0xff, scp->cluster->reg_base + MT8192_SCP2SPM_IPC_CLR);
  394. /* Power on L2TCM */
  395. scp_sram_power_on(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_0, 0);
  396. scp_sram_power_on(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_1, 0);
  397. scp_sram_power_on(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_2, 0);
  398. scp_sram_power_on(scp->cluster->reg_base + MT8192_L1TCM_SRAM_PDN, 0);
  399. }
  400. scp_cluster->l2tcm_refcnt += 1;
  401. mutex_unlock(&scp_cluster->cluster_lock);
  402. return 0;
  403. }
  404. static int mt8188_scp_before_load(struct mtk_scp *scp)
  405. {
  406. writel(1, scp->cluster->reg_base + MT8192_CORE0_SW_RSTN_SET);
  407. mt8188_scp_l2tcm_on(scp);
  408. scp_sram_power_on(scp->cluster->reg_base + MT8192_CPU0_SRAM_PD, 0);
  409. /* enable MPU for all memory regions */
  410. writel(0xff, scp->cluster->reg_base + MT8192_CORE0_MEM_ATT_PREDEF);
  411. return 0;
  412. }
  413. static int mt8188_scp_c1_before_load(struct mtk_scp *scp)
  414. {
  415. u32 sec_ctrl;
  416. struct mtk_scp *scp_c0;
  417. struct mtk_scp_of_cluster *scp_cluster = scp->cluster;
  418. scp->data->scp_reset_assert(scp);
  419. mt8188_scp_l2tcm_on(scp);
  420. scp_sram_power_on(scp->cluster->reg_base + MT8195_CPU1_SRAM_PD, 0);
  421. /* enable MPU for all memory regions */
  422. writel(0xff, scp->cluster->reg_base + MT8195_CORE1_MEM_ATT_PREDEF);
  423. /*
  424. * The L2TCM_OFFSET_RANGE and L2TCM_OFFSET shift the destination address
  425. * on SRAM when SCP core 1 accesses SRAM.
  426. *
  427. * This configuration solves booting the SCP core 0 and core 1 from
  428. * different SRAM address because core 0 and core 1 both boot from
  429. * the head of SRAM by default. this must be configured before boot SCP core 1.
  430. *
  431. * The value of L2TCM_OFFSET_RANGE is from the viewpoint of SCP core 1.
  432. * When SCP core 1 issues address within the range (L2TCM_OFFSET_RANGE),
  433. * the address will be added with a fixed offset (L2TCM_OFFSET) on the bus.
  434. * The shift action is tranparent to software.
  435. */
  436. writel(0, scp->cluster->reg_base + MT8195_L2TCM_OFFSET_RANGE_0_LOW);
  437. writel(scp->sram_size, scp->cluster->reg_base + MT8195_L2TCM_OFFSET_RANGE_0_HIGH);
  438. scp_c0 = list_first_entry(&scp_cluster->mtk_scp_list, struct mtk_scp, elem);
  439. writel(scp->sram_phys - scp_c0->sram_phys, scp->cluster->reg_base + MT8195_L2TCM_OFFSET);
  440. /* enable SRAM offset when fetching instruction and data */
  441. sec_ctrl = readl(scp->cluster->reg_base + MT8195_SEC_CTRL);
  442. sec_ctrl |= MT8195_CORE_OFFSET_ENABLE_I | MT8195_CORE_OFFSET_ENABLE_D;
  443. writel(sec_ctrl, scp->cluster->reg_base + MT8195_SEC_CTRL);
  444. return 0;
  445. }
  446. static int mt8192_scp_before_load(struct mtk_scp *scp)
  447. {
  448. /* clear SPM interrupt, SCP2SPM_IPC_CLR */
  449. writel(0xff, scp->cluster->reg_base + MT8192_SCP2SPM_IPC_CLR);
  450. writel(1, scp->cluster->reg_base + MT8192_CORE0_SW_RSTN_SET);
  451. /* enable SRAM clock */
  452. scp_sram_power_on(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_0, 0);
  453. scp_sram_power_on(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_1, 0);
  454. scp_sram_power_on(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_2, 0);
  455. scp_sram_power_on(scp->cluster->reg_base + MT8192_L1TCM_SRAM_PDN, 0);
  456. scp_sram_power_on(scp->cluster->reg_base + MT8192_CPU0_SRAM_PD, 0);
  457. /* enable MPU for all memory regions */
  458. writel(0xff, scp->cluster->reg_base + MT8192_CORE0_MEM_ATT_PREDEF);
  459. return 0;
  460. }
  461. static int mt8195_scp_l2tcm_on(struct mtk_scp *scp)
  462. {
  463. struct mtk_scp_of_cluster *scp_cluster = scp->cluster;
  464. mutex_lock(&scp_cluster->cluster_lock);
  465. if (scp_cluster->l2tcm_refcnt == 0) {
  466. /* clear SPM interrupt, SCP2SPM_IPC_CLR */
  467. writel(0xff, scp->cluster->reg_base + MT8192_SCP2SPM_IPC_CLR);
  468. /* Power on L2TCM */
  469. scp_sram_power_on(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_0, 0);
  470. scp_sram_power_on(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_1, 0);
  471. scp_sram_power_on(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_2, 0);
  472. scp_sram_power_on(scp->cluster->reg_base + MT8192_L1TCM_SRAM_PDN,
  473. MT8195_L1TCM_SRAM_PDN_RESERVED_RSI_BITS);
  474. }
  475. scp_cluster->l2tcm_refcnt += 1;
  476. mutex_unlock(&scp_cluster->cluster_lock);
  477. return 0;
  478. }
  479. static int mt8195_scp_before_load(struct mtk_scp *scp)
  480. {
  481. writel(1, scp->cluster->reg_base + MT8192_CORE0_SW_RSTN_SET);
  482. mt8195_scp_l2tcm_on(scp);
  483. scp_sram_power_on(scp->cluster->reg_base + MT8192_CPU0_SRAM_PD, 0);
  484. /* enable MPU for all memory regions */
  485. writel(0xff, scp->cluster->reg_base + MT8192_CORE0_MEM_ATT_PREDEF);
  486. return 0;
  487. }
  488. static int mt8195_scp_c1_before_load(struct mtk_scp *scp)
  489. {
  490. u32 sec_ctrl;
  491. struct mtk_scp *scp_c0;
  492. struct mtk_scp_of_cluster *scp_cluster = scp->cluster;
  493. scp->data->scp_reset_assert(scp);
  494. mt8195_scp_l2tcm_on(scp);
  495. scp_sram_power_on(scp->cluster->reg_base + MT8195_CPU1_SRAM_PD, 0);
  496. /* enable MPU for all memory regions */
  497. writel(0xff, scp->cluster->reg_base + MT8195_CORE1_MEM_ATT_PREDEF);
  498. /*
  499. * The L2TCM_OFFSET_RANGE and L2TCM_OFFSET shift the destination address
  500. * on SRAM when SCP core 1 accesses SRAM.
  501. *
  502. * This configuration solves booting the SCP core 0 and core 1 from
  503. * different SRAM address because core 0 and core 1 both boot from
  504. * the head of SRAM by default. this must be configured before boot SCP core 1.
  505. *
  506. * The value of L2TCM_OFFSET_RANGE is from the viewpoint of SCP core 1.
  507. * When SCP core 1 issues address within the range (L2TCM_OFFSET_RANGE),
  508. * the address will be added with a fixed offset (L2TCM_OFFSET) on the bus.
  509. * The shift action is tranparent to software.
  510. */
  511. writel(0, scp->cluster->reg_base + MT8195_L2TCM_OFFSET_RANGE_0_LOW);
  512. writel(scp->sram_size, scp->cluster->reg_base + MT8195_L2TCM_OFFSET_RANGE_0_HIGH);
  513. scp_c0 = list_first_entry(&scp_cluster->mtk_scp_list, struct mtk_scp, elem);
  514. writel(scp->sram_phys - scp_c0->sram_phys, scp->cluster->reg_base + MT8195_L2TCM_OFFSET);
  515. /* enable SRAM offset when fetching instruction and data */
  516. sec_ctrl = readl(scp->cluster->reg_base + MT8195_SEC_CTRL);
  517. sec_ctrl |= MT8195_CORE_OFFSET_ENABLE_I | MT8195_CORE_OFFSET_ENABLE_D;
  518. writel(sec_ctrl, scp->cluster->reg_base + MT8195_SEC_CTRL);
  519. return 0;
  520. }
  521. static int scp_load(struct rproc *rproc, const struct firmware *fw)
  522. {
  523. struct mtk_scp *scp = rproc->priv;
  524. struct device *dev = scp->dev;
  525. int ret;
  526. ret = clk_enable(scp->clk);
  527. if (ret) {
  528. dev_err(dev, "failed to enable clocks\n");
  529. return ret;
  530. }
  531. /* Hold SCP in reset while loading FW. */
  532. scp->data->scp_reset_assert(scp);
  533. ret = scp->data->scp_before_load(scp);
  534. if (ret < 0)
  535. goto leave;
  536. ret = scp_elf_load_segments(rproc, fw);
  537. leave:
  538. clk_disable(scp->clk);
  539. return ret;
  540. }
  541. static int scp_parse_fw(struct rproc *rproc, const struct firmware *fw)
  542. {
  543. struct mtk_scp *scp = rproc->priv;
  544. struct device *dev = scp->dev;
  545. int ret;
  546. ret = clk_enable(scp->clk);
  547. if (ret) {
  548. dev_err(dev, "failed to enable clocks\n");
  549. return ret;
  550. }
  551. ret = scp_ipi_init(scp, fw);
  552. clk_disable(scp->clk);
  553. return ret;
  554. }
  555. static int scp_start(struct rproc *rproc)
  556. {
  557. struct mtk_scp *scp = rproc->priv;
  558. struct device *dev = scp->dev;
  559. struct scp_run *run = &scp->run;
  560. int ret;
  561. ret = clk_enable(scp->clk);
  562. if (ret) {
  563. dev_err(dev, "failed to enable clocks\n");
  564. return ret;
  565. }
  566. run->signaled = false;
  567. scp->data->scp_reset_deassert(scp);
  568. ret = wait_event_interruptible_timeout(
  569. run->wq,
  570. run->signaled,
  571. msecs_to_jiffies(2000));
  572. if (ret == 0) {
  573. dev_err(dev, "wait SCP initialization timeout!\n");
  574. ret = -ETIME;
  575. goto stop;
  576. }
  577. if (ret == -ERESTARTSYS) {
  578. dev_err(dev, "wait SCP interrupted by a signal!\n");
  579. goto stop;
  580. }
  581. clk_disable(scp->clk);
  582. dev_info(dev, "SCP is ready. FW version %s\n", run->fw_ver);
  583. return 0;
  584. stop:
  585. scp->data->scp_reset_assert(scp);
  586. clk_disable(scp->clk);
  587. return ret;
  588. }
  589. static void *mt8183_scp_da_to_va(struct mtk_scp *scp, u64 da, size_t len)
  590. {
  591. int offset;
  592. const struct mtk_scp_sizes_data *scp_sizes;
  593. scp_sizes = scp->data->scp_sizes;
  594. if (da < scp->sram_size) {
  595. offset = da;
  596. if (offset >= 0 && (offset + len) <= scp->sram_size)
  597. return (void __force *)scp->sram_base + offset;
  598. } else if (scp_sizes->max_dram_size) {
  599. offset = da - scp->dma_addr;
  600. if (offset >= 0 && (offset + len) <= scp_sizes->max_dram_size)
  601. return scp->cpu_addr + offset;
  602. }
  603. return NULL;
  604. }
  605. static void *mt8192_scp_da_to_va(struct mtk_scp *scp, u64 da, size_t len)
  606. {
  607. int offset;
  608. const struct mtk_scp_sizes_data *scp_sizes;
  609. scp_sizes = scp->data->scp_sizes;
  610. if (da >= scp->sram_phys &&
  611. (da + len) <= scp->sram_phys + scp->sram_size) {
  612. offset = da - scp->sram_phys;
  613. return (void __force *)scp->sram_base + offset;
  614. }
  615. /* optional memory region */
  616. if (scp->cluster->l1tcm_size &&
  617. da >= scp->cluster->l1tcm_phys &&
  618. (da + len) <= scp->cluster->l1tcm_phys + scp->cluster->l1tcm_size) {
  619. offset = da - scp->cluster->l1tcm_phys;
  620. return (void __force *)scp->cluster->l1tcm_base + offset;
  621. }
  622. /* optional memory region */
  623. if (scp_sizes->max_dram_size &&
  624. da >= scp->dma_addr &&
  625. (da + len) <= scp->dma_addr + scp_sizes->max_dram_size) {
  626. offset = da - scp->dma_addr;
  627. return scp->cpu_addr + offset;
  628. }
  629. return NULL;
  630. }
  631. static void *scp_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem)
  632. {
  633. struct mtk_scp *scp = rproc->priv;
  634. return scp->data->scp_da_to_va(scp, da, len);
  635. }
  636. static void mt8183_scp_stop(struct mtk_scp *scp)
  637. {
  638. /* Disable SCP watchdog */
  639. writel(0, scp->cluster->reg_base + MT8183_WDT_CFG);
  640. }
  641. static void mt8188_scp_l2tcm_off(struct mtk_scp *scp)
  642. {
  643. struct mtk_scp_of_cluster *scp_cluster = scp->cluster;
  644. mutex_lock(&scp_cluster->cluster_lock);
  645. if (scp_cluster->l2tcm_refcnt > 0)
  646. scp_cluster->l2tcm_refcnt -= 1;
  647. if (scp_cluster->l2tcm_refcnt == 0) {
  648. /* Power off L2TCM */
  649. scp_sram_power_off(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_0, 0);
  650. scp_sram_power_off(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_1, 0);
  651. scp_sram_power_off(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_2, 0);
  652. scp_sram_power_off(scp->cluster->reg_base + MT8192_L1TCM_SRAM_PDN, 0);
  653. }
  654. mutex_unlock(&scp_cluster->cluster_lock);
  655. }
  656. static void mt8188_scp_stop(struct mtk_scp *scp)
  657. {
  658. mt8188_scp_l2tcm_off(scp);
  659. scp_sram_power_off(scp->cluster->reg_base + MT8192_CPU0_SRAM_PD, 0);
  660. /* Disable SCP watchdog */
  661. writel(0, scp->cluster->reg_base + MT8192_CORE0_WDT_CFG);
  662. }
  663. static void mt8188_scp_c1_stop(struct mtk_scp *scp)
  664. {
  665. mt8188_scp_l2tcm_off(scp);
  666. /* Power off CPU SRAM */
  667. scp_sram_power_off(scp->cluster->reg_base + MT8195_CPU1_SRAM_PD, 0);
  668. /* Disable SCP watchdog */
  669. writel(0, scp->cluster->reg_base + MT8195_CORE1_WDT_CFG);
  670. }
  671. static void mt8192_scp_stop(struct mtk_scp *scp)
  672. {
  673. /* Disable SRAM clock */
  674. scp_sram_power_off(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_0, 0);
  675. scp_sram_power_off(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_1, 0);
  676. scp_sram_power_off(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_2, 0);
  677. scp_sram_power_off(scp->cluster->reg_base + MT8192_L1TCM_SRAM_PDN, 0);
  678. scp_sram_power_off(scp->cluster->reg_base + MT8192_CPU0_SRAM_PD, 0);
  679. /* Disable SCP watchdog */
  680. writel(0, scp->cluster->reg_base + MT8192_CORE0_WDT_CFG);
  681. }
  682. static void mt8195_scp_l2tcm_off(struct mtk_scp *scp)
  683. {
  684. struct mtk_scp_of_cluster *scp_cluster = scp->cluster;
  685. mutex_lock(&scp_cluster->cluster_lock);
  686. if (scp_cluster->l2tcm_refcnt > 0)
  687. scp_cluster->l2tcm_refcnt -= 1;
  688. if (scp_cluster->l2tcm_refcnt == 0) {
  689. /* Power off L2TCM */
  690. scp_sram_power_off(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_0, 0);
  691. scp_sram_power_off(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_1, 0);
  692. scp_sram_power_off(scp->cluster->reg_base + MT8192_L2TCM_SRAM_PD_2, 0);
  693. scp_sram_power_off(scp->cluster->reg_base + MT8192_L1TCM_SRAM_PDN,
  694. MT8195_L1TCM_SRAM_PDN_RESERVED_RSI_BITS);
  695. }
  696. mutex_unlock(&scp_cluster->cluster_lock);
  697. }
  698. static void mt8195_scp_stop(struct mtk_scp *scp)
  699. {
  700. mt8195_scp_l2tcm_off(scp);
  701. scp_sram_power_off(scp->cluster->reg_base + MT8192_CPU0_SRAM_PD, 0);
  702. /* Disable SCP watchdog */
  703. writel(0, scp->cluster->reg_base + MT8192_CORE0_WDT_CFG);
  704. }
  705. static void mt8195_scp_c1_stop(struct mtk_scp *scp)
  706. {
  707. mt8195_scp_l2tcm_off(scp);
  708. /* Power off CPU SRAM */
  709. scp_sram_power_off(scp->cluster->reg_base + MT8195_CPU1_SRAM_PD, 0);
  710. /* Disable SCP watchdog */
  711. writel(0, scp->cluster->reg_base + MT8195_CORE1_WDT_CFG);
  712. }
  713. static int scp_stop(struct rproc *rproc)
  714. {
  715. struct mtk_scp *scp = rproc->priv;
  716. int ret;
  717. ret = clk_enable(scp->clk);
  718. if (ret) {
  719. dev_err(scp->dev, "failed to enable clocks\n");
  720. return ret;
  721. }
  722. scp->data->scp_reset_assert(scp);
  723. scp->data->scp_stop(scp);
  724. clk_disable(scp->clk);
  725. return 0;
  726. }
  727. static int scp_prepare(struct rproc *rproc)
  728. {
  729. struct mtk_scp *scp = rproc->priv;
  730. return clk_prepare(scp->clk);
  731. }
  732. static int scp_unprepare(struct rproc *rproc)
  733. {
  734. struct mtk_scp *scp = rproc->priv;
  735. clk_unprepare(scp->clk);
  736. return 0;
  737. }
  738. static const struct rproc_ops scp_ops = {
  739. .prepare = scp_prepare,
  740. .unprepare = scp_unprepare,
  741. .start = scp_start,
  742. .stop = scp_stop,
  743. .load = scp_load,
  744. .da_to_va = scp_da_to_va,
  745. .parse_fw = scp_parse_fw,
  746. .sanity_check = rproc_elf_sanity_check,
  747. };
  748. /**
  749. * scp_get_device() - get device struct of SCP
  750. *
  751. * @scp: mtk_scp structure
  752. **/
  753. struct device *scp_get_device(struct mtk_scp *scp)
  754. {
  755. return scp->dev;
  756. }
  757. EXPORT_SYMBOL_GPL(scp_get_device);
  758. /**
  759. * scp_get_rproc() - get rproc struct of SCP
  760. *
  761. * @scp: mtk_scp structure
  762. **/
  763. struct rproc *scp_get_rproc(struct mtk_scp *scp)
  764. {
  765. return scp->rproc;
  766. }
  767. EXPORT_SYMBOL_GPL(scp_get_rproc);
  768. /**
  769. * scp_get_vdec_hw_capa() - get video decoder hardware capability
  770. *
  771. * @scp: mtk_scp structure
  772. *
  773. * Return: video decoder hardware capability
  774. **/
  775. unsigned int scp_get_vdec_hw_capa(struct mtk_scp *scp)
  776. {
  777. return scp->run.dec_capability;
  778. }
  779. EXPORT_SYMBOL_GPL(scp_get_vdec_hw_capa);
  780. /**
  781. * scp_get_venc_hw_capa() - get video encoder hardware capability
  782. *
  783. * @scp: mtk_scp structure
  784. *
  785. * Return: video encoder hardware capability
  786. **/
  787. unsigned int scp_get_venc_hw_capa(struct mtk_scp *scp)
  788. {
  789. return scp->run.enc_capability;
  790. }
  791. EXPORT_SYMBOL_GPL(scp_get_venc_hw_capa);
  792. /**
  793. * scp_mapping_dm_addr() - Mapping SRAM/DRAM to kernel virtual address
  794. *
  795. * @scp: mtk_scp structure
  796. * @mem_addr: SCP views memory address
  797. *
  798. * Mapping the SCP's SRAM address /
  799. * DMEM (Data Extended Memory) memory address /
  800. * Working buffer memory address to
  801. * kernel virtual address.
  802. *
  803. * Return: Return ERR_PTR(-EINVAL) if mapping failed,
  804. * otherwise the mapped kernel virtual address
  805. **/
  806. void *scp_mapping_dm_addr(struct mtk_scp *scp, u32 mem_addr)
  807. {
  808. void *ptr;
  809. ptr = scp_da_to_va(scp->rproc, mem_addr, 0, NULL);
  810. if (!ptr)
  811. return ERR_PTR(-EINVAL);
  812. return ptr;
  813. }
  814. EXPORT_SYMBOL_GPL(scp_mapping_dm_addr);
  815. static int scp_map_memory_region(struct mtk_scp *scp)
  816. {
  817. int ret;
  818. const struct mtk_scp_sizes_data *scp_sizes;
  819. ret = of_reserved_mem_device_init(scp->dev);
  820. /* reserved memory is optional. */
  821. if (ret == -ENODEV) {
  822. dev_info(scp->dev, "skipping reserved memory initialization.");
  823. return 0;
  824. }
  825. if (ret) {
  826. dev_err(scp->dev, "failed to assign memory-region: %d\n", ret);
  827. return -ENOMEM;
  828. }
  829. /* Reserved SCP code size */
  830. scp_sizes = scp->data->scp_sizes;
  831. scp->cpu_addr = dma_alloc_coherent(scp->dev, scp_sizes->max_dram_size,
  832. &scp->dma_addr, GFP_KERNEL);
  833. if (!scp->cpu_addr)
  834. return -ENOMEM;
  835. return 0;
  836. }
  837. static void scp_unmap_memory_region(struct mtk_scp *scp)
  838. {
  839. const struct mtk_scp_sizes_data *scp_sizes;
  840. scp_sizes = scp->data->scp_sizes;
  841. if (scp_sizes->max_dram_size == 0)
  842. return;
  843. dma_free_coherent(scp->dev, scp_sizes->max_dram_size, scp->cpu_addr,
  844. scp->dma_addr);
  845. of_reserved_mem_device_release(scp->dev);
  846. }
  847. static int scp_register_ipi(struct platform_device *pdev, u32 id,
  848. ipi_handler_t handler, void *priv)
  849. {
  850. struct mtk_scp *scp = platform_get_drvdata(pdev);
  851. return scp_ipi_register(scp, id, handler, priv);
  852. }
  853. static void scp_unregister_ipi(struct platform_device *pdev, u32 id)
  854. {
  855. struct mtk_scp *scp = platform_get_drvdata(pdev);
  856. scp_ipi_unregister(scp, id);
  857. }
  858. static int scp_send_ipi(struct platform_device *pdev, u32 id, void *buf,
  859. unsigned int len, unsigned int wait)
  860. {
  861. struct mtk_scp *scp = platform_get_drvdata(pdev);
  862. return scp_ipi_send(scp, id, buf, len, wait);
  863. }
  864. static struct mtk_rpmsg_info mtk_scp_rpmsg_info = {
  865. .send_ipi = scp_send_ipi,
  866. .register_ipi = scp_register_ipi,
  867. .unregister_ipi = scp_unregister_ipi,
  868. .ns_ipi_id = SCP_IPI_NS_SERVICE,
  869. };
  870. static void scp_add_rpmsg_subdev(struct mtk_scp *scp)
  871. {
  872. scp->rpmsg_subdev =
  873. mtk_rpmsg_create_rproc_subdev(to_platform_device(scp->dev),
  874. &mtk_scp_rpmsg_info);
  875. if (scp->rpmsg_subdev)
  876. rproc_add_subdev(scp->rproc, scp->rpmsg_subdev);
  877. }
  878. static void scp_remove_rpmsg_subdev(struct mtk_scp *scp)
  879. {
  880. if (scp->rpmsg_subdev) {
  881. rproc_remove_subdev(scp->rproc, scp->rpmsg_subdev);
  882. mtk_rpmsg_destroy_rproc_subdev(scp->rpmsg_subdev);
  883. scp->rpmsg_subdev = NULL;
  884. }
  885. }
  886. /**
  887. * scp_get_default_fw_path() - Get default SCP firmware path
  888. * @dev: SCP Device
  889. * @core_id: SCP Core number
  890. *
  891. * This function generates a path based on the following format:
  892. * mediatek/(soc_model)/scp(_cX).img; for multi-core or
  893. * mediatek/(soc_model)/scp.img for single core SCP HW
  894. *
  895. * Return: A devm allocated string containing the full path to
  896. * a SCP firmware or an error pointer
  897. */
  898. static const char *scp_get_default_fw_path(struct device *dev, int core_id)
  899. {
  900. struct device_node *np = core_id < 0 ? dev->of_node : dev->parent->of_node;
  901. const char *compatible, *soc;
  902. char scp_fw_file[7];
  903. int ret;
  904. /* Use only the first compatible string */
  905. ret = of_property_read_string_index(np, "compatible", 0, &compatible);
  906. if (ret)
  907. return ERR_PTR(ret);
  908. /* If the compatible string's length is implausible bail out early */
  909. if (strlen(compatible) < strlen("mediatek,mtXXXX-scp"))
  910. return ERR_PTR(-EINVAL);
  911. /* If the compatible string starts with "mediatek,mt" assume that it's ok */
  912. if (!str_has_prefix(compatible, "mediatek,mt"))
  913. return ERR_PTR(-EINVAL);
  914. if (core_id >= 0)
  915. ret = snprintf(scp_fw_file, sizeof(scp_fw_file), "scp_c%d", core_id);
  916. else
  917. ret = snprintf(scp_fw_file, sizeof(scp_fw_file), "scp");
  918. if (ret >= sizeof(scp_fw_file))
  919. return ERR_PTR(-ENAMETOOLONG);
  920. /* Not using strchr here, as strlen of a const gets optimized by compiler */
  921. soc = &compatible[strlen("mediatek,")];
  922. return devm_kasprintf(dev, GFP_KERNEL, "mediatek/%.*s/%s.img",
  923. (int)strlen("mtXXXX"), soc, scp_fw_file);
  924. }
  925. static struct mtk_scp *scp_rproc_init(struct platform_device *pdev,
  926. struct mtk_scp_of_cluster *scp_cluster,
  927. const struct mtk_scp_of_data *of_data,
  928. int core_id)
  929. {
  930. struct device *dev = &pdev->dev;
  931. struct device_node *np = dev->of_node;
  932. struct mtk_scp *scp;
  933. struct rproc *rproc;
  934. struct resource *res;
  935. const char *fw_name;
  936. int ret, i;
  937. const struct mtk_scp_sizes_data *scp_sizes;
  938. ret = rproc_of_parse_firmware(dev, 0, &fw_name);
  939. if (ret) {
  940. fw_name = scp_get_default_fw_path(dev, core_id);
  941. if (IS_ERR(fw_name)) {
  942. dev_err(dev, "Cannot get firmware path: %ld\n", PTR_ERR(fw_name));
  943. return ERR_CAST(fw_name);
  944. }
  945. }
  946. rproc = devm_rproc_alloc(dev, np->name, &scp_ops, fw_name, sizeof(*scp));
  947. if (!rproc) {
  948. dev_err(dev, "unable to allocate remoteproc\n");
  949. return ERR_PTR(-ENOMEM);
  950. }
  951. scp = rproc->priv;
  952. scp->rproc = rproc;
  953. scp->dev = dev;
  954. scp->data = of_data;
  955. scp->cluster = scp_cluster;
  956. platform_set_drvdata(pdev, scp);
  957. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram");
  958. scp->sram_base = devm_ioremap_resource(dev, res);
  959. if (IS_ERR(scp->sram_base)) {
  960. dev_err(dev, "Failed to parse and map sram memory\n");
  961. return ERR_CAST(scp->sram_base);
  962. }
  963. scp->sram_size = resource_size(res);
  964. scp->sram_phys = res->start;
  965. ret = scp->data->scp_clk_get(scp);
  966. if (ret)
  967. return ERR_PTR(ret);
  968. ret = scp_map_memory_region(scp);
  969. if (ret)
  970. return ERR_PTR(ret);
  971. mutex_init(&scp->send_lock);
  972. for (i = 0; i < SCP_IPI_MAX; i++)
  973. mutex_init(&scp->ipi_desc[i].lock);
  974. /* register SCP initialization IPI */
  975. ret = scp_ipi_register(scp, SCP_IPI_INIT, scp_init_ipi_handler, scp);
  976. if (ret) {
  977. dev_err(dev, "Failed to register IPI_SCP_INIT\n");
  978. goto release_dev_mem;
  979. }
  980. scp_sizes = scp->data->scp_sizes;
  981. scp->share_buf = kzalloc(scp_sizes->ipi_share_buffer_size, GFP_KERNEL);
  982. if (!scp->share_buf) {
  983. dev_err(dev, "Failed to allocate IPI share buffer\n");
  984. ret = -ENOMEM;
  985. goto release_dev_mem;
  986. }
  987. init_waitqueue_head(&scp->run.wq);
  988. init_waitqueue_head(&scp->ack_wq);
  989. scp_add_rpmsg_subdev(scp);
  990. ret = devm_request_threaded_irq(dev, platform_get_irq(pdev, 0), NULL,
  991. scp_irq_handler, IRQF_ONESHOT,
  992. pdev->name, scp);
  993. if (ret) {
  994. dev_err(dev, "failed to request irq\n");
  995. goto remove_subdev;
  996. }
  997. return scp;
  998. remove_subdev:
  999. scp_remove_rpmsg_subdev(scp);
  1000. scp_ipi_unregister(scp, SCP_IPI_INIT);
  1001. kfree(scp->share_buf);
  1002. scp->share_buf = NULL;
  1003. release_dev_mem:
  1004. scp_unmap_memory_region(scp);
  1005. for (i = 0; i < SCP_IPI_MAX; i++)
  1006. mutex_destroy(&scp->ipi_desc[i].lock);
  1007. mutex_destroy(&scp->send_lock);
  1008. return ERR_PTR(ret);
  1009. }
  1010. static void scp_free(struct mtk_scp *scp)
  1011. {
  1012. int i;
  1013. scp_remove_rpmsg_subdev(scp);
  1014. scp_ipi_unregister(scp, SCP_IPI_INIT);
  1015. kfree(scp->share_buf);
  1016. scp->share_buf = NULL;
  1017. scp_unmap_memory_region(scp);
  1018. for (i = 0; i < SCP_IPI_MAX; i++)
  1019. mutex_destroy(&scp->ipi_desc[i].lock);
  1020. mutex_destroy(&scp->send_lock);
  1021. }
  1022. static int scp_add_single_core(struct platform_device *pdev,
  1023. struct mtk_scp_of_cluster *scp_cluster)
  1024. {
  1025. struct device *dev = &pdev->dev;
  1026. struct list_head *scp_list = &scp_cluster->mtk_scp_list;
  1027. struct mtk_scp *scp;
  1028. int ret;
  1029. scp = scp_rproc_init(pdev, scp_cluster, of_device_get_match_data(dev), -1);
  1030. if (IS_ERR(scp))
  1031. return PTR_ERR(scp);
  1032. ret = rproc_add(scp->rproc);
  1033. if (ret) {
  1034. dev_err(dev, "Failed to add rproc\n");
  1035. scp_free(scp);
  1036. return ret;
  1037. }
  1038. list_add_tail(&scp->elem, scp_list);
  1039. return 0;
  1040. }
  1041. static int scp_add_multi_core(struct platform_device *pdev,
  1042. struct mtk_scp_of_cluster *scp_cluster)
  1043. {
  1044. struct device *dev = &pdev->dev;
  1045. struct device_node *np = dev_of_node(dev);
  1046. struct platform_device *cpdev;
  1047. struct list_head *scp_list = &scp_cluster->mtk_scp_list;
  1048. const struct mtk_scp_of_data **cluster_of_data;
  1049. struct mtk_scp *scp, *temp;
  1050. int core_id = 0;
  1051. int ret;
  1052. cluster_of_data = (const struct mtk_scp_of_data **)of_device_get_match_data(dev);
  1053. for_each_available_child_of_node_scoped(np, child) {
  1054. if (!cluster_of_data[core_id]) {
  1055. ret = -EINVAL;
  1056. dev_err(dev, "Not support core %d\n", core_id);
  1057. goto init_fail;
  1058. }
  1059. cpdev = of_find_device_by_node(child);
  1060. if (!cpdev) {
  1061. ret = -ENODEV;
  1062. dev_err(dev, "Not found platform device for core %d\n", core_id);
  1063. goto init_fail;
  1064. }
  1065. scp = scp_rproc_init(cpdev, scp_cluster, cluster_of_data[core_id], core_id);
  1066. put_device(&cpdev->dev);
  1067. if (IS_ERR(scp)) {
  1068. ret = PTR_ERR(scp);
  1069. dev_err(dev, "Failed to initialize core %d rproc\n", core_id);
  1070. goto init_fail;
  1071. }
  1072. ret = rproc_add(scp->rproc);
  1073. if (ret) {
  1074. dev_err(dev, "Failed to add rproc of core %d\n", core_id);
  1075. scp_free(scp);
  1076. goto init_fail;
  1077. }
  1078. list_add_tail(&scp->elem, scp_list);
  1079. core_id++;
  1080. }
  1081. /*
  1082. * Here we are setting the platform device for @pdev to the last @scp that was
  1083. * created, which is needed because (1) scp_rproc_init() is calling
  1084. * platform_set_drvdata() on the child platform devices and (2) we need a handle to
  1085. * the cluster list in scp_remove().
  1086. */
  1087. platform_set_drvdata(pdev, scp);
  1088. return 0;
  1089. init_fail:
  1090. list_for_each_entry_safe_reverse(scp, temp, scp_list, elem) {
  1091. list_del(&scp->elem);
  1092. rproc_del(scp->rproc);
  1093. scp_free(scp);
  1094. }
  1095. return ret;
  1096. }
  1097. static bool scp_is_single_core(struct platform_device *pdev)
  1098. {
  1099. struct device *dev = &pdev->dev;
  1100. struct device_node *np = dev_of_node(dev);
  1101. struct device_node *child;
  1102. int num_cores = 0;
  1103. for_each_child_of_node(np, child)
  1104. if (of_device_is_compatible(child, "mediatek,scp-core"))
  1105. num_cores++;
  1106. return num_cores < 2;
  1107. }
  1108. static int scp_cluster_init(struct platform_device *pdev, struct mtk_scp_of_cluster *scp_cluster)
  1109. {
  1110. int ret;
  1111. if (scp_is_single_core(pdev))
  1112. ret = scp_add_single_core(pdev, scp_cluster);
  1113. else
  1114. ret = scp_add_multi_core(pdev, scp_cluster);
  1115. return ret;
  1116. }
  1117. static const struct of_device_id scp_core_match[] = {
  1118. { .compatible = "mediatek,scp-core" },
  1119. {}
  1120. };
  1121. static int scp_probe(struct platform_device *pdev)
  1122. {
  1123. struct device *dev = &pdev->dev;
  1124. struct mtk_scp_of_cluster *scp_cluster;
  1125. struct resource *res;
  1126. int ret;
  1127. scp_cluster = devm_kzalloc(dev, sizeof(*scp_cluster), GFP_KERNEL);
  1128. if (!scp_cluster)
  1129. return -ENOMEM;
  1130. scp_cluster->reg_base = devm_platform_ioremap_resource_byname(pdev, "cfg");
  1131. if (IS_ERR(scp_cluster->reg_base))
  1132. return dev_err_probe(dev, PTR_ERR(scp_cluster->reg_base),
  1133. "Failed to parse and map cfg memory\n");
  1134. /* l1tcm is an optional memory region */
  1135. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "l1tcm");
  1136. if (res) {
  1137. scp_cluster->l1tcm_base = devm_ioremap_resource(dev, res);
  1138. if (IS_ERR(scp_cluster->l1tcm_base))
  1139. return dev_err_probe(dev, PTR_ERR(scp_cluster->l1tcm_base),
  1140. "Failed to map l1tcm memory\n");
  1141. scp_cluster->l1tcm_size = resource_size(res);
  1142. scp_cluster->l1tcm_phys = res->start;
  1143. }
  1144. INIT_LIST_HEAD(&scp_cluster->mtk_scp_list);
  1145. mutex_init(&scp_cluster->cluster_lock);
  1146. ret = of_platform_populate(dev_of_node(dev), scp_core_match, NULL, dev);
  1147. if (ret)
  1148. return dev_err_probe(dev, ret, "Failed to populate platform devices\n");
  1149. ret = scp_cluster_init(pdev, scp_cluster);
  1150. if (ret) {
  1151. of_platform_depopulate(dev);
  1152. return ret;
  1153. }
  1154. return 0;
  1155. }
  1156. static void scp_remove(struct platform_device *pdev)
  1157. {
  1158. struct mtk_scp *scp = platform_get_drvdata(pdev);
  1159. struct mtk_scp_of_cluster *scp_cluster = scp->cluster;
  1160. struct mtk_scp *temp;
  1161. list_for_each_entry_safe_reverse(scp, temp, &scp_cluster->mtk_scp_list, elem) {
  1162. list_del(&scp->elem);
  1163. rproc_del(scp->rproc);
  1164. scp_free(scp);
  1165. }
  1166. of_platform_depopulate(&pdev->dev);
  1167. mutex_destroy(&scp_cluster->cluster_lock);
  1168. }
  1169. static const struct mtk_scp_sizes_data default_scp_sizes = {
  1170. .max_dram_size = 0x500000,
  1171. .ipi_share_buffer_size = 288,
  1172. };
  1173. static const struct mtk_scp_sizes_data mt8188_scp_sizes = {
  1174. .max_dram_size = 0x800000,
  1175. .ipi_share_buffer_size = 600,
  1176. };
  1177. static const struct mtk_scp_sizes_data mt8188_scp_c1_sizes = {
  1178. .max_dram_size = 0xA00000,
  1179. .ipi_share_buffer_size = 600,
  1180. };
  1181. static const struct mtk_scp_sizes_data mt8195_scp_sizes = {
  1182. .max_dram_size = 0x800000,
  1183. .ipi_share_buffer_size = 288,
  1184. };
  1185. static const struct mtk_scp_of_data mt8183_of_data = {
  1186. .scp_clk_get = mt8183_scp_clk_get,
  1187. .scp_before_load = mt8183_scp_before_load,
  1188. .scp_irq_handler = mt8183_scp_irq_handler,
  1189. .scp_reset_assert = mt8183_scp_reset_assert,
  1190. .scp_reset_deassert = mt8183_scp_reset_deassert,
  1191. .scp_stop = mt8183_scp_stop,
  1192. .scp_da_to_va = mt8183_scp_da_to_va,
  1193. .host_to_scp_reg = MT8183_HOST_TO_SCP,
  1194. .host_to_scp_int_bit = MT8183_HOST_IPC_INT_BIT,
  1195. .ipi_buf_offset = 0x7bdb0,
  1196. .scp_sizes = &default_scp_sizes,
  1197. };
  1198. static const struct mtk_scp_of_data mt8186_of_data = {
  1199. .scp_clk_get = mt8195_scp_clk_get,
  1200. .scp_before_load = mt8186_scp_before_load,
  1201. .scp_irq_handler = mt8183_scp_irq_handler,
  1202. .scp_reset_assert = mt8183_scp_reset_assert,
  1203. .scp_reset_deassert = mt8183_scp_reset_deassert,
  1204. .scp_stop = mt8183_scp_stop,
  1205. .scp_da_to_va = mt8183_scp_da_to_va,
  1206. .host_to_scp_reg = MT8183_HOST_TO_SCP,
  1207. .host_to_scp_int_bit = MT8183_HOST_IPC_INT_BIT,
  1208. .ipi_buf_offset = 0x3bdb0,
  1209. .scp_sizes = &default_scp_sizes,
  1210. };
  1211. static const struct mtk_scp_of_data mt8188_of_data = {
  1212. .scp_clk_get = mt8195_scp_clk_get,
  1213. .scp_before_load = mt8188_scp_before_load,
  1214. .scp_irq_handler = mt8195_scp_irq_handler,
  1215. .scp_reset_assert = mt8192_scp_reset_assert,
  1216. .scp_reset_deassert = mt8192_scp_reset_deassert,
  1217. .scp_stop = mt8188_scp_stop,
  1218. .scp_da_to_va = mt8192_scp_da_to_va,
  1219. .host_to_scp_reg = MT8192_GIPC_IN_SET,
  1220. .host_to_scp_int_bit = MT8192_HOST_IPC_INT_BIT,
  1221. .scp_sizes = &mt8188_scp_sizes,
  1222. };
  1223. static const struct mtk_scp_of_data mt8188_of_data_c1 = {
  1224. .scp_clk_get = mt8195_scp_clk_get,
  1225. .scp_before_load = mt8188_scp_c1_before_load,
  1226. .scp_irq_handler = mt8195_scp_c1_irq_handler,
  1227. .scp_reset_assert = mt8195_scp_c1_reset_assert,
  1228. .scp_reset_deassert = mt8195_scp_c1_reset_deassert,
  1229. .scp_stop = mt8188_scp_c1_stop,
  1230. .scp_da_to_va = mt8192_scp_da_to_va,
  1231. .host_to_scp_reg = MT8192_GIPC_IN_SET,
  1232. .host_to_scp_int_bit = MT8195_CORE1_HOST_IPC_INT_BIT,
  1233. .scp_sizes = &mt8188_scp_c1_sizes,
  1234. };
  1235. static const struct mtk_scp_of_data mt8192_of_data = {
  1236. .scp_clk_get = mt8192_scp_clk_get,
  1237. .scp_before_load = mt8192_scp_before_load,
  1238. .scp_irq_handler = mt8192_scp_irq_handler,
  1239. .scp_reset_assert = mt8192_scp_reset_assert,
  1240. .scp_reset_deassert = mt8192_scp_reset_deassert,
  1241. .scp_stop = mt8192_scp_stop,
  1242. .scp_da_to_va = mt8192_scp_da_to_va,
  1243. .host_to_scp_reg = MT8192_GIPC_IN_SET,
  1244. .host_to_scp_int_bit = MT8192_HOST_IPC_INT_BIT,
  1245. .scp_sizes = &default_scp_sizes,
  1246. };
  1247. static const struct mtk_scp_of_data mt8195_of_data = {
  1248. .scp_clk_get = mt8195_scp_clk_get,
  1249. .scp_before_load = mt8195_scp_before_load,
  1250. .scp_irq_handler = mt8195_scp_irq_handler,
  1251. .scp_reset_assert = mt8192_scp_reset_assert,
  1252. .scp_reset_deassert = mt8192_scp_reset_deassert,
  1253. .scp_stop = mt8195_scp_stop,
  1254. .scp_da_to_va = mt8192_scp_da_to_va,
  1255. .host_to_scp_reg = MT8192_GIPC_IN_SET,
  1256. .host_to_scp_int_bit = MT8192_HOST_IPC_INT_BIT,
  1257. .scp_sizes = &mt8195_scp_sizes,
  1258. };
  1259. static const struct mtk_scp_of_data mt8195_of_data_c1 = {
  1260. .scp_clk_get = mt8195_scp_clk_get,
  1261. .scp_before_load = mt8195_scp_c1_before_load,
  1262. .scp_irq_handler = mt8195_scp_c1_irq_handler,
  1263. .scp_reset_assert = mt8195_scp_c1_reset_assert,
  1264. .scp_reset_deassert = mt8195_scp_c1_reset_deassert,
  1265. .scp_stop = mt8195_scp_c1_stop,
  1266. .scp_da_to_va = mt8192_scp_da_to_va,
  1267. .host_to_scp_reg = MT8192_GIPC_IN_SET,
  1268. .host_to_scp_int_bit = MT8195_CORE1_HOST_IPC_INT_BIT,
  1269. .scp_sizes = &default_scp_sizes,
  1270. };
  1271. static const struct mtk_scp_of_data *mt8188_of_data_cores[] = {
  1272. &mt8188_of_data,
  1273. &mt8188_of_data_c1,
  1274. NULL
  1275. };
  1276. static const struct mtk_scp_of_data *mt8195_of_data_cores[] = {
  1277. &mt8195_of_data,
  1278. &mt8195_of_data_c1,
  1279. NULL
  1280. };
  1281. static const struct of_device_id mtk_scp_of_match[] = {
  1282. { .compatible = "mediatek,mt8183-scp", .data = &mt8183_of_data },
  1283. { .compatible = "mediatek,mt8186-scp", .data = &mt8186_of_data },
  1284. { .compatible = "mediatek,mt8188-scp", .data = &mt8188_of_data },
  1285. { .compatible = "mediatek,mt8188-scp-dual", .data = &mt8188_of_data_cores },
  1286. { .compatible = "mediatek,mt8192-scp", .data = &mt8192_of_data },
  1287. { .compatible = "mediatek,mt8195-scp", .data = &mt8195_of_data },
  1288. { .compatible = "mediatek,mt8195-scp-dual", .data = &mt8195_of_data_cores },
  1289. {},
  1290. };
  1291. MODULE_DEVICE_TABLE(of, mtk_scp_of_match);
  1292. static int __maybe_unused scp_suspend(struct device *dev)
  1293. {
  1294. struct mtk_scp *scp = dev_get_drvdata(dev);
  1295. struct rproc *rproc = scp->rproc;
  1296. /*
  1297. * Only unprepare if the SCP is running and holding the clock.
  1298. *
  1299. * Note: `scp_ops` doesn't implement .attach() callback, hence
  1300. * `rproc->state` can never be RPROC_ATTACHED. Otherwise, it
  1301. * should also be checked here.
  1302. */
  1303. if (rproc->state == RPROC_RUNNING)
  1304. clk_unprepare(scp->clk);
  1305. return 0;
  1306. }
  1307. static int __maybe_unused scp_resume(struct device *dev)
  1308. {
  1309. struct mtk_scp *scp = dev_get_drvdata(dev);
  1310. struct rproc *rproc = scp->rproc;
  1311. /*
  1312. * Only prepare if the SCP was running and holding the clock.
  1313. *
  1314. * Note: `scp_ops` doesn't implement .attach() callback, hence
  1315. * `rproc->state` can never be RPROC_ATTACHED. Otherwise, it
  1316. * should also be checked here.
  1317. */
  1318. if (rproc->state == RPROC_RUNNING)
  1319. return clk_prepare(scp->clk);
  1320. return 0;
  1321. }
  1322. static const struct dev_pm_ops scp_pm_ops = {
  1323. SET_SYSTEM_SLEEP_PM_OPS(scp_suspend, scp_resume)
  1324. };
  1325. static struct platform_driver mtk_scp_driver = {
  1326. .probe = scp_probe,
  1327. .remove = scp_remove,
  1328. .driver = {
  1329. .name = "mtk-scp",
  1330. .of_match_table = mtk_scp_of_match,
  1331. .pm = &scp_pm_ops,
  1332. },
  1333. };
  1334. module_platform_driver(mtk_scp_driver);
  1335. MODULE_LICENSE("GPL v2");
  1336. MODULE_DESCRIPTION("MediaTek SCP control driver");