18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * CPPC (Collaborative Processor Performance Control) methods used 48c2ecf20Sopenharmony_ci * by CPUfreq drivers. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * (C) Copyright 2014, 2015 Linaro Ltd. 78c2ecf20Sopenharmony_ci * Author: Ashwin Chaugule <ashwin.chaugule@linaro.org> 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#ifndef _CPPC_ACPI_H 118c2ecf20Sopenharmony_ci#define _CPPC_ACPI_H 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <linux/acpi.h> 148c2ecf20Sopenharmony_ci#include <linux/types.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include <acpi/pcc.h> 178c2ecf20Sopenharmony_ci#include <acpi/processor.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci/* CPPCv2 and CPPCv3 support */ 208c2ecf20Sopenharmony_ci#define CPPC_V2_REV 2 218c2ecf20Sopenharmony_ci#define CPPC_V3_REV 3 228c2ecf20Sopenharmony_ci#define CPPC_V2_NUM_ENT 21 238c2ecf20Sopenharmony_ci#define CPPC_V3_NUM_ENT 23 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#define PCC_CMD_COMPLETE_MASK (1 << 0) 268c2ecf20Sopenharmony_ci#define PCC_ERROR_MASK (1 << 2) 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#define MAX_CPC_REG_ENT 21 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci/* CPPC specific PCC commands. */ 318c2ecf20Sopenharmony_ci#define CMD_READ 0 328c2ecf20Sopenharmony_ci#define CMD_WRITE 1 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci/* Each register has the folowing format. */ 358c2ecf20Sopenharmony_cistruct cpc_reg { 368c2ecf20Sopenharmony_ci u8 descriptor; 378c2ecf20Sopenharmony_ci u16 length; 388c2ecf20Sopenharmony_ci u8 space_id; 398c2ecf20Sopenharmony_ci u8 bit_width; 408c2ecf20Sopenharmony_ci u8 bit_offset; 418c2ecf20Sopenharmony_ci u8 access_width; 428c2ecf20Sopenharmony_ci u64 __iomem address; 438c2ecf20Sopenharmony_ci} __packed; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci/* 468c2ecf20Sopenharmony_ci * Each entry in the CPC table is either 478c2ecf20Sopenharmony_ci * of type ACPI_TYPE_BUFFER or 488c2ecf20Sopenharmony_ci * ACPI_TYPE_INTEGER. 498c2ecf20Sopenharmony_ci */ 508c2ecf20Sopenharmony_cistruct cpc_register_resource { 518c2ecf20Sopenharmony_ci acpi_object_type type; 528c2ecf20Sopenharmony_ci u64 __iomem *sys_mem_vaddr; 538c2ecf20Sopenharmony_ci union { 548c2ecf20Sopenharmony_ci struct cpc_reg reg; 558c2ecf20Sopenharmony_ci u64 int_value; 568c2ecf20Sopenharmony_ci } cpc_entry; 578c2ecf20Sopenharmony_ci}; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci/* Container to hold the CPC details for each CPU */ 608c2ecf20Sopenharmony_cistruct cpc_desc { 618c2ecf20Sopenharmony_ci int num_entries; 628c2ecf20Sopenharmony_ci int version; 638c2ecf20Sopenharmony_ci int cpu_id; 648c2ecf20Sopenharmony_ci int write_cmd_status; 658c2ecf20Sopenharmony_ci int write_cmd_id; 668c2ecf20Sopenharmony_ci struct cpc_register_resource cpc_regs[MAX_CPC_REG_ENT]; 678c2ecf20Sopenharmony_ci struct acpi_psd_package domain_info; 688c2ecf20Sopenharmony_ci struct kobject kobj; 698c2ecf20Sopenharmony_ci}; 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci/* These are indexes into the per-cpu cpc_regs[]. Order is important. */ 728c2ecf20Sopenharmony_cienum cppc_regs { 738c2ecf20Sopenharmony_ci HIGHEST_PERF, 748c2ecf20Sopenharmony_ci NOMINAL_PERF, 758c2ecf20Sopenharmony_ci LOW_NON_LINEAR_PERF, 768c2ecf20Sopenharmony_ci LOWEST_PERF, 778c2ecf20Sopenharmony_ci GUARANTEED_PERF, 788c2ecf20Sopenharmony_ci DESIRED_PERF, 798c2ecf20Sopenharmony_ci MIN_PERF, 808c2ecf20Sopenharmony_ci MAX_PERF, 818c2ecf20Sopenharmony_ci PERF_REDUC_TOLERANCE, 828c2ecf20Sopenharmony_ci TIME_WINDOW, 838c2ecf20Sopenharmony_ci CTR_WRAP_TIME, 848c2ecf20Sopenharmony_ci REFERENCE_CTR, 858c2ecf20Sopenharmony_ci DELIVERED_CTR, 868c2ecf20Sopenharmony_ci PERF_LIMITED, 878c2ecf20Sopenharmony_ci ENABLE, 888c2ecf20Sopenharmony_ci AUTO_SEL_ENABLE, 898c2ecf20Sopenharmony_ci AUTO_ACT_WINDOW, 908c2ecf20Sopenharmony_ci ENERGY_PERF, 918c2ecf20Sopenharmony_ci REFERENCE_PERF, 928c2ecf20Sopenharmony_ci LOWEST_FREQ, 938c2ecf20Sopenharmony_ci NOMINAL_FREQ, 948c2ecf20Sopenharmony_ci}; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci/* 978c2ecf20Sopenharmony_ci * Categorization of registers as described 988c2ecf20Sopenharmony_ci * in the ACPI v.5.1 spec. 998c2ecf20Sopenharmony_ci * XXX: Only filling up ones which are used by governors 1008c2ecf20Sopenharmony_ci * today. 1018c2ecf20Sopenharmony_ci */ 1028c2ecf20Sopenharmony_cistruct cppc_perf_caps { 1038c2ecf20Sopenharmony_ci u32 guaranteed_perf; 1048c2ecf20Sopenharmony_ci u32 highest_perf; 1058c2ecf20Sopenharmony_ci u32 nominal_perf; 1068c2ecf20Sopenharmony_ci u32 lowest_perf; 1078c2ecf20Sopenharmony_ci u32 lowest_nonlinear_perf; 1088c2ecf20Sopenharmony_ci u32 lowest_freq; 1098c2ecf20Sopenharmony_ci u32 nominal_freq; 1108c2ecf20Sopenharmony_ci}; 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_cistruct cppc_perf_ctrls { 1138c2ecf20Sopenharmony_ci u32 max_perf; 1148c2ecf20Sopenharmony_ci u32 min_perf; 1158c2ecf20Sopenharmony_ci u32 desired_perf; 1168c2ecf20Sopenharmony_ci}; 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_cistruct cppc_perf_fb_ctrs { 1198c2ecf20Sopenharmony_ci u64 reference; 1208c2ecf20Sopenharmony_ci u64 delivered; 1218c2ecf20Sopenharmony_ci u64 reference_perf; 1228c2ecf20Sopenharmony_ci u64 wraparound_time; 1238c2ecf20Sopenharmony_ci}; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci/* Per CPU container for runtime CPPC management. */ 1268c2ecf20Sopenharmony_cistruct cppc_cpudata { 1278c2ecf20Sopenharmony_ci int cpu; 1288c2ecf20Sopenharmony_ci struct cppc_perf_caps perf_caps; 1298c2ecf20Sopenharmony_ci struct cppc_perf_ctrls perf_ctrls; 1308c2ecf20Sopenharmony_ci struct cppc_perf_fb_ctrs perf_fb_ctrs; 1318c2ecf20Sopenharmony_ci struct cpufreq_policy *cur_policy; 1328c2ecf20Sopenharmony_ci unsigned int shared_type; 1338c2ecf20Sopenharmony_ci cpumask_var_t shared_cpu_map; 1348c2ecf20Sopenharmony_ci}; 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ciextern int cppc_get_desired_perf(int cpunum, u64 *desired_perf); 1378c2ecf20Sopenharmony_ciextern int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs *perf_fb_ctrs); 1388c2ecf20Sopenharmony_ciextern int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls); 1398c2ecf20Sopenharmony_ciextern int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps); 1408c2ecf20Sopenharmony_ciextern int acpi_get_psd_map(struct cppc_cpudata **); 1418c2ecf20Sopenharmony_ciextern unsigned int cppc_get_transition_latency(int cpu); 1428c2ecf20Sopenharmony_ciextern bool cpc_ffh_supported(void); 1438c2ecf20Sopenharmony_ciextern int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val); 1448c2ecf20Sopenharmony_ciextern int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val); 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci#endif /* _CPPC_ACPI_H*/ 147