mtk_vpu.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947
  1. /*
  2. * Copyright (c) 2016 MediaTek Inc.
  3. * Author: Andrew-CT Chen <andrew-ct.chen@mediatek.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. */
  14. #include <linux/clk.h>
  15. #include <linux/debugfs.h>
  16. #include <linux/firmware.h>
  17. #include <linux/interrupt.h>
  18. #include <linux/iommu.h>
  19. #include <linux/module.h>
  20. #include <linux/of_address.h>
  21. #include <linux/of_irq.h>
  22. #include <linux/of_platform.h>
  23. #include <linux/of_reserved_mem.h>
  24. #include <linux/sched.h>
  25. #include <linux/sizes.h>
  26. #include "mtk_vpu.h"
  27. /**
  28. * VPU (video processor unit) is a tiny processor controlling video hardware
  29. * related to video codec, scaling and color format converting.
  30. * VPU interfaces with other blocks by share memory and interrupt.
  31. **/
  32. #define INIT_TIMEOUT_MS 2000U
  33. #define IPI_TIMEOUT_MS 2000U
  34. #define VPU_FW_VER_LEN 16
  35. /* maximum program/data TCM (Tightly-Coupled Memory) size */
  36. #define VPU_PTCM_SIZE (96 * SZ_1K)
  37. #define VPU_DTCM_SIZE (32 * SZ_1K)
  38. /* the offset to get data tcm address */
  39. #define VPU_DTCM_OFFSET 0x18000UL
  40. /* daynamic allocated maximum extended memory size */
  41. #define VPU_EXT_P_SIZE SZ_1M
  42. #define VPU_EXT_D_SIZE SZ_4M
  43. /* maximum binary firmware size */
  44. #define VPU_P_FW_SIZE (VPU_PTCM_SIZE + VPU_EXT_P_SIZE)
  45. #define VPU_D_FW_SIZE (VPU_DTCM_SIZE + VPU_EXT_D_SIZE)
  46. /* the size of share buffer between Host and VPU */
  47. #define SHARE_BUF_SIZE 48
  48. /* binary firmware name */
  49. #define VPU_P_FW "/*(DEBLOBBED)*/"
  50. #define VPU_D_FW "/*(DEBLOBBED)*/"
  51. #define VPU_RESET 0x0
  52. #define VPU_TCM_CFG 0x0008
  53. #define VPU_PMEM_EXT0_ADDR 0x000C
  54. #define VPU_PMEM_EXT1_ADDR 0x0010
  55. #define VPU_TO_HOST 0x001C
  56. #define VPU_DMEM_EXT0_ADDR 0x0014
  57. #define VPU_DMEM_EXT1_ADDR 0x0018
  58. #define HOST_TO_VPU 0x0024
  59. #define VPU_PC_REG 0x0060
  60. #define VPU_WDT_REG 0x0084
  61. /* vpu inter-processor communication interrupt */
  62. #define VPU_IPC_INT BIT(8)
  63. /**
  64. * enum vpu_fw_type - VPU firmware type
  65. *
  66. * @P_FW: program firmware
  67. * @D_FW: data firmware
  68. *
  69. */
  70. enum vpu_fw_type {
  71. P_FW,
  72. D_FW,
  73. };
  74. /**
  75. * struct vpu_mem - VPU extended program/data memory information
  76. *
  77. * @va: the kernel virtual memory address of VPU extended memory
  78. * @pa: the physical memory address of VPU extended memory
  79. *
  80. */
  81. struct vpu_mem {
  82. void *va;
  83. dma_addr_t pa;
  84. };
  85. /**
  86. * struct vpu_regs - VPU TCM and configuration registers
  87. *
  88. * @tcm: the register for VPU Tightly-Coupled Memory
  89. * @cfg: the register for VPU configuration
  90. * @irq: the irq number for VPU interrupt
  91. */
  92. struct vpu_regs {
  93. void __iomem *tcm;
  94. void __iomem *cfg;
  95. int irq;
  96. };
  97. /**
  98. * struct vpu_wdt_handler - VPU watchdog reset handler
  99. *
  100. * @reset_func: reset handler
  101. * @priv: private data
  102. */
  103. struct vpu_wdt_handler {
  104. void (*reset_func)(void *);
  105. void *priv;
  106. };
  107. /**
  108. * struct vpu_wdt - VPU watchdog workqueue
  109. *
  110. * @handler: VPU watchdog reset handler
  111. * @ws: workstruct for VPU watchdog
  112. * @wq: workqueue for VPU watchdog
  113. */
  114. struct vpu_wdt {
  115. struct vpu_wdt_handler handler[VPU_RST_MAX];
  116. struct work_struct ws;
  117. struct workqueue_struct *wq;
  118. };
  119. /**
  120. * struct vpu_run - VPU initialization status
  121. *
  122. * @signaled: the signal of vpu initialization completed
  123. * @fw_ver: VPU firmware version
  124. * @enc_capability: encoder capability which is not used for now and
  125. * the value is reserved for future use
  126. * @wq: wait queue for VPU initialization status
  127. */
  128. struct vpu_run {
  129. u32 signaled;
  130. char fw_ver[VPU_FW_VER_LEN];
  131. unsigned int enc_capability;
  132. wait_queue_head_t wq;
  133. };
  134. /**
  135. * struct vpu_ipi_desc - VPU IPI descriptor
  136. *
  137. * @handler: IPI handler
  138. * @name: the name of IPI handler
  139. * @priv: the private data of IPI handler
  140. */
  141. struct vpu_ipi_desc {
  142. ipi_handler_t handler;
  143. const char *name;
  144. void *priv;
  145. };
  146. /**
  147. * struct share_obj - DTCM (Data Tightly-Coupled Memory) buffer shared with
  148. * AP and VPU
  149. *
  150. * @id: IPI id
  151. * @len: share buffer length
  152. * @share_buf: share buffer data
  153. */
  154. struct share_obj {
  155. s32 id;
  156. u32 len;
  157. unsigned char share_buf[SHARE_BUF_SIZE];
  158. };
  159. /**
  160. * struct mtk_vpu - vpu driver data
  161. * @extmem: VPU extended memory information
  162. * @reg: VPU TCM and configuration registers
  163. * @run: VPU initialization status
  164. * @ipi_desc: VPU IPI descriptor
  165. * @recv_buf: VPU DTCM share buffer for receiving. The
  166. * receive buffer is only accessed in interrupt context.
  167. * @send_buf: VPU DTCM share buffer for sending
  168. * @dev: VPU struct device
  169. * @clk: VPU clock on/off
  170. * @fw_loaded: indicate VPU firmware loaded
  171. * @enable_4GB: VPU 4GB mode on/off
  172. * @vpu_mutex: protect mtk_vpu (except recv_buf) and ensure only
  173. * one client to use VPU service at a time. For example,
  174. * suppose a client is using VPU to decode VP8.
  175. * If the other client wants to encode VP8,
  176. * it has to wait until VP8 decode completes.
  177. * @wdt_refcnt WDT reference count to make sure the watchdog can be
  178. * disabled if no other client is using VPU service
  179. * @ack_wq: The wait queue for each codec and mdp. When sleeping
  180. * processes wake up, they will check the condition
  181. * "ipi_id_ack" to run the corresponding action or
  182. * go back to sleep.
  183. * @ipi_id_ack: The ACKs for registered IPI function sending
  184. * interrupt to VPU
  185. *
  186. */
  187. struct mtk_vpu {
  188. struct vpu_mem extmem[2];
  189. struct vpu_regs reg;
  190. struct vpu_run run;
  191. struct vpu_wdt wdt;
  192. struct vpu_ipi_desc ipi_desc[IPI_MAX];
  193. struct share_obj *recv_buf;
  194. struct share_obj *send_buf;
  195. struct device *dev;
  196. struct clk *clk;
  197. bool fw_loaded;
  198. bool enable_4GB;
  199. struct mutex vpu_mutex; /* for protecting vpu data data structure */
  200. u32 wdt_refcnt;
  201. wait_queue_head_t ack_wq;
  202. bool ipi_id_ack[IPI_MAX];
  203. };
  204. static inline void vpu_cfg_writel(struct mtk_vpu *vpu, u32 val, u32 offset)
  205. {
  206. writel(val, vpu->reg.cfg + offset);
  207. }
  208. static inline u32 vpu_cfg_readl(struct mtk_vpu *vpu, u32 offset)
  209. {
  210. return readl(vpu->reg.cfg + offset);
  211. }
  212. static inline bool vpu_running(struct mtk_vpu *vpu)
  213. {
  214. return vpu_cfg_readl(vpu, VPU_RESET) & BIT(0);
  215. }
  216. static void vpu_clock_disable(struct mtk_vpu *vpu)
  217. {
  218. /* Disable VPU watchdog */
  219. mutex_lock(&vpu->vpu_mutex);
  220. if (!--vpu->wdt_refcnt)
  221. vpu_cfg_writel(vpu,
  222. vpu_cfg_readl(vpu, VPU_WDT_REG) & ~(1L << 31),
  223. VPU_WDT_REG);
  224. mutex_unlock(&vpu->vpu_mutex);
  225. clk_disable(vpu->clk);
  226. }
  227. static int vpu_clock_enable(struct mtk_vpu *vpu)
  228. {
  229. int ret;
  230. ret = clk_enable(vpu->clk);
  231. if (ret)
  232. return ret;
  233. /* Enable VPU watchdog */
  234. mutex_lock(&vpu->vpu_mutex);
  235. if (!vpu->wdt_refcnt++)
  236. vpu_cfg_writel(vpu,
  237. vpu_cfg_readl(vpu, VPU_WDT_REG) | (1L << 31),
  238. VPU_WDT_REG);
  239. mutex_unlock(&vpu->vpu_mutex);
  240. return ret;
  241. }
  242. int vpu_ipi_register(struct platform_device *pdev,
  243. enum ipi_id id, ipi_handler_t handler,
  244. const char *name, void *priv)
  245. {
  246. struct mtk_vpu *vpu = platform_get_drvdata(pdev);
  247. struct vpu_ipi_desc *ipi_desc;
  248. if (!vpu) {
  249. dev_err(&pdev->dev, "vpu device in not ready\n");
  250. return -EPROBE_DEFER;
  251. }
  252. if (id >= 0 && id < IPI_MAX && handler) {
  253. ipi_desc = vpu->ipi_desc;
  254. ipi_desc[id].name = name;
  255. ipi_desc[id].handler = handler;
  256. ipi_desc[id].priv = priv;
  257. return 0;
  258. }
  259. dev_err(&pdev->dev, "register vpu ipi id %d with invalid arguments\n",
  260. id);
  261. return -EINVAL;
  262. }
  263. EXPORT_SYMBOL_GPL(vpu_ipi_register);
  264. int vpu_ipi_send(struct platform_device *pdev,
  265. enum ipi_id id, void *buf,
  266. unsigned int len)
  267. {
  268. struct mtk_vpu *vpu = platform_get_drvdata(pdev);
  269. struct share_obj *send_obj = vpu->send_buf;
  270. unsigned long timeout;
  271. int ret = 0;
  272. if (id <= IPI_VPU_INIT || id >= IPI_MAX ||
  273. len > sizeof(send_obj->share_buf) || !buf) {
  274. dev_err(vpu->dev, "failed to send ipi message\n");
  275. return -EINVAL;
  276. }
  277. ret = vpu_clock_enable(vpu);
  278. if (ret) {
  279. dev_err(vpu->dev, "failed to enable vpu clock\n");
  280. return ret;
  281. }
  282. if (!vpu_running(vpu)) {
  283. dev_err(vpu->dev, "vpu_ipi_send: VPU is not running\n");
  284. ret = -EINVAL;
  285. goto clock_disable;
  286. }
  287. mutex_lock(&vpu->vpu_mutex);
  288. /* Wait until VPU receives the last command */
  289. timeout = jiffies + msecs_to_jiffies(IPI_TIMEOUT_MS);
  290. do {
  291. if (time_after(jiffies, timeout)) {
  292. dev_err(vpu->dev, "vpu_ipi_send: IPI timeout!\n");
  293. ret = -EIO;
  294. goto mut_unlock;
  295. }
  296. } while (vpu_cfg_readl(vpu, HOST_TO_VPU));
  297. memcpy((void *)send_obj->share_buf, buf, len);
  298. send_obj->len = len;
  299. send_obj->id = id;
  300. vpu->ipi_id_ack[id] = false;
  301. /* send the command to VPU */
  302. vpu_cfg_writel(vpu, 0x1, HOST_TO_VPU);
  303. mutex_unlock(&vpu->vpu_mutex);
  304. /* wait for VPU's ACK */
  305. timeout = msecs_to_jiffies(IPI_TIMEOUT_MS);
  306. ret = wait_event_timeout(vpu->ack_wq, vpu->ipi_id_ack[id], timeout);
  307. vpu->ipi_id_ack[id] = false;
  308. if (ret == 0) {
  309. dev_err(vpu->dev, "vpu ipi %d ack time out !", id);
  310. ret = -EIO;
  311. goto clock_disable;
  312. }
  313. vpu_clock_disable(vpu);
  314. return 0;
  315. mut_unlock:
  316. mutex_unlock(&vpu->vpu_mutex);
  317. clock_disable:
  318. vpu_clock_disable(vpu);
  319. return ret;
  320. }
  321. EXPORT_SYMBOL_GPL(vpu_ipi_send);
  322. static void vpu_wdt_reset_func(struct work_struct *ws)
  323. {
  324. struct vpu_wdt *wdt = container_of(ws, struct vpu_wdt, ws);
  325. struct mtk_vpu *vpu = container_of(wdt, struct mtk_vpu, wdt);
  326. struct vpu_wdt_handler *handler = wdt->handler;
  327. int index, ret;
  328. dev_info(vpu->dev, "vpu reset\n");
  329. ret = vpu_clock_enable(vpu);
  330. if (ret) {
  331. dev_err(vpu->dev, "[VPU] wdt enables clock failed %d\n", ret);
  332. return;
  333. }
  334. mutex_lock(&vpu->vpu_mutex);
  335. vpu_cfg_writel(vpu, 0x0, VPU_RESET);
  336. vpu->fw_loaded = false;
  337. mutex_unlock(&vpu->vpu_mutex);
  338. vpu_clock_disable(vpu);
  339. for (index = 0; index < VPU_RST_MAX; index++) {
  340. if (handler[index].reset_func) {
  341. handler[index].reset_func(handler[index].priv);
  342. dev_dbg(vpu->dev, "wdt handler func %d\n", index);
  343. }
  344. }
  345. }
  346. int vpu_wdt_reg_handler(struct platform_device *pdev,
  347. void wdt_reset(void *),
  348. void *priv, enum rst_id id)
  349. {
  350. struct mtk_vpu *vpu = platform_get_drvdata(pdev);
  351. struct vpu_wdt_handler *handler;
  352. if (!vpu) {
  353. dev_err(&pdev->dev, "vpu device in not ready\n");
  354. return -EPROBE_DEFER;
  355. }
  356. handler = vpu->wdt.handler;
  357. if (id >= 0 && id < VPU_RST_MAX && wdt_reset) {
  358. dev_dbg(vpu->dev, "wdt register id %d\n", id);
  359. mutex_lock(&vpu->vpu_mutex);
  360. handler[id].reset_func = wdt_reset;
  361. handler[id].priv = priv;
  362. mutex_unlock(&vpu->vpu_mutex);
  363. return 0;
  364. }
  365. dev_err(vpu->dev, "register vpu wdt handler failed\n");
  366. return -EINVAL;
  367. }
  368. EXPORT_SYMBOL_GPL(vpu_wdt_reg_handler);
  369. unsigned int vpu_get_venc_hw_capa(struct platform_device *pdev)
  370. {
  371. struct mtk_vpu *vpu = platform_get_drvdata(pdev);
  372. return vpu->run.enc_capability;
  373. }
  374. EXPORT_SYMBOL_GPL(vpu_get_venc_hw_capa);
  375. void *vpu_mapping_dm_addr(struct platform_device *pdev,
  376. u32 dtcm_dmem_addr)
  377. {
  378. struct mtk_vpu *vpu = platform_get_drvdata(pdev);
  379. if (!dtcm_dmem_addr ||
  380. (dtcm_dmem_addr > (VPU_DTCM_SIZE + VPU_EXT_D_SIZE))) {
  381. dev_err(vpu->dev, "invalid virtual data memory address\n");
  382. return ERR_PTR(-EINVAL);
  383. }
  384. if (dtcm_dmem_addr < VPU_DTCM_SIZE)
  385. return (__force void *)(dtcm_dmem_addr + vpu->reg.tcm +
  386. VPU_DTCM_OFFSET);
  387. return vpu->extmem[D_FW].va + (dtcm_dmem_addr - VPU_DTCM_SIZE);
  388. }
  389. EXPORT_SYMBOL_GPL(vpu_mapping_dm_addr);
  390. struct platform_device *vpu_get_plat_device(struct platform_device *pdev)
  391. {
  392. struct device *dev = &pdev->dev;
  393. struct device_node *vpu_node;
  394. struct platform_device *vpu_pdev;
  395. vpu_node = of_parse_phandle(dev->of_node, "mediatek,vpu", 0);
  396. if (!vpu_node) {
  397. dev_err(dev, "can't get vpu node\n");
  398. return NULL;
  399. }
  400. vpu_pdev = of_find_device_by_node(vpu_node);
  401. if (WARN_ON(!vpu_pdev)) {
  402. dev_err(dev, "vpu pdev failed\n");
  403. of_node_put(vpu_node);
  404. return NULL;
  405. }
  406. return vpu_pdev;
  407. }
  408. EXPORT_SYMBOL_GPL(vpu_get_plat_device);
  409. /* load vpu program/data memory */
  410. static int load_requested_vpu(struct mtk_vpu *vpu,
  411. const struct firmware *vpu_fw,
  412. u8 fw_type)
  413. {
  414. size_t tcm_size = fw_type ? VPU_DTCM_SIZE : VPU_PTCM_SIZE;
  415. size_t fw_size = fw_type ? VPU_D_FW_SIZE : VPU_P_FW_SIZE;
  416. char *fw_name = fw_type ? VPU_D_FW : VPU_P_FW;
  417. size_t dl_size = 0;
  418. size_t extra_fw_size = 0;
  419. void *dest;
  420. int ret;
  421. ret = reject_firmware(&vpu_fw, fw_name, vpu->dev);
  422. if (ret < 0) {
  423. dev_err(vpu->dev, "Failed to load %s, %d\n", fw_name, ret);
  424. return ret;
  425. }
  426. dl_size = vpu_fw->size;
  427. if (dl_size > fw_size) {
  428. dev_err(vpu->dev, "fw %s size %zu is abnormal\n", fw_name,
  429. dl_size);
  430. release_firmware(vpu_fw);
  431. return -EFBIG;
  432. }
  433. dev_dbg(vpu->dev, "Downloaded fw %s size: %zu.\n",
  434. fw_name,
  435. dl_size);
  436. /* reset VPU */
  437. vpu_cfg_writel(vpu, 0x0, VPU_RESET);
  438. /* handle extended firmware size */
  439. if (dl_size > tcm_size) {
  440. dev_dbg(vpu->dev, "fw size %zu > limited fw size %zu\n",
  441. dl_size, tcm_size);
  442. extra_fw_size = dl_size - tcm_size;
  443. dev_dbg(vpu->dev, "extra_fw_size %zu\n", extra_fw_size);
  444. dl_size = tcm_size;
  445. }
  446. dest = (__force void *)vpu->reg.tcm;
  447. if (fw_type == D_FW)
  448. dest += VPU_DTCM_OFFSET;
  449. memcpy(dest, vpu_fw->data, dl_size);
  450. /* download to extended memory if need */
  451. if (extra_fw_size > 0) {
  452. dest = vpu->extmem[fw_type].va;
  453. dev_dbg(vpu->dev, "download extended memory type %x\n",
  454. fw_type);
  455. memcpy(dest, vpu_fw->data + tcm_size, extra_fw_size);
  456. }
  457. release_firmware(vpu_fw);
  458. return 0;
  459. }
  460. int vpu_load_firmware(struct platform_device *pdev)
  461. {
  462. struct mtk_vpu *vpu = platform_get_drvdata(pdev);
  463. struct device *dev = &pdev->dev;
  464. struct vpu_run *run = &vpu->run;
  465. const struct firmware *vpu_fw = NULL;
  466. int ret;
  467. if (!pdev) {
  468. dev_err(dev, "VPU platform device is invalid\n");
  469. return -EINVAL;
  470. }
  471. mutex_lock(&vpu->vpu_mutex);
  472. if (vpu->fw_loaded) {
  473. mutex_unlock(&vpu->vpu_mutex);
  474. return 0;
  475. }
  476. mutex_unlock(&vpu->vpu_mutex);
  477. ret = vpu_clock_enable(vpu);
  478. if (ret) {
  479. dev_err(dev, "enable clock failed %d\n", ret);
  480. return ret;
  481. }
  482. mutex_lock(&vpu->vpu_mutex);
  483. run->signaled = false;
  484. dev_dbg(vpu->dev, "firmware request\n");
  485. /* Downloading program firmware to device*/
  486. ret = load_requested_vpu(vpu, vpu_fw, P_FW);
  487. if (ret < 0) {
  488. dev_err(dev, "Failed to request %s, %d\n", VPU_P_FW, ret);
  489. goto OUT_LOAD_FW;
  490. }
  491. /* Downloading data firmware to device */
  492. ret = load_requested_vpu(vpu, vpu_fw, D_FW);
  493. if (ret < 0) {
  494. dev_err(dev, "Failed to request %s, %d\n", VPU_D_FW, ret);
  495. goto OUT_LOAD_FW;
  496. }
  497. vpu->fw_loaded = true;
  498. /* boot up vpu */
  499. vpu_cfg_writel(vpu, 0x1, VPU_RESET);
  500. ret = wait_event_interruptible_timeout(run->wq,
  501. run->signaled,
  502. msecs_to_jiffies(INIT_TIMEOUT_MS)
  503. );
  504. if (ret == 0) {
  505. ret = -ETIME;
  506. dev_err(dev, "wait vpu initialization timout!\n");
  507. goto OUT_LOAD_FW;
  508. } else if (-ERESTARTSYS == ret) {
  509. dev_err(dev, "wait vpu interrupted by a signal!\n");
  510. goto OUT_LOAD_FW;
  511. }
  512. ret = 0;
  513. dev_info(dev, "vpu is ready. Fw version %s\n", run->fw_ver);
  514. OUT_LOAD_FW:
  515. mutex_unlock(&vpu->vpu_mutex);
  516. vpu_clock_disable(vpu);
  517. return ret;
  518. }
  519. EXPORT_SYMBOL_GPL(vpu_load_firmware);
  520. static void vpu_init_ipi_handler(void *data, unsigned int len, void *priv)
  521. {
  522. struct mtk_vpu *vpu = (struct mtk_vpu *)priv;
  523. struct vpu_run *run = (struct vpu_run *)data;
  524. vpu->run.signaled = run->signaled;
  525. strncpy(vpu->run.fw_ver, run->fw_ver, VPU_FW_VER_LEN);
  526. vpu->run.enc_capability = run->enc_capability;
  527. wake_up_interruptible(&vpu->run.wq);
  528. }
  529. #ifdef CONFIG_DEBUG_FS
  530. static ssize_t vpu_debug_read(struct file *file, char __user *user_buf,
  531. size_t count, loff_t *ppos)
  532. {
  533. char buf[256];
  534. unsigned int len;
  535. unsigned int running, pc, vpu_to_host, host_to_vpu, wdt;
  536. int ret;
  537. struct device *dev = file->private_data;
  538. struct mtk_vpu *vpu = dev_get_drvdata(dev);
  539. ret = vpu_clock_enable(vpu);
  540. if (ret) {
  541. dev_err(vpu->dev, "[VPU] enable clock failed %d\n", ret);
  542. return 0;
  543. }
  544. /* vpu register status */
  545. running = vpu_running(vpu);
  546. pc = vpu_cfg_readl(vpu, VPU_PC_REG);
  547. wdt = vpu_cfg_readl(vpu, VPU_WDT_REG);
  548. host_to_vpu = vpu_cfg_readl(vpu, HOST_TO_VPU);
  549. vpu_to_host = vpu_cfg_readl(vpu, VPU_TO_HOST);
  550. vpu_clock_disable(vpu);
  551. if (running) {
  552. len = snprintf(buf, sizeof(buf), "VPU is running\n\n"
  553. "FW Version: %s\n"
  554. "PC: 0x%x\n"
  555. "WDT: 0x%x\n"
  556. "Host to VPU: 0x%x\n"
  557. "VPU to Host: 0x%x\n",
  558. vpu->run.fw_ver, pc, wdt,
  559. host_to_vpu, vpu_to_host);
  560. } else {
  561. len = snprintf(buf, sizeof(buf), "VPU not running\n");
  562. }
  563. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  564. }
  565. static const struct file_operations vpu_debug_fops = {
  566. .open = simple_open,
  567. .read = vpu_debug_read,
  568. };
  569. #endif /* CONFIG_DEBUG_FS */
  570. static void vpu_free_ext_mem(struct mtk_vpu *vpu, u8 fw_type)
  571. {
  572. struct device *dev = vpu->dev;
  573. size_t fw_ext_size = fw_type ? VPU_EXT_D_SIZE : VPU_EXT_P_SIZE;
  574. dma_free_coherent(dev, fw_ext_size, vpu->extmem[fw_type].va,
  575. vpu->extmem[fw_type].pa);
  576. }
  577. static int vpu_alloc_ext_mem(struct mtk_vpu *vpu, u32 fw_type)
  578. {
  579. struct device *dev = vpu->dev;
  580. size_t fw_ext_size = fw_type ? VPU_EXT_D_SIZE : VPU_EXT_P_SIZE;
  581. u32 vpu_ext_mem0 = fw_type ? VPU_DMEM_EXT0_ADDR : VPU_PMEM_EXT0_ADDR;
  582. u32 vpu_ext_mem1 = fw_type ? VPU_DMEM_EXT1_ADDR : VPU_PMEM_EXT1_ADDR;
  583. u32 offset_4gb = vpu->enable_4GB ? 0x40000000 : 0;
  584. vpu->extmem[fw_type].va = dma_alloc_coherent(dev,
  585. fw_ext_size,
  586. &vpu->extmem[fw_type].pa,
  587. GFP_KERNEL);
  588. if (!vpu->extmem[fw_type].va) {
  589. dev_err(dev, "Failed to allocate the extended program memory\n");
  590. return PTR_ERR(vpu->extmem[fw_type].va);
  591. }
  592. /* Disable extend0. Enable extend1 */
  593. vpu_cfg_writel(vpu, 0x1, vpu_ext_mem0);
  594. vpu_cfg_writel(vpu, (vpu->extmem[fw_type].pa & 0xFFFFF000) + offset_4gb,
  595. vpu_ext_mem1);
  596. dev_info(dev, "%s extend memory phy=0x%llx virt=0x%p\n",
  597. fw_type ? "Data" : "Program",
  598. (unsigned long long)vpu->extmem[fw_type].pa,
  599. vpu->extmem[fw_type].va);
  600. return 0;
  601. }
  602. static void vpu_ipi_handler(struct mtk_vpu *vpu)
  603. {
  604. struct share_obj *rcv_obj = vpu->recv_buf;
  605. struct vpu_ipi_desc *ipi_desc = vpu->ipi_desc;
  606. if (rcv_obj->id < IPI_MAX && ipi_desc[rcv_obj->id].handler) {
  607. ipi_desc[rcv_obj->id].handler(rcv_obj->share_buf,
  608. rcv_obj->len,
  609. ipi_desc[rcv_obj->id].priv);
  610. if (rcv_obj->id > IPI_VPU_INIT) {
  611. vpu->ipi_id_ack[rcv_obj->id] = true;
  612. wake_up(&vpu->ack_wq);
  613. }
  614. } else {
  615. dev_err(vpu->dev, "No such ipi id = %d\n", rcv_obj->id);
  616. }
  617. }
  618. static int vpu_ipi_init(struct mtk_vpu *vpu)
  619. {
  620. /* Disable VPU to host interrupt */
  621. vpu_cfg_writel(vpu, 0x0, VPU_TO_HOST);
  622. /* shared buffer initialization */
  623. vpu->recv_buf = (__force struct share_obj *)(vpu->reg.tcm +
  624. VPU_DTCM_OFFSET);
  625. vpu->send_buf = vpu->recv_buf + 1;
  626. memset(vpu->recv_buf, 0, sizeof(struct share_obj));
  627. memset(vpu->send_buf, 0, sizeof(struct share_obj));
  628. return 0;
  629. }
  630. static irqreturn_t vpu_irq_handler(int irq, void *priv)
  631. {
  632. struct mtk_vpu *vpu = priv;
  633. u32 vpu_to_host;
  634. int ret;
  635. /*
  636. * Clock should have been enabled already.
  637. * Enable again in case vpu_ipi_send times out
  638. * and has disabled the clock.
  639. */
  640. ret = clk_enable(vpu->clk);
  641. if (ret) {
  642. dev_err(vpu->dev, "[VPU] enable clock failed %d\n", ret);
  643. return IRQ_NONE;
  644. }
  645. vpu_to_host = vpu_cfg_readl(vpu, VPU_TO_HOST);
  646. if (vpu_to_host & VPU_IPC_INT) {
  647. vpu_ipi_handler(vpu);
  648. } else {
  649. dev_err(vpu->dev, "vpu watchdog timeout! 0x%x", vpu_to_host);
  650. queue_work(vpu->wdt.wq, &vpu->wdt.ws);
  651. }
  652. /* VPU won't send another interrupt until we set VPU_TO_HOST to 0. */
  653. vpu_cfg_writel(vpu, 0x0, VPU_TO_HOST);
  654. clk_disable(vpu->clk);
  655. return IRQ_HANDLED;
  656. }
  657. #ifdef CONFIG_DEBUG_FS
  658. static struct dentry *vpu_debugfs;
  659. #endif
  660. static int mtk_vpu_probe(struct platform_device *pdev)
  661. {
  662. struct mtk_vpu *vpu;
  663. struct device *dev;
  664. struct resource *res;
  665. int ret = 0;
  666. dev_dbg(&pdev->dev, "initialization\n");
  667. dev = &pdev->dev;
  668. vpu = devm_kzalloc(dev, sizeof(*vpu), GFP_KERNEL);
  669. if (!vpu)
  670. return -ENOMEM;
  671. vpu->dev = &pdev->dev;
  672. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "tcm");
  673. vpu->reg.tcm = devm_ioremap_resource(dev, res);
  674. if (IS_ERR((__force void *)vpu->reg.tcm))
  675. return PTR_ERR((__force void *)vpu->reg.tcm);
  676. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cfg_reg");
  677. vpu->reg.cfg = devm_ioremap_resource(dev, res);
  678. if (IS_ERR((__force void *)vpu->reg.cfg))
  679. return PTR_ERR((__force void *)vpu->reg.cfg);
  680. /* Get VPU clock */
  681. vpu->clk = devm_clk_get(dev, "main");
  682. if (IS_ERR(vpu->clk)) {
  683. dev_err(dev, "get vpu clock failed\n");
  684. return PTR_ERR(vpu->clk);
  685. }
  686. platform_set_drvdata(pdev, vpu);
  687. ret = clk_prepare(vpu->clk);
  688. if (ret) {
  689. dev_err(dev, "prepare vpu clock failed\n");
  690. return ret;
  691. }
  692. /* VPU watchdog */
  693. vpu->wdt.wq = create_singlethread_workqueue("vpu_wdt");
  694. if (!vpu->wdt.wq) {
  695. dev_err(dev, "initialize wdt workqueue failed\n");
  696. return -ENOMEM;
  697. }
  698. INIT_WORK(&vpu->wdt.ws, vpu_wdt_reset_func);
  699. mutex_init(&vpu->vpu_mutex);
  700. ret = vpu_clock_enable(vpu);
  701. if (ret) {
  702. dev_err(dev, "enable vpu clock failed\n");
  703. goto workqueue_destroy;
  704. }
  705. dev_dbg(dev, "vpu ipi init\n");
  706. ret = vpu_ipi_init(vpu);
  707. if (ret) {
  708. dev_err(dev, "Failed to init ipi\n");
  709. goto disable_vpu_clk;
  710. }
  711. /* register vpu initialization IPI */
  712. ret = vpu_ipi_register(pdev, IPI_VPU_INIT, vpu_init_ipi_handler,
  713. "vpu_init", vpu);
  714. if (ret) {
  715. dev_err(dev, "Failed to register IPI_VPU_INIT\n");
  716. goto vpu_mutex_destroy;
  717. }
  718. #ifdef CONFIG_DEBUG_FS
  719. vpu_debugfs = debugfs_create_file("mtk_vpu", S_IRUGO, NULL, (void *)dev,
  720. &vpu_debug_fops);
  721. if (!vpu_debugfs) {
  722. ret = -ENOMEM;
  723. goto cleanup_ipi;
  724. }
  725. #endif
  726. /* Set PTCM to 96K and DTCM to 32K */
  727. vpu_cfg_writel(vpu, 0x2, VPU_TCM_CFG);
  728. vpu->enable_4GB = !!(totalram_pages > (SZ_2G >> PAGE_SHIFT));
  729. dev_info(dev, "4GB mode %u\n", vpu->enable_4GB);
  730. if (vpu->enable_4GB) {
  731. ret = of_reserved_mem_device_init(dev);
  732. if (ret)
  733. dev_info(dev, "init reserved memory failed\n");
  734. /* continue to use dynamic allocation if failed */
  735. }
  736. ret = vpu_alloc_ext_mem(vpu, D_FW);
  737. if (ret) {
  738. dev_err(dev, "Allocate DM failed\n");
  739. goto remove_debugfs;
  740. }
  741. ret = vpu_alloc_ext_mem(vpu, P_FW);
  742. if (ret) {
  743. dev_err(dev, "Allocate PM failed\n");
  744. goto free_d_mem;
  745. }
  746. init_waitqueue_head(&vpu->run.wq);
  747. init_waitqueue_head(&vpu->ack_wq);
  748. res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
  749. if (!res) {
  750. dev_err(dev, "get IRQ resource failed.\n");
  751. ret = -ENXIO;
  752. goto free_p_mem;
  753. }
  754. vpu->reg.irq = platform_get_irq(pdev, 0);
  755. ret = devm_request_irq(dev, vpu->reg.irq, vpu_irq_handler, 0,
  756. pdev->name, vpu);
  757. if (ret) {
  758. dev_err(dev, "failed to request irq\n");
  759. goto free_p_mem;
  760. }
  761. vpu_clock_disable(vpu);
  762. dev_dbg(dev, "initialization completed\n");
  763. return 0;
  764. free_p_mem:
  765. vpu_free_ext_mem(vpu, P_FW);
  766. free_d_mem:
  767. vpu_free_ext_mem(vpu, D_FW);
  768. remove_debugfs:
  769. of_reserved_mem_device_release(dev);
  770. #ifdef CONFIG_DEBUG_FS
  771. debugfs_remove(vpu_debugfs);
  772. cleanup_ipi:
  773. #endif
  774. memset(vpu->ipi_desc, 0, sizeof(struct vpu_ipi_desc) * IPI_MAX);
  775. vpu_mutex_destroy:
  776. mutex_destroy(&vpu->vpu_mutex);
  777. disable_vpu_clk:
  778. vpu_clock_disable(vpu);
  779. workqueue_destroy:
  780. destroy_workqueue(vpu->wdt.wq);
  781. return ret;
  782. }
  783. static const struct of_device_id mtk_vpu_match[] = {
  784. {
  785. .compatible = "mediatek,mt8173-vpu",
  786. },
  787. {},
  788. };
  789. MODULE_DEVICE_TABLE(of, mtk_vpu_match);
  790. static int mtk_vpu_remove(struct platform_device *pdev)
  791. {
  792. struct mtk_vpu *vpu = platform_get_drvdata(pdev);
  793. #ifdef CONFIG_DEBUG_FS
  794. debugfs_remove(vpu_debugfs);
  795. #endif
  796. if (vpu->wdt.wq) {
  797. flush_workqueue(vpu->wdt.wq);
  798. destroy_workqueue(vpu->wdt.wq);
  799. }
  800. vpu_free_ext_mem(vpu, P_FW);
  801. vpu_free_ext_mem(vpu, D_FW);
  802. mutex_destroy(&vpu->vpu_mutex);
  803. clk_unprepare(vpu->clk);
  804. return 0;
  805. }
  806. static struct platform_driver mtk_vpu_driver = {
  807. .probe = mtk_vpu_probe,
  808. .remove = mtk_vpu_remove,
  809. .driver = {
  810. .name = "mtk_vpu",
  811. .of_match_table = mtk_vpu_match,
  812. },
  813. };
  814. module_platform_driver(mtk_vpu_driver);
  815. MODULE_LICENSE("GPL v2");
  816. MODULE_DESCRIPTION("Mediatek Video Prosessor Unit driver");