diff options
| author | Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> | 2026-07-31 02:48:22 +0300 |
|---|---|---|
| committer | Bryan O'Donoghue <bod@kernel.org> | 2026-09-29 12:52:03 +0100 |
| commit | 6f4eb91fa27644ed57cbb43fa44ce8eea02bce0c (patch) | |
| tree | 1292ffa84a38cb8782f4d8a0bb916f83966666a5 | |
| parent | fe12ccf5a98fe11f43f2db9dcb45147a11104301 (diff) | |
Revert "media: iris: Add Gen2 firmware autodetect and fallback"
The commit 412a2e5955e0 ("media: iris: Add Gen2 firmware autodetect and
fallback") added support for detecting the firmware HFI interface based
on the firmware contents, but it has issues with the MDT split files and
with synchronisation / locking. Revert the commit, it will be replaced
by the better version.
Fixes: 412a2e5955e0 ("media: iris: Add Gen2 firmware autodetect and fallback")
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Reviewed-by: Vishnu Reddy <busanna.reddy@oss.qualcomm.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
[bod: Fixed merge conflict adding additional v4l2_device_register();]
Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
| -rw-r--r-- | drivers/media/platform/qcom/iris/iris_firmware.c | 119 | ||||
| -rw-r--r-- | drivers/media/platform/qcom/iris/iris_platform_common.h | 6 | ||||
| -rw-r--r-- | drivers/media/platform/qcom/iris/iris_platform_vpu2.c | 13 | ||||
| -rw-r--r-- | drivers/media/platform/qcom/iris/iris_platform_vpu3x.c | 10 | ||||
| -rw-r--r-- | drivers/media/platform/qcom/iris/iris_probe.c | 4 | ||||
| -rw-r--r-- | drivers/media/platform/qcom/iris/iris_vidc.c | 3 |
6 files changed, 34 insertions, 121 deletions
diff --git a/drivers/media/platform/qcom/iris/iris_firmware.c b/drivers/media/platform/qcom/iris/iris_firmware.c index 21cdf1c39835..ea9654dd679e 100644 --- a/drivers/media/platform/qcom/iris/iris_firmware.c +++ b/drivers/media/platform/qcom/iris/iris_firmware.c @@ -17,109 +17,20 @@ #define MAX_FIRMWARE_NAME_SIZE 128 -/* 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) -{ - static const char *marker = "QC_IMAGE_VERSION_STRING="; - const size_t mlen = strlen(marker); - static const char *vfw = "vfw"; - const size_t vfwlen = strlen(vfw); - static const char *vf = "video-firmware."; - const size_t vflen = strlen(vf); - - for (size_t i = 0; i + mlen < size; i++) { - const char *found; - - if (memcmp(data + i, marker, mlen)) - continue; - - found = data + i + mlen; - size -= i + mlen; - - /* vfw => Gen2 */ - if (size > vfwlen && !memcmp(found, vfw, vfwlen)) - return true; - - if (size < vflen || - memcmp(found, vf, vflen)) - return false; - - found += vflen; - size -= vflen; - - /* - * video-firmware.1.x is Gen1. - * video-firmware.2.x and video-firmware.10.x are Gen2. - */ - return size >= 2 && - (*found >= '2' || (*found == '1' && found[1] != '.')); - } - - 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) +static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name) { 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; void *mem_virt; 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; @@ -127,11 +38,9 @@ static int iris_load_fw_to_memory(struct iris_core *core) mem_phys = res.start; res_size = resource_size(&res); - 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; + ret = request_firmware(&firmware, fw_name, dev); + if (ret) + return ret; fw_size = qcom_mdt_get_size(firmware); if (fw_size < 0 || res_size < (size_t)fw_size) { @@ -158,12 +67,18 @@ err_release_fw: int iris_fw_load(struct iris_core *core) { const struct tz_cp_config *cp_config; + const char *fwpath = NULL; int i, ret; - ret = iris_load_fw_to_memory(core); + 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); if (ret) { - dev_err(core->dev, "firmware download failed %d\n", ret); - return ret; + dev_err(core->dev, "firmware download failed\n"); + return -ENOMEM; } ret = qcom_pas_auth_and_reset(IRIS_PAS_ID); @@ -185,7 +100,7 @@ int iris_fw_load(struct iris_core *core) } } - return 0; + return ret; } int iris_fw_unload(struct iris_core *core) diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h index 974809509146..a9453d539fc2 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_common.h +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h @@ -292,7 +292,11 @@ struct iris_firmware_desc { }; struct iris_platform_data { - const struct iris_firmware_desc *firmware_desc_gen1, *firmware_desc_gen2; + /* + * XXX: replace with gen1 / gen2 pointers once we have platforms + * supporting both firmware kinds. + */ + const struct iris_firmware_desc *firmware_desc; const struct vpu_ops *vpu_ops; const struct icc_info *icc_tbl; diff --git a/drivers/media/platform/qcom/iris/iris_platform_vpu2.c b/drivers/media/platform/qcom/iris/iris_platform_vpu2.c index bbdbf21961d7..cfff647cf440 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_vpu2.c +++ b/drivers/media/platform/qcom/iris/iris_platform_vpu2.c @@ -29,12 +29,6 @@ static const struct iris_firmware_desc iris_vpu20_p1_gen1_desc = { .fwname = "qcom/vpu/vpu20_p1.mbn", }; -static const struct iris_firmware_desc iris_vpu20_p1_gen2_s6_desc = { - .firmware_data = &iris_hfi_gen2_data, - .get_vpu_buffer_size = iris_vpu33_buf_size, - .fwname = "qcom/vpu/vpu20_p1_gen2_s6.mbn", -}; - static const struct iris_firmware_desc iris_vpu20_p4_gen1_desc = { .firmware_data = &iris_hfi_gen1_data, .get_vpu_buffer_size = iris_vpu_buf_size, @@ -78,7 +72,7 @@ static const struct tz_cp_config tz_cp_config_vpu2[] = { }; const struct iris_platform_data milos_data = { - .firmware_desc_gen1 = &iris_milos_desc, + .firmware_desc = &iris_milos_desc, .vpu_ops = &iris_vpu2_ops, .icc_tbl = iris_icc_info_milos, .icc_tbl_size = ARRAY_SIZE(iris_icc_info_milos), @@ -106,8 +100,7 @@ const struct iris_platform_data milos_data = { }; const struct iris_platform_data sc7280_data = { - .firmware_desc_gen1 = &iris_vpu20_p1_gen1_desc, - .firmware_desc_gen2 = &iris_vpu20_p1_gen2_s6_desc, + .firmware_desc = &iris_vpu20_p1_gen1_desc, .vpu_ops = &iris_vpu2_ops, .icc_tbl = iris_icc_info_vpu2, .icc_tbl_size = ARRAY_SIZE(iris_icc_info_vpu2), @@ -136,7 +129,7 @@ const struct iris_platform_data sc7280_data = { }; const struct iris_platform_data sm8250_data = { - .firmware_desc_gen1 = &iris_vpu20_p4_gen1_desc, + .firmware_desc = &iris_vpu20_p4_gen1_desc, .vpu_ops = &iris_vpu2_ops, .icc_tbl = iris_icc_info_vpu2, .icc_tbl_size = ARRAY_SIZE(iris_icc_info_vpu2), diff --git a/drivers/media/platform/qcom/iris/iris_platform_vpu3x.c b/drivers/media/platform/qcom/iris/iris_platform_vpu3x.c index 74626b35d9cb..2c63adbc5579 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_vpu3x.c +++ b/drivers/media/platform/qcom/iris/iris_platform_vpu3x.c @@ -90,7 +90,7 @@ static const struct tz_cp_config tz_cp_config_vpu3[] = { * - inst_caps to platform_inst_cap_qcs8300 */ const struct iris_platform_data qcs8300_data = { - .firmware_desc_gen2 = &iris_vpu30_p4_s6_gen2_desc, + .firmware_desc = &iris_vpu30_p4_s6_gen2_desc, .vpu_ops = &iris_vpu3_ops, .icc_tbl = iris_icc_info_vpu3x, .icc_tbl_size = ARRAY_SIZE(iris_icc_info_vpu3x), @@ -119,7 +119,7 @@ const struct iris_platform_data qcs8300_data = { }; const struct iris_platform_data sm8550_data = { - .firmware_desc_gen2 = &iris_vpu30_p4_gen2_desc, + .firmware_desc = &iris_vpu30_p4_gen2_desc, .vpu_ops = &iris_vpu3_ops, .icc_tbl = iris_icc_info_vpu3x, .icc_tbl_size = ARRAY_SIZE(iris_icc_info_vpu3x), @@ -154,7 +154,7 @@ const struct iris_platform_data sm8550_data = { * - controller_rst_tbl to sm8650_controller_reset_table */ const struct iris_platform_data sm8650_data = { - .firmware_desc_gen2 = &iris_vpu33_p4_gen2_desc, + .firmware_desc = &iris_vpu33_p4_gen2_desc, .vpu_ops = &iris_vpu33_ops, .icc_tbl = iris_icc_info_vpu3x, .icc_tbl_size = ARRAY_SIZE(iris_icc_info_vpu3x), @@ -185,7 +185,7 @@ const struct iris_platform_data sm8650_data = { }; const struct iris_platform_data sm8750_data = { - .firmware_desc_gen2 = &iris_vpu35_p4_gen2_desc, + .firmware_desc = &iris_vpu35_p4_gen2_desc, .vpu_ops = &iris_vpu35_ops, .icc_tbl = iris_icc_info_vpu3x, .icc_tbl_size = ARRAY_SIZE(iris_icc_info_vpu3x), @@ -220,7 +220,7 @@ const struct iris_platform_data sm8750_data = { * - different num_vpp_pipe */ const struct iris_platform_data x1p42100_data = { - .firmware_desc_gen2 = &iris_vpu30_p1_gen2_desc, + .firmware_desc = &iris_vpu30_p1_gen2_desc, .vpu_ops = &iris_vpu3_ops, .icc_tbl = iris_icc_info_vpu3x, .icc_tbl_size = ARRAY_SIZE(iris_icc_info_vpu3x), diff --git a/drivers/media/platform/qcom/iris/iris_probe.c b/drivers/media/platform/qcom/iris/iris_probe.c index c4b8b4be339d..5e5d77736d5f 100644 --- a/drivers/media/platform/qcom/iris/iris_probe.c +++ b/drivers/media/platform/qcom/iris/iris_probe.c @@ -306,6 +306,8 @@ static int iris_probe(struct platform_device *pdev) return core->irq; core->iris_platform_data = of_device_get_match_data(core->dev); + core->iris_firmware_desc = core->iris_platform_data->firmware_desc; + core->iris_firmware_data = core->iris_firmware_desc->firmware_data; core->ubwc_cfg = qcom_ubwc_config_get_data(); if (IS_ERR(core->ubwc_cfg)) @@ -329,6 +331,8 @@ 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) goto err_unresv_iova_region; diff --git a/drivers/media/platform/qcom/iris/iris_vidc.c b/drivers/media/platform/qcom/iris/iris_vidc.c index f1d7f186002d..2dff38053532 100644 --- a/drivers/media/platform/qcom/iris/iris_vidc.c +++ b/drivers/media/platform/qcom/iris/iris_vidc.c @@ -9,7 +9,6 @@ #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" @@ -197,8 +196,6 @@ 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) |
