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