Subject: [PATCH 0/3] Qualcomm Venus enablement for SDM630/636/660

From: AngeloGioacchino Del Regno <[email protected]>

In this patch series, I am enabling the Venus video (enc/dec)oding
functionality on SDM630, SDM636, SDM660 and their SDA variants.

To reliably achieve this, commonizing most of the v3/v4 pm_helper
functions (while keeping compatibility with the previous bindings)
seemed to be totally legit, as (almost) the whole logic that's been
introduced in the v4 helpers does actually apply to all (in my knowledge)
of the SoCs that are currently needing the v3 ops to *at least*
optimize the power consumption while using this remote processor.

In the specific case of the SDM630/660 family, this was necessary in
order to correctly bring up the clocks required by the Venus subsystem
without using particular hacks in the clock drivers.
This patch series achieves functional video encoding and decoding on
the SDM630/660 family of SoCs.

The testing was done with the following methodology:
- Boot the system (libc with GNOME DE on Wayland)
- Upload a 720p mp4 h264 sample video file [1] on the device
- Open gnome-terminal and use FFMPEG to transcode:
1. Software H264 decoder to Venus HW encoder (wow it's so fast!)
2. Venus HW decoder to Software H264 decoder
- Download the resulting files on a PC and start playback
- Playing back both files works

This patch series has been tested against the following devices:
- Sony Xperia XA2 Ultra (SDM630 Nile Discovery)
- Sony Xperia 10 (SDM630 Ganges Kirin)

[1] https://dvdloc8.com/clip.php?movieid=12167&clipid=1

AngeloGioacchino Del Regno (3):
media: venus: pm_helper: Commonize v3/v4 pmdomains and clocks
management
media: venus: core: Add sdm660 DT compatible and resource struct
media: dt-bindings: media: venus: Add sdm660 DT schema

.../bindings/media/qcom,sdm660-venus.yaml | 153 +++++
drivers/media/platform/qcom/venus/core.c | 68 +++
.../media/platform/qcom/venus/pm_helpers.c | 525 +++++++++---------
3 files changed, 498 insertions(+), 248 deletions(-)
create mode 100644 Documentation/devicetree/bindings/media/qcom,sdm660-venus.yaml

--
2.28.0


Subject: [PATCH 3/3] media: dt-bindings: media: venus: Add sdm660 DT schema

From: AngeloGioacchino Del Regno <[email protected]>

Add new qcom,sdm660-venus DT binding schema.

Signed-off-by: AngeloGioacchino Del Regno <[email protected]>
---
.../bindings/media/qcom,sdm660-venus.yaml | 153 ++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 Documentation/devicetree/bindings/media/qcom,sdm660-venus.yaml

diff --git a/Documentation/devicetree/bindings/media/qcom,sdm660-venus.yaml b/Documentation/devicetree/bindings/media/qcom,sdm660-venus.yaml
new file mode 100644
index 000000000000..78c4a4ec4fe3
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/qcom,sdm660-venus.yaml
@@ -0,0 +1,153 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+
+%YAML 1.2
+---
+$id: "http://devicetree.org/schemas/media/qcom,sdm660-venus.yaml#"
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
+
+title: Qualcomm Venus video encode and decode accelerators
+
+maintainers:
+ - Stanimir Varbanov <[email protected]>
+
+description: |
+ The Venus IP is a video encode and decode accelerator present
+ on Qualcomm platforms
+
+properties:
+ compatible:
+ const: qcom,sdm660-venus
+
+ reg:
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+
+ power-domains:
+ maxItems: 1
+
+ clocks:
+ maxItems: 5
+
+ clock-names:
+ items:
+ - const: core
+ - const: iface
+ - const: bus_throttle
+ - const: bus
+ - const: vcodec0_core
+
+ iommus:
+ maxItems: 20
+
+ memory-region:
+ maxItems: 1
+
+ video-decoder:
+ type: object
+
+ properties:
+ compatible:
+ const: venus-decoder
+
+ required:
+ - compatible
+
+ additionalProperties: false
+
+ video-encoder:
+ type: object
+
+ properties:
+ compatible:
+ const: venus-encoder
+
+ required:
+ - compatible
+
+ additionalProperties: false
+
+ video-firmware:
+ type: object
+
+ description: |
+ Firmware subnode is needed when the platform does not
+ have TrustZone.
+
+ properties:
+ iommus:
+ maxItems: 2
+
+ required:
+ - iommus
+
+required:
+ - compatible
+ - reg
+ - interrupts
+ - power-domains
+ - power-domain-names
+ - clocks
+ - clock-names
+ - iommus
+ - memory-region
+ - video-decoder
+ - video-encoder
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/clock/qcom,mmcc-sdm660.h>
+ #include <dt-bindings/interconnect/qcom,sdm660.h>
+ #include <dt-bindings/power/qcom-rpmpd.h>
+
+ video-codec@cc00000 {
+ compatible = "qcom,sdm660-venus";
+ reg = <0x0cc00000 0xff000>;
+ interrupts = <GIC_SPI 287 IRQ_TYPE_LEVEL_HIGH>;
+ power-domains = <&mmcc VENUS_GDSC>,
+ <&mmcc VENUS_CORE0_GDSC>,
+ <&rpmpd SDM660_VDDCX>;
+ power-domain-names = "venus", "vcodec0", "cx";
+ clocks = <&mmcc VIDEO_CORE_CLK>,
+ <&mmcc VIDEO_AHB_CLK>,
+ <&mmcc THROTTLE_VIDEO_AXI_CLK>,
+ <&mmcc VIDEO_AXI_CLK>,
+ <&mmcc VIDEO_SUBCORE0_CLK>;
+ clock-names = "core", "iface", "bus_throttle", "bus",
+ "vcodec0_core";
+ iommus = <&mmss_smmu 0x400>,
+ <&mmss_smmu 0x401>,
+ <&mmss_smmu 0x40a>,
+ <&mmss_smmu 0x407>,
+ <&mmss_smmu 0x40e>,
+ <&mmss_smmu 0x40f>,
+ <&mmss_smmu 0x408>,
+ <&mmss_smmu 0x409>,
+ <&mmss_smmu 0x40b>,
+ <&mmss_smmu 0x40c>,
+ <&mmss_smmu 0x40d>,
+ <&mmss_smmu 0x410>,
+ <&mmss_smmu 0x421>,
+ <&mmss_smmu 0x428>,
+ <&mmss_smmu 0x429>,
+ <&mmss_smmu 0x42b>,
+ <&mmss_smmu 0x42c>,
+ <&mmss_smmu 0x42d>,
+ <&mmss_smmu 0x411>,
+ <&mmss_smmu 0x431>;
+ memory-region = <&venus_region>;
+
+ interconnects = <&mnoc MASTER_VENUS &bimc SLAVE_EBI>,
+ <&gnoc MASTER_APSS_PROC &mnoc SLAVE_VENUS_CFG>;
+ interconnect-names = "video-mem", "cpu-cfg";
+
+ video-decoder {
+ compatible = "venus-decoder";
+ };
+
+ video-encoder {
+ compatible = "venus-encoder";
+ };
+ };
--
2.28.0