1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #ifndef __DAL_CLK_MGR_H__
27 #define __DAL_CLK_MGR_H__
28
29 #include "dc.h"
30
31 #define DCN_MINIMUM_DISPCLK_Khz 100000
32 #define DCN_MINIMUM_DPPCLK_Khz 100000
33
34 #ifdef CONFIG_DRM_AMD_DC_DCN2_1
35
36 #define DDR4_DRAM_WIDTH 64
37 #define WM_A 0
38 #define WM_B 1
39 #define WM_C 2
40 #define WM_D 3
41 #define WM_SET_COUNT 4
42 #endif
43
44 #define DCN_MINIMUM_DISPCLK_Khz 100000
45 #define DCN_MINIMUM_DPPCLK_Khz 100000
46
47 #ifdef CONFIG_DRM_AMD_DC_DCN2_1
48
49
50 #define MAX_NUM_DPM_LVL 4
51 #define WM_SET_COUNT 4
52
53
54 struct clk_limit_table_entry {
55 unsigned int voltage;
56 unsigned int dcfclk_mhz;
57 unsigned int fclk_mhz;
58 unsigned int memclk_mhz;
59 unsigned int socclk_mhz;
60 };
61
62
63 struct clk_limit_table {
64 struct clk_limit_table_entry entries[MAX_NUM_DPM_LVL];
65 unsigned int num_entries;
66 };
67
68 struct wm_range_table_entry {
69 unsigned int wm_inst;
70 unsigned int wm_type;
71 double pstate_latency_us;
72 bool valid;
73 };
74
75
76 struct clk_log_info {
77 bool enabled;
78 char *pBuf;
79 unsigned int bufSize;
80 unsigned int *sum_chars_printed;
81 };
82
83 struct clk_state_registers_and_bypass {
84 uint32_t dcfclk;
85 uint32_t dcf_deep_sleep_divider;
86 uint32_t dcf_deep_sleep_allow;
87 uint32_t dprefclk;
88 uint32_t dispclk;
89 uint32_t dppclk;
90
91 uint32_t dppclk_bypass;
92 uint32_t dcfclk_bypass;
93 uint32_t dprefclk_bypass;
94 uint32_t dispclk_bypass;
95 };
96
97 struct rv1_clk_internal {
98 uint32_t CLK0_CLK8_CURRENT_CNT;
99 uint32_t CLK0_CLK8_DS_CNTL;
100 uint32_t CLK0_CLK8_ALLOW_DS;
101 uint32_t CLK0_CLK10_CURRENT_CNT;
102 uint32_t CLK0_CLK11_CURRENT_CNT;
103
104 uint32_t CLK0_CLK8_BYPASS_CNTL;
105 uint32_t CLK0_CLK10_BYPASS_CNTL;
106 uint32_t CLK0_CLK11_BYPASS_CNTL;
107 };
108
109 struct rn_clk_internal {
110 uint32_t CLK1_CLK0_CURRENT_CNT;
111 uint32_t CLK1_CLK1_CURRENT_CNT;
112 uint32_t CLK1_CLK2_CURRENT_CNT;
113 uint32_t CLK1_CLK3_CURRENT_CNT;
114 uint32_t CLK1_CLK3_DS_CNTL;
115 uint32_t CLK1_CLK3_ALLOW_DS;
116
117 uint32_t CLK1_CLK0_BYPASS_CNTL;
118 uint32_t CLK1_CLK1_BYPASS_CNTL;
119 uint32_t CLK1_CLK2_BYPASS_CNTL;
120 uint32_t CLK1_CLK3_BYPASS_CNTL;
121
122 };
123
124
125 struct clk_state_registers {
126 uint32_t CLK0_CLK8_CURRENT_CNT;
127 uint32_t CLK0_CLK8_DS_CNTL;
128 uint32_t CLK0_CLK8_ALLOW_DS;
129 uint32_t CLK0_CLK10_CURRENT_CNT;
130 uint32_t CLK0_CLK11_CURRENT_CNT;
131 };
132
133
134 struct clk_bypass {
135 uint32_t dcfclk_bypass;
136 uint32_t dispclk_pypass;
137 uint32_t dprefclk_bypass;
138 };
139
140
141
142
143
144
145 struct wm_table {
146 struct wm_range_table_entry entries[WM_SET_COUNT];
147 };
148
149 struct clk_bw_params {
150 unsigned int vram_type;
151 unsigned int num_channels;
152 struct clk_limit_table clk_table;
153 struct wm_table wm_table;
154 };
155 #endif
156
157
158 struct clk_states {
159 uint32_t dprefclk_khz;
160 };
161
162 struct clk_mgr_funcs {
163
164
165
166
167
168
169
170 void (*update_clocks)(struct clk_mgr *clk_mgr,
171 struct dc_state *context,
172 bool safe_to_lower);
173
174 int (*get_dp_ref_clk_frequency)(struct clk_mgr *clk_mgr);
175
176 void (*init_clocks)(struct clk_mgr *clk_mgr);
177
178 void (*enable_pme_wa) (struct clk_mgr *clk_mgr);
179 void (*get_clock)(struct clk_mgr *clk_mgr,
180 struct dc_state *context,
181 enum dc_clock_type clock_type,
182 struct dc_clock_config *clock_cfg);
183 };
184
185 struct clk_mgr {
186 struct dc_context *ctx;
187 struct clk_mgr_funcs *funcs;
188 struct dc_clocks clks;
189 int dprefclk_khz;
190 #ifdef CONFIG_DRM_AMD_DC_DCN2_1
191 struct clk_bw_params *bw_params;
192 #endif
193 };
194
195
196 struct dccg;
197
198 struct clk_mgr *dc_clk_mgr_create(struct dc_context *ctx, struct pp_smu_funcs *pp_smu, struct dccg *dccg);
199
200 void dc_destroy_clk_mgr(struct clk_mgr *clk_mgr);
201
202 #endif