xref: /openbsd-src/sys/dev/pci/drm/radeon/smu7_fusion.h (revision 7ccd5a2c19d4480fd59ed7bbf02608c8980a7858)
1*7ccd5a2cSjsg /*
2*7ccd5a2cSjsg  * Copyright 2013 Advanced Micro Devices, Inc.
3*7ccd5a2cSjsg  *
4*7ccd5a2cSjsg  * Permission is hereby granted, free of charge, to any person obtaining a
5*7ccd5a2cSjsg  * copy of this software and associated documentation files (the "Software"),
6*7ccd5a2cSjsg  * to deal in the Software without restriction, including without limitation
7*7ccd5a2cSjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*7ccd5a2cSjsg  * and/or sell copies of the Software, and to permit persons to whom the
9*7ccd5a2cSjsg  * Software is furnished to do so, subject to the following conditions:
10*7ccd5a2cSjsg  *
11*7ccd5a2cSjsg  * The above copyright notice and this permission notice shall be included in
12*7ccd5a2cSjsg  * all copies or substantial portions of the Software.
13*7ccd5a2cSjsg  *
14*7ccd5a2cSjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*7ccd5a2cSjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*7ccd5a2cSjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*7ccd5a2cSjsg  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*7ccd5a2cSjsg  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*7ccd5a2cSjsg  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*7ccd5a2cSjsg  * OTHER DEALINGS IN THE SOFTWARE.
21*7ccd5a2cSjsg  *
22*7ccd5a2cSjsg  */
23*7ccd5a2cSjsg 
24*7ccd5a2cSjsg #ifndef SMU7_FUSION_H
25*7ccd5a2cSjsg #define SMU7_FUSION_H
26*7ccd5a2cSjsg 
27*7ccd5a2cSjsg #include "smu7.h"
28*7ccd5a2cSjsg 
29*7ccd5a2cSjsg #pragma pack(push, 1)
30*7ccd5a2cSjsg 
31*7ccd5a2cSjsg #define SMU7_DTE_ITERATIONS 5
32*7ccd5a2cSjsg #define SMU7_DTE_SOURCES 5
33*7ccd5a2cSjsg #define SMU7_DTE_SINKS 3
34*7ccd5a2cSjsg #define SMU7_NUM_CPU_TES 2
35*7ccd5a2cSjsg #define SMU7_NUM_GPU_TES 1
36*7ccd5a2cSjsg #define SMU7_NUM_NON_TES 2
37*7ccd5a2cSjsg 
38*7ccd5a2cSjsg // All 'soft registers' should be uint32_t.
39*7ccd5a2cSjsg struct SMU7_SoftRegisters
40*7ccd5a2cSjsg {
41*7ccd5a2cSjsg     uint32_t        RefClockFrequency;
42*7ccd5a2cSjsg     uint32_t        PmTimerP;
43*7ccd5a2cSjsg     uint32_t        FeatureEnables;
44*7ccd5a2cSjsg     uint32_t        HandshakeDisables;
45*7ccd5a2cSjsg 
46*7ccd5a2cSjsg     uint8_t         DisplayPhy1Config;
47*7ccd5a2cSjsg     uint8_t         DisplayPhy2Config;
48*7ccd5a2cSjsg     uint8_t         DisplayPhy3Config;
49*7ccd5a2cSjsg     uint8_t         DisplayPhy4Config;
50*7ccd5a2cSjsg 
51*7ccd5a2cSjsg     uint8_t         DisplayPhy5Config;
52*7ccd5a2cSjsg     uint8_t         DisplayPhy6Config;
53*7ccd5a2cSjsg     uint8_t         DisplayPhy7Config;
54*7ccd5a2cSjsg     uint8_t         DisplayPhy8Config;
55*7ccd5a2cSjsg 
56*7ccd5a2cSjsg     uint32_t        AverageGraphicsA;
57*7ccd5a2cSjsg     uint32_t        AverageMemoryA;
58*7ccd5a2cSjsg     uint32_t        AverageGioA;
59*7ccd5a2cSjsg 
60*7ccd5a2cSjsg     uint8_t         SClkDpmEnabledLevels;
61*7ccd5a2cSjsg     uint8_t         MClkDpmEnabledLevels;
62*7ccd5a2cSjsg     uint8_t         LClkDpmEnabledLevels;
63*7ccd5a2cSjsg     uint8_t         PCIeDpmEnabledLevels;
64*7ccd5a2cSjsg 
65*7ccd5a2cSjsg     uint8_t         UVDDpmEnabledLevels;
66*7ccd5a2cSjsg     uint8_t         SAMUDpmEnabledLevels;
67*7ccd5a2cSjsg     uint8_t         ACPDpmEnabledLevels;
68*7ccd5a2cSjsg     uint8_t         VCEDpmEnabledLevels;
69*7ccd5a2cSjsg 
70*7ccd5a2cSjsg     uint32_t        DRAM_LOG_ADDR_H;
71*7ccd5a2cSjsg     uint32_t        DRAM_LOG_ADDR_L;
72*7ccd5a2cSjsg     uint32_t        DRAM_LOG_PHY_ADDR_H;
73*7ccd5a2cSjsg     uint32_t        DRAM_LOG_PHY_ADDR_L;
74*7ccd5a2cSjsg     uint32_t        DRAM_LOG_BUFF_SIZE;
75*7ccd5a2cSjsg     uint32_t        UlvEnterC;
76*7ccd5a2cSjsg     uint32_t        UlvTime;
77*7ccd5a2cSjsg     uint32_t        Reserved[3];
78*7ccd5a2cSjsg 
79*7ccd5a2cSjsg };
80*7ccd5a2cSjsg 
81*7ccd5a2cSjsg typedef struct SMU7_SoftRegisters SMU7_SoftRegisters;
82*7ccd5a2cSjsg 
83*7ccd5a2cSjsg struct SMU7_Fusion_GraphicsLevel
84*7ccd5a2cSjsg {
85*7ccd5a2cSjsg     uint32_t    MinVddNb;
86*7ccd5a2cSjsg 
87*7ccd5a2cSjsg     uint32_t    SclkFrequency;
88*7ccd5a2cSjsg 
89*7ccd5a2cSjsg     uint8_t     Vid;
90*7ccd5a2cSjsg     uint8_t     VidOffset;
91*7ccd5a2cSjsg     uint16_t    AT;
92*7ccd5a2cSjsg 
93*7ccd5a2cSjsg     uint8_t     PowerThrottle;
94*7ccd5a2cSjsg     uint8_t     GnbSlow;
95*7ccd5a2cSjsg     uint8_t     ForceNbPs1;
96*7ccd5a2cSjsg     uint8_t     SclkDid;
97*7ccd5a2cSjsg 
98*7ccd5a2cSjsg     uint8_t     DisplayWatermark;
99*7ccd5a2cSjsg     uint8_t     EnabledForActivity;
100*7ccd5a2cSjsg     uint8_t     EnabledForThrottle;
101*7ccd5a2cSjsg     uint8_t     UpH;
102*7ccd5a2cSjsg 
103*7ccd5a2cSjsg     uint8_t     DownH;
104*7ccd5a2cSjsg     uint8_t     VoltageDownH;
105*7ccd5a2cSjsg     uint8_t     DeepSleepDivId;
106*7ccd5a2cSjsg 
107*7ccd5a2cSjsg     uint8_t     ClkBypassCntl;
108*7ccd5a2cSjsg 
109*7ccd5a2cSjsg     uint32_t    reserved;
110*7ccd5a2cSjsg };
111*7ccd5a2cSjsg 
112*7ccd5a2cSjsg typedef struct SMU7_Fusion_GraphicsLevel SMU7_Fusion_GraphicsLevel;
113*7ccd5a2cSjsg 
114*7ccd5a2cSjsg struct SMU7_Fusion_GIOLevel
115*7ccd5a2cSjsg {
116*7ccd5a2cSjsg     uint8_t     EnabledForActivity;
117*7ccd5a2cSjsg     uint8_t     LclkDid;
118*7ccd5a2cSjsg     uint8_t     Vid;
119*7ccd5a2cSjsg     uint8_t     VoltageDownH;
120*7ccd5a2cSjsg 
121*7ccd5a2cSjsg     uint32_t    MinVddNb;
122*7ccd5a2cSjsg 
123*7ccd5a2cSjsg     uint16_t    ResidencyCounter;
124*7ccd5a2cSjsg     uint8_t     UpH;
125*7ccd5a2cSjsg     uint8_t     DownH;
126*7ccd5a2cSjsg 
127*7ccd5a2cSjsg     uint32_t    LclkFrequency;
128*7ccd5a2cSjsg 
129*7ccd5a2cSjsg     uint8_t     ActivityLevel;
130*7ccd5a2cSjsg     uint8_t     EnabledForThrottle;
131*7ccd5a2cSjsg 
132*7ccd5a2cSjsg     uint8_t     ClkBypassCntl;
133*7ccd5a2cSjsg 
134*7ccd5a2cSjsg     uint8_t     padding;
135*7ccd5a2cSjsg };
136*7ccd5a2cSjsg 
137*7ccd5a2cSjsg typedef struct SMU7_Fusion_GIOLevel SMU7_Fusion_GIOLevel;
138*7ccd5a2cSjsg 
139*7ccd5a2cSjsg // UVD VCLK/DCLK state (level) definition.
140*7ccd5a2cSjsg struct SMU7_Fusion_UvdLevel
141*7ccd5a2cSjsg {
142*7ccd5a2cSjsg     uint32_t VclkFrequency;
143*7ccd5a2cSjsg     uint32_t DclkFrequency;
144*7ccd5a2cSjsg     uint16_t MinVddNb;
145*7ccd5a2cSjsg     uint8_t  VclkDivider;
146*7ccd5a2cSjsg     uint8_t  DclkDivider;
147*7ccd5a2cSjsg 
148*7ccd5a2cSjsg     uint8_t     VClkBypassCntl;
149*7ccd5a2cSjsg     uint8_t     DClkBypassCntl;
150*7ccd5a2cSjsg 
151*7ccd5a2cSjsg     uint8_t     padding[2];
152*7ccd5a2cSjsg 
153*7ccd5a2cSjsg };
154*7ccd5a2cSjsg 
155*7ccd5a2cSjsg typedef struct SMU7_Fusion_UvdLevel SMU7_Fusion_UvdLevel;
156*7ccd5a2cSjsg 
157*7ccd5a2cSjsg // Clocks for other external blocks (VCE, ACP, SAMU).
158*7ccd5a2cSjsg struct SMU7_Fusion_ExtClkLevel
159*7ccd5a2cSjsg {
160*7ccd5a2cSjsg     uint32_t Frequency;
161*7ccd5a2cSjsg     uint16_t MinVoltage;
162*7ccd5a2cSjsg     uint8_t  Divider;
163*7ccd5a2cSjsg     uint8_t  ClkBypassCntl;
164*7ccd5a2cSjsg 
165*7ccd5a2cSjsg     uint32_t Reserved;
166*7ccd5a2cSjsg };
167*7ccd5a2cSjsg typedef struct SMU7_Fusion_ExtClkLevel SMU7_Fusion_ExtClkLevel;
168*7ccd5a2cSjsg 
169*7ccd5a2cSjsg struct SMU7_Fusion_ACPILevel
170*7ccd5a2cSjsg {
171*7ccd5a2cSjsg     uint32_t    Flags;
172*7ccd5a2cSjsg     uint32_t    MinVddNb;
173*7ccd5a2cSjsg     uint32_t    SclkFrequency;
174*7ccd5a2cSjsg     uint8_t     SclkDid;
175*7ccd5a2cSjsg     uint8_t     GnbSlow;
176*7ccd5a2cSjsg     uint8_t     ForceNbPs1;
177*7ccd5a2cSjsg     uint8_t     DisplayWatermark;
178*7ccd5a2cSjsg     uint8_t     DeepSleepDivId;
179*7ccd5a2cSjsg     uint8_t     padding[3];
180*7ccd5a2cSjsg };
181*7ccd5a2cSjsg 
182*7ccd5a2cSjsg typedef struct SMU7_Fusion_ACPILevel SMU7_Fusion_ACPILevel;
183*7ccd5a2cSjsg 
184*7ccd5a2cSjsg struct SMU7_Fusion_NbDpm
185*7ccd5a2cSjsg {
186*7ccd5a2cSjsg     uint8_t DpmXNbPsHi;
187*7ccd5a2cSjsg     uint8_t DpmXNbPsLo;
188*7ccd5a2cSjsg     uint8_t Dpm0PgNbPsHi;
189*7ccd5a2cSjsg     uint8_t Dpm0PgNbPsLo;
190*7ccd5a2cSjsg     uint8_t EnablePsi1;
191*7ccd5a2cSjsg     uint8_t SkipDPM0;
192*7ccd5a2cSjsg     uint8_t SkipPG;
193*7ccd5a2cSjsg     uint8_t Hysteresis;
194*7ccd5a2cSjsg     uint8_t EnableDpmPstatePoll;
195*7ccd5a2cSjsg     uint8_t padding[3];
196*7ccd5a2cSjsg };
197*7ccd5a2cSjsg 
198*7ccd5a2cSjsg typedef struct SMU7_Fusion_NbDpm SMU7_Fusion_NbDpm;
199*7ccd5a2cSjsg 
200*7ccd5a2cSjsg struct SMU7_Fusion_StateInfo
201*7ccd5a2cSjsg {
202*7ccd5a2cSjsg     uint32_t SclkFrequency;
203*7ccd5a2cSjsg     uint32_t LclkFrequency;
204*7ccd5a2cSjsg     uint32_t VclkFrequency;
205*7ccd5a2cSjsg     uint32_t DclkFrequency;
206*7ccd5a2cSjsg     uint32_t SamclkFrequency;
207*7ccd5a2cSjsg     uint32_t AclkFrequency;
208*7ccd5a2cSjsg     uint32_t EclkFrequency;
209*7ccd5a2cSjsg     uint8_t  DisplayWatermark;
210*7ccd5a2cSjsg     uint8_t  McArbIndex;
211*7ccd5a2cSjsg     int8_t   SclkIndex;
212*7ccd5a2cSjsg     int8_t   MclkIndex;
213*7ccd5a2cSjsg };
214*7ccd5a2cSjsg 
215*7ccd5a2cSjsg typedef struct SMU7_Fusion_StateInfo SMU7_Fusion_StateInfo;
216*7ccd5a2cSjsg 
217*7ccd5a2cSjsg struct SMU7_Fusion_DpmTable
218*7ccd5a2cSjsg {
219*7ccd5a2cSjsg     uint32_t                            SystemFlags;
220*7ccd5a2cSjsg 
221*7ccd5a2cSjsg     SMU7_PIDController                  GraphicsPIDController;
222*7ccd5a2cSjsg     SMU7_PIDController                  GioPIDController;
223*7ccd5a2cSjsg 
224*7ccd5a2cSjsg     uint8_t                            GraphicsDpmLevelCount;
225*7ccd5a2cSjsg     uint8_t                            GIOLevelCount;
226*7ccd5a2cSjsg     uint8_t                            UvdLevelCount;
227*7ccd5a2cSjsg     uint8_t                            VceLevelCount;
228*7ccd5a2cSjsg 
229*7ccd5a2cSjsg     uint8_t                            AcpLevelCount;
230*7ccd5a2cSjsg     uint8_t                            SamuLevelCount;
231*7ccd5a2cSjsg     uint16_t                           FpsHighT;
232*7ccd5a2cSjsg 
233*7ccd5a2cSjsg     SMU7_Fusion_GraphicsLevel         GraphicsLevel           [SMU__NUM_SCLK_DPM_STATE];
234*7ccd5a2cSjsg     SMU7_Fusion_ACPILevel             ACPILevel;
235*7ccd5a2cSjsg     SMU7_Fusion_UvdLevel              UvdLevel                [SMU7_MAX_LEVELS_UVD];
236*7ccd5a2cSjsg     SMU7_Fusion_ExtClkLevel           VceLevel                [SMU7_MAX_LEVELS_VCE];
237*7ccd5a2cSjsg     SMU7_Fusion_ExtClkLevel           AcpLevel                [SMU7_MAX_LEVELS_ACP];
238*7ccd5a2cSjsg     SMU7_Fusion_ExtClkLevel           SamuLevel               [SMU7_MAX_LEVELS_SAMU];
239*7ccd5a2cSjsg 
240*7ccd5a2cSjsg     uint8_t                           UvdBootLevel;
241*7ccd5a2cSjsg     uint8_t                           VceBootLevel;
242*7ccd5a2cSjsg     uint8_t                           AcpBootLevel;
243*7ccd5a2cSjsg     uint8_t                           SamuBootLevel;
244*7ccd5a2cSjsg     uint8_t                           UVDInterval;
245*7ccd5a2cSjsg     uint8_t                           VCEInterval;
246*7ccd5a2cSjsg     uint8_t                           ACPInterval;
247*7ccd5a2cSjsg     uint8_t                           SAMUInterval;
248*7ccd5a2cSjsg 
249*7ccd5a2cSjsg     uint8_t                           GraphicsBootLevel;
250*7ccd5a2cSjsg     uint8_t                           GraphicsInterval;
251*7ccd5a2cSjsg     uint8_t                           GraphicsThermThrottleEnable;
252*7ccd5a2cSjsg     uint8_t                           GraphicsVoltageChangeEnable;
253*7ccd5a2cSjsg 
254*7ccd5a2cSjsg     uint8_t                           GraphicsClkSlowEnable;
255*7ccd5a2cSjsg     uint8_t                           GraphicsClkSlowDivider;
256*7ccd5a2cSjsg     uint16_t                          FpsLowT;
257*7ccd5a2cSjsg 
258*7ccd5a2cSjsg     uint32_t                          DisplayCac;
259*7ccd5a2cSjsg     uint32_t                          LowSclkInterruptT;
260*7ccd5a2cSjsg 
261*7ccd5a2cSjsg     uint32_t                          DRAM_LOG_ADDR_H;
262*7ccd5a2cSjsg     uint32_t                          DRAM_LOG_ADDR_L;
263*7ccd5a2cSjsg     uint32_t                          DRAM_LOG_PHY_ADDR_H;
264*7ccd5a2cSjsg     uint32_t                          DRAM_LOG_PHY_ADDR_L;
265*7ccd5a2cSjsg     uint32_t                          DRAM_LOG_BUFF_SIZE;
266*7ccd5a2cSjsg 
267*7ccd5a2cSjsg };
268*7ccd5a2cSjsg 
269*7ccd5a2cSjsg struct SMU7_Fusion_GIODpmTable
270*7ccd5a2cSjsg {
271*7ccd5a2cSjsg 
272*7ccd5a2cSjsg     SMU7_Fusion_GIOLevel              GIOLevel                [SMU7_MAX_LEVELS_GIO];
273*7ccd5a2cSjsg 
274*7ccd5a2cSjsg     SMU7_PIDController                GioPIDController;
275*7ccd5a2cSjsg 
276*7ccd5a2cSjsg     uint32_t                          GIOLevelCount;
277*7ccd5a2cSjsg 
278*7ccd5a2cSjsg     uint8_t                           Enable;
279*7ccd5a2cSjsg     uint8_t                           GIOVoltageChangeEnable;
280*7ccd5a2cSjsg     uint8_t                           GIOBootLevel;
281*7ccd5a2cSjsg     uint8_t                           padding;
282*7ccd5a2cSjsg     uint8_t                           padding1[2];
283*7ccd5a2cSjsg     uint8_t                           TargetState;
284*7ccd5a2cSjsg     uint8_t                           CurrenttState;
285*7ccd5a2cSjsg     uint8_t                           ThrottleOnHtc;
286*7ccd5a2cSjsg     uint8_t                           ThermThrottleStatus;
287*7ccd5a2cSjsg     uint8_t                           ThermThrottleTempSelect;
288*7ccd5a2cSjsg     uint8_t                           ThermThrottleEnable;
289*7ccd5a2cSjsg     uint16_t                          TemperatureLimitHigh;
290*7ccd5a2cSjsg     uint16_t                          TemperatureLimitLow;
291*7ccd5a2cSjsg 
292*7ccd5a2cSjsg };
293*7ccd5a2cSjsg 
294*7ccd5a2cSjsg typedef struct SMU7_Fusion_DpmTable SMU7_Fusion_DpmTable;
295*7ccd5a2cSjsg typedef struct SMU7_Fusion_GIODpmTable SMU7_Fusion_GIODpmTable;
296*7ccd5a2cSjsg 
297*7ccd5a2cSjsg #pragma pack(pop)
298*7ccd5a2cSjsg 
299*7ccd5a2cSjsg #endif
300*7ccd5a2cSjsg 
301