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