| 1 | /* |
| 2 | * Copyright 2015 Advanced Micro Devices, Inc. |
| 3 | * |
| 4 | * Permission is hereby granted, free of charge, to any person obtaining a |
| 5 | * copy of this software and associated documentation files (the "Software"), |
| 6 | * to deal in the Software without restriction, including without limitation |
| 7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| 8 | * and/or sell copies of the Software, and to permit persons to whom the |
| 9 | * Software is furnished to do so, subject to the following conditions: |
| 10 | * |
| 11 | * The above copyright notice and this permission notice shall be included in |
| 12 | * all copies or substantial portions of the Software. |
| 13 | * |
| 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| 17 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| 18 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| 19 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| 20 | * OTHER DEALINGS IN THE SOFTWARE. |
| 21 | * |
| 22 | */ |
| 23 | #ifndef PP_POWERSTATE_H |
| 24 | #define PP_POWERSTATE_H |
| 25 | |
| 26 | struct pp_hw_power_state { |
| 27 | unsigned int magic; |
| 28 | }; |
| 29 | |
| 30 | struct pp_power_state; |
| 31 | |
| 32 | |
| 33 | #define PP_INVALID_POWER_STATE_ID (0) |
| 34 | |
| 35 | |
| 36 | /* |
| 37 | * An item of a list containing Power States. |
| 38 | */ |
| 39 | |
| 40 | struct PP_StateLinkedList { |
| 41 | struct pp_power_state *next; |
| 42 | struct pp_power_state *prev; |
| 43 | }; |
| 44 | |
| 45 | |
| 46 | enum PP_StateUILabel { |
| 47 | PP_StateUILabel_None, |
| 48 | PP_StateUILabel_Battery, |
| 49 | PP_StateUILabel_MiddleLow, |
| 50 | PP_StateUILabel_Balanced, |
| 51 | PP_StateUILabel_MiddleHigh, |
| 52 | PP_StateUILabel_Performance, |
| 53 | PP_StateUILabel_BACO |
| 54 | }; |
| 55 | |
| 56 | enum PP_StateClassificationFlag { |
| 57 | PP_StateClassificationFlag_Boot = 0x0001, |
| 58 | PP_StateClassificationFlag_Thermal = 0x0002, |
| 59 | PP_StateClassificationFlag_LimitedPowerSource = 0x0004, |
| 60 | PP_StateClassificationFlag_Rest = 0x0008, |
| 61 | PP_StateClassificationFlag_Forced = 0x0010, |
| 62 | PP_StateClassificationFlag_User3DPerformance = 0x0020, |
| 63 | PP_StateClassificationFlag_User2DPerformance = 0x0040, |
| 64 | PP_StateClassificationFlag_3DPerformance = 0x0080, |
| 65 | PP_StateClassificationFlag_ACOverdriveTemplate = 0x0100, |
| 66 | PP_StateClassificationFlag_Uvd = 0x0200, |
| 67 | PP_StateClassificationFlag_3DPerformanceLow = 0x0400, |
| 68 | PP_StateClassificationFlag_ACPI = 0x0800, |
| 69 | PP_StateClassificationFlag_HD2 = 0x1000, |
| 70 | PP_StateClassificationFlag_UvdHD = 0x2000, |
| 71 | PP_StateClassificationFlag_UvdSD = 0x4000, |
| 72 | PP_StateClassificationFlag_UserDCPerformance = 0x8000, |
| 73 | PP_StateClassificationFlag_DCOverdriveTemplate = 0x10000, |
| 74 | PP_StateClassificationFlag_BACO = 0x20000, |
| 75 | PP_StateClassificationFlag_LimitedPowerSource_2 = 0x40000, |
| 76 | PP_StateClassificationFlag_ULV = 0x80000, |
| 77 | PP_StateClassificationFlag_UvdMVC = 0x100000, |
| 78 | }; |
| 79 | |
| 80 | typedef unsigned int PP_StateClassificationFlags; |
| 81 | |
| 82 | struct PP_StateClassificationBlock { |
| 83 | enum PP_StateUILabel ui_label; |
| 84 | enum PP_StateClassificationFlag flags; |
| 85 | int bios_index; |
| 86 | bool temporary_state; |
| 87 | bool to_be_deleted; |
| 88 | }; |
| 89 | |
| 90 | struct PP_StatePcieBlock { |
| 91 | unsigned int lanes; |
| 92 | }; |
| 93 | |
| 94 | enum PP_RefreshrateSource { |
| 95 | PP_RefreshrateSource_EDID, |
| 96 | PP_RefreshrateSource_Explicit |
| 97 | }; |
| 98 | |
| 99 | struct PP_StateDisplayBlock { |
| 100 | bool disableFrameModulation; |
| 101 | bool limitRefreshrate; |
| 102 | enum PP_RefreshrateSource refreshrateSource; |
| 103 | int explicitRefreshrate; |
| 104 | int edidRefreshrateIndex; |
| 105 | bool enableVariBright; |
| 106 | }; |
| 107 | |
| 108 | struct PP_StateMemroyBlock { |
| 109 | bool dllOff; |
| 110 | uint8_t m3arb; |
| 111 | uint8_t unused[3]; |
| 112 | }; |
| 113 | |
| 114 | struct PP_StateSoftwareAlgorithmBlock { |
| 115 | bool disableLoadBalancing; |
| 116 | bool enableSleepForTimestamps; |
| 117 | }; |
| 118 | |
| 119 | #define PP_TEMPERATURE_UNITS_PER_CENTIGRADES 1000 |
| 120 | |
| 121 | /** |
| 122 | * Type to hold a temperature range. |
| 123 | */ |
| 124 | struct PP_TemperatureRange { |
| 125 | int min; |
| 126 | int max; |
| 127 | int edge_emergency_max; |
| 128 | int hotspot_min; |
| 129 | int hotspot_crit_max; |
| 130 | int hotspot_emergency_max; |
| 131 | int mem_min; |
| 132 | int mem_crit_max; |
| 133 | int mem_emergency_max; |
| 134 | int sw_ctf_threshold; |
| 135 | }; |
| 136 | |
| 137 | struct PP_StateValidationBlock { |
| 138 | bool singleDisplayOnly; |
| 139 | bool disallowOnDC; |
| 140 | uint8_t supportedPowerLevels; |
| 141 | }; |
| 142 | |
| 143 | struct PP_UVD_CLOCKS { |
| 144 | uint32_t VCLK; |
| 145 | uint32_t DCLK; |
| 146 | }; |
| 147 | |
| 148 | /** |
| 149 | * Structure to hold a PowerPlay Power State. |
| 150 | */ |
| 151 | struct pp_power_state { |
| 152 | uint32_t id; |
| 153 | struct PP_StateLinkedList orderedList; |
| 154 | struct PP_StateLinkedList allStatesList; |
| 155 | |
| 156 | struct PP_StateClassificationBlock classification; |
| 157 | struct PP_StateValidationBlock validation; |
| 158 | struct PP_StatePcieBlock pcie; |
| 159 | struct PP_StateDisplayBlock display; |
| 160 | struct PP_StateMemroyBlock memory; |
| 161 | struct PP_TemperatureRange temperatures; |
| 162 | struct PP_StateSoftwareAlgorithmBlock software; |
| 163 | struct PP_UVD_CLOCKS uvd_clocks; |
| 164 | struct pp_hw_power_state hardware; |
| 165 | }; |
| 166 | |
| 167 | enum PP_MMProfilingState { |
| 168 | PP_MMProfilingState_NA = 0, |
| 169 | PP_MMProfilingState_Started, |
| 170 | PP_MMProfilingState_Stopped |
| 171 | }; |
| 172 | |
| 173 | struct pp_clock_engine_request { |
| 174 | unsigned long client_type; |
| 175 | unsigned long ctx_id; |
| 176 | uint64_t context_handle; |
| 177 | unsigned long sclk; |
| 178 | unsigned long sclk_hard_min; |
| 179 | unsigned long mclk; |
| 180 | unsigned long iclk; |
| 181 | unsigned long evclk; |
| 182 | unsigned long ecclk; |
| 183 | unsigned long ecclk_hard_min; |
| 184 | unsigned long vclk; |
| 185 | unsigned long dclk; |
| 186 | unsigned long sclk_over_drive; |
| 187 | unsigned long mclk_over_drive; |
| 188 | unsigned long sclk_threshold; |
| 189 | unsigned long flag; |
| 190 | unsigned long vclk_ceiling; |
| 191 | unsigned long dclk_ceiling; |
| 192 | unsigned long num_cus; |
| 193 | unsigned long pm_flag; |
| 194 | enum PP_MMProfilingState mm_profiling_state; |
| 195 | }; |
| 196 | |
| 197 | #endif |
| 198 | |