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