linux/include/acpi/cppc_acpi.h
<<
>>
Prefs
   1/*
   2 * CPPC (Collaborative Processor Performance Control) methods used
   3 * by CPUfreq drivers.
   4 *
   5 * (C) Copyright 2014, 2015 Linaro Ltd.
   6 * Author: Ashwin Chaugule <ashwin.chaugule@linaro.org>
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License
  10 * as published by the Free Software Foundation; version 2
  11 * of the License.
  12 */
  13
  14#ifndef _CPPC_ACPI_H
  15#define _CPPC_ACPI_H
  16
  17#include <linux/acpi.h>
  18#include <linux/types.h>
  19
  20#include <acpi/pcc.h>
  21#include <acpi/processor.h>
  22
  23/* Support CPPCv2 and CPPCv3  */
  24#define CPPC_V2_REV     2
  25#define CPPC_V3_REV     3
  26#define CPPC_V2_NUM_ENT 21
  27#define CPPC_V3_NUM_ENT 23
  28
  29#define PCC_CMD_COMPLETE_MASK   (1 << 0)
  30#define PCC_ERROR_MASK          (1 << 2)
  31
  32#define MAX_CPC_REG_ENT 21
  33
  34/* CPPC specific PCC commands. */
  35#define CMD_READ 0
  36#define CMD_WRITE 1
  37
  38/* Each register has the folowing format. */
  39struct cpc_reg {
  40        u8 descriptor;
  41        u16 length;
  42        u8 space_id;
  43        u8 bit_width;
  44        u8 bit_offset;
  45        u8 access_width;
  46        u64 __iomem address;
  47} __packed;
  48
  49/*
  50 * Each entry in the CPC table is either
  51 * of type ACPI_TYPE_BUFFER or
  52 * ACPI_TYPE_INTEGER.
  53 */
  54struct cpc_register_resource {
  55        acpi_object_type type;
  56        u64 __iomem *sys_mem_vaddr;
  57        union {
  58                struct cpc_reg reg;
  59                u64 int_value;
  60        } cpc_entry;
  61};
  62
  63/* Container to hold the CPC details for each CPU */
  64struct cpc_desc {
  65        int num_entries;
  66        int version;
  67        int cpu_id;
  68        int write_cmd_status;
  69        int write_cmd_id;
  70        struct cpc_register_resource cpc_regs[MAX_CPC_REG_ENT];
  71        struct acpi_psd_package domain_info;
  72        struct kobject kobj;
  73};
  74
  75/* These are indexes into the per-cpu cpc_regs[]. Order is important. */
  76enum cppc_regs {
  77        HIGHEST_PERF,
  78        NOMINAL_PERF,
  79        LOW_NON_LINEAR_PERF,
  80        LOWEST_PERF,
  81        GUARANTEED_PERF,
  82        DESIRED_PERF,
  83        MIN_PERF,
  84        MAX_PERF,
  85        PERF_REDUC_TOLERANCE,
  86        TIME_WINDOW,
  87        CTR_WRAP_TIME,
  88        REFERENCE_CTR,
  89        DELIVERED_CTR,
  90        PERF_LIMITED,
  91        ENABLE,
  92        AUTO_SEL_ENABLE,
  93        AUTO_ACT_WINDOW,
  94        ENERGY_PERF,
  95        REFERENCE_PERF,
  96        LOWEST_FREQ,
  97        NOMINAL_FREQ,
  98};
  99
 100/*
 101 * Categorization of registers as described
 102 * in the ACPI v.5.1 spec.
 103 * XXX: Only filling up ones which are used by governors
 104 * today.
 105 */
 106struct cppc_perf_caps {
 107        u32 guaranteed_perf;
 108        u32 highest_perf;
 109        u32 nominal_perf;
 110        u32 lowest_perf;
 111        u32 lowest_nonlinear_perf;
 112        u32 lowest_freq;
 113        u32 nominal_freq;
 114};
 115
 116struct cppc_perf_ctrls {
 117        u32 max_perf;
 118        u32 min_perf;
 119        u32 desired_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        int cpu;
 132        struct cppc_perf_caps perf_caps;
 133        struct cppc_perf_ctrls perf_ctrls;
 134        struct cppc_perf_fb_ctrs perf_fb_ctrs;
 135        struct cpufreq_policy *cur_policy;
 136        unsigned int shared_type;
 137        cpumask_var_t shared_cpu_map;
 138};
 139
 140extern int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs *perf_fb_ctrs);
 141extern int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls);
 142extern int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps);
 143extern int acpi_get_psd_map(struct cppc_cpudata **);
 144extern unsigned int cppc_get_transition_latency(int cpu);
 145extern bool cpc_ffh_supported(void);
 146extern int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val);
 147extern int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val);
 148
 149#endif /* _CPPC_ACPI_H*/
 150