* [PATCH v9 3/8] media: venus: Add framework support for AR50_LITE video core
2025-08-08 8:49 Jorge Ramirez-Ortiz
@ 2025-08-08 8:49 ` Jorge Ramirez-Ortiz
0 siblings, 0 replies; 23+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-08-08 8:49 UTC (permalink / raw)
To: jorge.ramirez, quic_vgarodia, quic_dikshita, bryan.odonoghue,
krzk+dt, konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, devicetree, linux-kernel
The AR50_LITE is a simplified variant of the AR50 video core, designed for
power and cost-efficient platforms.
It supports hardware-accelerated decoding of H.264, HEVC, and VP9 formats,
and provides encoding support for H.264 and HEVC.
This commit prepares the framework to enable the AR50_LITE (it does not
enable it).
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
---
drivers/media/platform/qcom/venus/core.c | 15 ++++++--
drivers/media/platform/qcom/venus/core.h | 5 +++
drivers/media/platform/qcom/venus/firmware.c | 10 ++++++
drivers/media/platform/qcom/venus/firmware.h | 1 +
drivers/media/platform/qcom/venus/helpers.c | 12 +++++--
.../media/platform/qcom/venus/hfi_parser.c | 2 +-
.../media/platform/qcom/venus/hfi_platform.c | 23 ++++++++-----
.../media/platform/qcom/venus/hfi_platform.h | 34 ++++++++++++-------
.../platform/qcom/venus/hfi_platform_v4.c | 33 +++++++++++++-----
.../platform/qcom/venus/hfi_platform_v6.c | 33 +++++++++++++-----
drivers/media/platform/qcom/venus/hfi_venus.c | 25 ++++++++++----
.../media/platform/qcom/venus/hfi_venus_io.h | 4 +++
.../media/platform/qcom/venus/pm_helpers.c | 2 +-
13 files changed, 145 insertions(+), 54 deletions(-)
diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
index f45715c9b222..adc38fbc9d79 100644
--- a/drivers/media/platform/qcom/venus/core.c
+++ b/drivers/media/platform/qcom/venus/core.c
@@ -254,14 +254,19 @@ static int venus_enumerate_codecs(struct venus_core *core, u32 type)
static void venus_assign_register_offsets(struct venus_core *core)
{
- if (IS_IRIS2(core) || IS_IRIS2_1(core)) {
- core->vbif_base = core->base + VBIF_BASE;
+ if (IS_IRIS2(core) || IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
core->cpu_base = core->base + CPU_BASE_V6;
core->cpu_cs_base = core->base + CPU_CS_BASE_V6;
core->cpu_ic_base = core->base + CPU_IC_BASE_V6;
core->wrapper_base = core->base + WRAPPER_BASE_V6;
core->wrapper_tz_base = core->base + WRAPPER_TZ_BASE_V6;
- core->aon_base = core->base + AON_BASE_V6;
+ if (IS_AR50_LITE(core)) {
+ core->vbif_base = NULL;
+ core->aon_base = NULL;
+ } else {
+ core->vbif_base = core->base + VBIF_BASE;
+ core->aon_base = core->base + AON_BASE_V6;
+ }
} else {
core->vbif_base = core->base + VBIF_BASE;
core->cpu_base = core->base + CPU_BASE;
@@ -456,6 +461,10 @@ static int venus_probe(struct platform_device *pdev)
if (ret)
goto err_firmware_deinit;
+ ret = venus_firmware_cfg(core);
+ if (ret)
+ goto err_venus_shutdown;
+
ret = hfi_core_resume(core, true);
if (ret)
goto err_venus_shutdown;
diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
index d1f0e9979ba4..ef80a7666597 100644
--- a/drivers/media/platform/qcom/venus/core.h
+++ b/drivers/media/platform/qcom/venus/core.h
@@ -533,6 +533,11 @@ struct venus_inst {
#define IS_IRIS2(core) ((core)->res->vpu_version == VPU_VERSION_IRIS2)
#define IS_IRIS2_1(core) ((core)->res->vpu_version == VPU_VERSION_IRIS2_1)
+static inline bool is_lite(struct venus_core *core)
+{
+ return IS_AR50_LITE(core);
+}
+
#define ctrl_to_inst(ctrl) \
container_of((ctrl)->handler, struct venus_inst, ctrl_handler)
diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
index 3666675ae298..2483998360f7 100644
--- a/drivers/media/platform/qcom/venus/firmware.c
+++ b/drivers/media/platform/qcom/venus/firmware.c
@@ -207,6 +207,16 @@ static int venus_shutdown_no_tz(struct venus_core *core)
return 0;
}
+int venus_firmware_cfg(struct venus_core *core)
+{
+ void __iomem *cpu_cs_base = core->cpu_cs_base;
+
+ if (IS_AR50_LITE(core))
+ writel(CPU_CS_VCICMD_ARP_OFF, cpu_cs_base + CPU_CS_VCICMD);
+
+ return 0;
+}
+
int venus_boot(struct venus_core *core)
{
struct device *dev = core->dev;
diff --git a/drivers/media/platform/qcom/venus/firmware.h b/drivers/media/platform/qcom/venus/firmware.h
index ead39e3797f0..87e1d922b369 100644
--- a/drivers/media/platform/qcom/venus/firmware.h
+++ b/drivers/media/platform/qcom/venus/firmware.h
@@ -10,6 +10,7 @@ struct device;
int venus_firmware_init(struct venus_core *core);
void venus_firmware_deinit(struct venus_core *core);
int venus_firmware_check(struct venus_core *core);
+int venus_firmware_cfg(struct venus_core *core);
int venus_boot(struct venus_core *core);
int venus_shutdown(struct venus_core *core);
int venus_set_hw_state(struct venus_core *core, bool suspend);
diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c
index 8295542e1a7c..2e4363f82231 100644
--- a/drivers/media/platform/qcom/venus/helpers.c
+++ b/drivers/media/platform/qcom/venus/helpers.c
@@ -1715,11 +1715,17 @@ int venus_helper_session_init(struct venus_inst *inst)
if (ret)
return ret;
- inst->clk_data.vpp_freq = hfi_platform_get_codec_vpp_freq(version, codec,
+ inst->clk_data.vpp_freq = hfi_platform_get_codec_vpp_freq(inst->core,
+ version,
+ codec,
session_type);
- inst->clk_data.vsp_freq = hfi_platform_get_codec_vsp_freq(version, codec,
+ inst->clk_data.vsp_freq = hfi_platform_get_codec_vsp_freq(inst->core,
+ version,
+ codec,
session_type);
- inst->clk_data.low_power_freq = hfi_platform_get_codec_lp_freq(version, codec,
+ inst->clk_data.low_power_freq = hfi_platform_get_codec_lp_freq(inst->core,
+ version,
+ codec,
session_type);
return 0;
diff --git a/drivers/media/platform/qcom/venus/hfi_parser.c b/drivers/media/platform/qcom/venus/hfi_parser.c
index 1b3db2caa99f..92765f9c8873 100644
--- a/drivers/media/platform/qcom/venus/hfi_parser.c
+++ b/drivers/media/platform/qcom/venus/hfi_parser.c
@@ -282,7 +282,7 @@ static int hfi_platform_parser(struct venus_core *core, struct venus_inst *inst)
return ret;
if (plat->capabilities)
- caps = plat->capabilities(&entries);
+ caps = plat->capabilities(core, &entries);
if (!caps || !entries || !count)
return -EINVAL;
diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
index 643e5aa138f5..cde7f93045ac 100644
--- a/drivers/media/platform/qcom/venus/hfi_platform.c
+++ b/drivers/media/platform/qcom/venus/hfi_platform.c
@@ -21,7 +21,9 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
}
unsigned long
-hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec, u32 session_type)
+hfi_platform_get_codec_vpp_freq(struct venus_core *core,
+ enum hfi_version version, u32 codec,
+ u32 session_type)
{
const struct hfi_platform *plat;
unsigned long freq = 0;
@@ -31,13 +33,15 @@ hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec, u32 session
return 0;
if (plat->codec_vpp_freq)
- freq = plat->codec_vpp_freq(session_type, codec);
+ freq = plat->codec_vpp_freq(core, session_type, codec);
return freq;
}
unsigned long
-hfi_platform_get_codec_vsp_freq(enum hfi_version version, u32 codec, u32 session_type)
+hfi_platform_get_codec_vsp_freq(struct venus_core *core,
+ enum hfi_version version, u32 codec,
+ u32 session_type)
{
const struct hfi_platform *plat;
unsigned long freq = 0;
@@ -47,13 +51,15 @@ hfi_platform_get_codec_vsp_freq(enum hfi_version version, u32 codec, u32 session
return 0;
if (plat->codec_vpp_freq)
- freq = plat->codec_vsp_freq(session_type, codec);
+ freq = plat->codec_vsp_freq(core, session_type, codec);
return freq;
}
unsigned long
-hfi_platform_get_codec_lp_freq(enum hfi_version version, u32 codec, u32 session_type)
+hfi_platform_get_codec_lp_freq(struct venus_core *core,
+ enum hfi_version version, u32 codec,
+ u32 session_type)
{
const struct hfi_platform *plat;
unsigned long freq = 0;
@@ -63,13 +69,14 @@ hfi_platform_get_codec_lp_freq(enum hfi_version version, u32 codec, u32 session_
return 0;
if (plat->codec_lp_freq)
- freq = plat->codec_lp_freq(session_type, codec);
+ freq = plat->codec_lp_freq(core, session_type, codec);
return freq;
}
int
-hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs, u32 *dec_codecs, u32 *count)
+hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs,
+ u32 *dec_codecs, u32 *count)
{
const struct hfi_platform *plat;
@@ -78,7 +85,7 @@ hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs, u32 *dec_codec
return -EINVAL;
if (plat->codecs)
- plat->codecs(enc_codecs, dec_codecs, count);
+ plat->codecs(core, enc_codecs, dec_codecs, count);
if (IS_IRIS2_1(core)) {
*enc_codecs &= ~HFI_VIDEO_CODEC_VP8;
diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
index ec89a90a8129..5e4f8013a6b1 100644
--- a/drivers/media/platform/qcom/venus/hfi_platform.h
+++ b/drivers/media/platform/qcom/venus/hfi_platform.h
@@ -47,11 +47,16 @@ struct hfi_platform_codec_freq_data {
};
struct hfi_platform {
- unsigned long (*codec_vpp_freq)(u32 session_type, u32 codec);
- unsigned long (*codec_vsp_freq)(u32 session_type, u32 codec);
- unsigned long (*codec_lp_freq)(u32 session_type, u32 codec);
- void (*codecs)(u32 *enc_codecs, u32 *dec_codecs, u32 *count);
- const struct hfi_plat_caps *(*capabilities)(unsigned int *entries);
+ unsigned long (*codec_vpp_freq)(struct venus_core *core,
+ u32 session_type, u32 codec);
+ unsigned long (*codec_vsp_freq)(struct venus_core *core,
+ u32 session_type, u32 codec);
+ unsigned long (*codec_lp_freq)(struct venus_core *core,
+ u32 session_type, u32 codec);
+ void (*codecs)(struct venus_core *core, u32 *enc_codecs,
+ u32 *dec_codecs, u32 *count);
+ const struct hfi_plat_caps *(*capabilities)(struct venus_core *core,
+ unsigned int *entries);
int (*bufreq)(struct hfi_plat_buffers_params *params, u32 session_type,
u32 buftype, struct hfi_buffer_requirements *bufreq);
};
@@ -60,12 +65,15 @@ extern const struct hfi_platform hfi_plat_v4;
extern const struct hfi_platform hfi_plat_v6;
const struct hfi_platform *hfi_platform_get(enum hfi_version version);
-unsigned long hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec,
- u32 session_type);
-unsigned long hfi_platform_get_codec_vsp_freq(enum hfi_version version, u32 codec,
- u32 session_type);
-unsigned long hfi_platform_get_codec_lp_freq(enum hfi_version version, u32 codec,
- u32 session_type);
-int hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs, u32 *dec_codecs,
- u32 *count);
+unsigned long hfi_platform_get_codec_vpp_freq(struct venus_core *core,
+ enum hfi_version version,
+ u32 codec, u32 session_type);
+unsigned long hfi_platform_get_codec_vsp_freq(struct venus_core *core,
+ enum hfi_version version,
+ u32 codec, u32 session_type);
+unsigned long hfi_platform_get_codec_lp_freq(struct venus_core *core,
+ enum hfi_version version,
+ u32 codec, u32 session_type);
+int hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs,
+ u32 *dec_codecs, u32 *count);
#endif
diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v4.c b/drivers/media/platform/qcom/venus/hfi_platform_v4.c
index e3f0a90a567b..41e4dc28ec1b 100644
--- a/drivers/media/platform/qcom/venus/hfi_platform_v4.c
+++ b/drivers/media/platform/qcom/venus/hfi_platform_v4.c
@@ -2,6 +2,7 @@
/*
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
*/
+#include "core.h"
#include "hfi_platform.h"
static const struct hfi_plat_caps caps[] = {
@@ -245,14 +246,22 @@ static const struct hfi_plat_caps caps[] = {
.num_fmts = 4,
} };
-static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
+static const struct hfi_plat_caps *get_capabilities(struct venus_core *core,
+ unsigned int *entries)
{
+ if (is_lite(core))
+ return NULL;
+
*entries = ARRAY_SIZE(caps);
return caps;
}
-static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
+static void get_codecs(struct venus_core *core,
+ u32 *enc_codecs, u32 *dec_codecs, u32 *count)
{
+ if (is_lite(core))
+ return;
+
*enc_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
HFI_VIDEO_CODEC_VP8;
*dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
@@ -273,12 +282,15 @@ static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
};
static const struct hfi_platform_codec_freq_data *
-get_codec_freq_data(u32 session_type, u32 pixfmt)
+get_codec_freq_data(struct venus_core *core, u32 session_type, u32 pixfmt)
{
const struct hfi_platform_codec_freq_data *data = codec_freq_data;
unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
const struct hfi_platform_codec_freq_data *found = NULL;
+ if (is_lite(core))
+ return NULL;
+
for (i = 0; i < data_size; i++) {
if (data[i].pixfmt == pixfmt && data[i].session_type == session_type) {
found = &data[i];
@@ -289,33 +301,36 @@ get_codec_freq_data(u32 session_type, u32 pixfmt)
return found;
}
-static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
+static unsigned long codec_vpp_freq(struct venus_core *core,
+ u32 session_type, u32 codec)
{
const struct hfi_platform_codec_freq_data *data;
- data = get_codec_freq_data(session_type, codec);
+ data = get_codec_freq_data(core, session_type, codec);
if (data)
return data->vpp_freq;
return 0;
}
-static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
+static unsigned long codec_vsp_freq(struct venus_core *core,
+ u32 session_type, u32 codec)
{
const struct hfi_platform_codec_freq_data *data;
- data = get_codec_freq_data(session_type, codec);
+ data = get_codec_freq_data(core, session_type, codec);
if (data)
return data->vsp_freq;
return 0;
}
-static unsigned long codec_lp_freq(u32 session_type, u32 codec)
+static unsigned long codec_lp_freq(struct venus_core *core,
+ u32 session_type, u32 codec)
{
const struct hfi_platform_codec_freq_data *data;
- data = get_codec_freq_data(session_type, codec);
+ data = get_codec_freq_data(core, session_type, codec);
if (data)
return data->low_power_freq;
diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6.c b/drivers/media/platform/qcom/venus/hfi_platform_v6.c
index 4e8af645f8b9..d8568c08cc36 100644
--- a/drivers/media/platform/qcom/venus/hfi_platform_v6.c
+++ b/drivers/media/platform/qcom/venus/hfi_platform_v6.c
@@ -2,6 +2,7 @@
/*
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
*/
+#include "core.h"
#include "hfi_platform.h"
static const struct hfi_plat_caps caps[] = {
@@ -245,14 +246,22 @@ static const struct hfi_plat_caps caps[] = {
.num_fmts = 4,
} };
-static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
+static const struct hfi_plat_caps *get_capabilities(struct venus_core *core,
+ unsigned int *entries)
{
+ if (is_lite(core))
+ return NULL;
+
*entries = ARRAY_SIZE(caps);
return caps;
}
-static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
+static void get_codecs(struct venus_core *core, u32 *enc_codecs,
+ u32 *dec_codecs, u32 *count)
{
+ if (is_lite(core))
+ return;
+
*enc_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
HFI_VIDEO_CODEC_VP8;
*dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
@@ -273,12 +282,15 @@ static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
};
static const struct hfi_platform_codec_freq_data *
-get_codec_freq_data(u32 session_type, u32 pixfmt)
+get_codec_freq_data(struct venus_core *core, u32 session_type, u32 pixfmt)
{
const struct hfi_platform_codec_freq_data *data = codec_freq_data;
unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
const struct hfi_platform_codec_freq_data *found = NULL;
+ if (is_lite(core))
+ return NULL;
+
for (i = 0; i < data_size; i++) {
if (data[i].pixfmt == pixfmt && data[i].session_type == session_type) {
found = &data[i];
@@ -289,33 +301,36 @@ get_codec_freq_data(u32 session_type, u32 pixfmt)
return found;
}
-static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
+static unsigned long codec_vpp_freq(struct venus_core *core, u32 session_type,
+ u32 codec)
{
const struct hfi_platform_codec_freq_data *data;
- data = get_codec_freq_data(session_type, codec);
+ data = get_codec_freq_data(core, session_type, codec);
if (data)
return data->vpp_freq;
return 0;
}
-static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
+static unsigned long codec_vsp_freq(struct venus_core *core, u32 session_type,
+ u32 codec)
{
const struct hfi_platform_codec_freq_data *data;
- data = get_codec_freq_data(session_type, codec);
+ data = get_codec_freq_data(core, session_type, codec);
if (data)
return data->vsp_freq;
return 0;
}
-static unsigned long codec_lp_freq(u32 session_type, u32 codec)
+static unsigned long codec_lp_freq(struct venus_core *core, u32 session_type,
+ u32 codec)
{
const struct hfi_platform_codec_freq_data *data;
- data = get_codec_freq_data(session_type, codec);
+ data = get_codec_freq_data(core, session_type, codec);
if (data)
return data->low_power_freq;
diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c
index cec7f5964d3d..d3da35f67fd5 100644
--- a/drivers/media/platform/qcom/venus/hfi_venus.c
+++ b/drivers/media/platform/qcom/venus/hfi_venus.c
@@ -380,7 +380,7 @@ static void venus_soft_int(struct venus_hfi_device *hdev)
void __iomem *cpu_ic_base = hdev->core->cpu_ic_base;
u32 clear_bit;
- if (IS_V6(hdev->core))
+ if (IS_V6(hdev->core) || (IS_V4(hdev->core) && is_lite(hdev->core)))
clear_bit = BIT(CPU_IC_SOFTINT_H2A_SHIFT_V6);
else
clear_bit = BIT(CPU_IC_SOFTINT_H2A_SHIFT);
@@ -501,9 +501,11 @@ static int venus_boot_core(struct venus_hfi_device *hdev)
if (count >= max_tries)
ret = -ETIMEDOUT;
- if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core)) {
+ if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core) || IS_AR50_LITE(hdev->core)) {
writel(0x1, cpu_cs_base + CPU_CS_H2XSOFTINTEN_V6);
- writel(0x0, cpu_cs_base + CPU_CS_X2RPMH_V6);
+
+ if (!IS_AR50_LITE(hdev->core))
+ writel(0x0, cpu_cs_base + CPU_CS_X2RPMH_V6);
}
return ret;
@@ -569,6 +571,9 @@ static int venus_halt_axi(struct venus_hfi_device *hdev)
u32 mask_val;
int ret;
+ if (IS_AR50_LITE(hdev->core))
+ return 0;
+
if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core)) {
writel(0x3, cpu_cs_base + CPU_CS_X2RPMH_V6);
@@ -1138,7 +1143,13 @@ static irqreturn_t venus_isr(struct venus_core *core)
wrapper_base = hdev->core->wrapper_base;
status = readl(wrapper_base + WRAPPER_INTR_STATUS);
- if (IS_IRIS2(core) || IS_IRIS2_1(core)) {
+
+ if (IS_AR50_LITE(core)) {
+ if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
+ status & WRAPPER_INTR_STATUS_A2HWD_MASK_V4_LITE ||
+ status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
+ hdev->irq_status = status;
+ } else if (IS_IRIS2(core) || IS_IRIS2_1(core)) {
if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
status & WRAPPER_INTR_STATUS_A2HWD_MASK_V6 ||
status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
@@ -1150,7 +1161,7 @@ static irqreturn_t venus_isr(struct venus_core *core)
hdev->irq_status = status;
}
writel(1, cpu_cs_base + CPU_CS_A2HSOFTINTCLR);
- if (!(IS_IRIS2(core) || IS_IRIS2_1(core)))
+ if (!(IS_IRIS2(core) || IS_IRIS2_1(core) || IS_AR50_LITE(core)))
writel(status, wrapper_base + WRAPPER_INTR_CLEAR);
return IRQ_WAKE_THREAD;
@@ -1535,7 +1546,7 @@ static bool venus_cpu_and_video_core_idle(struct venus_hfi_device *hdev)
void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
u32 ctrl_status, cpu_status;
- if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core))
+ if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core) || IS_AR50_LITE(hdev->core))
cpu_status = readl(wrapper_tz_base + WRAPPER_TZ_CPU_STATUS_V6);
else
cpu_status = readl(wrapper_base + WRAPPER_CPU_STATUS);
@@ -1555,7 +1566,7 @@ static bool venus_cpu_idle_and_pc_ready(struct venus_hfi_device *hdev)
void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
u32 ctrl_status, cpu_status;
- if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core))
+ if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core) || IS_AR50_LITE(hdev->core))
cpu_status = readl(wrapper_tz_base + WRAPPER_TZ_CPU_STATUS_V6);
else
cpu_status = readl(wrapper_base + WRAPPER_CPU_STATUS);
diff --git a/drivers/media/platform/qcom/venus/hfi_venus_io.h b/drivers/media/platform/qcom/venus/hfi_venus_io.h
index 9735a246ce36..f2c3064c44ae 100644
--- a/drivers/media/platform/qcom/venus/hfi_venus_io.h
+++ b/drivers/media/platform/qcom/venus/hfi_venus_io.h
@@ -51,6 +51,9 @@
/* Venus cpu */
#define CPU_CS_SCIACMDARG3 0x58
+#define CPU_CS_VCICMD 0x20
+#define CPU_CS_VCICMD_ARP_OFF BIT(0)
+
#define SFR_ADDR 0x5c
#define MMAP_ADDR 0x60
#define UC_REGION_ADDR 0x64
@@ -100,6 +103,7 @@
#define WRAPPER_INTR_MASK_A2HCPU_MASK 0x4
#define WRAPPER_INTR_MASK_A2HCPU_SHIFT 0x2
+#define WRAPPER_INTR_STATUS_A2HWD_MASK_V4_LITE 0x10
#define WRAPPER_INTR_STATUS_A2HWD_MASK_V6 0x8
#define WRAPPER_INTR_MASK_A2HWD_BASK_V6 0x8
diff --git a/drivers/media/platform/qcom/venus/pm_helpers.c b/drivers/media/platform/qcom/venus/pm_helpers.c
index 8dd5a9b0d060..e09b0d9ae610 100644
--- a/drivers/media/platform/qcom/venus/pm_helpers.c
+++ b/drivers/media/platform/qcom/venus/pm_helpers.c
@@ -51,7 +51,7 @@ static int core_clks_enable(struct venus_core *core)
dev_pm_opp_put(opp);
for (i = 0; i < res->clks_num; i++) {
- if (IS_V6(core)) {
+ if (IS_V6(core) || (IS_V4(core) && is_lite(core))) {
ret = clk_set_rate(core->clks[i], freq);
if (ret)
goto err;
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core
@ 2025-08-08 8:52 Jorge Ramirez-Ortiz
2025-08-08 8:52 ` [PATCH v9 1/8] media: dt-bindings: venus: Add qcm2290 dt schema Jorge Ramirez-Ortiz
` (8 more replies)
0 siblings, 9 replies; 23+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-08-08 8:52 UTC (permalink / raw)
To: jorge.ramirez, quic_vgarodia, quic_dikshita, bryan.odonoghue,
krzk+dt, konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
Changes since v8:
v8: https://lore.kernel.org/all/20250805064430.782201-1-jorge.ramirez@oss.qualcomm.com/
- patch 1/8: Add qcm2290 dt schema
- no change
- patch 2/8: media: venus: Define minimum valid firmware version
- dev_err on failure
- patch 3/8: Add framework to support for AR50 LITE video core
- pass core rather than the lite property to the hfi platform
- remove warnings
- patch 4/8: HFI platform V4 capabilities
-no change
- patch 5/8: Sort dt_match alphabetically
- new
- patch 6/8: Add DT compatible and capabilities
- sort dt_match alphabetically
- patch 7/8: Add Venus video node for 2290
- Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
- patch 8/8: Enable Venus on 2210 RB1 board
- Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Changes since v7:
v7: https://lore.kernel.org/all/20250715204749.2189875-1-jorge.ramirez@oss.qualcomm.com/
- patch 1/7: Add qcm2290 dt schema
- extend commit message to cover IOMMU order, remove iommus minItems, alphabetic order for includes
- added myself as the file maintainer
- patch 2/7: media: venus: Define minimum valid firmware version
- Replaces previous patch that was able to distinguish encoder vs decoder firmware version support
- Now it is an all or nothing implementation (the firmware either support enc and dec or it doesn't)
- patch 3/7: Add Support for AR50 LITE video core
- remove EOS support for older firmwares since we will drop support for fw < 6.0.55
- patch 4/7: HFI platform V4 capabilities
- remove some hardcoded values and some ternary operations
- added reviewed by Bryan O'Donoghue <bryan.odonoghue@linaro.org>
- patch 5/7: Add DT compatible and capabilities
- only min_fw now required since we dont support encode/decode indepedently after 2/7
- added reviewed by Dikshita Agarwal <quic_dikshita@quicinc.com>
- patch 6/7: Add Venus video node for 2290
- no change
- patch 7/7: Enable Venus on 2210 RB1 board
- fix alphabetical order
Changes since v6:
v6: https://lore.kernel.org/all/20250708180530.1384330-1-jorge.ramirez@oss.qualcomm.com/
- patch 1/7: Add qcm2290 dt schema
- no change
- patch 2/7: Conditionally register video nodes
- fixed potential NULL dereference on handling firmware errors when the encoder is not present.
- patch 3/7: Add Support for AR50 LITE video core
- applied Dikshita Agarwal review comments: do not handle no-tz case, fix WD mask
- replaced EOS buffers for a work around (firmware should not access the eos buffers)
renamed venus_helper_alloc_eos_buf to venus_helper_prepare_eos_data
- patch 4/7: HFI platform V4 capabilities
- removed 10 bit encoder support as per Dikshita Agarwal review
- patch 5/7: Add DT compatible and capabilities
- removed frequency table as per Konrad Dybcio review (driver now uses opp)
- fixed bw_tables for the supported loads (remove 10 bit support)
- patch 6/7: Add Venus video node for 2290
- no change
- patch 7/7: Enable Venus on 2210 RB1 board
- no change
Changes since v5:
Two additional new patches added to the set to support video encoding.
- patch 1/7: Add qcm2290 dt schema
- added reviewed by: Bryan O'Donoghue
- added reviewed by: Krzysztof Kozlowski
- patch 2/7: Conditionally register video nodes
- new functionality required to support AR50_LITE
- patch 3/7: Add Support for AR50 LITE video core
- completely rewritten - lite platforms are extensions of previous HFI_XXX
- patch 4/7: HFI platform V4 capabilities
- use HFI 4XX instead of HFI 6XX as per review
- patch 5/7: Add DT compatible and capabilities
- added reviewed by: Bryan O'Donoghue
- enabled new option min_fw_version
- patch 6/7: Add Venus video node for 2290
- added reviewed by: Konrad Dybcio
- removed status property
- patch 7/7: Enable Venus on 2210 RB1 board
- new
Changes since v4:
- patch 1/5:
- added reviewed by: Krzysztof Kozlowski
- updated example section
- patch 2/5:
- added reviewed by: Bryan O'Donoghue
- Fixed Co-developed-by order
- patch 3/5:
- patch 4/5:
- removed encode-node (userspace exposure)
- fixed Co-developed-by order
- patch 5/5:
- fixed venus register region
- power-domain-names: one per line
- clock-names: one per line
- fixed interconnect tags
- empty line before subnode
- enable the venus node
Changes since v3:
- Fixed schema commit subject.
Changes since v2:
- Removed IS_HFI/IS_VPU macros
- checkpatch.pl --strict fixes:
- convert macro to static inline to avoid argument reuse side effect
Changes since v1:
- Added IS_HFI macro usage
- Moved schema patch to top
- Fixed commit messages
This patch series adds support for the Venus video decoder/encoder block
present on the Qualcomm QCM2290.
This series functionally depends on the following patch:
clk: qcom: gcc-qcm2290: Set HW_CTRL_TRIGGER for video GDSC
https://lore.kernel.org/all/20250613102245.782511-1-loic.poulain@oss.qualcomm.com/
Please ensure the above patch is applied before this series.
The QCM2290 integrates an AR50_LITE core, a low-power implementation of
Venus supporting H.264, HEVC (H.265), and VP9 decoding as well as H.264
and H.265 encoding.
The series includes:
- DT binding schema for qcom,qcm2290-venus
- SoC integration via qcm2290.dtsi
- Resource table definitions and frequency scaling
- Platform capability registration for the AR50_LITE core decoding block.
Limitations:
- The hardware does not support concurrent operation at FullHD.
- Encoding is not supported in firmware version before 6.0.54
Firmware:
- This code has been tested with 6.0.52, 6.0.53, 6.0.54-PRERELEASE
Some basic Tests:
Decoding and Encoding were verified on the QCOM RB1 platform using
GStreamer with V4L2-based decode plugins.
The following pipelines were used for playback 1280x720 and 1920x1080
H.264, HEVC and VP9 videos from https://www.elecard.com/videos.
Decoding:
[H.264]
gst-launch-1.0 filesrc location=videos/xxxxx.mp4 \
! qtdemux name=demux demux.video_0 ! queue ! h264parse ! v4l2h264dec \
! videoconvert ! autovideosink
[H.265]
gst-launch-1.0 filesrc location=videos/xxxxx.mp4 \
! qtdemux name=demux demux.video_0 ! queue ! h265parse ! v4l2h265dec \
! videoconvert ! autovideosink
[VP9]
gst-launch-1.0 filesrc location=videos/xxxxx.webm \
! matroskademux ! queue ! v4l2vp9dec \
! videoconvert ! autovideosink
Encoding:
[H.264]
gst-launch-1.0 videotestsrc num-buffers=30 \
! video/x-raw,width=1280,height=720,framerate=30/1 \
! v4l2h264enc ! h264parse ! mp4mux ! filesink location=/tmp/output.mp4
[H.265]
gst-launch-1.0 videotestsrc num-buffers=30 \
! video/x-raw,width=1920,height=1080,framerate=30/1 \
! v4l2h265enc ! h265parse ! mp4mux ! filesink location=/tmp/output.mp4
Concurrency:
gst-launch-1.0 -v videotestsrc num-buffers=1000 \
! video/x-raw,format=NV12,width=1280,height=720,framerate=30/1 \
! v4l2h264enc capture-io-mode=4 output-io-mode=2 ! h264parse \
! v4l2h264dec capture-io-mode=4 output-io-mode=2 ! videoconvert \
! autovideosink
[Fluster]
The H.264 decoder was also tested using the Fluster test suite
(version: v0.4.0-12-g33566abd0964).
Target: GStreamer-H.264-V4L2-Gst1.0, Test Suite: JVT-AVC_V1
Result: 126/135 tests passed
Failures:
FM1_BT_B, FM1_FT_E, FM2_SVA_C, BA3_SVA_C, SP1_BT_A,
SP2_BT_B, MR6_BT_B, MR7_BT_B, MR8_BT_B
---
Jorge Ramirez-Ortiz (8):
media: dt-bindings: venus: Add qcm2290 dt schema
media: venus: Define minimum valid firmware version
media: venus: Add framework support for AR50_LITE video core
media: venus: hfi_plat_v4: Add capabilities for the 4XX lite core
media: venus: core: Sort dt_match alphabetically.
media: venus: core: Add qcm2290 DT compatible and resource data
arm64: dts: qcom: qcm2290: Add Venus video node
arm64: dts: qcom: qrb2210-rb1: Enable Venus
.../bindings/media/qcom,qcm2290-venus.yaml | 130 ++++++++++++
arch/arm64/boot/dts/qcom/qcm2290.dtsi | 55 +++++
arch/arm64/boot/dts/qcom/qrb2210-rb1.dts | 4 +
drivers/media/platform/qcom/venus/core.c | 109 +++++++---
drivers/media/platform/qcom/venus/core.h | 18 +-
drivers/media/platform/qcom/venus/firmware.c | 30 +++
drivers/media/platform/qcom/venus/firmware.h | 2 +
drivers/media/platform/qcom/venus/helpers.c | 12 +-
.../media/platform/qcom/venus/hfi_parser.c | 2 +-
.../media/platform/qcom/venus/hfi_platform.c | 23 ++-
.../media/platform/qcom/venus/hfi_platform.h | 34 ++--
.../platform/qcom/venus/hfi_platform_v4.c | 188 ++++++++++++++++--
.../platform/qcom/venus/hfi_platform_v6.c | 33 ++-
drivers/media/platform/qcom/venus/hfi_venus.c | 25 ++-
.../media/platform/qcom/venus/hfi_venus_io.h | 4 +
.../media/platform/qcom/venus/pm_helpers.c | 2 +-
16 files changed, 582 insertions(+), 89 deletions(-)
create mode 100644 Documentation/devicetree/bindings/media/qcom,qcm2290-venus.yaml
--
2.34.1
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v9 1/8] media: dt-bindings: venus: Add qcm2290 dt schema
2025-08-08 8:52 [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
@ 2025-08-08 8:52 ` Jorge Ramirez-Ortiz
2025-08-08 8:52 ` [PATCH v9 2/8] media: venus: Define minimum valid firmware version Jorge Ramirez-Ortiz
` (7 subsequent siblings)
8 siblings, 0 replies; 23+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-08-08 8:52 UTC (permalink / raw)
To: jorge.ramirez, quic_vgarodia, quic_dikshita, bryan.odonoghue,
krzk+dt, konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
Add a schema for the venus video encoder/decoder on the qcm2290.
The order of the IOMMU list is strict: the first two entries correspond
to non-secure IOMMUs, and the remaining three to secure IOMMUs.
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
---
.../bindings/media/qcom,qcm2290-venus.yaml | 130 ++++++++++++++++++
1 file changed, 130 insertions(+)
create mode 100644 Documentation/devicetree/bindings/media/qcom,qcm2290-venus.yaml
diff --git a/Documentation/devicetree/bindings/media/qcom,qcm2290-venus.yaml b/Documentation/devicetree/bindings/media/qcom,qcm2290-venus.yaml
new file mode 100644
index 000000000000..3f3ee82fc878
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/qcom,qcm2290-venus.yaml
@@ -0,0 +1,130 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/media/qcom,qcm2290-venus.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm QCM2290 Venus video encode and decode accelerators
+
+maintainers:
+ - Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
+
+description:
+ The Venus AR50_LITE IP is a video encode and decode accelerator present
+ on Qualcomm platforms.
+
+allOf:
+ - $ref: qcom,venus-common.yaml#
+
+properties:
+ compatible:
+ const: qcom,qcm2290-venus
+
+ power-domains:
+ maxItems: 3
+
+ power-domain-names:
+ items:
+ - const: venus
+ - const: vcodec0
+ - const: cx
+
+ clocks:
+ maxItems: 6
+
+ clock-names:
+ items:
+ - const: core
+ - const: iface
+ - const: bus
+ - const: throttle
+ - const: vcodec0_core
+ - const: vcodec0_bus
+
+ iommus:
+ maxItems: 5
+
+ interconnects:
+ maxItems: 2
+
+ interconnect-names:
+ items:
+ - const: video-mem
+ - const: cpu-cfg
+
+ operating-points-v2: true
+ opp-table:
+ type: object
+
+required:
+ - compatible
+ - power-domain-names
+ - iommus
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/qcom,gcc-qcm2290.h>
+ #include <dt-bindings/interconnect/qcom,qcm2290.h>
+ #include <dt-bindings/interconnect/qcom,rpm-icc.h>
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/power/qcom-rpmpd.h>
+
+ venus: video-codec@5a00000 {
+ compatible = "qcom,qcm2290-venus";
+ reg = <0x5a00000 0xf0000>;
+
+ interrupts = <GIC_SPI 225 IRQ_TYPE_LEVEL_HIGH>;
+
+ power-domains = <&gcc GCC_VENUS_GDSC>,
+ <&gcc GCC_VCODEC0_GDSC>,
+ <&rpmpd QCM2290_VDDCX>;
+ power-domain-names = "venus",
+ "vcodec0",
+ "cx";
+
+ operating-points-v2 = <&venus_opp_table>;
+
+ clocks = <&gcc GCC_VIDEO_VENUS_CTL_CLK>,
+ <&gcc GCC_VIDEO_AHB_CLK>,
+ <&gcc GCC_VENUS_CTL_AXI_CLK>,
+ <&gcc GCC_VIDEO_THROTTLE_CORE_CLK>,
+ <&gcc GCC_VIDEO_VCODEC0_SYS_CLK>,
+ <&gcc GCC_VCODEC0_AXI_CLK>;
+ clock-names = "core",
+ "iface",
+ "bus",
+ "throttle",
+ "vcodec0_core",
+ "vcodec0_bus";
+
+ memory-region = <&pil_video_mem>;
+
+ iommus = <&apps_smmu 0x860 0x0>,
+ <&apps_smmu 0x880 0x0>,
+ <&apps_smmu 0x861 0x04>,
+ <&apps_smmu 0x863 0x0>,
+ <&apps_smmu 0x804 0xe0>;
+
+ interconnects = <&mmnrt_virt MASTER_VIDEO_P0 RPM_ALWAYS_TAG
+ &bimc SLAVE_EBI1 RPM_ALWAYS_TAG>,
+ <&bimc MASTER_APPSS_PROC RPM_ACTIVE_TAG
+ &config_noc SLAVE_VENUS_CFG RPM_ACTIVE_TAG>;
+ interconnect-names = "video-mem",
+ "cpu-cfg";
+
+ venus_opp_table: opp-table {
+ compatible = "operating-points-v2";
+
+ opp-133333333 {
+ opp-hz = /bits/ 64 <133333333>;
+ required-opps = <&rpmpd_opp_low_svs>;
+ };
+
+ opp-240000000 {
+ opp-hz = /bits/ 64 <240000000>;
+ required-opps = <&rpmpd_opp_svs>;
+ };
+ };
+ };
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v9 2/8] media: venus: Define minimum valid firmware version
2025-08-08 8:52 [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
2025-08-08 8:52 ` [PATCH v9 1/8] media: dt-bindings: venus: Add qcm2290 dt schema Jorge Ramirez-Ortiz
@ 2025-08-08 8:52 ` Jorge Ramirez-Ortiz
2025-08-08 9:01 ` Bryan O'Donoghue
2025-08-08 10:13 ` Dikshita Agarwal
2025-08-08 8:52 ` [PATCH v9 3/8] media: venus: Add framework support for AR50_LITE video core Jorge Ramirez-Ortiz
` (6 subsequent siblings)
8 siblings, 2 replies; 23+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-08-08 8:52 UTC (permalink / raw)
To: jorge.ramirez, quic_vgarodia, quic_dikshita, bryan.odonoghue,
krzk+dt, konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
Add support for specifying the minimum firmware version required for
correct operation.
When set, the driver compares this value against the version reported by
the firmware: if the firmware is older than required, driver
initialization will fail.
The version check is performed before creating dynamic device tree
nodes, to avoid the need for reverting nodes on failure.
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
---
drivers/media/platform/qcom/venus/core.c | 40 +++++++++++---------
drivers/media/platform/qcom/venus/core.h | 13 ++++---
drivers/media/platform/qcom/venus/firmware.c | 20 ++++++++++
drivers/media/platform/qcom/venus/firmware.h | 1 +
4 files changed, 51 insertions(+), 23 deletions(-)
diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
index 4c049c694d9c..f45715c9b222 100644
--- a/drivers/media/platform/qcom/venus/core.c
+++ b/drivers/media/platform/qcom/venus/core.c
@@ -448,19 +448,9 @@ static int venus_probe(struct platform_device *pdev)
if (ret < 0)
goto err_runtime_disable;
- if (core->res->dec_nodename || core->res->enc_nodename) {
- ret = venus_add_dynamic_nodes(core);
- if (ret)
- goto err_runtime_disable;
- }
-
- ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
- if (ret)
- goto err_remove_dynamic_nodes;
-
ret = venus_firmware_init(core);
if (ret)
- goto err_of_depopulate;
+ goto err_runtime_disable;
ret = venus_boot(core);
if (ret)
@@ -474,34 +464,48 @@ static int venus_probe(struct platform_device *pdev)
if (ret)
goto err_venus_shutdown;
- ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_DEC);
+ ret = venus_firmware_check(core);
if (ret)
goto err_core_deinit;
+ if (core->res->dec_nodename || core->res->enc_nodename) {
+ ret = venus_add_dynamic_nodes(core);
+ if (ret)
+ goto err_core_deinit;
+ }
+
+ ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
+ if (ret)
+ goto err_remove_dynamic_nodes;
+
+ ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_DEC);
+ if (ret)
+ goto err_of_depopulate;
+
ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_ENC);
if (ret)
- goto err_core_deinit;
+ goto err_of_depopulate;
ret = pm_runtime_put_sync(dev);
if (ret) {
pm_runtime_get_noresume(dev);
- goto err_core_deinit;
+ goto err_of_depopulate;
}
venus_dbgfs_init(core);
return 0;
+err_of_depopulate:
+ of_platform_depopulate(dev);
+err_remove_dynamic_nodes:
+ venus_remove_dynamic_nodes(core);
err_core_deinit:
hfi_core_deinit(core, false);
err_venus_shutdown:
venus_shutdown(core);
err_firmware_deinit:
venus_firmware_deinit(core);
-err_of_depopulate:
- of_platform_depopulate(dev);
-err_remove_dynamic_nodes:
- venus_remove_dynamic_nodes(core);
err_runtime_disable:
pm_runtime_put_noidle(dev);
pm_runtime_disable(dev);
diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
index 5b1ba1c69adb..d1f0e9979ba4 100644
--- a/drivers/media/platform/qcom/venus/core.h
+++ b/drivers/media/platform/qcom/venus/core.h
@@ -58,6 +58,12 @@ enum vpu_version {
VPU_VERSION_IRIS2_1,
};
+struct firmware_version {
+ u32 major;
+ u32 minor;
+ u32 rev;
+};
+
struct venus_resources {
u64 dma_mask;
const struct freq_tbl *freq_tbl;
@@ -94,6 +100,7 @@ struct venus_resources {
const char *fwname;
const char *enc_nodename;
const char *dec_nodename;
+ const struct firmware_version *min_fw;
};
enum venus_fmt {
@@ -231,11 +238,7 @@ struct venus_core {
unsigned int core0_usage_count;
unsigned int core1_usage_count;
struct dentry *root;
- struct venus_img_version {
- u32 major;
- u32 minor;
- u32 rev;
- } venus_ver;
+ struct firmware_version venus_ver;
unsigned long dump_core;
struct of_changeset *ocs;
bool hwmode_dev;
diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
index 66a18830e66d..3666675ae298 100644
--- a/drivers/media/platform/qcom/venus/firmware.c
+++ b/drivers/media/platform/qcom/venus/firmware.c
@@ -280,6 +280,26 @@ int venus_shutdown(struct venus_core *core)
return ret;
}
+int venus_firmware_check(struct venus_core *core)
+{
+ const struct firmware_version *req = core->res->min_fw;
+ const struct firmware_version *run = &core->venus_ver;
+
+ if (!req)
+ return 0;
+
+ if (!is_fw_rev_or_newer(core, req->major, req->minor, req->rev))
+ goto error;
+
+ return 0;
+error:
+ dev_err(core->dev, "Firmware v%d.%d.%d < v%d.%d.%d\n",
+ run->major, run->minor, run->rev,
+ req->major, req->minor, req->rev);
+
+ return -EINVAL;
+}
+
int venus_firmware_init(struct venus_core *core)
{
struct platform_device_info info;
diff --git a/drivers/media/platform/qcom/venus/firmware.h b/drivers/media/platform/qcom/venus/firmware.h
index aaccd847fa30..ead39e3797f0 100644
--- a/drivers/media/platform/qcom/venus/firmware.h
+++ b/drivers/media/platform/qcom/venus/firmware.h
@@ -9,6 +9,7 @@ struct device;
int venus_firmware_init(struct venus_core *core);
void venus_firmware_deinit(struct venus_core *core);
+int venus_firmware_check(struct venus_core *core);
int venus_boot(struct venus_core *core);
int venus_shutdown(struct venus_core *core);
int venus_set_hw_state(struct venus_core *core, bool suspend);
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v9 3/8] media: venus: Add framework support for AR50_LITE video core
2025-08-08 8:52 [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
2025-08-08 8:52 ` [PATCH v9 1/8] media: dt-bindings: venus: Add qcm2290 dt schema Jorge Ramirez-Ortiz
2025-08-08 8:52 ` [PATCH v9 2/8] media: venus: Define minimum valid firmware version Jorge Ramirez-Ortiz
@ 2025-08-08 8:52 ` Jorge Ramirez-Ortiz
2025-08-08 9:10 ` Bryan O'Donoghue
2025-08-11 10:03 ` Dikshita Agarwal
2025-08-08 8:52 ` [PATCH v9 4/8] media: venus: hfi_plat_v4: Add capabilities for the 4XX lite core Jorge Ramirez-Ortiz
` (5 subsequent siblings)
8 siblings, 2 replies; 23+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-08-08 8:52 UTC (permalink / raw)
To: jorge.ramirez, quic_vgarodia, quic_dikshita, bryan.odonoghue,
krzk+dt, konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
The AR50_LITE is a simplified variant of the AR50 video core, designed for
power and cost-efficient platforms.
It supports hardware-accelerated decoding of H.264, HEVC, and VP9 formats,
and provides encoding support for H.264 and HEVC.
This commit prepares the framework to enable the AR50_LITE (it does not
enable it).
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
---
drivers/media/platform/qcom/venus/core.c | 15 ++++++--
drivers/media/platform/qcom/venus/core.h | 5 +++
drivers/media/platform/qcom/venus/firmware.c | 10 ++++++
drivers/media/platform/qcom/venus/firmware.h | 1 +
drivers/media/platform/qcom/venus/helpers.c | 12 +++++--
.../media/platform/qcom/venus/hfi_parser.c | 2 +-
.../media/platform/qcom/venus/hfi_platform.c | 23 ++++++++-----
.../media/platform/qcom/venus/hfi_platform.h | 34 ++++++++++++-------
.../platform/qcom/venus/hfi_platform_v4.c | 33 +++++++++++++-----
.../platform/qcom/venus/hfi_platform_v6.c | 33 +++++++++++++-----
drivers/media/platform/qcom/venus/hfi_venus.c | 25 ++++++++++----
.../media/platform/qcom/venus/hfi_venus_io.h | 4 +++
.../media/platform/qcom/venus/pm_helpers.c | 2 +-
13 files changed, 145 insertions(+), 54 deletions(-)
diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
index f45715c9b222..adc38fbc9d79 100644
--- a/drivers/media/platform/qcom/venus/core.c
+++ b/drivers/media/platform/qcom/venus/core.c
@@ -254,14 +254,19 @@ static int venus_enumerate_codecs(struct venus_core *core, u32 type)
static void venus_assign_register_offsets(struct venus_core *core)
{
- if (IS_IRIS2(core) || IS_IRIS2_1(core)) {
- core->vbif_base = core->base + VBIF_BASE;
+ if (IS_IRIS2(core) || IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
core->cpu_base = core->base + CPU_BASE_V6;
core->cpu_cs_base = core->base + CPU_CS_BASE_V6;
core->cpu_ic_base = core->base + CPU_IC_BASE_V6;
core->wrapper_base = core->base + WRAPPER_BASE_V6;
core->wrapper_tz_base = core->base + WRAPPER_TZ_BASE_V6;
- core->aon_base = core->base + AON_BASE_V6;
+ if (IS_AR50_LITE(core)) {
+ core->vbif_base = NULL;
+ core->aon_base = NULL;
+ } else {
+ core->vbif_base = core->base + VBIF_BASE;
+ core->aon_base = core->base + AON_BASE_V6;
+ }
} else {
core->vbif_base = core->base + VBIF_BASE;
core->cpu_base = core->base + CPU_BASE;
@@ -456,6 +461,10 @@ static int venus_probe(struct platform_device *pdev)
if (ret)
goto err_firmware_deinit;
+ ret = venus_firmware_cfg(core);
+ if (ret)
+ goto err_venus_shutdown;
+
ret = hfi_core_resume(core, true);
if (ret)
goto err_venus_shutdown;
diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
index d1f0e9979ba4..ef80a7666597 100644
--- a/drivers/media/platform/qcom/venus/core.h
+++ b/drivers/media/platform/qcom/venus/core.h
@@ -533,6 +533,11 @@ struct venus_inst {
#define IS_IRIS2(core) ((core)->res->vpu_version == VPU_VERSION_IRIS2)
#define IS_IRIS2_1(core) ((core)->res->vpu_version == VPU_VERSION_IRIS2_1)
+static inline bool is_lite(struct venus_core *core)
+{
+ return IS_AR50_LITE(core);
+}
+
#define ctrl_to_inst(ctrl) \
container_of((ctrl)->handler, struct venus_inst, ctrl_handler)
diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
index 3666675ae298..2483998360f7 100644
--- a/drivers/media/platform/qcom/venus/firmware.c
+++ b/drivers/media/platform/qcom/venus/firmware.c
@@ -207,6 +207,16 @@ static int venus_shutdown_no_tz(struct venus_core *core)
return 0;
}
+int venus_firmware_cfg(struct venus_core *core)
+{
+ void __iomem *cpu_cs_base = core->cpu_cs_base;
+
+ if (IS_AR50_LITE(core))
+ writel(CPU_CS_VCICMD_ARP_OFF, cpu_cs_base + CPU_CS_VCICMD);
+
+ return 0;
+}
+
int venus_boot(struct venus_core *core)
{
struct device *dev = core->dev;
diff --git a/drivers/media/platform/qcom/venus/firmware.h b/drivers/media/platform/qcom/venus/firmware.h
index ead39e3797f0..87e1d922b369 100644
--- a/drivers/media/platform/qcom/venus/firmware.h
+++ b/drivers/media/platform/qcom/venus/firmware.h
@@ -10,6 +10,7 @@ struct device;
int venus_firmware_init(struct venus_core *core);
void venus_firmware_deinit(struct venus_core *core);
int venus_firmware_check(struct venus_core *core);
+int venus_firmware_cfg(struct venus_core *core);
int venus_boot(struct venus_core *core);
int venus_shutdown(struct venus_core *core);
int venus_set_hw_state(struct venus_core *core, bool suspend);
diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c
index 8295542e1a7c..2e4363f82231 100644
--- a/drivers/media/platform/qcom/venus/helpers.c
+++ b/drivers/media/platform/qcom/venus/helpers.c
@@ -1715,11 +1715,17 @@ int venus_helper_session_init(struct venus_inst *inst)
if (ret)
return ret;
- inst->clk_data.vpp_freq = hfi_platform_get_codec_vpp_freq(version, codec,
+ inst->clk_data.vpp_freq = hfi_platform_get_codec_vpp_freq(inst->core,
+ version,
+ codec,
session_type);
- inst->clk_data.vsp_freq = hfi_platform_get_codec_vsp_freq(version, codec,
+ inst->clk_data.vsp_freq = hfi_platform_get_codec_vsp_freq(inst->core,
+ version,
+ codec,
session_type);
- inst->clk_data.low_power_freq = hfi_platform_get_codec_lp_freq(version, codec,
+ inst->clk_data.low_power_freq = hfi_platform_get_codec_lp_freq(inst->core,
+ version,
+ codec,
session_type);
return 0;
diff --git a/drivers/media/platform/qcom/venus/hfi_parser.c b/drivers/media/platform/qcom/venus/hfi_parser.c
index 1b3db2caa99f..92765f9c8873 100644
--- a/drivers/media/platform/qcom/venus/hfi_parser.c
+++ b/drivers/media/platform/qcom/venus/hfi_parser.c
@@ -282,7 +282,7 @@ static int hfi_platform_parser(struct venus_core *core, struct venus_inst *inst)
return ret;
if (plat->capabilities)
- caps = plat->capabilities(&entries);
+ caps = plat->capabilities(core, &entries);
if (!caps || !entries || !count)
return -EINVAL;
diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
index 643e5aa138f5..cde7f93045ac 100644
--- a/drivers/media/platform/qcom/venus/hfi_platform.c
+++ b/drivers/media/platform/qcom/venus/hfi_platform.c
@@ -21,7 +21,9 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
}
unsigned long
-hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec, u32 session_type)
+hfi_platform_get_codec_vpp_freq(struct venus_core *core,
+ enum hfi_version version, u32 codec,
+ u32 session_type)
{
const struct hfi_platform *plat;
unsigned long freq = 0;
@@ -31,13 +33,15 @@ hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec, u32 session
return 0;
if (plat->codec_vpp_freq)
- freq = plat->codec_vpp_freq(session_type, codec);
+ freq = plat->codec_vpp_freq(core, session_type, codec);
return freq;
}
unsigned long
-hfi_platform_get_codec_vsp_freq(enum hfi_version version, u32 codec, u32 session_type)
+hfi_platform_get_codec_vsp_freq(struct venus_core *core,
+ enum hfi_version version, u32 codec,
+ u32 session_type)
{
const struct hfi_platform *plat;
unsigned long freq = 0;
@@ -47,13 +51,15 @@ hfi_platform_get_codec_vsp_freq(enum hfi_version version, u32 codec, u32 session
return 0;
if (plat->codec_vpp_freq)
- freq = plat->codec_vsp_freq(session_type, codec);
+ freq = plat->codec_vsp_freq(core, session_type, codec);
return freq;
}
unsigned long
-hfi_platform_get_codec_lp_freq(enum hfi_version version, u32 codec, u32 session_type)
+hfi_platform_get_codec_lp_freq(struct venus_core *core,
+ enum hfi_version version, u32 codec,
+ u32 session_type)
{
const struct hfi_platform *plat;
unsigned long freq = 0;
@@ -63,13 +69,14 @@ hfi_platform_get_codec_lp_freq(enum hfi_version version, u32 codec, u32 session_
return 0;
if (plat->codec_lp_freq)
- freq = plat->codec_lp_freq(session_type, codec);
+ freq = plat->codec_lp_freq(core, session_type, codec);
return freq;
}
int
-hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs, u32 *dec_codecs, u32 *count)
+hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs,
+ u32 *dec_codecs, u32 *count)
{
const struct hfi_platform *plat;
@@ -78,7 +85,7 @@ hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs, u32 *dec_codec
return -EINVAL;
if (plat->codecs)
- plat->codecs(enc_codecs, dec_codecs, count);
+ plat->codecs(core, enc_codecs, dec_codecs, count);
if (IS_IRIS2_1(core)) {
*enc_codecs &= ~HFI_VIDEO_CODEC_VP8;
diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
index ec89a90a8129..5e4f8013a6b1 100644
--- a/drivers/media/platform/qcom/venus/hfi_platform.h
+++ b/drivers/media/platform/qcom/venus/hfi_platform.h
@@ -47,11 +47,16 @@ struct hfi_platform_codec_freq_data {
};
struct hfi_platform {
- unsigned long (*codec_vpp_freq)(u32 session_type, u32 codec);
- unsigned long (*codec_vsp_freq)(u32 session_type, u32 codec);
- unsigned long (*codec_lp_freq)(u32 session_type, u32 codec);
- void (*codecs)(u32 *enc_codecs, u32 *dec_codecs, u32 *count);
- const struct hfi_plat_caps *(*capabilities)(unsigned int *entries);
+ unsigned long (*codec_vpp_freq)(struct venus_core *core,
+ u32 session_type, u32 codec);
+ unsigned long (*codec_vsp_freq)(struct venus_core *core,
+ u32 session_type, u32 codec);
+ unsigned long (*codec_lp_freq)(struct venus_core *core,
+ u32 session_type, u32 codec);
+ void (*codecs)(struct venus_core *core, u32 *enc_codecs,
+ u32 *dec_codecs, u32 *count);
+ const struct hfi_plat_caps *(*capabilities)(struct venus_core *core,
+ unsigned int *entries);
int (*bufreq)(struct hfi_plat_buffers_params *params, u32 session_type,
u32 buftype, struct hfi_buffer_requirements *bufreq);
};
@@ -60,12 +65,15 @@ extern const struct hfi_platform hfi_plat_v4;
extern const struct hfi_platform hfi_plat_v6;
const struct hfi_platform *hfi_platform_get(enum hfi_version version);
-unsigned long hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec,
- u32 session_type);
-unsigned long hfi_platform_get_codec_vsp_freq(enum hfi_version version, u32 codec,
- u32 session_type);
-unsigned long hfi_platform_get_codec_lp_freq(enum hfi_version version, u32 codec,
- u32 session_type);
-int hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs, u32 *dec_codecs,
- u32 *count);
+unsigned long hfi_platform_get_codec_vpp_freq(struct venus_core *core,
+ enum hfi_version version,
+ u32 codec, u32 session_type);
+unsigned long hfi_platform_get_codec_vsp_freq(struct venus_core *core,
+ enum hfi_version version,
+ u32 codec, u32 session_type);
+unsigned long hfi_platform_get_codec_lp_freq(struct venus_core *core,
+ enum hfi_version version,
+ u32 codec, u32 session_type);
+int hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs,
+ u32 *dec_codecs, u32 *count);
#endif
diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v4.c b/drivers/media/platform/qcom/venus/hfi_platform_v4.c
index e3f0a90a567b..41e4dc28ec1b 100644
--- a/drivers/media/platform/qcom/venus/hfi_platform_v4.c
+++ b/drivers/media/platform/qcom/venus/hfi_platform_v4.c
@@ -2,6 +2,7 @@
/*
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
*/
+#include "core.h"
#include "hfi_platform.h"
static const struct hfi_plat_caps caps[] = {
@@ -245,14 +246,22 @@ static const struct hfi_plat_caps caps[] = {
.num_fmts = 4,
} };
-static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
+static const struct hfi_plat_caps *get_capabilities(struct venus_core *core,
+ unsigned int *entries)
{
+ if (is_lite(core))
+ return NULL;
+
*entries = ARRAY_SIZE(caps);
return caps;
}
-static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
+static void get_codecs(struct venus_core *core,
+ u32 *enc_codecs, u32 *dec_codecs, u32 *count)
{
+ if (is_lite(core))
+ return;
+
*enc_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
HFI_VIDEO_CODEC_VP8;
*dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
@@ -273,12 +282,15 @@ static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
};
static const struct hfi_platform_codec_freq_data *
-get_codec_freq_data(u32 session_type, u32 pixfmt)
+get_codec_freq_data(struct venus_core *core, u32 session_type, u32 pixfmt)
{
const struct hfi_platform_codec_freq_data *data = codec_freq_data;
unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
const struct hfi_platform_codec_freq_data *found = NULL;
+ if (is_lite(core))
+ return NULL;
+
for (i = 0; i < data_size; i++) {
if (data[i].pixfmt == pixfmt && data[i].session_type == session_type) {
found = &data[i];
@@ -289,33 +301,36 @@ get_codec_freq_data(u32 session_type, u32 pixfmt)
return found;
}
-static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
+static unsigned long codec_vpp_freq(struct venus_core *core,
+ u32 session_type, u32 codec)
{
const struct hfi_platform_codec_freq_data *data;
- data = get_codec_freq_data(session_type, codec);
+ data = get_codec_freq_data(core, session_type, codec);
if (data)
return data->vpp_freq;
return 0;
}
-static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
+static unsigned long codec_vsp_freq(struct venus_core *core,
+ u32 session_type, u32 codec)
{
const struct hfi_platform_codec_freq_data *data;
- data = get_codec_freq_data(session_type, codec);
+ data = get_codec_freq_data(core, session_type, codec);
if (data)
return data->vsp_freq;
return 0;
}
-static unsigned long codec_lp_freq(u32 session_type, u32 codec)
+static unsigned long codec_lp_freq(struct venus_core *core,
+ u32 session_type, u32 codec)
{
const struct hfi_platform_codec_freq_data *data;
- data = get_codec_freq_data(session_type, codec);
+ data = get_codec_freq_data(core, session_type, codec);
if (data)
return data->low_power_freq;
diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6.c b/drivers/media/platform/qcom/venus/hfi_platform_v6.c
index 4e8af645f8b9..d8568c08cc36 100644
--- a/drivers/media/platform/qcom/venus/hfi_platform_v6.c
+++ b/drivers/media/platform/qcom/venus/hfi_platform_v6.c
@@ -2,6 +2,7 @@
/*
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
*/
+#include "core.h"
#include "hfi_platform.h"
static const struct hfi_plat_caps caps[] = {
@@ -245,14 +246,22 @@ static const struct hfi_plat_caps caps[] = {
.num_fmts = 4,
} };
-static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
+static const struct hfi_plat_caps *get_capabilities(struct venus_core *core,
+ unsigned int *entries)
{
+ if (is_lite(core))
+ return NULL;
+
*entries = ARRAY_SIZE(caps);
return caps;
}
-static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
+static void get_codecs(struct venus_core *core, u32 *enc_codecs,
+ u32 *dec_codecs, u32 *count)
{
+ if (is_lite(core))
+ return;
+
*enc_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
HFI_VIDEO_CODEC_VP8;
*dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
@@ -273,12 +282,15 @@ static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
};
static const struct hfi_platform_codec_freq_data *
-get_codec_freq_data(u32 session_type, u32 pixfmt)
+get_codec_freq_data(struct venus_core *core, u32 session_type, u32 pixfmt)
{
const struct hfi_platform_codec_freq_data *data = codec_freq_data;
unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
const struct hfi_platform_codec_freq_data *found = NULL;
+ if (is_lite(core))
+ return NULL;
+
for (i = 0; i < data_size; i++) {
if (data[i].pixfmt == pixfmt && data[i].session_type == session_type) {
found = &data[i];
@@ -289,33 +301,36 @@ get_codec_freq_data(u32 session_type, u32 pixfmt)
return found;
}
-static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
+static unsigned long codec_vpp_freq(struct venus_core *core, u32 session_type,
+ u32 codec)
{
const struct hfi_platform_codec_freq_data *data;
- data = get_codec_freq_data(session_type, codec);
+ data = get_codec_freq_data(core, session_type, codec);
if (data)
return data->vpp_freq;
return 0;
}
-static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
+static unsigned long codec_vsp_freq(struct venus_core *core, u32 session_type,
+ u32 codec)
{
const struct hfi_platform_codec_freq_data *data;
- data = get_codec_freq_data(session_type, codec);
+ data = get_codec_freq_data(core, session_type, codec);
if (data)
return data->vsp_freq;
return 0;
}
-static unsigned long codec_lp_freq(u32 session_type, u32 codec)
+static unsigned long codec_lp_freq(struct venus_core *core, u32 session_type,
+ u32 codec)
{
const struct hfi_platform_codec_freq_data *data;
- data = get_codec_freq_data(session_type, codec);
+ data = get_codec_freq_data(core, session_type, codec);
if (data)
return data->low_power_freq;
diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c
index cec7f5964d3d..d3da35f67fd5 100644
--- a/drivers/media/platform/qcom/venus/hfi_venus.c
+++ b/drivers/media/platform/qcom/venus/hfi_venus.c
@@ -380,7 +380,7 @@ static void venus_soft_int(struct venus_hfi_device *hdev)
void __iomem *cpu_ic_base = hdev->core->cpu_ic_base;
u32 clear_bit;
- if (IS_V6(hdev->core))
+ if (IS_V6(hdev->core) || (IS_V4(hdev->core) && is_lite(hdev->core)))
clear_bit = BIT(CPU_IC_SOFTINT_H2A_SHIFT_V6);
else
clear_bit = BIT(CPU_IC_SOFTINT_H2A_SHIFT);
@@ -501,9 +501,11 @@ static int venus_boot_core(struct venus_hfi_device *hdev)
if (count >= max_tries)
ret = -ETIMEDOUT;
- if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core)) {
+ if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core) || IS_AR50_LITE(hdev->core)) {
writel(0x1, cpu_cs_base + CPU_CS_H2XSOFTINTEN_V6);
- writel(0x0, cpu_cs_base + CPU_CS_X2RPMH_V6);
+
+ if (!IS_AR50_LITE(hdev->core))
+ writel(0x0, cpu_cs_base + CPU_CS_X2RPMH_V6);
}
return ret;
@@ -569,6 +571,9 @@ static int venus_halt_axi(struct venus_hfi_device *hdev)
u32 mask_val;
int ret;
+ if (IS_AR50_LITE(hdev->core))
+ return 0;
+
if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core)) {
writel(0x3, cpu_cs_base + CPU_CS_X2RPMH_V6);
@@ -1138,7 +1143,13 @@ static irqreturn_t venus_isr(struct venus_core *core)
wrapper_base = hdev->core->wrapper_base;
status = readl(wrapper_base + WRAPPER_INTR_STATUS);
- if (IS_IRIS2(core) || IS_IRIS2_1(core)) {
+
+ if (IS_AR50_LITE(core)) {
+ if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
+ status & WRAPPER_INTR_STATUS_A2HWD_MASK_V4_LITE ||
+ status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
+ hdev->irq_status = status;
+ } else if (IS_IRIS2(core) || IS_IRIS2_1(core)) {
if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
status & WRAPPER_INTR_STATUS_A2HWD_MASK_V6 ||
status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
@@ -1150,7 +1161,7 @@ static irqreturn_t venus_isr(struct venus_core *core)
hdev->irq_status = status;
}
writel(1, cpu_cs_base + CPU_CS_A2HSOFTINTCLR);
- if (!(IS_IRIS2(core) || IS_IRIS2_1(core)))
+ if (!(IS_IRIS2(core) || IS_IRIS2_1(core) || IS_AR50_LITE(core)))
writel(status, wrapper_base + WRAPPER_INTR_CLEAR);
return IRQ_WAKE_THREAD;
@@ -1535,7 +1546,7 @@ static bool venus_cpu_and_video_core_idle(struct venus_hfi_device *hdev)
void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
u32 ctrl_status, cpu_status;
- if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core))
+ if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core) || IS_AR50_LITE(hdev->core))
cpu_status = readl(wrapper_tz_base + WRAPPER_TZ_CPU_STATUS_V6);
else
cpu_status = readl(wrapper_base + WRAPPER_CPU_STATUS);
@@ -1555,7 +1566,7 @@ static bool venus_cpu_idle_and_pc_ready(struct venus_hfi_device *hdev)
void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
u32 ctrl_status, cpu_status;
- if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core))
+ if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core) || IS_AR50_LITE(hdev->core))
cpu_status = readl(wrapper_tz_base + WRAPPER_TZ_CPU_STATUS_V6);
else
cpu_status = readl(wrapper_base + WRAPPER_CPU_STATUS);
diff --git a/drivers/media/platform/qcom/venus/hfi_venus_io.h b/drivers/media/platform/qcom/venus/hfi_venus_io.h
index 9735a246ce36..f2c3064c44ae 100644
--- a/drivers/media/platform/qcom/venus/hfi_venus_io.h
+++ b/drivers/media/platform/qcom/venus/hfi_venus_io.h
@@ -51,6 +51,9 @@
/* Venus cpu */
#define CPU_CS_SCIACMDARG3 0x58
+#define CPU_CS_VCICMD 0x20
+#define CPU_CS_VCICMD_ARP_OFF BIT(0)
+
#define SFR_ADDR 0x5c
#define MMAP_ADDR 0x60
#define UC_REGION_ADDR 0x64
@@ -100,6 +103,7 @@
#define WRAPPER_INTR_MASK_A2HCPU_MASK 0x4
#define WRAPPER_INTR_MASK_A2HCPU_SHIFT 0x2
+#define WRAPPER_INTR_STATUS_A2HWD_MASK_V4_LITE 0x10
#define WRAPPER_INTR_STATUS_A2HWD_MASK_V6 0x8
#define WRAPPER_INTR_MASK_A2HWD_BASK_V6 0x8
diff --git a/drivers/media/platform/qcom/venus/pm_helpers.c b/drivers/media/platform/qcom/venus/pm_helpers.c
index 8dd5a9b0d060..e09b0d9ae610 100644
--- a/drivers/media/platform/qcom/venus/pm_helpers.c
+++ b/drivers/media/platform/qcom/venus/pm_helpers.c
@@ -51,7 +51,7 @@ static int core_clks_enable(struct venus_core *core)
dev_pm_opp_put(opp);
for (i = 0; i < res->clks_num; i++) {
- if (IS_V6(core)) {
+ if (IS_V6(core) || (IS_V4(core) && is_lite(core))) {
ret = clk_set_rate(core->clks[i], freq);
if (ret)
goto err;
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v9 4/8] media: venus: hfi_plat_v4: Add capabilities for the 4XX lite core
2025-08-08 8:52 [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
` (2 preceding siblings ...)
2025-08-08 8:52 ` [PATCH v9 3/8] media: venus: Add framework support for AR50_LITE video core Jorge Ramirez-Ortiz
@ 2025-08-08 8:52 ` Jorge Ramirez-Ortiz
2025-08-11 10:05 ` Dikshita Agarwal
2025-08-08 8:52 ` [PATCH v9 5/8] media: venus: core: Sort dt_match alphabetically Jorge Ramirez-Ortiz
` (4 subsequent siblings)
8 siblings, 1 reply; 23+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-08-08 8:52 UTC (permalink / raw)
To: jorge.ramirez, quic_vgarodia, quic_dikshita, bryan.odonoghue,
krzk+dt, konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
Populate the HFI v4 lite capability set used by the AR50_LITE video
core.
These capabilities define the supported codec formats and operational
limits specific to this streamlined VPU variant.
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
---
.../platform/qcom/venus/hfi_platform_v4.c | 167 ++++++++++++++++--
1 file changed, 151 insertions(+), 16 deletions(-)
diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v4.c b/drivers/media/platform/qcom/venus/hfi_platform_v4.c
index 41e4dc28ec1b..cda888b56b5d 100644
--- a/drivers/media/platform/qcom/venus/hfi_platform_v4.c
+++ b/drivers/media/platform/qcom/venus/hfi_platform_v4.c
@@ -246,28 +246,150 @@ static const struct hfi_plat_caps caps[] = {
.num_fmts = 4,
} };
+static const struct hfi_plat_caps caps_lite[] = {
+{
+ .codec = HFI_VIDEO_CODEC_H264,
+ .domain = VIDC_SESSION_TYPE_DEC,
+ .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
+ .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1920, 1},
+ .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
+ .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
+ .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
+ .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
+ .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
+ .num_caps = 7,
+ .pl[0] = { HFI_H264_PROFILE_BASELINE, HFI_H264_LEVEL_5},
+ .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_5},
+ .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
+ .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_5},
+ .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_5},
+ .num_pl = 5,
+ .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
+ .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
+ .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
+ .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
+ .num_fmts = 4,
+}, {
+ .codec = HFI_VIDEO_CODEC_HEVC,
+ .domain = VIDC_SESSION_TYPE_DEC,
+ .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
+ .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1920, 1},
+ .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
+ .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
+ .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
+ .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
+ .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
+ .num_caps = 7,
+ .pl[0] = {HFI_HEVC_PROFILE_MAIN, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_HIGH0 << 28 },
+ .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_HIGH0 << 28 },
+ .num_pl = 2,
+ .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
+ .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
+ .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
+ .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
+ .num_fmts = 4,
+}, {
+ .codec = HFI_VIDEO_CODEC_VP9,
+ .domain = VIDC_SESSION_TYPE_DEC,
+ .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
+ .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1920, 1},
+ .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
+ .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
+ .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
+ .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
+ .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
+ .num_caps = 7,
+ .pl[0] = {HFI_VP9_PROFILE_P0, 200},
+ .pl[1] = {HFI_VP9_PROFILE_P2_10B, 200},
+ .num_pl = 2,
+ .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
+ .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
+ .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
+ .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
+ .num_fmts = 4,
+}, {
+ .codec = HFI_VIDEO_CODEC_H264,
+ .domain = VIDC_SESSION_TYPE_ENC,
+ .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
+ .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1920, 1},
+ .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
+ .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
+ .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
+ .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
+ .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
+ .caps[7] = {HFI_CAPABILITY_HIER_P_NUM_ENH_LAYERS, 0, 6, 1},
+ .caps[8] = {HFI_CAPABILITY_ENC_LTR_COUNT, 0, 4, 1},
+ .caps[9] = {HFI_CAPABILITY_MBS_PER_SECOND_POWERSAVE, 0, 244800, 1},
+ .caps[10] = {HFI_CAPABILITY_I_FRAME_QP, 0, 51, 1},
+ .caps[11] = {HFI_CAPABILITY_P_FRAME_QP, 0, 51, 1},
+ .caps[12] = {HFI_CAPABILITY_B_FRAME_QP, 0, 51, 1},
+ .caps[13] = {HFI_CAPABILITY_SLICE_BYTE, 1, 10, 1},
+ .caps[14] = {HFI_CAPABILITY_SLICE_MB, 1, 10, 1},
+ .num_caps = 15,
+ .pl[0] = {HFI_H264_PROFILE_BASELINE, HFI_H264_LEVEL_5},
+ .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_5},
+ .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
+ .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_5},
+ .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_5},
+ .num_pl = 5,
+ .fmts[0] = {HFI_BUFFER_INPUT, HFI_COLOR_FORMAT_NV12},
+ .fmts[1] = {HFI_BUFFER_INPUT, HFI_COLOR_FORMAT_NV12_UBWC},
+ .num_fmts = 2,
+}, {
+ .codec = HFI_VIDEO_CODEC_HEVC,
+ .domain = VIDC_SESSION_TYPE_ENC,
+ .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
+ .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1920, 1},
+ .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
+ .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
+ .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
+ .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
+ .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
+ .caps[7] = {HFI_CAPABILITY_HIER_P_NUM_ENH_LAYERS, 0, 6, 1},
+ .caps[8] = {HFI_CAPABILITY_ENC_LTR_COUNT, 0, 4, 1},
+ .caps[9] = {HFI_CAPABILITY_MBS_PER_SECOND_POWERSAVE, 0, 244800, 1},
+ .caps[10] = {HFI_CAPABILITY_I_FRAME_QP, 0, 51, 1},
+ .caps[11] = {HFI_CAPABILITY_P_FRAME_QP, 0, 51, 1},
+ .caps[12] = {HFI_CAPABILITY_B_FRAME_QP, 0, 51, 1},
+ .caps[13] = {HFI_CAPABILITY_SLICE_BYTE, 1, 10, 1},
+ .caps[14] = {HFI_CAPABILITY_SLICE_MB, 1, 10, 1},
+ .num_caps = 15,
+ .pl[0] = {HFI_HEVC_PROFILE_MAIN, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_HIGH0},
+ .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_HIGH0},
+ .num_pl = 2,
+ .fmts[0] = {HFI_BUFFER_INPUT, HFI_COLOR_FORMAT_NV12},
+ .fmts[1] = {HFI_BUFFER_INPUT, HFI_COLOR_FORMAT_NV12_UBWC},
+ .num_fmts = 2,
+} };
+
static const struct hfi_plat_caps *get_capabilities(struct venus_core *core,
unsigned int *entries)
{
- if (is_lite(core))
- return NULL;
+ *entries = is_lite(core) ? ARRAY_SIZE(caps_lite) : ARRAY_SIZE(caps);
- *entries = ARRAY_SIZE(caps);
- return caps;
+ return is_lite(core) ? caps_lite : caps;
}
static void get_codecs(struct venus_core *core,
u32 *enc_codecs, u32 *dec_codecs, u32 *count)
{
- if (is_lite(core))
- return;
+ const struct hfi_plat_caps *caps;
+ unsigned int num;
+ size_t i;
+
+ *enc_codecs = 0;
+ *dec_codecs = 0;
+
+ caps = get_capabilities(core, &num);
- *enc_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
- HFI_VIDEO_CODEC_VP8;
- *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
- HFI_VIDEO_CODEC_VP8 | HFI_VIDEO_CODEC_VP9 |
- HFI_VIDEO_CODEC_MPEG2;
- *count = 8;
+ for (i = 0; i < num; caps++, i++) {
+ if (caps->domain == VIDC_SESSION_TYPE_ENC)
+ *enc_codecs |= caps->codec;
+ else
+ *dec_codecs |= caps->codec;
+ }
+
+ *count = num;
}
static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
@@ -281,15 +403,28 @@ static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
{ V4L2_PIX_FMT_VP9, VIDC_SESSION_TYPE_DEC, 200, 10, 200 },
};
+static const struct hfi_platform_codec_freq_data codec_freq_data_lite[] = {
+ { V4L2_PIX_FMT_H264, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
+ { V4L2_PIX_FMT_HEVC, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
+ { V4L2_PIX_FMT_VP9, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
+ { V4L2_PIX_FMT_H264, VIDC_SESSION_TYPE_ENC, 675, 0, 675 },
+ { V4L2_PIX_FMT_HEVC, VIDC_SESSION_TYPE_ENC, 675, 0, 675 },
+};
+
static const struct hfi_platform_codec_freq_data *
get_codec_freq_data(struct venus_core *core, u32 session_type, u32 pixfmt)
{
- const struct hfi_platform_codec_freq_data *data = codec_freq_data;
- unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
+ const struct hfi_platform_codec_freq_data *data;
+ unsigned int i, data_size;
const struct hfi_platform_codec_freq_data *found = NULL;
- if (is_lite(core))
- return NULL;
+ if (is_lite(core)) {
+ data = codec_freq_data_lite;
+ data_size = ARRAY_SIZE(codec_freq_data_lite);
+ } else {
+ data = codec_freq_data;
+ data_size = ARRAY_SIZE(codec_freq_data);
+ }
for (i = 0; i < data_size; i++) {
if (data[i].pixfmt == pixfmt && data[i].session_type == session_type) {
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v9 5/8] media: venus: core: Sort dt_match alphabetically.
2025-08-08 8:52 [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
` (3 preceding siblings ...)
2025-08-08 8:52 ` [PATCH v9 4/8] media: venus: hfi_plat_v4: Add capabilities for the 4XX lite core Jorge Ramirez-Ortiz
@ 2025-08-08 8:52 ` Jorge Ramirez-Ortiz
2025-08-08 9:11 ` Bryan O'Donoghue
2025-08-08 10:16 ` Dikshita Agarwal
2025-08-08 8:52 ` [PATCH v9 6/8] media: venus: core: Add qcm2290 DT compatible and resource data Jorge Ramirez-Ortiz
` (3 subsequent siblings)
8 siblings, 2 replies; 23+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-08-08 8:52 UTC (permalink / raw)
To: jorge.ramirez, quic_vgarodia, quic_dikshita, bryan.odonoghue,
krzk+dt, konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
From: Jorge Ramirez-Ortiz <jorge@foundries.io>
Correctly sort the array of venus_dt_match entries.
Signed-off-by: Jorge Ramirez-Ortiz <jorge@foundries.io>
---
drivers/media/platform/qcom/venus/core.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
index adc38fbc9d79..9604a7eed49d 100644
--- a/drivers/media/platform/qcom/venus/core.c
+++ b/drivers/media/platform/qcom/venus/core.c
@@ -1074,11 +1074,11 @@ static const struct of_device_id venus_dt_match[] = {
{ .compatible = "qcom,msm8916-venus", .data = &msm8916_res, },
{ .compatible = "qcom,msm8996-venus", .data = &msm8996_res, },
{ .compatible = "qcom,msm8998-venus", .data = &msm8998_res, },
+ { .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
+ { .compatible = "qcom,sc7280-venus", .data = &sc7280_res, },
{ .compatible = "qcom,sdm660-venus", .data = &sdm660_res, },
{ .compatible = "qcom,sdm845-venus", .data = &sdm845_res, },
{ .compatible = "qcom,sdm845-venus-v2", .data = &sdm845_res_v2, },
- { .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
- { .compatible = "qcom,sc7280-venus", .data = &sc7280_res, },
{ .compatible = "qcom,sm8250-venus", .data = &sm8250_res, },
{ }
};
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v9 6/8] media: venus: core: Add qcm2290 DT compatible and resource data
2025-08-08 8:52 [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
` (4 preceding siblings ...)
2025-08-08 8:52 ` [PATCH v9 5/8] media: venus: core: Sort dt_match alphabetically Jorge Ramirez-Ortiz
@ 2025-08-08 8:52 ` Jorge Ramirez-Ortiz
2025-08-08 9:02 ` Bryan O'Donoghue
2025-08-08 10:15 ` Dikshita Agarwal
2025-08-08 8:52 ` [PATCH v9 7/8] arm64: dts: qcom: qcm2290: Add Venus video node Jorge Ramirez-Ortiz
` (2 subsequent siblings)
8 siblings, 2 replies; 23+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-08-08 8:52 UTC (permalink / raw)
To: jorge.ramirez, quic_vgarodia, quic_dikshita, bryan.odonoghue,
krzk+dt, konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
Add a qcm2290 compatible binding to the Venus core.
The maximum concurrency is video decode at 1920x1080 (FullHD) with video
encode at 1280x720 (HD).
The driver is not available to firmware versions below 6.0.55 due to an
internal requirement for secure buffers.
The bandwidth tables incorporate a conservative safety margin to ensure
stability under peak DDR and interconnect load conditions.
Co-developed-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Reviewed-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
drivers/media/platform/qcom/venus/core.c | 50 ++++++++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
index 9604a7eed49d..a7c960d1d818 100644
--- a/drivers/media/platform/qcom/venus/core.c
+++ b/drivers/media/platform/qcom/venus/core.c
@@ -1070,10 +1070,60 @@ static const struct venus_resources sc7280_res = {
.enc_nodename = "video-encoder",
};
+static const struct bw_tbl qcm2290_bw_table_dec[] = {
+ { 352800, 597000, 0, 746000, 0 }, /* 1080p@30 + 720p@30 */
+ { 244800, 413000, 0, 516000, 0 }, /* 1080p@30 */
+ { 216000, 364000, 0, 454000, 0 }, /* 720p@60 */
+ { 108000, 182000, 0, 227000, 0 }, /* 720p@30 */
+};
+
+static const struct bw_tbl qcm2290_bw_table_enc[] = {
+ { 352800, 396000, 0, 0, 0 }, /* 1080p@30 + 720p@30 */
+ { 244800, 275000, 0, 0, 0 }, /* 1080p@30 */
+ { 216000, 242000, 0, 0, 0 }, /* 720p@60 */
+ { 108000, 121000, 0, 0, 0 }, /* 720p@30 */
+};
+
+static const struct firmware_version min_fw = {
+ .major = 6, .minor = 0, .rev = 55,
+};
+
+static const struct venus_resources qcm2290_res = {
+ .bw_tbl_dec = qcm2290_bw_table_dec,
+ .bw_tbl_dec_size = ARRAY_SIZE(qcm2290_bw_table_dec),
+ .bw_tbl_enc = qcm2290_bw_table_enc,
+ .bw_tbl_enc_size = ARRAY_SIZE(qcm2290_bw_table_enc),
+ .clks = { "core", "iface", "bus", "throttle" },
+ .clks_num = 4,
+ .vcodec0_clks = { "vcodec0_core", "vcodec0_bus" },
+ .vcodec_clks_num = 2,
+ .vcodec_pmdomains = (const char *[]) { "venus", "vcodec0" },
+ .vcodec_pmdomains_num = 2,
+ .opp_pmdomain = (const char *[]) { "cx" },
+ .vcodec_num = 1,
+ .hfi_version = HFI_VERSION_4XX,
+ .vpu_version = VPU_VERSION_AR50_LITE,
+ .max_load = 352800,
+ .num_vpp_pipes = 1,
+ .vmem_id = VIDC_RESOURCE_NONE,
+ .vmem_size = 0,
+ .vmem_addr = 0,
+ .cp_start = 0,
+ .cp_size = 0x70800000,
+ .cp_nonpixel_start = 0x1000000,
+ .cp_nonpixel_size = 0x24800000,
+ .dma_mask = 0xe0000000 - 1,
+ .fwname = "qcom/venus-6.0/venus.mbn",
+ .dec_nodename = "video-decoder",
+ .enc_nodename = "video-encoder",
+ .min_fw = &min_fw,
+};
+
static const struct of_device_id venus_dt_match[] = {
{ .compatible = "qcom,msm8916-venus", .data = &msm8916_res, },
{ .compatible = "qcom,msm8996-venus", .data = &msm8996_res, },
{ .compatible = "qcom,msm8998-venus", .data = &msm8998_res, },
+ { .compatible = "qcom,qcm2290-venus", .data = &qcm2290_res, },
{ .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
{ .compatible = "qcom,sc7280-venus", .data = &sc7280_res, },
{ .compatible = "qcom,sdm660-venus", .data = &sdm660_res, },
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v9 7/8] arm64: dts: qcom: qcm2290: Add Venus video node
2025-08-08 8:52 [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
` (5 preceding siblings ...)
2025-08-08 8:52 ` [PATCH v9 6/8] media: venus: core: Add qcm2290 DT compatible and resource data Jorge Ramirez-Ortiz
@ 2025-08-08 8:52 ` Jorge Ramirez-Ortiz
2025-08-08 8:53 ` [PATCH v9 8/8] arm64: dts: qcom: qrb2210-rb1: Enable Venus Jorge Ramirez-Ortiz
2025-08-13 22:18 ` [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Bryan O'Donoghue
8 siblings, 0 replies; 23+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-08-08 8:52 UTC (permalink / raw)
To: jorge.ramirez, quic_vgarodia, quic_dikshita, bryan.odonoghue,
krzk+dt, konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
Add DT entries for the qcm2290 Venus encoder/decoder.
Co-developed-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
---
arch/arm64/boot/dts/qcom/qcm2290.dtsi | 55 +++++++++++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/qcm2290.dtsi b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
index f49ac1c1f8a3..7cfacd189a10 100644
--- a/arch/arm64/boot/dts/qcom/qcm2290.dtsi
+++ b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
@@ -1628,6 +1628,61 @@ adreno_smmu: iommu@59a0000 {
#iommu-cells = <2>;
};
+ venus: video-codec@5a00000 {
+ compatible = "qcom,qcm2290-venus";
+ reg = <0 0x5a00000 0 0xf0000>;
+ interrupts = <GIC_SPI 225 IRQ_TYPE_LEVEL_HIGH>;
+
+ power-domains = <&gcc GCC_VENUS_GDSC>,
+ <&gcc GCC_VCODEC0_GDSC>,
+ <&rpmpd QCM2290_VDDCX>;
+ power-domain-names = "venus",
+ "vcodec0",
+ "cx";
+ operating-points-v2 = <&venus_opp_table>;
+
+ clocks = <&gcc GCC_VIDEO_VENUS_CTL_CLK>,
+ <&gcc GCC_VIDEO_AHB_CLK>,
+ <&gcc GCC_VENUS_CTL_AXI_CLK>,
+ <&gcc GCC_VIDEO_THROTTLE_CORE_CLK>,
+ <&gcc GCC_VIDEO_VCODEC0_SYS_CLK>,
+ <&gcc GCC_VCODEC0_AXI_CLK>;
+ clock-names = "core",
+ "iface",
+ "bus",
+ "throttle",
+ "vcodec0_core",
+ "vcodec0_bus";
+
+ memory-region = <&pil_video_mem>;
+ iommus = <&apps_smmu 0x860 0x0>,
+ <&apps_smmu 0x880 0x0>,
+ <&apps_smmu 0x861 0x04>,
+ <&apps_smmu 0x863 0x0>,
+ <&apps_smmu 0x804 0xe0>;
+
+ interconnects = <&mmnrt_virt MASTER_VIDEO_P0 RPM_ALWAYS_TAG
+ &bimc SLAVE_EBI1 RPM_ALWAYS_TAG>,
+ <&bimc MASTER_APPSS_PROC RPM_ACTIVE_TAG
+ &config_noc SLAVE_VENUS_CFG RPM_ACTIVE_TAG>;
+ interconnect-names = "video-mem",
+ "cpu-cfg";
+
+ venus_opp_table: opp-table {
+ compatible = "operating-points-v2";
+
+ opp-133333333 {
+ opp-hz = /bits/ 64 <133333333>;
+ required-opps = <&rpmpd_opp_low_svs>;
+ };
+
+ opp-240000000 {
+ opp-hz = /bits/ 64 <240000000>;
+ required-opps = <&rpmpd_opp_svs>;
+ };
+ };
+ };
+
mdss: display-subsystem@5e00000 {
compatible = "qcom,qcm2290-mdss";
reg = <0x0 0x05e00000 0x0 0x1000>;
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v9 8/8] arm64: dts: qcom: qrb2210-rb1: Enable Venus
2025-08-08 8:52 [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
` (6 preceding siblings ...)
2025-08-08 8:52 ` [PATCH v9 7/8] arm64: dts: qcom: qcm2290: Add Venus video node Jorge Ramirez-Ortiz
@ 2025-08-08 8:53 ` Jorge Ramirez-Ortiz
2025-08-08 10:26 ` Dikshita Agarwal
2025-08-13 22:18 ` [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Bryan O'Donoghue
8 siblings, 1 reply; 23+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-08-08 8:53 UTC (permalink / raw)
To: jorge.ramirez, quic_vgarodia, quic_dikshita, bryan.odonoghue,
krzk+dt, konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
Enable Venus on the QRB2210 RB1 development board.
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
---
arch/arm64/boot/dts/qcom/qrb2210-rb1.dts | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/qrb2210-rb1.dts b/arch/arm64/boot/dts/qcom/qrb2210-rb1.dts
index b2e0fc5501c1..e92d0d6ad1b8 100644
--- a/arch/arm64/boot/dts/qcom/qrb2210-rb1.dts
+++ b/arch/arm64/boot/dts/qcom/qrb2210-rb1.dts
@@ -698,6 +698,10 @@ &usb_qmpphy_out {
remote-endpoint = <&pm4125_ss_in>;
};
+&venus {
+ status = "okay";
+};
+
&wifi {
vdd-0.8-cx-mx-supply = <&pm4125_l7>;
vdd-1.8-xo-supply = <&pm4125_l13>;
--
2.34.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v9 2/8] media: venus: Define minimum valid firmware version
2025-08-08 8:52 ` [PATCH v9 2/8] media: venus: Define minimum valid firmware version Jorge Ramirez-Ortiz
@ 2025-08-08 9:01 ` Bryan O'Donoghue
2025-08-08 10:13 ` Dikshita Agarwal
1 sibling, 0 replies; 23+ messages in thread
From: Bryan O'Donoghue @ 2025-08-08 9:01 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, quic_vgarodia, quic_dikshita, krzk+dt,
konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 08/08/2025 09:52, Jorge Ramirez-Ortiz wrote:
> Add support for specifying the minimum firmware version required for
> correct operation.
>
> When set, the driver compares this value against the version reported by
> the firmware: if the firmware is older than required, driver
> initialization will fail.
>
> The version check is performed before creating dynamic device tree
> nodes, to avoid the need for reverting nodes on failure.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/venus/core.c | 40 +++++++++++---------
> drivers/media/platform/qcom/venus/core.h | 13 ++++---
> drivers/media/platform/qcom/venus/firmware.c | 20 ++++++++++
> drivers/media/platform/qcom/venus/firmware.h | 1 +
> 4 files changed, 51 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> index 4c049c694d9c..f45715c9b222 100644
> --- a/drivers/media/platform/qcom/venus/core.c
> +++ b/drivers/media/platform/qcom/venus/core.c
> @@ -448,19 +448,9 @@ static int venus_probe(struct platform_device *pdev)
> if (ret < 0)
> goto err_runtime_disable;
>
> - if (core->res->dec_nodename || core->res->enc_nodename) {
> - ret = venus_add_dynamic_nodes(core);
> - if (ret)
> - goto err_runtime_disable;
> - }
> -
> - ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
> - if (ret)
> - goto err_remove_dynamic_nodes;
> -
> ret = venus_firmware_init(core);
> if (ret)
> - goto err_of_depopulate;
> + goto err_runtime_disable;
>
> ret = venus_boot(core);
> if (ret)
> @@ -474,34 +464,48 @@ static int venus_probe(struct platform_device *pdev)
> if (ret)
> goto err_venus_shutdown;
>
> - ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_DEC);
> + ret = venus_firmware_check(core);
> if (ret)
> goto err_core_deinit;
>
> + if (core->res->dec_nodename || core->res->enc_nodename) {
> + ret = venus_add_dynamic_nodes(core);
> + if (ret)
> + goto err_core_deinit;
> + }
> +
> + ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
> + if (ret)
> + goto err_remove_dynamic_nodes;
> +
> + ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_DEC);
> + if (ret)
> + goto err_of_depopulate;
> +
> ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_ENC);
> if (ret)
> - goto err_core_deinit;
> + goto err_of_depopulate;
>
> ret = pm_runtime_put_sync(dev);
> if (ret) {
> pm_runtime_get_noresume(dev);
> - goto err_core_deinit;
> + goto err_of_depopulate;
> }
>
> venus_dbgfs_init(core);
>
> return 0;
>
> +err_of_depopulate:
> + of_platform_depopulate(dev);
> +err_remove_dynamic_nodes:
> + venus_remove_dynamic_nodes(core);
> err_core_deinit:
> hfi_core_deinit(core, false);
> err_venus_shutdown:
> venus_shutdown(core);
> err_firmware_deinit:
> venus_firmware_deinit(core);
> -err_of_depopulate:
> - of_platform_depopulate(dev);
> -err_remove_dynamic_nodes:
> - venus_remove_dynamic_nodes(core);
> err_runtime_disable:
> pm_runtime_put_noidle(dev);
> pm_runtime_disable(dev);
> diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
> index 5b1ba1c69adb..d1f0e9979ba4 100644
> --- a/drivers/media/platform/qcom/venus/core.h
> +++ b/drivers/media/platform/qcom/venus/core.h
> @@ -58,6 +58,12 @@ enum vpu_version {
> VPU_VERSION_IRIS2_1,
> };
>
> +struct firmware_version {
> + u32 major;
> + u32 minor;
> + u32 rev;
> +};
> +
> struct venus_resources {
> u64 dma_mask;
> const struct freq_tbl *freq_tbl;
> @@ -94,6 +100,7 @@ struct venus_resources {
> const char *fwname;
> const char *enc_nodename;
> const char *dec_nodename;
> + const struct firmware_version *min_fw;
> };
>
> enum venus_fmt {
> @@ -231,11 +238,7 @@ struct venus_core {
> unsigned int core0_usage_count;
> unsigned int core1_usage_count;
> struct dentry *root;
> - struct venus_img_version {
> - u32 major;
> - u32 minor;
> - u32 rev;
> - } venus_ver;
> + struct firmware_version venus_ver;
> unsigned long dump_core;
> struct of_changeset *ocs;
> bool hwmode_dev;
> diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
> index 66a18830e66d..3666675ae298 100644
> --- a/drivers/media/platform/qcom/venus/firmware.c
> +++ b/drivers/media/platform/qcom/venus/firmware.c
> @@ -280,6 +280,26 @@ int venus_shutdown(struct venus_core *core)
> return ret;
> }
>
> +int venus_firmware_check(struct venus_core *core)
> +{
> + const struct firmware_version *req = core->res->min_fw;
> + const struct firmware_version *run = &core->venus_ver;
> +
> + if (!req)
> + return 0;
> +
> + if (!is_fw_rev_or_newer(core, req->major, req->minor, req->rev))
> + goto error;
> +
> + return 0;
> +error:
> + dev_err(core->dev, "Firmware v%d.%d.%d < v%d.%d.%d\n",
> + run->major, run->minor, run->rev,
> + req->major, req->minor, req->rev);
> +
> + return -EINVAL;
> +}
> +
> int venus_firmware_init(struct venus_core *core)
> {
> struct platform_device_info info;
> diff --git a/drivers/media/platform/qcom/venus/firmware.h b/drivers/media/platform/qcom/venus/firmware.h
> index aaccd847fa30..ead39e3797f0 100644
> --- a/drivers/media/platform/qcom/venus/firmware.h
> +++ b/drivers/media/platform/qcom/venus/firmware.h
> @@ -9,6 +9,7 @@ struct device;
>
> int venus_firmware_init(struct venus_core *core);
> void venus_firmware_deinit(struct venus_core *core);
> +int venus_firmware_check(struct venus_core *core);
> int venus_boot(struct venus_core *core);
> int venus_shutdown(struct venus_core *core);
> int venus_set_hw_state(struct venus_core *core, bool suspend);
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v9 6/8] media: venus: core: Add qcm2290 DT compatible and resource data
2025-08-08 8:52 ` [PATCH v9 6/8] media: venus: core: Add qcm2290 DT compatible and resource data Jorge Ramirez-Ortiz
@ 2025-08-08 9:02 ` Bryan O'Donoghue
2025-08-08 10:15 ` Dikshita Agarwal
1 sibling, 0 replies; 23+ messages in thread
From: Bryan O'Donoghue @ 2025-08-08 9:02 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, quic_vgarodia, quic_dikshita, krzk+dt,
konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 08/08/2025 09:52, Jorge Ramirez-Ortiz wrote:
> Add a qcm2290 compatible binding to the Venus core.
>
> The maximum concurrency is video decode at 1920x1080 (FullHD) with video
> encode at 1280x720 (HD).
>
> The driver is not available to firmware versions below 6.0.55 due to an
> internal requirement for secure buffers.
>
> The bandwidth tables incorporate a conservative safety margin to ensure
> stability under peak DDR and interconnect load conditions.
>
> Co-developed-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
> Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> Reviewed-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
> drivers/media/platform/qcom/venus/core.c | 50 ++++++++++++++++++++++++
> 1 file changed, 50 insertions(+)
>
> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> index 9604a7eed49d..a7c960d1d818 100644
> --- a/drivers/media/platform/qcom/venus/core.c
> +++ b/drivers/media/platform/qcom/venus/core.c
> @@ -1070,10 +1070,60 @@ static const struct venus_resources sc7280_res = {
> .enc_nodename = "video-encoder",
> };
>
> +static const struct bw_tbl qcm2290_bw_table_dec[] = {
> + { 352800, 597000, 0, 746000, 0 }, /* 1080p@30 + 720p@30 */
> + { 244800, 413000, 0, 516000, 0 }, /* 1080p@30 */
> + { 216000, 364000, 0, 454000, 0 }, /* 720p@60 */
> + { 108000, 182000, 0, 227000, 0 }, /* 720p@30 */
> +};
> +
> +static const struct bw_tbl qcm2290_bw_table_enc[] = {
> + { 352800, 396000, 0, 0, 0 }, /* 1080p@30 + 720p@30 */
> + { 244800, 275000, 0, 0, 0 }, /* 1080p@30 */
> + { 216000, 242000, 0, 0, 0 }, /* 720p@60 */
> + { 108000, 121000, 0, 0, 0 }, /* 720p@30 */
> +};
> +
> +static const struct firmware_version min_fw = {
> + .major = 6, .minor = 0, .rev = 55,
> +};
> +
> +static const struct venus_resources qcm2290_res = {
> + .bw_tbl_dec = qcm2290_bw_table_dec,
> + .bw_tbl_dec_size = ARRAY_SIZE(qcm2290_bw_table_dec),
> + .bw_tbl_enc = qcm2290_bw_table_enc,
> + .bw_tbl_enc_size = ARRAY_SIZE(qcm2290_bw_table_enc),
> + .clks = { "core", "iface", "bus", "throttle" },
> + .clks_num = 4,
> + .vcodec0_clks = { "vcodec0_core", "vcodec0_bus" },
> + .vcodec_clks_num = 2,
> + .vcodec_pmdomains = (const char *[]) { "venus", "vcodec0" },
> + .vcodec_pmdomains_num = 2,
> + .opp_pmdomain = (const char *[]) { "cx" },
> + .vcodec_num = 1,
> + .hfi_version = HFI_VERSION_4XX,
> + .vpu_version = VPU_VERSION_AR50_LITE,
> + .max_load = 352800,
> + .num_vpp_pipes = 1,
> + .vmem_id = VIDC_RESOURCE_NONE,
> + .vmem_size = 0,
> + .vmem_addr = 0,
> + .cp_start = 0,
> + .cp_size = 0x70800000,
> + .cp_nonpixel_start = 0x1000000,
> + .cp_nonpixel_size = 0x24800000,
> + .dma_mask = 0xe0000000 - 1,
> + .fwname = "qcom/venus-6.0/venus.mbn",
> + .dec_nodename = "video-decoder",
> + .enc_nodename = "video-encoder",
> + .min_fw = &min_fw,
> +};
> +
> static const struct of_device_id venus_dt_match[] = {
> { .compatible = "qcom,msm8916-venus", .data = &msm8916_res, },
> { .compatible = "qcom,msm8996-venus", .data = &msm8996_res, },
> { .compatible = "qcom,msm8998-venus", .data = &msm8998_res, },
> + { .compatible = "qcom,qcm2290-venus", .data = &qcm2290_res, },
> { .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
> { .compatible = "qcom,sc7280-venus", .data = &sc7280_res, },
> { .compatible = "qcom,sdm660-venus", .data = &sdm660_res, },
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v9 3/8] media: venus: Add framework support for AR50_LITE video core
2025-08-08 8:52 ` [PATCH v9 3/8] media: venus: Add framework support for AR50_LITE video core Jorge Ramirez-Ortiz
@ 2025-08-08 9:10 ` Bryan O'Donoghue
2025-08-11 10:03 ` Dikshita Agarwal
1 sibling, 0 replies; 23+ messages in thread
From: Bryan O'Donoghue @ 2025-08-08 9:10 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, quic_vgarodia, quic_dikshita, krzk+dt,
konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 08/08/2025 09:52, Jorge Ramirez-Ortiz wrote:
> The AR50_LITE is a simplified variant of the AR50 video core, designed for
> power and cost-efficient platforms.
>
> It supports hardware-accelerated decoding of H.264, HEVC, and VP9 formats,
> and provides encoding support for H.264 and HEVC.
>
> This commit prepares the framework to enable the AR50_LITE (it does not
> enable it).
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/venus/core.c | 15 ++++++--
> drivers/media/platform/qcom/venus/core.h | 5 +++
> drivers/media/platform/qcom/venus/firmware.c | 10 ++++++
> drivers/media/platform/qcom/venus/firmware.h | 1 +
> drivers/media/platform/qcom/venus/helpers.c | 12 +++++--
> .../media/platform/qcom/venus/hfi_parser.c | 2 +-
> .../media/platform/qcom/venus/hfi_platform.c | 23 ++++++++-----
> .../media/platform/qcom/venus/hfi_platform.h | 34 ++++++++++++-------
> .../platform/qcom/venus/hfi_platform_v4.c | 33 +++++++++++++-----
> .../platform/qcom/venus/hfi_platform_v6.c | 33 +++++++++++++-----
> drivers/media/platform/qcom/venus/hfi_venus.c | 25 ++++++++++----
> .../media/platform/qcom/venus/hfi_venus_io.h | 4 +++
> .../media/platform/qcom/venus/pm_helpers.c | 2 +-
> 13 files changed, 145 insertions(+), 54 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> index f45715c9b222..adc38fbc9d79 100644
> --- a/drivers/media/platform/qcom/venus/core.c
> +++ b/drivers/media/platform/qcom/venus/core.c
> @@ -254,14 +254,19 @@ static int venus_enumerate_codecs(struct venus_core *core, u32 type)
>
> static void venus_assign_register_offsets(struct venus_core *core)
> {
> - if (IS_IRIS2(core) || IS_IRIS2_1(core)) {
> - core->vbif_base = core->base + VBIF_BASE;
> + if (IS_IRIS2(core) || IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
> core->cpu_base = core->base + CPU_BASE_V6;
> core->cpu_cs_base = core->base + CPU_CS_BASE_V6;
> core->cpu_ic_base = core->base + CPU_IC_BASE_V6;
> core->wrapper_base = core->base + WRAPPER_BASE_V6;
> core->wrapper_tz_base = core->base + WRAPPER_TZ_BASE_V6;
> - core->aon_base = core->base + AON_BASE_V6;
> + if (IS_AR50_LITE(core)) {
> + core->vbif_base = NULL;
> + core->aon_base = NULL;
> + } else {
> + core->vbif_base = core->base + VBIF_BASE;
> + core->aon_base = core->base + AON_BASE_V6;
> + }
> } else {
> core->vbif_base = core->base + VBIF_BASE;
> core->cpu_base = core->base + CPU_BASE;
> @@ -456,6 +461,10 @@ static int venus_probe(struct platform_device *pdev)
> if (ret)
> goto err_firmware_deinit;
>
> + ret = venus_firmware_cfg(core);
> + if (ret)
> + goto err_venus_shutdown;
> +
> ret = hfi_core_resume(core, true);
> if (ret)
> goto err_venus_shutdown;
> diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
> index d1f0e9979ba4..ef80a7666597 100644
> --- a/drivers/media/platform/qcom/venus/core.h
> +++ b/drivers/media/platform/qcom/venus/core.h
> @@ -533,6 +533,11 @@ struct venus_inst {
> #define IS_IRIS2(core) ((core)->res->vpu_version == VPU_VERSION_IRIS2)
> #define IS_IRIS2_1(core) ((core)->res->vpu_version == VPU_VERSION_IRIS2_1)
>
> +static inline bool is_lite(struct venus_core *core)
> +{
> + return IS_AR50_LITE(core);
> +}
> +
> #define ctrl_to_inst(ctrl) \
> container_of((ctrl)->handler, struct venus_inst, ctrl_handler)
>
> diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
> index 3666675ae298..2483998360f7 100644
> --- a/drivers/media/platform/qcom/venus/firmware.c
> +++ b/drivers/media/platform/qcom/venus/firmware.c
> @@ -207,6 +207,16 @@ static int venus_shutdown_no_tz(struct venus_core *core)
> return 0;
> }
>
> +int venus_firmware_cfg(struct venus_core *core)
> +{
> + void __iomem *cpu_cs_base = core->cpu_cs_base;
> +
> + if (IS_AR50_LITE(core))
> + writel(CPU_CS_VCICMD_ARP_OFF, cpu_cs_base + CPU_CS_VCICMD);
> +
> + return 0;
> +}
> +
> int venus_boot(struct venus_core *core)
> {
> struct device *dev = core->dev;
> diff --git a/drivers/media/platform/qcom/venus/firmware.h b/drivers/media/platform/qcom/venus/firmware.h
> index ead39e3797f0..87e1d922b369 100644
> --- a/drivers/media/platform/qcom/venus/firmware.h
> +++ b/drivers/media/platform/qcom/venus/firmware.h
> @@ -10,6 +10,7 @@ struct device;
> int venus_firmware_init(struct venus_core *core);
> void venus_firmware_deinit(struct venus_core *core);
> int venus_firmware_check(struct venus_core *core);
> +int venus_firmware_cfg(struct venus_core *core);
> int venus_boot(struct venus_core *core);
> int venus_shutdown(struct venus_core *core);
> int venus_set_hw_state(struct venus_core *core, bool suspend);
> diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c
> index 8295542e1a7c..2e4363f82231 100644
> --- a/drivers/media/platform/qcom/venus/helpers.c
> +++ b/drivers/media/platform/qcom/venus/helpers.c
> @@ -1715,11 +1715,17 @@ int venus_helper_session_init(struct venus_inst *inst)
> if (ret)
> return ret;
>
> - inst->clk_data.vpp_freq = hfi_platform_get_codec_vpp_freq(version, codec,
> + inst->clk_data.vpp_freq = hfi_platform_get_codec_vpp_freq(inst->core,
> + version,
> + codec,
> session_type);
> - inst->clk_data.vsp_freq = hfi_platform_get_codec_vsp_freq(version, codec,
> + inst->clk_data.vsp_freq = hfi_platform_get_codec_vsp_freq(inst->core,
> + version,
> + codec,
> session_type);
> - inst->clk_data.low_power_freq = hfi_platform_get_codec_lp_freq(version, codec,
> + inst->clk_data.low_power_freq = hfi_platform_get_codec_lp_freq(inst->core,
> + version,
> + codec,
> session_type);
>
> return 0;
> diff --git a/drivers/media/platform/qcom/venus/hfi_parser.c b/drivers/media/platform/qcom/venus/hfi_parser.c
> index 1b3db2caa99f..92765f9c8873 100644
> --- a/drivers/media/platform/qcom/venus/hfi_parser.c
> +++ b/drivers/media/platform/qcom/venus/hfi_parser.c
> @@ -282,7 +282,7 @@ static int hfi_platform_parser(struct venus_core *core, struct venus_inst *inst)
> return ret;
>
> if (plat->capabilities)
> - caps = plat->capabilities(&entries);
> + caps = plat->capabilities(core, &entries);
>
> if (!caps || !entries || !count)
> return -EINVAL;
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
> index 643e5aa138f5..cde7f93045ac 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform.c
> +++ b/drivers/media/platform/qcom/venus/hfi_platform.c
> @@ -21,7 +21,9 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
> }
>
> unsigned long
> -hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec, u32 session_type)
> +hfi_platform_get_codec_vpp_freq(struct venus_core *core,
> + enum hfi_version version, u32 codec,
> + u32 session_type)
> {
> const struct hfi_platform *plat;
> unsigned long freq = 0;
> @@ -31,13 +33,15 @@ hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec, u32 session
> return 0;
>
> if (plat->codec_vpp_freq)
> - freq = plat->codec_vpp_freq(session_type, codec);
> + freq = plat->codec_vpp_freq(core, session_type, codec);
>
> return freq;
> }
>
> unsigned long
> -hfi_platform_get_codec_vsp_freq(enum hfi_version version, u32 codec, u32 session_type)
> +hfi_platform_get_codec_vsp_freq(struct venus_core *core,
> + enum hfi_version version, u32 codec,
> + u32 session_type)
> {
> const struct hfi_platform *plat;
> unsigned long freq = 0;
> @@ -47,13 +51,15 @@ hfi_platform_get_codec_vsp_freq(enum hfi_version version, u32 codec, u32 session
> return 0;
>
> if (plat->codec_vpp_freq)
> - freq = plat->codec_vsp_freq(session_type, codec);
> + freq = plat->codec_vsp_freq(core, session_type, codec);
>
> return freq;
> }
>
> unsigned long
> -hfi_platform_get_codec_lp_freq(enum hfi_version version, u32 codec, u32 session_type)
> +hfi_platform_get_codec_lp_freq(struct venus_core *core,
> + enum hfi_version version, u32 codec,
> + u32 session_type)
> {
> const struct hfi_platform *plat;
> unsigned long freq = 0;
> @@ -63,13 +69,14 @@ hfi_platform_get_codec_lp_freq(enum hfi_version version, u32 codec, u32 session_
> return 0;
>
> if (plat->codec_lp_freq)
> - freq = plat->codec_lp_freq(session_type, codec);
> + freq = plat->codec_lp_freq(core, session_type, codec);
>
> return freq;
> }
>
> int
> -hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> +hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs,
> + u32 *dec_codecs, u32 *count)
> {
> const struct hfi_platform *plat;
>
> @@ -78,7 +85,7 @@ hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs, u32 *dec_codec
> return -EINVAL;
>
> if (plat->codecs)
> - plat->codecs(enc_codecs, dec_codecs, count);
> + plat->codecs(core, enc_codecs, dec_codecs, count);
>
> if (IS_IRIS2_1(core)) {
> *enc_codecs &= ~HFI_VIDEO_CODEC_VP8;
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
> index ec89a90a8129..5e4f8013a6b1 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform.h
> +++ b/drivers/media/platform/qcom/venus/hfi_platform.h
> @@ -47,11 +47,16 @@ struct hfi_platform_codec_freq_data {
> };
>
> struct hfi_platform {
> - unsigned long (*codec_vpp_freq)(u32 session_type, u32 codec);
> - unsigned long (*codec_vsp_freq)(u32 session_type, u32 codec);
> - unsigned long (*codec_lp_freq)(u32 session_type, u32 codec);
> - void (*codecs)(u32 *enc_codecs, u32 *dec_codecs, u32 *count);
> - const struct hfi_plat_caps *(*capabilities)(unsigned int *entries);
> + unsigned long (*codec_vpp_freq)(struct venus_core *core,
> + u32 session_type, u32 codec);
> + unsigned long (*codec_vsp_freq)(struct venus_core *core,
> + u32 session_type, u32 codec);
> + unsigned long (*codec_lp_freq)(struct venus_core *core,
> + u32 session_type, u32 codec);
> + void (*codecs)(struct venus_core *core, u32 *enc_codecs,
> + u32 *dec_codecs, u32 *count);
> + const struct hfi_plat_caps *(*capabilities)(struct venus_core *core,
> + unsigned int *entries);
> int (*bufreq)(struct hfi_plat_buffers_params *params, u32 session_type,
> u32 buftype, struct hfi_buffer_requirements *bufreq);
> };
> @@ -60,12 +65,15 @@ extern const struct hfi_platform hfi_plat_v4;
> extern const struct hfi_platform hfi_plat_v6;
>
> const struct hfi_platform *hfi_platform_get(enum hfi_version version);
> -unsigned long hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec,
> - u32 session_type);
> -unsigned long hfi_platform_get_codec_vsp_freq(enum hfi_version version, u32 codec,
> - u32 session_type);
> -unsigned long hfi_platform_get_codec_lp_freq(enum hfi_version version, u32 codec,
> - u32 session_type);
> -int hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs, u32 *dec_codecs,
> - u32 *count);
> +unsigned long hfi_platform_get_codec_vpp_freq(struct venus_core *core,
> + enum hfi_version version,
> + u32 codec, u32 session_type);
> +unsigned long hfi_platform_get_codec_vsp_freq(struct venus_core *core,
> + enum hfi_version version,
> + u32 codec, u32 session_type);
> +unsigned long hfi_platform_get_codec_lp_freq(struct venus_core *core,
> + enum hfi_version version,
> + u32 codec, u32 session_type);
> +int hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs,
> + u32 *dec_codecs, u32 *count);
> #endif
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v4.c b/drivers/media/platform/qcom/venus/hfi_platform_v4.c
> index e3f0a90a567b..41e4dc28ec1b 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform_v4.c
> +++ b/drivers/media/platform/qcom/venus/hfi_platform_v4.c
> @@ -2,6 +2,7 @@
> /*
> * Copyright (c) 2020, The Linux Foundation. All rights reserved.
> */
> +#include "core.h"
> #include "hfi_platform.h"
>
> static const struct hfi_plat_caps caps[] = {
> @@ -245,14 +246,22 @@ static const struct hfi_plat_caps caps[] = {
> .num_fmts = 4,
> } };
>
> -static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
> +static const struct hfi_plat_caps *get_capabilities(struct venus_core *core,
> + unsigned int *entries)
> {
> + if (is_lite(core))
> + return NULL;
> +
> *entries = ARRAY_SIZE(caps);
> return caps;
> }
>
> -static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> +static void get_codecs(struct venus_core *core,
> + u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> {
> + if (is_lite(core))
> + return;
> +
> *enc_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> HFI_VIDEO_CODEC_VP8;
> *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> @@ -273,12 +282,15 @@ static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
> };
>
> static const struct hfi_platform_codec_freq_data *
> -get_codec_freq_data(u32 session_type, u32 pixfmt)
> +get_codec_freq_data(struct venus_core *core, u32 session_type, u32 pixfmt)
> {
> const struct hfi_platform_codec_freq_data *data = codec_freq_data;
> unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
> const struct hfi_platform_codec_freq_data *found = NULL;
>
> + if (is_lite(core))
> + return NULL;
> +
> for (i = 0; i < data_size; i++) {
> if (data[i].pixfmt == pixfmt && data[i].session_type == session_type) {
> found = &data[i];
> @@ -289,33 +301,36 @@ get_codec_freq_data(u32 session_type, u32 pixfmt)
> return found;
> }
>
> -static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
> +static unsigned long codec_vpp_freq(struct venus_core *core,
> + u32 session_type, u32 codec)
> {
> const struct hfi_platform_codec_freq_data *data;
>
> - data = get_codec_freq_data(session_type, codec);
> + data = get_codec_freq_data(core, session_type, codec);
> if (data)
> return data->vpp_freq;
>
> return 0;
> }
>
> -static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
> +static unsigned long codec_vsp_freq(struct venus_core *core,
> + u32 session_type, u32 codec)
> {
> const struct hfi_platform_codec_freq_data *data;
>
> - data = get_codec_freq_data(session_type, codec);
> + data = get_codec_freq_data(core, session_type, codec);
> if (data)
> return data->vsp_freq;
>
> return 0;
> }
>
> -static unsigned long codec_lp_freq(u32 session_type, u32 codec)
> +static unsigned long codec_lp_freq(struct venus_core *core,
> + u32 session_type, u32 codec)
> {
> const struct hfi_platform_codec_freq_data *data;
>
> - data = get_codec_freq_data(session_type, codec);
> + data = get_codec_freq_data(core, session_type, codec);
> if (data)
> return data->low_power_freq;
>
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6.c b/drivers/media/platform/qcom/venus/hfi_platform_v6.c
> index 4e8af645f8b9..d8568c08cc36 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform_v6.c
> +++ b/drivers/media/platform/qcom/venus/hfi_platform_v6.c
> @@ -2,6 +2,7 @@
> /*
> * Copyright (c) 2020, The Linux Foundation. All rights reserved.
> */
> +#include "core.h"
> #include "hfi_platform.h"
>
> static const struct hfi_plat_caps caps[] = {
> @@ -245,14 +246,22 @@ static const struct hfi_plat_caps caps[] = {
> .num_fmts = 4,
> } };
>
> -static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
> +static const struct hfi_plat_caps *get_capabilities(struct venus_core *core,
> + unsigned int *entries)
> {
> + if (is_lite(core))
> + return NULL;
> +
> *entries = ARRAY_SIZE(caps);
> return caps;
> }
>
> -static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> +static void get_codecs(struct venus_core *core, u32 *enc_codecs,
> + u32 *dec_codecs, u32 *count)
> {
> + if (is_lite(core))
> + return;
> +
> *enc_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> HFI_VIDEO_CODEC_VP8;
> *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> @@ -273,12 +282,15 @@ static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
> };
>
> static const struct hfi_platform_codec_freq_data *
> -get_codec_freq_data(u32 session_type, u32 pixfmt)
> +get_codec_freq_data(struct venus_core *core, u32 session_type, u32 pixfmt)
> {
> const struct hfi_platform_codec_freq_data *data = codec_freq_data;
> unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
> const struct hfi_platform_codec_freq_data *found = NULL;
>
> + if (is_lite(core))
> + return NULL;
> +
> for (i = 0; i < data_size; i++) {
> if (data[i].pixfmt == pixfmt && data[i].session_type == session_type) {
> found = &data[i];
> @@ -289,33 +301,36 @@ get_codec_freq_data(u32 session_type, u32 pixfmt)
> return found;
> }
>
> -static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
> +static unsigned long codec_vpp_freq(struct venus_core *core, u32 session_type,
> + u32 codec)
> {
> const struct hfi_platform_codec_freq_data *data;
>
> - data = get_codec_freq_data(session_type, codec);
> + data = get_codec_freq_data(core, session_type, codec);
> if (data)
> return data->vpp_freq;
>
> return 0;
> }
>
> -static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
> +static unsigned long codec_vsp_freq(struct venus_core *core, u32 session_type,
> + u32 codec)
> {
> const struct hfi_platform_codec_freq_data *data;
>
> - data = get_codec_freq_data(session_type, codec);
> + data = get_codec_freq_data(core, session_type, codec);
> if (data)
> return data->vsp_freq;
>
> return 0;
> }
>
> -static unsigned long codec_lp_freq(u32 session_type, u32 codec)
> +static unsigned long codec_lp_freq(struct venus_core *core, u32 session_type,
> + u32 codec)
> {
> const struct hfi_platform_codec_freq_data *data;
>
> - data = get_codec_freq_data(session_type, codec);
> + data = get_codec_freq_data(core, session_type, codec);
> if (data)
> return data->low_power_freq;
>
> diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c
> index cec7f5964d3d..d3da35f67fd5 100644
> --- a/drivers/media/platform/qcom/venus/hfi_venus.c
> +++ b/drivers/media/platform/qcom/venus/hfi_venus.c
> @@ -380,7 +380,7 @@ static void venus_soft_int(struct venus_hfi_device *hdev)
> void __iomem *cpu_ic_base = hdev->core->cpu_ic_base;
> u32 clear_bit;
>
> - if (IS_V6(hdev->core))
> + if (IS_V6(hdev->core) || (IS_V4(hdev->core) && is_lite(hdev->core)))
> clear_bit = BIT(CPU_IC_SOFTINT_H2A_SHIFT_V6);
> else
> clear_bit = BIT(CPU_IC_SOFTINT_H2A_SHIFT);
> @@ -501,9 +501,11 @@ static int venus_boot_core(struct venus_hfi_device *hdev)
> if (count >= max_tries)
> ret = -ETIMEDOUT;
>
> - if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core)) {
> + if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core) || IS_AR50_LITE(hdev->core)) {
> writel(0x1, cpu_cs_base + CPU_CS_H2XSOFTINTEN_V6);
> - writel(0x0, cpu_cs_base + CPU_CS_X2RPMH_V6);
> +
> + if (!IS_AR50_LITE(hdev->core))
> + writel(0x0, cpu_cs_base + CPU_CS_X2RPMH_V6);
> }
>
> return ret;
> @@ -569,6 +571,9 @@ static int venus_halt_axi(struct venus_hfi_device *hdev)
> u32 mask_val;
> int ret;
>
> + if (IS_AR50_LITE(hdev->core))
> + return 0;
> +
> if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core)) {
> writel(0x3, cpu_cs_base + CPU_CS_X2RPMH_V6);
>
> @@ -1138,7 +1143,13 @@ static irqreturn_t venus_isr(struct venus_core *core)
> wrapper_base = hdev->core->wrapper_base;
>
> status = readl(wrapper_base + WRAPPER_INTR_STATUS);
> - if (IS_IRIS2(core) || IS_IRIS2_1(core)) {
> +
> + if (IS_AR50_LITE(core)) {
> + if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
> + status & WRAPPER_INTR_STATUS_A2HWD_MASK_V4_LITE ||
> + status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
> + hdev->irq_status = status;
> + } else if (IS_IRIS2(core) || IS_IRIS2_1(core)) {
> if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
> status & WRAPPER_INTR_STATUS_A2HWD_MASK_V6 ||
> status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
> @@ -1150,7 +1161,7 @@ static irqreturn_t venus_isr(struct venus_core *core)
> hdev->irq_status = status;
> }
> writel(1, cpu_cs_base + CPU_CS_A2HSOFTINTCLR);
> - if (!(IS_IRIS2(core) || IS_IRIS2_1(core)))
> + if (!(IS_IRIS2(core) || IS_IRIS2_1(core) || IS_AR50_LITE(core)))
> writel(status, wrapper_base + WRAPPER_INTR_CLEAR);
>
> return IRQ_WAKE_THREAD;
> @@ -1535,7 +1546,7 @@ static bool venus_cpu_and_video_core_idle(struct venus_hfi_device *hdev)
> void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
> u32 ctrl_status, cpu_status;
>
> - if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core))
> + if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core) || IS_AR50_LITE(hdev->core))
> cpu_status = readl(wrapper_tz_base + WRAPPER_TZ_CPU_STATUS_V6);
> else
> cpu_status = readl(wrapper_base + WRAPPER_CPU_STATUS);
> @@ -1555,7 +1566,7 @@ static bool venus_cpu_idle_and_pc_ready(struct venus_hfi_device *hdev)
> void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
> u32 ctrl_status, cpu_status;
>
> - if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core))
> + if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core) || IS_AR50_LITE(hdev->core))
> cpu_status = readl(wrapper_tz_base + WRAPPER_TZ_CPU_STATUS_V6);
> else
> cpu_status = readl(wrapper_base + WRAPPER_CPU_STATUS);
> diff --git a/drivers/media/platform/qcom/venus/hfi_venus_io.h b/drivers/media/platform/qcom/venus/hfi_venus_io.h
> index 9735a246ce36..f2c3064c44ae 100644
> --- a/drivers/media/platform/qcom/venus/hfi_venus_io.h
> +++ b/drivers/media/platform/qcom/venus/hfi_venus_io.h
> @@ -51,6 +51,9 @@
> /* Venus cpu */
> #define CPU_CS_SCIACMDARG3 0x58
>
> +#define CPU_CS_VCICMD 0x20
> +#define CPU_CS_VCICMD_ARP_OFF BIT(0)
> +
> #define SFR_ADDR 0x5c
> #define MMAP_ADDR 0x60
> #define UC_REGION_ADDR 0x64
> @@ -100,6 +103,7 @@
> #define WRAPPER_INTR_MASK_A2HCPU_MASK 0x4
> #define WRAPPER_INTR_MASK_A2HCPU_SHIFT 0x2
>
> +#define WRAPPER_INTR_STATUS_A2HWD_MASK_V4_LITE 0x10
> #define WRAPPER_INTR_STATUS_A2HWD_MASK_V6 0x8
> #define WRAPPER_INTR_MASK_A2HWD_BASK_V6 0x8
>
> diff --git a/drivers/media/platform/qcom/venus/pm_helpers.c b/drivers/media/platform/qcom/venus/pm_helpers.c
> index 8dd5a9b0d060..e09b0d9ae610 100644
> --- a/drivers/media/platform/qcom/venus/pm_helpers.c
> +++ b/drivers/media/platform/qcom/venus/pm_helpers.c
> @@ -51,7 +51,7 @@ static int core_clks_enable(struct venus_core *core)
> dev_pm_opp_put(opp);
>
> for (i = 0; i < res->clks_num; i++) {
> - if (IS_V6(core)) {
> + if (IS_V6(core) || (IS_V4(core) && is_lite(core))) {
> ret = clk_set_rate(core->clks[i], freq);
> if (ret)
> goto err;
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v9 5/8] media: venus: core: Sort dt_match alphabetically.
2025-08-08 8:52 ` [PATCH v9 5/8] media: venus: core: Sort dt_match alphabetically Jorge Ramirez-Ortiz
@ 2025-08-08 9:11 ` Bryan O'Donoghue
2025-08-08 10:16 ` Dikshita Agarwal
1 sibling, 0 replies; 23+ messages in thread
From: Bryan O'Donoghue @ 2025-08-08 9:11 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, quic_vgarodia, quic_dikshita, krzk+dt,
konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 08/08/2025 09:52, Jorge Ramirez-Ortiz wrote:
> From: Jorge Ramirez-Ortiz <jorge@foundries.io>
>
> Correctly sort the array of venus_dt_match entries.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge@foundries.io>
> ---
> drivers/media/platform/qcom/venus/core.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> index adc38fbc9d79..9604a7eed49d 100644
> --- a/drivers/media/platform/qcom/venus/core.c
> +++ b/drivers/media/platform/qcom/venus/core.c
> @@ -1074,11 +1074,11 @@ static const struct of_device_id venus_dt_match[] = {
> { .compatible = "qcom,msm8916-venus", .data = &msm8916_res, },
> { .compatible = "qcom,msm8996-venus", .data = &msm8996_res, },
> { .compatible = "qcom,msm8998-venus", .data = &msm8998_res, },
> + { .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
> + { .compatible = "qcom,sc7280-venus", .data = &sc7280_res, },
> { .compatible = "qcom,sdm660-venus", .data = &sdm660_res, },
> { .compatible = "qcom,sdm845-venus", .data = &sdm845_res, },
> { .compatible = "qcom,sdm845-venus-v2", .data = &sdm845_res_v2, },
> - { .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
> - { .compatible = "qcom,sc7280-venus", .data = &sc7280_res, },
> { .compatible = "qcom,sm8250-venus", .data = &sm8250_res, },
> { }
> };
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v9 2/8] media: venus: Define minimum valid firmware version
2025-08-08 8:52 ` [PATCH v9 2/8] media: venus: Define minimum valid firmware version Jorge Ramirez-Ortiz
2025-08-08 9:01 ` Bryan O'Donoghue
@ 2025-08-08 10:13 ` Dikshita Agarwal
1 sibling, 0 replies; 23+ messages in thread
From: Dikshita Agarwal @ 2025-08-08 10:13 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, quic_vgarodia, bryan.odonoghue, krzk+dt,
konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 8/8/2025 2:22 PM, Jorge Ramirez-Ortiz wrote:
> Add support for specifying the minimum firmware version required for
> correct operation.
>
> When set, the driver compares this value against the version reported by
> the firmware: if the firmware is older than required, driver
> initialization will fail.
>
> The version check is performed before creating dynamic device tree
> nodes, to avoid the need for reverting nodes on failure.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/venus/core.c | 40 +++++++++++---------
> drivers/media/platform/qcom/venus/core.h | 13 ++++---
> drivers/media/platform/qcom/venus/firmware.c | 20 ++++++++++
> drivers/media/platform/qcom/venus/firmware.h | 1 +
> 4 files changed, 51 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> index 4c049c694d9c..f45715c9b222 100644
> --- a/drivers/media/platform/qcom/venus/core.c
> +++ b/drivers/media/platform/qcom/venus/core.c
> @@ -448,19 +448,9 @@ static int venus_probe(struct platform_device *pdev)
> if (ret < 0)
> goto err_runtime_disable;
>
> - if (core->res->dec_nodename || core->res->enc_nodename) {
> - ret = venus_add_dynamic_nodes(core);
> - if (ret)
> - goto err_runtime_disable;
> - }
> -
> - ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
> - if (ret)
> - goto err_remove_dynamic_nodes;
> -
> ret = venus_firmware_init(core);
> if (ret)
> - goto err_of_depopulate;
> + goto err_runtime_disable;
>
> ret = venus_boot(core);
> if (ret)
> @@ -474,34 +464,48 @@ static int venus_probe(struct platform_device *pdev)
> if (ret)
> goto err_venus_shutdown;
>
> - ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_DEC);
> + ret = venus_firmware_check(core);
> if (ret)
> goto err_core_deinit;
>
> + if (core->res->dec_nodename || core->res->enc_nodename) {
> + ret = venus_add_dynamic_nodes(core);
> + if (ret)
> + goto err_core_deinit;
> + }
> +
> + ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
> + if (ret)
> + goto err_remove_dynamic_nodes;
> +
> + ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_DEC);
> + if (ret)
> + goto err_of_depopulate;
> +
> ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_ENC);
> if (ret)
> - goto err_core_deinit;
> + goto err_of_depopulate;
>
> ret = pm_runtime_put_sync(dev);
> if (ret) {
> pm_runtime_get_noresume(dev);
> - goto err_core_deinit;
> + goto err_of_depopulate;
> }
>
> venus_dbgfs_init(core);
>
> return 0;
>
> +err_of_depopulate:
> + of_platform_depopulate(dev);
> +err_remove_dynamic_nodes:
> + venus_remove_dynamic_nodes(core);
> err_core_deinit:
> hfi_core_deinit(core, false);
> err_venus_shutdown:
> venus_shutdown(core);
> err_firmware_deinit:
> venus_firmware_deinit(core);
> -err_of_depopulate:
> - of_platform_depopulate(dev);
> -err_remove_dynamic_nodes:
> - venus_remove_dynamic_nodes(core);
> err_runtime_disable:
> pm_runtime_put_noidle(dev);
> pm_runtime_disable(dev);
> diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
> index 5b1ba1c69adb..d1f0e9979ba4 100644
> --- a/drivers/media/platform/qcom/venus/core.h
> +++ b/drivers/media/platform/qcom/venus/core.h
> @@ -58,6 +58,12 @@ enum vpu_version {
> VPU_VERSION_IRIS2_1,
> };
>
> +struct firmware_version {
> + u32 major;
> + u32 minor;
> + u32 rev;
> +};
> +
> struct venus_resources {
> u64 dma_mask;
> const struct freq_tbl *freq_tbl;
> @@ -94,6 +100,7 @@ struct venus_resources {
> const char *fwname;
> const char *enc_nodename;
> const char *dec_nodename;
> + const struct firmware_version *min_fw;
> };
>
> enum venus_fmt {
> @@ -231,11 +238,7 @@ struct venus_core {
> unsigned int core0_usage_count;
> unsigned int core1_usage_count;
> struct dentry *root;
> - struct venus_img_version {
> - u32 major;
> - u32 minor;
> - u32 rev;
> - } venus_ver;
> + struct firmware_version venus_ver;
> unsigned long dump_core;
> struct of_changeset *ocs;
> bool hwmode_dev;
> diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
> index 66a18830e66d..3666675ae298 100644
> --- a/drivers/media/platform/qcom/venus/firmware.c
> +++ b/drivers/media/platform/qcom/venus/firmware.c
> @@ -280,6 +280,26 @@ int venus_shutdown(struct venus_core *core)
> return ret;
> }
>
> +int venus_firmware_check(struct venus_core *core)
> +{
> + const struct firmware_version *req = core->res->min_fw;
> + const struct firmware_version *run = &core->venus_ver;
> +
> + if (!req)
> + return 0;
> +
> + if (!is_fw_rev_or_newer(core, req->major, req->minor, req->rev))
> + goto error;
> +
> + return 0;
> +error:
> + dev_err(core->dev, "Firmware v%d.%d.%d < v%d.%d.%d\n",
> + run->major, run->minor, run->rev,
> + req->major, req->minor, req->rev);
> +
> + return -EINVAL;
> +}
> +
> int venus_firmware_init(struct venus_core *core)
> {
> struct platform_device_info info;
> diff --git a/drivers/media/platform/qcom/venus/firmware.h b/drivers/media/platform/qcom/venus/firmware.h
> index aaccd847fa30..ead39e3797f0 100644
> --- a/drivers/media/platform/qcom/venus/firmware.h
> +++ b/drivers/media/platform/qcom/venus/firmware.h
> @@ -9,6 +9,7 @@ struct device;
>
> int venus_firmware_init(struct venus_core *core);
> void venus_firmware_deinit(struct venus_core *core);
> +int venus_firmware_check(struct venus_core *core);
> int venus_boot(struct venus_core *core);
> int venus_shutdown(struct venus_core *core);
> int venus_set_hw_state(struct venus_core *core, bool suspend);
Reviewed-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v9 6/8] media: venus: core: Add qcm2290 DT compatible and resource data
2025-08-08 8:52 ` [PATCH v9 6/8] media: venus: core: Add qcm2290 DT compatible and resource data Jorge Ramirez-Ortiz
2025-08-08 9:02 ` Bryan O'Donoghue
@ 2025-08-08 10:15 ` Dikshita Agarwal
1 sibling, 0 replies; 23+ messages in thread
From: Dikshita Agarwal @ 2025-08-08 10:15 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, quic_vgarodia, bryan.odonoghue, krzk+dt,
konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 8/8/2025 2:22 PM, Jorge Ramirez-Ortiz wrote:
> Add a qcm2290 compatible binding to the Venus core.
>
> The maximum concurrency is video decode at 1920x1080 (FullHD) with video
> encode at 1280x720 (HD).
>
> The driver is not available to firmware versions below 6.0.55 due to an
> internal requirement for secure buffers.
>
> The bandwidth tables incorporate a conservative safety margin to ensure
> stability under peak DDR and interconnect load conditions.
>
> Co-developed-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
> Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> Reviewed-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
> drivers/media/platform/qcom/venus/core.c | 50 ++++++++++++++++++++++++
> 1 file changed, 50 insertions(+)
>
> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> index 9604a7eed49d..a7c960d1d818 100644
> --- a/drivers/media/platform/qcom/venus/core.c
> +++ b/drivers/media/platform/qcom/venus/core.c
> @@ -1070,10 +1070,60 @@ static const struct venus_resources sc7280_res = {
> .enc_nodename = "video-encoder",
> };
>
> +static const struct bw_tbl qcm2290_bw_table_dec[] = {
> + { 352800, 597000, 0, 746000, 0 }, /* 1080p@30 + 720p@30 */
> + { 244800, 413000, 0, 516000, 0 }, /* 1080p@30 */
> + { 216000, 364000, 0, 454000, 0 }, /* 720p@60 */
> + { 108000, 182000, 0, 227000, 0 }, /* 720p@30 */
> +};
> +
> +static const struct bw_tbl qcm2290_bw_table_enc[] = {
> + { 352800, 396000, 0, 0, 0 }, /* 1080p@30 + 720p@30 */
> + { 244800, 275000, 0, 0, 0 }, /* 1080p@30 */
> + { 216000, 242000, 0, 0, 0 }, /* 720p@60 */
> + { 108000, 121000, 0, 0, 0 }, /* 720p@30 */
> +};
> +
> +static const struct firmware_version min_fw = {
> + .major = 6, .minor = 0, .rev = 55,
> +};
> +
> +static const struct venus_resources qcm2290_res = {
> + .bw_tbl_dec = qcm2290_bw_table_dec,
> + .bw_tbl_dec_size = ARRAY_SIZE(qcm2290_bw_table_dec),
> + .bw_tbl_enc = qcm2290_bw_table_enc,
> + .bw_tbl_enc_size = ARRAY_SIZE(qcm2290_bw_table_enc),
> + .clks = { "core", "iface", "bus", "throttle" },
> + .clks_num = 4,
> + .vcodec0_clks = { "vcodec0_core", "vcodec0_bus" },
> + .vcodec_clks_num = 2,
> + .vcodec_pmdomains = (const char *[]) { "venus", "vcodec0" },
> + .vcodec_pmdomains_num = 2,
> + .opp_pmdomain = (const char *[]) { "cx" },
> + .vcodec_num = 1,
> + .hfi_version = HFI_VERSION_4XX,
> + .vpu_version = VPU_VERSION_AR50_LITE,
> + .max_load = 352800,
> + .num_vpp_pipes = 1,
> + .vmem_id = VIDC_RESOURCE_NONE,
> + .vmem_size = 0,
> + .vmem_addr = 0,
> + .cp_start = 0,
> + .cp_size = 0x70800000,
> + .cp_nonpixel_start = 0x1000000,
> + .cp_nonpixel_size = 0x24800000,
> + .dma_mask = 0xe0000000 - 1,
> + .fwname = "qcom/venus-6.0/venus.mbn",
> + .dec_nodename = "video-decoder",
> + .enc_nodename = "video-encoder",
> + .min_fw = &min_fw,
> +};
> +
> static const struct of_device_id venus_dt_match[] = {
> { .compatible = "qcom,msm8916-venus", .data = &msm8916_res, },
> { .compatible = "qcom,msm8996-venus", .data = &msm8996_res, },
> { .compatible = "qcom,msm8998-venus", .data = &msm8998_res, },
> + { .compatible = "qcom,qcm2290-venus", .data = &qcm2290_res, },
> { .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
> { .compatible = "qcom,sc7280-venus", .data = &sc7280_res, },
> { .compatible = "qcom,sdm660-venus", .data = &sdm660_res, },
Reviewed-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
Thanks,
Dikshita
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v9 5/8] media: venus: core: Sort dt_match alphabetically.
2025-08-08 8:52 ` [PATCH v9 5/8] media: venus: core: Sort dt_match alphabetically Jorge Ramirez-Ortiz
2025-08-08 9:11 ` Bryan O'Donoghue
@ 2025-08-08 10:16 ` Dikshita Agarwal
1 sibling, 0 replies; 23+ messages in thread
From: Dikshita Agarwal @ 2025-08-08 10:16 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, quic_vgarodia, bryan.odonoghue, krzk+dt,
konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 8/8/2025 2:22 PM, Jorge Ramirez-Ortiz wrote:
> From: Jorge Ramirez-Ortiz <jorge@foundries.io>
>
> Correctly sort the array of venus_dt_match entries.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge@foundries.io>
> ---
> drivers/media/platform/qcom/venus/core.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> index adc38fbc9d79..9604a7eed49d 100644
> --- a/drivers/media/platform/qcom/venus/core.c
> +++ b/drivers/media/platform/qcom/venus/core.c
> @@ -1074,11 +1074,11 @@ static const struct of_device_id venus_dt_match[] = {
> { .compatible = "qcom,msm8916-venus", .data = &msm8916_res, },
> { .compatible = "qcom,msm8996-venus", .data = &msm8996_res, },
> { .compatible = "qcom,msm8998-venus", .data = &msm8998_res, },
> + { .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
> + { .compatible = "qcom,sc7280-venus", .data = &sc7280_res, },
> { .compatible = "qcom,sdm660-venus", .data = &sdm660_res, },
> { .compatible = "qcom,sdm845-venus", .data = &sdm845_res, },
> { .compatible = "qcom,sdm845-venus-v2", .data = &sdm845_res_v2, },
> - { .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
> - { .compatible = "qcom,sc7280-venus", .data = &sc7280_res, },
> { .compatible = "qcom,sm8250-venus", .data = &sm8250_res, },
> { }
> };
Reviewed-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
Thanks,
Dikshita
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v9 8/8] arm64: dts: qcom: qrb2210-rb1: Enable Venus
2025-08-08 8:53 ` [PATCH v9 8/8] arm64: dts: qcom: qrb2210-rb1: Enable Venus Jorge Ramirez-Ortiz
@ 2025-08-08 10:26 ` Dikshita Agarwal
0 siblings, 0 replies; 23+ messages in thread
From: Dikshita Agarwal @ 2025-08-08 10:26 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, quic_vgarodia, bryan.odonoghue, krzk+dt,
konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 8/8/2025 2:23 PM, Jorge Ramirez-Ortiz wrote:
> Enable Venus on the QRB2210 RB1 development board.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> ---
> arch/arm64/boot/dts/qcom/qrb2210-rb1.dts | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/qcom/qrb2210-rb1.dts b/arch/arm64/boot/dts/qcom/qrb2210-rb1.dts
> index b2e0fc5501c1..e92d0d6ad1b8 100644
> --- a/arch/arm64/boot/dts/qcom/qrb2210-rb1.dts
> +++ b/arch/arm64/boot/dts/qcom/qrb2210-rb1.dts
> @@ -698,6 +698,10 @@ &usb_qmpphy_out {
> remote-endpoint = <&pm4125_ss_in>;
> };
>
> +&venus {
> + status = "okay";
> +};
> +
> &wifi {
> vdd-0.8-cx-mx-supply = <&pm4125_l7>;
> vdd-1.8-xo-supply = <&pm4125_l13>;
Reviewed-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
Thanks,
Dikshita
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v9 3/8] media: venus: Add framework support for AR50_LITE video core
2025-08-08 8:52 ` [PATCH v9 3/8] media: venus: Add framework support for AR50_LITE video core Jorge Ramirez-Ortiz
2025-08-08 9:10 ` Bryan O'Donoghue
@ 2025-08-11 10:03 ` Dikshita Agarwal
1 sibling, 0 replies; 23+ messages in thread
From: Dikshita Agarwal @ 2025-08-11 10:03 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, quic_vgarodia, bryan.odonoghue, krzk+dt,
konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 8/8/2025 2:22 PM, Jorge Ramirez-Ortiz wrote:
> The AR50_LITE is a simplified variant of the AR50 video core, designed for
> power and cost-efficient platforms.
>
> It supports hardware-accelerated decoding of H.264, HEVC, and VP9 formats,
> and provides encoding support for H.264 and HEVC.
>
> This commit prepares the framework to enable the AR50_LITE (it does not
> enable it).
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/venus/core.c | 15 ++++++--
> drivers/media/platform/qcom/venus/core.h | 5 +++
> drivers/media/platform/qcom/venus/firmware.c | 10 ++++++
> drivers/media/platform/qcom/venus/firmware.h | 1 +
> drivers/media/platform/qcom/venus/helpers.c | 12 +++++--
> .../media/platform/qcom/venus/hfi_parser.c | 2 +-
> .../media/platform/qcom/venus/hfi_platform.c | 23 ++++++++-----
> .../media/platform/qcom/venus/hfi_platform.h | 34 ++++++++++++-------
> .../platform/qcom/venus/hfi_platform_v4.c | 33 +++++++++++++-----
> .../platform/qcom/venus/hfi_platform_v6.c | 33 +++++++++++++-----
> drivers/media/platform/qcom/venus/hfi_venus.c | 25 ++++++++++----
> .../media/platform/qcom/venus/hfi_venus_io.h | 4 +++
> .../media/platform/qcom/venus/pm_helpers.c | 2 +-
> 13 files changed, 145 insertions(+), 54 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> index f45715c9b222..adc38fbc9d79 100644
> --- a/drivers/media/platform/qcom/venus/core.c
> +++ b/drivers/media/platform/qcom/venus/core.c
> @@ -254,14 +254,19 @@ static int venus_enumerate_codecs(struct venus_core *core, u32 type)
>
> static void venus_assign_register_offsets(struct venus_core *core)
> {
> - if (IS_IRIS2(core) || IS_IRIS2_1(core)) {
> - core->vbif_base = core->base + VBIF_BASE;
> + if (IS_IRIS2(core) || IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
> core->cpu_base = core->base + CPU_BASE_V6;
> core->cpu_cs_base = core->base + CPU_CS_BASE_V6;
> core->cpu_ic_base = core->base + CPU_IC_BASE_V6;
> core->wrapper_base = core->base + WRAPPER_BASE_V6;
> core->wrapper_tz_base = core->base + WRAPPER_TZ_BASE_V6;
> - core->aon_base = core->base + AON_BASE_V6;
> + if (IS_AR50_LITE(core)) {
> + core->vbif_base = NULL;
> + core->aon_base = NULL;
> + } else {
> + core->vbif_base = core->base + VBIF_BASE;
> + core->aon_base = core->base + AON_BASE_V6;
> + }
> } else {
> core->vbif_base = core->base + VBIF_BASE;
> core->cpu_base = core->base + CPU_BASE;
> @@ -456,6 +461,10 @@ static int venus_probe(struct platform_device *pdev)
> if (ret)
> goto err_firmware_deinit;
>
> + ret = venus_firmware_cfg(core);
> + if (ret)
> + goto err_venus_shutdown;
> +
> ret = hfi_core_resume(core, true);
> if (ret)
> goto err_venus_shutdown;
> diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
> index d1f0e9979ba4..ef80a7666597 100644
> --- a/drivers/media/platform/qcom/venus/core.h
> +++ b/drivers/media/platform/qcom/venus/core.h
> @@ -533,6 +533,11 @@ struct venus_inst {
> #define IS_IRIS2(core) ((core)->res->vpu_version == VPU_VERSION_IRIS2)
> #define IS_IRIS2_1(core) ((core)->res->vpu_version == VPU_VERSION_IRIS2_1)
>
> +static inline bool is_lite(struct venus_core *core)
> +{
> + return IS_AR50_LITE(core);
> +}
> +
> #define ctrl_to_inst(ctrl) \
> container_of((ctrl)->handler, struct venus_inst, ctrl_handler)
>
> diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
> index 3666675ae298..2483998360f7 100644
> --- a/drivers/media/platform/qcom/venus/firmware.c
> +++ b/drivers/media/platform/qcom/venus/firmware.c
> @@ -207,6 +207,16 @@ static int venus_shutdown_no_tz(struct venus_core *core)
> return 0;
> }
>
> +int venus_firmware_cfg(struct venus_core *core)
> +{
> + void __iomem *cpu_cs_base = core->cpu_cs_base;
> +
> + if (IS_AR50_LITE(core))
> + writel(CPU_CS_VCICMD_ARP_OFF, cpu_cs_base + CPU_CS_VCICMD);
> +
> + return 0;
> +}
> +
> int venus_boot(struct venus_core *core)
> {
> struct device *dev = core->dev;
> diff --git a/drivers/media/platform/qcom/venus/firmware.h b/drivers/media/platform/qcom/venus/firmware.h
> index ead39e3797f0..87e1d922b369 100644
> --- a/drivers/media/platform/qcom/venus/firmware.h
> +++ b/drivers/media/platform/qcom/venus/firmware.h
> @@ -10,6 +10,7 @@ struct device;
> int venus_firmware_init(struct venus_core *core);
> void venus_firmware_deinit(struct venus_core *core);
> int venus_firmware_check(struct venus_core *core);
> +int venus_firmware_cfg(struct venus_core *core);
> int venus_boot(struct venus_core *core);
> int venus_shutdown(struct venus_core *core);
> int venus_set_hw_state(struct venus_core *core, bool suspend);
> diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c
> index 8295542e1a7c..2e4363f82231 100644
> --- a/drivers/media/platform/qcom/venus/helpers.c
> +++ b/drivers/media/platform/qcom/venus/helpers.c
> @@ -1715,11 +1715,17 @@ int venus_helper_session_init(struct venus_inst *inst)
> if (ret)
> return ret;
>
> - inst->clk_data.vpp_freq = hfi_platform_get_codec_vpp_freq(version, codec,
> + inst->clk_data.vpp_freq = hfi_platform_get_codec_vpp_freq(inst->core,
> + version,
> + codec,
> session_type);
> - inst->clk_data.vsp_freq = hfi_platform_get_codec_vsp_freq(version, codec,
> + inst->clk_data.vsp_freq = hfi_platform_get_codec_vsp_freq(inst->core,
> + version,
> + codec,
> session_type);
> - inst->clk_data.low_power_freq = hfi_platform_get_codec_lp_freq(version, codec,
> + inst->clk_data.low_power_freq = hfi_platform_get_codec_lp_freq(inst->core,
> + version,
> + codec,
> session_type);
>
> return 0;
> diff --git a/drivers/media/platform/qcom/venus/hfi_parser.c b/drivers/media/platform/qcom/venus/hfi_parser.c
> index 1b3db2caa99f..92765f9c8873 100644
> --- a/drivers/media/platform/qcom/venus/hfi_parser.c
> +++ b/drivers/media/platform/qcom/venus/hfi_parser.c
> @@ -282,7 +282,7 @@ static int hfi_platform_parser(struct venus_core *core, struct venus_inst *inst)
> return ret;
>
> if (plat->capabilities)
> - caps = plat->capabilities(&entries);
> + caps = plat->capabilities(core, &entries);
>
> if (!caps || !entries || !count)
> return -EINVAL;
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
> index 643e5aa138f5..cde7f93045ac 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform.c
> +++ b/drivers/media/platform/qcom/venus/hfi_platform.c
> @@ -21,7 +21,9 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
> }
>
> unsigned long
> -hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec, u32 session_type)
> +hfi_platform_get_codec_vpp_freq(struct venus_core *core,
> + enum hfi_version version, u32 codec,
> + u32 session_type)
> {
> const struct hfi_platform *plat;
> unsigned long freq = 0;
> @@ -31,13 +33,15 @@ hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec, u32 session
> return 0;
>
> if (plat->codec_vpp_freq)
> - freq = plat->codec_vpp_freq(session_type, codec);
> + freq = plat->codec_vpp_freq(core, session_type, codec);
>
> return freq;
> }
>
> unsigned long
> -hfi_platform_get_codec_vsp_freq(enum hfi_version version, u32 codec, u32 session_type)
> +hfi_platform_get_codec_vsp_freq(struct venus_core *core,
> + enum hfi_version version, u32 codec,
> + u32 session_type)
> {
> const struct hfi_platform *plat;
> unsigned long freq = 0;
> @@ -47,13 +51,15 @@ hfi_platform_get_codec_vsp_freq(enum hfi_version version, u32 codec, u32 session
> return 0;
>
> if (plat->codec_vpp_freq)
> - freq = plat->codec_vsp_freq(session_type, codec);
> + freq = plat->codec_vsp_freq(core, session_type, codec);
>
> return freq;
> }
>
> unsigned long
> -hfi_platform_get_codec_lp_freq(enum hfi_version version, u32 codec, u32 session_type)
> +hfi_platform_get_codec_lp_freq(struct venus_core *core,
> + enum hfi_version version, u32 codec,
> + u32 session_type)
> {
> const struct hfi_platform *plat;
> unsigned long freq = 0;
> @@ -63,13 +69,14 @@ hfi_platform_get_codec_lp_freq(enum hfi_version version, u32 codec, u32 session_
> return 0;
>
> if (plat->codec_lp_freq)
> - freq = plat->codec_lp_freq(session_type, codec);
> + freq = plat->codec_lp_freq(core, session_type, codec);
>
> return freq;
> }
>
> int
> -hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> +hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs,
> + u32 *dec_codecs, u32 *count)
> {
> const struct hfi_platform *plat;
>
> @@ -78,7 +85,7 @@ hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs, u32 *dec_codec
> return -EINVAL;
>
> if (plat->codecs)
> - plat->codecs(enc_codecs, dec_codecs, count);
> + plat->codecs(core, enc_codecs, dec_codecs, count);
>
> if (IS_IRIS2_1(core)) {
> *enc_codecs &= ~HFI_VIDEO_CODEC_VP8;
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
> index ec89a90a8129..5e4f8013a6b1 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform.h
> +++ b/drivers/media/platform/qcom/venus/hfi_platform.h
> @@ -47,11 +47,16 @@ struct hfi_platform_codec_freq_data {
> };
>
> struct hfi_platform {
> - unsigned long (*codec_vpp_freq)(u32 session_type, u32 codec);
> - unsigned long (*codec_vsp_freq)(u32 session_type, u32 codec);
> - unsigned long (*codec_lp_freq)(u32 session_type, u32 codec);
> - void (*codecs)(u32 *enc_codecs, u32 *dec_codecs, u32 *count);
> - const struct hfi_plat_caps *(*capabilities)(unsigned int *entries);
> + unsigned long (*codec_vpp_freq)(struct venus_core *core,
> + u32 session_type, u32 codec);
> + unsigned long (*codec_vsp_freq)(struct venus_core *core,
> + u32 session_type, u32 codec);
> + unsigned long (*codec_lp_freq)(struct venus_core *core,
> + u32 session_type, u32 codec);
> + void (*codecs)(struct venus_core *core, u32 *enc_codecs,
> + u32 *dec_codecs, u32 *count);
> + const struct hfi_plat_caps *(*capabilities)(struct venus_core *core,
> + unsigned int *entries);
> int (*bufreq)(struct hfi_plat_buffers_params *params, u32 session_type,
> u32 buftype, struct hfi_buffer_requirements *bufreq);
> };
> @@ -60,12 +65,15 @@ extern const struct hfi_platform hfi_plat_v4;
> extern const struct hfi_platform hfi_plat_v6;
>
> const struct hfi_platform *hfi_platform_get(enum hfi_version version);
> -unsigned long hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec,
> - u32 session_type);
> -unsigned long hfi_platform_get_codec_vsp_freq(enum hfi_version version, u32 codec,
> - u32 session_type);
> -unsigned long hfi_platform_get_codec_lp_freq(enum hfi_version version, u32 codec,
> - u32 session_type);
> -int hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs, u32 *dec_codecs,
> - u32 *count);
> +unsigned long hfi_platform_get_codec_vpp_freq(struct venus_core *core,
> + enum hfi_version version,
> + u32 codec, u32 session_type);
> +unsigned long hfi_platform_get_codec_vsp_freq(struct venus_core *core,
> + enum hfi_version version,
> + u32 codec, u32 session_type);
> +unsigned long hfi_platform_get_codec_lp_freq(struct venus_core *core,
> + enum hfi_version version,
> + u32 codec, u32 session_type);
> +int hfi_platform_get_codecs(struct venus_core *core, u32 *enc_codecs,
> + u32 *dec_codecs, u32 *count);
> #endif
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v4.c b/drivers/media/platform/qcom/venus/hfi_platform_v4.c
> index e3f0a90a567b..41e4dc28ec1b 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform_v4.c
> +++ b/drivers/media/platform/qcom/venus/hfi_platform_v4.c
> @@ -2,6 +2,7 @@
> /*
> * Copyright (c) 2020, The Linux Foundation. All rights reserved.
> */
> +#include "core.h"
> #include "hfi_platform.h"
>
> static const struct hfi_plat_caps caps[] = {
> @@ -245,14 +246,22 @@ static const struct hfi_plat_caps caps[] = {
> .num_fmts = 4,
> } };
>
> -static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
> +static const struct hfi_plat_caps *get_capabilities(struct venus_core *core,
> + unsigned int *entries)
> {
> + if (is_lite(core))
> + return NULL;
> +
> *entries = ARRAY_SIZE(caps);
> return caps;
> }
>
> -static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> +static void get_codecs(struct venus_core *core,
> + u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> {
> + if (is_lite(core))
> + return;
> +
> *enc_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> HFI_VIDEO_CODEC_VP8;
> *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> @@ -273,12 +282,15 @@ static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
> };
>
> static const struct hfi_platform_codec_freq_data *
> -get_codec_freq_data(u32 session_type, u32 pixfmt)
> +get_codec_freq_data(struct venus_core *core, u32 session_type, u32 pixfmt)
> {
> const struct hfi_platform_codec_freq_data *data = codec_freq_data;
> unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
> const struct hfi_platform_codec_freq_data *found = NULL;
>
> + if (is_lite(core))
> + return NULL;
> +
> for (i = 0; i < data_size; i++) {
> if (data[i].pixfmt == pixfmt && data[i].session_type == session_type) {
> found = &data[i];
> @@ -289,33 +301,36 @@ get_codec_freq_data(u32 session_type, u32 pixfmt)
> return found;
> }
>
> -static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
> +static unsigned long codec_vpp_freq(struct venus_core *core,
> + u32 session_type, u32 codec)
> {
> const struct hfi_platform_codec_freq_data *data;
>
> - data = get_codec_freq_data(session_type, codec);
> + data = get_codec_freq_data(core, session_type, codec);
> if (data)
> return data->vpp_freq;
>
> return 0;
> }
>
> -static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
> +static unsigned long codec_vsp_freq(struct venus_core *core,
> + u32 session_type, u32 codec)
> {
> const struct hfi_platform_codec_freq_data *data;
>
> - data = get_codec_freq_data(session_type, codec);
> + data = get_codec_freq_data(core, session_type, codec);
> if (data)
> return data->vsp_freq;
>
> return 0;
> }
>
> -static unsigned long codec_lp_freq(u32 session_type, u32 codec)
> +static unsigned long codec_lp_freq(struct venus_core *core,
> + u32 session_type, u32 codec)
> {
> const struct hfi_platform_codec_freq_data *data;
>
> - data = get_codec_freq_data(session_type, codec);
> + data = get_codec_freq_data(core, session_type, codec);
> if (data)
> return data->low_power_freq;
>
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6.c b/drivers/media/platform/qcom/venus/hfi_platform_v6.c
> index 4e8af645f8b9..d8568c08cc36 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform_v6.c
> +++ b/drivers/media/platform/qcom/venus/hfi_platform_v6.c
> @@ -2,6 +2,7 @@
> /*
> * Copyright (c) 2020, The Linux Foundation. All rights reserved.
> */
> +#include "core.h"
> #include "hfi_platform.h"
>
> static const struct hfi_plat_caps caps[] = {
> @@ -245,14 +246,22 @@ static const struct hfi_plat_caps caps[] = {
> .num_fmts = 4,
> } };
>
> -static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
> +static const struct hfi_plat_caps *get_capabilities(struct venus_core *core,
> + unsigned int *entries)
> {
> + if (is_lite(core))
> + return NULL;
> +
> *entries = ARRAY_SIZE(caps);
> return caps;
> }
>
> -static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> +static void get_codecs(struct venus_core *core, u32 *enc_codecs,
> + u32 *dec_codecs, u32 *count)
> {
> + if (is_lite(core))
> + return;
> +
> *enc_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> HFI_VIDEO_CODEC_VP8;
> *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> @@ -273,12 +282,15 @@ static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
> };
>
> static const struct hfi_platform_codec_freq_data *
> -get_codec_freq_data(u32 session_type, u32 pixfmt)
> +get_codec_freq_data(struct venus_core *core, u32 session_type, u32 pixfmt)
> {
> const struct hfi_platform_codec_freq_data *data = codec_freq_data;
> unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
> const struct hfi_platform_codec_freq_data *found = NULL;
>
> + if (is_lite(core))
> + return NULL;
> +
> for (i = 0; i < data_size; i++) {
> if (data[i].pixfmt == pixfmt && data[i].session_type == session_type) {
> found = &data[i];
> @@ -289,33 +301,36 @@ get_codec_freq_data(u32 session_type, u32 pixfmt)
> return found;
> }
>
> -static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
> +static unsigned long codec_vpp_freq(struct venus_core *core, u32 session_type,
> + u32 codec)
> {
> const struct hfi_platform_codec_freq_data *data;
>
> - data = get_codec_freq_data(session_type, codec);
> + data = get_codec_freq_data(core, session_type, codec);
> if (data)
> return data->vpp_freq;
>
> return 0;
> }
>
> -static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
> +static unsigned long codec_vsp_freq(struct venus_core *core, u32 session_type,
> + u32 codec)
> {
> const struct hfi_platform_codec_freq_data *data;
>
> - data = get_codec_freq_data(session_type, codec);
> + data = get_codec_freq_data(core, session_type, codec);
> if (data)
> return data->vsp_freq;
>
> return 0;
> }
>
> -static unsigned long codec_lp_freq(u32 session_type, u32 codec)
> +static unsigned long codec_lp_freq(struct venus_core *core, u32 session_type,
> + u32 codec)
> {
> const struct hfi_platform_codec_freq_data *data;
>
> - data = get_codec_freq_data(session_type, codec);
> + data = get_codec_freq_data(core, session_type, codec);
> if (data)
> return data->low_power_freq;
>
> diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c
> index cec7f5964d3d..d3da35f67fd5 100644
> --- a/drivers/media/platform/qcom/venus/hfi_venus.c
> +++ b/drivers/media/platform/qcom/venus/hfi_venus.c
> @@ -380,7 +380,7 @@ static void venus_soft_int(struct venus_hfi_device *hdev)
> void __iomem *cpu_ic_base = hdev->core->cpu_ic_base;
> u32 clear_bit;
>
> - if (IS_V6(hdev->core))
> + if (IS_V6(hdev->core) || (IS_V4(hdev->core) && is_lite(hdev->core)))
> clear_bit = BIT(CPU_IC_SOFTINT_H2A_SHIFT_V6);
> else
> clear_bit = BIT(CPU_IC_SOFTINT_H2A_SHIFT);
> @@ -501,9 +501,11 @@ static int venus_boot_core(struct venus_hfi_device *hdev)
> if (count >= max_tries)
> ret = -ETIMEDOUT;
>
> - if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core)) {
> + if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core) || IS_AR50_LITE(hdev->core)) {
> writel(0x1, cpu_cs_base + CPU_CS_H2XSOFTINTEN_V6);
> - writel(0x0, cpu_cs_base + CPU_CS_X2RPMH_V6);
> +
> + if (!IS_AR50_LITE(hdev->core))
> + writel(0x0, cpu_cs_base + CPU_CS_X2RPMH_V6);
> }
>
> return ret;
> @@ -569,6 +571,9 @@ static int venus_halt_axi(struct venus_hfi_device *hdev)
> u32 mask_val;
> int ret;
>
> + if (IS_AR50_LITE(hdev->core))
> + return 0;
> +
> if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core)) {
> writel(0x3, cpu_cs_base + CPU_CS_X2RPMH_V6);
>
> @@ -1138,7 +1143,13 @@ static irqreturn_t venus_isr(struct venus_core *core)
> wrapper_base = hdev->core->wrapper_base;
>
> status = readl(wrapper_base + WRAPPER_INTR_STATUS);
> - if (IS_IRIS2(core) || IS_IRIS2_1(core)) {
> +
> + if (IS_AR50_LITE(core)) {
> + if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
> + status & WRAPPER_INTR_STATUS_A2HWD_MASK_V4_LITE ||
> + status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
> + hdev->irq_status = status;
> + } else if (IS_IRIS2(core) || IS_IRIS2_1(core)) {
> if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
> status & WRAPPER_INTR_STATUS_A2HWD_MASK_V6 ||
> status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
> @@ -1150,7 +1161,7 @@ static irqreturn_t venus_isr(struct venus_core *core)
> hdev->irq_status = status;
> }
> writel(1, cpu_cs_base + CPU_CS_A2HSOFTINTCLR);
> - if (!(IS_IRIS2(core) || IS_IRIS2_1(core)))
> + if (!(IS_IRIS2(core) || IS_IRIS2_1(core) || IS_AR50_LITE(core)))
> writel(status, wrapper_base + WRAPPER_INTR_CLEAR);
>
> return IRQ_WAKE_THREAD;
> @@ -1535,7 +1546,7 @@ static bool venus_cpu_and_video_core_idle(struct venus_hfi_device *hdev)
> void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
> u32 ctrl_status, cpu_status;
>
> - if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core))
> + if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core) || IS_AR50_LITE(hdev->core))
> cpu_status = readl(wrapper_tz_base + WRAPPER_TZ_CPU_STATUS_V6);
> else
> cpu_status = readl(wrapper_base + WRAPPER_CPU_STATUS);
> @@ -1555,7 +1566,7 @@ static bool venus_cpu_idle_and_pc_ready(struct venus_hfi_device *hdev)
> void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
> u32 ctrl_status, cpu_status;
>
> - if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core))
> + if (IS_IRIS2(hdev->core) || IS_IRIS2_1(hdev->core) || IS_AR50_LITE(hdev->core))
> cpu_status = readl(wrapper_tz_base + WRAPPER_TZ_CPU_STATUS_V6);
> else
> cpu_status = readl(wrapper_base + WRAPPER_CPU_STATUS);
> diff --git a/drivers/media/platform/qcom/venus/hfi_venus_io.h b/drivers/media/platform/qcom/venus/hfi_venus_io.h
> index 9735a246ce36..f2c3064c44ae 100644
> --- a/drivers/media/platform/qcom/venus/hfi_venus_io.h
> +++ b/drivers/media/platform/qcom/venus/hfi_venus_io.h
> @@ -51,6 +51,9 @@
> /* Venus cpu */
> #define CPU_CS_SCIACMDARG3 0x58
>
> +#define CPU_CS_VCICMD 0x20
> +#define CPU_CS_VCICMD_ARP_OFF BIT(0)
> +
> #define SFR_ADDR 0x5c
> #define MMAP_ADDR 0x60
> #define UC_REGION_ADDR 0x64
> @@ -100,6 +103,7 @@
> #define WRAPPER_INTR_MASK_A2HCPU_MASK 0x4
> #define WRAPPER_INTR_MASK_A2HCPU_SHIFT 0x2
>
> +#define WRAPPER_INTR_STATUS_A2HWD_MASK_V4_LITE 0x10
> #define WRAPPER_INTR_STATUS_A2HWD_MASK_V6 0x8
> #define WRAPPER_INTR_MASK_A2HWD_BASK_V6 0x8
>
> diff --git a/drivers/media/platform/qcom/venus/pm_helpers.c b/drivers/media/platform/qcom/venus/pm_helpers.c
> index 8dd5a9b0d060..e09b0d9ae610 100644
> --- a/drivers/media/platform/qcom/venus/pm_helpers.c
> +++ b/drivers/media/platform/qcom/venus/pm_helpers.c
> @@ -51,7 +51,7 @@ static int core_clks_enable(struct venus_core *core)
> dev_pm_opp_put(opp);
>
> for (i = 0; i < res->clks_num; i++) {
> - if (IS_V6(core)) {
> + if (IS_V6(core) || (IS_V4(core) && is_lite(core))) {
> ret = clk_set_rate(core->clks[i], freq);
> if (ret)
> goto err;
Reviewed-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v9 4/8] media: venus: hfi_plat_v4: Add capabilities for the 4XX lite core
2025-08-08 8:52 ` [PATCH v9 4/8] media: venus: hfi_plat_v4: Add capabilities for the 4XX lite core Jorge Ramirez-Ortiz
@ 2025-08-11 10:05 ` Dikshita Agarwal
0 siblings, 0 replies; 23+ messages in thread
From: Dikshita Agarwal @ 2025-08-11 10:05 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, quic_vgarodia, bryan.odonoghue, krzk+dt,
konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 8/8/2025 2:22 PM, Jorge Ramirez-Ortiz wrote:
> Populate the HFI v4 lite capability set used by the AR50_LITE video
> core.
>
> These capabilities define the supported codec formats and operational
> limits specific to this streamlined VPU variant.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> ---
> .../platform/qcom/venus/hfi_platform_v4.c | 167 ++++++++++++++++--
> 1 file changed, 151 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v4.c b/drivers/media/platform/qcom/venus/hfi_platform_v4.c
> index 41e4dc28ec1b..cda888b56b5d 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform_v4.c
> +++ b/drivers/media/platform/qcom/venus/hfi_platform_v4.c
> @@ -246,28 +246,150 @@ static const struct hfi_plat_caps caps[] = {
> .num_fmts = 4,
> } };
>
> +static const struct hfi_plat_caps caps_lite[] = {
> +{
> + .codec = HFI_VIDEO_CODEC_H264,
> + .domain = VIDC_SESSION_TYPE_DEC,
> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1920, 1},
> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> + .num_caps = 7,
> + .pl[0] = { HFI_H264_PROFILE_BASELINE, HFI_H264_LEVEL_5},
> + .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_5},
> + .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
> + .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_5},
> + .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_5},
> + .num_pl = 5,
> + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
> + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
> + .num_fmts = 4,
> +}, {
> + .codec = HFI_VIDEO_CODEC_HEVC,
> + .domain = VIDC_SESSION_TYPE_DEC,
> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1920, 1},
> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> + .num_caps = 7,
> + .pl[0] = {HFI_HEVC_PROFILE_MAIN, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_HIGH0 << 28 },
> + .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_HIGH0 << 28 },
> + .num_pl = 2,
> + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
> + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
> + .num_fmts = 4,
> +}, {
> + .codec = HFI_VIDEO_CODEC_VP9,
> + .domain = VIDC_SESSION_TYPE_DEC,
> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1920, 1},
> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> + .num_caps = 7,
> + .pl[0] = {HFI_VP9_PROFILE_P0, 200},
> + .pl[1] = {HFI_VP9_PROFILE_P2_10B, 200},
> + .num_pl = 2,
> + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
> + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
> + .num_fmts = 4,
> +}, {
> + .codec = HFI_VIDEO_CODEC_H264,
> + .domain = VIDC_SESSION_TYPE_ENC,
> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1920, 1},
> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> + .caps[7] = {HFI_CAPABILITY_HIER_P_NUM_ENH_LAYERS, 0, 6, 1},
> + .caps[8] = {HFI_CAPABILITY_ENC_LTR_COUNT, 0, 4, 1},
> + .caps[9] = {HFI_CAPABILITY_MBS_PER_SECOND_POWERSAVE, 0, 244800, 1},
> + .caps[10] = {HFI_CAPABILITY_I_FRAME_QP, 0, 51, 1},
> + .caps[11] = {HFI_CAPABILITY_P_FRAME_QP, 0, 51, 1},
> + .caps[12] = {HFI_CAPABILITY_B_FRAME_QP, 0, 51, 1},
> + .caps[13] = {HFI_CAPABILITY_SLICE_BYTE, 1, 10, 1},
> + .caps[14] = {HFI_CAPABILITY_SLICE_MB, 1, 10, 1},
> + .num_caps = 15,
> + .pl[0] = {HFI_H264_PROFILE_BASELINE, HFI_H264_LEVEL_5},
> + .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_5},
> + .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
> + .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_5},
> + .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_5},
> + .num_pl = 5,
> + .fmts[0] = {HFI_BUFFER_INPUT, HFI_COLOR_FORMAT_NV12},
> + .fmts[1] = {HFI_BUFFER_INPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> + .num_fmts = 2,
> +}, {
> + .codec = HFI_VIDEO_CODEC_HEVC,
> + .domain = VIDC_SESSION_TYPE_ENC,
> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1920, 1},
> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> + .caps[7] = {HFI_CAPABILITY_HIER_P_NUM_ENH_LAYERS, 0, 6, 1},
> + .caps[8] = {HFI_CAPABILITY_ENC_LTR_COUNT, 0, 4, 1},
> + .caps[9] = {HFI_CAPABILITY_MBS_PER_SECOND_POWERSAVE, 0, 244800, 1},
> + .caps[10] = {HFI_CAPABILITY_I_FRAME_QP, 0, 51, 1},
> + .caps[11] = {HFI_CAPABILITY_P_FRAME_QP, 0, 51, 1},
> + .caps[12] = {HFI_CAPABILITY_B_FRAME_QP, 0, 51, 1},
> + .caps[13] = {HFI_CAPABILITY_SLICE_BYTE, 1, 10, 1},
> + .caps[14] = {HFI_CAPABILITY_SLICE_MB, 1, 10, 1},
> + .num_caps = 15,
> + .pl[0] = {HFI_HEVC_PROFILE_MAIN, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_HIGH0},
> + .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_HIGH0},
> + .num_pl = 2,
> + .fmts[0] = {HFI_BUFFER_INPUT, HFI_COLOR_FORMAT_NV12},
> + .fmts[1] = {HFI_BUFFER_INPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> + .num_fmts = 2,
> +} };
> +
> static const struct hfi_plat_caps *get_capabilities(struct venus_core *core,
> unsigned int *entries)
> {
> - if (is_lite(core))
> - return NULL;
> + *entries = is_lite(core) ? ARRAY_SIZE(caps_lite) : ARRAY_SIZE(caps);
>
> - *entries = ARRAY_SIZE(caps);
> - return caps;
> + return is_lite(core) ? caps_lite : caps;
> }
>
> static void get_codecs(struct venus_core *core,
> u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> {
> - if (is_lite(core))
> - return;
> + const struct hfi_plat_caps *caps;
> + unsigned int num;
> + size_t i;
> +
> + *enc_codecs = 0;
> + *dec_codecs = 0;
> +
> + caps = get_capabilities(core, &num);
>
> - *enc_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> - HFI_VIDEO_CODEC_VP8;
> - *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> - HFI_VIDEO_CODEC_VP8 | HFI_VIDEO_CODEC_VP9 |
> - HFI_VIDEO_CODEC_MPEG2;
> - *count = 8;
> + for (i = 0; i < num; caps++, i++) {
> + if (caps->domain == VIDC_SESSION_TYPE_ENC)
> + *enc_codecs |= caps->codec;
> + else
> + *dec_codecs |= caps->codec;
> + }
> +
> + *count = num;
> }
>
> static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
> @@ -281,15 +403,28 @@ static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
> { V4L2_PIX_FMT_VP9, VIDC_SESSION_TYPE_DEC, 200, 10, 200 },
> };
>
> +static const struct hfi_platform_codec_freq_data codec_freq_data_lite[] = {
> + { V4L2_PIX_FMT_H264, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
> + { V4L2_PIX_FMT_HEVC, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
> + { V4L2_PIX_FMT_VP9, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
> + { V4L2_PIX_FMT_H264, VIDC_SESSION_TYPE_ENC, 675, 0, 675 },
> + { V4L2_PIX_FMT_HEVC, VIDC_SESSION_TYPE_ENC, 675, 0, 675 },
> +};
> +
> static const struct hfi_platform_codec_freq_data *
> get_codec_freq_data(struct venus_core *core, u32 session_type, u32 pixfmt)
> {
> - const struct hfi_platform_codec_freq_data *data = codec_freq_data;
> - unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
> + const struct hfi_platform_codec_freq_data *data;
> + unsigned int i, data_size;
> const struct hfi_platform_codec_freq_data *found = NULL;
>
> - if (is_lite(core))
> - return NULL;
> + if (is_lite(core)) {
> + data = codec_freq_data_lite;
> + data_size = ARRAY_SIZE(codec_freq_data_lite);
> + } else {
> + data = codec_freq_data;
> + data_size = ARRAY_SIZE(codec_freq_data);
> + }
>
> for (i = 0; i < data_size; i++) {
> if (data[i].pixfmt == pixfmt && data[i].session_type == session_type) {
Reviewed-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core
2025-08-08 8:52 [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
` (7 preceding siblings ...)
2025-08-08 8:53 ` [PATCH v9 8/8] arm64: dts: qcom: qrb2210-rb1: Enable Venus Jorge Ramirez-Ortiz
@ 2025-08-13 22:18 ` Bryan O'Donoghue
2025-08-13 22:22 ` Jorge Ramirez
8 siblings, 1 reply; 23+ messages in thread
From: Bryan O'Donoghue @ 2025-08-13 22:18 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, quic_vgarodia, quic_dikshita, krzk+dt,
konradybcio, dmitry.baryshkov, mchehab, robh, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 08/08/2025 09:52, Jorge Ramirez-Ortiz wrote:
> Changes since v8:
> v8: https://lore.kernel.org/all/20250805064430.782201-1-jorge.ramirez@oss.qualcomm.com/
> - patch 1/8: Add qcm2290 dt schema
> - no change
> - patch 2/8: media: venus: Define minimum valid firmware version
> - dev_err on failure
> - patch 3/8: Add framework to support for AR50 LITE video core
> - pass core rather than the lite property to the hfi platform
> - remove warnings
> - patch 4/8: HFI platform V4 capabilities
> -no change
> - patch 5/8: Sort dt_match alphabetically
> - new
> - patch 6/8: Add DT compatible and capabilities
> - sort dt_match alphabetically
> - patch 7/8: Add Venus video node for 2290
> - Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> - patch 8/8: Enable Venus on 2210 RB1 board
> - Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
>
> Changes since v7:
> v7: https://lore.kernel.org/all/20250715204749.2189875-1-jorge.ramirez@oss.qualcomm.com/
> - patch 1/7: Add qcm2290 dt schema
> - extend commit message to cover IOMMU order, remove iommus minItems, alphabetic order for includes
> - added myself as the file maintainer
> - patch 2/7: media: venus: Define minimum valid firmware version
> - Replaces previous patch that was able to distinguish encoder vs decoder firmware version support
> - Now it is an all or nothing implementation (the firmware either support enc and dec or it doesn't)
> - patch 3/7: Add Support for AR50 LITE video core
> - remove EOS support for older firmwares since we will drop support for fw < 6.0.55
> - patch 4/7: HFI platform V4 capabilities
> - remove some hardcoded values and some ternary operations
> - added reviewed by Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> - patch 5/7: Add DT compatible and capabilities
> - only min_fw now required since we dont support encode/decode indepedently after 2/7
> - added reviewed by Dikshita Agarwal <quic_dikshita@quicinc.com>
> - patch 6/7: Add Venus video node for 2290
> - no change
> - patch 7/7: Enable Venus on 2210 RB1 board
> - fix alphabetical order
>
> Changes since v6:
> v6: https://lore.kernel.org/all/20250708180530.1384330-1-jorge.ramirez@oss.qualcomm.com/
> - patch 1/7: Add qcm2290 dt schema
> - no change
> - patch 2/7: Conditionally register video nodes
> - fixed potential NULL dereference on handling firmware errors when the encoder is not present.
> - patch 3/7: Add Support for AR50 LITE video core
> - applied Dikshita Agarwal review comments: do not handle no-tz case, fix WD mask
> - replaced EOS buffers for a work around (firmware should not access the eos buffers)
> renamed venus_helper_alloc_eos_buf to venus_helper_prepare_eos_data
> - patch 4/7: HFI platform V4 capabilities
> - removed 10 bit encoder support as per Dikshita Agarwal review
> - patch 5/7: Add DT compatible and capabilities
> - removed frequency table as per Konrad Dybcio review (driver now uses opp)
> - fixed bw_tables for the supported loads (remove 10 bit support)
> - patch 6/7: Add Venus video node for 2290
> - no change
> - patch 7/7: Enable Venus on 2210 RB1 board
> - no change
>
> Changes since v5:
> Two additional new patches added to the set to support video encoding.
>
> - patch 1/7: Add qcm2290 dt schema
> - added reviewed by: Bryan O'Donoghue
> - added reviewed by: Krzysztof Kozlowski
> - patch 2/7: Conditionally register video nodes
> - new functionality required to support AR50_LITE
> - patch 3/7: Add Support for AR50 LITE video core
> - completely rewritten - lite platforms are extensions of previous HFI_XXX
> - patch 4/7: HFI platform V4 capabilities
> - use HFI 4XX instead of HFI 6XX as per review
> - patch 5/7: Add DT compatible and capabilities
> - added reviewed by: Bryan O'Donoghue
> - enabled new option min_fw_version
> - patch 6/7: Add Venus video node for 2290
> - added reviewed by: Konrad Dybcio
> - removed status property
> - patch 7/7: Enable Venus on 2210 RB1 board
> - new
>
> Changes since v4:
> - patch 1/5:
> - added reviewed by: Krzysztof Kozlowski
> - updated example section
> - patch 2/5:
> - added reviewed by: Bryan O'Donoghue
> - Fixed Co-developed-by order
> - patch 3/5:
> - patch 4/5:
> - removed encode-node (userspace exposure)
> - fixed Co-developed-by order
> - patch 5/5:
> - fixed venus register region
> - power-domain-names: one per line
> - clock-names: one per line
> - fixed interconnect tags
> - empty line before subnode
> - enable the venus node
>
> Changes since v3:
> - Fixed schema commit subject.
>
> Changes since v2:
> - Removed IS_HFI/IS_VPU macros
> - checkpatch.pl --strict fixes:
> - convert macro to static inline to avoid argument reuse side effect
>
> Changes since v1:
> - Added IS_HFI macro usage
> - Moved schema patch to top
> - Fixed commit messages
>
> This patch series adds support for the Venus video decoder/encoder block
> present on the Qualcomm QCM2290.
>
> This series functionally depends on the following patch:
>
> clk: qcom: gcc-qcm2290: Set HW_CTRL_TRIGGER for video GDSC
> https://lore.kernel.org/all/20250613102245.782511-1-loic.poulain@oss.qualcomm.com/
>
> Please ensure the above patch is applied before this series.
>
> The QCM2290 integrates an AR50_LITE core, a low-power implementation of
> Venus supporting H.264, HEVC (H.265), and VP9 decoding as well as H.264
> and H.265 encoding.
>
> The series includes:
> - DT binding schema for qcom,qcm2290-venus
> - SoC integration via qcm2290.dtsi
> - Resource table definitions and frequency scaling
> - Platform capability registration for the AR50_LITE core decoding block.
>
> Limitations:
> - The hardware does not support concurrent operation at FullHD.
> - Encoding is not supported in firmware version before 6.0.54
>
> Firmware:
> - This code has been tested with 6.0.52, 6.0.53, 6.0.54-PRERELEASE
>
> Some basic Tests:
>
> Decoding and Encoding were verified on the QCOM RB1 platform using
> GStreamer with V4L2-based decode plugins.
>
> The following pipelines were used for playback 1280x720 and 1920x1080
> H.264, HEVC and VP9 videos from https://www.elecard.com/videos.
>
> Decoding:
> [H.264]
> gst-launch-1.0 filesrc location=videos/xxxxx.mp4 \
> ! qtdemux name=demux demux.video_0 ! queue ! h264parse ! v4l2h264dec \
> ! videoconvert ! autovideosink
>
> [H.265]
> gst-launch-1.0 filesrc location=videos/xxxxx.mp4 \
> ! qtdemux name=demux demux.video_0 ! queue ! h265parse ! v4l2h265dec \
> ! videoconvert ! autovideosink
>
> [VP9]
> gst-launch-1.0 filesrc location=videos/xxxxx.webm \
> ! matroskademux ! queue ! v4l2vp9dec \
> ! videoconvert ! autovideosink
>
> Encoding:
> [H.264]
> gst-launch-1.0 videotestsrc num-buffers=30 \
> ! video/x-raw,width=1280,height=720,framerate=30/1 \
> ! v4l2h264enc ! h264parse ! mp4mux ! filesink location=/tmp/output.mp4
>
> [H.265]
> gst-launch-1.0 videotestsrc num-buffers=30 \
> ! video/x-raw,width=1920,height=1080,framerate=30/1 \
> ! v4l2h265enc ! h265parse ! mp4mux ! filesink location=/tmp/output.mp4
>
> Concurrency:
> gst-launch-1.0 -v videotestsrc num-buffers=1000 \
> ! video/x-raw,format=NV12,width=1280,height=720,framerate=30/1 \
> ! v4l2h264enc capture-io-mode=4 output-io-mode=2 ! h264parse \
> ! v4l2h264dec capture-io-mode=4 output-io-mode=2 ! videoconvert \
> ! autovideosink
>
> [Fluster]
> The H.264 decoder was also tested using the Fluster test suite
> (version: v0.4.0-12-g33566abd0964).
> Target: GStreamer-H.264-V4L2-Gst1.0, Test Suite: JVT-AVC_V1
> Result: 126/135 tests passed
> Failures:
> FM1_BT_B, FM1_FT_E, FM2_SVA_C, BA3_SVA_C, SP1_BT_A,
> SP2_BT_B, MR6_BT_B, MR7_BT_B, MR8_BT_B
>
> ---
>
> Jorge Ramirez-Ortiz (8):
> media: dt-bindings: venus: Add qcm2290 dt schema
> media: venus: Define minimum valid firmware version
> media: venus: Add framework support for AR50_LITE video core
> media: venus: hfi_plat_v4: Add capabilities for the 4XX lite core
> media: venus: core: Sort dt_match alphabetically.
> media: venus: core: Add qcm2290 DT compatible and resource data
> arm64: dts: qcom: qcm2290: Add Venus video node
> arm64: dts: qcom: qrb2210-rb1: Enable Venus
>
> .../bindings/media/qcom,qcm2290-venus.yaml | 130 ++++++++++++
> arch/arm64/boot/dts/qcom/qcm2290.dtsi | 55 +++++
> arch/arm64/boot/dts/qcom/qrb2210-rb1.dts | 4 +
> drivers/media/platform/qcom/venus/core.c | 109 +++++++---
> drivers/media/platform/qcom/venus/core.h | 18 +-
> drivers/media/platform/qcom/venus/firmware.c | 30 +++
> drivers/media/platform/qcom/venus/firmware.h | 2 +
> drivers/media/platform/qcom/venus/helpers.c | 12 +-
> .../media/platform/qcom/venus/hfi_parser.c | 2 +-
> .../media/platform/qcom/venus/hfi_platform.c | 23 ++-
> .../media/platform/qcom/venus/hfi_platform.h | 34 ++--
> .../platform/qcom/venus/hfi_platform_v4.c | 188 ++++++++++++++++--
> .../platform/qcom/venus/hfi_platform_v6.c | 33 ++-
> drivers/media/platform/qcom/venus/hfi_venus.c | 25 ++-
> .../media/platform/qcom/venus/hfi_venus_io.h | 4 +
> .../media/platform/qcom/venus/pm_helpers.c | 2 +-
> 16 files changed, 582 insertions(+), 89 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/media/qcom,qcm2290-venus.yaml
>
Trying to apply your series and getting a few or more than one splat
anyway, on media-comitters/next
Could you fix this series and test up as a V10 ?
https://gitlab.freedesktop.org/linux-media/users/bodonoghue/-/commits/b4/bod-media-committers-next-platform-qcom-6.17-rc1
---
bod
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core
2025-08-13 22:18 ` [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Bryan O'Donoghue
@ 2025-08-13 22:22 ` Jorge Ramirez
2025-08-13 22:42 ` Jorge Ramirez
0 siblings, 1 reply; 23+ messages in thread
From: Jorge Ramirez @ 2025-08-13 22:22 UTC (permalink / raw)
To: Bryan O'Donoghue
Cc: Jorge Ramirez-Ortiz, quic_vgarodia, quic_dikshita, krzk+dt,
konradybcio, dmitry.baryshkov, mchehab, robh, andersson,
linux-arm-msm, linux-media, devicetree, linux-kernel
On 13/08/25 23:18:04, Bryan O'Donoghue wrote:
> On 08/08/2025 09:52, Jorge Ramirez-Ortiz wrote:
> > Changes since v8:
> > v8: https://lore.kernel.org/all/20250805064430.782201-1-jorge.ramirez@oss.qualcomm.com/
> > - patch 1/8: Add qcm2290 dt schema
> > - no change
> > - patch 2/8: media: venus: Define minimum valid firmware version
> > - dev_err on failure
> > - patch 3/8: Add framework to support for AR50 LITE video core
> > - pass core rather than the lite property to the hfi platform
> > - remove warnings
> > - patch 4/8: HFI platform V4 capabilities
> > -no change
> > - patch 5/8: Sort dt_match alphabetically
> > - new
> > - patch 6/8: Add DT compatible and capabilities
> > - sort dt_match alphabetically
> > - patch 7/8: Add Venus video node for 2290
> > - Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> > - patch 8/8: Enable Venus on 2210 RB1 board
> > - Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> >
> > Changes since v7:
> > v7: https://lore.kernel.org/all/20250715204749.2189875-1-jorge.ramirez@oss.qualcomm.com/
> > - patch 1/7: Add qcm2290 dt schema
> > - extend commit message to cover IOMMU order, remove iommus minItems, alphabetic order for includes
> > - added myself as the file maintainer
> > - patch 2/7: media: venus: Define minimum valid firmware version
> > - Replaces previous patch that was able to distinguish encoder vs decoder firmware version support
> > - Now it is an all or nothing implementation (the firmware either support enc and dec or it doesn't)
> > - patch 3/7: Add Support for AR50 LITE video core
> > - remove EOS support for older firmwares since we will drop support for fw < 6.0.55
> > - patch 4/7: HFI platform V4 capabilities
> > - remove some hardcoded values and some ternary operations
> > - added reviewed by Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> > - patch 5/7: Add DT compatible and capabilities
> > - only min_fw now required since we dont support encode/decode indepedently after 2/7
> > - added reviewed by Dikshita Agarwal <quic_dikshita@quicinc.com>
> > - patch 6/7: Add Venus video node for 2290
> > - no change
> > - patch 7/7: Enable Venus on 2210 RB1 board
> > - fix alphabetical order
> >
> > Changes since v6:
> > v6: https://lore.kernel.org/all/20250708180530.1384330-1-jorge.ramirez@oss.qualcomm.com/
> > - patch 1/7: Add qcm2290 dt schema
> > - no change
> > - patch 2/7: Conditionally register video nodes
> > - fixed potential NULL dereference on handling firmware errors when the encoder is not present.
> > - patch 3/7: Add Support for AR50 LITE video core
> > - applied Dikshita Agarwal review comments: do not handle no-tz case, fix WD mask
> > - replaced EOS buffers for a work around (firmware should not access the eos buffers)
> > renamed venus_helper_alloc_eos_buf to venus_helper_prepare_eos_data
> > - patch 4/7: HFI platform V4 capabilities
> > - removed 10 bit encoder support as per Dikshita Agarwal review
> > - patch 5/7: Add DT compatible and capabilities
> > - removed frequency table as per Konrad Dybcio review (driver now uses opp)
> > - fixed bw_tables for the supported loads (remove 10 bit support)
> > - patch 6/7: Add Venus video node for 2290
> > - no change
> > - patch 7/7: Enable Venus on 2210 RB1 board
> > - no change
> >
> > Changes since v5:
> > Two additional new patches added to the set to support video encoding.
> >
> > - patch 1/7: Add qcm2290 dt schema
> > - added reviewed by: Bryan O'Donoghue
> > - added reviewed by: Krzysztof Kozlowski
> > - patch 2/7: Conditionally register video nodes
> > - new functionality required to support AR50_LITE
> > - patch 3/7: Add Support for AR50 LITE video core
> > - completely rewritten - lite platforms are extensions of previous HFI_XXX
> > - patch 4/7: HFI platform V4 capabilities
> > - use HFI 4XX instead of HFI 6XX as per review
> > - patch 5/7: Add DT compatible and capabilities
> > - added reviewed by: Bryan O'Donoghue
> > - enabled new option min_fw_version
> > - patch 6/7: Add Venus video node for 2290
> > - added reviewed by: Konrad Dybcio
> > - removed status property
> > - patch 7/7: Enable Venus on 2210 RB1 board
> > - new
> >
> > Changes since v4:
> > - patch 1/5:
> > - added reviewed by: Krzysztof Kozlowski
> > - updated example section
> > - patch 2/5:
> > - added reviewed by: Bryan O'Donoghue
> > - Fixed Co-developed-by order
> > - patch 3/5:
> > - patch 4/5:
> > - removed encode-node (userspace exposure)
> > - fixed Co-developed-by order
> > - patch 5/5:
> > - fixed venus register region
> > - power-domain-names: one per line
> > - clock-names: one per line
> > - fixed interconnect tags
> > - empty line before subnode
> > - enable the venus node
> >
> > Changes since v3:
> > - Fixed schema commit subject.
> >
> > Changes since v2:
> > - Removed IS_HFI/IS_VPU macros
> > - checkpatch.pl --strict fixes:
> > - convert macro to static inline to avoid argument reuse side effect
> >
> > Changes since v1:
> > - Added IS_HFI macro usage
> > - Moved schema patch to top
> > - Fixed commit messages
> >
> > This patch series adds support for the Venus video decoder/encoder block
> > present on the Qualcomm QCM2290.
> >
> > This series functionally depends on the following patch:
> >
> > clk: qcom: gcc-qcm2290: Set HW_CTRL_TRIGGER for video GDSC
> > https://lore.kernel.org/all/20250613102245.782511-1-loic.poulain@oss.qualcomm.com/
> >
> > Please ensure the above patch is applied before this series.
> >
> > The QCM2290 integrates an AR50_LITE core, a low-power implementation of
> > Venus supporting H.264, HEVC (H.265), and VP9 decoding as well as H.264
> > and H.265 encoding.
> >
> > The series includes:
> > - DT binding schema for qcom,qcm2290-venus
> > - SoC integration via qcm2290.dtsi
> > - Resource table definitions and frequency scaling
> > - Platform capability registration for the AR50_LITE core decoding block.
> >
> > Limitations:
> > - The hardware does not support concurrent operation at FullHD.
> > - Encoding is not supported in firmware version before 6.0.54
> >
> > Firmware:
> > - This code has been tested with 6.0.52, 6.0.53, 6.0.54-PRERELEASE
> >
> > Some basic Tests:
> >
> > Decoding and Encoding were verified on the QCOM RB1 platform using
> > GStreamer with V4L2-based decode plugins.
> >
> > The following pipelines were used for playback 1280x720 and 1920x1080
> > H.264, HEVC and VP9 videos from https://www.elecard.com/videos.
> >
> > Decoding:
> > [H.264]
> > gst-launch-1.0 filesrc location=videos/xxxxx.mp4 \
> > ! qtdemux name=demux demux.video_0 ! queue ! h264parse ! v4l2h264dec \
> > ! videoconvert ! autovideosink
> >
> > [H.265]
> > gst-launch-1.0 filesrc location=videos/xxxxx.mp4 \
> > ! qtdemux name=demux demux.video_0 ! queue ! h265parse ! v4l2h265dec \
> > ! videoconvert ! autovideosink
> >
> > [VP9]
> > gst-launch-1.0 filesrc location=videos/xxxxx.webm \
> > ! matroskademux ! queue ! v4l2vp9dec \
> > ! videoconvert ! autovideosink
> >
> > Encoding:
> > [H.264]
> > gst-launch-1.0 videotestsrc num-buffers=30 \
> > ! video/x-raw,width=1280,height=720,framerate=30/1 \
> > ! v4l2h264enc ! h264parse ! mp4mux ! filesink location=/tmp/output.mp4
> >
> > [H.265]
> > gst-launch-1.0 videotestsrc num-buffers=30 \
> > ! video/x-raw,width=1920,height=1080,framerate=30/1 \
> > ! v4l2h265enc ! h265parse ! mp4mux ! filesink location=/tmp/output.mp4
> >
> > Concurrency:
> > gst-launch-1.0 -v videotestsrc num-buffers=1000 \
> > ! video/x-raw,format=NV12,width=1280,height=720,framerate=30/1 \
> > ! v4l2h264enc capture-io-mode=4 output-io-mode=2 ! h264parse \
> > ! v4l2h264dec capture-io-mode=4 output-io-mode=2 ! videoconvert \
> > ! autovideosink
> >
> > [Fluster]
> > The H.264 decoder was also tested using the Fluster test suite
> > (version: v0.4.0-12-g33566abd0964).
> > Target: GStreamer-H.264-V4L2-Gst1.0, Test Suite: JVT-AVC_V1
> > Result: 126/135 tests passed
> > Failures:
> > FM1_BT_B, FM1_FT_E, FM2_SVA_C, BA3_SVA_C, SP1_BT_A,
> > SP2_BT_B, MR6_BT_B, MR7_BT_B, MR8_BT_B
> >
> > ---
> >
> > Jorge Ramirez-Ortiz (8):
> > media: dt-bindings: venus: Add qcm2290 dt schema
> > media: venus: Define minimum valid firmware version
> > media: venus: Add framework support for AR50_LITE video core
> > media: venus: hfi_plat_v4: Add capabilities for the 4XX lite core
> > media: venus: core: Sort dt_match alphabetically.
> > media: venus: core: Add qcm2290 DT compatible and resource data
> > arm64: dts: qcom: qcm2290: Add Venus video node
> > arm64: dts: qcom: qrb2210-rb1: Enable Venus
> >
> > .../bindings/media/qcom,qcm2290-venus.yaml | 130 ++++++++++++
> > arch/arm64/boot/dts/qcom/qcm2290.dtsi | 55 +++++
> > arch/arm64/boot/dts/qcom/qrb2210-rb1.dts | 4 +
> > drivers/media/platform/qcom/venus/core.c | 109 +++++++---
> > drivers/media/platform/qcom/venus/core.h | 18 +-
> > drivers/media/platform/qcom/venus/firmware.c | 30 +++
> > drivers/media/platform/qcom/venus/firmware.h | 2 +
> > drivers/media/platform/qcom/venus/helpers.c | 12 +-
> > .../media/platform/qcom/venus/hfi_parser.c | 2 +-
> > .../media/platform/qcom/venus/hfi_platform.c | 23 ++-
> > .../media/platform/qcom/venus/hfi_platform.h | 34 ++--
> > .../platform/qcom/venus/hfi_platform_v4.c | 188 ++++++++++++++++--
> > .../platform/qcom/venus/hfi_platform_v6.c | 33 ++-
> > drivers/media/platform/qcom/venus/hfi_venus.c | 25 ++-
> > .../media/platform/qcom/venus/hfi_venus_io.h | 4 +
> > .../media/platform/qcom/venus/pm_helpers.c | 2 +-
> > 16 files changed, 582 insertions(+), 89 deletions(-)
> > create mode 100644 Documentation/devicetree/bindings/media/qcom,qcm2290-venus.yaml
> >
>
> Trying to apply your series and getting a few or more than one splat anyway,
> on media-comitters/next
>
> Could you fix this series and test up as a V10 ?
sure, let me rebase and retest.
FYI when I posted I applied it on top
media: rkvdec: Unstage the driver
The TODO list for unstaging being empty, the driver can now be moved to the
main media folder.
Also add myself as maintainer.
Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
>
> https://gitlab.freedesktop.org/linux-media/users/bodonoghue/-/commits/b4/bod-media-committers-next-platform-qcom-6.17-rc1
>
> ---
> bod
>
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core
2025-08-13 22:22 ` Jorge Ramirez
@ 2025-08-13 22:42 ` Jorge Ramirez
0 siblings, 0 replies; 23+ messages in thread
From: Jorge Ramirez @ 2025-08-13 22:42 UTC (permalink / raw)
To: Jorge Ramirez
Cc: Bryan O'Donoghue, quic_vgarodia, quic_dikshita, krzk+dt,
konradybcio, dmitry.baryshkov, mchehab, robh, andersson,
linux-arm-msm, linux-media, devicetree, linux-kernel
On 14/08/25 00:22:29, Jorge Ramirez wrote:
> > Trying to apply your series and getting a few or more than one splat anyway,
> > on media-comitters/next
> >
> > Could you fix this series and test up as a V10 ?
>
> sure, let me rebase and retest.
>
> FYI when I posted I applied it on top
>
>
> media: rkvdec: Unstage the driver
>
> The TODO list for unstaging being empty, the driver can now be moved to the
> main media folder.
>
> Also add myself as maintainer.
>
> Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
>
>
> >
> > https://gitlab.freedesktop.org/linux-media/users/bodonoghue/-/commits/b4/bod-media-committers-next-platform-qcom-6.17-rc1
> >
> > ---
> > bod
> >
> >
um, are these venus patches in next already merged?
16 hours.. 277966749f46 media: Reset file->private_data to NULL in v4l2_fh_del() Laurent ..[Hans Verkuil]
16 hours.. 47f4b1acb4d5 media: Set file->private_data in v4l2_fh_add() Laurent ..[Hans Verkuil]
16 hours.. 32eab5181105 media: qcom: venus: Pass file pointer to venus_close_commo.. Laurent ..[Hans Verkuil]
16 hours.. 8003313d388f media: Replace file->private_data access with file_to_v4l2.. Laurent ..[Hans Verkuil]
should we try to keep a consistent subject format, for example:
media: venus: core: Add qcm2290 DT compatible and resources
media: venus: core: Sort dt_match alphabetically
media: venus: hfi_plat_v4: Add capabilities for the 4XX line
instead of mixing formats like:
media: Reset file->private_data to NULL in v4l2_fh_del()
media: qcom: venus: Pass file pointer to venus_close_common()
This way the commit history stays more coherent when searching for "media: venus:"....anything we can do about it?
will post my update in the morning after testing
^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2025-08-13 22:42 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-08 8:52 [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
2025-08-08 8:52 ` [PATCH v9 1/8] media: dt-bindings: venus: Add qcm2290 dt schema Jorge Ramirez-Ortiz
2025-08-08 8:52 ` [PATCH v9 2/8] media: venus: Define minimum valid firmware version Jorge Ramirez-Ortiz
2025-08-08 9:01 ` Bryan O'Donoghue
2025-08-08 10:13 ` Dikshita Agarwal
2025-08-08 8:52 ` [PATCH v9 3/8] media: venus: Add framework support for AR50_LITE video core Jorge Ramirez-Ortiz
2025-08-08 9:10 ` Bryan O'Donoghue
2025-08-11 10:03 ` Dikshita Agarwal
2025-08-08 8:52 ` [PATCH v9 4/8] media: venus: hfi_plat_v4: Add capabilities for the 4XX lite core Jorge Ramirez-Ortiz
2025-08-11 10:05 ` Dikshita Agarwal
2025-08-08 8:52 ` [PATCH v9 5/8] media: venus: core: Sort dt_match alphabetically Jorge Ramirez-Ortiz
2025-08-08 9:11 ` Bryan O'Donoghue
2025-08-08 10:16 ` Dikshita Agarwal
2025-08-08 8:52 ` [PATCH v9 6/8] media: venus: core: Add qcm2290 DT compatible and resource data Jorge Ramirez-Ortiz
2025-08-08 9:02 ` Bryan O'Donoghue
2025-08-08 10:15 ` Dikshita Agarwal
2025-08-08 8:52 ` [PATCH v9 7/8] arm64: dts: qcom: qcm2290: Add Venus video node Jorge Ramirez-Ortiz
2025-08-08 8:53 ` [PATCH v9 8/8] arm64: dts: qcom: qrb2210-rb1: Enable Venus Jorge Ramirez-Ortiz
2025-08-08 10:26 ` Dikshita Agarwal
2025-08-13 22:18 ` [PATCH v9 0/8] media: venus: Add QCM2290 support with AR50_LITE core Bryan O'Donoghue
2025-08-13 22:22 ` Jorge Ramirez
2025-08-13 22:42 ` Jorge Ramirez
-- strict thread matches above, loose matches on Subject: below --
2025-08-08 8:49 Jorge Ramirez-Ortiz
2025-08-08 8:49 ` [PATCH v9 3/8] media: venus: Add framework support for AR50_LITE video core Jorge Ramirez-Ortiz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).