xref: /openbmc/linux/drivers/gpu/drm/amd/pm/powerplay/inc/smu71.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1837d542aSEvan Quan /*
2837d542aSEvan Quan  * Copyright 2016 Advanced Micro Devices, Inc.
3837d542aSEvan Quan  *
4837d542aSEvan Quan  * Permission is hereby granted, free of charge, to any person obtaining a
5837d542aSEvan Quan  * copy of this software and associated documentation files (the "Software"),
6837d542aSEvan Quan  * to deal in the Software without restriction, including without limitation
7837d542aSEvan Quan  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8837d542aSEvan Quan  * and/or sell copies of the Software, and to permit persons to whom the
9837d542aSEvan Quan  * Software is furnished to do so, subject to the following conditions:
10837d542aSEvan Quan  *
11837d542aSEvan Quan  * The above copyright notice and this permission notice shall be included in
12837d542aSEvan Quan  * all copies or substantial portions of the Software.
13837d542aSEvan Quan  *
14837d542aSEvan Quan  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15837d542aSEvan Quan  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16837d542aSEvan Quan  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17837d542aSEvan Quan  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18837d542aSEvan Quan  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19837d542aSEvan Quan  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20837d542aSEvan Quan  * OTHER DEALINGS IN THE SOFTWARE.
21837d542aSEvan Quan  *
22837d542aSEvan Quan  */
23837d542aSEvan Quan #ifndef SMU71_H
24837d542aSEvan Quan #define SMU71_H
25837d542aSEvan Quan 
26837d542aSEvan Quan #if !defined(SMC_MICROCODE)
27837d542aSEvan Quan #pragma pack(push, 1)
28837d542aSEvan Quan #endif
29837d542aSEvan Quan 
30837d542aSEvan Quan #define SMU__NUM_PCIE_DPM_LEVELS 8
31837d542aSEvan Quan #define SMU__NUM_SCLK_DPM_STATE 8
32837d542aSEvan Quan #define SMU__NUM_MCLK_DPM_LEVELS 4
33837d542aSEvan Quan #define SMU__VARIANT__ICELAND 1
34837d542aSEvan Quan #define SMU__DGPU_ONLY 1
35837d542aSEvan Quan #define SMU__DYNAMIC_MCARB_SETTINGS 1
36837d542aSEvan Quan 
37837d542aSEvan Quan enum SID_OPTION {
38837d542aSEvan Quan   SID_OPTION_HI,
39837d542aSEvan Quan   SID_OPTION_LO,
40837d542aSEvan Quan   SID_OPTION_COUNT
41837d542aSEvan Quan };
42837d542aSEvan Quan 
43837d542aSEvan Quan typedef struct {
44837d542aSEvan Quan   uint32_t high;
45837d542aSEvan Quan   uint32_t low;
46837d542aSEvan Quan } data_64_t;
47837d542aSEvan Quan 
48837d542aSEvan Quan typedef struct {
49837d542aSEvan Quan   data_64_t high;
50837d542aSEvan Quan   data_64_t low;
51837d542aSEvan Quan } data_128_t;
52837d542aSEvan Quan 
53837d542aSEvan Quan #define SMU7_CONTEXT_ID_SMC        1
54837d542aSEvan Quan #define SMU7_CONTEXT_ID_VBIOS      2
55837d542aSEvan Quan 
56837d542aSEvan Quan #define SMU71_MAX_LEVELS_VDDC            8
57837d542aSEvan Quan #define SMU71_MAX_LEVELS_VDDCI           4
58837d542aSEvan Quan #define SMU71_MAX_LEVELS_MVDD            4
59837d542aSEvan Quan #define SMU71_MAX_LEVELS_VDDNB           8
60837d542aSEvan Quan 
61837d542aSEvan Quan #define SMU71_MAX_LEVELS_GRAPHICS        SMU__NUM_SCLK_DPM_STATE
62837d542aSEvan Quan #define SMU71_MAX_LEVELS_MEMORY          SMU__NUM_MCLK_DPM_LEVELS
63837d542aSEvan Quan #define SMU71_MAX_LEVELS_GIO             SMU__NUM_LCLK_DPM_LEVELS
64837d542aSEvan Quan #define SMU71_MAX_LEVELS_LINK            SMU__NUM_PCIE_DPM_LEVELS
65837d542aSEvan Quan #define SMU71_MAX_ENTRIES_SMIO           32
66837d542aSEvan Quan 
67837d542aSEvan Quan #define DPM_NO_LIMIT 0
68837d542aSEvan Quan #define DPM_NO_UP 1
69837d542aSEvan Quan #define DPM_GO_DOWN 2
70837d542aSEvan Quan #define DPM_GO_UP 3
71837d542aSEvan Quan 
72837d542aSEvan Quan #define SMU7_FIRST_DPM_GRAPHICS_LEVEL    0
73837d542aSEvan Quan #define SMU7_FIRST_DPM_MEMORY_LEVEL      0
74837d542aSEvan Quan 
75837d542aSEvan Quan #define GPIO_CLAMP_MODE_VRHOT      1
76837d542aSEvan Quan #define GPIO_CLAMP_MODE_THERM      2
77837d542aSEvan Quan #define GPIO_CLAMP_MODE_DC         4
78837d542aSEvan Quan 
79837d542aSEvan Quan #define SCRATCH_B_TARG_PCIE_INDEX_SHIFT 0
80837d542aSEvan Quan #define SCRATCH_B_TARG_PCIE_INDEX_MASK  (0x7<<SCRATCH_B_TARG_PCIE_INDEX_SHIFT)
81837d542aSEvan Quan #define SCRATCH_B_CURR_PCIE_INDEX_SHIFT 3
82837d542aSEvan Quan #define SCRATCH_B_CURR_PCIE_INDEX_MASK  (0x7<<SCRATCH_B_CURR_PCIE_INDEX_SHIFT)
83837d542aSEvan Quan #define SCRATCH_B_TARG_UVD_INDEX_SHIFT  6
84837d542aSEvan Quan #define SCRATCH_B_TARG_UVD_INDEX_MASK   (0x7<<SCRATCH_B_TARG_UVD_INDEX_SHIFT)
85837d542aSEvan Quan #define SCRATCH_B_CURR_UVD_INDEX_SHIFT  9
86837d542aSEvan Quan #define SCRATCH_B_CURR_UVD_INDEX_MASK   (0x7<<SCRATCH_B_CURR_UVD_INDEX_SHIFT)
87837d542aSEvan Quan #define SCRATCH_B_TARG_VCE_INDEX_SHIFT  12
88837d542aSEvan Quan #define SCRATCH_B_TARG_VCE_INDEX_MASK   (0x7<<SCRATCH_B_TARG_VCE_INDEX_SHIFT)
89837d542aSEvan Quan #define SCRATCH_B_CURR_VCE_INDEX_SHIFT  15
90837d542aSEvan Quan #define SCRATCH_B_CURR_VCE_INDEX_MASK   (0x7<<SCRATCH_B_CURR_VCE_INDEX_SHIFT)
91837d542aSEvan Quan #define SCRATCH_B_TARG_ACP_INDEX_SHIFT  18
92837d542aSEvan Quan #define SCRATCH_B_TARG_ACP_INDEX_MASK   (0x7<<SCRATCH_B_TARG_ACP_INDEX_SHIFT)
93837d542aSEvan Quan #define SCRATCH_B_CURR_ACP_INDEX_SHIFT  21
94837d542aSEvan Quan #define SCRATCH_B_CURR_ACP_INDEX_MASK   (0x7<<SCRATCH_B_CURR_ACP_INDEX_SHIFT)
95837d542aSEvan Quan #define SCRATCH_B_TARG_SAMU_INDEX_SHIFT 24
96837d542aSEvan Quan #define SCRATCH_B_TARG_SAMU_INDEX_MASK  (0x7<<SCRATCH_B_TARG_SAMU_INDEX_SHIFT)
97837d542aSEvan Quan #define SCRATCH_B_CURR_SAMU_INDEX_SHIFT 27
98837d542aSEvan Quan #define SCRATCH_B_CURR_SAMU_INDEX_MASK  (0x7<<SCRATCH_B_CURR_SAMU_INDEX_SHIFT)
99837d542aSEvan Quan 
100837d542aSEvan Quan 
101837d542aSEvan Quan #if defined SMU__DGPU_ONLY
102837d542aSEvan Quan #define SMU71_DTE_ITERATIONS 5
103837d542aSEvan Quan #define SMU71_DTE_SOURCES 3
104837d542aSEvan Quan #define SMU71_DTE_SINKS 1
105837d542aSEvan Quan #define SMU71_NUM_CPU_TES 0
106837d542aSEvan Quan #define SMU71_NUM_GPU_TES 1
107837d542aSEvan Quan #define SMU71_NUM_NON_TES 2
108837d542aSEvan Quan 
109837d542aSEvan Quan #endif
110837d542aSEvan Quan 
111837d542aSEvan Quan #if defined SMU__FUSION_ONLY
112837d542aSEvan Quan #define SMU7_DTE_ITERATIONS 5
113837d542aSEvan Quan #define SMU7_DTE_SOURCES 5
114837d542aSEvan Quan #define SMU7_DTE_SINKS 3
115837d542aSEvan Quan #define SMU7_NUM_CPU_TES 2
116837d542aSEvan Quan #define SMU7_NUM_GPU_TES 1
117837d542aSEvan Quan #define SMU7_NUM_NON_TES 2
118837d542aSEvan Quan 
119837d542aSEvan Quan #endif
120837d542aSEvan Quan 
121*d12d9229SRan Sun struct SMU71_PIDController {
122837d542aSEvan Quan     uint32_t Ki;
123837d542aSEvan Quan     int32_t LFWindupUpperLim;
124837d542aSEvan Quan     int32_t LFWindupLowerLim;
125837d542aSEvan Quan     uint32_t StatePrecision;
126837d542aSEvan Quan     uint32_t LfPrecision;
127837d542aSEvan Quan     uint32_t LfOffset;
128837d542aSEvan Quan     uint32_t MaxState;
129837d542aSEvan Quan     uint32_t MaxLfFraction;
130837d542aSEvan Quan     uint32_t StateShift;
131837d542aSEvan Quan };
132837d542aSEvan Quan 
133837d542aSEvan Quan typedef struct SMU71_PIDController SMU71_PIDController;
134837d542aSEvan Quan 
135*d12d9229SRan Sun struct SMU7_LocalDpmScoreboard {
136837d542aSEvan Quan     uint32_t PercentageBusy;
137837d542aSEvan Quan 
138837d542aSEvan Quan     int32_t  PIDError;
139837d542aSEvan Quan     int32_t  PIDIntegral;
140837d542aSEvan Quan     int32_t  PIDOutput;
141837d542aSEvan Quan 
142837d542aSEvan Quan     uint32_t SigmaDeltaAccum;
143837d542aSEvan Quan     uint32_t SigmaDeltaOutput;
144837d542aSEvan Quan     uint32_t SigmaDeltaLevel;
145837d542aSEvan Quan 
146837d542aSEvan Quan     uint32_t UtilizationSetpoint;
147837d542aSEvan Quan 
148837d542aSEvan Quan     uint8_t  TdpClampMode;
149837d542aSEvan Quan     uint8_t  TdcClampMode;
150837d542aSEvan Quan     uint8_t  ThermClampMode;
151837d542aSEvan Quan     uint8_t  VoltageBusy;
152837d542aSEvan Quan 
153837d542aSEvan Quan     int8_t   CurrLevel;
154837d542aSEvan Quan     int8_t   TargLevel;
155837d542aSEvan Quan     uint8_t  LevelChangeInProgress;
156837d542aSEvan Quan     uint8_t  UpHyst;
157837d542aSEvan Quan 
158837d542aSEvan Quan     uint8_t  DownHyst;
159837d542aSEvan Quan     uint8_t  VoltageDownHyst;
160837d542aSEvan Quan     uint8_t  DpmEnable;
161837d542aSEvan Quan     uint8_t  DpmRunning;
162837d542aSEvan Quan 
163837d542aSEvan Quan     uint8_t  DpmForce;
164837d542aSEvan Quan     uint8_t  DpmForceLevel;
165837d542aSEvan Quan     uint8_t  DisplayWatermark;
166837d542aSEvan Quan     uint8_t  McArbIndex;
167837d542aSEvan Quan 
168837d542aSEvan Quan     uint32_t MinimumPerfSclk;
169837d542aSEvan Quan 
170837d542aSEvan Quan     uint8_t  AcpiReq;
171837d542aSEvan Quan     uint8_t  AcpiAck;
172837d542aSEvan Quan     uint8_t  GfxClkSlow;
173837d542aSEvan Quan     uint8_t  GpioClampMode;
174837d542aSEvan Quan 
175837d542aSEvan Quan     uint8_t  FpsFilterWeight;
176837d542aSEvan Quan     uint8_t  EnabledLevelsChange;
177837d542aSEvan Quan     uint8_t  DteClampMode;
178837d542aSEvan Quan     uint8_t  FpsClampMode;
179837d542aSEvan Quan 
180837d542aSEvan Quan     uint16_t LevelResidencyCounters[SMU71_MAX_LEVELS_GRAPHICS];
181837d542aSEvan Quan     uint16_t LevelSwitchCounters[SMU71_MAX_LEVELS_GRAPHICS];
182837d542aSEvan Quan 
183837d542aSEvan Quan     void     (*TargetStateCalculator)(uint8_t);
184837d542aSEvan Quan     void     (*SavedTargetStateCalculator)(uint8_t);
185837d542aSEvan Quan 
186837d542aSEvan Quan     uint16_t AutoDpmInterval;
187837d542aSEvan Quan     uint16_t AutoDpmRange;
188837d542aSEvan Quan 
189837d542aSEvan Quan     uint8_t  FpsEnabled;
190837d542aSEvan Quan     uint8_t  MaxPerfLevel;
191837d542aSEvan Quan     uint8_t  AllowLowClkInterruptToHost;
192837d542aSEvan Quan     uint8_t  FpsRunning;
193837d542aSEvan Quan 
194837d542aSEvan Quan     uint32_t MaxAllowedFrequency;
195837d542aSEvan Quan };
196837d542aSEvan Quan 
197837d542aSEvan Quan typedef struct SMU7_LocalDpmScoreboard SMU7_LocalDpmScoreboard;
198837d542aSEvan Quan 
199837d542aSEvan Quan #define SMU7_MAX_VOLTAGE_CLIENTS 12
200837d542aSEvan Quan 
201*d12d9229SRan Sun struct SMU7_VoltageScoreboard {
202837d542aSEvan Quan     uint16_t CurrentVoltage;
203837d542aSEvan Quan     uint16_t HighestVoltage;
204837d542aSEvan Quan     uint16_t MaxVid;
205837d542aSEvan Quan     uint8_t  HighestVidOffset;
206837d542aSEvan Quan     uint8_t  CurrentVidOffset;
207837d542aSEvan Quan #if defined (SMU__DGPU_ONLY)
208837d542aSEvan Quan     uint8_t  CurrentPhases;
209837d542aSEvan Quan     uint8_t  HighestPhases;
210837d542aSEvan Quan #else
211837d542aSEvan Quan     uint8_t  AvsOffset;
212837d542aSEvan Quan     uint8_t  AvsOffsetApplied;
213837d542aSEvan Quan #endif
214837d542aSEvan Quan     uint8_t  ControllerBusy;
215837d542aSEvan Quan     uint8_t  CurrentVid;
216837d542aSEvan Quan     uint16_t RequestedVoltage[SMU7_MAX_VOLTAGE_CLIENTS];
217837d542aSEvan Quan #if defined (SMU__DGPU_ONLY)
218837d542aSEvan Quan     uint8_t  RequestedPhases[SMU7_MAX_VOLTAGE_CLIENTS];
219837d542aSEvan Quan #endif
220837d542aSEvan Quan     uint8_t  EnabledRequest[SMU7_MAX_VOLTAGE_CLIENTS];
221837d542aSEvan Quan     uint8_t  TargetIndex;
222837d542aSEvan Quan     uint8_t  Delay;
223837d542aSEvan Quan     uint8_t  ControllerEnable;
224837d542aSEvan Quan     uint8_t  ControllerRunning;
225837d542aSEvan Quan     uint16_t CurrentStdVoltageHiSidd;
226837d542aSEvan Quan     uint16_t CurrentStdVoltageLoSidd;
227837d542aSEvan Quan #if defined (SMU__DGPU_ONLY)
228837d542aSEvan Quan     uint16_t RequestedVddci;
229837d542aSEvan Quan     uint16_t CurrentVddci;
230837d542aSEvan Quan     uint16_t HighestVddci;
231837d542aSEvan Quan     uint8_t  CurrentVddciVid;
232837d542aSEvan Quan     uint8_t  TargetVddciIndex;
233837d542aSEvan Quan #endif
234837d542aSEvan Quan };
235837d542aSEvan Quan 
236837d542aSEvan Quan typedef struct SMU7_VoltageScoreboard SMU7_VoltageScoreboard;
237837d542aSEvan Quan 
238837d542aSEvan Quan // -------------------------------------------------------------------------------------------------------------------------
239837d542aSEvan Quan #define SMU7_MAX_PCIE_LINK_SPEEDS 3 /* 0:Gen1 1:Gen2 2:Gen3 */
240837d542aSEvan Quan 
241837d542aSEvan Quan struct SMU7_PCIeLinkSpeedScoreboard
242837d542aSEvan Quan {
243837d542aSEvan Quan     uint8_t     DpmEnable;
244837d542aSEvan Quan     uint8_t     DpmRunning;
245837d542aSEvan Quan     uint8_t     DpmForce;
246837d542aSEvan Quan     uint8_t     DpmForceLevel;
247837d542aSEvan Quan 
248837d542aSEvan Quan     uint8_t     CurrentLinkSpeed;
249837d542aSEvan Quan     uint8_t     EnabledLevelsChange;
250837d542aSEvan Quan     uint16_t    AutoDpmInterval;
251837d542aSEvan Quan 
252837d542aSEvan Quan     uint16_t    AutoDpmRange;
253837d542aSEvan Quan     uint16_t    AutoDpmCount;
254837d542aSEvan Quan 
255837d542aSEvan Quan     uint8_t     DpmMode;
256837d542aSEvan Quan     uint8_t     AcpiReq;
257837d542aSEvan Quan     uint8_t     AcpiAck;
258837d542aSEvan Quan     uint8_t     CurrentLinkLevel;
259837d542aSEvan Quan 
260837d542aSEvan Quan };
261837d542aSEvan Quan 
262837d542aSEvan Quan typedef struct SMU7_PCIeLinkSpeedScoreboard SMU7_PCIeLinkSpeedScoreboard;
263837d542aSEvan Quan 
264837d542aSEvan Quan // -------------------------------------------------------- CAC table ------------------------------------------------------
265837d542aSEvan Quan #define SMU7_LKGE_LUT_NUM_OF_TEMP_ENTRIES 16
266837d542aSEvan Quan #define SMU7_LKGE_LUT_NUM_OF_VOLT_ENTRIES 16
267837d542aSEvan Quan 
268837d542aSEvan Quan #define SMU7_SCALE_I  7
269837d542aSEvan Quan #define SMU7_SCALE_R 12
270837d542aSEvan Quan 
271837d542aSEvan Quan struct SMU7_PowerScoreboard
272837d542aSEvan Quan {
273837d542aSEvan Quan     uint16_t   MinVoltage;
274837d542aSEvan Quan     uint16_t   MaxVoltage;
275837d542aSEvan Quan 
276837d542aSEvan Quan     uint32_t   AvgGpuPower;
277837d542aSEvan Quan 
278837d542aSEvan Quan     uint16_t   VddcLeakagePower[SID_OPTION_COUNT];
279837d542aSEvan Quan     uint16_t   VddcSclkConstantPower[SID_OPTION_COUNT];
280837d542aSEvan Quan     uint16_t   VddcSclkDynamicPower[SID_OPTION_COUNT];
281837d542aSEvan Quan     uint16_t   VddcNonSclkDynamicPower[SID_OPTION_COUNT];
282837d542aSEvan Quan     uint16_t   VddcTotalPower[SID_OPTION_COUNT];
283837d542aSEvan Quan     uint16_t   VddcTotalCurrent[SID_OPTION_COUNT];
284837d542aSEvan Quan     uint16_t   VddcLoadVoltage[SID_OPTION_COUNT];
285837d542aSEvan Quan     uint16_t   VddcNoLoadVoltage[SID_OPTION_COUNT];
286837d542aSEvan Quan 
287837d542aSEvan Quan     uint16_t   DisplayPhyPower;
288837d542aSEvan Quan     uint16_t   PciePhyPower;
289837d542aSEvan Quan 
290837d542aSEvan Quan     uint16_t   VddciTotalPower;
291837d542aSEvan Quan     uint16_t   Vddr1TotalPower;
292837d542aSEvan Quan 
293837d542aSEvan Quan     uint32_t   RocPower;
294837d542aSEvan Quan 
295837d542aSEvan Quan     uint32_t   last_power;
296837d542aSEvan Quan     uint32_t   enableWinAvg;
297837d542aSEvan Quan 
298837d542aSEvan Quan     uint32_t   lkg_acc;
299837d542aSEvan Quan     uint16_t   VoltLkgeScaler;
300837d542aSEvan Quan     uint16_t   TempLkgeScaler;
301837d542aSEvan Quan 
302837d542aSEvan Quan     uint32_t   uvd_cac_dclk;
303837d542aSEvan Quan     uint32_t   uvd_cac_vclk;
304837d542aSEvan Quan     uint32_t   vce_cac_eclk;
305837d542aSEvan Quan     uint32_t   samu_cac_samclk;
306837d542aSEvan Quan     uint32_t   display_cac_dispclk;
307837d542aSEvan Quan     uint32_t   acp_cac_aclk;
308837d542aSEvan Quan     uint32_t   unb_cac;
309837d542aSEvan Quan 
310837d542aSEvan Quan     uint32_t   WinTime;
311837d542aSEvan Quan 
312837d542aSEvan Quan     uint16_t  GpuPwr_MAWt;
313837d542aSEvan Quan     uint16_t  FilteredVddcTotalPower;
314837d542aSEvan Quan 
315837d542aSEvan Quan     uint8_t   CalculationRepeats;
316837d542aSEvan Quan     uint8_t   WaterfallUp;
317837d542aSEvan Quan     uint8_t   WaterfallDown;
318837d542aSEvan Quan     uint8_t   WaterfallLimit;
319837d542aSEvan Quan };
320837d542aSEvan Quan 
321837d542aSEvan Quan typedef struct SMU7_PowerScoreboard SMU7_PowerScoreboard;
322837d542aSEvan Quan 
323837d542aSEvan Quan // --------------------------------------------------------------------------------------------------
324837d542aSEvan Quan 
325*d12d9229SRan Sun struct SMU7_ThermalScoreboard {
326837d542aSEvan Quan    int16_t  GpuLimit;
327837d542aSEvan Quan    int16_t  GpuHyst;
328837d542aSEvan Quan    uint16_t CurrGnbTemp;
329837d542aSEvan Quan    uint16_t FilteredGnbTemp;
330837d542aSEvan Quan    uint8_t  ControllerEnable;
331837d542aSEvan Quan    uint8_t  ControllerRunning;
332837d542aSEvan Quan    uint8_t  WaterfallUp;
333837d542aSEvan Quan    uint8_t  WaterfallDown;
334837d542aSEvan Quan    uint8_t  WaterfallLimit;
335837d542aSEvan Quan    uint8_t  padding[3];
336837d542aSEvan Quan };
337837d542aSEvan Quan 
338837d542aSEvan Quan typedef struct SMU7_ThermalScoreboard SMU7_ThermalScoreboard;
339837d542aSEvan Quan 
340837d542aSEvan Quan // For FeatureEnables:
341837d542aSEvan Quan #define SMU7_SCLK_DPM_CONFIG_MASK                        0x01
342837d542aSEvan Quan #define SMU7_VOLTAGE_CONTROLLER_CONFIG_MASK              0x02
343837d542aSEvan Quan #define SMU7_THERMAL_CONTROLLER_CONFIG_MASK              0x04
344837d542aSEvan Quan #define SMU7_MCLK_DPM_CONFIG_MASK                        0x08
345837d542aSEvan Quan #define SMU7_UVD_DPM_CONFIG_MASK                         0x10
346837d542aSEvan Quan #define SMU7_VCE_DPM_CONFIG_MASK                         0x20
347837d542aSEvan Quan #define SMU7_ACP_DPM_CONFIG_MASK                         0x40
348837d542aSEvan Quan #define SMU7_SAMU_DPM_CONFIG_MASK                        0x80
349837d542aSEvan Quan #define SMU7_PCIEGEN_DPM_CONFIG_MASK                    0x100
350837d542aSEvan Quan 
351837d542aSEvan Quan #define SMU7_ACP_MCLK_HANDSHAKE_DISABLE                  0x00000001
352837d542aSEvan Quan #define SMU7_ACP_SCLK_HANDSHAKE_DISABLE                  0x00000002
353837d542aSEvan Quan #define SMU7_UVD_MCLK_HANDSHAKE_DISABLE                  0x00000100
354837d542aSEvan Quan #define SMU7_UVD_SCLK_HANDSHAKE_DISABLE                  0x00000200
355837d542aSEvan Quan #define SMU7_VCE_MCLK_HANDSHAKE_DISABLE                  0x00010000
356837d542aSEvan Quan #define SMU7_VCE_SCLK_HANDSHAKE_DISABLE                  0x00020000
357837d542aSEvan Quan 
358837d542aSEvan Quan // All 'soft registers' should be uint32_t.
359*d12d9229SRan Sun struct SMU71_SoftRegisters {
360837d542aSEvan Quan     uint32_t        RefClockFrequency;
361837d542aSEvan Quan     uint32_t        PmTimerPeriod;
362837d542aSEvan Quan     uint32_t        FeatureEnables;
363837d542aSEvan Quan #if defined (SMU__DGPU_ONLY)
364837d542aSEvan Quan     uint32_t        PreVBlankGap;
365837d542aSEvan Quan     uint32_t        VBlankTimeout;
366837d542aSEvan Quan     uint32_t        TrainTimeGap;
367837d542aSEvan Quan     uint32_t        MvddSwitchTime;
368837d542aSEvan Quan     uint32_t        LongestAcpiTrainTime;
369837d542aSEvan Quan     uint32_t        AcpiDelay;
370837d542aSEvan Quan     uint32_t        G5TrainTime;
371837d542aSEvan Quan     uint32_t        DelayMpllPwron;
372837d542aSEvan Quan     uint32_t        VoltageChangeTimeout;
373837d542aSEvan Quan #endif
374837d542aSEvan Quan     uint32_t        HandshakeDisables;
375837d542aSEvan Quan 
376837d542aSEvan Quan     uint8_t         DisplayPhy1Config;
377837d542aSEvan Quan     uint8_t         DisplayPhy2Config;
378837d542aSEvan Quan     uint8_t         DisplayPhy3Config;
379837d542aSEvan Quan     uint8_t         DisplayPhy4Config;
380837d542aSEvan Quan 
381837d542aSEvan Quan     uint8_t         DisplayPhy5Config;
382837d542aSEvan Quan     uint8_t         DisplayPhy6Config;
383837d542aSEvan Quan     uint8_t         DisplayPhy7Config;
384837d542aSEvan Quan     uint8_t         DisplayPhy8Config;
385837d542aSEvan Quan 
386837d542aSEvan Quan     uint32_t        AverageGraphicsActivity;
387837d542aSEvan Quan     uint32_t        AverageMemoryActivity;
388837d542aSEvan Quan     uint32_t        AverageGioActivity;
389837d542aSEvan Quan 
390837d542aSEvan Quan     uint8_t         SClkDpmEnabledLevels;
391837d542aSEvan Quan     uint8_t         MClkDpmEnabledLevels;
392837d542aSEvan Quan     uint8_t         LClkDpmEnabledLevels;
393837d542aSEvan Quan     uint8_t         PCIeDpmEnabledLevels;
394837d542aSEvan Quan 
395837d542aSEvan Quan     uint32_t        DRAM_LOG_ADDR_H;
396837d542aSEvan Quan     uint32_t        DRAM_LOG_ADDR_L;
397837d542aSEvan Quan     uint32_t        DRAM_LOG_PHY_ADDR_H;
398837d542aSEvan Quan     uint32_t        DRAM_LOG_PHY_ADDR_L;
399837d542aSEvan Quan     uint32_t        DRAM_LOG_BUFF_SIZE;
400837d542aSEvan Quan     uint32_t        UlvEnterCount;
401837d542aSEvan Quan     uint32_t        UlvTime;
402837d542aSEvan Quan     uint32_t        UcodeLoadStatus;
403837d542aSEvan Quan     uint8_t         DPMFreezeAndForced;
404837d542aSEvan Quan     uint8_t         Activity_Weight;
405837d542aSEvan Quan     uint8_t         Reserved8[2];
406837d542aSEvan Quan     uint32_t        Reserved;
407837d542aSEvan Quan };
408837d542aSEvan Quan 
409837d542aSEvan Quan typedef struct SMU71_SoftRegisters SMU71_SoftRegisters;
410837d542aSEvan Quan 
411*d12d9229SRan Sun struct SMU71_Firmware_Header {
412837d542aSEvan Quan     uint32_t Digest[5];
413837d542aSEvan Quan     uint32_t Version;
414837d542aSEvan Quan     uint32_t HeaderSize;
415837d542aSEvan Quan     uint32_t Flags;
416837d542aSEvan Quan     uint32_t EntryPoint;
417837d542aSEvan Quan     uint32_t CodeSize;
418837d542aSEvan Quan     uint32_t ImageSize;
419837d542aSEvan Quan 
420837d542aSEvan Quan     uint32_t Rtos;
421837d542aSEvan Quan     uint32_t SoftRegisters;
422837d542aSEvan Quan     uint32_t DpmTable;
423837d542aSEvan Quan     uint32_t FanTable;
424837d542aSEvan Quan     uint32_t CacConfigTable;
425837d542aSEvan Quan     uint32_t CacStatusTable;
426837d542aSEvan Quan 
427837d542aSEvan Quan     uint32_t mcRegisterTable;
428837d542aSEvan Quan 
429837d542aSEvan Quan     uint32_t mcArbDramTimingTable;
430837d542aSEvan Quan 
431837d542aSEvan Quan     uint32_t PmFuseTable;
432837d542aSEvan Quan     uint32_t Globals;
433837d542aSEvan Quan     uint32_t UvdDpmTable;
434837d542aSEvan Quan     uint32_t AcpDpmTable;
435837d542aSEvan Quan     uint32_t VceDpmTable;
436837d542aSEvan Quan     uint32_t SamuDpmTable;
437837d542aSEvan Quan     uint32_t UlvSettings;
438837d542aSEvan Quan     uint32_t Reserved[37];
439837d542aSEvan Quan     uint32_t Signature;
440837d542aSEvan Quan };
441837d542aSEvan Quan 
442837d542aSEvan Quan typedef struct SMU71_Firmware_Header SMU71_Firmware_Header;
443837d542aSEvan Quan 
444837d542aSEvan Quan struct SMU7_HystController_Data
445837d542aSEvan Quan {
446837d542aSEvan Quan     uint8_t waterfall_up;
447837d542aSEvan Quan     uint8_t waterfall_down;
448837d542aSEvan Quan     uint8_t pstate;
449837d542aSEvan Quan     uint8_t clamp_mode;
450837d542aSEvan Quan };
451837d542aSEvan Quan 
452837d542aSEvan Quan typedef struct SMU7_HystController_Data SMU7_HystController_Data;
453837d542aSEvan Quan 
454837d542aSEvan Quan #define SMU71_FIRMWARE_HEADER_LOCATION 0x20000
455837d542aSEvan Quan 
456837d542aSEvan Quan enum  DisplayConfig {
457837d542aSEvan Quan     PowerDown = 1,
458837d542aSEvan Quan     DP54x4,
459837d542aSEvan Quan     DP54x2,
460837d542aSEvan Quan     DP54x1,
461837d542aSEvan Quan     DP27x4,
462837d542aSEvan Quan     DP27x2,
463837d542aSEvan Quan     DP27x1,
464837d542aSEvan Quan     HDMI297,
465837d542aSEvan Quan     HDMI162,
466837d542aSEvan Quan     LVDS,
467837d542aSEvan Quan     DP324x4,
468837d542aSEvan Quan     DP324x2,
469837d542aSEvan Quan     DP324x1
470837d542aSEvan Quan };
471837d542aSEvan Quan 
472837d542aSEvan Quan //#define SX_BLOCK_COUNT 8
473837d542aSEvan Quan //#define MC_BLOCK_COUNT 1
474837d542aSEvan Quan //#define CPL_BLOCK_COUNT 27
475837d542aSEvan Quan 
476837d542aSEvan Quan #if defined SMU__VARIANT__ICELAND
477837d542aSEvan Quan   #define SX_BLOCK_COUNT 8
478837d542aSEvan Quan   #define MC_BLOCK_COUNT 1
479837d542aSEvan Quan   #define CPL_BLOCK_COUNT 29
480837d542aSEvan Quan #endif
481837d542aSEvan Quan 
482837d542aSEvan Quan struct SMU7_Local_Cac {
483837d542aSEvan Quan   uint8_t BlockId;
484837d542aSEvan Quan   uint8_t SignalId;
485837d542aSEvan Quan   uint8_t Threshold;
486837d542aSEvan Quan   uint8_t Padding;
487837d542aSEvan Quan };
488837d542aSEvan Quan 
489837d542aSEvan Quan typedef struct SMU7_Local_Cac SMU7_Local_Cac;
490837d542aSEvan Quan 
491837d542aSEvan Quan struct SMU7_Local_Cac_Table {
492837d542aSEvan Quan   SMU7_Local_Cac SxLocalCac[SX_BLOCK_COUNT];
493837d542aSEvan Quan   SMU7_Local_Cac CplLocalCac[CPL_BLOCK_COUNT];
494837d542aSEvan Quan   SMU7_Local_Cac McLocalCac[MC_BLOCK_COUNT];
495837d542aSEvan Quan };
496837d542aSEvan Quan 
497837d542aSEvan Quan typedef struct SMU7_Local_Cac_Table SMU7_Local_Cac_Table;
498837d542aSEvan Quan 
499837d542aSEvan Quan #if !defined(SMC_MICROCODE)
500837d542aSEvan Quan #pragma pack(pop)
501837d542aSEvan Quan #endif
502837d542aSEvan Quan 
503837d542aSEvan Quan #endif
504837d542aSEvan Quan 
505