Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
aa61cb8
Revert "FROMLIST: media: iris: Add platform data for glymur"
gouravk-qualcomm May 23, 2026
a2985eb
Revert "FROMLIST: media: iris: Add support to select core for dual co…
gouravk-qualcomm May 23, 2026
dd53df5
Revert "FROMLIST: media: iris: Add power sequence for Glymur"
gouravk-qualcomm May 23, 2026
f9bb644
Revert "FROMLIST: media: iris: Use power domain type to look up pd_de…
gouravk-qualcomm May 23, 2026
3dbaf3b
Revert "FROMLIST: media: iris: Rename clock and power domain macros t…
gouravk-qualcomm May 23, 2026
5278c23
Revert "FROMLIST: media: iris: Fix VM count passed to firmware"
gouravk-qualcomm May 23, 2026
7d26897
Revert "FROMLIST: media: iris: Add platform data for X1P42100"
gouravk-qualcomm May 23, 2026
aa6235a
Revert "FROMLIST: media: iris: Add hardware power on/off ops for X1P4…
gouravk-qualcomm May 23, 2026
da00f68
Revert "FROMLIST: media: qcom: iris: extract firmware description data"
gouravk-qualcomm May 23, 2026
5db5515
Revert "FROMLIST: media: qcom: iris: use new firmware name for SM8250"
gouravk-qualcomm May 23, 2026
e2847c8
Revert "FROMLIST: media: qcom: iris: split platform data from firmwar…
gouravk-qualcomm May 23, 2026
cc1b6cc
Revert "FROMLIST: media: qcom: iris: split firmware_data from raw pla…
gouravk-qualcomm May 23, 2026
fa1e7a1
Revert "FROMLIST: media: qcom: iris: drop hw_response_timeout_val fro…
gouravk-qualcomm May 23, 2026
753ec7e
Revert "FROMLIST: media: qcom: iris: move get_instance to iris_hfi_sy…
gouravk-qualcomm May 23, 2026
40e86b7
Revert "FROMLIST: media: qcom: iris: merge hfi_response_ops and hfi_c…
gouravk-qualcomm May 23, 2026
e485d3d
Revert "FROMLIST: media: qcom: iris: split HFI session ops from core …
gouravk-qualcomm May 23, 2026
9033c24
Revert "FROMLIST: media: qcom: iris: don't use function indirection i…
gouravk-qualcomm May 23, 2026
86daef9
Revert "FROMLIST: media: qcom: iris: use common set_preset_registers …
gouravk-qualcomm May 23, 2026
804254b
Revert "FROMLIST: media: qcom: iris: drop pas_id from the iris_platfo…
gouravk-qualcomm May 23, 2026
8a96ac1
Revert "PENDING: media: iris: add helper to select context bank device"
gouravk-qualcomm May 23, 2026
68ab85a
Revert "PENDING: media: iris: add context bank devices using iommu-map"
gouravk-qualcomm May 23, 2026
bc39d6f
Revert "PENDING: media: iris: enable sm8550 context banks via init_cb…
gouravk-qualcomm May 23, 2026
bbf3b84
Revert "FROMLIST: media: iris: add FPS calculation and VPP FW overhea…
gouravk-qualcomm May 23, 2026
354f31d
Revert "FROMLIST: media: qcom: venus: flip the venus/iris switch"
gouravk-qualcomm May 23, 2026
2a46345
Revert "PENDING: media: iris: update MDT PAS load call for new API"
gouravk-qualcomm May 23, 2026
96d6184
Revert "FROMLIST: media: iris: Enable Secure PAS support with IOMMU m…
gouravk-qualcomm May 23, 2026
6e8534e
Revert "FROMLIST: media: iris: Add platform data for kaanapali"
gouravk-qualcomm May 23, 2026
e893d15
FROMGIT: media: iris: retrieve UBWC platform configuration
lumag Jan 25, 2026
6d8a4a3
FROMGIT: media: iris: don't specify min_acc_length in the source code
lumag Jan 25, 2026
486351e
FROMGIT: media: iris: don't specify highest_bank_bit in the source code
lumag Jan 25, 2026
3c08ee5
FROMGIT: media: iris: don't specify ubwc_swizzle in the source code
lumag Jan 25, 2026
bca6dc3
FROMGIT: media: iris: don't specify bank_spreading in the source code
lumag Jan 25, 2026
f293aea
FROMGIT: media: iris: don't specify max_channels in the source code
lumag Jan 25, 2026
1dd4937
FROMGIT: media: iris: drop remnants of UBWC configuration
lumag Jan 25, 2026
795608e
FROMGIT: media: qcom: venus: flip the venus/iris switch
lumag Mar 27, 2026
641fd05
FROMGIT: media: qcom: iris: drop pas_id from the iris_platform_data s…
lumag Mar 29, 2026
e9c62cb
FROMGIT: media: qcom: iris: use common set_preset_registers function
lumag Mar 29, 2026
7ea02a9
FROMGIT: media: qcom: iris: don't use function indirection in gen2-sp…
lumag Mar 29, 2026
25f4014
FROMGIT: media: qcom: iris: split HFI session ops from core ops
lumag Mar 29, 2026
1f70fb5
FROMGIT: media: qcom: iris: merge hfi_response_ops and hfi_command_ops
lumag Mar 29, 2026
c4c8fd2
FROMGIT: media: qcom: iris: move get_instance to iris_hfi_sys_ops
lumag Mar 29, 2026
f2ccbb8
FROMGIT: media: qcom: iris: drop hw_response_timeout_val from platfor…
lumag Mar 29, 2026
345cb7d
FROMGIT: media: qcom: iris: split firmware_data from raw platform data
lumag Mar 29, 2026
405c598
FROMGIT: media: qcom: iris: split platform data from firmware data
lumag Mar 29, 2026
3e2fc0a
FROMGIT: media: qcom: iris: use new firmware name for SM8250
lumag Mar 29, 2026
10621f2
FROMGIT: media: qcom: iris: extract firmware description data
lumag Mar 29, 2026
9f42e01
FROMLIST: media: iris: Add platform data for kaanapali
Oct 17, 2025
0abb218
FROMLIST: media: iris: Enable Secure PAS support with IOMMU managed b…
mukeshojha-linux Feb 11, 2026
acd7304
PENDING: media: iris: update MDT PAS load call for new API
gouravk-qualcomm Apr 2, 2026
f9323b9
FROMLIST: media: iris: add FPS calculation and VPP FW overhead in fre…
Apr 3, 2026
829afbd
PENDING: media: iris: enable sm8550 context banks via init_cb_devs
Apr 7, 2026
1d44cf3
PENDING: media: iris: add context bank devices using iommu-map
Mar 13, 2026
9cf105f
PENDING: media: iris: add helper to select context bank device
Mar 13, 2026
cec4a3c
FROMLIST: media: iris: Add hardware power on/off ops for X1P42100
Jan 22, 2026
45ae707
FROMLIST: media: iris: Add platform data for X1P42100
Jan 22, 2026
44f689c
FROMLIST: media: iris: Fix VM count passed to firmware
Apr 28, 2026
fa3cb7b
FROMLIST: media: iris: Rename clock and power domain macros to use vc…
Apr 28, 2026
39ee79b
FROMLIST: media: iris: Use power domain type to look up pd_devs index
Apr 28, 2026
fc99daa
FROMLIST: media: iris: Add power sequence for Glymur
Apr 28, 2026
83147f5
FROMLIST: media: iris: Add support to select core for dual core platf…
Apr 28, 2026
37b68c3
FROMLIST: media: iris: Add platform data for glymur
Apr 28, 2026
73fe34c
FROMLIST: media: iris: Initialize HFI ops after firmware load in core…
dikshita-agarwal May 12, 2026
f223f90
FROMLIST: media: iris: Add Gen2 firmware autodetect and fallback
dikshita-agarwal May 12, 2026
9b797fb
FROMLIST: media: iris: optimize COMV buffer allocation for VPU3x and …
May 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions drivers/media/platform/qcom/iris/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ config VIDEO_QCOM_IRIS
select V4L2_MEM2MEM_DEV
select QCOM_MDT_LOADER
select QCOM_SCM
select QCOM_UBWC_CONFIG
select VIDEOBUF2_DMA_CONTIG
help
This is a V4L2 driver for Qualcomm iris video accelerator
Expand Down
2 changes: 2 additions & 0 deletions drivers/media/platform/qcom/iris/iris_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ int iris_core_init(struct iris_core *core)
if (ret)
goto error_unload_fw;

core->iris_firmware_data->init_hfi_ops(core);

ret = iris_hfi_core_init(core);
if (ret)
goto error_unload_fw;
Expand Down
4 changes: 4 additions & 0 deletions drivers/media/platform/qcom/iris/iris_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ enum domain_type {
DECODER = BIT(1),
};

struct qcom_ubwc_cfg_data;

enum iris_vcodec_core_id {
IRIS_VCODEC0 = 1,
IRIS_VCODEC1,
Expand Down Expand Up @@ -62,6 +64,7 @@ enum iris_vcodec_core_id {
* @iris_platform_data: a structure for platform data
* @iris_firmware_data: a pointer to the firmware (or HFI) specific data
* @iris_firmware_desc: a pointer to the firmware-specific descriptive data
* @ubwc_cfg: UBWC configuration for the platform
* @state: current state of core
* @iface_q_table_daddr: device address for interface queue table memory
* @sfr_daddr: device address for SFR (Sub System Failure Reason) register memory
Expand Down Expand Up @@ -114,6 +117,7 @@ struct iris_core {
const struct iris_platform_data *iris_platform_data;
const struct iris_firmware_data *iris_firmware_data;
const struct iris_firmware_desc *iris_firmware_desc;
const struct qcom_ubwc_cfg_data *ubwc_cfg;
enum iris_core_state state;
dma_addr_t iface_q_table_daddr;
dma_addr_t sfr_daddr;
Expand Down
107 changes: 89 additions & 18 deletions drivers/media/platform/qcom/iris/iris_firmware.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,99 @@
#include "iris_core.h"
#include "iris_firmware.h"

#define IRIS_PAS_ID 9
#define IRIS_PAS_ID 9

#define MAX_FIRMWARE_NAME_SIZE 128

static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name)
/* Detect Gen2 firmware by scanning the blob for:
* QC_IMAGE_VERSION_STRING=<version>
* and then checking:
* - version starts with "vfw", OR
* - version matches "video-firmware.N.M" with N >= 2
*/

static bool iris_detect_gen2_from_fwdata(const u8 *data, size_t size)
{
const char *marker = "QC_IMAGE_VERSION_STRING=";
const size_t mlen = strlen(marker);
int major = 0, minor = 0;
char version_buf[64];
size_t max;

max = (size > mlen) ? size - mlen : 0;
for (size_t i = 0; i < max; i++) {
if (!memcmp(data + i, marker, mlen)) {
const char *found = (const char *)(data + i + mlen);

strscpy(version_buf, found, sizeof(version_buf));
if (!strncmp(version_buf, "vfw", 3))
return true;
if (sscanf(version_buf, "video-firmware.%d.%d", &major, &minor) == 2 &&
major >= 2)
return true;
break;
}
}

return false;
}

static const struct firmware *iris_detect_firmware(struct iris_core *core,
const char **fw_name)
{
const struct firmware *firmware;
bool has_both_gens;
int ret;

*fw_name = NULL;
if (core->iris_platform_data->firmware_desc_gen2)
core->iris_firmware_desc = core->iris_platform_data->firmware_desc_gen2;
else if (core->iris_platform_data->firmware_desc_gen1)
core->iris_firmware_desc = core->iris_platform_data->firmware_desc_gen1;
else
return ERR_PTR(-EINVAL);

has_both_gens = core->iris_platform_data->firmware_desc_gen2 &&
core->iris_platform_data->firmware_desc_gen1;

ret = of_property_read_string_index(dev_of_node(core->dev), "firmware-name", 0, fw_name);
if (ret) {
*fw_name = core->iris_firmware_desc->fwname;
ret = request_firmware(&firmware, *fw_name, core->dev);
if (ret && has_both_gens) {
core->iris_firmware_desc = core->iris_platform_data->firmware_desc_gen1;
*fw_name = core->iris_firmware_desc->fwname;
ret = request_firmware(&firmware, *fw_name, core->dev);
}

return ret ? ERR_PTR(ret) : firmware;
}

ret = request_firmware(&firmware, *fw_name, core->dev);
if (ret)
return ERR_PTR(ret);

if (has_both_gens &&
!iris_detect_gen2_from_fwdata((const u8 *)firmware->data, firmware->size)) {
dev_info(core->dev, "Gen1 FW detected in %s\n", *fw_name);
core->iris_firmware_desc = core->iris_platform_data->firmware_desc_gen1;
}

return firmware;
}

static int iris_load_fw_to_memory(struct iris_core *core)
{
struct qcom_scm_pas_context *ctx;
const struct firmware *firmware = NULL;
struct device *dev = core->dev;
struct resource res;
phys_addr_t mem_phys;
const char *fw_name;
size_t res_size;
ssize_t fw_size;
int ret;

if (strlen(fw_name) >= MAX_FIRMWARE_NAME_SIZE - 4)
return -EINVAL;

ret = of_reserved_mem_region_to_resource(dev->of_node, 0, &res);
if (ret)
return ret;
Expand All @@ -50,9 +125,11 @@ static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name)

ctx->use_tzmem = core->fw.dev;

ret = request_firmware(&firmware, fw_name, dev);
if (ret)
return ret;
firmware = iris_detect_firmware(core, &fw_name);
if (IS_ERR(firmware))
return PTR_ERR(firmware);

core->iris_firmware_data = core->iris_firmware_desc->firmware_data;

fw_size = qcom_mdt_get_size(firmware);
if (fw_size < 0 || res_size < (size_t)fw_size) {
Expand Down Expand Up @@ -91,18 +168,12 @@ static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name)
int iris_fw_load(struct iris_core *core)
{
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_firmware_desc->fwname;

ret = iris_load_fw_to_memory(core, fwpath);
ret = iris_load_fw_to_memory(core);
if (ret) {
dev_err(core->dev, "firmware download failed\n");
return -ENOMEM;
dev_err(core->dev, "firmware download failed %d\n", ret);
return ret;
}

for (i = 0; i < core->iris_platform_data->tz_cp_config_data_size; i++) {
Expand All @@ -118,7 +189,7 @@ int iris_fw_load(struct iris_core *core)
}
}

return ret;
return 0;
}

int iris_fw_unload(struct iris_core *core)
Expand Down
15 changes: 3 additions & 12 deletions drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

#define UNSPECIFIED_COLOR_FORMAT 5
#define NUM_SYS_INIT_PACKETS 8
#define NUM_COMV_AV1 18

#define SYS_INIT_PKT_SIZE (sizeof(struct iris_hfi_header) + \
NUM_SYS_INIT_PACKETS * (sizeof(struct iris_hfi_packet) + sizeof(u32)))
Expand Down Expand Up @@ -1207,18 +1206,10 @@ static u32 iris_hfi_gen2_buf_type_from_driver(u32 domain, enum iris_buffer_type

static int iris_hfi_gen2_set_num_comv(struct iris_inst *inst)
{
struct platform_inst_caps *caps;
struct iris_core *core = inst->core;
u32 num_comv;

caps = core->iris_platform_data->inst_caps;
u32 num_comv = inst->buffers[BUF_OUTPUT].min_count;

/*
* AV1 needs more comv buffers than other codecs.
* Update accordingly.
*/
num_comv = (inst->codec == V4L2_PIX_FMT_AV1) ?
NUM_COMV_AV1 : caps->num_comv;
if (inst->fw_min_count)
num_comv = inst->fw_min_count;

return iris_hfi_gen2_session_set_property(inst,
HFI_PROP_COMV_BUFFER_COUNT,
Expand Down
18 changes: 11 additions & 7 deletions drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
*/

#include <linux/printk.h>
#include <linux/soc/qcom/ubwc.h>

#include "iris_hfi_common.h"
#include "iris_hfi_gen2.h"
#include "iris_hfi_gen2_packet.h"
Expand Down Expand Up @@ -120,6 +123,7 @@ static void iris_hfi_gen2_create_packet(struct iris_hfi_header *hdr, u32 pkt_typ

void iris_hfi_gen2_packet_sys_init(struct iris_core *core, struct iris_hfi_header *hdr)
{
const struct qcom_ubwc_cfg_data *ubwc = core->ubwc_cfg;
u32 payload = 0;

iris_hfi_gen2_create_header(hdr, 0, core->header_id++);
Expand All @@ -136,7 +140,7 @@ void iris_hfi_gen2_packet_sys_init(struct iris_core *core, struct iris_hfi_heade
&payload,
sizeof(u32));

payload = core->iris_platform_data->ubwc_config->max_channels;
payload = qcom_ubwc_macrotile_mode(ubwc) ? 8 : 4;
iris_hfi_gen2_create_packet(hdr,
HFI_PROP_UBWC_MAX_CHANNELS,
HFI_HOST_FLAGS_NONE,
Expand All @@ -146,7 +150,7 @@ void iris_hfi_gen2_packet_sys_init(struct iris_core *core, struct iris_hfi_heade
&payload,
sizeof(u32));

payload = core->iris_platform_data->ubwc_config->mal_length;
payload = qcom_ubwc_min_acc_length_64b(ubwc) ? 64 : 32;
iris_hfi_gen2_create_packet(hdr,
HFI_PROP_UBWC_MAL_LENGTH,
HFI_HOST_FLAGS_NONE,
Expand All @@ -156,7 +160,7 @@ void iris_hfi_gen2_packet_sys_init(struct iris_core *core, struct iris_hfi_heade
&payload,
sizeof(u32));

payload = core->iris_platform_data->ubwc_config->highest_bank_bit;
payload = ubwc->highest_bank_bit;
iris_hfi_gen2_create_packet(hdr,
HFI_PROP_UBWC_HBB,
HFI_HOST_FLAGS_NONE,
Expand All @@ -166,7 +170,7 @@ void iris_hfi_gen2_packet_sys_init(struct iris_core *core, struct iris_hfi_heade
&payload,
sizeof(u32));

payload = core->iris_platform_data->ubwc_config->bank_swzl_level;
payload = !!(qcom_ubwc_swizzle(ubwc) & UBWC_SWIZZLE_ENABLE_LVL1);
iris_hfi_gen2_create_packet(hdr,
HFI_PROP_UBWC_BANK_SWZL_LEVEL1,
HFI_HOST_FLAGS_NONE,
Expand All @@ -176,7 +180,7 @@ void iris_hfi_gen2_packet_sys_init(struct iris_core *core, struct iris_hfi_heade
&payload,
sizeof(u32));

payload = core->iris_platform_data->ubwc_config->bank_swz2_level;
payload = !!(qcom_ubwc_swizzle(ubwc) & UBWC_SWIZZLE_ENABLE_LVL2);
iris_hfi_gen2_create_packet(hdr,
HFI_PROP_UBWC_BANK_SWZL_LEVEL2,
HFI_HOST_FLAGS_NONE,
Expand All @@ -186,7 +190,7 @@ void iris_hfi_gen2_packet_sys_init(struct iris_core *core, struct iris_hfi_heade
&payload,
sizeof(u32));

payload = core->iris_platform_data->ubwc_config->bank_swz3_level;
payload = !!(qcom_ubwc_swizzle(ubwc) & UBWC_SWIZZLE_ENABLE_LVL3);
iris_hfi_gen2_create_packet(hdr,
HFI_PROP_UBWC_BANK_SWZL_LEVEL3,
HFI_HOST_FLAGS_NONE,
Expand All @@ -196,7 +200,7 @@ void iris_hfi_gen2_packet_sys_init(struct iris_core *core, struct iris_hfi_heade
&payload,
sizeof(u32));

payload = core->iris_platform_data->ubwc_config->bank_spreading;
payload = qcom_ubwc_bank_spread(ubwc);
iris_hfi_gen2_create_packet(hdr,
HFI_PROP_UBWC_BANK_SPREADING,
HFI_HOST_FLAGS_NONE,
Expand Down
20 changes: 2 additions & 18 deletions drivers/media/platform/qcom/iris/iris_platform_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,16 +87,6 @@ struct tz_cp_config {
u32 cp_nonpixel_size;
};

struct ubwc_config_data {
u32 max_channels;
u32 mal_length;
u32 highest_bank_bit;
u32 bank_swzl_level;
u32 bank_swz2_level;
u32 bank_swz3_level;
u32 bank_spreading;
};

struct platform_inst_caps {
u32 min_frame_width;
u32 max_frame_width;
Expand All @@ -107,7 +97,6 @@ struct platform_inst_caps {
u32 mb_cycles_vpp;
u32 mb_cycles_fw;
u32 mb_cycles_fw_vpp;
u32 num_comv;
u32 max_frame_rate;
u32 max_operating_rate;
};
Expand Down Expand Up @@ -284,14 +273,10 @@ struct platform_pd_data {
};

struct iris_platform_data {
/*
* XXX: replace with gen1 / gen2 pointers once we have platforms
* supporting both firmware kinds.
*/
const struct iris_firmware_desc *firmware_desc;
const struct iris_firmware_desc *firmware_desc_gen1, *firmware_desc_gen2;

const struct vpu_ops *vpu_ops;
void (*set_preset_registers)(struct iris_core *core);

int (*init_cb_devs)(struct iris_core *core);
void (*deinit_cb_devs)(struct iris_core *core);
const struct icc_info *icc_tbl;
Expand All @@ -314,7 +299,6 @@ struct iris_platform_data {
struct platform_inst_caps *inst_caps;
const struct tz_cp_config *tz_cp_config_data;
u32 tz_cp_config_data_size;
struct ubwc_config_data *ubwc_config;
u32 num_vpp_pipe;
bool no_aon;
u32 max_session_count;
Expand Down
1 change: 0 additions & 1 deletion drivers/media/platform/qcom/iris/iris_platform_qcs8300.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ static struct platform_inst_caps platform_inst_cap_qcs8300 = {
.mb_cycles_vpp = 200,
.mb_cycles_fw = 326389,
.mb_cycles_fw_vpp = 44156,
.num_comv = 0,
.max_frame_rate = MAXIMUM_FPS,
.max_operating_rate = MAXIMUM_FPS,
};
Expand Down
1 change: 0 additions & 1 deletion drivers/media/platform/qcom/iris/iris_platform_sm8550.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ static struct platform_inst_caps platform_inst_cap_sm8550 = {
.mb_cycles_vpp = 200,
.mb_cycles_fw = 489583,
.mb_cycles_fw_vpp = 66234,
.num_comv = 0,
.max_frame_rate = MAXIMUM_FPS,
.max_operating_rate = MAXIMUM_FPS,
};
Expand Down
Loading