Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e534b65
FROMLIST: media: iris: remove v4l2_m2m_ioctl_{de,en}coder_cmd API usa…
dikshita-agarwal Nov 2, 2025
757b255
FROMLIST: media: venus: vdec: restrict EOS addr quirk to IRIS2 only
dikshita-agarwal Nov 25, 2025
7b7df26
FROMLIST: media: uapi: videodev2: Add support for AV1 stateful decoder
dmadival Dec 10, 2025
86df763
FROMLIST: media: v4l2: Add description for V4L2_PIX_FMT_AV1 in v4l_fi…
dmadival Dec 10, 2025
852b420
FROMLIST: media: iris: Add support for AV1 format in iris decoder
dmadival Dec 10, 2025
60d5985
FROMLIST: media: iris: Define AV1-specific platform capabilities and …
dmadival Dec 10, 2025
c98be2e
FROMLIST: media: iris: Add internal buffer calculation for AV1 decoder
dmadival Dec 10, 2025
97ec620
FROMLIST: media: dt-bindings: qcom-kaanapali-iris: Add kaanapali vide…
Oct 17, 2025
fe33f6b
FROMLIST: media: iris: Add support for multiple clock sources
Dec 10, 2025
5d8b469
FROMLIST: media: iris: Add support for multiple TZ content protection…
Dec 10, 2025
f06b4a9
FROMLIST: media: iris: Introduce buffer size calculations for vpu4
Dec 10, 2025
71ef4df
FROMLIST: media: iris: Move vpu register defines to common header file
Dec 10, 2025
d91c712
FROMLIST: media: iris: Move vpu35 specific api to common to use for vpu4
Dec 10, 2025
435be65
FROMLIST: media: iris: Introduce vpu ops for vpu4 with necessary hooks
Dec 10, 2025
b5deb4a
FROMLIST: media: iris: Add missing platform data entries for SM8750
dikshita-agarwal Dec 18, 2025
4871417
FROMLIST: media: iris: Add platform data for kaanapali
Oct 17, 2025
a20c662
FROMLIST: media: qcom: iris: Improve format alignment for encoder
Nov 14, 2025
108b6a6
FROMLIST: media: qcom: iris: Improve crop_offset handling for encoder
Nov 14, 2025
38b3519
FROMLIST: media: qcom: iris: Add scale support for encoder
Nov 14, 2025
6f6f890
FROMLIST: media: qcom: iris: Add rotation support for encoder
Nov 14, 2025
25e311c
FROMLIST: media: qcom: iris: Add flip support for encoder
Nov 14, 2025
57e668e
FROMLIST: media: qcom: iris: Add intra refresh support for encoder
Nov 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
231 changes: 231 additions & 0 deletions Documentation/devicetree/bindings/media/qcom,kaanapali-iris.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/media/qcom,kaanapali-iris.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Qualcomm Kaanapali Iris video encoder and decoder

maintainers:
- Vikash Garodia <vikash.garodia@oss.qualcomm.com>
- Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>

description:
The iris video processing unit is a video encode and decode accelerator
present on Qualcomm Kaanapali SoC.

properties:
compatible:
const: qcom,kaanapali-iris

reg:
maxItems: 1

clocks:
maxItems: 10

clock-names:
items:
- const: iface
- const: core
- const: vcodec0_core
- const: iface1
- const: core_freerun
- const: vcodec0_core_freerun
- const: vcodec_bse
- const: vcodec_vpp0
- const: vcodec_vpp1
- const: vcodec_apv

dma-coherent: true

firmware-name:
maxItems: 1

interconnects:
maxItems: 2

interconnect-names:
items:
- const: cpu-cfg
- const: video-mem

interrupts:
maxItems: 1

iommus:
minItems: 3
maxItems: 8

memory-region:
minItems: 1
maxItems: 2

operating-points-v2: true
opp-table:
type: object

power-domains:
maxItems: 7

power-domain-names:
items:
- const: venus
- const: vcodec0
- const: mxc
- const: mmcx
- const: vpp0
- const: vpp1
- const: apv

resets:
maxItems: 4

reset-names:
items:
- const: bus0
- const: bus1
- const: core_freerun_reset
- const: vcodec0_core_freerun_reset

required:
- compatible
- reg
- clocks
- clock-names
- dma-coherent
- interconnects
- interconnect-names
- interrupts
- iommus
- power-domains
- power-domain-names
- resets
- reset-names

unevaluatedProperties: false

examples:
- |
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/power/qcom,rpmhpd.h>

video-codec@2000000 {
compatible = "qcom,kaanapali-iris";
reg = <0x02000000 0xf0000>;

clocks = <&gcc_video_axi0_clk>,
<&video_cc_mvs0c_clk>,
<&video_cc_mvs0_clk>,
<&gcc_video_axi1_clk>,
<&video_cc_mvs0c_freerun_clk>,
<&video_cc_mvs0_freerun_clk>,
<&video_cc_mvs0b_clk>,
<&video_cc_mvs0_vpp0_clk>,
<&video_cc_mvs0_vpp1_clk>,
<&video_cc_mvs0a_clk>;
clock-names = "iface",
"core",
"vcodec0_core",
"iface1",
"core_freerun",
"vcodec0_core_freerun",
"vcodec_bse",
"vcodec_vpp0",
"vcodec_vpp1",
"vcodec_apv";

dma-coherent;

interconnects = <&gem_noc_master_appss_proc &config_noc_slave_venus_cfg>,
<&mmss_noc_master_video_mvp &mc_virt_slave_ebi1>;
interconnect-names = "cpu-cfg",
"video-mem";

interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>;

iommus = <&apps_smmu 0x1940 0x0>,
<&apps_smmu 0x1944 0x0>,
<&apps_smmu 0x1a20 0x0>,
<&apps_smmu 0x1943 0x0>;

operating-points-v2 = <&iris_opp_table>;

memory-region = <&video_mem>, <&iris_resv>;

power-domains = <&video_cc_mvs0c_gdsc>,
<&video_cc_mvs0_gdsc>,
<&rpmhpd RPMHPD_MXC>,
<&rpmhpd RPMHPD_MMCX>,
<&video_cc_mvs0_vpp0_gdsc>,
<&video_cc_mvs0_vpp1_gdsc>,
<&video_cc_mvs0a_gdsc>;
power-domain-names = "venus",
"vcodec0",
"mxc",
"mmcx",
"vpp0",
"vpp1",
"apv";

resets = <&gcc_video_axi0_clk_ares>,
<&gcc_video_axi1_clk_ares>,
<&video_cc_mvs0c_freerun_clk_ares>,
<&video_cc_mvs0_freerun_clk_ares>;
reset-names = "bus0",
"bus1",
"core_freerun_reset",
"vcodec0_core_freerun_reset";

iris_opp_table: opp-table {
compatible = "operating-points-v2";

opp-240000000 {
opp-hz = /bits/ 64 <240000000 240000000 240000000 360000000>;
required-opps = <&rpmhpd_opp_low_svs_d1>,
<&rpmhpd_opp_low_svs_d1>;
};

opp-338000000 {
opp-hz = /bits/ 64 <338000000 338000000 338000000 507000000>;
required-opps = <&rpmhpd_opp_low_svs>,
<&rpmhpd_opp_low_svs>;
};

opp-420000000 {
opp-hz = /bits/ 64 <420000000 420000000 420000000 630000000>;
required-opps = <&rpmhpd_opp_svs>,
<&rpmhpd_opp_svs>;
};

opp-444000000 {
opp-hz = /bits/ 64 <444000000 444000000 444000000 666000000>;
required-opps = <&rpmhpd_opp_svs_l1>,
<&rpmhpd_opp_svs_l1>;
};

opp-533000000 {
opp-hz = /bits/ 64 <533000000 533000000 533000000 800000000>;
required-opps = <&rpmhpd_opp_nom>,
<&rpmhpd_opp_nom>;
};

opp-630000000 {
opp-hz = /bits/ 64 <630000000 630000000 630000000 1104000000>;
required-opps = <&rpmhpd_opp_turbo>,
<&rpmhpd_opp_turbo>;
};

opp-800000000 {
opp-hz = /bits/ 64 <800000000 630000000 630000000 1260000000>;
required-opps = <&rpmhpd_opp_turbo_l0>,
<&rpmhpd_opp_turbo_l0>;
};

opp-1000000000 {
opp-hz = /bits/ 64 <1000000000 630000000 850000000 1260000000>;
required-opps = <&rpmhpd_opp_turbo_l1>,
<&rpmhpd_opp_turbo_l1>;
};
};
};
8 changes: 8 additions & 0 deletions Documentation/userspace-api/media/v4l/pixfmt-compressed.rst
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,14 @@ Compressed Formats
of macroblocks to decode a full corresponding frame to the matching
capture buffer.

* .. _V4L2-PIX-FMT-AV1:

- ``V4L2_PIX_FMT_AV1``
- 'AV01'
- AV1 compressed video frame. This format is adapted for implementing AV1
pipeline. The decoder implements stateful video decoder and expects one
temporal unit per buffer in OBU stream format.
The encoder generates one Temporal Unit per buffer.
.. raw:: latex

\normalsize
1 change: 1 addition & 0 deletions drivers/media/platform/qcom/iris/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ qcom-iris-objs += iris_buffer.o \
iris_venc.o \
iris_vpu2.o \
iris_vpu3x.o \
iris_vpu4x.o \
iris_vpu_buffer.o \
iris_vpu_common.o \

Expand Down
2 changes: 2 additions & 0 deletions drivers/media/platform/qcom/iris/iris_buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ struct iris_inst;
* @BUF_SCRATCH_1: buffer to store decoding/encoding context data for HW
* @BUF_SCRATCH_2: buffer to store encoding context data for HW
* @BUF_VPSS: buffer to store VPSS context data for HW
* @BUF_PARTIAL: buffer for AV1 IBC data
* @BUF_TYPE_MAX: max buffer types
*/
enum iris_buffer_type {
Expand All @@ -42,6 +43,7 @@ enum iris_buffer_type {
BUF_SCRATCH_1,
BUF_SCRATCH_2,
BUF_VPSS,
BUF_PARTIAL,
BUF_TYPE_MAX,
};

Expand Down
103 changes: 103 additions & 0 deletions drivers/media/platform/qcom/iris/iris_ctrls.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,20 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
return B_FRAME_QP_H264;
case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:
return B_FRAME_QP_HEVC;
case V4L2_CID_MPEG_VIDEO_AV1_PROFILE:
return PROFILE_AV1;
case V4L2_CID_MPEG_VIDEO_AV1_LEVEL:
return LEVEL_AV1;
case V4L2_CID_ROTATE:
return ROTATION;
case V4L2_CID_HFLIP:
return HFLIP;
case V4L2_CID_VFLIP:
return VFLIP;
case V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE:
return IR_TYPE;
case V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD:
return IR_PERIOD;
default:
return INST_FW_CAP_MAX;
}
Expand Down Expand Up @@ -185,6 +199,20 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
return V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
case B_FRAME_QP_HEVC:
return V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP;
case PROFILE_AV1:
return V4L2_CID_MPEG_VIDEO_AV1_PROFILE;
case LEVEL_AV1:
return V4L2_CID_MPEG_VIDEO_AV1_LEVEL;
case ROTATION:
return V4L2_CID_ROTATE;
case HFLIP:
return V4L2_CID_HFLIP;
case VFLIP:
return V4L2_CID_VFLIP;
case IR_TYPE:
return V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE;
case IR_PERIOD:
return V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD;
default:
return 0;
}
Expand Down Expand Up @@ -893,6 +921,81 @@ int iris_set_qp_range(struct iris_inst *inst, enum platform_inst_fw_cap_type cap
&range, sizeof(range));
}

int iris_set_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
{
const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
u32 hfi_val;

switch (inst->fw_caps[cap_id].value) {
case 0:
hfi_val = HFI_ROTATION_NONE;
return 0;
case 90:
hfi_val = HFI_ROTATION_90;
break;
case 180:
hfi_val = HFI_ROTATION_180;
break;
case 270:
hfi_val = HFI_ROTATION_270;
break;
default:
return -EINVAL;
}

return hfi_ops->session_set_property(inst, hfi_id,
HFI_HOST_FLAGS_NONE,
iris_get_port_info(inst, cap_id),
HFI_PAYLOAD_U32,
&hfi_val, sizeof(u32));
}

int iris_set_flip(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
{
const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
u32 hfi_val = HFI_DISABLE_FLIP;

if (inst->fw_caps[HFLIP].value)
hfi_val |= HFI_HORIZONTAL_FLIP;

if (inst->fw_caps[VFLIP].value)
hfi_val |= HFI_VERTICAL_FLIP;

return hfi_ops->session_set_property(inst, hfi_id,
HFI_HOST_FLAGS_NONE,
iris_get_port_info(inst, cap_id),
HFI_PAYLOAD_U32_ENUM,
&hfi_val, sizeof(u32));
}

int iris_set_ir_period(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
{
const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
struct vb2_queue *q = v4l2_m2m_get_dst_vq(inst->m2m_ctx);
u32 ir_period = inst->fw_caps[cap_id].value;
u32 ir_type = 0;

if (inst->fw_caps[IR_TYPE].value ==
V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM) {
if (vb2_is_streaming(q))
return 0;
ir_type = HFI_PROP_IR_RANDOM_PERIOD;
} else if (inst->fw_caps[IR_TYPE].value ==
V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC) {
ir_type = HFI_PROP_IR_CYCLIC_PERIOD;
} else {
return -EINVAL;
}

return hfi_ops->session_set_property(inst, ir_type,
HFI_HOST_FLAGS_NONE,
iris_get_port_info(inst, cap_id),
HFI_PAYLOAD_U32,
&ir_period, sizeof(u32));
}

int iris_set_properties(struct iris_inst *inst, u32 plane)
{
const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
Expand Down
Loading