mtk_vcodec_mem.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. /*
  2. * Copyright (c) 2017 MediaTek Inc.
  3. * Author: Yunfei Dong <yunfei.dong@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 "mtk_vcodec_mem.h"
  15. /*
  16. * #undef pr_debug
  17. * #define pr_debug pr_info
  18. */
  19. struct mtk_vcu_queue *mtk_vcu_mem_init(struct device *dev,
  20. struct device *cmdq_dev)
  21. {
  22. struct mtk_vcu_queue *vcu_queue;
  23. pr_debug("Allocate new vcu queue !\n");
  24. vcu_queue = kzalloc(sizeof(struct mtk_vcu_queue), GFP_KERNEL);
  25. if (vcu_queue == NULL) {
  26. pr_info("Allocate new vcu queue fail!\n");
  27. return NULL;
  28. }
  29. INIT_LIST_HEAD(&vcu_queue->pa_pages.list);
  30. vcu_queue->mem_ops = &vb2_dma_contig_memops;
  31. vcu_queue->dev = dev;
  32. vcu_queue->cmdq_dev = cmdq_dev;
  33. vcu_queue->num_buffers = 0;
  34. vcu_queue->map_buf_pa = 0;
  35. mutex_init(&vcu_queue->mmap_lock);
  36. return vcu_queue;
  37. }
  38. void mtk_vcu_mem_release(struct mtk_vcu_queue *vcu_queue)
  39. {
  40. struct mtk_vcu_mem *vcu_buffer;
  41. unsigned int buffer;
  42. struct vcu_pa_pages *tmp;
  43. struct list_head *p, *q;
  44. mutex_lock(&vcu_queue->mmap_lock);
  45. pr_debug("Release vcu queue !\n");
  46. if (vcu_queue->num_buffers != 0) {
  47. for (buffer = 0; buffer < vcu_queue->num_buffers; buffer++) {
  48. vcu_buffer = &vcu_queue->bufs[buffer];
  49. if (vcu_buffer->dbuf == NULL)
  50. vcu_queue->mem_ops->put(vcu_buffer->mem_priv);
  51. else
  52. fput(vcu_buffer->dbuf->file);
  53. pr_debug("Free %d dbuf = %p size = %d mem_priv = %lx ref_cnt = %d\n",
  54. buffer, vcu_buffer->dbuf,
  55. (unsigned int)vcu_buffer->size,
  56. (unsigned long)vcu_buffer->mem_priv,
  57. atomic_read(&vcu_buffer->ref_cnt));
  58. }
  59. }
  60. list_for_each_safe(p, q, &vcu_queue->pa_pages.list) {
  61. tmp = list_entry(p, struct vcu_pa_pages, list);
  62. cmdq_mbox_buf_free(
  63. vcu_queue->cmdq_dev,
  64. (void *)(unsigned long)tmp->kva,
  65. (dma_addr_t)tmp->pa);
  66. pr_info("Free cmdq pa %llx ref_cnt = %d\n", tmp->pa,
  67. atomic_read(&tmp->ref_cnt));
  68. list_del(p);
  69. kfree(tmp);
  70. }
  71. mutex_unlock(&vcu_queue->mmap_lock);
  72. kfree(vcu_queue);
  73. vcu_queue = NULL;
  74. }
  75. void *mtk_vcu_set_buffer(struct mtk_vcu_queue *vcu_queue,
  76. struct mem_obj *mem_buff_data, struct vb2_buffer *src_vb,
  77. struct vb2_buffer *dst_vb)
  78. {
  79. struct mtk_vcu_mem *vcu_buffer;
  80. unsigned int num_buffers, plane;
  81. unsigned int buffer;
  82. dma_addr_t *dma_addr = NULL;
  83. struct dma_buf *dbuf = NULL;
  84. int op;
  85. pr_debug("[%s] %d iova = %llx src_vb = %p dst_vb = %p\n",
  86. __func__, vcu_queue->num_buffers, mem_buff_data->iova,
  87. src_vb, dst_vb);
  88. num_buffers = vcu_queue->num_buffers;
  89. if (mem_buff_data->len > CODEC_ALLOCATE_MAX_BUFFER_SIZE ||
  90. mem_buff_data->len == 0U || num_buffers >= CODEC_MAX_BUFFER) {
  91. pr_info("Set buffer fail: buffer len = %u num_buffers = %d !!\n",
  92. mem_buff_data->len, num_buffers);
  93. return ERR_PTR(-EINVAL);
  94. }
  95. mutex_lock(&vcu_queue->mmap_lock);
  96. for (buffer = 0; buffer < num_buffers; buffer++) {
  97. vcu_buffer = &vcu_queue->bufs[buffer];
  98. if (mem_buff_data->iova == (u64)vcu_buffer->iova) {
  99. atomic_inc(&vcu_buffer->ref_cnt);
  100. mutex_unlock(&vcu_queue->mmap_lock);
  101. return vcu_buffer->mem_priv;
  102. }
  103. }
  104. vcu_buffer = &vcu_queue->bufs[num_buffers];
  105. if (dbuf == NULL && src_vb != NULL)
  106. for (plane = 0; plane < src_vb->num_planes; plane++) {
  107. dma_addr = src_vb->vb2_queue->mem_ops->cookie(
  108. src_vb->planes[plane].mem_priv);
  109. if (*dma_addr == mem_buff_data->iova) {
  110. dbuf = src_vb->planes[plane].dbuf;
  111. vcu_buffer->size = src_vb->planes[plane].length;
  112. vcu_buffer->mem_priv = src_vb->planes[plane].mem_priv;
  113. op = DMA_TO_DEVICE;
  114. pr_debug("src size = %d mem_buff_data len = %d\n",
  115. (unsigned int)vcu_buffer->size,
  116. (unsigned int)mem_buff_data->len);
  117. }
  118. }
  119. if (dbuf == NULL && dst_vb != NULL)
  120. for (plane = 0; plane < dst_vb->num_planes; plane++) {
  121. dma_addr = dst_vb->vb2_queue->mem_ops->cookie(
  122. dst_vb->planes[plane].mem_priv);
  123. if (*dma_addr == mem_buff_data->iova) {
  124. dbuf = dst_vb->planes[plane].dbuf;
  125. vcu_buffer->size = dst_vb->planes[plane].length;
  126. vcu_buffer->mem_priv = dst_vb->planes[plane].mem_priv;
  127. op = DMA_FROM_DEVICE;
  128. pr_debug("dst size = %d mem_buff_data len = %d\n",
  129. (unsigned int)vcu_buffer->size,
  130. (unsigned int)mem_buff_data->len);
  131. }
  132. }
  133. if (dbuf == NULL) {
  134. mutex_unlock(&vcu_queue->mmap_lock);
  135. pr_debug("Set buffer not found: buffer len = %u iova = %llx !!\n",
  136. mem_buff_data->len, mem_buff_data->iova);
  137. return ERR_PTR(-ENOMEM);
  138. }
  139. vcu_buffer->dbuf = dbuf;
  140. vcu_buffer->iova = *dma_addr;
  141. get_file(dbuf->file);
  142. vcu_queue->num_buffers++;
  143. atomic_set(&vcu_buffer->ref_cnt, 1);
  144. mutex_unlock(&vcu_queue->mmap_lock);
  145. pr_debug("[%s] Num_buffers = %d iova = %llx dbuf = %p size = %d mem_priv = %lx\n",
  146. __func__, vcu_queue->num_buffers, mem_buff_data->iova,
  147. vcu_buffer->dbuf, (unsigned int)vcu_buffer->size,
  148. (unsigned long)vcu_buffer->mem_priv);
  149. return vcu_buffer->mem_priv;
  150. }
  151. void *mtk_vcu_get_buffer(struct mtk_vcu_queue *vcu_queue,
  152. struct mem_obj *mem_buff_data)
  153. {
  154. void *cook, *dma_addr;
  155. struct mtk_vcu_mem *vcu_buffer;
  156. unsigned int buffers;
  157. buffers = vcu_queue->num_buffers;
  158. if (mem_buff_data->len > CODEC_ALLOCATE_MAX_BUFFER_SIZE ||
  159. mem_buff_data->len == 0U || buffers >= CODEC_MAX_BUFFER) {
  160. pr_info("Get buffer fail: buffer len = %u num_buffers = %d !!\n",
  161. mem_buff_data->len, buffers);
  162. return ERR_PTR(-EINVAL);
  163. }
  164. mutex_lock(&vcu_queue->mmap_lock);
  165. vcu_buffer = &vcu_queue->bufs[buffers];
  166. vcu_buffer->mem_priv = vcu_queue->mem_ops->alloc(vcu_queue->dev, 0,
  167. mem_buff_data->len, 0, 0);
  168. vcu_buffer->size = mem_buff_data->len;
  169. vcu_buffer->dbuf = NULL;
  170. if (IS_ERR_OR_NULL(vcu_buffer->mem_priv)) {
  171. mutex_unlock(&vcu_queue->mmap_lock);
  172. return ERR_PTR(-ENOMEM);
  173. }
  174. cook = vcu_queue->mem_ops->vaddr(vcu_buffer->mem_priv);
  175. dma_addr = vcu_queue->mem_ops->cookie(vcu_buffer->mem_priv);
  176. mem_buff_data->iova = *(dma_addr_t *)dma_addr;
  177. vcu_buffer->iova = *(dma_addr_t *)dma_addr;
  178. mem_buff_data->va = CODEC_MSK((unsigned long)cook);
  179. mem_buff_data->pa = 0;
  180. vcu_queue->num_buffers++;
  181. mutex_unlock(&vcu_queue->mmap_lock);
  182. atomic_set(&vcu_buffer->ref_cnt, 1);
  183. pr_debug("[%s] Num_buffers = %d iova = %llx va = %llx size = %d mem_priv = %lx\n",
  184. __func__, vcu_queue->num_buffers, mem_buff_data->iova,
  185. mem_buff_data->va, (unsigned int)vcu_buffer->size,
  186. (unsigned long)vcu_buffer->mem_priv);
  187. return vcu_buffer->mem_priv;
  188. }
  189. void *mtk_vcu_get_page(struct mtk_vcu_queue *vcu_queue,
  190. struct mem_obj *mem_buff_data)
  191. {
  192. dma_addr_t temp_pa = 0;
  193. void *mem_priv;
  194. struct vcu_pa_pages *tmp;
  195. mem_priv =
  196. cmdq_mbox_buf_alloc(vcu_queue->cmdq_dev, &temp_pa);
  197. tmp = kmalloc(sizeof(struct vcu_pa_pages), GFP_KERNEL);
  198. if (!tmp)
  199. return ERR_PTR(-ENOMEM);
  200. mutex_lock(&vcu_queue->mmap_lock);
  201. tmp->pa = temp_pa;
  202. mem_buff_data->pa = temp_pa;
  203. tmp->kva = (unsigned long)mem_priv;
  204. mem_buff_data->va = CODEC_MSK((unsigned long)mem_priv);
  205. mem_buff_data->iova = 0;
  206. atomic_set(&tmp->ref_cnt, 1);
  207. list_add_tail(&tmp->list, &vcu_queue->pa_pages.list);
  208. mutex_unlock(&vcu_queue->mmap_lock);
  209. return mem_priv;
  210. }
  211. int mtk_vcu_free_buffer(struct mtk_vcu_queue *vcu_queue,
  212. struct mem_obj *mem_buff_data)
  213. {
  214. struct mtk_vcu_mem *vcu_buffer;
  215. void *cook, *dma_addr;
  216. unsigned int buffer, num_buffers, last_buffer;
  217. int ret = -EINVAL;
  218. mutex_lock(&vcu_queue->mmap_lock);
  219. num_buffers = vcu_queue->num_buffers;
  220. if (num_buffers != 0U) {
  221. for (buffer = 0; buffer < num_buffers; buffer++) {
  222. vcu_buffer = &vcu_queue->bufs[buffer];
  223. if (vcu_buffer->dbuf != NULL)
  224. continue;
  225. cook = vcu_queue->mem_ops->vaddr(vcu_buffer->mem_priv);
  226. dma_addr =
  227. vcu_queue->mem_ops->cookie(
  228. vcu_buffer->mem_priv);
  229. if (mem_buff_data->va == CODEC_MSK((unsigned long)cook) &&
  230. mem_buff_data->iova == *(dma_addr_t *)dma_addr &&
  231. mem_buff_data->len == vcu_buffer->size &&
  232. atomic_read(&vcu_buffer->ref_cnt) == 1) {
  233. pr_debug("Free buff = %d iova = %llx va = %llx, queue_num = %d\n",
  234. buffer, mem_buff_data->iova,
  235. mem_buff_data->va,
  236. num_buffers);
  237. vcu_queue->mem_ops->put(vcu_buffer->mem_priv);
  238. atomic_dec(&vcu_buffer->ref_cnt);
  239. last_buffer = num_buffers - 1U;
  240. if (last_buffer != buffer)
  241. vcu_queue->bufs[buffer] =
  242. vcu_queue->bufs[last_buffer];
  243. vcu_queue->bufs[last_buffer].mem_priv = NULL;
  244. vcu_queue->bufs[last_buffer].size = 0;
  245. vcu_queue->bufs[last_buffer].dbuf = NULL;
  246. vcu_queue->num_buffers--;
  247. ret = 0;
  248. break;
  249. }
  250. }
  251. }
  252. mutex_unlock(&vcu_queue->mmap_lock);
  253. if (ret != 0)
  254. pr_info("Can not free memory va %llx iova %llx len %u!\n",
  255. mem_buff_data->va, mem_buff_data->iova,
  256. mem_buff_data->len);
  257. return ret;
  258. }
  259. int mtk_vcu_free_page(struct mtk_vcu_queue *vcu_queue,
  260. struct mem_obj *mem_buff_data)
  261. {
  262. int ret = -EINVAL;
  263. struct vcu_pa_pages *tmp;
  264. struct list_head *p, *q;
  265. mutex_lock(&vcu_queue->mmap_lock);
  266. list_for_each_safe(p, q, &vcu_queue->pa_pages.list) {
  267. tmp = list_entry(p, struct vcu_pa_pages, list);
  268. if (tmp->pa == mem_buff_data->pa &&
  269. CODEC_MSK(tmp->kva) == mem_buff_data->va &&
  270. atomic_read(&tmp->ref_cnt) == 1) {
  271. ret = 0;
  272. cmdq_mbox_buf_free(
  273. vcu_queue->cmdq_dev,
  274. (void *)(unsigned long)
  275. tmp->kva,
  276. (dma_addr_t)mem_buff_data->pa);
  277. atomic_dec(&tmp->ref_cnt);
  278. list_del(p);
  279. kfree(tmp);
  280. break;
  281. }
  282. }
  283. mutex_unlock(&vcu_queue->mmap_lock);
  284. if (ret != 0)
  285. pr_info("Can not free memory va %llx pa %llx len %u!\n",
  286. mem_buff_data->va, mem_buff_data->pa,
  287. mem_buff_data->len);
  288. return ret;
  289. }
  290. void mtk_vcu_buffer_ref_dec(struct mtk_vcu_queue *vcu_queue,
  291. void *mem_priv)
  292. {
  293. struct mtk_vcu_mem *vcu_buffer;
  294. unsigned int buffer, num_buffers;
  295. mutex_lock(&vcu_queue->mmap_lock);
  296. num_buffers = vcu_queue->num_buffers;
  297. for (buffer = 0; buffer < num_buffers; buffer++) {
  298. vcu_buffer = &vcu_queue->bufs[buffer];
  299. if (vcu_buffer->mem_priv == mem_priv) {
  300. if (atomic_read(&vcu_buffer->ref_cnt) > 0)
  301. atomic_dec(&vcu_buffer->ref_cnt);
  302. else
  303. pr_info("[VCU][Error] %s fail\n", __func__);
  304. }
  305. }
  306. mutex_unlock(&vcu_queue->mmap_lock);
  307. }
  308. void vcu_io_buffer_cache_sync(struct device *dev,
  309. struct dma_buf *dbuf, int op)
  310. {
  311. struct dma_buf_attachment *buf_att;
  312. struct sg_table *sgt;
  313. buf_att = dma_buf_attach(dbuf, dev);
  314. sgt = dma_buf_map_attachment(buf_att, op);
  315. dma_sync_sg_for_device(dev, sgt->sgl, sgt->orig_nents, op);
  316. dma_buf_unmap_attachment(buf_att, sgt, op);
  317. dma_buf_detach(dbuf, buf_att);
  318. }
  319. int vcu_buffer_flush_all(struct device *dev, struct mtk_vcu_queue *vcu_queue)
  320. {
  321. struct mtk_vcu_mem *vcu_buffer;
  322. unsigned int buffer, num_buffers;
  323. void *cook = NULL;
  324. num_buffers = vcu_queue->num_buffers;
  325. if (num_buffers == 0U)
  326. return 0;
  327. for (buffer = 0; buffer < num_buffers; buffer++) {
  328. vcu_buffer = &vcu_queue->bufs[buffer];
  329. pr_debug("Cache clean %s buffer=%d iova=%lx size=%d num=%d\n",
  330. (vcu_buffer->dbuf == NULL) ? "working" : "io",
  331. buffer, (unsigned int long)vcu_buffer->iova,
  332. (unsigned int)vcu_buffer->size, num_buffers);
  333. if (vcu_buffer->dbuf == NULL) {
  334. cook = vcu_queue->mem_ops->vaddr(
  335. vcu_buffer->mem_priv);
  336. dmac_map_area((void *)cook, vcu_buffer->size,
  337. DMA_TO_DEVICE);
  338. } else
  339. vcu_io_buffer_cache_sync(dev,
  340. vcu_buffer->dbuf, DMA_TO_DEVICE);
  341. }
  342. return 0;
  343. }
  344. int vcu_buffer_cache_sync(struct device *dev, struct mtk_vcu_queue *vcu_queue,
  345. dma_addr_t dma_addr, size_t size, int op)
  346. {
  347. struct mtk_vcu_mem *vcu_buffer;
  348. unsigned int num_buffers = 0;
  349. unsigned int buffer = 0;
  350. void *cook = NULL;
  351. num_buffers = vcu_queue->num_buffers;
  352. if (num_buffers == 0U) {
  353. pr_info("Cache %s buffer fail, iova = %lx, size = %d, vcu no buffers\n",
  354. (op == DMA_TO_DEVICE) ? "flush" : "invalidate",
  355. (unsigned long)dma_addr, (unsigned int)size);
  356. return -1;
  357. }
  358. for (buffer = 0; buffer < num_buffers; buffer++) {
  359. vcu_buffer = &vcu_queue->bufs[buffer];
  360. if ((dma_addr + size) <=
  361. (vcu_buffer->iova + vcu_buffer->size) &&
  362. dma_addr >= vcu_buffer->iova) {
  363. pr_debug("Cache %s %s buffer iova=%lx range=%d (%lx %d)\n",
  364. (op == DMA_TO_DEVICE) ?
  365. "clean" : "invalidate",
  366. (vcu_buffer->dbuf == NULL) ?
  367. "working" : "io",
  368. (unsigned long)dma_addr, (unsigned int)size,
  369. (unsigned long)vcu_buffer->iova,
  370. (unsigned int)vcu_buffer->size);
  371. if (vcu_buffer->dbuf == NULL) {
  372. cook = vcu_queue->mem_ops->vaddr(
  373. vcu_buffer->mem_priv);
  374. if (op == DMA_TO_DEVICE)
  375. dmac_map_area((void *)cook, size, op);
  376. else
  377. dmac_unmap_area((void *)cook, size, op);
  378. } else
  379. vcu_io_buffer_cache_sync(dev,
  380. vcu_buffer->dbuf, op);
  381. return 0;
  382. }
  383. }
  384. pr_info("Cache %s buffer fail, iova = %lx, size = %d\n",
  385. (op == DMA_TO_DEVICE) ? "flush" : "invalidate",
  386. (unsigned long)dma_addr, (unsigned int)size);
  387. return -1;
  388. }