1*4882a593Smuzhiyun# SPDX-License-Identifier: (GPL-2.0)
2*4882a593Smuzhiyun%YAML 1.2
3*4882a593Smuzhiyun---
4*4882a593Smuzhiyun$id: http://devicetree.org/schemas/memory-controllers/nvidia,tegra30-mc.yaml#
5*4882a593Smuzhiyun$schema: http://devicetree.org/meta-schemas/core.yaml#
6*4882a593Smuzhiyun
7*4882a593Smuzhiyuntitle: NVIDIA Tegra30 SoC Memory Controller
8*4882a593Smuzhiyun
9*4882a593Smuzhiyunmaintainers:
10*4882a593Smuzhiyun  - Dmitry Osipenko <digetx@gmail.com>
11*4882a593Smuzhiyun  - Jon Hunter <jonathanh@nvidia.com>
12*4882a593Smuzhiyun  - Thierry Reding <thierry.reding@gmail.com>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyundescription: |
15*4882a593Smuzhiyun  Tegra30 Memory Controller architecturally consists of the following parts:
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun    Arbitration Domains, which can handle a single request or response per
18*4882a593Smuzhiyun    clock from a group of clients. Typically, a system has a single Arbitration
19*4882a593Smuzhiyun    Domain, but an implementation may divide the client space into multiple
20*4882a593Smuzhiyun    Arbitration Domains to increase the effective system bandwidth.
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun    Protocol Arbiter, which manage a related pool of memory devices. A system
23*4882a593Smuzhiyun    may have a single Protocol Arbiter or multiple Protocol Arbiters.
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun    Memory Crossbar, which routes request and responses between Arbitration
26*4882a593Smuzhiyun    Domains and Protocol Arbiters. In the simplest version of the system, the
27*4882a593Smuzhiyun    Memory Crossbar is just a pass through between a single Arbitration Domain
28*4882a593Smuzhiyun    and a single Protocol Arbiter.
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun    Global Resources, which include things like configuration registers which
31*4882a593Smuzhiyun    are shared across the Memory Subsystem.
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun  The Tegra30 Memory Controller handles memory requests from internal clients
34*4882a593Smuzhiyun  and arbitrates among them to allocate memory bandwidth for DDR3L and LPDDR2
35*4882a593Smuzhiyun  SDRAMs.
36*4882a593Smuzhiyun
37*4882a593Smuzhiyunproperties:
38*4882a593Smuzhiyun  compatible:
39*4882a593Smuzhiyun    const: nvidia,tegra30-mc
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun  reg:
42*4882a593Smuzhiyun    maxItems: 1
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun  clocks:
45*4882a593Smuzhiyun    maxItems: 1
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun  clock-names:
48*4882a593Smuzhiyun    items:
49*4882a593Smuzhiyun      - const: mc
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun  interrupts:
52*4882a593Smuzhiyun    maxItems: 1
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun  "#reset-cells":
55*4882a593Smuzhiyun    const: 1
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun  "#iommu-cells":
58*4882a593Smuzhiyun    const: 1
59*4882a593Smuzhiyun
60*4882a593SmuzhiyunpatternProperties:
61*4882a593Smuzhiyun  "^emc-timings-[0-9]+$":
62*4882a593Smuzhiyun    type: object
63*4882a593Smuzhiyun    properties:
64*4882a593Smuzhiyun      nvidia,ram-code:
65*4882a593Smuzhiyun        $ref: /schemas/types.yaml#/definitions/uint32
66*4882a593Smuzhiyun        description:
67*4882a593Smuzhiyun          Value of RAM_CODE this timing set is used for.
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun    patternProperties:
70*4882a593Smuzhiyun      "^timing-[0-9]+$":
71*4882a593Smuzhiyun        type: object
72*4882a593Smuzhiyun        properties:
73*4882a593Smuzhiyun          clock-frequency:
74*4882a593Smuzhiyun            description:
75*4882a593Smuzhiyun              Memory clock rate in Hz.
76*4882a593Smuzhiyun            minimum: 1000000
77*4882a593Smuzhiyun            maximum: 900000000
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun          nvidia,emem-configuration:
80*4882a593Smuzhiyun            $ref: /schemas/types.yaml#/definitions/uint32-array
81*4882a593Smuzhiyun            description: |
82*4882a593Smuzhiyun              Values to be written to the EMEM register block. See section
83*4882a593Smuzhiyun              "18.13.1 MC Registers" in the TRM.
84*4882a593Smuzhiyun            items:
85*4882a593Smuzhiyun              - description: MC_EMEM_ARB_CFG
86*4882a593Smuzhiyun              - description: MC_EMEM_ARB_OUTSTANDING_REQ
87*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_RCD
88*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_RP
89*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_RC
90*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_RAS
91*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_FAW
92*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_RRD
93*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_RAP2PRE
94*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_WAP2PRE
95*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_R2R
96*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_W2W
97*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_R2W
98*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_W2R
99*4882a593Smuzhiyun              - description: MC_EMEM_ARB_DA_TURNS
100*4882a593Smuzhiyun              - description: MC_EMEM_ARB_DA_COVERS
101*4882a593Smuzhiyun              - description: MC_EMEM_ARB_MISC0
102*4882a593Smuzhiyun              - description: MC_EMEM_ARB_RING1_THROTTLE
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun        required:
105*4882a593Smuzhiyun          - clock-frequency
106*4882a593Smuzhiyun          - nvidia,emem-configuration
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun        additionalProperties: false
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun    required:
111*4882a593Smuzhiyun      - nvidia,ram-code
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun    additionalProperties: false
114*4882a593Smuzhiyun
115*4882a593Smuzhiyunrequired:
116*4882a593Smuzhiyun  - compatible
117*4882a593Smuzhiyun  - reg
118*4882a593Smuzhiyun  - interrupts
119*4882a593Smuzhiyun  - clocks
120*4882a593Smuzhiyun  - clock-names
121*4882a593Smuzhiyun  - "#reset-cells"
122*4882a593Smuzhiyun  - "#iommu-cells"
123*4882a593Smuzhiyun
124*4882a593SmuzhiyunadditionalProperties: false
125*4882a593Smuzhiyun
126*4882a593Smuzhiyunexamples:
127*4882a593Smuzhiyun  - |
128*4882a593Smuzhiyun    memory-controller@7000f000 {
129*4882a593Smuzhiyun        compatible = "nvidia,tegra30-mc";
130*4882a593Smuzhiyun        reg = <0x7000f000 0x400>;
131*4882a593Smuzhiyun        clocks = <&tegra_car 32>;
132*4882a593Smuzhiyun        clock-names = "mc";
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun        interrupts = <0 77 4>;
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun        #iommu-cells = <1>;
137*4882a593Smuzhiyun        #reset-cells = <1>;
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun        emc-timings-1 {
140*4882a593Smuzhiyun            nvidia,ram-code = <1>;
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun            timing-667000000 {
143*4882a593Smuzhiyun                clock-frequency = <667000000>;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun                nvidia,emem-configuration = <
146*4882a593Smuzhiyun                    0x0000000a /* MC_EMEM_ARB_CFG */
147*4882a593Smuzhiyun                    0xc0000079 /* MC_EMEM_ARB_OUTSTANDING_REQ */
148*4882a593Smuzhiyun                    0x00000003 /* MC_EMEM_ARB_TIMING_RCD */
149*4882a593Smuzhiyun                    0x00000004 /* MC_EMEM_ARB_TIMING_RP */
150*4882a593Smuzhiyun                    0x00000010 /* MC_EMEM_ARB_TIMING_RC */
151*4882a593Smuzhiyun                    0x0000000b /* MC_EMEM_ARB_TIMING_RAS */
152*4882a593Smuzhiyun                    0x0000000a /* MC_EMEM_ARB_TIMING_FAW */
153*4882a593Smuzhiyun                    0x00000001 /* MC_EMEM_ARB_TIMING_RRD */
154*4882a593Smuzhiyun                    0x00000003 /* MC_EMEM_ARB_TIMING_RAP2PRE */
155*4882a593Smuzhiyun                    0x0000000b /* MC_EMEM_ARB_TIMING_WAP2PRE */
156*4882a593Smuzhiyun                    0x00000002 /* MC_EMEM_ARB_TIMING_R2R */
157*4882a593Smuzhiyun                    0x00000002 /* MC_EMEM_ARB_TIMING_W2W */
158*4882a593Smuzhiyun                    0x00000004 /* MC_EMEM_ARB_TIMING_R2W */
159*4882a593Smuzhiyun                    0x00000008 /* MC_EMEM_ARB_TIMING_W2R */
160*4882a593Smuzhiyun                    0x08040202 /* MC_EMEM_ARB_DA_TURNS */
161*4882a593Smuzhiyun                    0x00130b10 /* MC_EMEM_ARB_DA_COVERS */
162*4882a593Smuzhiyun                    0x70ea1f11 /* MC_EMEM_ARB_MISC0 */
163*4882a593Smuzhiyun                    0x001f0000 /* MC_EMEM_ARB_RING1_THROTTLE */
164*4882a593Smuzhiyun                >;
165*4882a593Smuzhiyun            };
166*4882a593Smuzhiyun        };
167*4882a593Smuzhiyun    };
168