1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2019, MediaTek Inc. All rights reserved. 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park #include <arch.h> 8*54fd6939SJiyong Park #include <lib/bakery_lock.h> 9*54fd6939SJiyong Park #include <drivers/console.h> 10*54fd6939SJiyong Park #include <common/debug.h> 11*54fd6939SJiyong Park #include <lib/mmio.h> 12*54fd6939SJiyong Park #include <plat_dcm.h> 13*54fd6939SJiyong Park #include <plat_private.h> 14*54fd6939SJiyong Park #include <plat_dcm.h> 15*54fd6939SJiyong Park #include <plat/common/platform.h> 16*54fd6939SJiyong Park #include <platform_def.h> 17*54fd6939SJiyong Park #include <mtk_plat_common.h> 18*54fd6939SJiyong Park 19*54fd6939SJiyong Park #define PWR_STATUS (SPM_BASE + 0x180) 20*54fd6939SJiyong Park 21*54fd6939SJiyong Park uint64_t plat_dcm_mcsi_a_addr; 22*54fd6939SJiyong Park uint32_t plat_dcm_mcsi_a_val; 23*54fd6939SJiyong Park static int plat_dcm_init_type; 24*54fd6939SJiyong Park static unsigned int dcm_big_core_cnt; 25*54fd6939SJiyong Park int plat_dcm_initiated; 26*54fd6939SJiyong Park 27*54fd6939SJiyong Park #define PWR_STA_BIG_MP_MASK (0x1 << 15) 28*54fd6939SJiyong Park 29*54fd6939SJiyong Park DEFINE_BAKERY_LOCK(dcm_lock); 30*54fd6939SJiyong Park dcm_lock_init(void)31*54fd6939SJiyong Parkvoid dcm_lock_init(void) 32*54fd6939SJiyong Park { 33*54fd6939SJiyong Park bakery_lock_init(&dcm_lock); 34*54fd6939SJiyong Park } 35*54fd6939SJiyong Park dcm_lock_get(void)36*54fd6939SJiyong Parkvoid dcm_lock_get(void) 37*54fd6939SJiyong Park { 38*54fd6939SJiyong Park bakery_lock_get(&dcm_lock); 39*54fd6939SJiyong Park } 40*54fd6939SJiyong Park dcm_lock_release(void)41*54fd6939SJiyong Parkvoid dcm_lock_release(void) 42*54fd6939SJiyong Park { 43*54fd6939SJiyong Park bakery_lock_release(&dcm_lock); 44*54fd6939SJiyong Park } 45*54fd6939SJiyong Park plat_dcm_mcsi_a_backup(void)46*54fd6939SJiyong Parkvoid plat_dcm_mcsi_a_backup(void) 47*54fd6939SJiyong Park { 48*54fd6939SJiyong Park } 49*54fd6939SJiyong Park plat_dcm_mcsi_a_restore(void)50*54fd6939SJiyong Parkvoid plat_dcm_mcsi_a_restore(void) 51*54fd6939SJiyong Park { 52*54fd6939SJiyong Park } 53*54fd6939SJiyong Park plat_dcm_rgu_enable(void)54*54fd6939SJiyong Parkvoid plat_dcm_rgu_enable(void) 55*54fd6939SJiyong Park { 56*54fd6939SJiyong Park } 57*54fd6939SJiyong Park plat_dcm_big_core_sync(short on)58*54fd6939SJiyong Parkvoid plat_dcm_big_core_sync(short on) 59*54fd6939SJiyong Park { 60*54fd6939SJiyong Park /* Check if Big cluster power is existed */ 61*54fd6939SJiyong Park if (!(mmio_read_32(PWR_STATUS) & PWR_STA_BIG_MP_MASK)) 62*54fd6939SJiyong Park return; 63*54fd6939SJiyong Park 64*54fd6939SJiyong Park if (on) { 65*54fd6939SJiyong Park mmio_write_32(MP2_SYNC_DCM, 66*54fd6939SJiyong Park (mmio_read_32(MP2_SYNC_DCM) & ~MP2_SYNC_DCM_MASK) 67*54fd6939SJiyong Park | MP2_SYNC_DCM_ON); 68*54fd6939SJiyong Park dcm_big_core_cnt++; 69*54fd6939SJiyong Park } else 70*54fd6939SJiyong Park mmio_write_32(MP2_SYNC_DCM, 71*54fd6939SJiyong Park (mmio_read_32(MP2_SYNC_DCM) & ~MP2_SYNC_DCM_MASK) 72*54fd6939SJiyong Park | MP2_SYNC_DCM_OFF); 73*54fd6939SJiyong Park } 74*54fd6939SJiyong Park plat_dcm_restore_cluster_on(unsigned long mpidr)75*54fd6939SJiyong Parkvoid plat_dcm_restore_cluster_on(unsigned long mpidr) 76*54fd6939SJiyong Park { 77*54fd6939SJiyong Park unsigned long cluster_id = 78*54fd6939SJiyong Park (mpidr & MPIDR_CLUSTER_MASK) >> MPIDR_AFFINITY_BITS; 79*54fd6939SJiyong Park 80*54fd6939SJiyong Park switch (cluster_id) { 81*54fd6939SJiyong Park case 0x1: 82*54fd6939SJiyong Park dcm_lock_get(); 83*54fd6939SJiyong Park if (plat_dcm_init_type & BIG_CORE_DCM_TYPE) 84*54fd6939SJiyong Park plat_dcm_big_core_sync(1); 85*54fd6939SJiyong Park else 86*54fd6939SJiyong Park plat_dcm_big_core_sync(0); 87*54fd6939SJiyong Park dcm_lock_release(); 88*54fd6939SJiyong Park break; 89*54fd6939SJiyong Park default: 90*54fd6939SJiyong Park break; 91*54fd6939SJiyong Park } 92*54fd6939SJiyong Park } 93*54fd6939SJiyong Park plat_dcm_msg_handler(uint64_t x1)94*54fd6939SJiyong Parkvoid plat_dcm_msg_handler(uint64_t x1) 95*54fd6939SJiyong Park { 96*54fd6939SJiyong Park plat_dcm_init_type = x1 & ALL_DCM_TYPE; 97*54fd6939SJiyong Park } 98*54fd6939SJiyong Park plat_dcm_get_enabled_cnt(uint64_t type)99*54fd6939SJiyong Parkunsigned long plat_dcm_get_enabled_cnt(uint64_t type) 100*54fd6939SJiyong Park { 101*54fd6939SJiyong Park switch (type) { 102*54fd6939SJiyong Park case BIG_CORE_DCM_TYPE: 103*54fd6939SJiyong Park return dcm_big_core_cnt; 104*54fd6939SJiyong Park default: 105*54fd6939SJiyong Park return 0; 106*54fd6939SJiyong Park } 107*54fd6939SJiyong Park } 108*54fd6939SJiyong Park plat_dcm_init(void)109*54fd6939SJiyong Parkvoid plat_dcm_init(void) 110*54fd6939SJiyong Park { 111*54fd6939SJiyong Park dcm_lock_init(); 112*54fd6939SJiyong Park } 113