hfi_packet.c 17 KB

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