hfi_cmds.c 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250
  1. /*
  2. * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
  3. * Copyright (C) 2017 Linaro Ltd.
  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 and
  7. * only version 2 as 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. */
  15. #include <linux/errno.h>
  16. #include <linux/hash.h>
  17. #include "hfi_cmds.h"
  18. static enum hfi_version hfi_ver;
  19. void pkt_sys_init(struct hfi_sys_init_pkt *pkt, u32 arch_type)
  20. {
  21. pkt->hdr.size = sizeof(*pkt);
  22. pkt->hdr.pkt_type = HFI_CMD_SYS_INIT;
  23. pkt->arch_type = arch_type;
  24. }
  25. void pkt_sys_pc_prep(struct hfi_sys_pc_prep_pkt *pkt)
  26. {
  27. pkt->hdr.size = sizeof(*pkt);
  28. pkt->hdr.pkt_type = HFI_CMD_SYS_PC_PREP;
  29. }
  30. void pkt_sys_idle_indicator(struct hfi_sys_set_property_pkt *pkt, u32 enable)
  31. {
  32. struct hfi_enable *hfi = (struct hfi_enable *)&pkt->data[1];
  33. pkt->hdr.size = sizeof(*pkt) + sizeof(*hfi) + sizeof(u32);
  34. pkt->hdr.pkt_type = HFI_CMD_SYS_SET_PROPERTY;
  35. pkt->num_properties = 1;
  36. pkt->data[0] = HFI_PROPERTY_SYS_IDLE_INDICATOR;
  37. hfi->enable = enable;
  38. }
  39. void pkt_sys_debug_config(struct hfi_sys_set_property_pkt *pkt, u32 mode,
  40. u32 config)
  41. {
  42. struct hfi_debug_config *hfi;
  43. pkt->hdr.size = sizeof(*pkt) + sizeof(*hfi) + sizeof(u32);
  44. pkt->hdr.pkt_type = HFI_CMD_SYS_SET_PROPERTY;
  45. pkt->num_properties = 1;
  46. pkt->data[0] = HFI_PROPERTY_SYS_DEBUG_CONFIG;
  47. hfi = (struct hfi_debug_config *)&pkt->data[1];
  48. hfi->config = config;
  49. hfi->mode = mode;
  50. }
  51. void pkt_sys_coverage_config(struct hfi_sys_set_property_pkt *pkt, u32 mode)
  52. {
  53. pkt->hdr.size = sizeof(*pkt) + sizeof(u32);
  54. pkt->hdr.pkt_type = HFI_CMD_SYS_SET_PROPERTY;
  55. pkt->num_properties = 1;
  56. pkt->data[0] = HFI_PROPERTY_SYS_CONFIG_COVERAGE;
  57. pkt->data[1] = mode;
  58. }
  59. int pkt_sys_set_resource(struct hfi_sys_set_resource_pkt *pkt, u32 id, u32 size,
  60. u32 addr, void *cookie)
  61. {
  62. pkt->hdr.size = sizeof(*pkt);
  63. pkt->hdr.pkt_type = HFI_CMD_SYS_SET_RESOURCE;
  64. pkt->resource_handle = hash32_ptr(cookie);
  65. switch (id) {
  66. case VIDC_RESOURCE_OCMEM:
  67. case VIDC_RESOURCE_VMEM: {
  68. struct hfi_resource_ocmem *res =
  69. (struct hfi_resource_ocmem *)&pkt->resource_data[0];
  70. res->size = size;
  71. res->mem = addr;
  72. pkt->resource_type = HFI_RESOURCE_OCMEM;
  73. pkt->hdr.size += sizeof(*res) - sizeof(u32);
  74. break;
  75. }
  76. case VIDC_RESOURCE_NONE:
  77. default:
  78. return -ENOTSUPP;
  79. }
  80. return 0;
  81. }
  82. int pkt_sys_unset_resource(struct hfi_sys_release_resource_pkt *pkt, u32 id,
  83. u32 size, void *cookie)
  84. {
  85. pkt->hdr.size = sizeof(*pkt);
  86. pkt->hdr.pkt_type = HFI_CMD_SYS_RELEASE_RESOURCE;
  87. pkt->resource_handle = hash32_ptr(cookie);
  88. switch (id) {
  89. case VIDC_RESOURCE_OCMEM:
  90. case VIDC_RESOURCE_VMEM:
  91. pkt->resource_type = HFI_RESOURCE_OCMEM;
  92. break;
  93. case VIDC_RESOURCE_NONE:
  94. break;
  95. default:
  96. return -ENOTSUPP;
  97. }
  98. return 0;
  99. }
  100. void pkt_sys_ping(struct hfi_sys_ping_pkt *pkt, u32 cookie)
  101. {
  102. pkt->hdr.size = sizeof(*pkt);
  103. pkt->hdr.pkt_type = HFI_CMD_SYS_PING;
  104. pkt->client_data = cookie;
  105. }
  106. void pkt_sys_power_control(struct hfi_sys_set_property_pkt *pkt, u32 enable)
  107. {
  108. struct hfi_enable *hfi = (struct hfi_enable *)&pkt->data[1];
  109. pkt->hdr.size = sizeof(*pkt) + sizeof(*hfi) + sizeof(u32);
  110. pkt->hdr.pkt_type = HFI_CMD_SYS_SET_PROPERTY;
  111. pkt->num_properties = 1;
  112. pkt->data[0] = HFI_PROPERTY_SYS_CODEC_POWER_PLANE_CTRL;
  113. hfi->enable = enable;
  114. }
  115. int pkt_sys_ssr_cmd(struct hfi_sys_test_ssr_pkt *pkt, u32 trigger_type)
  116. {
  117. switch (trigger_type) {
  118. case HFI_TEST_SSR_SW_ERR_FATAL:
  119. case HFI_TEST_SSR_SW_DIV_BY_ZERO:
  120. case HFI_TEST_SSR_HW_WDOG_IRQ:
  121. break;
  122. default:
  123. return -EINVAL;
  124. }
  125. pkt->hdr.size = sizeof(*pkt);
  126. pkt->hdr.pkt_type = HFI_CMD_SYS_TEST_SSR;
  127. pkt->trigger_type = trigger_type;
  128. return 0;
  129. }
  130. void pkt_sys_image_version(struct hfi_sys_get_property_pkt *pkt)
  131. {
  132. pkt->hdr.size = sizeof(*pkt);
  133. pkt->hdr.pkt_type = HFI_CMD_SYS_GET_PROPERTY;
  134. pkt->num_properties = 1;
  135. pkt->data[0] = HFI_PROPERTY_SYS_IMAGE_VERSION;
  136. }
  137. int pkt_session_init(struct hfi_session_init_pkt *pkt, void *cookie,
  138. u32 session_type, u32 codec)
  139. {
  140. if (!pkt || !cookie || !codec)
  141. return -EINVAL;
  142. pkt->shdr.hdr.size = sizeof(*pkt);
  143. pkt->shdr.hdr.pkt_type = HFI_CMD_SYS_SESSION_INIT;
  144. pkt->shdr.session_id = hash32_ptr(cookie);
  145. pkt->session_domain = session_type;
  146. pkt->session_codec = codec;
  147. return 0;
  148. }
  149. void pkt_session_cmd(struct hfi_session_pkt *pkt, u32 pkt_type, void *cookie)
  150. {
  151. pkt->shdr.hdr.size = sizeof(*pkt);
  152. pkt->shdr.hdr.pkt_type = pkt_type;
  153. pkt->shdr.session_id = hash32_ptr(cookie);
  154. }
  155. int pkt_session_set_buffers(struct hfi_session_set_buffers_pkt *pkt,
  156. void *cookie, struct hfi_buffer_desc *bd)
  157. {
  158. unsigned int i;
  159. if (!cookie || !pkt || !bd)
  160. return -EINVAL;
  161. pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_BUFFERS;
  162. pkt->shdr.session_id = hash32_ptr(cookie);
  163. pkt->buffer_size = bd->buffer_size;
  164. pkt->min_buffer_size = bd->buffer_size;
  165. pkt->num_buffers = bd->num_buffers;
  166. if (bd->buffer_type == HFI_BUFFER_OUTPUT ||
  167. bd->buffer_type == HFI_BUFFER_OUTPUT2) {
  168. struct hfi_buffer_info *bi;
  169. pkt->extradata_size = bd->extradata_size;
  170. pkt->shdr.hdr.size = sizeof(*pkt) - sizeof(u32) +
  171. (bd->num_buffers * sizeof(*bi));
  172. bi = (struct hfi_buffer_info *)pkt->buffer_info;
  173. for (i = 0; i < pkt->num_buffers; i++) {
  174. bi->buffer_addr = bd->device_addr;
  175. bi->extradata_addr = bd->extradata_addr;
  176. }
  177. } else {
  178. pkt->extradata_size = 0;
  179. pkt->shdr.hdr.size = sizeof(*pkt) +
  180. ((bd->num_buffers - 1) * sizeof(u32));
  181. for (i = 0; i < pkt->num_buffers; i++)
  182. pkt->buffer_info[i] = bd->device_addr;
  183. }
  184. pkt->buffer_type = bd->buffer_type;
  185. return 0;
  186. }
  187. int pkt_session_unset_buffers(struct hfi_session_release_buffer_pkt *pkt,
  188. void *cookie, struct hfi_buffer_desc *bd)
  189. {
  190. unsigned int i;
  191. if (!cookie || !pkt || !bd)
  192. return -EINVAL;
  193. pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_RELEASE_BUFFERS;
  194. pkt->shdr.session_id = hash32_ptr(cookie);
  195. pkt->buffer_size = bd->buffer_size;
  196. pkt->num_buffers = bd->num_buffers;
  197. if (bd->buffer_type == HFI_BUFFER_OUTPUT ||
  198. bd->buffer_type == HFI_BUFFER_OUTPUT2) {
  199. struct hfi_buffer_info *bi;
  200. bi = (struct hfi_buffer_info *)pkt->buffer_info;
  201. for (i = 0; i < pkt->num_buffers; i++) {
  202. bi->buffer_addr = bd->device_addr;
  203. bi->extradata_addr = bd->extradata_addr;
  204. }
  205. pkt->shdr.hdr.size =
  206. sizeof(struct hfi_session_set_buffers_pkt) -
  207. sizeof(u32) + (bd->num_buffers * sizeof(*bi));
  208. } else {
  209. for (i = 0; i < pkt->num_buffers; i++)
  210. pkt->buffer_info[i] = bd->device_addr;
  211. pkt->extradata_size = 0;
  212. pkt->shdr.hdr.size =
  213. sizeof(struct hfi_session_set_buffers_pkt) +
  214. ((bd->num_buffers - 1) * sizeof(u32));
  215. }
  216. pkt->response_req = bd->response_required;
  217. pkt->buffer_type = bd->buffer_type;
  218. return 0;
  219. }
  220. int pkt_session_etb_decoder(struct hfi_session_empty_buffer_compressed_pkt *pkt,
  221. void *cookie, struct hfi_frame_data *in_frame)
  222. {
  223. if (!cookie || !in_frame->device_addr)
  224. return -EINVAL;
  225. pkt->shdr.hdr.size = sizeof(*pkt);
  226. pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_EMPTY_BUFFER;
  227. pkt->shdr.session_id = hash32_ptr(cookie);
  228. pkt->time_stamp_hi = upper_32_bits(in_frame->timestamp);
  229. pkt->time_stamp_lo = lower_32_bits(in_frame->timestamp);
  230. pkt->flags = in_frame->flags;
  231. pkt->mark_target = in_frame->mark_target;
  232. pkt->mark_data = in_frame->mark_data;
  233. pkt->offset = in_frame->offset;
  234. pkt->alloc_len = in_frame->alloc_len;
  235. pkt->filled_len = in_frame->filled_len;
  236. pkt->input_tag = in_frame->clnt_data;
  237. pkt->packet_buffer = in_frame->device_addr;
  238. return 0;
  239. }
  240. int pkt_session_etb_encoder(
  241. struct hfi_session_empty_buffer_uncompressed_plane0_pkt *pkt,
  242. void *cookie, struct hfi_frame_data *in_frame)
  243. {
  244. if (!cookie || !in_frame->device_addr)
  245. return -EINVAL;
  246. pkt->shdr.hdr.size = sizeof(*pkt);
  247. pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_EMPTY_BUFFER;
  248. pkt->shdr.session_id = hash32_ptr(cookie);
  249. pkt->view_id = 0;
  250. pkt->time_stamp_hi = upper_32_bits(in_frame->timestamp);
  251. pkt->time_stamp_lo = lower_32_bits(in_frame->timestamp);
  252. pkt->flags = in_frame->flags;
  253. pkt->mark_target = in_frame->mark_target;
  254. pkt->mark_data = in_frame->mark_data;
  255. pkt->offset = in_frame->offset;
  256. pkt->alloc_len = in_frame->alloc_len;
  257. pkt->filled_len = in_frame->filled_len;
  258. pkt->input_tag = in_frame->clnt_data;
  259. pkt->packet_buffer = in_frame->device_addr;
  260. pkt->extradata_buffer = in_frame->extradata_addr;
  261. return 0;
  262. }
  263. int pkt_session_ftb(struct hfi_session_fill_buffer_pkt *pkt, void *cookie,
  264. struct hfi_frame_data *out_frame)
  265. {
  266. if (!cookie || !out_frame || !out_frame->device_addr)
  267. return -EINVAL;
  268. pkt->shdr.hdr.size = sizeof(*pkt);
  269. pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_FILL_BUFFER;
  270. pkt->shdr.session_id = hash32_ptr(cookie);
  271. if (out_frame->buffer_type == HFI_BUFFER_OUTPUT)
  272. pkt->stream_id = 0;
  273. else if (out_frame->buffer_type == HFI_BUFFER_OUTPUT2)
  274. pkt->stream_id = 1;
  275. pkt->output_tag = out_frame->clnt_data;
  276. pkt->packet_buffer = out_frame->device_addr;
  277. pkt->extradata_buffer = out_frame->extradata_addr;
  278. pkt->alloc_len = out_frame->alloc_len;
  279. pkt->filled_len = out_frame->filled_len;
  280. pkt->offset = out_frame->offset;
  281. pkt->data[0] = out_frame->extradata_size;
  282. return 0;
  283. }
  284. int pkt_session_parse_seq_header(
  285. struct hfi_session_parse_sequence_header_pkt *pkt,
  286. void *cookie, u32 seq_hdr, u32 seq_hdr_len)
  287. {
  288. if (!cookie || !seq_hdr || !seq_hdr_len)
  289. return -EINVAL;
  290. pkt->shdr.hdr.size = sizeof(*pkt);
  291. pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_PARSE_SEQUENCE_HEADER;
  292. pkt->shdr.session_id = hash32_ptr(cookie);
  293. pkt->header_len = seq_hdr_len;
  294. pkt->packet_buffer = seq_hdr;
  295. return 0;
  296. }
  297. int pkt_session_get_seq_hdr(struct hfi_session_get_sequence_header_pkt *pkt,
  298. void *cookie, u32 seq_hdr, u32 seq_hdr_len)
  299. {
  300. if (!cookie || !seq_hdr || !seq_hdr_len)
  301. return -EINVAL;
  302. pkt->shdr.hdr.size = sizeof(*pkt);
  303. pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_GET_SEQUENCE_HEADER;
  304. pkt->shdr.session_id = hash32_ptr(cookie);
  305. pkt->buffer_len = seq_hdr_len;
  306. pkt->packet_buffer = seq_hdr;
  307. return 0;
  308. }
  309. int pkt_session_flush(struct hfi_session_flush_pkt *pkt, void *cookie, u32 type)
  310. {
  311. switch (type) {
  312. case HFI_FLUSH_INPUT:
  313. case HFI_FLUSH_OUTPUT:
  314. case HFI_FLUSH_OUTPUT2:
  315. case HFI_FLUSH_ALL:
  316. break;
  317. default:
  318. return -EINVAL;
  319. }
  320. pkt->shdr.hdr.size = sizeof(*pkt);
  321. pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_FLUSH;
  322. pkt->shdr.session_id = hash32_ptr(cookie);
  323. pkt->flush_type = type;
  324. return 0;
  325. }
  326. static int pkt_session_get_property_1x(struct hfi_session_get_property_pkt *pkt,
  327. void *cookie, u32 ptype)
  328. {
  329. switch (ptype) {
  330. case HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT:
  331. case HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS:
  332. break;
  333. default:
  334. return -EINVAL;
  335. }
  336. pkt->shdr.hdr.size = sizeof(*pkt);
  337. pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_GET_PROPERTY;
  338. pkt->shdr.session_id = hash32_ptr(cookie);
  339. pkt->num_properties = 1;
  340. pkt->data[0] = ptype;
  341. return 0;
  342. }
  343. static int pkt_session_set_property_1x(struct hfi_session_set_property_pkt *pkt,
  344. void *cookie, u32 ptype, void *pdata)
  345. {
  346. void *prop_data;
  347. int ret = 0;
  348. if (!pkt || !cookie || !pdata)
  349. return -EINVAL;
  350. prop_data = &pkt->data[1];
  351. pkt->shdr.hdr.size = sizeof(*pkt);
  352. pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
  353. pkt->shdr.session_id = hash32_ptr(cookie);
  354. pkt->num_properties = 1;
  355. pkt->data[0] = ptype;
  356. switch (ptype) {
  357. case HFI_PROPERTY_CONFIG_FRAME_RATE: {
  358. struct hfi_framerate *in = pdata, *frate = prop_data;
  359. frate->buffer_type = in->buffer_type;
  360. frate->framerate = in->framerate;
  361. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*frate);
  362. break;
  363. }
  364. case HFI_PROPERTY_PARAM_UNCOMPRESSED_FORMAT_SELECT: {
  365. struct hfi_uncompressed_format_select *in = pdata;
  366. struct hfi_uncompressed_format_select *hfi = prop_data;
  367. hfi->buffer_type = in->buffer_type;
  368. hfi->format = in->format;
  369. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hfi);
  370. break;
  371. }
  372. case HFI_PROPERTY_PARAM_FRAME_SIZE: {
  373. struct hfi_framesize *in = pdata, *fsize = prop_data;
  374. fsize->buffer_type = in->buffer_type;
  375. fsize->height = in->height;
  376. fsize->width = in->width;
  377. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*fsize);
  378. break;
  379. }
  380. case HFI_PROPERTY_CONFIG_REALTIME: {
  381. struct hfi_enable *in = pdata, *en = prop_data;
  382. en->enable = in->enable;
  383. pkt->shdr.hdr.size += sizeof(u32) * 2;
  384. break;
  385. }
  386. case HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL: {
  387. struct hfi_buffer_count_actual *in = pdata, *count = prop_data;
  388. count->count_actual = in->count_actual;
  389. count->type = in->type;
  390. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*count);
  391. break;
  392. }
  393. case HFI_PROPERTY_PARAM_BUFFER_SIZE_ACTUAL: {
  394. struct hfi_buffer_size_actual *in = pdata, *sz = prop_data;
  395. sz->size = in->size;
  396. sz->type = in->type;
  397. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*sz);
  398. break;
  399. }
  400. case HFI_PROPERTY_PARAM_BUFFER_DISPLAY_HOLD_COUNT_ACTUAL: {
  401. struct hfi_buffer_display_hold_count_actual *in = pdata;
  402. struct hfi_buffer_display_hold_count_actual *count = prop_data;
  403. count->hold_count = in->hold_count;
  404. count->type = in->type;
  405. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*count);
  406. break;
  407. }
  408. case HFI_PROPERTY_PARAM_NAL_STREAM_FORMAT_SELECT: {
  409. struct hfi_nal_stream_format_select *in = pdata;
  410. struct hfi_nal_stream_format_select *fmt = prop_data;
  411. fmt->format = in->format;
  412. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*fmt);
  413. break;
  414. }
  415. case HFI_PROPERTY_PARAM_VDEC_OUTPUT_ORDER: {
  416. u32 *in = pdata;
  417. switch (*in) {
  418. case HFI_OUTPUT_ORDER_DECODE:
  419. case HFI_OUTPUT_ORDER_DISPLAY:
  420. break;
  421. default:
  422. ret = -EINVAL;
  423. break;
  424. }
  425. pkt->data[1] = *in;
  426. pkt->shdr.hdr.size += sizeof(u32) * 2;
  427. break;
  428. }
  429. case HFI_PROPERTY_PARAM_VDEC_PICTURE_TYPE_DECODE: {
  430. struct hfi_enable_picture *in = pdata, *en = prop_data;
  431. en->picture_type = in->picture_type;
  432. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  433. break;
  434. }
  435. case HFI_PROPERTY_PARAM_VDEC_OUTPUT2_KEEP_ASPECT_RATIO: {
  436. struct hfi_enable *in = pdata, *en = prop_data;
  437. en->enable = in->enable;
  438. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  439. break;
  440. }
  441. case HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER: {
  442. struct hfi_enable *in = pdata;
  443. struct hfi_enable *en = prop_data;
  444. en->enable = in->enable;
  445. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  446. break;
  447. }
  448. case HFI_PROPERTY_PARAM_VDEC_MULTI_STREAM: {
  449. struct hfi_multi_stream *in = pdata, *multi = prop_data;
  450. multi->buffer_type = in->buffer_type;
  451. multi->enable = in->enable;
  452. multi->width = in->width;
  453. multi->height = in->height;
  454. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*multi);
  455. break;
  456. }
  457. case HFI_PROPERTY_PARAM_VDEC_DISPLAY_PICTURE_BUFFER_COUNT: {
  458. struct hfi_display_picture_buffer_count *in = pdata;
  459. struct hfi_display_picture_buffer_count *count = prop_data;
  460. count->count = in->count;
  461. count->enable = in->enable;
  462. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*count);
  463. break;
  464. }
  465. case HFI_PROPERTY_PARAM_DIVX_FORMAT: {
  466. u32 *in = pdata;
  467. switch (*in) {
  468. case HFI_DIVX_FORMAT_4:
  469. case HFI_DIVX_FORMAT_5:
  470. case HFI_DIVX_FORMAT_6:
  471. break;
  472. default:
  473. ret = -EINVAL;
  474. break;
  475. }
  476. pkt->data[1] = *in;
  477. pkt->shdr.hdr.size += sizeof(u32) * 2;
  478. break;
  479. }
  480. case HFI_PROPERTY_CONFIG_VDEC_MB_ERROR_MAP_REPORTING: {
  481. struct hfi_enable *in = pdata, *en = prop_data;
  482. en->enable = in->enable;
  483. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  484. break;
  485. }
  486. case HFI_PROPERTY_PARAM_VDEC_CONTINUE_DATA_TRANSFER: {
  487. struct hfi_enable *in = pdata, *en = prop_data;
  488. en->enable = in->enable;
  489. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  490. break;
  491. }
  492. case HFI_PROPERTY_PARAM_VDEC_THUMBNAIL_MODE: {
  493. struct hfi_enable *in = pdata, *en = prop_data;
  494. en->enable = in->enable;
  495. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  496. break;
  497. }
  498. case HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER: {
  499. struct hfi_enable *in = pdata, *en = prop_data;
  500. en->enable = in->enable;
  501. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  502. break;
  503. }
  504. case HFI_PROPERTY_CONFIG_VENC_REQUEST_SYNC_FRAME:
  505. pkt->shdr.hdr.size += sizeof(u32);
  506. break;
  507. case HFI_PROPERTY_PARAM_VENC_MPEG4_SHORT_HEADER:
  508. break;
  509. case HFI_PROPERTY_PARAM_VENC_MPEG4_AC_PREDICTION:
  510. break;
  511. case HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE: {
  512. struct hfi_bitrate *in = pdata, *brate = prop_data;
  513. brate->bitrate = in->bitrate;
  514. brate->layer_id = in->layer_id;
  515. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*brate);
  516. break;
  517. }
  518. case HFI_PROPERTY_CONFIG_VENC_MAX_BITRATE: {
  519. struct hfi_bitrate *in = pdata, *hfi = prop_data;
  520. hfi->bitrate = in->bitrate;
  521. hfi->layer_id = in->layer_id;
  522. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hfi);
  523. break;
  524. }
  525. case HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT: {
  526. struct hfi_profile_level *in = pdata, *pl = prop_data;
  527. pl->level = in->level;
  528. pl->profile = in->profile;
  529. if (pl->profile <= 0)
  530. /* Profile not supported, falling back to high */
  531. pl->profile = HFI_H264_PROFILE_HIGH;
  532. if (!pl->level)
  533. /* Level not supported, falling back to 1 */
  534. pl->level = 1;
  535. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*pl);
  536. break;
  537. }
  538. case HFI_PROPERTY_PARAM_VENC_H264_ENTROPY_CONTROL: {
  539. struct hfi_h264_entropy_control *in = pdata, *hfi = prop_data;
  540. hfi->entropy_mode = in->entropy_mode;
  541. if (hfi->entropy_mode == HFI_H264_ENTROPY_CABAC)
  542. hfi->cabac_model = in->cabac_model;
  543. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hfi);
  544. break;
  545. }
  546. case HFI_PROPERTY_PARAM_VENC_RATE_CONTROL: {
  547. u32 *in = pdata;
  548. switch (*in) {
  549. case HFI_RATE_CONTROL_OFF:
  550. case HFI_RATE_CONTROL_CBR_CFR:
  551. case HFI_RATE_CONTROL_CBR_VFR:
  552. case HFI_RATE_CONTROL_VBR_CFR:
  553. case HFI_RATE_CONTROL_VBR_VFR:
  554. break;
  555. default:
  556. ret = -EINVAL;
  557. break;
  558. }
  559. pkt->data[1] = *in;
  560. pkt->shdr.hdr.size += sizeof(u32) * 2;
  561. break;
  562. }
  563. case HFI_PROPERTY_PARAM_VENC_MPEG4_TIME_RESOLUTION: {
  564. struct hfi_mpeg4_time_resolution *in = pdata, *res = prop_data;
  565. res->time_increment_resolution = in->time_increment_resolution;
  566. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*res);
  567. break;
  568. }
  569. case HFI_PROPERTY_PARAM_VENC_MPEG4_HEADER_EXTENSION: {
  570. struct hfi_mpeg4_header_extension *in = pdata, *ext = prop_data;
  571. ext->header_extension = in->header_extension;
  572. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ext);
  573. break;
  574. }
  575. case HFI_PROPERTY_PARAM_VENC_H264_DEBLOCK_CONTROL: {
  576. struct hfi_h264_db_control *in = pdata, *db = prop_data;
  577. switch (in->mode) {
  578. case HFI_H264_DB_MODE_DISABLE:
  579. case HFI_H264_DB_MODE_SKIP_SLICE_BOUNDARY:
  580. case HFI_H264_DB_MODE_ALL_BOUNDARY:
  581. break;
  582. default:
  583. ret = -EINVAL;
  584. break;
  585. }
  586. db->mode = in->mode;
  587. db->slice_alpha_offset = in->slice_alpha_offset;
  588. db->slice_beta_offset = in->slice_beta_offset;
  589. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*db);
  590. break;
  591. }
  592. case HFI_PROPERTY_PARAM_VENC_SESSION_QP: {
  593. struct hfi_quantization *in = pdata, *quant = prop_data;
  594. quant->qp_i = in->qp_i;
  595. quant->qp_p = in->qp_p;
  596. quant->qp_b = in->qp_b;
  597. quant->layer_id = in->layer_id;
  598. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*quant);
  599. break;
  600. }
  601. case HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE: {
  602. struct hfi_quantization_range *in = pdata, *range = prop_data;
  603. u32 min_qp, max_qp;
  604. min_qp = in->min_qp;
  605. max_qp = in->max_qp;
  606. /* We'll be packing in the qp, so make sure we
  607. * won't be losing data when masking
  608. */
  609. if (min_qp > 0xff || max_qp > 0xff) {
  610. ret = -ERANGE;
  611. break;
  612. }
  613. /* When creating the packet, pack the qp value as
  614. * 0xiippbb, where ii = qp range for I-frames,
  615. * pp = qp range for P-frames, etc.
  616. */
  617. range->min_qp = min_qp | min_qp << 8 | min_qp << 16;
  618. range->max_qp = max_qp | max_qp << 8 | max_qp << 16;
  619. range->layer_id = in->layer_id;
  620. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*range);
  621. break;
  622. }
  623. case HFI_PROPERTY_PARAM_VENC_VC1_PERF_CFG: {
  624. struct hfi_vc1e_perf_cfg_type *in = pdata, *perf = prop_data;
  625. memcpy(perf->search_range_x_subsampled,
  626. in->search_range_x_subsampled,
  627. sizeof(perf->search_range_x_subsampled));
  628. memcpy(perf->search_range_y_subsampled,
  629. in->search_range_y_subsampled,
  630. sizeof(perf->search_range_y_subsampled));
  631. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*perf);
  632. break;
  633. }
  634. case HFI_PROPERTY_PARAM_VENC_MAX_NUM_B_FRAMES: {
  635. struct hfi_max_num_b_frames *bframes = prop_data;
  636. u32 *in = pdata;
  637. bframes->max_num_b_frames = *in;
  638. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*bframes);
  639. break;
  640. }
  641. case HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD: {
  642. struct hfi_intra_period *in = pdata, *intra = prop_data;
  643. intra->pframes = in->pframes;
  644. intra->bframes = in->bframes;
  645. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*intra);
  646. break;
  647. }
  648. case HFI_PROPERTY_CONFIG_VENC_IDR_PERIOD: {
  649. struct hfi_idr_period *in = pdata, *idr = prop_data;
  650. idr->idr_period = in->idr_period;
  651. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*idr);
  652. break;
  653. }
  654. case HFI_PROPERTY_PARAM_VDEC_CONCEAL_COLOR: {
  655. struct hfi_conceal_color *color = prop_data;
  656. u32 *in = pdata;
  657. color->conceal_color = *in;
  658. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*color);
  659. break;
  660. }
  661. case HFI_PROPERTY_CONFIG_VPE_OPERATIONS: {
  662. struct hfi_operations_type *in = pdata, *ops = prop_data;
  663. switch (in->rotation) {
  664. case HFI_ROTATE_NONE:
  665. case HFI_ROTATE_90:
  666. case HFI_ROTATE_180:
  667. case HFI_ROTATE_270:
  668. break;
  669. default:
  670. ret = -EINVAL;
  671. break;
  672. }
  673. switch (in->flip) {
  674. case HFI_FLIP_NONE:
  675. case HFI_FLIP_HORIZONTAL:
  676. case HFI_FLIP_VERTICAL:
  677. break;
  678. default:
  679. ret = -EINVAL;
  680. break;
  681. }
  682. ops->rotation = in->rotation;
  683. ops->flip = in->flip;
  684. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ops);
  685. break;
  686. }
  687. case HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH: {
  688. struct hfi_intra_refresh *in = pdata, *intra = prop_data;
  689. switch (in->mode) {
  690. case HFI_INTRA_REFRESH_NONE:
  691. case HFI_INTRA_REFRESH_ADAPTIVE:
  692. case HFI_INTRA_REFRESH_CYCLIC:
  693. case HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE:
  694. case HFI_INTRA_REFRESH_RANDOM:
  695. break;
  696. default:
  697. ret = -EINVAL;
  698. break;
  699. }
  700. intra->mode = in->mode;
  701. intra->air_mbs = in->air_mbs;
  702. intra->air_ref = in->air_ref;
  703. intra->cir_mbs = in->cir_mbs;
  704. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*intra);
  705. break;
  706. }
  707. case HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_CONTROL: {
  708. struct hfi_multi_slice_control *in = pdata, *multi = prop_data;
  709. switch (in->multi_slice) {
  710. case HFI_MULTI_SLICE_OFF:
  711. case HFI_MULTI_SLICE_GOB:
  712. case HFI_MULTI_SLICE_BY_MB_COUNT:
  713. case HFI_MULTI_SLICE_BY_BYTE_COUNT:
  714. break;
  715. default:
  716. ret = -EINVAL;
  717. break;
  718. }
  719. multi->multi_slice = in->multi_slice;
  720. multi->slice_size = in->slice_size;
  721. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*multi);
  722. break;
  723. }
  724. case HFI_PROPERTY_PARAM_VENC_SLICE_DELIVERY_MODE: {
  725. struct hfi_enable *in = pdata, *en = prop_data;
  726. en->enable = in->enable;
  727. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  728. break;
  729. }
  730. case HFI_PROPERTY_PARAM_VENC_H264_VUI_TIMING_INFO: {
  731. struct hfi_h264_vui_timing_info *in = pdata, *vui = prop_data;
  732. vui->enable = in->enable;
  733. vui->fixed_framerate = in->fixed_framerate;
  734. vui->time_scale = in->time_scale;
  735. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*vui);
  736. break;
  737. }
  738. case HFI_PROPERTY_CONFIG_VPE_DEINTERLACE: {
  739. struct hfi_enable *in = pdata, *en = prop_data;
  740. en->enable = in->enable;
  741. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  742. break;
  743. }
  744. case HFI_PROPERTY_PARAM_VENC_H264_GENERATE_AUDNAL: {
  745. struct hfi_enable *in = pdata, *en = prop_data;
  746. en->enable = in->enable;
  747. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  748. break;
  749. }
  750. case HFI_PROPERTY_PARAM_BUFFER_ALLOC_MODE: {
  751. struct hfi_buffer_alloc_mode *in = pdata, *mode = prop_data;
  752. mode->type = in->type;
  753. mode->mode = in->mode;
  754. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*mode);
  755. break;
  756. }
  757. case HFI_PROPERTY_PARAM_VDEC_FRAME_ASSEMBLY: {
  758. struct hfi_enable *in = pdata, *en = prop_data;
  759. en->enable = in->enable;
  760. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  761. break;
  762. }
  763. case HFI_PROPERTY_PARAM_VENC_H264_VUI_BITSTREAM_RESTRC: {
  764. struct hfi_enable *in = pdata, *en = prop_data;
  765. en->enable = in->enable;
  766. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  767. break;
  768. }
  769. case HFI_PROPERTY_PARAM_VENC_PRESERVE_TEXT_QUALITY: {
  770. struct hfi_enable *in = pdata, *en = prop_data;
  771. en->enable = in->enable;
  772. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  773. break;
  774. }
  775. case HFI_PROPERTY_PARAM_VDEC_SCS_THRESHOLD: {
  776. struct hfi_scs_threshold *thres = prop_data;
  777. u32 *in = pdata;
  778. thres->threshold_value = *in;
  779. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*thres);
  780. break;
  781. }
  782. case HFI_PROPERTY_PARAM_MVC_BUFFER_LAYOUT: {
  783. struct hfi_mvc_buffer_layout_descp_type *in = pdata;
  784. struct hfi_mvc_buffer_layout_descp_type *mvc = prop_data;
  785. switch (in->layout_type) {
  786. case HFI_MVC_BUFFER_LAYOUT_TOP_BOTTOM:
  787. case HFI_MVC_BUFFER_LAYOUT_SEQ:
  788. break;
  789. default:
  790. ret = -EINVAL;
  791. break;
  792. }
  793. mvc->layout_type = in->layout_type;
  794. mvc->bright_view_first = in->bright_view_first;
  795. mvc->ngap = in->ngap;
  796. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*mvc);
  797. break;
  798. }
  799. case HFI_PROPERTY_PARAM_VENC_LTRMODE: {
  800. struct hfi_ltr_mode *in = pdata, *ltr = prop_data;
  801. switch (in->ltr_mode) {
  802. case HFI_LTR_MODE_DISABLE:
  803. case HFI_LTR_MODE_MANUAL:
  804. case HFI_LTR_MODE_PERIODIC:
  805. break;
  806. default:
  807. ret = -EINVAL;
  808. break;
  809. }
  810. ltr->ltr_mode = in->ltr_mode;
  811. ltr->ltr_count = in->ltr_count;
  812. ltr->trust_mode = in->trust_mode;
  813. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ltr);
  814. break;
  815. }
  816. case HFI_PROPERTY_CONFIG_VENC_USELTRFRAME: {
  817. struct hfi_ltr_use *in = pdata, *ltr_use = prop_data;
  818. ltr_use->frames = in->frames;
  819. ltr_use->ref_ltr = in->ref_ltr;
  820. ltr_use->use_constrnt = in->use_constrnt;
  821. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ltr_use);
  822. break;
  823. }
  824. case HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME: {
  825. struct hfi_ltr_mark *in = pdata, *ltr_mark = prop_data;
  826. ltr_mark->mark_frame = in->mark_frame;
  827. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ltr_mark);
  828. break;
  829. }
  830. case HFI_PROPERTY_PARAM_VENC_HIER_P_MAX_NUM_ENH_LAYER: {
  831. u32 *in = pdata;
  832. pkt->data[1] = *in;
  833. pkt->shdr.hdr.size += sizeof(u32) * 2;
  834. break;
  835. }
  836. case HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER: {
  837. u32 *in = pdata;
  838. pkt->data[1] = *in;
  839. pkt->shdr.hdr.size += sizeof(u32) * 2;
  840. break;
  841. }
  842. case HFI_PROPERTY_PARAM_VENC_DISABLE_RC_TIMESTAMP: {
  843. struct hfi_enable *in = pdata, *en = prop_data;
  844. en->enable = in->enable;
  845. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  846. break;
  847. }
  848. case HFI_PROPERTY_PARAM_VENC_INITIAL_QP: {
  849. struct hfi_initial_quantization *in = pdata, *quant = prop_data;
  850. quant->init_qp_enable = in->init_qp_enable;
  851. quant->qp_i = in->qp_i;
  852. quant->qp_p = in->qp_p;
  853. quant->qp_b = in->qp_b;
  854. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*quant);
  855. break;
  856. }
  857. case HFI_PROPERTY_PARAM_VPE_COLOR_SPACE_CONVERSION: {
  858. struct hfi_vpe_color_space_conversion *in = pdata;
  859. struct hfi_vpe_color_space_conversion *csc = prop_data;
  860. memcpy(csc->csc_matrix, in->csc_matrix,
  861. sizeof(csc->csc_matrix));
  862. memcpy(csc->csc_bias, in->csc_bias, sizeof(csc->csc_bias));
  863. memcpy(csc->csc_limit, in->csc_limit, sizeof(csc->csc_limit));
  864. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*csc);
  865. break;
  866. }
  867. case HFI_PROPERTY_PARAM_VENC_VPX_ERROR_RESILIENCE_MODE: {
  868. struct hfi_enable *in = pdata, *en = prop_data;
  869. en->enable = in->enable;
  870. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  871. break;
  872. }
  873. case HFI_PROPERTY_PARAM_VENC_H264_NAL_SVC_EXT: {
  874. struct hfi_enable *in = pdata, *en = prop_data;
  875. en->enable = in->enable;
  876. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  877. break;
  878. }
  879. case HFI_PROPERTY_CONFIG_VENC_PERF_MODE: {
  880. u32 *in = pdata;
  881. pkt->data[1] = *in;
  882. pkt->shdr.hdr.size += sizeof(u32) * 2;
  883. break;
  884. }
  885. case HFI_PROPERTY_PARAM_VENC_HIER_B_MAX_NUM_ENH_LAYER: {
  886. u32 *in = pdata;
  887. pkt->data[1] = *in;
  888. pkt->shdr.hdr.size += sizeof(u32) * 2;
  889. break;
  890. }
  891. case HFI_PROPERTY_PARAM_VDEC_NONCP_OUTPUT2: {
  892. struct hfi_enable *in = pdata, *en = prop_data;
  893. en->enable = in->enable;
  894. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
  895. break;
  896. }
  897. case HFI_PROPERTY_PARAM_VENC_HIER_P_HYBRID_MODE: {
  898. struct hfi_hybrid_hierp *in = pdata, *hierp = prop_data;
  899. hierp->layers = in->layers;
  900. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hierp);
  901. break;
  902. }
  903. /* FOLLOWING PROPERTIES ARE NOT IMPLEMENTED IN CORE YET */
  904. case HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS:
  905. case HFI_PROPERTY_CONFIG_PRIORITY:
  906. case HFI_PROPERTY_CONFIG_BATCH_INFO:
  907. case HFI_PROPERTY_SYS_IDLE_INDICATOR:
  908. case HFI_PROPERTY_PARAM_UNCOMPRESSED_FORMAT_SUPPORTED:
  909. case HFI_PROPERTY_PARAM_INTERLACE_FORMAT_SUPPORTED:
  910. case HFI_PROPERTY_PARAM_CHROMA_SITE:
  911. case HFI_PROPERTY_PARAM_PROPERTIES_SUPPORTED:
  912. case HFI_PROPERTY_PARAM_PROFILE_LEVEL_SUPPORTED:
  913. case HFI_PROPERTY_PARAM_CAPABILITY_SUPPORTED:
  914. case HFI_PROPERTY_PARAM_NAL_STREAM_FORMAT_SUPPORTED:
  915. case HFI_PROPERTY_PARAM_MULTI_VIEW_FORMAT:
  916. case HFI_PROPERTY_PARAM_MAX_SEQUENCE_HEADER_SIZE:
  917. case HFI_PROPERTY_PARAM_CODEC_SUPPORTED:
  918. case HFI_PROPERTY_PARAM_VDEC_MULTI_VIEW_SELECT:
  919. case HFI_PROPERTY_PARAM_VDEC_MB_QUANTIZATION:
  920. case HFI_PROPERTY_PARAM_VDEC_NUM_CONCEALED_MB:
  921. case HFI_PROPERTY_PARAM_VDEC_H264_ENTROPY_SWITCHING:
  922. case HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_INFO:
  923. default:
  924. return -EINVAL;
  925. }
  926. return ret;
  927. }
  928. static int
  929. pkt_session_get_property_3xx(struct hfi_session_get_property_pkt *pkt,
  930. void *cookie, u32 ptype)
  931. {
  932. int ret = 0;
  933. if (!pkt || !cookie)
  934. return -EINVAL;
  935. pkt->shdr.hdr.size = sizeof(struct hfi_session_get_property_pkt);
  936. pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_GET_PROPERTY;
  937. pkt->shdr.session_id = hash32_ptr(cookie);
  938. pkt->num_properties = 1;
  939. switch (ptype) {
  940. case HFI_PROPERTY_CONFIG_VDEC_ENTROPY:
  941. pkt->data[0] = HFI_PROPERTY_CONFIG_VDEC_ENTROPY;
  942. break;
  943. default:
  944. ret = pkt_session_get_property_1x(pkt, cookie, ptype);
  945. break;
  946. }
  947. return ret;
  948. }
  949. static int
  950. pkt_session_set_property_3xx(struct hfi_session_set_property_pkt *pkt,
  951. void *cookie, u32 ptype, void *pdata)
  952. {
  953. void *prop_data;
  954. int ret = 0;
  955. if (!pkt || !cookie || !pdata)
  956. return -EINVAL;
  957. prop_data = &pkt->data[1];
  958. pkt->shdr.hdr.size = sizeof(*pkt);
  959. pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
  960. pkt->shdr.session_id = hash32_ptr(cookie);
  961. pkt->num_properties = 1;
  962. pkt->data[0] = ptype;
  963. /*
  964. * Any session set property which is different in 3XX packetization
  965. * should be added as a new case below. All unchanged session set
  966. * properties will be handled in the default case.
  967. */
  968. switch (ptype) {
  969. case HFI_PROPERTY_PARAM_VDEC_MULTI_STREAM: {
  970. struct hfi_multi_stream *in = pdata;
  971. struct hfi_multi_stream_3x *multi = prop_data;
  972. multi->buffer_type = in->buffer_type;
  973. multi->enable = in->enable;
  974. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*multi);
  975. break;
  976. }
  977. case HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH: {
  978. struct hfi_intra_refresh *in = pdata;
  979. struct hfi_intra_refresh_3x *intra = prop_data;
  980. switch (in->mode) {
  981. case HFI_INTRA_REFRESH_NONE:
  982. case HFI_INTRA_REFRESH_ADAPTIVE:
  983. case HFI_INTRA_REFRESH_CYCLIC:
  984. case HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE:
  985. case HFI_INTRA_REFRESH_RANDOM:
  986. break;
  987. default:
  988. ret = -EINVAL;
  989. break;
  990. }
  991. intra->mode = in->mode;
  992. intra->mbs = in->cir_mbs;
  993. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*intra);
  994. break;
  995. }
  996. case HFI_PROPERTY_PARAM_VDEC_CONTINUE_DATA_TRANSFER:
  997. /* for 3xx fw version session_continue is used */
  998. break;
  999. default:
  1000. ret = pkt_session_set_property_1x(pkt, cookie, ptype, pdata);
  1001. break;
  1002. }
  1003. return ret;
  1004. }
  1005. static int
  1006. pkt_session_set_property_4xx(struct hfi_session_set_property_pkt *pkt,
  1007. void *cookie, u32 ptype, void *pdata)
  1008. {
  1009. void *prop_data;
  1010. if (!pkt || !cookie || !pdata)
  1011. return -EINVAL;
  1012. prop_data = &pkt->data[1];
  1013. pkt->shdr.hdr.size = sizeof(*pkt);
  1014. pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
  1015. pkt->shdr.session_id = hash32_ptr(cookie);
  1016. pkt->num_properties = 1;
  1017. pkt->data[0] = ptype;
  1018. /*
  1019. * Any session set property which is different in 3XX packetization
  1020. * should be added as a new case below. All unchanged session set
  1021. * properties will be handled in the default case.
  1022. */
  1023. switch (ptype) {
  1024. case HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL: {
  1025. struct hfi_buffer_count_actual *in = pdata;
  1026. struct hfi_buffer_count_actual_4xx *count = prop_data;
  1027. count->count_actual = in->count_actual;
  1028. count->type = in->type;
  1029. count->count_min_host = in->count_actual;
  1030. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*count);
  1031. break;
  1032. }
  1033. case HFI_PROPERTY_PARAM_WORK_MODE: {
  1034. struct hfi_video_work_mode *in = pdata, *wm = prop_data;
  1035. wm->video_work_mode = in->video_work_mode;
  1036. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*wm);
  1037. break;
  1038. }
  1039. case HFI_PROPERTY_CONFIG_VIDEOCORES_USAGE: {
  1040. struct hfi_videocores_usage_type *in = pdata, *cu = prop_data;
  1041. cu->video_core_enable_mask = in->video_core_enable_mask;
  1042. pkt->shdr.hdr.size += sizeof(u32) + sizeof(*cu);
  1043. break;
  1044. }
  1045. case HFI_PROPERTY_CONFIG_VENC_MAX_BITRATE:
  1046. /* not implemented on Venus 4xx */
  1047. break;
  1048. default:
  1049. return pkt_session_set_property_3xx(pkt, cookie, ptype, pdata);
  1050. }
  1051. return 0;
  1052. }
  1053. int pkt_session_get_property(struct hfi_session_get_property_pkt *pkt,
  1054. void *cookie, u32 ptype)
  1055. {
  1056. if (hfi_ver == HFI_VERSION_1XX)
  1057. return pkt_session_get_property_1x(pkt, cookie, ptype);
  1058. return pkt_session_get_property_3xx(pkt, cookie, ptype);
  1059. }
  1060. int pkt_session_set_property(struct hfi_session_set_property_pkt *pkt,
  1061. void *cookie, u32 ptype, void *pdata)
  1062. {
  1063. if (hfi_ver == HFI_VERSION_1XX)
  1064. return pkt_session_set_property_1x(pkt, cookie, ptype, pdata);
  1065. if (hfi_ver == HFI_VERSION_3XX)
  1066. return pkt_session_set_property_3xx(pkt, cookie, ptype, pdata);
  1067. return pkt_session_set_property_4xx(pkt, cookie, ptype, pdata);
  1068. }
  1069. void pkt_set_version(enum hfi_version version)
  1070. {
  1071. hfi_ver = version;
  1072. }