1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * CPPC (Collaborative Processor Performance Control) methods used 4 * by CPUfreq drivers. 5 * 6 * (C) Copyright 2014, 2015 Linaro Ltd. 7 * Author: Ashwin Chaugule <ashwin.chaugule@linaro.org> 8 */ 9 10#ifndef _CPPC_ACPI_H 11#define _CPPC_ACPI_H 12 13#include <linux/acpi.h> 14#include <linux/cpufreq.h> 15#include <linux/types.h> 16 17#include <acpi/pcc.h> 18#include <acpi/processor.h> 19 20/* CPPCv2 and CPPCv3 support */ 21#define CPPC_V2_REV 2 22#define CPPC_V3_REV 3 23#define CPPC_V2_NUM_ENT 21 24#define CPPC_V3_NUM_ENT 23 25 26#define PCC_CMD_COMPLETE_MASK (1 << 0) 27#define PCC_ERROR_MASK (1 << 2) 28 29#define MAX_CPC_REG_ENT 21 30 31/* CPPC specific PCC commands. */ 32#define CMD_READ 0 33#define CMD_WRITE 1 34 35/* Each register has the folowing format. */ 36struct cpc_reg { 37 u8 descriptor; 38 u16 length; 39 u8 space_id; 40 u8 bit_width; 41 u8 bit_offset; 42 u8 access_width; 43 u64 address; 44} __packed; 45 46/* 47 * Each entry in the CPC table is either 48 * of type ACPI_TYPE_BUFFER or 49 * ACPI_TYPE_INTEGER. 50 */ 51struct cpc_register_resource { 52 acpi_object_type type; 53 u64 __iomem *sys_mem_vaddr; 54 union { 55 struct cpc_reg reg; 56 u64 int_value; 57 } cpc_entry; 58}; 59 60/* Container to hold the CPC details for each CPU */ 61struct cpc_desc { 62 int num_entries; 63 int version; 64 int cpu_id; 65 int write_cmd_status; 66 int write_cmd_id; 67 struct cpc_register_resource cpc_regs[MAX_CPC_REG_ENT]; 68 struct acpi_psd_package domain_info; 69 struct kobject kobj; 70}; 71 72/* These are indexes into the per-cpu cpc_regs[]. Order is important. */ 73enum cppc_regs { 74 HIGHEST_PERF, 75 NOMINAL_PERF, 76 LOW_NON_LINEAR_PERF, 77 LOWEST_PERF, 78 GUARANTEED_PERF, 79 DESIRED_PERF, 80 MIN_PERF, 81 MAX_PERF, 82 PERF_REDUC_TOLERANCE, 83 TIME_WINDOW, 84 CTR_WRAP_TIME, 85 REFERENCE_CTR, 86 DELIVERED_CTR, 87 PERF_LIMITED, 88 ENABLE, 89 AUTO_SEL_ENABLE, 90 AUTO_ACT_WINDOW, 91 ENERGY_PERF, 92 REFERENCE_PERF, 93 LOWEST_FREQ, 94 NOMINAL_FREQ, 95}; 96 97/* 98 * Categorization of registers as described 99 * in the ACPI v.5.1 spec. 100 * XXX: Only filling up ones which are used by governors 101 * today. 102 */ 103struct cppc_perf_caps { 104 u32 guaranteed_perf; 105 u32 highest_perf; 106 u32 nominal_perf; 107 u32 lowest_perf; 108 u32 lowest_nonlinear_perf; 109 u32 lowest_freq; 110 u32 nominal_freq; 111 u32 energy_perf; 112 bool auto_sel; 113}; 114 115struct cppc_perf_ctrls { 116 u32 max_perf; 117 u32 min_perf; 118 u32 desired_perf; 119 u32 energy_perf; 120}; 121 122struct cppc_perf_fb_ctrs { 123 u64 reference; 124 u64 delivered; 125 u64 reference_perf; 126 u64 wraparound_time; 127}; 128 129/* Per CPU container for runtime CPPC management. */ 130struct cppc_cpudata { 131 struct list_head node; 132 struct cppc_perf_caps perf_caps; 133 struct cppc_perf_ctrls perf_ctrls; 134 struct cppc_perf_fb_ctrs perf_fb_ctrs; 135 unsigned int shared_type; 136 cpumask_var_t shared_cpu_map; 137}; 138 139#ifdef CONFIG_ACPI_CPPC_LIB 140extern int cppc_get_desired_perf(int cpunum, u64 *desired_perf); 141extern int cppc_get_nominal_perf(int cpunum, u64 *nominal_perf); 142extern int cppc_get_highest_perf(int cpunum, u64 *highest_perf); 143extern int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs *perf_fb_ctrs); 144extern int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls); 145extern int cppc_set_enable(int cpu, bool enable); 146extern int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps); 147extern bool cppc_perf_ctrs_in_pcc(void); 148extern unsigned int cppc_perf_to_khz(struct cppc_perf_caps *caps, unsigned int perf); 149extern unsigned int cppc_khz_to_perf(struct cppc_perf_caps *caps, unsigned int freq); 150extern bool acpi_cpc_valid(void); 151extern bool cppc_allow_fast_switch(void); 152extern int acpi_get_psd_map(unsigned int cpu, struct cppc_cpudata *cpu_data); 153extern unsigned int cppc_get_transition_latency(int cpu); 154extern bool cpc_ffh_supported(void); 155extern bool cpc_supported_by_cpu(void); 156extern int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val); 157extern int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val); 158extern int cppc_get_epp_perf(int cpunum, u64 *epp_perf); 159extern int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable); 160extern int cppc_get_auto_sel_caps(int cpunum, struct cppc_perf_caps *perf_caps); 161extern int cppc_set_auto_sel(int cpu, bool enable); 162#else /* !CONFIG_ACPI_CPPC_LIB */ 163static inline int cppc_get_desired_perf(int cpunum, u64 *desired_perf) 164{ 165 return -ENOTSUPP; 166} 167static inline int cppc_get_nominal_perf(int cpunum, u64 *nominal_perf) 168{ 169 return -ENOTSUPP; 170} 171static inline int cppc_get_highest_perf(int cpunum, u64 *highest_perf) 172{ 173 return -ENOTSUPP; 174} 175static inline int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs *perf_fb_ctrs) 176{ 177 return -ENOTSUPP; 178} 179static inline int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls) 180{ 181 return -ENOTSUPP; 182} 183static inline int cppc_set_enable(int cpu, bool enable) 184{ 185 return -ENOTSUPP; 186} 187static inline int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps) 188{ 189 return -ENOTSUPP; 190} 191static inline bool cppc_perf_ctrs_in_pcc(void) 192{ 193 return false; 194} 195static inline bool acpi_cpc_valid(void) 196{ 197 return false; 198} 199static inline bool cppc_allow_fast_switch(void) 200{ 201 return false; 202} 203static inline unsigned int cppc_get_transition_latency(int cpu) 204{ 205 return CPUFREQ_ETERNAL; 206} 207static inline bool cpc_ffh_supported(void) 208{ 209 return false; 210} 211static inline int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val) 212{ 213 return -ENOTSUPP; 214} 215static inline int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val) 216{ 217 return -ENOTSUPP; 218} 219static inline int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable) 220{ 221 return -ENOTSUPP; 222} 223static inline int cppc_get_epp_perf(int cpunum, u64 *epp_perf) 224{ 225 return -ENOTSUPP; 226} 227static inline int cppc_set_auto_sel(int cpu, bool enable) 228{ 229 return -ENOTSUPP; 230} 231static inline int cppc_get_auto_sel_caps(int cpunum, struct cppc_perf_caps *perf_caps) 232{ 233 return -ENOTSUPP; 234} 235#endif /* !CONFIG_ACPI_CPPC_LIB */ 236 237#endif /* _CPPC_ACPI_H*/ 238