wave5-vpuapi.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970
  1. // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
  2. /*
  3. * Wave5 series multi-standard codec IP - helper functions
  4. *
  5. * Copyright (C) 2021-2023 CHIPS&MEDIA INC
  6. */
  7. #include <linux/bug.h>
  8. #include "wave5-vpuapi.h"
  9. #include "wave5-regdefine.h"
  10. #include "wave5.h"
  11. #define DECODE_ALL_TEMPORAL_LAYERS 0
  12. #define DECODE_ALL_SPATIAL_LAYERS 0
  13. static int wave5_initialize_vpu(struct device *dev, u8 *code, size_t size)
  14. {
  15. int ret;
  16. struct vpu_device *vpu_dev = dev_get_drvdata(dev);
  17. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  18. if (ret)
  19. return ret;
  20. if (wave5_vpu_is_init(vpu_dev)) {
  21. wave5_vpu_re_init(dev, (void *)code, size);
  22. ret = -EBUSY;
  23. goto err_out;
  24. }
  25. ret = wave5_vpu_reset(dev, SW_RESET_ON_BOOT);
  26. if (ret)
  27. goto err_out;
  28. ret = wave5_vpu_init(dev, (void *)code, size);
  29. err_out:
  30. mutex_unlock(&vpu_dev->hw_lock);
  31. return ret;
  32. }
  33. int wave5_vpu_init_with_bitcode(struct device *dev, u8 *bitcode, size_t size)
  34. {
  35. if (!bitcode || size == 0)
  36. return -EINVAL;
  37. return wave5_initialize_vpu(dev, bitcode, size);
  38. }
  39. int wave5_vpu_flush_instance(struct vpu_instance *inst)
  40. {
  41. int ret = 0;
  42. int retry = 0;
  43. ret = mutex_lock_interruptible(&inst->dev->hw_lock);
  44. if (ret)
  45. return ret;
  46. do {
  47. /*
  48. * Repeat the FLUSH command until the firmware reports that the
  49. * VPU isn't running anymore
  50. */
  51. ret = wave5_vpu_hw_flush_instance(inst);
  52. if (ret < 0 && ret != -EBUSY) {
  53. dev_warn(inst->dev->dev, "Flush of %s instance with id: %d fail: %d\n",
  54. inst->type == VPU_INST_TYPE_DEC ? "DECODER" : "ENCODER", inst->id,
  55. ret);
  56. mutex_unlock(&inst->dev->hw_lock);
  57. return ret;
  58. }
  59. if (ret == -EBUSY && retry++ >= MAX_FIRMWARE_CALL_RETRY) {
  60. dev_warn(inst->dev->dev, "Flush of %s instance with id: %d timed out!\n",
  61. inst->type == VPU_INST_TYPE_DEC ? "DECODER" : "ENCODER", inst->id);
  62. mutex_unlock(&inst->dev->hw_lock);
  63. return -ETIMEDOUT;
  64. } else if (ret == -EBUSY) {
  65. struct dec_output_info dec_info;
  66. mutex_unlock(&inst->dev->hw_lock);
  67. wave5_vpu_dec_get_output_info(inst, &dec_info);
  68. ret = mutex_lock_interruptible(&inst->dev->hw_lock);
  69. if (ret)
  70. return ret;
  71. if (dec_info.index_frame_display > 0)
  72. wave5_vpu_dec_set_disp_flag(inst, dec_info.index_frame_display);
  73. }
  74. } while (ret != 0);
  75. mutex_unlock(&inst->dev->hw_lock);
  76. return ret;
  77. }
  78. int wave5_vpu_get_version_info(struct device *dev, u32 *revision, unsigned int *product_id)
  79. {
  80. int ret;
  81. struct vpu_device *vpu_dev = dev_get_drvdata(dev);
  82. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  83. if (ret)
  84. return ret;
  85. if (!wave5_vpu_is_init(vpu_dev)) {
  86. ret = -EINVAL;
  87. goto err_out;
  88. }
  89. if (product_id)
  90. *product_id = vpu_dev->product;
  91. ret = wave5_vpu_get_version(vpu_dev, revision);
  92. err_out:
  93. mutex_unlock(&vpu_dev->hw_lock);
  94. return ret;
  95. }
  96. static int wave5_check_dec_open_param(struct vpu_instance *inst, struct dec_open_param *param)
  97. {
  98. if (inst->id >= MAX_NUM_INSTANCE) {
  99. dev_err(inst->dev->dev, "Too many simultaneous instances: %d (max: %u)\n",
  100. inst->id, MAX_NUM_INSTANCE);
  101. return -EOPNOTSUPP;
  102. }
  103. if (param->bitstream_buffer % 8) {
  104. dev_err(inst->dev->dev,
  105. "Bitstream buffer must be aligned to a multiple of 8\n");
  106. return -EINVAL;
  107. }
  108. if (param->bitstream_buffer_size % 1024 ||
  109. param->bitstream_buffer_size < MIN_BITSTREAM_BUFFER_SIZE) {
  110. dev_err(inst->dev->dev,
  111. "Bitstream buffer size must be aligned to a multiple of 1024 and have a minimum size of %d\n",
  112. MIN_BITSTREAM_BUFFER_SIZE);
  113. return -EINVAL;
  114. }
  115. return 0;
  116. }
  117. int wave5_vpu_dec_open(struct vpu_instance *inst, struct dec_open_param *open_param)
  118. {
  119. struct dec_info *p_dec_info;
  120. int ret;
  121. struct vpu_device *vpu_dev = inst->dev;
  122. dma_addr_t buffer_addr;
  123. size_t buffer_size;
  124. ret = wave5_check_dec_open_param(inst, open_param);
  125. if (ret)
  126. return ret;
  127. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  128. if (ret)
  129. return ret;
  130. if (!wave5_vpu_is_init(vpu_dev)) {
  131. mutex_unlock(&vpu_dev->hw_lock);
  132. return -ENODEV;
  133. }
  134. p_dec_info = &inst->codec_info->dec_info;
  135. memcpy(&p_dec_info->open_param, open_param, sizeof(struct dec_open_param));
  136. buffer_addr = open_param->bitstream_buffer;
  137. buffer_size = open_param->bitstream_buffer_size;
  138. p_dec_info->stream_wr_ptr = buffer_addr;
  139. p_dec_info->stream_rd_ptr = buffer_addr;
  140. p_dec_info->stream_buf_start_addr = buffer_addr;
  141. p_dec_info->stream_buf_size = buffer_size;
  142. p_dec_info->stream_buf_end_addr = buffer_addr + buffer_size;
  143. p_dec_info->reorder_enable = TRUE;
  144. p_dec_info->temp_id_select_mode = TEMPORAL_ID_MODE_ABSOLUTE;
  145. p_dec_info->target_temp_id = DECODE_ALL_TEMPORAL_LAYERS;
  146. p_dec_info->target_spatial_id = DECODE_ALL_SPATIAL_LAYERS;
  147. ret = wave5_vpu_build_up_dec_param(inst, open_param);
  148. mutex_unlock(&vpu_dev->hw_lock);
  149. return ret;
  150. }
  151. static int reset_auxiliary_buffers(struct vpu_instance *inst, unsigned int index)
  152. {
  153. struct dec_info *p_dec_info = &inst->codec_info->dec_info;
  154. if (index >= MAX_REG_FRAME)
  155. return 1;
  156. if (p_dec_info->vb_mv[index].size == 0 && p_dec_info->vb_fbc_y_tbl[index].size == 0 &&
  157. p_dec_info->vb_fbc_c_tbl[index].size == 0)
  158. return 1;
  159. wave5_vdi_free_dma_memory(inst->dev, &p_dec_info->vb_mv[index]);
  160. wave5_vdi_free_dma_memory(inst->dev, &p_dec_info->vb_fbc_y_tbl[index]);
  161. wave5_vdi_free_dma_memory(inst->dev, &p_dec_info->vb_fbc_c_tbl[index]);
  162. return 0;
  163. }
  164. int wave5_vpu_dec_close(struct vpu_instance *inst, u32 *fail_res)
  165. {
  166. struct dec_info *p_dec_info = &inst->codec_info->dec_info;
  167. int ret;
  168. int retry = 0;
  169. struct vpu_device *vpu_dev = inst->dev;
  170. int i;
  171. *fail_res = 0;
  172. if (!inst->codec_info)
  173. return -EINVAL;
  174. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  175. if (ret)
  176. return ret;
  177. do {
  178. ret = wave5_vpu_dec_finish_seq(inst, fail_res);
  179. if (ret < 0 && *fail_res != WAVE5_SYSERR_VPU_STILL_RUNNING) {
  180. dev_warn(inst->dev->dev, "dec_finish_seq timed out\n");
  181. goto unlock_and_return;
  182. }
  183. if (*fail_res == WAVE5_SYSERR_VPU_STILL_RUNNING &&
  184. retry++ >= MAX_FIRMWARE_CALL_RETRY) {
  185. ret = -ETIMEDOUT;
  186. goto unlock_and_return;
  187. }
  188. } while (ret != 0);
  189. dev_dbg(inst->dev->dev, "%s: dec_finish_seq complete\n", __func__);
  190. wave5_vdi_free_dma_memory(vpu_dev, &p_dec_info->vb_work);
  191. for (i = 0 ; i < MAX_REG_FRAME; i++) {
  192. ret = reset_auxiliary_buffers(inst, i);
  193. if (ret) {
  194. ret = 0;
  195. break;
  196. }
  197. }
  198. wave5_vdi_free_dma_memory(vpu_dev, &p_dec_info->vb_task);
  199. unlock_and_return:
  200. mutex_unlock(&vpu_dev->hw_lock);
  201. return ret;
  202. }
  203. int wave5_vpu_dec_issue_seq_init(struct vpu_instance *inst)
  204. {
  205. int ret;
  206. struct vpu_device *vpu_dev = inst->dev;
  207. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  208. if (ret)
  209. return ret;
  210. ret = wave5_vpu_dec_init_seq(inst);
  211. mutex_unlock(&vpu_dev->hw_lock);
  212. return ret;
  213. }
  214. int wave5_vpu_dec_complete_seq_init(struct vpu_instance *inst, struct dec_initial_info *info)
  215. {
  216. struct dec_info *p_dec_info = &inst->codec_info->dec_info;
  217. int ret;
  218. struct vpu_device *vpu_dev = inst->dev;
  219. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  220. if (ret)
  221. return ret;
  222. ret = wave5_vpu_dec_get_seq_info(inst, info);
  223. if (!ret)
  224. p_dec_info->initial_info_obtained = true;
  225. info->rd_ptr = wave5_dec_get_rd_ptr(inst);
  226. info->wr_ptr = p_dec_info->stream_wr_ptr;
  227. p_dec_info->initial_info = *info;
  228. mutex_unlock(&vpu_dev->hw_lock);
  229. return ret;
  230. }
  231. int wave5_vpu_dec_register_frame_buffer_ex(struct vpu_instance *inst, int num_of_decoding_fbs,
  232. int num_of_display_fbs, int stride, int height)
  233. {
  234. struct dec_info *p_dec_info;
  235. int ret;
  236. struct vpu_device *vpu_dev = inst->dev;
  237. struct frame_buffer *fb;
  238. if (num_of_decoding_fbs >= WAVE5_MAX_FBS || num_of_display_fbs >= WAVE5_MAX_FBS)
  239. return -EINVAL;
  240. p_dec_info = &inst->codec_info->dec_info;
  241. p_dec_info->num_of_decoding_fbs = num_of_decoding_fbs;
  242. p_dec_info->num_of_display_fbs = num_of_display_fbs;
  243. p_dec_info->stride = stride;
  244. if (!p_dec_info->initial_info_obtained)
  245. return -EINVAL;
  246. if (stride < p_dec_info->initial_info.pic_width || (stride % 8 != 0) ||
  247. height < p_dec_info->initial_info.pic_height)
  248. return -EINVAL;
  249. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  250. if (ret)
  251. return ret;
  252. fb = inst->frame_buf;
  253. ret = wave5_vpu_dec_register_framebuffer(inst, &fb[p_dec_info->num_of_decoding_fbs],
  254. LINEAR_FRAME_MAP, p_dec_info->num_of_display_fbs);
  255. if (ret)
  256. goto err_out;
  257. ret = wave5_vpu_dec_register_framebuffer(inst, &fb[0], COMPRESSED_FRAME_MAP,
  258. p_dec_info->num_of_decoding_fbs);
  259. err_out:
  260. mutex_unlock(&vpu_dev->hw_lock);
  261. return ret;
  262. }
  263. int wave5_vpu_dec_get_bitstream_buffer(struct vpu_instance *inst, dma_addr_t *prd_ptr,
  264. dma_addr_t *pwr_ptr, size_t *size)
  265. {
  266. struct dec_info *p_dec_info;
  267. dma_addr_t rd_ptr;
  268. dma_addr_t wr_ptr;
  269. int room;
  270. struct vpu_device *vpu_dev = inst->dev;
  271. int ret;
  272. p_dec_info = &inst->codec_info->dec_info;
  273. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  274. if (ret)
  275. return ret;
  276. rd_ptr = wave5_dec_get_rd_ptr(inst);
  277. mutex_unlock(&vpu_dev->hw_lock);
  278. wr_ptr = p_dec_info->stream_wr_ptr;
  279. if (wr_ptr < rd_ptr)
  280. room = rd_ptr - wr_ptr;
  281. else
  282. room = (p_dec_info->stream_buf_end_addr - wr_ptr) +
  283. (rd_ptr - p_dec_info->stream_buf_start_addr);
  284. room--;
  285. if (prd_ptr)
  286. *prd_ptr = rd_ptr;
  287. if (pwr_ptr)
  288. *pwr_ptr = wr_ptr;
  289. if (size)
  290. *size = room;
  291. return 0;
  292. }
  293. int wave5_vpu_dec_update_bitstream_buffer(struct vpu_instance *inst, size_t size)
  294. {
  295. struct dec_info *p_dec_info;
  296. dma_addr_t wr_ptr;
  297. dma_addr_t rd_ptr;
  298. int ret;
  299. struct vpu_device *vpu_dev = inst->dev;
  300. if (!inst->codec_info)
  301. return -EINVAL;
  302. p_dec_info = &inst->codec_info->dec_info;
  303. wr_ptr = p_dec_info->stream_wr_ptr;
  304. rd_ptr = p_dec_info->stream_rd_ptr;
  305. if (size > 0) {
  306. if (wr_ptr < rd_ptr && rd_ptr <= wr_ptr + size)
  307. return -EINVAL;
  308. wr_ptr += size;
  309. if (wr_ptr > p_dec_info->stream_buf_end_addr) {
  310. u32 room = wr_ptr - p_dec_info->stream_buf_end_addr;
  311. wr_ptr = p_dec_info->stream_buf_start_addr;
  312. wr_ptr += room;
  313. } else if (wr_ptr == p_dec_info->stream_buf_end_addr) {
  314. wr_ptr = p_dec_info->stream_buf_start_addr;
  315. }
  316. p_dec_info->stream_wr_ptr = wr_ptr;
  317. p_dec_info->stream_rd_ptr = rd_ptr;
  318. }
  319. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  320. if (ret)
  321. return ret;
  322. ret = wave5_vpu_dec_set_bitstream_flag(inst, (size == 0));
  323. mutex_unlock(&vpu_dev->hw_lock);
  324. return ret;
  325. }
  326. int wave5_vpu_dec_start_one_frame(struct vpu_instance *inst, u32 *res_fail)
  327. {
  328. struct dec_info *p_dec_info = &inst->codec_info->dec_info;
  329. int ret;
  330. struct vpu_device *vpu_dev = inst->dev;
  331. if (p_dec_info->stride == 0) /* this means frame buffers have not been registered. */
  332. return -EINVAL;
  333. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  334. if (ret)
  335. return ret;
  336. ret = wave5_vpu_decode(inst, res_fail);
  337. mutex_unlock(&vpu_dev->hw_lock);
  338. return ret;
  339. }
  340. int wave5_vpu_dec_set_rd_ptr(struct vpu_instance *inst, dma_addr_t addr, int update_wr_ptr)
  341. {
  342. struct dec_info *p_dec_info = &inst->codec_info->dec_info;
  343. int ret;
  344. struct vpu_device *vpu_dev = inst->dev;
  345. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  346. if (ret)
  347. return ret;
  348. ret = wave5_dec_set_rd_ptr(inst, addr);
  349. p_dec_info->stream_rd_ptr = addr;
  350. if (update_wr_ptr)
  351. p_dec_info->stream_wr_ptr = addr;
  352. mutex_unlock(&vpu_dev->hw_lock);
  353. return ret;
  354. }
  355. dma_addr_t wave5_vpu_dec_get_rd_ptr(struct vpu_instance *inst)
  356. {
  357. int ret;
  358. dma_addr_t rd_ptr;
  359. ret = mutex_lock_interruptible(&inst->dev->hw_lock);
  360. if (ret)
  361. return ret;
  362. rd_ptr = wave5_dec_get_rd_ptr(inst);
  363. mutex_unlock(&inst->dev->hw_lock);
  364. return rd_ptr;
  365. }
  366. int wave5_vpu_dec_get_output_info(struct vpu_instance *inst, struct dec_output_info *info)
  367. {
  368. struct dec_info *p_dec_info;
  369. int ret;
  370. struct vpu_rect rect_info;
  371. u32 val;
  372. u32 decoded_index;
  373. u32 disp_idx;
  374. u32 max_dec_index;
  375. struct vpu_device *vpu_dev = inst->dev;
  376. struct dec_output_info *disp_info;
  377. if (!info)
  378. return -EINVAL;
  379. p_dec_info = &inst->codec_info->dec_info;
  380. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  381. if (ret)
  382. return ret;
  383. memset(info, 0, sizeof(*info));
  384. ret = wave5_vpu_dec_get_result(inst, info);
  385. if (ret) {
  386. info->rd_ptr = p_dec_info->stream_rd_ptr;
  387. info->wr_ptr = p_dec_info->stream_wr_ptr;
  388. goto err_out;
  389. }
  390. decoded_index = info->index_frame_decoded;
  391. /* calculate display frame region */
  392. val = 0;
  393. rect_info.left = 0;
  394. rect_info.right = 0;
  395. rect_info.top = 0;
  396. rect_info.bottom = 0;
  397. if (decoded_index < WAVE5_MAX_FBS) {
  398. if (inst->std == W_HEVC_DEC || inst->std == W_AVC_DEC)
  399. rect_info = p_dec_info->initial_info.pic_crop_rect;
  400. if (inst->std == W_HEVC_DEC)
  401. p_dec_info->dec_out_info[decoded_index].decoded_poc = info->decoded_poc;
  402. p_dec_info->dec_out_info[decoded_index].rc_decoded = rect_info;
  403. }
  404. info->rc_decoded = rect_info;
  405. disp_idx = info->index_frame_display;
  406. if (info->index_frame_display >= 0 && info->index_frame_display < WAVE5_MAX_FBS) {
  407. disp_info = &p_dec_info->dec_out_info[disp_idx];
  408. if (info->index_frame_display != info->index_frame_decoded) {
  409. /*
  410. * when index_frame_decoded < 0, and index_frame_display >= 0
  411. * info->dec_pic_width and info->dec_pic_height are still valid
  412. * but those of p_dec_info->dec_out_info[disp_idx] are invalid in VP9
  413. */
  414. info->disp_pic_width = disp_info->dec_pic_width;
  415. info->disp_pic_height = disp_info->dec_pic_height;
  416. } else {
  417. info->disp_pic_width = info->dec_pic_width;
  418. info->disp_pic_height = info->dec_pic_height;
  419. }
  420. info->rc_display = disp_info->rc_decoded;
  421. } else {
  422. info->rc_display.left = 0;
  423. info->rc_display.right = 0;
  424. info->rc_display.top = 0;
  425. info->rc_display.bottom = 0;
  426. info->disp_pic_width = 0;
  427. info->disp_pic_height = 0;
  428. }
  429. p_dec_info->stream_rd_ptr = wave5_dec_get_rd_ptr(inst);
  430. p_dec_info->frame_display_flag = vpu_read_reg(vpu_dev, W5_RET_DEC_DISP_IDC);
  431. val = p_dec_info->num_of_decoding_fbs; //fb_offset
  432. max_dec_index = (p_dec_info->num_of_decoding_fbs > p_dec_info->num_of_display_fbs) ?
  433. p_dec_info->num_of_decoding_fbs : p_dec_info->num_of_display_fbs;
  434. if (info->index_frame_display >= 0 &&
  435. info->index_frame_display < (int)max_dec_index)
  436. info->disp_frame = inst->frame_buf[val + info->index_frame_display];
  437. info->rd_ptr = p_dec_info->stream_rd_ptr;
  438. info->wr_ptr = p_dec_info->stream_wr_ptr;
  439. info->frame_display_flag = p_dec_info->frame_display_flag;
  440. info->sequence_no = p_dec_info->initial_info.sequence_no;
  441. if (decoded_index < WAVE5_MAX_FBS)
  442. p_dec_info->dec_out_info[decoded_index] = *info;
  443. if (disp_idx < WAVE5_MAX_FBS)
  444. info->disp_frame.sequence_no = info->sequence_no;
  445. if (info->sequence_changed) {
  446. memcpy((void *)&p_dec_info->initial_info, (void *)&p_dec_info->new_seq_info,
  447. sizeof(struct dec_initial_info));
  448. p_dec_info->initial_info.sequence_no++;
  449. }
  450. err_out:
  451. mutex_unlock(&vpu_dev->hw_lock);
  452. return ret;
  453. }
  454. int wave5_vpu_dec_clr_disp_flag(struct vpu_instance *inst, int index)
  455. {
  456. struct dec_info *p_dec_info = &inst->codec_info->dec_info;
  457. int ret;
  458. struct vpu_device *vpu_dev = inst->dev;
  459. if (index >= p_dec_info->num_of_display_fbs)
  460. return -EINVAL;
  461. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  462. if (ret)
  463. return ret;
  464. ret = wave5_dec_clr_disp_flag(inst, index);
  465. mutex_unlock(&vpu_dev->hw_lock);
  466. return ret;
  467. }
  468. int wave5_vpu_dec_set_disp_flag(struct vpu_instance *inst, int index)
  469. {
  470. struct dec_info *p_dec_info = &inst->codec_info->dec_info;
  471. int ret = 0;
  472. struct vpu_device *vpu_dev = inst->dev;
  473. if (index >= p_dec_info->num_of_display_fbs)
  474. return -EINVAL;
  475. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  476. if (ret)
  477. return ret;
  478. ret = wave5_dec_set_disp_flag(inst, index);
  479. mutex_unlock(&vpu_dev->hw_lock);
  480. return ret;
  481. }
  482. int wave5_vpu_dec_reset_framebuffer(struct vpu_instance *inst, unsigned int index)
  483. {
  484. if (index >= MAX_REG_FRAME)
  485. return -EINVAL;
  486. if (inst->frame_vbuf[index].size == 0)
  487. return -EINVAL;
  488. wave5_vdi_free_dma_memory(inst->dev, &inst->frame_vbuf[index]);
  489. return 0;
  490. }
  491. int wave5_vpu_dec_give_command(struct vpu_instance *inst, enum codec_command cmd, void *parameter)
  492. {
  493. struct dec_info *p_dec_info = &inst->codec_info->dec_info;
  494. int ret = 0;
  495. switch (cmd) {
  496. case DEC_GET_QUEUE_STATUS: {
  497. struct queue_status_info *queue_info = parameter;
  498. queue_info->instance_queue_count = p_dec_info->instance_queue_count;
  499. queue_info->report_queue_count = p_dec_info->report_queue_count;
  500. break;
  501. }
  502. case DEC_RESET_FRAMEBUF_INFO: {
  503. int i;
  504. for (i = 0; i < MAX_REG_FRAME; i++) {
  505. ret = wave5_vpu_dec_reset_framebuffer(inst, i);
  506. if (ret)
  507. break;
  508. }
  509. for (i = 0; i < MAX_REG_FRAME; i++) {
  510. ret = reset_auxiliary_buffers(inst, i);
  511. if (ret)
  512. break;
  513. }
  514. wave5_vdi_free_dma_memory(inst->dev, &p_dec_info->vb_task);
  515. break;
  516. }
  517. case DEC_GET_SEQ_INFO: {
  518. struct dec_initial_info *seq_info = parameter;
  519. *seq_info = p_dec_info->initial_info;
  520. break;
  521. }
  522. default:
  523. return -EINVAL;
  524. }
  525. return ret;
  526. }
  527. int wave5_vpu_enc_open(struct vpu_instance *inst, struct enc_open_param *open_param)
  528. {
  529. struct enc_info *p_enc_info;
  530. int ret;
  531. struct vpu_device *vpu_dev = inst->dev;
  532. ret = wave5_vpu_enc_check_open_param(inst, open_param);
  533. if (ret)
  534. return ret;
  535. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  536. if (ret)
  537. return ret;
  538. if (!wave5_vpu_is_init(vpu_dev)) {
  539. mutex_unlock(&vpu_dev->hw_lock);
  540. return -ENODEV;
  541. }
  542. p_enc_info = &inst->codec_info->enc_info;
  543. p_enc_info->open_param = *open_param;
  544. ret = wave5_vpu_build_up_enc_param(vpu_dev->dev, inst, open_param);
  545. mutex_unlock(&vpu_dev->hw_lock);
  546. return ret;
  547. }
  548. int wave5_vpu_enc_close(struct vpu_instance *inst, u32 *fail_res)
  549. {
  550. struct enc_info *p_enc_info = &inst->codec_info->enc_info;
  551. int ret;
  552. int retry = 0;
  553. struct vpu_device *vpu_dev = inst->dev;
  554. *fail_res = 0;
  555. if (!inst->codec_info)
  556. return -EINVAL;
  557. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  558. if (ret)
  559. return ret;
  560. do {
  561. ret = wave5_vpu_enc_finish_seq(inst, fail_res);
  562. if (ret < 0 && *fail_res != WAVE5_SYSERR_VPU_STILL_RUNNING) {
  563. dev_warn(inst->dev->dev, "enc_finish_seq timed out\n");
  564. mutex_unlock(&vpu_dev->hw_lock);
  565. return ret;
  566. }
  567. if (*fail_res == WAVE5_SYSERR_VPU_STILL_RUNNING &&
  568. retry++ >= MAX_FIRMWARE_CALL_RETRY) {
  569. mutex_unlock(&vpu_dev->hw_lock);
  570. return -ETIMEDOUT;
  571. }
  572. } while (ret != 0);
  573. dev_dbg(inst->dev->dev, "%s: enc_finish_seq complete\n", __func__);
  574. wave5_vdi_free_dma_memory(vpu_dev, &p_enc_info->vb_work);
  575. if (inst->std == W_HEVC_ENC || inst->std == W_AVC_ENC) {
  576. wave5_vdi_free_dma_memory(vpu_dev, &p_enc_info->vb_sub_sam_buf);
  577. wave5_vdi_free_dma_memory(vpu_dev, &p_enc_info->vb_mv);
  578. wave5_vdi_free_dma_memory(vpu_dev, &p_enc_info->vb_fbc_y_tbl);
  579. wave5_vdi_free_dma_memory(vpu_dev, &p_enc_info->vb_fbc_c_tbl);
  580. }
  581. wave5_vdi_free_dma_memory(vpu_dev, &p_enc_info->vb_task);
  582. mutex_unlock(&vpu_dev->hw_lock);
  583. return 0;
  584. }
  585. int wave5_vpu_enc_register_frame_buffer(struct vpu_instance *inst, unsigned int num,
  586. unsigned int stride, int height,
  587. enum tiled_map_type map_type)
  588. {
  589. struct enc_info *p_enc_info = &inst->codec_info->enc_info;
  590. int ret;
  591. struct vpu_device *vpu_dev = inst->dev;
  592. unsigned int size_luma, size_chroma;
  593. int i;
  594. if (p_enc_info->stride)
  595. return -EINVAL;
  596. if (!p_enc_info->initial_info_obtained)
  597. return -EINVAL;
  598. if (num < p_enc_info->initial_info.min_frame_buffer_count)
  599. return -EINVAL;
  600. if (stride == 0 || stride % 8 != 0)
  601. return -EINVAL;
  602. if (height <= 0)
  603. return -EINVAL;
  604. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  605. if (ret)
  606. return ret;
  607. p_enc_info->num_frame_buffers = num;
  608. p_enc_info->stride = stride;
  609. size_luma = stride * height;
  610. size_chroma = ALIGN(stride / 2, 16) * height;
  611. for (i = 0; i < num; i++) {
  612. if (!inst->frame_buf[i].update_fb_info)
  613. continue;
  614. inst->frame_buf[i].update_fb_info = false;
  615. inst->frame_buf[i].stride = stride;
  616. inst->frame_buf[i].height = height;
  617. inst->frame_buf[i].map_type = COMPRESSED_FRAME_MAP;
  618. inst->frame_buf[i].buf_y_size = size_luma;
  619. inst->frame_buf[i].buf_cb = inst->frame_buf[i].buf_y + size_luma;
  620. inst->frame_buf[i].buf_cb_size = size_chroma;
  621. inst->frame_buf[i].buf_cr_size = 0;
  622. }
  623. ret = wave5_vpu_enc_register_framebuffer(inst->dev->dev, inst, &inst->frame_buf[0],
  624. COMPRESSED_FRAME_MAP,
  625. p_enc_info->num_frame_buffers);
  626. mutex_unlock(&vpu_dev->hw_lock);
  627. return ret;
  628. }
  629. static int wave5_check_enc_param(struct vpu_instance *inst, struct enc_param *param)
  630. {
  631. struct enc_info *p_enc_info = &inst->codec_info->enc_info;
  632. if (!param)
  633. return -EINVAL;
  634. if (!param->source_frame)
  635. return -EINVAL;
  636. if (p_enc_info->open_param.bit_rate == 0 && inst->std == W_HEVC_ENC) {
  637. if (param->pic_stream_buffer_addr % 16 || param->pic_stream_buffer_size == 0)
  638. return -EINVAL;
  639. }
  640. if (param->pic_stream_buffer_addr % 8 || param->pic_stream_buffer_size == 0)
  641. return -EINVAL;
  642. return 0;
  643. }
  644. int wave5_vpu_enc_start_one_frame(struct vpu_instance *inst, struct enc_param *param, u32 *fail_res)
  645. {
  646. struct enc_info *p_enc_info = &inst->codec_info->enc_info;
  647. int ret;
  648. struct vpu_device *vpu_dev = inst->dev;
  649. *fail_res = 0;
  650. if (p_enc_info->stride == 0) /* this means frame buffers have not been registered. */
  651. return -EINVAL;
  652. ret = wave5_check_enc_param(inst, param);
  653. if (ret)
  654. return ret;
  655. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  656. if (ret)
  657. return ret;
  658. p_enc_info->pts_map[param->src_idx] = param->pts;
  659. ret = wave5_vpu_encode(inst, param, fail_res);
  660. mutex_unlock(&vpu_dev->hw_lock);
  661. return ret;
  662. }
  663. int wave5_vpu_enc_get_output_info(struct vpu_instance *inst, struct enc_output_info *info)
  664. {
  665. struct enc_info *p_enc_info = &inst->codec_info->enc_info;
  666. int ret;
  667. struct vpu_device *vpu_dev = inst->dev;
  668. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  669. if (ret)
  670. return ret;
  671. ret = wave5_vpu_enc_get_result(inst, info);
  672. if (ret) {
  673. info->pts = 0;
  674. goto unlock;
  675. }
  676. if (info->recon_frame_index >= 0)
  677. info->pts = p_enc_info->pts_map[info->enc_src_idx];
  678. unlock:
  679. mutex_unlock(&vpu_dev->hw_lock);
  680. return ret;
  681. }
  682. int wave5_vpu_enc_give_command(struct vpu_instance *inst, enum codec_command cmd, void *parameter)
  683. {
  684. struct enc_info *p_enc_info = &inst->codec_info->enc_info;
  685. switch (cmd) {
  686. case ENABLE_ROTATION:
  687. p_enc_info->rotation_enable = true;
  688. break;
  689. case ENABLE_MIRRORING:
  690. p_enc_info->mirror_enable = true;
  691. break;
  692. case SET_MIRROR_DIRECTION: {
  693. enum mirror_direction mir_dir;
  694. mir_dir = *(enum mirror_direction *)parameter;
  695. if (mir_dir != MIRDIR_NONE && mir_dir != MIRDIR_HOR &&
  696. mir_dir != MIRDIR_VER && mir_dir != MIRDIR_HOR_VER)
  697. return -EINVAL;
  698. p_enc_info->mirror_direction = mir_dir;
  699. break;
  700. }
  701. case SET_ROTATION_ANGLE: {
  702. int angle;
  703. angle = *(int *)parameter;
  704. if (angle && angle != 90 && angle != 180 && angle != 270)
  705. return -EINVAL;
  706. if (p_enc_info->initial_info_obtained && (angle == 90 || angle == 270))
  707. return -EINVAL;
  708. p_enc_info->rotation_angle = angle;
  709. break;
  710. }
  711. case ENC_GET_QUEUE_STATUS: {
  712. struct queue_status_info *queue_info = parameter;
  713. queue_info->instance_queue_count = p_enc_info->instance_queue_count;
  714. queue_info->report_queue_count = p_enc_info->report_queue_count;
  715. break;
  716. }
  717. default:
  718. return -EINVAL;
  719. }
  720. return 0;
  721. }
  722. int wave5_vpu_enc_issue_seq_init(struct vpu_instance *inst)
  723. {
  724. int ret;
  725. struct vpu_device *vpu_dev = inst->dev;
  726. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  727. if (ret)
  728. return ret;
  729. ret = wave5_vpu_enc_init_seq(inst);
  730. mutex_unlock(&vpu_dev->hw_lock);
  731. return ret;
  732. }
  733. int wave5_vpu_enc_complete_seq_init(struct vpu_instance *inst, struct enc_initial_info *info)
  734. {
  735. struct enc_info *p_enc_info = &inst->codec_info->enc_info;
  736. int ret;
  737. struct vpu_device *vpu_dev = inst->dev;
  738. if (!info)
  739. return -EINVAL;
  740. ret = mutex_lock_interruptible(&vpu_dev->hw_lock);
  741. if (ret)
  742. return ret;
  743. ret = wave5_vpu_enc_get_seq_info(inst, info);
  744. if (ret) {
  745. p_enc_info->initial_info_obtained = false;
  746. mutex_unlock(&vpu_dev->hw_lock);
  747. return ret;
  748. }
  749. p_enc_info->initial_info_obtained = true;
  750. p_enc_info->initial_info = *info;
  751. mutex_unlock(&vpu_dev->hw_lock);
  752. return 0;
  753. }