181136819SBai Ping /* 2*e8837b0aSJacky Bai * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved. 381136819SBai Ping * 481136819SBai Ping * SPDX-License-Identifier: BSD-3-Clause 581136819SBai Ping */ 681136819SBai Ping 781136819SBai Ping #ifndef IMX8M_GPC_H 881136819SBai Ping #define IMX8M_GPC_H 981136819SBai Ping 1081136819SBai Ping #define LPCR_A53_BSC 0x0 1181136819SBai Ping #define LPCR_A53_BSC2 0x108 1281136819SBai Ping #define LPCR_A53_AD 0x4 1381136819SBai Ping #define LPCR_M4 0x8 1481136819SBai Ping #define SLPCR 0x14 1581136819SBai Ping #define MST_CPU_MAPPING 0x18 1681136819SBai Ping #define MLPCR 0x20 1781136819SBai Ping #define PGC_ACK_SEL_A53 0x24 1881136819SBai Ping #define IMR1_CORE0_A53 0x30 1981136819SBai Ping #define IMR1_CORE1_A53 0x40 2081136819SBai Ping #define IMR1_CORE2_A53 0x1C0 2181136819SBai Ping #define IMR1_CORE3_A53 0x1D0 2281136819SBai Ping #define IMR1_CORE0_M4 0x50 2381136819SBai Ping #define SLT0_CFG 0xB0 2481136819SBai Ping #define GPC_PU_PWRHSK 0x1FC 2581136819SBai Ping #define PGC_CPU_0_1_MAPPING 0xEC 2681136819SBai Ping #define CPU_PGC_UP_TRG 0xF0 2781136819SBai Ping #define PU_PGC_UP_TRG 0xF8 2881136819SBai Ping #define CPU_PGC_DN_TRG 0xFC 2981136819SBai Ping #define PU_PGC_DN_TRG 0x104 3081136819SBai Ping #define A53_CORE0_PGC 0x800 3181136819SBai Ping #define A53_PLAT_PGC 0x900 32*e8837b0aSJacky Bai #define PLAT_PGC_PCR 0x900 3381136819SBai Ping #define PGC_SCU_TIMING 0x910 3481136819SBai Ping 3581136819SBai Ping #define MASK_DSM_TRIGGER_A53 BIT(31) 3681136819SBai Ping #define IRQ_SRC_A53_WUP BIT(30) 37*e8837b0aSJacky Bai #define IRQ_SRC_A53_WUP_SHIFT 30 3881136819SBai Ping #define IRQ_SRC_C1 BIT(29) 3981136819SBai Ping #define IRQ_SRC_C0 BIT(28) 4081136819SBai Ping #define IRQ_SRC_C3 BIT(23) 4181136819SBai Ping #define IRQ_SRC_C2 BIT(22) 4281136819SBai Ping #define CPU_CLOCK_ON_LPM BIT(14) 43*e8837b0aSJacky Bai #define A53_CLK_ON_LPM BIT(14) 4481136819SBai Ping #define MASTER0_LPM_HSK BIT(6) 4581136819SBai Ping 4681136819SBai Ping #define L2PGE BIT(31) 4781136819SBai Ping #define EN_L2_WFI_PDN BIT(5) 4881136819SBai Ping #define EN_PLAT_PDN BIT(4) 4981136819SBai Ping 5081136819SBai Ping #define SLPCR_EN_DSM BIT(31) 5181136819SBai Ping #define SLPCR_RBC_EN BIT(30) 5281136819SBai Ping #define SLPCR_A53_FASTWUP_STOP_MODE BIT(17) 5381136819SBai Ping #define SLPCR_A53_FASTWUP_WAIT_MODE BIT(16) 5481136819SBai Ping #define SLPCR_VSTBY BIT(2) 5581136819SBai Ping #define SLPCR_SBYOS BIT(1) 5681136819SBai Ping #define SLPCR_BYPASS_PMIC_READY BIT(0) 5781136819SBai Ping #define SLPCR_RBC_COUNT_SHIFT 24 58*e8837b0aSJacky Bai #define SLPCR_STBY_COUNT_SHFT 3 5981136819SBai Ping 6081136819SBai Ping #define A53_DUMMY_PDN_ACK BIT(15) 6181136819SBai Ping #define A53_DUMMY_PUP_ACK BIT(31) 6281136819SBai Ping #define A53_PLAT_PDN_ACK BIT(2) 6381136819SBai Ping #define A53_PLAT_PUP_ACK BIT(18) 6481136819SBai Ping 65*e8837b0aSJacky Bai #define PLAT_PUP_SLT_CTRL BIT(9) 66*e8837b0aSJacky Bai #define PLAT_PDN_SLT_CTRL BIT(8) 67*e8837b0aSJacky Bai 6881136819SBai Ping #define SLT_PLAT_PDN BIT(8) 6981136819SBai Ping #define SLT_PLAT_PUP BIT(9) 7081136819SBai Ping 7181136819SBai Ping /* helper macro */ 7281136819SBai Ping #define A53_LPM_MASK U(0xF) 7381136819SBai Ping #define A53_LPM_WAIT U(0x5) 7481136819SBai Ping #define A53_LPM_STOP U(0xA) 75*e8837b0aSJacky Bai #define LPM_MODE(local_state) ((local_state) == PLAT_WAIT_RET_STATE ? A53_LPM_WAIT : A53_LPM_STOP) 7681136819SBai Ping 7781136819SBai Ping #define DSM_MODE_MASK BIT(31) 7881136819SBai Ping 7981136819SBai Ping #define A53_CORE_WUP_SRC(core_id) (1 << ((core_id) < 2 ? 28 + (core_id) : 22 + (core_id) - 2)) 8081136819SBai Ping #define COREx_PGC_PCR(core_id) (0x800 + (core_id) * 0x40) 8181136819SBai Ping #define COREx_WFI_PDN(core_id) (1 << ((core_id) < 2 ? (core_id) * 2 : ((core_id) - 2) * 2 + 16)) 8281136819SBai Ping #define COREx_IRQ_WUP(core_id) ((core_id) < 2 ? (1 << ((core_id) * 2 + 8)) : (1 << ((core_id) * 2 + 20))) 8381136819SBai Ping #define COREx_LPM_PUP(core_id) ((core_id) < 2 ? (1 << ((core_id) * 2 + 9)) : (1 << ((core_id) * 2 + 21))) 8481136819SBai Ping #define SLTx_CFG(n) ((SLT0_CFG + ((n) * 4))) 8581136819SBai Ping #define SLT_COREx_PUP(core_id) (0x2 << ((core_id) * 2)) 8681136819SBai Ping 87*e8837b0aSJacky Bai #define IRQ_IMR_NUM 4 88*e8837b0aSJacky Bai #define IMR_MASK_ALL 0xffffffff 89*e8837b0aSJacky Bai 9081136819SBai Ping /* function declare */ 9181136819SBai Ping void imx_gpc_init(void); 9281136819SBai Ping void imx_set_cpu_secure_entry(unsigned int core_index, uintptr_t sec_entrypoint); 9381136819SBai Ping void imx_set_cpu_pwr_off(unsigned int core_index); 9481136819SBai Ping void imx_set_cpu_pwr_on(unsigned int core_index); 9581136819SBai Ping void imx_set_cpu_lpm(unsigned int core_index, bool pdn); 9681136819SBai Ping void imx_set_cluster_standby(bool retention); 9781136819SBai Ping void imx_set_cluster_powerdown(unsigned int last_core, uint8_t power_state); 98*e8837b0aSJacky Bai void imx_noc_slot_config(bool pdn); 99*e8837b0aSJacky Bai void imx_set_sys_wakeup(unsigned int last_core, bool pdn); 100*e8837b0aSJacky Bai void imx_set_sys_lpm(unsigned last_core, bool retention); 10181136819SBai Ping void imx_set_rbc_count(void); 10281136819SBai Ping void imx_clear_rbc_count(void); 10381136819SBai Ping 10481136819SBai Ping #endif /*IMX8M_GPC_H */ 105