diff options
| author | Nicolin Chen <nicolinc@nvidia.com> | 2018-06-25 20:15:30 -0400 |
|---|---|---|
| committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-06-27 10:30:59 -0400 |
| commit | d0f76f97f4e6f535a169968ff9b9cd485a63e51a (patch) | |
| tree | 8e9688737c43700ad374bc4dece67c39a56323c2 /include/linux | |
| parent | c58a1702dc63d2bf1c2cecd1c4846f16ea445b05 (diff) | |
platform: tegra: Import header files to nvidia repo
This patch imports downstream header files from K4.4, K4.9 and K4.14.
Most of the header files are copied from K4.4 as it contains more files
than the other two. But this change also merges additional changes from
K4.9 and K4.14. Meanwhile it updates of license year.
Bug 200424912
Change-Id: I6802a0d8c390bdbf430fe06f00dc174cc2b98a7d
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1761105
GVS: Gerrit_Virtual_Submit
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/platform/tegra/bwmgr_mc.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 */ | ||
