.. | .. |
---|
26 | 26 | #include <drm/amd_asic_type.h> |
---|
27 | 27 | |
---|
28 | 28 | |
---|
29 | | -#define AMD_MAX_USEC_TIMEOUT 200000 /* 200 ms */ |
---|
| 29 | +#define AMD_MAX_USEC_TIMEOUT 1000000 /* 1000 ms */ |
---|
30 | 30 | |
---|
31 | 31 | /* |
---|
32 | 32 | * Chip flags |
---|
.. | .. |
---|
40 | 40 | AMD_EXP_HW_SUPPORT = 0x00080000UL, |
---|
41 | 41 | }; |
---|
42 | 42 | |
---|
| 43 | +enum amd_apu_flags { |
---|
| 44 | + AMD_APU_IS_RAVEN = 0x00000001UL, |
---|
| 45 | + AMD_APU_IS_RAVEN2 = 0x00000002UL, |
---|
| 46 | + AMD_APU_IS_PICASSO = 0x00000004UL, |
---|
| 47 | + AMD_APU_IS_RENOIR = 0x00000008UL, |
---|
| 48 | + AMD_APU_IS_GREEN_SARDINE = 0x00000010UL, |
---|
| 49 | +}; |
---|
| 50 | + |
---|
| 51 | +/** |
---|
| 52 | +* DOC: IP Blocks |
---|
| 53 | +* |
---|
| 54 | +* GPUs are composed of IP (intellectual property) blocks. These |
---|
| 55 | +* IP blocks provide various functionalities: display, graphics, |
---|
| 56 | +* video decode, etc. The IP blocks that comprise a particular GPU |
---|
| 57 | +* are listed in the GPU's respective SoC file. amdgpu_device.c |
---|
| 58 | +* acquires the list of IP blocks for the GPU in use on initialization. |
---|
| 59 | +* It can then operate on this list to perform standard driver operations |
---|
| 60 | +* such as: init, fini, suspend, resume, etc. |
---|
| 61 | +* |
---|
| 62 | +* |
---|
| 63 | +* IP block implementations are named using the following convention: |
---|
| 64 | +* <functionality>_v<version> (E.g.: gfx_v6_0). |
---|
| 65 | +*/ |
---|
| 66 | + |
---|
| 67 | +/** |
---|
| 68 | +* enum amd_ip_block_type - Used to classify IP blocks by functionality. |
---|
| 69 | +* |
---|
| 70 | +* @AMD_IP_BLOCK_TYPE_COMMON: GPU Family |
---|
| 71 | +* @AMD_IP_BLOCK_TYPE_GMC: Graphics Memory Controller |
---|
| 72 | +* @AMD_IP_BLOCK_TYPE_IH: Interrupt Handler |
---|
| 73 | +* @AMD_IP_BLOCK_TYPE_SMC: System Management Controller |
---|
| 74 | +* @AMD_IP_BLOCK_TYPE_PSP: Platform Security Processor |
---|
| 75 | +* @AMD_IP_BLOCK_TYPE_DCE: Display and Compositing Engine |
---|
| 76 | +* @AMD_IP_BLOCK_TYPE_GFX: Graphics and Compute Engine |
---|
| 77 | +* @AMD_IP_BLOCK_TYPE_SDMA: System DMA Engine |
---|
| 78 | +* @AMD_IP_BLOCK_TYPE_UVD: Unified Video Decoder |
---|
| 79 | +* @AMD_IP_BLOCK_TYPE_VCE: Video Compression Engine |
---|
| 80 | +* @AMD_IP_BLOCK_TYPE_ACP: Audio Co-Processor |
---|
| 81 | +* @AMD_IP_BLOCK_TYPE_VCN: Video Core/Codec Next |
---|
| 82 | +* @AMD_IP_BLOCK_TYPE_MES: Micro-Engine Scheduler |
---|
| 83 | +* @AMD_IP_BLOCK_TYPE_JPEG: JPEG Engine |
---|
| 84 | +*/ |
---|
43 | 85 | enum amd_ip_block_type { |
---|
44 | 86 | AMD_IP_BLOCK_TYPE_COMMON, |
---|
45 | 87 | AMD_IP_BLOCK_TYPE_GMC, |
---|
.. | .. |
---|
52 | 94 | AMD_IP_BLOCK_TYPE_UVD, |
---|
53 | 95 | AMD_IP_BLOCK_TYPE_VCE, |
---|
54 | 96 | AMD_IP_BLOCK_TYPE_ACP, |
---|
55 | | - AMD_IP_BLOCK_TYPE_VCN |
---|
| 97 | + AMD_IP_BLOCK_TYPE_VCN, |
---|
| 98 | + AMD_IP_BLOCK_TYPE_MES, |
---|
| 99 | + AMD_IP_BLOCK_TYPE_JPEG |
---|
56 | 100 | }; |
---|
57 | 101 | |
---|
58 | 102 | enum amd_clockgating_state { |
---|
.. | .. |
---|
93 | 137 | #define AMD_CG_SUPPORT_DRM_MGCG (1 << 22) |
---|
94 | 138 | #define AMD_CG_SUPPORT_DF_MGCG (1 << 23) |
---|
95 | 139 | #define AMD_CG_SUPPORT_VCN_MGCG (1 << 24) |
---|
| 140 | +#define AMD_CG_SUPPORT_HDP_DS (1 << 25) |
---|
| 141 | +#define AMD_CG_SUPPORT_HDP_SD (1 << 26) |
---|
| 142 | +#define AMD_CG_SUPPORT_IH_CG (1 << 27) |
---|
| 143 | +#define AMD_CG_SUPPORT_ATHUB_LS (1 << 28) |
---|
| 144 | +#define AMD_CG_SUPPORT_ATHUB_MGCG (1 << 29) |
---|
| 145 | +#define AMD_CG_SUPPORT_JPEG_MGCG (1 << 30) |
---|
96 | 146 | /* PG flags */ |
---|
97 | 147 | #define AMD_PG_SUPPORT_GFX_PG (1 << 0) |
---|
98 | 148 | #define AMD_PG_SUPPORT_GFX_SMG (1 << 1) |
---|
.. | .. |
---|
109 | 159 | #define AMD_PG_SUPPORT_GFX_PIPELINE (1 << 12) |
---|
110 | 160 | #define AMD_PG_SUPPORT_MMHUB (1 << 13) |
---|
111 | 161 | #define AMD_PG_SUPPORT_VCN (1 << 14) |
---|
| 162 | +#define AMD_PG_SUPPORT_VCN_DPG (1 << 15) |
---|
| 163 | +#define AMD_PG_SUPPORT_ATHUB (1 << 16) |
---|
| 164 | +#define AMD_PG_SUPPORT_JPEG (1 << 17) |
---|
112 | 165 | |
---|
| 166 | +/** |
---|
| 167 | + * enum PP_FEATURE_MASK - Used to mask power play features. |
---|
| 168 | + * |
---|
| 169 | + * @PP_SCLK_DPM_MASK: Dynamic adjustment of the system (graphics) clock. |
---|
| 170 | + * @PP_MCLK_DPM_MASK: Dynamic adjustment of the memory clock. |
---|
| 171 | + * @PP_PCIE_DPM_MASK: Dynamic adjustment of PCIE clocks and lanes. |
---|
| 172 | + * @PP_SCLK_DEEP_SLEEP_MASK: System (graphics) clock deep sleep. |
---|
| 173 | + * @PP_POWER_CONTAINMENT_MASK: Power containment. |
---|
| 174 | + * @PP_UVD_HANDSHAKE_MASK: Unified video decoder handshake. |
---|
| 175 | + * @PP_SMC_VOLTAGE_CONTROL_MASK: Dynamic voltage control. |
---|
| 176 | + * @PP_VBI_TIME_SUPPORT_MASK: Vertical blank interval support. |
---|
| 177 | + * @PP_ULV_MASK: Ultra low voltage. |
---|
| 178 | + * @PP_ENABLE_GFX_CG_THRU_SMU: SMU control of GFX engine clockgating. |
---|
| 179 | + * @PP_CLOCK_STRETCH_MASK: Clock stretching. |
---|
| 180 | + * @PP_OD_FUZZY_FAN_CONTROL_MASK: Overdrive fuzzy fan control. |
---|
| 181 | + * @PP_SOCCLK_DPM_MASK: Dynamic adjustment of the SoC clock. |
---|
| 182 | + * @PP_DCEFCLK_DPM_MASK: Dynamic adjustment of the Display Controller Engine Fabric clock. |
---|
| 183 | + * @PP_OVERDRIVE_MASK: Over- and under-clocking support. |
---|
| 184 | + * @PP_GFXOFF_MASK: Dynamic graphics engine power control. |
---|
| 185 | + * @PP_ACG_MASK: Adaptive clock generator. |
---|
| 186 | + * @PP_STUTTER_MODE: Stutter mode. |
---|
| 187 | + * @PP_AVFS_MASK: Adaptive voltage and frequency scaling. |
---|
| 188 | + * |
---|
| 189 | + * To override these settings on boot, append amdgpu.ppfeaturemask=<mask> to |
---|
| 190 | + * the kernel's command line parameters. This is usually done through a system's |
---|
| 191 | + * boot loader (E.g. GRUB). If manually loading the driver, pass |
---|
| 192 | + * ppfeaturemask=<mask> as a modprobe parameter. |
---|
| 193 | + */ |
---|
113 | 194 | enum PP_FEATURE_MASK { |
---|
114 | 195 | PP_SCLK_DPM_MASK = 0x1, |
---|
115 | 196 | PP_MCLK_DPM_MASK = 0x2, |
---|
.. | .. |
---|
129 | 210 | PP_GFXOFF_MASK = 0x8000, |
---|
130 | 211 | PP_ACG_MASK = 0x10000, |
---|
131 | 212 | PP_STUTTER_MODE = 0x20000, |
---|
| 213 | + PP_AVFS_MASK = 0x40000, |
---|
132 | 214 | }; |
---|
| 215 | + |
---|
| 216 | +enum DC_FEATURE_MASK { |
---|
| 217 | + DC_FBC_MASK = 0x1, |
---|
| 218 | + DC_MULTI_MON_PP_MCLK_SWITCH_MASK = 0x2, |
---|
| 219 | + DC_DISABLE_FRACTIONAL_PWM_MASK = 0x4, |
---|
| 220 | + DC_PSR_MASK = 0x8, |
---|
| 221 | +}; |
---|
| 222 | + |
---|
| 223 | +enum DC_DEBUG_MASK { |
---|
| 224 | + DC_DISABLE_PIPE_SPLIT = 0x1, |
---|
| 225 | + DC_DISABLE_STUTTER = 0x2, |
---|
| 226 | + DC_DISABLE_DSC = 0x4, |
---|
| 227 | + DC_DISABLE_CLOCK_GATING = 0x8 |
---|
| 228 | +}; |
---|
| 229 | + |
---|
| 230 | +enum amd_dpm_forced_level; |
---|
133 | 231 | |
---|
134 | 232 | /** |
---|
135 | 233 | * struct amd_ip_funcs - general hooks for managing amdgpu IP Blocks |
---|
| 234 | + * @name: Name of IP block |
---|
| 235 | + * @early_init: sets up early driver state (pre sw_init), |
---|
| 236 | + * does not configure hw - Optional |
---|
| 237 | + * @late_init: sets up late driver/hw state (post hw_init) - Optional |
---|
| 238 | + * @sw_init: sets up driver state, does not configure hw |
---|
| 239 | + * @sw_fini: tears down driver state, does not configure hw |
---|
| 240 | + * @hw_init: sets up the hw state |
---|
| 241 | + * @hw_fini: tears down the hw state |
---|
| 242 | + * @late_fini: final cleanup |
---|
| 243 | + * @suspend: handles IP specific hw/sw changes for suspend |
---|
| 244 | + * @resume: handles IP specific hw/sw changes for resume |
---|
| 245 | + * @is_idle: returns current IP block idle status |
---|
| 246 | + * @wait_for_idle: poll for idle |
---|
| 247 | + * @check_soft_reset: check soft reset the IP block |
---|
| 248 | + * @pre_soft_reset: pre soft reset the IP block |
---|
| 249 | + * @soft_reset: soft reset the IP block |
---|
| 250 | + * @post_soft_reset: post soft reset the IP block |
---|
| 251 | + * @set_clockgating_state: enable/disable cg for the IP block |
---|
| 252 | + * @set_powergating_state: enable/disable pg for the IP block |
---|
| 253 | + * @get_clockgating_state: get current clockgating status |
---|
| 254 | + * @enable_umd_pstate: enable UMD powerstate |
---|
| 255 | + * |
---|
| 256 | + * These hooks provide an interface for controlling the operational state |
---|
| 257 | + * of IP blocks. After acquiring a list of IP blocks for the GPU in use, |
---|
| 258 | + * the driver can make chip-wide state changes by walking this list and |
---|
| 259 | + * making calls to hooks from each IP block. This list is ordered to ensure |
---|
| 260 | + * that the driver initializes the IP blocks in a safe sequence. |
---|
136 | 261 | */ |
---|
137 | 262 | struct amd_ip_funcs { |
---|
138 | | - /** @name: Name of IP block */ |
---|
139 | 263 | char *name; |
---|
140 | | - /** |
---|
141 | | - * @early_init: |
---|
142 | | - * |
---|
143 | | - * sets up early driver state (pre sw_init), |
---|
144 | | - * does not configure hw - Optional |
---|
145 | | - */ |
---|
146 | 264 | int (*early_init)(void *handle); |
---|
147 | | - /** @late_init: sets up late driver/hw state (post hw_init) - Optional */ |
---|
148 | 265 | int (*late_init)(void *handle); |
---|
149 | | - /** @sw_init: sets up driver state, does not configure hw */ |
---|
150 | 266 | int (*sw_init)(void *handle); |
---|
151 | | - /** @sw_fini: tears down driver state, does not configure hw */ |
---|
152 | 267 | int (*sw_fini)(void *handle); |
---|
153 | | - /** @hw_init: sets up the hw state */ |
---|
154 | 268 | int (*hw_init)(void *handle); |
---|
155 | | - /** @hw_fini: tears down the hw state */ |
---|
156 | 269 | int (*hw_fini)(void *handle); |
---|
157 | | - /** @late_fini: final cleanup */ |
---|
158 | 270 | void (*late_fini)(void *handle); |
---|
159 | | - /** @suspend: handles IP specific hw/sw changes for suspend */ |
---|
160 | 271 | int (*suspend)(void *handle); |
---|
161 | | - /** @resume: handles IP specific hw/sw changes for resume */ |
---|
162 | 272 | int (*resume)(void *handle); |
---|
163 | | - /** @is_idle: returns current IP block idle status */ |
---|
164 | 273 | bool (*is_idle)(void *handle); |
---|
165 | | - /** @wait_for_idle: poll for idle */ |
---|
166 | 274 | int (*wait_for_idle)(void *handle); |
---|
167 | | - /** @check_soft_reset: check soft reset the IP block */ |
---|
168 | 275 | bool (*check_soft_reset)(void *handle); |
---|
169 | | - /** @pre_soft_reset: pre soft reset the IP block */ |
---|
170 | 276 | int (*pre_soft_reset)(void *handle); |
---|
171 | | - /** @soft_reset: soft reset the IP block */ |
---|
172 | 277 | int (*soft_reset)(void *handle); |
---|
173 | | - /** @post_soft_reset: post soft reset the IP block */ |
---|
174 | 278 | int (*post_soft_reset)(void *handle); |
---|
175 | | - /** @set_clockgating_state: enable/disable cg for the IP block */ |
---|
176 | 279 | int (*set_clockgating_state)(void *handle, |
---|
177 | 280 | enum amd_clockgating_state state); |
---|
178 | | - /** @set_powergating_state: enable/disable pg for the IP block */ |
---|
179 | 281 | int (*set_powergating_state)(void *handle, |
---|
180 | 282 | enum amd_powergating_state state); |
---|
181 | | - /** @get_clockgating_state: get current clockgating status */ |
---|
182 | 283 | void (*get_clockgating_state)(void *handle, u32 *flags); |
---|
| 284 | + int (*enable_umd_pstate)(void *handle, enum amd_dpm_forced_level *level); |
---|
183 | 285 | }; |
---|
184 | 286 | |
---|
185 | 287 | |
---|