diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/platform/tegra/bwmgr_mc.h | 37 | ||||
| -rw-r--r-- | include/linux/platform/tegra/clock.h | 629 | ||||
| -rw-r--r-- | include/linux/platform/tegra/common.h | 62 | ||||
| -rw-r--r-- | include/linux/platform/tegra/cpu-tegra.h | 8 | ||||
| -rw-r--r-- | include/linux/platform/tegra/denver_mca.h | 69 | ||||
| -rw-r--r-- | include/linux/platform/tegra/dvfs.h | 443 | ||||
| -rw-r--r-- | include/linux/platform/tegra/emc_bwmgr.h | 393 | ||||
| -rw-r--r-- | include/linux/platform/tegra/iso_client.h | 33 | ||||
| -rw-r--r-- | include/linux/platform/tegra/isomgr.h | 215 | ||||
| -rw-r--r-- | include/linux/platform/tegra/mcerr.h | 176 | ||||
| -rw-r--r-- | include/linux/platform/tegra/reset.h | 115 | ||||
| -rw-r--r-- | include/linux/platform/tegra/tegra12_emc.h | 574 | ||||
| -rw-r--r-- | include/linux/platform/tegra/tegra21_emc.h | 1920 | ||||
| -rw-r--r-- | include/linux/platform/tegra/tegra_cl_dvfs.h | 159 | ||||
| -rw-r--r-- | include/linux/platform/tegra/tegra_mc.h | 84 | ||||
| -rw-r--r-- | include/linux/platform_data/thermal_sensors.h | 35 | ||||
| -rw-r--r-- | include/linux/tegra_throttle.h | 43 |
17 files changed, 4995 insertions, 0 deletions
diff --git a/include/linux/platform/tegra/bwmgr_mc.h b/include/linux/platform/tegra/bwmgr_mc.h new file mode 100644 index 000000000..2aa7f8a72 --- /dev/null +++ b/include/linux/platform/tegra/bwmgr_mc.h | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | /** | ||
| 2 | * Copyright (c) 2015-2018, NVIDIA CORPORATION. All rights reserved. | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License version 2 as | ||
| 6 | * published by the Free Software Foundation. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
| 9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 11 | * more details. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #ifndef __BWMGR_MC_H | ||
| 15 | #define __BWMGR_MC_H | ||
| 16 | |||
| 17 | #include <linux/types.h> | ||
| 18 | #include <linux/platform/tegra/iso_client.h> | ||
| 19 | |||
| 20 | unsigned 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 | |||
| 26 | void bwmgr_eff_init(void); | ||
| 27 | |||
| 28 | unsigned long bwmgr_freq_to_bw(unsigned long freq); | ||
| 29 | unsigned long bwmgr_bw_to_freq(unsigned long bw); | ||
| 30 | unsigned long bwmgr_get_lowest_iso_emc_freq(long iso_bw, | ||
| 31 | long iso_bw_nvdis, long iso_bw_vi); | ||
| 32 | u32 tegra_bwmgr_get_max_iso_bw(enum tegra_iso_client); | ||
| 33 | |||
| 34 | u32 bwmgr_dvfs_latency(u32 ufreq); | ||
| 35 | int bwmgr_iso_bw_percentage_max(void); | ||
| 36 | int 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 | |||
| 49 | struct 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 | ||
| 90 | struct clk_tegra; | ||
| 91 | #define to_clk_tegra(_hw) container_of(_hw, struct clk_tegra, hw) | ||
| 92 | #endif | ||
| 93 | |||
| 94 | struct clk_mux_sel { | ||
| 95 | struct clk *input; | ||
| 96 | u32 value; | ||
| 97 | }; | ||
| 98 | |||
| 99 | struct clk_backup { | ||
| 100 | struct clk *input; | ||
| 101 | u32 value; | ||
| 102 | unsigned long bus_rate; | ||
| 103 | }; | ||
| 104 | |||
| 105 | struct 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 | |||
| 115 | struct 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 | |||
| 134 | struct 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 | |||
| 153 | enum 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 | |||
| 163 | enum clk_state { | ||
| 164 | UNINITIALIZED = 0, | ||
| 165 | ON, | ||
| 166 | OFF, | ||
| 167 | }; | ||
| 168 | |||
| 169 | struct 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 | ||
| 179 | struct 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 | |||
| 193 | struct 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 | |||
| 206 | struct clk_stats { | ||
| 207 | struct bus_stats *histogram; | ||
| 208 | cputime64_t time_on; | ||
| 209 | u64 last_update; | ||
| 210 | }; | ||
| 211 | |||
| 212 | enum cpu_mode { | ||
| 213 | MODE_G = 0, | ||
| 214 | MODE_LP, | ||
| 215 | }; | ||
| 216 | |||
| 217 | enum 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 | |||
| 227 | struct 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 | |||
| 375 | struct 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 | |||
| 432 | struct clk_duplicate { | ||
| 433 | const char *name; | ||
| 434 | struct clk_lookup lookup; | ||
| 435 | }; | ||
| 436 | |||
| 437 | struct 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 | ||
| 456 | void tegra_init_max_rate(struct clk *c, unsigned long max_rate); | ||
| 457 | void tegra_init_min_rate(struct clk *c, unsigned long min_rate); | ||
| 458 | void tegra_clk_preset_emc_monitor(unsigned long rate); | ||
| 459 | void tegra_periph_clk_safe_rate_init(struct clk *c); | ||
| 460 | void tegra_clk_verify_parents(void); | ||
| 461 | void tegra_clk_set_disabled_div_all(void); | ||
| 462 | void clk_init(struct clk *clk); | ||
| 463 | unsigned long tegra_clk_measure_input_freq(void); | ||
| 464 | unsigned long clk_get_rate_locked(struct clk *c); | ||
| 465 | void tegra_clk_init_from_dt(const char *dt_table_name); | ||
| 466 | void tegra_clk_init_cbus_plls_from_table(struct tegra_clk_init_table *table); | ||
| 467 | void clk_set_cansleep(struct clk *c); | ||
| 468 | unsigned long clk_get_min_rate(struct clk *c); | ||
| 469 | unsigned long clk_get_max_rate(struct clk *c); | ||
| 470 | bool tegra_is_clk_initialized(struct clk *c); | ||
| 471 | |||
| 472 | int clk_set_rate_locked(struct clk *c, unsigned long rate); | ||
| 473 | int clk_rate_change_notify(struct clk *c, unsigned long rate); | ||
| 474 | int clk_set_parent_locked(struct clk *c, struct clk *parent); | ||
| 475 | int clk_reparent(struct clk *c, struct clk *parent); | ||
| 476 | long clk_round_rate_locked(struct clk *c, unsigned long rate); | ||
| 477 | int tegra_clk_shared_bus_update(struct clk *c); | ||
| 478 | int tegra_clk_shared_bus_update_locked(struct clk *c); | ||
| 479 | void tegra3_set_cpu_skipper_delay(int delay); | ||
| 480 | unsigned long tegra_clk_measure_input_freq(void); | ||
| 481 | int clk_enable_locked(struct clk *c); | ||
| 482 | void clk_disable_locked(struct clk *c); | ||
| 483 | bool tegra_clk_is_parent_allowed(struct clk *c, struct clk *p); | ||
| 484 | #endif /* !CONFIG_COMMON_CLK */ | ||
| 485 | |||
| 486 | struct 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 | |||
| 492 | void tegra2_init_clocks(void); | ||
| 493 | void tegra30_init_clocks(void); | ||
| 494 | void tegra11x_init_clocks(void); | ||
| 495 | void tegra12x_init_clocks(void); | ||
| 496 | void tegra21x_init_clocks(void); | ||
| 497 | void tegra11x_clk_init_la(void); | ||
| 498 | void tegra_common_init_clock(void); | ||
| 499 | struct clk *tegra_get_clock_by_name(const char *name); | ||
| 500 | |||
| 501 | void tegra_clk_init_from_table(struct tegra_clk_init_table *table); | ||
| 502 | |||
| 503 | /* Reset driver through Reset framework */ | ||
| 504 | extern 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 | */ | ||
| 512 | unsigned long int tegra_dfll_boot_req_khz(void); | ||
| 513 | |||
| 514 | #ifndef CONFIG_COMMON_CLK | ||
| 515 | void tegra_shared_bus_stats_allocate(struct clk *c, struct bus_stats *stats); | ||
| 516 | int tegra_shared_bus_stats_copy_to_buffer( | ||
| 517 | struct clk *c, struct bus_stats *stats, char *buf, int len); | ||
| 518 | void tegra_shared_bus_stats_update( | ||
| 519 | struct bus_stats *stats, int user_idx, int rate_idx); | ||
| 520 | |||
| 521 | int clk_config_cpu_edp_safe_rate(struct clk *cpu, struct clk *cluster_clk, | ||
| 522 | unsigned long rate); | ||
| 523 | |||
| 524 | static 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 | |||
| 529 | static 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 | |||
| 535 | static 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 | |||
| 540 | static inline bool clk_is_auto_dvfs(struct clk *c) | ||
| 541 | { | ||
| 542 | return c->auto_dvfs; | ||
| 543 | } | ||
| 544 | |||
| 545 | static inline bool clk_is_dvfs(struct clk *c) | ||
| 546 | { | ||
| 547 | return (c->dvfs != NULL); | ||
| 548 | } | ||
| 549 | |||
| 550 | static inline bool clk_cansleep(struct clk *c) | ||
| 551 | { | ||
| 552 | return c->cansleep; | ||
| 553 | } | ||
| 554 | |||
| 555 | static inline bool clk_can_set_disabled_div(struct clk *c) | ||
| 556 | { | ||
| 557 | return c->set_disabled_div; | ||
| 558 | } | ||
| 559 | |||
| 560 | static 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 | |||
| 572 | static 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 | |||
| 583 | static 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 | |||
| 590 | static 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 | |||
| 598 | static 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) \ | ||
| 609 | static 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 | } \ | ||
| 614 | static 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 | |||
| 624 | void 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 | |||
| 20 | extern struct smp_operations tegra_smp_ops; | ||
| 21 | |||
| 22 | extern phys_addr_t tegra_tsec_start; | ||
| 23 | extern phys_addr_t tegra_tsec_size; | ||
| 24 | |||
| 25 | #ifdef CONFIG_CACHE_L2X0 | ||
| 26 | void tegra_init_cache(bool init); | ||
| 27 | #else | ||
| 28 | static inline void tegra_init_cache(bool init) {} | ||
| 29 | #endif | ||
| 30 | |||
| 31 | extern void tegra_cpu_die(unsigned int cpu); | ||
| 32 | extern int tegra_cpu_kill(unsigned int cpu); | ||
| 33 | extern phys_addr_t tegra_avp_kernel_start; | ||
| 34 | extern phys_addr_t tegra_avp_kernel_size; | ||
| 35 | void ahb_gizmo_writel(unsigned long val, void __iomem *reg); | ||
| 36 | |||
| 37 | extern struct device tegra_generic_cma_dev; | ||
| 38 | extern struct device tegra_vpr_cma_dev; | ||
| 39 | extern int tegra_with_secure_firmware; | ||
| 40 | |||
| 41 | extern struct device tegra_generic_dev; | ||
| 42 | extern struct device tegra_vpr_dev; | ||
| 43 | extern struct device tegra_iram_dev; | ||
| 44 | extern struct dma_resize_notifier_ops vpr_dev_ops; | ||
| 45 | |||
| 46 | u32 tegra_get_bct_strapping(void); | ||
| 47 | u32 tegra_get_fuse_opt_subrevision(void); | ||
| 48 | enum tegra_revision tegra_chip_get_revision(void); | ||
| 49 | void __init display_tegra_dt_info(void); | ||
| 50 | |||
| 51 | void tegra_register_idle_unidle(int (*do_idle)(void *), | ||
| 52 | int (*do_unidle)(void *), | ||
| 53 | void *data); | ||
| 54 | void tegra_unregister_idle_unidle(int (*do_idle)(void *)); | ||
| 55 | |||
| 56 | static inline int tegra_cpu_is_secure(void) | ||
| 57 | { | ||
| 58 | return tegra_with_secure_firmware; | ||
| 59 | } | ||
| 60 | |||
| 61 | int 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 | ||
| 26 | unsigned int tegra_getspeed(unsigned int cpu); | 27 | unsigned int tegra_getspeed(unsigned int cpu); |
| 27 | int tegra_update_cpu_speed(unsigned long rate); | 28 | int 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 | ||
| 93 | struct tegra_cooling_device *tegra_vc_get_cdev(void); | ||
| 94 | #else | ||
| 95 | static 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 |
| 92 | unsigned long lp_to_virtual_gfreq(unsigned long lp_freq); | 100 | unsigned long lp_to_virtual_gfreq(unsigned long lp_freq); |
| 93 | int tegra_cpu_volt_cap_apply(int *cap_idx, int new_idx, int level); | 101 | int 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) \ | ||
| 16 | static 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 | |||
| 36 | struct denver_mca_error { | ||
| 37 | char *name; | ||
| 38 | u16 error_code; | ||
| 39 | }; | ||
| 40 | |||
| 41 | struct 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 | |||
| 68 | void register_denver_mca_bank(struct denver_mca_bank *bank); | ||
| 69 | void 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 | |||
| 33 | struct clk; | ||
| 34 | struct 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 | */ | ||
| 43 | struct 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 | |||
| 54 | struct 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 | |||
| 62 | struct rail_alignment { | ||
| 63 | int offset_uv; | ||
| 64 | int step_uv; /* Step voltage */ | ||
| 65 | }; | ||
| 66 | |||
| 67 | struct 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 | */ | ||
| 147 | enum 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 | |||
| 156 | extern int tegra_override_dfll_range; | ||
| 157 | |||
| 158 | /* DVFS settings specific for DFLL clock source */ | ||
| 159 | struct 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 */ | ||
| 182 | struct dvfs_pll_data { | ||
| 183 | int min_millivolts; | ||
| 184 | }; | ||
| 185 | |||
| 186 | struct 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 */ | ||
| 237 | struct cvb_dvfs_parameters { | ||
| 238 | int c0; | ||
| 239 | int c1; | ||
| 240 | int c2; | ||
| 241 | int c3; | ||
| 242 | int c4; | ||
| 243 | int c5; | ||
| 244 | }; | ||
| 245 | |||
| 246 | struct 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 | |||
| 256 | struct 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 | |||
| 298 | extern struct dvfs_rail *tegra_cpu_rail; | ||
| 299 | extern struct dvfs_rail *tegra_gpu_rail; | ||
| 300 | extern struct dvfs_rail *tegra_core_rail; | ||
| 301 | |||
| 302 | struct 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 | ||
| 311 | typedef int (*of_tegra_dvfs_init_cb_t)(struct device_node *); | ||
| 312 | int of_tegra_dvfs_init(const struct of_device_id *matches); | ||
| 313 | int of_tegra_dvfs_rail_node_parse(struct device_node *rail_dn, | ||
| 314 | struct dvfs_rail *rail); | ||
| 315 | int 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 | ||
| 319 | static inline int of_tegra_dvfs_init(const struct of_device_id *matches) | ||
| 320 | { return -ENODATA; } | ||
| 321 | static inline int of_tegra_dvfs_rail_node_parse(struct device_node *rail_dn, | ||
| 322 | struct dvfs_rail *rail) | ||
| 323 | { return -ENODEV; } | ||
| 324 | static 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 | |||
| 330 | void tegra21x_init_dvfs(void); | ||
| 331 | int dvfs_debugfs_init(struct dentry *clk_debugfs_root); | ||
| 332 | int tegra_dvfs_rail_connect_regulators(void); | ||
| 333 | int tegra_dvfs_rail_register_notifiers(void); | ||
| 334 | int tegra_dvfs_init_rails(struct dvfs_rail *dvfs_rails[], int n); | ||
| 335 | void tegra_dvfs_add_relationships(struct dvfs_relationship *rels, int n); | ||
| 336 | |||
| 337 | void tegra_dvfs_rail_enable(struct dvfs_rail *rail); | ||
| 338 | void tegra_dvfs_rail_disable(struct dvfs_rail *rail); | ||
| 339 | int tegra_dvfs_rail_power_up(struct dvfs_rail *rail); | ||
| 340 | int tegra_dvfs_rail_power_down(struct dvfs_rail *rail); | ||
| 341 | bool tegra_dvfs_is_rail_up(struct dvfs_rail *rail); | ||
| 342 | bool tegra_dvfs_rail_updating(struct clk *clk); | ||
| 343 | void tegra_dvfs_rail_off(struct dvfs_rail *rail, ktime_t now); | ||
| 344 | void tegra_dvfs_rail_on(struct dvfs_rail *rail, ktime_t now); | ||
| 345 | void tegra_dvfs_rail_pause(struct dvfs_rail *rail, ktime_t delta, bool on); | ||
| 346 | int tegra_dvfs_rail_set_mode(struct dvfs_rail *rail, unsigned int mode); | ||
| 347 | int tegra_dvfs_rail_register_notifier(struct dvfs_rail *rail, | ||
| 348 | struct notifier_block *nb); | ||
| 349 | int tegra_dvfs_rail_unregister_notifier(struct dvfs_rail *rail, | ||
| 350 | struct notifier_block *nb); | ||
| 351 | struct dvfs_rail *tegra_dvfs_get_rail_by_name(const char *reg_id); | ||
| 352 | int tegra_dvfs_rail_get_current_millivolts(struct dvfs_rail *rail); | ||
| 353 | |||
| 354 | int tegra_dvfs_override_core_cap_apply(int level); | ||
| 355 | int tegra_dvfs_therm_vmax_core_cap_apply(int *cap_idx, int new_idx, int level); | ||
| 356 | |||
| 357 | int tegra_dvfs_alt_freqs_install(struct dvfs *d, unsigned long *alt_freqs); | ||
| 358 | void tegra_dvfs_alt_freqs_install_always( | ||
| 359 | struct dvfs *d, unsigned long *alt_freqs); | ||
| 360 | int tegra_dvfs_replace_voltage_table(struct dvfs *d, const int *new_millivolts); | ||
| 361 | |||
| 362 | int tegra_dvfs_butterfly_throttle(struct clk *c1, unsigned long *rate1, | ||
| 363 | struct clk *c2, unsigned long *rate2); | ||
| 364 | |||
| 365 | int tegra_dvfs_dfll_mode_set(struct dvfs *d, unsigned long rate); | ||
| 366 | int tegra_dvfs_dfll_mode_clear(struct dvfs *d, unsigned long rate); | ||
| 367 | int tegra_clk_dfll_range_control(enum dfll_range use_dfll); | ||
| 368 | bool tegra_dvfs_is_dfll_scale(struct dvfs *d, unsigned long rate); | ||
| 369 | bool tegra_dvfs_is_dfll_range(struct dvfs *d, unsigned long rate); | ||
| 370 | int tegra_dvfs_swap_dfll_range(struct dvfs *d, int range, int *old_range); | ||
| 371 | int tegra_dvfs_set_dfll_range(struct dvfs *d, int range); | ||
| 372 | int tegra_dvfs_rail_set_reg_volatile(struct dvfs_rail *rail, bool set); | ||
| 373 | |||
| 374 | void tegra_clip_freqs(u32 *freqs, int *num_freqs, int freqs_mult, | ||
| 375 | const unsigned long *rates_ladder, int num_rates, bool up); | ||
| 376 | |||
| 377 | struct tegra_cooling_device *tegra_dvfs_get_cpu_vmax_cdev(void); | ||
| 378 | struct tegra_cooling_device *tegra_dvfs_get_cpu_vmin_cdev(void); | ||
| 379 | struct tegra_cooling_device *tegra_dvfs_get_core_vmax_cdev(void); | ||
| 380 | struct tegra_cooling_device *tegra_dvfs_get_core_vmin_cdev(void); | ||
| 381 | struct tegra_cooling_device *tegra_dvfs_get_gpu_vmin_cdev(void); | ||
| 382 | struct tegra_cooling_device *tegra_dvfs_get_gpu_vts_cdev(void); | ||
| 383 | struct tegra_cooling_device *tegra_dvfs_get_cpu_clk_switch_cdev(void); | ||
| 384 | void 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); | ||
| 387 | void 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); | ||
| 390 | int 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); | ||
| 393 | int 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); | ||
| 396 | int tegra_dvfs_rail_init_clk_switch_thermal_profile( | ||
| 397 | int *clk_switch_trips, struct dvfs_rail *rail); | ||
| 398 | int tegra_dvfs_rail_init_thermal_dvfs_trips( | ||
| 399 | int *therm_trips_table, struct dvfs_rail *rail); | ||
| 400 | int tegra_dvfs_init_thermal_dvfs_voltages(int *millivolts, | ||
| 401 | int *peak_millivolts, int freqs_num, int ranges_num, struct dvfs *d); | ||
| 402 | int tegra_dvfs_rail_dfll_mode_set_cold(struct dvfs_rail *rail, | ||
| 403 | struct clk *dfll_clk); | ||
| 404 | int tegra_dvfs_rail_get_thermal_floor(struct dvfs_rail *rail); | ||
| 405 | void tegra_dvfs_rail_register_vmax_cdev(struct dvfs_rail *rail); | ||
| 406 | |||
| 407 | #ifdef CONFIG_TEGRA_VDD_CORE_OVERRIDE | ||
| 408 | int tegra_dvfs_resolve_override(struct clk *c, unsigned long max_rate); | ||
| 409 | int tegra_dvfs_rail_get_override_floor(struct dvfs_rail *rail); | ||
| 410 | #else | ||
| 411 | static inline int tegra_dvfs_resolve_override(struct clk *c, unsigned long rate) | ||
| 412 | { return 0; } | ||
| 413 | static inline int tegra_dvfs_rail_get_override_floor(struct dvfs_rail *rail) | ||
| 414 | { return 0; } | ||
| 415 | #endif | ||
| 416 | |||
| 417 | static inline int tegra_dvfs_rail_disable_prepare(struct dvfs_rail *rail) | ||
| 418 | { return 0; } | ||
| 419 | static inline int tegra_dvfs_rail_post_enable(struct dvfs_rail *rail) | ||
| 420 | { return 0; } | ||
| 421 | |||
| 422 | bool tegra_dvfs_is_dfll_bypass(void); | ||
| 423 | |||
| 424 | static inline bool tegra_dvfs_rail_is_dfll_mode(struct dvfs_rail *rail) | ||
| 425 | { | ||
| 426 | return rail ? rail->dfll_mode : false; | ||
| 427 | } | ||
| 428 | |||
| 429 | static 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 | |||
| 436 | static 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 */ | ||
| 23 | enum 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 | |||
| 77 | enum 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 | |||
| 86 | enum 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 | |||
| 100 | extern u8 bwmgr_dram_efficiency; | ||
| 101 | extern u8 bwmgr_dram_num_channels; | ||
| 102 | /* flag to determine supported memory and channel configuration */ | ||
| 103 | extern u8 bwmgr_dram_config_supported; | ||
| 104 | extern u32 *bwmgr_dram_iso_eff_table; | ||
| 105 | extern u32 *bwmgr_dram_noniso_eff_table; | ||
| 106 | extern u32 *bwmgr_max_nvdis_bw_reqd; | ||
| 107 | extern u32 *bwmgr_max_vi_bw_reqd; | ||
| 108 | extern int *bwmgr_slope; | ||
| 109 | extern u32 *bwmgr_vi_bw_reqd_offset; | ||
| 110 | extern int bwmgr_iso_bw_percentage; | ||
| 111 | extern enum bwmgr_dram_types bwmgr_dram_type; | ||
| 112 | extern int emc_to_dram_freq_factor; | ||
| 113 | |||
| 114 | struct tegra_bwmgr_client; | ||
| 115 | |||
| 116 | struct 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 | |||
| 131 | struct bwmgr_ops *bwmgr_eff_init_t21x(void); | ||
| 132 | struct bwmgr_ops *bwmgr_eff_init_t18x(void); | ||
| 133 | struct 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 | */ | ||
| 143 | struct 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 | */ | ||
| 155 | void 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 | */ | ||
| 163 | u8 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 | */ | ||
| 170 | unsigned 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 | */ | ||
| 177 | unsigned 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 | */ | ||
| 186 | unsigned 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 | */ | ||
| 195 | unsigned 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 | */ | ||
| 213 | int 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 | */ | ||
| 226 | int 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 | */ | ||
| 238 | int 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 | */ | ||
| 246 | int 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 | */ | ||
| 253 | int __init bwmgr_init(void); | ||
| 254 | |||
| 255 | void __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 | */ | ||
| 261 | int __init pmqos_bwmgr_init(void); | ||
| 262 | |||
| 263 | #else /* CONFIG_TEGRA_BWMGR */ | ||
| 264 | |||
| 265 | static 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 | |||
| 275 | static inline void tegra_bwmgr_unregister(struct tegra_bwmgr_client *handle) {} | ||
| 276 | |||
| 277 | static inline int bwmgr_init(void) | ||
| 278 | { | ||
| 279 | return 0; | ||
| 280 | } | ||
| 281 | |||
| 282 | static inline void bwmgr_exit(void) {} | ||
| 283 | |||
| 284 | static inline u8 tegra_bwmgr_get_dram_num_channels(void) | ||
| 285 | { | ||
| 286 | return 0; | ||
| 287 | } | ||
| 288 | |||
| 289 | static 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 | |||
| 313 | static 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 | |||
| 338 | static inline unsigned long tegra_bwmgr_get_core_emc_rate(void) | ||
| 339 | { | ||
| 340 | return 0; | ||
| 341 | } | ||
| 342 | static 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 | |||
| 366 | static 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 | |||
| 372 | static 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 | |||
| 382 | static inline int tegra_bwmgr_notifier_register(struct notifier_block *nb) | ||
| 383 | { | ||
| 384 | return 0; | ||
| 385 | } | ||
| 386 | |||
| 387 | static 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 | |||
| 18 | enum 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 */ | ||
| 32 | typedef void (*tegra_isomgr_renegotiate)(void *priv, | ||
| 33 | u32 avail_bw); /* KB/sec */ | ||
| 34 | |||
| 35 | struct 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 | |||
| 43 | struct 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 | |||
| 86 | struct 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 | |||
| 106 | extern struct isoclient_info *isoclient_info; | ||
| 107 | /*platform specific flag for requesting max emc floor req for camera client*/ | ||
| 108 | extern u8 isomgr_camera_max_floor_req; | ||
| 109 | extern int isoclients; | ||
| 110 | extern bool client_valid[TEGRA_ISO_CLIENT_COUNT]; | ||
| 111 | extern struct isomgr_client isomgr_clients[TEGRA_ISO_CLIENT_COUNT]; | ||
| 112 | extern struct isomgr isomgr; | ||
| 113 | extern char *cname[]; | ||
| 114 | |||
| 115 | struct 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 | |||
| 126 | struct isomgr_ops *pre_t19x_isomgr_init(void); | ||
| 127 | struct isomgr_ops *t19x_isomgr_init(void); | ||
| 128 | |||
| 129 | #if defined(CONFIG_TEGRA_ISOMGR) | ||
| 130 | /* Register an ISO BW client */ | ||
| 131 | tegra_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 */ | ||
| 137 | void tegra_isomgr_unregister(tegra_isomgr_handle handle); | ||
| 138 | |||
| 139 | /* Reserve ISO BW on behalf of client - don't apply, rval is dvfs thresh usec */ | ||
| 140 | u32 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 */ | ||
| 145 | u32 tegra_isomgr_realize(tegra_isomgr_handle handle); | ||
| 146 | |||
| 147 | /* This sets bw aside for the client specified. */ | ||
| 148 | int tegra_isomgr_set_margin(enum tegra_iso_client client, u32 bw, bool wait); | ||
| 149 | |||
| 150 | int tegra_isomgr_get_imp_time(enum tegra_iso_client, u32 bw); | ||
| 151 | |||
| 152 | /* returns available in iso bw in KB/sec */ | ||
| 153 | u32 tegra_isomgr_get_available_iso_bw(void); | ||
| 154 | |||
| 155 | /* returns total iso bw in KB/sec */ | ||
| 156 | u32 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 | */ | ||
| 162 | int __init isomgr_init(void); | ||
| 163 | #else | ||
| 164 | static 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 | |||
| 176 | static inline void tegra_isomgr_unregister(tegra_isomgr_handle handle) {} | ||
| 177 | |||
| 178 | static inline u32 tegra_isomgr_reserve(tegra_isomgr_handle handle, | ||
| 179 | u32 bw, u32 lt) | ||
| 180 | { | ||
| 181 | return 1; | ||
| 182 | } | ||
| 183 | |||
| 184 | static inline u32 tegra_isomgr_realize(tegra_isomgr_handle handle) | ||
| 185 | { | ||
| 186 | return 1; | ||
| 187 | } | ||
| 188 | |||
| 189 | static inline int tegra_isomgr_set_margin(enum tegra_iso_client client, u32 bw) | ||
| 190 | { | ||
| 191 | return 0; | ||
| 192 | } | ||
| 193 | |||
| 194 | static inline int tegra_isomgr_get_imp_time(enum tegra_iso_client client, | ||
| 195 | u32 bw) | ||
| 196 | { | ||
| 197 | return 0; | ||
| 198 | } | ||
| 199 | |||
| 200 | static inline u32 tegra_isomgr_get_available_iso_bw(void) | ||
| 201 | { | ||
| 202 | return UINT_MAX; | ||
| 203 | } | ||
| 204 | |||
| 205 | static inline u32 tegra_isomgr_get_total_iso_bw(enum tegra_iso_client client) | ||
| 206 | { | ||
| 207 | return UINT_MAX; | ||
| 208 | } | ||
| 209 | |||
| 210 | static 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 | |||
| 54 | struct platform_device; | ||
| 55 | int tegra_mcerr_init(struct dentry *mc_paren, struct platform_device *pdev); | ||
| 56 | irqreturn_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 | */ | ||
| 68 | struct 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 | |||
| 84 | extern u32 mc_int_mask; | ||
| 85 | extern u32 mcerr_silenced; | ||
| 86 | |||
| 87 | struct 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 | ||
| 165 | struct arb_emem_intr_info { | ||
| 166 | int arb_intr_mma; | ||
| 167 | u64 time; | ||
| 168 | spinlock_t lock; | ||
| 169 | }; | ||
| 170 | |||
| 171 | typedef 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 | |||
| 45 | extern unsigned long __tegra_cpu_reset_handler_data[TEGRA_RESET_DATA_SIZE]; | ||
| 46 | |||
| 47 | void __tegra_cpu_reset_handler_start(void); | ||
| 48 | void __tegra_cpu_reset_handler(void); | ||
| 49 | void __tegra_cpu_reset_handler_end(void); | ||
| 50 | void 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 | ||
| 111 | void tegra_cpu_reset_handler_save(void); | ||
| 112 | void 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 | |||
| 27 | int tegra12_emc_init(void); | ||
| 28 | |||
| 29 | enum { | ||
| 30 | DRAM_DEV_SEL_ALL = 0, | ||
| 31 | DRAM_DEV_SEL_0 = (2 << 30), | ||
| 32 | DRAM_DEV_SEL_1 = (1 << 30), | ||
| 33 | }; | ||
| 34 | |||
| 35 | void 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) | ||
| 173 | enum { | ||
| 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 | |||
| 59 | extern 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 | ||
| 568 | enum { | ||
| 569 | BURST_REG_LIST | ||
| 570 | }; | ||
| 571 | enum { | ||
| 572 | BURST_MC_REG_LIST | ||
| 573 | }; | ||
| 574 | enum { | ||
| 575 | TRIM_REG_LIST | ||
| 576 | }; | ||
| 577 | |||
| 578 | /* | ||
| 579 | * Defines a sequence this driver supports. Used for maintaining a list of | ||
| 580 | * different revisions. | ||
| 581 | */ | ||
| 582 | struct 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 | */ | ||
| 594 | void emc_writel(u32 val, unsigned long addr); | ||
| 595 | u32 emc_readl(unsigned long addr); | ||
| 596 | u32 emc1_readl(unsigned long addr); | ||
| 597 | void emc1_writel(u32 val, unsigned long addr); | ||
| 598 | void mc_writel(u32 val, unsigned long addr); | ||
| 599 | u32 mc_readl(unsigned long addr); | ||
| 600 | struct tegra21_emc_table * | ||
| 601 | get_timing_from_freq(unsigned long freq); | ||
| 602 | int wait_for_update(u32 status_reg, u32 bit_mask, bool updated_state, | ||
| 603 | int chan); | ||
| 604 | void emc_timing_update(int dual_chan); | ||
| 605 | void do_clock_change(u32 clk_setting); | ||
| 606 | void emc_set_shadow_bypass(int set); | ||
| 607 | u32 get_dll_state(struct tegra21_emc_table *next_timing); | ||
| 608 | u32 div_o3(u32 a, u32 b); | ||
| 609 | void ccfifo_writel(u32 val, unsigned long addr, u32 delay); | ||
| 610 | struct tegra21_emc_table *emc_get_table(unsigned long over_temp_state); | ||
| 611 | void __emc_copy_table_params(struct tegra21_emc_table *src, | ||
| 612 | struct tegra21_emc_table *dst, int flags); | ||
| 613 | void 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) | ||
| 621 | u32 actual_osc_clocks(u32 in); | ||
| 622 | void __reset_dram_clktree_values(struct tegra21_emc_table *table); | ||
| 623 | u32 apply_periodic_compensation_trimmer( | ||
| 624 | struct tegra21_emc_table *next_timing, u32 offset); | ||
| 625 | void __update_emc_alt_timing(struct tegra21_emc_table *current_timing); | ||
| 626 | void start_periodic_compensation(void); | ||
| 627 | u32 do_dvfs_power_ramp_down(u32 clk, int flip_backward, | ||
| 628 | struct tegra21_emc_table *last_timing, | ||
| 629 | struct tegra21_emc_table *next_timing); | ||
| 630 | u32 do_dvfs_power_ramp_up(u32 clk, int flip_backward, | ||
| 631 | struct tegra21_emc_table *last_timing, | ||
| 632 | struct tegra21_emc_table *next_timing); | ||
| 633 | void change_dll_src(struct tegra21_emc_table *next_timing, u32 clksrc); | ||
| 634 | u32 dll_prelock(struct tegra21_emc_table *next_timing, | ||
| 635 | int dvfs_with_training, u32 clksrc); | ||
| 636 | void dll_disable(int channel_mode); | ||
| 637 | void dll_enable(int channel_mode); | ||
| 638 | #endif | ||
| 639 | |||
| 640 | extern int ccfifo_index; | ||
| 641 | extern void __iomem *emc_base; | ||
| 642 | extern void __iomem *emc1_base; | ||
| 643 | extern void __iomem *mc_base; | ||
| 644 | extern void __iomem *clk_base; | ||
| 645 | extern unsigned long dram_over_temp_state; | ||
| 646 | |||
| 647 | extern struct tegra21_emc_table *tegra_emc_table; | ||
| 648 | extern struct tegra21_emc_table *tegra_emc_table_derated; | ||
| 649 | extern int tegra_emc_table_size; | ||
| 650 | |||
| 651 | /* | ||
| 652 | * EMC register lists. | ||
| 653 | */ | ||
| 654 | extern void __iomem *burst_reg_off[]; | ||
| 655 | extern void __iomem *burst_perch_reg_off[]; | ||
| 656 | extern void __iomem *vref_reg_off[]; | ||
| 657 | extern void __iomem *trim_reg_off[]; | ||
| 658 | extern void __iomem *trim_perch_reg_off[]; | ||
| 659 | extern void __iomem *la_scale_off_regs[]; | ||
| 660 | extern void __iomem *burst_mc_reg_off[]; | ||
| 661 | |||
| 662 | /* | ||
| 663 | * Versions of the clock change we support. | ||
| 664 | */ | ||
| 665 | void emc_set_clock_r21012(struct tegra21_emc_table *next_timing, | ||
| 666 | struct tegra21_emc_table *last_timing, | ||
| 667 | int training, u32 clksrc); | ||
| 668 | void emc_set_clock_r21015(struct tegra21_emc_table *next_timing, | ||
| 669 | struct tegra21_emc_table *last_timing, | ||
| 670 | int training, u32 clksrc); | ||
| 671 | void emc_set_clock_r21021(struct tegra21_emc_table *next_timing, | ||
| 672 | struct tegra21_emc_table *last_timing, | ||
| 673 | int training, u32 clksrc); | ||
| 674 | u32 __do_periodic_emc_compensation_r21015( | ||
| 675 | struct tegra21_emc_table *current_timing); | ||
| 676 | u32 __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 | |||
| 683 | enum { | ||
| 684 | DLL_CHANGE_NONE = 0, | ||
| 685 | DLL_CHANGE_ON, | ||
| 686 | DLL_CHANGE_OFF, | ||
| 687 | }; | ||
| 688 | |||
| 689 | enum { | ||
| 690 | DLL_OFF, | ||
| 691 | DLL_ON | ||
| 692 | }; | ||
| 693 | |||
| 694 | enum { | ||
| 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 | |||
| 704 | enum { | ||
| 705 | ASSEMBLY = 0, /* I.e shadow registers. */ | ||
| 706 | ACTIVE | ||
| 707 | }; | ||
| 708 | |||
| 709 | enum { | ||
| 710 | T_RP = 0, | ||
| 711 | T_FC_LPDDR4, | ||
| 712 | T_RFC, | ||
| 713 | T_PDEX, | ||
| 714 | RL | ||
| 715 | }; | ||
| 716 | |||
| 717 | enum { | ||
| 718 | ONE_RANK = 1, | ||
| 719 | TWO_RANK = 2 | ||
| 720 | }; | ||
| 721 | |||
| 722 | enum { | ||
| 723 | SINGLE_CHANNEL = 0, | ||
| 724 | DUAL_CHANNEL | ||
| 725 | }; | ||
| 726 | |||
| 727 | enum { | ||
| 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 | |||
| 735 | enum { | ||
| 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 | |||
| 744 | enum { | ||
| 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 | |||
| 22 | struct tegra_cl_dvfs; | ||
| 23 | struct pinctrl_dev; | ||
| 24 | |||
| 25 | #define MAX_CL_DVFS_VOLTAGES 33 | ||
| 26 | |||
| 27 | enum 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 | |||
| 33 | enum tegra_cl_dvfs_pmu_if { | ||
| 34 | TEGRA_CL_DVFS_PMU_I2C, | ||
| 35 | TEGRA_CL_DVFS_PMU_PWM, | ||
| 36 | }; | ||
| 37 | |||
| 38 | enum 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 | |||
| 62 | struct 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 | |||
| 76 | struct voltage_reg_map { | ||
| 77 | u8 reg_value; | ||
| 78 | int reg_uV; | ||
| 79 | }; | ||
| 80 | |||
| 81 | struct 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 | ||
| 124 | int tegra_init_cl_dvfs(void); | ||
| 125 | int tegra_cl_dvfs_debug_init(struct clk *dfll_clk); | ||
| 126 | void tegra_cl_dvfs_resume(struct tegra_cl_dvfs *cld); | ||
| 127 | |||
| 128 | /* functions below are called only within DFLL clock interface DFLL lock held */ | ||
| 129 | void tegra_cl_dvfs_disable(struct tegra_cl_dvfs *cld); | ||
| 130 | int tegra_cl_dvfs_enable(struct tegra_cl_dvfs *cld); | ||
| 131 | int tegra_cl_dvfs_lock(struct tegra_cl_dvfs *cld); | ||
| 132 | int tegra_cl_dvfs_unlock(struct tegra_cl_dvfs *cld); | ||
| 133 | int tegra_cl_dvfs_request_rate(struct tegra_cl_dvfs *cld, unsigned long rate); | ||
| 134 | unsigned long tegra_cl_dvfs_request_get(struct tegra_cl_dvfs *cld); | ||
| 135 | |||
| 136 | #else | ||
| 137 | static inline int tegra_init_cl_dvfs(void) | ||
| 138 | { return -ENOSYS; } | ||
| 139 | static inline int tegra_cl_dvfs_debug_init(struct clk *dfll_clk) | ||
| 140 | { return -ENOSYS; } | ||
| 141 | static inline void tegra_cl_dvfs_resume(struct tegra_cl_dvfs *cld) | ||
| 142 | {} | ||
| 143 | |||
| 144 | static inline void tegra_cl_dvfs_disable(struct tegra_cl_dvfs *cld) | ||
| 145 | {} | ||
| 146 | static inline int tegra_cl_dvfs_enable(struct tegra_cl_dvfs *cld) | ||
| 147 | { return -ENOSYS; } | ||
| 148 | static inline int tegra_cl_dvfs_lock(struct tegra_cl_dvfs *cld) | ||
| 149 | { return -ENOSYS; } | ||
| 150 | static inline int tegra_cl_dvfs_unlock(struct tegra_cl_dvfs *cld) | ||
| 151 | { return -ENOSYS; } | ||
| 152 | static inline int tegra_cl_dvfs_request_rate( | ||
| 153 | struct tegra_cl_dvfs *cld, unsigned long rate) | ||
| 154 | { return -ENOSYS; } | ||
| 155 | static 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 | */ | ||
| 21 | enum 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 | |||
| 29 | struct 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 | */ | ||
| 47 | extern 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 | */ | ||
| 60 | extern void tegra_mc_writel(u32 val, u32 reg); | ||
| 61 | |||
| 62 | extern int mc_get_carveout_info(struct mc_carveout_info *inf, int *nr, | ||
| 63 | enum carveout_desc co); | ||
| 64 | |||
| 65 | #else | ||
| 66 | |||
| 67 | static inline u32 tegra_mc_readl(u32 reg) | ||
| 68 | { | ||
| 69 | return 0xffffffff; | ||
| 70 | } | ||
| 71 | |||
| 72 | static inline void tegra_mc_writel(u32 val, u32 reg) | ||
| 73 | { | ||
| 74 | } | ||
| 75 | |||
| 76 | static inline int mc_get_carveout_info(struct mc_carveout_info *inf, int *nr, | ||
| 77 | enum carveout_desc co) | ||
| 78 | { | ||
| 79 | return -ENODEV; | ||
| 80 | } | ||
| 81 | |||
| 82 | #endif | ||
| 83 | |||
| 84 | #endif | ||
diff --git a/include/linux/platform_data/thermal_sensors.h b/include/linux/platform_data/thermal_sensors.h new file mode 100644 index 000000000..61708dc59 --- /dev/null +++ b/include/linux/platform_data/thermal_sensors.h | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | /* | ||
| 2 | * include/linux/platform_data/thermal_sensors.h | ||
| 3 | * | ||
| 4 | * Copyright (c) 2013-2014, NVIDIA Corporation. All rights reserved. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; version 2 of the License. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
| 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 13 | * more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License along | ||
| 16 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 17 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
| 18 | */ | ||
| 19 | |||
| 20 | #ifndef _THERMAL_SENSORS_H | ||
| 21 | #define _THERMAL_SENSORS_H | ||
| 22 | |||
| 23 | struct thermal_trip_info { | ||
| 24 | long trip_temp; | ||
| 25 | enum thermal_trip_type trip_type; | ||
| 26 | unsigned long upper; | ||
| 27 | unsigned long lower; | ||
| 28 | long hysteresis; | ||
| 29 | bool tripped; | ||
| 30 | u32 mask; | ||
| 31 | bool bound; | ||
| 32 | char *cdev_type; | ||
| 33 | }; | ||
| 34 | |||
| 35 | #endif /* _THERMAL_SENSORS_H */ | ||
diff --git a/include/linux/tegra_throttle.h b/include/linux/tegra_throttle.h new file mode 100644 index 000000000..04344dbee --- /dev/null +++ b/include/linux/tegra_throttle.h | |||
| @@ -0,0 +1,43 @@ | |||
| 1 | /* | ||
| 2 | * include/linux/tegra_throttle.h | ||
| 3 | * | ||
| 4 | * Copyright (c) 2010-2017 NVIDIA CORPORATION. All rights reserved. | ||
| 5 | * | ||
| 6 | * This software is licensed under the terms of the GNU General Public | ||
| 7 | * License version 2, as published by the Free Software Foundation, and | ||
| 8 | * may be copied, distributed, and modified under those terms. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | */ | ||
| 16 | |||
| 17 | #ifndef __TEGRA_THROTTLE_H | ||
| 18 | #define __TEGRA_THROTTLE_H | ||
| 19 | |||
| 20 | #include <linux/therm_est.h> | ||
| 21 | #include <linux/thermal.h> | ||
| 22 | |||
| 23 | struct tegra_cooling_device { | ||
| 24 | char *cdev_type; | ||
| 25 | int *trip_temperatures; | ||
| 26 | int trip_temperatures_num; | ||
| 27 | const char *compatible; | ||
| 28 | struct device_node *cdev_dn; | ||
| 29 | }; | ||
| 30 | |||
| 31 | #define MAX_THROT_TABLE_SIZE (64) | ||
| 32 | #define NO_CAP (ULONG_MAX) /* no cap */ | ||
| 33 | #define CPU_THROT_LOW 0 /* lowest throttle freq. only used for CPU */ | ||
| 34 | |||
| 35 | |||
| 36 | #ifdef CONFIG_TEGRA_THERMAL_THROTTLE | ||
| 37 | bool tegra_is_throttling(int *count); | ||
| 38 | #else | ||
| 39 | static inline bool tegra_is_throttling(int *count) | ||
| 40 | { return false; } | ||
| 41 | #endif /* CONFIG_TEGRA_THERMAL_THROTTLE */ | ||
| 42 | |||
| 43 | #endif /* __TEGRA_THROTTLE_H */ | ||
