summaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorNicolin Chen <nicolinc@nvidia.com>2018-06-25 20:15:30 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-06-27 10:30:59 -0400
commitd0f76f97f4e6f535a169968ff9b9cd485a63e51a (patch)
tree8e9688737c43700ad374bc4dece67c39a56323c2 /include/linux
parentc58a1702dc63d2bf1c2cecd1c4846f16ea445b05 (diff)
platform: tegra: Import header files to nvidia repo
This patch imports downstream header files from K4.4, K4.9 and K4.14. Most of the header files are copied from K4.4 as it contains more files than the other two. But this change also merges additional changes from K4.9 and K4.14. Meanwhile it updates of license year. Bug 200424912 Change-Id: I6802a0d8c390bdbf430fe06f00dc174cc2b98a7d Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1761105 GVS: Gerrit_Virtual_Submit Reviewed-by: Sachin Nikam <snikam@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/platform/tegra/bwmgr_mc.h37
-rw-r--r--include/linux/platform/tegra/clock.h629
-rw-r--r--include/linux/platform/tegra/common.h62
-rw-r--r--include/linux/platform/tegra/cpu-tegra.h8
-rw-r--r--include/linux/platform/tegra/denver_mca.h69
-rw-r--r--include/linux/platform/tegra/dvfs.h443
-rw-r--r--include/linux/platform/tegra/emc_bwmgr.h393
-rw-r--r--include/linux/platform/tegra/iso_client.h33
-rw-r--r--include/linux/platform/tegra/isomgr.h215
-rw-r--r--include/linux/platform/tegra/mcerr.h176
-rw-r--r--include/linux/platform/tegra/reset.h115
-rw-r--r--include/linux/platform/tegra/tegra12_emc.h574
-rw-r--r--include/linux/platform/tegra/tegra21_emc.h1920
-rw-r--r--include/linux/platform/tegra/tegra_cl_dvfs.h159
-rw-r--r--include/linux/platform/tegra/tegra_mc.h84
-rw-r--r--include/linux/platform_data/thermal_sensors.h35
-rw-r--r--include/linux/tegra_throttle.h43
17 files changed, 4995 insertions, 0 deletions
diff --git a/include/linux/platform/tegra/bwmgr_mc.h b/include/linux/platform/tegra/bwmgr_mc.h
new file mode 100644
index 000000000..2aa7f8a72
--- /dev/null
+++ b/include/linux/platform/tegra/bwmgr_mc.h
@@ -0,0 +1,37 @@
1/**
2 * Copyright (c) 2015-2018, NVIDIA CORPORATION. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 */
13
14#ifndef __BWMGR_MC_H
15#define __BWMGR_MC_H
16
17#include <linux/types.h>
18#include <linux/platform/tegra/iso_client.h>
19
20unsigned long bwmgr_apply_efficiency(
21 unsigned long bw, unsigned long iso_bw,
22 unsigned long emc_max, u64 usage_flags,
23 unsigned long *iso_bw_min, unsigned long iso_bw_nvdis,
24 unsigned long iso_bw_vi);
25
26void bwmgr_eff_init(void);
27
28unsigned long bwmgr_freq_to_bw(unsigned long freq);
29unsigned long bwmgr_bw_to_freq(unsigned long bw);
30unsigned long bwmgr_get_lowest_iso_emc_freq(long iso_bw,
31 long iso_bw_nvdis, long iso_bw_vi);
32u32 tegra_bwmgr_get_max_iso_bw(enum tegra_iso_client);
33
34u32 bwmgr_dvfs_latency(u32 ufreq);
35int bwmgr_iso_bw_percentage_max(void);
36int bwmgr_get_emc_to_dram_freq_factor(void);
37#endif /* __BWMGR_MC_H */
diff --git a/include/linux/platform/tegra/clock.h b/include/linux/platform/tegra/clock.h
new file mode 100644
index 000000000..896bb01bc
--- /dev/null
+++ b/include/linux/platform/tegra/clock.h
@@ -0,0 +1,629 @@
1/*
2 * include/linux/platform/tegra/clock.h
3 *
4 * Copyright (C) 2010 Google, Inc.
5 *
6 * Author:
7 * Colin Cross <ccross@google.com>
8 *
9 * Copyright (c) 2010-2016, NVIDIA Corporation. All rights reserved.
10 *
11 * This software is licensed under the terms of the GNU General Public
12 * License version 2, as published by the Free Software Foundation, and
13 * may be copied, distributed, and modified under those terms.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 */
21
22#ifndef __MACH_TEGRA_CLOCK_H
23#define __MACH_TEGRA_CLOCK_H
24
25#define USE_PLL_LOCK_BITS 1 /* Use lock bits for PLL stabiliation */
26#define USE_PLLE_SS 1 /* Use spread spectrum coefficients for PLLE */
27#define PLL_PRE_LOCK_DELAY 2 /* Delay 1st lock bit read after pll enabled */
28#define USE_PLLE_SWCTL 0 /* Use s/w controls for PLLE */
29#define PLL_POST_LOCK_DELAY 10 /* Safety delay after lock is detected */
30
31#define RESET_PROPAGATION_DELAY 5
32
33#ifndef __ASSEMBLY__
34
35#include <linux/clk-provider.h>
36#include <linux/clkdev.h>
37#include <linux/clk.h>
38#include <linux/list.h>
39#include <linux/lockdep.h>
40#include <linux/mutex.h>
41#include <linux/spinlock.h>
42#include <linux/clk/tegra.h>
43#include <trace/events/power.h>
44#include <asm/cputime.h>
45
46#define MAX_SAME_LIMIT_SKU_IDS 16
47#define STATS_USERS_LIST_SIZE 16
48
49struct clk;
50
51#define DIV_BUS (1 << 0) /* system bus clock */
52#define DIV_U71 (1 << 1) /* divider is U7.1 (N/2 + 1) */
53#define DIV_U71_FIXED (1 << 2) /* divider is U7.1 and fixed unless reprogrammed by SW */
54#define DIV_2 (1 << 3) /* clock output is divided by 2 */
55#define DIV_U16 (1 << 4) /* divider is (N + 1) */
56#define PLL_FIXED (1 << 5) /* PLL runs at fixed rate */
57#define PLL_HAS_CPCON (1 << 6) /* PLL has CPCON value in its configuration register */
58#define MUX (1 << 7) /* this clock uses a mux to select one of the input sources */
59#define PLLD (1 << 8) /* clock is PLLD */
60#define PERIPH_NO_RESET (1 << 9) /* doesn't have separate reset bit in the register */
61#define PERIPH_NO_ENB (1 << 10) /* does not have clock enable bit in the register */
62#define PERIPH_EMC_ENB (1 << 11) /* this peripheral clock is EMC */
63#define PERIPH_MANUAL_RESET (1 << 12) /* don't take module out of reset automatically, when enabling clock */
64#define PLL_ALT_MISC_REG (1 << 13) /* use alternate offset for PLL misc registers */
65#define PLLU (1 << 14) /* PLL is PLLU */
66#define PLLX (1 << 15) /* PLL is PLLX */
67#define MUX_PWM (1 << 16) /* deprecated for T124 onwards */
68#define MUX8 (1 << 17) /* used in simulator setting for T124 onwards */
69#define DIV_U151_UART (1 << 18) /* 16-bit uart divider with dual CAR/UART control */
70#define MUX_CLK_OUT (1 << 19) /* used to locate extperiph clock registers */
71#define PLLM (1 << 20) /* PLL is PLLM */
72#define DIV_U71_INT (1 << 21) /* fractional divider is not allowed for this clock */
73#define DIV_U71_IDLE (1 << 22) /* clock has a separate idle state divider that is automatically
74 engaged when module is idle */
75#define DIV_U151 (1 << 23) /* divider will be U15.1 for this clock */
76#define DFLL (1 << 24) /* this clock has closed loop control in h/w */
77#define ENABLE_ON_INIT (1 << 28) /* enable during initialization (deprecated) */
78#define PERIPH_ON_APB (1 << 29) /* this peripheral is on APB */
79#define PERIPH_ON_CBUS (1 << 30) /* this peripheral is on one of the PLLCx bus */
80#define BUS_RATE_LIMIT (1 << 31) /* Clock used to apply constraints on shared buses
81 (don't propagate enable/disable to the bus) */
82
83#define SHARED_BUS_RETENTION (1 << 0)
84#define SHARED_BUS_USE_SKIPPERS (1 << 1)
85
86#define PERIPH_DIV (DIV_U71 | DIV_U151 | DIV_U16)
87#define PERIPH_INIT_SAFE_RATE 12000000
88
89#ifdef CONFIG_COMMON_CLK
90struct clk_tegra;
91#define to_clk_tegra(_hw) container_of(_hw, struct clk_tegra, hw)
92#endif
93
94struct clk_mux_sel {
95 struct clk *input;
96 u32 value;
97};
98
99struct clk_backup {
100 struct clk *input;
101 u32 value;
102 unsigned long bus_rate;
103};
104
105struct clk_pll_freq_table {
106 unsigned long input_rate;
107 unsigned long output_rate;
108 u16 n;
109 u16 m;
110 u8 p;
111 u8 cpcon;
112 u16 sdm_data;
113};
114
115struct clk_pll_div_layout {
116 /* base dividers */
117 u32 ndiv_shift;
118 u32 ndiv_mask;
119 u32 mdiv_shift;
120 u32 mdiv_mask;
121 u32 pdiv_shift;
122 u32 pdiv_mask;
123 u8 *pdiv_to_p;
124 u8 pdiv_max;
125
126 /* misc dividers */
127 u32 ndiv_new_shift;
128 u32 ndiv_new_reg_idx;
129 u32 sdm_din_mask;
130 u32 sdm_din_shift;
131 u32 sdm_din_reg_idx;
132};
133
134struct clk_pll_controls {
135 u32 enable_mask;
136 u32 bypass_mask;
137
138 u32 reset_mask;
139 u32 reset_reg_idx;
140 u32 iddq_mask;
141 u32 iddq_reg_idx;
142 u32 lock_mask;
143 u32 lock_reg_idx;
144
145 u32 dramp_en_mask;
146 u32 dramp_done_mask;
147 u32 dramp_ctrl_reg_idx;
148 u32 sdm_en_mask;
149 u32 ssc_en_mask;
150 u32 sdm_ctrl_reg_idx;
151};
152
153enum pll_reg_indx {
154 PLL_BASE_IDX = 0,
155 PLL_MISC0_IDX,
156 PLL_MISC1_IDX,
157 PLL_MISC2_IDX,
158 PLL_MISC3_IDX,
159 PLL_MISC4_IDX,
160 PLL_MISC5_IDX,
161};
162
163enum clk_state {
164 UNINITIALIZED = 0,
165 ON,
166 OFF,
167};
168
169struct tegra_pto_table {
170 char *name;
171 int divider;
172 u32 pto_id;
173 u32 presel_value;
174 u32 presel_reg;
175 u32 presel_mask;
176};
177
178#ifndef CONFIG_COMMON_CLK
179struct clk_ops {
180 void (*init)(struct clk *);
181 int (*enable)(struct clk *);
182 void (*disable)(struct clk *);
183 int (*set_parent)(struct clk *, struct clk *);
184 int (*set_rate)(struct clk *, unsigned long);
185 long (*round_rate)(struct clk *, unsigned long);
186 void (*reset)(struct clk *, bool);
187 int (*shared_bus_update)(struct clk *);
188 int (*clk_cfg_ex)(struct clk *,
189 enum tegra_clk_ex_param, u32);
190 long (*round_rate_updown)(struct clk *, unsigned long, bool);
191};
192
193struct bus_stats {
194 cputime64_t *time_table;
195 struct clk *users_list[STATS_USERS_LIST_SIZE];
196 int users_num;
197 int rates_num;
198 int new_cap_idx;
199 int new_floor_idx;
200 int new_rate_idx;
201 int last_user_idx;
202 int last_rate_idx;
203 u64 last_update;
204};
205
206struct clk_stats {
207 struct bus_stats *histogram;
208 cputime64_t time_on;
209 u64 last_update;
210};
211
212enum cpu_mode {
213 MODE_G = 0,
214 MODE_LP,
215};
216
217enum shared_bus_users_mode {
218 SHARED_FLOOR = 0,
219 SHARED_BW,
220 SHARED_CEILING,
221 SHARED_AUTO,
222 SHARED_OVERRIDE,
223 SHARED_ISO_BW,
224 SHARED_CEILING_BUT_ISO,
225};
226
227struct clk {
228 /* node for master clocks list */
229 struct list_head node; /* node for list of all clocks */
230 struct dvfs *dvfs;
231 struct clk_lookup lookup;
232
233#ifdef CONFIG_DEBUG_FS
234 struct dentry *dent;
235 struct tegra_pto_table *pto_entry;
236#endif
237 bool set;
238 struct clk_ops *ops;
239 unsigned long dvfs_rate;
240 unsigned long rate;
241 unsigned long boot_rate;
242 unsigned long max_rate;
243 unsigned long min_rate;
244 bool auto_dvfs;
245 bool cansleep;
246 bool set_disabled_div;
247 u32 flags;
248 u32 clk_id;
249 const char *name;
250
251 u32 refcnt;
252 enum clk_state state;
253 struct clk *parent;
254 u32 div;
255 u32 mul;
256 struct clk *skipper;
257 struct clk_stats stats;
258
259 const struct clk_mux_sel *inputs;
260 u32 reg;
261 u32 reg_shift;
262
263#ifdef CONFIG_LOCKDEP
264 struct lock_class_key lockdep_class;
265#endif
266
267 struct list_head shared_bus_list;
268 struct clk_backup shared_bus_backup;
269 struct clk *child_bus;
270 unsigned long override_rate;
271 u32 shared_bus_flags;
272
273 union {
274 struct {
275 unsigned int clk_num;
276 u32 src_mask;
277 u32 src_shift;
278 struct clk *pll_low;
279 struct clk *pll_high;
280 struct clk *pll_selected;
281 unsigned long threshold;
282 int min_div_low;
283 int min_div_high;
284 } periph;
285 struct {
286 unsigned long input_min;
287 unsigned long input_max;
288 unsigned long cf_min;
289 unsigned long cf_max;
290 unsigned long vco_min;
291 unsigned long vco_max;
292 u16 mdiv_default;
293 u8 cpcon_default;
294 const struct clk_pll_freq_table *freq_table;
295 int lock_delay;
296 unsigned long fixed_rate;
297 u32 misc0;
298 u32 misc1;
299 u32 misc2;
300 u32 misc3;
301 u32 misc4;
302 u32 misc5;
303 bool defaults_set;
304 bool vco_out;
305 struct clk_pll_controls *controls;
306 struct clk_pll_div_layout *div_layout;
307 u32 (*round_p_to_pdiv)(u32 p, u32 *pdiv);
308 int (*dyn_ramp)(struct clk *c,
309 struct clk_pll_freq_table *cfg);
310 void (*set_defaults)(struct clk *c,
311 unsigned long input_rate);
312 } pll;
313 struct {
314 void *cl_dvfs;
315 struct clk *consumer;
316 } dfll;
317 struct {
318 unsigned long default_rate;
319 } pll_div;
320 struct {
321 u32 sel;
322 u32 reg_mask;
323 } mux;
324 struct {
325 struct clk *main;
326 struct clk *backup;
327 struct clk *dynamic;
328 unsigned long edp_safe_rate;
329 unsigned long backup_rate;
330 seqcount_t backup_seqcnt;
331 enum cpu_mode mode;
332 } cpu;
333 struct {
334 u32 div71;
335 } cclk;
336 struct {
337 struct clk *pclk;
338 struct clk *hclk;
339 struct clk *sclk_low;
340 struct clk *sclk_high;
341 unsigned long threshold;
342 } system;
343 struct {
344 struct clk *top_user;
345 struct clk *slow_user;
346 } cbus;
347 struct {
348 struct list_head node;
349 bool enabled;
350 unsigned long rate;
351 const char *client_id;
352 struct clk *client;
353 u32 client_div;
354 enum shared_bus_users_mode mode;
355 u32 usage_flag;
356 int stats_idx;
357 } shared_bus_user;
358 struct {
359 struct tegra_clk_export_ops *ops;
360 } export_clk;
361 } u;
362
363 struct raw_notifier_head *rate_change_nh;
364 wait_queue_head_t *debug_poll_qh;
365 int rate_changed;
366
367 struct mutex *cross_clk_mutex;
368 struct mutex mutex;
369 spinlock_t spinlock;
370 unsigned long fixed_target_rate;
371};
372
373#else
374
375struct clk_tegra {
376 /* node for master clocks list */
377 struct list_head node; /* node for list of all clocks */
378 struct clk_lookup lookup;
379 struct clk_hw hw;
380
381 bool set;
382 unsigned long fixed_rate;
383 unsigned long max_rate;
384 unsigned long min_rate;
385 u32 flags;
386 const char *name;
387
388 enum clk_state state;
389 u32 div;
390 u32 mul;
391
392 u32 reg;
393 u32 reg_shift;
394
395 struct list_head shared_bus_list;
396
397 union {
398 struct {
399 unsigned int clk_num;
400 } periph;
401 struct {
402 unsigned long input_min;
403 unsigned long input_max;
404 unsigned long cf_min;
405 unsigned long cf_max;
406 unsigned long vco_min;
407 unsigned long vco_max;
408 const struct clk_pll_freq_table *freq_table;
409 int lock_delay;
410 unsigned long fixed_rate;
411 } pll;
412 struct {
413 u32 sel;
414 u32 reg_mask;
415 } mux;
416 struct {
417 struct clk *main;
418 struct clk *backup;
419 } cpu;
420 struct {
421 struct list_head node;
422 bool enabled;
423 unsigned long rate;
424 } shared_bus_user;
425 } u;
426
427 void (*reset)(struct clk_hw *, bool);
428 int (*clk_cfg_ex)(struct clk_hw *, enum tegra_clk_ex_param, u32);
429};
430#endif /* !CONFIG_COMMON_CLK */
431
432struct clk_duplicate {
433 const char *name;
434 struct clk_lookup lookup;
435};
436
437struct tegra_clk_init_table {
438 const char *name;
439 const char *parent;
440 unsigned long rate;
441 bool enabled;
442 unsigned long platform;
443 struct clk *c; /* clock to be initialized */
444 struct clk *p; /* clock parent specified in the table */
445};
446
447#define TEGRA_CLK_INIT_PLATFORM_ALL 0
448#define TEGRA_CLK_INIT_PLATFORM_SI BIT(0)
449#define TEGRA_CLK_INIT_PLATFORM_QT BIT(1)
450#define TEGRA_CLK_INIT_PLATFORM_FPGA BIT(2)
451#define TEGRA_CLK_INIT_PLATFORM_LINSIM BIT(3)
452#define TEGRA_CLK_INIT_CPU_ASIM BIT(4)
453#define TEGRA_CLK_INIT_PLATFORM_NON_SI (BIT(1) | BIT(2) | BIT(3))
454
455#ifndef CONFIG_COMMON_CLK
456void tegra_init_max_rate(struct clk *c, unsigned long max_rate);
457void tegra_init_min_rate(struct clk *c, unsigned long min_rate);
458void tegra_clk_preset_emc_monitor(unsigned long rate);
459void tegra_periph_clk_safe_rate_init(struct clk *c);
460void tegra_clk_verify_parents(void);
461void tegra_clk_set_disabled_div_all(void);
462void clk_init(struct clk *clk);
463unsigned long tegra_clk_measure_input_freq(void);
464unsigned long clk_get_rate_locked(struct clk *c);
465void tegra_clk_init_from_dt(const char *dt_table_name);
466void tegra_clk_init_cbus_plls_from_table(struct tegra_clk_init_table *table);
467void clk_set_cansleep(struct clk *c);
468unsigned long clk_get_min_rate(struct clk *c);
469unsigned long clk_get_max_rate(struct clk *c);
470bool tegra_is_clk_initialized(struct clk *c);
471
472int clk_set_rate_locked(struct clk *c, unsigned long rate);
473int clk_rate_change_notify(struct clk *c, unsigned long rate);
474int clk_set_parent_locked(struct clk *c, struct clk *parent);
475int clk_reparent(struct clk *c, struct clk *parent);
476long clk_round_rate_locked(struct clk *c, unsigned long rate);
477int tegra_clk_shared_bus_update(struct clk *c);
478int tegra_clk_shared_bus_update_locked(struct clk *c);
479void tegra3_set_cpu_skipper_delay(int delay);
480unsigned long tegra_clk_measure_input_freq(void);
481int clk_enable_locked(struct clk *c);
482void clk_disable_locked(struct clk *c);
483bool tegra_clk_is_parent_allowed(struct clk *c, struct clk *p);
484#endif /* !CONFIG_COMMON_CLK */
485
486struct tegra_sku_rate_limit {
487 const char *clk_name;
488 unsigned long max_rate;
489 int sku_ids[MAX_SAME_LIMIT_SKU_IDS];
490};
491
492void tegra2_init_clocks(void);
493void tegra30_init_clocks(void);
494void tegra11x_init_clocks(void);
495void tegra12x_init_clocks(void);
496void tegra21x_init_clocks(void);
497void tegra11x_clk_init_la(void);
498void tegra_common_init_clock(void);
499struct clk *tegra_get_clock_by_name(const char *name);
500
501void tegra_clk_init_from_table(struct tegra_clk_init_table *table);
502
503/* Reset driver through Reset framework */
504extern int tegra_non_dt_clock_reset_init(void);
505
506/**
507 * Returns dfll requested booting frequency, which
508 * is configured by bootloader as cpu clock source.
509 * If booting with different cpu clock source then,
510 * returns 0.
511 */
512unsigned long int tegra_dfll_boot_req_khz(void);
513
514#ifndef CONFIG_COMMON_CLK
515void tegra_shared_bus_stats_allocate(struct clk *c, struct bus_stats *stats);
516int tegra_shared_bus_stats_copy_to_buffer(
517 struct clk *c, struct bus_stats *stats, char *buf, int len);
518void tegra_shared_bus_stats_update(
519 struct bus_stats *stats, int user_idx, int rate_idx);
520
521int clk_config_cpu_edp_safe_rate(struct clk *cpu, struct clk *cluster_clk,
522 unsigned long rate);
523
524static inline unsigned long clk_get_cpu_edp_safe_rate(struct clk *cluster_clk)
525{
526 return cluster_clk->u.cpu.edp_safe_rate;
527}
528
529static inline void tegra_dfll_set_cl_dvfs_data(struct clk *c, void *cld)
530{
531 if (c->flags & DFLL)
532 c->u.dfll.cl_dvfs = cld;
533}
534
535static inline void *tegra_dfll_get_cl_dvfs_data(struct clk *c)
536{
537 return c->flags & DFLL ? c->u.dfll.cl_dvfs : ERR_PTR(-ENODATA);
538}
539
540static inline bool clk_is_auto_dvfs(struct clk *c)
541{
542 return c->auto_dvfs;
543}
544
545static inline bool clk_is_dvfs(struct clk *c)
546{
547 return (c->dvfs != NULL);
548}
549
550static inline bool clk_cansleep(struct clk *c)
551{
552 return c->cansleep;
553}
554
555static inline bool clk_can_set_disabled_div(struct clk *c)
556{
557 return c->set_disabled_div;
558}
559
560static inline void clk_lock_save(struct clk *c, unsigned long *flags)
561{
562 if (clk_cansleep(c)) {
563 *flags = 0;
564 mutex_lock(&c->mutex);
565 if (c->cross_clk_mutex)
566 mutex_lock(c->cross_clk_mutex);
567 } else {
568 spin_lock_irqsave(&c->spinlock, *flags);
569 }
570}
571
572static inline void clk_unlock_restore(struct clk *c, unsigned long *flags)
573{
574 if (clk_cansleep(c)) {
575 if (c->cross_clk_mutex)
576 mutex_unlock(c->cross_clk_mutex);
577 mutex_unlock(&c->mutex);
578 } else {
579 spin_unlock_irqrestore(&c->spinlock, *flags);
580 }
581}
582
583static inline int tegra_clk_prepare_enable(struct clk *c)
584{
585 if (clk_cansleep(c))
586 return clk_prepare_enable(c);
587 return clk_enable(c);
588}
589
590static inline void tegra_clk_disable_unprepare(struct clk *c)
591{
592 if (clk_cansleep(c))
593 clk_disable_unprepare(c);
594 else
595 clk_disable(c);
596}
597
598static inline void clk_lock_init(struct clk *c)
599{
600 mutex_init(&c->mutex);
601 spin_lock_init(&c->spinlock);
602}
603#endif
604
605#ifdef CONFIG_DEBUG_FS
606
607/* Extended version of the standard macro with poll function setting */
608#define DEFINE_SIMPLE_POLL_ATTRIBUTE(__fops, __get, __set, __poll, __fmt) \
609static int __fops ## _open(struct inode *inode, struct file *file) \
610{ \
611 __simple_attr_check_format(__fmt, 0ull); \
612 return simple_attr_open(inode, file, __get, __set, __fmt); \
613} \
614static const struct file_operations __fops = { \
615 .owner = THIS_MODULE, \
616 .open = __fops ## _open, \
617 .release = simple_attr_release, \
618 .read = simple_attr_read, \
619 .write = simple_attr_write, \
620 .llseek = generic_file_llseek, \
621 .poll = __poll, \
622};
623
624void tegra_clk_add_pto_entries(struct tegra_pto_table *pto_table);
625
626#endif
627
628#endif
629#endif
diff --git a/include/linux/platform/tegra/common.h b/include/linux/platform/tegra/common.h
new file mode 100644
index 000000000..1743d67d7
--- /dev/null
+++ b/include/linux/platform/tegra/common.h
@@ -0,0 +1,62 @@
1/*
2 * Copyright (C) 2011-2018, NVIDIA Corporation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#ifndef __MACH_TEGRA_COMMON_H
18#define __MACH_TEGRA_COMMON_H
19
20extern struct smp_operations tegra_smp_ops;
21
22extern phys_addr_t tegra_tsec_start;
23extern phys_addr_t tegra_tsec_size;
24
25#ifdef CONFIG_CACHE_L2X0
26void tegra_init_cache(bool init);
27#else
28static inline void tegra_init_cache(bool init) {}
29#endif
30
31extern void tegra_cpu_die(unsigned int cpu);
32extern int tegra_cpu_kill(unsigned int cpu);
33extern phys_addr_t tegra_avp_kernel_start;
34extern phys_addr_t tegra_avp_kernel_size;
35void ahb_gizmo_writel(unsigned long val, void __iomem *reg);
36
37extern struct device tegra_generic_cma_dev;
38extern struct device tegra_vpr_cma_dev;
39extern int tegra_with_secure_firmware;
40
41extern struct device tegra_generic_dev;
42extern struct device tegra_vpr_dev;
43extern struct device tegra_iram_dev;
44extern struct dma_resize_notifier_ops vpr_dev_ops;
45
46u32 tegra_get_bct_strapping(void);
47u32 tegra_get_fuse_opt_subrevision(void);
48enum tegra_revision tegra_chip_get_revision(void);
49void __init display_tegra_dt_info(void);
50
51void tegra_register_idle_unidle(int (*do_idle)(void *),
52 int (*do_unidle)(void *),
53 void *data);
54void tegra_unregister_idle_unidle(int (*do_idle)(void *));
55
56static inline int tegra_cpu_is_secure(void)
57{
58 return tegra_with_secure_firmware;
59}
60
61int tegra_state_idx_from_name(char *state_name);
62#endif
diff --git a/include/linux/platform/tegra/cpu-tegra.h b/include/linux/platform/tegra/cpu-tegra.h
index 344ab94d5..494939887 100644
--- a/include/linux/platform/tegra/cpu-tegra.h
+++ b/include/linux/platform/tegra/cpu-tegra.h
@@ -22,6 +22,7 @@
22#define __MACH_TEGRA_CPU_TEGRA_H 22#define __MACH_TEGRA_CPU_TEGRA_H
23 23
24#include <linux/fs.h> 24#include <linux/fs.h>
25#include <linux/tegra_throttle.h>
25 26
26unsigned int tegra_getspeed(unsigned int cpu); 27unsigned int tegra_getspeed(unsigned int cpu);
27int tegra_update_cpu_speed(unsigned long rate); 28int tegra_update_cpu_speed(unsigned long rate);
@@ -88,6 +89,13 @@ static inline int tegra_cpu_reg_mode_force_normal(bool force)
88{ return 0; } 89{ return 0; }
89#endif 90#endif
90 91
92#ifdef CONFIG_TEGRA_CPU_VOLT_CAP
93struct tegra_cooling_device *tegra_vc_get_cdev(void);
94#else
95static inline struct tegra_cooling_device *tegra_vc_get_cdev(void)
96{ return NULL; }
97#endif
98
91#ifdef CONFIG_TEGRA_HMP_CLUSTER_CONTROL 99#ifdef CONFIG_TEGRA_HMP_CLUSTER_CONTROL
92unsigned long lp_to_virtual_gfreq(unsigned long lp_freq); 100unsigned long lp_to_virtual_gfreq(unsigned long lp_freq);
93int tegra_cpu_volt_cap_apply(int *cap_idx, int new_idx, int level); 101int tegra_cpu_volt_cap_apply(int *cap_idx, int new_idx, int level);
diff --git a/include/linux/platform/tegra/denver_mca.h b/include/linux/platform/tegra/denver_mca.h
new file mode 100644
index 000000000..9262015cd
--- /dev/null
+++ b/include/linux/platform/tegra/denver_mca.h
@@ -0,0 +1,69 @@
1/*
2 * Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 */
13
14/* Template for MCA bank register accessors */
15#define DENVER_MCA_OP(bank, reg, crm, op2) \
16static u64 denver_mca_ ##reg##_##bank(void) \
17{ \
18 u64 ret; \
19 asm volatile ("mrs %0, s3_0_c15_c" #crm "_" #op2 : "=r"(ret)); \
20 return ret; \
21}
22
23/* A macro to instanciate all of the register accessors in the bank */
24#define DEFINE_DENVER_MCA_OPS(bank, \
25 crm_ctrl, op2_ctrl, \
26 crm_stat, op2_stat, \
27 crm_addr, op2_addr, \
28 crm_msc1, op2_msc1, \
29 crm_msc2, op2_msc2) \
30 DENVER_MCA_OP(bank, ctrl, crm_ctrl, op2_ctrl) \
31 DENVER_MCA_OP(bank, stat, crm_stat, op2_stat) \
32 DENVER_MCA_OP(bank, addr, crm_addr, op2_addr) \
33 DENVER_MCA_OP(bank, msc1, crm_msc1, op2_msc1) \
34 DENVER_MCA_OP(bank, msc2, crm_msc2, op2_msc2)
35
36struct denver_mca_error {
37 char *name;
38 u16 error_code;
39};
40
41struct denver_mca_bank {
42 struct list_head node;
43 char *name;
44 u64 bank;
45 struct denver_mca_error *errors;
46 u64 (*ctrl)(void);
47 u64 (*stat)(void);
48 u64 (*addr)(void);
49 u64 (*msc1)(void);
50 u64 (*msc2)(void);
51 u8 processed;
52};
53
54/* Helper macro for filling in struct denver_mca_bank */
55#define DENVER_MCA_OP_ENTRY(_bank) \
56 .bank = _bank, \
57 .ctrl = denver_mca_ctrl_ ## _bank, \
58 .stat = denver_mca_stat_ ## _bank, \
59 .addr = denver_mca_addr_ ## _bank, \
60 .msc1 = denver_mca_msc1_ ## _bank, \
61 .msc2 = denver_mca_msc2_ ## _bank
62
63/* Helper macro for a denver_mca_bank without a denver_mca_error */
64#define SIMPLE_DENVER_MCA_OP_ENTRY(_name, _bank) \
65 .name = _name, \
66 DENVER_MCA_OP_ENTRY(_bank)
67
68void register_denver_mca_bank(struct denver_mca_bank *bank);
69void unregister_denver_mca_bank(struct denver_mca_bank *bank);
diff --git a/include/linux/platform/tegra/dvfs.h b/include/linux/platform/tegra/dvfs.h
new file mode 100644
index 000000000..23253edb0
--- /dev/null
+++ b/include/linux/platform/tegra/dvfs.h
@@ -0,0 +1,443 @@
1/*
2 *
3 * Copyright (C) 2010 Google, Inc.
4 *
5 * Author:
6 * Colin Cross <ccross@google.com>
7 *
8 * Copyright (c) 2010-2016 NVIDIA CORPORATION. All rights reserved.
9 *
10 * This software is licensed under the terms of the GNU General Public
11 * License version 2, as published by the Free Software Foundation, and
12 * may be copied, distributed, and modified under those terms.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 */
20
21#ifndef _TEGRA_DVFS_H_
22#define _TEGRA_DVFS_H_
23
24#include <linux/of.h>
25#include <linux/tegra_throttle.h>
26
27#define MAX_DVFS_FREQS 40
28#define MAX_DVFS_TABLES 80
29#define DVFS_RAIL_STATS_TOP_BIN 100
30#define MAX_THERMAL_LIMITS 8
31#define MAX_THERMAL_RANGES (MAX_THERMAL_LIMITS + 1)
32
33struct clk;
34struct dvfs_rail;
35
36/*
37 * dvfs_relationship between to rails, "from" and "to"
38 * when the rail changes, it will call dvfs_rail_update on the rails
39 * in the relationship_to list.
40 * when determining the voltage to set a rail to, it will consider each
41 * rail in the relationship_from list.
42 */
43struct dvfs_relationship {
44 struct dvfs_rail *to;
45 struct dvfs_rail *from;
46 int (*solve)(struct dvfs_rail *, struct dvfs_rail *);
47
48 struct list_head to_node; /* node in relationship_to list */
49 struct list_head from_node; /* node in relationship_from list */
50 bool solved_at_nominal;
51 bool solved_at_suspend;
52};
53
54struct rail_stats {
55 ktime_t time_at_mv[DVFS_RAIL_STATS_TOP_BIN + 1];
56 ktime_t last_update;
57 int last_index;
58 bool off;
59 int bin_uV;
60};
61
62struct rail_alignment {
63 int offset_uv;
64 int step_uv; /* Step voltage */
65};
66
67struct dvfs_rail {
68 const char *reg_id;
69 int min_millivolts;
70 int max_millivolts;
71 int reg_max_millivolts;
72 int nominal_millivolts; /* Max DVFS voltage */
73 int fixed_millivolts;
74 int override_millivolts;
75 int min_override_millivolts;
76 int override_unresolved;
77 int (*resolve_override)(int mv);
78
79 const int *therm_mv_floors;
80 const int *therm_mv_dfll_floors;
81 int therm_mv_floors_num;
82 const int *therm_mv_caps;
83 int therm_mv_caps_num;
84 const int *simon_vmin_offsets;
85 int simon_vmin_offs_num;
86 int simon_domain;
87
88 int step;
89 int step_up;
90 bool jmp_to_zero;
91 bool in_band_pm;
92 bool disabled;
93 bool updating;
94 bool resolving_to;
95 bool rate_set;
96 bool dt_reg_fixed;
97 bool dt_reg_pwm;
98
99 struct device_node *dt_node; /* device tree rail node */
100 struct list_head node; /* node in dvfs_rail_list */
101 struct list_head dvfs; /* list head of attached dvfs clocks */
102 struct list_head relationships_to;
103 struct list_head relationships_from;
104 struct regulator *reg;
105 int millivolts;
106 int new_millivolts;
107 int dbg_mv_offs;
108 int boot_millivolts;
109 int disable_millivolts;
110 int suspend_millivolts; /* voltage setting set during suspend */
111
112 bool suspended;
113 bool dfll_mode; /* DFLL mode ON/OFF */
114 bool dfll_mode_updating;
115
116 int therm_floor_idx; /* index of vmin thermal range */
117 int therm_cap_idx; /* index of vmax thermal range */
118 int therm_scale_idx; /* index of thermal DVFS or clk source range */
119
120 /* Trips for vmin cooling device */
121 struct tegra_cooling_device *vmin_cdev;
122
123 /* Trips for vmax cooling device */
124 struct tegra_cooling_device *vmax_cdev;
125
126 /* Trips for thermal DVFS cooling device */
127 struct tegra_cooling_device *vts_cdev;
128
129 /* Trips for clock source switch cooling device */
130 struct tegra_cooling_device *clk_switch_cdev;
131
132 /* Vmax capping method */
133 int (*apply_vmax_cap)(int *cap_idx, int new_idx, int cap_mv);
134
135 struct rail_alignment alignment;
136 struct rail_stats stats;
137 const char *version;
138};
139
140/*
141 * dfll_range -
142 * DFLL_RANGE_NONE : DFLL is not used
143 * DFLL_RANGE_ALL_RATES : DFLL is is used for all CPU rates
144 * DFLL_RANGE_HIGH_RATES : DFLL is used only for high rates
145 * above crossover with PLL dvfs curve
146 */
147enum dfll_range {
148 DFLL_RANGE_NONE = 0,
149 DFLL_RANGE_ALL_RATES,
150 DFLL_RANGE_HIGH_RATES,
151};
152
153/* DFLL usage is under thermal cooling device control */
154#define TEGRA_USE_DFLL_CDEV_CNTRL 3
155
156extern int tegra_override_dfll_range;
157
158/* DVFS settings specific for DFLL clock source */
159struct dvfs_dfll_data {
160 u32 tune0;
161 u32 tune0_high_mv;
162 u32 tune0_simon_mask;
163 u32 tune1;
164 bool tune0_low_at_cold;
165
166 unsigned long droop_rate_min;
167 unsigned long use_dfll_rate_min;
168 unsigned long out_rate_min;
169 unsigned long max_rate_boost;
170 /* Boot frequency if DFLL is enabled by boot-loader; zero otherwise */
171 unsigned long dfll_boot_khz;
172
173 int tune_high_min_millivolts;
174 int tune_high_margin_mv;
175 int min_millivolts;
176 enum dfll_range range;
177 void (*tune_trimmers)(bool trim_high);
178 unsigned int (*is_bypass_down)(void);
179};
180
181/* DVFS settings specific for PLL clock source */
182struct dvfs_pll_data {
183 int min_millivolts;
184};
185
186struct dvfs {
187 const char *clk_name;
188 struct clk *clk;
189 int speedo_id;
190 int process_id;
191
192 /* Must be initialized before tegra_dvfs_init */
193 int freqs_mult;
194 unsigned long freqs[MAX_DVFS_FREQS];
195 const int *millivolts;
196 const int *peak_millivolts;
197 /* voltage settings as per DFLL clock source */
198 const int *dfll_millivolts;
199 struct dvfs_rail *dvfs_rail;
200 bool auto_dvfs;
201 bool can_override;
202 bool defer_override;
203 bool boost_table;
204
205 /* Filled in by tegra_dvfs_init */
206 int max_millivolts;
207 int num_freqs;
208 struct dvfs_dfll_data dfll_data;
209
210 /* Set if clock rate is adapted by h/w to voltage noise (noise-aware) */
211 bool na_dvfs;
212 /* Indicates thermal DVFS on/off */
213 bool therm_dvfs;
214 /* Maximum rate safe at minimum voltage across all thermal ranges */
215 unsigned long fmax_at_vmin_safe_t;
216
217 /*
218 * Current dvfs point = { index into V/F arrays, voltage, rate request }
219 * cur_index is invalid - set to MAX_DVFS_FREQS - if cur_rate and
220 * cur_millivolts are set to zero (may happen when dvfs rate is not set
221 * initially, or clock is disabled).
222 */
223 int cur_index;
224 int cur_millivolts;
225 unsigned long cur_rate;
226
227 unsigned long *alt_freqs;
228 bool use_alt_freqs;
229 long dbg_hz_offs;
230 struct list_head node;
231 struct list_head debug_node;
232 struct list_head reg_node;
233 struct mutex *lock;
234};
235
236/* CVB coefficients */
237struct cvb_dvfs_parameters {
238 int c0;
239 int c1;
240 int c2;
241 int c3;
242 int c4;
243 int c5;
244};
245
246struct cvb_dvfs_table {
247 unsigned long freq;
248
249 /* Coeffs for voltage calculation, when dfll clock source is selected */
250 struct cvb_dvfs_parameters cvb_dfll_param;
251
252 /* Coeffs for voltage calculation, when pll clock source is selected */
253 struct cvb_dvfs_parameters cvb_pll_param;
254};
255
256struct cvb_dvfs {
257 int speedo_id;
258 int process_id;
259
260 /* Tuning parameters for dfll */
261 struct dvfs_dfll_data dfll_tune_data;
262
263 /* tuning parameters for pll clock */
264 struct dvfs_pll_data pll_tune_data;
265
266 /* dvfs Max voltage */
267 int max_mv;
268
269 /* dvfs Max frequency */
270 unsigned long max_freq;
271 int freqs_mult;
272
273 /* scaling values for voltage calculation */
274 int speedo_scale;
275 int voltage_scale;
276 int thermal_scale;
277
278 struct cvb_dvfs_table cvb_vmin;
279
280 /* CVB table for various frequencies */
281 struct cvb_dvfs_table cvb_table[MAX_DVFS_FREQS];
282
283 /* Trips for minimal voltage settings per thermal ranges */
284 int vmin_trips_table[MAX_THERMAL_LIMITS];
285 int therm_floors_table[MAX_THERMAL_LIMITS];
286
287 /* Trips for thermal DVFS per thermal ranges */
288 int vts_trips_table[MAX_THERMAL_LIMITS];
289
290 /* Trips for clock source change per thermal ranges */
291 int clk_switch_trips[MAX_THERMAL_LIMITS];
292};
293
294#define cpu_cvb_dvfs cvb_dvfs
295#define gpu_cvb_dvfs cvb_dvfs
296#define core_cvb_dvfs cvb_dvfs
297
298extern struct dvfs_rail *tegra_cpu_rail;
299extern struct dvfs_rail *tegra_gpu_rail;
300extern struct dvfs_rail *tegra_core_rail;
301
302struct dvfs_data {
303 struct dvfs_rail *rail;
304 struct dvfs *tables;
305 int *millivolts;
306 unsigned int num_tables;
307 unsigned int num_voltages;
308};
309
310#ifdef CONFIG_OF
311typedef int (*of_tegra_dvfs_init_cb_t)(struct device_node *);
312int of_tegra_dvfs_init(const struct of_device_id *matches);
313int of_tegra_dvfs_rail_node_parse(struct device_node *rail_dn,
314 struct dvfs_rail *rail);
315int of_tegra_dvfs_rail_get_cdev_trips(
316 struct tegra_cooling_device *tegra_cdev, int *therm_trips_table,
317 int *therm_limits_table, struct rail_alignment *align, bool up);
318#else
319static inline int of_tegra_dvfs_init(const struct of_device_id *matches)
320{ return -ENODATA; }
321static inline int of_tegra_dvfs_rail_node_parse(struct device_node *rail_dn,
322 struct dvfs_rail *rail)
323{ return -ENODEV; }
324static inline int of_tegra_dvfs_rail_get_cdev_trips(
325 struct tegra_cooling_device *tegra_cdev, int *therm_trips_table,
326 int *therm_limits_table, struct rail_alignment *align, bool up)
327{ return -ENODEV; }
328#endif
329
330void tegra21x_init_dvfs(void);
331int dvfs_debugfs_init(struct dentry *clk_debugfs_root);
332int tegra_dvfs_rail_connect_regulators(void);
333int tegra_dvfs_rail_register_notifiers(void);
334int tegra_dvfs_init_rails(struct dvfs_rail *dvfs_rails[], int n);
335void tegra_dvfs_add_relationships(struct dvfs_relationship *rels, int n);
336
337void tegra_dvfs_rail_enable(struct dvfs_rail *rail);
338void tegra_dvfs_rail_disable(struct dvfs_rail *rail);
339int tegra_dvfs_rail_power_up(struct dvfs_rail *rail);
340int tegra_dvfs_rail_power_down(struct dvfs_rail *rail);
341bool tegra_dvfs_is_rail_up(struct dvfs_rail *rail);
342bool tegra_dvfs_rail_updating(struct clk *clk);
343void tegra_dvfs_rail_off(struct dvfs_rail *rail, ktime_t now);
344void tegra_dvfs_rail_on(struct dvfs_rail *rail, ktime_t now);
345void tegra_dvfs_rail_pause(struct dvfs_rail *rail, ktime_t delta, bool on);
346int tegra_dvfs_rail_set_mode(struct dvfs_rail *rail, unsigned int mode);
347int tegra_dvfs_rail_register_notifier(struct dvfs_rail *rail,
348 struct notifier_block *nb);
349int tegra_dvfs_rail_unregister_notifier(struct dvfs_rail *rail,
350 struct notifier_block *nb);
351struct dvfs_rail *tegra_dvfs_get_rail_by_name(const char *reg_id);
352int tegra_dvfs_rail_get_current_millivolts(struct dvfs_rail *rail);
353
354int tegra_dvfs_override_core_cap_apply(int level);
355int tegra_dvfs_therm_vmax_core_cap_apply(int *cap_idx, int new_idx, int level);
356
357int tegra_dvfs_alt_freqs_install(struct dvfs *d, unsigned long *alt_freqs);
358void tegra_dvfs_alt_freqs_install_always(
359 struct dvfs *d, unsigned long *alt_freqs);
360int tegra_dvfs_replace_voltage_table(struct dvfs *d, const int *new_millivolts);
361
362int tegra_dvfs_butterfly_throttle(struct clk *c1, unsigned long *rate1,
363 struct clk *c2, unsigned long *rate2);
364
365int tegra_dvfs_dfll_mode_set(struct dvfs *d, unsigned long rate);
366int tegra_dvfs_dfll_mode_clear(struct dvfs *d, unsigned long rate);
367int tegra_clk_dfll_range_control(enum dfll_range use_dfll);
368bool tegra_dvfs_is_dfll_scale(struct dvfs *d, unsigned long rate);
369bool tegra_dvfs_is_dfll_range(struct dvfs *d, unsigned long rate);
370int tegra_dvfs_swap_dfll_range(struct dvfs *d, int range, int *old_range);
371int tegra_dvfs_set_dfll_range(struct dvfs *d, int range);
372int tegra_dvfs_rail_set_reg_volatile(struct dvfs_rail *rail, bool set);
373
374void tegra_clip_freqs(u32 *freqs, int *num_freqs, int freqs_mult,
375 const unsigned long *rates_ladder, int num_rates, bool up);
376
377struct tegra_cooling_device *tegra_dvfs_get_cpu_vmax_cdev(void);
378struct tegra_cooling_device *tegra_dvfs_get_cpu_vmin_cdev(void);
379struct tegra_cooling_device *tegra_dvfs_get_core_vmax_cdev(void);
380struct tegra_cooling_device *tegra_dvfs_get_core_vmin_cdev(void);
381struct tegra_cooling_device *tegra_dvfs_get_gpu_vmin_cdev(void);
382struct tegra_cooling_device *tegra_dvfs_get_gpu_vts_cdev(void);
383struct tegra_cooling_device *tegra_dvfs_get_cpu_clk_switch_cdev(void);
384void tegra_dvfs_rail_init_vmin_thermal_profile(
385 int *therm_trips_table, int *therm_floors_table,
386 struct dvfs_rail *rail, struct dvfs_dfll_data *d);
387void tegra_dvfs_rail_init_vmax_thermal_profile(
388 int *therm_trips_table, int *therm_caps_table,
389 struct dvfs_rail *rail, struct dvfs_dfll_data *d);
390int tegra_dvfs_rail_of_init_vmin_thermal_profile(
391 int *therm_trips_table, int *therm_floors_table,
392 struct dvfs_rail *rail, struct dvfs_dfll_data *d);
393int tegra_dvfs_rail_of_init_vmax_thermal_profile(
394 int *therm_trips_table, int *therm_caps_table,
395 struct dvfs_rail *rail, struct dvfs_dfll_data *d);
396int tegra_dvfs_rail_init_clk_switch_thermal_profile(
397 int *clk_switch_trips, struct dvfs_rail *rail);
398int tegra_dvfs_rail_init_thermal_dvfs_trips(
399 int *therm_trips_table, struct dvfs_rail *rail);
400int tegra_dvfs_init_thermal_dvfs_voltages(int *millivolts,
401 int *peak_millivolts, int freqs_num, int ranges_num, struct dvfs *d);
402int tegra_dvfs_rail_dfll_mode_set_cold(struct dvfs_rail *rail,
403 struct clk *dfll_clk);
404int tegra_dvfs_rail_get_thermal_floor(struct dvfs_rail *rail);
405void tegra_dvfs_rail_register_vmax_cdev(struct dvfs_rail *rail);
406
407#ifdef CONFIG_TEGRA_VDD_CORE_OVERRIDE
408int tegra_dvfs_resolve_override(struct clk *c, unsigned long max_rate);
409int tegra_dvfs_rail_get_override_floor(struct dvfs_rail *rail);
410#else
411static inline int tegra_dvfs_resolve_override(struct clk *c, unsigned long rate)
412{ return 0; }
413static inline int tegra_dvfs_rail_get_override_floor(struct dvfs_rail *rail)
414{ return 0; }
415#endif
416
417static inline int tegra_dvfs_rail_disable_prepare(struct dvfs_rail *rail)
418{ return 0; }
419static inline int tegra_dvfs_rail_post_enable(struct dvfs_rail *rail)
420{ return 0; }
421
422bool tegra_dvfs_is_dfll_bypass(void);
423
424static inline bool tegra_dvfs_rail_is_dfll_mode(struct dvfs_rail *rail)
425{
426 return rail ? rail->dfll_mode : false;
427}
428
429static inline void tegra_dvfs_rail_mode_updating(struct dvfs_rail *rail,
430 bool updating)
431{
432 if (rail)
433 rail->dfll_mode_updating = updating;
434}
435
436static inline void tegra_dvfs_set_dfll_tune_trimmers(
437 struct dvfs *d, void (*tune_trimmers)(bool trim_high))
438{
439 if (d->dfll_data.tune_high_min_millivolts)
440 d->dfll_data.tune_trimmers = tune_trimmers;
441}
442
443#endif
diff --git a/include/linux/platform/tegra/emc_bwmgr.h b/include/linux/platform/tegra/emc_bwmgr.h
new file mode 100644
index 000000000..64d6f6f89
--- /dev/null
+++ b/include/linux/platform/tegra/emc_bwmgr.h
@@ -0,0 +1,393 @@
1/**
2 * Copyright (c) 2015-2018, NVIDIA CORPORATION. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 */
13
14#ifndef __EMC_BWMGR_H
15#define __EMC_BWMGR_H
16
17#include <linux/clk.h>
18#include <linux/device.h>
19#include <linux/of_address.h>
20#include <linux/platform/tegra/iso_client.h>
21
22/* keep in sync with tegra_bwmgr_client_names */
23enum tegra_bwmgr_client_id {
24 TEGRA_BWMGR_CLIENT_CPU_CLUSTER_0,
25 TEGRA_BWMGR_CLIENT_CPU_CLUSTER_1,
26 TEGRA_BWMGR_CLIENT_CPU_CLUSTER_2,
27 TEGRA_BWMGR_CLIENT_CPU_CLUSTER_3,
28 TEGRA_BWMGR_CLIENT_DISP0,
29 TEGRA_BWMGR_CLIENT_DISP1,
30 TEGRA_BWMGR_CLIENT_DISP2,
31 TEGRA_BWMGR_CLIENT_DISP1_LA_EMC,
32 TEGRA_BWMGR_CLIENT_DISP2_LA_EMC,
33 TEGRA_BWMGR_CLIENT_USBD,
34 TEGRA_BWMGR_CLIENT_XHCI,
35 TEGRA_BWMGR_CLIENT_SDMMC1,
36 TEGRA_BWMGR_CLIENT_SDMMC2,
37 TEGRA_BWMGR_CLIENT_SDMMC3,
38 TEGRA_BWMGR_CLIENT_SDMMC4,
39 TEGRA_BWMGR_CLIENT_MON,
40 TEGRA_BWMGR_CLIENT_GPU,
41 TEGRA_BWMGR_CLIENT_MSENC,
42 TEGRA_BWMGR_CLIENT_NVENC1,
43 TEGRA_BWMGR_CLIENT_NVJPG,
44 TEGRA_BWMGR_CLIENT_NVDEC,
45 TEGRA_BWMGR_CLIENT_NVDEC1,
46 TEGRA_BWMGR_CLIENT_TSEC,
47 TEGRA_BWMGR_CLIENT_TSECB,
48 TEGRA_BWMGR_CLIENT_VI,
49 TEGRA_BWMGR_CLIENT_ISPA,
50 TEGRA_BWMGR_CLIENT_ISPB,
51 TEGRA_BWMGR_CLIENT_CAMERA,
52 TEGRA_BWMGR_CLIENT_CAMERA_NON_ISO,
53 TEGRA_BWMGR_CLIENT_ISOMGR,
54 TEGRA_BWMGR_CLIENT_THERMAL_CAP,
55 TEGRA_BWMGR_CLIENT_VIC,
56 TEGRA_BWMGR_CLIENT_APE_ADSP,
57 TEGRA_BWMGR_CLIENT_APE_ADMA,
58 TEGRA_BWMGR_CLIENT_PCIE,
59 TEGRA_BWMGR_CLIENT_PCIE_1,
60 TEGRA_BWMGR_CLIENT_PCIE_2,
61 TEGRA_BWMGR_CLIENT_PCIE_3,
62 TEGRA_BWMGR_CLIENT_PCIE_4,
63 TEGRA_BWMGR_CLIENT_PCIE_5,
64 TEGRA_BWMGR_CLIENT_BBC_0,
65 TEGRA_BWMGR_CLIENT_EQOS,
66 TEGRA_BWMGR_CLIENT_SE0,
67 TEGRA_BWMGR_CLIENT_SE1,
68 TEGRA_BWMGR_CLIENT_SE2,
69 TEGRA_BWMGR_CLIENT_SE3,
70 TEGRA_BWMGR_CLIENT_SE4,
71 TEGRA_BWMGR_CLIENT_PMQOS,
72 TEGRA_BWMGR_CLIENT_NVPMODEL,
73 TEGRA_BWMGR_CLIENT_DEBUG,
74 TEGRA_BWMGR_CLIENT_COUNT /* Should always be last */
75};
76
77enum tegra_bwmgr_request_type {
78 TEGRA_BWMGR_SET_EMC_FLOOR, /* lower bound */
79 TEGRA_BWMGR_SET_EMC_CAP, /* upper bound */
80 TEGRA_BWMGR_SET_EMC_ISO_CAP, /* upper bound that affects ISO Bw */
81 TEGRA_BWMGR_SET_EMC_SHARED_BW, /* shared bw request */
82 TEGRA_BWMGR_SET_EMC_SHARED_BW_ISO, /* for use by ISO Mgr only */
83 TEGRA_BWMGR_SET_EMC_REQ_COUNT /* Should always be last */
84};
85
86enum bwmgr_dram_types {
87 DRAM_TYPE_NONE,
88 DRAM_TYPE_LPDDR4_16CH_ECC,
89 DRAM_TYPE_LPDDR4_8CH_ECC,
90 DRAM_TYPE_LPDDR4_4CH_ECC,
91 DRAM_TYPE_LPDDR4_2CH_ECC,
92 DRAM_TYPE_LPDDR4_16CH,
93 DRAM_TYPE_LPDDR4_8CH,
94 DRAM_TYPE_LPDDR4_4CH,
95 DRAM_TYPE_LPDDR4_2CH,
96 DRAM_TYPE_LPDDR3_2CH,
97 DRAM_TYPE_DDR3_2CH
98};
99
100extern u8 bwmgr_dram_efficiency;
101extern u8 bwmgr_dram_num_channels;
102/* flag to determine supported memory and channel configuration */
103extern u8 bwmgr_dram_config_supported;
104extern u32 *bwmgr_dram_iso_eff_table;
105extern u32 *bwmgr_dram_noniso_eff_table;
106extern u32 *bwmgr_max_nvdis_bw_reqd;
107extern u32 *bwmgr_max_vi_bw_reqd;
108extern int *bwmgr_slope;
109extern u32 *bwmgr_vi_bw_reqd_offset;
110extern int bwmgr_iso_bw_percentage;
111extern enum bwmgr_dram_types bwmgr_dram_type;
112extern int emc_to_dram_freq_factor;
113
114struct tegra_bwmgr_client;
115
116struct bwmgr_ops {
117 unsigned long (*freq_to_bw)(unsigned long freq);
118 unsigned long (*bw_to_freq)(unsigned long bw);
119 u32 (*dvfs_latency)(u32 ufreq);
120 unsigned long (*bwmgr_apply_efficiency)(
121 unsigned long total_bw, unsigned long iso_bw,
122 unsigned long max_rate, u64 usage_flags,
123 unsigned long *iso_bw_min, unsigned long iso_bw_nvdis,
124 unsigned long iso_bw_vi);
125 unsigned long (*get_best_iso_freq)(long iso_bw,
126 long iso_bw_nvdis, long iso_bw_vi);
127 void (*update_efficiency)(unsigned long dram_refresh_rate);
128 u32 (*get_max_iso_bw)(enum tegra_iso_client client);
129};
130
131struct bwmgr_ops *bwmgr_eff_init_t21x(void);
132struct bwmgr_ops *bwmgr_eff_init_t18x(void);
133struct bwmgr_ops *bwmgr_eff_init_t19x(void);
134
135#if defined(CONFIG_TEGRA_BWMGR)
136/**
137 * tegra_bwmgr_register - register an EMC Bandwidth Manager client.
138 * Also see tegra_bwmgr_unregister().
139 * @client client id from tegra_bwmgr_client_id
140 *
141 * Returns a valid handle on successful registration, NULL on error.
142 */
143struct tegra_bwmgr_client *tegra_bwmgr_register(
144 enum tegra_bwmgr_client_id client);
145
146/**
147 * tegra_bwmgr_unregister - unregister an EMC Bandwidth Manager client.
148 * Callers should match register/unregister calls.
149 * Persistence of old requests across
150 * register/unregister calls is undefined.
151 * Also see tegra_bwmgr_set_emc()
152 *
153 * @handle handle acquired during tegra_bwmgr_register
154 */
155void tegra_bwmgr_unregister(struct tegra_bwmgr_client *handle);
156
157/**
158 * tegra_bwmgr_get_dram_num_channels - get the number of DRAM channels
159 *
160 * Returns the number of DRAM channels that are configured on the underlying
161 * platform.
162 */
163u8 tegra_bwmgr_get_dram_num_channels(void);
164
165/**
166 * tegra_bwmgr_get_emc_rate - get the current EMC rate.
167 *
168 * Returns current memory clock rate in Hz.
169 */
170unsigned long tegra_bwmgr_get_emc_rate(void);
171
172/**
173 * tegra_bwmgr_get_max_emc_rate - get the max EMC rate.
174 *
175 * Returns the max memory clock rate in Hz.
176 */
177unsigned long tegra_bwmgr_get_max_emc_rate(void);
178
179/**
180 * tegra_bwmgr_get_core_emc_rate - get the actual emc frequency calculated
181 * using the dram frequency and emc_to_dram
182 * conversion factor.
183 *
184 * Returns the core emc rate in Hz.
185 */
186unsigned long tegra_bwmgr_get_core_emc_rate(void);
187
188/**
189 * tegra_bwmgr_round_rate - round up to next EMC rate which can be provided
190 *
191 * @bw Input rate
192 *
193 * Returns the next higher rate from the Input rate that EMC can run at.
194 */
195unsigned long tegra_bwmgr_round_rate(unsigned long bw);
196
197/**
198 * tegra_bwmgr_set_emc - request to bwmgr to set an EMC rate parameter.
199 * Actual clock rate depends on aggregation of
200 * requests by all clients. If needed, use
201 * tegra_bwmgr_get_emc_rate() to get the rate after
202 * a tegra_bwmgr_set_emc() call.
203 *
204 * Call tegra_bwmgr_set_emc() with same request type and
205 * val = 0 to clear request.
206 *
207 * @handle handle acquired during tegra_bwmgr_register
208 * @val value to be set in Hz, 0 to clear old request of the same type
209 * @req chosen type from tegra_bwmgr_request_type
210 *
211 * Returns success (0) or negative errno.
212 */
213int tegra_bwmgr_set_emc(struct tegra_bwmgr_client *handle, unsigned long val,
214 enum tegra_bwmgr_request_type req);
215
216/**
217 * tegra_bwmgr_get_client_info - outputs the value previously set with
218 * tegra_bwmgr_set_emc or 0 if no value has been set.
219 *
220 * @handle handle acquired during tegra_bwmgr_register
221 * @out_val bandwidth value in Hz
222 * @req chosen type from tegra_bwmgr_request_type
223 *
224 * Returns success (0) or negative errno.
225 */
226int tegra_bwmgr_get_client_info(struct tegra_bwmgr_client *handle,
227 unsigned long *out_val,
228 enum tegra_bwmgr_request_type req);
229
230/**
231 * tegra_bwmgr_notifier_register - register a notifier callback when
232 * emc rate changes. Must be called from non-atomic
233 * context. The callback must not call any bwmgr API.
234 * @nb linux notifier block
235 *
236 * Returns success (0) or negative errno.
237 */
238int tegra_bwmgr_notifier_register(struct notifier_block *nb);
239
240/**
241 * tegra_bwmgr_notifier_unregister - unregister a notifier callback.
242 * @nb linux notifier block
243 *
244 * Returns success (0) or negative errno.
245 */
246int tegra_bwmgr_notifier_unregister(struct notifier_block *nb);
247
248/*
249 * Initialize bwmgr.
250 * This api would be called by .init_machine during boot.
251 * bwmgr clients, don't call this api.
252 */
253int __init bwmgr_init(void);
254
255void __exit bwmgr_exit(void);
256
257/*
258 * Initialize pmqos bwmgr code which registers pmqos as bwmgr client and
259 * registers a notifier which gets called on update to PMQOS_EMC_FREQ_MIN.
260 */
261int __init pmqos_bwmgr_init(void);
262
263#else /* CONFIG_TEGRA_BWMGR */
264
265static inline struct tegra_bwmgr_client *tegra_bwmgr_register(
266 enum tegra_bwmgr_client_id client_id)
267{
268 static int i;
269 /* return a dummy handle to allow client to function
270 * as if bwmgr were enabled.
271 */
272 return (struct tegra_bwmgr_client *) &i;
273}
274
275static inline void tegra_bwmgr_unregister(struct tegra_bwmgr_client *handle) {}
276
277static inline int bwmgr_init(void)
278{
279 return 0;
280}
281
282static inline void bwmgr_exit(void) {}
283
284static inline u8 tegra_bwmgr_get_dram_num_channels(void)
285{
286 return 0;
287}
288
289static inline unsigned long tegra_bwmgr_get_emc_rate(void)
290{
291 static struct clk *bwmgr_emc_clk;
292 struct device_node *dn;
293
294 if (!bwmgr_emc_clk) {
295 dn = of_find_compatible_node(NULL, NULL, "nvidia,bwmgr");
296 if (dn == NULL) {
297 pr_err("bwmgr: dt node not found.\n");
298 return 0;
299 }
300
301 bwmgr_emc_clk = of_clk_get(dn, 0);
302 if (IS_ERR_OR_NULL(bwmgr_emc_clk)) {
303 pr_err("bwmgr: couldn't find emc clock.\n");
304 bwmgr_emc_clk = NULL;
305 WARN_ON(true);
306 return 0;
307 }
308 }
309
310 return clk_get_rate(bwmgr_emc_clk);
311}
312
313static inline unsigned long tegra_bwmgr_get_max_emc_rate(void)
314{
315 static struct clk *bwmgr_emc_clk;
316 struct device_node *dn;
317
318 if (!bwmgr_emc_clk) {
319 dn = of_find_compatible_node(NULL, NULL, "nvidia,bwmgr");
320 if (dn == NULL) {
321 pr_err("bwmgr: dt node not found.\n");
322 return 0;
323 }
324
325 bwmgr_emc_clk = of_clk_get(dn, 0);
326 if (IS_ERR_OR_NULL(bwmgr_emc_clk)) {
327 pr_err("bwmgr: couldn't find emc clock.\n");
328 bwmgr_emc_clk = NULL;
329 WARN_ON(true);
330 return 0;
331 }
332 }
333
334 /* Use LONG_MAX as clk_round_rate treats rate argument as signed */
335 return clk_round_rate(bwmgr_emc_clk, LONG_MAX);
336}
337
338static inline unsigned long tegra_bwmgr_get_core_emc_rate(void)
339{
340 return 0;
341}
342static inline unsigned long tegra_bwmgr_round_rate(unsigned long bw)
343{
344 static struct clk *bwmgr_emc_clk;
345 struct device_node *dn;
346
347 if (!bwmgr_emc_clk) {
348 dn = of_find_compatible_node(NULL, NULL, "nvidia,bwmgr");
349 if (dn == NULL) {
350 pr_err("bwmgr: dt node not found.\n");
351 return 0;
352 }
353
354 bwmgr_emc_clk = of_clk_get(dn, 0);
355 if (IS_ERR_OR_NULL(bwmgr_emc_clk)) {
356 pr_err("bwmgr: couldn't find emc clock.\n");
357 bwmgr_emc_clk = NULL;
358 WARN_ON(true);
359 return 0;
360 }
361 }
362
363 return clk_round_rate(bwmgr_emc_clk, bw);
364}
365
366static inline int tegra_bwmgr_set_emc(struct tegra_bwmgr_client *handle,
367 unsigned long val, enum tegra_bwmgr_request_type req)
368{
369 return 0;
370}
371
372static inline int tegra_bwmgr_get_client_info(struct tegra_bwmgr_client *handle,
373 unsigned long *out_val,
374 enum tegra_bwmgr_request_type req)
375{
376 if (!out_val)
377 return -EINVAL;
378 *out_val = 0;
379 return 0;
380}
381
382static inline int tegra_bwmgr_notifier_register(struct notifier_block *nb)
383{
384 return 0;
385}
386
387static inline int tegra_bwmgr_notifier_unregister(struct notifier_block *nb)
388{
389 return 0;
390}
391
392#endif /* CONFIG_TEGRA_BWMGR */
393#endif /* __EMC_BWMGR_H */
diff --git a/include/linux/platform/tegra/iso_client.h b/include/linux/platform/tegra/iso_client.h
new file mode 100644
index 000000000..d88ee6d92
--- /dev/null
+++ b/include/linux/platform/tegra/iso_client.h
@@ -0,0 +1,33 @@
1/*
2 *
3 * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _INCLUDE_MACH_ISO_CLIENT_H
16#define _INCLUDE_MACH_ISO_CLIENT_H
17
18enum tegra_iso_client {
19 TEGRA_ISO_CLIENT_DISP_0,
20 TEGRA_ISO_CLIENT_DISP_1,
21 TEGRA_ISO_CLIENT_DISP_2,
22 TEGRA_ISO_CLIENT_VI_0,
23 TEGRA_ISO_CLIENT_VI_1,
24 TEGRA_ISO_CLIENT_ISP_A,
25 TEGRA_ISO_CLIENT_ISP_B,
26 TEGRA_ISO_CLIENT_BBC_0,
27 TEGRA_ISO_CLIENT_TEGRA_CAMERA,
28 TEGRA_ISO_CLIENT_APE_ADMA,
29 TEGRA_ISO_CLIENT_EQOS,
30 TEGRA_ISO_CLIENT_COUNT
31};
32
33#endif /* _INCLUDE_MACH_ISO_CLIENT_H */
diff --git a/include/linux/platform/tegra/isomgr.h b/include/linux/platform/tegra/isomgr.h
new file mode 100644
index 000000000..624dbb5ee
--- /dev/null
+++ b/include/linux/platform/tegra/isomgr.h
@@ -0,0 +1,215 @@
1/*
2 * include/mach/isomgr.h
3 *
4 * Copyright (c) 2012-2018, NVIDIA CORPORATION. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 */
19
20#ifndef _INCLUDE_MACH_ISOMGR_H
21#define _INCLUDE_MACH_ISOMGR_H
22
23#include <linux/platform/tegra/emc_bwmgr.h>
24#include <linux/platform/tegra/iso_client.h>
25
26#define ISOMGR_MAGIC 0x150A1C
27
28/* handle to identify registered client */
29#define tegra_isomgr_handle void *
30
31/* callback to client to renegotiate ISO BW allocation */
32typedef void (*tegra_isomgr_renegotiate)(void *priv,
33 u32 avail_bw); /* KB/sec */
34
35struct isoclient_info {
36 enum tegra_iso_client client;
37 char *name;
38 char *dev_name;
39 char *emc_clk_name;
40 enum tegra_bwmgr_client_id bwmgr_id;
41};
42
43struct isomgr_client {
44 u32 magic; /* magic to identify handle */
45 struct kref kref; /* ref counting */
46 s32 dedi_bw; /* BW dedicated to this client (KB/sec) */
47 s32 rsvd_bw; /* BW reserved for this client (KB/sec) */
48 s32 real_bw; /* BW realized for this client (KB/sec) */
49 s32 lti; /* Client spec'd Latency Tolerance (usec) */
50 s32 lto; /* MC calculated Latency Tolerance (usec) */
51 s32 rsvd_mf; /* reserved minimum freq in support of LT */
52 s32 real_mf; /* realized minimum freq in support of LT */
53 s32 real_mf_rq; /* real_mf requested */
54 tegra_isomgr_renegotiate renegotiate; /* ask client to renegotiate */
55 bool realize; /* bw realization in progress */
56 s32 sleep_bw; /* sleeping for realize */
57 s32 margin_bw; /* BW set aside for this client (KB/sec) */
58 u8 limit_bw_percentage; /* Insufficient HW buffers cause BW to be
59 * limited to this percentage of DRAM BW
60 */
61 void *priv; /* client driver's private data */
62 struct completion cmpl; /* so we can sleep waiting for delta BW */
63
64#ifdef CONFIG_COMMON_CLK
65 struct tegra_bwmgr_client *bwmgr_handle;
66#else
67 struct clk *emc_clk; /* client emc clk for bw */
68#endif
69
70#ifdef CONFIG_TEGRA_ISOMGR_SYSFS
71 struct kobject *client_kobj;
72 struct isomgr_client_attrs {
73 struct kobj_attribute dedi_bw;
74 struct kobj_attribute rsvd_bw;
75 struct kobj_attribute real_bw;
76 struct kobj_attribute lti;
77 struct kobj_attribute lto;
78 struct kobj_attribute rsvd_mf;
79 struct kobj_attribute real_mf;
80 struct kobj_attribute sleep_bw;
81 struct kobj_attribute margin_bw;
82 } client_attrs;
83#endif /* CONFIG_TEGRA_ISOMGR_SYSFS */
84};
85
86struct isomgr {
87 struct mutex lock; /* to lock ALL isomgr state */
88 struct task_struct *task; /* check reentrant/mismatched locks */
89
90#ifdef CONFIG_COMMON_CLK
91 struct tegra_bwmgr_client *bwmgr_handle;
92#else
93 struct clk *emc_clk; /* isomgr emc clock for floor freq */
94#endif
95
96 s32 lt_mf; /* min freq to support worst LT */
97 s32 lt_mf_rq; /* requested lt_mf */
98 s32 avail_bw; /* globally available MC BW */
99 s32 dedi_bw; /* total BW 'dedicated' to clients */
100 s32 sleep_bw; /* pending bw requirement */
101 u32 max_iso_bw; /* max ISO BW MC can accommodate */
102 struct kobject *kobj; /* for sysfs linkage */
103 struct isomgr_ops *ops; /* ops structure for isomgr*/
104};
105
106extern struct isoclient_info *isoclient_info;
107/*platform specific flag for requesting max emc floor req for camera client*/
108extern u8 isomgr_camera_max_floor_req;
109extern int isoclients;
110extern bool client_valid[TEGRA_ISO_CLIENT_COUNT];
111extern struct isomgr_client isomgr_clients[TEGRA_ISO_CLIENT_COUNT];
112extern struct isomgr isomgr;
113extern char *cname[];
114
115struct isomgr_ops {
116 void (*isomgr_plat_init)(void);
117 bool (*isomgr_plat_register)(u32 dedi_bw,
118 enum tegra_iso_client client);
119 void (*isomgr_plat_unregister)(struct isomgr_client *cp);
120 bool (*isomgr_plat_reserve)(struct isomgr_client *cp,
121 u32 bw, enum tegra_iso_client client);
122 bool (*isomgr_plat_realize)(struct isomgr_client *cp);
123 u32 (*isomgr_max_iso_bw)(enum tegra_iso_client client);
124};
125
126struct isomgr_ops *pre_t19x_isomgr_init(void);
127struct isomgr_ops *t19x_isomgr_init(void);
128
129#if defined(CONFIG_TEGRA_ISOMGR)
130/* Register an ISO BW client */
131tegra_isomgr_handle tegra_isomgr_register(enum tegra_iso_client client,
132 u32 dedicated_bw, /* KB/sec */
133 tegra_isomgr_renegotiate renegotiate,
134 void *priv);
135
136/* Unregister an ISO BW client */
137void tegra_isomgr_unregister(tegra_isomgr_handle handle);
138
139/* Reserve ISO BW on behalf of client - don't apply, rval is dvfs thresh usec */
140u32 tegra_isomgr_reserve(tegra_isomgr_handle handle,
141 u32 bw, /* KB/sec */
142 u32 lt); /* usec */
143
144/* Realize client reservation - apply settings, rval is dvfs thresh usec */
145u32 tegra_isomgr_realize(tegra_isomgr_handle handle);
146
147/* This sets bw aside for the client specified. */
148int tegra_isomgr_set_margin(enum tegra_iso_client client, u32 bw, bool wait);
149
150int tegra_isomgr_get_imp_time(enum tegra_iso_client, u32 bw);
151
152/* returns available in iso bw in KB/sec */
153u32 tegra_isomgr_get_available_iso_bw(void);
154
155/* returns total iso bw in KB/sec */
156u32 tegra_isomgr_get_total_iso_bw(enum tegra_iso_client client);
157
158/* Initialize isomgr.
159 * This api would be called by .init_machine during boot.
160 * isomgr clients, don't call this api.
161 */
162int __init isomgr_init(void);
163#else
164static inline tegra_isomgr_handle tegra_isomgr_register(
165 enum tegra_iso_client client,
166 u32 dedicated_bw,
167 tegra_isomgr_renegotiate renegotiate,
168 void *priv)
169{
170 /* return a dummy handle to allow client function
171 * as if isomgr were enabled.
172 */
173 return (tegra_isomgr_handle)1;
174}
175
176static inline void tegra_isomgr_unregister(tegra_isomgr_handle handle) {}
177
178static inline u32 tegra_isomgr_reserve(tegra_isomgr_handle handle,
179 u32 bw, u32 lt)
180{
181 return 1;
182}
183
184static inline u32 tegra_isomgr_realize(tegra_isomgr_handle handle)
185{
186 return 1;
187}
188
189static inline int tegra_isomgr_set_margin(enum tegra_iso_client client, u32 bw)
190{
191 return 0;
192}
193
194static inline int tegra_isomgr_get_imp_time(enum tegra_iso_client client,
195 u32 bw)
196{
197 return 0;
198}
199
200static inline u32 tegra_isomgr_get_available_iso_bw(void)
201{
202 return UINT_MAX;
203}
204
205static inline u32 tegra_isomgr_get_total_iso_bw(enum tegra_iso_client client)
206{
207 return UINT_MAX;
208}
209
210static inline int isomgr_init(void)
211{
212 return 0;
213}
214#endif
215#endif /* _INCLUDE_MACH_ISOMGR_H */
diff --git a/include/linux/platform/tegra/mcerr.h b/include/linux/platform/tegra/mcerr.h
new file mode 100644
index 000000000..4a83dae11
--- /dev/null
+++ b/include/linux/platform/tegra/mcerr.h
@@ -0,0 +1,176 @@
1/*
2 * MC error interrupt handling header file. Various defines and declarations
3 * across tegra chips.
4 *
5 * Copyright (c) 2010-2018, NVIDIA Corporation. All rights reserved.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 */
21
22#ifndef __MCERR_H
23#define __MCERR_H
24
25#include <linux/kernel.h>
26#include <linux/debugfs.h>
27#include <linux/spinlock.h>
28#include <linux/interrupt.h>
29#include <linux/of.h>
30
31#include <linux/platform/tegra/mc.h>
32
33#define MAX_PRINTS 5
34
35/* defines that are common across SOC's. */
36#define MC_INTMASK 0x4
37
38#define MC_ERR_STATUS_WRITE (1 << 16)
39#define MC_ERR_STATUS_SECURE (1 << 17)
40#define MC_ERR_STATUS_ADR_HI (3 << 20)
41
42#define MC_INT_DECERR_EMEM (1<<6)
43#define MC_INT_SECURITY_VIOLATION (1<<8)
44#define MC_INT_ARBITRATION_EMEM (1<<9)
45#define MC_INT_DECERR_VPR (1<<12)
46#define MC_INT_SECERR_SEC (1<<13)
47#define MC_INT_DECERR_GENERALIZED_CARVEOUT (1<<17)
48
49#define MC_ERR_DECERR_EMEM (2)
50#define MC_ERR_SECURITY_TRUSTZONE (3)
51#define MC_ERR_SECURITY_CARVEOUT (4)
52#define MC_ERR_INVALID_SMMU_PAGE (6)
53
54struct platform_device;
55int tegra_mcerr_init(struct dentry *mc_paren, struct platform_device *pdev);
56irqreturn_t tegra_mc_handle_general_fault(int src_chan, int intstatus);
57
58/*
59 * This describes errors that can be generated by the MC. One is defined for
60 * each possibility.
61 *
62 * @sig Interrupt signiture for the error.
63 * @msg Error description.
64 * @flags Relevant flags for the error.
65 * @stat_reg Register offset that holds the status of the error.
66 * @addr_reg Register offset that holds the faulting address.
67 */
68struct mc_error {
69 const char *msg;
70 u32 sig;
71 int flags;
72 u32 stat_reg;
73 u32 addr_reg;
74 u32 addr_hi_reg;
75};
76
77#define E_SMMU (1<<0)
78#define E_NO_STATUS (1<<1) /* No status/addr */
79#define E_TWO_STATUS (1<<2) /* Two status registers, no addr */
80#define E_VPR (1<<3) /* VPR violation */
81#define E_ADR_HI_REG (1<<4) /* Hi Addr bits in hi reg */
82#define E_GSC (1<<5) /* GSC violation */
83
84extern u32 mc_int_mask;
85extern u32 mcerr_silenced;
86
87struct mcerr_ops {
88 /*
89 * Show the statistics for each client. This is called from a debugfs
90 * context - that means you can sleep and do general kernel stuff here.
91 */
92 int (*mcerr_debugfs_show)(struct seq_file *s, void *v);
93
94 /* Disable MC Error interrupt.
95 *
96 * Called in hard irq context to disable interrupt till
97 * soft irq handler logs the MC Error.
98 */
99 void (*disable_interrupt)(unsigned int irq);
100
101 /* Enable MC Error interrupt.
102 *
103 * Called from soft irq context after MC Error is logged.
104 */
105 void (*enable_interrupt)(unsigned int irq);
106
107 /* Clear MC Error interrupt.
108 *
109 * Called from soft irq context during MC Error print throttle.
110 */
111 void (*clear_interrupt)(unsigned int irq);
112
113 /* Log MC Error fault and clear interrupt source
114 *
115 * Called in soft irq context.
116 * As soon as interrupt status is cleared MC would be ready to
117 * hold next MC Error info.
118 */
119 void (*log_mcerr_fault)(unsigned int irq);
120
121 /* Numeric fields that must be set by the different chips. */
122 unsigned int nr_clients;
123
124 /*
125 * This array lists a string description of each valid interrupt bit.
126 * It must be at least 32 entries long. Entries that are not valid
127 * interrupts should be left as NULL. Each entry should be at most 12
128 * characters long.
129 */
130 const char **intr_descriptions;
131 struct mc_client *mc_clients;
132};
133
134#define client(_swgroup, _name, _swgid) \
135 { .swgroup = _swgroup, .name = _name, .swgid = TEGRA_SWGROUP_##_swgid, }
136
137#define dummy_client client("dummy", "dummy", INVALID)
138
139#define MC_ERR(_sig, _msg, _flags, _stat_reg, _addr_reg) \
140 { .sig = _sig, .msg = _msg, .flags = _flags, \
141 .stat_reg = _stat_reg, .addr_reg = _addr_reg }
142
143#define MC_ERR_HI(_sig, _msg, _flags, _stat_reg, _addr_reg, _addr_hi_reg) \
144 { .sig = _sig, .msg = _msg, .flags = (_flags | E_ADR_HI_REG), \
145 .stat_reg = _stat_reg, .addr_reg = _addr_reg, \
146 .addr_hi_reg = _addr_hi_reg}
147
148#define MC_ERR_GSC(_sig, _msg, _flags, _stat_reg, _addr_reg, _addr_hi_reg) \
149 { .sig = _sig, .msg = _msg, .flags = (_flags | E_GSC), \
150 .stat_reg = _stat_reg, .addr_reg = _addr_reg, \
151 .addr_hi_reg = _addr_hi_reg}
152
153#define mcerr_pr(fmt, ...) \
154 do { \
155 if (!mcerr_silenced) { \
156 trace_printk(fmt, ##__VA_ARGS__); \
157 pr_err(fmt, ##__VA_ARGS__); \
158 } \
159 } while (0)
160
161/*
162 * Error MMA tracking.
163 */
164#define MMA_HISTORY_SAMPLES 20
165struct arb_emem_intr_info {
166 int arb_intr_mma;
167 u64 time;
168 spinlock_t lock;
169};
170
171typedef struct mcerr_ops *(*of_mcerr_init_fn)(struct device_node *);
172
173#define MCERR_OF_DECLARE(name, compat, fn) \
174 _OF_DECLARE(mcerr, name, compat, fn, of_mcerr_init_fn)
175
176#endif /* __MCERR_H */
diff --git a/include/linux/platform/tegra/reset.h b/include/linux/platform/tegra/reset.h
new file mode 100644
index 000000000..9494f000d
--- /dev/null
+++ b/include/linux/platform/tegra/reset.h
@@ -0,0 +1,115 @@
1/*
2 * include/linux/platform/reset.h
3 *
4 * CPU reset dispatcher.
5 *
6 * Copyright (c) 2011-2014, NVIDIA CORPORATION. All rights reserved.
7 *
8 * This software is licensed under the terms of the GNU General Public
9 * License version 2, as published by the Free Software Foundation, and
10 * may be copied, distributed, and modified under those terms.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 */
17
18#ifndef __MACH_TEGRA_RESET_H
19#define __MACH_TEGRA_RESET_H
20
21#define TEGRA_RESET_MASK_PRESENT 0
22#define TEGRA_RESET_MASK_LP1 1
23#define TEGRA_RESET_MASK_LP2 2
24#define TEGRA_RESET_STARTUP_SECONDARY 3
25#define TEGRA_RESET_STARTUP_LP2 4
26#define TEGRA_RESET_STARTUP_LP1 5
27#define TEGRA_RESET_C0_L2_TAG_LATENCY 6
28#define TEGRA_RESET_C0_L2_DATA_LATENCY 7
29#define TEGRA_RESET_C1_L2_TAG_LATENCY 8
30#define TEGRA_RESET_C1_L2_DATA_LATENCY 9
31#define TEGRA_RESET_MASK_MC_CLK 10
32#define TEGRA_RESET_SECURE_FW_PRESENT 11
33#define TEGRA_RESET_DATA_SIZE 12
34
35#ifdef CONFIG_ARM64
36#define RESET_DATA(x) ((TEGRA_RESET_##x)*8)
37#else
38#define RESET_DATA(x) ((TEGRA_RESET_##x)*4)
39#endif
40
41#ifndef __ASSEMBLY__
42
43#include <linux/cpumask.h>
44
45extern unsigned long __tegra_cpu_reset_handler_data[TEGRA_RESET_DATA_SIZE];
46
47void __tegra_cpu_reset_handler_start(void);
48void __tegra_cpu_reset_handler(void);
49void __tegra_cpu_reset_handler_end(void);
50void tegra_secondary_startup(void);
51
52#ifdef CONFIG_PM_SLEEP
53#define tegra_cpu_lp1_mask ((unsigned long *)(IO_ADDRESS(TEGRA_RESET_HANDLER_BASE + \
54 ((ulong)&__tegra_cpu_reset_handler_data[TEGRA_RESET_MASK_LP1] - \
55 (ulong)__tegra_cpu_reset_handler_start))))
56
57#define tegra_mc_clk_mask ((unsigned long *)(IO_ADDRESS(TEGRA_RESET_HANDLER_BASE + \
58 ((ulong)&__tegra_cpu_reset_handler_data[TEGRA_RESET_MASK_MC_CLK] - \
59 (ulong)__tegra_cpu_reset_handler_start))))
60
61#define tegra_cpu_reset_handler_ptr ((u32 *)(IO_ADDRESS(TEGRA_RESET_HANDLER_BASE + \
62 ((ulong)__tegra_cpu_reset_handler_data - \
63 (ulong)__tegra_cpu_reset_handler_start))))
64
65#define tegra_cpu_lp2_mask ((cpumask_t *)(IO_ADDRESS(TEGRA_RESET_HANDLER_BASE + \
66 ((ulong)&__tegra_cpu_reset_handler_data[TEGRA_RESET_MASK_LP2] - \
67 (ulong)__tegra_cpu_reset_handler_start))))
68#endif
69
70#define tegra_cpu_c0_l2_tag_latency \
71 __tegra_cpu_reset_handler_data[TEGRA_RESET_C0_L2_TAG_LATENCY]
72
73#define tegra_cpu_c0_l2_tag_latency_iram \
74 ((ulong *)(IO_ADDRESS(TEGRA_RESET_HANDLER_BASE + \
75 ((ulong)&__tegra_cpu_reset_handler_data[TEGRA_RESET_C0_L2_TAG_LATENCY] \
76 - (ulong)__tegra_cpu_reset_handler_start))))
77
78#define tegra_cpu_c0_l2_data_latency \
79 __tegra_cpu_reset_handler_data[TEGRA_RESET_C0_L2_DATA_LATENCY]
80
81#define tegra_cpu_c0_l2_data_latency_iram \
82 ((ulong *)(IO_ADDRESS(TEGRA_RESET_HANDLER_BASE + \
83 ((ulong)&__tegra_cpu_reset_handler_data[TEGRA_RESET_C0_L2_DATA_LATENCY] \
84 - (ulong)__tegra_cpu_reset_handler_start))))
85
86#define tegra_cpu_c1_l2_tag_latency \
87 __tegra_cpu_reset_handler_data[TEGRA_RESET_C1_L2_TAG_LATENCY]
88
89#define tegra_cpu_c1_l2_tag_latency_iram \
90 ((ulong *)(IO_ADDRESS(TEGRA_RESET_HANDLER_BASE + \
91 ((ulong)&__tegra_cpu_reset_handler_data[TEGRA_RESET_C1_L2_TAG_LATENCY] \
92 - (ulong)__tegra_cpu_reset_handler_start))))
93
94#define tegra_cpu_c1_l2_data_latency \
95 __tegra_cpu_reset_handler_data[TEGRA_RESET_C1_L2_DATA_LATENCY]
96
97#define tegra_cpu_c1_l2_data_latency_iram \
98 ((ulong *)(IO_ADDRESS(TEGRA_RESET_HANDLER_BASE + \
99 ((ulong)&__tegra_cpu_reset_handler_data[TEGRA_RESET_C1_L2_DATA_LATENCY] \
100 - (ulong)__tegra_cpu_reset_handler_start))))
101
102#define tegra_cpu_reset_handler_offset \
103 ((ulong)__tegra_cpu_reset_handler - \
104 (ulong)__tegra_cpu_reset_handler_start)
105
106#define tegra_cpu_reset_handler_size \
107 (__tegra_cpu_reset_handler_end - \
108 __tegra_cpu_reset_handler_start)
109
110#ifdef CONFIG_PM_SLEEP
111void tegra_cpu_reset_handler_save(void);
112void tegra_cpu_reset_handler_restore(void);
113#endif
114#endif
115#endif
diff --git a/include/linux/platform/tegra/tegra12_emc.h b/include/linux/platform/tegra/tegra12_emc.h
new file mode 100644
index 000000000..c32bdf217
--- /dev/null
+++ b/include/linux/platform/tegra/tegra12_emc.h
@@ -0,0 +1,574 @@
1/*
2 * include/linux/platform/tegra12_emc.h
3 *
4 * Copyright (c) 2013-2014, NVIDIA CORPORATION. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 */
20
21#ifndef _MACH_TEGRA_TEGRA12_EMC_H
22#define _MACH_TEGRA_TEGRA12_EMC_H
23
24#include <linux/platform/tegra/tegra_emc.h>
25#include <linux/platform_data/tegra_emc_pdata.h>
26
27int tegra12_emc_init(void);
28
29enum {
30 DRAM_DEV_SEL_ALL = 0,
31 DRAM_DEV_SEL_0 = (2 << 30),
32 DRAM_DEV_SEL_1 = (1 << 30),
33};
34
35void tegra12_mc_holdoff_enable(void);
36
37#define DRAM_BROADCAST(num) \
38 (((num) > 1) ? DRAM_DEV_SEL_ALL : DRAM_DEV_SEL_0)
39
40#define EMC_INTSTATUS 0x0
41#define EMC_INTSTATUS_CLKCHANGE_COMPLETE (0x1 << 4)
42
43#define EMC_DBG 0x8
44#define EMC_DBG_WRITE_MUX_ACTIVE (0x1 << 1)
45
46#define EMC_CFG 0xc
47#define EMC_CFG_DRAM_CLKSTOP_PD (0x1 << 31)
48#define EMC_CFG_DRAM_CLKSTOP_SR (0x1 << 30)
49#define EMC_CFG_DRAM_ACPD (0x1 << 29)
50#define EMC_CFG_DYN_SREF (0x1 << 28)
51#define EMC_CFG_PWR_MASK ((0xF << 28) | (0x1 << 18))
52#define EMC_CFG_REQACT_ASYNC (0x1 << 26)
53#define EMC_CFG_AUTO_PRE_WR (0x1 << 25)
54#define EMC_CFG_AUTO_PRE_RD (0x1 << 24)
55#define EMC_CFG_MAM_PRE_WR (0x1 << 23)
56#define EMC_CFG_MAN_PRE_RD (0x1 << 22)
57#define EMC_CFG_PERIODIC_QRST (0x1 << 21)
58#define EMC_CFG_EN_DYNAMIC_PUTERM (0x1 << 20)
59#define EMC_CFG_DLY_WR_DQ_HALF_CLOCK (0x1 << 19)
60#define EMC_CFG_DSR_VTTGEN_DRV_EN (0x1 << 18)
61#define EMC_CFG_EMC2MC_CLK_RATIO (0x3 << 16)
62#define EMC_CFG_WAIT_FOR_ISP2B_READY_B4_CC (0x1 << 9)
63#define EMC_CFG_WAIT_FOR_VI2_READY_B4_CC (0x1 << 8)
64#define EMC_CFG_WAIT_FOR_ISP2_READY_B4_CC (0x1 << 7)
65#define EMC_CFG_INVERT_DQM (0x1 << 6)
66#define EMC_CFG_WAIT_FOR_DISPLAYB_READY_B4_CC (0x1 << 5)
67#define EMC_CFG_WAIT_FOR_DISPLAY_READY_B4_CC (0x1 << 4)
68#define EMC_CFG_EMC2PMACRO_CFG_BYPASS_DATAPIPE2 (0x1 << 3)
69#define EMC_CFG_EMC2PMACRO_CFG_BYPASS_DATAPIPE1 (0x1 << 2)
70#define EMC_CFG_EMC2PMACRO_CFG_BYPASS_ADDRPIPE (0x1 << 1)
71
72
73#define EMC_ADR_CFG 0x10
74#define EMC_REFCTRL 0x20
75#define EMC_REFCTRL_DEV_SEL_SHIFT 0
76#define EMC_REFCTRL_DEV_SEL_MASK \
77 (0x3 << EMC_REFCTRL_DEV_SEL_SHIFT)
78#define EMC_REFCTRL_ENABLE (0x1 << 31)
79#define EMC_REFCTRL_ENABLE_ALL(num) \
80 (((((num) > 1) ? 0 : 2) << EMC_REFCTRL_DEV_SEL_SHIFT) \
81 | EMC_REFCTRL_ENABLE)
82#define EMC_REFCTRL_DISABLE_ALL(num) \
83 ((((num) > 1) ? 0 : 2) << EMC_REFCTRL_DEV_SEL_SHIFT)
84
85#define EMC_TIMING_CONTROL 0x28
86#define EMC_RC 0x2c
87#define EMC_RFC 0x30
88#define EMC_RAS 0x34
89#define EMC_RP 0x38
90#define EMC_R2W 0x3c
91#define EMC_W2R 0x40
92#define EMC_R2P 0x44
93#define EMC_W2P 0x48
94#define EMC_RD_RCD 0x4c
95#define EMC_WR_RCD 0x50
96#define EMC_RRD 0x54
97#define EMC_REXT 0x58
98#define EMC_WDV 0x5c
99#define EMC_QUSE 0x60
100#define EMC_QRST 0x64
101#define EMC_QSAFE 0x68
102#define EMC_RDV 0x6c
103#define EMC_REFRESH 0x70
104#define EMC_BURST_REFRESH_NUM 0x74
105#define EMC_PDEX2WR 0x78
106#define EMC_PDEX2RD 0x7c
107#define EMC_PCHG2PDEN 0x80
108#define EMC_ACT2PDEN 0x84
109#define EMC_AR2PDEN 0x88
110#define EMC_RW2PDEN 0x8c
111#define EMC_TXSR 0x90
112#define EMC_TCKE 0x94
113#define EMC_TFAW 0x98
114#define EMC_TRPAB 0x9c
115#define EMC_TCLKSTABLE 0xa0
116#define EMC_TCLKSTOP 0xa4
117#define EMC_TREFBW 0xa8
118#define EMC_ODT_WRITE 0xb0
119#define EMC_ODT_READ 0xb4
120#define EMC_WEXT 0xb8
121#define EMC_CTT 0xbc
122#define EMC_RFC_SLR 0xc0
123#define EMC_MRS_WAIT_CNT2 0xc4
124
125#define EMC_MRS_WAIT_CNT 0xc8
126#define EMC_MRS_WAIT_CNT_SHORT_WAIT_SHIFT 0
127#define EMC_MRS_WAIT_CNT_SHORT_WAIT_MASK \
128 (0x3FF << EMC_MRS_WAIT_CNT_SHORT_WAIT_SHIFT)
129#define EMC_MRS_WAIT_CNT_LONG_WAIT_SHIFT 16
130#define EMC_MRS_WAIT_CNT_LONG_WAIT_MASK \
131 (0x3FF << EMC_MRS_WAIT_CNT_LONG_WAIT_SHIFT)
132
133#define EMC_MRS 0xcc
134#define EMC_MODE_SET_DLL_RESET (0x1 << 8)
135#define EMC_MODE_SET_LONG_CNT (0x1 << 26)
136#define EMC_EMRS 0xd0
137#define EMC_REF 0xd4
138#define EMC_REF_FORCE_CMD 1
139#define EMC_PRE 0xd8
140#define EMC_NOP 0xdc
141
142#define EMC_SELF_REF 0xe0
143#define EMC_SELF_REF_CMD_ENABLED (0x1 << 0)
144#define EMC_SELF_REF_DEV_SEL_SHIFT 30
145#define EMC_SELF_REF_DEV_SEL_MASK \
146 (0x3 << EMC_SELF_REF_DEV_SEL_SHIFT)
147
148#define EMC_DPD 0xe4
149#define EMC_MRW 0xe8
150
151#define EMC_MRR 0xec
152#define EMC_MRR_DEV_SEL_SHIFT 30
153#define EMC_MRR_DEV_SEL_MASK \
154 (0x3 << EMC_SELF_REF_DEV_SEL_SHIFT)
155#define EMC_MRR_MA_SHIFT 16
156#define EMC_MRR_MA_MASK (0xFF << EMC_MRR_MA_SHIFT)
157#define EMC_MRR_DATA_MASK ((0x1 << EMC_MRR_MA_SHIFT) - 1)
158#define LPDDR2_MR4_TEMP_SHIFT 0
159#define LPDDR2_MR4_TEMP_MASK (0x7 << LPDDR2_MR4_TEMP_SHIFT)
160
161#define EMC_CMDQ 0xf0
162#define EMC_MC2EMCQ 0xf4
163#define EMC_XM2DQSPADCTRL3 0xf8
164#define EMC_XM2DQSPADCTRL3_VREF_ENABLE (0x1 << 5)
165#define EMC_FBIO_SPARE 0x100
166
167#define EMC_FBIO_CFG5 0x104
168#define EMC_CFG5_TYPE_SHIFT 0x0
169#define EMC_CFG5_TYPE_MASK (0x3 << EMC_CFG5_TYPE_SHIFT)
170#define EMC_CFG5_QUSE_MODE_SHIFT 13
171#define EMC_CFG5_QUSE_MODE_MASK \
172 (0x7 << EMC_CFG5_QUSE_MODE_SHIFT)
173enum {
174 EMC_CFG5_QUSE_MODE_NORMAL = 0,
175 EMC_CFG5_QUSE_MODE_ALWAYS_ON,
176 EMC_CFG5_QUSE_MODE_INTERNAL_LPBK,
177 EMC_CFG5_QUSE_MODE_PULSE_INTERN,
178 EMC_CFG5_QUSE_MODE_PULSE_EXTERN,
179 EMC_CFG5_QUSE_MODE_DIRECT_QUSE,
180};
181
182#define EMC_FBIO_WRPTR_EQ_2 0x108
183#define EMC_FBIO_CFG6 0x114
184#define EMC_CFG_RSV 0x120
185#define EMC_ACPD_CONTROL 0x124
186#define EMC_EMRS2 0x12c
187#define EMC_EMRS3 0x130
188#define EMC_MRW2 0x134
189#define EMC_MRW3 0x138
190#define EMC_MRW4 0x13c
191#define EMC_CLKEN_OVERRIDE 0x140
192#define EMC_R2R 0x144
193#define EMC_W2W 0x148
194#define EMC_EINPUT 0x14c
195#define EMC_EINPUT_DURATION 0x150
196#define EMC_PUTERM_EXTRA 0x154
197#define EMC_TCKESR 0x158
198#define EMC_TPD 0x15c
199
200#define EMC_AUTO_CAL_CONFIG 0x2a4
201#define EMC_AUTO_CAL_CONFIG_AUTO_CAL_START_SHIFT 31
202#define EMC_AUTO_CAL_INTERVAL 0x2a8
203#define EMC_AUTO_CAL_STATUS 0x2ac
204#define EMC_AUTO_CAL_STATUS_ACTIVE (0x1 << 31)
205#define EMC_AUTO_CAL_STATUS_SHIFT 31
206#define EMC_REQ_CTRL 0x2b0
207#define EMC_STATUS 0x2b4
208#define EMC_STATUS_TIMING_UPDATE_STALLED (0x1 << 23)
209#define EMC_STATUS_MRR_DIVLD (0x1 << 20)
210
211#define EMC_CFG_2 0x2b8
212#define EMC_CFG_2_MODE_SHIFT 0
213#define EMC_CFG_2_MODE_MASK (0x3 << EMC_CFG_2_MODE_SHIFT)
214#define EMC_CFG_2_SREF_MODE 0x1
215#define EMC_CFG_2_PD_MODE 0x3
216#define EMC_CFG_2_DIS_STP_OB_CLK_DURING_NON_WR (0x1 << 6)
217
218#define EMC_CFG_DIG_DLL 0x2bc
219#define EMC_CFG_DIG_DLL_PERIOD 0x2c0
220#define EMC_DIG_DLL_STATUS 0x2c8
221#define EMC_RDV_MASK 0x2cc
222#define EMC_WDV_MASK 0x2d0
223#define EMC_CTT_DURATION 0x2d8
224#define EMC_CTT_TERM_CTRL 0x2dc
225#define EMC_ZCAL_INTERVAL 0x2e0
226#define EMC_ZCAL_WAIT_CNT 0x2e4
227#define EMC_ZCAL_MRW_CMD 0x2e8
228
229#define EMC_ZQ_CAL 0x2ec
230#define EMC_ZQ_CAL_DEV_SEL_SHIFT 30
231#define EMC_ZQ_CAL_DEV_SEL_MASK \
232 (0x3 << EMC_SELF_REF_DEV_SEL_SHIFT)
233#define EMC_ZQ_CAL_CMD (0x1 << 0)
234#define EMC_ZQ_CAL_LONG (0x1 << 4)
235#define EMC_ZQ_CAL_LONG_CMD_DEV0 \
236 (DRAM_DEV_SEL_0 | EMC_ZQ_CAL_LONG | EMC_ZQ_CAL_CMD)
237#define EMC_ZQ_CAL_LONG_CMD_DEV1 \
238 (DRAM_DEV_SEL_1 | EMC_ZQ_CAL_LONG | EMC_ZQ_CAL_CMD)
239
240#define EMC_XM2CMDPADCTRL 0x2f0
241#define EMC_XM2CMDPADCTRL2 0x2f4
242#define EMC_XM2DQSPADCTRL 0x2f8
243#define EMC_XM2DQSPADCTRL2 0x2fc
244#define EMC_XM2DQSPADCTRL2_RX_FT_REC_ENABLE (0x1 << 0)
245#define EMC_XM2DQSPADCTRL2_VREF_ENABLE (0x1 << 5)
246#define EMC_XM2DQPADCTRL 0x300
247#define EMC_XM2DQPADCTRL2 0x304
248#define EMC_XM2CLKPADCTRL 0x308
249#define EMC_XM2COMPPADCTRL 0x30c
250#define EMC_XM2COMPPADCTRL_VREF_CAL_ENABLE (0x1 << 10)
251#define EMC_XM2VTTGENPADCTRL 0x310
252#define EMC_XM2VTTGENPADCTRL2 0x314
253#define EMC_XM2VTTGENPADCTRL3 0x318
254#define EMC_EMCPADEN 0x31c
255#define EMC_XM2DQSPADCTRL4 0x320
256#define EMC_SCRATCH0 0x324
257#define EMC_DLL_XFORM_DQS0 0x328
258#define EMC_DLL_XFORM_DQS1 0x32c
259#define EMC_DLL_XFORM_DQS2 0x330
260#define EMC_DLL_XFORM_DQS3 0x334
261#define EMC_DLL_XFORM_DQS4 0x338
262#define EMC_DLL_XFORM_DQS5 0x33c
263#define EMC_DLL_XFORM_DQS6 0x340
264#define EMC_DLL_XFORM_DQS7 0x344
265#define EMC_DLL_XFORM_QUSE0 0x348
266#define EMC_DLL_XFORM_QUSE1 0x34c
267#define EMC_DLL_XFORM_QUSE2 0x350
268#define EMC_DLL_XFORM_QUSE3 0x354
269#define EMC_DLL_XFORM_QUSE4 0x358
270#define EMC_DLL_XFORM_QUSE5 0x35c
271#define EMC_DLL_XFORM_QUSE6 0x360
272#define EMC_DLL_XFORM_QUSE7 0x364
273#define EMC_DLL_XFORM_DQ0 0x368
274#define EMC_DLL_XFORM_DQ1 0x36c
275#define EMC_DLL_XFORM_DQ2 0x370
276#define EMC_DLL_XFORM_DQ3 0x374
277#define EMC_DLI_RX_TRIM0 0x378
278#define EMC_DLI_RX_TRIM1 0x37c
279#define EMC_DLI_RX_TRIM2 0x380
280#define EMC_DLI_RX_TRIM3 0x384
281#define EMC_DLI_RX_TRIM4 0x388
282#define EMC_DLI_RX_TRIM5 0x38c
283#define EMC_DLI_RX_TRIM6 0x390
284#define EMC_DLI_RX_TRIM7 0x394
285#define EMC_DLI_TX_TRIM0 0x398
286#define EMC_DLI_TX_TRIM1 0x39c
287#define EMC_DLI_TX_TRIM2 0x3a0
288#define EMC_DLI_TX_TRIM3 0x3a4
289#define EMC_DLI_TRIM_TXDQS0 0x3a8
290#define EMC_DLI_TRIM_TXDQS1 0x3ac
291#define EMC_DLI_TRIM_TXDQS2 0x3b0
292#define EMC_DLI_TRIM_TXDQS3 0x3b4
293#define EMC_DLI_TRIM_TXDQS4 0x3b8
294#define EMC_DLI_TRIM_TXDQS5 0x3bc
295#define EMC_DLI_TRIM_TXDQS6 0x3c0
296#define EMC_DLI_TRIM_TXDQS7 0x3c4
297#define EMC_STALL_THEN_EXE_AFTER_CLKCHANGE 0x3cc
298#define EMC_AUTO_CAL_CLK_STATUS 0x3d4
299#define EMC_SEL_DPD_CTRL 0x3d8
300#define EMC_SEL_DPD_CTRL_DATA_SEL_DPD (0x1 << 8)
301#define EMC_SEL_DPD_CTRL_ODT_SEL_DPD (0x1 << 5)
302#define EMC_SEL_DPD_CTRL_RESET_SEL_DPD (0x1 << 4)
303#define EMC_SEL_DPD_CTRL_CA_SEL_DPD (0x1 << 3)
304#define EMC_SEL_DPD_CTRL_CLK_SEL_DPD (0x1 << 2)
305#define EMC_SEL_DPD_CTRL_DDR3_MASK \
306 ((0xf << 2) | (0x1 << 8))
307#define EMC_SEL_DPD_CTRL_MASK \
308 ((0x3 << 2) | (0x1 << 5) | (0x1 << 8))
309#define EMC_PRE_REFRESH_REQ_CNT 0x3dc
310#define EMC_DYN_SELF_REF_CONTROL 0x3e0
311#define EMC_TXSRDLL 0x3e4
312#define EMC_CCFIFO_ADDR 0x3e8
313#define EMC_CCFIFO_DATA 0x3ec
314#define EMC_CCFIFO_STATUS 0x3f0
315#define EMC_CDB_CNTL_1 0x3f4
316#define EMC_CDB_CNTL_2 0x3f8
317#define EMC_XM2CLKPADCTRL2 0x3fc
318#define EMC_SWIZZLE_RANK0_BYTE_CFG 0x400
319#define EMC_SWIZZLE_RANK0_BYTE0 0x404
320#define EMC_SWIZZLE_RANK0_BYTE1 0x408
321#define EMC_SWIZZLE_RANK0_BYTE2 0x40c
322#define EMC_SWIZZLE_RANK0_BYTE3 0x410
323#define EMC_SWIZZLE_RANK1_BYTE_CFG 0x414
324#define EMC_SWIZZLE_RANK1_BYTE0 0x418
325#define EMC_SWIZZLE_RANK1_BYTE1 0x41c
326#define EMC_SWIZZLE_RANK1_BYTE2 0x420
327#define EMC_SWIZZLE_RANK1_BYTE3 0x424
328#define EMC_CA_TRAINING_START 0x428
329#define EMC_CA_TRAINING_BUSY 0x42c
330#define EMC_CA_TRAINING_CFG 0x430
331#define EMC_CA_TRAINING_TIMING_CNTL1 0x434
332#define EMC_CA_TRAINING_TIMING_CNTL2 0x438
333#define EMC_CA_TRAINING_CA_LEAD_IN 0x43c
334#define EMC_CA_TRAINING_CA 0x440
335#define EMC_CA_TRAINING_CA_LEAD_OUT 0x444
336#define EMC_CA_TRAINING_RESULT1 0x448
337#define EMC_CA_TRAINING_RESULT2 0x44c
338#define EMC_CA_TRAINING_RESULT3 0x450
339#define EMC_CA_TRAINING_RESULT4 0x454
340#define EMC_AUTO_CAL_CONFIG2 0x458
341#define EMC_AUTO_CAL_CONFIG3 0x45c
342#define EMC_AUTO_CAL_STATUS2 0x460
343#define EMC_XM2CMDPADCTRL3 0x464
344#define EMC_IBDLY 0x468
345#define EMC_DLL_XFORM_ADDR0 0x46c
346#define EMC_DLL_XFORM_ADDR1 0x470
347#define EMC_DLL_XFORM_ADDR2 0x474
348#define EMC_DLI_ADDR_TRIM 0x478
349#define EMC_DSR_VTTGEN_DRV 0x47c
350#define EMC_TXDSRVTTGEN 0x480
351#define EMC_XM2CMDPADCTRL4 0x484
352#define EMC_XM2CMDPADCTRL5 0x488
353#define EMC_DLL_XFORM_DQS8 0x4a0
354#define EMC_DLL_XFORM_DQS9 0x4a4
355#define EMC_DLL_XFORM_DQS10 0x4a8
356#define EMC_DLL_XFORM_DQS11 0x4ac
357#define EMC_DLL_XFORM_DQS12 0x4b0
358#define EMC_DLL_XFORM_DQS13 0x4b4
359#define EMC_DLL_XFORM_DQS14 0x4b8
360#define EMC_DLL_XFORM_DQS15 0x4bc
361#define EMC_DLL_XFORM_QUSE8 0x4c0
362#define EMC_DLL_XFORM_QUSE9 0x4c4
363#define EMC_DLL_XFORM_QUSE10 0x4c8
364#define EMC_DLL_XFORM_QUSE11 0x4cc
365#define EMC_DLL_XFORM_QUSE12 0x4d0
366#define EMC_DLL_XFORM_QUSE13 0x4d4
367#define EMC_DLL_XFORM_QUSE14 0x4d8
368#define EMC_DLL_XFORM_QUSE15 0x4dc
369#define EMC_DLL_XFORM_DQ4 0x4e0
370#define EMC_DLL_XFORM_DQ5 0x4e4
371#define EMC_DLL_XFORM_DQ6 0x4e8
372#define EMC_DLL_XFORM_DQ7 0x4ec
373#define EMC_DLI_TRIM_TXDQS8 0x520
374#define EMC_DLI_TRIM_TXDQS9 0x524
375#define EMC_DLI_TRIM_TXDQS10 0x528
376#define EMC_DLI_TRIM_TXDQS11 0x52c
377#define EMC_DLI_TRIM_TXDQS12 0x530
378#define EMC_DLI_TRIM_TXDQS13 0x534
379#define EMC_DLI_TRIM_TXDQS14 0x538
380#define EMC_DLI_TRIM_TXDQS15 0x53c
381#define EMC_CDB_CNTL_3 0x540
382#define EMC_XM2DQSPADCTRL5 0x544
383#define EMC_XM2DQSPADCTRL6 0x548
384#define EMC_XM2DQPADCTRL3 0x54c
385#define EMC_DLL_XFORM_ADDR3 0x550
386#define EMC_DLL_XFORM_ADDR4 0x554
387#define EMC_DLL_XFORM_ADDR5 0x558
388#define EMC_CFG_PIPE 0x560
389#define EMC_QPOP 0x564
390#define EMC_QUSE_WIDTH 0x568
391#define EMC_PUTERM_WIDTH 0x56c
392#define EMC_BGBIAS_CTL0 0x570
393#define EMC_BGBIAS_CTL0_BIAS0_DSC_E_PWRD_IBIAS_RX_SHIFT 0x3
394#define EMC_BGBIAS_CTL0_BIAS0_DSC_E_PWRD_IBIAS_VTTGEN_SHIFT 0x2
395#define EMC_BGBIAS_CTL0_BIAS0_DSC_E_PWRD_SHIFT 0x1
396#define EMC_PUTERM_ADJ 0x574
397
398#define MC_EMEM_CFG 0x50
399#define MC_EMEM_ADR_CFG 0x54
400#define MC_EMEM_ADR_CFG_DEV0 0x58
401#define MC_EMEM_ADR_CFG_DEV1 0x5c
402#define MC_EMEM_ADR_CFG_BANK_MASK_0 0x64
403#define MC_EMEM_ADR_CFG_BANK_MASK_1 0x68
404#define MC_EMEM_ADR_CFG_BANK_MASK_2 0x6c
405
406#define MC_EMEM_ARB_CFG 0x90
407#define MC_EMEM_ARB_OUTSTANDING_REQ 0x94
408#define MC_EMEM_ARB_TIMING_RCD 0x98
409#define MC_EMEM_ARB_TIMING_RP 0x9c
410#define MC_EMEM_ARB_TIMING_RC 0xa0
411#define MC_EMEM_ARB_TIMING_RAS 0xa4
412#define MC_EMEM_ARB_TIMING_FAW 0xa8
413#define MC_EMEM_ARB_TIMING_RRD 0xac
414#define MC_EMEM_ARB_TIMING_RAP2PRE 0xb0
415#define MC_EMEM_ARB_TIMING_WAP2PRE 0xb4
416#define MC_EMEM_ARB_TIMING_R2R 0xb8
417#define MC_EMEM_ARB_TIMING_W2W 0xbc
418#define MC_EMEM_ARB_TIMING_R2W 0xc0
419#define MC_EMEM_ARB_TIMING_W2R 0xc4
420#define MC_EMEM_ARB_DA_TURNS 0xd0
421#define MC_EMEM_ARB_DA_COVERS 0xd4
422#define MC_EMEM_ARB_MISC0 0xd8
423#define MC_EMEM_ARB_MISC0_EMC_SAME_FREQ (0x1 << 27)
424#define MC_EMEM_ARB_MISC1 0xdc
425#define MC_EMEM_ARB_RING1_THROTTLE 0xe0
426#define MC_EMEM_ARB_RING3_THROTTLE 0xe4
427#define MC_EMEM_ARB_OVERRIDE 0xe8
428#define MC_EMEM_ARB_RSV 0xec
429
430#define MC_CLKEN_OVERRIDE 0xf4
431#define MC_TIMING_CONTROL_DBG 0xf8
432#define MC_TIMING_CONTROL 0xfc
433#define MC_EMEM_ARB_ISOCHRONOUS_0 0x208
434#define MC_EMEM_ARB_ISOCHRONOUS_1 0x20c
435#define MC_EMEM_ARB_ISOCHRONOUS_2 0x210
436#define MC_EMEM_ARB_HYSTERESIS_0_0 0x218
437#define MC_EMEM_ARB_HYSTERESIS_1_0 0x21c
438#define MC_EMEM_ARB_HYSTERESIS_2_0 0x220
439#define MC_EMEM_ARB_HYSTERESIS_3_0 0x224
440
441#define HYST_SATAR (0x1 << 31)
442#define HYST_PPCSAHBSLVR (0x1 << 30)
443#define HYST_PPCSAHBDMAR (0x1 << 29)
444#define HYST_MSENCSRD (0x1 << 28)
445#define HYST_HOST1XR (0x1 << 23)
446#define HYST_HOST1XDMAR (0x1 << 22)
447#define HYST_HDAR (0x1 << 21)
448#define HYST_DISPLAYHCB (0x1 << 17)
449#define HYST_DISPLAYHC (0x1 << 16)
450#define HYST_AVPCARM7R (0x1 << 15)
451#define HYST_AFIR (0x1 << 14)
452#define HYST_DISPLAY0CB (0x1 << 6)
453#define HYST_DISPLAY0C (0x1 << 5)
454#define HYST_DISPLAY0BB (0x1 << 4)
455#define HYST_DISPLAY0B (0x1 << 3)
456#define HYST_DISPLAY0AB (0x1 << 2)
457#define HYST_DISPLAY0A (0x1 << 1)
458#define HYST_PTCR (0x1 << 0)
459
460#define HYST_VDEDBGW (0x1 << 31)
461#define HYST_VDEBSEVW (0x1 << 30)
462#define HYST_SATAW (0x1 << 29)
463#define HYST_PPCSAHBSLVW (0x1 << 28)
464#define HYST_PPCSAHBDMAW (0x1 << 27)
465#define HYST_MPCOREW (0x1 << 25)
466#define HYST_MPCORELPW (0x1 << 24)
467#define HYST_HOST1XW (0x1 << 22)
468#define HYST_HDAW (0x1 << 21)
469#define HYST_AVPCARM7W (0x1 << 18)
470#define HYST_AFIW (0x1 << 17)
471#define HYST_MSENCSWR (0x1 << 11)
472#define HYST_MPCORER (0x1 << 7)
473#define HYST_MPCORELPR (0x1 << 6)
474#define HYST_VDETPER (0x1 << 5)
475#define HYST_VDEMCER (0x1 << 4)
476#define HYST_VDEMBER (0x1 << 3)
477#define HYST_VDEBSEVR (0x1 << 2)
478
479#define HYST_DISPLAYT (0x1 << 26)
480#define HYST_GPUSWR (0x1 << 25)
481#define HYST_GPUSRD (0x1 << 24)
482#define HYST_A9AVPSCW (0x1 << 23)
483#define HYST_A9AVPSCR (0x1 << 22)
484#define HYST_TSECSWR (0x1 << 21)
485#define HYST_TSECSRD (0x1 << 20)
486#define HYST_ISPWBB (0x1 << 17)
487#define HYST_ISPWAB (0x1 << 16)
488#define HYST_ISPRAB (0x1 << 14)
489#define HYST_XUSB_DEVW (0x1 << 13)
490#define HYST_XUSB_DEVR (0x1 << 12)
491#define HYST_XUSB_HOSTW (0x1 << 11)
492#define HYST_XUSB_HOSTR (0x1 << 10)
493#define HYST_ISPWB (0x1 << 7)
494#define HYST_ISPWA (0x1 << 6)
495#define HYST_ISPRA (0x1 << 4)
496#define HYST_VDETPMW (0x1 << 1)
497#define HYST_VDEMBEW (0x1 << 0)
498
499#define HYST_DISPLAYD (0x1 << 19)
500#define HYST_VIW (0x1 << 18)
501#define HYST_VICSWR (0x1 << 13)
502#define HYST_VICSRD (0x1 << 12)
503#define HYST_SDMMCWAB (0x1 << 7)
504#define HYST_SDMMCW (0x1 << 6)
505#define HYST_SDMMCWAA (0x1 << 5)
506#define HYST_SDMMCWA (0x1 << 4)
507#define HYST_SDMMCRAB (0x1 << 3)
508#define HYST_SDMMCR (0x1 << 2)
509#define HYST_SDMMCRAA (0x1 << 1)
510#define HYST_SDMMCRA (0x1 << 0)
511
512#define MC_DIS_EXTRA_SNAP_LEVELS 0x2ac
513
514#define MC_LATENCY_ALLOWANCE_AFI_0 0x2e0
515#define MC_LATENCY_ALLOWANCE_AVPC_0 0x2e4
516#define MC_LATENCY_ALLOWANCE_DC_0 0x2e8
517#define MC_LATENCY_ALLOWANCE_DC_1 0x2ec
518#define MC_LATENCY_ALLOWANCE_DC_2 0x2f0
519#define MC_LATENCY_ALLOWANCE_DCB_0 0x2f4
520#define MC_LATENCY_ALLOWANCE_DCB_1 0x2f8
521#define MC_LATENCY_ALLOWANCE_DCB_2 0x2fc
522#define MC_LATENCY_ALLOWANCE_HC_0 0x310
523#define MC_LATENCY_ALLOWANCE_HC_1 0x314
524#define MC_LATENCY_ALLOWANCE_HDA_0 0x318
525#define MC_LATENCY_ALLOWANCE_MPCORE_0 0x320
526#define MC_LATENCY_ALLOWANCE_MPCORELP_0 0x324
527#define MC_LATENCY_ALLOWANCE_MSENC_0 0x328
528#define MC_LATENCY_ALLOWANCE_PPCS_0 0x344
529#define MC_LATENCY_ALLOWANCE_PPCS_1 0x348
530#define MC_LATENCY_ALLOWANCE_PTC_0 0x34c
531#define MC_LATENCY_ALLOWANCE_SATA_0 0x350
532#define MC_LATENCY_ALLOWANCE_VDE_0 0x354
533#define MC_LATENCY_ALLOWANCE_VDE_1 0x358
534#define MC_LATENCY_ALLOWANCE_VDE_2 0x35c
535#define MC_LATENCY_ALLOWANCE_VDE_3 0x360
536#define MC_LATENCY_ALLOWANCE_ISP2_0 0x370
537#define MC_LATENCY_ALLOWANCE_ISP2_1 0x374
538#define MC_LATENCY_ALLOWANCE_XUSB_0 0x37c
539#define MC_LATENCY_ALLOWANCE_XUSB_1 0x380
540#define MC_LATENCY_ALLOWANCE_ISP2B_0 0x384
541#define MC_LATENCY_ALLOWANCE_ISP2B_1 0x388
542#define MC_LATENCY_ALLOWANCE_TSEC_0 0x390
543#define MC_LATENCY_ALLOWANCE_VIC_0 0x394
544#define MC_LATENCY_ALLOWANCE_VI2_0 0x398
545#define MC_LATENCY_ALLOWANCE_A9AVP_0 0x3a4
546#define MC_LATENCY_ALLOWANCE_GPU_0 0x3ac
547#define MC_LATENCY_ALLOWANCE_SDMMCA_0 0x3b8
548#define MC_LATENCY_ALLOWANCE_SDMMCAA_0 0x3bc
549#define MC_LATENCY_ALLOWANCE_SDMMC_0 0x3c0
550#define MC_LATENCY_ALLOWANCE_SDMMCAB_0 0x3c4
551#define MC_LATENCY_ALLOWANCE_DC_3 0x3c8
552
553/* NOTE: this must match the # of MC_LATENCY_XXX above */
554#define T12X_MC_LATENCY_ALLOWANCE_NUM_REGS 38
555
556#define MC_VIDEO_PROTECT_VPR_OVERRIDE 0x418
557#define MC_MLL_MPCORER_PTSA_RATE 0x44c
558#define MC_VIDEO_PROTECT_BOM 0x648
559#define MC_VIDEO_PROTECT_SIZE_MB 0x64c
560#define MC_VIDEO_PROTECT_REG_CTRL 0x650
561
562#define MC_SEC_CARVEOUT_BOM 0x670
563#define MC_SEC_CARVEOUT_SIZE_MB 0x674
564#define MC_SEC_CARVEOUT_REG_CTRL 0x678
565
566#define MC_PTSA_GRANT_DECREMENT 0x960
567
568#define MC_RESERVED_RSV 0x3fc
569#define MC_RESERVED_RSV_1 0x958
570
571#define MC_EMEM_ARB_OUTSTANDING_REQ_RING3 0x66c
572#define MC_EMEM_ARB_OVERRIDE_1 0x968
573
574#endif
diff --git a/include/linux/platform/tegra/tegra21_emc.h b/include/linux/platform/tegra/tegra21_emc.h
new file mode 100644
index 000000000..2d15d683e
--- /dev/null
+++ b/include/linux/platform/tegra/tegra21_emc.h
@@ -0,0 +1,1920 @@
1/*
2 * arch/arm/mach-tegra/tegra21_emc.h
3 *
4 * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 *
20 */
21
22#ifndef _MACH_TEGRA_TEGRA21_EMC_H
23#define _MACH_TEGRA_TEGRA21_EMC_H
24
25#include <linux/platform/tegra/tegra_emc.h>
26#include <linux/platform_data/tegra_emc_pdata.h>
27
28#define DVFS_FGCG_HIGH_SPEED_THRESHOLD 1000
29#define IOBRICK_DCC_THRESHOLD 2400
30#define DVFS_FGCG_MID_SPEED_THRESHOLD 600
31
32/* Uncomment to enable emc debugging on boot. */
33/* #define EMC_CC_DBG */
34#define emc_cc_dbg(mask, fmt, ...) \
35 do { \
36 if (mask & emc_dbg_mask) \
37 pr_info("%s: " fmt, __func__, ##__VA_ARGS__); \
38 } while (0)
39
40/*
41 * Enable flags for specifying verbosity.
42 */
43#define INFO (1 << 0)
44#define STEPS (1 << 1)
45#define SUB_STEPS (1 << 2)
46#define PRELOCK (1 << 3)
47#define PRELOCK_STEPS (1 << 4)
48#define ACTIVE_EN (1 << 5)
49#define PRAMP_UP (1 << 6)
50#define PRAMP_DN (1 << 7)
51#define EMA_WRITES (1 << 10)
52#define EMA_UPDATES (1 << 11)
53#define PER_TRAIN (1 << 16)
54#define CC_PRINT (1 << 17)
55#define CCFIFO (1 << 29)
56#define REGS (1 << 30)
57#define REG_LISTS (1 << 31)
58
59extern unsigned int emc_dbg_mask;
60
61/*
62 * Miscelaneous registers, fields, etc.
63 */
64#define MHZ 1000000
65#define TEGRA_EMC_ISO_USE_FREQ_MAX_NUM 12
66#define PLL_C_DIRECT_FLOOR 333500000
67#define EMC_STATUS_UPDATE_TIMEOUT 1000
68#define TEGRA_EMC_TABLE_MAX_SIZE 16
69
70#define TEGRA_EMC_MODE_REG_17 0x00110000
71#define TEGRA_EMC_MRW_DEV_SHIFT 30
72#define TEGRA_EMC_MRW_DEV1 2
73#define TEGRA_EMC_MRW_DEV2 1
74
75#define MC_EMEM_DEV_SIZE_MASK 0xF
76#define MC_EMEM_DEV_SIZE_SHIFT 16
77
78#define CLK_RST_CONTROLLER_CLK_SOURCE_EMC 0x19c
79#define EMC_CLK_EMC_2X_CLK_SRC_SHIFT 29
80#define EMC_CLK_EMC_2X_CLK_SRC_MASK \
81 (0x7 << EMC_CLK_EMC_2X_CLK_SRC_SHIFT)
82#define EMC_CLK_SOURCE_PLLM 0x0
83#define EMC_CLK_SOURCE_PLLM_LJ 0x4
84#define EMC_CLK_SOURCE_PLLMB 0x6
85#define EMC_CLK_SOURCE_PLLMB_LJ 0x5
86#define EMC_CLK_FORCE_CC_TRIGGER (0x1 << 27)
87#define EMC_CLK_MC_EMC_SAME_FREQ (0x1 << 16)
88#define EMC_CLK_EMC_2X_CLK_DIVISOR_SHIFT 0
89#define EMC_CLK_EMC_2X_CLK_DIVISOR_MASK \
90 (0xff << EMC_CLK_EMC_2X_CLK_DIVISOR_SHIFT)
91
92#define CLK_RST_CONTROLLER_CLK_OUT_ENB_X_SET 0x284
93#define CLK_RST_CONTROLLER_CLK_OUT_ENB_X_CLR 0x288
94
95#define CLK_OUT_ENB_X_CLK_ENB_EMC_DLL (1 << 14)
96
97#define CLK_RST_CONTROLLER_CLK_SOURCE_EMC_DLL 0x664
98#define DLL_CLK_EMC_DLL_CLK_SRC_SHIFT 29
99#define DLL_CLK_EMC_DLL_CLK_SRC_MASK \
100 (0x7 << DLL_CLK_EMC_DLL_CLK_SRC_SHIFT)
101#define DLL_CLK_EMC_DLL_DDLL_CLK_SEL_SHIFT 10
102#define DLL_CLK_EMC_DLL_DDLL_CLK_SEL_MASK \
103 (0x3 << DLL_CLK_EMC_DLL_DDLL_CLK_SEL_SHIFT)
104#define PLLM_VCOA 0
105#define PLLM_VCOB 1
106#define EMC_DLL_SWITCH_OUT 2
107#define DLL_CLK_EMC_DLL_CLK_DIVISOR_SHIFT 0
108#define DLL_CLK_EMC_DLL_CLK_DIVISOR_MASK \
109 (0xff << DLL_CLK_EMC_DLL_CLK_DIVISOR_SHIFT)
110
111/*
112 * Lists of MC/EMC registers.
113 */
114#define BURST_PERCH_LIST \
115 DEFINE_REG(TEGRA_EMC0_BASE, EMC_MRW10), \
116 DEFINE_REG(TEGRA_EMC1_BASE, EMC_MRW10), \
117 DEFINE_REG(TEGRA_EMC0_BASE, EMC_MRW11), \
118 DEFINE_REG(TEGRA_EMC1_BASE, EMC_MRW11), \
119 DEFINE_REG(TEGRA_EMC0_BASE, EMC_MRW12), \
120 DEFINE_REG(TEGRA_EMC1_BASE, EMC_MRW12), \
121 DEFINE_REG(TEGRA_EMC0_BASE, EMC_MRW13), \
122 DEFINE_REG(TEGRA_EMC1_BASE, EMC_MRW13), \
123
124#define BURST_REG_LIST \
125 DEFINE_REG(TEGRA_EMC_BASE, EMC_RC), \
126 DEFINE_REG(TEGRA_EMC_BASE, EMC_RFC), \
127 DEFINE_REG(TEGRA_EMC_BASE, EMC_RFCPB), \
128 DEFINE_REG(TEGRA_EMC_BASE, EMC_REFCTRL2), \
129 DEFINE_REG(TEGRA_EMC_BASE, EMC_RFC_SLR), \
130 DEFINE_REG(TEGRA_EMC_BASE, EMC_RAS), \
131 DEFINE_REG(TEGRA_EMC_BASE, EMC_RP), \
132 DEFINE_REG(TEGRA_EMC_BASE, EMC_R2W), \
133 DEFINE_REG(TEGRA_EMC_BASE, EMC_W2R), \
134 DEFINE_REG(TEGRA_EMC_BASE, EMC_R2P), \
135 DEFINE_REG(TEGRA_EMC_BASE, EMC_W2P), \
136 DEFINE_REG(TEGRA_EMC_BASE, EMC_R2R), \
137 DEFINE_REG(TEGRA_EMC_BASE, EMC_TPPD), \
138 DEFINE_REG(TEGRA_EMC_BASE, EMC_CCDMW), \
139 DEFINE_REG(TEGRA_EMC_BASE, EMC_RD_RCD), \
140 DEFINE_REG(TEGRA_EMC_BASE, EMC_WR_RCD), \
141 DEFINE_REG(TEGRA_EMC_BASE, EMC_RRD), \
142 DEFINE_REG(TEGRA_EMC_BASE, EMC_REXT), \
143 DEFINE_REG(TEGRA_EMC_BASE, EMC_WEXT), \
144 DEFINE_REG(TEGRA_EMC_BASE, EMC_WDV_CHK), \
145 DEFINE_REG(TEGRA_EMC_BASE, EMC_WDV), \
146 DEFINE_REG(TEGRA_EMC_BASE, EMC_WSV), \
147 DEFINE_REG(TEGRA_EMC_BASE, EMC_WEV), \
148 DEFINE_REG(TEGRA_EMC_BASE, EMC_WDV_MASK), \
149 DEFINE_REG(TEGRA_EMC_BASE, EMC_WS_DURATION), \
150 DEFINE_REG(TEGRA_EMC_BASE, EMC_WE_DURATION), \
151 DEFINE_REG(TEGRA_EMC_BASE, EMC_QUSE), \
152 DEFINE_REG(TEGRA_EMC_BASE, EMC_QUSE_WIDTH), \
153 DEFINE_REG(TEGRA_EMC_BASE, EMC_IBDLY), \
154 DEFINE_REG(TEGRA_EMC_BASE, EMC_OBDLY), \
155 DEFINE_REG(TEGRA_EMC_BASE, EMC_EINPUT), \
156 DEFINE_REG(TEGRA_EMC_BASE, EMC_MRW6), \
157 DEFINE_REG(TEGRA_EMC_BASE, EMC_EINPUT_DURATION), \
158 DEFINE_REG(TEGRA_EMC_BASE, EMC_PUTERM_EXTRA), \
159 DEFINE_REG(TEGRA_EMC_BASE, EMC_PUTERM_WIDTH), \
160 DEFINE_REG(TEGRA_EMC_BASE, EMC_QRST), \
161 DEFINE_REG(TEGRA_EMC_BASE, EMC_QSAFE), \
162 DEFINE_REG(TEGRA_EMC_BASE, EMC_RDV), \
163 DEFINE_REG(TEGRA_EMC_BASE, EMC_RDV_MASK), \
164 DEFINE_REG(TEGRA_EMC_BASE, EMC_RDV_EARLY), \
165 DEFINE_REG(TEGRA_EMC_BASE, EMC_RDV_EARLY_MASK), \
166 DEFINE_REG(TEGRA_EMC_BASE, EMC_REFRESH), \
167 DEFINE_REG(TEGRA_EMC_BASE, EMC_BURST_REFRESH_NUM), \
168 DEFINE_REG(TEGRA_EMC_BASE, EMC_PRE_REFRESH_REQ_CNT), \
169 DEFINE_REG(TEGRA_EMC_BASE, EMC_PDEX2WR), \
170 DEFINE_REG(TEGRA_EMC_BASE, EMC_PDEX2RD), \
171 DEFINE_REG(TEGRA_EMC_BASE, EMC_PCHG2PDEN), \
172 DEFINE_REG(TEGRA_EMC_BASE, EMC_ACT2PDEN), \
173 DEFINE_REG(TEGRA_EMC_BASE, EMC_AR2PDEN), \
174 DEFINE_REG(TEGRA_EMC_BASE, EMC_RW2PDEN), \
175 DEFINE_REG(TEGRA_EMC_BASE, EMC_CKE2PDEN), \
176 DEFINE_REG(TEGRA_EMC_BASE, EMC_PDEX2CKE), \
177 DEFINE_REG(TEGRA_EMC_BASE, EMC_PDEX2MRR), \
178 DEFINE_REG(TEGRA_EMC_BASE, EMC_TXSR), \
179 DEFINE_REG(TEGRA_EMC_BASE, EMC_TXSRDLL), \
180 DEFINE_REG(TEGRA_EMC_BASE, EMC_TCKE), \
181 DEFINE_REG(TEGRA_EMC_BASE, EMC_TCKESR), \
182 DEFINE_REG(TEGRA_EMC_BASE, EMC_TPD), \
183 DEFINE_REG(TEGRA_EMC_BASE, EMC_TFAW), \
184 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRPAB), \
185 DEFINE_REG(TEGRA_EMC_BASE, EMC_TCLKSTABLE), \
186 DEFINE_REG(TEGRA_EMC_BASE, EMC_TCLKSTOP), \
187 DEFINE_REG(TEGRA_EMC_BASE, EMC_MRW7), \
188 DEFINE_REG(TEGRA_EMC_BASE, EMC_TREFBW), \
189 DEFINE_REG(TEGRA_EMC_BASE, EMC_ODT_WRITE), \
190 DEFINE_REG(TEGRA_EMC_BASE, EMC_FBIO_CFG5), \
191 DEFINE_REG(TEGRA_EMC_BASE, EMC_FBIO_CFG7), \
192 DEFINE_REG(TEGRA_EMC_BASE, EMC_CFG_DIG_DLL), \
193 DEFINE_REG(TEGRA_EMC_BASE, EMC_CFG_DIG_DLL_PERIOD), \
194 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_RXRT), \
195 DEFINE_REG(TEGRA_EMC_BASE, EMC_CFG_PIPE_1), \
196 DEFINE_REG(TEGRA_EMC_BASE, EMC_CFG_PIPE_2), \
197 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_QUSE_DDLL_RANK0_4), \
198 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_QUSE_DDLL_RANK0_5), \
199 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_QUSE_DDLL_RANK1_4), \
200 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_QUSE_DDLL_RANK1_5), \
201 DEFINE_REG(TEGRA_EMC_BASE, EMC_MRW8), \
202 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_4), \
203 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_5), \
204 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_0), \
205 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_1), \
206 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_2), \
207 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_3), \
208 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_4), \
209 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_5), \
210 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_0), \
211 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_1), \
212 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_2), \
213 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_3), \
214 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_4), \
215 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_5), \
216 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DDLL_LONG_CMD_0), \
217 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DDLL_LONG_CMD_1), \
218 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DDLL_LONG_CMD_2), \
219 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DDLL_LONG_CMD_3), \
220 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DDLL_LONG_CMD_4), \
221 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DDLL_SHORT_CMD_0), \
222 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DDLL_SHORT_CMD_1), \
223 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DDLL_SHORT_CMD_2), \
224 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_3), \
225 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_3), \
226 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_3), \
227 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_3), \
228 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_3), \
229 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_3), \
230 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_3), \
231 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_3), \
232 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_3), \
233 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_3), \
234 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_3), \
235 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_3), \
236 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_3), \
237 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_3), \
238 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_3), \
239 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_3), \
240 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_3), \
241 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_3), \
242 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_3), \
243 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_3), \
244 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_0), \
245 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_1), \
246 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_2), \
247 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_3), \
248 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_0), \
249 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_1), \
250 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_2), \
251 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_3), \
252 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_0), \
253 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_1), \
254 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_2), \
255 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_3), \
256 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_0), \
257 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_1), \
258 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_2), \
259 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_3), \
260 DEFINE_REG(TEGRA_EMC_BASE, EMC_TXDSRVTTGEN), \
261 DEFINE_REG(TEGRA_EMC_BASE, EMC_FDPD_CTRL_DQ), \
262 DEFINE_REG(TEGRA_EMC_BASE, EMC_FDPD_CTRL_CMD), \
263 DEFINE_REG(TEGRA_EMC_BASE, EMC_FBIO_SPARE), \
264 DEFINE_REG(TEGRA_EMC_BASE, EMC_ZCAL_INTERVAL), \
265 DEFINE_REG(TEGRA_EMC_BASE, EMC_ZCAL_WAIT_CNT), \
266 DEFINE_REG(TEGRA_EMC_BASE, EMC_MRS_WAIT_CNT), \
267 DEFINE_REG(TEGRA_EMC_BASE, EMC_MRS_WAIT_CNT2), \
268 DEFINE_REG(TEGRA_EMC_BASE, EMC_AUTO_CAL_CHANNEL), \
269 DEFINE_REG(TEGRA_EMC_BASE, EMC_DLL_CFG_0), \
270 DEFINE_REG(TEGRA_EMC_BASE, EMC_DLL_CFG_1), \
271 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_AUTOCAL_CFG_COMMON), \
272 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_ZCTRL), \
273 DEFINE_REG(TEGRA_EMC_BASE, EMC_CFG), \
274 DEFINE_REG(TEGRA_EMC_BASE, EMC_CFG_PIPE), \
275 DEFINE_REG(TEGRA_EMC_BASE, EMC_DYN_SELF_REF_CONTROL), \
276 DEFINE_REG(TEGRA_EMC_BASE, EMC_QPOP), \
277 DEFINE_REG(TEGRA_EMC_BASE, EMC_DQS_BRLSHFT_0), \
278 DEFINE_REG(TEGRA_EMC_BASE, EMC_DQS_BRLSHFT_1), \
279 DEFINE_REG(TEGRA_EMC_BASE, EMC_CMD_BRLSHFT_2), \
280 DEFINE_REG(TEGRA_EMC_BASE, EMC_CMD_BRLSHFT_3), \
281 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_PAD_CFG_CTRL), \
282 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DATA_PAD_RX_CTRL), \
283 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_CMD_PAD_RX_CTRL), \
284 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DATA_RX_TERM_MODE), \
285 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_CMD_RX_TERM_MODE), \
286 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_CMD_PAD_TX_CTRL), \
287 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DATA_PAD_TX_CTRL), \
288 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_COMMON_PAD_TX_CTRL), \
289 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_VTTGEN_CTRL_0), \
290 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_VTTGEN_CTRL_1), \
291 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_VTTGEN_CTRL_2), \
292 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_BRICK_CTRL_RFU1), \
293 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_CMD_BRICK_CTRL_FDPD), \
294 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_BRICK_CTRL_RFU2), \
295 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DATA_BRICK_CTRL_FDPD), \
296 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_BG_BIAS_CTRL_0), \
297 DEFINE_REG(TEGRA_EMC_BASE, EMC_CFG_3), \
298 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_TX_PWRD_0), \
299 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_TX_PWRD_1), \
300 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_TX_PWRD_2), \
301 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_TX_PWRD_3), \
302 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_TX_PWRD_4), \
303 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_TX_PWRD_5), \
304 DEFINE_REG(TEGRA_EMC_BASE, EMC_CONFIG_SAMPLE_DELAY), \
305 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_TX_SEL_CLK_SRC_0), \
306 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_TX_SEL_CLK_SRC_1), \
307 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_TX_SEL_CLK_SRC_2), \
308 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_TX_SEL_CLK_SRC_3), \
309 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_TX_SEL_CLK_SRC_4), \
310 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_TX_SEL_CLK_SRC_5), \
311 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DDLL_BYPASS), \
312 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DDLL_PWRD_0), \
313 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DDLL_PWRD_1), \
314 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_DDLL_PWRD_2), \
315 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_CMD_CTRL_0), \
316 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_CMD_CTRL_1), \
317 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_CMD_CTRL_2), \
318 DEFINE_REG(TEGRA_EMC_BASE, EMC_TR_TIMING_0), \
319 DEFINE_REG(TEGRA_EMC_BASE, EMC_TR_DVFS), \
320 DEFINE_REG(TEGRA_EMC_BASE, EMC_TR_CTRL_1), \
321 DEFINE_REG(TEGRA_EMC_BASE, EMC_TR_RDV), \
322 DEFINE_REG(TEGRA_EMC_BASE, EMC_TR_QPOP), \
323 DEFINE_REG(TEGRA_EMC_BASE, EMC_TR_RDV_MASK), \
324 DEFINE_REG(TEGRA_EMC_BASE, EMC_MRW14), \
325 DEFINE_REG(TEGRA_EMC_BASE, EMC_TR_QSAFE), \
326 DEFINE_REG(TEGRA_EMC_BASE, EMC_TR_QRST), \
327 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_CTRL), \
328 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_SETTLE), \
329 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_VREF_SETTLE), \
330 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_CA_FINE_CTRL), \
331 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_CA_CTRL_MISC), \
332 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_CA_CTRL_MISC1), \
333 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_CA_VREF_CTRL), \
334 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_QUSE_CORS_CTRL), \
335 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_QUSE_FINE_CTRL), \
336 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_QUSE_CTRL_MISC), \
337 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_QUSE_VREF_CTRL), \
338 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_READ_FINE_CTRL), \
339 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_READ_CTRL_MISC), \
340 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_READ_VREF_CTRL), \
341 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_WRITE_FINE_CTRL), \
342 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_WRITE_CTRL_MISC), \
343 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_WRITE_VREF_CTRL), \
344 DEFINE_REG(TEGRA_EMC_BASE, EMC_TRAINING_MPC), \
345 DEFINE_REG(TEGRA_EMC_BASE, EMC_MRW15)
346
347
348#define TRIM_PERCH_REG_LIST \
349 DEFINE_REG(TEGRA_EMC0_BASE, EMC_CMD_BRLSHFT_0), \
350 DEFINE_REG(TEGRA_EMC1_BASE, EMC_CMD_BRLSHFT_1), \
351 DEFINE_REG(TEGRA_EMC0_BASE, EMC_DATA_BRLSHFT_0), \
352 DEFINE_REG(TEGRA_EMC1_BASE, EMC_DATA_BRLSHFT_0), \
353 DEFINE_REG(TEGRA_EMC0_BASE, EMC_DATA_BRLSHFT_1), \
354 DEFINE_REG(TEGRA_EMC1_BASE, EMC_DATA_BRLSHFT_1), \
355 DEFINE_REG(TEGRA_EMC0_BASE, EMC_QUSE_BRLSHFT_0), \
356 DEFINE_REG(TEGRA_EMC1_BASE, EMC_QUSE_BRLSHFT_1), \
357 DEFINE_REG(TEGRA_EMC0_BASE, EMC_QUSE_BRLSHFT_2), \
358 DEFINE_REG(TEGRA_EMC1_BASE, EMC_QUSE_BRLSHFT_3)
359
360#define TRIM_REG_LIST \
361 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_0), \
362 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_1), \
363 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_2), \
364 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_3), \
365 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_0), \
366 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_1), \
367 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_2), \
368 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_3), \
369 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_0), \
370 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_1), \
371 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_2), \
372 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_0), \
373 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_1), \
374 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_2), \
375 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_0), \
376 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_1), \
377 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_2), \
378 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_0), \
379 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_1), \
380 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_2), \
381 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_0), \
382 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_1), \
383 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_2), \
384 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_0), \
385 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_1), \
386 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_2), \
387 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_0), \
388 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_1), \
389 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_2), \
390 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_0), \
391 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_1), \
392 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_2), \
393 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_0), \
394 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_1), \
395 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_2), \
396 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_0), \
397 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_1), \
398 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_2), \
399 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_0), \
400 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_1), \
401 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_2), \
402 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_0), \
403 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_1), \
404 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_2), \
405 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_0), \
406 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_1), \
407 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_2), \
408 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_0), \
409 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_1), \
410 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_2), \
411 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_0), \
412 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_1), \
413 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_2), \
414 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_0), \
415 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_1), \
416 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_2), \
417 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_VREF_DQS_0), \
418 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_VREF_DQS_1), \
419 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_VREF_DQ_0), \
420 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_IB_VREF_DQ_1), \
421 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0), \
422 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1), \
423 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2), \
424 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3), \
425 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_4), \
426 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_5), \
427 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0), \
428 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1), \
429 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2), \
430 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3), \
431 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_0), \
432 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_1), \
433 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_2), \
434 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_0), \
435 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_1), \
436 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_2), \
437 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_0), \
438 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_1), \
439 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_2), \
440 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_0), \
441 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_1), \
442 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_2), \
443 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_0), \
444 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_1), \
445 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_2), \
446 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_0), \
447 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_1), \
448 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_2), \
449 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_0), \
450 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_1), \
451 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_2), \
452 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_0), \
453 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_1), \
454 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_2), \
455 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_0), \
456 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_1), \
457 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_2), \
458 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_0), \
459 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_1), \
460 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_2), \
461 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_0), \
462 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_1), \
463 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_2), \
464 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_0), \
465 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_1), \
466 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_2), \
467 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_0), \
468 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_1), \
469 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_2), \
470 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_0), \
471 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_1), \
472 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_2), \
473 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_0), \
474 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_1), \
475 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_2), \
476 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_0), \
477 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_1), \
478 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_2), \
479 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_0), \
480 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_1), \
481 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_2), \
482 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_0), \
483 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_1), \
484 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_2), \
485 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_0), \
486 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_1), \
487 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_2), \
488 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_0), \
489 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_1), \
490 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_2), \
491 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_QUSE_DDLL_RANK0_0), \
492 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_QUSE_DDLL_RANK0_1), \
493 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_QUSE_DDLL_RANK0_2), \
494 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_QUSE_DDLL_RANK0_3), \
495 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_QUSE_DDLL_RANK1_0), \
496 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_QUSE_DDLL_RANK1_1), \
497 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_QUSE_DDLL_RANK1_2), \
498 DEFINE_REG(TEGRA_EMC_BASE, EMC_PMACRO_QUSE_DDLL_RANK1_3)
499
500#define BURST_MC_REG_LIST \
501 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_CFG), \
502 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_OUTSTANDING_REQ), \
503 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_REFPB_HP_CTRL), \
504 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_REFPB_BANK_CTRL), \
505 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_RCD), \
506 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_RP), \
507 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_RC), \
508 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_RAS), \
509 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_FAW), \
510 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_RRD), \
511 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_RAP2PRE), \
512 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_WAP2PRE), \
513 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_R2R), \
514 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_W2W), \
515 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_R2W), \
516 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_CCDMW), \
517 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_W2R), \
518 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_TIMING_RFCPB), \
519 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_DA_TURNS), \
520 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_DA_COVERS), \
521 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_MISC0), \
522 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_MISC1), \
523 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_MISC2), \
524 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_RING1_THROTTLE), \
525 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_DHYST_CTRL), \
526 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_0), \
527 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_1), \
528 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_2), \
529 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_3), \
530 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_4), \
531 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_5), \
532 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_6), \
533 DEFINE_REG(TEGRA_MC_BASE, MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_7), \
534
535#define BURST_UP_DOWN_REG_LIST \
536 DEFINE_REG(TEGRA_MC_BASE, MC_MLL_MPCORER_PTSA_RATE), \
537 DEFINE_REG(TEGRA_MC_BASE, MC_FTOP_PTSA_RATE), \
538 DEFINE_REG(TEGRA_MC_BASE, MC_PTSA_GRANT_DECREMENT), \
539 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_XUSB_0), \
540 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_XUSB_1), \
541 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_TSEC_0), \
542 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_SDMMCA_0), \
543 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_SDMMCAA_0), \
544 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_SDMMC_0), \
545 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_SDMMCAB_0), \
546 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_PPCS_0), \
547 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_PPCS_1), \
548 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_MPCORE_0), \
549 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_HC_0), \
550 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_HC_1), \
551 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_AVPC_0), \
552 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_GPU_0), \
553 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_GPU2_0), \
554 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_NVENC_0), \
555 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_NVDEC_0), \
556 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_VIC_0), \
557 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_VI2_0), \
558 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_ISP2_0), \
559 DEFINE_REG(TEGRA_MC_BASE, MC_LATENCY_ALLOWANCE_ISP2_1)
560
561#define VREF_PERCH_REG_LIST \
562 DEFINE_REG(TEGRA_EMC0_BASE, EMC_TRAINING_OPT_DQS_IB_VREF_RANK0), \
563 DEFINE_REG(TEGRA_EMC1_BASE, EMC_TRAINING_OPT_DQS_IB_VREF_RANK0), \
564 DEFINE_REG(TEGRA_EMC0_BASE, EMC_TRAINING_OPT_DQS_IB_VREF_RANK1), \
565 DEFINE_REG(TEGRA_EMC1_BASE, EMC_TRAINING_OPT_DQS_IB_VREF_RANK1), \
566
567#define DEFINE_REG(base, reg) reg##_INDEX
568enum {
569 BURST_REG_LIST
570};
571enum {
572 BURST_MC_REG_LIST
573};
574enum {
575 TRIM_REG_LIST
576};
577
578/*
579 * Defines a sequence this driver supports. Used for maintaining a list of
580 * different revisions.
581 */
582struct supported_sequence {
583 u8 table_rev;
584 void (*set_clock)(struct tegra21_emc_table *next_timing,
585 struct tegra21_emc_table *last_timing,
586 int training, u32 clksrc);
587 u32 (*periodic_compensation)(struct tegra21_emc_table *last_timing);
588 char *seq_rev;
589};
590
591/*
592 * Functions common across different CC sequence revisions.
593 */
594void emc_writel(u32 val, unsigned long addr);
595u32 emc_readl(unsigned long addr);
596u32 emc1_readl(unsigned long addr);
597void emc1_writel(u32 val, unsigned long addr);
598void mc_writel(u32 val, unsigned long addr);
599u32 mc_readl(unsigned long addr);
600struct tegra21_emc_table *
601 get_timing_from_freq(unsigned long freq);
602int wait_for_update(u32 status_reg, u32 bit_mask, bool updated_state,
603 int chan);
604void emc_timing_update(int dual_chan);
605void do_clock_change(u32 clk_setting);
606void emc_set_shadow_bypass(int set);
607u32 get_dll_state(struct tegra21_emc_table *next_timing);
608u32 div_o3(u32 a, u32 b);
609void ccfifo_writel(u32 val, unsigned long addr, u32 delay);
610struct tegra21_emc_table *emc_get_table(unsigned long over_temp_state);
611void __emc_copy_table_params(struct tegra21_emc_table *src,
612 struct tegra21_emc_table *dst, int flags);
613void set_over_temp_timing(struct tegra21_emc_table *next_timing,
614 unsigned long state);
615
616/*
617 * Only share these functions between the V21015 and V21021 sequences. Those
618 * specific C files declare these defines before including tegra_emc.h.
619 */
620#if defined(__TEGRA_EMC_V21015) || defined(__TEGRA_EMC_V21021)
621u32 actual_osc_clocks(u32 in);
622void __reset_dram_clktree_values(struct tegra21_emc_table *table);
623u32 apply_periodic_compensation_trimmer(
624 struct tegra21_emc_table *next_timing, u32 offset);
625void __update_emc_alt_timing(struct tegra21_emc_table *current_timing);
626void start_periodic_compensation(void);
627u32 do_dvfs_power_ramp_down(u32 clk, int flip_backward,
628 struct tegra21_emc_table *last_timing,
629 struct tegra21_emc_table *next_timing);
630u32 do_dvfs_power_ramp_up(u32 clk, int flip_backward,
631 struct tegra21_emc_table *last_timing,
632 struct tegra21_emc_table *next_timing);
633void change_dll_src(struct tegra21_emc_table *next_timing, u32 clksrc);
634u32 dll_prelock(struct tegra21_emc_table *next_timing,
635 int dvfs_with_training, u32 clksrc);
636void dll_disable(int channel_mode);
637void dll_enable(int channel_mode);
638#endif
639
640extern int ccfifo_index;
641extern void __iomem *emc_base;
642extern void __iomem *emc1_base;
643extern void __iomem *mc_base;
644extern void __iomem *clk_base;
645extern unsigned long dram_over_temp_state;
646
647extern struct tegra21_emc_table *tegra_emc_table;
648extern struct tegra21_emc_table *tegra_emc_table_derated;
649extern int tegra_emc_table_size;
650
651/*
652 * EMC register lists.
653 */
654extern void __iomem *burst_reg_off[];
655extern void __iomem *burst_perch_reg_off[];
656extern void __iomem *vref_reg_off[];
657extern void __iomem *trim_reg_off[];
658extern void __iomem *trim_perch_reg_off[];
659extern void __iomem *la_scale_off_regs[];
660extern void __iomem *burst_mc_reg_off[];
661
662/*
663 * Versions of the clock change we support.
664 */
665void emc_set_clock_r21012(struct tegra21_emc_table *next_timing,
666 struct tegra21_emc_table *last_timing,
667 int training, u32 clksrc);
668void emc_set_clock_r21015(struct tegra21_emc_table *next_timing,
669 struct tegra21_emc_table *last_timing,
670 int training, u32 clksrc);
671void emc_set_clock_r21021(struct tegra21_emc_table *next_timing,
672 struct tegra21_emc_table *last_timing,
673 int training, u32 clksrc);
674u32 __do_periodic_emc_compensation_r21015(
675 struct tegra21_emc_table *current_timing);
676u32 __do_periodic_emc_compensation_r21021(
677 struct tegra21_emc_table *current_timing);
678
679#define EMC_COPY_TABLE_PARAM_PERIODIC_FIELDS 0x1
680#define EMC_COPY_TABLE_PARAM_TRIM_REGS 0x2
681#define EMC_COPY_TABLE_PARAM_PTFV_FIELDS 0x3
682
683enum {
684 DLL_CHANGE_NONE = 0,
685 DLL_CHANGE_ON,
686 DLL_CHANGE_OFF,
687};
688
689enum {
690 DLL_OFF,
691 DLL_ON
692};
693
694enum {
695 /* Use auto power-down clk change. If CL/WL not changing (cya_mrs=1),
696 fall back to ap20 mode. */
697 AUTO_PD = 0,
698
699 /* SW explicitly enters/exits self-ref in clk change, the only option
700 for ddr3 dll-off sequence. */
701 MAN_SR = 2
702};
703
704enum {
705 ASSEMBLY = 0, /* I.e shadow registers. */
706 ACTIVE
707};
708
709enum {
710 T_RP = 0,
711 T_FC_LPDDR4,
712 T_RFC,
713 T_PDEX,
714 RL
715};
716
717enum {
718 ONE_RANK = 1,
719 TWO_RANK = 2
720};
721
722enum {
723 SINGLE_CHANNEL = 0,
724 DUAL_CHANNEL
725};
726
727enum {
728 DRAM_DEV_SEL_ALL = 0,
729 DRAM_DEV_SEL_0 = (2 << 30),
730 DRAM_DEV_SEL_1 = (1 << 30),
731};
732#define DRAM_BROADCAST(num) \
733 (((num) > 1) ? DRAM_DEV_SEL_ALL : DRAM_DEV_SEL_0)
734
735enum {
736 EMC_CFG5_QUSE_MODE_NORMAL = 0,
737 EMC_CFG5_QUSE_MODE_ALWAYS_ON,
738 EMC_CFG5_QUSE_MODE_INTERNAL_LPBK,
739 EMC_CFG5_QUSE_MODE_PULSE_INTERN,
740 EMC_CFG5_QUSE_MODE_PULSE_EXTERN,
741 EMC_CFG5_QUSE_MODE_DIRECT_QUSE,
742};
743
744enum {
745 DVFS_SEQUENCE = 1,
746 WRITE_TRAINING_SEQUENCE = 2,
747 PERIODIC_TRAINING_SEQUENCE = 3,
748 DVFS_PT1 = 10,
749 DVFS_UPDATE = 11,
750 TRAINING_PT1 = 12,
751 TRAINING_UPDATE = 13,
752 PERIODIC_TRAINING_UPDATE = 14
753};
754
755/*
756 * PTFV defines - basically just indexes into the per table PTFV array.
757 */
758#define PTFV_DQSOSC_MOVAVG_C0D0U0_INDEX 0
759#define PTFV_DQSOSC_MOVAVG_C0D0U1_INDEX 1
760#define PTFV_DQSOSC_MOVAVG_C0D1U0_INDEX 2
761#define PTFV_DQSOSC_MOVAVG_C0D1U1_INDEX 3
762#define PTFV_DQSOSC_MOVAVG_C1D0U0_INDEX 4
763#define PTFV_DQSOSC_MOVAVG_C1D0U1_INDEX 5
764#define PTFV_DQSOSC_MOVAVG_C1D1U0_INDEX 6
765#define PTFV_DQSOSC_MOVAVG_C1D1U1_INDEX 7
766#define PTFV_DVFS_SAMPLES_INDEX 9
767#define PTFV_MOVAVG_WEIGHT_INDEX 10
768#define PTFV_CONFIG_CTRL_INDEX 11
769
770#define PTFV_CONFIG_CTRL_USE_PREVIOUS_EMA (1 << 0)
771
772/* Registers and fields. */
773#define EMC_INTSTATUS 0x0
774#define EMC_INTSTATUS_MRR_DIVLD (0x1 << 5)
775#define EMC_INTSTATUS_CLKCHANGE_COMPLETE (0x1 << 4)
776
777#define EMC_INTMASK 0x4
778#define EMC_DBG 0x8
779#define EMC_DBG_WRITE_MUX_ACTIVE (1 << 1)
780#define EMC_DBG_CFG_SWAP_SHIFT 26
781#define EMC_DBG_CFG_SWAP_MASK \
782 (0x3 << EMC_DBG_CFG_SWAP_SHIFT)
783#define EMC_DBG_WRITE_ACTIVE_ONLY (1 << 30)
784
785#define EMC_CONFIG_SAMPLE_DELAY 0x5f0
786#define EMC_CFG_UPDATE 0x5f4
787#define EMC_CFG_UPDATE_UPDATE_DLL_IN_UPDATE_SHIFT 9
788#define EMC_CFG_UPDATE_UPDATE_DLL_IN_UPDATE_MASK \
789 (0x3 << EMC_CFG_UPDATE_UPDATE_DLL_IN_UPDATE_SHIFT)
790
791#define EMC_CFG 0xc
792#define EMC_CFG_DRAM_CLKSTOP_PD (1 << 31)
793#define EMC_CFG_DRAM_CLKSTOP_SR (1 << 30)
794#define EMC_CFG_DRAM_ACPD (1 << 29)
795#define EMC_CFG_DYN_SELF_REF (1 << 28)
796#define EMC_CFG_REQACT_ASYNC (1 << 26)
797#define EMC_CFG_AUTO_PRE_WR (1 << 25)
798#define EMC_CFG_AUTO_PRE_RD (1 << 24)
799#define EMC_CFG_MAM_PRE_WR (1 << 23)
800#define EMC_CFG_MAN_PRE_RD (1 << 22)
801#define EMC_CFG_PERIODIC_QRST (1 << 21)
802#define EMC_CFG_PERIODIC_QRST_SHIFT (21)
803#define EMC_CFG_EN_DYNAMIC_PUTERM (1 << 20)
804#define EMC_CFG_DLY_WR_DQ_HALF_CLOCK (1 << 19)
805#define EMC_CFG_DSR_VTTGEN_DRV_EN (1 << 18)
806#define EMC_CFG_EMC2MC_CLK_RATIO (3 << 16)
807#define EMC_CFG_WAIT_FOR_ISP2B_READY_B4_CC (1 << 9)
808#define EMC_CFG_WAIT_FOR_VI2_READY_B4_CC (1 << 8)
809#define EMC_CFG_WAIT_FOR_ISP2_READY_B4_CC (1 << 7)
810#define EMC_CFG_INVERT_DQM (1 << 6)
811#define EMC_CFG_WAIT_FOR_DISPLAYB_READY_B4_CC (1 << 5)
812#define EMC_CFG_WAIT_FOR_DISPLAY_READY_B4_CC (1 << 4)
813#define EMC_CFG_EMC2PMACRO_CFG_BYPASS_DATAPIPE2 (1 << 3)
814#define EMC_CFG_EMC2PMACRO_CFG_BYPASS_DATAPIPE1 (1 << 2)
815#define EMC_CFG_EMC2PMACRO_CFG_BYPASS_ADDRPIPE (1 << 1)
816
817#define EMC_ADR_CFG 0x10
818#define EMC_REFCTRL 0x20
819#define EMC_REFCTRL_DEV_SEL_SHIFT 0
820#define EMC_REFCTRL_DEV_SEL_MASK \
821 (0x3 << EMC_REFCTRL_DEV_SEL_SHIFT)
822#define EMC_REFCTRL_ENABLE (0x1 << 31)
823#define EMC_REFCTRL_ENABLE_ALL(num) \
824 (((((num) > 1) ? 0 : 2) << EMC_REFCTRL_DEV_SEL_SHIFT) \
825 | EMC_REFCTRL_ENABLE)
826#define EMC_REFCTRL_DISABLE_ALL(num) \
827 ((((num) > 1) ? 0 : 2) << EMC_REFCTRL_DEV_SEL_SHIFT)
828
829#define EMC_PIN 0x24
830#define EMC_PIN_PIN_CKE_PER_DEV (1 << 2)
831#define EMC_PIN_PIN_CKEB (1 << 1)
832#define EMC_PIN_PIN_CKE (1 << 0)
833
834#define EMC_TIMING_CONTROL 0x28
835#define EMC_RC 0x2c
836#define EMC_RFC 0x30
837#define EMC_RFCPB 0x590
838#define EMC_RAS 0x34
839#define EMC_RP 0x38
840#define EMC_R2W 0x3c
841#define EMC_W2R 0x40
842#define EMC_R2P 0x44
843#define EMC_W2P 0x48
844#define EMC_CCDMW 0x5c0
845#define EMC_RD_RCD 0x4c
846#define EMC_WR_RCD 0x50
847#define EMC_RRD 0x54
848#define EMC_REXT 0x58
849#define EMC_WDV 0x5c
850#define EMC_QUSE 0x60
851#define EMC_QRST 0x64
852#define EMC_ISSUE_QRST 0x428
853#define EMC_QSAFE 0x68
854#define EMC_RDV 0x6c
855#define EMC_REFRESH 0x70
856#define EMC_BURST_REFRESH_NUM 0x74
857#define EMC_PDEX2WR 0x78
858#define EMC_PDEX2RD 0x7c
859#define EMC_PDEX2CKE 0x118
860#define EMC_PCHG2PDEN 0x80
861#define EMC_ACT2PDEN 0x84
862#define EMC_AR2PDEN 0x88
863#define EMC_RW2PDEN 0x8c
864#define EMC_CKE2PDEN 0x11c
865#define EMC_TXSR 0x90
866#define EMC_TCKE 0x94
867#define EMC_TFAW 0x98
868#define EMC_TRPAB 0x9c
869#define EMC_TCLKSTABLE 0xa0
870#define EMC_TCLKSTOP 0xa4
871#define EMC_TREFBW 0xa8
872#define EMC_TPPD 0xac
873#define EMC_PDEX2MRR 0xb4
874#define EMC_ODT_WRITE 0xb0
875#define EMC_WEXT 0xb8
876#define EMC_RFC_SLR 0xc0
877#define EMC_MRS_WAIT_CNT2 0xc4
878#define EMC_MRS_WAIT_CNT2_MRS_EXT2_WAIT_CNT_SHIFT 16
879#define EMC_MRS_WAIT_CNT2_MRS_EXT2_WAIT_CNT_MASK \
880 (0x7ff << EMC_MRS_WAIT_CNT2_MRS_EXT2_WAIT_CNT_SHIFT)
881#define EMC_MRS_WAIT_CNT2_MRS_EXT1_WAIT_CNT_SHIFT 0
882#define EMC_MRS_WAIT_CNT2_MRS_EXT1_WAIT_CNT_MASK \
883 (0x3ff << EMC_MRS_WAIT_CNT2_MRS_EXT1_WAIT_CNT_SHIFT)
884
885#define EMC_MRS_WAIT_CNT 0xc8
886#define EMC_MRS_WAIT_CNT_SHORT_WAIT_SHIFT 0
887#define EMC_MRS_WAIT_CNT_SHORT_WAIT_MASK \
888 (0x3FF << EMC_MRS_WAIT_CNT_SHORT_WAIT_SHIFT)
889#define EMC_MRS_WAIT_CNT_LONG_WAIT_SHIFT 16
890#define EMC_MRS_WAIT_CNT_LONG_WAIT_MASK \
891 (0x3FF << EMC_MRS_WAIT_CNT_LONG_WAIT_SHIFT)
892
893#define EMC_MRS 0xcc
894#define EMC_MODE_SET_DLL_RESET (1 << 8)
895#define EMC_MRS_USE_MRS_LONG_CNT (1 << 26)
896
897#define EMC_EMRS 0xd0
898#define EMC_EMRS_USE_EMRS_LONG_CNT (1 << 26)
899
900#define EMC_REF 0xd4
901#define EMC_REF_FORCE_CMD 1
902
903#define EMC_PRE 0xd8
904#define EMC_NOP 0xdc
905#define EMC_SELF_REF 0xe0
906#define EMC_SELF_REF_CMD_ENABLED (1 << 0)
907#define EMC_SELF_REF_ACTIVE_SELF_REF (1 << 8)
908#define EMC_SELF_REF_DEV_SEL_SHIFT 30
909#define EMC_SELF_REF_DEV_SEL_MASK \
910 (0x3 << EMC_SELF_REF_DEV_SEL_SHIFT)
911
912#define EMC_DPD 0xe4
913#define EMC_MRW 0xe8
914#define EMC_MRW_MRW_OP_SHIFT 0
915#define EMC_MRW_MRW_OP_MASK \
916 (0xff << EMC_MRW_MRW_OP_SHIFT)
917#define EMC_MRW_MRW_MA_SHIFT 16
918#define EMC_MRW_MRW_MA_MASK \
919 (0xff << EMC_MRW_MRW_MA_SHIFT)
920#define EMC_MRW_USE_MRW_LONG_CNT 26
921#define EMC_MRW_USE_MRW_EXT_CNT 27
922#define EMC_MRW_MRW_DEV_SELECTN_SHIFT 30
923#define EMC_MRW_MRW_DEV_SELECTN_MASK \
924 (0x3 << EMC_MRW_MRW_DEV_SELECTN_SHIFT)
925
926#define EMC_MRR 0xec
927#define EMC_MRR_DEV_SEL_SHIFT 30
928#define EMC_MRR_DEV_SEL_MASK \
929 (0x3 << EMC_SELF_REF_DEV_SEL_SHIFT)
930#define EMC_MRR_MA_SHIFT 16
931#define EMC_MRR_MA_MASK \
932 (0xff << EMC_MRR_MA_SHIFT)
933#define EMC_MRR_DATA_SHIFT 0
934#define EMC_MRR_DATA_MASK \
935 (0xffff << EMC_MRR_DATA_SHIFT)
936#define LPDDR2_MR4_TEMP_SHIFT 0
937#define LPDDR2_MR4_TEMP_MASK \
938 (0x7 << LPDDR2_MR4_TEMP_SHIFT)
939
940#define EMC_CMDQ 0xf0
941#define EMC_MC2EMCQ 0xf4
942#define EMC_FBIO_SPARE 0x100
943#define EMC_FBIO_CFG5 0x104
944#define EMC_FBIO_CFG5_DRAM_TYPE_SHIFT 0
945#define EMC_FBIO_CFG5_DRAM_TYPE_MASK \
946 (0x3 << EMC_FBIO_CFG5_DRAM_TYPE_SHIFT)
947#define EMC_FBIO_CFG5_CMD_TX_DIS (1 << 8)
948#define EMC_FBIO_CFG5_CMD_BUS_RETURN_TO_ZERO (1 << 27)
949
950#define EMC_CFG5_QUSE_MODE_SHIFT 13
951#define EMC_CFG5_QUSE_MODE_MASK \
952 (0x7 << EMC_CFG5_QUSE_MODE_SHIFT)
953
954#define EMC_CFG_RSV 0x120
955#define EMC_ACPD_CONTROL 0x124
956#define EMC_MPC 0x128
957#define EMC_EMRS2 0x12c
958#define EMC_EMRS2_USE_EMRS2_LONG_CNT (1 << 26)
959
960#define EMC_EMRS3 0x130
961#define EMC_MRW2 0x134
962#define EMC_MRW3 0x138
963#define EMC_MRW4 0x13c
964#define EMC_MRW5 0x4a0
965#define EMC_MRW6 0x4a4
966#define EMC_MRW7 0x4a8
967#define EMC_MRW8 0x4ac
968#define EMC_MRW9 0x4b0
969#define EMC_MRW10 0x4b4
970#define EMC_MRW11 0x4b8
971#define EMC_MRW12 0x4bc
972#define EMC_MRW13 0x4c0
973#define EMC_MRW14 0x4c4
974#define EMC_MRW15 0x4d0
975#define EMC_CFG_SYNC 0x4d4
976#define EMC_CLKEN_OVERRIDE 0x140
977#define EMC_R2R 0x144
978#define EMC_W2W 0x148
979#define EMC_EINPUT 0x14c
980#define EMC_EINPUT_DURATION 0x150
981#define EMC_PUTERM_EXTRA 0x154
982#define EMC_TCKESR 0x158
983#define EMC_TPD 0x15c
984#define EMC_STAT_CONTROL 0x160
985#define EMC_STAT_STATUS 0x164
986#define EMC_STAT_DRAM_CLOCK_LIMIT_LO 0x19c
987#define EMC_STAT_DRAM_CLOCK_LIMIT_HI 0x1a0
988#define EMC_STAT_DRAM_CLOCKS_LO 0x1a4
989#define EMC_STAT_DRAM_CLOCKS_HI 0x1a8
990#define EMC_STAT_DRAM_DEV0_ACTIVATE_CNT_LO 0x1ac
991#define EMC_STAT_DRAM_DEV0_ACTIVATE_CNT_HI 0x1b0
992#define EMC_STAT_DRAM_DEV0_READ_CNT_LO 0x1b4
993#define EMC_STAT_DRAM_DEV0_READ_CNT_HI 0x1b8
994#define EMC_STAT_DRAM_DEV0_READ8_CNT_LO 0x1bc
995#define EMC_STAT_DRAM_DEV0_READ8_CNT_HI 0x1c0
996#define EMC_STAT_DRAM_DEV0_WRITE_CNT_LO 0x1c4
997#define EMC_STAT_DRAM_DEV0_WRITE_CNT_HI 0x1c8
998#define EMC_STAT_DRAM_DEV0_WRITE8_CNT_LO 0x1cc
999#define EMC_STAT_DRAM_DEV0_WRITE8_CNT_HI 0x1d0
1000#define EMC_STAT_DRAM_DEV0_REF_CNT_LO 0x1d4
1001#define EMC_STAT_DRAM_DEV0_REF_CNT_HI 0x1d8
1002#define EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_LO 0x1dc
1003#define EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_HI 0x1e0
1004#define EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_LO 0x1e4
1005#define EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_HI 0x1e8
1006#define EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_LO 0x1ec
1007#define EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_HI 0x1f0
1008#define EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_LO 0x1f4
1009#define EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_HI 0x1f8
1010#define EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_LO 0x1fc
1011#define EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_HI 0x200
1012#define EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_LO 0x204
1013#define EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_HI 0x208
1014#define EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_LO 0x20c
1015#define EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_HI 0x210
1016#define EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_LO 0x214
1017#define EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_HI 0x218
1018#define EMC_STAT_DRAM_DEV0_SR_CKE_EQ0_CLKS_LO 0x21c
1019#define EMC_STAT_DRAM_DEV0_SR_CKE_EQ0_CLKS_HI 0x220
1020#define EMC_STAT_DRAM_DEV0_DSR 0x224
1021#define EMC_STAT_DRAM_DEV1_ACTIVATE_CNT_LO 0x228
1022#define EMC_STAT_DRAM_DEV1_ACTIVATE_CNT_HI 0x22c
1023#define EMC_STAT_DRAM_DEV1_READ_CNT_LO 0x230
1024#define EMC_STAT_DRAM_DEV1_READ_CNT_HI 0x234
1025#define EMC_STAT_DRAM_DEV1_READ8_CNT_LO 0x238
1026#define EMC_STAT_DRAM_DEV1_READ8_CNT_HI 0x23c
1027#define EMC_STAT_DRAM_DEV1_WRITE_CNT_LO 0x240
1028#define EMC_STAT_DRAM_DEV1_WRITE_CNT_HI 0x244
1029#define EMC_STAT_DRAM_DEV1_WRITE8_CNT_LO 0x248
1030#define EMC_STAT_DRAM_DEV1_WRITE8_CNT_HI 0x24c
1031#define EMC_STAT_DRAM_DEV1_REF_CNT_LO 0x250
1032#define EMC_STAT_DRAM_DEV1_REF_CNT_HI 0x254
1033#define EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_LO 0x258
1034#define EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_HI 0x25c
1035#define EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_LO 0x260
1036#define EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_HI 0x264
1037#define EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_LO 0x268
1038#define EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_HI 0x26c
1039#define EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_LO 0x270
1040#define EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_HI 0x274
1041#define EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_LO 0x278
1042#define EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_HI 0x27c
1043#define EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_LO 0x280
1044#define EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_HI 0x284
1045#define EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_LO 0x288
1046#define EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_HI 0x28c
1047#define EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_LO 0x290
1048#define EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_HI 0x294
1049#define EMC_STAT_DRAM_DEV1_SR_CKE_EQ0_CLKS_LO 0x298
1050#define EMC_STAT_DRAM_DEV1_SR_CKE_EQ0_CLKS_HI 0x29c
1051#define EMC_STAT_DRAM_DEV1_DSR 0x2a0
1052#define EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_LO 0xc8c
1053#define EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_HI 0xc90
1054#define EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_LO 0xc94
1055#define EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_HI 0xc98
1056#define EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_LO 0xc9c
1057#define EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_HI 0xca0
1058#define EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_LO 0xca4
1059#define EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_HI 0xca8
1060#define EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_LO 0xcac
1061#define EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_HI 0xcb0
1062#define EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_LO 0xcb4
1063#define EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_HI 0xcb8
1064#define EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_LO 0xcbc
1065#define EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_HI 0xcc0
1066#define EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_LO 0xcc4
1067#define EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_HI 0xcc8
1068#define EMC_STAT_DRAM_IO_SR_CKE_EQ0_CLKS_LO 0xccc
1069#define EMC_STAT_DRAM_IO_SR_CKE_EQ0_CLKS_HI 0xcd0
1070#define EMC_STAT_DRAM_IO_DSR 0xcd4
1071#define EMC_AUTO_CAL_CONFIG 0x2a4
1072#define EMC_AUTO_CAL_CONFIG_AUTO_CAL_COMPUTE_START (1 << 0)
1073#define EMC_AUTO_CAL_CONFIG_AUTO_CAL_MEASURE_STALL (1 << 9)
1074#define EMC_AUTO_CAL_CONFIG_AUTO_CAL_UPDATE_STALL (1 << 10)
1075#define EMC_AUTO_CAL_CONFIG_AUTO_CAL_ENABLE (1 << 29)
1076#define EMC_AUTO_CAL_CONFIG_AUTO_CAL_START (1 << 31)
1077
1078#define EMC_AUTO_CAL_CONFIG2 0x458
1079#define EMC_AUTO_CAL_CONFIG3 0x45c
1080#define EMC_AUTO_CAL_CONFIG4 0x5b0
1081#define EMC_AUTO_CAL_CONFIG5 0x5b4
1082#define EMC_AUTO_CAL_CONFIG6 0x5cc
1083#define EMC_AUTO_CAL_CONFIG7 0x574
1084#define EMC_AUTO_CAL_CONFIG8 0x2dc
1085#define EMC_AUTO_CAL_VREF_SEL_0 0x2f8
1086#define EMC_AUTO_CAL_VREF_SEL_1 0x300
1087#define EMC_AUTO_CAL_INTERVAL 0x2a8
1088#define EMC_AUTO_CAL_STATUS 0x2ac
1089#define EMC_AUTO_CAL_STATUS2 0x3d4
1090#define EMC_AUTO_CAL_CHANNEL 0x464
1091#define EMC_PMACRO_RX_TERM 0xc48
1092#define EMC_PMACRO_DQ_TX_DRV 0xc70
1093#define EMC_PMACRO_CA_TX_DRV 0xc74
1094#define EMC_PMACRO_CMD_TX_DRV 0xc4c
1095#define EMC_PMACRO_AUTOCAL_CFG_0 0x700
1096#define EMC_PMACRO_AUTOCAL_CFG_1 0x704
1097#define EMC_PMACRO_AUTOCAL_CFG_2 0x708
1098#define EMC_PMACRO_AUTOCAL_CFG_COMMON 0xc78
1099#define EMC_PMACRO_AUTOCAL_CFG_COMMON_E_CAL_BYPASS_DVFS (1 << 16)
1100
1101#define EMC_PMACRO_ZCTRL 0xc44
1102#define EMC_XM2COMPPADCTRL 0x30c
1103#define EMC_XM2COMPPADCTRL_VREF_CAL_ENABLE (1 << 10)
1104
1105#define EMC_XM2COMPPADCTRL2 0x578
1106#define EMC_XM2COMPPADCTRL3 0x2f4
1107#define EMC_COMP_PAD_SW_CTRL 0x57c
1108#define EMC_REQ_CTRL 0x2b0
1109#define EMC_EMC_STATUS 0x2b4
1110#define EMC_EMC_STATUS_MRR_DIVLD (1 << 20)
1111#define EMC_EMC_STATUS_TIMING_UPDATE_STALLED (1 << 23)
1112#define EMC_EMC_STATUS_DRAM_IN_POWERDOWN_SHIFT 4
1113#define EMC_EMC_STATUS_DRAM_IN_POWERDOWN_MASK \
1114 (0x3 << EMC_EMC_STATUS_DRAM_IN_POWERDOWN_SHIFT)
1115#define EMC_EMC_STATUS_DRAM_IN_SELF_REFRESH_SHIFT 8
1116#define EMC_EMC_STATUS_DRAM_IN_SELF_REFRESH_MASK \
1117 (0x3 << EMC_EMC_STATUS_DRAM_IN_SELF_REFRESH_SHIFT)
1118
1119#define EMC_CFG_2 0x2b8
1120#define EMC_CFG_DIG_DLL 0x2bc
1121#define EMC_CFG_DIG_DLL_CFG_DLL_EN (1 << 0)
1122#define EMC_CFG_DIG_DLL_CFG_DLL_STALL_ALL_UNTIL_LOCK (1 << 1)
1123#define EMC_CFG_DIG_DLL_CFG_DLL_STALL_ALL_TRAFFIC (1 << 3)
1124#define EMC_CFG_DIG_DLL_CFG_DLL_STALL_RW_UNTIL_LOCK (1 << 4)
1125#define EMC_CFG_DIG_DLL_CFG_DLL_MODE_SHIFT 6
1126#define EMC_CFG_DIG_DLL_CFG_DLL_MODE_MASK \
1127 (0x3 << EMC_CFG_DIG_DLL_CFG_DLL_MODE_SHIFT)
1128#define EMC_CFG_DIG_DLL_CFG_DLL_LOCK_LIMIT_SHIFT 8
1129#define EMC_CFG_DIG_DLL_CFG_DLL_LOCK_LIMIT_MASK \
1130 (0x7 << EMC_CFG_DIG_DLL_CFG_DLL_LOCK_LIMIT_SHIFT)
1131
1132#define EMC_CFG_DIG_DLL_PERIOD 0x2c0
1133#define EMC_DIG_DLL_STATUS 0x2c4
1134#define EMC_DIG_DLL_STATUS_DLL_LOCK (1 << 15)
1135#define EMC_DIG_DLL_STATUS_DLL_PRIV_UPDATED (1 << 17)
1136#define EMC_DIG_DLL_STATUS_DLL_OUT_SHIFT 0
1137#define EMC_DIG_DLL_STATUS_DLL_OUT_MASK \
1138 (0x7ff << EMC_DIG_DLL_STATUS_DLL_OUT_SHIFT)
1139
1140
1141#define EMC_CFG_DIG_DLL_1 0x2c8
1142#define EMC_RDV_MASK 0x2cc
1143#define EMC_WDV_MASK 0x2d0
1144#define EMC_RDV_EARLY_MASK 0x2d4
1145#define EMC_RDV_EARLY 0x2d8
1146#define EMC_WDV_CHK 0x4e0
1147#define EMC_ZCAL_INTERVAL 0x2e0
1148#define EMC_ZCAL_WAIT_CNT 0x2e4
1149#define EMC_ZCAL_WAIT_CNT_ZCAL_WAIT_CNT_MASK 0x7ff
1150#define EMC_ZCAL_WAIT_CNT_ZCAL_WAIT_CNT_SHIFT 0
1151
1152#define EMC_ZCAL_MRW_CMD 0x2e8
1153#define EMC_ZQ_CAL 0x2ec
1154#define EMC_ZQ_CAL_DEV_SEL_SHIFT 30
1155#define EMC_ZQ_CAL_DEV_SEL_MASK \
1156 (0x3 << EMC_SELF_REF_DEV_SEL_SHIFT)
1157#define EMC_ZQ_CAL_LONG (1 << 4)
1158#define EMC_ZQ_CAL_ZQ_LATCH_CMD (1 << 1)
1159#define EMC_ZQ_CAL_ZQ_CAL_CMD (1 << 0)
1160#define EMC_ZQ_CAL_LONG_CMD_DEV0 \
1161 (DRAM_DEV_SEL_0 | EMC_ZQ_CAL_LONG | EMC_ZQ_CAL_CMD)
1162#define EMC_ZQ_CAL_LONG_CMD_DEV1 \
1163 (DRAM_DEV_SEL_1 | EMC_ZQ_CAL_LONG | EMC_ZQ_CAL_CMD)
1164
1165#define EMC_SCRATCH0 0x324
1166#define EMC_STALL_THEN_EXE_BEFORE_CLKCHANGE 0x3c8
1167#define EMC_STALL_THEN_EXE_AFTER_CLKCHANGE 0x3cc
1168#define EMC_UNSTALL_RW_AFTER_CLKCHANGE 0x3d0
1169#define EMC_FDPD_CTRL_CMD_NO_RAMP 0x4d8
1170#define EMC_FDPD_CTRL_CMD_NO_RAMP_CMD_DPD_NO_RAMP_ENABLE (1 << 0)
1171
1172#define EMC_SEL_DPD_CTRL 0x3d8
1173#define EMC_SEL_DPD_CTRL_DATA_SEL_DPD_EN (1 << 8)
1174#define EMC_SEL_DPD_CTRL_ODT_SEL_DPD_EN (1 << 5)
1175#define EMC_SEL_DPD_CTRL_RESET_SEL_DPD_EN (1 << 4)
1176#define EMC_SEL_DPD_CTRL_CA_SEL_DPD_EN (1 << 3)
1177#define EMC_SEL_DPD_CTRL_CLK_SEL_DPD_EN (1 << 2)
1178#define EMC_SEL_DPD_CTRL_DDR3_MASK \
1179 ((0xf << 2) | (0x1 << 8))
1180#define EMC_SEL_DPD_CTRL_MAS \
1181 ((0x3 << 2) | (0x1 << 5) | (0x1 << 8))
1182
1183#define EMC_FDPD_CTRL_DQ 0x310
1184#define EMC_FDPD_CTRL_CMD 0x314
1185#define EMC_PRE_REFRESH_REQ_CNT 0x3dc
1186#define EMC_REFCTRL2 0x580
1187#define EMC_FBIO_CFG7 0x584
1188#define EMC_FBIO_CFG7_CH0_ENABLE (1 << 1)
1189#define EMC_FBIO_CFG7_CH1_ENABLE (1 << 2)
1190
1191#define EMC_DATA_BRLSHFT_0 0x588
1192#define EMC_DATA_BRLSHFT_0_RANK0_BYTE7_DATA_BRLSHFT_SHIFT 21
1193#define EMC_DATA_BRLSHFT_0_RANK0_BYTE7_DATA_BRLSHFT_MASK \
1194 (0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE7_DATA_BRLSHFT_SHIFT)
1195#define EMC_DATA_BRLSHFT_0_RANK0_BYTE6_DATA_BRLSHFT_SHIFT 18
1196#define EMC_DATA_BRLSHFT_0_RANK0_BYTE6_DATA_BRLSHFT_MASK \
1197 (0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE6_DATA_BRLSHFT_SHIFT)
1198#define EMC_DATA_BRLSHFT_0_RANK0_BYTE5_DATA_BRLSHFT_SHIFT 15
1199#define EMC_DATA_BRLSHFT_0_RANK0_BYTE5_DATA_BRLSHFT_MASK \
1200 (0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE5_DATA_BRLSHFT_SHIFT)
1201#define EMC_DATA_BRLSHFT_0_RANK0_BYTE4_DATA_BRLSHFT_SHIFT 12
1202#define EMC_DATA_BRLSHFT_0_RANK0_BYTE4_DATA_BRLSHFT_MASK \
1203 (0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE4_DATA_BRLSHFT_SHIFT)
1204#define EMC_DATA_BRLSHFT_0_RANK0_BYTE3_DATA_BRLSHFT_SHIFT 9
1205#define EMC_DATA_BRLSHFT_0_RANK0_BYTE3_DATA_BRLSHFT_MASK \
1206 (0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE3_DATA_BRLSHFT_SHIFT)
1207#define EMC_DATA_BRLSHFT_0_RANK0_BYTE2_DATA_BRLSHFT_SHIFT 6
1208#define EMC_DATA_BRLSHFT_0_RANK0_BYTE2_DATA_BRLSHFT_MASK \
1209 (0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE2_DATA_BRLSHFT_SHIFT)
1210#define EMC_DATA_BRLSHFT_0_RANK0_BYTE1_DATA_BRLSHFT_SHIFT 3
1211#define EMC_DATA_BRLSHFT_0_RANK0_BYTE1_DATA_BRLSHFT_MASK \
1212 (0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE1_DATA_BRLSHFT_SHIFT)
1213#define EMC_DATA_BRLSHFT_0_RANK0_BYTE0_DATA_BRLSHFT_SHIFT 0
1214#define EMC_DATA_BRLSHFT_0_RANK0_BYTE0_DATA_BRLSHFT_MASK \
1215 (0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE0_DATA_BRLSHFT_SHIFT)
1216
1217#define EMC_DATA_BRLSHFT_1 0x58c
1218#define EMC_DATA_BRLSHFT_1_RANK1_BYTE7_DATA_BRLSHFT_SHIFT 21
1219#define EMC_DATA_BRLSHFT_1_RANK1_BYTE7_DATA_BRLSHFT_MASK \
1220 (0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE7_DATA_BRLSHFT_SHIFT)
1221#define EMC_DATA_BRLSHFT_1_RANK1_BYTE6_DATA_BRLSHFT_SHIFT 18
1222#define EMC_DATA_BRLSHFT_1_RANK1_BYTE6_DATA_BRLSHFT_MASK \
1223 (0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE6_DATA_BRLSHFT_SHIFT)
1224#define EMC_DATA_BRLSHFT_1_RANK1_BYTE5_DATA_BRLSHFT_SHIFT 15
1225#define EMC_DATA_BRLSHFT_1_RANK1_BYTE5_DATA_BRLSHFT_MASK \
1226 (0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE5_DATA_BRLSHFT_SHIFT)
1227#define EMC_DATA_BRLSHFT_1_RANK1_BYTE4_DATA_BRLSHFT_SHIFT 12
1228#define EMC_DATA_BRLSHFT_1_RANK1_BYTE4_DATA_BRLSHFT_MASK \
1229 (0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE4_DATA_BRLSHFT_SHIFT)
1230#define EMC_DATA_BRLSHFT_1_RANK1_BYTE3_DATA_BRLSHFT_SHIFT 9
1231#define EMC_DATA_BRLSHFT_1_RANK1_BYTE3_DATA_BRLSHFT_MASK \
1232 (0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE3_DATA_BRLSHFT_SHIFT)
1233#define EMC_DATA_BRLSHFT_1_RANK1_BYTE2_DATA_BRLSHFT_SHIFT 6
1234#define EMC_DATA_BRLSHFT_1_RANK1_BYTE2_DATA_BRLSHFT_MASK \
1235 (0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE2_DATA_BRLSHFT_SHIFT)
1236#define EMC_DATA_BRLSHFT_1_RANK1_BYTE1_DATA_BRLSHFT_SHIFT 3
1237#define EMC_DATA_BRLSHFT_1_RANK1_BYTE1_DATA_BRLSHFT_MASK \
1238 (0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE1_DATA_BRLSHFT_SHIFT)
1239#define EMC_DATA_BRLSHFT_1_RANK1_BYTE0_DATA_BRLSHFT_SHIFT 0
1240#define EMC_DATA_BRLSHFT_1_RANK1_BYTE0_DATA_BRLSHFT_MASK \
1241 (0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE0_DATA_BRLSHFT_SHIFT)
1242
1243#define EMC_DQS_BRLSHFT_0 0x594
1244#define EMC_DQS_BRLSHFT_1 0x598
1245#define EMC_CMD_BRLSHFT_0 0x59c
1246#define EMC_CMD_BRLSHFT_1 0x5a0
1247#define EMC_CMD_BRLSHFT_2 0x5a4
1248#define EMC_CMD_BRLSHFT_3 0x5a8
1249#define EMC_QUSE_BRLSHFT_0 0x5ac
1250#define EMC_QUSE_BRLSHFT_1 0x5b8
1251#define EMC_QUSE_BRLSHFT_2 0x5bc
1252#define EMC_QUSE_BRLSHFT_3 0x5c4
1253#define EMC_FBIO_CFG8 0x5c8
1254#define EMC_CMD_MAPPING_CMD0_0 0x380
1255#define EMC_CMD_MAPPING_CMD0_1 0x384
1256#define EMC_CMD_MAPPING_CMD0_2 0x388
1257#define EMC_CMD_MAPPING_CMD1_0 0x38c
1258#define EMC_CMD_MAPPING_CMD1_1 0x390
1259#define EMC_CMD_MAPPING_CMD1_2 0x394
1260#define EMC_CMD_MAPPING_CMD2_0 0x398
1261#define EMC_CMD_MAPPING_CMD2_1 0x39c
1262#define EMC_CMD_MAPPING_CMD2_2 0x3a0
1263#define EMC_CMD_MAPPING_CMD3_0 0x3a4
1264#define EMC_CMD_MAPPING_CMD3_1 0x3a8
1265#define EMC_CMD_MAPPING_CMD3_2 0x3ac
1266#define EMC_CMD_MAPPING_BYTE 0x3b0
1267#define EMC_DYN_SELF_REF_CONTROL 0x3e0
1268#define EMC_TXSRDLL 0x3e4
1269#define EMC_CCFIFO_ADDR 0x3e8
1270#define EMC_CCFIFO_DATA 0x3ec
1271#define EMC_CCFIFO_STATUS 0x3f0
1272#define EMC_SWIZZLE_RANK0_BYTE0 0x404
1273#define EMC_SWIZZLE_RANK0_BYTE1 0x408
1274#define EMC_SWIZZLE_RANK0_BYTE2 0x40c
1275#define EMC_SWIZZLE_RANK0_BYTE3 0x410
1276#define EMC_SWIZZLE_RANK1_BYTE0 0x418
1277#define EMC_SWIZZLE_RANK1_BYTE1 0x41c
1278#define EMC_SWIZZLE_RANK1_BYTE2 0x420
1279#define EMC_SWIZZLE_RANK1_BYTE3 0x424
1280#define EMC_TR_TIMING_0 0x3b4
1281#define EMC_TR_CTRL_0 0x3b8
1282#define EMC_TR_CTRL_1 0x3bc
1283#define EMC_TR_DVFS 0x460
1284#define EMC_TR_DVFS_TRAINING_DVFS (1 << 0)
1285
1286#define EMC_SWITCH_BACK_CTRL 0x3c0
1287#define EMC_TR_RDV 0x3c4
1288#define EMC_TR_QPOP 0x3f4
1289#define EMC_TR_RDV_MASK 0x3f8
1290#define EMC_TR_QSAFE 0x3fc
1291#define EMC_TR_QRST 0x400
1292#define EMC_IBDLY 0x468
1293#define EMC_OBDLY 0x46c
1294#define EMC_TXDSRVTTGEN 0x480
1295#define EMC_WE_DURATION 0x48c
1296#define EMC_WS_DURATION 0x490
1297#define EMC_WEV 0x494
1298#define EMC_WSV 0x498
1299#define EMC_CFG_3 0x49c
1300#define EMC_CFG_PIPE_2 0x554
1301#define EMC_CFG_PIPE_CLK 0x558
1302#define EMC_CFG_PIPE_CLK_CLK_ALWAYS_ON (1 << 0)
1303
1304#define EMC_CFG_PIPE_1 0x55c
1305#define EMC_CFG_PIPE 0x560
1306#define EMC_QPOP 0x564
1307#define EMC_QUSE_WIDTH 0x568
1308#define EMC_PUTERM_WIDTH 0x56c
1309#define EMC_PROTOBIST_CONFIG_ADR_1 0x5d0
1310#define EMC_PROTOBIST_CONFIG_ADR_2 0x5d4
1311#define EMC_PROTOBIST_MISC 0x5d8
1312#define EMC_PROTOBIST_WDATA_LOWER 0x5dc
1313#define EMC_PROTOBIST_WDATA_UPPER 0x5e0
1314#define EMC_PROTOBIST_RDATA 0x5ec
1315#define EMC_DLL_CFG_0 0x5e4
1316#define EMC_DLL_CFG_0_DDLLCAL_CTRL_IGNORE_START (1 << 29)
1317#define EMC_DLL_CFG_0_DDLLCAL_CTRL_DUAL_PASS_LOCK (1 << 28)
1318#define EMC_DLL_CFG_0_DDLLCAL_CTRL_STEP_SIZE_SHIFT 24
1319#define EMC_DLL_CFG_0_DDLLCAL_CTRL_STEP_SIZE_MASK \
1320 (0xf << EMC_DLL_CFG_0_DDLLCAL_CTRL_STEP_SIZE_SHIFT)
1321#define EMC_DLL_CFG_0_DDLLCAL_CTRL_END_COUNT_SHIFT 20
1322#define EMC_DLL_CFG_0_DDLLCAL_CTRL_END_COUNT_MASK \
1323 (0xf << EMC_DLL_CFG_0_DDLLCAL_CTRL_END_COUNT_SHIFT)
1324#define EMC_DLL_CFG_0_DDLLCAL_CTRL_FILTER_BITS_SHIFT 16
1325#define EMC_DLL_CFG_0_DDLLCAL_CTRL_FILTER_BITS_MASK \
1326 (0xf << EMC_DLL_CFG_0_DDLLCAL_CTRL_FILTER_BITS_SHIFT)
1327#define EMC_DLL_CFG_0_DDLLCAL_CTRL_SAMPLE_COUNT_SHIFT 12
1328#define EMC_DLL_CFG_0_DDLLCAL_CTRL_SAMPLE_COUNT_MASK \
1329 (0xf << EMC_DLL_CFG_0_DDLLCAL_CTRL_SAMPLE_COUNT_SHIFT)
1330#define EMC_DLL_CFG_0_DDLLCAL_CTRL_SAMPLE_DELAY_SHIFT 4
1331#define EMC_DLL_CFG_0_DDLLCAL_CTRL_SAMPLE_DELAY_MASK \
1332 (0xff << EMC_DLL_CFG_0_DDLLCAL_CTRL_SAMPLE_DELAY_SHIFT)
1333#define EMC_DLL_CFG_0_DDLLCAL_UPDATE_CNT_LIMIT_SHIFT 0
1334#define EMC_DLL_CFG_0_DDLLCAL_UPDATE_CNT_LIMIT_MASK \
1335 (0xf << EMC_DLL_CFG_0_DDLLCAL_UPDATE_CNT_LIMIT_SHIFT)
1336
1337#define EMC_DLL_CFG_1 0x5e8
1338#define EMC_DLL_CFG_1_DDLLCAL_CTRL_START_TRIM_SHIFT 10
1339#define EMC_DLL_CFG_1_DDLLCAL_CTRL_START_TRIM_MASK \
1340 (0x7ff << EMC_DLL_CFG_1_DDLLCAL_CTRL_START_TRIM_SHIFT)
1341
1342#define EMC_TRAINING_CMD 0xe00
1343#define EMC_TRAINING_CMD_PRIME (1 << 0)
1344#define EMC_TRAINING_CMD_CA (1 << 1)
1345#define EMC_TRAINING_CMD_RD (1 << 2)
1346#define EMC_TRAINING_CMD_WR (1 << 3)
1347#define EMC_TRAINING_CMD_QUSE (1 << 4)
1348#define EMC_TRAINING_CMD_CA_VREF (1 << 5)
1349#define EMC_TRAINING_CMD_RD_VREF (1 << 6)
1350#define EMC_TRAINING_CMD_WR_VREF (1 << 7)
1351#define EMC_TRAINING_CMD_QUSE_VREF (1 << 8)
1352#define EMC_TRAINING_CMD_GO (1 << 31)
1353
1354#define EMC_TRAINING_CTRL 0xe04
1355#define EMC_TRAINING_CTRL_SWAP_RANK (1 << 14)
1356
1357#define EMC_TRAINING_STATUS 0xe08
1358#define EMC_TRAINING_QUSE_CORS_CTRL 0xe0c
1359#define EMC_TRAINING_QUSE_FINE_CTRL 0xe10
1360#define EMC_TRAINING_QUSE_CTRL_MISC 0xe14
1361#define EMC_TRAINING_WRITE_FINE_CTRL 0xe18
1362#define EMC_TRAINING_WRITE_CTRL_MISC 0xe1c
1363#define EMC_TRAINING_WRITE_VREF_CTRL 0xe20
1364#define EMC_TRAINING_READ_FINE_CTRL 0xe24
1365#define EMC_TRAINING_READ_CTRL_MISC 0xe28
1366#define EMC_TRAINING_READ_VREF_CTRL 0xe2c
1367#define EMC_TRAINING_CA_FINE_CTRL 0xe30
1368#define EMC_TRAINING_CA_CTRL_MISC 0xe34
1369#define EMC_TRAINING_CA_CTRL_MISC1 0xe38
1370#define EMC_TRAINING_CA_VREF_CTRL 0xe3c
1371#define EMC_TRAINING_CA_TADR_CTRL 0xe40
1372#define EMC_TRAINING_SETTLE 0xe44
1373#define EMC_TRAINING_DEBUG_CTRL 0xe48
1374#define EMC_TRAINING_DEBUG_DQ0 0xe4c
1375#define EMC_TRAINING_DEBUG_DQ1 0xe50
1376#define EMC_TRAINING_DEBUG_DQ2 0xe54
1377#define EMC_TRAINING_DEBUG_DQ3 0xe58
1378#define EMC_TRAINING_MPC 0xe5c
1379#define EMC_TRAINING_PATRAM_CTRL 0xe60
1380#define EMC_TRAINING_PATRAM_DQ 0xe64
1381#define EMC_TRAINING_PATRAM_DMI 0xe68
1382#define EMC_TRAINING_VREF_SETTLE 0xe6c
1383#define EMC_TRAINING_RW_EYE_CENTER_IB_BYTE0 0xe70
1384#define EMC_TRAINING_RW_EYE_CENTER_IB_BYTE1 0xe74
1385#define EMC_TRAINING_RW_EYE_CENTER_IB_BYTE2 0xe78
1386#define EMC_TRAINING_RW_EYE_CENTER_IB_BYTE3 0xe7c
1387#define EMC_TRAINING_RW_EYE_CENTER_IB_MISC 0xe80
1388#define EMC_TRAINING_RW_EYE_CENTER_OB_BYTE0 0xe84
1389#define EMC_TRAINING_RW_EYE_CENTER_OB_BYTE1 0xe88
1390#define EMC_TRAINING_RW_EYE_CENTER_OB_BYTE2 0xe8c
1391#define EMC_TRAINING_RW_EYE_CENTER_OB_BYTE3 0xe90
1392#define EMC_TRAINING_RW_EYE_CENTER_OB_MISC 0xe94
1393#define EMC_TRAINING_RW_OFFSET_IB_BYTE0 0xe98
1394#define EMC_TRAINING_RW_OFFSET_IB_BYTE1 0xe9c
1395#define EMC_TRAINING_RW_OFFSET_IB_BYTE2 0xea0
1396#define EMC_TRAINING_RW_OFFSET_IB_BYTE3 0xea4
1397#define EMC_TRAINING_RW_OFFSET_IB_MISC 0xea8
1398#define EMC_TRAINING_RW_OFFSET_OB_BYTE0 0xeac
1399#define EMC_TRAINING_RW_OFFSET_OB_BYTE1 0xeb0
1400#define EMC_TRAINING_RW_OFFSET_OB_BYTE2 0xeb4
1401#define EMC_TRAINING_RW_OFFSET_OB_BYTE3 0xeb8
1402#define EMC_TRAINING_RW_OFFSET_OB_MISC 0xebc
1403#define EMC_TRAINING_OPT_CA_VREF 0xec0
1404#define EMC_TRAINING_OPT_DQ_OB_VREF 0xec4
1405#define EMC_TRAINING_OPT_DQ_IB_VREF_RANK0 0xec8
1406#define EMC_TRAINING_OPT_DQ_IB_VREF_RANK1 0xecc
1407#define EMC_TRAINING_QUSE_VREF_CTRL 0xed0
1408#define EMC_TRAINING_OPT_DQS_IB_VREF_RANK0 0xed4
1409#define EMC_TRAINING_OPT_DQS_IB_VREF_RANK1 0xed8
1410#define EMC_TRAINING_DRAMC_TIMING 0xedc
1411#define EMC_PMACRO_QUSE_DDLL_RANK0_0 0x600
1412#define EMC_PMACRO_QUSE_DDLL_RANK0_1 0x604
1413#define EMC_PMACRO_QUSE_DDLL_RANK0_2 0x608
1414#define EMC_PMACRO_QUSE_DDLL_RANK0_3 0x60c
1415#define EMC_PMACRO_QUSE_DDLL_RANK0_4 0x610
1416#define EMC_PMACRO_QUSE_DDLL_RANK0_5 0x614
1417#define EMC_PMACRO_QUSE_DDLL_RANK1_0 0x620
1418#define EMC_PMACRO_QUSE_DDLL_RANK1_1 0x624
1419#define EMC_PMACRO_QUSE_DDLL_RANK1_2 0x628
1420#define EMC_PMACRO_QUSE_DDLL_RANK1_3 0x62c
1421#define EMC_PMACRO_QUSE_DDLL_RANK1_4 0x630
1422#define EMC_PMACRO_QUSE_DDLL_RANK1_5 0x634
1423#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0 0x640
1424#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0_OB_DDLL_LONG_DQ_RANK0_BYTE1_SHIFT \
1425 16
1426#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0_OB_DDLL_LONG_DQ_RANK0_BYTE1_MASK \
1427 0x3ff << \
1428 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0_OB_DDLL_LONG_DQ_RANK0_BYTE1_SHIFT
1429#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0_OB_DDLL_LONG_DQ_RANK0_BYTE0_SHIFT \
1430 0
1431#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0_OB_DDLL_LONG_DQ_RANK0_BYTE0_MASK \
1432 0x3ff << \
1433 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0_OB_DDLL_LONG_DQ_RANK0_BYTE0_SHIFT
1434
1435#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1 0x644
1436#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1_OB_DDLL_LONG_DQ_RANK0_BYTE3_SHIFT \
1437 16
1438#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1_OB_DDLL_LONG_DQ_RANK0_BYTE3_MASK \
1439 0x3ff << \
1440 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1_OB_DDLL_LONG_DQ_RANK0_BYTE3_SHIFT
1441#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1_OB_DDLL_LONG_DQ_RANK0_BYTE2_SHIFT \
1442 0
1443#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1_OB_DDLL_LONG_DQ_RANK0_BYTE2_MASK \
1444 0x3ff << \
1445 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1_OB_DDLL_LONG_DQ_RANK0_BYTE2_SHIFT
1446
1447#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2 0x648
1448#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2_OB_DDLL_LONG_DQ_RANK0_BYTE5_SHIFT \
1449 16
1450#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2_OB_DDLL_LONG_DQ_RANK0_BYTE5_MASK \
1451 0x3ff << \
1452 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2_OB_DDLL_LONG_DQ_RANK0_BYTE5_SHIFT
1453#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2_OB_DDLL_LONG_DQ_RANK0_BYTE4_SHIFT \
1454 0
1455#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2_OB_DDLL_LONG_DQ_RANK0_BYTE4_MASK \
1456 0x3ff << \
1457 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2_OB_DDLL_LONG_DQ_RANK0_BYTE4_SHIFT
1458
1459#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3 0x64c
1460#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3_OB_DDLL_LONG_DQ_RANK0_BYTE7_SHIFT \
1461 16
1462#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3_OB_DDLL_LONG_DQ_RANK0_BYTE7_MASK \
1463 0x3ff << \
1464 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3_OB_DDLL_LONG_DQ_RANK0_BYTE7_SHIFT
1465#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3_OB_DDLL_LONG_DQ_RANK0_BYTE6_SHIFT \
1466 0
1467#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3_OB_DDLL_LONG_DQ_RANK0_BYTE6_MASK \
1468 0x3ff << \
1469 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3_OB_DDLL_LONG_DQ_RANK0_BYTE6_SHIFT
1470
1471#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_4 0x650
1472#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_5 0x654
1473
1474#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0 0x660
1475#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0_OB_DDLL_LONG_DQ_RANK1_BYTE1_SHIFT \
1476 16
1477#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0_OB_DDLL_LONG_DQ_RANK1_BYTE1_MASK \
1478 0x3ff << \
1479 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0_OB_DDLL_LONG_DQ_RANK1_BYTE1_SHIFT
1480#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0_OB_DDLL_LONG_DQ_RANK1_BYTE0_SHIFT \
1481 0
1482#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0_OB_DDLL_LONG_DQ_RANK1_BYTE0_MASK \
1483 0x3ff << \
1484 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0_OB_DDLL_LONG_DQ_RANK1_BYTE0_SHIFT
1485
1486#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1 0x664
1487#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1_OB_DDLL_LONG_DQ_RANK1_BYTE3_SHIFT \
1488 16
1489#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1_OB_DDLL_LONG_DQ_RANK1_BYTE3_MASK \
1490 0x3ff << \
1491 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1_OB_DDLL_LONG_DQ_RANK1_BYTE3_SHIFT
1492#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1_OB_DDLL_LONG_DQ_RANK1_BYTE2_SHIFT \
1493 0
1494#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1_OB_DDLL_LONG_DQ_RANK1_BYTE2_MASK \
1495 0x3ff << \
1496 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1_OB_DDLL_LONG_DQ_RANK1_BYTE2_SHIFT
1497
1498#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2 0x668
1499#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2_OB_DDLL_LONG_DQ_RANK1_BYTE5_SHIFT \
1500 16
1501#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2_OB_DDLL_LONG_DQ_RANK1_BYTE5_MASK \
1502 0x3ff << \
1503 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2_OB_DDLL_LONG_DQ_RANK1_BYTE5_SHIFT
1504#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2_OB_DDLL_LONG_DQ_RANK1_BYTE4_SHIFT \
1505 0
1506#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2_OB_DDLL_LONG_DQ_RANK1_BYTE4_MASK \
1507 0x3ff << \
1508 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2_OB_DDLL_LONG_DQ_RANK1_BYTE4_SHIFT
1509
1510#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3 0x66c
1511#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3_OB_DDLL_LONG_DQ_RANK1_BYTE7_SHIFT \
1512 16
1513#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3_OB_DDLL_LONG_DQ_RANK1_BYTE7_MASK \
1514 0x3ff << \
1515 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3_OB_DDLL_LONG_DQ_RANK1_BYTE7_SHIFT
1516#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3_OB_DDLL_LONG_DQ_RANK1_BYTE6_SHIFT \
1517 0
1518#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3_OB_DDLL_LONG_DQ_RANK1_BYTE6_MASK \
1519 0x3ff << \
1520 EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3_OB_DDLL_LONG_DQ_RANK1_BYTE6_SHIFT
1521
1522#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_4 0x670
1523#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_5 0x674
1524#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_0 0x680
1525#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_1 0x684
1526#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_2 0x688
1527#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_3 0x68c
1528#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_4 0x690
1529#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_5 0x694
1530#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_0 0x6a0
1531#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_1 0x6a4
1532#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_2 0x6a8
1533#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_3 0x6ac
1534#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_4 0x6b0
1535#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_5 0x6b4
1536#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_0 0x6c0
1537#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_1 0x6c4
1538#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_2 0x6c8
1539#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_3 0x6cc
1540#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_4 0x6d0
1541#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_5 0x6d4
1542#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_0 0x6e0
1543#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_1 0x6e4
1544#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_2 0x6e8
1545#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_3 0x6ec
1546#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_4 0x6f0
1547#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_5 0x6f4
1548#define EMC_PMACRO_TX_PWRD_0 0x720
1549#define EMC_PMACRO_TX_PWRD_1 0x724
1550#define EMC_PMACRO_TX_PWRD_2 0x728
1551#define EMC_PMACRO_TX_PWRD_3 0x72c
1552#define EMC_PMACRO_TX_PWRD_4 0x730
1553#define EMC_PMACRO_TX_PWRD_5 0x734
1554#define EMC_PMACRO_TX_SEL_CLK_SRC_0 0x740
1555#define EMC_PMACRO_TX_SEL_CLK_SRC_1 0x744
1556#define EMC_PMACRO_TX_SEL_CLK_SRC_3 0x74c
1557#define EMC_PMACRO_TX_SEL_CLK_SRC_2 0x748
1558#define EMC_PMACRO_TX_SEL_CLK_SRC_4 0x750
1559#define EMC_PMACRO_TX_SEL_CLK_SRC_5 0x754
1560#define EMC_PMACRO_DDLL_BYPASS 0x760
1561#define EMC_PMACRO_DDLL_PWRD_0 0x770
1562#define EMC_PMACRO_DDLL_PWRD_1 0x774
1563#define EMC_PMACRO_DDLL_PWRD_2 0x778
1564#define EMC_PMACRO_CMD_CTRL_0 0x780
1565#define EMC_PMACRO_CMD_CTRL_1 0x784
1566#define EMC_PMACRO_CMD_CTRL_2 0x788
1567#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_0 0x800
1568#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_1 0x804
1569#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_2 0x808
1570#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_3 0x80c
1571#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_0 0x810
1572#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_1 0x814
1573#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_2 0x818
1574#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_3 0x81c
1575#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_0 0x820
1576#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_1 0x824
1577#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_2 0x828
1578#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_3 0x82c
1579#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_0 0x830
1580#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_1 0x834
1581#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_2 0x838
1582#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_3 0x83c
1583#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_0 0x840
1584#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_1 0x844
1585#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_2 0x848
1586#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_3 0x84c
1587#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_0 0x850
1588#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_1 0x854
1589#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_2 0x858
1590#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_3 0x85c
1591#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_0 0x860
1592#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_1 0x864
1593#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_2 0x868
1594#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_3 0x86c
1595#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_0 0x870
1596#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_1 0x874
1597#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_2 0x878
1598#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_3 0x87c
1599#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_0 0x880
1600#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_1 0x884
1601#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_2 0x888
1602#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_3 0x88c
1603#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_0 0x890
1604#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_1 0x894
1605#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_2 0x898
1606#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_3 0x89c
1607#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_0 0x8a0
1608#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_1 0x8a4
1609#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_2 0x8a8
1610#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_3 0x8ac
1611#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_0 0x8b0
1612#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_1 0x8b4
1613#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_2 0x8b8
1614#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_3 0x8bc
1615#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_0 0x900
1616#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_1 0x904
1617#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_2 0x908
1618#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_3 0x90c
1619#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_0 0x910
1620#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_1 0x914
1621#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_2 0x918
1622#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_3 0x91c
1623#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_0 0x920
1624#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_1 0x924
1625#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_2 0x928
1626#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_3 0x92c
1627#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_0 0x930
1628#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_1 0x934
1629#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_2 0x938
1630#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_3 0x93c
1631#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_0 0x940
1632#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_1 0x944
1633#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_2 0x948
1634#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_3 0x94c
1635#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_0 0x950
1636#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_1 0x954
1637#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_2 0x958
1638#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_3 0x95c
1639#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_0 0x960
1640#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_1 0x964
1641#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_2 0x968
1642#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_3 0x96c
1643#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_0 0x970
1644#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_1 0x974
1645#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_2 0x978
1646#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_3 0x97c
1647#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_0 0x980
1648#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_1 0x984
1649#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_2 0x988
1650#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_3 0x98c
1651#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_0 0x990
1652#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_1 0x994
1653#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_2 0x998
1654#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_3 0x99c
1655#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_0 0x9a0
1656#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_1 0x9a4
1657#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_2 0x9a8
1658#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_3 0x9ac
1659#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_0 0x9b0
1660#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_1 0x9b4
1661#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_2 0x9b8
1662#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_3 0x9bc
1663#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_0 0xa00
1664#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_1 0xa04
1665#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_2 0xa08
1666#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_0 0xa10
1667#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_1 0xa14
1668#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_2 0xa18
1669#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_0 0xa20
1670#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_1 0xa24
1671#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_2 0xa28
1672#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_0 0xa30
1673#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_1 0xa34
1674#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_2 0xa38
1675#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_0 0xa40
1676#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_1 0xa44
1677#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_2 0xa48
1678#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_0 0xa50
1679#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_1 0xa54
1680#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_2 0xa58
1681#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_0 0xa60
1682#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_1 0xa64
1683#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_2 0xa68
1684#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_0 0xa70
1685#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_1 0xa74
1686#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_2 0xa78
1687#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD0_0 0xa80
1688#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD0_1 0xa84
1689#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD0_2 0xa88
1690#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD1_0 0xa90
1691#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD1_1 0xa94
1692#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD1_2 0xa98
1693#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD2_0 0xaa0
1694#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD2_1 0xaa4
1695#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD2_2 0xaa8
1696#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD3_0 0xab0
1697#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD3_1 0xab4
1698#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD3_2 0xab8
1699#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_0 0xb00
1700#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_1 0xb04
1701#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_2 0xb08
1702#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_0 0xb10
1703#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_1 0xb14
1704#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_2 0xb18
1705#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_0 0xb20
1706#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_1 0xb24
1707#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_2 0xb28
1708#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_0 0xb30
1709#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_1 0xb34
1710#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_2 0xb38
1711#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_0 0xb40
1712#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_1 0xb44
1713#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_2 0xb48
1714#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_0 0xb50
1715#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_1 0xb54
1716#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_2 0xb58
1717#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_0 0xb60
1718#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_1 0xb64
1719#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_2 0xb68
1720#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_0 0xb70
1721#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_1 0xb74
1722#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_2 0xb78
1723#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD0_0 0xb80
1724#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD0_1 0xb84
1725#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD0_2 0xb88
1726#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD1_0 0xb90
1727#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD1_1 0xb94
1728#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD1_2 0xb98
1729#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD2_0 0xba0
1730#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD2_1 0xba4
1731#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD2_2 0xba8
1732#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD3_0 0xbb0
1733#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD3_1 0xbb4
1734#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD3_2 0xbb8
1735#define EMC_PMACRO_IB_VREF_DQ_0 0xbe0
1736#define EMC_PMACRO_IB_VREF_DQ_1 0xbe4
1737#define EMC_PMACRO_IB_VREF_DQ_2 0xbe8
1738#define EMC_PMACRO_IB_VREF_DQS_0 0xbf0
1739#define EMC_PMACRO_IB_VREF_DQS_1 0xbf4
1740#define EMC_PMACRO_IB_VREF_DQS_2 0xbf8
1741#define EMC_PMACRO_IB_RXRT 0xcf4
1742#define EMC_PMACRO_DDLL_LONG_CMD_0 0xc00
1743#define EMC_PMACRO_DDLL_LONG_CMD_1 0xc04
1744#define EMC_PMACRO_DDLL_LONG_CMD_2 0xc08
1745#define EMC_PMACRO_DDLL_LONG_CMD_3 0xc0c
1746#define EMC_PMACRO_DDLL_LONG_CMD_4 0xc10
1747#define EMC_PMACRO_DDLL_LONG_CMD_5 0xc14
1748#define EMC_PMACRO_DDLL_SHORT_CMD_0 0xc20
1749#define EMC_PMACRO_DDLL_SHORT_CMD_1 0xc24
1750#define EMC_PMACRO_DDLL_SHORT_CMD_2 0xc28
1751#define EMC_PMACRO_CFG_PM_GLOBAL_0 0xc30
1752#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE0 (1 << 16)
1753#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE1 (1 << 17)
1754#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE2 (1 << 18)
1755#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE3 (1 << 19)
1756#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE4 (1 << 20)
1757#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE5 (1 << 21)
1758#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE6 (1 << 22)
1759#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE7 (1 << 23)
1760#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_CMD0 (1 << 24)
1761#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_CMD1 (1 << 25)
1762#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_CMD2 (1 << 26)
1763#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_CMD3 (1 << 27)
1764
1765#define EMC_PMACRO_VTTGEN_CTRL_0 0xc34
1766#define EMC_PMACRO_VTTGEN_CTRL_1 0xc38
1767#define EMC_PMACRO_VTTGEN_CTRL_2 0xcf0
1768#define EMC_PMACRO_BG_BIAS_CTRL_0 0xc3c
1769#define EMC_PMACRO_BG_BIAS_CTRL_0_BG_E_PWRD (1 << 0)
1770#define EMC_PMACRO_BG_BIAS_CTRL_0_BG_MODE (1 << 1)
1771#define EMC_PMACRO_BG_BIAS_CTRL_0_BGLP_E_PWRD (1 << 2)
1772
1773#define EMC_PMACRO_PAD_CFG_CTRL 0xc40
1774#define EMC_PMACRO_CMD_PAD_RX_CTRL 0xc50
1775#define EMC_PMACRO_DATA_PAD_RX_CTRL 0xc54
1776#define EMC_PMACRO_CMD_RX_TERM_MODE 0xc58
1777#define EMC_PMACRO_DATA_RX_TERM_MODE 0xc5c
1778#define EMC_PMACRO_DATA_RX_TERM_MODE_DATA_DQSN_RX_TERM_MODE_SHIFT 8
1779#define EMC_PMACRO_DATA_RX_TERM_MODE_DATA_DQSN_RX_TERM_MODE_MASK (0x3 << \
1780 EMC_PMACRO_DATA_RX_TERM_MODE_DATA_DQSN_RX_TERM_MODE_SHIFT)
1781#define EMC_PMACRO_DATA_RX_TERM_MODE_DATA_DQSP_RX_TERM_MODE_SHIFT 4
1782#define EMC_PMACRO_DATA_RX_TERM_MODE_DATA_DQSP_RX_TERM_MODE_MASK (0x3 << \
1783 EMC_PMACRO_DATA_RX_TERM_MODE_DATA_DQSP_RX_TERM_MODE_SHIFT)
1784#define EMC_PMACRO_DATA_RX_TERM_MODE_DATA_DQ_RX_TERM_MODE_SHIFT 0
1785#define EMC_PMACRO_DATA_RX_TERM_MODE_DATA_DQ_RX_TERM_MODE_MASK (0x3 << \
1786 EMC_PMACRO_DATA_RX_TERM_MODE_DATA_DQ_RX_TERM_MODE_SHIFT)
1787
1788/* Convenience macro... */
1789#define RX_TERM_MODE \
1790 ~(EMC_PMACRO_DATA_RX_TERM_MODE_DATA_DQSN_RX_TERM_MODE_MASK | \
1791 EMC_PMACRO_DATA_RX_TERM_MODE_DATA_DQSP_RX_TERM_MODE_MASK | \
1792 EMC_PMACRO_DATA_RX_TERM_MODE_DATA_DQ_RX_TERM_MODE_MASK)
1793
1794#define EMC_PMACRO_CMD_PAD_TX_CTRL 0xc60
1795#define EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQ_TX_E_DCC (1 << 1)
1796#define EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQSP_TX_E_DCC (1 << 9)
1797#define EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQSN_TX_E_DCC (1 << 16)
1798#define EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_CMD_TX_E_DCC (1 << 24)
1799#define EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQ_TX_DRVFORCEON (1 << 26)
1800
1801#define EMC_PMACRO_DATA_PAD_TX_CTRL 0xc64
1802#define EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQ_E_IVREF (1 << 0)
1803#define EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQ_TX_E_DCC (1 << 1)
1804#define EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQS_E_IVREF (1 << 8)
1805#define EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQSP_TX_E_DCC (1 << 9)
1806#define EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQSN_TX_E_DCC (1 << 16)
1807#define EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_CMD_TX_E_DCC (1 << 24)
1808
1809#define EMC_PMACRO_COMMON_PAD_TX_CTRL 0xc68
1810#define EMC_PMACRO_BRICK_MAPPING_0 0xc80
1811#define EMC_PMACRO_BRICK_MAPPING_1 0xc84
1812#define EMC_PMACRO_BRICK_MAPPING_2 0xc88
1813#define EMC_PMACRO_DDLLCAL_CAL 0xce0
1814#define EMC_PMACRO_DDLL_OFFSET 0xce4
1815#define EMC_PMACRO_DDLL_PERIODIC_OFFSET 0xce8
1816#define EMC_PMACRO_BRICK_CTRL_RFU1 0x330
1817#define EMC_PMACRO_BRICK_CTRL_RFU2 0x334
1818#define EMC_PMACRO_CMD_BRICK_CTRL_FDPD 0x318
1819#define EMC_PMACRO_DATA_BRICK_CTRL_FDPD 0x31c
1820#define EMC_PMACRO_TRAINING_CTRL_0 0xcf8
1821#define EMC_PMACRO_TRAINING_CTRL_0_CH0_TRAINING_E_WRPTR (1 << 3)
1822
1823#define EMC_PMACRO_TRAINING_CTRL_1 0xcfc
1824#define EMC_PMACRO_TRAINING_CTRL_1_CH1_TRAINING_E_WRPTR (1 << 3)
1825
1826#define EMC_PMC_SCRATCH1 0x440
1827#define EMC_PMC_SCRATCH2 0x444
1828#define EMC_PMC_SCRATCH3 0x448
1829
1830
1831#define MC_EMEM_ARB_MISC0_EMC_SAME_FREQ (1 << 27)
1832#define MC_EMEM_ARB_MISC1 0xdc
1833#define MC_EMEM_ARB_RING1_THROTTLE 0xe0
1834#define MC_EMEM_ARB_RING3_THROTTLE 0xe4
1835#define MC_EMEM_ARB_OVERRIDE 0xe8
1836#define MC_EMEM_ARB_RSV 0xec
1837
1838#define MC_CLKEN_OVERRIDE 0xf4
1839#define MC_TIMING_CONTROL_DBG 0xf8
1840#define MC_TIMING_CONTROL 0xfc
1841#define MC_EMEM_ARB_ISOCHRONOUS_0 0x208
1842#define MC_EMEM_ARB_ISOCHRONOUS_1 0x20c
1843#define MC_EMEM_ARB_ISOCHRONOUS_2 0x210
1844#define MC_EMEM_ARB_HYSTERESIS_0_0 0x218
1845#define MC_EMEM_ARB_HYSTERESIS_1_0 0x21c
1846#define MC_EMEM_ARB_HYSTERESIS_2_0 0x220
1847#define MC_EMEM_ARB_HYSTERESIS_3_0 0x224
1848
1849#define HYST_SATAR (0x1 << 31)
1850#define HYST_PPCSAHBSLVR (0x1 << 30)
1851#define HYST_PPCSAHBDMAR (0x1 << 29)
1852#define HYST_NVENCSRD (0x1 << 28)
1853#define HYST_HOST1XR (0x1 << 23)
1854#define HYST_HOST1XDMAR (0x1 << 22)
1855#define HYST_HDAR (0x1 << 21)
1856#define HYST_DISPLAYHCB (0x1 << 17)
1857#define HYST_DISPLAYHC (0x1 << 16)
1858#define HYST_AVPCARM7R (0x1 << 15)
1859#define HYST_AFIR (0x1 << 14)
1860#define HYST_DISPLAY0CB (0x1 << 6)
1861#define HYST_DISPLAY0C (0x1 << 5)
1862#define HYST_DISPLAY0BB (0x1 << 4)
1863#define HYST_DISPLAY0B (0x1 << 3)
1864#define HYST_DISPLAY0AB (0x1 << 2)
1865#define HYST_DISPLAY0A (0x1 << 1)
1866#define HYST_PTCR (0x1 << 0)
1867
1868#define HYST_VDEDBGW (0x1 << 31)
1869#define HYST_VDEBSEVW (0x1 << 30)
1870#define HYST_SATAW (0x1 << 29)
1871#define HYST_PPCSAHBSLVW (0x1 << 28)
1872#define HYST_PPCSAHBDMAW (0x1 << 27)
1873#define HYST_MPCOREW (0x1 << 25)
1874#define HYST_MPCORELPW (0x1 << 24)
1875#define HYST_HOST1XW (0x1 << 22)
1876#define HYST_HDAW (0x1 << 21)
1877#define HYST_AVPCARM7W (0x1 << 18)
1878#define HYST_AFIW (0x1 << 17)
1879#define HYST_NVENCSWR (0x1 << 11)
1880#define HYST_MPCORER (0x1 << 7)
1881#define HYST_MPCORELPR (0x1 << 6)
1882#define HYST_VDETPER (0x1 << 5)
1883#define HYST_VDEMCER (0x1 << 4)
1884#define HYST_VDEMBER (0x1 << 3)
1885#define HYST_VDEBSEVR (0x1 << 2)
1886
1887#define HYST_DISPLAYT (0x1 << 26)
1888#define HYST_GPUSWR (0x1 << 25)
1889#define HYST_GPUSRD (0x1 << 24)
1890#define HYST_A9AVPSCW (0x1 << 23)
1891#define HYST_A9AVPSCR (0x1 << 22)
1892#define HYST_TSECSWR (0x1 << 21)
1893#define HYST_TSECSRD (0x1 << 20)
1894#define HYST_ISPWBB (0x1 << 17)
1895#define HYST_ISPWAB (0x1 << 16)
1896#define HYST_ISPRAB (0x1 << 14)
1897#define HYST_XUSB_DEVW (0x1 << 13)
1898#define HYST_XUSB_DEVR (0x1 << 12)
1899#define HYST_XUSB_HOSTW (0x1 << 11)
1900#define HYST_XUSB_HOSTR (0x1 << 10)
1901#define HYST_ISPWB (0x1 << 7)
1902#define HYST_ISPWA (0x1 << 6)
1903#define HYST_ISPRA (0x1 << 4)
1904#define HYST_VDETPMW (0x1 << 1)
1905#define HYST_VDEMBEW (0x1 << 0)
1906
1907#define HYST_DISPLAYD (0x1 << 19)
1908#define HYST_VIW (0x1 << 18)
1909#define HYST_VICSWR (0x1 << 13)
1910#define HYST_VICSRD (0x1 << 12)
1911#define HYST_SDMMCWAB (0x1 << 7)
1912#define HYST_SDMMCW (0x1 << 6)
1913#define HYST_SDMMCWAA (0x1 << 5)
1914#define HYST_SDMMCWA (0x1 << 4)
1915#define HYST_SDMMCRAB (0x1 << 3)
1916#define HYST_SDMMCR (0x1 << 2)
1917#define HYST_SDMMCRAA (0x1 << 1)
1918#define HYST_SDMMCRA (0x1 << 0)
1919
1920#endif
diff --git a/include/linux/platform/tegra/tegra_cl_dvfs.h b/include/linux/platform/tegra/tegra_cl_dvfs.h
new file mode 100644
index 000000000..5f408494e
--- /dev/null
+++ b/include/linux/platform/tegra/tegra_cl_dvfs.h
@@ -0,0 +1,159 @@
1/*
2 * include/linux/platform/tegra/tegra_cl_dvfs.h
3 *
4 * Copyright (c) 2012-2015 NVIDIA Corporation. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#ifndef _TEGRA_CL_DVFS_H_
20#define _TEGRA_CL_DVFS_H_
21
22struct tegra_cl_dvfs;
23struct pinctrl_dev;
24
25#define MAX_CL_DVFS_VOLTAGES 33
26
27enum tegra_cl_dvfs_force_mode {
28 TEGRA_CL_DVFS_FORCE_NONE = 0,
29 TEGRA_CL_DVFS_FORCE_FIXED = 1,
30 TEGRA_CL_DVFS_FORCE_AUTO = 2,
31};
32
33enum tegra_cl_dvfs_pmu_if {
34 TEGRA_CL_DVFS_PMU_I2C,
35 TEGRA_CL_DVFS_PMU_PWM,
36};
37
38enum tegra_cl_dvfs_pwm_bus {
39 TEGRA_CL_DVFS_PWM_1WIRE_BUFFER,
40 TEGRA_CL_DVFS_PWM_1WIRE_DIRECT,
41 TEGRA_CL_DVFS_PWM_2WIRE,
42};
43
44/* CL DVFS plaform flags*/
45/* set if output to PMU can be disabled only between I2C transactions */
46#define TEGRA_CL_DVFS_FLAGS_I2C_WAIT_QUIET (0x1UL << 0)
47/* dynamic output registers update is supported */
48#define TEGRA_CL_DVFS_DYN_OUTPUT_CFG (0x1UL << 1)
49/* monitor data new synchronization can not be used */
50#define TEGRA_CL_DVFS_DATA_NEW_NO_USE (0x1UL << 2)
51/* set if control settings are overridden when CPU is idle */
52#define TEGRA_CL_DVFS_HAS_IDLE_OVERRIDE (0x1UL << 3)
53/* set if calibration should be deferred for voltage matching force value */
54#define TEGRA_CL_DVFS_DEFER_FORCE_CALIBRATE (0x1UL << 4)
55/* set if request scale is applied in open loop (not set: enforce 1:1 scale) */
56#define TEGRA_CL_DVFS_SCALE_IN_OPEN_LOOP (0x1UL << 5)
57/* set if min output is forced during calibration */
58#define TEGRA_CL_DVFS_CALIBRATE_FORCE_VMIN (0x1UL << 6)
59
60
61
62struct tegra_cl_dvfs_cfg_param {
63 unsigned long sample_rate;
64
65 enum tegra_cl_dvfs_force_mode force_mode;
66 u8 cf;
67 u8 ci;
68 s8 cg;
69 bool cg_scale;
70
71 u8 droop_cut_value;
72 u8 droop_restore_ramp;
73 u8 scale_out_ramp;
74};
75
76struct voltage_reg_map {
77 u8 reg_value;
78 int reg_uV;
79};
80
81struct tegra_cl_dvfs_platform_data {
82 const char *dfll_clk_name;
83 u32 flags;
84
85 enum tegra_cl_dvfs_pmu_if pmu_if;
86 union {
87 struct {
88 unsigned long fs_rate;
89 unsigned long hs_rate; /* if 0 - no hs mode */
90 u8 hs_master_code;
91 u8 reg;
92 u16 slave_addr;
93 bool addr_10;
94 u32 sel_mul;
95 u32 sel_offs;
96 } pmu_i2c;
97 struct {
98 unsigned long pwm_rate;
99 bool delta_mode;
100 int min_uV;
101 int step_uV;
102 int init_uV;
103
104 enum tegra_cl_dvfs_pwm_bus pwm_bus;
105 int pwm_pingroup;
106 int pwm_clk_pingroup;
107 int out_gpio;
108 bool out_enable_high;
109 struct platform_device *dfll_bypass_dev;
110 struct pinctrl_dev *pinctrl_dev;
111 } pmu_pwm;
112 } u;
113
114 struct voltage_reg_map *vdd_map;
115 int vdd_map_size;
116 int pmu_undershoot_gb;
117 int resume_ramp_delay;
118 int tune_ramp_delay;
119
120 struct tegra_cl_dvfs_cfg_param *cfg_param;
121};
122
123#ifdef CONFIG_ARCH_TEGRA_HAS_CL_DVFS
124int tegra_init_cl_dvfs(void);
125int tegra_cl_dvfs_debug_init(struct clk *dfll_clk);
126void tegra_cl_dvfs_resume(struct tegra_cl_dvfs *cld);
127
128/* functions below are called only within DFLL clock interface DFLL lock held */
129void tegra_cl_dvfs_disable(struct tegra_cl_dvfs *cld);
130int tegra_cl_dvfs_enable(struct tegra_cl_dvfs *cld);
131int tegra_cl_dvfs_lock(struct tegra_cl_dvfs *cld);
132int tegra_cl_dvfs_unlock(struct tegra_cl_dvfs *cld);
133int tegra_cl_dvfs_request_rate(struct tegra_cl_dvfs *cld, unsigned long rate);
134unsigned long tegra_cl_dvfs_request_get(struct tegra_cl_dvfs *cld);
135
136#else
137static inline int tegra_init_cl_dvfs(void)
138{ return -ENOSYS; }
139static inline int tegra_cl_dvfs_debug_init(struct clk *dfll_clk)
140{ return -ENOSYS; }
141static inline void tegra_cl_dvfs_resume(struct tegra_cl_dvfs *cld)
142{}
143
144static inline void tegra_cl_dvfs_disable(struct tegra_cl_dvfs *cld)
145{}
146static inline int tegra_cl_dvfs_enable(struct tegra_cl_dvfs *cld)
147{ return -ENOSYS; }
148static inline int tegra_cl_dvfs_lock(struct tegra_cl_dvfs *cld)
149{ return -ENOSYS; }
150static inline int tegra_cl_dvfs_unlock(struct tegra_cl_dvfs *cld)
151{ return -ENOSYS; }
152static inline int tegra_cl_dvfs_request_rate(
153 struct tegra_cl_dvfs *cld, unsigned long rate)
154{ return -ENOSYS; }
155static inline unsigned long tegra_cl_dvfs_request_get(struct tegra_cl_dvfs *cld)
156{ return 0; }
157#endif
158
159#endif
diff --git a/include/linux/platform/tegra/tegra_mc.h b/include/linux/platform/tegra/tegra_mc.h
new file mode 100644
index 000000000..9aae94d33
--- /dev/null
+++ b/include/linux/platform/tegra/tegra_mc.h
@@ -0,0 +1,84 @@
1/*
2 * Copyright (C) 2017-2018, NVIDIA Corporation. All rights reserved.
3 *
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 */
14
15#ifndef __TEGRA_MC_H
16#define __TEGRA_MC_H
17
18/*
19 * API for reading carveout info.
20 */
21enum carveout_desc {
22 MC_SECURITY_CARVEOUT1 = 0,
23 MC_SECURITY_CARVEOUT2,
24 MC_SECURITY_CARVEOUT3,
25 MC_SECURITY_CARVEOUT4,
26 MC_NR_CARVEOUTS
27};
28
29struct mc_carveout_info {
30 enum carveout_desc desc;
31
32 u64 base;
33 u64 size;
34};
35
36#if defined(CONFIG_TEGRA_MC)
37
38/**
39 * Read from the MC.
40 *
41 * @idx The MC channel to read from.
42 * @reg The offset of the register to read.
43 *
44 * Read from the specified MC channel: 0 -> MC0, 1 -> MC1, etc. If @idx
45 * corresponds to a non-existent channel then 0 is returned.
46 */
47extern u32 tegra_mc_readl(u32 reg);
48
49/**
50 * Write to the MC.
51 *
52 * @idx The MC channel to write to.
53 * @val Value to write.
54 * @reg The offset of the register to write.
55 *
56 * Write to the specified MC channel: 0 -> MC0, 1 -> MC1, etc. For writes there
57 * is a special channel, %MC_BROADCAST_CHANNEL, which writes to all channels. If
58 * @idx corresponds to a non-existent channel then the write is dropped.
59 */
60extern void tegra_mc_writel(u32 val, u32 reg);
61
62extern int mc_get_carveout_info(struct mc_carveout_info *inf, int *nr,
63 enum carveout_desc co);
64
65#else
66
67static inline u32 tegra_mc_readl(u32 reg)
68{
69 return 0xffffffff;
70}
71
72static inline void tegra_mc_writel(u32 val, u32 reg)
73{
74}
75
76static inline int mc_get_carveout_info(struct mc_carveout_info *inf, int *nr,
77 enum carveout_desc co)
78{
79 return -ENODEV;
80}
81
82#endif
83
84#endif
diff --git a/include/linux/platform_data/thermal_sensors.h b/include/linux/platform_data/thermal_sensors.h
new file mode 100644
index 000000000..61708dc59
--- /dev/null
+++ b/include/linux/platform_data/thermal_sensors.h
@@ -0,0 +1,35 @@
1/*
2 * include/linux/platform_data/thermal_sensors.h
3 *
4 * Copyright (c) 2013-2014, NVIDIA Corporation. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 */
19
20#ifndef _THERMAL_SENSORS_H
21#define _THERMAL_SENSORS_H
22
23struct thermal_trip_info {
24 long trip_temp;
25 enum thermal_trip_type trip_type;
26 unsigned long upper;
27 unsigned long lower;
28 long hysteresis;
29 bool tripped;
30 u32 mask;
31 bool bound;
32 char *cdev_type;
33};
34
35#endif /* _THERMAL_SENSORS_H */
diff --git a/include/linux/tegra_throttle.h b/include/linux/tegra_throttle.h
new file mode 100644
index 000000000..04344dbee
--- /dev/null
+++ b/include/linux/tegra_throttle.h
@@ -0,0 +1,43 @@
1/*
2 * include/linux/tegra_throttle.h
3 *
4 * Copyright (c) 2010-2017 NVIDIA CORPORATION. All rights reserved.
5 *
6 * This software is licensed under the terms of the GNU General Public
7 * License version 2, as published by the Free Software Foundation, and
8 * may be copied, distributed, and modified under those terms.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 */
16
17#ifndef __TEGRA_THROTTLE_H
18#define __TEGRA_THROTTLE_H
19
20#include <linux/therm_est.h>
21#include <linux/thermal.h>
22
23struct tegra_cooling_device {
24 char *cdev_type;
25 int *trip_temperatures;
26 int trip_temperatures_num;
27 const char *compatible;
28 struct device_node *cdev_dn;
29};
30
31#define MAX_THROT_TABLE_SIZE (64)
32#define NO_CAP (ULONG_MAX) /* no cap */
33#define CPU_THROT_LOW 0 /* lowest throttle freq. only used for CPU */
34
35
36#ifdef CONFIG_TEGRA_THERMAL_THROTTLE
37bool tegra_is_throttling(int *count);
38#else
39static inline bool tegra_is_throttling(int *count)
40{ return false; }
41#endif /* CONFIG_TEGRA_THERMAL_THROTTLE */
42
43#endif /* __TEGRA_THROTTLE_H */