* [PATCH v5 0/5] media: venus: Add QCM2290 support with AR50_LITE core
@ 2025-06-26 13:59 Jorge Ramirez-Ortiz
2025-06-26 13:59 ` [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema Jorge Ramirez-Ortiz
` (4 more replies)
0 siblings, 5 replies; 42+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-06-26 13:59 UTC (permalink / raw)
To: jorge.ramirez, krzk+dt, bryan.odonoghue, quic_vgarodia,
quic_dikshita, mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
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.
Only video decoding is supported in this set - video encoding should
follow up in the coming weeks.
The QCM2290 integrates an AR50_LITE core, a low-power implementation of
Venus supporting H.264, HEVC (H.265), and VP9 decoding.
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.
Decoding was 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.
[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
[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 (5):
media: dt-bindings: venus: Add qcm2290 dt schema
media: venus: vdec: AR50_LITE video core support
media: venus: hfi_plat_v6_lite: Populate decode capabilities
media: venus: core: Add qcm2290 DT compatible and resource data
arm64: dts: qcom: qcm2290: Add venus video node
.../bindings/media/qcom,qcm2290-venus.yaml | 127 +++++++++++++++
arch/arm64/boot/dts/qcom/qcm2290.dtsi | 57 +++++++
drivers/media/platform/qcom/venus/Makefile | 2 +-
drivers/media/platform/qcom/venus/core.c | 50 +++++-
drivers/media/platform/qcom/venus/core.h | 11 +-
drivers/media/platform/qcom/venus/firmware.c | 8 +-
drivers/media/platform/qcom/venus/helpers.c | 80 ++++++++++
drivers/media/platform/qcom/venus/helpers.h | 2 +
.../media/platform/qcom/venus/hfi_helper.h | 10 +-
.../media/platform/qcom/venus/hfi_platform.c | 2 +
.../media/platform/qcom/venus/hfi_platform.h | 1 +
.../qcom/venus/hfi_platform_v6_lite.c | 148 ++++++++++++++++++
drivers/media/platform/qcom/venus/hfi_venus.c | 14 +-
.../media/platform/qcom/venus/pm_helpers.c | 1 +
drivers/media/platform/qcom/venus/vdec.c | 15 +-
15 files changed, 503 insertions(+), 25 deletions(-)
create mode 100644 Documentation/devicetree/bindings/media/qcom,qcm2290-venus.yaml
create mode 100644 drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
--
2.34.1
^ permalink raw reply [flat|nested] 42+ messages in thread
* [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema
2025-06-26 13:59 [PATCH v5 0/5] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
@ 2025-06-26 13:59 ` Jorge Ramirez-Ortiz
2025-06-26 14:40 ` Bryan O'Donoghue
2025-06-27 12:06 ` Vikash Garodia
2025-06-26 13:59 ` [PATCH v5 2/5] media: venus: vdec: AR50_LITE video core support Jorge Ramirez-Ortiz
` (3 subsequent siblings)
4 siblings, 2 replies; 42+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-06-26 13:59 UTC (permalink / raw)
To: jorge.ramirez, krzk+dt, bryan.odonoghue, quic_vgarodia,
quic_dikshita, mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
Add a schema for the venus video encoder/decoder on the qcm2290.
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
.../bindings/media/qcom,qcm2290-venus.yaml | 127 ++++++++++++++++++
1 file changed, 127 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..a9f89b545334
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/qcom,qcm2290-venus.yaml
@@ -0,0 +1,127 @@
+# 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:
+ - Vikash Garodia <quic_vgarodia@quicinc.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:
+ minItems: 1
+ 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/interrupt-controller/arm-gic.h>
+ #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/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-133000000 {
+ opp-hz = /bits/ 64 <133000000>;
+ 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] 42+ messages in thread
* [PATCH v5 2/5] media: venus: vdec: AR50_LITE video core support
2025-06-26 13:59 [PATCH v5 0/5] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
2025-06-26 13:59 ` [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema Jorge Ramirez-Ortiz
@ 2025-06-26 13:59 ` Jorge Ramirez-Ortiz
2025-06-27 12:47 ` Dikshita Agarwal
2025-06-26 13:59 ` [PATCH v5 3/5] media: venus: hfi_plat_v6_lite: Populate decode capabilities Jorge Ramirez-Ortiz
` (2 subsequent siblings)
4 siblings, 1 reply; 42+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-06-26 13:59 UTC (permalink / raw)
To: jorge.ramirez, krzk+dt, bryan.odonoghue, quic_vgarodia,
quic_dikshita, mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
The AR50_LITE is a streamlined 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.
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>
---
drivers/media/platform/qcom/venus/core.c | 11 ++-
drivers/media/platform/qcom/venus/core.h | 11 ++-
drivers/media/platform/qcom/venus/firmware.c | 8 +-
drivers/media/platform/qcom/venus/helpers.c | 80 +++++++++++++++++++
drivers/media/platform/qcom/venus/helpers.h | 2 +
.../media/platform/qcom/venus/hfi_helper.h | 10 ++-
drivers/media/platform/qcom/venus/hfi_venus.c | 14 ++--
.../media/platform/qcom/venus/pm_helpers.c | 1 +
drivers/media/platform/qcom/venus/vdec.c | 15 ++--
9 files changed, 128 insertions(+), 24 deletions(-)
diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
index d305d74bb152..736ef53d988d 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;
diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
index b412e0c5515a..e755a28e919b 100644
--- a/drivers/media/platform/qcom/venus/core.h
+++ b/drivers/media/platform/qcom/venus/core.h
@@ -382,6 +382,7 @@ enum venus_inst_modes {
* @lock: instance lock
* @core: a reference to the core struct
* @clk_data: clock data per core ID
+ * @eosbufs: a lit of EOS buffers
* @dpbbufs: a list of decoded picture buffers
* @internalbufs: a list of internal bufferes
* @registeredbufs: a list of registered capture bufferes
@@ -450,6 +451,7 @@ struct venus_inst {
struct mutex lock;
struct venus_core *core;
struct clock_data clk_data;
+ struct list_head eosbufs;
struct list_head dpbbufs;
struct list_head internalbufs;
struct list_head registeredbufs;
@@ -520,7 +522,14 @@ struct venus_inst {
#define IS_V1(core) ((core)->res->hfi_version == HFI_VERSION_1XX)
#define IS_V3(core) ((core)->res->hfi_version == HFI_VERSION_3XX)
#define IS_V4(core) ((core)->res->hfi_version == HFI_VERSION_4XX)
-#define IS_V6(core) ((core)->res->hfi_version == HFI_VERSION_6XX)
+static inline bool IS_V6(struct venus_core *core)
+{
+ if (WARN_ON_ONCE(!core))
+ return false;
+
+ return core->res->hfi_version == HFI_VERSION_6XX ||
+ core->res->hfi_version == HFI_VERSION_6XX_LITE;
+}
#define IS_AR50(core) ((core)->res->vpu_version == VPU_VERSION_AR50)
#define IS_AR50_LITE(core) ((core)->res->vpu_version == VPU_VERSION_AR50_LITE)
diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
index 66a18830e66d..f8dcef0426ac 100644
--- a/drivers/media/platform/qcom/venus/firmware.c
+++ b/drivers/media/platform/qcom/venus/firmware.c
@@ -30,7 +30,7 @@ static void venus_reset_cpu(struct venus_core *core)
u32 fw_size = core->fw.mapped_mem_size;
void __iomem *wrapper_base;
- if (IS_IRIS2_1(core))
+ if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
wrapper_base = core->wrapper_tz_base;
else
wrapper_base = core->wrapper_base;
@@ -42,7 +42,7 @@ static void venus_reset_cpu(struct venus_core *core)
writel(fw_size, wrapper_base + WRAPPER_NONPIX_START_ADDR);
writel(fw_size, wrapper_base + WRAPPER_NONPIX_END_ADDR);
- if (IS_IRIS2_1(core)) {
+ if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
/* Bring XTSS out of reset */
writel(0, wrapper_base + WRAPPER_TZ_XTSS_SW_RESET);
} else {
@@ -68,7 +68,7 @@ int venus_set_hw_state(struct venus_core *core, bool resume)
if (resume) {
venus_reset_cpu(core);
} else {
- if (IS_IRIS2_1(core))
+ if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
writel(WRAPPER_XTSS_SW_RESET_BIT,
core->wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
else
@@ -181,7 +181,7 @@ static int venus_shutdown_no_tz(struct venus_core *core)
void __iomem *wrapper_base = core->wrapper_base;
void __iomem *wrapper_tz_base = core->wrapper_tz_base;
- if (IS_IRIS2_1(core)) {
+ if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
/* Assert the reset to XTSS */
reg = readl(wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
reg |= WRAPPER_XTSS_SW_RESET_BIT;
diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c
index 8295542e1a7c..812bec9a05be 100644
--- a/drivers/media/platform/qcom/venus/helpers.c
+++ b/drivers/media/platform/qcom/venus/helpers.c
@@ -230,6 +230,79 @@ int venus_helper_alloc_dpb_bufs(struct venus_inst *inst)
}
EXPORT_SYMBOL_GPL(venus_helper_alloc_dpb_bufs);
+static void free_eos_buf(struct venus_inst *inst, struct intbuf *buf)
+{
+ list_del_init(&buf->list);
+ dma_free_attrs(inst->core->dev, buf->size, buf->va, buf->da,
+ buf->attrs);
+ kfree(buf);
+}
+
+int venus_helper_free_eos_bufs(struct venus_inst *inst)
+{
+ struct intbuf *buf, *n;
+
+ list_for_each_entry_safe(buf, n, &inst->eosbufs, list) {
+ free_eos_buf(inst, buf);
+ }
+
+ if (list_empty(&inst->eosbufs))
+ INIT_LIST_HEAD(&inst->eosbufs);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(venus_helper_free_eos_bufs);
+
+int venus_helper_alloc_eos_buf(struct venus_inst *inst,
+ struct hfi_frame_data *data)
+{
+ struct venus_core *core = inst->core;
+ struct device *dev = core->dev;
+ struct intbuf *buf;
+ int ret = 0;
+
+ memset(data, 0, sizeof(*data));
+
+ data->buffer_type = HFI_BUFFER_INPUT;
+ data->flags = HFI_BUFFERFLAG_EOS;
+
+ if (IS_AR50_LITE(inst->core)) {
+ /* We must send valid sizes and addresses */
+ buf = kzalloc(sizeof(*buf), GFP_KERNEL);
+ if (!buf) {
+ ret = -ENOMEM;
+ goto fail;
+ }
+
+ buf->type = HFI_BUFFER_INPUT;
+ buf->size = SZ_4K;
+ buf->attrs = DMA_ATTR_NO_KERNEL_MAPPING;
+ buf->va = dma_alloc_attrs(dev, buf->size, &buf->da, GFP_KERNEL,
+ buf->attrs);
+ if (!buf->va) {
+ ret = -ENOMEM;
+ goto fail;
+ }
+
+ list_add_tail(&buf->list, &inst->eosbufs);
+
+ data->alloc_len = buf->size;
+ data->device_addr = buf->da;
+
+ } else if (IS_V6(inst->core) &&
+ is_fw_rev_or_older(inst->core, 1, 0, 87)) {
+ data->device_addr = 0;
+ } else {
+ data->device_addr = 0xdeadb000;
+ }
+
+ return 0;
+fail:
+ kfree(buf);
+ return ret;
+}
+EXPORT_SYMBOL_GPL(venus_helper_alloc_eos_buf);
+
static int intbufs_set_buffer(struct venus_inst *inst, u32 type)
{
struct venus_core *core = inst->core;
@@ -630,6 +703,13 @@ static int platform_get_bufreq(struct venus_inst *inst, u32 buftype,
if (!hfi_plat || !hfi_plat->bufreq)
return -EINVAL;
+ /* Firmware buffer requirements for internal buffers only */
+ if (IS_AR50_LITE(inst->core))
+ if (buftype != HFI_BUFFER_INPUT &&
+ buftype != HFI_BUFFER_OUTPUT &&
+ buftype != HFI_BUFFER_OUTPUT2)
+ return -EINVAL;
+
params.version = version;
params.num_vpp_pipes = inst->core->res->num_vpp_pipes;
diff --git a/drivers/media/platform/qcom/venus/helpers.h b/drivers/media/platform/qcom/venus/helpers.h
index 358e4f39c9c0..bf55fe3b8747 100644
--- a/drivers/media/platform/qcom/venus/helpers.h
+++ b/drivers/media/platform/qcom/venus/helpers.h
@@ -58,6 +58,8 @@ int venus_helper_get_out_fmts(struct venus_inst *inst, u32 fmt, u32 *out_fmt,
bool venus_helper_check_format(struct venus_inst *inst, u32 v4l2_pixfmt);
int venus_helper_alloc_dpb_bufs(struct venus_inst *inst);
int venus_helper_free_dpb_bufs(struct venus_inst *inst);
+int venus_helper_alloc_eos_buf(struct venus_inst *inst, struct hfi_frame_data *data);
+int venus_helper_free_eos_bufs(struct venus_inst *inst);
int venus_helper_intbufs_alloc(struct venus_inst *inst);
int venus_helper_intbufs_free(struct venus_inst *inst);
int venus_helper_intbufs_realloc(struct venus_inst *inst);
diff --git a/drivers/media/platform/qcom/venus/hfi_helper.h b/drivers/media/platform/qcom/venus/hfi_helper.h
index f44059f19505..128ddf8e3cd5 100644
--- a/drivers/media/platform/qcom/venus/hfi_helper.h
+++ b/drivers/media/platform/qcom/venus/hfi_helper.h
@@ -397,13 +397,16 @@
#define HFI_BUFFER_INTERNAL_PERSIST_1 0x5
#define HFI_BUFFER_INTERNAL_SCRATCH(ver) \
(((ver) == HFI_VERSION_4XX || \
- (ver) == HFI_VERSION_6XX) ? 0x6 : 0x1000001)
+ (ver) == HFI_VERSION_6XX || (ver) == HFI_VERSION_6XX_LITE) \
+ ? 0x6 : 0x1000001)
#define HFI_BUFFER_INTERNAL_SCRATCH_1(ver) \
(((ver) == HFI_VERSION_4XX || \
- (ver) == HFI_VERSION_6XX) ? 0x7 : 0x1000005)
+ (ver) == HFI_VERSION_6XX || (ver) == HFI_VERSION_6XX_LITE) \
+ ? 0x7 : 0x1000005)
#define HFI_BUFFER_INTERNAL_SCRATCH_2(ver) \
(((ver) == HFI_VERSION_4XX || \
- (ver) == HFI_VERSION_6XX) ? 0x8 : 0x1000006)
+ (ver) == HFI_VERSION_6XX || (ver) == HFI_VERSION_6XX_LITE) \
+ ? 0x8 : 0x1000006)
#define HFI_BUFFER_EXTRADATA_INPUT(ver) \
(((ver) == HFI_VERSION_4XX) ? 0xc : 0x1000002)
#define HFI_BUFFER_EXTRADATA_OUTPUT(ver) \
@@ -561,6 +564,7 @@ enum hfi_version {
HFI_VERSION_3XX,
HFI_VERSION_4XX,
HFI_VERSION_6XX,
+ HFI_VERSION_6XX_LITE,
};
struct hfi_buffer_info {
diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c
index b5f2ea879950..302776bf8fe6 100644
--- a/drivers/media/platform/qcom/venus/hfi_venus.c
+++ b/drivers/media/platform/qcom/venus/hfi_venus.c
@@ -497,7 +497,7 @@ 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);
}
@@ -565,6 +565,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);
@@ -1134,7 +1137,8 @@ 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_IRIS2(core) || IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
status & WRAPPER_INTR_STATUS_A2HWD_MASK_V6 ||
status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
@@ -1146,7 +1150,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;
@@ -1531,7 +1535,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);
@@ -1551,7 +1555,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/pm_helpers.c b/drivers/media/platform/qcom/venus/pm_helpers.c
index 409aa9bd0b5d..5d9dfe3fd043 100644
--- a/drivers/media/platform/qcom/venus/pm_helpers.c
+++ b/drivers/media/platform/qcom/venus/pm_helpers.c
@@ -1168,6 +1168,7 @@ const struct venus_pm_ops *venus_pm_get(enum hfi_version version)
return &pm_ops_v3;
case HFI_VERSION_4XX:
case HFI_VERSION_6XX:
+ case HFI_VERSION_6XX_LITE:
return &pm_ops_v4;
}
diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c
index 99ce5fd41577..87c7901b280e 100644
--- a/drivers/media/platform/qcom/venus/vdec.c
+++ b/drivers/media/platform/qcom/venus/vdec.c
@@ -550,7 +550,7 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
{
struct venus_inst *inst = to_inst(file);
struct vb2_queue *dst_vq;
- struct hfi_frame_data fdata = {0};
+ struct hfi_frame_data fdata;
int ret;
ret = v4l2_m2m_ioctl_try_decoder_cmd(file, fh, cmd);
@@ -561,18 +561,15 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
if (cmd->cmd == V4L2_DEC_CMD_STOP) {
/*
- * Implement V4L2_DEC_CMD_STOP by enqueue an empty buffer on
+ * Implement V4L2_DEC_CMD_STOP by enqueue a buffer on
* decoder input to signal EOS.
*/
if (!(inst->streamon_out && inst->streamon_cap))
goto unlock;
- fdata.buffer_type = HFI_BUFFER_INPUT;
- fdata.flags |= HFI_BUFFERFLAG_EOS;
- if (IS_V6(inst->core) && is_fw_rev_or_older(inst->core, 1, 0, 87))
- fdata.device_addr = 0;
- else
- fdata.device_addr = 0xdeadb000;
+ ret = venus_helper_alloc_eos_buf(inst, &fdata);
+ if (ret)
+ goto unlock;
ret = hfi_session_process_buf(inst, &fdata);
@@ -1332,6 +1329,7 @@ static void vdec_session_release(struct venus_inst *inst)
hfi_session_abort(inst);
venus_helper_free_dpb_bufs(inst);
+ venus_helper_free_eos_bufs(inst);
venus_pm_load_scale(inst);
INIT_LIST_HEAD(&inst->registeredbufs);
mutex_unlock(&inst->lock);
@@ -1682,6 +1680,7 @@ static int vdec_open(struct file *file)
if (!inst)
return -ENOMEM;
+ INIT_LIST_HEAD(&inst->eosbufs);
INIT_LIST_HEAD(&inst->dpbbufs);
INIT_LIST_HEAD(&inst->registeredbufs);
INIT_LIST_HEAD(&inst->internalbufs);
--
2.34.1
^ permalink raw reply related [flat|nested] 42+ messages in thread
* [PATCH v5 3/5] media: venus: hfi_plat_v6_lite: Populate decode capabilities
2025-06-26 13:59 [PATCH v5 0/5] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
2025-06-26 13:59 ` [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema Jorge Ramirez-Ortiz
2025-06-26 13:59 ` [PATCH v5 2/5] media: venus: vdec: AR50_LITE video core support Jorge Ramirez-Ortiz
@ 2025-06-26 13:59 ` Jorge Ramirez-Ortiz
2025-06-26 14:43 ` Bryan O'Donoghue
2025-06-27 13:32 ` Dikshita Agarwal
2025-06-26 13:59 ` [PATCH v5 4/5] media: venus: core: Add qcm2290 DT compatible and resource data Jorge Ramirez-Ortiz
2025-06-26 13:59 ` [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node Jorge Ramirez-Ortiz
4 siblings, 2 replies; 42+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-06-26 13:59 UTC (permalink / raw)
To: jorge.ramirez, krzk+dt, bryan.odonoghue, quic_vgarodia,
quic_dikshita, mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
Add hfi platform file with decoding capabilities for hfi v6_lite.
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
---
drivers/media/platform/qcom/venus/Makefile | 2 +-
.../media/platform/qcom/venus/hfi_platform.c | 2 +
.../media/platform/qcom/venus/hfi_platform.h | 1 +
.../qcom/venus/hfi_platform_v6_lite.c | 148 ++++++++++++++++++
4 files changed, 152 insertions(+), 1 deletion(-)
create mode 100644 drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
diff --git a/drivers/media/platform/qcom/venus/Makefile b/drivers/media/platform/qcom/venus/Makefile
index 91ee6be10292..4a6a942db58b 100644
--- a/drivers/media/platform/qcom/venus/Makefile
+++ b/drivers/media/platform/qcom/venus/Makefile
@@ -5,7 +5,7 @@ venus-core-objs += core.o helpers.o firmware.o \
hfi_venus.o hfi_msgs.o hfi_cmds.o hfi.o \
hfi_parser.o pm_helpers.o dbgfs.o \
hfi_platform.o hfi_platform_v4.o \
- hfi_platform_v6.o hfi_plat_bufs_v6.o \
+ hfi_platform_v6.o hfi_plat_bufs_v6.o hfi_platform_v6_lite.o \
venus-dec-objs += vdec.o vdec_ctrls.o
venus-enc-objs += venc.o venc_ctrls.o
diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
index 643e5aa138f5..f56b8f9946d7 100644
--- a/drivers/media/platform/qcom/venus/hfi_platform.c
+++ b/drivers/media/platform/qcom/venus/hfi_platform.c
@@ -13,6 +13,8 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
return &hfi_plat_v4;
case HFI_VERSION_6XX:
return &hfi_plat_v6;
+ case HFI_VERSION_6XX_LITE:
+ return &hfi_plat_v6_lite;
default:
break;
}
diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
index ec89a90a8129..6356e4bd0de2 100644
--- a/drivers/media/platform/qcom/venus/hfi_platform.h
+++ b/drivers/media/platform/qcom/venus/hfi_platform.h
@@ -58,6 +58,7 @@ struct hfi_platform {
extern const struct hfi_platform hfi_plat_v4;
extern const struct hfi_platform hfi_plat_v6;
+extern const struct hfi_platform hfi_plat_v6_lite;
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,
diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
new file mode 100644
index 000000000000..41958a3e353b
--- /dev/null
+++ b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
@@ -0,0 +1,148 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2025, The Linux Foundation. All rights reserved.
+ */
+#include "hfi_platform.h"
+
+static const struct hfi_plat_caps caps[] = {
+{
+ .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, 1080, 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_1},
+ .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_41},
+ .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
+ .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_41},
+ .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_41},
+ .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, 1080, 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_MAIN},
+ .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
+ .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, 1080, 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,
+} };
+
+static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
+{
+ *entries = ARRAY_SIZE(caps);
+ return caps;
+}
+
+static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
+{
+ *enc_codecs = 0x0;
+ *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
+ HFI_VIDEO_CODEC_VP9;
+ *count = 3;
+}
+
+static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
+ { 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 },
+};
+
+static const struct hfi_platform_codec_freq_data *
+get_codec_freq_data(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;
+
+ for (i = 0; i < data_size; i++) {
+ if (data[i].pixfmt == pixfmt &&
+ data[i].session_type == session_type) {
+ found = &data[i];
+ break;
+ }
+ }
+
+ return found;
+}
+
+static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
+{
+ const struct hfi_platform_codec_freq_data *data;
+
+ data = get_codec_freq_data(session_type, codec);
+ if (data)
+ return data->vpp_freq;
+
+ return 0;
+}
+
+static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
+{
+ const struct hfi_platform_codec_freq_data *data;
+
+ data = get_codec_freq_data(session_type, codec);
+ if (data)
+ return data->vsp_freq;
+
+ return 0;
+}
+
+static unsigned long codec_lp_freq(u32 session_type, u32 codec)
+{
+ const struct hfi_platform_codec_freq_data *data;
+
+ data = get_codec_freq_data(session_type, codec);
+ if (data)
+ return data->low_power_freq;
+
+ return 0;
+}
+
+const struct hfi_platform hfi_plat_v6_lite = {
+ .codec_vpp_freq = codec_vpp_freq,
+ .codec_vsp_freq = codec_vsp_freq,
+ .codec_lp_freq = codec_lp_freq,
+ .codecs = get_codecs,
+ .capabilities = get_capabilities,
+ .bufreq = hfi_plat_bufreq_v6,
+};
--
2.34.1
^ permalink raw reply related [flat|nested] 42+ messages in thread
* [PATCH v5 4/5] media: venus: core: Add qcm2290 DT compatible and resource data
2025-06-26 13:59 [PATCH v5 0/5] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
` (2 preceding siblings ...)
2025-06-26 13:59 ` [PATCH v5 3/5] media: venus: hfi_plat_v6_lite: Populate decode capabilities Jorge Ramirez-Ortiz
@ 2025-06-26 13:59 ` Jorge Ramirez-Ortiz
2025-06-26 14:37 ` Bryan O'Donoghue
2025-06-27 13:16 ` Dikshita Agarwal
2025-06-26 13:59 ` [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node Jorge Ramirez-Ortiz
4 siblings, 2 replies; 42+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-06-26 13:59 UTC (permalink / raw)
To: jorge.ramirez, krzk+dt, bryan.odonoghue, quic_vgarodia,
quic_dikshita, mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
Add a qcm2290 compatible binding to the venus core.
Video encoding support is not exposed until the relevant hardware
capabilities are enabled.
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>
---
drivers/media/platform/qcom/venus/core.c | 39 ++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
index 736ef53d988d..f1f211ca1ce2 100644
--- a/drivers/media/platform/qcom/venus/core.c
+++ b/drivers/media/platform/qcom/venus/core.c
@@ -1062,6 +1062,44 @@ static const struct venus_resources sc7280_res = {
.enc_nodename = "video-encoder",
};
+static const struct freq_tbl qcm2290_freq_table[] = {
+ { 352800, 240000000 }, /* 1920x1088 @ 30 + 1280x720 @ 30 */
+ { 244800, 133000000 }, /* 1920x1088 @ 30 */
+};
+
+static const struct bw_tbl qcm2290_bw_table_dec[] = {
+ { 244800, 2128000, 0, 2128000, 0}, /* 1920x1088 @ 30 */
+};
+
+static const struct venus_resources qcm2290_res = {
+ .freq_tbl = qcm2290_freq_table,
+ .freq_tbl_size = ARRAY_SIZE(qcm2290_freq_table),
+ .bw_tbl_dec = qcm2290_bw_table_dec,
+ .bw_tbl_dec_size = ARRAY_SIZE(qcm2290_bw_table_dec),
+ .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_6XX_LITE,
+ .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",
+};
+
static const struct of_device_id venus_dt_match[] = {
{ .compatible = "qcom,msm8916-venus", .data = &msm8916_res, },
{ .compatible = "qcom,msm8996-venus", .data = &msm8996_res, },
@@ -1072,6 +1110,7 @@ static const struct of_device_id venus_dt_match[] = {
{ .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
{ .compatible = "qcom,sc7280-venus", .data = &sc7280_res, },
{ .compatible = "qcom,sm8250-venus", .data = &sm8250_res, },
+ { .compatible = "qcom,qcm2290-venus", .data = &qcm2290_res, },
{ }
};
MODULE_DEVICE_TABLE(of, venus_dt_match);
--
2.34.1
^ permalink raw reply related [flat|nested] 42+ messages in thread
* [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-26 13:59 [PATCH v5 0/5] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
` (3 preceding siblings ...)
2025-06-26 13:59 ` [PATCH v5 4/5] media: venus: core: Add qcm2290 DT compatible and resource data Jorge Ramirez-Ortiz
@ 2025-06-26 13:59 ` Jorge Ramirez-Ortiz
2025-06-26 14:05 ` Krzysztof Kozlowski
2025-06-27 12:10 ` Vikash Garodia
4 siblings, 2 replies; 42+ messages in thread
From: Jorge Ramirez-Ortiz @ 2025-06-26 13:59 UTC (permalink / raw)
To: jorge.ramirez, krzk+dt, bryan.odonoghue, quic_vgarodia,
quic_dikshita, mchehab, robh, conor+dt, konradybcio, 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>
---
arch/arm64/boot/dts/qcom/qcm2290.dtsi | 57 +++++++++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/qcm2290.dtsi b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
index f49ac1c1f8a3..5326c91a0ff0 100644
--- a/arch/arm64/boot/dts/qcom/qcm2290.dtsi
+++ b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
@@ -1628,6 +1628,63 @@ 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";
+
+ status = "okay";
+
+ venus_opp_table: opp-table {
+ compatible = "operating-points-v2";
+
+ opp-133000000 {
+ opp-hz = /bits/ 64 <133000000>;
+ 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] 42+ messages in thread
* Re: [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-26 13:59 ` [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node Jorge Ramirez-Ortiz
@ 2025-06-26 14:05 ` Krzysztof Kozlowski
2025-06-26 14:25 ` Jorge Ramirez
2025-06-27 12:10 ` Vikash Garodia
1 sibling, 1 reply; 42+ messages in thread
From: Krzysztof Kozlowski @ 2025-06-26 14:05 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, krzk+dt, bryan.odonoghue, quic_vgarodia,
quic_dikshita, mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 26/06/2025 15:59, Jorge Ramirez-Ortiz wrote:
> +
> + 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";
> +
> + status = "okay";
Drop, unless you override existing node, but then this should follow
standard override-label/phandle syntax.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-26 14:05 ` Krzysztof Kozlowski
@ 2025-06-26 14:25 ` Jorge Ramirez
2025-06-26 18:24 ` Konrad Dybcio
0 siblings, 1 reply; 42+ messages in thread
From: Jorge Ramirez @ 2025-06-26 14:25 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Jorge Ramirez-Ortiz, krzk+dt, bryan.odonoghue, quic_vgarodia,
quic_dikshita, mchehab, robh, conor+dt, konradybcio, andersson,
linux-arm-msm, linux-media, devicetree, linux-kernel
On 26/06/25 16:05:00, Krzysztof Kozlowski wrote:
> On 26/06/2025 15:59, Jorge Ramirez-Ortiz wrote:
> > +
> > + 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";
> > +
> > + status = "okay";
>
> Drop, unless you override existing node, but then this should follow
> standard override-label/phandle syntax.
>
yep
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 4/5] media: venus: core: Add qcm2290 DT compatible and resource data
2025-06-26 13:59 ` [PATCH v5 4/5] media: venus: core: Add qcm2290 DT compatible and resource data Jorge Ramirez-Ortiz
@ 2025-06-26 14:37 ` Bryan O'Donoghue
2025-06-27 13:16 ` Dikshita Agarwal
1 sibling, 0 replies; 42+ messages in thread
From: Bryan O'Donoghue @ 2025-06-26 14:37 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, krzk+dt, quic_vgarodia, quic_dikshita,
mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 26/06/2025 14:59, Jorge Ramirez-Ortiz wrote:
> Add a qcm2290 compatible binding to the venus core.
>
> Video encoding support is not exposed until the relevant hardware
> capabilities are enabled.
>
> 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>
> ---
> drivers/media/platform/qcom/venus/core.c | 39 ++++++++++++++++++++++++
> 1 file changed, 39 insertions(+)
>
> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> index 736ef53d988d..f1f211ca1ce2 100644
> --- a/drivers/media/platform/qcom/venus/core.c
> +++ b/drivers/media/platform/qcom/venus/core.c
> @@ -1062,6 +1062,44 @@ static const struct venus_resources sc7280_res = {
> .enc_nodename = "video-encoder",
> };
>
> +static const struct freq_tbl qcm2290_freq_table[] = {
> + { 352800, 240000000 }, /* 1920x1088 @ 30 + 1280x720 @ 30 */
> + { 244800, 133000000 }, /* 1920x1088 @ 30 */
> +};
> +
> +static const struct bw_tbl qcm2290_bw_table_dec[] = {
> + { 244800, 2128000, 0, 2128000, 0}, /* 1920x1088 @ 30 */
> +};
> +
> +static const struct venus_resources qcm2290_res = {
> + .freq_tbl = qcm2290_freq_table,
> + .freq_tbl_size = ARRAY_SIZE(qcm2290_freq_table),
> + .bw_tbl_dec = qcm2290_bw_table_dec,
> + .bw_tbl_dec_size = ARRAY_SIZE(qcm2290_bw_table_dec),
> + .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_6XX_LITE,
> + .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",
> +};
> +
> static const struct of_device_id venus_dt_match[] = {
> { .compatible = "qcom,msm8916-venus", .data = &msm8916_res, },
> { .compatible = "qcom,msm8996-venus", .data = &msm8996_res, },
> @@ -1072,6 +1110,7 @@ static const struct of_device_id venus_dt_match[] = {
> { .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
> { .compatible = "qcom,sc7280-venus", .data = &sc7280_res, },
> { .compatible = "qcom,sm8250-venus", .data = &sm8250_res, },
> + { .compatible = "qcom,qcm2290-venus", .data = &qcm2290_res, },
> { }
> };
> MODULE_DEVICE_TABLE(of, venus_dt_match);
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema
2025-06-26 13:59 ` [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema Jorge Ramirez-Ortiz
@ 2025-06-26 14:40 ` Bryan O'Donoghue
2025-06-27 12:06 ` Vikash Garodia
1 sibling, 0 replies; 42+ messages in thread
From: Bryan O'Donoghue @ 2025-06-26 14:40 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, krzk+dt, quic_vgarodia, quic_dikshita,
mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 26/06/2025 14:59, Jorge Ramirez-Ortiz wrote:
> Add a schema for the venus video encoder/decoder on the qcm2290.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> ---
> .../bindings/media/qcom,qcm2290-venus.yaml | 127 ++++++++++++++++++
> 1 file changed, 127 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..a9f89b545334
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/media/qcom,qcm2290-venus.yaml
> @@ -0,0 +1,127 @@
> +# 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:
> + - Vikash Garodia <quic_vgarodia@quicinc.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:
> + minItems: 1
> + 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/interrupt-controller/arm-gic.h>
> + #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/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-133000000 {
> + opp-hz = /bits/ 64 <133000000>;
> + required-opps = <&rpmpd_opp_low_svs>;
> + };
> + opp-240000000 {
> + opp-hz = /bits/ 64 <240000000>;
> + required-opps = <&rpmpd_opp_svs>;
> + };
> + };
> + };
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 3/5] media: venus: hfi_plat_v6_lite: Populate decode capabilities
2025-06-26 13:59 ` [PATCH v5 3/5] media: venus: hfi_plat_v6_lite: Populate decode capabilities Jorge Ramirez-Ortiz
@ 2025-06-26 14:43 ` Bryan O'Donoghue
2025-06-27 13:32 ` Dikshita Agarwal
1 sibling, 0 replies; 42+ messages in thread
From: Bryan O'Donoghue @ 2025-06-26 14:43 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, krzk+dt, quic_vgarodia, quic_dikshita,
mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 26/06/2025 14:59, Jorge Ramirez-Ortiz wrote:
> Add hfi platform file with decoding capabilities for hfi v6_lite.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/venus/Makefile | 2 +-
> .../media/platform/qcom/venus/hfi_platform.c | 2 +
> .../media/platform/qcom/venus/hfi_platform.h | 1 +
> .../qcom/venus/hfi_platform_v6_lite.c | 148 ++++++++++++++++++
> 4 files changed, 152 insertions(+), 1 deletion(-)
> create mode 100644 drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
>
> diff --git a/drivers/media/platform/qcom/venus/Makefile b/drivers/media/platform/qcom/venus/Makefile
> index 91ee6be10292..4a6a942db58b 100644
> --- a/drivers/media/platform/qcom/venus/Makefile
> +++ b/drivers/media/platform/qcom/venus/Makefile
> @@ -5,7 +5,7 @@ venus-core-objs += core.o helpers.o firmware.o \
> hfi_venus.o hfi_msgs.o hfi_cmds.o hfi.o \
> hfi_parser.o pm_helpers.o dbgfs.o \
> hfi_platform.o hfi_platform_v4.o \
> - hfi_platform_v6.o hfi_plat_bufs_v6.o \
> + hfi_platform_v6.o hfi_plat_bufs_v6.o hfi_platform_v6_lite.o \
>
> venus-dec-objs += vdec.o vdec_ctrls.o
> venus-enc-objs += venc.o venc_ctrls.o
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
> index 643e5aa138f5..f56b8f9946d7 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform.c
> +++ b/drivers/media/platform/qcom/venus/hfi_platform.c
> @@ -13,6 +13,8 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
> return &hfi_plat_v4;
> case HFI_VERSION_6XX:
> return &hfi_plat_v6;
> + case HFI_VERSION_6XX_LITE:
> + return &hfi_plat_v6_lite;
> default:
> break;
> }
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
> index ec89a90a8129..6356e4bd0de2 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform.h
> +++ b/drivers/media/platform/qcom/venus/hfi_platform.h
> @@ -58,6 +58,7 @@ struct hfi_platform {
>
> extern const struct hfi_platform hfi_plat_v4;
> extern const struct hfi_platform hfi_plat_v6;
> +extern const struct hfi_platform hfi_plat_v6_lite;
>
> 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,
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> new file mode 100644
> index 000000000000..41958a3e353b
> --- /dev/null
> +++ b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> @@ -0,0 +1,148 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2025, The Linux Foundation. All rights reserved.
> + */
> +#include "hfi_platform.h"
> +
> +static const struct hfi_plat_caps caps[] = {
> +{
> + .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, 1080, 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_1},
> + .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_41},
> + .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
> + .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_41},
> + .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_41},
> + .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, 1080, 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_MAIN},
> + .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
> + .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, 1080, 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,
> +} };
> +
> +static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
> +{
> + *entries = ARRAY_SIZE(caps);
> + return caps;
> +}
> +
> +static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> +{
> + *enc_codecs = 0x0;
> + *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> + HFI_VIDEO_CODEC_VP9;
> + *count = 3;
> +}
> +
> +static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
> + { 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 },
> +};
> +
> +static const struct hfi_platform_codec_freq_data *
> +get_codec_freq_data(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;
> +
> + for (i = 0; i < data_size; i++) {
> + if (data[i].pixfmt == pixfmt &&
> + data[i].session_type == session_type) {
> + found = &data[i];
> + break;
> + }
> + }
> +
> + return found;
> +}
> +
> +static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
> +{
> + const struct hfi_platform_codec_freq_data *data;
> +
> + data = get_codec_freq_data(session_type, codec);
> + if (data)
> + return data->vpp_freq;
> +
> + return 0;
> +}
> +
> +static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
> +{
> + const struct hfi_platform_codec_freq_data *data;
> +
> + data = get_codec_freq_data(session_type, codec);
> + if (data)
> + return data->vsp_freq;
> +
> + return 0;
> +}
> +
> +static unsigned long codec_lp_freq(u32 session_type, u32 codec)
> +{
> + const struct hfi_platform_codec_freq_data *data;
> +
> + data = get_codec_freq_data(session_type, codec);
> + if (data)
> + return data->low_power_freq;
> +
> + return 0;
> +}
> +
> +const struct hfi_platform hfi_plat_v6_lite = {
> + .codec_vpp_freq = codec_vpp_freq,
> + .codec_vsp_freq = codec_vsp_freq,
> + .codec_lp_freq = codec_lp_freq,
> + .codecs = get_codecs,
> + .capabilities = get_capabilities,
> + .bufreq = hfi_plat_bufreq_v6,
> +};
@Dikshita @Vikash happy enough with this ?
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-26 14:25 ` Jorge Ramirez
@ 2025-06-26 18:24 ` Konrad Dybcio
0 siblings, 0 replies; 42+ messages in thread
From: Konrad Dybcio @ 2025-06-26 18:24 UTC (permalink / raw)
To: Jorge Ramirez, Krzysztof Kozlowski
Cc: krzk+dt, bryan.odonoghue, quic_vgarodia, quic_dikshita, mchehab,
robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On 6/26/25 4:25 PM, Jorge Ramirez wrote:
> On 26/06/25 16:05:00, Krzysztof Kozlowski wrote:
>> On 26/06/2025 15:59, Jorge Ramirez-Ortiz wrote:
>>> +
>>> + 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";
>>> +
>>> + status = "okay";
>>
>> Drop, unless you override existing node, but then this should follow
>> standard override-label/phandle syntax.
>>
>
> yep
With that taken care of:
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Konrad
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema
2025-06-26 13:59 ` [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema Jorge Ramirez-Ortiz
2025-06-26 14:40 ` Bryan O'Donoghue
@ 2025-06-27 12:06 ` Vikash Garodia
2025-07-07 9:06 ` Jorge Ramirez
1 sibling, 1 reply; 42+ messages in thread
From: Vikash Garodia @ 2025-06-27 12:06 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, krzk+dt, bryan.odonoghue, quic_dikshita,
mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> Add a schema for the venus video encoder/decoder on the qcm2290.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> ---
> .../bindings/media/qcom,qcm2290-venus.yaml | 127 ++++++++++++++++++
> 1 file changed, 127 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..a9f89b545334
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/media/qcom,qcm2290-venus.yaml
> @@ -0,0 +1,127 @@
> +# 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:
> + - Vikash Garodia <quic_vgarodia@quicinc.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:
> + minItems: 1
> + maxItems: 5
2 should be good to support non secure usecases. 5 not needed.
> +
> + 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/interrupt-controller/arm-gic.h>
> + #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/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>;
update this accordingly.
> +
> + 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-133000000 {
> + opp-hz = /bits/ 64 <133000000>;
> + required-opps = <&rpmpd_opp_low_svs>;
> + };
This value is incorrect, fix it to 133330000.
> + opp-240000000 {
> + opp-hz = /bits/ 64 <240000000>;
> + required-opps = <&rpmpd_opp_svs>;
Do you see other corners in the reference catalog as well, not just the
downstream code ? OR did you limit this as the usecase do not demand higher corner ?
Regards,
Vikash
> + };
> + };
> + };
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-26 13:59 ` [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node Jorge Ramirez-Ortiz
2025-06-26 14:05 ` Krzysztof Kozlowski
@ 2025-06-27 12:10 ` Vikash Garodia
2025-06-27 12:33 ` Jorge Ramirez
1 sibling, 1 reply; 42+ messages in thread
From: Vikash Garodia @ 2025-06-27 12:10 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, krzk+dt, bryan.odonoghue, quic_dikshita,
mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> 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>
> ---
> arch/arm64/boot/dts/qcom/qcm2290.dtsi | 57 +++++++++++++++++++++++++++
> 1 file changed, 57 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/qcom/qcm2290.dtsi b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> index f49ac1c1f8a3..5326c91a0ff0 100644
> --- a/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> +++ b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> @@ -1628,6 +1628,63 @@ 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>;
keep only the non secure ones.
> +
> + 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";
> +
> + status = "okay";
> +
> + venus_opp_table: opp-table {
> + compatible = "operating-points-v2";
> +
> + opp-133000000 {
> + opp-hz = /bits/ 64 <133000000>;
> + required-opps = <&rpmpd_opp_low_svs>;
> + };
Fix the corner freq value
Regards,
Vikash
> +
> + 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>;
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-27 12:10 ` Vikash Garodia
@ 2025-06-27 12:33 ` Jorge Ramirez
2025-06-27 14:58 ` Vikash Garodia
0 siblings, 1 reply; 42+ messages in thread
From: Jorge Ramirez @ 2025-06-27 12:33 UTC (permalink / raw)
To: Vikash Garodia
Cc: Jorge Ramirez-Ortiz, krzk+dt, bryan.odonoghue, quic_dikshita,
mchehab, robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On 27/06/25 17:40:19, Vikash Garodia wrote:
>
> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> > 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>
> > ---
> > arch/arm64/boot/dts/qcom/qcm2290.dtsi | 57 +++++++++++++++++++++++++++
> > 1 file changed, 57 insertions(+)
> >
> > diff --git a/arch/arm64/boot/dts/qcom/qcm2290.dtsi b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> > index f49ac1c1f8a3..5326c91a0ff0 100644
> > --- a/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> > +++ b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> > @@ -1628,6 +1628,63 @@ 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>;
> keep only the non secure ones.
ok
> > +
> > + 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";
> > +
> > + status = "okay";
> > +
> > + venus_opp_table: opp-table {
> > + compatible = "operating-points-v2";
> > +
> > + opp-133000000 {
> > + opp-hz = /bits/ 64 <133000000>;
> > + required-opps = <&rpmpd_opp_low_svs>;
> > + };
> Fix the corner freq value
can you add some reference please?
I took this data from an internal document - not sure why the downstream
driver supports different values or where those were taken from (AFAIK
they are not supported)
>
> Regards,
> Vikash
> > +
> > + 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>;
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 2/5] media: venus: vdec: AR50_LITE video core support
2025-06-26 13:59 ` [PATCH v5 2/5] media: venus: vdec: AR50_LITE video core support Jorge Ramirez-Ortiz
@ 2025-06-27 12:47 ` Dikshita Agarwal
2025-06-27 15:18 ` Jorge Ramirez
0 siblings, 1 reply; 42+ messages in thread
From: Dikshita Agarwal @ 2025-06-27 12:47 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, krzk+dt, bryan.odonoghue, quic_vgarodia,
mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> The AR50_LITE is a streamlined 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.
>
> 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>
> ---
> drivers/media/platform/qcom/venus/core.c | 11 ++-
> drivers/media/platform/qcom/venus/core.h | 11 ++-
> drivers/media/platform/qcom/venus/firmware.c | 8 +-
> drivers/media/platform/qcom/venus/helpers.c | 80 +++++++++++++++++++
> drivers/media/platform/qcom/venus/helpers.h | 2 +
> .../media/platform/qcom/venus/hfi_helper.h | 10 ++-
> drivers/media/platform/qcom/venus/hfi_venus.c | 14 ++--
> .../media/platform/qcom/venus/pm_helpers.c | 1 +
> drivers/media/platform/qcom/venus/vdec.c | 15 ++--
> 9 files changed, 128 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> index d305d74bb152..736ef53d988d 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;
> diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
> index b412e0c5515a..e755a28e919b 100644
> --- a/drivers/media/platform/qcom/venus/core.h
> +++ b/drivers/media/platform/qcom/venus/core.h
> @@ -382,6 +382,7 @@ enum venus_inst_modes {
> * @lock: instance lock
> * @core: a reference to the core struct
> * @clk_data: clock data per core ID
> + * @eosbufs: a lit of EOS buffers
> * @dpbbufs: a list of decoded picture buffers
> * @internalbufs: a list of internal bufferes
> * @registeredbufs: a list of registered capture bufferes
> @@ -450,6 +451,7 @@ struct venus_inst {
> struct mutex lock;
> struct venus_core *core;
> struct clock_data clk_data;
> + struct list_head eosbufs;
> struct list_head dpbbufs;
> struct list_head internalbufs;
> struct list_head registeredbufs;
> @@ -520,7 +522,14 @@ struct venus_inst {
> #define IS_V1(core) ((core)->res->hfi_version == HFI_VERSION_1XX)
> #define IS_V3(core) ((core)->res->hfi_version == HFI_VERSION_3XX)
> #define IS_V4(core) ((core)->res->hfi_version == HFI_VERSION_4XX)
> -#define IS_V6(core) ((core)->res->hfi_version == HFI_VERSION_6XX)
> +static inline bool IS_V6(struct venus_core *core)
> +{
> + if (WARN_ON_ONCE(!core))
> + return false;
> +
> + return core->res->hfi_version == HFI_VERSION_6XX ||
> + core->res->hfi_version == HFI_VERSION_6XX_LITE;
> +}
It should be HFI_VERSION_4XX_LITE for AR50_LITE. 4XX represents SC7280 and
SDM845 which are AR50.
>
> #define IS_AR50(core) ((core)->res->vpu_version == VPU_VERSION_AR50)
> #define IS_AR50_LITE(core) ((core)->res->vpu_version == VPU_VERSION_AR50_LITE)
> diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
> index 66a18830e66d..f8dcef0426ac 100644
> --- a/drivers/media/platform/qcom/venus/firmware.c
> +++ b/drivers/media/platform/qcom/venus/firmware.c
> @@ -30,7 +30,7 @@ static void venus_reset_cpu(struct venus_core *core)
> u32 fw_size = core->fw.mapped_mem_size;
> void __iomem *wrapper_base;
>
> - if (IS_IRIS2_1(core))
> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
> wrapper_base = core->wrapper_tz_base;
> else
> wrapper_base = core->wrapper_base;
> @@ -42,7 +42,7 @@ static void venus_reset_cpu(struct venus_core *core)
> writel(fw_size, wrapper_base + WRAPPER_NONPIX_START_ADDR);
> writel(fw_size, wrapper_base + WRAPPER_NONPIX_END_ADDR);
>
> - if (IS_IRIS2_1(core)) {
> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
> /* Bring XTSS out of reset */
> writel(0, wrapper_base + WRAPPER_TZ_XTSS_SW_RESET);
> } else {
> @@ -68,7 +68,7 @@ int venus_set_hw_state(struct venus_core *core, bool resume)
> if (resume) {
> venus_reset_cpu(core);
> } else {
> - if (IS_IRIS2_1(core))
> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
> writel(WRAPPER_XTSS_SW_RESET_BIT,
> core->wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
> else
> @@ -181,7 +181,7 @@ static int venus_shutdown_no_tz(struct venus_core *core)
> void __iomem *wrapper_base = core->wrapper_base;
> void __iomem *wrapper_tz_base = core->wrapper_tz_base;
>
> - if (IS_IRIS2_1(core)) {
> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
> /* Assert the reset to XTSS */
> reg = readl(wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
No need to handle no-tz case. Pls drop.
> reg |= WRAPPER_XTSS_SW_RESET_BIT;
> diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c
> index 8295542e1a7c..812bec9a05be 100644
> --- a/drivers/media/platform/qcom/venus/helpers.c
> +++ b/drivers/media/platform/qcom/venus/helpers.c
> @@ -230,6 +230,79 @@ int venus_helper_alloc_dpb_bufs(struct venus_inst *inst)
> }
> EXPORT_SYMBOL_GPL(venus_helper_alloc_dpb_bufs);
>
> +static void free_eos_buf(struct venus_inst *inst, struct intbuf *buf)
> +{
> + list_del_init(&buf->list);
> + dma_free_attrs(inst->core->dev, buf->size, buf->va, buf->da,
> + buf->attrs);
> + kfree(buf);
> +}
> +
> +int venus_helper_free_eos_bufs(struct venus_inst *inst)
> +{
> + struct intbuf *buf, *n;
> +
> + list_for_each_entry_safe(buf, n, &inst->eosbufs, list) {
> + free_eos_buf(inst, buf);
> + }
> +
> + if (list_empty(&inst->eosbufs))
> + INIT_LIST_HEAD(&inst->eosbufs);
> +
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(venus_helper_free_eos_bufs);
> +
> +int venus_helper_alloc_eos_buf(struct venus_inst *inst,
> + struct hfi_frame_data *data)
> +{
> + struct venus_core *core = inst->core;
> + struct device *dev = core->dev;
> + struct intbuf *buf;
> + int ret = 0;
> +
> + memset(data, 0, sizeof(*data));
> +
> + data->buffer_type = HFI_BUFFER_INPUT;
> + data->flags = HFI_BUFFERFLAG_EOS;
> +
> + if (IS_AR50_LITE(inst->core)) {
> + /* We must send valid sizes and addresses */
> + buf = kzalloc(sizeof(*buf), GFP_KERNEL);
> + if (!buf) {
> + ret = -ENOMEM;
> + goto fail;
> + }
> +
> + buf->type = HFI_BUFFER_INPUT;
> + buf->size = SZ_4K;
> + buf->attrs = DMA_ATTR_NO_KERNEL_MAPPING;
> + buf->va = dma_alloc_attrs(dev, buf->size, &buf->da, GFP_KERNEL,
> + buf->attrs);
> + if (!buf->va) {
> + ret = -ENOMEM;
> + goto fail;
> + }
> +
> + list_add_tail(&buf->list, &inst->eosbufs);
> +
> + data->alloc_len = buf->size;
> + data->device_addr = buf->da;
> +
why this special handling for eos buffer is needed for AR50_LITE?
> + } else if (IS_V6(inst->core) &&
> + is_fw_rev_or_older(inst->core, 1, 0, 87)) {
> + data->device_addr = 0;
> + } else {
> + data->device_addr = 0xdeadb000;
> + }
> +
> + return 0;
> +fail:
> + kfree(buf);
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(venus_helper_alloc_eos_buf);
> +
> static int intbufs_set_buffer(struct venus_inst *inst, u32 type)
> {
> struct venus_core *core = inst->core;
> @@ -630,6 +703,13 @@ static int platform_get_bufreq(struct venus_inst *inst, u32 buftype,
> if (!hfi_plat || !hfi_plat->bufreq)
> return -EINVAL;
>
> + /* Firmware buffer requirements for internal buffers only */
> + if (IS_AR50_LITE(inst->core))
> + if (buftype != HFI_BUFFER_INPUT &&
> + buftype != HFI_BUFFER_OUTPUT &&
> + buftype != HFI_BUFFER_OUTPUT2)
> + return -EINVAL;
> +
why this check is needed here? Buffer requirements for all buffer types
should come from firmware for all V4 based targets.
> params.version = version;
> params.num_vpp_pipes = inst->core->res->num_vpp_pipes;
>
> diff --git a/drivers/media/platform/qcom/venus/helpers.h b/drivers/media/platform/qcom/venus/helpers.h
> index 358e4f39c9c0..bf55fe3b8747 100644
> --- a/drivers/media/platform/qcom/venus/helpers.h
> +++ b/drivers/media/platform/qcom/venus/helpers.h
> @@ -58,6 +58,8 @@ int venus_helper_get_out_fmts(struct venus_inst *inst, u32 fmt, u32 *out_fmt,
> bool venus_helper_check_format(struct venus_inst *inst, u32 v4l2_pixfmt);
> int venus_helper_alloc_dpb_bufs(struct venus_inst *inst);
> int venus_helper_free_dpb_bufs(struct venus_inst *inst);
> +int venus_helper_alloc_eos_buf(struct venus_inst *inst, struct hfi_frame_data *data);
> +int venus_helper_free_eos_bufs(struct venus_inst *inst);
> int venus_helper_intbufs_alloc(struct venus_inst *inst);
> int venus_helper_intbufs_free(struct venus_inst *inst);
> int venus_helper_intbufs_realloc(struct venus_inst *inst);
> diff --git a/drivers/media/platform/qcom/venus/hfi_helper.h b/drivers/media/platform/qcom/venus/hfi_helper.h
> index f44059f19505..128ddf8e3cd5 100644
> --- a/drivers/media/platform/qcom/venus/hfi_helper.h
> +++ b/drivers/media/platform/qcom/venus/hfi_helper.h
> @@ -397,13 +397,16 @@
> #define HFI_BUFFER_INTERNAL_PERSIST_1 0x5
> #define HFI_BUFFER_INTERNAL_SCRATCH(ver) \
> (((ver) == HFI_VERSION_4XX || \
> - (ver) == HFI_VERSION_6XX) ? 0x6 : 0x1000001)
> + (ver) == HFI_VERSION_6XX || (ver) == HFI_VERSION_6XX_LITE) \
> + ? 0x6 : 0x1000001)
> #define HFI_BUFFER_INTERNAL_SCRATCH_1(ver) \
> (((ver) == HFI_VERSION_4XX || \
> - (ver) == HFI_VERSION_6XX) ? 0x7 : 0x1000005)
> + (ver) == HFI_VERSION_6XX || (ver) == HFI_VERSION_6XX_LITE) \
> + ? 0x7 : 0x1000005)
> #define HFI_BUFFER_INTERNAL_SCRATCH_2(ver) \
> (((ver) == HFI_VERSION_4XX || \
> - (ver) == HFI_VERSION_6XX) ? 0x8 : 0x1000006)
> + (ver) == HFI_VERSION_6XX || (ver) == HFI_VERSION_6XX_LITE) \
> + ? 0x8 : 0x1000006)
> #define HFI_BUFFER_EXTRADATA_INPUT(ver) \
> (((ver) == HFI_VERSION_4XX) ? 0xc : 0x1000002)
> #define HFI_BUFFER_EXTRADATA_OUTPUT(ver) \
> @@ -561,6 +564,7 @@ enum hfi_version {
> HFI_VERSION_3XX,
> HFI_VERSION_4XX,
> HFI_VERSION_6XX,
> + HFI_VERSION_6XX_LITE,
s/HFI_VERSION_6XX_LITE/HFI_VERSION_4XX_LITE.
update all applicable places.
> };
>
> struct hfi_buffer_info {
> diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c
> index b5f2ea879950..302776bf8fe6 100644
> --- a/drivers/media/platform/qcom/venus/hfi_venus.c
> +++ b/drivers/media/platform/qcom/venus/hfi_venus.c
> @@ -497,7 +497,7 @@ 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);
CPU_CS_X2RPMH_V6 is not needed for AR50_LITE, pls drop.
> }
> @@ -565,6 +565,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);
>
> @@ -1134,7 +1137,8 @@ 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_IRIS2(core) || IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
> if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
> status & WRAPPER_INTR_STATUS_A2HWD_MASK_V6 ||
WD mask is incorrect, pls fix.
> status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
> @@ -1146,7 +1150,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;
> @@ -1531,7 +1535,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);
> @@ -1551,7 +1555,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/pm_helpers.c b/drivers/media/platform/qcom/venus/pm_helpers.c
> index 409aa9bd0b5d..5d9dfe3fd043 100644
> --- a/drivers/media/platform/qcom/venus/pm_helpers.c
> +++ b/drivers/media/platform/qcom/venus/pm_helpers.c
> @@ -1168,6 +1168,7 @@ const struct venus_pm_ops *venus_pm_get(enum hfi_version version)
> return &pm_ops_v3;
> case HFI_VERSION_4XX:
> case HFI_VERSION_6XX:
> + case HFI_VERSION_6XX_LITE:
s/HFI_VERSION_6XX_LITE/HFI_VERSION_4XX_LITE
Thanks,
Dikshita
> return &pm_ops_v4;
> }
>
> diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c
> index 99ce5fd41577..87c7901b280e 100644
> --- a/drivers/media/platform/qcom/venus/vdec.c
> +++ b/drivers/media/platform/qcom/venus/vdec.c
> @@ -550,7 +550,7 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
> {
> struct venus_inst *inst = to_inst(file);
> struct vb2_queue *dst_vq;
> - struct hfi_frame_data fdata = {0};
> + struct hfi_frame_data fdata;
> int ret;
>
> ret = v4l2_m2m_ioctl_try_decoder_cmd(file, fh, cmd);
> @@ -561,18 +561,15 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
>
> if (cmd->cmd == V4L2_DEC_CMD_STOP) {
> /*
> - * Implement V4L2_DEC_CMD_STOP by enqueue an empty buffer on
> + * Implement V4L2_DEC_CMD_STOP by enqueue a buffer on
> * decoder input to signal EOS.
> */
> if (!(inst->streamon_out && inst->streamon_cap))
> goto unlock;
>
> - fdata.buffer_type = HFI_BUFFER_INPUT;
> - fdata.flags |= HFI_BUFFERFLAG_EOS;
> - if (IS_V6(inst->core) && is_fw_rev_or_older(inst->core, 1, 0, 87))
> - fdata.device_addr = 0;
> - else
> - fdata.device_addr = 0xdeadb000;
> + ret = venus_helper_alloc_eos_buf(inst, &fdata);
> + if (ret)
> + goto unlock;
>
> ret = hfi_session_process_buf(inst, &fdata);
>
> @@ -1332,6 +1329,7 @@ static void vdec_session_release(struct venus_inst *inst)
> hfi_session_abort(inst);
>
> venus_helper_free_dpb_bufs(inst);
> + venus_helper_free_eos_bufs(inst);
> venus_pm_load_scale(inst);
> INIT_LIST_HEAD(&inst->registeredbufs);
> mutex_unlock(&inst->lock);
> @@ -1682,6 +1680,7 @@ static int vdec_open(struct file *file)
> if (!inst)
> return -ENOMEM;
>
> + INIT_LIST_HEAD(&inst->eosbufs);
> INIT_LIST_HEAD(&inst->dpbbufs);
> INIT_LIST_HEAD(&inst->registeredbufs);
> INIT_LIST_HEAD(&inst->internalbufs);
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 4/5] media: venus: core: Add qcm2290 DT compatible and resource data
2025-06-26 13:59 ` [PATCH v5 4/5] media: venus: core: Add qcm2290 DT compatible and resource data Jorge Ramirez-Ortiz
2025-06-26 14:37 ` Bryan O'Donoghue
@ 2025-06-27 13:16 ` Dikshita Agarwal
2025-07-07 9:09 ` Jorge Ramirez
1 sibling, 1 reply; 42+ messages in thread
From: Dikshita Agarwal @ 2025-06-27 13:16 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, krzk+dt, bryan.odonoghue, quic_vgarodia,
mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> Add a qcm2290 compatible binding to the venus core.
>
> Video encoding support is not exposed until the relevant hardware
> capabilities are enabled.
>
> 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>
> ---
> drivers/media/platform/qcom/venus/core.c | 39 ++++++++++++++++++++++++
> 1 file changed, 39 insertions(+)
>
> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> index 736ef53d988d..f1f211ca1ce2 100644
> --- a/drivers/media/platform/qcom/venus/core.c
> +++ b/drivers/media/platform/qcom/venus/core.c
> @@ -1062,6 +1062,44 @@ static const struct venus_resources sc7280_res = {
> .enc_nodename = "video-encoder",
> };
>
> +static const struct freq_tbl qcm2290_freq_table[] = {
> + { 352800, 240000000 }, /* 1920x1088 @ 30 + 1280x720 @ 30 */
> + { 244800, 133000000 }, /* 1920x1088 @ 30 */
> +};
> +
fix this corner.
> +static const struct bw_tbl qcm2290_bw_table_dec[] = {
> + { 244800, 2128000, 0, 2128000, 0}, /* 1920x1088 @ 30 */
> +};
> +
what is the reference for this?
> +static const struct venus_resources qcm2290_res = {
> + .freq_tbl = qcm2290_freq_table,
> + .freq_tbl_size = ARRAY_SIZE(qcm2290_freq_table),
> + .bw_tbl_dec = qcm2290_bw_table_dec,
> + .bw_tbl_dec_size = ARRAY_SIZE(qcm2290_bw_table_dec),
> + .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_6XX_LITE,
s/HFI_VERSION_6XX_LITE/HFI_VERSION_4XX_LITE
Thanks,
Dikshita
> + .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",
> +};
> +
> static const struct of_device_id venus_dt_match[] = {
> { .compatible = "qcom,msm8916-venus", .data = &msm8916_res, },
> { .compatible = "qcom,msm8996-venus", .data = &msm8996_res, },
> @@ -1072,6 +1110,7 @@ static const struct of_device_id venus_dt_match[] = {
> { .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
> { .compatible = "qcom,sc7280-venus", .data = &sc7280_res, },
> { .compatible = "qcom,sm8250-venus", .data = &sm8250_res, },
> + { .compatible = "qcom,qcm2290-venus", .data = &qcm2290_res, },
> { }
> };
> MODULE_DEVICE_TABLE(of, venus_dt_match);
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 3/5] media: venus: hfi_plat_v6_lite: Populate decode capabilities
2025-06-26 13:59 ` [PATCH v5 3/5] media: venus: hfi_plat_v6_lite: Populate decode capabilities Jorge Ramirez-Ortiz
2025-06-26 14:43 ` Bryan O'Donoghue
@ 2025-06-27 13:32 ` Dikshita Agarwal
2025-07-07 9:13 ` Jorge Ramirez
1 sibling, 1 reply; 42+ messages in thread
From: Dikshita Agarwal @ 2025-06-27 13:32 UTC (permalink / raw)
To: Jorge Ramirez-Ortiz, krzk+dt, bryan.odonoghue, quic_vgarodia,
mchehab, robh, conor+dt, konradybcio, andersson
Cc: linux-arm-msm, linux-media, devicetree, linux-kernel
On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> Add hfi platform file with decoding capabilities for hfi v6_lite.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/venus/Makefile | 2 +-
> .../media/platform/qcom/venus/hfi_platform.c | 2 +
> .../media/platform/qcom/venus/hfi_platform.h | 1 +
> .../qcom/venus/hfi_platform_v6_lite.c | 148 ++++++++++++++++++
> 4 files changed, 152 insertions(+), 1 deletion(-)
> create mode 100644 drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
>
> diff --git a/drivers/media/platform/qcom/venus/Makefile b/drivers/media/platform/qcom/venus/Makefile
> index 91ee6be10292..4a6a942db58b 100644
> --- a/drivers/media/platform/qcom/venus/Makefile
> +++ b/drivers/media/platform/qcom/venus/Makefile
> @@ -5,7 +5,7 @@ venus-core-objs += core.o helpers.o firmware.o \
> hfi_venus.o hfi_msgs.o hfi_cmds.o hfi.o \
> hfi_parser.o pm_helpers.o dbgfs.o \
> hfi_platform.o hfi_platform_v4.o \
> - hfi_platform_v6.o hfi_plat_bufs_v6.o \
> + hfi_platform_v6.o hfi_plat_bufs_v6.o hfi_platform_v6_lite.o \
s/hfi_platform_v6_lite/hfi_platform_v4_lite
>
> venus-dec-objs += vdec.o vdec_ctrls.o
> venus-enc-objs += venc.o venc_ctrls.o
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
> index 643e5aa138f5..f56b8f9946d7 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform.c
> +++ b/drivers/media/platform/qcom/venus/hfi_platform.c
> @@ -13,6 +13,8 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
> return &hfi_plat_v4;
> case HFI_VERSION_6XX:
> return &hfi_plat_v6;
> + case HFI_VERSION_6XX_LITE:
> + return &hfi_plat_v6_lite;
update here as well.
> default:
> break;
> }
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
> index ec89a90a8129..6356e4bd0de2 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform.h
> +++ b/drivers/media/platform/qcom/venus/hfi_platform.h
> @@ -58,6 +58,7 @@ struct hfi_platform {
>
> extern const struct hfi_platform hfi_plat_v4;
> extern const struct hfi_platform hfi_plat_v6;
> +extern const struct hfi_platform hfi_plat_v6_lite;
ditto
>
> 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,
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> new file mode 100644
> index 000000000000..41958a3e353b
> --- /dev/null
> +++ b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> @@ -0,0 +1,148 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2025, The Linux Foundation. All rights reserved.
> + */
> +#include "hfi_platform.h"
> +
> +static const struct hfi_plat_caps caps[] = {
> +{
> + .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, 1080, 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_1},
> + .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_41},
> + .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
> + .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_41},
> + .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_41},
what is the reference for these values?
> + .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, 1080, 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_MAIN},
> + .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
what is the reference for these values?
> + .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, 1080, 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,
> +} };
> +
> +static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
> +{
> + *entries = ARRAY_SIZE(caps);
> + return caps;
> +}
> +
> +static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> +{
> + *enc_codecs = 0x0;
> + *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> + HFI_VIDEO_CODEC_VP9;
> + *count = 3;
> +}
> +
> +static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
> + { 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 },
> +};
> +
> +static const struct hfi_platform_codec_freq_data *
> +get_codec_freq_data(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;
> +
> + for (i = 0; i < data_size; i++) {
> + if (data[i].pixfmt == pixfmt &&
> + data[i].session_type == session_type) {
> + found = &data[i];
> + break;
> + }
> + }
> +
> + return found;
> +}
> +
> +static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
> +{
> + const struct hfi_platform_codec_freq_data *data;
> +
> + data = get_codec_freq_data(session_type, codec);
> + if (data)
> + return data->vpp_freq;
> +
> + return 0;
> +}
> +
> +static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
> +{
> + const struct hfi_platform_codec_freq_data *data;
> +
> + data = get_codec_freq_data(session_type, codec);
> + if (data)
> + return data->vsp_freq;
> +
> + return 0;
> +}
> +
> +static unsigned long codec_lp_freq(u32 session_type, u32 codec)
> +{
> + const struct hfi_platform_codec_freq_data *data;
> +
> + data = get_codec_freq_data(session_type, codec);
> + if (data)
> + return data->low_power_freq;
> +
> + return 0;
> +}
> +
> +const struct hfi_platform hfi_plat_v6_lite = {
> + .codec_vpp_freq = codec_vpp_freq,
> + .codec_vsp_freq = codec_vsp_freq,
> + .codec_lp_freq = codec_lp_freq,
> + .codecs = get_codecs,
> + .capabilities = get_capabilities,
> + .bufreq = hfi_plat_bufreq_v6,
buffer requirement should come from firmware, pls drop.
> +};
lot of code duplication here, pls see the possibility to commonize the code.
Thanks,
Dikshita
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-27 12:33 ` Jorge Ramirez
@ 2025-06-27 14:58 ` Vikash Garodia
2025-06-27 15:08 ` Jorge Ramirez
0 siblings, 1 reply; 42+ messages in thread
From: Vikash Garodia @ 2025-06-27 14:58 UTC (permalink / raw)
To: Jorge Ramirez
Cc: krzk+dt, bryan.odonoghue, quic_dikshita, mchehab, robh, conor+dt,
konradybcio, andersson, linux-arm-msm, linux-media, devicetree,
linux-kernel
On 6/27/2025 6:03 PM, Jorge Ramirez wrote:
> On 27/06/25 17:40:19, Vikash Garodia wrote:
>>
>> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
>>> 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>
>>> ---
>>> arch/arm64/boot/dts/qcom/qcm2290.dtsi | 57 +++++++++++++++++++++++++++
>>> 1 file changed, 57 insertions(+)
>>>
>>> diff --git a/arch/arm64/boot/dts/qcom/qcm2290.dtsi b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>> index f49ac1c1f8a3..5326c91a0ff0 100644
>>> --- a/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>> +++ b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>> @@ -1628,6 +1628,63 @@ 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>;
>> keep only the non secure ones.
>
> ok
>
>>> +
>>> + 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";
>>> +
>>> + status = "okay";
>>> +
>>> + venus_opp_table: opp-table {
>>> + compatible = "operating-points-v2";
>>> +
>>> + opp-133000000 {
>>> + opp-hz = /bits/ 64 <133000000>;
>>> + required-opps = <&rpmpd_opp_low_svs>;
>>> + };
>> Fix the corner freq value
>
> can you add some reference please?
>
> I took this data from an internal document - not sure why the downstream
> driver supports different values or where those were taken from (AFAIK
> they are not supported)
Most likely you have referred incorrect downstream file. Refer scuba-vidc.dtsi.
Again, good reference for such cases would IP catalogues and if not, gcc driver
in this case which have structures defining different corners for video.
>
>
>>
>> Regards,
>> Vikash
>>> +
>>> + 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>;
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-27 14:58 ` Vikash Garodia
@ 2025-06-27 15:08 ` Jorge Ramirez
2025-06-27 15:12 ` Vikash Garodia
0 siblings, 1 reply; 42+ messages in thread
From: Jorge Ramirez @ 2025-06-27 15:08 UTC (permalink / raw)
To: Vikash Garodia
Cc: Jorge Ramirez, krzk+dt, bryan.odonoghue, quic_dikshita, mchehab,
robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On 27/06/25 20:28:29, Vikash Garodia wrote:
>
> On 6/27/2025 6:03 PM, Jorge Ramirez wrote:
> > On 27/06/25 17:40:19, Vikash Garodia wrote:
> >>
> >> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> >>> 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>
> >>> ---
> >>> arch/arm64/boot/dts/qcom/qcm2290.dtsi | 57 +++++++++++++++++++++++++++
> >>> 1 file changed, 57 insertions(+)
> >>>
> >>> diff --git a/arch/arm64/boot/dts/qcom/qcm2290.dtsi b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> >>> index f49ac1c1f8a3..5326c91a0ff0 100644
> >>> --- a/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> >>> +++ b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> >>> @@ -1628,6 +1628,63 @@ 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>;
> >> keep only the non secure ones.
> >
> > ok
> >
> >>> +
> >>> + 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";
> >>> +
> >>> + status = "okay";
> >>> +
> >>> + venus_opp_table: opp-table {
> >>> + compatible = "operating-points-v2";
> >>> +
> >>> + opp-133000000 {
> >>> + opp-hz = /bits/ 64 <133000000>;
> >>> + required-opps = <&rpmpd_opp_low_svs>;
> >>> + };
> >> Fix the corner freq value
> >
> > can you add some reference please?
> >
> > I took this data from an internal document - not sure why the downstream
> > driver supports different values or where those were taken from (AFAIK
> > they are not supported)
> Most likely you have referred incorrect downstream file. Refer scuba-vidc.dtsi.
I took them from actual documents (which might or might not be obsolete,
hard to say but they were the latest version and as such, they
contradict the downstream dtsi).
So I'd rather not use downstream - could you point me to the reference
you used please - I wonder if the fix is required downstream instead of here?
> Again, good reference for such cases would IP catalogues and if not, gcc driver
> in this case which have structures defining different corners for
> video.
The PM document for this chip only confirms two values - the other 4 ones
claim they are not supported on 50_LT
but we can discuss offline.
> >
> >
> >>
> >> Regards,
> >> Vikash
> >>> +
> >>> + 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>;
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-27 15:08 ` Jorge Ramirez
@ 2025-06-27 15:12 ` Vikash Garodia
2025-06-27 15:20 ` Konrad Dybcio
2025-07-07 9:15 ` Jorge Ramirez
0 siblings, 2 replies; 42+ messages in thread
From: Vikash Garodia @ 2025-06-27 15:12 UTC (permalink / raw)
To: Jorge Ramirez
Cc: krzk+dt, bryan.odonoghue, quic_dikshita, mchehab, robh, conor+dt,
konradybcio, andersson, linux-arm-msm, linux-media, devicetree,
linux-kernel
On 6/27/2025 8:38 PM, Jorge Ramirez wrote:
> On 27/06/25 20:28:29, Vikash Garodia wrote:
>>
>> On 6/27/2025 6:03 PM, Jorge Ramirez wrote:
>>> On 27/06/25 17:40:19, Vikash Garodia wrote:
>>>>
>>>> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
>>>>> 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>
>>>>> ---
>>>>> arch/arm64/boot/dts/qcom/qcm2290.dtsi | 57 +++++++++++++++++++++++++++
>>>>> 1 file changed, 57 insertions(+)
>>>>>
>>>>> diff --git a/arch/arm64/boot/dts/qcom/qcm2290.dtsi b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>>>> index f49ac1c1f8a3..5326c91a0ff0 100644
>>>>> --- a/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>>>> +++ b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>>>> @@ -1628,6 +1628,63 @@ 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>;
>>>> keep only the non secure ones.
>>>
>>> ok
>>>
>>>>> +
>>>>> + 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";
>>>>> +
>>>>> + status = "okay";
>>>>> +
>>>>> + venus_opp_table: opp-table {
>>>>> + compatible = "operating-points-v2";
>>>>> +
>>>>> + opp-133000000 {
>>>>> + opp-hz = /bits/ 64 <133000000>;
>>>>> + required-opps = <&rpmpd_opp_low_svs>;
>>>>> + };
>>>> Fix the corner freq value
>>>
>>> can you add some reference please?
>>>
>>> I took this data from an internal document - not sure why the downstream
>>> driver supports different values or where those were taken from (AFAIK
>>> they are not supported)
>> Most likely you have referred incorrect downstream file. Refer scuba-vidc.dtsi.
>
> I took them from actual documents (which might or might not be obsolete,
> hard to say but they were the latest version and as such, they
> contradict the downstream dtsi).
>
> So I'd rather not use downstream - could you point me to the reference
> you used please - I wonder if the fix is required downstream instead of here?
You can look for this file gcc-scuba.c and refer gcc_video_venus_clk_src which
is the src for different venus clocks.
>
>> Again, good reference for such cases would IP catalogues and if not, gcc driver
>> in this case which have structures defining different corners for
>> video.
>
> The PM document for this chip only confirms two values - the other 4 ones
> claim they are not supported on 50_LT
>
> but we can discuss offline.
>
>>>
>>>
>>>>
>>>> Regards,
>>>> Vikash
>>>>> +
>>>>> + 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>;
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 2/5] media: venus: vdec: AR50_LITE video core support
2025-06-27 12:47 ` Dikshita Agarwal
@ 2025-06-27 15:18 ` Jorge Ramirez
2025-06-30 6:47 ` Dikshita Agarwal
0 siblings, 1 reply; 42+ messages in thread
From: Jorge Ramirez @ 2025-06-27 15:18 UTC (permalink / raw)
To: Dikshita Agarwal
Cc: Jorge Ramirez-Ortiz, krzk+dt, bryan.odonoghue, quic_vgarodia,
mchehab, robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On 27/06/25 18:17:27, Dikshita Agarwal wrote:
>
>
> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> > The AR50_LITE is a streamlined 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.
> >
> > 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>
> > ---
> > drivers/media/platform/qcom/venus/core.c | 11 ++-
> > drivers/media/platform/qcom/venus/core.h | 11 ++-
> > drivers/media/platform/qcom/venus/firmware.c | 8 +-
> > drivers/media/platform/qcom/venus/helpers.c | 80 +++++++++++++++++++
> > drivers/media/platform/qcom/venus/helpers.h | 2 +
> > .../media/platform/qcom/venus/hfi_helper.h | 10 ++-
> > drivers/media/platform/qcom/venus/hfi_venus.c | 14 ++--
> > .../media/platform/qcom/venus/pm_helpers.c | 1 +
> > drivers/media/platform/qcom/venus/vdec.c | 15 ++--
> > 9 files changed, 128 insertions(+), 24 deletions(-)
> >
> > diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> > index d305d74bb152..736ef53d988d 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;
> > diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
> > index b412e0c5515a..e755a28e919b 100644
> > --- a/drivers/media/platform/qcom/venus/core.h
> > +++ b/drivers/media/platform/qcom/venus/core.h
> > @@ -382,6 +382,7 @@ enum venus_inst_modes {
> > * @lock: instance lock
> > * @core: a reference to the core struct
> > * @clk_data: clock data per core ID
> > + * @eosbufs: a lit of EOS buffers
> > * @dpbbufs: a list of decoded picture buffers
> > * @internalbufs: a list of internal bufferes
> > * @registeredbufs: a list of registered capture bufferes
> > @@ -450,6 +451,7 @@ struct venus_inst {
> > struct mutex lock;
> > struct venus_core *core;
> > struct clock_data clk_data;
> > + struct list_head eosbufs;
> > struct list_head dpbbufs;
> > struct list_head internalbufs;
> > struct list_head registeredbufs;
> > @@ -520,7 +522,14 @@ struct venus_inst {
> > #define IS_V1(core) ((core)->res->hfi_version == HFI_VERSION_1XX)
> > #define IS_V3(core) ((core)->res->hfi_version == HFI_VERSION_3XX)
> > #define IS_V4(core) ((core)->res->hfi_version == HFI_VERSION_4XX)
> > -#define IS_V6(core) ((core)->res->hfi_version == HFI_VERSION_6XX)
> > +static inline bool IS_V6(struct venus_core *core)
> > +{
> > + if (WARN_ON_ONCE(!core))
> > + return false;
> > +
> > + return core->res->hfi_version == HFI_VERSION_6XX ||
> > + core->res->hfi_version == HFI_VERSION_6XX_LITE;
> > +}
> It should be HFI_VERSION_4XX_LITE for AR50_LITE. 4XX represents SC7280 and
> SDM845 which are AR50.
ah good information - where is this documented? I never found this
information... I'd appreciate if you could confirm with some document
for future reference.
> >
> > #define IS_AR50(core) ((core)->res->vpu_version == VPU_VERSION_AR50)
> > #define IS_AR50_LITE(core) ((core)->res->vpu_version == VPU_VERSION_AR50_LITE)
> > diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
> > index 66a18830e66d..f8dcef0426ac 100644
> > --- a/drivers/media/platform/qcom/venus/firmware.c
> > +++ b/drivers/media/platform/qcom/venus/firmware.c
> > @@ -30,7 +30,7 @@ static void venus_reset_cpu(struct venus_core *core)
> > u32 fw_size = core->fw.mapped_mem_size;
> > void __iomem *wrapper_base;
> >
> > - if (IS_IRIS2_1(core))
> > + if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
> > wrapper_base = core->wrapper_tz_base;
> > else
> > wrapper_base = core->wrapper_base;
> > @@ -42,7 +42,7 @@ static void venus_reset_cpu(struct venus_core *core)
> > writel(fw_size, wrapper_base + WRAPPER_NONPIX_START_ADDR);
> > writel(fw_size, wrapper_base + WRAPPER_NONPIX_END_ADDR);
> >
> > - if (IS_IRIS2_1(core)) {
> > + if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
> > /* Bring XTSS out of reset */
> > writel(0, wrapper_base + WRAPPER_TZ_XTSS_SW_RESET);
> > } else {
> > @@ -68,7 +68,7 @@ int venus_set_hw_state(struct venus_core *core, bool resume)
> > if (resume) {
> > venus_reset_cpu(core);
> > } else {
> > - if (IS_IRIS2_1(core))
> > + if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
> > writel(WRAPPER_XTSS_SW_RESET_BIT,
> > core->wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
> > else
> > @@ -181,7 +181,7 @@ static int venus_shutdown_no_tz(struct venus_core *core)
> > void __iomem *wrapper_base = core->wrapper_base;
> > void __iomem *wrapper_tz_base = core->wrapper_tz_base;
> >
> > - if (IS_IRIS2_1(core)) {
> > + if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
> > /* Assert the reset to XTSS */
> > reg = readl(wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
> No need to handle no-tz case. Pls drop.
ok
> > reg |= WRAPPER_XTSS_SW_RESET_BIT;
> > diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c
> > index 8295542e1a7c..812bec9a05be 100644
> > --- a/drivers/media/platform/qcom/venus/helpers.c
> > +++ b/drivers/media/platform/qcom/venus/helpers.c
> > @@ -230,6 +230,79 @@ int venus_helper_alloc_dpb_bufs(struct venus_inst *inst)
> > }
> > EXPORT_SYMBOL_GPL(venus_helper_alloc_dpb_bufs);
> >
> > +static void free_eos_buf(struct venus_inst *inst, struct intbuf *buf)
> > +{
> > + list_del_init(&buf->list);
> > + dma_free_attrs(inst->core->dev, buf->size, buf->va, buf->da,
> > + buf->attrs);
> > + kfree(buf);
> > +}
> > +
> > +int venus_helper_free_eos_bufs(struct venus_inst *inst)
> > +{
> > + struct intbuf *buf, *n;
> > +
> > + list_for_each_entry_safe(buf, n, &inst->eosbufs, list) {
> > + free_eos_buf(inst, buf);
> > + }
> > +
> > + if (list_empty(&inst->eosbufs))
> > + INIT_LIST_HEAD(&inst->eosbufs);
> > +
> > + return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(venus_helper_free_eos_bufs);
> > +
> > +int venus_helper_alloc_eos_buf(struct venus_inst *inst,
> > + struct hfi_frame_data *data)
> > +{
> > + struct venus_core *core = inst->core;
> > + struct device *dev = core->dev;
> > + struct intbuf *buf;
> > + int ret = 0;
> > +
> > + memset(data, 0, sizeof(*data));
> > +
> > + data->buffer_type = HFI_BUFFER_INPUT;
> > + data->flags = HFI_BUFFERFLAG_EOS;
> > +
> > + if (IS_AR50_LITE(inst->core)) {
> > + /* We must send valid sizes and addresses */
> > + buf = kzalloc(sizeof(*buf), GFP_KERNEL);
> > + if (!buf) {
> > + ret = -ENOMEM;
> > + goto fail;
> > + }
> > +
> > + buf->type = HFI_BUFFER_INPUT;
> > + buf->size = SZ_4K;
> > + buf->attrs = DMA_ATTR_NO_KERNEL_MAPPING;
> > + buf->va = dma_alloc_attrs(dev, buf->size, &buf->da, GFP_KERNEL,
> > + buf->attrs);
> > + if (!buf->va) {
> > + ret = -ENOMEM;
> > + goto fail;
> > + }
> > +
> > + list_add_tail(&buf->list, &inst->eosbufs);
> > +
> > + data->alloc_len = buf->size;
> > + data->device_addr = buf->da;
> > +
> why this special handling for eos buffer is needed for AR50_LITE?
this _fix_ was develope through testing: without it there is no EOS and
errors are reporting upon killing the player
> > + } else if (IS_V6(inst->core) &&
> > + is_fw_rev_or_older(inst->core, 1, 0, 87)) {
> > + data->device_addr = 0;
> > + } else {
> > + data->device_addr = 0xdeadb000;
> > + }
> > +
> > + return 0;
> > +fail:
> > + kfree(buf);
> > + return ret;
> > +}
> > +EXPORT_SYMBOL_GPL(venus_helper_alloc_eos_buf);
> > +
> > static int intbufs_set_buffer(struct venus_inst *inst, u32 type)
> > {
> > struct venus_core *core = inst->core;
> > @@ -630,6 +703,13 @@ static int platform_get_bufreq(struct venus_inst *inst, u32 buftype,
> > if (!hfi_plat || !hfi_plat->bufreq)
> > return -EINVAL;
> >
> > + /* Firmware buffer requirements for internal buffers only */
> > + if (IS_AR50_LITE(inst->core))
> > + if (buftype != HFI_BUFFER_INPUT &&
> > + buftype != HFI_BUFFER_OUTPUT &&
> > + buftype != HFI_BUFFER_OUTPUT2)
> > + return -EINVAL;
> > +
> why this check is needed here? Buffer requirements for all buffer types
> should come from firmware for all V4 based targets.
because I used V6 as you saw earlier.
> > params.version = version;
> > params.num_vpp_pipes = inst->core->res->num_vpp_pipes;
> >
> > diff --git a/drivers/media/platform/qcom/venus/helpers.h b/drivers/media/platform/qcom/venus/helpers.h
> > index 358e4f39c9c0..bf55fe3b8747 100644
> > --- a/drivers/media/platform/qcom/venus/helpers.h
> > +++ b/drivers/media/platform/qcom/venus/helpers.h
> > @@ -58,6 +58,8 @@ int venus_helper_get_out_fmts(struct venus_inst *inst, u32 fmt, u32 *out_fmt,
> > bool venus_helper_check_format(struct venus_inst *inst, u32 v4l2_pixfmt);
> > int venus_helper_alloc_dpb_bufs(struct venus_inst *inst);
> > int venus_helper_free_dpb_bufs(struct venus_inst *inst);
> > +int venus_helper_alloc_eos_buf(struct venus_inst *inst, struct hfi_frame_data *data);
> > +int venus_helper_free_eos_bufs(struct venus_inst *inst);
> > int venus_helper_intbufs_alloc(struct venus_inst *inst);
> > int venus_helper_intbufs_free(struct venus_inst *inst);
> > int venus_helper_intbufs_realloc(struct venus_inst *inst);
> > diff --git a/drivers/media/platform/qcom/venus/hfi_helper.h b/drivers/media/platform/qcom/venus/hfi_helper.h
> > index f44059f19505..128ddf8e3cd5 100644
> > --- a/drivers/media/platform/qcom/venus/hfi_helper.h
> > +++ b/drivers/media/platform/qcom/venus/hfi_helper.h
> > @@ -397,13 +397,16 @@
> > #define HFI_BUFFER_INTERNAL_PERSIST_1 0x5
> > #define HFI_BUFFER_INTERNAL_SCRATCH(ver) \
> > (((ver) == HFI_VERSION_4XX || \
> > - (ver) == HFI_VERSION_6XX) ? 0x6 : 0x1000001)
> > + (ver) == HFI_VERSION_6XX || (ver) == HFI_VERSION_6XX_LITE) \
> > + ? 0x6 : 0x1000001)
> > #define HFI_BUFFER_INTERNAL_SCRATCH_1(ver) \
> > (((ver) == HFI_VERSION_4XX || \
> > - (ver) == HFI_VERSION_6XX) ? 0x7 : 0x1000005)
> > + (ver) == HFI_VERSION_6XX || (ver) == HFI_VERSION_6XX_LITE) \
> > + ? 0x7 : 0x1000005)
> > #define HFI_BUFFER_INTERNAL_SCRATCH_2(ver) \
> > (((ver) == HFI_VERSION_4XX || \
> > - (ver) == HFI_VERSION_6XX) ? 0x8 : 0x1000006)
> > + (ver) == HFI_VERSION_6XX || (ver) == HFI_VERSION_6XX_LITE) \
> > + ? 0x8 : 0x1000006)
> > #define HFI_BUFFER_EXTRADATA_INPUT(ver) \
> > (((ver) == HFI_VERSION_4XX) ? 0xc : 0x1000002)
> > #define HFI_BUFFER_EXTRADATA_OUTPUT(ver) \
> > @@ -561,6 +564,7 @@ enum hfi_version {
> > HFI_VERSION_3XX,
> > HFI_VERSION_4XX,
> > HFI_VERSION_6XX,
> > + HFI_VERSION_6XX_LITE,
> s/HFI_VERSION_6XX_LITE/HFI_VERSION_4XX_LITE.
> update all applicable places.
sure, I'll validate that - I remember starting with V4 but it didnt
work so switched to 6xx. I'll try again.
> > };
> >
> > struct hfi_buffer_info {
> > diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c
> > index b5f2ea879950..302776bf8fe6 100644
> > --- a/drivers/media/platform/qcom/venus/hfi_venus.c
> > +++ b/drivers/media/platform/qcom/venus/hfi_venus.c
> > @@ -497,7 +497,7 @@ 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);
> CPU_CS_X2RPMH_V6 is not needed for AR50_LITE, pls drop.
> > }
> > @@ -565,6 +565,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);
> >
> > @@ -1134,7 +1137,8 @@ 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_IRIS2(core) || IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
> > if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
> > status & WRAPPER_INTR_STATUS_A2HWD_MASK_V6 ||
> WD mask is incorrect, pls fix.
> > status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
> > @@ -1146,7 +1150,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;
> > @@ -1531,7 +1535,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);
> > @@ -1551,7 +1555,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/pm_helpers.c b/drivers/media/platform/qcom/venus/pm_helpers.c
> > index 409aa9bd0b5d..5d9dfe3fd043 100644
> > --- a/drivers/media/platform/qcom/venus/pm_helpers.c
> > +++ b/drivers/media/platform/qcom/venus/pm_helpers.c
> > @@ -1168,6 +1168,7 @@ const struct venus_pm_ops *venus_pm_get(enum hfi_version version)
> > return &pm_ops_v3;
> > case HFI_VERSION_4XX:
> > case HFI_VERSION_6XX:
> > + case HFI_VERSION_6XX_LITE:
> s/HFI_VERSION_6XX_LITE/HFI_VERSION_4XX_LITE
yep
>
> Thanks,
> Dikshita
> > return &pm_ops_v4;
> > }
> >
> > diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c
> > index 99ce5fd41577..87c7901b280e 100644
> > --- a/drivers/media/platform/qcom/venus/vdec.c
> > +++ b/drivers/media/platform/qcom/venus/vdec.c
> > @@ -550,7 +550,7 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
> > {
> > struct venus_inst *inst = to_inst(file);
> > struct vb2_queue *dst_vq;
> > - struct hfi_frame_data fdata = {0};
> > + struct hfi_frame_data fdata;
> > int ret;
> >
> > ret = v4l2_m2m_ioctl_try_decoder_cmd(file, fh, cmd);
> > @@ -561,18 +561,15 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
> >
> > if (cmd->cmd == V4L2_DEC_CMD_STOP) {
> > /*
> > - * Implement V4L2_DEC_CMD_STOP by enqueue an empty buffer on
> > + * Implement V4L2_DEC_CMD_STOP by enqueue a buffer on
> > * decoder input to signal EOS.
> > */
> > if (!(inst->streamon_out && inst->streamon_cap))
> > goto unlock;
> >
> > - fdata.buffer_type = HFI_BUFFER_INPUT;
> > - fdata.flags |= HFI_BUFFERFLAG_EOS;
> > - if (IS_V6(inst->core) && is_fw_rev_or_older(inst->core, 1, 0, 87))
> > - fdata.device_addr = 0;
> > - else
> > - fdata.device_addr = 0xdeadb000;
> > + ret = venus_helper_alloc_eos_buf(inst, &fdata);
> > + if (ret)
> > + goto unlock;
> >
> > ret = hfi_session_process_buf(inst, &fdata);
> >
> > @@ -1332,6 +1329,7 @@ static void vdec_session_release(struct venus_inst *inst)
> > hfi_session_abort(inst);
> >
> > venus_helper_free_dpb_bufs(inst);
> > + venus_helper_free_eos_bufs(inst);
> > venus_pm_load_scale(inst);
> > INIT_LIST_HEAD(&inst->registeredbufs);
> > mutex_unlock(&inst->lock);
> > @@ -1682,6 +1680,7 @@ static int vdec_open(struct file *file)
> > if (!inst)
> > return -ENOMEM;
> >
> > + INIT_LIST_HEAD(&inst->eosbufs);
> > INIT_LIST_HEAD(&inst->dpbbufs);
> > INIT_LIST_HEAD(&inst->registeredbufs);
> > INIT_LIST_HEAD(&inst->internalbufs);
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-27 15:12 ` Vikash Garodia
@ 2025-06-27 15:20 ` Konrad Dybcio
2025-06-27 15:23 ` Vikash Garodia
2025-07-07 9:15 ` Jorge Ramirez
1 sibling, 1 reply; 42+ messages in thread
From: Konrad Dybcio @ 2025-06-27 15:20 UTC (permalink / raw)
To: Vikash Garodia, Jorge Ramirez
Cc: krzk+dt, bryan.odonoghue, quic_dikshita, mchehab, robh, conor+dt,
konradybcio, andersson, linux-arm-msm, linux-media, devicetree,
linux-kernel
On 6/27/25 5:12 PM, Vikash Garodia wrote:
>
> On 6/27/2025 8:38 PM, Jorge Ramirez wrote:
>> On 27/06/25 20:28:29, Vikash Garodia wrote:
>>>
>>> On 6/27/2025 6:03 PM, Jorge Ramirez wrote:
>>>> On 27/06/25 17:40:19, Vikash Garodia wrote:
>>>>>
>>>>> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
>>>>>> 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>
>>>>>> ---
>>>>>> arch/arm64/boot/dts/qcom/qcm2290.dtsi | 57 +++++++++++++++++++++++++++
>>>>>> 1 file changed, 57 insertions(+)
>>>>>>
>>>>>> diff --git a/arch/arm64/boot/dts/qcom/qcm2290.dtsi b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>>>>> index f49ac1c1f8a3..5326c91a0ff0 100644
>>>>>> --- a/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>>>>> +++ b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>>>>> @@ -1628,6 +1628,63 @@ 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>;
>>>>> keep only the non secure ones.
>>>>
>>>> ok
>>>>
>>>>>> +
>>>>>> + 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";
>>>>>> +
>>>>>> + status = "okay";
>>>>>> +
>>>>>> + venus_opp_table: opp-table {
>>>>>> + compatible = "operating-points-v2";
>>>>>> +
>>>>>> + opp-133000000 {
>>>>>> + opp-hz = /bits/ 64 <133000000>;
>>>>>> + required-opps = <&rpmpd_opp_low_svs>;
>>>>>> + };
>>>>> Fix the corner freq value
>>>>
>>>> can you add some reference please?
>>>>
>>>> I took this data from an internal document - not sure why the downstream
>>>> driver supports different values or where those were taken from (AFAIK
>>>> they are not supported)
>>> Most likely you have referred incorrect downstream file. Refer scuba-vidc.dtsi.
>>
>> I took them from actual documents (which might or might not be obsolete,
>> hard to say but they were the latest version and as such, they
>> contradict the downstream dtsi).
>>
>> So I'd rather not use downstream - could you point me to the reference
>> you used please - I wonder if the fix is required downstream instead of here?
>
> You can look for this file gcc-scuba.c and refer gcc_video_venus_clk_src which
> is the src for different venus clocks.
This is not a good source in general, GCC often has more rates defined
than the consumer is supposed to finally run at (because they were deemed
power-inefficient or similar, you can pretty much set any rate you want
on the clocks fwiw)
Konrad
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-27 15:20 ` Konrad Dybcio
@ 2025-06-27 15:23 ` Vikash Garodia
2025-06-27 15:27 ` Konrad Dybcio
0 siblings, 1 reply; 42+ messages in thread
From: Vikash Garodia @ 2025-06-27 15:23 UTC (permalink / raw)
To: Konrad Dybcio, Jorge Ramirez
Cc: krzk+dt, bryan.odonoghue, quic_dikshita, mchehab, robh, conor+dt,
konradybcio, andersson, linux-arm-msm, linux-media, devicetree,
linux-kernel
On 6/27/2025 8:50 PM, Konrad Dybcio wrote:
> On 6/27/25 5:12 PM, Vikash Garodia wrote:
>>
>> On 6/27/2025 8:38 PM, Jorge Ramirez wrote:
>>> On 27/06/25 20:28:29, Vikash Garodia wrote:
>>>>
>>>> On 6/27/2025 6:03 PM, Jorge Ramirez wrote:
>>>>> On 27/06/25 17:40:19, Vikash Garodia wrote:
>>>>>>
>>>>>> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
>>>>>>> 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>
>>>>>>> ---
>>>>>>> arch/arm64/boot/dts/qcom/qcm2290.dtsi | 57 +++++++++++++++++++++++++++
>>>>>>> 1 file changed, 57 insertions(+)
>>>>>>>
>>>>>>> diff --git a/arch/arm64/boot/dts/qcom/qcm2290.dtsi b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>>>>>> index f49ac1c1f8a3..5326c91a0ff0 100644
>>>>>>> --- a/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>>>>>> +++ b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>>>>>> @@ -1628,6 +1628,63 @@ 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>;
>>>>>> keep only the non secure ones.
>>>>>
>>>>> ok
>>>>>
>>>>>>> +
>>>>>>> + 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";
>>>>>>> +
>>>>>>> + status = "okay";
>>>>>>> +
>>>>>>> + venus_opp_table: opp-table {
>>>>>>> + compatible = "operating-points-v2";
>>>>>>> +
>>>>>>> + opp-133000000 {
>>>>>>> + opp-hz = /bits/ 64 <133000000>;
>>>>>>> + required-opps = <&rpmpd_opp_low_svs>;
>>>>>>> + };
>>>>>> Fix the corner freq value
>>>>>
>>>>> can you add some reference please?
>>>>>
>>>>> I took this data from an internal document - not sure why the downstream
>>>>> driver supports different values or where those were taken from (AFAIK
>>>>> they are not supported)
>>>> Most likely you have referred incorrect downstream file. Refer scuba-vidc.dtsi.
>>>
>>> I took them from actual documents (which might or might not be obsolete,
>>> hard to say but they were the latest version and as such, they
>>> contradict the downstream dtsi).
>>>
>>> So I'd rather not use downstream - could you point me to the reference
>>> you used please - I wonder if the fix is required downstream instead of here?
>>
>> You can look for this file gcc-scuba.c and refer gcc_video_venus_clk_src which
>> is the src for different venus clocks.
>
> This is not a good source in general, GCC often has more rates defined
> than the consumer is supposed to finally run at (because they were deemed
> power-inefficient or similar, you can pretty much set any rate you want
> on the clocks fwiw)
Count wise, i agree. Value-wise, afaik, corners should match OR are you saying
client scaling request for 133.0 MHz is ok when src is generating 133.33 MHz ?
>
> Konrad
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-27 15:23 ` Vikash Garodia
@ 2025-06-27 15:27 ` Konrad Dybcio
2025-07-07 9:15 ` Jorge Ramirez
0 siblings, 1 reply; 42+ messages in thread
From: Konrad Dybcio @ 2025-06-27 15:27 UTC (permalink / raw)
To: Vikash Garodia, Jorge Ramirez
Cc: krzk+dt, bryan.odonoghue, quic_dikshita, mchehab, robh, conor+dt,
konradybcio, andersson, linux-arm-msm, linux-media, devicetree,
linux-kernel
On 6/27/25 5:23 PM, Vikash Garodia wrote:
>
> On 6/27/2025 8:50 PM, Konrad Dybcio wrote:
>> On 6/27/25 5:12 PM, Vikash Garodia wrote:
>>>
>>> On 6/27/2025 8:38 PM, Jorge Ramirez wrote:
>>>> On 27/06/25 20:28:29, Vikash Garodia wrote:
>>>>>
>>>>> On 6/27/2025 6:03 PM, Jorge Ramirez wrote:
>>>>>> On 27/06/25 17:40:19, Vikash Garodia wrote:
>>>>>>>
>>>>>>> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
>>>>>>>> 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>
>>>>>>>> ---
>>>>>>>> arch/arm64/boot/dts/qcom/qcm2290.dtsi | 57 +++++++++++++++++++++++++++
>>>>>>>> 1 file changed, 57 insertions(+)
>>>>>>>>
>>>>>>>> diff --git a/arch/arm64/boot/dts/qcom/qcm2290.dtsi b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>>>>>>> index f49ac1c1f8a3..5326c91a0ff0 100644
>>>>>>>> --- a/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>>>>>>> +++ b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
>>>>>>>> @@ -1628,6 +1628,63 @@ 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>;
>>>>>>> keep only the non secure ones.
>>>>>>
>>>>>> ok
>>>>>>
>>>>>>>> +
>>>>>>>> + 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";
>>>>>>>> +
>>>>>>>> + status = "okay";
>>>>>>>> +
>>>>>>>> + venus_opp_table: opp-table {
>>>>>>>> + compatible = "operating-points-v2";
>>>>>>>> +
>>>>>>>> + opp-133000000 {
>>>>>>>> + opp-hz = /bits/ 64 <133000000>;
>>>>>>>> + required-opps = <&rpmpd_opp_low_svs>;
>>>>>>>> + };
>>>>>>> Fix the corner freq value
>>>>>>
>>>>>> can you add some reference please?
>>>>>>
>>>>>> I took this data from an internal document - not sure why the downstream
>>>>>> driver supports different values or where those were taken from (AFAIK
>>>>>> they are not supported)
>>>>> Most likely you have referred incorrect downstream file. Refer scuba-vidc.dtsi.
>>>>
>>>> I took them from actual documents (which might or might not be obsolete,
>>>> hard to say but they were the latest version and as such, they
>>>> contradict the downstream dtsi).
>>>>
>>>> So I'd rather not use downstream - could you point me to the reference
>>>> you used please - I wonder if the fix is required downstream instead of here?
>>>
>>> You can look for this file gcc-scuba.c and refer gcc_video_venus_clk_src which
>>> is the src for different venus clocks.
>>
>> This is not a good source in general, GCC often has more rates defined
>> than the consumer is supposed to finally run at (because they were deemed
>> power-inefficient or similar, you can pretty much set any rate you want
>> on the clocks fwiw)
> Count wise, i agree. Value-wise, afaik, corners should match OR are you saying
> client scaling request for 133.0 MHz is ok when src is generating 133.33 MHz ?
I *think* we're running a closest-match in there.. but I'd love to
have the clock and consumer drivers agree on the rate exactly
(which in this case would be 133333333 - and the clock plan in
our docs agrees)
Konrad
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 2/5] media: venus: vdec: AR50_LITE video core support
2025-06-27 15:18 ` Jorge Ramirez
@ 2025-06-30 6:47 ` Dikshita Agarwal
2025-07-08 19:14 ` Jorge Ramirez
0 siblings, 1 reply; 42+ messages in thread
From: Dikshita Agarwal @ 2025-06-30 6:47 UTC (permalink / raw)
To: Jorge Ramirez
Cc: krzk+dt, bryan.odonoghue, quic_vgarodia, mchehab, robh, conor+dt,
konradybcio, andersson, linux-arm-msm, linux-media, devicetree,
linux-kernel
On 6/27/2025 8:48 PM, Jorge Ramirez wrote:
> On 27/06/25 18:17:27, Dikshita Agarwal wrote:
>>
>>
>> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
>>> The AR50_LITE is a streamlined 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.
>>>
>>> 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>
>>> ---
>>> drivers/media/platform/qcom/venus/core.c | 11 ++-
>>> drivers/media/platform/qcom/venus/core.h | 11 ++-
>>> drivers/media/platform/qcom/venus/firmware.c | 8 +-
>>> drivers/media/platform/qcom/venus/helpers.c | 80 +++++++++++++++++++
>>> drivers/media/platform/qcom/venus/helpers.h | 2 +
>>> .../media/platform/qcom/venus/hfi_helper.h | 10 ++-
>>> drivers/media/platform/qcom/venus/hfi_venus.c | 14 ++--
>>> .../media/platform/qcom/venus/pm_helpers.c | 1 +
>>> drivers/media/platform/qcom/venus/vdec.c | 15 ++--
>>> 9 files changed, 128 insertions(+), 24 deletions(-)
>>>
>>> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
>>> index d305d74bb152..736ef53d988d 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;
>>> diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
>>> index b412e0c5515a..e755a28e919b 100644
>>> --- a/drivers/media/platform/qcom/venus/core.h
>>> +++ b/drivers/media/platform/qcom/venus/core.h
>>> @@ -382,6 +382,7 @@ enum venus_inst_modes {
>>> * @lock: instance lock
>>> * @core: a reference to the core struct
>>> * @clk_data: clock data per core ID
>>> + * @eosbufs: a lit of EOS buffers
>>> * @dpbbufs: a list of decoded picture buffers
>>> * @internalbufs: a list of internal bufferes
>>> * @registeredbufs: a list of registered capture bufferes
>>> @@ -450,6 +451,7 @@ struct venus_inst {
>>> struct mutex lock;
>>> struct venus_core *core;
>>> struct clock_data clk_data;
>>> + struct list_head eosbufs;
>>> struct list_head dpbbufs;
>>> struct list_head internalbufs;
>>> struct list_head registeredbufs;
>>> @@ -520,7 +522,14 @@ struct venus_inst {
>>> #define IS_V1(core) ((core)->res->hfi_version == HFI_VERSION_1XX)
>>> #define IS_V3(core) ((core)->res->hfi_version == HFI_VERSION_3XX)
>>> #define IS_V4(core) ((core)->res->hfi_version == HFI_VERSION_4XX)
>>> -#define IS_V6(core) ((core)->res->hfi_version == HFI_VERSION_6XX)
>>> +static inline bool IS_V6(struct venus_core *core)
>>> +{
>>> + if (WARN_ON_ONCE(!core))
>>> + return false;
>>> +
>>> + return core->res->hfi_version == HFI_VERSION_6XX ||
>>> + core->res->hfi_version == HFI_VERSION_6XX_LITE;
>>> +}
>> It should be HFI_VERSION_4XX_LITE for AR50_LITE. 4XX represents SC7280 and
>> SDM845 which are AR50.
>
> ah good information - where is this documented? I never found this
> information... I'd appreciate if you could confirm with some document
> for future reference.
>
>>>
>>> #define IS_AR50(core) ((core)->res->vpu_version == VPU_VERSION_AR50)
>>> #define IS_AR50_LITE(core) ((core)->res->vpu_version == VPU_VERSION_AR50_LITE)
>>> diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
>>> index 66a18830e66d..f8dcef0426ac 100644
>>> --- a/drivers/media/platform/qcom/venus/firmware.c
>>> +++ b/drivers/media/platform/qcom/venus/firmware.c
>>> @@ -30,7 +30,7 @@ static void venus_reset_cpu(struct venus_core *core)
>>> u32 fw_size = core->fw.mapped_mem_size;
>>> void __iomem *wrapper_base;
>>>
>>> - if (IS_IRIS2_1(core))
>>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
>>> wrapper_base = core->wrapper_tz_base;
>>> else
>>> wrapper_base = core->wrapper_base;
>>> @@ -42,7 +42,7 @@ static void venus_reset_cpu(struct venus_core *core)
>>> writel(fw_size, wrapper_base + WRAPPER_NONPIX_START_ADDR);
>>> writel(fw_size, wrapper_base + WRAPPER_NONPIX_END_ADDR);
>>>
>>> - if (IS_IRIS2_1(core)) {
>>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
>>> /* Bring XTSS out of reset */
>>> writel(0, wrapper_base + WRAPPER_TZ_XTSS_SW_RESET);
>>> } else {
>>> @@ -68,7 +68,7 @@ int venus_set_hw_state(struct venus_core *core, bool resume)
>>> if (resume) {
>>> venus_reset_cpu(core);
>>> } else {
>>> - if (IS_IRIS2_1(core))
>>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
>>> writel(WRAPPER_XTSS_SW_RESET_BIT,
>>> core->wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
>>> else
>>> @@ -181,7 +181,7 @@ static int venus_shutdown_no_tz(struct venus_core *core)
>>> void __iomem *wrapper_base = core->wrapper_base;
>>> void __iomem *wrapper_tz_base = core->wrapper_tz_base;
>>>
>>> - if (IS_IRIS2_1(core)) {
>>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
>>> /* Assert the reset to XTSS */
>>> reg = readl(wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
>> No need to handle no-tz case. Pls drop.
>
> ok
>
>>> reg |= WRAPPER_XTSS_SW_RESET_BIT;
>>> diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c
>>> index 8295542e1a7c..812bec9a05be 100644
>>> --- a/drivers/media/platform/qcom/venus/helpers.c
>>> +++ b/drivers/media/platform/qcom/venus/helpers.c
>>> @@ -230,6 +230,79 @@ int venus_helper_alloc_dpb_bufs(struct venus_inst *inst)
>>> }
>>> EXPORT_SYMBOL_GPL(venus_helper_alloc_dpb_bufs);
>>>
>>> +static void free_eos_buf(struct venus_inst *inst, struct intbuf *buf)
>>> +{
>>> + list_del_init(&buf->list);
>>> + dma_free_attrs(inst->core->dev, buf->size, buf->va, buf->da,
>>> + buf->attrs);
>>> + kfree(buf);
>>> +}
>>> +
>>> +int venus_helper_free_eos_bufs(struct venus_inst *inst)
>>> +{
>>> + struct intbuf *buf, *n;
>>> +
>>> + list_for_each_entry_safe(buf, n, &inst->eosbufs, list) {
>>> + free_eos_buf(inst, buf);
>>> + }
>>> +
>>> + if (list_empty(&inst->eosbufs))
>>> + INIT_LIST_HEAD(&inst->eosbufs);
>>> +
>>> + return 0;
>>> +}
>>> +EXPORT_SYMBOL_GPL(venus_helper_free_eos_bufs);
>>> +
>>> +int venus_helper_alloc_eos_buf(struct venus_inst *inst,
>>> + struct hfi_frame_data *data)
>>> +{
>>> + struct venus_core *core = inst->core;
>>> + struct device *dev = core->dev;
>>> + struct intbuf *buf;
>>> + int ret = 0;
>>> +
>>> + memset(data, 0, sizeof(*data));
>>> +
>>> + data->buffer_type = HFI_BUFFER_INPUT;
>>> + data->flags = HFI_BUFFERFLAG_EOS;
>>> +
>>> + if (IS_AR50_LITE(inst->core)) {
>>> + /* We must send valid sizes and addresses */
>>> + buf = kzalloc(sizeof(*buf), GFP_KERNEL);
>>> + if (!buf) {
>>> + ret = -ENOMEM;
>>> + goto fail;
>>> + }
>>> +
>>> + buf->type = HFI_BUFFER_INPUT;
>>> + buf->size = SZ_4K;
>>> + buf->attrs = DMA_ATTR_NO_KERNEL_MAPPING;
>>> + buf->va = dma_alloc_attrs(dev, buf->size, &buf->da, GFP_KERNEL,
>>> + buf->attrs);
>>> + if (!buf->va) {
>>> + ret = -ENOMEM;
>>> + goto fail;
>>> + }
>>> +
>>> + list_add_tail(&buf->list, &inst->eosbufs);
>>> +
>>> + data->alloc_len = buf->size;
>>> + data->device_addr = buf->da;
>>> +
>> why this special handling for eos buffer is needed for AR50_LITE?
>
> this _fix_ was develope through testing: without it there is no EOS and
> errors are reporting upon killing the player
>
Would be better to see why there is no EOS from firmware,
there shouldn't be the need to have a dma allocation for this dummy
buffers, as there is no useful info in the buffer. Having the device
address as 0 or 0xdeadb000 should be enough.
>
>>> + } else if (IS_V6(inst->core) &&
>>> + is_fw_rev_or_older(inst->core, 1, 0, 87)) {
>>> + data->device_addr = 0;
>>> + } else {
>>> + data->device_addr = 0xdeadb000;
>>> + }
>>> +
>>> + return 0;
>>> +fail:
>>> + kfree(buf);
>>> + return ret;
>>> +}
>>> +EXPORT_SYMBOL_GPL(venus_helper_alloc_eos_buf);
>>> +
>>> static int intbufs_set_buffer(struct venus_inst *inst, u32 type)
>>> {
>>> struct venus_core *core = inst->core;
>>> @@ -630,6 +703,13 @@ static int platform_get_bufreq(struct venus_inst *inst, u32 buftype,
>>> if (!hfi_plat || !hfi_plat->bufreq)
>>> return -EINVAL;
>>>
>>> + /* Firmware buffer requirements for internal buffers only */
>>> + if (IS_AR50_LITE(inst->core))
>>> + if (buftype != HFI_BUFFER_INPUT &&
>>> + buftype != HFI_BUFFER_OUTPUT &&
>>> + buftype != HFI_BUFFER_OUTPUT2)
>>> + return -EINVAL;
>>> +
>> why this check is needed here? Buffer requirements for all buffer types
>> should come from firmware for all V4 based targets.
>
> because I used V6 as you saw earlier.
Yes, pls use v4, and in that case all buffer requirements will come from
firmware.
Thanks,
Dikshita
>
>>> params.version = version;
>>> params.num_vpp_pipes = inst->core->res->num_vpp_pipes;
>>>
>>> diff --git a/drivers/media/platform/qcom/venus/helpers.h b/drivers/media/platform/qcom/venus/helpers.h
>>> index 358e4f39c9c0..bf55fe3b8747 100644
>>> --- a/drivers/media/platform/qcom/venus/helpers.h
>>> +++ b/drivers/media/platform/qcom/venus/helpers.h
>>> @@ -58,6 +58,8 @@ int venus_helper_get_out_fmts(struct venus_inst *inst, u32 fmt, u32 *out_fmt,
>>> bool venus_helper_check_format(struct venus_inst *inst, u32 v4l2_pixfmt);
>>> int venus_helper_alloc_dpb_bufs(struct venus_inst *inst);
>>> int venus_helper_free_dpb_bufs(struct venus_inst *inst);
>>> +int venus_helper_alloc_eos_buf(struct venus_inst *inst, struct hfi_frame_data *data);
>>> +int venus_helper_free_eos_bufs(struct venus_inst *inst);
>>> int venus_helper_intbufs_alloc(struct venus_inst *inst);
>>> int venus_helper_intbufs_free(struct venus_inst *inst);
>>> int venus_helper_intbufs_realloc(struct venus_inst *inst);
>>> diff --git a/drivers/media/platform/qcom/venus/hfi_helper.h b/drivers/media/platform/qcom/venus/hfi_helper.h
>>> index f44059f19505..128ddf8e3cd5 100644
>>> --- a/drivers/media/platform/qcom/venus/hfi_helper.h
>>> +++ b/drivers/media/platform/qcom/venus/hfi_helper.h
>>> @@ -397,13 +397,16 @@
>>> #define HFI_BUFFER_INTERNAL_PERSIST_1 0x5
>>> #define HFI_BUFFER_INTERNAL_SCRATCH(ver) \
>>> (((ver) == HFI_VERSION_4XX || \
>>> - (ver) == HFI_VERSION_6XX) ? 0x6 : 0x1000001)
>>> + (ver) == HFI_VERSION_6XX || (ver) == HFI_VERSION_6XX_LITE) \
>>> + ? 0x6 : 0x1000001)
>>> #define HFI_BUFFER_INTERNAL_SCRATCH_1(ver) \
>>> (((ver) == HFI_VERSION_4XX || \
>>> - (ver) == HFI_VERSION_6XX) ? 0x7 : 0x1000005)
>>> + (ver) == HFI_VERSION_6XX || (ver) == HFI_VERSION_6XX_LITE) \
>>> + ? 0x7 : 0x1000005)
>>> #define HFI_BUFFER_INTERNAL_SCRATCH_2(ver) \
>>> (((ver) == HFI_VERSION_4XX || \
>>> - (ver) == HFI_VERSION_6XX) ? 0x8 : 0x1000006)
>>> + (ver) == HFI_VERSION_6XX || (ver) == HFI_VERSION_6XX_LITE) \
>>> + ? 0x8 : 0x1000006)
>>> #define HFI_BUFFER_EXTRADATA_INPUT(ver) \
>>> (((ver) == HFI_VERSION_4XX) ? 0xc : 0x1000002)
>>> #define HFI_BUFFER_EXTRADATA_OUTPUT(ver) \
>>> @@ -561,6 +564,7 @@ enum hfi_version {
>>> HFI_VERSION_3XX,
>>> HFI_VERSION_4XX,
>>> HFI_VERSION_6XX,
>>> + HFI_VERSION_6XX_LITE,
>> s/HFI_VERSION_6XX_LITE/HFI_VERSION_4XX_LITE.
>> update all applicable places.
>
> sure, I'll validate that - I remember starting with V4 but it didnt
> work so switched to 6xx. I'll try again.
>
>
>>> };
>>>
>>> struct hfi_buffer_info {
>>> diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c
>>> index b5f2ea879950..302776bf8fe6 100644
>>> --- a/drivers/media/platform/qcom/venus/hfi_venus.c
>>> +++ b/drivers/media/platform/qcom/venus/hfi_venus.c
>>> @@ -497,7 +497,7 @@ 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);
>> CPU_CS_X2RPMH_V6 is not needed for AR50_LITE, pls drop.
>>> }
>>> @@ -565,6 +565,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);
>>>
>>> @@ -1134,7 +1137,8 @@ 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_IRIS2(core) || IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
>>> if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
>>> status & WRAPPER_INTR_STATUS_A2HWD_MASK_V6 ||
>> WD mask is incorrect, pls fix.
>>> status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
>>> @@ -1146,7 +1150,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;
>>> @@ -1531,7 +1535,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);
>>> @@ -1551,7 +1555,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/pm_helpers.c b/drivers/media/platform/qcom/venus/pm_helpers.c
>>> index 409aa9bd0b5d..5d9dfe3fd043 100644
>>> --- a/drivers/media/platform/qcom/venus/pm_helpers.c
>>> +++ b/drivers/media/platform/qcom/venus/pm_helpers.c
>>> @@ -1168,6 +1168,7 @@ const struct venus_pm_ops *venus_pm_get(enum hfi_version version)
>>> return &pm_ops_v3;
>>> case HFI_VERSION_4XX:
>>> case HFI_VERSION_6XX:
>>> + case HFI_VERSION_6XX_LITE:
>> s/HFI_VERSION_6XX_LITE/HFI_VERSION_4XX_LITE
>
> yep
>
>>
>> Thanks,
>> Dikshita
>>> return &pm_ops_v4;
>>> }
>>>
>>> diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c
>>> index 99ce5fd41577..87c7901b280e 100644
>>> --- a/drivers/media/platform/qcom/venus/vdec.c
>>> +++ b/drivers/media/platform/qcom/venus/vdec.c
>>> @@ -550,7 +550,7 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
>>> {
>>> struct venus_inst *inst = to_inst(file);
>>> struct vb2_queue *dst_vq;
>>> - struct hfi_frame_data fdata = {0};
>>> + struct hfi_frame_data fdata;
>>> int ret;
>>>
>>> ret = v4l2_m2m_ioctl_try_decoder_cmd(file, fh, cmd);
>>> @@ -561,18 +561,15 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
>>>
>>> if (cmd->cmd == V4L2_DEC_CMD_STOP) {
>>> /*
>>> - * Implement V4L2_DEC_CMD_STOP by enqueue an empty buffer on
>>> + * Implement V4L2_DEC_CMD_STOP by enqueue a buffer on
>>> * decoder input to signal EOS.
>>> */
>>> if (!(inst->streamon_out && inst->streamon_cap))
>>> goto unlock;
>>>
>>> - fdata.buffer_type = HFI_BUFFER_INPUT;
>>> - fdata.flags |= HFI_BUFFERFLAG_EOS;
>>> - if (IS_V6(inst->core) && is_fw_rev_or_older(inst->core, 1, 0, 87))
>>> - fdata.device_addr = 0;
>>> - else
>>> - fdata.device_addr = 0xdeadb000;
>>> + ret = venus_helper_alloc_eos_buf(inst, &fdata);
>>> + if (ret)
>>> + goto unlock;
>>>
>>> ret = hfi_session_process_buf(inst, &fdata);
>>>
>>> @@ -1332,6 +1329,7 @@ static void vdec_session_release(struct venus_inst *inst)
>>> hfi_session_abort(inst);
>>>
>>> venus_helper_free_dpb_bufs(inst);
>>> + venus_helper_free_eos_bufs(inst);
>>> venus_pm_load_scale(inst);
>>> INIT_LIST_HEAD(&inst->registeredbufs);
>>> mutex_unlock(&inst->lock);
>>> @@ -1682,6 +1680,7 @@ static int vdec_open(struct file *file)
>>> if (!inst)
>>> return -ENOMEM;
>>>
>>> + INIT_LIST_HEAD(&inst->eosbufs);
>>> INIT_LIST_HEAD(&inst->dpbbufs);
>>> INIT_LIST_HEAD(&inst->registeredbufs);
>>> INIT_LIST_HEAD(&inst->internalbufs);
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema
2025-06-27 12:06 ` Vikash Garodia
@ 2025-07-07 9:06 ` Jorge Ramirez
2025-07-07 9:26 ` Jorge Ramirez
0 siblings, 1 reply; 42+ messages in thread
From: Jorge Ramirez @ 2025-07-07 9:06 UTC (permalink / raw)
To: Vikash Garodia
Cc: Jorge Ramirez-Ortiz, krzk+dt, bryan.odonoghue, quic_dikshita,
mchehab, robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On 27/06/25 17:36:43, Vikash Garodia wrote:
>
> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> > Add a schema for the venus video encoder/decoder on the qcm2290.
> >
> > Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> > Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> > ---
> > .../bindings/media/qcom,qcm2290-venus.yaml | 127 ++++++++++++++++++
> > 1 file changed, 127 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..a9f89b545334
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/media/qcom,qcm2290-venus.yaml
> > @@ -0,0 +1,127 @@
> > +# 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:
> > + - Vikash Garodia <quic_vgarodia@quicinc.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:
> > + minItems: 1
> > + maxItems: 5
> 2 should be good to support non secure usecases. 5 not needed.
ok
> > +
> > + 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/interrupt-controller/arm-gic.h>
> > + #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/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>;
> update this accordingly.
> > +
> > + 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-133000000 {
> > + opp-hz = /bits/ 64 <133000000>;
> > + required-opps = <&rpmpd_opp_low_svs>;
> > + };
> This value is incorrect, fix it to 133330000.
> > + opp-240000000 {
> > + opp-hz = /bits/ 64 <240000000>;
> > + required-opps = <&rpmpd_opp_svs>;
> Do you see other corners in the reference catalog as well, not just the
> downstream code ? OR did you limit this as the usecase do not demand higher corner ?
there was an internal AR50_LITE presentation where only these two
claimed to be supported - all of the others were not. so I went for the
most restrictive option (ie, this one).
how do you want me to proceed then? should I just use IPCAT, or downstream?
>
> Regards,
> Vikash
> > + };
> > + };
> > + };
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 4/5] media: venus: core: Add qcm2290 DT compatible and resource data
2025-06-27 13:16 ` Dikshita Agarwal
@ 2025-07-07 9:09 ` Jorge Ramirez
2025-07-07 9:19 ` Konrad Dybcio
0 siblings, 1 reply; 42+ messages in thread
From: Jorge Ramirez @ 2025-07-07 9:09 UTC (permalink / raw)
To: Dikshita Agarwal
Cc: Jorge Ramirez-Ortiz, krzk+dt, bryan.odonoghue, quic_vgarodia,
mchehab, robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On 27/06/25 18:46:10, Dikshita Agarwal wrote:
>
>
> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> > Add a qcm2290 compatible binding to the venus core.
> >
> > Video encoding support is not exposed until the relevant hardware
> > capabilities are enabled.
> >
> > 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>
> > ---
> > drivers/media/platform/qcom/venus/core.c | 39 ++++++++++++++++++++++++
> > 1 file changed, 39 insertions(+)
> >
> > diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> > index 736ef53d988d..f1f211ca1ce2 100644
> > --- a/drivers/media/platform/qcom/venus/core.c
> > +++ b/drivers/media/platform/qcom/venus/core.c
> > @@ -1062,6 +1062,44 @@ static const struct venus_resources sc7280_res = {
> > .enc_nodename = "video-encoder",
> > };
> >
> > +static const struct freq_tbl qcm2290_freq_table[] = {
> > + { 352800, 240000000 }, /* 1920x1088 @ 30 + 1280x720 @ 30 */
> > + { 244800, 133000000 }, /* 1920x1088 @ 30 */
> > +};
> > +
> fix this corner.
ok, will wait for Vikash to confirm the other ones.
> > +static const struct bw_tbl qcm2290_bw_table_dec[] = {
> > + { 244800, 2128000, 0, 2128000, 0}, /* 1920x1088 @ 30 */
> > +};
> > +
> what is the reference for this?
> > +static const struct venus_resources qcm2290_res = {
> > + .freq_tbl = qcm2290_freq_table,
> > + .freq_tbl_size = ARRAY_SIZE(qcm2290_freq_table),
> > + .bw_tbl_dec = qcm2290_bw_table_dec,
> > + .bw_tbl_dec_size = ARRAY_SIZE(qcm2290_bw_table_dec),
> > + .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_6XX_LITE,
> s/HFI_VERSION_6XX_LITE/HFI_VERSION_4XX_LITE
um right, going to rewrite this whole bit and get rid of
6XX_LITE/4XX_LITE (will post 4XX with a lite option instead, which is
closer to the intended abstraction - even though the 6XX/4XX
abstractions are kind of dubious...)
>
> Thanks,
> Dikshita
> > + .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",
> > +};
> > +
> > static const struct of_device_id venus_dt_match[] = {
> > { .compatible = "qcom,msm8916-venus", .data = &msm8916_res, },
> > { .compatible = "qcom,msm8996-venus", .data = &msm8996_res, },
> > @@ -1072,6 +1110,7 @@ static const struct of_device_id venus_dt_match[] = {
> > { .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
> > { .compatible = "qcom,sc7280-venus", .data = &sc7280_res, },
> > { .compatible = "qcom,sm8250-venus", .data = &sm8250_res, },
> > + { .compatible = "qcom,qcm2290-venus", .data = &qcm2290_res, },
> > { }
> > };
> > MODULE_DEVICE_TABLE(of, venus_dt_match);
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 3/5] media: venus: hfi_plat_v6_lite: Populate decode capabilities
2025-06-27 13:32 ` Dikshita Agarwal
@ 2025-07-07 9:13 ` Jorge Ramirez
2025-07-07 9:29 ` Dikshita Agarwal
0 siblings, 1 reply; 42+ messages in thread
From: Jorge Ramirez @ 2025-07-07 9:13 UTC (permalink / raw)
To: Dikshita Agarwal
Cc: Jorge Ramirez-Ortiz, krzk+dt, bryan.odonoghue, quic_vgarodia,
mchehab, robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On 27/06/25 19:02:13, Dikshita Agarwal wrote:
>
>
> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> > Add hfi platform file with decoding capabilities for hfi v6_lite.
> >
> > Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> > ---
> > drivers/media/platform/qcom/venus/Makefile | 2 +-
> > .../media/platform/qcom/venus/hfi_platform.c | 2 +
> > .../media/platform/qcom/venus/hfi_platform.h | 1 +
> > .../qcom/venus/hfi_platform_v6_lite.c | 148 ++++++++++++++++++
> > 4 files changed, 152 insertions(+), 1 deletion(-)
> > create mode 100644 drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> >
> > diff --git a/drivers/media/platform/qcom/venus/Makefile b/drivers/media/platform/qcom/venus/Makefile
> > index 91ee6be10292..4a6a942db58b 100644
> > --- a/drivers/media/platform/qcom/venus/Makefile
> > +++ b/drivers/media/platform/qcom/venus/Makefile
> > @@ -5,7 +5,7 @@ venus-core-objs += core.o helpers.o firmware.o \
> > hfi_venus.o hfi_msgs.o hfi_cmds.o hfi.o \
> > hfi_parser.o pm_helpers.o dbgfs.o \
> > hfi_platform.o hfi_platform_v4.o \
> > - hfi_platform_v6.o hfi_plat_bufs_v6.o \
> > + hfi_platform_v6.o hfi_plat_bufs_v6.o hfi_platform_v6_lite.o \
> s/hfi_platform_v6_lite/hfi_platform_v4_lite
will remove, will use platform_v4 instead
> >
> > venus-dec-objs += vdec.o vdec_ctrls.o
> > venus-enc-objs += venc.o venc_ctrls.o
> > diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
> > index 643e5aa138f5..f56b8f9946d7 100644
> > --- a/drivers/media/platform/qcom/venus/hfi_platform.c
> > +++ b/drivers/media/platform/qcom/venus/hfi_platform.c
> > @@ -13,6 +13,8 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
> > return &hfi_plat_v4;
> > case HFI_VERSION_6XX:
> > return &hfi_plat_v6;
> > + case HFI_VERSION_6XX_LITE:
> > + return &hfi_plat_v6_lite;
> update here as well.
yes, this function wont get changed
> > default:
> > break;
> > }
> > diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
> > index ec89a90a8129..6356e4bd0de2 100644
> > --- a/drivers/media/platform/qcom/venus/hfi_platform.h
> > +++ b/drivers/media/platform/qcom/venus/hfi_platform.h
> > @@ -58,6 +58,7 @@ struct hfi_platform {
> >
> > extern const struct hfi_platform hfi_plat_v4;
> > extern const struct hfi_platform hfi_plat_v6;
> > +extern const struct hfi_platform hfi_plat_v6_lite;
> ditto
neither this one
> >
> > 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,
> > diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> > new file mode 100644
> > index 000000000000..41958a3e353b
> > --- /dev/null
> > +++ b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> > @@ -0,0 +1,148 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +/*
> > + * Copyright (c) 2025, The Linux Foundation. All rights reserved.
> > + */
> > +#include "hfi_platform.h"
> > +
> > +static const struct hfi_plat_caps caps[] = {
> > +{
> > + .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, 1080, 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_1},
> > + .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_41},
> > + .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
> > + .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_41},
> > + .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_41},
> what is the reference for these values?
what do you mean? what should be the reference? I didnt see a downstream
equivalente to base on so based on the 4XX settings these seem
consistent.
IS there any internal document that you can point me to please?
> > + .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, 1080, 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_MAIN},
> > + .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
> what is the reference for these values?
same as above.
what internal documents do you typically reference to? Havent seen these
references in previous commits.
could you clarify please?
> > + .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, 1080, 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,
> > +} };
> > +
> > +static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
> > +{
> > + *entries = ARRAY_SIZE(caps);
> > + return caps;
> > +}
> > +
> > +static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> > +{
> > + *enc_codecs = 0x0;
> > + *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> > + HFI_VIDEO_CODEC_VP9;
> > + *count = 3;
> > +}
> > +
> > +static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
> > + { 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 },
> > +};
> > +
> > +static const struct hfi_platform_codec_freq_data *
> > +get_codec_freq_data(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;
> > +
> > + for (i = 0; i < data_size; i++) {
> > + if (data[i].pixfmt == pixfmt &&
> > + data[i].session_type == session_type) {
> > + found = &data[i];
> > + break;
> > + }
> > + }
> > +
> > + return found;
> > +}
> > +
> > +static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
> > +{
> > + const struct hfi_platform_codec_freq_data *data;
> > +
> > + data = get_codec_freq_data(session_type, codec);
> > + if (data)
> > + return data->vpp_freq;
> > +
> > + return 0;
> > +}
> > +
> > +static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
> > +{
> > + const struct hfi_platform_codec_freq_data *data;
> > +
> > + data = get_codec_freq_data(session_type, codec);
> > + if (data)
> > + return data->vsp_freq;
> > +
> > + return 0;
> > +}
> > +
> > +static unsigned long codec_lp_freq(u32 session_type, u32 codec)
> > +{
> > + const struct hfi_platform_codec_freq_data *data;
> > +
> > + data = get_codec_freq_data(session_type, codec);
> > + if (data)
> > + return data->low_power_freq;
> > +
> > + return 0;
> > +}
> > +
> > +const struct hfi_platform hfi_plat_v6_lite = {
> > + .codec_vpp_freq = codec_vpp_freq,
> > + .codec_vsp_freq = codec_vsp_freq,
> > + .codec_lp_freq = codec_lp_freq,
> > + .codecs = get_codecs,
> > + .capabilities = get_capabilities,
> > + .bufreq = hfi_plat_bufreq_v6,
> buffer requirement should come from firmware, pls drop.
yes, this will be hfi_plat_v4 only
> > +};
>
> lot of code duplication here, pls see the possibility to commonize the
> > code.
this file is no longer needed
>
> Thanks,
> Dikshita
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-27 15:12 ` Vikash Garodia
2025-06-27 15:20 ` Konrad Dybcio
@ 2025-07-07 9:15 ` Jorge Ramirez
1 sibling, 0 replies; 42+ messages in thread
From: Jorge Ramirez @ 2025-07-07 9:15 UTC (permalink / raw)
To: Vikash Garodia
Cc: Jorge Ramirez, krzk+dt, bryan.odonoghue, quic_dikshita, mchehab,
robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On 27/06/25 20:42:45, Vikash Garodia wrote:
>
> On 6/27/2025 8:38 PM, Jorge Ramirez wrote:
> > On 27/06/25 20:28:29, Vikash Garodia wrote:
> >>
> >> On 6/27/2025 6:03 PM, Jorge Ramirez wrote:
> >>> On 27/06/25 17:40:19, Vikash Garodia wrote:
> >>>>
> >>>> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> >>>>> 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>
> >>>>> ---
> >>>>> arch/arm64/boot/dts/qcom/qcm2290.dtsi | 57 +++++++++++++++++++++++++++
> >>>>> 1 file changed, 57 insertions(+)
> >>>>>
> >>>>> diff --git a/arch/arm64/boot/dts/qcom/qcm2290.dtsi b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> >>>>> index f49ac1c1f8a3..5326c91a0ff0 100644
> >>>>> --- a/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> >>>>> +++ b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> >>>>> @@ -1628,6 +1628,63 @@ 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>;
> >>>> keep only the non secure ones.
> >>>
> >>> ok
> >>>
> >>>>> +
> >>>>> + 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";
> >>>>> +
> >>>>> + status = "okay";
> >>>>> +
> >>>>> + venus_opp_table: opp-table {
> >>>>> + compatible = "operating-points-v2";
> >>>>> +
> >>>>> + opp-133000000 {
> >>>>> + opp-hz = /bits/ 64 <133000000>;
> >>>>> + required-opps = <&rpmpd_opp_low_svs>;
> >>>>> + };
> >>>> Fix the corner freq value
> >>>
> >>> can you add some reference please?
> >>>
> >>> I took this data from an internal document - not sure why the downstream
> >>> driver supports different values or where those were taken from (AFAIK
> >>> they are not supported)
> >> Most likely you have referred incorrect downstream file. Refer scuba-vidc.dtsi.
> >
> > I took them from actual documents (which might or might not be obsolete,
> > hard to say but they were the latest version and as such, they
> > contradict the downstream dtsi).
> >
> > So I'd rather not use downstream - could you point me to the reference
> > you used please - I wonder if the fix is required downstream instead of here?
>
> You can look for this file gcc-scuba.c and refer gcc_video_venus_clk_src which
> is the src for different venus clocks.
sure, but the question remains, how do I know these are correct when the
documentation I have claims the opposite?
AFAIK downstream could be wrong, no?
>
> >
> >> Again, good reference for such cases would IP catalogues and if not, gcc driver
> >> in this case which have structures defining different corners for
> >> video.
> >
> > The PM document for this chip only confirms two values - the other 4 ones
> > claim they are not supported on 50_LT
> >
> > but we can discuss offline.
> >
> >>>
> >>>
> >>>>
> >>>> Regards,
> >>>> Vikash
> >>>>> +
> >>>>> + 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>;
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node
2025-06-27 15:27 ` Konrad Dybcio
@ 2025-07-07 9:15 ` Jorge Ramirez
0 siblings, 0 replies; 42+ messages in thread
From: Jorge Ramirez @ 2025-07-07 9:15 UTC (permalink / raw)
To: Konrad Dybcio
Cc: Vikash Garodia, Jorge Ramirez, krzk+dt, bryan.odonoghue,
quic_dikshita, mchehab, robh, conor+dt, konradybcio, andersson,
linux-arm-msm, linux-media, devicetree, linux-kernel
On 27/06/25 17:27:04, Konrad Dybcio wrote:
> On 6/27/25 5:23 PM, Vikash Garodia wrote:
> >
> > On 6/27/2025 8:50 PM, Konrad Dybcio wrote:
> >> On 6/27/25 5:12 PM, Vikash Garodia wrote:
> >>>
> >>> On 6/27/2025 8:38 PM, Jorge Ramirez wrote:
> >>>> On 27/06/25 20:28:29, Vikash Garodia wrote:
> >>>>>
> >>>>> On 6/27/2025 6:03 PM, Jorge Ramirez wrote:
> >>>>>> On 27/06/25 17:40:19, Vikash Garodia wrote:
> >>>>>>>
> >>>>>>> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> >>>>>>>> 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>
> >>>>>>>> ---
> >>>>>>>> arch/arm64/boot/dts/qcom/qcm2290.dtsi | 57 +++++++++++++++++++++++++++
> >>>>>>>> 1 file changed, 57 insertions(+)
> >>>>>>>>
> >>>>>>>> diff --git a/arch/arm64/boot/dts/qcom/qcm2290.dtsi b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> >>>>>>>> index f49ac1c1f8a3..5326c91a0ff0 100644
> >>>>>>>> --- a/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> >>>>>>>> +++ b/arch/arm64/boot/dts/qcom/qcm2290.dtsi
> >>>>>>>> @@ -1628,6 +1628,63 @@ 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>;
> >>>>>>> keep only the non secure ones.
> >>>>>>
> >>>>>> ok
> >>>>>>
> >>>>>>>> +
> >>>>>>>> + 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";
> >>>>>>>> +
> >>>>>>>> + status = "okay";
> >>>>>>>> +
> >>>>>>>> + venus_opp_table: opp-table {
> >>>>>>>> + compatible = "operating-points-v2";
> >>>>>>>> +
> >>>>>>>> + opp-133000000 {
> >>>>>>>> + opp-hz = /bits/ 64 <133000000>;
> >>>>>>>> + required-opps = <&rpmpd_opp_low_svs>;
> >>>>>>>> + };
> >>>>>>> Fix the corner freq value
> >>>>>>
> >>>>>> can you add some reference please?
> >>>>>>
> >>>>>> I took this data from an internal document - not sure why the downstream
> >>>>>> driver supports different values or where those were taken from (AFAIK
> >>>>>> they are not supported)
> >>>>> Most likely you have referred incorrect downstream file. Refer scuba-vidc.dtsi.
> >>>>
> >>>> I took them from actual documents (which might or might not be obsolete,
> >>>> hard to say but they were the latest version and as such, they
> >>>> contradict the downstream dtsi).
> >>>>
> >>>> So I'd rather not use downstream - could you point me to the reference
> >>>> you used please - I wonder if the fix is required downstream instead of here?
> >>>
> >>> You can look for this file gcc-scuba.c and refer gcc_video_venus_clk_src which
> >>> is the src for different venus clocks.
> >>
> >> This is not a good source in general, GCC often has more rates defined
> >> than the consumer is supposed to finally run at (because they were deemed
> >> power-inefficient or similar, you can pretty much set any rate you want
> >> on the clocks fwiw)
> > Count wise, i agree. Value-wise, afaik, corners should match OR are you saying
> > client scaling request for 133.0 MHz is ok when src is generating 133.33 MHz ?
>
> I *think* we're running a closest-match in there.. but I'd love to
> have the clock and consumer drivers agree on the rate exactly
> (which in this case would be 133333333 - and the clock plan in
> our docs agrees)
>
ok, will use this instead
> Konrad
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 4/5] media: venus: core: Add qcm2290 DT compatible and resource data
2025-07-07 9:09 ` Jorge Ramirez
@ 2025-07-07 9:19 ` Konrad Dybcio
2025-07-13 8:19 ` Jorge Ramirez
0 siblings, 1 reply; 42+ messages in thread
From: Konrad Dybcio @ 2025-07-07 9:19 UTC (permalink / raw)
To: Jorge Ramirez, Dikshita Agarwal
Cc: krzk+dt, bryan.odonoghue, quic_vgarodia, mchehab, robh, conor+dt,
konradybcio, andersson, linux-arm-msm, linux-media, devicetree,
linux-kernel
On 7/7/25 11:09 AM, Jorge Ramirez wrote:
> On 27/06/25 18:46:10, Dikshita Agarwal wrote:
>>
>>
>> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
>>> Add a qcm2290 compatible binding to the venus core.
>>>
>>> Video encoding support is not exposed until the relevant hardware
>>> capabilities are enabled.
>>>
>>> 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>
>>> ---
>>> drivers/media/platform/qcom/venus/core.c | 39 ++++++++++++++++++++++++
>>> 1 file changed, 39 insertions(+)
>>>
>>> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
>>> index 736ef53d988d..f1f211ca1ce2 100644
>>> --- a/drivers/media/platform/qcom/venus/core.c
>>> +++ b/drivers/media/platform/qcom/venus/core.c
>>> @@ -1062,6 +1062,44 @@ static const struct venus_resources sc7280_res = {
>>> .enc_nodename = "video-encoder",
>>> };
>>>
>>> +static const struct freq_tbl qcm2290_freq_table[] = {
>>> + { 352800, 240000000 }, /* 1920x1088 @ 30 + 1280x720 @ 30 */
>>> + { 244800, 133000000 }, /* 1920x1088 @ 30 */
>>> +};
>>> +
>> fix this corner.
>
> ok, will wait for Vikash to confirm the other ones.
Actually you can get rid of it now, I think:
https://git.linuxtv.org/media.git/commit/?id=b179234b5e59013f8772da17b273f463f9720bdd
Konrad
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema
2025-07-07 9:06 ` Jorge Ramirez
@ 2025-07-07 9:26 ` Jorge Ramirez
2025-07-07 9:29 ` Bryan O'Donoghue
0 siblings, 1 reply; 42+ messages in thread
From: Jorge Ramirez @ 2025-07-07 9:26 UTC (permalink / raw)
To: Jorge Ramirez
Cc: Vikash Garodia, krzk+dt, bryan.odonoghue, quic_dikshita, mchehab,
robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On 07/07/25 11:06:58, Jorge Ramirez wrote:
> On 27/06/25 17:36:43, Vikash Garodia wrote:
> >
> > On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> > > Add a schema for the venus video encoder/decoder on the qcm2290.
> > >
> > > Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> > > Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> > > ---
> > > .../bindings/media/qcom,qcm2290-venus.yaml | 127 ++++++++++++++++++
> > > 1 file changed, 127 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..a9f89b545334
> > > --- /dev/null
> > > +++ b/Documentation/devicetree/bindings/media/qcom,qcm2290-venus.yaml
> > > @@ -0,0 +1,127 @@
> > > +# 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:
> > > + - Vikash Garodia <quic_vgarodia@quicinc.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:
> > > + minItems: 1
> > > + maxItems: 5
> > 2 should be good to support non secure usecases. 5 not needed.
>
> ok
isnt it better to just leave 5 here - thinking of the future support for
secure buffers - and just update the dts?
>
> > > +
> > > + 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/interrupt-controller/arm-gic.h>
> > > + #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/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>;
> > update this accordingly.
> > > +
> > > + 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-133000000 {
> > > + opp-hz = /bits/ 64 <133000000>;
> > > + required-opps = <&rpmpd_opp_low_svs>;
> > > + };
> > This value is incorrect, fix it to 133330000.
> > > + opp-240000000 {
> > > + opp-hz = /bits/ 64 <240000000>;
> > > + required-opps = <&rpmpd_opp_svs>;
> > Do you see other corners in the reference catalog as well, not just the
> > downstream code ? OR did you limit this as the usecase do not demand higher corner ?
>
> there was an internal AR50_LITE presentation where only these two
> claimed to be supported - all of the others were not. so I went for the
> most restrictive option (ie, this one).
>
> how do you want me to proceed then? should I just use IPCAT, or downstream?
>
>
> >
> > Regards,
> > Vikash
> > > + };
> > > + };
> > > + };
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 3/5] media: venus: hfi_plat_v6_lite: Populate decode capabilities
2025-07-07 9:13 ` Jorge Ramirez
@ 2025-07-07 9:29 ` Dikshita Agarwal
2025-07-07 9:56 ` Jorge Ramirez
0 siblings, 1 reply; 42+ messages in thread
From: Dikshita Agarwal @ 2025-07-07 9:29 UTC (permalink / raw)
To: Jorge Ramirez
Cc: krzk+dt, bryan.odonoghue, quic_vgarodia, mchehab, robh, conor+dt,
konradybcio, andersson, linux-arm-msm, linux-media, devicetree,
linux-kernel
On 7/7/2025 2:43 PM, Jorge Ramirez wrote:
> On 27/06/25 19:02:13, Dikshita Agarwal wrote:
>>
>>
>> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
>>> Add hfi platform file with decoding capabilities for hfi v6_lite.
>>>
>>> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
>>> ---
>>> drivers/media/platform/qcom/venus/Makefile | 2 +-
>>> .../media/platform/qcom/venus/hfi_platform.c | 2 +
>>> .../media/platform/qcom/venus/hfi_platform.h | 1 +
>>> .../qcom/venus/hfi_platform_v6_lite.c | 148 ++++++++++++++++++
>>> 4 files changed, 152 insertions(+), 1 deletion(-)
>>> create mode 100644 drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
>>>
>>> diff --git a/drivers/media/platform/qcom/venus/Makefile b/drivers/media/platform/qcom/venus/Makefile
>>> index 91ee6be10292..4a6a942db58b 100644
>>> --- a/drivers/media/platform/qcom/venus/Makefile
>>> +++ b/drivers/media/platform/qcom/venus/Makefile
>>> @@ -5,7 +5,7 @@ venus-core-objs += core.o helpers.o firmware.o \
>>> hfi_venus.o hfi_msgs.o hfi_cmds.o hfi.o \
>>> hfi_parser.o pm_helpers.o dbgfs.o \
>>> hfi_platform.o hfi_platform_v4.o \
>>> - hfi_platform_v6.o hfi_plat_bufs_v6.o \
>>> + hfi_platform_v6.o hfi_plat_bufs_v6.o hfi_platform_v6_lite.o \
>> s/hfi_platform_v6_lite/hfi_platform_v4_lite
>
> will remove, will use platform_v4 instead
>
>>>
>>> venus-dec-objs += vdec.o vdec_ctrls.o
>>> venus-enc-objs += venc.o venc_ctrls.o
>>> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
>>> index 643e5aa138f5..f56b8f9946d7 100644
>>> --- a/drivers/media/platform/qcom/venus/hfi_platform.c
>>> +++ b/drivers/media/platform/qcom/venus/hfi_platform.c
>>> @@ -13,6 +13,8 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
>>> return &hfi_plat_v4;
>>> case HFI_VERSION_6XX:
>>> return &hfi_plat_v6;
>>> + case HFI_VERSION_6XX_LITE:
>>> + return &hfi_plat_v6_lite;
>> update here as well.
>
> yes, this function wont get changed
>
>>> default:
>>> break;
>>> }
>>> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
>>> index ec89a90a8129..6356e4bd0de2 100644
>>> --- a/drivers/media/platform/qcom/venus/hfi_platform.h
>>> +++ b/drivers/media/platform/qcom/venus/hfi_platform.h
>>> @@ -58,6 +58,7 @@ struct hfi_platform {
>>>
>>> extern const struct hfi_platform hfi_plat_v4;
>>> extern const struct hfi_platform hfi_plat_v6;
>>> +extern const struct hfi_platform hfi_plat_v6_lite;
>> ditto
>
> neither this one
>
>>>
>>> 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,
>>> diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
>>> new file mode 100644
>>> index 000000000000..41958a3e353b
>>> --- /dev/null
>>> +++ b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
>>> @@ -0,0 +1,148 @@
>>> +// SPDX-License-Identifier: GPL-2.0-only
>>> +/*
>>> + * Copyright (c) 2025, The Linux Foundation. All rights reserved.
>>> + */
>>> +#include "hfi_platform.h"
>>> +
>>> +static const struct hfi_plat_caps caps[] = {
>>> +{
>>> + .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, 1080, 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_1},
>>> + .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_41},
>>> + .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
>>> + .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_41},
>>> + .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_41},
>> what is the reference for these values?
>
> what do you mean? what should be the reference? I didnt see a downstream
> equivalente to base on so based on the 4XX settings these seem
> consistent.
>
My question was regarding the profile and level mapping.
The profiles added are consistent with 4xx, I agree. But the value of
levels mapped with each profile is not matching with [1], hence the
question about the reference used for this mapping.
[1]
https://elixir.bootlin.com/linux/v6.16-rc4/source/drivers/media/platform/qcom/venus/hfi_platform_v4.c#L23
Thanks,
Dikshita
> IS there any internal document that you can point me to please?
>
>
>>> + .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, 1080, 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_MAIN},
>>> + .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
>> what is the reference for these values?
>
> same as above.
>
> what internal documents do you typically reference to? Havent seen these
> references in previous commits.
>
> could you clarify please?
>
>
>>> + .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, 1080, 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,
>>> +} };
>>> +
>>> +static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
>>> +{
>>> + *entries = ARRAY_SIZE(caps);
>>> + return caps;
>>> +}
>>> +
>>> +static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
>>> +{
>>> + *enc_codecs = 0x0;
>>> + *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
>>> + HFI_VIDEO_CODEC_VP9;
>>> + *count = 3;
>>> +}
>>> +
>>> +static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
>>> + { 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 },
>>> +};
>>> +
>>> +static const struct hfi_platform_codec_freq_data *
>>> +get_codec_freq_data(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;
>>> +
>>> + for (i = 0; i < data_size; i++) {
>>> + if (data[i].pixfmt == pixfmt &&
>>> + data[i].session_type == session_type) {
>>> + found = &data[i];
>>> + break;
>>> + }
>>> + }
>>> +
>>> + return found;
>>> +}
>>> +
>>> +static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
>>> +{
>>> + const struct hfi_platform_codec_freq_data *data;
>>> +
>>> + data = get_codec_freq_data(session_type, codec);
>>> + if (data)
>>> + return data->vpp_freq;
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
>>> +{
>>> + const struct hfi_platform_codec_freq_data *data;
>>> +
>>> + data = get_codec_freq_data(session_type, codec);
>>> + if (data)
>>> + return data->vsp_freq;
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static unsigned long codec_lp_freq(u32 session_type, u32 codec)
>>> +{
>>> + const struct hfi_platform_codec_freq_data *data;
>>> +
>>> + data = get_codec_freq_data(session_type, codec);
>>> + if (data)
>>> + return data->low_power_freq;
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +const struct hfi_platform hfi_plat_v6_lite = {
>>> + .codec_vpp_freq = codec_vpp_freq,
>>> + .codec_vsp_freq = codec_vsp_freq,
>>> + .codec_lp_freq = codec_lp_freq,
>>> + .codecs = get_codecs,
>>> + .capabilities = get_capabilities,
>>> + .bufreq = hfi_plat_bufreq_v6,
>> buffer requirement should come from firmware, pls drop.
>
> yes, this will be hfi_plat_v4 only
>
>>> +};
>>
>> lot of code duplication here, pls see the possibility to commonize the
>>> code.
>
> this file is no longer needed
>
>>
>> Thanks,
>> Dikshita
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema
2025-07-07 9:26 ` Jorge Ramirez
@ 2025-07-07 9:29 ` Bryan O'Donoghue
2025-07-07 9:46 ` Jorge Ramirez
0 siblings, 1 reply; 42+ messages in thread
From: Bryan O'Donoghue @ 2025-07-07 9:29 UTC (permalink / raw)
To: Jorge Ramirez
Cc: Vikash Garodia, krzk+dt, quic_dikshita, mchehab, robh, conor+dt,
konradybcio, andersson, linux-arm-msm, linux-media, devicetree,
linux-kernel
On 07/07/2025 10:26, Jorge Ramirez wrote:
>>>> + maxItems: 5
>>> 2 should be good to support non secure usecases. 5 not needed.
>> ok
> isnt it better to just leave 5 here - thinking of the future support for
> secure buffers - and just update the dts?
It should describe the real capabilities of the hardware, not the
expected use-cases.
---
bod
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema
2025-07-07 9:29 ` Bryan O'Donoghue
@ 2025-07-07 9:46 ` Jorge Ramirez
2025-07-14 23:00 ` Dmitry Baryshkov
0 siblings, 1 reply; 42+ messages in thread
From: Jorge Ramirez @ 2025-07-07 9:46 UTC (permalink / raw)
To: Bryan O'Donoghue
Cc: Jorge Ramirez, Vikash Garodia, krzk+dt, quic_dikshita, mchehab,
robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On 07/07/25 10:29:56, Bryan O'Donoghue wrote:
> On 07/07/2025 10:26, Jorge Ramirez wrote:
> > > > > + maxItems: 5
> > > > 2 should be good to support non secure usecases. 5 not needed.
> > > ok
> > isnt it better to just leave 5 here - thinking of the future support for
> > secure buffers - and just update the dts?
>
> It should describe the real capabilities of the hardware, not the expected
> use-cases.
>
then five.
> ---
> bod
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 3/5] media: venus: hfi_plat_v6_lite: Populate decode capabilities
2025-07-07 9:29 ` Dikshita Agarwal
@ 2025-07-07 9:56 ` Jorge Ramirez
0 siblings, 0 replies; 42+ messages in thread
From: Jorge Ramirez @ 2025-07-07 9:56 UTC (permalink / raw)
To: Dikshita Agarwal
Cc: Jorge Ramirez, krzk+dt, bryan.odonoghue, quic_vgarodia, mchehab,
robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On 07/07/25 14:59:05, Dikshita Agarwal wrote:
>
>
> On 7/7/2025 2:43 PM, Jorge Ramirez wrote:
> > On 27/06/25 19:02:13, Dikshita Agarwal wrote:
> >>
> >>
> >> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> >>> Add hfi platform file with decoding capabilities for hfi v6_lite.
> >>>
> >>> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> >>> ---
> >>> drivers/media/platform/qcom/venus/Makefile | 2 +-
> >>> .../media/platform/qcom/venus/hfi_platform.c | 2 +
> >>> .../media/platform/qcom/venus/hfi_platform.h | 1 +
> >>> .../qcom/venus/hfi_platform_v6_lite.c | 148 ++++++++++++++++++
> >>> 4 files changed, 152 insertions(+), 1 deletion(-)
> >>> create mode 100644 drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> >>>
> >>> diff --git a/drivers/media/platform/qcom/venus/Makefile b/drivers/media/platform/qcom/venus/Makefile
> >>> index 91ee6be10292..4a6a942db58b 100644
> >>> --- a/drivers/media/platform/qcom/venus/Makefile
> >>> +++ b/drivers/media/platform/qcom/venus/Makefile
> >>> @@ -5,7 +5,7 @@ venus-core-objs += core.o helpers.o firmware.o \
> >>> hfi_venus.o hfi_msgs.o hfi_cmds.o hfi.o \
> >>> hfi_parser.o pm_helpers.o dbgfs.o \
> >>> hfi_platform.o hfi_platform_v4.o \
> >>> - hfi_platform_v6.o hfi_plat_bufs_v6.o \
> >>> + hfi_platform_v6.o hfi_plat_bufs_v6.o hfi_platform_v6_lite.o \
> >> s/hfi_platform_v6_lite/hfi_platform_v4_lite
> >
> > will remove, will use platform_v4 instead
> >
> >>>
> >>> venus-dec-objs += vdec.o vdec_ctrls.o
> >>> venus-enc-objs += venc.o venc_ctrls.o
> >>> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
> >>> index 643e5aa138f5..f56b8f9946d7 100644
> >>> --- a/drivers/media/platform/qcom/venus/hfi_platform.c
> >>> +++ b/drivers/media/platform/qcom/venus/hfi_platform.c
> >>> @@ -13,6 +13,8 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
> >>> return &hfi_plat_v4;
> >>> case HFI_VERSION_6XX:
> >>> return &hfi_plat_v6;
> >>> + case HFI_VERSION_6XX_LITE:
> >>> + return &hfi_plat_v6_lite;
> >> update here as well.
> >
> > yes, this function wont get changed
> >
> >>> default:
> >>> break;
> >>> }
> >>> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
> >>> index ec89a90a8129..6356e4bd0de2 100644
> >>> --- a/drivers/media/platform/qcom/venus/hfi_platform.h
> >>> +++ b/drivers/media/platform/qcom/venus/hfi_platform.h
> >>> @@ -58,6 +58,7 @@ struct hfi_platform {
> >>>
> >>> extern const struct hfi_platform hfi_plat_v4;
> >>> extern const struct hfi_platform hfi_plat_v6;
> >>> +extern const struct hfi_platform hfi_plat_v6_lite;
> >> ditto
> >
> > neither this one
> >
> >>>
> >>> 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,
> >>> diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> >>> new file mode 100644
> >>> index 000000000000..41958a3e353b
> >>> --- /dev/null
> >>> +++ b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> >>> @@ -0,0 +1,148 @@
> >>> +// SPDX-License-Identifier: GPL-2.0-only
> >>> +/*
> >>> + * Copyright (c) 2025, The Linux Foundation. All rights reserved.
> >>> + */
> >>> +#include "hfi_platform.h"
> >>> +
> >>> +static const struct hfi_plat_caps caps[] = {
> >>> +{
> >>> + .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, 1080, 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_1},
> >>> + .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_41},
> >>> + .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
> >>> + .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_41},
> >>> + .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_41},
> >> what is the reference for these values?
> >
> > what do you mean? what should be the reference? I didnt see a downstream
> > equivalente to base on so based on the 4XX settings these seem
> > consistent.
> >
> My question was regarding the profile and level mapping.
> The profiles added are consistent with 4xx, I agree. But the value of
> levels mapped with each profile is not matching with [1], hence the
> question about the reference used for this mapping.
>
> [1]
> https://elixir.bootlin.com/linux/v6.16-rc4/source/drivers/media/platform/qcom/venus/hfi_platform_v4.c#L23
ah right, AR50_LITE does not support 52 (the highest is 5).
I see your point - you are right of course.
I was doing a quite a bit of testing with fluster and I left the wrong values. My fault.
will fix.
thanks!
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 2/5] media: venus: vdec: AR50_LITE video core support
2025-06-30 6:47 ` Dikshita Agarwal
@ 2025-07-08 19:14 ` Jorge Ramirez
2025-07-10 8:55 ` Dikshita Agarwal
0 siblings, 1 reply; 42+ messages in thread
From: Jorge Ramirez @ 2025-07-08 19:14 UTC (permalink / raw)
To: Dikshita Agarwal
Cc: Jorge Ramirez, krzk+dt, bryan.odonoghue, quic_vgarodia, mchehab,
robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On 30/06/25 12:17:32, Dikshita Agarwal wrote:
>
>
> On 6/27/2025 8:48 PM, Jorge Ramirez wrote:
> > On 27/06/25 18:17:27, Dikshita Agarwal wrote:
> >>
> >>
> >> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> >>> The AR50_LITE is a streamlined 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.
> >>>
> >>> 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>
> >>> ---
> >>> drivers/media/platform/qcom/venus/core.c | 11 ++-
> >>> drivers/media/platform/qcom/venus/core.h | 11 ++-
> >>> drivers/media/platform/qcom/venus/firmware.c | 8 +-
> >>> drivers/media/platform/qcom/venus/helpers.c | 80 +++++++++++++++++++
> >>> drivers/media/platform/qcom/venus/helpers.h | 2 +
> >>> .../media/platform/qcom/venus/hfi_helper.h | 10 ++-
> >>> drivers/media/platform/qcom/venus/hfi_venus.c | 14 ++--
> >>> .../media/platform/qcom/venus/pm_helpers.c | 1 +
> >>> drivers/media/platform/qcom/venus/vdec.c | 15 ++--
> >>> 9 files changed, 128 insertions(+), 24 deletions(-)
> >>>
> >>> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> >>> index d305d74bb152..736ef53d988d 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;
> >>> diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
> >>> index b412e0c5515a..e755a28e919b 100644
> >>> --- a/drivers/media/platform/qcom/venus/core.h
> >>> +++ b/drivers/media/platform/qcom/venus/core.h
> >>> @@ -382,6 +382,7 @@ enum venus_inst_modes {
> >>> * @lock: instance lock
> >>> * @core: a reference to the core struct
> >>> * @clk_data: clock data per core ID
> >>> + * @eosbufs: a lit of EOS buffers
> >>> * @dpbbufs: a list of decoded picture buffers
> >>> * @internalbufs: a list of internal bufferes
> >>> * @registeredbufs: a list of registered capture bufferes
> >>> @@ -450,6 +451,7 @@ struct venus_inst {
> >>> struct mutex lock;
> >>> struct venus_core *core;
> >>> struct clock_data clk_data;
> >>> + struct list_head eosbufs;
> >>> struct list_head dpbbufs;
> >>> struct list_head internalbufs;
> >>> struct list_head registeredbufs;
> >>> @@ -520,7 +522,14 @@ struct venus_inst {
> >>> #define IS_V1(core) ((core)->res->hfi_version == HFI_VERSION_1XX)
> >>> #define IS_V3(core) ((core)->res->hfi_version == HFI_VERSION_3XX)
> >>> #define IS_V4(core) ((core)->res->hfi_version == HFI_VERSION_4XX)
> >>> -#define IS_V6(core) ((core)->res->hfi_version == HFI_VERSION_6XX)
> >>> +static inline bool IS_V6(struct venus_core *core)
> >>> +{
> >>> + if (WARN_ON_ONCE(!core))
> >>> + return false;
> >>> +
> >>> + return core->res->hfi_version == HFI_VERSION_6XX ||
> >>> + core->res->hfi_version == HFI_VERSION_6XX_LITE;
> >>> +}
> >> It should be HFI_VERSION_4XX_LITE for AR50_LITE. 4XX represents SC7280 and
> >> SDM845 which are AR50.
> >
> > ah good information - where is this documented? I never found this
> > information... I'd appreciate if you could confirm with some document
> > for future reference.
> >
> >>>
> >>> #define IS_AR50(core) ((core)->res->vpu_version == VPU_VERSION_AR50)
> >>> #define IS_AR50_LITE(core) ((core)->res->vpu_version == VPU_VERSION_AR50_LITE)
> >>> diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
> >>> index 66a18830e66d..f8dcef0426ac 100644
> >>> --- a/drivers/media/platform/qcom/venus/firmware.c
> >>> +++ b/drivers/media/platform/qcom/venus/firmware.c
> >>> @@ -30,7 +30,7 @@ static void venus_reset_cpu(struct venus_core *core)
> >>> u32 fw_size = core->fw.mapped_mem_size;
> >>> void __iomem *wrapper_base;
> >>>
> >>> - if (IS_IRIS2_1(core))
> >>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
> >>> wrapper_base = core->wrapper_tz_base;
> >>> else
> >>> wrapper_base = core->wrapper_base;
> >>> @@ -42,7 +42,7 @@ static void venus_reset_cpu(struct venus_core *core)
> >>> writel(fw_size, wrapper_base + WRAPPER_NONPIX_START_ADDR);
> >>> writel(fw_size, wrapper_base + WRAPPER_NONPIX_END_ADDR);
> >>>
> >>> - if (IS_IRIS2_1(core)) {
> >>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
> >>> /* Bring XTSS out of reset */
> >>> writel(0, wrapper_base + WRAPPER_TZ_XTSS_SW_RESET);
> >>> } else {
> >>> @@ -68,7 +68,7 @@ int venus_set_hw_state(struct venus_core *core, bool resume)
> >>> if (resume) {
> >>> venus_reset_cpu(core);
> >>> } else {
> >>> - if (IS_IRIS2_1(core))
> >>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
> >>> writel(WRAPPER_XTSS_SW_RESET_BIT,
> >>> core->wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
> >>> else
> >>> @@ -181,7 +181,7 @@ static int venus_shutdown_no_tz(struct venus_core *core)
> >>> void __iomem *wrapper_base = core->wrapper_base;
> >>> void __iomem *wrapper_tz_base = core->wrapper_tz_base;
> >>>
> >>> - if (IS_IRIS2_1(core)) {
> >>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
> >>> /* Assert the reset to XTSS */
> >>> reg = readl(wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
> >> No need to handle no-tz case. Pls drop.
> >
> > ok
> >
> >>> reg |= WRAPPER_XTSS_SW_RESET_BIT;
> >>> diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c
> >>> index 8295542e1a7c..812bec9a05be 100644
> >>> --- a/drivers/media/platform/qcom/venus/helpers.c
> >>> +++ b/drivers/media/platform/qcom/venus/helpers.c
> >>> @@ -230,6 +230,79 @@ int venus_helper_alloc_dpb_bufs(struct venus_inst *inst)
> >>> }
> >>> EXPORT_SYMBOL_GPL(venus_helper_alloc_dpb_bufs);
> >>>
> >>> +static void free_eos_buf(struct venus_inst *inst, struct intbuf *buf)
> >>> +{
> >>> + list_del_init(&buf->list);
> >>> + dma_free_attrs(inst->core->dev, buf->size, buf->va, buf->da,
> >>> + buf->attrs);
> >>> + kfree(buf);
> >>> +}
> >>> +
> >>> +int venus_helper_free_eos_bufs(struct venus_inst *inst)
> >>> +{
> >>> + struct intbuf *buf, *n;
> >>> +
> >>> + list_for_each_entry_safe(buf, n, &inst->eosbufs, list) {
> >>> + free_eos_buf(inst, buf);
> >>> + }
> >>> +
> >>> + if (list_empty(&inst->eosbufs))
> >>> + INIT_LIST_HEAD(&inst->eosbufs);
> >>> +
> >>> + return 0;
> >>> +}
> >>> +EXPORT_SYMBOL_GPL(venus_helper_free_eos_bufs);
> >>> +
> >>> +int venus_helper_alloc_eos_buf(struct venus_inst *inst,
> >>> + struct hfi_frame_data *data)
> >>> +{
> >>> + struct venus_core *core = inst->core;
> >>> + struct device *dev = core->dev;
> >>> + struct intbuf *buf;
> >>> + int ret = 0;
> >>> +
> >>> + memset(data, 0, sizeof(*data));
> >>> +
> >>> + data->buffer_type = HFI_BUFFER_INPUT;
> >>> + data->flags = HFI_BUFFERFLAG_EOS;
> >>> +
> >>> + if (IS_AR50_LITE(inst->core)) {
> >>> + /* We must send valid sizes and addresses */
> >>> + buf = kzalloc(sizeof(*buf), GFP_KERNEL);
> >>> + if (!buf) {
> >>> + ret = -ENOMEM;
> >>> + goto fail;
> >>> + }
> >>> +
> >>> + buf->type = HFI_BUFFER_INPUT;
> >>> + buf->size = SZ_4K;
> >>> + buf->attrs = DMA_ATTR_NO_KERNEL_MAPPING;
> >>> + buf->va = dma_alloc_attrs(dev, buf->size, &buf->da, GFP_KERNEL,
> >>> + buf->attrs);
> >>> + if (!buf->va) {
> >>> + ret = -ENOMEM;
> >>> + goto fail;
> >>> + }
> >>> +
> >>> + list_add_tail(&buf->list, &inst->eosbufs);
> >>> +
> >>> + data->alloc_len = buf->size;
> >>> + data->device_addr = buf->da;
> >>> +
> >> why this special handling for eos buffer is needed for AR50_LITE?
> >
> > this _fix_ was develope through testing: without it there is no EOS and
> > errors are reporting upon killing the player
> >
> Would be better to see why there is no EOS from firmware,
> there shouldn't be the need to have a dma allocation for this dummy
> buffers, as there is no useful info in the buffer. Having the device
> address as 0 or 0xdeadb000 should be enough.
>
hi dikshita,
I am still keeping this on v6 as per our internal discussions and
because v6 is quite different from v5 so wanted to provide early access
to users.
if the firwmare is fixed to address this issue on time, I might revert
the EOS page buffer.
TIA
jorge
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 2/5] media: venus: vdec: AR50_LITE video core support
2025-07-08 19:14 ` Jorge Ramirez
@ 2025-07-10 8:55 ` Dikshita Agarwal
2025-07-11 11:33 ` Jorge Ramirez
0 siblings, 1 reply; 42+ messages in thread
From: Dikshita Agarwal @ 2025-07-10 8:55 UTC (permalink / raw)
To: Jorge Ramirez
Cc: krzk+dt, bryan.odonoghue, quic_vgarodia, mchehab, robh, conor+dt,
konradybcio, andersson, linux-arm-msm, linux-media, devicetree,
linux-kernel
On 7/9/2025 12:44 AM, Jorge Ramirez wrote:
> On 30/06/25 12:17:32, Dikshita Agarwal wrote:
>>
>>
>> On 6/27/2025 8:48 PM, Jorge Ramirez wrote:
>>> On 27/06/25 18:17:27, Dikshita Agarwal wrote:
>>>>
>>>>
>>>> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
>>>>> The AR50_LITE is a streamlined 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.
>>>>>
>>>>> 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>
>>>>> ---
>>>>> drivers/media/platform/qcom/venus/core.c | 11 ++-
>>>>> drivers/media/platform/qcom/venus/core.h | 11 ++-
>>>>> drivers/media/platform/qcom/venus/firmware.c | 8 +-
>>>>> drivers/media/platform/qcom/venus/helpers.c | 80 +++++++++++++++++++
>>>>> drivers/media/platform/qcom/venus/helpers.h | 2 +
>>>>> .../media/platform/qcom/venus/hfi_helper.h | 10 ++-
>>>>> drivers/media/platform/qcom/venus/hfi_venus.c | 14 ++--
>>>>> .../media/platform/qcom/venus/pm_helpers.c | 1 +
>>>>> drivers/media/platform/qcom/venus/vdec.c | 15 ++--
>>>>> 9 files changed, 128 insertions(+), 24 deletions(-)
>>>>>
>>>>> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
>>>>> index d305d74bb152..736ef53d988d 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;
>>>>> diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
>>>>> index b412e0c5515a..e755a28e919b 100644
>>>>> --- a/drivers/media/platform/qcom/venus/core.h
>>>>> +++ b/drivers/media/platform/qcom/venus/core.h
>>>>> @@ -382,6 +382,7 @@ enum venus_inst_modes {
>>>>> * @lock: instance lock
>>>>> * @core: a reference to the core struct
>>>>> * @clk_data: clock data per core ID
>>>>> + * @eosbufs: a lit of EOS buffers
>>>>> * @dpbbufs: a list of decoded picture buffers
>>>>> * @internalbufs: a list of internal bufferes
>>>>> * @registeredbufs: a list of registered capture bufferes
>>>>> @@ -450,6 +451,7 @@ struct venus_inst {
>>>>> struct mutex lock;
>>>>> struct venus_core *core;
>>>>> struct clock_data clk_data;
>>>>> + struct list_head eosbufs;
>>>>> struct list_head dpbbufs;
>>>>> struct list_head internalbufs;
>>>>> struct list_head registeredbufs;
>>>>> @@ -520,7 +522,14 @@ struct venus_inst {
>>>>> #define IS_V1(core) ((core)->res->hfi_version == HFI_VERSION_1XX)
>>>>> #define IS_V3(core) ((core)->res->hfi_version == HFI_VERSION_3XX)
>>>>> #define IS_V4(core) ((core)->res->hfi_version == HFI_VERSION_4XX)
>>>>> -#define IS_V6(core) ((core)->res->hfi_version == HFI_VERSION_6XX)
>>>>> +static inline bool IS_V6(struct venus_core *core)
>>>>> +{
>>>>> + if (WARN_ON_ONCE(!core))
>>>>> + return false;
>>>>> +
>>>>> + return core->res->hfi_version == HFI_VERSION_6XX ||
>>>>> + core->res->hfi_version == HFI_VERSION_6XX_LITE;
>>>>> +}
>>>> It should be HFI_VERSION_4XX_LITE for AR50_LITE. 4XX represents SC7280 and
>>>> SDM845 which are AR50.
>>>
>>> ah good information - where is this documented? I never found this
>>> information... I'd appreciate if you could confirm with some document
>>> for future reference.
>>>
>>>>>
>>>>> #define IS_AR50(core) ((core)->res->vpu_version == VPU_VERSION_AR50)
>>>>> #define IS_AR50_LITE(core) ((core)->res->vpu_version == VPU_VERSION_AR50_LITE)
>>>>> diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
>>>>> index 66a18830e66d..f8dcef0426ac 100644
>>>>> --- a/drivers/media/platform/qcom/venus/firmware.c
>>>>> +++ b/drivers/media/platform/qcom/venus/firmware.c
>>>>> @@ -30,7 +30,7 @@ static void venus_reset_cpu(struct venus_core *core)
>>>>> u32 fw_size = core->fw.mapped_mem_size;
>>>>> void __iomem *wrapper_base;
>>>>>
>>>>> - if (IS_IRIS2_1(core))
>>>>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
>>>>> wrapper_base = core->wrapper_tz_base;
>>>>> else
>>>>> wrapper_base = core->wrapper_base;
>>>>> @@ -42,7 +42,7 @@ static void venus_reset_cpu(struct venus_core *core)
>>>>> writel(fw_size, wrapper_base + WRAPPER_NONPIX_START_ADDR);
>>>>> writel(fw_size, wrapper_base + WRAPPER_NONPIX_END_ADDR);
>>>>>
>>>>> - if (IS_IRIS2_1(core)) {
>>>>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
>>>>> /* Bring XTSS out of reset */
>>>>> writel(0, wrapper_base + WRAPPER_TZ_XTSS_SW_RESET);
>>>>> } else {
>>>>> @@ -68,7 +68,7 @@ int venus_set_hw_state(struct venus_core *core, bool resume)
>>>>> if (resume) {
>>>>> venus_reset_cpu(core);
>>>>> } else {
>>>>> - if (IS_IRIS2_1(core))
>>>>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
>>>>> writel(WRAPPER_XTSS_SW_RESET_BIT,
>>>>> core->wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
>>>>> else
>>>>> @@ -181,7 +181,7 @@ static int venus_shutdown_no_tz(struct venus_core *core)
>>>>> void __iomem *wrapper_base = core->wrapper_base;
>>>>> void __iomem *wrapper_tz_base = core->wrapper_tz_base;
>>>>>
>>>>> - if (IS_IRIS2_1(core)) {
>>>>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
>>>>> /* Assert the reset to XTSS */
>>>>> reg = readl(wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
>>>> No need to handle no-tz case. Pls drop.
>>>
>>> ok
>>>
>>>>> reg |= WRAPPER_XTSS_SW_RESET_BIT;
>>>>> diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c
>>>>> index 8295542e1a7c..812bec9a05be 100644
>>>>> --- a/drivers/media/platform/qcom/venus/helpers.c
>>>>> +++ b/drivers/media/platform/qcom/venus/helpers.c
>>>>> @@ -230,6 +230,79 @@ int venus_helper_alloc_dpb_bufs(struct venus_inst *inst)
>>>>> }
>>>>> EXPORT_SYMBOL_GPL(venus_helper_alloc_dpb_bufs);
>>>>>
>>>>> +static void free_eos_buf(struct venus_inst *inst, struct intbuf *buf)
>>>>> +{
>>>>> + list_del_init(&buf->list);
>>>>> + dma_free_attrs(inst->core->dev, buf->size, buf->va, buf->da,
>>>>> + buf->attrs);
>>>>> + kfree(buf);
>>>>> +}
>>>>> +
>>>>> +int venus_helper_free_eos_bufs(struct venus_inst *inst)
>>>>> +{
>>>>> + struct intbuf *buf, *n;
>>>>> +
>>>>> + list_for_each_entry_safe(buf, n, &inst->eosbufs, list) {
>>>>> + free_eos_buf(inst, buf);
>>>>> + }
>>>>> +
>>>>> + if (list_empty(&inst->eosbufs))
>>>>> + INIT_LIST_HEAD(&inst->eosbufs);
>>>>> +
>>>>> + return 0;
>>>>> +}
>>>>> +EXPORT_SYMBOL_GPL(venus_helper_free_eos_bufs);
>>>>> +
>>>>> +int venus_helper_alloc_eos_buf(struct venus_inst *inst,
>>>>> + struct hfi_frame_data *data)
>>>>> +{
>>>>> + struct venus_core *core = inst->core;
>>>>> + struct device *dev = core->dev;
>>>>> + struct intbuf *buf;
>>>>> + int ret = 0;
>>>>> +
>>>>> + memset(data, 0, sizeof(*data));
>>>>> +
>>>>> + data->buffer_type = HFI_BUFFER_INPUT;
>>>>> + data->flags = HFI_BUFFERFLAG_EOS;
>>>>> +
>>>>> + if (IS_AR50_LITE(inst->core)) {
>>>>> + /* We must send valid sizes and addresses */
>>>>> + buf = kzalloc(sizeof(*buf), GFP_KERNEL);
>>>>> + if (!buf) {
>>>>> + ret = -ENOMEM;
>>>>> + goto fail;
>>>>> + }
>>>>> +
>>>>> + buf->type = HFI_BUFFER_INPUT;
>>>>> + buf->size = SZ_4K;
>>>>> + buf->attrs = DMA_ATTR_NO_KERNEL_MAPPING;
>>>>> + buf->va = dma_alloc_attrs(dev, buf->size, &buf->da, GFP_KERNEL,
>>>>> + buf->attrs);
>>>>> + if (!buf->va) {
>>>>> + ret = -ENOMEM;
>>>>> + goto fail;
>>>>> + }
>>>>> +
>>>>> + list_add_tail(&buf->list, &inst->eosbufs);
>>>>> +
>>>>> + data->alloc_len = buf->size;
>>>>> + data->device_addr = buf->da;
>>>>> +
>>>> why this special handling for eos buffer is needed for AR50_LITE?
>>>
>>> this _fix_ was develope through testing: without it there is no EOS and
>>> errors are reporting upon killing the player
>>>
>> Would be better to see why there is no EOS from firmware,
>> there shouldn't be the need to have a dma allocation for this dummy
>> buffers, as there is no useful info in the buffer. Having the device
>> address as 0 or 0xdeadb000 should be enough.
>>
>
> hi dikshita,
>
> I am still keeping this on v6 as per our internal discussions and
> because v6 is quite different from v5 so wanted to provide early access
> to users.
>
> if the firwmare is fixed to address this issue on time, I might revert
> the EOS page buffer.
>
I'd prefer to resolve this via correct EOS handling or gain clarity on why
AR50_LITE requires special treatment, instead of proceeding with new patch
sets built around this design.
Thanks,
Dikshita
> TIA
> jorge
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 2/5] media: venus: vdec: AR50_LITE video core support
2025-07-10 8:55 ` Dikshita Agarwal
@ 2025-07-11 11:33 ` Jorge Ramirez
0 siblings, 0 replies; 42+ messages in thread
From: Jorge Ramirez @ 2025-07-11 11:33 UTC (permalink / raw)
To: Dikshita Agarwal
Cc: Jorge Ramirez, krzk+dt, bryan.odonoghue, quic_vgarodia, mchehab,
robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On 10/07/25 14:25:33, Dikshita Agarwal wrote:
>
>
> On 7/9/2025 12:44 AM, Jorge Ramirez wrote:
> > On 30/06/25 12:17:32, Dikshita Agarwal wrote:
> >>
> >>
> >> On 6/27/2025 8:48 PM, Jorge Ramirez wrote:
> >>> On 27/06/25 18:17:27, Dikshita Agarwal wrote:
> >>>>
> >>>>
> >>>> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> >>>>> The AR50_LITE is a streamlined 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.
> >>>>>
> >>>>> 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>
> >>>>> ---
> >>>>> drivers/media/platform/qcom/venus/core.c | 11 ++-
> >>>>> drivers/media/platform/qcom/venus/core.h | 11 ++-
> >>>>> drivers/media/platform/qcom/venus/firmware.c | 8 +-
> >>>>> drivers/media/platform/qcom/venus/helpers.c | 80 +++++++++++++++++++
> >>>>> drivers/media/platform/qcom/venus/helpers.h | 2 +
> >>>>> .../media/platform/qcom/venus/hfi_helper.h | 10 ++-
> >>>>> drivers/media/platform/qcom/venus/hfi_venus.c | 14 ++--
> >>>>> .../media/platform/qcom/venus/pm_helpers.c | 1 +
> >>>>> drivers/media/platform/qcom/venus/vdec.c | 15 ++--
> >>>>> 9 files changed, 128 insertions(+), 24 deletions(-)
> >>>>>
> >>>>> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> >>>>> index d305d74bb152..736ef53d988d 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;
> >>>>> diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
> >>>>> index b412e0c5515a..e755a28e919b 100644
> >>>>> --- a/drivers/media/platform/qcom/venus/core.h
> >>>>> +++ b/drivers/media/platform/qcom/venus/core.h
> >>>>> @@ -382,6 +382,7 @@ enum venus_inst_modes {
> >>>>> * @lock: instance lock
> >>>>> * @core: a reference to the core struct
> >>>>> * @clk_data: clock data per core ID
> >>>>> + * @eosbufs: a lit of EOS buffers
> >>>>> * @dpbbufs: a list of decoded picture buffers
> >>>>> * @internalbufs: a list of internal bufferes
> >>>>> * @registeredbufs: a list of registered capture bufferes
> >>>>> @@ -450,6 +451,7 @@ struct venus_inst {
> >>>>> struct mutex lock;
> >>>>> struct venus_core *core;
> >>>>> struct clock_data clk_data;
> >>>>> + struct list_head eosbufs;
> >>>>> struct list_head dpbbufs;
> >>>>> struct list_head internalbufs;
> >>>>> struct list_head registeredbufs;
> >>>>> @@ -520,7 +522,14 @@ struct venus_inst {
> >>>>> #define IS_V1(core) ((core)->res->hfi_version == HFI_VERSION_1XX)
> >>>>> #define IS_V3(core) ((core)->res->hfi_version == HFI_VERSION_3XX)
> >>>>> #define IS_V4(core) ((core)->res->hfi_version == HFI_VERSION_4XX)
> >>>>> -#define IS_V6(core) ((core)->res->hfi_version == HFI_VERSION_6XX)
> >>>>> +static inline bool IS_V6(struct venus_core *core)
> >>>>> +{
> >>>>> + if (WARN_ON_ONCE(!core))
> >>>>> + return false;
> >>>>> +
> >>>>> + return core->res->hfi_version == HFI_VERSION_6XX ||
> >>>>> + core->res->hfi_version == HFI_VERSION_6XX_LITE;
> >>>>> +}
> >>>> It should be HFI_VERSION_4XX_LITE for AR50_LITE. 4XX represents SC7280 and
> >>>> SDM845 which are AR50.
> >>>
> >>> ah good information - where is this documented? I never found this
> >>> information... I'd appreciate if you could confirm with some document
> >>> for future reference.
> >>>
> >>>>>
> >>>>> #define IS_AR50(core) ((core)->res->vpu_version == VPU_VERSION_AR50)
> >>>>> #define IS_AR50_LITE(core) ((core)->res->vpu_version == VPU_VERSION_AR50_LITE)
> >>>>> diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
> >>>>> index 66a18830e66d..f8dcef0426ac 100644
> >>>>> --- a/drivers/media/platform/qcom/venus/firmware.c
> >>>>> +++ b/drivers/media/platform/qcom/venus/firmware.c
> >>>>> @@ -30,7 +30,7 @@ static void venus_reset_cpu(struct venus_core *core)
> >>>>> u32 fw_size = core->fw.mapped_mem_size;
> >>>>> void __iomem *wrapper_base;
> >>>>>
> >>>>> - if (IS_IRIS2_1(core))
> >>>>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
> >>>>> wrapper_base = core->wrapper_tz_base;
> >>>>> else
> >>>>> wrapper_base = core->wrapper_base;
> >>>>> @@ -42,7 +42,7 @@ static void venus_reset_cpu(struct venus_core *core)
> >>>>> writel(fw_size, wrapper_base + WRAPPER_NONPIX_START_ADDR);
> >>>>> writel(fw_size, wrapper_base + WRAPPER_NONPIX_END_ADDR);
> >>>>>
> >>>>> - if (IS_IRIS2_1(core)) {
> >>>>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
> >>>>> /* Bring XTSS out of reset */
> >>>>> writel(0, wrapper_base + WRAPPER_TZ_XTSS_SW_RESET);
> >>>>> } else {
> >>>>> @@ -68,7 +68,7 @@ int venus_set_hw_state(struct venus_core *core, bool resume)
> >>>>> if (resume) {
> >>>>> venus_reset_cpu(core);
> >>>>> } else {
> >>>>> - if (IS_IRIS2_1(core))
> >>>>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core))
> >>>>> writel(WRAPPER_XTSS_SW_RESET_BIT,
> >>>>> core->wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
> >>>>> else
> >>>>> @@ -181,7 +181,7 @@ static int venus_shutdown_no_tz(struct venus_core *core)
> >>>>> void __iomem *wrapper_base = core->wrapper_base;
> >>>>> void __iomem *wrapper_tz_base = core->wrapper_tz_base;
> >>>>>
> >>>>> - if (IS_IRIS2_1(core)) {
> >>>>> + if (IS_IRIS2_1(core) || IS_AR50_LITE(core)) {
> >>>>> /* Assert the reset to XTSS */
> >>>>> reg = readl(wrapper_tz_base + WRAPPER_TZ_XTSS_SW_RESET);
> >>>> No need to handle no-tz case. Pls drop.
> >>>
> >>> ok
> >>>
> >>>>> reg |= WRAPPER_XTSS_SW_RESET_BIT;
> >>>>> diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c
> >>>>> index 8295542e1a7c..812bec9a05be 100644
> >>>>> --- a/drivers/media/platform/qcom/venus/helpers.c
> >>>>> +++ b/drivers/media/platform/qcom/venus/helpers.c
> >>>>> @@ -230,6 +230,79 @@ int venus_helper_alloc_dpb_bufs(struct venus_inst *inst)
> >>>>> }
> >>>>> EXPORT_SYMBOL_GPL(venus_helper_alloc_dpb_bufs);
> >>>>>
> >>>>> +static void free_eos_buf(struct venus_inst *inst, struct intbuf *buf)
> >>>>> +{
> >>>>> + list_del_init(&buf->list);
> >>>>> + dma_free_attrs(inst->core->dev, buf->size, buf->va, buf->da,
> >>>>> + buf->attrs);
> >>>>> + kfree(buf);
> >>>>> +}
> >>>>> +
> >>>>> +int venus_helper_free_eos_bufs(struct venus_inst *inst)
> >>>>> +{
> >>>>> + struct intbuf *buf, *n;
> >>>>> +
> >>>>> + list_for_each_entry_safe(buf, n, &inst->eosbufs, list) {
> >>>>> + free_eos_buf(inst, buf);
> >>>>> + }
> >>>>> +
> >>>>> + if (list_empty(&inst->eosbufs))
> >>>>> + INIT_LIST_HEAD(&inst->eosbufs);
> >>>>> +
> >>>>> + return 0;
> >>>>> +}
> >>>>> +EXPORT_SYMBOL_GPL(venus_helper_free_eos_bufs);
> >>>>> +
> >>>>> +int venus_helper_alloc_eos_buf(struct venus_inst *inst,
> >>>>> + struct hfi_frame_data *data)
> >>>>> +{
> >>>>> + struct venus_core *core = inst->core;
> >>>>> + struct device *dev = core->dev;
> >>>>> + struct intbuf *buf;
> >>>>> + int ret = 0;
> >>>>> +
> >>>>> + memset(data, 0, sizeof(*data));
> >>>>> +
> >>>>> + data->buffer_type = HFI_BUFFER_INPUT;
> >>>>> + data->flags = HFI_BUFFERFLAG_EOS;
> >>>>> +
> >>>>> + if (IS_AR50_LITE(inst->core)) {
> >>>>> + /* We must send valid sizes and addresses */
> >>>>> + buf = kzalloc(sizeof(*buf), GFP_KERNEL);
> >>>>> + if (!buf) {
> >>>>> + ret = -ENOMEM;
> >>>>> + goto fail;
> >>>>> + }
> >>>>> +
> >>>>> + buf->type = HFI_BUFFER_INPUT;
> >>>>> + buf->size = SZ_4K;
> >>>>> + buf->attrs = DMA_ATTR_NO_KERNEL_MAPPING;
> >>>>> + buf->va = dma_alloc_attrs(dev, buf->size, &buf->da, GFP_KERNEL,
> >>>>> + buf->attrs);
> >>>>> + if (!buf->va) {
> >>>>> + ret = -ENOMEM;
> >>>>> + goto fail;
> >>>>> + }
> >>>>> +
> >>>>> + list_add_tail(&buf->list, &inst->eosbufs);
> >>>>> +
> >>>>> + data->alloc_len = buf->size;
> >>>>> + data->device_addr = buf->da;
> >>>>> +
> >>>> why this special handling for eos buffer is needed for AR50_LITE?
> >>>
> >>> this _fix_ was develope through testing: without it there is no EOS and
> >>> errors are reporting upon killing the player
> >>>
> >> Would be better to see why there is no EOS from firmware,
> >> there shouldn't be the need to have a dma allocation for this dummy
> >> buffers, as there is no useful info in the buffer. Having the device
> >> address as 0 or 0xdeadb000 should be enough.
> >>
> >
> > hi dikshita,
> >
> > I am still keeping this on v6 as per our internal discussions and
> > because v6 is quite different from v5 so wanted to provide early access
> > to users.
> >
> > if the firwmare is fixed to address this issue on time, I might revert
> > the EOS page buffer.
> >
> I'd prefer to resolve this via correct EOS handling or gain clarity on why
> AR50_LITE requires special treatment, instead of proceeding with new patch
> sets built around this design.
>
Fully agree.
However this patch is the actual proper implementation - it follows the
HFI spec - while the current code upstream is not.
We should revert over time the current implementation to avoid hitting
issues when the firmware stops checking for things like 0xdeadb000.
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 4/5] media: venus: core: Add qcm2290 DT compatible and resource data
2025-07-07 9:19 ` Konrad Dybcio
@ 2025-07-13 8:19 ` Jorge Ramirez
0 siblings, 0 replies; 42+ messages in thread
From: Jorge Ramirez @ 2025-07-13 8:19 UTC (permalink / raw)
To: Konrad Dybcio
Cc: Jorge Ramirez, Dikshita Agarwal, krzk+dt, bryan.odonoghue,
quic_vgarodia, mchehab, robh, conor+dt, konradybcio, andersson,
linux-arm-msm, linux-media, devicetree, linux-kernel
On 07/07/25 11:19:33, Konrad Dybcio wrote:
> On 7/7/25 11:09 AM, Jorge Ramirez wrote:
> > On 27/06/25 18:46:10, Dikshita Agarwal wrote:
> >>
> >>
> >> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> >>> Add a qcm2290 compatible binding to the venus core.
> >>>
> >>> Video encoding support is not exposed until the relevant hardware
> >>> capabilities are enabled.
> >>>
> >>> 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>
> >>> ---
> >>> drivers/media/platform/qcom/venus/core.c | 39 ++++++++++++++++++++++++
> >>> 1 file changed, 39 insertions(+)
> >>>
> >>> diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
> >>> index 736ef53d988d..f1f211ca1ce2 100644
> >>> --- a/drivers/media/platform/qcom/venus/core.c
> >>> +++ b/drivers/media/platform/qcom/venus/core.c
> >>> @@ -1062,6 +1062,44 @@ static const struct venus_resources sc7280_res = {
> >>> .enc_nodename = "video-encoder",
> >>> };
> >>>
> >>> +static const struct freq_tbl qcm2290_freq_table[] = {
> >>> + { 352800, 240000000 }, /* 1920x1088 @ 30 + 1280x720 @ 30 */
> >>> + { 244800, 133000000 }, /* 1920x1088 @ 30 */
> >>> +};
> >>> +
> >> fix this corner.
> >
> > ok, will wait for Vikash to confirm the other ones.
>
> Actually you can get rid of it now, I think:
>
> https://git.linuxtv.org/media.git/commit/?id=b179234b5e59013f8772da17b273f463f9720bdd
>
> Konrad
yes, thanks!
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema
2025-07-07 9:46 ` Jorge Ramirez
@ 2025-07-14 23:00 ` Dmitry Baryshkov
0 siblings, 0 replies; 42+ messages in thread
From: Dmitry Baryshkov @ 2025-07-14 23:00 UTC (permalink / raw)
To: Jorge Ramirez
Cc: Bryan O'Donoghue, Vikash Garodia, krzk+dt, quic_dikshita,
mchehab, robh, conor+dt, konradybcio, andersson, linux-arm-msm,
linux-media, devicetree, linux-kernel
On Mon, Jul 07, 2025 at 11:46:25AM +0200, Jorge Ramirez wrote:
> On 07/07/25 10:29:56, Bryan O'Donoghue wrote:
> > On 07/07/2025 10:26, Jorge Ramirez wrote:
> > > > > > + maxItems: 5
> > > > > 2 should be good to support non secure usecases. 5 not needed.
> > > > ok
> > > isnt it better to just leave 5 here - thinking of the future support for
> > > secure buffers - and just update the dts?
> >
> > It should describe the real capabilities of the hardware, not the expected
> > use-cases.
> >
>
> then five.
Just list all IOMMUs, if we know how to handle them properly.
>
> > ---
> > bod
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 42+ messages in thread
end of thread, other threads:[~2025-07-14 23:00 UTC | newest]
Thread overview: 42+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-26 13:59 [PATCH v5 0/5] media: venus: Add QCM2290 support with AR50_LITE core Jorge Ramirez-Ortiz
2025-06-26 13:59 ` [PATCH v5 1/5] media: dt-bindings: venus: Add qcm2290 dt schema Jorge Ramirez-Ortiz
2025-06-26 14:40 ` Bryan O'Donoghue
2025-06-27 12:06 ` Vikash Garodia
2025-07-07 9:06 ` Jorge Ramirez
2025-07-07 9:26 ` Jorge Ramirez
2025-07-07 9:29 ` Bryan O'Donoghue
2025-07-07 9:46 ` Jorge Ramirez
2025-07-14 23:00 ` Dmitry Baryshkov
2025-06-26 13:59 ` [PATCH v5 2/5] media: venus: vdec: AR50_LITE video core support Jorge Ramirez-Ortiz
2025-06-27 12:47 ` Dikshita Agarwal
2025-06-27 15:18 ` Jorge Ramirez
2025-06-30 6:47 ` Dikshita Agarwal
2025-07-08 19:14 ` Jorge Ramirez
2025-07-10 8:55 ` Dikshita Agarwal
2025-07-11 11:33 ` Jorge Ramirez
2025-06-26 13:59 ` [PATCH v5 3/5] media: venus: hfi_plat_v6_lite: Populate decode capabilities Jorge Ramirez-Ortiz
2025-06-26 14:43 ` Bryan O'Donoghue
2025-06-27 13:32 ` Dikshita Agarwal
2025-07-07 9:13 ` Jorge Ramirez
2025-07-07 9:29 ` Dikshita Agarwal
2025-07-07 9:56 ` Jorge Ramirez
2025-06-26 13:59 ` [PATCH v5 4/5] media: venus: core: Add qcm2290 DT compatible and resource data Jorge Ramirez-Ortiz
2025-06-26 14:37 ` Bryan O'Donoghue
2025-06-27 13:16 ` Dikshita Agarwal
2025-07-07 9:09 ` Jorge Ramirez
2025-07-07 9:19 ` Konrad Dybcio
2025-07-13 8:19 ` Jorge Ramirez
2025-06-26 13:59 ` [PATCH v5 5/5] arm64: dts: qcom: qcm2290: Add venus video node Jorge Ramirez-Ortiz
2025-06-26 14:05 ` Krzysztof Kozlowski
2025-06-26 14:25 ` Jorge Ramirez
2025-06-26 18:24 ` Konrad Dybcio
2025-06-27 12:10 ` Vikash Garodia
2025-06-27 12:33 ` Jorge Ramirez
2025-06-27 14:58 ` Vikash Garodia
2025-06-27 15:08 ` Jorge Ramirez
2025-06-27 15:12 ` Vikash Garodia
2025-06-27 15:20 ` Konrad Dybcio
2025-06-27 15:23 ` Vikash Garodia
2025-06-27 15:27 ` Konrad Dybcio
2025-07-07 9:15 ` Jorge Ramirez
2025-07-07 9:15 ` Jorge Ramirez
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).