162306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci%YAML 1.2
362306a36Sopenharmony_ci---
462306a36Sopenharmony_ci$id: http://devicetree.org/schemas/interconnect/samsung,exynos-bus.yaml#
562306a36Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml#
662306a36Sopenharmony_ci
762306a36Sopenharmony_cititle: Samsung Exynos SoC Bus and Interconnect
862306a36Sopenharmony_ci
962306a36Sopenharmony_cimaintainers:
1062306a36Sopenharmony_ci  - Chanwoo Choi <cw00.choi@samsung.com>
1162306a36Sopenharmony_ci  - Krzysztof Kozlowski <krzk@kernel.org>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cidescription: |
1462306a36Sopenharmony_ci  The Samsung Exynos SoC has many buses for data transfer between DRAM and
1562306a36Sopenharmony_ci  sub-blocks in SoC. Most Exynos SoCs share the common architecture for buses.
1662306a36Sopenharmony_ci  Generally, each bus of Exynos SoC includes a source clock and a power line,
1762306a36Sopenharmony_ci  which are able to change the clock frequency of the bus in runtime. To
1862306a36Sopenharmony_ci  monitor the usage of each bus in runtime, the driver uses the PPMU (Platform
1962306a36Sopenharmony_ci  Performance Monitoring Unit), which is able to measure the current load of
2062306a36Sopenharmony_ci  sub-blocks.
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci  The Exynos SoC includes the various sub-blocks which have the each AXI bus.
2362306a36Sopenharmony_ci  The each AXI bus has the owned source clock but, has not the only owned power
2462306a36Sopenharmony_ci  line. The power line might be shared among one more sub-blocks.  So, we can
2562306a36Sopenharmony_ci  divide into two type of device as the role of each sub-block.  There are two
2662306a36Sopenharmony_ci  type of bus devices as following::
2762306a36Sopenharmony_ci   - parent bus device
2862306a36Sopenharmony_ci   - passive bus device
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci  Basically, parent and passive bus device share the same power line.  The
3162306a36Sopenharmony_ci  parent bus device can only change the voltage of shared power line and the
3262306a36Sopenharmony_ci  rest bus devices (passive bus device) depend on the decision of the parent
3362306a36Sopenharmony_ci  bus device. If there are three blocks which share the VDD_xxx power line,
3462306a36Sopenharmony_ci  Only one block should be parent device and then the rest blocks should depend
3562306a36Sopenharmony_ci  on the parent device as passive device.
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci    VDD_xxx |--- A block (parent)
3862306a36Sopenharmony_ci      |--- B block (passive)
3962306a36Sopenharmony_ci      |--- C block (passive)
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci  There are a little different composition among Exynos SoC because each Exynos
4262306a36Sopenharmony_ci  SoC has different sub-blocks. Therefore, such difference should be specified
4362306a36Sopenharmony_ci  in devicetree file instead of each device driver. In result, this driver is
4462306a36Sopenharmony_ci  able to support the bus frequency for all Exynos SoCs.
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci  Detailed correlation between sub-blocks and power line according
4762306a36Sopenharmony_ci  to Exynos SoC::
4862306a36Sopenharmony_ci   - In case of Exynos3250, there are two power line as following::
4962306a36Sopenharmony_ci     VDD_MIF |--- DMC (Dynamic Memory Controller)
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci     VDD_INT |--- LEFTBUS (parent device)
5262306a36Sopenharmony_ci       |--- PERIL
5362306a36Sopenharmony_ci       |--- MFC
5462306a36Sopenharmony_ci       |--- G3D
5562306a36Sopenharmony_ci       |--- RIGHTBUS
5662306a36Sopenharmony_ci       |--- PERIR
5762306a36Sopenharmony_ci       |--- FSYS
5862306a36Sopenharmony_ci       |--- LCD0
5962306a36Sopenharmony_ci       |--- PERIR
6062306a36Sopenharmony_ci       |--- ISP
6162306a36Sopenharmony_ci       |--- CAM
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci     - MIF bus's frequency/voltage table
6462306a36Sopenharmony_ci       -----------------------
6562306a36Sopenharmony_ci       |Lv| Freq   | Voltage |
6662306a36Sopenharmony_ci       -----------------------
6762306a36Sopenharmony_ci       |L1| 50000  |800000   |
6862306a36Sopenharmony_ci       |L2| 100000 |800000   |
6962306a36Sopenharmony_ci       |L3| 134000 |800000   |
7062306a36Sopenharmony_ci       |L4| 200000 |825000   |
7162306a36Sopenharmony_ci       |L5| 400000 |875000   |
7262306a36Sopenharmony_ci       -----------------------
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci     - INT bus's frequency/voltage table
7562306a36Sopenharmony_ci       ----------------------------------------------------------
7662306a36Sopenharmony_ci       |Block|LEFTBUS|RIGHTBUS|MCUISP |ISP    |PERIL  ||VDD_INT |
7762306a36Sopenharmony_ci       | name|       |LCD0    |       |       |       ||        |
7862306a36Sopenharmony_ci       |     |       |FSYS    |       |       |       ||        |
7962306a36Sopenharmony_ci       |     |       |MFC     |       |       |       ||        |
8062306a36Sopenharmony_ci       ----------------------------------------------------------
8162306a36Sopenharmony_ci       |Mode |*parent|passive |passive|passive|passive||        |
8262306a36Sopenharmony_ci       ----------------------------------------------------------
8362306a36Sopenharmony_ci       |Lv   |Frequency                               ||Voltage |
8462306a36Sopenharmony_ci       ----------------------------------------------------------
8562306a36Sopenharmony_ci       |L1   |50000  |50000   |50000  |50000  |50000  ||900000  |
8662306a36Sopenharmony_ci       |L2   |80000  |80000   |80000  |80000  |80000  ||900000  |
8762306a36Sopenharmony_ci       |L3   |100000 |100000  |100000 |100000 |100000 ||1000000 |
8862306a36Sopenharmony_ci       |L4   |134000 |134000  |200000 |200000 |       ||1000000 |
8962306a36Sopenharmony_ci       |L5   |200000 |200000  |400000 |300000 |       ||1000000 |
9062306a36Sopenharmony_ci       ----------------------------------------------------------
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci   - In case of Exynos4210, there is one power line as following::
9362306a36Sopenharmony_ci     VDD_INT |--- DMC (parent device, Dynamic Memory Controller)
9462306a36Sopenharmony_ci       |--- LEFTBUS
9562306a36Sopenharmony_ci       |--- PERIL
9662306a36Sopenharmony_ci       |--- MFC(L)
9762306a36Sopenharmony_ci       |--- G3D
9862306a36Sopenharmony_ci       |--- TV
9962306a36Sopenharmony_ci       |--- LCD0
10062306a36Sopenharmony_ci       |--- RIGHTBUS
10162306a36Sopenharmony_ci       |--- PERIR
10262306a36Sopenharmony_ci       |--- MFC(R)
10362306a36Sopenharmony_ci       |--- CAM
10462306a36Sopenharmony_ci       |--- FSYS
10562306a36Sopenharmony_ci       |--- GPS
10662306a36Sopenharmony_ci       |--- LCD0
10762306a36Sopenharmony_ci       |--- LCD1
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci   - In case of Exynos4x12, there are two power line as following::
11062306a36Sopenharmony_ci     VDD_MIF |--- DMC (Dynamic Memory Controller)
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci     VDD_INT |--- LEFTBUS (parent device)
11362306a36Sopenharmony_ci       |--- PERIL
11462306a36Sopenharmony_ci       |--- MFC(L)
11562306a36Sopenharmony_ci       |--- G3D
11662306a36Sopenharmony_ci       |--- TV
11762306a36Sopenharmony_ci       |--- IMAGE
11862306a36Sopenharmony_ci       |--- RIGHTBUS
11962306a36Sopenharmony_ci       |--- PERIR
12062306a36Sopenharmony_ci       |--- MFC(R)
12162306a36Sopenharmony_ci       |--- CAM
12262306a36Sopenharmony_ci       |--- FSYS
12362306a36Sopenharmony_ci       |--- GPS
12462306a36Sopenharmony_ci       |--- LCD0
12562306a36Sopenharmony_ci       |--- ISP
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci   - In case of Exynos5422, there are two power line as following::
12862306a36Sopenharmony_ci     VDD_MIF |--- DREX 0 (parent device, DRAM EXpress controller)
12962306a36Sopenharmony_ci             |--- DREX 1
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci     VDD_INT |--- NoC_Core (parent device)
13262306a36Sopenharmony_ci       |--- G2D
13362306a36Sopenharmony_ci       |--- G3D
13462306a36Sopenharmony_ci       |--- DISP1
13562306a36Sopenharmony_ci       |--- NoC_WCORE
13662306a36Sopenharmony_ci       |--- GSCL
13762306a36Sopenharmony_ci       |--- MSCL
13862306a36Sopenharmony_ci       |--- ISP
13962306a36Sopenharmony_ci       |--- MFC
14062306a36Sopenharmony_ci       |--- GEN
14162306a36Sopenharmony_ci       |--- PERIS
14262306a36Sopenharmony_ci       |--- PERIC
14362306a36Sopenharmony_ci       |--- FSYS
14462306a36Sopenharmony_ci       |--- FSYS2
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci   - In case of Exynos5433, there is VDD_INT power line as following::
14762306a36Sopenharmony_ci     VDD_INT |--- G2D (parent device)
14862306a36Sopenharmony_ci       |--- MSCL
14962306a36Sopenharmony_ci       |--- GSCL
15062306a36Sopenharmony_ci       |--- JPEG
15162306a36Sopenharmony_ci       |--- MFC
15262306a36Sopenharmony_ci       |--- HEVC
15362306a36Sopenharmony_ci       |--- BUS0
15462306a36Sopenharmony_ci       |--- BUS1
15562306a36Sopenharmony_ci       |--- BUS2
15662306a36Sopenharmony_ci       |--- PERIS (Fixed clock rate)
15762306a36Sopenharmony_ci       |--- PERIC (Fixed clock rate)
15862306a36Sopenharmony_ci       |--- FSYS  (Fixed clock rate)
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ciproperties:
16162306a36Sopenharmony_ci  compatible:
16262306a36Sopenharmony_ci    enum:
16362306a36Sopenharmony_ci      - samsung,exynos-bus
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci  clocks:
16662306a36Sopenharmony_ci    maxItems: 1
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci  clock-names:
16962306a36Sopenharmony_ci    items:
17062306a36Sopenharmony_ci      - const: bus
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci  devfreq:
17362306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/phandle
17462306a36Sopenharmony_ci    description:
17562306a36Sopenharmony_ci      Parent bus device. Valid and required only for the passive bus devices.
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci  devfreq-events:
17862306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/phandle-array
17962306a36Sopenharmony_ci    minItems: 1
18062306a36Sopenharmony_ci    maxItems: 4
18162306a36Sopenharmony_ci    description:
18262306a36Sopenharmony_ci      Devfreq-event device to monitor the current utilization of buses. Valid
18362306a36Sopenharmony_ci      and required only for the parent bus devices.
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci  exynos,saturation-ratio:
18662306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/uint32
18762306a36Sopenharmony_ci    description:
18862306a36Sopenharmony_ci      Percentage value which is used to calibrate the performance count against
18962306a36Sopenharmony_ci      total cycle count.  Valid only for the parent bus devices.
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci  '#interconnect-cells':
19262306a36Sopenharmony_ci    const: 0
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci  interconnects:
19562306a36Sopenharmony_ci    minItems: 1
19662306a36Sopenharmony_ci    maxItems: 2
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci  operating-points-v2: true
19962306a36Sopenharmony_ci  opp-table:
20062306a36Sopenharmony_ci    type: object
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci  samsung,data-clock-ratio:
20362306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/uint32
20462306a36Sopenharmony_ci    default: 8
20562306a36Sopenharmony_ci    description:
20662306a36Sopenharmony_ci      Ratio of the data throughput in B/s to minimum data clock frequency in
20762306a36Sopenharmony_ci      Hz.
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci  vdd-supply:
21062306a36Sopenharmony_ci    description:
21162306a36Sopenharmony_ci      Main bus power rail. Valid and required only for the parent bus devices.
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_cirequired:
21462306a36Sopenharmony_ci  - compatible
21562306a36Sopenharmony_ci  - clocks
21662306a36Sopenharmony_ci  - clock-names
21762306a36Sopenharmony_ci  - operating-points-v2
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ciadditionalProperties: false
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ciexamples:
22262306a36Sopenharmony_ci  - |
22362306a36Sopenharmony_ci    #include <dt-bindings/clock/exynos3250.h>
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci    bus-dmc {
22662306a36Sopenharmony_ci        compatible = "samsung,exynos-bus";
22762306a36Sopenharmony_ci        clocks = <&cmu_dmc CLK_DIV_DMC>;
22862306a36Sopenharmony_ci        clock-names = "bus";
22962306a36Sopenharmony_ci        operating-points-v2 = <&bus_dmc_opp_table>;
23062306a36Sopenharmony_ci        devfreq-events = <&ppmu_dmc0_3>, <&ppmu_dmc1_3>;
23162306a36Sopenharmony_ci        vdd-supply = <&buck1_reg>;
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci        bus_dmc_opp_table: opp-table {
23462306a36Sopenharmony_ci            compatible = "operating-points-v2";
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci            opp-50000000 {
23762306a36Sopenharmony_ci                opp-hz = /bits/ 64 <50000000>;
23862306a36Sopenharmony_ci                opp-microvolt = <800000>;
23962306a36Sopenharmony_ci            };
24062306a36Sopenharmony_ci            opp-100000000 {
24162306a36Sopenharmony_ci                opp-hz = /bits/ 64 <100000000>;
24262306a36Sopenharmony_ci                opp-microvolt = <800000>;
24362306a36Sopenharmony_ci            };
24462306a36Sopenharmony_ci            opp-134000000 {
24562306a36Sopenharmony_ci                opp-hz = /bits/ 64 <134000000>;
24662306a36Sopenharmony_ci                opp-microvolt = <800000>;
24762306a36Sopenharmony_ci            };
24862306a36Sopenharmony_ci            opp-200000000 {
24962306a36Sopenharmony_ci                opp-hz = /bits/ 64 <200000000>;
25062306a36Sopenharmony_ci                opp-microvolt = <825000>;
25162306a36Sopenharmony_ci            };
25262306a36Sopenharmony_ci            opp-400000000 {
25362306a36Sopenharmony_ci                opp-hz = /bits/ 64 <400000000>;
25462306a36Sopenharmony_ci                opp-microvolt = <875000>;
25562306a36Sopenharmony_ci            };
25662306a36Sopenharmony_ci        };
25762306a36Sopenharmony_ci    };
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci    ppmu_dmc0: ppmu@106a0000 {
26062306a36Sopenharmony_ci        compatible = "samsung,exynos-ppmu";
26162306a36Sopenharmony_ci        reg = <0x106a0000 0x2000>;
26262306a36Sopenharmony_ci        events {
26362306a36Sopenharmony_ci            ppmu_dmc0_3: ppmu-event3-dmc0 {
26462306a36Sopenharmony_ci                event-name = "ppmu-event3-dmc0";
26562306a36Sopenharmony_ci            };
26662306a36Sopenharmony_ci        };
26762306a36Sopenharmony_ci    };
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci    bus_leftbus: bus-leftbus {
27062306a36Sopenharmony_ci        compatible = "samsung,exynos-bus";
27162306a36Sopenharmony_ci        clocks = <&cmu CLK_DIV_GDL>;
27262306a36Sopenharmony_ci        clock-names = "bus";
27362306a36Sopenharmony_ci        operating-points-v2 = <&bus_leftbus_opp_table>;
27462306a36Sopenharmony_ci        devfreq-events = <&ppmu_leftbus_3>, <&ppmu_rightbus_3>;
27562306a36Sopenharmony_ci        vdd-supply = <&buck3_reg>;
27662306a36Sopenharmony_ci    };
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci    bus-rightbus {
27962306a36Sopenharmony_ci        compatible = "samsung,exynos-bus";
28062306a36Sopenharmony_ci        clocks = <&cmu CLK_DIV_GDR>;
28162306a36Sopenharmony_ci        clock-names = "bus";
28262306a36Sopenharmony_ci        operating-points-v2 = <&bus_leftbus_opp_table>;
28362306a36Sopenharmony_ci        devfreq = <&bus_leftbus>;
28462306a36Sopenharmony_ci    };
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci  - |
28762306a36Sopenharmony_ci    dmc: bus-dmc {
28862306a36Sopenharmony_ci        compatible = "samsung,exynos-bus";
28962306a36Sopenharmony_ci        clocks = <&clock CLK_DIV_DMC>;
29062306a36Sopenharmony_ci        clock-names = "bus";
29162306a36Sopenharmony_ci        operating-points-v2 = <&bus_dmc_opp_table>;
29262306a36Sopenharmony_ci        samsung,data-clock-ratio = <4>;
29362306a36Sopenharmony_ci        #interconnect-cells = <0>;
29462306a36Sopenharmony_ci        devfreq-events = <&ppmu_dmc0_3>, <&ppmu_dmc1_3>;
29562306a36Sopenharmony_ci        vdd-supply = <&buck1_reg>;
29662306a36Sopenharmony_ci    };
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci    leftbus: bus-leftbus {
29962306a36Sopenharmony_ci        compatible = "samsung,exynos-bus";
30062306a36Sopenharmony_ci        clocks = <&clock CLK_DIV_GDL>;
30162306a36Sopenharmony_ci        clock-names = "bus";
30262306a36Sopenharmony_ci        operating-points-v2 = <&bus_leftbus_opp_table>;
30362306a36Sopenharmony_ci        interconnects = <&dmc>;
30462306a36Sopenharmony_ci        #interconnect-cells = <0>;
30562306a36Sopenharmony_ci        devfreq-events = <&ppmu_leftbus_3>, <&ppmu_rightbus_3>;
30662306a36Sopenharmony_ci        vdd-supply = <&buck3_reg>;
30762306a36Sopenharmony_ci    };
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci    display: bus-display {
31062306a36Sopenharmony_ci        compatible = "samsung,exynos-bus";
31162306a36Sopenharmony_ci        clocks = <&clock CLK_DIV_ACLK_266>;
31262306a36Sopenharmony_ci        clock-names = "bus";
31362306a36Sopenharmony_ci        operating-points-v2 = <&bus_display_opp_table>;
31462306a36Sopenharmony_ci        interconnects = <&leftbus &dmc>;
31562306a36Sopenharmony_ci        #interconnect-cells = <0>;
31662306a36Sopenharmony_ci        devfreq = <&leftbus>;
31762306a36Sopenharmony_ci    };
318