1fa186c97SDikshita Agarwal // SPDX-License-Identifier: GPL-2.0-only
2fa186c97SDikshita Agarwal /*
3fa186c97SDikshita Agarwal * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4fa186c97SDikshita Agarwal */
5fa186c97SDikshita Agarwal
63a19d7b9SVedang Nagar #include <linux/bitfield.h>
73a19d7b9SVedang Nagar
8fa186c97SDikshita Agarwal #include "iris_hfi_gen2.h"
9fb583a21SDikshita Agarwal #include "iris_hfi_gen2_packet.h"
10fb583a21SDikshita Agarwal
113a19d7b9SVedang Nagar #define UNSPECIFIED_COLOR_FORMAT 5
12fb583a21SDikshita Agarwal #define NUM_SYS_INIT_PACKETS 8
13fb583a21SDikshita Agarwal
14fb583a21SDikshita Agarwal #define SYS_INIT_PKT_SIZE (sizeof(struct iris_hfi_header) + \
15fb583a21SDikshita Agarwal NUM_SYS_INIT_PACKETS * (sizeof(struct iris_hfi_packet) + sizeof(u32)))
16fb583a21SDikshita Agarwal
17fb583a21SDikshita Agarwal #define SYS_IFPC_PKT_SIZE (sizeof(struct iris_hfi_header) + \
18fb583a21SDikshita Agarwal sizeof(struct iris_hfi_packet) + sizeof(u32))
19fb583a21SDikshita Agarwal
20fb583a21SDikshita Agarwal #define SYS_NO_PAYLOAD_PKT_SIZE (sizeof(struct iris_hfi_header) + \
21fb583a21SDikshita Agarwal sizeof(struct iris_hfi_packet))
22fb583a21SDikshita Agarwal
iris_hfi_gen2_sys_init(struct iris_core * core)23fb583a21SDikshita Agarwal static int iris_hfi_gen2_sys_init(struct iris_core *core)
24fb583a21SDikshita Agarwal {
25fb583a21SDikshita Agarwal struct iris_hfi_header *hdr;
26fb583a21SDikshita Agarwal int ret;
27fb583a21SDikshita Agarwal
28fb583a21SDikshita Agarwal hdr = kzalloc(SYS_INIT_PKT_SIZE, GFP_KERNEL);
29fb583a21SDikshita Agarwal if (!hdr)
30fb583a21SDikshita Agarwal return -ENOMEM;
31fb583a21SDikshita Agarwal
32fb583a21SDikshita Agarwal iris_hfi_gen2_packet_sys_init(core, hdr);
33fb583a21SDikshita Agarwal ret = iris_hfi_queue_cmd_write_locked(core, hdr, hdr->size);
34fb583a21SDikshita Agarwal
35fb583a21SDikshita Agarwal kfree(hdr);
36fb583a21SDikshita Agarwal
37fb583a21SDikshita Agarwal return ret;
38fb583a21SDikshita Agarwal }
39fb583a21SDikshita Agarwal
iris_hfi_gen2_sys_image_version(struct iris_core * core)40fb583a21SDikshita Agarwal static int iris_hfi_gen2_sys_image_version(struct iris_core *core)
41fb583a21SDikshita Agarwal {
42fb583a21SDikshita Agarwal struct iris_hfi_header *hdr;
43fb583a21SDikshita Agarwal int ret;
44fb583a21SDikshita Agarwal
45fb583a21SDikshita Agarwal hdr = kzalloc(SYS_NO_PAYLOAD_PKT_SIZE, GFP_KERNEL);
46fb583a21SDikshita Agarwal if (!hdr)
47fb583a21SDikshita Agarwal return -ENOMEM;
48fb583a21SDikshita Agarwal
49fb583a21SDikshita Agarwal iris_hfi_gen2_packet_image_version(core, hdr);
50fb583a21SDikshita Agarwal ret = iris_hfi_queue_cmd_write_locked(core, hdr, hdr->size);
51fb583a21SDikshita Agarwal
52fb583a21SDikshita Agarwal kfree(hdr);
53fb583a21SDikshita Agarwal
54fb583a21SDikshita Agarwal return ret;
55fb583a21SDikshita Agarwal }
56fb583a21SDikshita Agarwal
iris_hfi_gen2_sys_interframe_powercollapse(struct iris_core * core)57fb583a21SDikshita Agarwal static int iris_hfi_gen2_sys_interframe_powercollapse(struct iris_core *core)
58fb583a21SDikshita Agarwal {
59fb583a21SDikshita Agarwal struct iris_hfi_header *hdr;
60fb583a21SDikshita Agarwal int ret;
61fb583a21SDikshita Agarwal
62fb583a21SDikshita Agarwal hdr = kzalloc(SYS_IFPC_PKT_SIZE, GFP_KERNEL);
63fb583a21SDikshita Agarwal if (!hdr)
64fb583a21SDikshita Agarwal return -ENOMEM;
65fb583a21SDikshita Agarwal
66fb583a21SDikshita Agarwal iris_hfi_gen2_packet_sys_interframe_powercollapse(core, hdr);
67fb583a21SDikshita Agarwal ret = iris_hfi_queue_cmd_write_locked(core, hdr, hdr->size);
68fb583a21SDikshita Agarwal
69fb583a21SDikshita Agarwal kfree(hdr);
70fb583a21SDikshita Agarwal
71fb583a21SDikshita Agarwal return ret;
72fb583a21SDikshita Agarwal }
73fb583a21SDikshita Agarwal
iris_hfi_gen2_sys_pc_prep(struct iris_core * core)74bb8a95aaSDikshita Agarwal static int iris_hfi_gen2_sys_pc_prep(struct iris_core *core)
75bb8a95aaSDikshita Agarwal {
76bb8a95aaSDikshita Agarwal struct iris_hfi_header *hdr;
77bb8a95aaSDikshita Agarwal int ret;
78bb8a95aaSDikshita Agarwal
79bb8a95aaSDikshita Agarwal hdr = kzalloc(SYS_NO_PAYLOAD_PKT_SIZE, GFP_KERNEL);
80bb8a95aaSDikshita Agarwal if (!hdr)
81bb8a95aaSDikshita Agarwal return -ENOMEM;
82bb8a95aaSDikshita Agarwal
83bb8a95aaSDikshita Agarwal iris_hfi_gen2_packet_sys_pc_prep(core, hdr);
84bb8a95aaSDikshita Agarwal ret = iris_hfi_queue_cmd_write_locked(core, hdr, hdr->size);
85bb8a95aaSDikshita Agarwal
86bb8a95aaSDikshita Agarwal kfree(hdr);
87bb8a95aaSDikshita Agarwal
88bb8a95aaSDikshita Agarwal return ret;
89bb8a95aaSDikshita Agarwal }
90bb8a95aaSDikshita Agarwal
iris_hfi_gen2_get_port(u32 plane)9111712ce7SDikshita Agarwal static u32 iris_hfi_gen2_get_port(u32 plane)
9211712ce7SDikshita Agarwal {
9311712ce7SDikshita Agarwal switch (plane) {
9411712ce7SDikshita Agarwal case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
9511712ce7SDikshita Agarwal return HFI_PORT_BITSTREAM;
9611712ce7SDikshita Agarwal case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
9711712ce7SDikshita Agarwal return HFI_PORT_RAW;
9811712ce7SDikshita Agarwal default:
9911712ce7SDikshita Agarwal return HFI_PORT_NONE;
10011712ce7SDikshita Agarwal }
10111712ce7SDikshita Agarwal }
10211712ce7SDikshita Agarwal
iris_hfi_gen2_get_port_from_buf_type(enum iris_buffer_type buffer_type)10373702f45SDikshita Agarwal static u32 iris_hfi_gen2_get_port_from_buf_type(enum iris_buffer_type buffer_type)
10473702f45SDikshita Agarwal {
10573702f45SDikshita Agarwal switch (buffer_type) {
10673702f45SDikshita Agarwal case BUF_INPUT:
10773702f45SDikshita Agarwal case BUF_BIN:
10873702f45SDikshita Agarwal case BUF_COMV:
10973702f45SDikshita Agarwal case BUF_NON_COMV:
11073702f45SDikshita Agarwal case BUF_LINE:
11173702f45SDikshita Agarwal return HFI_PORT_BITSTREAM;
11273702f45SDikshita Agarwal case BUF_OUTPUT:
11373702f45SDikshita Agarwal case BUF_DPB:
11473702f45SDikshita Agarwal return HFI_PORT_RAW;
11573702f45SDikshita Agarwal case BUF_PERSIST:
11673702f45SDikshita Agarwal default:
11773702f45SDikshita Agarwal return HFI_PORT_NONE;
11873702f45SDikshita Agarwal }
11973702f45SDikshita Agarwal }
12073702f45SDikshita Agarwal
iris_hfi_gen2_session_set_property(struct iris_inst * inst,u32 packet_type,u32 flag,u32 plane,u32 payload_type,void * payload,u32 payload_size)1213a19d7b9SVedang Nagar static int iris_hfi_gen2_session_set_property(struct iris_inst *inst, u32 packet_type, u32 flag,
1223a19d7b9SVedang Nagar u32 plane, u32 payload_type, void *payload,
1233a19d7b9SVedang Nagar u32 payload_size)
1243a19d7b9SVedang Nagar {
1253a19d7b9SVedang Nagar struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
1263a19d7b9SVedang Nagar
1273a19d7b9SVedang Nagar iris_hfi_gen2_packet_session_property(inst,
1283a19d7b9SVedang Nagar packet_type,
1293a19d7b9SVedang Nagar flag,
1303a19d7b9SVedang Nagar plane,
1313a19d7b9SVedang Nagar payload_type,
1323a19d7b9SVedang Nagar payload,
1333a19d7b9SVedang Nagar payload_size);
1343a19d7b9SVedang Nagar
1353a19d7b9SVedang Nagar return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
1363a19d7b9SVedang Nagar inst_hfi_gen2->packet->size);
1373a19d7b9SVedang Nagar }
1383a19d7b9SVedang Nagar
iris_hfi_gen2_set_bitstream_resolution(struct iris_inst * inst)1393a19d7b9SVedang Nagar static int iris_hfi_gen2_set_bitstream_resolution(struct iris_inst *inst)
1403a19d7b9SVedang Nagar {
1413a19d7b9SVedang Nagar struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
1423a19d7b9SVedang Nagar u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
1433a19d7b9SVedang Nagar u32 resolution = inst->fmt_src->fmt.pix_mp.width << 16 |
1443a19d7b9SVedang Nagar inst->fmt_src->fmt.pix_mp.height;
1453a19d7b9SVedang Nagar
1463a19d7b9SVedang Nagar inst_hfi_gen2->src_subcr_params.bitstream_resolution = resolution;
1473a19d7b9SVedang Nagar
1483a19d7b9SVedang Nagar return iris_hfi_gen2_session_set_property(inst,
1493a19d7b9SVedang Nagar HFI_PROP_BITSTREAM_RESOLUTION,
1503a19d7b9SVedang Nagar HFI_HOST_FLAGS_NONE,
1513a19d7b9SVedang Nagar port,
1523a19d7b9SVedang Nagar HFI_PAYLOAD_U32,
1533a19d7b9SVedang Nagar &resolution,
1543a19d7b9SVedang Nagar sizeof(u32));
1553a19d7b9SVedang Nagar }
1563a19d7b9SVedang Nagar
iris_hfi_gen2_set_crop_offsets(struct iris_inst * inst)1573a19d7b9SVedang Nagar static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst)
1583a19d7b9SVedang Nagar {
1593a19d7b9SVedang Nagar u32 bottom_offset = (inst->fmt_src->fmt.pix_mp.height - inst->crop.height);
1603a19d7b9SVedang Nagar u32 right_offset = (inst->fmt_src->fmt.pix_mp.width - inst->crop.width);
1613a19d7b9SVedang Nagar struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
1623a19d7b9SVedang Nagar u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
1633a19d7b9SVedang Nagar u32 left_offset = inst->crop.left;
1643a19d7b9SVedang Nagar u32 top_offset = inst->crop.top;
1653a19d7b9SVedang Nagar u32 payload[2];
1663a19d7b9SVedang Nagar
1673a19d7b9SVedang Nagar payload[0] = FIELD_PREP(GENMASK(31, 16), left_offset) | top_offset;
1683a19d7b9SVedang Nagar payload[1] = FIELD_PREP(GENMASK(31, 16), right_offset) | bottom_offset;
1693a19d7b9SVedang Nagar inst_hfi_gen2->src_subcr_params.crop_offsets[0] = payload[0];
1703a19d7b9SVedang Nagar inst_hfi_gen2->src_subcr_params.crop_offsets[1] = payload[1];
1713a19d7b9SVedang Nagar
1723a19d7b9SVedang Nagar return iris_hfi_gen2_session_set_property(inst,
1733a19d7b9SVedang Nagar HFI_PROP_CROP_OFFSETS,
1743a19d7b9SVedang Nagar HFI_HOST_FLAGS_NONE,
1753a19d7b9SVedang Nagar port,
1763a19d7b9SVedang Nagar HFI_PAYLOAD_64_PACKED,
1773a19d7b9SVedang Nagar &payload,
1783a19d7b9SVedang Nagar sizeof(u64));
1793a19d7b9SVedang Nagar }
1803a19d7b9SVedang Nagar
iris_hfi_gen2_set_bit_depth(struct iris_inst * inst)18158edc8a6SDikshita Agarwal static int iris_hfi_gen2_set_bit_depth(struct iris_inst *inst)
1823a19d7b9SVedang Nagar {
1833a19d7b9SVedang Nagar struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
1843a19d7b9SVedang Nagar u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
1853a19d7b9SVedang Nagar u32 bitdepth = BIT_DEPTH_8;
1863a19d7b9SVedang Nagar
1873a19d7b9SVedang Nagar inst_hfi_gen2->src_subcr_params.bit_depth = bitdepth;
1883a19d7b9SVedang Nagar
1893a19d7b9SVedang Nagar return iris_hfi_gen2_session_set_property(inst,
1903a19d7b9SVedang Nagar HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
1913a19d7b9SVedang Nagar HFI_HOST_FLAGS_NONE,
1923a19d7b9SVedang Nagar port,
1933a19d7b9SVedang Nagar HFI_PAYLOAD_U32,
1943a19d7b9SVedang Nagar &bitdepth,
1953a19d7b9SVedang Nagar sizeof(u32));
1963a19d7b9SVedang Nagar }
1973a19d7b9SVedang Nagar
iris_hfi_gen2_set_coded_frames(struct iris_inst * inst)1983a19d7b9SVedang Nagar static int iris_hfi_gen2_set_coded_frames(struct iris_inst *inst)
1993a19d7b9SVedang Nagar {
2003a19d7b9SVedang Nagar struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
2013a19d7b9SVedang Nagar u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
2023a19d7b9SVedang Nagar u32 coded_frames = 0;
2033a19d7b9SVedang Nagar
2043a19d7b9SVedang Nagar if (inst->fw_caps[CODED_FRAMES].value == CODED_FRAMES_PROGRESSIVE)
2053a19d7b9SVedang Nagar coded_frames = HFI_BITMASK_FRAME_MBS_ONLY_FLAG;
2063a19d7b9SVedang Nagar inst_hfi_gen2->src_subcr_params.coded_frames = coded_frames;
2073a19d7b9SVedang Nagar
2083a19d7b9SVedang Nagar return iris_hfi_gen2_session_set_property(inst,
2093a19d7b9SVedang Nagar HFI_PROP_CODED_FRAMES,
2103a19d7b9SVedang Nagar HFI_HOST_FLAGS_NONE,
2113a19d7b9SVedang Nagar port,
2123a19d7b9SVedang Nagar HFI_PAYLOAD_U32,
2133a19d7b9SVedang Nagar &coded_frames,
2143a19d7b9SVedang Nagar sizeof(u32));
2153a19d7b9SVedang Nagar }
2163a19d7b9SVedang Nagar
iris_hfi_gen2_set_min_output_count(struct iris_inst * inst)2173a19d7b9SVedang Nagar static int iris_hfi_gen2_set_min_output_count(struct iris_inst *inst)
2183a19d7b9SVedang Nagar {
2193a19d7b9SVedang Nagar struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
2203a19d7b9SVedang Nagar u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
2213a19d7b9SVedang Nagar u32 min_output = inst->buffers[BUF_OUTPUT].min_count;
2223a19d7b9SVedang Nagar
2233a19d7b9SVedang Nagar inst_hfi_gen2->src_subcr_params.fw_min_count = min_output;
2243a19d7b9SVedang Nagar
2253a19d7b9SVedang Nagar return iris_hfi_gen2_session_set_property(inst,
2263a19d7b9SVedang Nagar HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
2273a19d7b9SVedang Nagar HFI_HOST_FLAGS_NONE,
2283a19d7b9SVedang Nagar port,
2293a19d7b9SVedang Nagar HFI_PAYLOAD_U32,
2303a19d7b9SVedang Nagar &min_output,
2313a19d7b9SVedang Nagar sizeof(u32));
2323a19d7b9SVedang Nagar }
2333a19d7b9SVedang Nagar
iris_hfi_gen2_set_picture_order_count(struct iris_inst * inst)2343a19d7b9SVedang Nagar static int iris_hfi_gen2_set_picture_order_count(struct iris_inst *inst)
2353a19d7b9SVedang Nagar {
2363a19d7b9SVedang Nagar struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
2373a19d7b9SVedang Nagar u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
2383a19d7b9SVedang Nagar u32 poc = 0;
2393a19d7b9SVedang Nagar
2403a19d7b9SVedang Nagar inst_hfi_gen2->src_subcr_params.pic_order_cnt = poc;
2413a19d7b9SVedang Nagar
2423a19d7b9SVedang Nagar return iris_hfi_gen2_session_set_property(inst,
2433a19d7b9SVedang Nagar HFI_PROP_PIC_ORDER_CNT_TYPE,
2443a19d7b9SVedang Nagar HFI_HOST_FLAGS_NONE,
2453a19d7b9SVedang Nagar port,
2463a19d7b9SVedang Nagar HFI_PAYLOAD_U32,
2473a19d7b9SVedang Nagar &poc,
2483a19d7b9SVedang Nagar sizeof(u32));
2493a19d7b9SVedang Nagar }
2503a19d7b9SVedang Nagar
iris_hfi_gen2_set_colorspace(struct iris_inst * inst)2513a19d7b9SVedang Nagar static int iris_hfi_gen2_set_colorspace(struct iris_inst *inst)
2523a19d7b9SVedang Nagar {
2533a19d7b9SVedang Nagar struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
2543a19d7b9SVedang Nagar u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
2553a19d7b9SVedang Nagar struct v4l2_pix_format_mplane *pixmp = &inst->fmt_src->fmt.pix_mp;
2563a19d7b9SVedang Nagar u32 video_signal_type_present_flag = 0, color_info;
2573a19d7b9SVedang Nagar u32 matrix_coeff = HFI_MATRIX_COEFF_RESERVED;
2583a19d7b9SVedang Nagar u32 video_format = UNSPECIFIED_COLOR_FORMAT;
2593a19d7b9SVedang Nagar u32 full_range = V4L2_QUANTIZATION_DEFAULT;
2603a19d7b9SVedang Nagar u32 transfer_char = HFI_TRANSFER_RESERVED;
2613a19d7b9SVedang Nagar u32 colour_description_present_flag = 0;
2623a19d7b9SVedang Nagar u32 primaries = HFI_PRIMARIES_RESERVED;
2633a19d7b9SVedang Nagar
2643a19d7b9SVedang Nagar if (pixmp->colorspace != V4L2_COLORSPACE_DEFAULT ||
2653a19d7b9SVedang Nagar pixmp->ycbcr_enc != V4L2_YCBCR_ENC_DEFAULT ||
2663a19d7b9SVedang Nagar pixmp->xfer_func != V4L2_XFER_FUNC_DEFAULT) {
2673a19d7b9SVedang Nagar colour_description_present_flag = 1;
2683a19d7b9SVedang Nagar video_signal_type_present_flag = 1;
2693a19d7b9SVedang Nagar primaries = iris_hfi_gen2_get_color_primaries(pixmp->colorspace);
2703a19d7b9SVedang Nagar matrix_coeff = iris_hfi_gen2_get_matrix_coefficients(pixmp->ycbcr_enc);
2713a19d7b9SVedang Nagar transfer_char = iris_hfi_gen2_get_transfer_char(pixmp->xfer_func);
2723a19d7b9SVedang Nagar }
2733a19d7b9SVedang Nagar
2743a19d7b9SVedang Nagar if (pixmp->quantization != V4L2_QUANTIZATION_DEFAULT) {
2753a19d7b9SVedang Nagar video_signal_type_present_flag = 1;
2763a19d7b9SVedang Nagar full_range = pixmp->quantization == V4L2_QUANTIZATION_FULL_RANGE ? 1 : 0;
2773a19d7b9SVedang Nagar }
2783a19d7b9SVedang Nagar
2793a19d7b9SVedang Nagar color_info = iris_hfi_gen2_get_color_info(matrix_coeff, transfer_char, primaries,
2803a19d7b9SVedang Nagar colour_description_present_flag, full_range,
2813a19d7b9SVedang Nagar video_format, video_signal_type_present_flag);
2823a19d7b9SVedang Nagar
2833a19d7b9SVedang Nagar inst_hfi_gen2->src_subcr_params.color_info = color_info;
2843a19d7b9SVedang Nagar
2853a19d7b9SVedang Nagar return iris_hfi_gen2_session_set_property(inst,
2863a19d7b9SVedang Nagar HFI_PROP_SIGNAL_COLOR_INFO,
2873a19d7b9SVedang Nagar HFI_HOST_FLAGS_NONE,
2883a19d7b9SVedang Nagar port,
2893a19d7b9SVedang Nagar HFI_PAYLOAD_32_PACKED,
2903a19d7b9SVedang Nagar &color_info,
2913a19d7b9SVedang Nagar sizeof(u32));
2923a19d7b9SVedang Nagar }
2933a19d7b9SVedang Nagar
iris_hfi_gen2_set_profile(struct iris_inst * inst)2943a19d7b9SVedang Nagar static int iris_hfi_gen2_set_profile(struct iris_inst *inst)
2953a19d7b9SVedang Nagar {
2963a19d7b9SVedang Nagar struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
2973a19d7b9SVedang Nagar u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
298f44ef2d4SDikshita Agarwal u32 profile = 0;
299f44ef2d4SDikshita Agarwal
300f44ef2d4SDikshita Agarwal switch (inst->codec) {
301f44ef2d4SDikshita Agarwal case V4L2_PIX_FMT_HEVC:
302f44ef2d4SDikshita Agarwal profile = inst->fw_caps[PROFILE_HEVC].value;
303f44ef2d4SDikshita Agarwal break;
304f44ef2d4SDikshita Agarwal case V4L2_PIX_FMT_VP9:
305f44ef2d4SDikshita Agarwal profile = inst->fw_caps[PROFILE_VP9].value;
306f44ef2d4SDikshita Agarwal break;
307f44ef2d4SDikshita Agarwal case V4L2_PIX_FMT_H264:
308f44ef2d4SDikshita Agarwal profile = inst->fw_caps[PROFILE_H264].value;
309f44ef2d4SDikshita Agarwal break;
310f44ef2d4SDikshita Agarwal }
3113a19d7b9SVedang Nagar
3123a19d7b9SVedang Nagar inst_hfi_gen2->src_subcr_params.profile = profile;
3133a19d7b9SVedang Nagar
3143a19d7b9SVedang Nagar return iris_hfi_gen2_session_set_property(inst,
3153a19d7b9SVedang Nagar HFI_PROP_PROFILE,
3163a19d7b9SVedang Nagar HFI_HOST_FLAGS_NONE,
3173a19d7b9SVedang Nagar port,
3183a19d7b9SVedang Nagar HFI_PAYLOAD_U32_ENUM,
3193a19d7b9SVedang Nagar &profile,
3203a19d7b9SVedang Nagar sizeof(u32));
3213a19d7b9SVedang Nagar }
3223a19d7b9SVedang Nagar
iris_hfi_gen2_set_level(struct iris_inst * inst)3233a19d7b9SVedang Nagar static int iris_hfi_gen2_set_level(struct iris_inst *inst)
3243a19d7b9SVedang Nagar {
3253a19d7b9SVedang Nagar struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
3263a19d7b9SVedang Nagar u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
327f44ef2d4SDikshita Agarwal u32 level = 0;
328f44ef2d4SDikshita Agarwal
329f44ef2d4SDikshita Agarwal switch (inst->codec) {
330f44ef2d4SDikshita Agarwal case V4L2_PIX_FMT_HEVC:
331f44ef2d4SDikshita Agarwal level = inst->fw_caps[LEVEL_HEVC].value;
332f44ef2d4SDikshita Agarwal break;
333f44ef2d4SDikshita Agarwal case V4L2_PIX_FMT_VP9:
334f44ef2d4SDikshita Agarwal level = inst->fw_caps[LEVEL_VP9].value;
335f44ef2d4SDikshita Agarwal break;
336f44ef2d4SDikshita Agarwal case V4L2_PIX_FMT_H264:
337f44ef2d4SDikshita Agarwal level = inst->fw_caps[LEVEL_H264].value;
338f44ef2d4SDikshita Agarwal break;
339f44ef2d4SDikshita Agarwal }
3403a19d7b9SVedang Nagar
3413a19d7b9SVedang Nagar inst_hfi_gen2->src_subcr_params.level = level;
3423a19d7b9SVedang Nagar
3433a19d7b9SVedang Nagar return iris_hfi_gen2_session_set_property(inst,
3443a19d7b9SVedang Nagar HFI_PROP_LEVEL,
3453a19d7b9SVedang Nagar HFI_HOST_FLAGS_NONE,
3463a19d7b9SVedang Nagar port,
3473a19d7b9SVedang Nagar HFI_PAYLOAD_U32_ENUM,
3483a19d7b9SVedang Nagar &level,
3493a19d7b9SVedang Nagar sizeof(u32));
3503a19d7b9SVedang Nagar }
3513a19d7b9SVedang Nagar
iris_hfi_gen2_set_colorformat(struct iris_inst * inst)3523a19d7b9SVedang Nagar static int iris_hfi_gen2_set_colorformat(struct iris_inst *inst)
3533a19d7b9SVedang Nagar {
3543a19d7b9SVedang Nagar u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
3553a19d7b9SVedang Nagar u32 hfi_colorformat, pixelformat;
3563a19d7b9SVedang Nagar
3573a19d7b9SVedang Nagar pixelformat = inst->fmt_dst->fmt.pix_mp.pixelformat;
3583a19d7b9SVedang Nagar hfi_colorformat = pixelformat == V4L2_PIX_FMT_NV12 ? HFI_COLOR_FMT_NV12 : 0;
3593a19d7b9SVedang Nagar
3603a19d7b9SVedang Nagar return iris_hfi_gen2_session_set_property(inst,
3613a19d7b9SVedang Nagar HFI_PROP_COLOR_FORMAT,
3623a19d7b9SVedang Nagar HFI_HOST_FLAGS_NONE,
3633a19d7b9SVedang Nagar port,
3643a19d7b9SVedang Nagar HFI_PAYLOAD_U32,
3653a19d7b9SVedang Nagar &hfi_colorformat,
3663a19d7b9SVedang Nagar sizeof(u32));
3673a19d7b9SVedang Nagar }
3683a19d7b9SVedang Nagar
iris_hfi_gen2_set_linear_stride_scanline(struct iris_inst * inst)3693a19d7b9SVedang Nagar static int iris_hfi_gen2_set_linear_stride_scanline(struct iris_inst *inst)
3703a19d7b9SVedang Nagar {
3713a19d7b9SVedang Nagar u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
3723a19d7b9SVedang Nagar u32 pixelformat = inst->fmt_dst->fmt.pix_mp.pixelformat;
3733a19d7b9SVedang Nagar u32 scanline_y = inst->fmt_dst->fmt.pix_mp.height;
3743a19d7b9SVedang Nagar u32 stride_y = inst->fmt_dst->fmt.pix_mp.width;
3753a19d7b9SVedang Nagar u32 scanline_uv = scanline_y / 2;
3763a19d7b9SVedang Nagar u32 stride_uv = stride_y;
3773a19d7b9SVedang Nagar u32 payload[2];
3783a19d7b9SVedang Nagar
3793a19d7b9SVedang Nagar if (pixelformat != V4L2_PIX_FMT_NV12)
3803a19d7b9SVedang Nagar return 0;
3813a19d7b9SVedang Nagar
3823a19d7b9SVedang Nagar payload[0] = stride_y << 16 | scanline_y;
3833a19d7b9SVedang Nagar payload[1] = stride_uv << 16 | scanline_uv;
3843a19d7b9SVedang Nagar
3853a19d7b9SVedang Nagar return iris_hfi_gen2_session_set_property(inst,
3863a19d7b9SVedang Nagar HFI_PROP_LINEAR_STRIDE_SCANLINE,
3873a19d7b9SVedang Nagar HFI_HOST_FLAGS_NONE,
3883a19d7b9SVedang Nagar port,
3893a19d7b9SVedang Nagar HFI_PAYLOAD_U64,
3903a19d7b9SVedang Nagar &payload,
3913a19d7b9SVedang Nagar sizeof(u64));
3923a19d7b9SVedang Nagar }
3933a19d7b9SVedang Nagar
iris_hfi_gen2_set_tier(struct iris_inst * inst)394*820ac7feSDikshita Agarwal static int iris_hfi_gen2_set_tier(struct iris_inst *inst)
395*820ac7feSDikshita Agarwal {
396*820ac7feSDikshita Agarwal struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
397*820ac7feSDikshita Agarwal u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
398*820ac7feSDikshita Agarwal u32 tier = inst->fw_caps[TIER].value;
399*820ac7feSDikshita Agarwal
400*820ac7feSDikshita Agarwal inst_hfi_gen2->src_subcr_params.tier = tier;
401*820ac7feSDikshita Agarwal
402*820ac7feSDikshita Agarwal return iris_hfi_gen2_session_set_property(inst,
403*820ac7feSDikshita Agarwal HFI_PROP_TIER,
404*820ac7feSDikshita Agarwal HFI_HOST_FLAGS_NONE,
405*820ac7feSDikshita Agarwal port,
406*820ac7feSDikshita Agarwal HFI_PAYLOAD_U32_ENUM,
407*820ac7feSDikshita Agarwal &tier,
408*820ac7feSDikshita Agarwal sizeof(u32));
409*820ac7feSDikshita Agarwal }
410*820ac7feSDikshita Agarwal
iris_hfi_gen2_session_set_config_params(struct iris_inst * inst,u32 plane)4113a19d7b9SVedang Nagar static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 plane)
4123a19d7b9SVedang Nagar {
4133a19d7b9SVedang Nagar struct iris_core *core = inst->core;
414*820ac7feSDikshita Agarwal u32 config_params_size = 0, i, j;
415*820ac7feSDikshita Agarwal const u32 *config_params = NULL;
4163a19d7b9SVedang Nagar int ret;
4173a19d7b9SVedang Nagar
4183a19d7b9SVedang Nagar static const struct iris_hfi_prop_type_handle prop_type_handle_arr[] = {
4193a19d7b9SVedang Nagar {HFI_PROP_BITSTREAM_RESOLUTION, iris_hfi_gen2_set_bitstream_resolution },
4203a19d7b9SVedang Nagar {HFI_PROP_CROP_OFFSETS, iris_hfi_gen2_set_crop_offsets },
4213a19d7b9SVedang Nagar {HFI_PROP_CODED_FRAMES, iris_hfi_gen2_set_coded_frames },
42258edc8a6SDikshita Agarwal {HFI_PROP_LUMA_CHROMA_BIT_DEPTH, iris_hfi_gen2_set_bit_depth },
4233a19d7b9SVedang Nagar {HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT, iris_hfi_gen2_set_min_output_count },
4243a19d7b9SVedang Nagar {HFI_PROP_PIC_ORDER_CNT_TYPE, iris_hfi_gen2_set_picture_order_count },
4253a19d7b9SVedang Nagar {HFI_PROP_SIGNAL_COLOR_INFO, iris_hfi_gen2_set_colorspace },
4263a19d7b9SVedang Nagar {HFI_PROP_PROFILE, iris_hfi_gen2_set_profile },
4273a19d7b9SVedang Nagar {HFI_PROP_LEVEL, iris_hfi_gen2_set_level },
4283a19d7b9SVedang Nagar {HFI_PROP_COLOR_FORMAT, iris_hfi_gen2_set_colorformat },
4293a19d7b9SVedang Nagar {HFI_PROP_LINEAR_STRIDE_SCANLINE, iris_hfi_gen2_set_linear_stride_scanline },
430*820ac7feSDikshita Agarwal {HFI_PROP_TIER, iris_hfi_gen2_set_tier },
4313a19d7b9SVedang Nagar };
4323a19d7b9SVedang Nagar
4333a19d7b9SVedang Nagar if (V4L2_TYPE_IS_OUTPUT(plane)) {
434*820ac7feSDikshita Agarwal switch (inst->codec) {
435*820ac7feSDikshita Agarwal case V4L2_PIX_FMT_H264:
436*820ac7feSDikshita Agarwal config_params = core->iris_platform_data->input_config_params_default;
437*820ac7feSDikshita Agarwal config_params_size =
438*820ac7feSDikshita Agarwal core->iris_platform_data->input_config_params_default_size;
439*820ac7feSDikshita Agarwal break;
440*820ac7feSDikshita Agarwal case V4L2_PIX_FMT_HEVC:
441*820ac7feSDikshita Agarwal config_params = core->iris_platform_data->input_config_params_hevc;
442*820ac7feSDikshita Agarwal config_params_size =
443*820ac7feSDikshita Agarwal core->iris_platform_data->input_config_params_hevc_size;
444*820ac7feSDikshita Agarwal break;
445*820ac7feSDikshita Agarwal case V4L2_PIX_FMT_VP9:
446*820ac7feSDikshita Agarwal config_params = core->iris_platform_data->input_config_params_vp9;
447*820ac7feSDikshita Agarwal config_params_size =
448*820ac7feSDikshita Agarwal core->iris_platform_data->input_config_params_vp9_size;
449*820ac7feSDikshita Agarwal break;
450*820ac7feSDikshita Agarwal }
4513a19d7b9SVedang Nagar } else {
4523a19d7b9SVedang Nagar config_params = core->iris_platform_data->output_config_params;
4533a19d7b9SVedang Nagar config_params_size = core->iris_platform_data->output_config_params_size;
4543a19d7b9SVedang Nagar }
4553a19d7b9SVedang Nagar
4563a19d7b9SVedang Nagar if (!config_params || !config_params_size)
4573a19d7b9SVedang Nagar return -EINVAL;
4583a19d7b9SVedang Nagar
4593a19d7b9SVedang Nagar for (i = 0; i < config_params_size; i++) {
4603a19d7b9SVedang Nagar for (j = 0; j < ARRAY_SIZE(prop_type_handle_arr); j++) {
4613a19d7b9SVedang Nagar if (prop_type_handle_arr[j].type == config_params[i]) {
4623a19d7b9SVedang Nagar ret = prop_type_handle_arr[j].handle(inst);
4633a19d7b9SVedang Nagar if (ret)
4643a19d7b9SVedang Nagar return ret;
4653a19d7b9SVedang Nagar break;
4663a19d7b9SVedang Nagar }
4673a19d7b9SVedang Nagar }
4683a19d7b9SVedang Nagar }
4693a19d7b9SVedang Nagar
4703a19d7b9SVedang Nagar return 0;
4713a19d7b9SVedang Nagar }
4723a19d7b9SVedang Nagar
iris_hfi_gen2_session_set_codec(struct iris_inst * inst)47338fc8beaSDikshita Agarwal static int iris_hfi_gen2_session_set_codec(struct iris_inst *inst)
47438fc8beaSDikshita Agarwal {
47538fc8beaSDikshita Agarwal struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
476fde6161dSDikshita Agarwal u32 codec = 0;
477fde6161dSDikshita Agarwal
478fde6161dSDikshita Agarwal switch (inst->codec) {
479fde6161dSDikshita Agarwal case V4L2_PIX_FMT_H264:
480fde6161dSDikshita Agarwal codec = HFI_CODEC_DECODE_AVC;
481fde6161dSDikshita Agarwal break;
482fde6161dSDikshita Agarwal case V4L2_PIX_FMT_HEVC:
483fde6161dSDikshita Agarwal codec = HFI_CODEC_DECODE_HEVC;
484fde6161dSDikshita Agarwal break;
485fde6161dSDikshita Agarwal case V4L2_PIX_FMT_VP9:
486fde6161dSDikshita Agarwal codec = HFI_CODEC_DECODE_VP9;
487fde6161dSDikshita Agarwal break;
488fde6161dSDikshita Agarwal }
48938fc8beaSDikshita Agarwal
49038fc8beaSDikshita Agarwal iris_hfi_gen2_packet_session_property(inst,
49138fc8beaSDikshita Agarwal HFI_PROP_CODEC,
49238fc8beaSDikshita Agarwal HFI_HOST_FLAGS_NONE,
49338fc8beaSDikshita Agarwal HFI_PORT_NONE,
49438fc8beaSDikshita Agarwal HFI_PAYLOAD_U32_ENUM,
49538fc8beaSDikshita Agarwal &codec,
49638fc8beaSDikshita Agarwal sizeof(u32));
49738fc8beaSDikshita Agarwal
49838fc8beaSDikshita Agarwal return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
49938fc8beaSDikshita Agarwal inst_hfi_gen2->packet->size);
50038fc8beaSDikshita Agarwal }
50138fc8beaSDikshita Agarwal
iris_hfi_gen2_session_set_default_header(struct iris_inst * inst)50238fc8beaSDikshita Agarwal static int iris_hfi_gen2_session_set_default_header(struct iris_inst *inst)
50338fc8beaSDikshita Agarwal {
50438fc8beaSDikshita Agarwal struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
50538fc8beaSDikshita Agarwal u32 default_header = false;
50638fc8beaSDikshita Agarwal
50738fc8beaSDikshita Agarwal iris_hfi_gen2_packet_session_property(inst,
50838fc8beaSDikshita Agarwal HFI_PROP_DEC_DEFAULT_HEADER,
50938fc8beaSDikshita Agarwal HFI_HOST_FLAGS_NONE,
51038fc8beaSDikshita Agarwal HFI_PORT_BITSTREAM,
51138fc8beaSDikshita Agarwal HFI_PAYLOAD_U32,
51238fc8beaSDikshita Agarwal &default_header,
51338fc8beaSDikshita Agarwal sizeof(u32));
51438fc8beaSDikshita Agarwal
51538fc8beaSDikshita Agarwal return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
51638fc8beaSDikshita Agarwal inst_hfi_gen2->packet->size);
51738fc8beaSDikshita Agarwal }
51838fc8beaSDikshita Agarwal
iris_hfi_gen2_session_open(struct iris_inst * inst)51938fc8beaSDikshita Agarwal static int iris_hfi_gen2_session_open(struct iris_inst *inst)
52038fc8beaSDikshita Agarwal {
52138fc8beaSDikshita Agarwal struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
52238fc8beaSDikshita Agarwal int ret;
52338fc8beaSDikshita Agarwal
52411712ce7SDikshita Agarwal if (inst->state != IRIS_INST_DEINIT)
52511712ce7SDikshita Agarwal return -EALREADY;
52611712ce7SDikshita Agarwal
527025398e9SVedang Nagar inst_hfi_gen2->ipsc_properties_set = false;
528025398e9SVedang Nagar inst_hfi_gen2->opsc_properties_set = false;
529025398e9SVedang Nagar
53038fc8beaSDikshita Agarwal inst_hfi_gen2->packet = kzalloc(4096, GFP_KERNEL);
53138fc8beaSDikshita Agarwal if (!inst_hfi_gen2->packet)
53238fc8beaSDikshita Agarwal return -ENOMEM;
53338fc8beaSDikshita Agarwal
53438fc8beaSDikshita Agarwal iris_hfi_gen2_packet_session_command(inst,
53538fc8beaSDikshita Agarwal HFI_CMD_OPEN,
53638fc8beaSDikshita Agarwal HFI_HOST_FLAGS_RESPONSE_REQUIRED |
53738fc8beaSDikshita Agarwal HFI_HOST_FLAGS_INTR_REQUIRED,
53838fc8beaSDikshita Agarwal HFI_PORT_NONE,
53938fc8beaSDikshita Agarwal 0,
54038fc8beaSDikshita Agarwal HFI_PAYLOAD_U32,
54138fc8beaSDikshita Agarwal &inst->session_id,
54238fc8beaSDikshita Agarwal sizeof(u32));
54338fc8beaSDikshita Agarwal
54438fc8beaSDikshita Agarwal ret = iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
54538fc8beaSDikshita Agarwal inst_hfi_gen2->packet->size);
54638fc8beaSDikshita Agarwal if (ret)
54738fc8beaSDikshita Agarwal goto fail_free_packet;
54838fc8beaSDikshita Agarwal
54938fc8beaSDikshita Agarwal ret = iris_hfi_gen2_session_set_codec(inst);
55038fc8beaSDikshita Agarwal if (ret)
55138fc8beaSDikshita Agarwal goto fail_free_packet;
55238fc8beaSDikshita Agarwal
55338fc8beaSDikshita Agarwal ret = iris_hfi_gen2_session_set_default_header(inst);
55438fc8beaSDikshita Agarwal if (ret)
55538fc8beaSDikshita Agarwal goto fail_free_packet;
55638fc8beaSDikshita Agarwal
55738fc8beaSDikshita Agarwal return 0;
55838fc8beaSDikshita Agarwal
55938fc8beaSDikshita Agarwal fail_free_packet:
56038fc8beaSDikshita Agarwal kfree(inst_hfi_gen2->packet);
56138fc8beaSDikshita Agarwal inst_hfi_gen2->packet = NULL;
56238fc8beaSDikshita Agarwal
56338fc8beaSDikshita Agarwal return ret;
56438fc8beaSDikshita Agarwal }
56538fc8beaSDikshita Agarwal
iris_hfi_gen2_session_close(struct iris_inst * inst)56638fc8beaSDikshita Agarwal static int iris_hfi_gen2_session_close(struct iris_inst *inst)
56738fc8beaSDikshita Agarwal {
56838fc8beaSDikshita Agarwal struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
56938fc8beaSDikshita Agarwal int ret;
57038fc8beaSDikshita Agarwal
57138fc8beaSDikshita Agarwal if (!inst_hfi_gen2->packet)
57238fc8beaSDikshita Agarwal return -EINVAL;
57338fc8beaSDikshita Agarwal
57438fc8beaSDikshita Agarwal iris_hfi_gen2_packet_session_command(inst,
57538fc8beaSDikshita Agarwal HFI_CMD_CLOSE,
57638fc8beaSDikshita Agarwal (HFI_HOST_FLAGS_RESPONSE_REQUIRED |
57738fc8beaSDikshita Agarwal HFI_HOST_FLAGS_INTR_REQUIRED |
57838fc8beaSDikshita Agarwal HFI_HOST_FLAGS_NON_DISCARDABLE),
57938fc8beaSDikshita Agarwal HFI_PORT_NONE,
58038fc8beaSDikshita Agarwal inst->session_id,
58138fc8beaSDikshita Agarwal HFI_PAYLOAD_NONE,
58238fc8beaSDikshita Agarwal NULL,
58338fc8beaSDikshita Agarwal 0);
58438fc8beaSDikshita Agarwal
58538fc8beaSDikshita Agarwal ret = iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
58638fc8beaSDikshita Agarwal inst_hfi_gen2->packet->size);
58738fc8beaSDikshita Agarwal
58838fc8beaSDikshita Agarwal kfree(inst_hfi_gen2->packet);
58938fc8beaSDikshita Agarwal inst_hfi_gen2->packet = NULL;
59038fc8beaSDikshita Agarwal
59138fc8beaSDikshita Agarwal return ret;
59238fc8beaSDikshita Agarwal }
59338fc8beaSDikshita Agarwal
iris_hfi_gen2_session_subscribe_mode(struct iris_inst * inst,u32 cmd,u32 plane,u32 payload_type,void * payload,u32 payload_size)594025398e9SVedang Nagar static int iris_hfi_gen2_session_subscribe_mode(struct iris_inst *inst,
595025398e9SVedang Nagar u32 cmd, u32 plane, u32 payload_type,
596025398e9SVedang Nagar void *payload, u32 payload_size)
597025398e9SVedang Nagar {
598025398e9SVedang Nagar struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
599025398e9SVedang Nagar
600025398e9SVedang Nagar iris_hfi_gen2_packet_session_command(inst,
601025398e9SVedang Nagar cmd,
602025398e9SVedang Nagar (HFI_HOST_FLAGS_RESPONSE_REQUIRED |
603025398e9SVedang Nagar HFI_HOST_FLAGS_INTR_REQUIRED),
604025398e9SVedang Nagar iris_hfi_gen2_get_port(plane),
605025398e9SVedang Nagar inst->session_id,
606025398e9SVedang Nagar payload_type,
607025398e9SVedang Nagar payload,
608025398e9SVedang Nagar payload_size);
609025398e9SVedang Nagar
610025398e9SVedang Nagar return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
611025398e9SVedang Nagar inst_hfi_gen2->packet->size);
612025398e9SVedang Nagar }
613025398e9SVedang Nagar
iris_hfi_gen2_subscribe_change_param(struct iris_inst * inst,u32 plane)614025398e9SVedang Nagar static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plane)
615025398e9SVedang Nagar {
616025398e9SVedang Nagar struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
617025398e9SVedang Nagar struct hfi_subscription_params subsc_params;
618025398e9SVedang Nagar u32 prop_type, payload_size, payload_type;
619025398e9SVedang Nagar struct iris_core *core = inst->core;
620*820ac7feSDikshita Agarwal const u32 *change_param = NULL;
621*820ac7feSDikshita Agarwal u32 change_param_size = 0;
622025398e9SVedang Nagar u32 payload[32] = {0};
623025398e9SVedang Nagar u32 hfi_port = 0, i;
624025398e9SVedang Nagar int ret;
625025398e9SVedang Nagar
626025398e9SVedang Nagar if ((V4L2_TYPE_IS_OUTPUT(plane) && inst_hfi_gen2->ipsc_properties_set) ||
627025398e9SVedang Nagar (V4L2_TYPE_IS_CAPTURE(plane) && inst_hfi_gen2->opsc_properties_set)) {
628025398e9SVedang Nagar dev_err(core->dev, "invalid plane\n");
629025398e9SVedang Nagar return 0;
630025398e9SVedang Nagar }
631025398e9SVedang Nagar
632*820ac7feSDikshita Agarwal switch (inst->codec) {
633*820ac7feSDikshita Agarwal case V4L2_PIX_FMT_H264:
634*820ac7feSDikshita Agarwal change_param = core->iris_platform_data->input_config_params_default;
635*820ac7feSDikshita Agarwal change_param_size =
636*820ac7feSDikshita Agarwal core->iris_platform_data->input_config_params_default_size;
637*820ac7feSDikshita Agarwal break;
638*820ac7feSDikshita Agarwal case V4L2_PIX_FMT_HEVC:
639*820ac7feSDikshita Agarwal change_param = core->iris_platform_data->input_config_params_hevc;
640*820ac7feSDikshita Agarwal change_param_size =
641*820ac7feSDikshita Agarwal core->iris_platform_data->input_config_params_hevc_size;
642*820ac7feSDikshita Agarwal break;
643*820ac7feSDikshita Agarwal case V4L2_PIX_FMT_VP9:
644*820ac7feSDikshita Agarwal change_param = core->iris_platform_data->input_config_params_vp9;
645*820ac7feSDikshita Agarwal change_param_size =
646*820ac7feSDikshita Agarwal core->iris_platform_data->input_config_params_vp9_size;
647*820ac7feSDikshita Agarwal break;
648*820ac7feSDikshita Agarwal }
649025398e9SVedang Nagar
650025398e9SVedang Nagar payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE;
651025398e9SVedang Nagar
652025398e9SVedang Nagar for (i = 0; i < change_param_size; i++)
653025398e9SVedang Nagar payload[i + 1] = change_param[i];
654025398e9SVedang Nagar
655025398e9SVedang Nagar ret = iris_hfi_gen2_session_subscribe_mode(inst,
656025398e9SVedang Nagar HFI_CMD_SUBSCRIBE_MODE,
657025398e9SVedang Nagar plane,
658025398e9SVedang Nagar HFI_PAYLOAD_U32_ARRAY,
659025398e9SVedang Nagar &payload[0],
660025398e9SVedang Nagar ((change_param_size + 1) * sizeof(u32)));
661025398e9SVedang Nagar if (ret)
662025398e9SVedang Nagar return ret;
663025398e9SVedang Nagar
664025398e9SVedang Nagar if (V4L2_TYPE_IS_OUTPUT(plane)) {
665025398e9SVedang Nagar inst_hfi_gen2->ipsc_properties_set = true;
666025398e9SVedang Nagar } else {
667025398e9SVedang Nagar hfi_port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
668025398e9SVedang Nagar memcpy(&inst_hfi_gen2->dst_subcr_params,
669025398e9SVedang Nagar &inst_hfi_gen2->src_subcr_params,
670025398e9SVedang Nagar sizeof(inst_hfi_gen2->src_subcr_params));
671025398e9SVedang Nagar subsc_params = inst_hfi_gen2->dst_subcr_params;
672025398e9SVedang Nagar for (i = 0; i < change_param_size; i++) {
673025398e9SVedang Nagar payload[0] = 0;
674025398e9SVedang Nagar payload[1] = 0;
675025398e9SVedang Nagar payload_size = 0;
676025398e9SVedang Nagar payload_type = 0;
677025398e9SVedang Nagar prop_type = change_param[i];
678025398e9SVedang Nagar switch (prop_type) {
679025398e9SVedang Nagar case HFI_PROP_BITSTREAM_RESOLUTION:
680025398e9SVedang Nagar payload[0] = subsc_params.bitstream_resolution;
681025398e9SVedang Nagar payload_size = sizeof(u32);
682025398e9SVedang Nagar payload_type = HFI_PAYLOAD_U32;
683025398e9SVedang Nagar break;
684025398e9SVedang Nagar case HFI_PROP_CROP_OFFSETS:
685025398e9SVedang Nagar payload[0] = subsc_params.crop_offsets[0];
686025398e9SVedang Nagar payload[1] = subsc_params.crop_offsets[1];
687025398e9SVedang Nagar payload_size = sizeof(u64);
688025398e9SVedang Nagar payload_type = HFI_PAYLOAD_64_PACKED;
689025398e9SVedang Nagar break;
690025398e9SVedang Nagar case HFI_PROP_CODED_FRAMES:
691025398e9SVedang Nagar payload[0] = subsc_params.coded_frames;
692025398e9SVedang Nagar payload_size = sizeof(u32);
693025398e9SVedang Nagar payload_type = HFI_PAYLOAD_U32;
694025398e9SVedang Nagar break;
695*820ac7feSDikshita Agarwal case HFI_PROP_LUMA_CHROMA_BIT_DEPTH:
696*820ac7feSDikshita Agarwal payload[0] = subsc_params.bit_depth;
697*820ac7feSDikshita Agarwal payload_size = sizeof(u32);
698*820ac7feSDikshita Agarwal payload_type = HFI_PAYLOAD_U32;
699*820ac7feSDikshita Agarwal break;
700025398e9SVedang Nagar case HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT:
701025398e9SVedang Nagar payload[0] = subsc_params.fw_min_count;
702025398e9SVedang Nagar payload_size = sizeof(u32);
703025398e9SVedang Nagar payload_type = HFI_PAYLOAD_U32;
704025398e9SVedang Nagar break;
705025398e9SVedang Nagar case HFI_PROP_PIC_ORDER_CNT_TYPE:
706025398e9SVedang Nagar payload[0] = subsc_params.pic_order_cnt;
707025398e9SVedang Nagar payload_size = sizeof(u32);
708025398e9SVedang Nagar payload_type = HFI_PAYLOAD_U32;
709025398e9SVedang Nagar break;
710025398e9SVedang Nagar case HFI_PROP_SIGNAL_COLOR_INFO:
711025398e9SVedang Nagar payload[0] = subsc_params.color_info;
712025398e9SVedang Nagar payload_size = sizeof(u32);
713025398e9SVedang Nagar payload_type = HFI_PAYLOAD_U32;
714025398e9SVedang Nagar break;
715025398e9SVedang Nagar case HFI_PROP_PROFILE:
716025398e9SVedang Nagar payload[0] = subsc_params.profile;
717025398e9SVedang Nagar payload_size = sizeof(u32);
718025398e9SVedang Nagar payload_type = HFI_PAYLOAD_U32;
719025398e9SVedang Nagar break;
720025398e9SVedang Nagar case HFI_PROP_LEVEL:
721025398e9SVedang Nagar payload[0] = subsc_params.level;
722025398e9SVedang Nagar payload_size = sizeof(u32);
723025398e9SVedang Nagar payload_type = HFI_PAYLOAD_U32;
724025398e9SVedang Nagar break;
725*820ac7feSDikshita Agarwal case HFI_PROP_TIER:
726*820ac7feSDikshita Agarwal payload[0] = subsc_params.tier;
727*820ac7feSDikshita Agarwal payload_size = sizeof(u32);
728*820ac7feSDikshita Agarwal payload_type = HFI_PAYLOAD_U32;
729*820ac7feSDikshita Agarwal break;
730025398e9SVedang Nagar default:
731025398e9SVedang Nagar prop_type = 0;
732025398e9SVedang Nagar ret = -EINVAL;
733025398e9SVedang Nagar break;
734025398e9SVedang Nagar }
735025398e9SVedang Nagar if (prop_type) {
736025398e9SVedang Nagar ret = iris_hfi_gen2_session_set_property(inst,
737025398e9SVedang Nagar prop_type,
738025398e9SVedang Nagar HFI_HOST_FLAGS_NONE,
739025398e9SVedang Nagar hfi_port,
740025398e9SVedang Nagar payload_type,
741025398e9SVedang Nagar &payload,
742025398e9SVedang Nagar payload_size);
743025398e9SVedang Nagar if (ret)
744025398e9SVedang Nagar return ret;
745025398e9SVedang Nagar }
746025398e9SVedang Nagar }
747025398e9SVedang Nagar inst_hfi_gen2->opsc_properties_set = true;
748025398e9SVedang Nagar }
749025398e9SVedang Nagar
750025398e9SVedang Nagar return 0;
751025398e9SVedang Nagar }
752025398e9SVedang Nagar
iris_hfi_gen2_subscribe_property(struct iris_inst * inst,u32 plane)753025398e9SVedang Nagar static int iris_hfi_gen2_subscribe_property(struct iris_inst *inst, u32 plane)
754025398e9SVedang Nagar {
755025398e9SVedang Nagar struct iris_core *core = inst->core;
756*820ac7feSDikshita Agarwal u32 subscribe_prop_size = 0, i;
757*820ac7feSDikshita Agarwal const u32 *subcribe_prop = NULL;
758025398e9SVedang Nagar u32 payload[32] = {0};
759025398e9SVedang Nagar
760025398e9SVedang Nagar payload[0] = HFI_MODE_PROPERTY;
761025398e9SVedang Nagar
762025398e9SVedang Nagar if (V4L2_TYPE_IS_OUTPUT(plane)) {
763025398e9SVedang Nagar subscribe_prop_size = core->iris_platform_data->dec_input_prop_size;
764025398e9SVedang Nagar subcribe_prop = core->iris_platform_data->dec_input_prop;
765025398e9SVedang Nagar } else {
766*820ac7feSDikshita Agarwal switch (inst->codec) {
767*820ac7feSDikshita Agarwal case V4L2_PIX_FMT_H264:
768*820ac7feSDikshita Agarwal subcribe_prop = core->iris_platform_data->dec_output_prop_avc;
769*820ac7feSDikshita Agarwal subscribe_prop_size =
770*820ac7feSDikshita Agarwal core->iris_platform_data->dec_output_prop_avc_size;
771*820ac7feSDikshita Agarwal break;
772*820ac7feSDikshita Agarwal case V4L2_PIX_FMT_HEVC:
773*820ac7feSDikshita Agarwal subcribe_prop = core->iris_platform_data->dec_output_prop_hevc;
774*820ac7feSDikshita Agarwal subscribe_prop_size =
775*820ac7feSDikshita Agarwal core->iris_platform_data->dec_output_prop_hevc_size;
776*820ac7feSDikshita Agarwal break;
777*820ac7feSDikshita Agarwal case V4L2_PIX_FMT_VP9:
778*820ac7feSDikshita Agarwal subcribe_prop = core->iris_platform_data->dec_output_prop_vp9;
779*820ac7feSDikshita Agarwal subscribe_prop_size =
780*820ac7feSDikshita Agarwal core->iris_platform_data->dec_output_prop_vp9_size;
781*820ac7feSDikshita Agarwal break;
782*820ac7feSDikshita Agarwal }
783025398e9SVedang Nagar }
784025398e9SVedang Nagar
785025398e9SVedang Nagar for (i = 0; i < subscribe_prop_size; i++)
786025398e9SVedang Nagar payload[i + 1] = subcribe_prop[i];
787025398e9SVedang Nagar
788025398e9SVedang Nagar return iris_hfi_gen2_session_subscribe_mode(inst,
789025398e9SVedang Nagar HFI_CMD_SUBSCRIBE_MODE,
790025398e9SVedang Nagar plane,
791025398e9SVedang Nagar HFI_PAYLOAD_U32_ARRAY,
792025398e9SVedang Nagar &payload[0],
793025398e9SVedang Nagar (subscribe_prop_size + 1) * sizeof(u32));
794025398e9SVedang Nagar }
795025398e9SVedang Nagar
iris_hfi_gen2_session_start(struct iris_inst * inst,u32 plane)79611712ce7SDikshita Agarwal static int iris_hfi_gen2_session_start(struct iris_inst *inst, u32 plane)
79711712ce7SDikshita Agarwal {
79811712ce7SDikshita Agarwal struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
799025398e9SVedang Nagar int ret = 0;
800025398e9SVedang Nagar
801025398e9SVedang Nagar ret = iris_hfi_gen2_subscribe_change_param(inst, plane);
802025398e9SVedang Nagar if (ret)
803025398e9SVedang Nagar return ret;
804025398e9SVedang Nagar
805025398e9SVedang Nagar ret = iris_hfi_gen2_subscribe_property(inst, plane);
806025398e9SVedang Nagar if (ret)
807025398e9SVedang Nagar return ret;
80811712ce7SDikshita Agarwal
80911712ce7SDikshita Agarwal iris_hfi_gen2_packet_session_command(inst,
81011712ce7SDikshita Agarwal HFI_CMD_START,
81111712ce7SDikshita Agarwal (HFI_HOST_FLAGS_RESPONSE_REQUIRED |
81211712ce7SDikshita Agarwal HFI_HOST_FLAGS_INTR_REQUIRED),
81311712ce7SDikshita Agarwal iris_hfi_gen2_get_port(plane),
81411712ce7SDikshita Agarwal inst->session_id,
81511712ce7SDikshita Agarwal HFI_PAYLOAD_NONE,
81611712ce7SDikshita Agarwal NULL,
81711712ce7SDikshita Agarwal 0);
81811712ce7SDikshita Agarwal
81911712ce7SDikshita Agarwal return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
82011712ce7SDikshita Agarwal inst_hfi_gen2->packet->size);
82111712ce7SDikshita Agarwal }
82211712ce7SDikshita Agarwal
iris_hfi_gen2_session_stop(struct iris_inst * inst,u32 plane)82311712ce7SDikshita Agarwal static int iris_hfi_gen2_session_stop(struct iris_inst *inst, u32 plane)
82411712ce7SDikshita Agarwal {
82511712ce7SDikshita Agarwal struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
82611712ce7SDikshita Agarwal int ret = 0;
82711712ce7SDikshita Agarwal
82811712ce7SDikshita Agarwal reinit_completion(&inst->completion);
82911712ce7SDikshita Agarwal
83011712ce7SDikshita Agarwal iris_hfi_gen2_packet_session_command(inst,
83111712ce7SDikshita Agarwal HFI_CMD_STOP,
83211712ce7SDikshita Agarwal (HFI_HOST_FLAGS_RESPONSE_REQUIRED |
83311712ce7SDikshita Agarwal HFI_HOST_FLAGS_INTR_REQUIRED |
83411712ce7SDikshita Agarwal HFI_HOST_FLAGS_NON_DISCARDABLE),
83511712ce7SDikshita Agarwal iris_hfi_gen2_get_port(plane),
83611712ce7SDikshita Agarwal inst->session_id,
83711712ce7SDikshita Agarwal HFI_PAYLOAD_NONE,
83811712ce7SDikshita Agarwal NULL,
83911712ce7SDikshita Agarwal 0);
84011712ce7SDikshita Agarwal
84111712ce7SDikshita Agarwal ret = iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
84211712ce7SDikshita Agarwal inst_hfi_gen2->packet->size);
84311712ce7SDikshita Agarwal if (ret)
84411712ce7SDikshita Agarwal return ret;
84511712ce7SDikshita Agarwal
84611712ce7SDikshita Agarwal return iris_wait_for_session_response(inst, false);
84711712ce7SDikshita Agarwal }
84811712ce7SDikshita Agarwal
iris_hfi_gen2_session_pause(struct iris_inst * inst,u32 plane)849c1f8b2ccSDikshita Agarwal static int iris_hfi_gen2_session_pause(struct iris_inst *inst, u32 plane)
850c1f8b2ccSDikshita Agarwal {
851c1f8b2ccSDikshita Agarwal struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
852c1f8b2ccSDikshita Agarwal
853c1f8b2ccSDikshita Agarwal iris_hfi_gen2_packet_session_command(inst,
854c1f8b2ccSDikshita Agarwal HFI_CMD_PAUSE,
855c1f8b2ccSDikshita Agarwal (HFI_HOST_FLAGS_RESPONSE_REQUIRED |
856c1f8b2ccSDikshita Agarwal HFI_HOST_FLAGS_INTR_REQUIRED),
857c1f8b2ccSDikshita Agarwal iris_hfi_gen2_get_port(plane),
858c1f8b2ccSDikshita Agarwal inst->session_id,
859c1f8b2ccSDikshita Agarwal HFI_PAYLOAD_NONE,
860c1f8b2ccSDikshita Agarwal NULL,
861c1f8b2ccSDikshita Agarwal 0);
862c1f8b2ccSDikshita Agarwal
863c1f8b2ccSDikshita Agarwal return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
864c1f8b2ccSDikshita Agarwal inst_hfi_gen2->packet->size);
865c1f8b2ccSDikshita Agarwal }
866c1f8b2ccSDikshita Agarwal
iris_hfi_gen2_session_resume_drc(struct iris_inst * inst,u32 plane)867c1f8b2ccSDikshita Agarwal static int iris_hfi_gen2_session_resume_drc(struct iris_inst *inst, u32 plane)
868c1f8b2ccSDikshita Agarwal {
869c1f8b2ccSDikshita Agarwal struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
870c1f8b2ccSDikshita Agarwal u32 payload = HFI_CMD_SETTINGS_CHANGE;
871c1f8b2ccSDikshita Agarwal
872c1f8b2ccSDikshita Agarwal iris_hfi_gen2_packet_session_command(inst,
873c1f8b2ccSDikshita Agarwal HFI_CMD_RESUME,
874c1f8b2ccSDikshita Agarwal (HFI_HOST_FLAGS_RESPONSE_REQUIRED |
875c1f8b2ccSDikshita Agarwal HFI_HOST_FLAGS_INTR_REQUIRED),
876c1f8b2ccSDikshita Agarwal iris_hfi_gen2_get_port(plane),
877c1f8b2ccSDikshita Agarwal inst->session_id,
878c1f8b2ccSDikshita Agarwal HFI_PAYLOAD_U32,
879c1f8b2ccSDikshita Agarwal &payload,
880c1f8b2ccSDikshita Agarwal sizeof(u32));
881c1f8b2ccSDikshita Agarwal
882c1f8b2ccSDikshita Agarwal return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
883c1f8b2ccSDikshita Agarwal inst_hfi_gen2->packet->size);
884c1f8b2ccSDikshita Agarwal }
885c1f8b2ccSDikshita Agarwal
iris_hfi_gen2_session_resume_drain(struct iris_inst * inst,u32 plane)886d0910076SDikshita Agarwal static int iris_hfi_gen2_session_resume_drain(struct iris_inst *inst, u32 plane)
887d0910076SDikshita Agarwal {
888d0910076SDikshita Agarwal struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
889d0910076SDikshita Agarwal u32 payload = HFI_CMD_DRAIN;
890d0910076SDikshita Agarwal
891d0910076SDikshita Agarwal iris_hfi_gen2_packet_session_command(inst,
892d0910076SDikshita Agarwal HFI_CMD_RESUME,
893d0910076SDikshita Agarwal (HFI_HOST_FLAGS_RESPONSE_REQUIRED |
894d0910076SDikshita Agarwal HFI_HOST_FLAGS_INTR_REQUIRED),
895d0910076SDikshita Agarwal iris_hfi_gen2_get_port(plane),
896d0910076SDikshita Agarwal inst->session_id,
897d0910076SDikshita Agarwal HFI_PAYLOAD_U32,
898d0910076SDikshita Agarwal &payload,
899d0910076SDikshita Agarwal sizeof(u32));
900d0910076SDikshita Agarwal
901d0910076SDikshita Agarwal return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
902d0910076SDikshita Agarwal inst_hfi_gen2->packet->size);
903d0910076SDikshita Agarwal }
904d0910076SDikshita Agarwal
iris_hfi_gen2_session_drain(struct iris_inst * inst,u32 plane)905d0910076SDikshita Agarwal static int iris_hfi_gen2_session_drain(struct iris_inst *inst, u32 plane)
906d0910076SDikshita Agarwal {
907d0910076SDikshita Agarwal struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
908d0910076SDikshita Agarwal
909d0910076SDikshita Agarwal if (!V4L2_TYPE_IS_OUTPUT(plane))
910d0910076SDikshita Agarwal return 0;
911d0910076SDikshita Agarwal
912d0910076SDikshita Agarwal iris_hfi_gen2_packet_session_command(inst,
913d0910076SDikshita Agarwal HFI_CMD_DRAIN,
914d0910076SDikshita Agarwal (HFI_HOST_FLAGS_RESPONSE_REQUIRED |
915d0910076SDikshita Agarwal HFI_HOST_FLAGS_INTR_REQUIRED |
916d0910076SDikshita Agarwal HFI_HOST_FLAGS_NON_DISCARDABLE),
917d0910076SDikshita Agarwal iris_hfi_gen2_get_port(plane),
918d0910076SDikshita Agarwal inst->session_id,
919d0910076SDikshita Agarwal HFI_PAYLOAD_NONE,
920d0910076SDikshita Agarwal NULL,
921d0910076SDikshita Agarwal 0);
922d0910076SDikshita Agarwal
923d0910076SDikshita Agarwal return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
924d0910076SDikshita Agarwal inst_hfi_gen2->packet->size);
925d0910076SDikshita Agarwal }
926d0910076SDikshita Agarwal
iris_hfi_gen2_buf_type_from_driver(enum iris_buffer_type buffer_type)92773702f45SDikshita Agarwal static u32 iris_hfi_gen2_buf_type_from_driver(enum iris_buffer_type buffer_type)
92873702f45SDikshita Agarwal {
92973702f45SDikshita Agarwal switch (buffer_type) {
93073702f45SDikshita Agarwal case BUF_INPUT:
93173702f45SDikshita Agarwal return HFI_BUFFER_BITSTREAM;
93273702f45SDikshita Agarwal case BUF_OUTPUT:
93373702f45SDikshita Agarwal return HFI_BUFFER_RAW;
93473702f45SDikshita Agarwal case BUF_BIN:
93573702f45SDikshita Agarwal return HFI_BUFFER_BIN;
93673702f45SDikshita Agarwal case BUF_COMV:
93773702f45SDikshita Agarwal return HFI_BUFFER_COMV;
93873702f45SDikshita Agarwal case BUF_NON_COMV:
93973702f45SDikshita Agarwal return HFI_BUFFER_NON_COMV;
94073702f45SDikshita Agarwal case BUF_LINE:
94173702f45SDikshita Agarwal return HFI_BUFFER_LINE;
94273702f45SDikshita Agarwal case BUF_DPB:
94373702f45SDikshita Agarwal return HFI_BUFFER_DPB;
94473702f45SDikshita Agarwal case BUF_PERSIST:
94573702f45SDikshita Agarwal return HFI_BUFFER_PERSIST;
94673702f45SDikshita Agarwal default:
94773702f45SDikshita Agarwal return 0;
94873702f45SDikshita Agarwal }
94973702f45SDikshita Agarwal }
95073702f45SDikshita Agarwal
iris_set_num_comv(struct iris_inst * inst)95173702f45SDikshita Agarwal static int iris_set_num_comv(struct iris_inst *inst)
95273702f45SDikshita Agarwal {
95373702f45SDikshita Agarwal struct platform_inst_caps *caps;
95473702f45SDikshita Agarwal struct iris_core *core = inst->core;
95573702f45SDikshita Agarwal u32 num_comv;
95673702f45SDikshita Agarwal
95773702f45SDikshita Agarwal caps = core->iris_platform_data->inst_caps;
95873702f45SDikshita Agarwal num_comv = caps->num_comv;
95973702f45SDikshita Agarwal
96073702f45SDikshita Agarwal return core->hfi_ops->session_set_property(inst,
96173702f45SDikshita Agarwal HFI_PROP_COMV_BUFFER_COUNT,
96273702f45SDikshita Agarwal HFI_HOST_FLAGS_NONE,
96373702f45SDikshita Agarwal HFI_PORT_BITSTREAM,
96473702f45SDikshita Agarwal HFI_PAYLOAD_U32,
96573702f45SDikshita Agarwal &num_comv, sizeof(u32));
96673702f45SDikshita Agarwal }
96773702f45SDikshita Agarwal
iris_hfi_gen2_get_buffer(struct iris_buffer * buffer,struct iris_hfi_buffer * buf)96873702f45SDikshita Agarwal static void iris_hfi_gen2_get_buffer(struct iris_buffer *buffer, struct iris_hfi_buffer *buf)
96973702f45SDikshita Agarwal {
97073702f45SDikshita Agarwal memset(buf, 0, sizeof(*buf));
97173702f45SDikshita Agarwal buf->type = iris_hfi_gen2_buf_type_from_driver(buffer->type);
97273702f45SDikshita Agarwal buf->index = buffer->index;
97373702f45SDikshita Agarwal buf->base_address = buffer->device_addr;
97473702f45SDikshita Agarwal buf->addr_offset = 0;
97573702f45SDikshita Agarwal buf->buffer_size = buffer->buffer_size;
97673702f45SDikshita Agarwal
97773702f45SDikshita Agarwal if (buffer->type == BUF_INPUT)
97873702f45SDikshita Agarwal buf->buffer_size = ALIGN(buffer->buffer_size, 256);
97973702f45SDikshita Agarwal buf->data_offset = buffer->data_offset;
98073702f45SDikshita Agarwal buf->data_size = buffer->data_size;
98173702f45SDikshita Agarwal if (buffer->attr & BUF_ATTR_PENDING_RELEASE)
98273702f45SDikshita Agarwal buf->flags |= HFI_BUF_HOST_FLAG_RELEASE;
98373702f45SDikshita Agarwal buf->flags |= HFI_BUF_HOST_FLAGS_CB_NON_SECURE;
98473702f45SDikshita Agarwal buf->timestamp = buffer->timestamp;
98573702f45SDikshita Agarwal }
98673702f45SDikshita Agarwal
iris_hfi_gen2_session_queue_buffer(struct iris_inst * inst,struct iris_buffer * buffer)98773702f45SDikshita Agarwal static int iris_hfi_gen2_session_queue_buffer(struct iris_inst *inst, struct iris_buffer *buffer)
98873702f45SDikshita Agarwal {
98973702f45SDikshita Agarwal struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
99073702f45SDikshita Agarwal struct iris_hfi_buffer hfi_buffer;
99173702f45SDikshita Agarwal u32 port;
99273702f45SDikshita Agarwal int ret;
99373702f45SDikshita Agarwal
99473702f45SDikshita Agarwal iris_hfi_gen2_get_buffer(buffer, &hfi_buffer);
99573702f45SDikshita Agarwal if (buffer->type == BUF_COMV) {
99673702f45SDikshita Agarwal ret = iris_set_num_comv(inst);
99773702f45SDikshita Agarwal if (ret)
99873702f45SDikshita Agarwal return ret;
99973702f45SDikshita Agarwal }
100073702f45SDikshita Agarwal
100173702f45SDikshita Agarwal port = iris_hfi_gen2_get_port_from_buf_type(buffer->type);
100273702f45SDikshita Agarwal iris_hfi_gen2_packet_session_command(inst,
100373702f45SDikshita Agarwal HFI_CMD_BUFFER,
100473702f45SDikshita Agarwal HFI_HOST_FLAGS_INTR_REQUIRED,
100573702f45SDikshita Agarwal port,
100673702f45SDikshita Agarwal inst->session_id,
100773702f45SDikshita Agarwal HFI_PAYLOAD_STRUCTURE,
100873702f45SDikshita Agarwal &hfi_buffer,
100973702f45SDikshita Agarwal sizeof(hfi_buffer));
101073702f45SDikshita Agarwal
101173702f45SDikshita Agarwal return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
101273702f45SDikshita Agarwal inst_hfi_gen2->packet->size);
101373702f45SDikshita Agarwal }
101473702f45SDikshita Agarwal
iris_hfi_gen2_session_release_buffer(struct iris_inst * inst,struct iris_buffer * buffer)101573702f45SDikshita Agarwal static int iris_hfi_gen2_session_release_buffer(struct iris_inst *inst, struct iris_buffer *buffer)
101673702f45SDikshita Agarwal {
101773702f45SDikshita Agarwal struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
101873702f45SDikshita Agarwal struct iris_hfi_buffer hfi_buffer;
101973702f45SDikshita Agarwal u32 port;
102073702f45SDikshita Agarwal
102173702f45SDikshita Agarwal iris_hfi_gen2_get_buffer(buffer, &hfi_buffer);
102273702f45SDikshita Agarwal hfi_buffer.flags |= HFI_BUF_HOST_FLAG_RELEASE;
102373702f45SDikshita Agarwal port = iris_hfi_gen2_get_port_from_buf_type(buffer->type);
102473702f45SDikshita Agarwal
102573702f45SDikshita Agarwal iris_hfi_gen2_packet_session_command(inst,
102673702f45SDikshita Agarwal HFI_CMD_BUFFER,
102773702f45SDikshita Agarwal (HFI_HOST_FLAGS_RESPONSE_REQUIRED |
102873702f45SDikshita Agarwal HFI_HOST_FLAGS_INTR_REQUIRED),
102973702f45SDikshita Agarwal port,
103073702f45SDikshita Agarwal inst->session_id,
103173702f45SDikshita Agarwal HFI_PAYLOAD_STRUCTURE,
103273702f45SDikshita Agarwal &hfi_buffer,
103373702f45SDikshita Agarwal sizeof(hfi_buffer));
103473702f45SDikshita Agarwal
103573702f45SDikshita Agarwal return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet,
103673702f45SDikshita Agarwal inst_hfi_gen2->packet->size);
103773702f45SDikshita Agarwal }
103873702f45SDikshita Agarwal
1039fb583a21SDikshita Agarwal static const struct iris_hfi_command_ops iris_hfi_gen2_command_ops = {
1040fb583a21SDikshita Agarwal .sys_init = iris_hfi_gen2_sys_init,
1041fb583a21SDikshita Agarwal .sys_image_version = iris_hfi_gen2_sys_image_version,
1042fb583a21SDikshita Agarwal .sys_interframe_powercollapse = iris_hfi_gen2_sys_interframe_powercollapse,
1043bb8a95aaSDikshita Agarwal .sys_pc_prep = iris_hfi_gen2_sys_pc_prep,
104438fc8beaSDikshita Agarwal .session_open = iris_hfi_gen2_session_open,
10453a19d7b9SVedang Nagar .session_set_config_params = iris_hfi_gen2_session_set_config_params,
10463a19d7b9SVedang Nagar .session_set_property = iris_hfi_gen2_session_set_property,
104711712ce7SDikshita Agarwal .session_start = iris_hfi_gen2_session_start,
104873702f45SDikshita Agarwal .session_queue_buf = iris_hfi_gen2_session_queue_buffer,
104973702f45SDikshita Agarwal .session_release_buf = iris_hfi_gen2_session_release_buffer,
1050c1f8b2ccSDikshita Agarwal .session_pause = iris_hfi_gen2_session_pause,
1051c1f8b2ccSDikshita Agarwal .session_resume_drc = iris_hfi_gen2_session_resume_drc,
105211712ce7SDikshita Agarwal .session_stop = iris_hfi_gen2_session_stop,
1053d0910076SDikshita Agarwal .session_drain = iris_hfi_gen2_session_drain,
1054d0910076SDikshita Agarwal .session_resume_drain = iris_hfi_gen2_session_resume_drain,
105538fc8beaSDikshita Agarwal .session_close = iris_hfi_gen2_session_close,
1056fb583a21SDikshita Agarwal };
1057fb583a21SDikshita Agarwal
iris_hfi_gen2_command_ops_init(struct iris_core * core)1058fb583a21SDikshita Agarwal void iris_hfi_gen2_command_ops_init(struct iris_core *core)
1059fb583a21SDikshita Agarwal {
1060fb583a21SDikshita Agarwal core->hfi_ops = &iris_hfi_gen2_command_ops;
1061fb583a21SDikshita Agarwal }
1062fa186c97SDikshita Agarwal
iris_hfi_gen2_get_instance(void)1063fa186c97SDikshita Agarwal struct iris_inst *iris_hfi_gen2_get_instance(void)
1064fa186c97SDikshita Agarwal {
1065fa186c97SDikshita Agarwal return kzalloc(sizeof(struct iris_inst_hfi_gen2), GFP_KERNEL);
1066fa186c97SDikshita Agarwal }
1067