/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (c) 2015-2020, NVIDIA CORPORATION.  All rights reserved.
 */

#ifndef TEGRA210_EMC_H
#define TEGRA210_EMC_H

#include <linux/clk.h>
#include <linux/clk/tegra.h>
#include <linux/io.h>
#include <linux/platform_device.h>

#define DVFS_FGCG_HIGH_SPEED_THRESHOLD				1000
#define IOBRICK_DCC_THRESHOLD					2400
#define DVFS_FGCG_MID_SPEED_THRESHOLD				600

#define EMC_STATUS_UPDATE_TIMEOUT				1000

/* register definitions */
#define EMC_INTSTATUS						0x0
#define EMC_INTSTATUS_CLKCHANGE_COMPLETE			BIT(4)
#define EMC_DBG							0x8
#define EMC_DBG_WRITE_MUX_ACTIVE				BIT(1)
#define EMC_DBG_WRITE_ACTIVE_ONLY				BIT(30)
#define EMC_CFG							0xc
#define EMC_CFG_DRAM_CLKSTOP_PD					BIT(31)
#define EMC_CFG_DRAM_CLKSTOP_SR					BIT(30)
#define EMC_CFG_DRAM_ACPD					BIT(29)
#define EMC_CFG_DYN_SELF_REF					BIT(28)
#define EMC_PIN							0x24
#define EMC_PIN_PIN_CKE						BIT(0)
#define EMC_PIN_PIN_CKEB					BIT(1)
#define EMC_PIN_PIN_CKE_PER_DEV					BIT(2)
#define EMC_TIMING_CONTROL					0x28
#define EMC_RC							0x2c
#define EMC_RFC							0x30
#define EMC_RAS							0x34
#define EMC_RP							0x38
#define EMC_R2W							0x3c
#define EMC_W2R							0x40
#define EMC_R2P							0x44
#define EMC_W2P							0x48
#define EMC_RD_RCD						0x4c
#define EMC_WR_RCD						0x50
#define EMC_RRD							0x54
#define EMC_REXT						0x58
#define EMC_WDV							0x5c
#define EMC_QUSE						0x60
#define EMC_QRST						0x64
#define EMC_QSAFE						0x68
#define EMC_RDV							0x6c
#define EMC_REFRESH						0x70
#define EMC_BURST_REFRESH_NUM					0x74
#define EMC_PDEX2WR						0x78
#define EMC_PDEX2RD						0x7c
#define EMC_PCHG2PDEN						0x80
#define EMC_ACT2PDEN						0x84
#define EMC_AR2PDEN						0x88
#define EMC_RW2PDEN						0x8c
#define EMC_TXSR						0x90
#define EMC_TCKE						0x94
#define EMC_TFAW						0x98
#define EMC_TRPAB						0x9c
#define EMC_TCLKSTABLE						0xa0
#define EMC_TCLKSTOP						0xa4
#define EMC_TREFBW						0xa8
#define EMC_TPPD						0xac
#define EMC_ODT_WRITE						0xb0
#define EMC_PDEX2MRR						0xb4
#define EMC_WEXT						0xb8
#define EMC_RFC_SLR						0xc0
#define EMC_MRS_WAIT_CNT2					0xc4
#define EMC_MRS_WAIT_CNT2_MRS_EXT2_WAIT_CNT_SHIFT		16
#define EMC_MRS_WAIT_CNT2_MRS_EXT1_WAIT_CNT_SHIFT		0
#define EMC_MRS_WAIT_CNT					0xc8
#define EMC_MRS_WAIT_CNT_SHORT_WAIT_SHIFT			0
#define EMC_MRS_WAIT_CNT_SHORT_WAIT_MASK			\
	(0x3FF << EMC_MRS_WAIT_CNT_SHORT_WAIT_SHIFT)

#define EMC_MRS							0xcc
#define EMC_EMRS						0xd0
#define EMC_EMRS_USE_EMRS_LONG_CNT				BIT(26)
#define EMC_REF							0xd4
#define  EMC_REF_REF_CMD					BIT(0)
#define EMC_SELF_REF						0xe0
#define EMC_MRW							0xe8
#define EMC_MRW_MRW_OP_SHIFT					0
#define EMC_MRW_MRW_OP_MASK					\
	(0xff << EMC_MRW_MRW_OP_SHIFT)
#define EMC_MRW_MRW_MA_SHIFT					16
#define EMC_MRW_USE_MRW_EXT_CNT					27
#define EMC_MRW_MRW_DEV_SELECTN_SHIFT				30

#define EMC_MRR							0xec
#define EMC_MRR_DEV_SEL_SHIFT					30
#define EMC_MRR_DEV_SEL_MASK					0x3
#define EMC_MRR_MA_SHIFT					16
#define EMC_MRR_MA_MASK						0xff
#define EMC_MRR_DATA_SHIFT					0
#define EMC_MRR_DATA_MASK					0xffff

#define EMC_FBIO_SPARE						0x100
#define EMC_FBIO_CFG5						0x104
#define EMC_FBIO_CFG5_DRAM_TYPE_SHIFT				0
#define EMC_FBIO_CFG5_DRAM_TYPE_MASK				\
	(0x3 << EMC_FBIO_CFG5_DRAM_TYPE_SHIFT)
#define EMC_FBIO_CFG5_CMD_TX_DIS				BIT(8)

#define EMC_PDEX2CKE						0x118
#define EMC_CKE2PDEN						0x11c
#define EMC_MPC							0x128
#define EMC_EMRS2						0x12c
#define EMC_EMRS2_USE_EMRS2_LONG_CNT				BIT(26)
#define EMC_MRW2						0x134
#define EMC_MRW3						0x138
#define EMC_MRW4						0x13c
#define EMC_R2R							0x144
#define EMC_EINPUT						0x14c
#define EMC_EINPUT_DURATION					0x150
#define EMC_PUTERM_EXTRA					0x154
#define EMC_TCKESR						0x158
#define EMC_TPD							0x15c
#define EMC_AUTO_CAL_CONFIG					0x2a4
#define EMC_AUTO_CAL_CONFIG_AUTO_CAL_COMPUTE_START		BIT(0)
#define EMC_AUTO_CAL_CONFIG_AUTO_CAL_MEASURE_STALL		BIT(9)
#define EMC_AUTO_CAL_CONFIG_AUTO_CAL_UPDATE_STALL		BIT(10)
#define EMC_AUTO_CAL_CONFIG_AUTO_CAL_ENABLE			BIT(29)
#define EMC_AUTO_CAL_CONFIG_AUTO_CAL_START			BIT(31)
#define EMC_EMC_STATUS						0x2b4
#define EMC_EMC_STATUS_MRR_DIVLD				BIT(20)
#define EMC_EMC_STATUS_TIMING_UPDATE_STALLED			BIT(23)
#define EMC_EMC_STATUS_DRAM_IN_POWERDOWN_SHIFT			4
#define EMC_EMC_STATUS_DRAM_IN_POWERDOWN_MASK			\
	(0x3 << EMC_EMC_STATUS_DRAM_IN_POWERDOWN_SHIFT)
#define EMC_EMC_STATUS_DRAM_IN_SELF_REFRESH_SHIFT		8
#define EMC_EMC_STATUS_DRAM_IN_SELF_REFRESH_MASK		\
	(0x3 << EMC_EMC_STATUS_DRAM_IN_SELF_REFRESH_SHIFT)

#define EMC_CFG_2						0x2b8
#define EMC_CFG_DIG_DLL						0x2bc
#define EMC_CFG_DIG_DLL_CFG_DLL_EN				BIT(0)
#define EMC_CFG_DIG_DLL_CFG_DLL_STALL_ALL_UNTIL_LOCK		BIT(1)
#define EMC_CFG_DIG_DLL_CFG_DLL_STALL_ALL_TRAFFIC		BIT(3)
#define EMC_CFG_DIG_DLL_CFG_DLL_STALL_RW_UNTIL_LOCK		BIT(4)
#define EMC_CFG_DIG_DLL_CFG_DLL_MODE_SHIFT			6
#define EMC_CFG_DIG_DLL_CFG_DLL_MODE_MASK			\
	(0x3 << EMC_CFG_DIG_DLL_CFG_DLL_MODE_SHIFT)
#define EMC_CFG_DIG_DLL_CFG_DLL_LOCK_LIMIT_SHIFT		8
#define EMC_CFG_DIG_DLL_CFG_DLL_LOCK_LIMIT_MASK			\
	(0x7 << EMC_CFG_DIG_DLL_CFG_DLL_LOCK_LIMIT_SHIFT)

#define EMC_CFG_DIG_DLL_PERIOD					0x2c0
#define EMC_DIG_DLL_STATUS					0x2c4
#define EMC_DIG_DLL_STATUS_DLL_LOCK				BIT(15)
#define EMC_DIG_DLL_STATUS_DLL_PRIV_UPDATED			BIT(17)
#define EMC_DIG_DLL_STATUS_DLL_OUT_SHIFT			0
#define EMC_DIG_DLL_STATUS_DLL_OUT_MASK				\
	(0x7ff << EMC_DIG_DLL_STATUS_DLL_OUT_SHIFT)

#define EMC_CFG_DIG_DLL_1					0x2c8
#define EMC_RDV_MASK						0x2cc
#define EMC_WDV_MASK						0x2d0
#define EMC_RDV_EARLY_MASK					0x2d4
#define EMC_RDV_EARLY						0x2d8
#define EMC_AUTO_CAL_CONFIG8					0x2dc
#define EMC_ZCAL_INTERVAL					0x2e0
#define EMC_ZCAL_WAIT_CNT					0x2e4
#define EMC_ZCAL_WAIT_CNT_ZCAL_WAIT_CNT_MASK			0x7ff
#define EMC_ZCAL_WAIT_CNT_ZCAL_WAIT_CNT_SHIFT			0

#define EMC_ZQ_CAL						0x2ec
#define EMC_ZQ_CAL_DEV_SEL_SHIFT				30
#define EMC_ZQ_CAL_LONG						BIT(4)
#define EMC_ZQ_CAL_ZQ_LATCH_CMD					BIT(1)
#define EMC_ZQ_CAL_ZQ_CAL_CMD					BIT(0)
#define EMC_FDPD_CTRL_DQ					0x310
#define EMC_FDPD_CTRL_CMD					0x314
#define EMC_PMACRO_CMD_BRICK_CTRL_FDPD				0x318
#define EMC_PMACRO_DATA_BRICK_CTRL_FDPD				0x31c
#define EMC_PMACRO_BRICK_CTRL_RFU1				0x330
#define EMC_PMACRO_BRICK_CTRL_RFU2				0x334
#define EMC_TR_TIMING_0						0x3b4
#define EMC_TR_CTRL_1						0x3bc
#define EMC_TR_RDV						0x3c4
#define EMC_STALL_THEN_EXE_AFTER_CLKCHANGE			0x3cc
#define EMC_SEL_DPD_CTRL					0x3d8
#define EMC_SEL_DPD_CTRL_DATA_SEL_DPD_EN			BIT(8)
#define EMC_SEL_DPD_CTRL_ODT_SEL_DPD_EN				BIT(5)
#define EMC_SEL_DPD_CTRL_RESET_SEL_DPD_EN			BIT(4)
#define EMC_SEL_DPD_CTRL_CA_SEL_DPD_EN				BIT(3)
#define EMC_SEL_DPD_CTRL_CLK_SEL_DPD_EN				BIT(2)
#define EMC_PRE_REFRESH_REQ_CNT					0x3dc
#define EMC_DYN_SELF_REF_CONTROL				0x3e0
#define EMC_TXSRDLL						0x3e4
#define EMC_CCFIFO_ADDR						0x3e8
#define  EMC_CCFIFO_ADDR_STALL_BY_1 (1 << 31)
#define  EMC_CCFIFO_ADDR_STALL(x) (((x) & 0x7fff) << 16)
#define  EMC_CCFIFO_ADDR_OFFSET(x) ((x) & 0xffff)
#define EMC_CCFIFO_DATA						0x3ec
#define EMC_TR_QPOP						0x3f4
#define EMC_TR_RDV_MASK						0x3f8
#define EMC_TR_QSAFE						0x3fc
#define EMC_TR_QRST						0x400
#define EMC_ISSUE_QRST						0x428
#define EMC_AUTO_CAL_CONFIG2					0x458
#define EMC_AUTO_CAL_CONFIG3					0x45c
#define EMC_TR_DVFS						0x460
#define EMC_AUTO_CAL_CHANNEL					0x464
#define EMC_IBDLY						0x468
#define EMC_OBDLY						0x46c
#define EMC_TXDSRVTTGEN						0x480
#define EMC_WE_DURATION						0x48c
#define EMC_WS_DURATION						0x490
#define EMC_WEV							0x494
#define EMC_WSV							0x498
#define EMC_CFG_3						0x49c
#define EMC_MRW6						0x4a4
#define EMC_MRW7						0x4a8
#define EMC_MRW8						0x4ac
#define EMC_MRW9						0x4b0
#define EMC_MRW10						0x4b4
#define EMC_MRW11						0x4b8
#define EMC_MRW12						0x4bc
#define EMC_MRW13						0x4c0
#define EMC_MRW14						0x4c4
#define EMC_MRW15						0x4d0
#define EMC_CFG_SYNC						0x4d4
#define EMC_FDPD_CTRL_CMD_NO_RAMP				0x4d8
#define EMC_FDPD_CTRL_CMD_NO_RAMP_CMD_DPD_NO_RAMP_ENABLE	BIT(0)
#define EMC_WDV_CHK						0x4e0
#define EMC_CFG_PIPE_2						0x554
#define EMC_CFG_PIPE_CLK					0x558
#define EMC_CFG_PIPE_CLK_CLK_ALWAYS_ON				BIT(0)
#define EMC_CFG_PIPE_1						0x55c
#define EMC_CFG_PIPE						0x560
#define EMC_QPOP						0x564
#define EMC_QUSE_WIDTH						0x568
#define EMC_PUTERM_WIDTH					0x56c
#define EMC_AUTO_CAL_CONFIG7					0x574
#define EMC_REFCTRL2						0x580
#define EMC_FBIO_CFG7						0x584
#define EMC_FBIO_CFG7_CH0_ENABLE				BIT(1)
#define EMC_FBIO_CFG7_CH1_ENABLE				BIT(2)
#define EMC_DATA_BRLSHFT_0					0x588
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE7_DATA_BRLSHFT_SHIFT	21
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE7_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE7_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE6_DATA_BRLSHFT_SHIFT	18
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE6_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE6_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE5_DATA_BRLSHFT_SHIFT	15
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE5_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE5_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE4_DATA_BRLSHFT_SHIFT	12
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE4_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE4_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE3_DATA_BRLSHFT_SHIFT	9
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE3_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE3_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE2_DATA_BRLSHFT_SHIFT	6
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE2_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE2_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE1_DATA_BRLSHFT_SHIFT	3
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE1_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE1_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE0_DATA_BRLSHFT_SHIFT	0
#define EMC_DATA_BRLSHFT_0_RANK0_BYTE0_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_0_RANK0_BYTE0_DATA_BRLSHFT_SHIFT)

#define EMC_DATA_BRLSHFT_1					0x58c
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE7_DATA_BRLSHFT_SHIFT	21
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE7_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE7_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE6_DATA_BRLSHFT_SHIFT	18
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE6_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE6_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE5_DATA_BRLSHFT_SHIFT	15
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE5_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE5_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE4_DATA_BRLSHFT_SHIFT	12
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE4_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE4_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE3_DATA_BRLSHFT_SHIFT	9
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE3_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE3_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE2_DATA_BRLSHFT_SHIFT	6
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE2_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE2_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE1_DATA_BRLSHFT_SHIFT	3
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE1_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE1_DATA_BRLSHFT_SHIFT)
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE0_DATA_BRLSHFT_SHIFT	0
#define EMC_DATA_BRLSHFT_1_RANK1_BYTE0_DATA_BRLSHFT_MASK	\
	(0x7 << EMC_DATA_BRLSHFT_1_RANK1_BYTE0_DATA_BRLSHFT_SHIFT)

#define EMC_RFCPB						0x590
#define EMC_DQS_BRLSHFT_0					0x594
#define EMC_DQS_BRLSHFT_1					0x598
#define EMC_CMD_BRLSHFT_0					0x59c
#define EMC_CMD_BRLSHFT_1					0x5a0
#define EMC_CMD_BRLSHFT_2					0x5a4
#define EMC_CMD_BRLSHFT_3					0x5a8
#define EMC_QUSE_BRLSHFT_0					0x5ac
#define EMC_AUTO_CAL_CONFIG4					0x5b0
#define EMC_AUTO_CAL_CONFIG5					0x5b4
#define EMC_QUSE_BRLSHFT_1					0x5b8
#define EMC_QUSE_BRLSHFT_2					0x5bc
#define EMC_CCDMW						0x5c0
#define EMC_QUSE_BRLSHFT_3					0x5c4
#define EMC_AUTO_CAL_CONFIG6					0x5cc
#define EMC_DLL_CFG_0						0x5e4
#define EMC_DLL_CFG_1						0x5e8
#define EMC_DLL_CFG_1_DDLLCAL_CTRL_START_TRIM_SHIFT		10
#define EMC_DLL_CFG_1_DDLLCAL_CTRL_START_TRIM_MASK		\
	(0x7ff << EMC_DLL_CFG_1_DDLLCAL_CTRL_START_TRIM_SHIFT)

#define EMC_CONFIG_SAMPLE_DELAY					0x5f0
#define EMC_CFG_UPDATE						0x5f4
#define EMC_CFG_UPDATE_UPDATE_DLL_IN_UPDATE_SHIFT		9
#define EMC_CFG_UPDATE_UPDATE_DLL_IN_UPDATE_MASK		\
	(0x3 << EMC_CFG_UPDATE_UPDATE_DLL_IN_UPDATE_SHIFT)

#define EMC_PMACRO_QUSE_DDLL_RANK0_0				0x600
#define EMC_PMACRO_QUSE_DDLL_RANK0_1				0x604
#define EMC_PMACRO_QUSE_DDLL_RANK0_2				0x608
#define EMC_PMACRO_QUSE_DDLL_RANK0_3				0x60c
#define EMC_PMACRO_QUSE_DDLL_RANK0_4				0x610
#define EMC_PMACRO_QUSE_DDLL_RANK0_5				0x614
#define EMC_PMACRO_QUSE_DDLL_RANK1_0				0x620
#define EMC_PMACRO_QUSE_DDLL_RANK1_1				0x624
#define EMC_PMACRO_QUSE_DDLL_RANK1_2				0x628
#define EMC_PMACRO_QUSE_DDLL_RANK1_3				0x62c
#define EMC_PMACRO_QUSE_DDLL_RANK1_4				0x630
#define EMC_PMACRO_QUSE_DDLL_RANK1_5				0x634
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0			0x640
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0_OB_DDLL_LONG_DQ_RANK0_BYTE1_SHIFT \
	16
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0_OB_DDLL_LONG_DQ_RANK0_BYTE1_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0_OB_DDLL_LONG_DQ_RANK0_BYTE1_SHIFT)
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0_OB_DDLL_LONG_DQ_RANK0_BYTE0_SHIFT \
	0
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0_OB_DDLL_LONG_DQ_RANK0_BYTE0_MASK \
	(0x3ff <<							    \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0_OB_DDLL_LONG_DQ_RANK0_BYTE0_SHIFT)

#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1			0x644
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1_OB_DDLL_LONG_DQ_RANK0_BYTE3_SHIFT \
	16
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1_OB_DDLL_LONG_DQ_RANK0_BYTE3_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1_OB_DDLL_LONG_DQ_RANK0_BYTE3_SHIFT)
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1_OB_DDLL_LONG_DQ_RANK0_BYTE2_SHIFT \
	0
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1_OB_DDLL_LONG_DQ_RANK0_BYTE2_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1_OB_DDLL_LONG_DQ_RANK0_BYTE2_SHIFT)

#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2			0x648
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2_OB_DDLL_LONG_DQ_RANK0_BYTE5_SHIFT  \
	16
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2_OB_DDLL_LONG_DQ_RANK0_BYTE5_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2_OB_DDLL_LONG_DQ_RANK0_BYTE5_SHIFT)
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2_OB_DDLL_LONG_DQ_RANK0_BYTE4_SHIFT \
	0
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2_OB_DDLL_LONG_DQ_RANK0_BYTE4_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2_OB_DDLL_LONG_DQ_RANK0_BYTE4_SHIFT)

#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3			0x64c
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3_OB_DDLL_LONG_DQ_RANK0_BYTE7_SHIFT \
	16
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3_OB_DDLL_LONG_DQ_RANK0_BYTE7_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3_OB_DDLL_LONG_DQ_RANK0_BYTE7_SHIFT)
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3_OB_DDLL_LONG_DQ_RANK0_BYTE6_SHIFT \
	0
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3_OB_DDLL_LONG_DQ_RANK0_BYTE6_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3_OB_DDLL_LONG_DQ_RANK0_BYTE6_SHIFT)

#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_4			0x650
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_5			0x654
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0			0x660
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0_OB_DDLL_LONG_DQ_RANK1_BYTE1_SHIFT \
	16
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0_OB_DDLL_LONG_DQ_RANK1_BYTE1_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0_OB_DDLL_LONG_DQ_RANK1_BYTE1_SHIFT)
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0_OB_DDLL_LONG_DQ_RANK1_BYTE0_SHIFT \
	0
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0_OB_DDLL_LONG_DQ_RANK1_BYTE0_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0_OB_DDLL_LONG_DQ_RANK1_BYTE0_SHIFT)

#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1			0x664
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1_OB_DDLL_LONG_DQ_RANK1_BYTE3_SHIFT \
	16
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1_OB_DDLL_LONG_DQ_RANK1_BYTE3_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1_OB_DDLL_LONG_DQ_RANK1_BYTE3_SHIFT)
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1_OB_DDLL_LONG_DQ_RANK1_BYTE2_SHIFT \
	0
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1_OB_DDLL_LONG_DQ_RANK1_BYTE2_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1_OB_DDLL_LONG_DQ_RANK1_BYTE2_SHIFT)

#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2			0x668
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2_OB_DDLL_LONG_DQ_RANK1_BYTE5_SHIFT \
	16
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2_OB_DDLL_LONG_DQ_RANK1_BYTE5_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2_OB_DDLL_LONG_DQ_RANK1_BYTE5_SHIFT)
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2_OB_DDLL_LONG_DQ_RANK1_BYTE4_SHIFT \
	0
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2_OB_DDLL_LONG_DQ_RANK1_BYTE4_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2_OB_DDLL_LONG_DQ_RANK1_BYTE4_SHIFT)

#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3			0x66c
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3_OB_DDLL_LONG_DQ_RANK1_BYTE7_SHIFT \
	16
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3_OB_DDLL_LONG_DQ_RANK1_BYTE7_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3_OB_DDLL_LONG_DQ_RANK1_BYTE7_SHIFT)
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3_OB_DDLL_LONG_DQ_RANK1_BYTE6_SHIFT \
	0
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3_OB_DDLL_LONG_DQ_RANK1_BYTE6_MASK  \
	(0x3ff <<							     \
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3_OB_DDLL_LONG_DQ_RANK1_BYTE6_SHIFT)

#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_4			0x670
#define EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_5			0x674
#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_0			0x680
#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_1			0x684
#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_2			0x688
#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_3			0x68c
#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_4			0x690
#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_5			0x694
#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_0			0x6a0
#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_1			0x6a4
#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_2			0x6a8
#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_3			0x6ac
#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_4			0x6b0
#define EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_5			0x6b4
#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_0			0x6c0
#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_1			0x6c4
#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_2			0x6c8
#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_3			0x6cc
#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_0			0x6e0
#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_1			0x6e4
#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_2			0x6e8
#define EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_3			0x6ec
#define EMC_PMACRO_TX_PWRD_0					0x720
#define EMC_PMACRO_TX_PWRD_1					0x724
#define EMC_PMACRO_TX_PWRD_2					0x728
#define EMC_PMACRO_TX_PWRD_3					0x72c
#define EMC_PMACRO_TX_PWRD_4					0x730
#define EMC_PMACRO_TX_PWRD_5					0x734
#define EMC_PMACRO_TX_SEL_CLK_SRC_0				0x740
#define EMC_PMACRO_TX_SEL_CLK_SRC_1				0x744
#define EMC_PMACRO_TX_SEL_CLK_SRC_3				0x74c
#define EMC_PMACRO_TX_SEL_CLK_SRC_2				0x748
#define EMC_PMACRO_TX_SEL_CLK_SRC_4				0x750
#define EMC_PMACRO_TX_SEL_CLK_SRC_5				0x754
#define EMC_PMACRO_DDLL_BYPASS					0x760
#define EMC_PMACRO_DDLL_PWRD_0					0x770
#define EMC_PMACRO_DDLL_PWRD_1					0x774
#define EMC_PMACRO_DDLL_PWRD_2					0x778
#define EMC_PMACRO_CMD_CTRL_0					0x780
#define EMC_PMACRO_CMD_CTRL_1					0x784
#define EMC_PMACRO_CMD_CTRL_2					0x788
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_0		0x800
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_1		0x804
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_2		0x808
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_3		0x80c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_0		0x810
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_1		0x814
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_2		0x818
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_3		0x81c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_0		0x820
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_1		0x824
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_2		0x828
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_3		0x82c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_0		0x830
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_1		0x834
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_2		0x838
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_3		0x83c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_0		0x840
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_1		0x844
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_2		0x848
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_3		0x84c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_0		0x850
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_1		0x854
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_2		0x858
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_3		0x85c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_0		0x860
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_1		0x864
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_2		0x868
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_3		0x86c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_0		0x870
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_1		0x874
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_2		0x878
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_3		0x87c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_0		0x880
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_1		0x884
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_2		0x888
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_3		0x88c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_0		0x890
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_1		0x894
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_2		0x898
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_3		0x89c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_0		0x8a0
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_1		0x8a4
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_2		0x8a8
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_3		0x8ac
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_0		0x8b0
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_1		0x8b4
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_2		0x8b8
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_3		0x8bc
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_0		0x900
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_1		0x904
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_2		0x908
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_3		0x90c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_0		0x910
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_1		0x914
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_2		0x918
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_3		0x91c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_0		0x920
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_1		0x924
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_2		0x928
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_3		0x92c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_0		0x930
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_1		0x934
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_2		0x938
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_3		0x93c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_0		0x940
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_1		0x944
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_2		0x948
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_3		0x94c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_0		0x950
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_1		0x954
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_2		0x958
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_3		0x95c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_0		0x960
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_1		0x964
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_2		0x968
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_3		0x96c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_0		0x970
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_1		0x974
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_2		0x978
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_3		0x97c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_0		0x980
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_1		0x984
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_2		0x988
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_3		0x98c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_0		0x990
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_1		0x994
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_2		0x998
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_3		0x99c
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_0		0x9a0
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_1		0x9a4
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_2		0x9a8
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_3		0x9ac
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_0		0x9b0
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_1		0x9b4
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_2		0x9b8
#define EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_3		0x9bc
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_0		0xa00
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_1		0xa04
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_2		0xa08
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_0		0xa10
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_1		0xa14
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_2		0xa18
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_0		0xa20
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_1		0xa24
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_2		0xa28
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_0		0xa30
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_1		0xa34
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_2		0xa38
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_0		0xa40
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_1		0xa44
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_2		0xa48
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_0		0xa50
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_1		0xa54
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_2		0xa58
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_0		0xa60
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_1		0xa64
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_2		0xa68
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_0		0xa70
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_1		0xa74
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_2		0xa78
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_0		0xb00
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_1		0xb04
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_2		0xb08
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_0		0xb10
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_1		0xb14
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_2		0xb18
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_0		0xb20
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_1		0xb24
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_2		0xb28
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_0		0xb30
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_1		0xb34
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_2		0xb38
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_0		0xb40
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_1		0xb44
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_2		0xb48
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_0		0xb50
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_1		0xb54
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_2		0xb58
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_0		0xb60
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_1		0xb64
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_2		0xb68
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_0		0xb70
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_1		0xb74
#define EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_2		0xb78
#define EMC_PMACRO_IB_VREF_DQ_0					0xbe0
#define EMC_PMACRO_IB_VREF_DQ_1					0xbe4
#define EMC_PMACRO_IB_VREF_DQS_0				0xbf0
#define EMC_PMACRO_IB_VREF_DQS_1				0xbf4
#define EMC_PMACRO_DDLL_LONG_CMD_0				0xc00
#define EMC_PMACRO_DDLL_LONG_CMD_1				0xc04
#define EMC_PMACRO_DDLL_LONG_CMD_2				0xc08
#define EMC_PMACRO_DDLL_LONG_CMD_3				0xc0c
#define EMC_PMACRO_DDLL_LONG_CMD_4				0xc10
#define EMC_PMACRO_DDLL_LONG_CMD_5				0xc14
#define EMC_PMACRO_DDLL_SHORT_CMD_0				0xc20
#define EMC_PMACRO_DDLL_SHORT_CMD_1				0xc24
#define EMC_PMACRO_DDLL_SHORT_CMD_2				0xc28
#define EMC_PMACRO_CFG_PM_GLOBAL_0				0xc30
#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE0		BIT(16)
#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE1		BIT(17)
#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE2		BIT(18)
#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE3		BIT(19)
#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE4		BIT(20)
#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE5		BIT(21)
#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE6		BIT(22)
#define EMC_PMACRO_CFG_PM_GLOBAL_0_DISABLE_CFG_BYTE7		BIT(23)
#define EMC_PMACRO_VTTGEN_CTRL_0				0xc34
#define EMC_PMACRO_VTTGEN_CTRL_1				0xc38
#define EMC_PMACRO_BG_BIAS_CTRL_0				0xc3c
#define EMC_PMACRO_BG_BIAS_CTRL_0_BG_E_PWRD			BIT(0)
#define EMC_PMACRO_BG_BIAS_CTRL_0_BGLP_E_PWRD			BIT(2)
#define EMC_PMACRO_PAD_CFG_CTRL					0xc40
#define EMC_PMACRO_ZCTRL					0xc44
#define EMC_PMACRO_CMD_PAD_RX_CTRL				0xc50
#define EMC_PMACRO_DATA_PAD_RX_CTRL				0xc54
#define EMC_PMACRO_CMD_RX_TERM_MODE				0xc58
#define EMC_PMACRO_DATA_RX_TERM_MODE				0xc5c
#define EMC_PMACRO_CMD_PAD_TX_CTRL				0xc60
#define EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQ_TX_E_DCC		BIT(1)
#define EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQSP_TX_E_DCC		BIT(9)
#define EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQSN_TX_E_DCC		BIT(16)
#define EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_CMD_TX_E_DCC		BIT(24)
#define EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQ_TX_DRVFORCEON		BIT(26)

#define EMC_PMACRO_DATA_PAD_TX_CTRL				0xc64
#define EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQ_E_IVREF		BIT(0)
#define EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQ_TX_E_DCC		BIT(1)
#define EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQS_E_IVREF		BIT(8)
#define EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQSP_TX_E_DCC		BIT(9)
#define EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQSN_TX_E_DCC		BIT(16)
#define EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_CMD_TX_E_DCC		BIT(24)

#define EMC_PMACRO_COMMON_PAD_TX_CTRL				0xc68
#define EMC_PMACRO_AUTOCAL_CFG_COMMON				0xc78
#define EMC_PMACRO_AUTOCAL_CFG_COMMON_E_CAL_BYPASS_DVFS		BIT(16)
#define EMC_PMACRO_VTTGEN_CTRL_2				0xcf0
#define EMC_PMACRO_IB_RXRT					0xcf4
#define EMC_PMACRO_TRAINING_CTRL_0				0xcf8
#define EMC_PMACRO_TRAINING_CTRL_0_CH0_TRAINING_E_WRPTR		BIT(3)
#define EMC_PMACRO_TRAINING_CTRL_1				0xcfc
#define EMC_PMACRO_TRAINING_CTRL_1_CH1_TRAINING_E_WRPTR		BIT(3)
#define EMC_TRAINING_CTRL					0xe04
#define EMC_TRAINING_QUSE_CORS_CTRL				0xe0c
#define EMC_TRAINING_QUSE_FINE_CTRL				0xe10
#define EMC_TRAINING_QUSE_CTRL_MISC				0xe14
#define EMC_TRAINING_WRITE_FINE_CTRL				0xe18
#define EMC_TRAINING_WRITE_CTRL_MISC				0xe1c
#define EMC_TRAINING_WRITE_VREF_CTRL				0xe20
#define EMC_TRAINING_READ_FINE_CTRL				0xe24
#define EMC_TRAINING_READ_CTRL_MISC				0xe28
#define EMC_TRAINING_READ_VREF_CTRL				0xe2c
#define EMC_TRAINING_CA_FINE_CTRL				0xe30
#define EMC_TRAINING_CA_CTRL_MISC				0xe34
#define EMC_TRAINING_CA_CTRL_MISC1				0xe38
#define EMC_TRAINING_CA_VREF_CTRL				0xe3c
#define EMC_TRAINING_SETTLE					0xe44
#define EMC_TRAINING_MPC					0xe5c
#define EMC_TRAINING_VREF_SETTLE				0xe6c
#define EMC_TRAINING_QUSE_VREF_CTRL				0xed0
#define EMC_TRAINING_OPT_DQS_IB_VREF_RANK0			0xed4
#define EMC_TRAINING_OPT_DQS_IB_VREF_RANK1			0xed8

#define EMC_COPY_TABLE_PARAM_PERIODIC_FIELDS			BIT(0)
#define EMC_COPY_TABLE_PARAM_TRIM_REGS				BIT(1)

enum burst_regs_list {
	EMC_RP_INDEX = 6,
	EMC_R2P_INDEX = 9,
	EMC_W2P_INDEX,
	EMC_MRW6_INDEX = 31,
	EMC_REFRESH_INDEX = 41,
	EMC_PRE_REFRESH_REQ_CNT_INDEX = 43,
	EMC_TRPAB_INDEX = 59,
	EMC_MRW7_INDEX = 62,
	EMC_FBIO_CFG5_INDEX = 65,
	EMC_FBIO_CFG7_INDEX,
	EMC_CFG_DIG_DLL_INDEX,
	EMC_ZCAL_INTERVAL_INDEX = 139,
	EMC_ZCAL_WAIT_CNT_INDEX,
	EMC_MRS_WAIT_CNT_INDEX = 141,
	EMC_DLL_CFG_0_INDEX = 144,
	EMC_PMACRO_AUTOCAL_CFG_COMMON_INDEX = 146,
	EMC_CFG_INDEX = 148,
	EMC_DYN_SELF_REF_CONTROL_INDEX = 150,
	EMC_PMACRO_CMD_PAD_TX_CTRL_INDEX = 161,
	EMC_PMACRO_DATA_PAD_TX_CTRL_INDEX,
	EMC_PMACRO_COMMON_PAD_TX_CTRL_INDEX,
	EMC_PMACRO_BRICK_CTRL_RFU1_INDEX = 167,
	EMC_PMACRO_BG_BIAS_CTRL_0_INDEX = 171,
	EMC_MRW14_INDEX = 199,
	EMC_MRW15_INDEX = 220,
};

enum trim_regs_list {
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0_INDEX = 60,
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1_INDEX,
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2_INDEX,
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3_INDEX,
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_4_INDEX,
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_5_INDEX,
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0_INDEX,
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1_INDEX,
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2_INDEX,
	EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3_INDEX,
};

enum burst_mc_regs_list {
	MC_EMEM_ARB_MISC0_INDEX = 20,
};

enum {
	T_RP,
	T_FC_LPDDR4,
	T_RFC,
	T_PDEX,
	RL,
};

enum {
	AUTO_PD = 0,
	MAN_SR  = 2,
};

enum {
	ASSEMBLY = 0,
	ACTIVE,
};

enum {
	C0D0U0,
	C0D0U1,
	C0D1U0,
	C0D1U1,
	C1D0U0,
	C1D0U1,
	C1D1U0,
	C1D1U1,
	DRAM_CLKTREE_NUM,
};

#define VREF_REGS_PER_CHANNEL_SIZE 4
#define DRAM_TIMINGS_NUM 5
#define BURST_REGS_PER_CHANNEL_SIZE 8
#define TRIM_REGS_PER_CHANNEL_SIZE 10
#define PTFV_ARRAY_SIZE 12
#define SAVE_RESTORE_MOD_REGS_SIZE 12
#define TRAINING_MOD_REGS_SIZE 20
#define BURST_UP_DOWN_REGS_SIZE 24
#define BURST_MC_REGS_SIZE 33
#define TRIM_REGS_SIZE 138
#define BURST_REGS_SIZE 221

struct tegra210_emc_per_channel_regs {
	u16 bank;
	u16 offset;
};

struct tegra210_emc_table_register_offsets {
	u16 burst[BURST_REGS_SIZE];
	u16 trim[TRIM_REGS_SIZE];
	u16 burst_mc[BURST_MC_REGS_SIZE];
	u16 la_scale[BURST_UP_DOWN_REGS_SIZE];
	struct tegra210_emc_per_channel_regs burst_per_channel[BURST_REGS_PER_CHANNEL_SIZE];
	struct tegra210_emc_per_channel_regs trim_per_channel[TRIM_REGS_PER_CHANNEL_SIZE];
	struct tegra210_emc_per_channel_regs vref_per_channel[VREF_REGS_PER_CHANNEL_SIZE];
};

struct tegra210_emc_timing {
	u32 revision;
	const char dvfs_ver[60];
	u32 rate;
	u32 min_volt;
	u32 gpu_min_volt;
	const char clock_src[32];
	u32 clk_src_emc;
	u32 needs_training;
	u32 training_pattern;
	u32 trained;

	u32 periodic_training;
	u32 trained_dram_clktree[DRAM_CLKTREE_NUM];
	u32 current_dram_clktree[DRAM_CLKTREE_NUM];
	u32 run_clocks;
	u32 tree_margin;

	u32 num_burst;
	u32 num_burst_per_ch;
	u32 num_trim;
	u32 num_trim_per_ch;
	u32 num_mc_regs;
	u32 num_up_down;
	u32 vref_num;
	u32 training_mod_num;
	u32 dram_timing_num;

	u32 ptfv_list[PTFV_ARRAY_SIZE];

	u32 burst_regs[BURST_REGS_SIZE];
	u32 burst_reg_per_ch[BURST_REGS_PER_CHANNEL_SIZE];
	u32 shadow_regs_ca_train[BURST_REGS_SIZE];
	u32 shadow_regs_quse_train[BURST_REGS_SIZE];
	u32 shadow_regs_rdwr_train[BURST_REGS_SIZE];

	u32 trim_regs[TRIM_REGS_SIZE];
	u32 trim_perch_regs[TRIM_REGS_PER_CHANNEL_SIZE];

	u32 vref_perch_regs[VREF_REGS_PER_CHANNEL_SIZE];

	u32 dram_timings[DRAM_TIMINGS_NUM];
	u32 training_mod_regs[TRAINING_MOD_REGS_SIZE];
	u32 save_restore_mod_regs[SAVE_RESTORE_MOD_REGS_SIZE];
	u32 burst_mc_regs[BURST_MC_REGS_SIZE];
	u32 la_scale_regs[BURST_UP_DOWN_REGS_SIZE];

	u32 min_mrs_wait;
	u32 emc_mrw;
	u32 emc_mrw2;
	u32 emc_mrw3;
	u32 emc_mrw4;
	u32 emc_mrw9;
	u32 emc_mrs;
	u32 emc_emrs;
	u32 emc_emrs2;
	u32 emc_auto_cal_config;
	u32 emc_auto_cal_config2;
	u32 emc_auto_cal_config3;
	u32 emc_auto_cal_config4;
	u32 emc_auto_cal_config5;
	u32 emc_auto_cal_config6;
	u32 emc_auto_cal_config7;
	u32 emc_auto_cal_config8;
	u32 emc_cfg_2;
	u32 emc_sel_dpd_ctrl;
	u32 emc_fdpd_ctrl_cmd_no_ramp;
	u32 dll_clk_src;
	u32 clk_out_enb_x_0_clk_enb_emc_dll;
	u32 latency;
};

enum tegra210_emc_refresh {
	TEGRA210_EMC_REFRESH_NOMINAL = 0,
	TEGRA210_EMC_REFRESH_2X,
	TEGRA210_EMC_REFRESH_4X,
	TEGRA210_EMC_REFRESH_THROTTLE, /* 4x Refresh + derating. */
};

#define DRAM_TYPE_DDR3		0
#define DRAM_TYPE_LPDDR4	1
#define DRAM_TYPE_LPDDR2	2
#define DRAM_TYPE_DDR2		3

struct tegra210_emc {
	struct tegra_mc *mc;
	struct device *dev;
	struct clk *clk;

	/* nominal EMC frequency table */
	struct tegra210_emc_timing *nominal;
	/* derated EMC frequency table */
	struct tegra210_emc_timing *derated;

	/* currently selected table (nominal or derated) */
	struct tegra210_emc_timing *timings;
	unsigned int num_timings;

	const struct tegra210_emc_table_register_offsets *offsets;

	const struct tegra210_emc_sequence *sequence;
	spinlock_t lock;

	void __iomem *regs, *channel[2];
	unsigned int num_channels;
	unsigned int num_devices;
	unsigned int dram_type;

	struct tegra210_emc_timing *last;
	struct tegra210_emc_timing *next;

	unsigned int training_interval;
	struct timer_list training;

	enum tegra210_emc_refresh refresh;
	unsigned int refresh_poll_interval;
	struct timer_list refresh_timer;
	unsigned int temperature;
	atomic_t refresh_poll;

	ktime_t clkchange_time;
	int clkchange_delay;

	unsigned long resume_rate;

	struct {
		struct dentry *root;
		unsigned long min_rate;
		unsigned long max_rate;
		unsigned int temperature;
	} debugfs;

	struct tegra210_clk_emc_provider provider;
};

struct tegra210_emc_sequence {
	u8 revision;
	void (*set_clock)(struct tegra210_emc *emc, u32 clksrc);
	u32 (*periodic_compensation)(struct tegra210_emc *emc);
};

static inline void emc_writel(struct tegra210_emc *emc, u32 value,
			      unsigned int offset)
{
	writel_relaxed(value, emc->regs + offset);
}

static inline u32 emc_readl(struct tegra210_emc *emc, unsigned int offset)
{
	return readl_relaxed(emc->regs + offset);
}

static inline void emc_channel_writel(struct tegra210_emc *emc,
				      unsigned int channel,
				      u32 value, unsigned int offset)
{
	writel_relaxed(value, emc->channel[channel] + offset);
}

static inline u32 emc_channel_readl(struct tegra210_emc *emc,
				    unsigned int channel, unsigned int offset)
{
	return readl_relaxed(emc->channel[channel] + offset);
}

static inline void ccfifo_writel(struct tegra210_emc *emc, u32 value,
				 unsigned int offset, u32 delay)
{
	writel_relaxed(value, emc->regs + EMC_CCFIFO_DATA);

	value = EMC_CCFIFO_ADDR_STALL_BY_1 | EMC_CCFIFO_ADDR_STALL(delay) |
		EMC_CCFIFO_ADDR_OFFSET(offset);
	writel_relaxed(value, emc->regs + EMC_CCFIFO_ADDR);
}

static inline u32 div_o3(u32 a, u32 b)
{
	u32 result = a / b;

	if ((b * result) < a)
		return result + 1;

	return result;
}

/* from tegra210-emc-r21021.c */
extern const struct tegra210_emc_sequence tegra210_emc_r21021;

int tegra210_emc_set_refresh(struct tegra210_emc *emc,
			     enum tegra210_emc_refresh refresh);
u32 tegra210_emc_mrr_read(struct tegra210_emc *emc, unsigned int chip,
			  unsigned int address);
void tegra210_emc_do_clock_change(struct tegra210_emc *emc, u32 clksrc);
void tegra210_emc_set_shadow_bypass(struct tegra210_emc *emc, int set);
void tegra210_emc_timing_update(struct tegra210_emc *emc);
u32 tegra210_emc_get_dll_state(struct tegra210_emc_timing *next);
struct tegra210_emc_timing *tegra210_emc_find_timing(struct tegra210_emc *emc,
						     unsigned long rate);
void tegra210_emc_adjust_timing(struct tegra210_emc *emc,
				struct tegra210_emc_timing *timing);
int tegra210_emc_wait_for_update(struct tegra210_emc *emc, unsigned int channel,
				 unsigned int offset, u32 bit_mask, bool state);
unsigned long tegra210_emc_actual_osc_clocks(u32 in);
u32 tegra210_emc_compensate(struct tegra210_emc_timing *next, u32 offset);
void tegra210_emc_dll_disable(struct tegra210_emc *emc);
void tegra210_emc_dll_enable(struct tegra210_emc *emc);
u32 tegra210_emc_dll_prelock(struct tegra210_emc *emc, u32 clksrc);
u32 tegra210_emc_dvfs_power_ramp_down(struct tegra210_emc *emc, u32 clk,
				      bool flip_backward);
u32 tegra210_emc_dvfs_power_ramp_up(struct tegra210_emc *emc, u32 clk,
				    bool flip_backward);
void tegra210_emc_reset_dram_clktree_values(struct tegra210_emc_timing *timing);
void tegra210_emc_start_periodic_compensation(struct tegra210_emc *emc);

#endif