/*******************************************************************************
 * Copyright (c) 2015-2022 Renesas Electronics Corporation. All rights reserved.
 *
 *     RENESAS ELECTRONICS CONFIDENTIAL AND PROPRIETARY
 *
 * This software is provided as reference/sample code under the license
 * agreement between Renesas Electronics Corporation and licensee (the
 * "License Agreement") and shall be treated as specified in the License
 * Agreement.
 * These instructions, statements, and software are the confidential
 * information of Renesas Electronics Corporation. They must be used and
 * modified solely for the purpose for which it was furnished by Renesas
 * Electronics Corporation. All or part of these instructions, statements and
 * software must not be reproduced nor disclosed to any third party in any
 * form, unless permitted by the License Agreement.
 *
 * THIS SOFTWARE IS PROVIDED BY RENESAS ELEOCTRONICS CORPORATION "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
 * SATISFACTORY QUALITY, ACCURACY, TITLE AND NON-INFRINGEMENT ARE DISCLAIMED.
 * IN NO EVENT SHALL RENESAS ELECTRONICS CORPORATION BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 ******************************************************************************/

#if defined(__RH850G3K__)
#include "remap_register.h"
#endif

#define RCAR_DDR_VERSION			"rev.0.08rc7"
#define DRAM_CH_CNT				0x04
#define SLICE_CNT				0x02
#define CS_CNT					0x02

/* for pll setting */
#define CLK_DIV(a, diva, b, divb)		(((a) * (divb)) / ((b) * (diva)))
#define CLK_MUL(a, diva, b, divb)		(((a) * (b)) / ((diva) * (divb)))

/* for ddr density setting */
#define DBMEMCONF_REG(d3, row, BG, bank, col, dw)	(((d3) << 30) | ((row) << 24) | ((BG) << 20) | ((bank) << 16) | ((col) << 8) | (dw))
#define DBMEMCONF_REGD(density)			(DBMEMCONF_REG((density) % 2, ((density) + 1) / 2 + (28 - 2 - 2 - 10 - 1), 2, 2, 10, 1))	/* 16bit */
#define DBMEMCONF_VAL(ch,cs)			(DBMEMCONF_REGD(DBMEMCONF_DENS(ch, cs)))

/* system registers : CPG */
#define CPG_FRQCRD_KICK_BIT	(1U << 31)
#define CPG_PLL3CR0_KICK_BIT	(1U << 31)

#define CPG_PLLECR_PLL3E_BIT	(1U << 3)
#define CPG_PLLECR_PLL3ST_BIT	(1U << 11)

#if defined(__RH850G3K__)
#define CPG_BASE		(BASE_CPG_ADDR)
#else
#define CPG_BASE		(0xE6150000U)
#endif
#define CPG_CPGWPR		(CPG_BASE + 0x0000U)
#define CPG_CPGWPCR		(CPG_BASE + 0x0004U)
#define CPG_FRQCRA		(CPG_BASE + 0x0800U)
#define CPG_FRQCRB		(CPG_BASE + 0x0804U)
#define CPG_FRQCRC		(CPG_BASE + 0x0808U)
#define CPG_FRQCRD0		(CPG_BASE + 0x080CU)
#define CPG_PLLECR		(CPG_BASE + 0x0820U)
#define CPG_PLL3CR0		(CPG_BASE + 0x083CU)
#define CPG_PLL3CR1		(CPG_BASE + 0x08C0U)
#define CPG_FSRCHKCLRR4	(CPG_BASE + 0x0590U)
#define CPG_FSRCHKSETR4	(CPG_BASE + 0x0510U)
#define CPG_FSRCHKRA4	(CPG_BASE + 0x0410U)
#define CPG_SRCR4		(CPG_BASE + 0x2C10U)
#define CPG_SRSTCLR4	(CPG_BASE + 0x2C90U)

#define CPG_PLL3FBCKMCSR	(CPG_BASE + 0x0C60U)
#define CPG_PLL3FBCKMECR	(CPG_BASE + 0x0C64U)
#define CPG_PLL3FBCKMLCH	(CPG_BASE + 0x0C68U)
#define CPG_PLL3FBCKMLCL	(CPG_BASE + 0x0C6CU)
#define CPG_PLL3FBCKMCNT	(CPG_BASE + 0x0C70U)
#define CPG_PLL3FBCKMCNTE	(CPG_BASE + 0x0C74U)

#if defined(__RH850G3K__)
#define RST_BASE		(BASE_RESET_ADDR)
#else
#define RST_BASE		(0xE6160000U)
#endif
#define RST_MODEMR0		(RST_BASE + 0x0000U)
#define RST_MODEMR1		(RST_BASE + 0x0004U)

/* Product Register */
#define PRR			(0xFFF00044U)
#define PRR_PRODUCT_MASK	(0x00007F00U)
#define PRR_CUT_MASK		(0x000000FFU)

#define PRR_PRODUCT_V4H		(0x00005C00U)		/* R-Car V4H */

#define PRR_PRODUCT_10		(0x00000000U)		/*   ver 1.0 */
#define PRR_PRODUCT_20		(0x00000010U)		/*   ver 2.0 */

/* DBSC registers */
#if defined(__RH850G3K__)
#define DBSC_D_BASE			(BASE_DBSC_ADDR + 0x14000U)	/* forV4H DBSC0 clk_dbsc region	DBSC1_D_BASE = 0xE67A8000U */
#define DBSC_A_BASE			(BASE_DBSC_ADDR)	        /* forV4H DBSC0 clk_axim region	DBSC1_A_BASE = 0xE6798000U */
#else
#define DBSC_D_BASE			(0xE67A4000U)	/* forV4H DBSC0 clk_dbsc region	DBSC1_D_BASE = 0xE67A8000U */
#define DBSC_A_BASE			(0xE6790000U)	/* forV4H DBSC0 clk_axim region	DBSC1_A_BASE = 0xE6798000U */
#endif

#define	DBSC_DBSYSCONF0		(DBSC_A_BASE	+	0x0000U)
#define	DBSC_DBSYSCONF1		(DBSC_D_BASE	+	0x0000U)
#define	DBSC_DBSYSCONF1A	(DBSC_A_BASE	+	0x0004U)
#define	DBSC_DBSYSCONF2		(DBSC_D_BASE	+	0x0004U)
#define	DBSC_DBPHYCONF0		(DBSC_D_BASE	+	0x0008U)
#define	DBSC_DBSYSCONF2A	(DBSC_A_BASE	+	0x0008U)
#define	DBSC_DBMEMKIND		(DBSC_D_BASE	+	0x0020U)
#define	DBSC_DBMEMKINDA		(DBSC_A_BASE	+	0x0020U)

#define	DBSC_DBMEMCONF(ch,cs)	(DBSC_D_BASE	+	0x0030U + 0x10U * (ch) + 0x04U * (cs))
#define	DBSC_DBMEMCONF_0_0	(DBSC_D_BASE	+	0x0030U)
#define	DBSC_DBMEMCONF_0_1	(DBSC_D_BASE	+	0x0034U)
#define	DBSC_DBMEMCONF_0_2	(DBSC_D_BASE	+	0x0038U)
#define	DBSC_DBMEMCONF_0_3	(DBSC_D_BASE	+	0x003CU)
#define	DBSC_DBMEMCONF_1_0	(DBSC_D_BASE	+	0x0040U)
#define	DBSC_DBMEMCONF_1_1	(DBSC_D_BASE	+	0x0044U)
#define	DBSC_DBMEMCONF_1_2	(DBSC_D_BASE	+	0x0048U)
#define	DBSC_DBMEMCONF_1_3	(DBSC_D_BASE	+	0x004CU)
#define	DBSC_DBMEMCONF_2_0	(DBSC_D_BASE	+	0x0050U)
#define	DBSC_DBMEMCONF_2_1	(DBSC_D_BASE	+	0x0054U)
#define	DBSC_DBMEMCONF_2_2	(DBSC_D_BASE	+	0x0058U)
#define	DBSC_DBMEMCONF_2_3	(DBSC_D_BASE	+	0x005CU)
#define	DBSC_DBMEMCONF_3_0	(DBSC_D_BASE	+	0x0060U)
#define	DBSC_DBMEMCONF_3_1	(DBSC_D_BASE	+	0x0064U)
#define	DBSC_DBMEMCONF_3_2	(DBSC_D_BASE	+	0x0068U)
#define	DBSC_DBMEMCONF_3_3	(DBSC_D_BASE	+	0x006CU)

#define	DBSC_DBMEMCONFA(ch,cs)	(DBSC_A_BASE	+	0x0030U + 0x10U * (ch) + 0x04U * (cs))
#define	DBSC_DBMEMCONF_0_0A	(DBSC_A_BASE	+	0x0030U)
#define	DBSC_DBMEMCONF_0_1A	(DBSC_A_BASE	+	0x0034U)
#define	DBSC_DBMEMCONF_0_2A	(DBSC_A_BASE	+	0x0038U)
#define	DBSC_DBMEMCONF_0_3A	(DBSC_A_BASE	+	0x003CU)
#define	DBSC_DBMEMCONF_1_0A	(DBSC_A_BASE	+	0x0040U)
#define	DBSC_DBMEMCONF_1_1A	(DBSC_A_BASE	+	0x0044U)
#define	DBSC_DBMEMCONF_1_2A	(DBSC_A_BASE	+	0x0048U)
#define	DBSC_DBMEMCONF_1_3A	(DBSC_A_BASE	+	0x004CU)
#define	DBSC_DBMEMCONF_2_0A	(DBSC_A_BASE	+	0x0050U)
#define	DBSC_DBMEMCONF_2_1A	(DBSC_A_BASE	+	0x0054U)
#define	DBSC_DBMEMCONF_2_2A	(DBSC_A_BASE	+	0x0058U)
#define	DBSC_DBMEMCONF_2_3A	(DBSC_A_BASE	+	0x005CU)
#define	DBSC_DBMEMCONF_3_0A	(DBSC_A_BASE	+	0x0060U)
#define	DBSC_DBMEMCONF_3_1A	(DBSC_A_BASE	+	0x0064U)
#define	DBSC_DBMEMCONF_3_2A	(DBSC_A_BASE	+	0x0068U)
#define	DBSC_DBMEMCONF_3_3A	(DBSC_A_BASE	+	0x006CU)

#define	DBSC_DBSYSCNT0		(DBSC_D_BASE	+	0x0100U)
#define	DBSC_DBSYSCNT0A		(DBSC_A_BASE	+	0x0100U)

#define	DBSC_DBACEN			(DBSC_A_BASE	+	0x0200U)
#define	DBSC_DBRFEN			(DBSC_D_BASE	+	0x0204U)
#define	DBSC_DBCMD			(DBSC_D_BASE	+	0x0208U)
#define	DBSC_DBWAIT			(DBSC_D_BASE	+	0x0210U)

#define	DBSC_DBTR(x)		(DBSC_D_BASE	+	0x0300U	+	0x04U * (x))
#define	DBSC_DBTR0			(DBSC_D_BASE	+	0x0300U)
#define	DBSC_DBTR1			(DBSC_D_BASE	+	0x0304U)
#define	DBSC_DBTR2			(DBSC_D_BASE	+	0x0308U)
#define	DBSC_DBTR3			(DBSC_D_BASE	+	0x030CU)
#define	DBSC_DBTR4			(DBSC_D_BASE	+	0x0310U)
#define	DBSC_DBTR5			(DBSC_D_BASE	+	0x0314U)
#define	DBSC_DBTR6			(DBSC_D_BASE	+	0x0318U)
#define	DBSC_DBTR7			(DBSC_D_BASE	+	0x031CU)
#define	DBSC_DBTR8			(DBSC_D_BASE	+	0x0320U)
#define	DBSC_DBTR9			(DBSC_D_BASE	+	0x0324U)
#define	DBSC_DBTR10			(DBSC_D_BASE	+	0x0328U)
#define	DBSC_DBTR11			(DBSC_D_BASE	+	0x032CU)
#define	DBSC_DBTR12			(DBSC_D_BASE	+	0x0330U)
#define	DBSC_DBTR13			(DBSC_D_BASE	+	0x0334U)
#define	DBSC_DBTR14			(DBSC_D_BASE	+	0x0338U)
#define	DBSC_DBTR15			(DBSC_D_BASE	+	0x033CU)
#define	DBSC_DBTR16			(DBSC_D_BASE	+	0x0340U)
#define	DBSC_DBTR17			(DBSC_D_BASE	+	0x0344U)
#define	DBSC_DBTR18			(DBSC_D_BASE	+	0x0348U)
#define	DBSC_DBTR19			(DBSC_D_BASE	+	0x034CU)
#define	DBSC_DBTR20			(DBSC_D_BASE	+	0x0350U)
#define	DBSC_DBTR21			(DBSC_D_BASE	+	0x0354U)
#define	DBSC_DBTR22			(DBSC_D_BASE	+	0x0358U)
#define	DBSC_DBTR23			(DBSC_D_BASE	+	0x035CU)
#define	DBSC_DBTR24			(DBSC_D_BASE	+	0x0360U)
#define	DBSC_DBTR25			(DBSC_D_BASE	+	0x0364U)
#define	DBSC_DBTR26			(DBSC_D_BASE	+	0x0368U)
#define	DBSC_DBTR27			(DBSC_D_BASE	+	0x036CU)
#define	DBSC_DBTR28			(DBSC_D_BASE	+	0x0370U)
#define	DBSC_DBTR29			(DBSC_D_BASE	+	0x0374U)
#define	DBSC_DBTR30			(DBSC_D_BASE	+	0x0378U)
#define	DBSC_DBTR31			(DBSC_D_BASE	+	0x037CU)
#define	DBSC_DBTR32			(DBSC_D_BASE	+	0x0380U)
#define	DBSC_DBTR33			(DBSC_D_BASE	+	0x0384U)
#define	DBSC_DBTR34			(DBSC_D_BASE	+	0x0388U)
#define	DBSC_DBTR35			(DBSC_D_BASE	+	0x038CU)
#define	DBSC_DBTR36			(DBSC_D_BASE	+	0x0390U)
#define	DBSC_DBTR37			(DBSC_D_BASE	+	0x0394U)

#define	DBSC_DBBL			(DBSC_D_BASE	+	0x0400U)
#define	DBSC_DBBLA			(DBSC_A_BASE	+	0x0400U)

#define	DBSC_DBRFCNF1		(DBSC_D_BASE	+	0x0414U)
#define	DBSC_DBRFCNF2		(DBSC_D_BASE	+	0x0418U)

#define	DBSC_DBCALCNF		(DBSC_D_BASE	+	0x0424U)

#define	DBSC_DBRNK(x)		(DBSC_D_BASE	+	0x0430U	+	 0x04U * (x))
#define	DBSC_DBRNK2			(DBSC_D_BASE	+	0x0438U)
#define	DBSC_DBRNK3			(DBSC_D_BASE	+	0x043CU)
#define	DBSC_DBRNK4			(DBSC_D_BASE	+	0x0440U)
#define	DBSC_DBRNK5			(DBSC_D_BASE	+	0x0444U)

#define	DBSC_DBDBICNT		(DBSC_D_BASE	+	0x0518U)
#define	DBSC_DBDFIPMSTRCNF	(DBSC_D_BASE	+	0x0520U)
#define	DBSC_DBDFICUPDCNF	(DBSC_D_BASE	+	0x0540U)

#define	DBSC_DBDFISTAT(ch)	(DBSC_D_BASE	+	0x0600U	+	0x2000U * (ch & 0x02U) + 0x40U * (ch & 0x01U))
#define	DBSC_DBDFISTAT_0	(DBSC_D_BASE	+	0x0600U)
#define	DBSC_DBDFISTAT_1	(DBSC_D_BASE	+	0x0640U)
#define	DBSC_DBDFISTAT_2	(DBSC_D_BASE	+	0x0680U)
#define	DBSC_DBDFISTAT_3	(DBSC_D_BASE	+	0x06C0U)

#define	DBSC_DBDFICNT(ch)	(DBSC_D_BASE	+	0x0604U	+	0x2000U * (ch & 0x02U) + 0x40U * (ch & 0x01U))
#define	DBSC_DBDFICNT_0		(DBSC_D_BASE	+	0x0604U)
#define	DBSC_DBDFICNT_1		(DBSC_D_BASE	+	0x0644U)
#define	DBSC_DBDFICNT_2		(DBSC_D_BASE	+	0x0684U)
#define	DBSC_DBDFICNT_3		(DBSC_D_BASE	+	0x06C4U)

#define	DBSC_DBPDCNT0_0		(DBSC_D_BASE	+	0x0610U)
#define	DBSC_DBPDCNT0_1		(DBSC_D_BASE	+	0x0614U)
#define	DBSC_DBPDCNT0_2		(DBSC_D_BASE	+	0x0618U)
#define	DBSC_DBPDCNT0_3		(DBSC_D_BASE	+	0x061CU)

#define	DBSC_DBPDCNT1_0		(DBSC_D_BASE	+	0x0650U)
#define	DBSC_DBPDCNT1_1		(DBSC_D_BASE	+	0x0654U)
#define	DBSC_DBPDCNT1_2		(DBSC_D_BASE	+	0x0658U)
#define	DBSC_DBPDCNT1_3		(DBSC_D_BASE	+	0x065CU)

#define	DBSC_DBPDCNT2(ch)	(DBSC_D_BASE	+	0x0618U	+	0x2000U * (ch & 0x02U) + 0x40U * (ch & 0x01U))
#define	DBSC_DBPDCNT2_0		(DBSC_D_BASE	+	0x0690U)
#define	DBSC_DBPDCNT2_1		(DBSC_D_BASE	+	0x0694U)
#define	DBSC_DBPDCNT2_2		(DBSC_D_BASE	+	0x0698U)
#define	DBSC_DBPDCNT2_3		(DBSC_D_BASE	+	0x069CU)

#define	DBSC_DBPDCNT3_0		(DBSC_D_BASE	+	0x06D0U)
#define	DBSC_DBPDCNT3_1		(DBSC_D_BASE	+	0x06D4U)
#define	DBSC_DBPDCNT3_2		(DBSC_D_BASE	+	0x06D8U)
#define	DBSC_DBPDCNT3_3		(DBSC_D_BASE	+	0x06DCU)

#define	DBSC_DBPDLK(ch)		(DBSC_D_BASE	+	0x0620U	+	0x2000U * (ch & 0x02U) + 0x40U * (ch & 0x01U))
#define	DBSC_DBPDLK_0		(DBSC_D_BASE	+	0x0620U)
#define	DBSC_DBPDLK_1		(DBSC_D_BASE	+	0x0660U)
#define	DBSC_DBPDLK_2		(DBSC_D_BASE	+	0x06a0U)
#define	DBSC_DBPDLK_3		(DBSC_D_BASE	+	0x06e0U)

#define	DBSC_DBPDRGA(ch)	(DBSC_D_BASE	+	0x0624U + 0x2000U * (ch & 0x02U) + 0x40U * (ch & 0x01U))
#define	DBSC_DBPDRGA_0		(DBSC_D_BASE	+	0x0624U)
#define	DBSC_DBPDRGA_1		(DBSC_D_BASE	+	0x0664U)
#define	DBSC_DBPDRGA_2		(DBSC_D_BASE	+	0x06A4U)
#define	DBSC_DBPDRGA_3		(DBSC_D_BASE	+	0x06E4U)

#define	DBSC_DBPDRGD(ch)	(DBSC_D_BASE	+	0x0628U + 0x2000U * (ch & 0x02U) + 0x40U * (ch & 0x01U))
#define	DBSC_DBPDRGD_0		(DBSC_D_BASE	+	0x0628U)
#define	DBSC_DBPDRGD_1		(DBSC_D_BASE	+	0x0668U)
#define	DBSC_DBPDRGD_2		(DBSC_D_BASE	+	0x06A8U)
#define	DBSC_DBPDRGD_3		(DBSC_D_BASE	+	0x06E8U)

#define	DBSC_DBPDSTAT0(ch)	(DBSC_D_BASE	+	0x0630U	 + 0x2000U * (ch & 0x02U) + 0x40U * (ch & 0x01U))
#define	DBSC_DBPDSTAT0_0	(DBSC_D_BASE	+	0x0630U)
#define	DBSC_DBPDSTAT1_0	(DBSC_D_BASE	+	0x0670U)

#define	DBSC_DBPDSTAT1(ch)	(DBSC_D_BASE	+	0x0634U	+ 0x2000U * (ch & 0x02U) + 0x40U * (ch & 0x01U))
#define	DBSC_DBPDSTAT0_1	(DBSC_D_BASE	+	0x0634U)
#define	DBSC_DBPDSTA1T_1	(DBSC_D_BASE	+	0x0674U)

#define	DBSC_DBCAM0CTRL0	(DBSC_A_BASE	+	0x0940U)

#define	DBSC_DBCAMSTAT0(x)	(DBSC_A_BASE	+	0x0980U	+ 0x4000U *(x & 0x02U) + 0x10U * (x & 0x01U))
#define	DBSC_DBCAM0STAT0	(DBSC_A_BASE	+	0x0980U)
#define	DBSC_DBCAM1STAT0	(DBSC_A_BASE	+	0x0990U)
#define	DBSC_DBCAM2STAT0	(DBSC_A_BASE	+	0x09A0U)
#define	DBSC_DBCAM3STAT0	(DBSC_A_BASE	+	0x09B0U)

#define	DBSC_DBCAMSTAT1(x)	(DBSC_A_BASE	+	0x0984U	+ 0x4000U *(x & 0x02U) + 0x10U * (x & 0x01U))
#define	DBSC_DBCAM0STAT1	(DBSC_A_BASE	+	0x0984U)
#define	DBSC_DBCAM1STAT1	(DBSC_A_BASE	+	0x0994U)
#define	DBSC_DBCAM2STAT1	(DBSC_A_BASE	+	0x09A4U)
#define	DBSC_DBCAM3STAT1	(DBSC_A_BASE	+	0x09B4U)

#define	DBSC_DBBCAMDIS		(DBSC_A_BASE	+	0x09FCU)

#define	DBSC_DBSCHRW1		(DBSC_A_BASE	+	0x1024U)

#define	DBSC_DBSCHTR0		(DBSC_A_BASE	+	0x1030U)

#define	DBSC_DBSCHFCTST01(x)	(DBSC_A_BASE	+	0x1040U + 0x04U * (x))
#define	DBSC_DBSCHFCTST0		(DBSC_A_BASE	+	0x1040U)
#define	DBSC_DBSCHFCTST1		(DBSC_A_BASE	+	0x1044U)

#define	DBSC_DBSCHQOS(x,y)	(DBSC_A_BASE	+	0x1100U	+	0x10U * (x)	+	0x04U * (y))
