#include "pwrcal-env.h" #include "pmucal_system.h" #include "pmucal_powermode.h" #include "pmucal_rae.h" #define read_mpidr() ({ \ u64 __val; \ asm("mrs %0, mpidr_el1" : "=r" (__val)); \ __val; \ }) static inline unsigned int linear_phycpu(unsigned int mpidr) { unsigned int lvl = 0; lvl = (mpidr & MPIDR_MT_BITMASK) ? 1 : 0; return ((MPIDR_AFFINITY_LEVEL(mpidr, (1 + lvl)) << 2) | MPIDR_AFFINITY_LEVEL(mpidr, lvl)); } void pmucal_powermode_hint(unsigned int mode) { unsigned int mpidr = read_mpidr(); unsigned int phycpu = linear_phycpu(mpidr); __raw_writel(mode, pmucal_cpuinform_list[phycpu].base_va + pmucal_cpuinform_list[phycpu].offset); } void pmucal_powermode_hint_clear(void) { unsigned int mpidr = read_mpidr(); unsigned int phycpu = linear_phycpu(mpidr); __raw_writel(0, pmucal_cpuinform_list[phycpu].base_va + pmucal_cpuinform_list[phycpu].offset); } int __init pmucal_cpuinform_init(void) { int i, j; for (i = 0; i < cpu_inform_list_size; i++) { for (j = 0; j < pmucal_p2v_list_size; j++) if (pmucal_p2v_list[j].pa == (phys_addr_t)pmucal_cpuinform_list[i].base_pa) break; if (j != pmucal_p2v_list_size) { pmucal_cpuinform_list[i].base_va = pmucal_p2v_list[j].va; } else { pr_err("%s %s: there is no such PA in p2v_list (idx:%d)\n", PMUCAL_PREFIX, __func__, i); return -ENOENT; } } return 0; }