mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH v2 0/3] media: qcom: iris: Add support for Gen2 firmware detection and loading on SC7280
@ 2026-02-27  6:51 Dikshita Agarwal
  2026-02-27  6:51 ` [PATCH v2 1/3] media: iris: Switch to hardware mode after firmware boot Dikshita Agarwal
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Dikshita Agarwal @ 2026-02-27  6:51 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Bryan O'Donoghue,
	Mauro Carvalho Chehab, Hans Verkuil, Vishnu Reddy
  Cc: linux-media, linux-arm-msm, linux-kernel, Dikshita Agarwal,
	Bryan O'Donoghue

This series adds support for running the Iris driver on SC7280 using the 
Gen2 HFI‑based firmware. While SC7280 hardware is capable of operating 
with either Gen1 or Gen2 HFI, the driver has so far only enabled Gen1 by 
default.

Some platforms may choose to deploy the updated Gen2 firmware. To 
accommodate this, the series introduces logic to detect whether the 
loaded firmware is Gen1 or Gen2 by parsing the image version string 
embedded in the firmware blob. When Gen2 firmware is detected, the 
driver updates its platform data accordingly and switches to the Gen2 
HFI configuration. At present, this behavior is enabled only for SC7280, 
but the detection logic is generic and can be extended to any SoC that 
supports both Gen1 and Gen2 configurations.

The series has been validated with both Gen1 and Gen2 firmware paths on 
SC7280.

Note: Patch [1/3] includes a fix for the GDSC mode switching issue 
described in [1] ], which was encountered during validation with Gen2 
firmware on SC7280. This patch can be dropped from this series if the 
other series including the same fix is merged first.

[1]: https://lore.kernel.org/linux-media/20260126-kaanapali-iris-v1-4-e2646246bfc1@oss.qualcomm.com/
 
v4l2-compliance results on SC7280 with Gen2 firmware:

$ v4l2-compliance -d /dev/video1 -s
v4l2-compliance 1.28.1-5233, 64 bits, 64-bit time_t
v4l2-compliance SHA: fc15e229d9d3 2024-07-23 19:22:15

compliance test for iris_driver device /dev/video1:
Driver Info:
        Driver name      : iris_driver
        Card type        : Iris Encoder
        Bus info         : platform:aa00000.video-codec
        Driver version   : 6.19.0
        Capabilities     : 0x84204000
                Video Memory-to-Memory Multiplanar
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps      : 0x04204000
                Video Memory-to-Memory Multiplanar
                Streaming
                Extended Pix Format
        Detected Stateful Encoder

Required ioctls:
        test VIDIOC_QUERYCAP: OK
        test invalid ioctls: OK

Allow for multiple opens:
        test second /dev/video1 open: OK
        test VIDIOC_QUERYCAP: OK
        test VIDIOC_G/S_PRIORITY: OK
        test for unlimited opens: OK

Debug ioctls:
        test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
        test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
        test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
        test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
        test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
        test VIDIOC_ENUMAUDIO: OK (Not Supported)
        test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
        test VIDIOC_G/S_AUDIO: OK (Not Supported)
        Inputs: 0 Audio Inputs: 0 Tuners: 0

Output ioctls:
        test VIDIOC_G/S_MODULATOR: OK (Not Supported)
        test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
        test VIDIOC_ENUMAUDOUT: OK (Not Supported)
        test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
        test VIDIOC_G/S_AUDOUT: OK (Not Supported)
        Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
        test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
        test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
        test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
        test VIDIOC_G/S_EDID: OK (Not Supported)

Control ioctls:
        test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK
        test VIDIOC_QUERYCTRL: OK
        test VIDIOC_G/S_CTRL: OK
        test VIDIOC_G/S/TRY_EXT_CTRLS: OK
        test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK
        test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
        Standard Controls: 38 Private Controls: 0

Format ioctls:
        test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
        test VIDIOC_G/S_PARM: OK
        test VIDIOC_G_FBUF: OK (Not Supported)
        test VIDIOC_G_FMT: OK
        test VIDIOC_TRY_FMT: OK
        test VIDIOC_S_FMT: OK
        test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
        test Cropping: OK
        test Composing: OK (Not Supported)
        test Scaling: OK (Not Supported)

Codec ioctls:
        test VIDIOC_(TRY_)ENCODER_CMD: OK
        test VIDIOC_G_ENC_INDEX: OK (Not Supported)
        test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls:
        test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
        test CREATE_BUFS maximum buffers: OK
        test VIDIOC_REMOVE_BUFS: OK
        test VIDIOC_EXPBUF: OK
        test Requests: OK (Not Supported)

Test input 0:
Streaming ioctls:
        test read/write: OK (Not Supported)
        test blocking wait: OK
        Video Capture Multiplanar: Captured 61 buffers
        test MMAP (select): OK
        Video Capture Multiplanar: Captured 61 buffers
        test MMAP (epoll): OK
        test USERPTR (select): OK (Not Supported)
        test DMABUF: Cannot test, specify --expbuf-device

Total for iris_driver device /dev/video1: 52, Succeeded: 52, Failed: 0, Warnings: 0

$ v4l2-compliance -d /dev/video0 -s5 --stream-from=/media/FVDO_Freeway_720p.264
v4l2-compliance 1.28.1-5233, 64 bits, 64-bit time_t
v4l2-compliance SHA: fc15e229d9d3 2024-07-23 19:22:15

Compliance test for iris_driver device /dev/video0:

Driver Info:
        Driver name      : iris_driver
        Card type        : Iris Decoder
        Bus info         : platform:aa00000.video-codec
        Driver version   : 6.19.0
        Capabilities     : 0x84204000
                Video Memory-to-Memory Multiplanar
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps      : 0x04204000
                Video Memory-to-Memory Multiplanar
                Streaming
                Extended Pix Format
        Detected Stateful Decoder

Required ioctls:
        test VIDIOC_QUERYCAP: OK
        test invalid ioctls: OK

Allow for multiple opens:
        test second /dev/video0 open: OK
        test VIDIOC_QUERYCAP: OK
        test VIDIOC_G/S_PRIORITY: OK
        test for unlimited opens: OK

Debug ioctls:
        test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
        test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
        test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
        test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
        test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
        test VIDIOC_ENUMAUDIO: OK (Not Supported)
        test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
        test VIDIOC_G/S_AUDIO: OK (Not Supported)
        Inputs: 0 Audio Inputs: 0 Tuners: 0

Output ioctls:
        test VIDIOC_G/S_MODULATOR: OK (Not Supported)
        test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
        test VIDIOC_ENUMAUDOUT: OK (Not Supported)
        test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
        test VIDIOC_G/S_AUDOUT: OK (Not Supported)
        Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
        test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
        test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
        test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
        test VIDIOC_G/S_EDID: OK (Not Supported)

Control ioctls:
        test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK
        test VIDIOC_QUERYCTRL: OK
        test VIDIOC_G/S_CTRL: OK
        test VIDIOC_G/S/TRY_EXT_CTRLS: OK
        test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK
        test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
        Standard Controls: 12 Private Controls: 0

Format ioctls:
        test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
        test VIDIOC_G/S_PARM: OK (Not Supported)
        test VIDIOC_G_FBUF: OK (Not Supported)
        test VIDIOC_G_FMT: OK
        test VIDIOC_TRY_FMT: OK
        test VIDIOC_S_FMT: OK
        test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
        test Cropping: OK
        test Composing: OK
        test Scaling: OK (Not Supported)

Codec ioctls:
        test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
        test VIDIOC_G_ENC_INDEX: OK (Not Supported)
        test VIDIOC_(TRY_)DECODER_CMD: OK

Buffer ioctls:
        test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
        test CREATE_BUFS maximum buffers: OK
        test VIDIOC_REMOVE_BUFS: OK
        test VIDIOC_EXPBUF: OK
        test Requests: OK (Not Supported)

Test input 0:

Streaming ioctls:
        test read/write: OK (Not Supported)
        test blocking wait: OK
        Video Capture Multiplanar: Captured 65 buffers
        test MMAP (select): OK
        Video Capture Multiplanar: Captured 65 buffers
        test MMAP (epoll): OK
        test USERPTR (select): OK (Not Supported)
        test DMABUF: Cannot test, specify --expbuf-device

Total for iris_driver device /dev/video0: 52, Succeeded: 52, Failed: 0, Warnings: 0

Fluster results on SC7280 with Gen2 Firmware:

./fluster.py run -ts JVT-AVC_V1 -d GStreamer-H.264-V4L2-Gst1.0 - 77/135
The failing test case:
- Unsupported profile: H.264 Extended profile is deprecated.
	- BA3_SVA_C
- Interlaced content is not supported yet.
	- CABREF3_Sand_D
	- CAFI1_SVA_C
	- CAMA1_Sony_C
	- CAMA1_TOSHIBA_B
	- CAMA3_Sand_E
	- CAMACI3_Sony_C
	- CAMANL1_TOSHIBA_B
	- CAMANL2_TOSHIBA_B
	- CAMANL3_Sand_E
	- CAMASL3_Sony_B
	- CAMP_MOT_MBAFF_L30
	- CAMP_MOT_MBAFF_L31
	- CANLMA2_Sony_C
	- CANLMA3_Sony_C
	- CAPA1_TOSHIBA_B
	- CAPAMA3_Sand_F
	- CVCANLMA2_Sony_C
	- CVFI1_SVA_C 
	- CVFI1_Sony_D
	- CVFI2_SVA_C
	- CVFI2_Sony_H 
	- CVMA1_Sony_D
	- CVMA1_TOSHIBA_B
	- CVMANL1_TOSHIBA_B
	- CVMANL2_TOSHIBA_B
	- CVMAPAQP3_Sony_E
	- CVMAQP2_Sony_G
	- CVMAQP3_Sony_D
	- CVMP_MOT_FLD_L30_B
	- CVMP_MOT_FRM_L31
	- CVNLFI1_Sony_C
	- CVNLFI2_Sony_H
	- CVPA1_TOSHIBA_B
	- FI1_Sony_E
	- MR6_BT_B 
	- MR7_BT_B
	- MR8_BT_B 
	- MR9_BT_B
	- Sharp_MP_Field_1_B
	- Sharp_MP_Field_2_B
	- Sharp_MP_Field_3_B
	- Sharp_MP_PAFF_1r2
	- Sharp_MP_PAFF_2r
	- cabac_mot_fld0_full
	- cabac_mot_mbaff0_full
	- cabac_mot_picaff0_full
	- cama1_vtc_c
	- cama2_vtc_b
	- cama3_vtc_b
	- cavlc_mot_fld0_full_B
	- cavlc_mot_mbaff0_full_B
	- cavlc_mot_picaff0_full_B
- Unsupported bitstream: num_slice_group_minus1 > 0 (slice groups not supported by hardware).
	- FM1_BT_B
	- FM1_FT_E
	- FM2_SVA_C
- Unsupported bitstream: SP slice type is not supported by hardware.
	- SP1_BT_A
	- sp2_bt_b
	
./fluster.py run -ts JCT-VC-HEVC_V1 -d GStreamer-H.265-V4L2-Gst1.0 - 131/147
The failing test case:
- 10bit content not supported yet
	- DBLK_A_MAIN10_VIXS_4
	- INITQP_B_Main10_Sony_1
	- TSUNEQBD_A_MAIN10_Technicolor_2
	-  WPP_A_ericsson_MAIN10_2
	-  WPP_B_ericsson_MAIN10_2
	- WPP_C_ericsson_MAIN10_2
	- WPP_D_ericsson_MAIN10_2
	- WPP_E_ericsson_MAIN10_2
	- WPP_F_ericsson_MAIN10_2 
	- WP_A_MAIN10_Toshiba_3
	- WP_MAIN10_B_Toshiba_3
- Unsupported resolution
	- PICSIZE_A_Bossen_1 - resolution is higher than max supported
	- PICSIZE_B_Bossen_1 - resolution is higher than max supported
	- WPP_D_ericsson_MAIN_2 - resolution is lower than min supported
- CRC mismatch
	- RAP_A_docomo_6
- CRC mismatch - bitstream issue - fails with ffmpeg sw decoder as well
	- VPSSPSPPS_A_MainConcept_1

./fluster.py run -ts VP9-TEST-VECTORS -d GStreamer-VP9-V4L2-Gst1.0 -j1 - 235/305
The failing test case:
- Unsupported resolution
	- vp90-2-02-size-08x08.webm
	- vp90-2-02-size-08x10.webm
	- vp90-2-02-size-08x16.webm
	- vp90-2-02-size-08x18.webm
	- vp90-2-02-size-08x32.webm
	- vp90-2-02-size-08x34.webm
	- vp90-2-02-size-08x64.webm
	- vp90-2-02-size-08x66.webm
	- vp90-2-02-size-10x08.webm
	- vp90-2-02-size-10x10.webm
	- vp90-2-02-size-10x16.webm
	- vp90-2-02-size-10x18.webm
	- vp90-2-02-size-10x32.webm
	- vp90-2-02-size-10x34.webm
	- vp90-2-02-size-10x64.webm
	- vp90-2-02-size-10x66.webm
	- vp90-2-02-size-16x08.webm
	- vp90-2-02-size-16x10.webm
	- vp90-2-02-size-16x16.webm
	- vp90-2-02-size-16x18.webm
	- vp90-2-02-size-16x32.webm
	- vp90-2-02-size-16x34.webm
	- vp90-2-02-size-16x64.webm
	- vp90-2-02-size-16x66.webm
	- vp90-2-02-size-18x08.webm
	- vp90-2-02-size-18x10.webm
	- vp90-2-02-size-18x16.webm
	- vp90-2-02-size-18x18.webm
	- vp90-2-02-size-18x32.webm
	- vp90-2-02-size-18x34.webm
	- vp90-2-02-size-18x64.webm
	- vp90-2-02-size-18x66.webm
	- vp90-2-02-size-32x08.webm
	- vp90-2-02-size-32x10.webm
	- vp90-2-02-size-32x16.webm
	- vp90-2-02-size-32x18.webm
	- vp90-2-02-size-32x32.webm
	- vp90-2-02-size-32x34.webm
	- vp90-2-02-size-32x64.webm
	- vp90-2-02-size-32x66.webm
	- vp90-2-02-size-34x08.webm
	- vp90-2-02-size-34x10.webm
	- vp90-2-02-size-34x16.webm
	- vp90-2-02-size-34x18.webm
	- vp90-2-02-size-34x32.webm
	- vp90-2-02-size-34x34.webm
	- vp90-2-02-size-34x64.webm
	- vp90-2-02-size-34x66.webm
	- vp90-2-02-size-64x08.webm	
	- vp90-2-02-size-64x10.webm
	- vp90-2-02-size-64x16.webm
	- vp90-2-02-size-64x18.webm
	- vp90-2-02-size-64x32.webm
	- vp90-2-02-size-64x34.webm	
	- vp90-2-02-size-64x64.webm
	- vp90-2-02-size-64x66.webm
	- vp90-2-02-size-66x08.webm
	- vp90-2-02-size-66x10.webm
	- vp90-2-02-size-66x16.webm
	- vp90-2-02-size-66x18.webm
	- vp90-2-02-size-66x32.webm
	- vp90-2-02-size-66x34.webm
	- vp90-2-02-size-66x64.webm
	- vp90-2-02-size-66x66.webm
- Unsupported format
	- vp91-2-04-yuv422.webm
	- vp91-2-04-yuv444.webm
- CRC mismatch
	- vp90-2-22-svc_1280x720_3.ivf
- Unsupported resolution after sequence change
	- vp90-2-21-resize_inter_320x180_5_1-2.webm
	- vp90-2-21-resize_inter_320x180_7_1-2.webm
- Unsupported stream
	- vp90-2-16-intra-only.webm

Signed-off-by: Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>
---
Changes in v2:
- Improved the logic to detect if firmware loaded is Gen1 or Gen2 (Dmitry/Konrad)
- Added a patch to switch hardware mode after firmware boot
- Link to v1: https://lore.kernel.org/r/20260209-iris_sc7280_gen2_support-v1-0-390000a4fa39@oss.qualcomm.com

---
Dikshita Agarwal (2):
      media: iris: Initialize HFI ops after firmware load in core init
      media: iris: Add support for Gen2 firmware detection and loading on SC7280

Vikash Garodia (1):
      media: iris: Switch to hardware mode after firmware boot

 drivers/media/platform/qcom/iris/iris_core.c       |  6 ++
 drivers/media/platform/qcom/iris/iris_firmware.c   | 70 +++++++++++++++++-
 drivers/media/platform/qcom/iris/iris_hfi_common.c | 10 +++
 drivers/media/platform/qcom/iris/iris_hfi_common.h |  1 +
 .../platform/qcom/iris/iris_platform_common.h      |  1 +
 .../media/platform/qcom/iris/iris_platform_gen1.c  |  4 +-
 .../media/platform/qcom/iris/iris_platform_gen2.c  | 83 ++++++++++++++++++++++
 .../platform/qcom/iris/iris_platform_sc7280.h      | 15 ++++
 drivers/media/platform/qcom/iris/iris_probe.c      |  5 --
 drivers/media/platform/qcom/iris/iris_vidc.c       |  3 +
 drivers/media/platform/qcom/iris/iris_vpu2.c       |  1 +
 drivers/media/platform/qcom/iris/iris_vpu3x.c      |  9 +--
 drivers/media/platform/qcom/iris/iris_vpu4x.c      | 24 ++++---
 drivers/media/platform/qcom/iris/iris_vpu_common.c | 16 +++--
 drivers/media/platform/qcom/iris/iris_vpu_common.h |  3 +
 15 files changed, 218 insertions(+), 33 deletions(-)
---
base-commit: c824345288d11e269ce41b36c105715bc2286050
change-id: 20260209-iris_sc7280_gen2_support-cb34465ed4e7

Best regards,
-- 
Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v2 1/3] media: iris: Switch to hardware mode after firmware boot
  2026-02-27  6:51 [PATCH v2 0/3] media: qcom: iris: Add support for Gen2 firmware detection and loading on SC7280 Dikshita Agarwal
@ 2026-02-27  6:51 ` Dikshita Agarwal
  2026-02-27  6:51 ` [PATCH v2 2/3] media: iris: Initialize HFI ops after firmware load in core init Dikshita Agarwal
  2026-02-27  6:51 ` [PATCH v2 3/3] media: iris: Add support for Gen2 firmware detection and loading on SC7280 Dikshita Agarwal
  2 siblings, 0 replies; 9+ messages in thread
From: Dikshita Agarwal @ 2026-02-27  6:51 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Bryan O'Donoghue,
	Mauro Carvalho Chehab, Hans Verkuil, Vishnu Reddy
  Cc: linux-media, linux-arm-msm, linux-kernel, Dikshita Agarwal

From: Vikash Garodia <vikash.garodia@oss.qualcomm.com>

Currently the driver switches the vcodec GDSC to hardware (HW) mode
before firmware load and boot sequence. GDSC can be powered off,
keeping in hw mode, thereby the vcodec registers programmed in TrustZone
(TZ) carry default (reset) values.
Move the transition to HW mode after firmware load and boot sequence.

The bug was exposed with driver configuring different stream ids to
different devices via iommu-map. With registers carrying reset values,
VPU would not generate desired stream-id, thereby leading to SMMU fault.

The efuse tells us which hardware blocks are actually present. If efuse
status is disabled for a block, the driver will skip powering it on or
resetting it. otherwise the driver will perform the necessary resets and
then switch that block into hardware mode. This makes sure we only touch
hardware that really exists and is enabled on the silicon.

Fixes: dde659d37036 ("media: iris: Introduce vpu ops for vpu4 with necessary hooks")
Co-developed-by: Vishnu Reddy <busanna.reddy@oss.qualcomm.com>
Signed-off-by: Vishnu Reddy <busanna.reddy@oss.qualcomm.com>
Signed-off-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
Signed-off-by: Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>
---
 drivers/media/platform/qcom/iris/iris_core.c       |  4 ++++
 drivers/media/platform/qcom/iris/iris_hfi_common.c |  4 ++++
 drivers/media/platform/qcom/iris/iris_vpu2.c       |  1 +
 drivers/media/platform/qcom/iris/iris_vpu3x.c      |  9 +++-----
 drivers/media/platform/qcom/iris/iris_vpu4x.c      | 24 ++++++++++++----------
 drivers/media/platform/qcom/iris/iris_vpu_common.c | 16 +++++++++------
 drivers/media/platform/qcom/iris/iris_vpu_common.h |  3 +++
 7 files changed, 38 insertions(+), 23 deletions(-)

diff --git a/drivers/media/platform/qcom/iris/iris_core.c b/drivers/media/platform/qcom/iris/iris_core.c
index 8406c48d635b6eba0879396ce9f9ae2292743f09..dbaac01eb15a0e622e85635fddd29c1f7fc18662 100644
--- a/drivers/media/platform/qcom/iris/iris_core.c
+++ b/drivers/media/platform/qcom/iris/iris_core.c
@@ -75,6 +75,10 @@ int iris_core_init(struct iris_core *core)
 	if (ret)
 		goto error_unload_fw;
 
+	ret = iris_vpu_switch_to_hwmode(core);
+	if (ret)
+		goto error_unload_fw;
+
 	ret = iris_hfi_core_init(core);
 	if (ret)
 		goto error_unload_fw;
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.c b/drivers/media/platform/qcom/iris/iris_hfi_common.c
index 92112eb16c11048e28230a2926dfb46e3163aada..621c66593d88d47ef3438c98a07cb29421c4e375 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_common.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_common.c
@@ -159,6 +159,10 @@ int iris_hfi_pm_resume(struct iris_core *core)
 	if (ret)
 		goto err_suspend_hw;
 
+	ret = iris_vpu_switch_to_hwmode(core);
+	if (ret)
+		goto err_suspend_hw;
+
 	ret = ops->sys_interframe_powercollapse(core);
 	if (ret)
 		goto err_suspend_hw;
diff --git a/drivers/media/platform/qcom/iris/iris_vpu2.c b/drivers/media/platform/qcom/iris/iris_vpu2.c
index 9c103a2e4e4eafee101a8a9b168fdc8ca76e277d..01ef40f3895743b3784464e2d5ba2de1aeca5a4a 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu2.c
+++ b/drivers/media/platform/qcom/iris/iris_vpu2.c
@@ -44,4 +44,5 @@ const struct vpu_ops iris_vpu2_ops = {
 	.power_off_controller = iris_vpu_power_off_controller,
 	.power_on_controller = iris_vpu_power_on_controller,
 	.calc_freq = iris_vpu2_calc_freq,
+	.set_hwmode = iris_vpu_set_hwmode,
 };
diff --git a/drivers/media/platform/qcom/iris/iris_vpu3x.c b/drivers/media/platform/qcom/iris/iris_vpu3x.c
index fe4423b951b1e9e31d06dffc69d18071cc985731..3dad47be78b58f6cd5ed6f333b3376571a04dbf0 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu3x.c
+++ b/drivers/media/platform/qcom/iris/iris_vpu3x.c
@@ -234,14 +234,8 @@ static int iris_vpu35_power_on_hw(struct iris_core *core)
 	if (ret)
 		goto err_disable_hw_free_clk;
 
-	ret = dev_pm_genpd_set_hwmode(core->pmdomain_tbl->pd_devs[IRIS_HW_POWER_DOMAIN], true);
-	if (ret)
-		goto err_disable_hw_clk;
-
 	return 0;
 
-err_disable_hw_clk:
-	iris_disable_unprepare_clock(core, IRIS_HW_CLK);
 err_disable_hw_free_clk:
 	iris_disable_unprepare_clock(core, IRIS_HW_FREERUN_CLK);
 err_disable_axi_clk:
@@ -266,6 +260,7 @@ const struct vpu_ops iris_vpu3_ops = {
 	.power_off_controller = iris_vpu_power_off_controller,
 	.power_on_controller = iris_vpu_power_on_controller,
 	.calc_freq = iris_vpu3x_vpu4x_calculate_frequency,
+	.set_hwmode = iris_vpu_set_hwmode,
 };
 
 const struct vpu_ops iris_vpu33_ops = {
@@ -274,6 +269,7 @@ const struct vpu_ops iris_vpu33_ops = {
 	.power_off_controller = iris_vpu33_power_off_controller,
 	.power_on_controller = iris_vpu_power_on_controller,
 	.calc_freq = iris_vpu3x_vpu4x_calculate_frequency,
+	.set_hwmode = iris_vpu_set_hwmode,
 };
 
 const struct vpu_ops iris_vpu35_ops = {
@@ -283,4 +279,5 @@ const struct vpu_ops iris_vpu35_ops = {
 	.power_on_controller = iris_vpu35_vpu4x_power_on_controller,
 	.program_bootup_registers = iris_vpu35_vpu4x_program_bootup_registers,
 	.calc_freq = iris_vpu3x_vpu4x_calculate_frequency,
+	.set_hwmode = iris_vpu_set_hwmode,
 };
diff --git a/drivers/media/platform/qcom/iris/iris_vpu4x.c b/drivers/media/platform/qcom/iris/iris_vpu4x.c
index a8db02ce5c5ec583c4027166b34ce51d3d683b4e..02e100a4045fced33d7a3545b632cc5f0955233f 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu4x.c
+++ b/drivers/media/platform/qcom/iris/iris_vpu4x.c
@@ -252,21 +252,10 @@ static int iris_vpu4x_power_on_hardware(struct iris_core *core)
 		ret = iris_vpu4x_power_on_apv(core);
 		if (ret)
 			goto disable_hw_clocks;
-
-		iris_vpu4x_ahb_sync_reset_apv(core);
 	}
 
-	iris_vpu4x_ahb_sync_reset_hardware(core);
-
-	ret = iris_vpu4x_genpd_set_hwmode(core, true, efuse_value);
-	if (ret)
-		goto disable_apv_power_domain;
-
 	return 0;
 
-disable_apv_power_domain:
-	if (!(efuse_value & DISABLE_VIDEO_APV_BIT))
-		iris_vpu4x_power_off_apv(core);
 disable_hw_clocks:
 	iris_vpu4x_disable_hardware_clocks(core, efuse_value);
 disable_vpp1_power_domain:
@@ -359,6 +348,18 @@ static void iris_vpu4x_power_off_hardware(struct iris_core *core)
 	iris_disable_power_domains(core, core->pmdomain_tbl->pd_devs[IRIS_HW_POWER_DOMAIN]);
 }
 
+static int iris_vpu4x_set_hwmode(struct iris_core *core)
+{
+	u32 efuse_value = readl(core->reg_base + WRAPPER_EFUSE_MONITOR);
+
+	if (!(efuse_value & DISABLE_VIDEO_APV_BIT))
+		iris_vpu4x_ahb_sync_reset_apv(core);
+
+	iris_vpu4x_ahb_sync_reset_hardware(core);
+
+	return iris_vpu4x_genpd_set_hwmode(core, true, efuse_value);
+}
+
 const struct vpu_ops iris_vpu4x_ops = {
 	.power_off_hw = iris_vpu4x_power_off_hardware,
 	.power_on_hw = iris_vpu4x_power_on_hardware,
@@ -366,4 +367,5 @@ const struct vpu_ops iris_vpu4x_ops = {
 	.power_on_controller = iris_vpu35_vpu4x_power_on_controller,
 	.program_bootup_registers = iris_vpu35_vpu4x_program_bootup_registers,
 	.calc_freq = iris_vpu3x_vpu4x_calculate_frequency,
+	.set_hwmode = iris_vpu4x_set_hwmode,
 };
diff --git a/drivers/media/platform/qcom/iris/iris_vpu_common.c b/drivers/media/platform/qcom/iris/iris_vpu_common.c
index 548e5f1727fdb7543f76a1871f17257fa2360733..69e6126dc4d95ed9e5fccf596205e84ec0bfc82d 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu_common.c
+++ b/drivers/media/platform/qcom/iris/iris_vpu_common.c
@@ -292,14 +292,8 @@ int iris_vpu_power_on_hw(struct iris_core *core)
 	if (ret && ret != -ENOENT)
 		goto err_disable_hw_clock;
 
-	ret = dev_pm_genpd_set_hwmode(core->pmdomain_tbl->pd_devs[IRIS_HW_POWER_DOMAIN], true);
-	if (ret)
-		goto err_disable_hw_ahb_clock;
-
 	return 0;
 
-err_disable_hw_ahb_clock:
-	iris_disable_unprepare_clock(core, IRIS_HW_AHB_CLK);
 err_disable_hw_clock:
 	iris_disable_unprepare_clock(core, IRIS_HW_CLK);
 err_disable_power:
@@ -308,6 +302,16 @@ int iris_vpu_power_on_hw(struct iris_core *core)
 	return ret;
 }
 
+int iris_vpu_set_hwmode(struct iris_core *core)
+{
+	return dev_pm_genpd_set_hwmode(core->pmdomain_tbl->pd_devs[IRIS_HW_POWER_DOMAIN], true);
+}
+
+int iris_vpu_switch_to_hwmode(struct iris_core *core)
+{
+	return core->iris_platform_data->vpu_ops->set_hwmode(core);
+}
+
 int iris_vpu35_vpu4x_power_off_controller(struct iris_core *core)
 {
 	u32 clk_rst_tbl_size = core->iris_platform_data->clk_rst_tbl_size;
diff --git a/drivers/media/platform/qcom/iris/iris_vpu_common.h b/drivers/media/platform/qcom/iris/iris_vpu_common.h
index f6dffc613b822341fb21e12de6b1395202f62cde..dee3b1349c5e869619c7f7c294dd711f9ff72b92 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu_common.h
+++ b/drivers/media/platform/qcom/iris/iris_vpu_common.h
@@ -21,6 +21,7 @@ struct vpu_ops {
 	int (*power_on_controller)(struct iris_core *core);
 	void (*program_bootup_registers)(struct iris_core *core);
 	u64 (*calc_freq)(struct iris_inst *inst, size_t data_size);
+	int (*set_hwmode)(struct iris_core *core);
 };
 
 int iris_vpu_boot_firmware(struct iris_core *core);
@@ -30,6 +31,8 @@ int iris_vpu_watchdog(struct iris_core *core, u32 intr_status);
 int iris_vpu_prepare_pc(struct iris_core *core);
 int iris_vpu_power_on_controller(struct iris_core *core);
 int iris_vpu_power_on_hw(struct iris_core *core);
+int iris_vpu_set_hwmode(struct iris_core *core);
+int iris_vpu_switch_to_hwmode(struct iris_core *core);
 int iris_vpu_power_on(struct iris_core *core);
 int iris_vpu_power_off_controller(struct iris_core *core);
 void iris_vpu_power_off_hw(struct iris_core *core);

-- 
2.34.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v2 2/3] media: iris: Initialize HFI ops after firmware load in core init
  2026-02-27  6:51 [PATCH v2 0/3] media: qcom: iris: Add support for Gen2 firmware detection and loading on SC7280 Dikshita Agarwal
  2026-02-27  6:51 ` [PATCH v2 1/3] media: iris: Switch to hardware mode after firmware boot Dikshita Agarwal
@ 2026-02-27  6:51 ` Dikshita Agarwal
  2026-02-27  6:51 ` [PATCH v2 3/3] media: iris: Add support for Gen2 firmware detection and loading on SC7280 Dikshita Agarwal
  2 siblings, 0 replies; 9+ messages in thread
From: Dikshita Agarwal @ 2026-02-27  6:51 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Bryan O'Donoghue,
	Mauro Carvalho Chehab, Hans Verkuil, Vishnu Reddy
  Cc: linux-media, linux-arm-msm, linux-kernel, Dikshita Agarwal,
	Bryan O'Donoghue

The HFI command/response ops were previously initialized in probe()
but, we don't have firmware loaded at probe time. Since HFI is tightly
coupled to firmware, initialize the HFI ops after firmware has been
successfully loaded and booted.

Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>
---
 drivers/media/platform/qcom/iris/iris_core.c       | 2 ++
 drivers/media/platform/qcom/iris/iris_hfi_common.c | 6 ++++++
 drivers/media/platform/qcom/iris/iris_hfi_common.h | 1 +
 drivers/media/platform/qcom/iris/iris_probe.c      | 2 --
 4 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/qcom/iris/iris_core.c b/drivers/media/platform/qcom/iris/iris_core.c
index dbaac01eb15a0e622e85635fddd29c1f7fc18662..259a1c4597a1ce76a4e0f254904b135c8fef549e 100644
--- a/drivers/media/platform/qcom/iris/iris_core.c
+++ b/drivers/media/platform/qcom/iris/iris_core.c
@@ -79,6 +79,8 @@ int iris_core_init(struct iris_core *core)
 	if (ret)
 		goto error_unload_fw;
 
+	iris_init_hfi_ops(core);
+
 	ret = iris_hfi_core_init(core);
 	if (ret)
 		goto error_unload_fw;
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.c b/drivers/media/platform/qcom/iris/iris_hfi_common.c
index 621c66593d88d47ef3438c98a07cb29421c4e375..db48dfcc96b8d923ec49bb4b27e7a0ddaac263e8 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_common.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_common.c
@@ -74,6 +74,12 @@ u32 iris_hfi_get_v4l2_matrix_coefficients(u32 hfi_coefficients)
 	}
 }
 
+void iris_init_hfi_ops(struct iris_core *core)
+{
+	core->iris_platform_data->init_hfi_command_ops(core);
+	core->iris_platform_data->init_hfi_response_ops(core);
+}
+
 int iris_hfi_core_init(struct iris_core *core)
 {
 	const struct iris_hfi_command_ops *hfi_ops = core->hfi_ops;
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.h b/drivers/media/platform/qcom/iris/iris_hfi_common.h
index 3edb5ae582b49bea2e2408c4a5cfc0a742adc05f..498a08314cdeb65b4b621e2200aae8685f4a025b 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_common.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_common.h
@@ -149,6 +149,7 @@ struct hfi_subscription_params {
 u32 iris_hfi_get_v4l2_color_primaries(u32 hfi_primaries);
 u32 iris_hfi_get_v4l2_transfer_char(u32 hfi_characterstics);
 u32 iris_hfi_get_v4l2_matrix_coefficients(u32 hfi_coefficients);
+void iris_init_hfi_ops(struct iris_core *core);
 int iris_hfi_core_init(struct iris_core *core);
 int iris_hfi_pm_suspend(struct iris_core *core);
 int iris_hfi_pm_resume(struct iris_core *core);
diff --git a/drivers/media/platform/qcom/iris/iris_probe.c b/drivers/media/platform/qcom/iris/iris_probe.c
index ddaacda523ecb9990af0dd0640196223fbcc2cab..22c7b3410710328b900fc49459cd399aa0e89b02 100644
--- a/drivers/media/platform/qcom/iris/iris_probe.c
+++ b/drivers/media/platform/qcom/iris/iris_probe.c
@@ -252,8 +252,6 @@ static int iris_probe(struct platform_device *pdev)
 	disable_irq_nosync(core->irq);
 
 	iris_init_ops(core);
-	core->iris_platform_data->init_hfi_command_ops(core);
-	core->iris_platform_data->init_hfi_response_ops(core);
 
 	ret = iris_init_resources(core);
 	if (ret)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v2 3/3] media: iris: Add support for Gen2 firmware detection and loading on SC7280
  2026-02-27  6:51 [PATCH v2 0/3] media: qcom: iris: Add support for Gen2 firmware detection and loading on SC7280 Dikshita Agarwal
  2026-02-27  6:51 ` [PATCH v2 1/3] media: iris: Switch to hardware mode after firmware boot Dikshita Agarwal
  2026-02-27  6:51 ` [PATCH v2 2/3] media: iris: Initialize HFI ops after firmware load in core init Dikshita Agarwal
@ 2026-02-27  6:51 ` Dikshita Agarwal
  2026-02-27 12:18   ` Dmitry Baryshkov
  2 siblings, 1 reply; 9+ messages in thread
From: Dikshita Agarwal @ 2026-02-27  6:51 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Bryan O'Donoghue,
	Mauro Carvalho Chehab, Hans Verkuil, Vishnu Reddy
  Cc: linux-media, linux-arm-msm, linux-kernel, Dikshita Agarwal

SC7280 supports both Gen1 and Gen2 HFI firmware. To support both
dynamically, update the firmware loading mechanism to prioritize
Gen2 availability and detect the loaded firmware version at runtime.

The firmware loading logic is updated with the following priority:
1. Device Tree (`firmware-name`): If specified, load unconditionally.
2. Gen2 Autodetect (SC7280 only): If no DT property exists, attempt to
   load the specific Gen2 firmware image (`vpu20_p1_gen2_s6.mbn`).
3. Default Fallback: If Gen2 loading fails or is not applicable, use
   the default firmware name defined in the default platform data.

Additionally, introduce `iris_update_platform_data` to inspect the
loaded firmware memory before authentication. This function scans for
`QC_IMAGE_VERSION_STRING`. If the version string starts with "vfw" or
matches "video-firmware.N.M" (where N >= 2), it identifies the
firmware as Gen2.

If Gen2 firmware is detected on SC7280, the driver switches the
internal platform data pointer to the Gen2 configuration.

Signed-off-by: Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>
---
 drivers/media/platform/qcom/iris/iris_firmware.c   | 70 +++++++++++++++++-
 .../platform/qcom/iris/iris_platform_common.h      |  1 +
 .../media/platform/qcom/iris/iris_platform_gen1.c  |  4 +-
 .../media/platform/qcom/iris/iris_platform_gen2.c  | 83 ++++++++++++++++++++++
 .../platform/qcom/iris/iris_platform_sc7280.h      | 15 ++++
 drivers/media/platform/qcom/iris/iris_probe.c      |  3 -
 drivers/media/platform/qcom/iris/iris_vidc.c       |  3 +
 7 files changed, 171 insertions(+), 8 deletions(-)

diff --git a/drivers/media/platform/qcom/iris/iris_firmware.c b/drivers/media/platform/qcom/iris/iris_firmware.c
index 5f408024e967fd21ade66cc3fa377d8507f9002e..f6ee7f58d4ce215ad9f7fb5fdcadec17f99c8848 100644
--- a/drivers/media/platform/qcom/iris/iris_firmware.c
+++ b/drivers/media/platform/qcom/iris/iris_firmware.c
@@ -14,6 +14,53 @@
 
 #define MAX_FIRMWARE_NAME_SIZE	128
 
+static void iris_update_platform_data(struct iris_core *core)
+{
+	const char *marker = "QC_IMAGE_VERSION_STRING=";
+	struct device_node *node = core->dev->of_node;
+	const char *found = NULL;
+	int major = 0, minor = 0;
+	char version_buf[64];
+	struct resource res;
+	void *mem_virt;
+	size_t i;
+
+	if (!of_device_is_compatible(node, "qcom,sc7280-venus"))
+		return;
+
+	if (of_reserved_mem_region_to_resource(node, 0, &res)) {
+		dev_err(core->dev, "Failed to get reserved memory for version check\n");
+		return;
+	}
+
+	mem_virt = memremap(res.start, resource_size(&res), MEMREMAP_WC);
+	if (!mem_virt) {
+		dev_err(core->dev, "Failed to remap memory for version check\n");
+		return;
+	}
+
+	for (i = 0; i < resource_size(&res) - strlen(marker); i++) {
+		if (memcmp(mem_virt + i, marker, strlen(marker)) == 0) {
+			found = (const char *)(mem_virt + i + strlen(marker));
+			break;
+		}
+	}
+
+	if (found) {
+		strscpy(version_buf, found, sizeof(version_buf));
+
+		/* Check for gen2 version string: "vfw..." OR "video-firmware.N..." (N>=2) */
+		if (strncmp(version_buf, "vfw", 3) == 0 ||
+		    (sscanf(version_buf, "video-firmware.%d.%d", &major, &minor) == 2 &&
+			    major >= 2)) {
+			dev_info(core->dev, "Gen2 FW Detected: %s\n", version_buf);
+			core->iris_platform_data = &sc7280_gen2_data;
+		}
+	}
+
+	memunmap(mem_virt);
+}
+
 static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name)
 {
 	u32 pas_id = core->iris_platform_data->pas_id;
@@ -64,21 +111,38 @@ static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name)
 
 int iris_fw_load(struct iris_core *core)
 {
+	struct device_node *node = core->dev->of_node;
 	const struct tz_cp_config *cp_config;
 	const char *fwpath = NULL;
 	int i, ret;
 
 	ret = of_property_read_string_index(core->dev->of_node, "firmware-name", 0,
 					    &fwpath);
-	if (ret)
-		fwpath = core->iris_platform_data->fwname;
+	if (!ret) {
+		ret = iris_load_fw_to_memory(core, fwpath);
+	} else {
+		bool fw_loaded = false;
+
+		if (of_device_is_compatible(node, "qcom,sc7280-venus")) {
+			ret = iris_load_fw_to_memory(core, "qcom/vpu/vpu20_p1_gen2_s6.mbn");
+			if (!ret)
+				fw_loaded = true;
+		}
+
+		if (!fw_loaded) {
+			fwpath = core->iris_platform_data->fwname;
+			dev_dbg(core->dev, "loading default fw: %s\n", fwpath);
+			ret = iris_load_fw_to_memory(core, fwpath);
+		}
+	}
 
-	ret = iris_load_fw_to_memory(core, fwpath);
 	if (ret) {
 		dev_err(core->dev, "firmware download failed\n");
 		return -ENOMEM;
 	}
 
+	iris_update_platform_data(core);
+
 	ret = qcom_scm_pas_auth_and_reset(core->iris_platform_data->pas_id);
 	if (ret)  {
 		dev_err(core->dev, "auth and reset failed: %d\n", ret);
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index 5a489917580eb10022fdcb52f7321a915e8b239d..f1bbbe043e3a3ccc5eebf67091162678eb83bf45 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -43,6 +43,7 @@ enum pipe_type {
 
 extern const struct iris_platform_data qcs8300_data;
 extern const struct iris_platform_data sc7280_data;
+extern const struct iris_platform_data sc7280_gen2_data;
 extern const struct iris_platform_data sm8250_data;
 extern const struct iris_platform_data sm8550_data;
 extern const struct iris_platform_data sm8650_data;
diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen1.c b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
index df8e6bf9430ed2a070e092edae9ef998d092cb5e..6dbdd0833dcdc7dfac6d7b35f99837c883e188e7 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_gen1.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
@@ -414,8 +414,8 @@ const struct iris_platform_data sc7280_data = {
 	.dma_mask = 0xe0000000 - 1,
 	.fwname = "qcom/vpu/vpu20_p1.mbn",
 	.pas_id = IRIS_PAS_ID,
-	.inst_iris_fmts = platform_fmts_sm8250_dec,
-	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sm8250_dec),
+	.inst_iris_fmts = platform_fmts_sc7280_dec,
+	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sc7280_dec),
 	.inst_caps = &platform_inst_cap_sm8250,
 	.inst_fw_caps_dec = inst_fw_cap_sm8250_dec,
 	.inst_fw_caps_dec_size = ARRAY_SIZE(inst_fw_cap_sm8250_dec),
diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
index 5da90d47f9c6eab4a7e6b17841fdc0e599397bf7..5f3be22a003fe5d80b683b43a1b2386497785fb1 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
@@ -15,6 +15,7 @@
 #include "iris_platform_qcs8300.h"
 #include "iris_platform_sm8650.h"
 #include "iris_platform_sm8750.h"
+#include "iris_platform_sc7280.h"
 
 #define VIDEO_ARCH_LX 1
 #define BITRATE_MAX				245000000
@@ -1317,3 +1318,85 @@ const struct iris_platform_data qcs8300_data = {
 	.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
 	.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
 };
+
+const struct iris_platform_data sc7280_gen2_data = {
+	.get_instance = iris_hfi_gen2_get_instance,
+	.init_hfi_command_ops = iris_hfi_gen2_command_ops_init,
+	.init_hfi_response_ops = iris_hfi_gen2_response_ops_init,
+	/* Gen2 FW for SC7280 requires bigger size for line buffer for encoder */
+	.get_vpu_buffer_size = iris_vpu33_buf_size,
+	.vpu_ops = &iris_vpu2_ops,
+	.set_preset_registers = iris_set_sm8550_preset_registers,
+	.icc_tbl = sm8550_icc_table,
+	.icc_tbl_size = ARRAY_SIZE(sm8550_icc_table),
+	.bw_tbl_dec = sc7280_bw_table_dec,
+	.bw_tbl_dec_size = ARRAY_SIZE(sc7280_bw_table_dec),
+	.pmdomain_tbl = sm8550_pmdomain_table,
+	.pmdomain_tbl_size = ARRAY_SIZE(sm8550_pmdomain_table),
+	.opp_pd_tbl = sc7280_opp_pd_table,
+	.opp_pd_tbl_size = ARRAY_SIZE(sc7280_opp_pd_table),
+	.clk_tbl = sc7280_clk_table,
+	.clk_tbl_size = ARRAY_SIZE(sc7280_clk_table),
+	.opp_clk_tbl = sc7280_opp_clk_table,
+	/* Upper bound of DMA address range */
+	.dma_mask = 0xe0000000 - 1,
+	.fwname = "qcom/vpu/vpu20_p1_gen2_s6.mbn",
+	.pas_id = IRIS_PAS_ID,
+	.inst_iris_fmts = platform_fmts_sc7280_dec,
+	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sc7280_dec),
+	.inst_caps = &platform_inst_cap_sm8550,
+	.inst_fw_caps_dec = inst_fw_cap_sm8550_dec,
+	.inst_fw_caps_dec_size = ARRAY_SIZE(inst_fw_cap_sm8550_dec),
+	.inst_fw_caps_enc = inst_fw_cap_sm8550_enc,
+	.inst_fw_caps_enc_size = ARRAY_SIZE(inst_fw_cap_sm8550_enc),
+	.tz_cp_config_data = tz_cp_config_sm8550,
+	.tz_cp_config_data_size = ARRAY_SIZE(tz_cp_config_sm8550),
+	.hw_response_timeout = HW_RESPONSE_TIMEOUT_VALUE,
+	.ubwc_config = &ubwc_config_sm8550,
+	.core_arch = VIDEO_ARCH_LX,
+	.num_vpp_pipe = 1,
+	.no_aon = true,
+	.max_session_count = 16,
+	.max_core_mbpf = 4096 * 2176 / 256 * 2 + 1920 * 1088 / 256,
+	/* max spec for SC7280 is 4096x2176@60fps */
+	.max_core_mbps = 4096 * 2176 / 256 * 60,
+	.dec_input_config_params_default =
+		sm8550_vdec_input_config_params_default,
+	.dec_input_config_params_default_size =
+		ARRAY_SIZE(sm8550_vdec_input_config_params_default),
+	.dec_input_config_params_hevc =
+		sm8550_vdec_input_config_param_hevc,
+	.dec_input_config_params_hevc_size =
+		ARRAY_SIZE(sm8550_vdec_input_config_param_hevc),
+	.dec_input_config_params_vp9 =
+		sm8550_vdec_input_config_param_vp9,
+	.dec_input_config_params_vp9_size =
+		ARRAY_SIZE(sm8550_vdec_input_config_param_vp9),
+	.enc_input_config_params = sm8550_venc_input_config_params,
+	.enc_input_config_params_size =
+		ARRAY_SIZE(sm8550_venc_input_config_params),
+	.dec_output_config_params = sm8550_vdec_output_config_params,
+	.dec_output_config_params_size = ARRAY_SIZE(sm8550_vdec_output_config_params),
+	.enc_output_config_params = sm8550_venc_output_config_params,
+	.enc_output_config_params_size = ARRAY_SIZE(sm8550_venc_output_config_params),
+
+	.dec_ip_int_buf_tbl = sm8550_dec_ip_int_buf_tbl,
+	.dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
+	.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
+	.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
+
+	.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
+	.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
+
+	.dec_input_prop = sm8550_vdec_subscribe_input_properties,
+	.dec_input_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_input_properties),
+	.dec_output_prop_avc = sm8550_vdec_subscribe_output_properties_avc,
+	.dec_output_prop_avc_size =
+		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_avc),
+	.dec_output_prop_hevc = sm8550_vdec_subscribe_output_properties_hevc,
+	.dec_output_prop_hevc_size =
+		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_hevc),
+	.dec_output_prop_vp9 = sm8550_vdec_subscribe_output_properties_vp9,
+	.dec_output_prop_vp9_size =
+		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_vp9),
+};
diff --git a/drivers/media/platform/qcom/iris/iris_platform_sc7280.h b/drivers/media/platform/qcom/iris/iris_platform_sc7280.h
index 0ec8f334df670c3c1548a5ee3b8907b333e34db3..6e05f2542a5457bd0b3b6acced3bd54d166b2023 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_sc7280.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_sc7280.h
@@ -6,6 +6,21 @@
 #ifndef __IRIS_PLATFORM_SC7280_H__
 #define __IRIS_PLATFORM_SC7280_H__
 
+static struct iris_fmt platform_fmts_sc7280_dec[] = {
+	[IRIS_FMT_H264] = {
+		.pixfmt = V4L2_PIX_FMT_H264,
+		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
+	},
+	[IRIS_FMT_HEVC] = {
+		.pixfmt = V4L2_PIX_FMT_HEVC,
+		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
+	},
+	[IRIS_FMT_VP9] = {
+		.pixfmt = V4L2_PIX_FMT_VP9,
+		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
+	},
+};
+
 static const struct bw_info sc7280_bw_table_dec[] = {
 	{ ((3840 * 2160) / 256) * 60, 1896000, },
 	{ ((3840 * 2160) / 256) * 30,  968000, },
diff --git a/drivers/media/platform/qcom/iris/iris_probe.c b/drivers/media/platform/qcom/iris/iris_probe.c
index 22c7b3410710328b900fc49459cd399aa0e89b02..1f44d3ea337df63fbf5317b9b99139a0867267c3 100644
--- a/drivers/media/platform/qcom/iris/iris_probe.c
+++ b/drivers/media/platform/qcom/iris/iris_probe.c
@@ -12,7 +12,6 @@
 #include <linux/reset.h>
 
 #include "iris_core.h"
-#include "iris_ctrls.h"
 #include "iris_vidc.h"
 
 static int iris_init_icc(struct iris_core *core)
@@ -257,8 +256,6 @@ static int iris_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	iris_session_init_caps(core);
-
 	ret = v4l2_device_register(dev, &core->v4l2_dev);
 	if (ret)
 		return ret;
diff --git a/drivers/media/platform/qcom/iris/iris_vidc.c b/drivers/media/platform/qcom/iris/iris_vidc.c
index bd38d84c9cc79d15585ed5dd5f905a37521cb6dc..0727d5d19cb9b7ed1f72ab840ae5dfda0162e23d 100644
--- a/drivers/media/platform/qcom/iris/iris_vidc.c
+++ b/drivers/media/platform/qcom/iris/iris_vidc.c
@@ -9,6 +9,7 @@
 #include <media/v4l2-mem2mem.h>
 #include <media/videobuf2-dma-contig.h>
 
+#include "iris_ctrls.h"
 #include "iris_vidc.h"
 #include "iris_instance.h"
 #include "iris_vdec.h"
@@ -196,6 +197,8 @@ int iris_open(struct file *filp)
 		goto fail_m2m_release;
 	}
 
+	iris_session_init_caps(core);
+
 	if (inst->domain == DECODER)
 		ret = iris_vdec_inst_init(inst);
 	else if (inst->domain == ENCODER)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 3/3] media: iris: Add support for Gen2 firmware detection and loading on SC7280
  2026-02-27  6:51 ` [PATCH v2 3/3] media: iris: Add support for Gen2 firmware detection and loading on SC7280 Dikshita Agarwal
@ 2026-02-27 12:18   ` Dmitry Baryshkov
  2026-03-02  9:26     ` Dikshita Agarwal
  0 siblings, 1 reply; 9+ messages in thread
From: Dmitry Baryshkov @ 2026-02-27 12:18 UTC (permalink / raw)
  To: Dikshita Agarwal
  Cc: Vikash Garodia, Abhinav Kumar, Bryan O'Donoghue,
	Mauro Carvalho Chehab, Hans Verkuil, Vishnu Reddy, linux-media,
	linux-arm-msm, linux-kernel

On Fri, Feb 27, 2026 at 12:21:03PM +0530, Dikshita Agarwal wrote:
> SC7280 supports both Gen1 and Gen2 HFI firmware. To support both
> dynamically, update the firmware loading mechanism to prioritize
> Gen2 availability and detect the loaded firmware version at runtime.
> 
> The firmware loading logic is updated with the following priority:
> 1. Device Tree (`firmware-name`): If specified, load unconditionally.
> 2. Gen2 Autodetect (SC7280 only): If no DT property exists, attempt to
>    load the specific Gen2 firmware image (`vpu20_p1_gen2_s6.mbn`).
> 3. Default Fallback: If Gen2 loading fails or is not applicable, use
>    the default firmware name defined in the default platform data.
> 
> Additionally, introduce `iris_update_platform_data` to inspect the
> loaded firmware memory before authentication. This function scans for
> `QC_IMAGE_VERSION_STRING`. If the version string starts with "vfw" or
> matches "video-firmware.N.M" (where N >= 2), it identifies the
> firmware as Gen2.
> 
> If Gen2 firmware is detected on SC7280, the driver switches the
> internal platform data pointer to the Gen2 configuration.
> 
> Signed-off-by: Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>
> ---
>  drivers/media/platform/qcom/iris/iris_firmware.c   | 70 +++++++++++++++++-
>  .../platform/qcom/iris/iris_platform_common.h      |  1 +
>  .../media/platform/qcom/iris/iris_platform_gen1.c  |  4 +-
>  .../media/platform/qcom/iris/iris_platform_gen2.c  | 83 ++++++++++++++++++++++
>  .../platform/qcom/iris/iris_platform_sc7280.h      | 15 ++++
>  drivers/media/platform/qcom/iris/iris_probe.c      |  3 -
>  drivers/media/platform/qcom/iris/iris_vidc.c       |  3 +
>  7 files changed, 171 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/media/platform/qcom/iris/iris_firmware.c b/drivers/media/platform/qcom/iris/iris_firmware.c
> index 5f408024e967fd21ade66cc3fa377d8507f9002e..f6ee7f58d4ce215ad9f7fb5fdcadec17f99c8848 100644
> --- a/drivers/media/platform/qcom/iris/iris_firmware.c
> +++ b/drivers/media/platform/qcom/iris/iris_firmware.c
> @@ -14,6 +14,53 @@
>  
>  #define MAX_FIRMWARE_NAME_SIZE	128
>  
> +static void iris_update_platform_data(struct iris_core *core)
> +{
> +	const char *marker = "QC_IMAGE_VERSION_STRING=";
> +	struct device_node *node = core->dev->of_node;
> +	const char *found = NULL;
> +	int major = 0, minor = 0;
> +	char version_buf[64];
> +	struct resource res;
> +	void *mem_virt;
> +	size_t i;
> +
> +	if (!of_device_is_compatible(node, "qcom,sc7280-venus"))
> +		return;
> +
> +	if (of_reserved_mem_region_to_resource(node, 0, &res)) {
> +		dev_err(core->dev, "Failed to get reserved memory for version check\n");
> +		return;
> +	}
> +
> +	mem_virt = memremap(res.start, resource_size(&res), MEMREMAP_WC);
> +	if (!mem_virt) {
> +		dev_err(core->dev, "Failed to remap memory for version check\n");
> +		return;
> +	}
> +
> +	for (i = 0; i < resource_size(&res) - strlen(marker); i++) {
> +		if (memcmp(mem_virt + i, marker, strlen(marker)) == 0) {
> +			found = (const char *)(mem_virt + i + strlen(marker));
> +			break;
> +		}
> +	}

This should be done in iris_load_fw_to_memory(). Saves you from extra
memremap() / memunmap() and also from scanning extra data beyond the
loaded image area.

> +
> +	if (found) {
> +		strscpy(version_buf, found, sizeof(version_buf));
> +
> +		/* Check for gen2 version string: "vfw..." OR "video-firmware.N..." (N>=2) */
> +		if (strncmp(version_buf, "vfw", 3) == 0 ||
> +		    (sscanf(version_buf, "video-firmware.%d.%d", &major, &minor) == 2 &&
> +			    major >= 2)) {
> +			dev_info(core->dev, "Gen2 FW Detected: %s\n", version_buf);
> +			core->iris_platform_data = &sc7280_gen2_data;
> +		}
> +	}
> +
> +	memunmap(mem_virt);
> +}
> +
>  static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name)
>  {
>  	u32 pas_id = core->iris_platform_data->pas_id;
> @@ -64,21 +111,38 @@ static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name)
>  
>  int iris_fw_load(struct iris_core *core)
>  {
> +	struct device_node *node = core->dev->of_node;
>  	const struct tz_cp_config *cp_config;
>  	const char *fwpath = NULL;
>  	int i, ret;
>  
>  	ret = of_property_read_string_index(core->dev->of_node, "firmware-name", 0,
>  					    &fwpath);
> -	if (ret)
> -		fwpath = core->iris_platform_data->fwname;
> +	if (!ret) {
> +		ret = iris_load_fw_to_memory(core, fwpath);
> +	} else {
> +		bool fw_loaded = false;
> +
> +		if (of_device_is_compatible(node, "qcom,sc7280-venus")) {
> +			ret = iris_load_fw_to_memory(core, "qcom/vpu/vpu20_p1_gen2_s6.mbn");
> +			if (!ret)
> +				fw_loaded = true;
> +		}
> +
> +		if (!fw_loaded) {
> +			fwpath = core->iris_platform_data->fwname;
> +			dev_dbg(core->dev, "loading default fw: %s\n", fwpath);
> +			ret = iris_load_fw_to_memory(core, fwpath);
> +		}

Make SC7280 default to Gen2 firmware. Then:

	ret = iris_load_fw_to_memory(core, fwpath);
	if (ret == -ENOENT &&
	    fwpath == core->iris_platform_data->fwname &&
	    of_device_is_compatible(node, "qcom,sc7280-venus"))
		ret = iris_load_fw_to_memory(core, sc7280_data.fwname);

> +	}
>  
> -	ret = iris_load_fw_to_memory(core, fwpath);
>  	if (ret) {
>  		dev_err(core->dev, "firmware download failed\n");
>  		return -ENOMEM;
>  	}
>  
> +	iris_update_platform_data(core);
> +
>  	ret = qcom_scm_pas_auth_and_reset(core->iris_platform_data->pas_id);
>  	if (ret)  {
>  		dev_err(core->dev, "auth and reset failed: %d\n", ret);
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
> index 5a489917580eb10022fdcb52f7321a915e8b239d..f1bbbe043e3a3ccc5eebf67091162678eb83bf45 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
> @@ -43,6 +43,7 @@ enum pipe_type {
>  
>  extern const struct iris_platform_data qcs8300_data;
>  extern const struct iris_platform_data sc7280_data;
> +extern const struct iris_platform_data sc7280_gen2_data;
>  extern const struct iris_platform_data sm8250_data;
>  extern const struct iris_platform_data sm8550_data;
>  extern const struct iris_platform_data sm8650_data;
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen1.c b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
> index df8e6bf9430ed2a070e092edae9ef998d092cb5e..6dbdd0833dcdc7dfac6d7b35f99837c883e188e7 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_gen1.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
> @@ -414,8 +414,8 @@ const struct iris_platform_data sc7280_data = {
>  	.dma_mask = 0xe0000000 - 1,
>  	.fwname = "qcom/vpu/vpu20_p1.mbn",
>  	.pas_id = IRIS_PAS_ID,
> -	.inst_iris_fmts = platform_fmts_sm8250_dec,
> -	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sm8250_dec),
> +	.inst_iris_fmts = platform_fmts_sc7280_dec,
> +	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sc7280_dec),

Why?

>  	.inst_caps = &platform_inst_cap_sm8250,
>  	.inst_fw_caps_dec = inst_fw_cap_sm8250_dec,
>  	.inst_fw_caps_dec_size = ARRAY_SIZE(inst_fw_cap_sm8250_dec),
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> index 5da90d47f9c6eab4a7e6b17841fdc0e599397bf7..5f3be22a003fe5d80b683b43a1b2386497785fb1 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> @@ -15,6 +15,7 @@
>  #include "iris_platform_qcs8300.h"
>  #include "iris_platform_sm8650.h"
>  #include "iris_platform_sm8750.h"
> +#include "iris_platform_sc7280.h"

Don't you end up with two copies of 7280 data in the object files?

>  
>  #define VIDEO_ARCH_LX 1
>  #define BITRATE_MAX				245000000
> @@ -1317,3 +1318,85 @@ const struct iris_platform_data qcs8300_data = {
>  	.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
>  	.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
>  };
> +
> +const struct iris_platform_data sc7280_gen2_data = {
> +	.get_instance = iris_hfi_gen2_get_instance,
> +	.init_hfi_command_ops = iris_hfi_gen2_command_ops_init,
> +	.init_hfi_response_ops = iris_hfi_gen2_response_ops_init,
> +	/* Gen2 FW for SC7280 requires bigger size for line buffer for encoder */
> +	.get_vpu_buffer_size = iris_vpu33_buf_size,
> +	.vpu_ops = &iris_vpu2_ops,
> +	.set_preset_registers = iris_set_sm8550_preset_registers,
> +	.icc_tbl = sm8550_icc_table,
> +	.icc_tbl_size = ARRAY_SIZE(sm8550_icc_table),
> +	.bw_tbl_dec = sc7280_bw_table_dec,
> +	.bw_tbl_dec_size = ARRAY_SIZE(sc7280_bw_table_dec),
> +	.pmdomain_tbl = sm8550_pmdomain_table,
> +	.pmdomain_tbl_size = ARRAY_SIZE(sm8550_pmdomain_table),
> +	.opp_pd_tbl = sc7280_opp_pd_table,
> +	.opp_pd_tbl_size = ARRAY_SIZE(sc7280_opp_pd_table),
> +	.clk_tbl = sc7280_clk_table,
> +	.clk_tbl_size = ARRAY_SIZE(sc7280_clk_table),
> +	.opp_clk_tbl = sc7280_opp_clk_table,
> +	/* Upper bound of DMA address range */
> +	.dma_mask = 0xe0000000 - 1,
> +	.fwname = "qcom/vpu/vpu20_p1_gen2_s6.mbn",
> +	.pas_id = IRIS_PAS_ID,
> +	.inst_iris_fmts = platform_fmts_sc7280_dec,
> +	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sc7280_dec),
> +	.inst_caps = &platform_inst_cap_sm8550,
> +	.inst_fw_caps_dec = inst_fw_cap_sm8550_dec,
> +	.inst_fw_caps_dec_size = ARRAY_SIZE(inst_fw_cap_sm8550_dec),
> +	.inst_fw_caps_enc = inst_fw_cap_sm8550_enc,
> +	.inst_fw_caps_enc_size = ARRAY_SIZE(inst_fw_cap_sm8550_enc),
> +	.tz_cp_config_data = tz_cp_config_sm8550,
> +	.tz_cp_config_data_size = ARRAY_SIZE(tz_cp_config_sm8550),
> +	.hw_response_timeout = HW_RESPONSE_TIMEOUT_VALUE,
> +	.ubwc_config = &ubwc_config_sm8550,
> +	.core_arch = VIDEO_ARCH_LX,
> +	.num_vpp_pipe = 1,
> +	.no_aon = true,
> +	.max_session_count = 16,
> +	.max_core_mbpf = 4096 * 2176 / 256 * 2 + 1920 * 1088 / 256,
> +	/* max spec for SC7280 is 4096x2176@60fps */
> +	.max_core_mbps = 4096 * 2176 / 256 * 60,
> +	.dec_input_config_params_default =
> +		sm8550_vdec_input_config_params_default,
> +	.dec_input_config_params_default_size =
> +		ARRAY_SIZE(sm8550_vdec_input_config_params_default),
> +	.dec_input_config_params_hevc =
> +		sm8550_vdec_input_config_param_hevc,
> +	.dec_input_config_params_hevc_size =
> +		ARRAY_SIZE(sm8550_vdec_input_config_param_hevc),
> +	.dec_input_config_params_vp9 =
> +		sm8550_vdec_input_config_param_vp9,
> +	.dec_input_config_params_vp9_size =
> +		ARRAY_SIZE(sm8550_vdec_input_config_param_vp9),
> +	.enc_input_config_params = sm8550_venc_input_config_params,
> +	.enc_input_config_params_size =
> +		ARRAY_SIZE(sm8550_venc_input_config_params),
> +	.dec_output_config_params = sm8550_vdec_output_config_params,
> +	.dec_output_config_params_size = ARRAY_SIZE(sm8550_vdec_output_config_params),
> +	.enc_output_config_params = sm8550_venc_output_config_params,
> +	.enc_output_config_params_size = ARRAY_SIZE(sm8550_venc_output_config_params),
> +
> +	.dec_ip_int_buf_tbl = sm8550_dec_ip_int_buf_tbl,
> +	.dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
> +	.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> +	.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
> +
> +	.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> +	.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> +
> +	.dec_input_prop = sm8550_vdec_subscribe_input_properties,
> +	.dec_input_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_input_properties),
> +	.dec_output_prop_avc = sm8550_vdec_subscribe_output_properties_avc,
> +	.dec_output_prop_avc_size =
> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_avc),
> +	.dec_output_prop_hevc = sm8550_vdec_subscribe_output_properties_hevc,
> +	.dec_output_prop_hevc_size =
> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_hevc),
> +	.dec_output_prop_vp9 = sm8550_vdec_subscribe_output_properties_vp9,
> +	.dec_output_prop_vp9_size =
> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_vp9),
> +};
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sc7280.h b/drivers/media/platform/qcom/iris/iris_platform_sc7280.h
> index 0ec8f334df670c3c1548a5ee3b8907b333e34db3..6e05f2542a5457bd0b3b6acced3bd54d166b2023 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_sc7280.h
> +++ b/drivers/media/platform/qcom/iris/iris_platform_sc7280.h
> @@ -6,6 +6,21 @@
>  #ifndef __IRIS_PLATFORM_SC7280_H__
>  #define __IRIS_PLATFORM_SC7280_H__
>  
> +static struct iris_fmt platform_fmts_sc7280_dec[] = {
> +	[IRIS_FMT_H264] = {
> +		.pixfmt = V4L2_PIX_FMT_H264,
> +		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> +	},
> +	[IRIS_FMT_HEVC] = {
> +		.pixfmt = V4L2_PIX_FMT_HEVC,
> +		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> +	},
> +	[IRIS_FMT_VP9] = {
> +		.pixfmt = V4L2_PIX_FMT_VP9,
> +		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> +	},
> +};
> +
>  static const struct bw_info sc7280_bw_table_dec[] = {
>  	{ ((3840 * 2160) / 256) * 60, 1896000, },
>  	{ ((3840 * 2160) / 256) * 30,  968000, },
> diff --git a/drivers/media/platform/qcom/iris/iris_probe.c b/drivers/media/platform/qcom/iris/iris_probe.c
> index 22c7b3410710328b900fc49459cd399aa0e89b02..1f44d3ea337df63fbf5317b9b99139a0867267c3 100644
> --- a/drivers/media/platform/qcom/iris/iris_probe.c
> +++ b/drivers/media/platform/qcom/iris/iris_probe.c
> @@ -12,7 +12,6 @@
>  #include <linux/reset.h>
>  
>  #include "iris_core.h"
> -#include "iris_ctrls.h"
>  #include "iris_vidc.h"
>  
>  static int iris_init_icc(struct iris_core *core)
> @@ -257,8 +256,6 @@ static int iris_probe(struct platform_device *pdev)
>  	if (ret)
>  		return ret;
>  
> -	iris_session_init_caps(core);
> -

Why?

>  	ret = v4l2_device_register(dev, &core->v4l2_dev);
>  	if (ret)
>  		return ret;
> diff --git a/drivers/media/platform/qcom/iris/iris_vidc.c b/drivers/media/platform/qcom/iris/iris_vidc.c
> index bd38d84c9cc79d15585ed5dd5f905a37521cb6dc..0727d5d19cb9b7ed1f72ab840ae5dfda0162e23d 100644
> --- a/drivers/media/platform/qcom/iris/iris_vidc.c
> +++ b/drivers/media/platform/qcom/iris/iris_vidc.c
> @@ -9,6 +9,7 @@
>  #include <media/v4l2-mem2mem.h>
>  #include <media/videobuf2-dma-contig.h>
>  
> +#include "iris_ctrls.h"
>  #include "iris_vidc.h"
>  #include "iris_instance.h"
>  #include "iris_vdec.h"
> @@ -196,6 +197,8 @@ int iris_open(struct file *filp)
>  		goto fail_m2m_release;
>  	}
>  
> +	iris_session_init_caps(core);
> +
>  	if (inst->domain == DECODER)
>  		ret = iris_vdec_inst_init(inst);
>  	else if (inst->domain == ENCODER)
> 
> -- 
> 2.34.1
> 

-- 
With best wishes
Dmitry

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 3/3] media: iris: Add support for Gen2 firmware detection and loading on SC7280
  2026-02-27 12:18   ` Dmitry Baryshkov
@ 2026-03-02  9:26     ` Dikshita Agarwal
  2026-03-05  4:57       ` Dmitry Baryshkov
  0 siblings, 1 reply; 9+ messages in thread
From: Dikshita Agarwal @ 2026-03-02  9:26 UTC (permalink / raw)
  To: Dmitry Baryshkov
  Cc: Vikash Garodia, Abhinav Kumar, Bryan O'Donoghue,
	Mauro Carvalho Chehab, Hans Verkuil, Vishnu Reddy, linux-media,
	linux-arm-msm, linux-kernel



On 2/27/2026 5:48 PM, Dmitry Baryshkov wrote:
> On Fri, Feb 27, 2026 at 12:21:03PM +0530, Dikshita Agarwal wrote:
>> SC7280 supports both Gen1 and Gen2 HFI firmware. To support both
>> dynamically, update the firmware loading mechanism to prioritize
>> Gen2 availability and detect the loaded firmware version at runtime.
>>
>> The firmware loading logic is updated with the following priority:
>> 1. Device Tree (`firmware-name`): If specified, load unconditionally.
>> 2. Gen2 Autodetect (SC7280 only): If no DT property exists, attempt to
>>    load the specific Gen2 firmware image (`vpu20_p1_gen2_s6.mbn`).
>> 3. Default Fallback: If Gen2 loading fails or is not applicable, use
>>    the default firmware name defined in the default platform data.
>>
>> Additionally, introduce `iris_update_platform_data` to inspect the
>> loaded firmware memory before authentication. This function scans for
>> `QC_IMAGE_VERSION_STRING`. If the version string starts with "vfw" or
>> matches "video-firmware.N.M" (where N >= 2), it identifies the
>> firmware as Gen2.
>>
>> If Gen2 firmware is detected on SC7280, the driver switches the
>> internal platform data pointer to the Gen2 configuration.
>>
>> Signed-off-by: Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>
>> ---
>>  drivers/media/platform/qcom/iris/iris_firmware.c   | 70 +++++++++++++++++-
>>  .../platform/qcom/iris/iris_platform_common.h      |  1 +
>>  .../media/platform/qcom/iris/iris_platform_gen1.c  |  4 +-
>>  .../media/platform/qcom/iris/iris_platform_gen2.c  | 83 ++++++++++++++++++++++
>>  .../platform/qcom/iris/iris_platform_sc7280.h      | 15 ++++
>>  drivers/media/platform/qcom/iris/iris_probe.c      |  3 -
>>  drivers/media/platform/qcom/iris/iris_vidc.c       |  3 +
>>  7 files changed, 171 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/media/platform/qcom/iris/iris_firmware.c b/drivers/media/platform/qcom/iris/iris_firmware.c
>> index 5f408024e967fd21ade66cc3fa377d8507f9002e..f6ee7f58d4ce215ad9f7fb5fdcadec17f99c8848 100644
>> --- a/drivers/media/platform/qcom/iris/iris_firmware.c
>> +++ b/drivers/media/platform/qcom/iris/iris_firmware.c
>> @@ -14,6 +14,53 @@
>>  
>>  #define MAX_FIRMWARE_NAME_SIZE	128
>>  
>> +static void iris_update_platform_data(struct iris_core *core)
>> +{
>> +	const char *marker = "QC_IMAGE_VERSION_STRING=";
>> +	struct device_node *node = core->dev->of_node;
>> +	const char *found = NULL;
>> +	int major = 0, minor = 0;
>> +	char version_buf[64];
>> +	struct resource res;
>> +	void *mem_virt;
>> +	size_t i;
>> +
>> +	if (!of_device_is_compatible(node, "qcom,sc7280-venus"))
>> +		return;
>> +
>> +	if (of_reserved_mem_region_to_resource(node, 0, &res)) {
>> +		dev_err(core->dev, "Failed to get reserved memory for version check\n");
>> +		return;
>> +	}
>> +
>> +	mem_virt = memremap(res.start, resource_size(&res), MEMREMAP_WC);
>> +	if (!mem_virt) {
>> +		dev_err(core->dev, "Failed to remap memory for version check\n");
>> +		return;
>> +	}
>> +
>> +	for (i = 0; i < resource_size(&res) - strlen(marker); i++) {
>> +		if (memcmp(mem_virt + i, marker, strlen(marker)) == 0) {
>> +			found = (const char *)(mem_virt + i + strlen(marker));
>> +			break;
>> +		}
>> +	}
> 
> This should be done in iris_load_fw_to_memory(). Saves you from extra
> memremap() / memunmap() and also from scanning extra data beyond the
> loaded image area.
> 

Agree, I will move the version detection logic inside iris_load_fw_to_memory.

>> +
>> +	if (found) {
>> +		strscpy(version_buf, found, sizeof(version_buf));
>> +
>> +		/* Check for gen2 version string: "vfw..." OR "video-firmware.N..." (N>=2) */
>> +		if (strncmp(version_buf, "vfw", 3) == 0 ||
>> +		    (sscanf(version_buf, "video-firmware.%d.%d", &major, &minor) == 2 &&
>> +			    major >= 2)) {
>> +			dev_info(core->dev, "Gen2 FW Detected: %s\n", version_buf);
>> +			core->iris_platform_data = &sc7280_gen2_data;
>> +		}
>> +	}
>> +
>> +	memunmap(mem_virt);
>> +}
>> +
>>  static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name)
>>  {
>>  	u32 pas_id = core->iris_platform_data->pas_id;
>> @@ -64,21 +111,38 @@ static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name)
>>  
>>  int iris_fw_load(struct iris_core *core)
>>  {
>> +	struct device_node *node = core->dev->of_node;
>>  	const struct tz_cp_config *cp_config;
>>  	const char *fwpath = NULL;
>>  	int i, ret;
>>  
>>  	ret = of_property_read_string_index(core->dev->of_node, "firmware-name", 0,
>>  					    &fwpath);
>> -	if (ret)
>> -		fwpath = core->iris_platform_data->fwname;
>> +	if (!ret) {
>> +		ret = iris_load_fw_to_memory(core, fwpath);
>> +	} else {
>> +		bool fw_loaded = false;
>> +
>> +		if (of_device_is_compatible(node, "qcom,sc7280-venus")) {
>> +			ret = iris_load_fw_to_memory(core, "qcom/vpu/vpu20_p1_gen2_s6.mbn");
>> +			if (!ret)
>> +				fw_loaded = true;
>> +		}
>> +
>> +		if (!fw_loaded) {
>> +			fwpath = core->iris_platform_data->fwname;
>> +			dev_dbg(core->dev, "loading default fw: %s\n", fwpath);
>> +			ret = iris_load_fw_to_memory(core, fwpath);
>> +		}
> 
> Make SC7280 default to Gen2 firmware. Then:
> 
> 	ret = iris_load_fw_to_memory(core, fwpath);
> 	if (ret == -ENOENT &&
> 	    fwpath == core->iris_platform_data->fwname &&
> 	    of_device_is_compatible(node, "qcom,sc7280-venus"))
> 		ret = iris_load_fw_to_memory(core, sc7280_data.fwname);
> 

Ack. I would rework iris_fw_load() so that SC7280 defaults to the Gen2
firmware when no DT firmware-name is provided, and falls back to the Gen1
name only when the Gen2 image is missing.

>> +	}
>>  
>> -	ret = iris_load_fw_to_memory(core, fwpath);
>>  	if (ret) {
>>  		dev_err(core->dev, "firmware download failed\n");
>>  		return -ENOMEM;
>>  	}
>>  
>> +	iris_update_platform_data(core);
>> +
>>  	ret = qcom_scm_pas_auth_and_reset(core->iris_platform_data->pas_id);
>>  	if (ret)  {
>>  		dev_err(core->dev, "auth and reset failed: %d\n", ret);
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
>> index 5a489917580eb10022fdcb52f7321a915e8b239d..f1bbbe043e3a3ccc5eebf67091162678eb83bf45 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
>> @@ -43,6 +43,7 @@ enum pipe_type {
>>  
>>  extern const struct iris_platform_data qcs8300_data;
>>  extern const struct iris_platform_data sc7280_data;
>> +extern const struct iris_platform_data sc7280_gen2_data;
>>  extern const struct iris_platform_data sm8250_data;
>>  extern const struct iris_platform_data sm8550_data;
>>  extern const struct iris_platform_data sm8650_data;
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen1.c b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
>> index df8e6bf9430ed2a070e092edae9ef998d092cb5e..6dbdd0833dcdc7dfac6d7b35f99837c883e188e7 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_gen1.c
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
>> @@ -414,8 +414,8 @@ const struct iris_platform_data sc7280_data = {
>>  	.dma_mask = 0xe0000000 - 1,
>>  	.fwname = "qcom/vpu/vpu20_p1.mbn",
>>  	.pas_id = IRIS_PAS_ID,
>> -	.inst_iris_fmts = platform_fmts_sm8250_dec,
>> -	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sm8250_dec),
>> +	.inst_iris_fmts = platform_fmts_sc7280_dec,
>> +	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sc7280_dec),
> 
> Why?
> 

SC7280 Gen2 platform data relies heavily on SM8550 data structures.
However, unlike SM8550, SC7280 does not support AV1. To address this, I am
defining a dedicated platform_fmts_sc7280_dec array that correctly lists
the supported codecs (H264, HEVC, VP9) excluding AV1 and using for both
gen1 and gen2 platform data for SC7280.

>>  	.inst_caps = &platform_inst_cap_sm8250,
>>  	.inst_fw_caps_dec = inst_fw_cap_sm8250_dec,
>>  	.inst_fw_caps_dec_size = ARRAY_SIZE(inst_fw_cap_sm8250_dec),
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
>> index 5da90d47f9c6eab4a7e6b17841fdc0e599397bf7..5f3be22a003fe5d80b683b43a1b2386497785fb1 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
>> @@ -15,6 +15,7 @@
>>  #include "iris_platform_qcs8300.h"
>>  #include "iris_platform_sm8650.h"
>>  #include "iris_platform_sm8750.h"
>> +#include "iris_platform_sc7280.h"
> 
> Don't you end up with two copies of 7280 data in the object files?
> 

You are right, there is a duplication.
The header is needed majorly for above reason to exclude AV1, I can have
only platform_fmts_sc7280_dec defined in gen1 file and extern and use in
gen2 file, that will deviate from the design we are currently following for
platform specific caps though.

>>  
>>  #define VIDEO_ARCH_LX 1
>>  #define BITRATE_MAX				245000000
>> @@ -1317,3 +1318,85 @@ const struct iris_platform_data qcs8300_data = {
>>  	.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
>>  	.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
>>  };
>> +
>> +const struct iris_platform_data sc7280_gen2_data = {
>> +	.get_instance = iris_hfi_gen2_get_instance,
>> +	.init_hfi_command_ops = iris_hfi_gen2_command_ops_init,
>> +	.init_hfi_response_ops = iris_hfi_gen2_response_ops_init,
>> +	/* Gen2 FW for SC7280 requires bigger size for line buffer for encoder */
>> +	.get_vpu_buffer_size = iris_vpu33_buf_size,
>> +	.vpu_ops = &iris_vpu2_ops,
>> +	.set_preset_registers = iris_set_sm8550_preset_registers,
>> +	.icc_tbl = sm8550_icc_table,
>> +	.icc_tbl_size = ARRAY_SIZE(sm8550_icc_table),
>> +	.bw_tbl_dec = sc7280_bw_table_dec,
>> +	.bw_tbl_dec_size = ARRAY_SIZE(sc7280_bw_table_dec),
>> +	.pmdomain_tbl = sm8550_pmdomain_table,
>> +	.pmdomain_tbl_size = ARRAY_SIZE(sm8550_pmdomain_table),
>> +	.opp_pd_tbl = sc7280_opp_pd_table,
>> +	.opp_pd_tbl_size = ARRAY_SIZE(sc7280_opp_pd_table),
>> +	.clk_tbl = sc7280_clk_table,
>> +	.clk_tbl_size = ARRAY_SIZE(sc7280_clk_table),
>> +	.opp_clk_tbl = sc7280_opp_clk_table,
>> +	/* Upper bound of DMA address range */
>> +	.dma_mask = 0xe0000000 - 1,
>> +	.fwname = "qcom/vpu/vpu20_p1_gen2_s6.mbn",
>> +	.pas_id = IRIS_PAS_ID,
>> +	.inst_iris_fmts = platform_fmts_sc7280_dec,
>> +	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sc7280_dec),
>> +	.inst_caps = &platform_inst_cap_sm8550,
>> +	.inst_fw_caps_dec = inst_fw_cap_sm8550_dec,
>> +	.inst_fw_caps_dec_size = ARRAY_SIZE(inst_fw_cap_sm8550_dec),
>> +	.inst_fw_caps_enc = inst_fw_cap_sm8550_enc,
>> +	.inst_fw_caps_enc_size = ARRAY_SIZE(inst_fw_cap_sm8550_enc),
>> +	.tz_cp_config_data = tz_cp_config_sm8550,
>> +	.tz_cp_config_data_size = ARRAY_SIZE(tz_cp_config_sm8550),
>> +	.hw_response_timeout = HW_RESPONSE_TIMEOUT_VALUE,
>> +	.ubwc_config = &ubwc_config_sm8550,
>> +	.core_arch = VIDEO_ARCH_LX,
>> +	.num_vpp_pipe = 1,
>> +	.no_aon = true,
>> +	.max_session_count = 16,
>> +	.max_core_mbpf = 4096 * 2176 / 256 * 2 + 1920 * 1088 / 256,
>> +	/* max spec for SC7280 is 4096x2176@60fps */
>> +	.max_core_mbps = 4096 * 2176 / 256 * 60,
>> +	.dec_input_config_params_default =
>> +		sm8550_vdec_input_config_params_default,
>> +	.dec_input_config_params_default_size =
>> +		ARRAY_SIZE(sm8550_vdec_input_config_params_default),
>> +	.dec_input_config_params_hevc =
>> +		sm8550_vdec_input_config_param_hevc,
>> +	.dec_input_config_params_hevc_size =
>> +		ARRAY_SIZE(sm8550_vdec_input_config_param_hevc),
>> +	.dec_input_config_params_vp9 =
>> +		sm8550_vdec_input_config_param_vp9,
>> +	.dec_input_config_params_vp9_size =
>> +		ARRAY_SIZE(sm8550_vdec_input_config_param_vp9),
>> +	.enc_input_config_params = sm8550_venc_input_config_params,
>> +	.enc_input_config_params_size =
>> +		ARRAY_SIZE(sm8550_venc_input_config_params),
>> +	.dec_output_config_params = sm8550_vdec_output_config_params,
>> +	.dec_output_config_params_size = ARRAY_SIZE(sm8550_vdec_output_config_params),
>> +	.enc_output_config_params = sm8550_venc_output_config_params,
>> +	.enc_output_config_params_size = ARRAY_SIZE(sm8550_venc_output_config_params),
>> +
>> +	.dec_ip_int_buf_tbl = sm8550_dec_ip_int_buf_tbl,
>> +	.dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
>> +	.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
>> +	.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>> +
>> +	.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
>> +	.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
>> +
>> +	.dec_input_prop = sm8550_vdec_subscribe_input_properties,
>> +	.dec_input_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_input_properties),
>> +	.dec_output_prop_avc = sm8550_vdec_subscribe_output_properties_avc,
>> +	.dec_output_prop_avc_size =
>> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_avc),
>> +	.dec_output_prop_hevc = sm8550_vdec_subscribe_output_properties_hevc,
>> +	.dec_output_prop_hevc_size =
>> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_hevc),
>> +	.dec_output_prop_vp9 = sm8550_vdec_subscribe_output_properties_vp9,
>> +	.dec_output_prop_vp9_size =
>> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_vp9),
>> +};
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sc7280.h b/drivers/media/platform/qcom/iris/iris_platform_sc7280.h
>> index 0ec8f334df670c3c1548a5ee3b8907b333e34db3..6e05f2542a5457bd0b3b6acced3bd54d166b2023 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_sc7280.h
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_sc7280.h
>> @@ -6,6 +6,21 @@
>>  #ifndef __IRIS_PLATFORM_SC7280_H__
>>  #define __IRIS_PLATFORM_SC7280_H__
>>  
>> +static struct iris_fmt platform_fmts_sc7280_dec[] = {
>> +	[IRIS_FMT_H264] = {
>> +		.pixfmt = V4L2_PIX_FMT_H264,
>> +		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
>> +	},
>> +	[IRIS_FMT_HEVC] = {
>> +		.pixfmt = V4L2_PIX_FMT_HEVC,
>> +		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
>> +	},
>> +	[IRIS_FMT_VP9] = {
>> +		.pixfmt = V4L2_PIX_FMT_VP9,
>> +		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
>> +	},
>> +};
>> +
>>  static const struct bw_info sc7280_bw_table_dec[] = {
>>  	{ ((3840 * 2160) / 256) * 60, 1896000, },
>>  	{ ((3840 * 2160) / 256) * 30,  968000, },
>> diff --git a/drivers/media/platform/qcom/iris/iris_probe.c b/drivers/media/platform/qcom/iris/iris_probe.c
>> index 22c7b3410710328b900fc49459cd399aa0e89b02..1f44d3ea337df63fbf5317b9b99139a0867267c3 100644
>> --- a/drivers/media/platform/qcom/iris/iris_probe.c
>> +++ b/drivers/media/platform/qcom/iris/iris_probe.c
>> @@ -12,7 +12,6 @@
>>  #include <linux/reset.h>
>>  
>>  #include "iris_core.h"
>> -#include "iris_ctrls.h"
>>  #include "iris_vidc.h"
>>  
>>  static int iris_init_icc(struct iris_core *core)
>> @@ -257,8 +256,6 @@ static int iris_probe(struct platform_device *pdev)
>>  	if (ret)
>>  		return ret;
>>  
>> -	iris_session_init_caps(core);
>> -
> 
> Why?

Movin iris_session_init_caps to iris_open because platform data this
capabilities may change after firmware loading, which happens after probe.
Initializing caps in probe would result in stale Gen1 capabilities if the
driver later switches to Gen2.

Thanks,
Dikshita
> 
>>  	ret = v4l2_device_register(dev, &core->v4l2_dev);
>>  	if (ret)
>>  		return ret;
>> diff --git a/drivers/media/platform/qcom/iris/iris_vidc.c b/drivers/media/platform/qcom/iris/iris_vidc.c
>> index bd38d84c9cc79d15585ed5dd5f905a37521cb6dc..0727d5d19cb9b7ed1f72ab840ae5dfda0162e23d 100644
>> --- a/drivers/media/platform/qcom/iris/iris_vidc.c
>> +++ b/drivers/media/platform/qcom/iris/iris_vidc.c
>> @@ -9,6 +9,7 @@
>>  #include <media/v4l2-mem2mem.h>
>>  #include <media/videobuf2-dma-contig.h>
>>  
>> +#include "iris_ctrls.h"
>>  #include "iris_vidc.h"
>>  #include "iris_instance.h"
>>  #include "iris_vdec.h"
>> @@ -196,6 +197,8 @@ int iris_open(struct file *filp)
>>  		goto fail_m2m_release;
>>  	}
>>  
>> +	iris_session_init_caps(core);
>> +
>>  	if (inst->domain == DECODER)
>>  		ret = iris_vdec_inst_init(inst);
>>  	else if (inst->domain == ENCODER)
>>
>> -- 
>> 2.34.1
>>
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 3/3] media: iris: Add support for Gen2 firmware detection and loading on SC7280
  2026-03-02  9:26     ` Dikshita Agarwal
@ 2026-03-05  4:57       ` Dmitry Baryshkov
  2026-03-13 11:11         ` Dikshita Agarwal
  0 siblings, 1 reply; 9+ messages in thread
From: Dmitry Baryshkov @ 2026-03-05  4:57 UTC (permalink / raw)
  To: Dikshita Agarwal
  Cc: Vikash Garodia, Abhinav Kumar, Bryan O'Donoghue,
	Mauro Carvalho Chehab, Hans Verkuil, Vishnu Reddy, linux-media,
	linux-arm-msm, linux-kernel

On Mon, Mar 02, 2026 at 02:56:16PM +0530, Dikshita Agarwal wrote:
> 
> 
> On 2/27/2026 5:48 PM, Dmitry Baryshkov wrote:
> > On Fri, Feb 27, 2026 at 12:21:03PM +0530, Dikshita Agarwal wrote:
> >> SC7280 supports both Gen1 and Gen2 HFI firmware. To support both
> >> dynamically, update the firmware loading mechanism to prioritize
> >> Gen2 availability and detect the loaded firmware version at runtime.
> >>
> >> The firmware loading logic is updated with the following priority:
> >> 1. Device Tree (`firmware-name`): If specified, load unconditionally.
> >> 2. Gen2 Autodetect (SC7280 only): If no DT property exists, attempt to
> >>    load the specific Gen2 firmware image (`vpu20_p1_gen2_s6.mbn`).
> >> 3. Default Fallback: If Gen2 loading fails or is not applicable, use
> >>    the default firmware name defined in the default platform data.
> >>
> >> Additionally, introduce `iris_update_platform_data` to inspect the
> >> loaded firmware memory before authentication. This function scans for
> >> `QC_IMAGE_VERSION_STRING`. If the version string starts with "vfw" or
> >> matches "video-firmware.N.M" (where N >= 2), it identifies the
> >> firmware as Gen2.
> >>
> >> If Gen2 firmware is detected on SC7280, the driver switches the
> >> internal platform data pointer to the Gen2 configuration.
> >>
> >> Signed-off-by: Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>
> >> ---
> >>  drivers/media/platform/qcom/iris/iris_firmware.c   | 70 +++++++++++++++++-
> >>  .../platform/qcom/iris/iris_platform_common.h      |  1 +
> >>  .../media/platform/qcom/iris/iris_platform_gen1.c  |  4 +-
> >>  .../media/platform/qcom/iris/iris_platform_gen2.c  | 83 ++++++++++++++++++++++
> >>  .../platform/qcom/iris/iris_platform_sc7280.h      | 15 ++++
> >>  drivers/media/platform/qcom/iris/iris_probe.c      |  3 -
> >>  drivers/media/platform/qcom/iris/iris_vidc.c       |  3 +
> >>  7 files changed, 171 insertions(+), 8 deletions(-)
> >>
> >> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen1.c b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
> >> index df8e6bf9430ed2a070e092edae9ef998d092cb5e..6dbdd0833dcdc7dfac6d7b35f99837c883e188e7 100644
> >> --- a/drivers/media/platform/qcom/iris/iris_platform_gen1.c
> >> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
> >> @@ -414,8 +414,8 @@ const struct iris_platform_data sc7280_data = {
> >>  	.dma_mask = 0xe0000000 - 1,
> >>  	.fwname = "qcom/vpu/vpu20_p1.mbn",
> >>  	.pas_id = IRIS_PAS_ID,
> >> -	.inst_iris_fmts = platform_fmts_sm8250_dec,
> >> -	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sm8250_dec),
> >> +	.inst_iris_fmts = platform_fmts_sc7280_dec,
> >> +	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sc7280_dec),
> > 
> > Why?
> > 
> 
> SC7280 Gen2 platform data relies heavily on SM8550 data structures.
> However, unlike SM8550, SC7280 does not support AV1. To address this, I am
> defining a dedicated platform_fmts_sc7280_dec array that correctly lists
> the supported codecs (H264, HEVC, VP9) excluding AV1 and using for both
> gen1 and gen2 platform data for SC7280.

Why can't we continue using SM8250 data? Also please see the series I
posted few days ago, it might simplify this piece for you.

> 
> >>  	.inst_caps = &platform_inst_cap_sm8250,
> >>  	.inst_fw_caps_dec = inst_fw_cap_sm8250_dec,
> >>  	.inst_fw_caps_dec_size = ARRAY_SIZE(inst_fw_cap_sm8250_dec),
> >> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> >> index 5da90d47f9c6eab4a7e6b17841fdc0e599397bf7..5f3be22a003fe5d80b683b43a1b2386497785fb1 100644
> >> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> >> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> >> @@ -15,6 +15,7 @@
> >>  #include "iris_platform_qcs8300.h"
> >>  #include "iris_platform_sm8650.h"
> >>  #include "iris_platform_sm8750.h"
> >> +#include "iris_platform_sc7280.h"
> > 
> > Don't you end up with two copies of 7280 data in the object files?
> > 
> 
> You are right, there is a duplication.
> The header is needed majorly for above reason to exclude AV1, I can have
> only platform_fmts_sc7280_dec defined in gen1 file and extern and use in
> gen2 file, that will deviate from the design we are currently following for
> platform specific caps though.

Then the design needs to be changed. I've posted a proposal.

> 
> >>  
> >>  #define VIDEO_ARCH_LX 1
> >>  #define BITRATE_MAX				245000000

> >> @@ -257,8 +256,6 @@ static int iris_probe(struct platform_device *pdev)
> >>  	if (ret)
> >>  		return ret;
> >>  
> >> -	iris_session_init_caps(core);
> >> -
> > 
> > Why?
> 
> Movin iris_session_init_caps to iris_open because platform data this
> capabilities may change after firmware loading, which happens after probe.
> Initializing caps in probe would result in stale Gen1 capabilities if the
> driver later switches to Gen2.

Is there a window where devices already exist, but the params are not
yet initialized?


-- 
With best wishes
Dmitry

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 3/3] media: iris: Add support for Gen2 firmware detection and loading on SC7280
  2026-03-05  4:57       ` Dmitry Baryshkov
@ 2026-03-13 11:11         ` Dikshita Agarwal
  2026-03-13 16:08           ` Dmitry Baryshkov
  0 siblings, 1 reply; 9+ messages in thread
From: Dikshita Agarwal @ 2026-03-13 11:11 UTC (permalink / raw)
  To: Dmitry Baryshkov
  Cc: Vikash Garodia, Abhinav Kumar, Bryan O'Donoghue,
	Mauro Carvalho Chehab, Hans Verkuil, Vishnu Reddy, linux-media,
	linux-arm-msm, linux-kernel



On 3/5/2026 10:27 AM, Dmitry Baryshkov wrote:
> On Mon, Mar 02, 2026 at 02:56:16PM +0530, Dikshita Agarwal wrote:
>>
>>
>> On 2/27/2026 5:48 PM, Dmitry Baryshkov wrote:
>>> On Fri, Feb 27, 2026 at 12:21:03PM +0530, Dikshita Agarwal wrote:
>>>> SC7280 supports both Gen1 and Gen2 HFI firmware. To support both
>>>> dynamically, update the firmware loading mechanism to prioritize
>>>> Gen2 availability and detect the loaded firmware version at runtime.
>>>>
>>>> The firmware loading logic is updated with the following priority:
>>>> 1. Device Tree (`firmware-name`): If specified, load unconditionally.
>>>> 2. Gen2 Autodetect (SC7280 only): If no DT property exists, attempt to
>>>>    load the specific Gen2 firmware image (`vpu20_p1_gen2_s6.mbn`).
>>>> 3. Default Fallback: If Gen2 loading fails or is not applicable, use
>>>>    the default firmware name defined in the default platform data.
>>>>
>>>> Additionally, introduce `iris_update_platform_data` to inspect the
>>>> loaded firmware memory before authentication. This function scans for
>>>> `QC_IMAGE_VERSION_STRING`. If the version string starts with "vfw" or
>>>> matches "video-firmware.N.M" (where N >= 2), it identifies the
>>>> firmware as Gen2.
>>>>
>>>> If Gen2 firmware is detected on SC7280, the driver switches the
>>>> internal platform data pointer to the Gen2 configuration.
>>>>
>>>> Signed-off-by: Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>
>>>> ---
>>>>  drivers/media/platform/qcom/iris/iris_firmware.c   | 70 +++++++++++++++++-
>>>>  .../platform/qcom/iris/iris_platform_common.h      |  1 +
>>>>  .../media/platform/qcom/iris/iris_platform_gen1.c  |  4 +-
>>>>  .../media/platform/qcom/iris/iris_platform_gen2.c  | 83 ++++++++++++++++++++++
>>>>  .../platform/qcom/iris/iris_platform_sc7280.h      | 15 ++++
>>>>  drivers/media/platform/qcom/iris/iris_probe.c      |  3 -
>>>>  drivers/media/platform/qcom/iris/iris_vidc.c       |  3 +
>>>>  7 files changed, 171 insertions(+), 8 deletions(-)
>>>>
>>>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen1.c b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
>>>> index df8e6bf9430ed2a070e092edae9ef998d092cb5e..6dbdd0833dcdc7dfac6d7b35f99837c883e188e7 100644
>>>> --- a/drivers/media/platform/qcom/iris/iris_platform_gen1.c
>>>> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
>>>> @@ -414,8 +414,8 @@ const struct iris_platform_data sc7280_data = {
>>>>  	.dma_mask = 0xe0000000 - 1,
>>>>  	.fwname = "qcom/vpu/vpu20_p1.mbn",
>>>>  	.pas_id = IRIS_PAS_ID,
>>>> -	.inst_iris_fmts = platform_fmts_sm8250_dec,
>>>> -	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sm8250_dec),
>>>> +	.inst_iris_fmts = platform_fmts_sc7280_dec,
>>>> +	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sc7280_dec),
>>>
>>> Why?
>>>
>>
>> SC7280 Gen2 platform data relies heavily on SM8550 data structures.
>> However, unlike SM8550, SC7280 does not support AV1. To address this, I am
>> defining a dedicated platform_fmts_sc7280_dec array that correctly lists
>> the supported codecs (H264, HEVC, VP9) excluding AV1 and using for both
>> gen1 and gen2 platform data for SC7280.
> 
> Why can't we continue using SM8250 data? Also please see the series I
> posted few days ago, it might simplify this piece for you.
> 
>>
>>>>  	.inst_caps = &platform_inst_cap_sm8250,
>>>>  	.inst_fw_caps_dec = inst_fw_cap_sm8250_dec,
>>>>  	.inst_fw_caps_dec_size = ARRAY_SIZE(inst_fw_cap_sm8250_dec),
>>>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
>>>> index 5da90d47f9c6eab4a7e6b17841fdc0e599397bf7..5f3be22a003fe5d80b683b43a1b2386497785fb1 100644
>>>> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
>>>> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
>>>> @@ -15,6 +15,7 @@
>>>>  #include "iris_platform_qcs8300.h"
>>>>  #include "iris_platform_sm8650.h"
>>>>  #include "iris_platform_sm8750.h"
>>>> +#include "iris_platform_sc7280.h"
>>>
>>> Don't you end up with two copies of 7280 data in the object files?
>>>
>>
>> You are right, there is a duplication.
>> The header is needed majorly for above reason to exclude AV1, I can have
>> only platform_fmts_sc7280_dec defined in gen1 file and extern and use in
>> gen2 file, that will deviate from the design we are currently following for
>> platform specific caps though.
> 
> Then the design needs to be changed. I've posted a proposal.
> 
>>
>>>>  
>>>>  #define VIDEO_ARCH_LX 1
>>>>  #define BITRATE_MAX				245000000
> 
>>>> @@ -257,8 +256,6 @@ static int iris_probe(struct platform_device *pdev)
>>>>  	if (ret)
>>>>  		return ret;
>>>>  
>>>> -	iris_session_init_caps(core);
>>>> -
>>>
>>> Why?
>>
>> Movin iris_session_init_caps to iris_open because platform data this
>> capabilities may change after firmware loading, which happens after probe.
>> Initializing caps in probe would result in stale Gen1 capabilities if the
>> driver later switches to Gen2.
> 
> Is there a window where devices already exist, but the params are not
> yet initialized?

The device nodes exist after probe, but session caps are only consumed
through ioctls on an open fd, so there’s no user-visible window where caps
can be queried before open().

Thanks,
Dikshita
> 
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 3/3] media: iris: Add support for Gen2 firmware detection and loading on SC7280
  2026-03-13 11:11         ` Dikshita Agarwal
@ 2026-03-13 16:08           ` Dmitry Baryshkov
  0 siblings, 0 replies; 9+ messages in thread
From: Dmitry Baryshkov @ 2026-03-13 16:08 UTC (permalink / raw)
  To: Dikshita Agarwal
  Cc: Vikash Garodia, Abhinav Kumar, Bryan O'Donoghue,
	Mauro Carvalho Chehab, Hans Verkuil, Vishnu Reddy, linux-media,
	linux-arm-msm, linux-kernel

On Fri, Mar 13, 2026 at 04:41:07PM +0530, Dikshita Agarwal wrote:
> 
> 
> On 3/5/2026 10:27 AM, Dmitry Baryshkov wrote:
> > On Mon, Mar 02, 2026 at 02:56:16PM +0530, Dikshita Agarwal wrote:
> >>
> >>
> >> On 2/27/2026 5:48 PM, Dmitry Baryshkov wrote:
> >>> On Fri, Feb 27, 2026 at 12:21:03PM +0530, Dikshita Agarwal wrote:
> >>>> SC7280 supports both Gen1 and Gen2 HFI firmware. To support both
> >>>> dynamically, update the firmware loading mechanism to prioritize
> >>>> Gen2 availability and detect the loaded firmware version at runtime.
> >>>>
> >>>> The firmware loading logic is updated with the following priority:
> >>>> 1. Device Tree (`firmware-name`): If specified, load unconditionally.
> >>>> 2. Gen2 Autodetect (SC7280 only): If no DT property exists, attempt to
> >>>>    load the specific Gen2 firmware image (`vpu20_p1_gen2_s6.mbn`).
> >>>> 3. Default Fallback: If Gen2 loading fails or is not applicable, use
> >>>>    the default firmware name defined in the default platform data.
> >>>>
> >>>> Additionally, introduce `iris_update_platform_data` to inspect the
> >>>> loaded firmware memory before authentication. This function scans for
> >>>> `QC_IMAGE_VERSION_STRING`. If the version string starts with "vfw" or
> >>>> matches "video-firmware.N.M" (where N >= 2), it identifies the
> >>>> firmware as Gen2.
> >>>>
> >>>> If Gen2 firmware is detected on SC7280, the driver switches the
> >>>> internal platform data pointer to the Gen2 configuration.
> >>>>
> >>>> Signed-off-by: Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>
> >>>> ---
> >>>>  drivers/media/platform/qcom/iris/iris_firmware.c   | 70 +++++++++++++++++-
> >>>>  .../platform/qcom/iris/iris_platform_common.h      |  1 +
> >>>>  .../media/platform/qcom/iris/iris_platform_gen1.c  |  4 +-
> >>>>  .../media/platform/qcom/iris/iris_platform_gen2.c  | 83 ++++++++++++++++++++++
> >>>>  .../platform/qcom/iris/iris_platform_sc7280.h      | 15 ++++
> >>>>  drivers/media/platform/qcom/iris/iris_probe.c      |  3 -
> >>>>  drivers/media/platform/qcom/iris/iris_vidc.c       |  3 +
> >>>>  7 files changed, 171 insertions(+), 8 deletions(-)
> >>>>
> >>>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen1.c b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
> >>>> index df8e6bf9430ed2a070e092edae9ef998d092cb5e..6dbdd0833dcdc7dfac6d7b35f99837c883e188e7 100644
> >>>> --- a/drivers/media/platform/qcom/iris/iris_platform_gen1.c
> >>>> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
> >>>> @@ -414,8 +414,8 @@ const struct iris_platform_data sc7280_data = {
> >>>>  	.dma_mask = 0xe0000000 - 1,
> >>>>  	.fwname = "qcom/vpu/vpu20_p1.mbn",
> >>>>  	.pas_id = IRIS_PAS_ID,
> >>>> -	.inst_iris_fmts = platform_fmts_sm8250_dec,
> >>>> -	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sm8250_dec),
> >>>> +	.inst_iris_fmts = platform_fmts_sc7280_dec,
> >>>> +	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_sc7280_dec),
> >>>
> >>> Why?
> >>>
> >>
> >> SC7280 Gen2 platform data relies heavily on SM8550 data structures.
> >> However, unlike SM8550, SC7280 does not support AV1. To address this, I am
> >> defining a dedicated platform_fmts_sc7280_dec array that correctly lists
> >> the supported codecs (H264, HEVC, VP9) excluding AV1 and using for both
> >> gen1 and gen2 platform data for SC7280.
> > 
> > Why can't we continue using SM8250 data? Also please see the series I
> > posted few days ago, it might simplify this piece for you.
> > 
> >>
> >>>>  	.inst_caps = &platform_inst_cap_sm8250,
> >>>>  	.inst_fw_caps_dec = inst_fw_cap_sm8250_dec,
> >>>>  	.inst_fw_caps_dec_size = ARRAY_SIZE(inst_fw_cap_sm8250_dec),
> >>>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> >>>> index 5da90d47f9c6eab4a7e6b17841fdc0e599397bf7..5f3be22a003fe5d80b683b43a1b2386497785fb1 100644
> >>>> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> >>>> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> >>>> @@ -15,6 +15,7 @@
> >>>>  #include "iris_platform_qcs8300.h"
> >>>>  #include "iris_platform_sm8650.h"
> >>>>  #include "iris_platform_sm8750.h"
> >>>> +#include "iris_platform_sc7280.h"
> >>>
> >>> Don't you end up with two copies of 7280 data in the object files?
> >>>
> >>
> >> You are right, there is a duplication.
> >> The header is needed majorly for above reason to exclude AV1, I can have
> >> only platform_fmts_sc7280_dec defined in gen1 file and extern and use in
> >> gen2 file, that will deviate from the design we are currently following for
> >> platform specific caps though.
> > 
> > Then the design needs to be changed. I've posted a proposal.
> > 
> >>
> >>>>  
> >>>>  #define VIDEO_ARCH_LX 1
> >>>>  #define BITRATE_MAX				245000000
> > 
> >>>> @@ -257,8 +256,6 @@ static int iris_probe(struct platform_device *pdev)
> >>>>  	if (ret)
> >>>>  		return ret;
> >>>>  
> >>>> -	iris_session_init_caps(core);
> >>>> -
> >>>
> >>> Why?
> >>
> >> Movin iris_session_init_caps to iris_open because platform data this
> >> capabilities may change after firmware loading, which happens after probe.
> >> Initializing caps in probe would result in stale Gen1 capabilities if the
> >> driver later switches to Gen2.
> > 
> > Is there a window where devices already exist, but the params are not
> > yet initialized?
> 
> The device nodes exist after probe, but session caps are only consumed
> through ioctls on an open fd, so there’s no user-visible window where caps
> can be queried before open().

Ack

-- 
With best wishes
Dmitry

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-03-13 16:08 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-02-27  6:51 [PATCH v2 0/3] media: qcom: iris: Add support for Gen2 firmware detection and loading on SC7280 Dikshita Agarwal
2026-02-27  6:51 ` [PATCH v2 1/3] media: iris: Switch to hardware mode after firmware boot Dikshita Agarwal
2026-02-27  6:51 ` [PATCH v2 2/3] media: iris: Initialize HFI ops after firmware load in core init Dikshita Agarwal
2026-02-27  6:51 ` [PATCH v2 3/3] media: iris: Add support for Gen2 firmware detection and loading on SC7280 Dikshita Agarwal
2026-02-27 12:18   ` Dmitry Baryshkov
2026-03-02  9:26     ` Dikshita Agarwal
2026-03-05  4:57       ` Dmitry Baryshkov
2026-03-13 11:11         ` Dikshita Agarwal
2026-03-13 16:08           ` Dmitry Baryshkov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®