18c2ecf20Sopenharmony_ci# SPDX-License-Identifier: (GPL-2.0)
28c2ecf20Sopenharmony_ci%YAML 1.2
38c2ecf20Sopenharmony_ci---
48c2ecf20Sopenharmony_ci$id: http://devicetree.org/schemas/memory-controllers/nvidia,tegra30-mc.yaml#
58c2ecf20Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml#
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_cititle: NVIDIA Tegra30 SoC Memory Controller
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_cimaintainers:
108c2ecf20Sopenharmony_ci  - Dmitry Osipenko <digetx@gmail.com>
118c2ecf20Sopenharmony_ci  - Jon Hunter <jonathanh@nvidia.com>
128c2ecf20Sopenharmony_ci  - Thierry Reding <thierry.reding@gmail.com>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_cidescription: |
158c2ecf20Sopenharmony_ci  Tegra30 Memory Controller architecturally consists of the following parts:
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci    Arbitration Domains, which can handle a single request or response per
188c2ecf20Sopenharmony_ci    clock from a group of clients. Typically, a system has a single Arbitration
198c2ecf20Sopenharmony_ci    Domain, but an implementation may divide the client space into multiple
208c2ecf20Sopenharmony_ci    Arbitration Domains to increase the effective system bandwidth.
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci    Protocol Arbiter, which manage a related pool of memory devices. A system
238c2ecf20Sopenharmony_ci    may have a single Protocol Arbiter or multiple Protocol Arbiters.
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci    Memory Crossbar, which routes request and responses between Arbitration
268c2ecf20Sopenharmony_ci    Domains and Protocol Arbiters. In the simplest version of the system, the
278c2ecf20Sopenharmony_ci    Memory Crossbar is just a pass through between a single Arbitration Domain
288c2ecf20Sopenharmony_ci    and a single Protocol Arbiter.
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci    Global Resources, which include things like configuration registers which
318c2ecf20Sopenharmony_ci    are shared across the Memory Subsystem.
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci  The Tegra30 Memory Controller handles memory requests from internal clients
348c2ecf20Sopenharmony_ci  and arbitrates among them to allocate memory bandwidth for DDR3L and LPDDR2
358c2ecf20Sopenharmony_ci  SDRAMs.
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ciproperties:
388c2ecf20Sopenharmony_ci  compatible:
398c2ecf20Sopenharmony_ci    const: nvidia,tegra30-mc
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci  reg:
428c2ecf20Sopenharmony_ci    maxItems: 1
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci  clocks:
458c2ecf20Sopenharmony_ci    maxItems: 1
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci  clock-names:
488c2ecf20Sopenharmony_ci    items:
498c2ecf20Sopenharmony_ci      - const: mc
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci  interrupts:
528c2ecf20Sopenharmony_ci    maxItems: 1
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci  "#reset-cells":
558c2ecf20Sopenharmony_ci    const: 1
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci  "#iommu-cells":
588c2ecf20Sopenharmony_ci    const: 1
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_cipatternProperties:
618c2ecf20Sopenharmony_ci  "^emc-timings-[0-9]+$":
628c2ecf20Sopenharmony_ci    type: object
638c2ecf20Sopenharmony_ci    properties:
648c2ecf20Sopenharmony_ci      nvidia,ram-code:
658c2ecf20Sopenharmony_ci        $ref: /schemas/types.yaml#/definitions/uint32
668c2ecf20Sopenharmony_ci        description:
678c2ecf20Sopenharmony_ci          Value of RAM_CODE this timing set is used for.
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci    patternProperties:
708c2ecf20Sopenharmony_ci      "^timing-[0-9]+$":
718c2ecf20Sopenharmony_ci        type: object
728c2ecf20Sopenharmony_ci        properties:
738c2ecf20Sopenharmony_ci          clock-frequency:
748c2ecf20Sopenharmony_ci            description:
758c2ecf20Sopenharmony_ci              Memory clock rate in Hz.
768c2ecf20Sopenharmony_ci            minimum: 1000000
778c2ecf20Sopenharmony_ci            maximum: 900000000
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci          nvidia,emem-configuration:
808c2ecf20Sopenharmony_ci            $ref: /schemas/types.yaml#/definitions/uint32-array
818c2ecf20Sopenharmony_ci            description: |
828c2ecf20Sopenharmony_ci              Values to be written to the EMEM register block. See section
838c2ecf20Sopenharmony_ci              "18.13.1 MC Registers" in the TRM.
848c2ecf20Sopenharmony_ci            items:
858c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_CFG
868c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_OUTSTANDING_REQ
878c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_TIMING_RCD
888c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_TIMING_RP
898c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_TIMING_RC
908c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_TIMING_RAS
918c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_TIMING_FAW
928c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_TIMING_RRD
938c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_TIMING_RAP2PRE
948c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_TIMING_WAP2PRE
958c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_TIMING_R2R
968c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_TIMING_W2W
978c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_TIMING_R2W
988c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_TIMING_W2R
998c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_DA_TURNS
1008c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_DA_COVERS
1018c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_MISC0
1028c2ecf20Sopenharmony_ci              - description: MC_EMEM_ARB_RING1_THROTTLE
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci        required:
1058c2ecf20Sopenharmony_ci          - clock-frequency
1068c2ecf20Sopenharmony_ci          - nvidia,emem-configuration
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci        additionalProperties: false
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci    required:
1118c2ecf20Sopenharmony_ci      - nvidia,ram-code
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci    additionalProperties: false
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_cirequired:
1168c2ecf20Sopenharmony_ci  - compatible
1178c2ecf20Sopenharmony_ci  - reg
1188c2ecf20Sopenharmony_ci  - interrupts
1198c2ecf20Sopenharmony_ci  - clocks
1208c2ecf20Sopenharmony_ci  - clock-names
1218c2ecf20Sopenharmony_ci  - "#reset-cells"
1228c2ecf20Sopenharmony_ci  - "#iommu-cells"
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ciadditionalProperties: false
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ciexamples:
1278c2ecf20Sopenharmony_ci  - |
1288c2ecf20Sopenharmony_ci    memory-controller@7000f000 {
1298c2ecf20Sopenharmony_ci        compatible = "nvidia,tegra30-mc";
1308c2ecf20Sopenharmony_ci        reg = <0x7000f000 0x400>;
1318c2ecf20Sopenharmony_ci        clocks = <&tegra_car 32>;
1328c2ecf20Sopenharmony_ci        clock-names = "mc";
1338c2ecf20Sopenharmony_ci
1348c2ecf20Sopenharmony_ci        interrupts = <0 77 4>;
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci        #iommu-cells = <1>;
1378c2ecf20Sopenharmony_ci        #reset-cells = <1>;
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_ci        emc-timings-1 {
1408c2ecf20Sopenharmony_ci            nvidia,ram-code = <1>;
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci            timing-667000000 {
1438c2ecf20Sopenharmony_ci                clock-frequency = <667000000>;
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_ci                nvidia,emem-configuration = <
1468c2ecf20Sopenharmony_ci                    0x0000000a /* MC_EMEM_ARB_CFG */
1478c2ecf20Sopenharmony_ci                    0xc0000079 /* MC_EMEM_ARB_OUTSTANDING_REQ */
1488c2ecf20Sopenharmony_ci                    0x00000003 /* MC_EMEM_ARB_TIMING_RCD */
1498c2ecf20Sopenharmony_ci                    0x00000004 /* MC_EMEM_ARB_TIMING_RP */
1508c2ecf20Sopenharmony_ci                    0x00000010 /* MC_EMEM_ARB_TIMING_RC */
1518c2ecf20Sopenharmony_ci                    0x0000000b /* MC_EMEM_ARB_TIMING_RAS */
1528c2ecf20Sopenharmony_ci                    0x0000000a /* MC_EMEM_ARB_TIMING_FAW */
1538c2ecf20Sopenharmony_ci                    0x00000001 /* MC_EMEM_ARB_TIMING_RRD */
1548c2ecf20Sopenharmony_ci                    0x00000003 /* MC_EMEM_ARB_TIMING_RAP2PRE */
1558c2ecf20Sopenharmony_ci                    0x0000000b /* MC_EMEM_ARB_TIMING_WAP2PRE */
1568c2ecf20Sopenharmony_ci                    0x00000002 /* MC_EMEM_ARB_TIMING_R2R */
1578c2ecf20Sopenharmony_ci                    0x00000002 /* MC_EMEM_ARB_TIMING_W2W */
1588c2ecf20Sopenharmony_ci                    0x00000004 /* MC_EMEM_ARB_TIMING_R2W */
1598c2ecf20Sopenharmony_ci                    0x00000008 /* MC_EMEM_ARB_TIMING_W2R */
1608c2ecf20Sopenharmony_ci                    0x08040202 /* MC_EMEM_ARB_DA_TURNS */
1618c2ecf20Sopenharmony_ci                    0x00130b10 /* MC_EMEM_ARB_DA_COVERS */
1628c2ecf20Sopenharmony_ci                    0x70ea1f11 /* MC_EMEM_ARB_MISC0 */
1638c2ecf20Sopenharmony_ci                    0x001f0000 /* MC_EMEM_ARB_RING1_THROTTLE */
1648c2ecf20Sopenharmony_ci                >;
1658c2ecf20Sopenharmony_ci            };
1668c2ecf20Sopenharmony_ci        };
1678c2ecf20Sopenharmony_ci    };
168