Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
d5e7e5f
FROMLIST: media: iris: Skip UBWC configuration when not supported
dikshita-agarwal May 15, 2026
be58639
FROMLIST: media: iris: Filter UBWC raw formats based on hardware capa…
dikshita-agarwal May 15, 2026
13a9205
FROMLIST: media: iris: Introduce set_preset_register as a vpu_op
dikshita-agarwal May 15, 2026
6f9f8b1
FROMLIST: media: iris: Introduce interrupt_init as a vpu_op
dikshita-agarwal May 15, 2026
baf8740
FROMLIST: media: iris: add vpu op hook to disable ARP buffer
dikshita-agarwal May 15, 2026
f2f4475
FROMLIST: media: iris: Add platform data field for watchdog interrupt…
dikshita-agarwal May 15, 2026
fb41722
FROMLIST: media: iris: Add platform flag for instantaneous bandwidth …
dikshita-agarwal May 15, 2026
1b912a7
FROMLIST: media: iris: skip PIPE if it is not supported by the platform
lumag May 15, 2026
f2acce7
FROMLIST: media: iris: Add framework support for AR50_LITE video core
dikshita-agarwal May 15, 2026
cbea5e2
FROMLIST: media: iris: add minimal GET_PROPERTY implementation
lumag May 15, 2026
23c1a47
FROMLIST: media: iris: update buffer requirements based on received info
lumag May 15, 2026
3e27177
FROMLIST: media: iris: implement support for the Agatti platform
lumag May 15, 2026
15f1c70
FROMLIST: media: iris: Introduce buffer size calculations for AR50LT
dikshita-agarwal May 15, 2026
45f76da
FROMLIST: media: iris: add Gen2 firmware support on the Agatti platform
dikshita-agarwal May 15, 2026
e2ede55
Revert "FROMLIST: media: venus: prefer iris driver for qcm2290 when I…
gouravk-qualcomm Jun 9, 2026
c357994
FROMLIST: media: venus: skip QCM2290 if Iris driver is enabled
lumag May 15, 2026
16db6a1
FROMLIST: media: iris: constify inst_fw_cap_sm8250_dec
lumag May 15, 2026
2d84d68
FROMLIST: arm64: dts: qcom: shikra: Add Iris video codec node
dikshita-agarwal Apr 20, 2026
4c7bb65
FROMLIST: arm64: dts: qcom: shikra-evk: Enable Iris core
dikshita-agarwal Apr 20, 2026
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
6 changes: 6 additions & 0 deletions arch/arm64/boot/dts/qcom/shikra-evk.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
*/

&iris {
firmware-name = "qcom/vpu/ar50lt_p1_gen2_s6.mbn";

status = "okay";
};

&qupv3_0 {
firmware-name = "qcom/shikra/qupv3fw.elf";
status = "okay";
Expand Down
61 changes: 61 additions & 0 deletions arch/arm64/boot/dts/qcom/shikra.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -2283,6 +2283,67 @@
status = "disabled";
};

iris: video-codec@5a00000 {
compatible = "qcom,shikra-iris", "qcom,qcm2290-venus";
reg = <0x0 0x5a00000 0x0 0x200000>;
interrupts = <GIC_SPI 225 IRQ_TYPE_LEVEL_HIGH 0>;

power-domains = <&gcc GCC_VENUS_GDSC>,
<&gcc GCC_VCODEC0_GDSC>,
<&rpmpd QCM2290_VDDCX>;
power-domain-names = "venus",
"vcodec0",
"cx";
operating-points-v2 = <&venus_opp_table>;

clocks = <&gcc GCC_VIDEO_VENUS_CTL_CLK>,
<&gcc GCC_VIDEO_AHB_CLK>,
<&gcc GCC_VENUS_CTL_AXI_CLK>,
<&gcc GCC_VIDEO_THROTTLE_CORE_CLK>,
<&gcc GCC_VIDEO_VCODEC0_SYS_CLK>,
<&gcc GCC_VCODEC0_AXI_CLK>;
clock-names = "core",
"iface",
"bus",
"throttle",
"vcodec0_core",
"vcodec0_bus";

memory-region = <&video_mem>;
interconnects = <&mmnrt_virt MASTER_VIDEO_P0 RPM_ALWAYS_TAG
&mc_virt SLAVE_EBI_CH0 RPM_ALWAYS_TAG>,
<&mem_noc MASTER_AMPSS_M0 RPM_ACTIVE_TAG
&config_noc SLAVE_VENUS_CFG RPM_ACTIVE_TAG>;
interconnect-names = "video-mem",
"cpu-cfg";

iommus = <&apps_smmu 0x780 0x0020>;

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

opp-133333333 {
opp-hz = /bits/ 64 <133333333>;
required-opps = <&rpmpd_opp_low_svs>;
};

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

opp-300000000 {
opp-hz = /bits/ 64 <300000000>;
required-opps = <&rpmpd_opp_svs_plus>;
};

opp-384000000 {
opp-hz = /bits/ 64 <384000000>;
required-opps = <&rpmpd_opp_nom>;
};
};
};

sram@c11e000 {
compatible = "qcom,shikra-imem", "mmio-sram";
reg = <0x0 0x0c11e000 0x0 0x1000>;
Expand Down
2 changes: 2 additions & 0 deletions drivers/media/platform/qcom/iris/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ qcom-iris-objs += iris_buffer.o \
iris_hfi_queue.o \
iris_platform_vpu2.o \
iris_platform_vpu3x.o \
iris_platform_vpu_ar50lt.o \
iris_power.o \
iris_probe.o \
iris_resources.o \
Expand All @@ -26,6 +27,7 @@ qcom-iris-objs += iris_buffer.o \
iris_vpu2.o \
iris_vpu3x.o \
iris_vpu4x.o \
iris_vpu_ar50lt.o \
iris_vpu_buffer.o \
iris_vpu_common.o \

Expand Down
4 changes: 4 additions & 0 deletions drivers/media/platform/qcom/iris/iris_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ static int iris_wait_for_system_response(struct iris_core *core)

int iris_core_init(struct iris_core *core)
{
const struct vpu_ops *vpu_ops = core->iris_platform_data->vpu_ops;
int ret;

mutex_lock(&core->lock);
Expand Down Expand Up @@ -79,6 +80,9 @@ int iris_core_init(struct iris_core *core)
if (ret)
goto error_unload_fw;

if (vpu_ops->disable_arp)
vpu_ops->disable_arp(core);

core->iris_firmware_data->init_hfi_ops(core);

ret = iris_vpu_switch_to_hwmode(core);
Expand Down
3 changes: 3 additions & 0 deletions drivers/media/platform/qcom/iris/iris_ctrls.c
Original file line number Diff line number Diff line change
Expand Up @@ -450,6 +450,9 @@ int iris_set_pipe(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
u32 work_route = inst->fw_caps[PIPE].value;
u32 hfi_id = inst->fw_caps[cap_id].hfi_id;

if (!hfi_id)
return 0;

return hfi_ops->session_set_property(inst, hfi_id,
HFI_HOST_FLAGS_NONE,
iris_get_port_info(inst, cap_id),
Expand Down
4 changes: 4 additions & 0 deletions drivers/media/platform/qcom/iris/iris_hfi_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ int iris_hfi_pm_suspend(struct iris_core *core)

int iris_hfi_pm_resume(struct iris_core *core)
{
const struct vpu_ops *vpu_ops = core->iris_platform_data->vpu_ops;
const struct iris_hfi_sys_ops *ops = core->hfi_sys_ops;
int ret;

Expand All @@ -163,6 +164,9 @@ int iris_hfi_pm_resume(struct iris_core *core)
if (ret)
goto err_suspend_hw;

if (vpu_ops->disable_arp)
vpu_ops->disable_arp(core);

ret = ops->sys_interframe_powercollapse(core);
if (ret)
goto err_suspend_hw;
Expand Down
1 change: 1 addition & 0 deletions drivers/media/platform/qcom/iris/iris_hfi_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ struct iris_hfi_session_ops {
int (*session_set_property)(struct iris_inst *inst,
u32 packet_type, u32 flag, u32 plane, u32 payload_type,
void *payload, u32 payload_size);
int (*session_get_property)(struct iris_inst *inst, u32 packet_type);
int (*session_open)(struct iris_inst *inst);
int (*session_start)(struct iris_inst *inst, u32 plane);
int (*session_queue_buf)(struct iris_inst *inst, struct iris_buffer *buffer);
Expand Down
229 changes: 228 additions & 1 deletion drivers/media/platform/qcom/iris/iris_hfi_gen1.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#define BITRATE_MAX 160000000
#define BITRATE_STEP 100

static struct platform_inst_fw_cap inst_fw_cap_sm8250_dec[] = {
static const struct platform_inst_fw_cap inst_fw_cap_sm8250_dec[] = {
{
.cap_id = PIPE,
/* .max, .min and .value are set via platform data */
Expand Down Expand Up @@ -285,3 +285,230 @@ const struct iris_firmware_data iris_hfi_gen1_data = {
.enc_ip_int_buf_tbl = sm8250_enc_ip_int_buf_tbl,
.enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8250_enc_ip_int_buf_tbl),
};

static const struct platform_inst_fw_cap iris_inst_fw_cap_gen1_ar50lt_dec[] = {
{
.cap_id = STAGE,
.min = STAGE_1,
.max = STAGE_2,
.step_or_mask = 1,
.value = STAGE_2,
.hfi_id = HFI_PROPERTY_PARAM_WORK_MODE,
.set = iris_set_stage,
},
};

static const struct platform_inst_fw_cap inst_fw_cap_gen1_ar50lt_enc[] = {
{
.cap_id = STAGE,
.min = STAGE_1,
.max = STAGE_2,
.step_or_mask = 1,
.value = STAGE_2,
.hfi_id = HFI_PROPERTY_PARAM_WORK_MODE,
.set = iris_set_stage,
},
{
.cap_id = PROFILE_H264,
.min = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE,
.max = V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH,
.step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH) |
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH) |
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH),
.value = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
.hfi_id = HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
.set = iris_set_profile_level_gen1,
},
{
.cap_id = PROFILE_HEVC,
.min = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
.max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE,
.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN) |
BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE),
.value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
.hfi_id = HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
.set = iris_set_profile_level_gen1,
},
{
.cap_id = LEVEL_H264,
.min = V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
.max = V4L2_MPEG_VIDEO_H264_LEVEL_4_2,
.step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1B) |
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_1) |
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_2) |
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_3) |
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_1) |
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_2) |
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_0) |
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_1) |
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_2),
.value = V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
.hfi_id = HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
.set = iris_set_profile_level_gen1,
},
{
.cap_id = LEVEL_HEVC,
.min = V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
.max = V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1,
.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) |
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2) |
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1) |
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3) |
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1) |
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4) |
BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1),
.value = V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
.hfi_id = HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
.set = iris_set_profile_level_gen1,
},
{
.cap_id = HEADER_MODE,
.min = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
.max = V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) |
BIT(V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME),
.value = V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
.hfi_id = HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
.set = iris_set_header_mode_gen1,
},
{
.cap_id = BITRATE,
.min = BITRATE_MIN,
.max = BITRATE_MAX_AR50LT,
.step_or_mask = BITRATE_STEP,
.value = BITRATE_DEFAULT_AR50LT,
.hfi_id = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_bitrate,
},
{
.cap_id = BITRATE_MODE,
.min = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
.max = V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
.step_or_mask = BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) |
BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_CBR),
.value = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
.hfi_id = HFI_PROPERTY_PARAM_VENC_RATE_CONTROL,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
.set = iris_set_bitrate_mode_gen1,
},
{
.cap_id = FRAME_SKIP_MODE,
.min = V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED,
.max = V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT,
.step_or_mask = BIT(V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED) |
BIT(V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT),
.value = V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
},
{
.cap_id = FRAME_RC_ENABLE,
.min = 0,
.max = 1,
.step_or_mask = 1,
.value = 1,
},
{
.cap_id = GOP_SIZE,
.min = 0,
.max = (1 << 16) - 1,
.step_or_mask = 1,
.value = 30,
.set = iris_set_u32
},
{
.cap_id = ENTROPY_MODE,
.min = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC,
.max = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC,
.step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC) |
BIT(V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC),
.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC,
.hfi_id = HFI_PROPERTY_PARAM_VENC_H264_ENTROPY_CONTROL,
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
.set = iris_set_entropy_mode_gen1,
},
{
.cap_id = MIN_FRAME_QP_H264,
.min = MIN_QP_8BIT_AR50LT,
.max = MAX_QP,
.step_or_mask = 1,
.value = MIN_QP_8BIT_AR50LT,
.hfi_id = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2,
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_qp_range,
},
{
.cap_id = MIN_FRAME_QP_HEVC,
.min = MIN_QP_8BIT_AR50LT,
.max = MAX_QP_HEVC,
.step_or_mask = 1,
.value = MIN_QP_8BIT_AR50LT,
.hfi_id = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2,
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_qp_range,
},
{
.cap_id = MAX_FRAME_QP_H264,
.min = MIN_QP_8BIT_AR50LT,
.max = MAX_QP,
.step_or_mask = 1,
.value = MAX_QP,
.hfi_id = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2,
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_qp_range,
},
{
.cap_id = MAX_FRAME_QP_HEVC,
.min = MIN_QP_8BIT_AR50LT,
.max = MAX_QP_HEVC,
.step_or_mask = 1,
.value = MAX_QP_HEVC,
.hfi_id = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2,
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_qp_range,
},
};

static const u32 iris_hfi_gen2_ar50lt_dec_ip_int_buf_tbl[] = {
BUF_BIN,
BUF_SCRATCH_1,
};

const struct iris_firmware_data iris_hfi_gen1_ar50lt_data = {
.init_hfi_ops = &iris_hfi_gen1_sys_ops_init,

.inst_fw_caps_dec = iris_inst_fw_cap_gen1_ar50lt_dec,
.inst_fw_caps_dec_size = ARRAY_SIZE(iris_inst_fw_cap_gen1_ar50lt_dec),
.inst_fw_caps_enc = inst_fw_cap_gen1_ar50lt_enc,
.inst_fw_caps_enc_size = ARRAY_SIZE(inst_fw_cap_gen1_ar50lt_enc),

.dec_input_config_params_default =
sm8250_vdec_input_config_param_default,
.dec_input_config_params_default_size =
ARRAY_SIZE(sm8250_vdec_input_config_param_default),
.enc_input_config_params = sm8250_venc_input_config_param,
.enc_input_config_params_size =
ARRAY_SIZE(sm8250_venc_input_config_param),

.dec_ip_int_buf_tbl = iris_hfi_gen2_ar50lt_dec_ip_int_buf_tbl,
.dec_ip_int_buf_tbl_size = ARRAY_SIZE(iris_hfi_gen2_ar50lt_dec_ip_int_buf_tbl),
.dec_op_int_buf_tbl = sm8250_dec_op_int_buf_tbl,
.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8250_dec_op_int_buf_tbl),

.enc_ip_int_buf_tbl = sm8250_enc_ip_int_buf_tbl,
.enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8250_enc_ip_int_buf_tbl),
};
Loading