xref: /rk3399_ARM-atf/plat/imx/imx8m/imx8mm/gpc.c (revision 1b491eead580d7849a45a38f2c6a935a5d8d1160)
1179f82a2SJacky Bai /*
244dea544SJacky Bai  * Copyright (c) 2019-2022, ARM Limited and Contributors. All rights reserved.
3179f82a2SJacky Bai  *
4179f82a2SJacky Bai  * SPDX-License-Identifier: BSD-3-Clause
5179f82a2SJacky Bai  */
6179f82a2SJacky Bai 
7179f82a2SJacky Bai #include <stdlib.h>
8179f82a2SJacky Bai #include <stdint.h>
9179f82a2SJacky Bai #include <stdbool.h>
10179f82a2SJacky Bai 
11179f82a2SJacky Bai #include <common/debug.h>
12179f82a2SJacky Bai #include <drivers/delay_timer.h>
13179f82a2SJacky Bai #include <lib/mmio.h>
14179f82a2SJacky Bai #include <lib/psci/psci.h>
15179f82a2SJacky Bai #include <lib/smccc.h>
16179f82a2SJacky Bai #include <platform_def.h>
17179f82a2SJacky Bai #include <services/std_svc.h>
18179f82a2SJacky Bai 
19179f82a2SJacky Bai #include <gpc.h>
20179f82a2SJacky Bai #include <imx_sip_svc.h>
21179f82a2SJacky Bai 
2244dea544SJacky Bai #define MIPI_PWR_REQ		BIT(0)
2344dea544SJacky Bai #define PCIE_PWR_REQ		BIT(1)
2444dea544SJacky Bai #define OTG1_PWR_REQ		BIT(2)
2544dea544SJacky Bai #define OTG2_PWR_REQ		BIT(3)
2644dea544SJacky Bai #define HSIOMIX_PWR_REQ		BIT(4)
2744dea544SJacky Bai #define GPU2D_PWR_REQ		BIT(6)
2844dea544SJacky Bai #define GPUMIX_PWR_REQ		BIT(7)
2944dea544SJacky Bai #define VPUMIX_PWR_REQ		BIT(8)
3044dea544SJacky Bai #define GPU3D_PWR_REQ		BIT(9)
3144dea544SJacky Bai #define DISPMIX_PWR_REQ		BIT(10)
3244dea544SJacky Bai #define VPU_G1_PWR_REQ		BIT(11)
3344dea544SJacky Bai #define VPU_G2_PWR_REQ		BIT(12)
3444dea544SJacky Bai #define VPU_H1_PWR_REQ		BIT(13)
3544dea544SJacky Bai 
3644dea544SJacky Bai #define HSIOMIX_ADB400_SYNC	(0x3 << 5)
3744dea544SJacky Bai #define DISPMIX_ADB400_SYNC	BIT(7)
3844dea544SJacky Bai #define VPUMIX_ADB400_SYNC	BIT(8)
3944dea544SJacky Bai #define GPU3D_ADB400_SYNC	BIT(9)
4044dea544SJacky Bai #define GPU2D_ADB400_SYNC	BIT(10)
4144dea544SJacky Bai #define GPUMIX_ADB400_SYNC	BIT(11)
4244dea544SJacky Bai #define HSIOMIX_ADB400_ACK	(0x3 << 23)
4344dea544SJacky Bai #define DISPMIX_ADB400_ACK	BIT(25)
4444dea544SJacky Bai #define VPUMIX_ADB400_ACK	BIT(26)
4544dea544SJacky Bai #define GPU3D_ADB400_ACK	BIT(27)
4644dea544SJacky Bai #define GPU2D_ADB400_ACK	BIT(28)
4744dea544SJacky Bai #define GPUMIX_ADB400_ACK	BIT(29)
4844dea544SJacky Bai 
4944dea544SJacky Bai #define MIPI_PGC		0xc00
5044dea544SJacky Bai #define PCIE_PGC		0xc40
5144dea544SJacky Bai #define OTG1_PGC		0xc80
5244dea544SJacky Bai #define OTG2_PGC		0xcc0
5344dea544SJacky Bai #define HSIOMIX_PGC	        0xd00
5444dea544SJacky Bai #define GPU2D_PGC		0xd80
5544dea544SJacky Bai #define GPUMIX_PGC		0xdc0
5644dea544SJacky Bai #define VPUMIX_PGC		0xe00
5744dea544SJacky Bai #define GPU3D_PGC		0xe40
5844dea544SJacky Bai #define DISPMIX_PGC		0xe80
5944dea544SJacky Bai #define VPU_G1_PGC		0xec0
6044dea544SJacky Bai #define VPU_G2_PGC		0xf00
6144dea544SJacky Bai #define VPU_H1_PGC		0xf40
6244dea544SJacky Bai 
6344dea544SJacky Bai enum pu_domain_id {
6444dea544SJacky Bai 	HSIOMIX,
6544dea544SJacky Bai 	PCIE,
6644dea544SJacky Bai 	OTG1,
6744dea544SJacky Bai 	OTG2,
6844dea544SJacky Bai 	GPUMIX,
6944dea544SJacky Bai 	VPUMIX,
7044dea544SJacky Bai 	VPU_G1,
7144dea544SJacky Bai 	VPU_G2,
7244dea544SJacky Bai 	VPU_H1,
7344dea544SJacky Bai 	DISPMIX,
7444dea544SJacky Bai 	MIPI,
7544dea544SJacky Bai 	/* below two domain only for ATF internal use */
7644dea544SJacky Bai 	GPU2D,
7744dea544SJacky Bai 	GPU3D,
7844dea544SJacky Bai 	MAX_DOMAINS,
7944dea544SJacky Bai };
8044dea544SJacky Bai 
8144dea544SJacky Bai /* PU domain */
8244dea544SJacky Bai static struct imx_pwr_domain pu_domains[] = {
8344dea544SJacky Bai 	IMX_MIX_DOMAIN(HSIOMIX, false),
8444dea544SJacky Bai 	IMX_PD_DOMAIN(PCIE, false),
8544dea544SJacky Bai 	IMX_PD_DOMAIN(OTG1, true),
8644dea544SJacky Bai 	IMX_PD_DOMAIN(OTG2, true),
8744dea544SJacky Bai 	IMX_MIX_DOMAIN(GPUMIX, false),
8844dea544SJacky Bai 	IMX_MIX_DOMAIN(VPUMIX, false),
8944dea544SJacky Bai 	IMX_PD_DOMAIN(VPU_G1, false),
9044dea544SJacky Bai 	IMX_PD_DOMAIN(VPU_G2, false),
9144dea544SJacky Bai 	IMX_PD_DOMAIN(VPU_H1, false),
9244dea544SJacky Bai 	IMX_MIX_DOMAIN(DISPMIX, false),
9344dea544SJacky Bai 	IMX_PD_DOMAIN(MIPI, false),
9444dea544SJacky Bai 	/* below two domain only for ATF internal use */
9544dea544SJacky Bai 	IMX_MIX_DOMAIN(GPU2D, false),
9644dea544SJacky Bai 	IMX_MIX_DOMAIN(GPU3D, false),
9744dea544SJacky Bai };
9844dea544SJacky Bai 
9944dea544SJacky Bai static unsigned int pu_domain_status;
10044dea544SJacky Bai 
10144dea544SJacky Bai #define GPU_RCR		0x40
10244dea544SJacky Bai #define VPU_RCR		0x44
10344dea544SJacky Bai 
10444dea544SJacky Bai #define VPU_CTL_BASE		0x38330000
10544dea544SJacky Bai #define BLK_SFT_RSTN_CSR	0x0
10644dea544SJacky Bai #define H1_SFT_RSTN		BIT(2)
10744dea544SJacky Bai #define G1_SFT_RSTN		BIT(1)
10844dea544SJacky Bai #define G2_SFT_RSTN		BIT(0)
10944dea544SJacky Bai 
11044dea544SJacky Bai #define DISP_CTL_BASE		0x32e28000
11144dea544SJacky Bai 
11244dea544SJacky Bai void vpu_sft_reset_assert(uint32_t domain_id)
11344dea544SJacky Bai {
11444dea544SJacky Bai 	uint32_t val;
11544dea544SJacky Bai 
11644dea544SJacky Bai 	val = mmio_read_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR);
11744dea544SJacky Bai 
11844dea544SJacky Bai 	switch (domain_id) {
11944dea544SJacky Bai 	case VPU_G1:
12044dea544SJacky Bai 		val &= ~G1_SFT_RSTN;
12144dea544SJacky Bai 		mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val);
12244dea544SJacky Bai 		break;
12344dea544SJacky Bai 	case VPU_G2:
12444dea544SJacky Bai 		val &= ~G2_SFT_RSTN;
12544dea544SJacky Bai 		mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val);
12644dea544SJacky Bai 		break;
12744dea544SJacky Bai 	case VPU_H1:
12844dea544SJacky Bai 		val &= ~H1_SFT_RSTN;
12944dea544SJacky Bai 		mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val);
13044dea544SJacky Bai 		break;
13144dea544SJacky Bai 	default:
13244dea544SJacky Bai 		break;
13344dea544SJacky Bai 	}
13444dea544SJacky Bai }
13544dea544SJacky Bai 
13644dea544SJacky Bai void vpu_sft_reset_deassert(uint32_t domain_id)
13744dea544SJacky Bai {
13844dea544SJacky Bai 	uint32_t val;
13944dea544SJacky Bai 
14044dea544SJacky Bai 	val = mmio_read_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR);
14144dea544SJacky Bai 
14244dea544SJacky Bai 	switch (domain_id) {
14344dea544SJacky Bai 	case VPU_G1:
14444dea544SJacky Bai 		val |= G1_SFT_RSTN;
14544dea544SJacky Bai 		mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val);
14644dea544SJacky Bai 		break;
14744dea544SJacky Bai 	case VPU_G2:
14844dea544SJacky Bai 		val |= G2_SFT_RSTN;
14944dea544SJacky Bai 		mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val);
15044dea544SJacky Bai 		break;
15144dea544SJacky Bai 	case VPU_H1:
15244dea544SJacky Bai 		val |= H1_SFT_RSTN;
15344dea544SJacky Bai 		mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val);
15444dea544SJacky Bai 		break;
15544dea544SJacky Bai 	default:
15644dea544SJacky Bai 		break;
15744dea544SJacky Bai 	}
15844dea544SJacky Bai }
15944dea544SJacky Bai 
16044dea544SJacky Bai void imx_gpc_pm_domain_enable(uint32_t domain_id, bool on)
16144dea544SJacky Bai {
16244dea544SJacky Bai 	if (domain_id >= MAX_DOMAINS) {
16344dea544SJacky Bai 		return;
16444dea544SJacky Bai 	}
16544dea544SJacky Bai 
16644dea544SJacky Bai 	struct imx_pwr_domain *pwr_domain = &pu_domains[domain_id];
16744dea544SJacky Bai 
16844dea544SJacky Bai 	if (on) {
16944dea544SJacky Bai 		pu_domain_status |= (1 << domain_id);
17044dea544SJacky Bai 
17144dea544SJacky Bai 		if (domain_id == VPU_G1 || domain_id == VPU_G2 ||
17244dea544SJacky Bai 		    domain_id == VPU_H1) {
17344dea544SJacky Bai 			vpu_sft_reset_assert(domain_id);
17444dea544SJacky Bai 		}
17544dea544SJacky Bai 
17644dea544SJacky Bai 		/* HSIOMIX has no PU bit, so skip for it */
17744dea544SJacky Bai 		if (domain_id != HSIOMIX) {
17844dea544SJacky Bai 			/* clear the PGC bit */
17944dea544SJacky Bai 			mmio_clrbits_32(IMX_GPC_BASE + pwr_domain->pgc_offset, 0x1);
18044dea544SJacky Bai 
18144dea544SJacky Bai 			/* power up the domain */
18244dea544SJacky Bai 			mmio_setbits_32(IMX_GPC_BASE + PU_PGC_UP_TRG, pwr_domain->pwr_req);
18344dea544SJacky Bai 
18444dea544SJacky Bai 			/* wait for power request done */
18544dea544SJacky Bai 			while (mmio_read_32(IMX_GPC_BASE + PU_PGC_UP_TRG) & pwr_domain->pwr_req) {
18644dea544SJacky Bai 				;
18744dea544SJacky Bai 			}
18844dea544SJacky Bai 		}
18944dea544SJacky Bai 
19044dea544SJacky Bai 		if (domain_id == VPU_G1 || domain_id == VPU_G2 ||
19144dea544SJacky Bai 		    domain_id == VPU_H1) {
19244dea544SJacky Bai 			vpu_sft_reset_deassert(domain_id);
19344dea544SJacky Bai 			/* dealy for a while to make sure reset done */
19444dea544SJacky Bai 			udelay(100);
19544dea544SJacky Bai 		}
19644dea544SJacky Bai 
19744dea544SJacky Bai 		if (domain_id == GPUMIX) {
19844dea544SJacky Bai 			/* assert reset */
19944dea544SJacky Bai 			mmio_write_32(IMX_SRC_BASE + GPU_RCR, 0x1);
20044dea544SJacky Bai 
20144dea544SJacky Bai 			/* power up GPU2D */
20244dea544SJacky Bai 			mmio_clrbits_32(IMX_GPC_BASE + GPU2D_PGC, 0x1);
20344dea544SJacky Bai 
20444dea544SJacky Bai 			mmio_setbits_32(IMX_GPC_BASE + PU_PGC_UP_TRG, GPU2D_PWR_REQ);
20544dea544SJacky Bai 
20644dea544SJacky Bai 			/* wait for power request done */
20744dea544SJacky Bai 			while (mmio_read_32(IMX_GPC_BASE + PU_PGC_UP_TRG) & GPU2D_PWR_REQ) {
20844dea544SJacky Bai 				;
20944dea544SJacky Bai 			}
21044dea544SJacky Bai 
21144dea544SJacky Bai 			udelay(1);
21244dea544SJacky Bai 
21344dea544SJacky Bai 			/* power up GPU3D */
21444dea544SJacky Bai 			mmio_clrbits_32(IMX_GPC_BASE + GPU3D_PGC, 0x1);
21544dea544SJacky Bai 
21644dea544SJacky Bai 			mmio_setbits_32(IMX_GPC_BASE + PU_PGC_UP_TRG, GPU3D_PWR_REQ);
21744dea544SJacky Bai 
21844dea544SJacky Bai 			/* wait for power request done */
21944dea544SJacky Bai 			while (mmio_read_32(IMX_GPC_BASE + PU_PGC_UP_TRG) & GPU3D_PWR_REQ) {
22044dea544SJacky Bai 				;
22144dea544SJacky Bai 			}
22244dea544SJacky Bai 
22344dea544SJacky Bai 			udelay(10);
22444dea544SJacky Bai 			/* release the gpumix reset */
22544dea544SJacky Bai 			mmio_write_32(IMX_SRC_BASE + GPU_RCR, 0x0);
22644dea544SJacky Bai 			udelay(10);
22744dea544SJacky Bai 		}
22844dea544SJacky Bai 
22944dea544SJacky Bai 		/* vpu sft clock enable */
23044dea544SJacky Bai 		if (domain_id == VPUMIX) {
23144dea544SJacky Bai 			mmio_write_32(IMX_SRC_BASE + VPU_RCR, 0x1);
23244dea544SJacky Bai 			udelay(5);
23344dea544SJacky Bai 			mmio_write_32(IMX_SRC_BASE + VPU_RCR, 0x0);
23444dea544SJacky Bai 			udelay(5);
23544dea544SJacky Bai 
23644dea544SJacky Bai 			/* enable all clock */
23744dea544SJacky Bai 			mmio_write_32(VPU_CTL_BASE + 0x4, 0x7);
23844dea544SJacky Bai 		}
23944dea544SJacky Bai 
24044dea544SJacky Bai 		if (domain_id == DISPMIX) {
24144dea544SJacky Bai 			/* special setting for DISPMIX */
24244dea544SJacky Bai 			mmio_write_32(DISP_CTL_BASE + 0x4, 0x1fff);
24344dea544SJacky Bai 			mmio_write_32(DISP_CTL_BASE, 0x7f);
24444dea544SJacky Bai 			mmio_write_32(DISP_CTL_BASE + 0x8, 0x30000);
24544dea544SJacky Bai 		}
24644dea544SJacky Bai 
24744dea544SJacky Bai 		/* handle the ADB400 sync */
24844dea544SJacky Bai 		if (pwr_domain->need_sync) {
24944dea544SJacky Bai 			/* clear adb power down request */
25044dea544SJacky Bai 			mmio_setbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, pwr_domain->adb400_sync);
25144dea544SJacky Bai 
25244dea544SJacky Bai 			/* wait for adb power request ack */
25344dea544SJacky Bai 			while (!(mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & pwr_domain->adb400_ack)) {
25444dea544SJacky Bai 				;
25544dea544SJacky Bai 			}
25644dea544SJacky Bai 		}
25744dea544SJacky Bai 
25844dea544SJacky Bai 		if (domain_id == GPUMIX) {
25944dea544SJacky Bai 			/* power up GPU2D ADB */
26044dea544SJacky Bai 			mmio_setbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, GPU2D_ADB400_SYNC);
26144dea544SJacky Bai 
26244dea544SJacky Bai 			/* wait for adb power request ack */
26344dea544SJacky Bai 			while (!(mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & GPU2D_ADB400_ACK)) {
26444dea544SJacky Bai 				;
26544dea544SJacky Bai 			}
26644dea544SJacky Bai 
26744dea544SJacky Bai 			/* power up GPU3D ADB */
26844dea544SJacky Bai 			mmio_setbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, GPU3D_ADB400_SYNC);
26944dea544SJacky Bai 
27044dea544SJacky Bai 			/* wait for adb power request ack */
27144dea544SJacky Bai 			while (!(mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & GPU3D_ADB400_ACK)) {
27244dea544SJacky Bai 				;
27344dea544SJacky Bai 			}
27444dea544SJacky Bai 		}
27544dea544SJacky Bai 	} else {
27644dea544SJacky Bai 		pu_domain_status &= ~(1 << domain_id);
27744dea544SJacky Bai 
27844dea544SJacky Bai 		if (domain_id == OTG1 || domain_id == OTG2) {
27944dea544SJacky Bai 			return;
28044dea544SJacky Bai 		}
28144dea544SJacky Bai 
28244dea544SJacky Bai 		/* GPU2D & GPU3D ADB power down */
28344dea544SJacky Bai 		if (domain_id == GPUMIX) {
28444dea544SJacky Bai 			mmio_clrbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, GPU2D_ADB400_SYNC);
28544dea544SJacky Bai 
28644dea544SJacky Bai 			/* wait for adb power request ack */
28744dea544SJacky Bai 			while ((mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & GPU2D_ADB400_ACK)) {
28844dea544SJacky Bai 				;
28944dea544SJacky Bai 			}
29044dea544SJacky Bai 
29144dea544SJacky Bai 			mmio_clrbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, GPU3D_ADB400_SYNC);
29244dea544SJacky Bai 
29344dea544SJacky Bai 				/* wait for adb power request ack */
29444dea544SJacky Bai 			while ((mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & GPU3D_ADB400_ACK)) {
29544dea544SJacky Bai 				;
29644dea544SJacky Bai 			}
29744dea544SJacky Bai 		}
29844dea544SJacky Bai 
29944dea544SJacky Bai 		/* handle the ADB400 sync */
30044dea544SJacky Bai 		if (pwr_domain->need_sync) {
30144dea544SJacky Bai 			/* set adb power down request */
30244dea544SJacky Bai 			mmio_clrbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, pwr_domain->adb400_sync);
30344dea544SJacky Bai 
30444dea544SJacky Bai 			/* wait for adb power request ack */
30544dea544SJacky Bai 			while ((mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & pwr_domain->adb400_ack)) {
30644dea544SJacky Bai 				;
30744dea544SJacky Bai 			}
30844dea544SJacky Bai 		}
30944dea544SJacky Bai 
31044dea544SJacky Bai 		if (domain_id == GPUMIX) {
31144dea544SJacky Bai 			/* power down GPU2D */
31244dea544SJacky Bai 			mmio_setbits_32(IMX_GPC_BASE + GPU2D_PGC, 0x1);
31344dea544SJacky Bai 
31444dea544SJacky Bai 			mmio_setbits_32(IMX_GPC_BASE + PU_PGC_DN_TRG, GPU2D_PWR_REQ);
31544dea544SJacky Bai 
31644dea544SJacky Bai 			/* wait for power request done */
31744dea544SJacky Bai 			while (mmio_read_32(IMX_GPC_BASE + PU_PGC_DN_TRG) & GPU2D_PWR_REQ) {
31844dea544SJacky Bai 				;
31944dea544SJacky Bai 			}
32044dea544SJacky Bai 
32144dea544SJacky Bai 			/* power down GPU3D */
32244dea544SJacky Bai 			mmio_setbits_32(IMX_GPC_BASE + GPU3D_PGC, 0x1);
32344dea544SJacky Bai 
32444dea544SJacky Bai 			mmio_setbits_32(IMX_GPC_BASE + PU_PGC_DN_TRG, GPU3D_PWR_REQ);
32544dea544SJacky Bai 
32644dea544SJacky Bai 			/* wait for power request done */
32744dea544SJacky Bai 			while (mmio_read_32(IMX_GPC_BASE + PU_PGC_DN_TRG) & GPU3D_PWR_REQ) {
32844dea544SJacky Bai 				;
32944dea544SJacky Bai 			}
33044dea544SJacky Bai 		}
33144dea544SJacky Bai 
33244dea544SJacky Bai 		/* HSIOMIX has no PU bit, so skip for it */
33344dea544SJacky Bai 		if (domain_id != HSIOMIX) {
33444dea544SJacky Bai 			/* set the PGC bit */
33544dea544SJacky Bai 			mmio_setbits_32(IMX_GPC_BASE + pwr_domain->pgc_offset, 0x1);
33644dea544SJacky Bai 
33744dea544SJacky Bai 			/* power down the domain */
33844dea544SJacky Bai 			mmio_setbits_32(IMX_GPC_BASE + PU_PGC_DN_TRG, pwr_domain->pwr_req);
33944dea544SJacky Bai 
34044dea544SJacky Bai 			/* wait for power request done */
34144dea544SJacky Bai 			while (mmio_read_32(IMX_GPC_BASE + PU_PGC_DN_TRG) & pwr_domain->pwr_req) {
34244dea544SJacky Bai 				;
34344dea544SJacky Bai 			}
34444dea544SJacky Bai 		}
34544dea544SJacky Bai 	}
34644dea544SJacky Bai }
34744dea544SJacky Bai 
348179f82a2SJacky Bai void imx_gpc_init(void)
349179f82a2SJacky Bai {
350179f82a2SJacky Bai 	unsigned int val;
351179f82a2SJacky Bai 	int i;
352179f82a2SJacky Bai 
353179f82a2SJacky Bai 	/* mask all the wakeup irq by default */
354179f82a2SJacky Bai 	for (i = 0; i < 4; i++) {
355179f82a2SJacky Bai 		mmio_write_32(IMX_GPC_BASE + IMR1_CORE0_A53 + i * 4, ~0x0);
356179f82a2SJacky Bai 		mmio_write_32(IMX_GPC_BASE + IMR1_CORE1_A53 + i * 4, ~0x0);
357179f82a2SJacky Bai 		mmio_write_32(IMX_GPC_BASE + IMR1_CORE2_A53 + i * 4, ~0x0);
358179f82a2SJacky Bai 		mmio_write_32(IMX_GPC_BASE + IMR1_CORE3_A53 + i * 4, ~0x0);
359179f82a2SJacky Bai 		mmio_write_32(IMX_GPC_BASE + IMR1_CORE0_M4 + i * 4, ~0x0);
360179f82a2SJacky Bai 	}
361179f82a2SJacky Bai 
362179f82a2SJacky Bai 	val = mmio_read_32(IMX_GPC_BASE + LPCR_A53_BSC);
363179f82a2SJacky Bai 	/* use GIC wake_request to wakeup C0~C3 from LPM */
364179f82a2SJacky Bai 	val |= 0x30c00000;
365179f82a2SJacky Bai 	/* clear the MASTER0 LPM handshake */
366179f82a2SJacky Bai 	val &= ~(1 << 6);
367179f82a2SJacky Bai 	mmio_write_32(IMX_GPC_BASE + LPCR_A53_BSC, val);
368179f82a2SJacky Bai 
369179f82a2SJacky Bai 	/* clear MASTER1 & MASTER2 mapping in CPU0(A53) */
370179f82a2SJacky Bai 	mmio_clrbits_32(IMX_GPC_BASE + MST_CPU_MAPPING, (MASTER1_MAPPING |
371179f82a2SJacky Bai 		MASTER2_MAPPING));
372179f82a2SJacky Bai 
373179f82a2SJacky Bai 	/* set all mix/PU in A53 domain */
374179f82a2SJacky Bai 	mmio_write_32(IMX_GPC_BASE + PGC_CPU_0_1_MAPPING, 0xffff);
375179f82a2SJacky Bai 
376179f82a2SJacky Bai 	/*
377179f82a2SJacky Bai 	 * Set the CORE & SCU power up timing:
378179f82a2SJacky Bai 	 * SW = 0x1, SW2ISO = 0x1;
379*1b491eeaSElyes Haouas 	 * the CPU CORE and SCU power up timing counter
380179f82a2SJacky Bai 	 * is drived  by 32K OSC, each domain's power up
381179f82a2SJacky Bai 	 * latency is (SW + SW2ISO) / 32768
382179f82a2SJacky Bai 	 */
383179f82a2SJacky Bai 	mmio_write_32(IMX_GPC_BASE + COREx_PGC_PCR(0) + 0x4, 0x81);
384179f82a2SJacky Bai 	mmio_write_32(IMX_GPC_BASE + COREx_PGC_PCR(1) + 0x4, 0x81);
385179f82a2SJacky Bai 	mmio_write_32(IMX_GPC_BASE + COREx_PGC_PCR(2) + 0x4, 0x81);
386179f82a2SJacky Bai 	mmio_write_32(IMX_GPC_BASE + COREx_PGC_PCR(3) + 0x4, 0x81);
387179f82a2SJacky Bai 	mmio_write_32(IMX_GPC_BASE + PLAT_PGC_PCR + 0x4, 0x81);
388179f82a2SJacky Bai 	mmio_write_32(IMX_GPC_BASE + PGC_SCU_TIMING,
389179f82a2SJacky Bai 		      (0x59 << 10) | 0x5B | (0x2 << 20));
390179f82a2SJacky Bai 
391179f82a2SJacky Bai 	/* set DUMMY PDN/PUP ACK by default for A53 domain */
392179f82a2SJacky Bai 	mmio_write_32(IMX_GPC_BASE + PGC_ACK_SEL_A53,
393179f82a2SJacky Bai 		      A53_DUMMY_PUP_ACK | A53_DUMMY_PDN_ACK);
394179f82a2SJacky Bai 
395179f82a2SJacky Bai 	/* clear DSM by default */
396179f82a2SJacky Bai 	val = mmio_read_32(IMX_GPC_BASE + SLPCR);
397179f82a2SJacky Bai 	val &= ~SLPCR_EN_DSM;
398179f82a2SJacky Bai 	/* enable the fast wakeup wait mode */
399179f82a2SJacky Bai 	val |= SLPCR_A53_FASTWUP_WAIT_MODE;
400179f82a2SJacky Bai 	/* clear the RBC */
401179f82a2SJacky Bai 	val &= ~(0x3f << SLPCR_RBC_COUNT_SHIFT);
402179f82a2SJacky Bai 	/* set the STBY_COUNT to 0x5, (128 * 30)us */
403179f82a2SJacky Bai 	val &= ~(0x7 << SLPCR_STBY_COUNT_SHFT);
404179f82a2SJacky Bai 	val |= (0x5 << SLPCR_STBY_COUNT_SHFT);
405179f82a2SJacky Bai 	mmio_write_32(IMX_GPC_BASE + SLPCR, val);
406179f82a2SJacky Bai 
407179f82a2SJacky Bai 	/*
408179f82a2SJacky Bai 	 * USB PHY power up needs to make sure RESET bit in SRC is clear,
409179f82a2SJacky Bai 	 * otherwise, the PU power up bit in GPC will NOT self-cleared.
410179f82a2SJacky Bai 	 * only need to do it once.
411179f82a2SJacky Bai 	 */
412179f82a2SJacky Bai 	mmio_clrbits_32(IMX_SRC_BASE + SRC_OTG1PHY_SCR, 0x1);
413179f82a2SJacky Bai 	mmio_clrbits_32(IMX_SRC_BASE + SRC_OTG2PHY_SCR, 0x1);
414179f82a2SJacky Bai }
415