1*560293bbSAntonio Nino Diaz /* 2*560293bbSAntonio Nino Diaz * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. 3*560293bbSAntonio Nino Diaz * 4*560293bbSAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause 5*560293bbSAntonio Nino Diaz */ 6*560293bbSAntonio Nino Diaz 7*560293bbSAntonio Nino Diaz #include <drivers/arm/fvp/fvp_pwrc.h> 8*560293bbSAntonio Nino Diaz #include <lib/bakery_lock.h> 9*560293bbSAntonio Nino Diaz #include <lib/mmio.h> 10*560293bbSAntonio Nino Diaz #include <plat/arm/common/plat_arm.h> 11*560293bbSAntonio Nino Diaz #include <platform_def.h> 12*560293bbSAntonio Nino Diaz 13*560293bbSAntonio Nino Diaz /* 14*560293bbSAntonio Nino Diaz * TODO: Someday there will be a generic power controller api. At the moment 15*560293bbSAntonio Nino Diaz * each platform has its own pwrc so just exporting functions is fine. 16*560293bbSAntonio Nino Diaz */ 17*560293bbSAntonio Nino Diaz ARM_INSTANTIATE_LOCK; 18*560293bbSAntonio Nino Diaz 19*560293bbSAntonio Nino Diaz unsigned int fvp_pwrc_get_cpu_wkr(u_register_t mpidr) 20*560293bbSAntonio Nino Diaz { 21*560293bbSAntonio Nino Diaz return PSYSR_WK(fvp_pwrc_read_psysr(mpidr)); 22*560293bbSAntonio Nino Diaz } 23*560293bbSAntonio Nino Diaz 24*560293bbSAntonio Nino Diaz unsigned int fvp_pwrc_read_psysr(u_register_t mpidr) 25*560293bbSAntonio Nino Diaz { 26*560293bbSAntonio Nino Diaz unsigned int rc; 27*560293bbSAntonio Nino Diaz arm_lock_get(); 28*560293bbSAntonio Nino Diaz mmio_write_32(PWRC_BASE + PSYSR_OFF, (unsigned int) mpidr); 29*560293bbSAntonio Nino Diaz rc = mmio_read_32(PWRC_BASE + PSYSR_OFF); 30*560293bbSAntonio Nino Diaz arm_lock_release(); 31*560293bbSAntonio Nino Diaz return rc; 32*560293bbSAntonio Nino Diaz } 33*560293bbSAntonio Nino Diaz 34*560293bbSAntonio Nino Diaz void fvp_pwrc_write_pponr(u_register_t mpidr) 35*560293bbSAntonio Nino Diaz { 36*560293bbSAntonio Nino Diaz arm_lock_get(); 37*560293bbSAntonio Nino Diaz mmio_write_32(PWRC_BASE + PPONR_OFF, (unsigned int) mpidr); 38*560293bbSAntonio Nino Diaz arm_lock_release(); 39*560293bbSAntonio Nino Diaz } 40*560293bbSAntonio Nino Diaz 41*560293bbSAntonio Nino Diaz void fvp_pwrc_write_ppoffr(u_register_t mpidr) 42*560293bbSAntonio Nino Diaz { 43*560293bbSAntonio Nino Diaz arm_lock_get(); 44*560293bbSAntonio Nino Diaz mmio_write_32(PWRC_BASE + PPOFFR_OFF, (unsigned int) mpidr); 45*560293bbSAntonio Nino Diaz arm_lock_release(); 46*560293bbSAntonio Nino Diaz } 47*560293bbSAntonio Nino Diaz 48*560293bbSAntonio Nino Diaz void fvp_pwrc_set_wen(u_register_t mpidr) 49*560293bbSAntonio Nino Diaz { 50*560293bbSAntonio Nino Diaz arm_lock_get(); 51*560293bbSAntonio Nino Diaz mmio_write_32(PWRC_BASE + PWKUPR_OFF, 52*560293bbSAntonio Nino Diaz (unsigned int) (PWKUPR_WEN | mpidr)); 53*560293bbSAntonio Nino Diaz arm_lock_release(); 54*560293bbSAntonio Nino Diaz } 55*560293bbSAntonio Nino Diaz 56*560293bbSAntonio Nino Diaz void fvp_pwrc_clr_wen(u_register_t mpidr) 57*560293bbSAntonio Nino Diaz { 58*560293bbSAntonio Nino Diaz arm_lock_get(); 59*560293bbSAntonio Nino Diaz mmio_write_32(PWRC_BASE + PWKUPR_OFF, 60*560293bbSAntonio Nino Diaz (unsigned int) mpidr); 61*560293bbSAntonio Nino Diaz arm_lock_release(); 62*560293bbSAntonio Nino Diaz } 63*560293bbSAntonio Nino Diaz 64*560293bbSAntonio Nino Diaz void fvp_pwrc_write_pcoffr(u_register_t mpidr) 65*560293bbSAntonio Nino Diaz { 66*560293bbSAntonio Nino Diaz arm_lock_get(); 67*560293bbSAntonio Nino Diaz mmio_write_32(PWRC_BASE + PCOFFR_OFF, (unsigned int) mpidr); 68*560293bbSAntonio Nino Diaz arm_lock_release(); 69*560293bbSAntonio Nino Diaz } 70*560293bbSAntonio Nino Diaz 71*560293bbSAntonio Nino Diaz /* Nothing else to do here apart from initializing the lock */ 72*560293bbSAntonio Nino Diaz void __init plat_arm_pwrc_setup(void) 73*560293bbSAntonio Nino Diaz { 74*560293bbSAntonio Nino Diaz arm_lock_init(); 75*560293bbSAntonio Nino Diaz } 76*560293bbSAntonio Nino Diaz 77*560293bbSAntonio Nino Diaz 78*560293bbSAntonio Nino Diaz 79