| 1 | /* SPDX-License-Identifier: GPL-2.0-only */ | 
|---|
| 2 | /* | 
|---|
| 3 | * Copyright (C) 2022 Advanced Micro Devices, Inc. | 
|---|
| 4 | * | 
|---|
| 5 | * Author: Meng Li <li.meng@amd.com> | 
|---|
| 6 | */ | 
|---|
| 7 |  | 
|---|
| 8 | #ifndef _LINUX_AMD_PSTATE_H | 
|---|
| 9 | #define _LINUX_AMD_PSTATE_H | 
|---|
| 10 |  | 
|---|
| 11 | #include <linux/pm_qos.h> | 
|---|
| 12 |  | 
|---|
| 13 | /********************************************************************* | 
|---|
| 14 | *                        AMD P-state INTERFACE                       * | 
|---|
| 15 | *********************************************************************/ | 
|---|
| 16 |  | 
|---|
| 17 | /** | 
|---|
| 18 | * union perf_cached - A union to cache performance-related data. | 
|---|
| 19 | * @highest_perf: the maximum performance an individual processor may reach, | 
|---|
| 20 | *		  assuming ideal conditions | 
|---|
| 21 | *		  For platforms that support the preferred core feature, the highest_perf value maybe | 
|---|
| 22 | * 		  configured to any value in the range 166-255 by the firmware (because the preferred | 
|---|
| 23 | * 		  core ranking is encoded in the highest_perf value). To maintain consistency across | 
|---|
| 24 | * 		  all platforms, we split the highest_perf and preferred core ranking values into | 
|---|
| 25 | * 		  cpudata->perf.highest_perf and cpudata->prefcore_ranking. | 
|---|
| 26 | * @nominal_perf: the maximum sustained performance level of the processor, | 
|---|
| 27 | *		  assuming ideal operating conditions | 
|---|
| 28 | * @lowest_nonlinear_perf: the lowest performance level at which nonlinear power | 
|---|
| 29 | *			   savings are achieved | 
|---|
| 30 | * @lowest_perf: the absolute lowest performance level of the processor | 
|---|
| 31 | * @min_limit_perf: Cached value of the performance corresponding to policy->min | 
|---|
| 32 | * @max_limit_perf: Cached value of the performance corresponding to policy->max | 
|---|
| 33 | * @bios_min_perf: Cached perf value corresponding to the "Requested CPU Min Frequency" BIOS option | 
|---|
| 34 | */ | 
|---|
| 35 | union perf_cached { | 
|---|
| 36 | struct { | 
|---|
| 37 | u8	highest_perf; | 
|---|
| 38 | u8	nominal_perf; | 
|---|
| 39 | u8	lowest_nonlinear_perf; | 
|---|
| 40 | u8	lowest_perf; | 
|---|
| 41 | u8	min_limit_perf; | 
|---|
| 42 | u8	max_limit_perf; | 
|---|
| 43 | u8	bios_min_perf; | 
|---|
| 44 | }; | 
|---|
| 45 | u64	val; | 
|---|
| 46 | }; | 
|---|
| 47 |  | 
|---|
| 48 | /** | 
|---|
| 49 | * struct  amd_aperf_mperf | 
|---|
| 50 | * @aperf: actual performance frequency clock count | 
|---|
| 51 | * @mperf: maximum performance frequency clock count | 
|---|
| 52 | * @tsc:   time stamp counter | 
|---|
| 53 | */ | 
|---|
| 54 | struct amd_aperf_mperf { | 
|---|
| 55 | u64 aperf; | 
|---|
| 56 | u64 mperf; | 
|---|
| 57 | u64 tsc; | 
|---|
| 58 | }; | 
|---|
| 59 |  | 
|---|
| 60 | /** | 
|---|
| 61 | * struct amd_cpudata - private CPU data for AMD P-State | 
|---|
| 62 | * @cpu: CPU number | 
|---|
| 63 | * @req: constraint request to apply | 
|---|
| 64 | * @cppc_req_cached: cached performance request hints | 
|---|
| 65 | * @perf: cached performance-related data | 
|---|
| 66 | * @prefcore_ranking: the preferred core ranking, the higher value indicates a higher | 
|---|
| 67 | * 		  priority. | 
|---|
| 68 | * @min_limit_freq: Cached value of policy->min (in khz) | 
|---|
| 69 | * @max_limit_freq: Cached value of policy->max (in khz) | 
|---|
| 70 | * @nominal_freq: the frequency (in khz) that mapped to nominal_perf | 
|---|
| 71 | * @lowest_nonlinear_freq: the frequency (in khz) that mapped to lowest_nonlinear_perf | 
|---|
| 72 | * @cur: Difference of Aperf/Mperf/tsc count between last and current sample | 
|---|
| 73 | * @prev: Last Aperf/Mperf/tsc count value read from register | 
|---|
| 74 | * @freq: current cpu frequency value (in khz) | 
|---|
| 75 | * @boost_supported: check whether the Processor or SBIOS supports boost mode | 
|---|
| 76 | * @hw_prefcore: check whether HW supports preferred core featue. | 
|---|
| 77 | * 		  Only when hw_prefcore and early prefcore param are true, | 
|---|
| 78 | * 		  AMD P-State driver supports preferred core featue. | 
|---|
| 79 | * @epp_cached: Cached CPPC energy-performance preference value | 
|---|
| 80 | * @policy: Cpufreq policy value | 
|---|
| 81 | * | 
|---|
| 82 | * The amd_cpudata is key private data for each CPU thread in AMD P-State, and | 
|---|
| 83 | * represents all the attributes and goals that AMD P-State requests at runtime. | 
|---|
| 84 | */ | 
|---|
| 85 | struct amd_cpudata { | 
|---|
| 86 | int	cpu; | 
|---|
| 87 |  | 
|---|
| 88 | struct	freq_qos_request req[2]; | 
|---|
| 89 | u64	cppc_req_cached; | 
|---|
| 90 |  | 
|---|
| 91 | union perf_cached perf; | 
|---|
| 92 |  | 
|---|
| 93 | u8	prefcore_ranking; | 
|---|
| 94 | u32	min_limit_freq; | 
|---|
| 95 | u32	max_limit_freq; | 
|---|
| 96 | u32	nominal_freq; | 
|---|
| 97 | u32	lowest_nonlinear_freq; | 
|---|
| 98 |  | 
|---|
| 99 | struct amd_aperf_mperf cur; | 
|---|
| 100 | struct amd_aperf_mperf prev; | 
|---|
| 101 |  | 
|---|
| 102 | u64	freq; | 
|---|
| 103 | bool	boost_supported; | 
|---|
| 104 | bool	hw_prefcore; | 
|---|
| 105 |  | 
|---|
| 106 | /* EPP feature related attributes*/ | 
|---|
| 107 | u32	policy; | 
|---|
| 108 | bool	suspended; | 
|---|
| 109 | u8	epp_default; | 
|---|
| 110 | }; | 
|---|
| 111 |  | 
|---|
| 112 | /* | 
|---|
| 113 | * enum amd_pstate_mode - driver working mode of amd pstate | 
|---|
| 114 | */ | 
|---|
| 115 | enum amd_pstate_mode { | 
|---|
| 116 | AMD_PSTATE_UNDEFINED = 0, | 
|---|
| 117 | AMD_PSTATE_DISABLE, | 
|---|
| 118 | AMD_PSTATE_PASSIVE, | 
|---|
| 119 | AMD_PSTATE_ACTIVE, | 
|---|
| 120 | AMD_PSTATE_GUIDED, | 
|---|
| 121 | AMD_PSTATE_MAX, | 
|---|
| 122 | }; | 
|---|
| 123 | const char *amd_pstate_get_mode_string(enum amd_pstate_mode mode); | 
|---|
| 124 | int amd_pstate_get_status(void); | 
|---|
| 125 | int amd_pstate_update_status(const char *buf, size_t size); | 
|---|
| 126 |  | 
|---|
| 127 | #endif /* _LINUX_AMD_PSTATE_H */ | 
|---|
| 128 |  | 
|---|