summaryrefslogtreecommitdiffstats
path: root/include/linux/platform/tegra
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/platform/tegra')
-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
15 files changed, 4917 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