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,tegra124-mc.yaml#
5*4882a593Smuzhiyun$schema: http://devicetree.org/meta-schemas/core.yaml#
6*4882a593Smuzhiyun
7*4882a593Smuzhiyuntitle: NVIDIA Tegra124 SoC Memory Controller
8*4882a593Smuzhiyun
9*4882a593Smuzhiyunmaintainers:
10*4882a593Smuzhiyun  - Jon Hunter <jonathanh@nvidia.com>
11*4882a593Smuzhiyun  - Thierry Reding <thierry.reding@gmail.com>
12*4882a593Smuzhiyun
13*4882a593Smuzhiyundescription: |
14*4882a593Smuzhiyun  Tegra124 SoC features a hybrid 2x32-bit / 1x64-bit memory controller.
15*4882a593Smuzhiyun  These are interleaved to provide high performance with the load shared across
16*4882a593Smuzhiyun  two memory channels. The Tegra124 Memory Controller handles memory requests
17*4882a593Smuzhiyun  from internal clients and arbitrates among them to allocate memory bandwidth
18*4882a593Smuzhiyun  for DDR3L and LPDDR3 SDRAMs.
19*4882a593Smuzhiyun
20*4882a593Smuzhiyunproperties:
21*4882a593Smuzhiyun  compatible:
22*4882a593Smuzhiyun    const: nvidia,tegra124-mc
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun  reg:
25*4882a593Smuzhiyun    maxItems: 1
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun  clocks:
28*4882a593Smuzhiyun    maxItems: 1
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun  clock-names:
31*4882a593Smuzhiyun    items:
32*4882a593Smuzhiyun      - const: mc
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun  interrupts:
35*4882a593Smuzhiyun    maxItems: 1
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun  "#reset-cells":
38*4882a593Smuzhiyun    const: 1
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun  "#iommu-cells":
41*4882a593Smuzhiyun    const: 1
42*4882a593Smuzhiyun
43*4882a593SmuzhiyunpatternProperties:
44*4882a593Smuzhiyun  "^emc-timings-[0-9]+$":
45*4882a593Smuzhiyun    type: object
46*4882a593Smuzhiyun    properties:
47*4882a593Smuzhiyun      nvidia,ram-code:
48*4882a593Smuzhiyun        $ref: /schemas/types.yaml#/definitions/uint32
49*4882a593Smuzhiyun        description:
50*4882a593Smuzhiyun          Value of RAM_CODE this timing set is used for.
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun    patternProperties:
53*4882a593Smuzhiyun      "^timing-[0-9]+$":
54*4882a593Smuzhiyun        type: object
55*4882a593Smuzhiyun        properties:
56*4882a593Smuzhiyun          clock-frequency:
57*4882a593Smuzhiyun            description:
58*4882a593Smuzhiyun              Memory clock rate in Hz.
59*4882a593Smuzhiyun            minimum: 1000000
60*4882a593Smuzhiyun            maximum: 1066000000
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun          nvidia,emem-configuration:
63*4882a593Smuzhiyun            $ref: /schemas/types.yaml#/definitions/uint32-array
64*4882a593Smuzhiyun            description: |
65*4882a593Smuzhiyun              Values to be written to the EMEM register block. See section
66*4882a593Smuzhiyun              "15.6.1 MC Registers" in the TRM.
67*4882a593Smuzhiyun            items:
68*4882a593Smuzhiyun              - description: MC_EMEM_ARB_CFG
69*4882a593Smuzhiyun              - description: MC_EMEM_ARB_OUTSTANDING_REQ
70*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_RCD
71*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_RP
72*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_RC
73*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_RAS
74*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_FAW
75*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_RRD
76*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_RAP2PRE
77*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_WAP2PRE
78*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_R2R
79*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_W2W
80*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_R2W
81*4882a593Smuzhiyun              - description: MC_EMEM_ARB_TIMING_W2R
82*4882a593Smuzhiyun              - description: MC_EMEM_ARB_DA_TURNS
83*4882a593Smuzhiyun              - description: MC_EMEM_ARB_DA_COVERS
84*4882a593Smuzhiyun              - description: MC_EMEM_ARB_MISC0
85*4882a593Smuzhiyun              - description: MC_EMEM_ARB_MISC1
86*4882a593Smuzhiyun              - description: MC_EMEM_ARB_RING1_THROTTLE
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun        required:
89*4882a593Smuzhiyun          - clock-frequency
90*4882a593Smuzhiyun          - nvidia,emem-configuration
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun        additionalProperties: false
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun    required:
95*4882a593Smuzhiyun      - nvidia,ram-code
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun    additionalProperties: false
98*4882a593Smuzhiyun
99*4882a593Smuzhiyunrequired:
100*4882a593Smuzhiyun  - compatible
101*4882a593Smuzhiyun  - reg
102*4882a593Smuzhiyun  - interrupts
103*4882a593Smuzhiyun  - clocks
104*4882a593Smuzhiyun  - clock-names
105*4882a593Smuzhiyun  - "#reset-cells"
106*4882a593Smuzhiyun  - "#iommu-cells"
107*4882a593Smuzhiyun
108*4882a593SmuzhiyunadditionalProperties: false
109*4882a593Smuzhiyun
110*4882a593Smuzhiyunexamples:
111*4882a593Smuzhiyun  - |
112*4882a593Smuzhiyun    memory-controller@70019000 {
113*4882a593Smuzhiyun        compatible = "nvidia,tegra124-mc";
114*4882a593Smuzhiyun        reg = <0x70019000 0x1000>;
115*4882a593Smuzhiyun        clocks = <&tegra_car 32>;
116*4882a593Smuzhiyun        clock-names = "mc";
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun        interrupts = <0 77 4>;
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun        #iommu-cells = <1>;
121*4882a593Smuzhiyun        #reset-cells = <1>;
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun        emc-timings-3 {
124*4882a593Smuzhiyun            nvidia,ram-code = <3>;
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun            timing-12750000 {
127*4882a593Smuzhiyun                clock-frequency = <12750000>;
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun                nvidia,emem-configuration = <
130*4882a593Smuzhiyun                    0x40040001 /* MC_EMEM_ARB_CFG */
131*4882a593Smuzhiyun                    0x8000000a /* MC_EMEM_ARB_OUTSTANDING_REQ */
132*4882a593Smuzhiyun                    0x00000001 /* MC_EMEM_ARB_TIMING_RCD */
133*4882a593Smuzhiyun                    0x00000001 /* MC_EMEM_ARB_TIMING_RP */
134*4882a593Smuzhiyun                    0x00000002 /* MC_EMEM_ARB_TIMING_RC */
135*4882a593Smuzhiyun                    0x00000000 /* MC_EMEM_ARB_TIMING_RAS */
136*4882a593Smuzhiyun                    0x00000002 /* MC_EMEM_ARB_TIMING_FAW */
137*4882a593Smuzhiyun                    0x00000001 /* MC_EMEM_ARB_TIMING_RRD */
138*4882a593Smuzhiyun                    0x00000002 /* MC_EMEM_ARB_TIMING_RAP2PRE */
139*4882a593Smuzhiyun                    0x00000008 /* MC_EMEM_ARB_TIMING_WAP2PRE */
140*4882a593Smuzhiyun                    0x00000003 /* MC_EMEM_ARB_TIMING_R2R */
141*4882a593Smuzhiyun                    0x00000002 /* MC_EMEM_ARB_TIMING_W2W */
142*4882a593Smuzhiyun                    0x00000003 /* MC_EMEM_ARB_TIMING_R2W */
143*4882a593Smuzhiyun                    0x00000006 /* MC_EMEM_ARB_TIMING_W2R */
144*4882a593Smuzhiyun                    0x06030203 /* MC_EMEM_ARB_DA_TURNS */
145*4882a593Smuzhiyun                    0x000a0402 /* MC_EMEM_ARB_DA_COVERS */
146*4882a593Smuzhiyun                    0x77e30303 /* MC_EMEM_ARB_MISC0 */
147*4882a593Smuzhiyun                    0x70000f03 /* MC_EMEM_ARB_MISC1 */
148*4882a593Smuzhiyun                    0x001f0000 /* MC_EMEM_ARB_RING1_THROTTLE */
149*4882a593Smuzhiyun                >;
150*4882a593Smuzhiyun            };
151*4882a593Smuzhiyun        };
152*4882a593Smuzhiyun    };
153