162306a36Sopenharmony_ci# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci%YAML 1.2 462306a36Sopenharmony_ci--- 562306a36Sopenharmony_ci$id: http://devicetree.org/schemas/media/mediatek,vcodec-subdev-decoder.yaml# 662306a36Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml# 762306a36Sopenharmony_ci 862306a36Sopenharmony_cititle: Mediatek Video Decode Accelerator With Multi Hardware 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cimaintainers: 1162306a36Sopenharmony_ci - Yunfei Dong <yunfei.dong@mediatek.com> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cidescription: | 1462306a36Sopenharmony_ci Mediatek Video Decode is the video decode hardware present in Mediatek 1562306a36Sopenharmony_ci SoCs which supports high resolution decoding functionalities. Required 1662306a36Sopenharmony_ci parent and child device node. 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci About the Decoder Hardware Block Diagram, please check below: 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci +------------------------------------------------+-------------------------------------+ 2162306a36Sopenharmony_ci | | | 2262306a36Sopenharmony_ci | input -> lat soc HW -> lat HW -> lat buffer --|--> lat buffer -> core HW -> output | 2362306a36Sopenharmony_ci | || || | || | 2462306a36Sopenharmony_ci +------------||-------------||-------------------+---------------------||--------------+ 2562306a36Sopenharmony_ci || lat || | core workqueue <parent> 2662306a36Sopenharmony_ci -------------||-------------||-------------------|---------------------||--------------- 2762306a36Sopenharmony_ci ||<------------||----------------HW index---------------->|| <child> 2862306a36Sopenharmony_ci \/ \/ \/ 2962306a36Sopenharmony_ci +-------------------------------------------------------------+ 3062306a36Sopenharmony_ci | enable/disable | 3162306a36Sopenharmony_ci | clk power irq iommu | 3262306a36Sopenharmony_ci | (lat/lat soc/core0/core1) | 3362306a36Sopenharmony_ci +-------------------------------------------------------------+ 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci As above, there are parent and child devices, child mean each hardware. The child device 3662306a36Sopenharmony_ci controls the information of each hardware independent which include clk/power/irq. 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci There are two workqueues in parent device: lat workqueue and core workqueue. They are used 3962306a36Sopenharmony_ci to lat and core hardware decoder. Lat workqueue need to get input bitstream and lat buffer, 4062306a36Sopenharmony_ci then enable lat to decode, writing the result to lat buffer, dislabe hardware when lat decode 4162306a36Sopenharmony_ci done. Core workqueue need to get lat buffer and output buffer, then enable core to decode, 4262306a36Sopenharmony_ci writing the result to output buffer, disable hardware when core decode done. These two 4362306a36Sopenharmony_ci hardwares will decode each frame cyclically. 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci For the smi common may not the same for each hardware, can't combine all hardware in one node, 4662306a36Sopenharmony_ci or leading to iommu fault when access dram data. 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci Lat soc is a hardware which is related with some larb(local arbiter) ports. For mt8195 4962306a36Sopenharmony_ci platform, there are some ports like RDMA, UFO in lat soc larb, need to enable its power and 5062306a36Sopenharmony_ci clock when lat start to work, don't have interrupt. 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci mt8195: lat soc HW + lat HW + core HW 5362306a36Sopenharmony_ci mt8192: lat HW + core HW 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ciproperties: 5662306a36Sopenharmony_ci compatible: 5762306a36Sopenharmony_ci enum: 5862306a36Sopenharmony_ci - mediatek,mt8192-vcodec-dec 5962306a36Sopenharmony_ci - mediatek,mt8186-vcodec-dec 6062306a36Sopenharmony_ci - mediatek,mt8188-vcodec-dec 6162306a36Sopenharmony_ci - mediatek,mt8195-vcodec-dec 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci reg: 6462306a36Sopenharmony_ci minItems: 1 6562306a36Sopenharmony_ci items: 6662306a36Sopenharmony_ci - description: VDEC_SYS register space 6762306a36Sopenharmony_ci - description: VDEC_RACING_CTRL register space 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci iommus: 7062306a36Sopenharmony_ci minItems: 1 7162306a36Sopenharmony_ci maxItems: 32 7262306a36Sopenharmony_ci description: | 7362306a36Sopenharmony_ci List of the hardware port in respective IOMMU block for current Socs. 7462306a36Sopenharmony_ci Refer to bindings/iommu/mediatek,iommu.yaml. 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci mediatek,scp: 7762306a36Sopenharmony_ci $ref: /schemas/types.yaml#/definitions/phandle 7862306a36Sopenharmony_ci description: | 7962306a36Sopenharmony_ci The node of system control processor (SCP), using 8062306a36Sopenharmony_ci the remoteproc & rpmsg framework. 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci "#address-cells": 8362306a36Sopenharmony_ci const: 2 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci "#size-cells": 8662306a36Sopenharmony_ci const: 2 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci ranges: true 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci# Required child node: 9162306a36Sopenharmony_cipatternProperties: 9262306a36Sopenharmony_ci '^video-codec@[0-9a-f]+$': 9362306a36Sopenharmony_ci type: object 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci properties: 9662306a36Sopenharmony_ci compatible: 9762306a36Sopenharmony_ci enum: 9862306a36Sopenharmony_ci - mediatek,mtk-vcodec-core 9962306a36Sopenharmony_ci - mediatek,mtk-vcodec-lat 10062306a36Sopenharmony_ci - mediatek,mtk-vcodec-lat-soc 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci reg: 10362306a36Sopenharmony_ci maxItems: 1 10462306a36Sopenharmony_ci description: VDEC_MISC register space 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci interrupts: 10762306a36Sopenharmony_ci maxItems: 1 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci iommus: 11062306a36Sopenharmony_ci minItems: 1 11162306a36Sopenharmony_ci maxItems: 32 11262306a36Sopenharmony_ci description: | 11362306a36Sopenharmony_ci List of the hardware port in respective IOMMU block for current Socs. 11462306a36Sopenharmony_ci Refer to bindings/iommu/mediatek,iommu.yaml. 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci clocks: 11762306a36Sopenharmony_ci minItems: 4 11862306a36Sopenharmony_ci maxItems: 5 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci clock-names: 12162306a36Sopenharmony_ci minItems: 4 12262306a36Sopenharmony_ci maxItems: 5 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci assigned-clocks: 12562306a36Sopenharmony_ci maxItems: 1 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci assigned-clock-parents: 12862306a36Sopenharmony_ci maxItems: 1 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci power-domains: 13162306a36Sopenharmony_ci maxItems: 1 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci required: 13462306a36Sopenharmony_ci - compatible 13562306a36Sopenharmony_ci - reg 13662306a36Sopenharmony_ci - iommus 13762306a36Sopenharmony_ci - clocks 13862306a36Sopenharmony_ci - clock-names 13962306a36Sopenharmony_ci - assigned-clocks 14062306a36Sopenharmony_ci - assigned-clock-parents 14162306a36Sopenharmony_ci - power-domains 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci additionalProperties: false 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cirequired: 14662306a36Sopenharmony_ci - compatible 14762306a36Sopenharmony_ci - reg 14862306a36Sopenharmony_ci - iommus 14962306a36Sopenharmony_ci - mediatek,scp 15062306a36Sopenharmony_ci - ranges 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ciif: 15362306a36Sopenharmony_ci properties: 15462306a36Sopenharmony_ci compatible: 15562306a36Sopenharmony_ci contains: 15662306a36Sopenharmony_ci enum: 15762306a36Sopenharmony_ci - mediatek,mtk-vcodec-core 15862306a36Sopenharmony_ci - mediatek,mtk-vcodec-lat 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_cithen: 16162306a36Sopenharmony_ci required: 16262306a36Sopenharmony_ci - interrupts 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ciallOf: 16562306a36Sopenharmony_ci - if: 16662306a36Sopenharmony_ci properties: 16762306a36Sopenharmony_ci compatible: 16862306a36Sopenharmony_ci contains: 16962306a36Sopenharmony_ci enum: 17062306a36Sopenharmony_ci - mediatek,mt8192-vcodec-dec 17162306a36Sopenharmony_ci then: 17262306a36Sopenharmony_ci properties: 17362306a36Sopenharmony_ci clock-names: 17462306a36Sopenharmony_ci items: 17562306a36Sopenharmony_ci - const: sel 17662306a36Sopenharmony_ci - const: soc-vdec 17762306a36Sopenharmony_ci - const: soc-lat 17862306a36Sopenharmony_ci - const: vdec 17962306a36Sopenharmony_ci - const: top 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci - if: 18262306a36Sopenharmony_ci properties: 18362306a36Sopenharmony_ci compatible: 18462306a36Sopenharmony_ci contains: 18562306a36Sopenharmony_ci enum: 18662306a36Sopenharmony_ci - mediatek,mt8195-vcodec-dec 18762306a36Sopenharmony_ci then: 18862306a36Sopenharmony_ci properties: 18962306a36Sopenharmony_ci clock-names: 19062306a36Sopenharmony_ci items: 19162306a36Sopenharmony_ci - const: sel 19262306a36Sopenharmony_ci - const: vdec 19362306a36Sopenharmony_ci - const: lat 19462306a36Sopenharmony_ci - const: top 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ciadditionalProperties: false 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ciexamples: 19962306a36Sopenharmony_ci - | 20062306a36Sopenharmony_ci #include <dt-bindings/interrupt-controller/arm-gic.h> 20162306a36Sopenharmony_ci #include <dt-bindings/memory/mt8192-larb-port.h> 20262306a36Sopenharmony_ci #include <dt-bindings/interrupt-controller/irq.h> 20362306a36Sopenharmony_ci #include <dt-bindings/clock/mt8192-clk.h> 20462306a36Sopenharmony_ci #include <dt-bindings/power/mt8192-power.h> 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci bus@16000000 { 20762306a36Sopenharmony_ci #address-cells = <2>; 20862306a36Sopenharmony_ci #size-cells = <2>; 20962306a36Sopenharmony_ci ranges = <0 0x16000000 0x16000000 0 0x40000>; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci video-codec@16000000 { 21262306a36Sopenharmony_ci compatible = "mediatek,mt8192-vcodec-dec"; 21362306a36Sopenharmony_ci mediatek,scp = <&scp>; 21462306a36Sopenharmony_ci iommus = <&iommu0 M4U_PORT_L4_VDEC_MC_EXT>; 21562306a36Sopenharmony_ci #address-cells = <2>; 21662306a36Sopenharmony_ci #size-cells = <2>; 21762306a36Sopenharmony_ci ranges = <0 0 0 0x16000000 0 0x40000>; 21862306a36Sopenharmony_ci reg = <0 0x16000000 0 0x1000>; /* VDEC_SYS */ 21962306a36Sopenharmony_ci video-codec@10000 { 22062306a36Sopenharmony_ci compatible = "mediatek,mtk-vcodec-lat"; 22162306a36Sopenharmony_ci reg = <0 0x10000 0 0x800>; 22262306a36Sopenharmony_ci interrupts = <GIC_SPI 426 IRQ_TYPE_LEVEL_HIGH 0>; 22362306a36Sopenharmony_ci iommus = <&iommu0 M4U_PORT_L5_VDEC_LAT0_VLD_EXT>, 22462306a36Sopenharmony_ci <&iommu0 M4U_PORT_L5_VDEC_LAT0_VLD2_EXT>, 22562306a36Sopenharmony_ci <&iommu0 M4U_PORT_L5_VDEC_LAT0_AVC_MV_EXT>, 22662306a36Sopenharmony_ci <&iommu0 M4U_PORT_L5_VDEC_LAT0_PRED_RD_EXT>, 22762306a36Sopenharmony_ci <&iommu0 M4U_PORT_L5_VDEC_LAT0_TILE_EXT>, 22862306a36Sopenharmony_ci <&iommu0 M4U_PORT_L5_VDEC_LAT0_WDMA_EXT>, 22962306a36Sopenharmony_ci <&iommu0 M4U_PORT_L5_VDEC_LAT0_RG_CTRL_DMA_EXT>, 23062306a36Sopenharmony_ci <&iommu0 M4U_PORT_L5_VDEC_UFO_ENC_EXT>; 23162306a36Sopenharmony_ci clocks = <&topckgen CLK_TOP_VDEC_SEL>, 23262306a36Sopenharmony_ci <&vdecsys_soc CLK_VDEC_SOC_VDEC>, 23362306a36Sopenharmony_ci <&vdecsys_soc CLK_VDEC_SOC_LAT>, 23462306a36Sopenharmony_ci <&vdecsys_soc CLK_VDEC_SOC_LARB1>, 23562306a36Sopenharmony_ci <&topckgen CLK_TOP_MAINPLL_D4>; 23662306a36Sopenharmony_ci clock-names = "sel", "soc-vdec", "soc-lat", "vdec", "top"; 23762306a36Sopenharmony_ci assigned-clocks = <&topckgen CLK_TOP_VDEC_SEL>; 23862306a36Sopenharmony_ci assigned-clock-parents = <&topckgen CLK_TOP_MAINPLL_D4>; 23962306a36Sopenharmony_ci power-domains = <&spm MT8192_POWER_DOMAIN_VDEC>; 24062306a36Sopenharmony_ci }; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci video-codec@25000 { 24362306a36Sopenharmony_ci compatible = "mediatek,mtk-vcodec-core"; 24462306a36Sopenharmony_ci reg = <0 0x25000 0 0x1000>; 24562306a36Sopenharmony_ci interrupts = <GIC_SPI 425 IRQ_TYPE_LEVEL_HIGH 0>; 24662306a36Sopenharmony_ci iommus = <&iommu0 M4U_PORT_L4_VDEC_MC_EXT>, 24762306a36Sopenharmony_ci <&iommu0 M4U_PORT_L4_VDEC_UFO_EXT>, 24862306a36Sopenharmony_ci <&iommu0 M4U_PORT_L4_VDEC_PP_EXT>, 24962306a36Sopenharmony_ci <&iommu0 M4U_PORT_L4_VDEC_PRED_RD_EXT>, 25062306a36Sopenharmony_ci <&iommu0 M4U_PORT_L4_VDEC_PRED_WR_EXT>, 25162306a36Sopenharmony_ci <&iommu0 M4U_PORT_L4_VDEC_PPWRAP_EXT>, 25262306a36Sopenharmony_ci <&iommu0 M4U_PORT_L4_VDEC_TILE_EXT>, 25362306a36Sopenharmony_ci <&iommu0 M4U_PORT_L4_VDEC_VLD_EXT>, 25462306a36Sopenharmony_ci <&iommu0 M4U_PORT_L4_VDEC_VLD2_EXT>, 25562306a36Sopenharmony_ci <&iommu0 M4U_PORT_L4_VDEC_AVC_MV_EXT>, 25662306a36Sopenharmony_ci <&iommu0 M4U_PORT_L4_VDEC_RG_CTRL_DMA_EXT>; 25762306a36Sopenharmony_ci clocks = <&topckgen CLK_TOP_VDEC_SEL>, 25862306a36Sopenharmony_ci <&vdecsys CLK_VDEC_VDEC>, 25962306a36Sopenharmony_ci <&vdecsys CLK_VDEC_LAT>, 26062306a36Sopenharmony_ci <&vdecsys CLK_VDEC_LARB1>, 26162306a36Sopenharmony_ci <&topckgen CLK_TOP_MAINPLL_D4>; 26262306a36Sopenharmony_ci clock-names = "sel", "soc-vdec", "soc-lat", "vdec", "top"; 26362306a36Sopenharmony_ci assigned-clocks = <&topckgen CLK_TOP_VDEC_SEL>; 26462306a36Sopenharmony_ci assigned-clock-parents = <&topckgen CLK_TOP_MAINPLL_D4>; 26562306a36Sopenharmony_ci power-domains = <&spm MT8192_POWER_DOMAIN_VDEC2>; 26662306a36Sopenharmony_ci }; 26762306a36Sopenharmony_ci }; 26862306a36Sopenharmony_ci }; 269