hfi_packet.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020, The Linux Foundation. All rights reserved.
  4. */
  5. #include "hfi_packet.h"
  6. #include "msm_vidc_core.h"
  7. #include "msm_vidc_inst.h"
  8. #include "msm_vidc_driver.h"
  9. #include "msm_vidc_debug.h"
  10. #include "msm_vidc_platform.h"
  11. u32 get_hfi_port(struct msm_vidc_inst *inst,
  12. enum msm_vidc_port_type port)
  13. {
  14. u32 hfi_port = HFI_PORT_NONE;
  15. if (is_decode_session(inst)) {
  16. switch(port) {
  17. case INPUT_PORT:
  18. case INPUT_META_PORT:
  19. hfi_port = HFI_PORT_BITSTREAM;
  20. break;
  21. case OUTPUT_PORT:
  22. case OUTPUT_META_PORT:
  23. hfi_port = HFI_PORT_RAW;
  24. break;
  25. default:
  26. s_vpr_e(inst->sid, "%s: invalid port type %d\n",
  27. __func__, port);
  28. break;
  29. }
  30. } else if (is_encode_session(inst)) {
  31. switch (port) {
  32. case INPUT_PORT:
  33. case INPUT_META_PORT:
  34. hfi_port = HFI_PORT_RAW;
  35. break;
  36. case OUTPUT_PORT:
  37. case OUTPUT_META_PORT:
  38. hfi_port = HFI_PORT_BITSTREAM;
  39. break;
  40. default:
  41. s_vpr_e(inst->sid, "%s: invalid port type %d\n",
  42. __func__, port);
  43. break;
  44. }
  45. } else {
  46. s_vpr_e(inst->sid, "%s: invalid domain %#x\n",
  47. __func__, inst->domain);
  48. }
  49. return hfi_port;
  50. }
  51. u32 get_hfi_port_from_buffer_type(struct msm_vidc_inst *inst,
  52. enum msm_vidc_buffer_type buffer_type)
  53. {
  54. u32 hfi_port = HFI_PORT_NONE;
  55. if (is_decode_session(inst)) {
  56. switch(buffer_type) {
  57. case MSM_VIDC_BUF_INPUT:
  58. case MSM_VIDC_BUF_INPUT_META:
  59. case MSM_VIDC_BUF_BIN:
  60. case MSM_VIDC_BUF_COMV:
  61. case MSM_VIDC_BUF_NON_COMV:
  62. case MSM_VIDC_BUF_LINE:
  63. case MSM_VIDC_BUF_DPB:
  64. hfi_port = HFI_PORT_BITSTREAM;
  65. break;
  66. case MSM_VIDC_BUF_PERSIST:
  67. hfi_port = HFI_PORT_BITSTREAM | HFI_PORT_RAW;
  68. break;
  69. case MSM_VIDC_BUF_OUTPUT:
  70. case MSM_VIDC_BUF_OUTPUT_META:
  71. hfi_port = HFI_PORT_RAW;
  72. break;
  73. default:
  74. s_vpr_e(inst->sid, "%s: invalid buffer type %d\n",
  75. __func__, buffer_type);
  76. break;
  77. }
  78. } else if (is_encode_session(inst)) {
  79. switch (buffer_type) {
  80. case MSM_VIDC_BUF_INPUT:
  81. case MSM_VIDC_BUF_INPUT_META:
  82. case MSM_VIDC_BUF_BIN:
  83. case MSM_VIDC_BUF_ARP:
  84. case MSM_VIDC_BUF_COMV:
  85. case MSM_VIDC_BUF_NON_COMV:
  86. case MSM_VIDC_BUF_LINE:
  87. case MSM_VIDC_BUF_DPB:
  88. hfi_port = HFI_PORT_RAW;
  89. break;
  90. case MSM_VIDC_BUF_PERSIST:
  91. hfi_port = HFI_PORT_BITSTREAM | HFI_PORT_RAW;
  92. break;
  93. case MSM_VIDC_BUF_OUTPUT:
  94. case MSM_VIDC_BUF_OUTPUT_META:
  95. hfi_port = HFI_PORT_BITSTREAM;
  96. break;
  97. default:
  98. s_vpr_e(inst->sid, "%s: invalid buffer type %d\n",
  99. __func__, buffer_type);
  100. break;
  101. }
  102. } else {
  103. s_vpr_e(inst->sid, "%s: invalid domain %#x\n",
  104. __func__, inst->domain);
  105. }
  106. return hfi_port;
  107. }
  108. u32 get_hfi_buffer_type(enum msm_vidc_domain_type domain,
  109. enum msm_vidc_buffer_type buffer_type)
  110. {
  111. switch (buffer_type) {
  112. case MSM_VIDC_BUF_INPUT:
  113. if (domain == MSM_VIDC_DECODER)
  114. return HFI_BUFFER_BITSTREAM;
  115. else
  116. return HFI_BUFFER_RAW;
  117. case MSM_VIDC_BUF_OUTPUT:
  118. if (domain == MSM_VIDC_DECODER)
  119. return HFI_BUFFER_RAW;
  120. else
  121. return HFI_BUFFER_BITSTREAM;
  122. case MSM_VIDC_BUF_INPUT_META:
  123. case MSM_VIDC_BUF_OUTPUT_META:
  124. return HFI_BUFFER_METADATA;
  125. case MSM_VIDC_BUF_BIN:
  126. return HFI_BUFFER_BIN;
  127. case MSM_VIDC_BUF_ARP:
  128. return HFI_BUFFER_ARP;
  129. case MSM_VIDC_BUF_COMV:
  130. return HFI_BUFFER_COMV;
  131. case MSM_VIDC_BUF_NON_COMV:
  132. return HFI_BUFFER_NON_COMV;
  133. case MSM_VIDC_BUF_LINE:
  134. return HFI_BUFFER_LINE;
  135. case MSM_VIDC_BUF_DPB:
  136. return HFI_BUFFER_DPB;
  137. case MSM_VIDC_BUF_PERSIST:
  138. return HFI_BUFFER_PERSIST;
  139. default:
  140. d_vpr_e("invalid buffer type %d\n",
  141. buffer_type);
  142. return 0;
  143. }
  144. }
  145. u32 get_hfi_codec(struct msm_vidc_inst *inst)
  146. {
  147. switch (inst->codec) {
  148. case MSM_VIDC_H264:
  149. if (inst->domain == MSM_VIDC_ENCODER)
  150. return HFI_CODEC_ENCODE_AVC;
  151. else
  152. return HFI_CODEC_DECODE_AVC;
  153. case MSM_VIDC_HEVC:
  154. if (inst->domain == MSM_VIDC_ENCODER)
  155. return HFI_CODEC_ENCODE_HEVC;
  156. else
  157. return HFI_CODEC_DECODE_HEVC;
  158. case MSM_VIDC_VP9:
  159. return HFI_CODEC_DECODE_VP9;
  160. default:
  161. d_vpr_e("invalid codec %d, domain %d\n",
  162. inst->codec, inst->domain);
  163. return 0;
  164. }
  165. }
  166. u32 get_hfi_colorformat(struct msm_vidc_inst *inst,
  167. enum msm_vidc_colorformat_type colorformat)
  168. {
  169. u32 hfi_colorformat = HFI_COLOR_FMT_NV12_UBWC;
  170. switch(colorformat) {
  171. case MSM_VIDC_FMT_NV12:
  172. hfi_colorformat = HFI_COLOR_FMT_NV12;
  173. break;
  174. case MSM_VIDC_FMT_NV12C:
  175. hfi_colorformat = HFI_COLOR_FMT_NV12_UBWC;
  176. break;
  177. case MSM_VIDC_FMT_P010:
  178. hfi_colorformat = HFI_COLOR_FMT_P010;
  179. break;
  180. case MSM_VIDC_FMT_TP10C:
  181. hfi_colorformat = HFI_COLOR_FMT_TP10_UBWC;
  182. break;
  183. case MSM_VIDC_FMT_RGBA8888:
  184. hfi_colorformat = HFI_COLOR_FMT_RGBA8888;
  185. break;
  186. case MSM_VIDC_FMT_RGBA8888C:
  187. hfi_colorformat = HFI_COLOR_FMT_RGBA8888_UBWC;
  188. break;
  189. case MSM_VIDC_FMT_NV21:
  190. hfi_colorformat = HFI_COLOR_FMT_NV21;
  191. break;
  192. default:
  193. s_vpr_e(inst->sid, "%s: invalid colorformat %d\n",
  194. __func__, colorformat);
  195. break;
  196. }
  197. return hfi_colorformat;
  198. }
  199. u32 get_hfi_quality_mode(struct msm_vidc_inst *inst)
  200. {
  201. u32 hfi_mode = HFI_MODE_POWER_SAVE;
  202. if (!inst || !inst->capabilities) {
  203. d_vpr_e("%s: invalid params\n", __func__);
  204. goto exit;
  205. }
  206. switch(inst->capabilities->cap[QUALITY_MODE].value) {
  207. case MSM_VIDC_MAX_QUALITY_MODE:
  208. hfi_mode = HFI_MODE_MAX_QUALITY;
  209. break;
  210. case MSM_VIDC_POWER_SAVE_MODE:
  211. hfi_mode = HFI_MODE_POWER_SAVE;
  212. break;
  213. default:
  214. s_vpr_e(inst->sid, "%s: invalid qulity mode %d\n", __func__,
  215. inst->capabilities->cap[QUALITY_MODE].value);
  216. break;
  217. }
  218. exit:
  219. return hfi_mode;
  220. }
  221. int get_hfi_buffer(struct msm_vidc_inst *inst,
  222. struct msm_vidc_buffer *buffer, struct hfi_buffer *buf)
  223. {
  224. if (!inst || !buffer || !buf) {
  225. d_vpr_e("%s: invalid params\n", __func__);
  226. return -EINVAL;
  227. }
  228. memset(buf, 0, sizeof(struct hfi_buffer));
  229. buf->type = get_hfi_buffer_type(inst->domain, buffer->type);
  230. buf->index = buffer->index;
  231. buf->base_address = buffer->device_addr;
  232. buf->addr_offset = 0;
  233. buf->buffer_size = buffer->buffer_size;
  234. buf->data_offset = buffer->data_offset;
  235. buf->data_size = buffer->data_size;
  236. if (buffer->attr & MSM_VIDC_ATTR_READ_ONLY)
  237. buf->flags |= HFI_BUF_HOST_FLAG_READONLY;
  238. if (buffer->attr & MSM_VIDC_ATTR_PENDING_RELEASE)
  239. buf->flags |= HFI_BUF_HOST_FLAG_RELEASE;
  240. if (buffer->flags & MSM_VIDC_BUF_FLAG_CODECCONFIG)
  241. buf->flags |= HFI_BUF_HOST_FLAG_CODEC_CONFIG;
  242. buf->timestamp = buffer->timestamp;
  243. return 0;
  244. }
  245. int hfi_create_header(u8 *packet, u32 packet_size, u32 session_id,
  246. u32 header_id)
  247. {
  248. struct hfi_header *hdr = (struct hfi_header *)packet;
  249. if (!packet || packet_size < sizeof(struct hfi_header)) {
  250. d_vpr_e("%s: invalid params\n", __func__);
  251. return -EINVAL;
  252. }
  253. memset(hdr, 0, sizeof(struct hfi_header));
  254. hdr->size = sizeof(struct hfi_header);
  255. hdr->session_id = session_id;
  256. hdr->header_id = header_id;
  257. hdr->num_packets = 0;
  258. return 0;
  259. }
  260. int hfi_create_packet(u8 *packet, u32 packet_size,
  261. u32 pkt_type, u32 pkt_flags, u32 payload_type, u32 port,
  262. u32 packet_id, void *payload, u32 payload_size)
  263. {
  264. struct hfi_header *hdr;
  265. struct hfi_packet *pkt;
  266. u32 pkt_size;
  267. if (!packet) {
  268. d_vpr_e("%s: invalid params\n", __func__);
  269. return -EINVAL;
  270. }
  271. hdr = (struct hfi_header *)packet;
  272. if (hdr->size < sizeof(struct hfi_header)) {
  273. d_vpr_e("%s: invalid hdr size %d\n", __func__, hdr->size);
  274. return -EINVAL;
  275. }
  276. pkt = (struct hfi_packet *)(packet + hdr->size);
  277. pkt_size = sizeof(struct hfi_packet) + payload_size;
  278. if (packet_size < hdr->size + pkt_size) {
  279. d_vpr_e("%s: invalid packet_size %d, %d %d\n",
  280. __func__, packet_size, hdr->size, pkt_size);
  281. return -EINVAL;
  282. }
  283. memset(pkt, 0, pkt_size);
  284. pkt->size = pkt_size;
  285. pkt->type = pkt_type;
  286. pkt->flags = pkt_flags;
  287. pkt->payload_info = payload_type;
  288. pkt->port = port;
  289. pkt->packet_id = packet_id;
  290. if (payload_size)
  291. memcpy((u8 *)pkt + sizeof(struct hfi_packet),
  292. payload, payload_size);
  293. hdr->num_packets++;
  294. hdr->size += pkt->size;
  295. return 0;
  296. }
  297. int hfi_packet_sys_init(struct msm_vidc_core *core,
  298. u8 *pkt, u32 pkt_size)
  299. {
  300. int rc = 0;
  301. u32 payload = 0;
  302. if (!core || !pkt) {
  303. d_vpr_e("%s: Invalid params\n", __func__);
  304. return -EINVAL;
  305. }
  306. rc = hfi_create_header(pkt, pkt_size,
  307. 0 /*session_id*/,
  308. core->header_id++);
  309. if (rc)
  310. goto err_sys_init;
  311. /* HFI_CMD_SYSTEM_INIT */
  312. payload = HFI_VIDEO_ARCH_LX;
  313. d_vpr_h("%s: arch %d\n", __func__, payload);
  314. rc = hfi_create_packet(pkt, pkt_size,
  315. HFI_CMD_INIT,
  316. (HFI_HOST_FLAGS_RESPONSE_REQUIRED |
  317. HFI_HOST_FLAGS_INTR_REQUIRED |
  318. HFI_HOST_FLAGS_NON_DISCARDABLE),
  319. HFI_PAYLOAD_U32,
  320. HFI_PORT_NONE,
  321. core->packet_id++,
  322. &payload,
  323. sizeof(u32));
  324. if (rc)
  325. goto err_sys_init;
  326. /* HFI_PROP_INTRA_FRAME_POWER_COLLAPSE */
  327. payload = 0;
  328. d_vpr_h("%s: intra frame power collapse %d\n", __func__, payload);
  329. rc = hfi_create_packet(pkt, pkt_size,
  330. HFI_PROP_INTRA_FRAME_POWER_COLLAPSE,
  331. HFI_HOST_FLAGS_NONE,
  332. HFI_PAYLOAD_U32,
  333. HFI_PORT_NONE,
  334. core->packet_id++,
  335. &payload,
  336. sizeof(u32));
  337. if (rc)
  338. goto err_sys_init;
  339. /* HFI_PROP_UBWC_MAX_CHANNELS */
  340. payload = core->platform->data.ubwc_config->max_channels;
  341. d_vpr_h("%s: ubwc max channels %d\n", __func__, payload);
  342. rc = hfi_create_packet(pkt, pkt_size,
  343. HFI_PROP_UBWC_MAX_CHANNELS,
  344. HFI_HOST_FLAGS_NONE,
  345. HFI_PAYLOAD_U32,
  346. HFI_PORT_NONE,
  347. core->packet_id++,
  348. &payload,
  349. sizeof(u32));
  350. if (rc)
  351. goto err_sys_init;
  352. /* HFI_PROP_UBWC_MAL_LENGTH */
  353. payload = core->platform->data.ubwc_config->mal_length;
  354. d_vpr_h("%s: ubwc mal length %d\n", __func__, payload);
  355. rc = hfi_create_packet(pkt, pkt_size,
  356. HFI_PROP_UBWC_MAL_LENGTH,
  357. HFI_HOST_FLAGS_NONE,
  358. HFI_PAYLOAD_U32,
  359. HFI_PORT_NONE,
  360. core->packet_id++,
  361. &payload,
  362. sizeof(u32));
  363. if (rc)
  364. goto err_sys_init;
  365. /* HFI_PROP_UBWC_HBB */
  366. payload = core->platform->data.ubwc_config->highest_bank_bit;
  367. d_vpr_h("%s: ubwc hbb %d\n", __func__, payload);
  368. rc = hfi_create_packet(pkt, pkt_size,
  369. HFI_PROP_UBWC_HBB,
  370. HFI_HOST_FLAGS_NONE,
  371. HFI_PAYLOAD_U32,
  372. HFI_PORT_NONE,
  373. core->packet_id++,
  374. &payload,
  375. sizeof(u32));
  376. if (rc)
  377. goto err_sys_init;
  378. /* HFI_PROP_UBWC_BANK_SWZL_LEVEL1 */
  379. payload = core->platform->data.ubwc_config->bank_swzl_level;
  380. d_vpr_h("%s: ubwc swzl1 %d\n", __func__, payload);
  381. rc = hfi_create_packet(pkt, pkt_size,
  382. HFI_PROP_UBWC_BANK_SWZL_LEVEL1,
  383. HFI_HOST_FLAGS_NONE,
  384. HFI_PAYLOAD_U32,
  385. HFI_PORT_NONE,
  386. core->packet_id++,
  387. &payload,
  388. sizeof(u32));
  389. if (rc)
  390. goto err_sys_init;
  391. /* HFI_PROP_UBWC_BANK_SWZL_LEVEL2 */
  392. payload = core->platform->data.ubwc_config->bank_swz2_level;
  393. d_vpr_h("%s: ubwc swzl2 %d\n", __func__, payload);
  394. rc = hfi_create_packet(pkt, pkt_size,
  395. HFI_PROP_UBWC_BANK_SWZL_LEVEL2,
  396. HFI_HOST_FLAGS_NONE,
  397. HFI_PAYLOAD_U32,
  398. HFI_PORT_NONE,
  399. core->packet_id++,
  400. &payload,
  401. sizeof(u32));
  402. if (rc)
  403. goto err_sys_init;
  404. /* HFI_PROP_UBWC_BANK_SWZL_LEVEL3 */
  405. payload = core->platform->data.ubwc_config->bank_swz3_level;
  406. d_vpr_h("%s: ubwc swzl3 %d\n", __func__, payload);
  407. rc = hfi_create_packet(pkt, pkt_size,
  408. HFI_PROP_UBWC_BANK_SWZL_LEVEL3,
  409. HFI_HOST_FLAGS_NONE,
  410. HFI_PAYLOAD_U32,
  411. HFI_PORT_NONE,
  412. core->packet_id++,
  413. &payload,
  414. sizeof(u32));
  415. if (rc)
  416. goto err_sys_init;
  417. /* HFI_PROP_UBWC_BANK_SPREADING */
  418. payload = core->platform->data.ubwc_config->bank_spreading;
  419. d_vpr_h("%s: ubwc bank spreading %d\n", __func__, payload);
  420. rc = hfi_create_packet(pkt, pkt_size,
  421. HFI_PROP_UBWC_BANK_SPREADING,
  422. HFI_HOST_FLAGS_NONE,
  423. HFI_PAYLOAD_U32,
  424. HFI_PORT_NONE,
  425. core->packet_id++,
  426. &payload,
  427. sizeof(u32));
  428. if (rc)
  429. goto err_sys_init;
  430. d_vpr_h("System init packet created\n");
  431. return rc;
  432. err_sys_init:
  433. d_vpr_e("%s: create packet failed\n", __func__);
  434. return rc;
  435. }
  436. int hfi_packet_image_version(struct msm_vidc_core *core,
  437. u8 *pkt, u32 pkt_size)
  438. {
  439. int rc = 0;
  440. if (!core || !pkt) {
  441. d_vpr_e("%s: Invalid params\n", __func__);
  442. return -EINVAL;
  443. }
  444. rc = hfi_create_header(pkt, pkt_size,
  445. 0 /*session_id*/,
  446. core->header_id++);
  447. if (rc)
  448. goto err_img_version;
  449. /* HFI_PROP_IMAGE_VERSION */
  450. rc = hfi_create_packet(pkt, pkt_size,
  451. HFI_PROP_IMAGE_VERSION,
  452. (HFI_HOST_FLAGS_RESPONSE_REQUIRED |
  453. HFI_HOST_FLAGS_INTR_REQUIRED |
  454. HFI_HOST_FLAGS_GET_PROPERTY),
  455. HFI_PAYLOAD_NONE,
  456. HFI_PORT_NONE,
  457. core->packet_id++,
  458. NULL, 0);
  459. if (rc)
  460. goto err_img_version;
  461. d_vpr_h("Image version packet created\n");
  462. return rc;
  463. err_img_version:
  464. d_vpr_e("%s: create packet failed\n", __func__);
  465. return rc;
  466. }
  467. int hfi_packet_sys_pc_prep(struct msm_vidc_core *core,
  468. u8 *pkt, u32 pkt_size)
  469. {
  470. int rc = 0;
  471. if (!core || !pkt) {
  472. d_vpr_e("%s: Invalid params\n", __func__);
  473. return -EINVAL;
  474. }
  475. rc = hfi_create_header(pkt, pkt_size,
  476. 0 /*session_id*/,
  477. core->header_id++);
  478. if (rc)
  479. goto err_sys_pc;
  480. /* HFI_CMD_POWER_COLLAPSE */
  481. rc = hfi_create_packet(pkt, pkt_size,
  482. HFI_CMD_POWER_COLLAPSE,
  483. HFI_HOST_FLAGS_NONE,
  484. HFI_PAYLOAD_NONE,
  485. HFI_PORT_NONE,
  486. core->packet_id++,
  487. NULL, 0);
  488. if (rc)
  489. goto err_sys_pc;
  490. d_vpr_h("Power collapse packet created\n");
  491. return rc;
  492. err_sys_pc:
  493. d_vpr_e("%s: create packet failed\n", __func__);
  494. return rc;
  495. }
  496. int hfi_packet_sys_debug_config(struct msm_vidc_core *core,
  497. u8 *pkt, u32 pkt_size, u32 debug_config)
  498. {
  499. int rc = 0;
  500. u32 payload = 0;
  501. if (!core || !pkt) {
  502. d_vpr_e("%s: Invalid params\n", __func__);
  503. return -EINVAL;
  504. }
  505. rc = hfi_create_header(pkt, pkt_size,
  506. 0 /*session_id*/,
  507. core->header_id++);
  508. if (rc)
  509. goto err_debug;
  510. /* HFI_PROP_DEBUG_CONFIG */
  511. payload = 0; /*TODO:Change later*/
  512. rc = hfi_create_packet(pkt, pkt_size,
  513. HFI_PROP_DEBUG_CONFIG,
  514. HFI_HOST_FLAGS_NONE,
  515. HFI_PAYLOAD_U32_ENUM,
  516. HFI_PORT_NONE,
  517. core->packet_id++,
  518. &payload,
  519. sizeof(u32));
  520. if (rc)
  521. goto err_debug;
  522. /* HFI_PROP_DEBUG_LOG_LEVEL */
  523. payload = debug_config; /*TODO:Change later*/
  524. rc = hfi_create_packet(pkt, pkt_size,
  525. HFI_PROP_DEBUG_LOG_LEVEL,
  526. HFI_HOST_FLAGS_NONE,
  527. HFI_PAYLOAD_U32_ENUM,
  528. HFI_PORT_NONE,
  529. core->packet_id++,
  530. &payload,
  531. sizeof(u32));
  532. if (rc)
  533. goto err_debug;
  534. d_vpr_h("Debug packet created\n");
  535. return rc;
  536. err_debug:
  537. d_vpr_e("%s: create packet failed\n", __func__);
  538. return rc;
  539. }
  540. int hfi_packet_session_command(struct msm_vidc_inst *inst,
  541. u32 pkt_type, u32 flags, u32 port, u32 session_id,
  542. u32 payload_type, void *payload, u32 payload_size)
  543. {
  544. int rc = 0;
  545. struct msm_vidc_core *core;
  546. if (!inst || !inst->core) {
  547. d_vpr_e("%s: Invalid params\n", __func__);
  548. return -EINVAL;
  549. }
  550. core = inst->core;
  551. rc = hfi_create_header(inst->packet, inst->packet_size,
  552. session_id,
  553. core->header_id++);
  554. if (rc)
  555. goto err_cmd;
  556. rc = hfi_create_packet(inst->packet,
  557. inst->packet_size,
  558. pkt_type,
  559. flags,
  560. payload_type,
  561. port,
  562. core->packet_id++,
  563. payload,
  564. payload_size);
  565. if (rc)
  566. goto err_cmd;
  567. d_vpr_h("Command packet 0x%x created\n", pkt_type);
  568. return rc;
  569. err_cmd:
  570. d_vpr_e("%s: create packet failed\n", __func__);
  571. return rc;
  572. }