xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv7/ls102xa/soc.c (revision 3fea95369850987de15a2a0ac009d05e13b90246)
17ba02618SYao Yuan /*
27ba02618SYao Yuan  * Copyright 2015 Freescale Semiconductor, Inc.
37ba02618SYao Yuan  *
47ba02618SYao Yuan  * SPDX-License-Identifier:	GPL-2.0+
57ba02618SYao Yuan  */
67ba02618SYao Yuan 
77ba02618SYao Yuan #include <common.h>
87ba02618SYao Yuan #include <asm/arch/clock.h>
97ba02618SYao Yuan #include <asm/io.h>
10b392a6d4SHou Zhiqiang #include <asm/arch/fsl_serdes.h>
117ba02618SYao Yuan #include <asm/arch/immap_ls102xa.h>
127ba02618SYao Yuan #include <asm/arch/ls102xa_soc.h>
13a08b1921SAlison Wang #include <asm/arch/ls102xa_stream_id.h>
14341238fdSHou Zhiqiang #include <fsl_csu.h>
15a08b1921SAlison Wang 
16a08b1921SAlison Wang struct liodn_id_table sec_liodn_tbl[] = {
17a08b1921SAlison Wang 	SET_SEC_JR_LIODN_ENTRY(0, 0x10, 0x10),
18a08b1921SAlison Wang 	SET_SEC_JR_LIODN_ENTRY(1, 0x10, 0x10),
19a08b1921SAlison Wang 	SET_SEC_JR_LIODN_ENTRY(2, 0x10, 0x10),
20a08b1921SAlison Wang 	SET_SEC_JR_LIODN_ENTRY(3, 0x10, 0x10),
21a08b1921SAlison Wang 	SET_SEC_RTIC_LIODN_ENTRY(a, 0x10),
22a08b1921SAlison Wang 	SET_SEC_RTIC_LIODN_ENTRY(b, 0x10),
23a08b1921SAlison Wang 	SET_SEC_RTIC_LIODN_ENTRY(c, 0x10),
24a08b1921SAlison Wang 	SET_SEC_RTIC_LIODN_ENTRY(d, 0x10),
25a08b1921SAlison Wang 	SET_SEC_DECO_LIODN_ENTRY(0, 0x10, 0x10),
26a08b1921SAlison Wang 	SET_SEC_DECO_LIODN_ENTRY(1, 0x10, 0x10),
27a08b1921SAlison Wang 	SET_SEC_DECO_LIODN_ENTRY(2, 0x10, 0x10),
28a08b1921SAlison Wang 	SET_SEC_DECO_LIODN_ENTRY(3, 0x10, 0x10),
29a08b1921SAlison Wang 	SET_SEC_DECO_LIODN_ENTRY(4, 0x10, 0x10),
30a08b1921SAlison Wang 	SET_SEC_DECO_LIODN_ENTRY(5, 0x10, 0x10),
31a08b1921SAlison Wang 	SET_SEC_DECO_LIODN_ENTRY(6, 0x10, 0x10),
32a08b1921SAlison Wang 	SET_SEC_DECO_LIODN_ENTRY(7, 0x10, 0x10),
33a08b1921SAlison Wang };
34a08b1921SAlison Wang 
35a08b1921SAlison Wang struct smmu_stream_id dev_stream_id[] = {
36a08b1921SAlison Wang 	{ 0x100, 0x01, "ETSEC MAC1" },
37a08b1921SAlison Wang 	{ 0x104, 0x02, "ETSEC MAC2" },
38a08b1921SAlison Wang 	{ 0x108, 0x03, "ETSEC MAC3" },
39a08b1921SAlison Wang 	{ 0x10c, 0x04, "PEX1" },
40a08b1921SAlison Wang 	{ 0x110, 0x05, "PEX2" },
41a08b1921SAlison Wang 	{ 0x114, 0x06, "qDMA" },
42a08b1921SAlison Wang 	{ 0x118, 0x07, "SATA" },
43a08b1921SAlison Wang 	{ 0x11c, 0x08, "USB3" },
44a08b1921SAlison Wang 	{ 0x120, 0x09, "QE" },
45a08b1921SAlison Wang 	{ 0x124, 0x0a, "eSDHC" },
46a08b1921SAlison Wang 	{ 0x128, 0x0b, "eMA" },
47a08b1921SAlison Wang 	{ 0x14c, 0x0c, "2D-ACE" },
48a08b1921SAlison Wang 	{ 0x150, 0x0d, "USB2" },
49a08b1921SAlison Wang 	{ 0x18c, 0x0e, "DEBUG" },
50a08b1921SAlison Wang };
517ba02618SYao Yuan 
get_soc_major_rev(void)527ba02618SYao Yuan unsigned int get_soc_major_rev(void)
537ba02618SYao Yuan {
547ba02618SYao Yuan 	struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
557ba02618SYao Yuan 	unsigned int svr, major;
567ba02618SYao Yuan 
577ba02618SYao Yuan 	svr = in_be32(&gur->svr);
587ba02618SYao Yuan 	major = SVR_MAJ(svr);
597ba02618SYao Yuan 
607ba02618SYao Yuan 	return major;
617ba02618SYao Yuan }
627ba02618SYao Yuan 
s_init(void)63f85a8e8dSXiaoliang Yang void s_init(void)
64f85a8e8dSXiaoliang Yang {
65f85a8e8dSXiaoliang Yang }
66f85a8e8dSXiaoliang Yang 
67b392a6d4SHou Zhiqiang #ifdef CONFIG_SYS_FSL_ERRATUM_A010315
erratum_a010315(void)68b392a6d4SHou Zhiqiang void erratum_a010315(void)
69b392a6d4SHou Zhiqiang {
70b392a6d4SHou Zhiqiang 	int i;
71b392a6d4SHou Zhiqiang 
72b392a6d4SHou Zhiqiang 	for (i = PCIE1; i <= PCIE2; i++)
73b392a6d4SHou Zhiqiang 		if (!is_serdes_configured(i)) {
74b392a6d4SHou Zhiqiang 			debug("PCIe%d: disabled all R/W permission!\n", i);
75b392a6d4SHou Zhiqiang 			set_pcie_ns_access(i, 0);
76b392a6d4SHou Zhiqiang 		}
77b392a6d4SHou Zhiqiang }
78b392a6d4SHou Zhiqiang #endif
79b392a6d4SHou Zhiqiang 
arch_soc_init(void)807ba02618SYao Yuan int arch_soc_init(void)
817ba02618SYao Yuan {
827ba02618SYao Yuan 	struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
837ba02618SYao Yuan 	struct ccsr_cci400 *cci = (struct ccsr_cci400 *)CONFIG_SYS_CCI400_ADDR;
847ba02618SYao Yuan 	unsigned int major;
857ba02618SYao Yuan 
86341238fdSHou Zhiqiang #ifdef CONFIG_LAYERSCAPE_NS_ACCESS
87341238fdSHou Zhiqiang 	enable_layerscape_ns_access();
88341238fdSHou Zhiqiang #endif
89341238fdSHou Zhiqiang 
907ba02618SYao Yuan #ifdef CONFIG_FSL_QSPI
917ba02618SYao Yuan 	out_be32(&scfg->qspi_cfg, SCFG_QSPI_CLKSEL);
927ba02618SYao Yuan #endif
937ba02618SYao Yuan 
94*b215fb3fSSanchayan Maity #ifdef CONFIG_VIDEO_FSL_DCU_FB
957ba02618SYao Yuan 	out_be32(&scfg->pixclkcr, SCFG_PIXCLKCR_PXCKEN);
967ba02618SYao Yuan #endif
977ba02618SYao Yuan 
987ba02618SYao Yuan 	/* Configure Little endian for SAI, ASRC and SPDIF */
997ba02618SYao Yuan 	out_be32(&scfg->endiancr, SCFG_ENDIANCR_LE);
1007ba02618SYao Yuan 
1017ba02618SYao Yuan 	/*
1027ba02618SYao Yuan 	 * Enable snoop requests and DVM message requests for
1030b8bc631SYao Yuan 	 * All the slave insterfaces.
1047ba02618SYao Yuan 	 */
1050b8bc631SYao Yuan 	out_le32(&cci->slave[0].snoop_ctrl,
1060b8bc631SYao Yuan 		 CCI400_DVM_MESSAGE_REQ_EN | CCI400_SNOOP_REQ_EN);
1070b8bc631SYao Yuan 	out_le32(&cci->slave[1].snoop_ctrl,
1080b8bc631SYao Yuan 		 CCI400_DVM_MESSAGE_REQ_EN | CCI400_SNOOP_REQ_EN);
1090b8bc631SYao Yuan 	out_le32(&cci->slave[2].snoop_ctrl,
1100b8bc631SYao Yuan 		 CCI400_DVM_MESSAGE_REQ_EN | CCI400_SNOOP_REQ_EN);
1117ba02618SYao Yuan 	out_le32(&cci->slave[4].snoop_ctrl,
1127ba02618SYao Yuan 		 CCI400_DVM_MESSAGE_REQ_EN | CCI400_SNOOP_REQ_EN);
1137ba02618SYao Yuan 
1147ba02618SYao Yuan 	major = get_soc_major_rev();
1157ba02618SYao Yuan 	if (major == SOC_MAJOR_VER_1_0) {
1167ba02618SYao Yuan 		/*
1177ba02618SYao Yuan 		 * Set CCI-400 Slave interface S1, S2 Shareable Override
1187ba02618SYao Yuan 		 * Register All transactions are treated as non-shareable
1197ba02618SYao Yuan 		 */
1207ba02618SYao Yuan 		out_le32(&cci->slave[1].sha_ord, CCI400_SHAORD_NON_SHAREABLE);
1217ba02618SYao Yuan 		out_le32(&cci->slave[2].sha_ord, CCI400_SHAORD_NON_SHAREABLE);
1227ba02618SYao Yuan 
1237ba02618SYao Yuan 		/* Workaround for the issue that DDR could not respond to
1247ba02618SYao Yuan 		 * barrier transaction which is generated by executing DSB/ISB
1257ba02618SYao Yuan 		 * instruction. Set CCI-400 control override register to
1267ba02618SYao Yuan 		 * terminate the barrier transaction. After DDR is initialized,
1277ba02618SYao Yuan 		 * allow barrier transaction to DDR again */
1287ba02618SYao Yuan 		out_le32(&cci->ctrl_ord, CCI400_CTRLORD_TERM_BARRIER);
1297ba02618SYao Yuan 	}
1307ba02618SYao Yuan 
131762b3535SYao Yuan 	/* Enable all the snoop signal for various masters */
132762b3535SYao Yuan 	out_be32(&scfg->snpcnfgcr, SCFG_SNPCNFGCR_SEC_RD_WR |
133762b3535SYao Yuan 				SCFG_SNPCNFGCR_DCU_RD_WR |
134762b3535SYao Yuan 				SCFG_SNPCNFGCR_SATA_RD_WR |
135762b3535SYao Yuan 				SCFG_SNPCNFGCR_USB3_RD_WR |
136762b3535SYao Yuan 				SCFG_SNPCNFGCR_DBG_RD_WR |
137762b3535SYao Yuan 				SCFG_SNPCNFGCR_EDMA_SNP);
138762b3535SYao Yuan 
1396c4a1ebaSYao Yuan 	/*
1406c4a1ebaSYao Yuan 	 * Memory controller require a register write before being enabled.
1416c4a1ebaSYao Yuan 	 * Affects: DDR
1426c4a1ebaSYao Yuan 	 * Register: EDDRTQCFG
1436c4a1ebaSYao Yuan 	 * Description: Memory controller performance is not optimal with
1446c4a1ebaSYao Yuan 	 *		default internal target queue register values.
1456c4a1ebaSYao Yuan 	 * Workaround: Write a value of 63b2_0042h to address: 157_020Ch.
1466c4a1ebaSYao Yuan 	 */
1476c4a1ebaSYao Yuan 	out_be32(&scfg->eddrtqcfg, 0x63b20042);
1486c4a1ebaSYao Yuan 
1497ba02618SYao Yuan 	return 0;
1507ba02618SYao Yuan }
151a08b1921SAlison Wang 
ls102xa_smmu_stream_id_init(void)152a08b1921SAlison Wang int ls102xa_smmu_stream_id_init(void)
153a08b1921SAlison Wang {
154a08b1921SAlison Wang 	ls1021x_config_caam_stream_id(sec_liodn_tbl,
155a08b1921SAlison Wang 				      ARRAY_SIZE(sec_liodn_tbl));
156a08b1921SAlison Wang 
157a08b1921SAlison Wang 	ls102xa_config_smmu_stream_id(dev_stream_id,
158a08b1921SAlison Wang 				      ARRAY_SIZE(dev_stream_id));
159a08b1921SAlison Wang 
160a08b1921SAlison Wang 	return 0;
161a08b1921SAlison Wang }
162