/*******************************************************************************
 * Copyright (c) 2021-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.30rc7"
#define DRAM_CH_CNT				0x02
#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, bank, col, dw)	(((d3) << 30) | ((row) << 24) | ((bank) << 16) | ((col) << 8) | (dw))
#define DBMEMCONF_REGD(density)			(DBMEMCONF_REG((density) % 2, ((density) + 1) / 2 + (28 - 3 - 10 - 1), 3, 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_PLL3CR_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_FRQCRD		(CPG_BASE + 0x080CU)
#define CPG_PLLECR		(CPG_BASE + 0x0820U)
#define CPG_PLL3CR0		(CPG_BASE + 0x083CU)
#define CPG_PLL3CR1		(CPG_BASE + 0x08C0U)
#define CPG_Z0CKKSCR		(CPG_BASE + 0x08A8U)
#define CPG_Z1CKKSCR		(CPG_BASE + 0x08ACU)
#define CPG_SRST4		(CPG_BASE + 0x2C10U)
#define CPG_SRSTCLR4		(CPG_BASE + 0x2C90U)
#define CPG_FSRCHKRA4	(CPG_BASE + 0x0410U)
#define CPG_FSRCHKSETR4	(CPG_BASE + 0x0510U)
#define CPG_FSRCHKCLRR4	(CPG_BASE + 0x0590U)

#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_S4		(0x00005A00U)		/* R-Car S4  */

#define PRR_PRODUCT_10		(0x00000000U)		/*   ver 1.0 */
#define PRR_PRODUCT_11		(0x00000001U)		/*   ver 1.1 */
#define PRR_PRODUCT_12		(0x00000002U)		/*   ver 1.2 */

/* DBSC registers */
#if defined(__RH850G3K__)
#define DBSC_BASE		(BASE_DBSC_ADDR)
#else
#define DBSC_BASE		(0xE6790000U)
#endif
#define DBSC_DBSYSCONF0		(DBSC_BASE + 0x0000U)
#define DBSC_DBSYSCONF1		(DBSC_BASE + 0x0004U)
#define DBSC_DBSYSCONF1A	(DBSC_BASE + 0x0008U)
#define DBSC_DBSYSCONF2		(DBSC_BASE + 0x000CU)
#define DBSC_DBPHYCONF0		(DBSC_BASE + 0x0010U)
#define DBSC_DBSYSCONF2A	(DBSC_BASE + 0x0014U)
#define DBSC_DBKIND		(DBSC_BASE + 0x0020U)
#define DBSC_DBKINDA		(DBSC_BASE + 0x0024U)

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

#define DBSC_DBMEMCONFA(ch, cs)	(DBSC_BASE + 0x0070U + 0x2000U * (ch & 0x04U) + 0x10U * (ch & 0x03U) + 0x04U * cs)
#define DBSC_DBMEMCONF_0_0A	(DBSC_BASE + 0x0070U)
#define DBSC_DBMEMCONF_0_1A	(DBSC_BASE + 0x0074U)
#define DBSC_DBMEMCONF_0_2A	(DBSC_BASE + 0x0078U)
#define DBSC_DBMEMCONF_0_3A	(DBSC_BASE + 0x007CU)
#define DBSC_DBMEMCONF_1_0A	(DBSC_BASE + 0x0080U)
#define DBSC_DBMEMCONF_1_1A	(DBSC_BASE + 0x0084U)
#define DBSC_DBMEMCONF_1_2A	(DBSC_BASE + 0x0088U)
#define DBSC_DBMEMCONF_1_3A	(DBSC_BASE + 0x008CU)
#define DBSC_DBMEMCONF_2_0A	(DBSC_BASE + 0x0090U)
#define DBSC_DBMEMCONF_2_1A	(DBSC_BASE + 0x0094U)
#define DBSC_DBMEMCONF_2_2A	(DBSC_BASE + 0x0098U)
#define DBSC_DBMEMCONF_2_3A	(DBSC_BASE + 0x009CU)
#define DBSC_DBMEMCONF_3_0A	(DBSC_BASE + 0x00A0U)
#define DBSC_DBMEMCONF_3_1A	(DBSC_BASE + 0x00A4U)
#define DBSC_DBMEMCONF_3_2A	(DBSC_BASE + 0x00A8U)
#define DBSC_DBMEMCONF_3_3A	(DBSC_BASE + 0x00ACU)

#define DBSC_DBSYSCNT0		(DBSC_BASE + 0x0100U)
#define DBSC_DBSYSCNT0A		(DBSC_BASE + 0x0108U)

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

#define DBSC_DBTR(x)		(DBSC_BASE + 0x0300U + 0x04U * (x))
#define DBSC_DBTR0		(DBSC_BASE + 0x0300U)
#define DBSC_DBTR1		(DBSC_BASE + 0x0304U)
#define DBSC_DBTR3		(DBSC_BASE + 0x030CU)
#define DBSC_DBTR4		(DBSC_BASE + 0x0310U)
#define DBSC_DBTR5		(DBSC_BASE + 0x0314U)
#define DBSC_DBTR6		(DBSC_BASE + 0x0318U)
#define DBSC_DBTR7		(DBSC_BASE + 0x031CU)
#define DBSC_DBTR8		(DBSC_BASE + 0x0320U)
#define DBSC_DBTR9		(DBSC_BASE + 0x0324U)
#define DBSC_DBTR10		(DBSC_BASE + 0x0328U)
#define DBSC_DBTR11		(DBSC_BASE + 0x032CU)
#define DBSC_DBTR12		(DBSC_BASE + 0x0330U)
#define DBSC_DBTR13		(DBSC_BASE + 0x0334U)
#define DBSC_DBTR14		(DBSC_BASE + 0x0338U)
#define DBSC_DBTR15		(DBSC_BASE + 0x033CU)
#define DBSC_DBTR16		(DBSC_BASE + 0x0340U)
#define DBSC_DBTR17		(DBSC_BASE + 0x0344U)
#define DBSC_DBTR18		(DBSC_BASE + 0x0348U)
#define DBSC_DBTR19		(DBSC_BASE + 0x034CU)
#define DBSC_DBTR20		(DBSC_BASE + 0x0350U)
#define DBSC_DBTR21		(DBSC_BASE + 0x0354U)
#define DBSC_DBTR22		(DBSC_BASE + 0x0358U)
#define DBSC_DBTR23		(DBSC_BASE + 0x035CU)
#define DBSC_DBTR24		(DBSC_BASE + 0x0360U)
#define DBSC_DBTR25		(DBSC_BASE + 0x0364U)
#define DBSC_DBTR26		(DBSC_BASE + 0x0368U)

#define DBSC_DBBL		(DBSC_BASE + 0x0400U)
#define DBSC_DBBLA		(DBSC_BASE + 0x0404U)

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

#define DBSC_DBCALCNF		(DBSC_BASE + 0x0424U)

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

#define DBSC_DBDBICNT		(DBSC_BASE + 0x0518U)
#define DBSC_DBDFIPMSTRCNF	(DBSC_BASE + 0x0520U)
#define DBSC_DBDFICUPDCNF	(DBSC_BASE + 0x052CU)

#define DBSC_DBDFISTAT(ch)	(DBSC_BASE + 0x0600U + 0x2000U * (ch & 0x04U) + 0x40U * (ch & 0x03U))
#define DBSC_DBDFISTAT_0	(DBSC_BASE + 0x0600U)
#define DBSC_DBDFISTAT_1	(DBSC_BASE + 0x0640U)
#define DBSC_DBDFISTAT_2	(DBSC_BASE + 0x0680U)
#define DBSC_DBDFISTAT_3	(DBSC_BASE + 0x06C0U)

#define DBSC_DBDFICNT(ch)	(DBSC_BASE + 0x0604U + 0x2000U * (ch & 0x04U) + 0x40U * (ch & 0x03U))
#define DBSC_DBDFICNT_0		(DBSC_BASE + 0x0604U)
#define DBSC_DBDFICNT_1		(DBSC_BASE + 0x0644U)
#define DBSC_DBDFICNT_2		(DBSC_BASE + 0x0684U)
#define DBSC_DBDFICNT_3		(DBSC_BASE + 0x06C4U)

#define DBSC_DBPDCNT2(ch)	(DBSC_BASE + 0x0618U + 0x2000U * (ch & 0x04U) + 0x40U * (ch & 0x03U))
#define DBSC_DBPDCNT2_0		(DBSC_BASE + 0x0618U)
#define DBSC_DBPDCNT2_1		(DBSC_BASE + 0x0658U)
#define DBSC_DBPDCNT2_2		(DBSC_BASE + 0x0698U)
#define DBSC_DBPDCNT2_3		(DBSC_BASE + 0x06D8U)

#define DBSC_DBPDCNT3(ch)	(DBSC_BASE + 0x061CU + 0x2000U * (ch & 0x04U) + 0x40U * (ch & 0x03U))
#define DBSC_DBPDCNT3_0		(DBSC_BASE + 0x061CU)
#define DBSC_DBPDCNT3_1		(DBSC_BASE + 0x065CU)
#define DBSC_DBPDCNT3_2		(DBSC_BASE + 0x069CU)
#define DBSC_DBPDCNT3_3		(DBSC_BASE + 0x06DCU)

#define DBSC_DBPDLK(ch)		(DBSC_BASE + 0x0620U + 0x2000U * (ch & 0x04U) + 0x40U * (ch & 0x03U))
#define DBSC_DBPDLK_0		(DBSC_BASE + 0x0620U)
#define DBSC_DBPDLK_1		(DBSC_BASE + 0x0660U)
#define DBSC_DBPDLK_2		(DBSC_BASE + 0x06a0U)
#define DBSC_DBPDLK_3		(DBSC_BASE + 0x06e0U)

#define DBSC_DBPDRGA(ch)	(DBSC_BASE + 0x0624U + 0x2000U * (ch & 0x04U) + 0x40U * (ch & 0x03U))
#define DBSC_DBPDRGA_0		(DBSC_BASE + 0x0624U)
#define DBSC_DBPDRGA_1		(DBSC_BASE + 0x0664U)
#define DBSC_DBPDRGA_2		(DBSC_BASE + 0x06A4U)
#define DBSC_DBPDRGA_3		(DBSC_BASE + 0x06E4U)

#define DBSC_DBPDRGD(ch)	(DBSC_BASE + 0x0628U + 0x2000U * (ch & 0x04U) + 0x40U * (ch & 0x03U))
#define DBSC_DBPDRGD_0		(DBSC_BASE + 0x0628U)
#define DBSC_DBPDRGD_1		(DBSC_BASE + 0x0668U)
#define DBSC_DBPDRGD_2		(DBSC_BASE + 0x06A8U)
#define DBSC_DBPDRGD_3		(DBSC_BASE + 0x06E8U)

#define DBSC_DBPDSTAT(ch)	(DBSC_BASE + 0x0630U + 0x2000U * (ch & 0x04U) + 0x40U * (ch & 0x03U))
#define DBSC_DBPDSTAT_0		(DBSC_BASE + 0x0630U)
#define DBSC_DBPDSTAT_1		(DBSC_BASE + 0x0670U)
#define DBSC_DBPDSTAT_2		(DBSC_BASE + 0x06B0U)
#define DBSC_DBPDSTAT_3		(DBSC_BASE + 0x06F0U)

#define DBSC_DBPDSTAT1(ch)	(DBSC_BASE + 0x0634U + 0x2000U * (ch & 0x04U) + 0x40U * (ch & 0x03U))

#define DBSC_DBBUS0CNF0		(DBSC_BASE + 0x0800U)
#define DBSC_DBBUS0CNF1		(DBSC_BASE + 0x0804U)

#define DBSC_DBBCAMDIS		(DBSC_BASE + 0x09FCU)

#define DBSC_DBSCHRW1		(DBSC_BASE + 0x1024U)

#define DBSC_SCFCTST0		(DBSC_BASE + 0x1700U)
#define DBSC_SCFCTST1		(DBSC_BASE + 0x1708U)

