2 * Copyright 2016 Advanced Micro Devices, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
26 #include "dm_services.h"
27 #include "dcn10_hubp.h"
28 #include "dcn10_hubbub.h"
29 #include "reg_helper.h"
39 #define FN(reg_name, field_name) \
40 hubbub->shifts->field_name, hubbub->masks->field_name
42 void hubbub1_wm_read_state(struct hubbub *hubbub,
43 struct dcn_hubbub_wm *wm)
45 struct dcn_hubbub_wm_set *s;
47 memset(wm, 0, sizeof(struct dcn_hubbub_wm));
51 s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A);
52 s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A);
53 if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A)) {
54 s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A);
55 s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A);
57 s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A);
61 s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B);
62 s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B);
63 if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B)) {
64 s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B);
65 s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B);
67 s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B);
71 s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C);
72 s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C);
73 if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C)) {
74 s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C);
75 s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C);
77 s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C);
81 s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D);
82 s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D);
83 if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D)) {
84 s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D);
85 s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D);
87 s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D);
90 bool hubbub1_verify_allow_pstate_change_high(
91 struct hubbub *hubbub)
93 /* pstate latency is ~20us so if we wait over 40us and pstate allow
94 * still not asserted, we are probably stuck and going to hang
96 * TODO: Figure out why it takes ~100us on linux
97 * pstate takes around ~100us on linux. Unknown currently as to
98 * why it takes that long on linux
100 static unsigned int pstate_wait_timeout_us = 200;
101 static unsigned int pstate_wait_expected_timeout_us = 40;
102 static unsigned int max_sampled_pstate_wait_us; /* data collection */
103 static bool forced_pstate_allow; /* help with revert wa */
105 unsigned int debug_data;
108 if (forced_pstate_allow) {
109 /* we hacked to force pstate allow to prevent hang last time
110 * we verify_allow_pstate_change_high. so disable force
111 * here so we can check status
113 REG_UPDATE_2(DCHUBBUB_ARB_DRAM_STATE_CNTL,
114 DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_VALUE, 0,
115 DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_ENABLE, 0);
116 forced_pstate_allow = false;
120 * dchubbubdebugind, at: 0x7
121 * description "3-0: Pipe0 cursor0 QOS
122 * 7-4: Pipe1 cursor0 QOS
123 * 11-8: Pipe2 cursor0 QOS
124 * 15-12: Pipe3 cursor0 QOS
125 * 16: Pipe0 Plane0 Allow Pstate Change
126 * 17: Pipe1 Plane0 Allow Pstate Change
127 * 18: Pipe2 Plane0 Allow Pstate Change
128 * 19: Pipe3 Plane0 Allow Pstate Change
129 * 20: Pipe0 Plane1 Allow Pstate Change
130 * 21: Pipe1 Plane1 Allow Pstate Change
131 * 22: Pipe2 Plane1 Allow Pstate Change
132 * 23: Pipe3 Plane1 Allow Pstate Change
133 * 24: Pipe0 cursor0 Allow Pstate Change
134 * 25: Pipe1 cursor0 Allow Pstate Change
135 * 26: Pipe2 cursor0 Allow Pstate Change
136 * 27: Pipe3 cursor0 Allow Pstate Change
137 * 28: WB0 Allow Pstate Change
138 * 29: WB1 Allow Pstate Change
139 * 30: Arbiter's allow_pstate_change
140 * 31: SOC pstate change request
144 REG_WRITE(DCHUBBUB_TEST_DEBUG_INDEX, hubbub->debug_test_index_pstate);
146 for (i = 0; i < pstate_wait_timeout_us; i++) {
147 debug_data = REG_READ(DCHUBBUB_TEST_DEBUG_DATA);
149 if (debug_data & (1 << 30)) {
151 if (i > pstate_wait_expected_timeout_us)
152 DC_LOG_WARNING("pstate took longer than expected ~%dus\n",
157 if (max_sampled_pstate_wait_us < i)
158 max_sampled_pstate_wait_us = i;
163 /* force pstate allow to prevent system hang
164 * and break to debugger to investigate
166 REG_UPDATE_2(DCHUBBUB_ARB_DRAM_STATE_CNTL,
167 DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_VALUE, 1,
168 DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_ENABLE, 1);
169 forced_pstate_allow = true;
171 DC_LOG_WARNING("pstate TEST_DEBUG_DATA: 0x%X\n",
177 static uint32_t convert_and_clamp(
180 uint32_t clamp_value)
182 uint32_t ret_val = 0;
183 ret_val = wm_ns * refclk_mhz;
186 if (ret_val > clamp_value)
187 ret_val = clamp_value;
193 void hubbub1_program_watermarks(
194 struct hubbub *hubbub,
195 struct dcn_watermark_set *watermarks,
196 unsigned int refclk_mhz)
198 uint32_t force_en = hubbub->ctx->dc->debug.disable_stutter ? 1 : 0;
200 * Need to clamp to max of the register values (i.e. no wrap)
201 * for dcn1, all wm registers are 21-bit wide
203 uint32_t prog_wm_value;
205 REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
206 DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 0);
208 /* Repeat for water mark set A, B, C and D. */
210 prog_wm_value = convert_and_clamp(watermarks->a.urgent_ns,
211 refclk_mhz, 0x1fffff);
212 REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, prog_wm_value);
214 DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_A calculated =%d\n"
215 "HW register value = 0x%x\n",
216 watermarks->a.urgent_ns, prog_wm_value);
218 prog_wm_value = convert_and_clamp(watermarks->a.pte_meta_urgent_ns,
219 refclk_mhz, 0x1fffff);
220 REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A, prog_wm_value);
221 DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_A calculated =%d\n"
222 "HW register value = 0x%x\n",
223 watermarks->a.pte_meta_urgent_ns, prog_wm_value);
225 if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A)) {
226 prog_wm_value = convert_and_clamp(
227 watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns,
228 refclk_mhz, 0x1fffff);
229 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, prog_wm_value);
230 DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_A calculated =%d\n"
231 "HW register value = 0x%x\n",
232 watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
235 prog_wm_value = convert_and_clamp(
236 watermarks->a.cstate_pstate.cstate_exit_ns,
237 refclk_mhz, 0x1fffff);
238 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, prog_wm_value);
239 DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_A calculated =%d\n"
240 "HW register value = 0x%x\n",
241 watermarks->a.cstate_pstate.cstate_exit_ns, prog_wm_value);
244 prog_wm_value = convert_and_clamp(
245 watermarks->a.cstate_pstate.pstate_change_ns,
246 refclk_mhz, 0x1fffff);
247 REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, prog_wm_value);
248 DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_A calculated =%d\n"
249 "HW register value = 0x%x\n\n",
250 watermarks->a.cstate_pstate.pstate_change_ns, prog_wm_value);
254 prog_wm_value = convert_and_clamp(
255 watermarks->b.urgent_ns, refclk_mhz, 0x1fffff);
256 REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, prog_wm_value);
257 DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_B calculated =%d\n"
258 "HW register value = 0x%x\n",
259 watermarks->b.urgent_ns, prog_wm_value);
262 prog_wm_value = convert_and_clamp(
263 watermarks->b.pte_meta_urgent_ns,
264 refclk_mhz, 0x1fffff);
265 REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B, prog_wm_value);
266 DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_B calculated =%d\n"
267 "HW register value = 0x%x\n",
268 watermarks->b.pte_meta_urgent_ns, prog_wm_value);
271 if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B)) {
272 prog_wm_value = convert_and_clamp(
273 watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns,
274 refclk_mhz, 0x1fffff);
275 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, prog_wm_value);
276 DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_B calculated =%d\n"
277 "HW register value = 0x%x\n",
278 watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
281 prog_wm_value = convert_and_clamp(
282 watermarks->b.cstate_pstate.cstate_exit_ns,
283 refclk_mhz, 0x1fffff);
284 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, prog_wm_value);
285 DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_B calculated =%d\n"
286 "HW register value = 0x%x\n",
287 watermarks->b.cstate_pstate.cstate_exit_ns, prog_wm_value);
290 prog_wm_value = convert_and_clamp(
291 watermarks->b.cstate_pstate.pstate_change_ns,
292 refclk_mhz, 0x1fffff);
293 REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, prog_wm_value);
294 DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_B calculated =%d\n\n"
295 "HW register value = 0x%x\n",
296 watermarks->b.cstate_pstate.pstate_change_ns, prog_wm_value);
299 prog_wm_value = convert_and_clamp(
300 watermarks->c.urgent_ns, refclk_mhz, 0x1fffff);
301 REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, prog_wm_value);
302 DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_C calculated =%d\n"
303 "HW register value = 0x%x\n",
304 watermarks->c.urgent_ns, prog_wm_value);
307 prog_wm_value = convert_and_clamp(
308 watermarks->c.pte_meta_urgent_ns,
309 refclk_mhz, 0x1fffff);
310 REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C, prog_wm_value);
311 DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_C calculated =%d\n"
312 "HW register value = 0x%x\n",
313 watermarks->c.pte_meta_urgent_ns, prog_wm_value);
316 if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C)) {
317 prog_wm_value = convert_and_clamp(
318 watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns,
319 refclk_mhz, 0x1fffff);
320 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, prog_wm_value);
321 DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_C calculated =%d\n"
322 "HW register value = 0x%x\n",
323 watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
326 prog_wm_value = convert_and_clamp(
327 watermarks->c.cstate_pstate.cstate_exit_ns,
328 refclk_mhz, 0x1fffff);
329 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, prog_wm_value);
330 DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_C calculated =%d\n"
331 "HW register value = 0x%x\n",
332 watermarks->c.cstate_pstate.cstate_exit_ns, prog_wm_value);
335 prog_wm_value = convert_and_clamp(
336 watermarks->c.cstate_pstate.pstate_change_ns,
337 refclk_mhz, 0x1fffff);
338 REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, prog_wm_value);
339 DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_C calculated =%d\n\n"
340 "HW register value = 0x%x\n",
341 watermarks->c.cstate_pstate.pstate_change_ns, prog_wm_value);
344 prog_wm_value = convert_and_clamp(
345 watermarks->d.urgent_ns, refclk_mhz, 0x1fffff);
346 REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, prog_wm_value);
347 DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_D calculated =%d\n"
348 "HW register value = 0x%x\n",
349 watermarks->d.urgent_ns, prog_wm_value);
351 prog_wm_value = convert_and_clamp(
352 watermarks->d.pte_meta_urgent_ns,
353 refclk_mhz, 0x1fffff);
354 REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D, prog_wm_value);
355 DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_D calculated =%d\n"
356 "HW register value = 0x%x\n",
357 watermarks->d.pte_meta_urgent_ns, prog_wm_value);
360 if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D)) {
361 prog_wm_value = convert_and_clamp(
362 watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns,
363 refclk_mhz, 0x1fffff);
364 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, prog_wm_value);
365 DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_D calculated =%d\n"
366 "HW register value = 0x%x\n",
367 watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
370 prog_wm_value = convert_and_clamp(
371 watermarks->d.cstate_pstate.cstate_exit_ns,
372 refclk_mhz, 0x1fffff);
373 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, prog_wm_value);
374 DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_D calculated =%d\n"
375 "HW register value = 0x%x\n",
376 watermarks->d.cstate_pstate.cstate_exit_ns, prog_wm_value);
380 prog_wm_value = convert_and_clamp(
381 watermarks->d.cstate_pstate.pstate_change_ns,
382 refclk_mhz, 0x1fffff);
383 REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, prog_wm_value);
384 DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_D calculated =%d\n"
385 "HW register value = 0x%x\n\n",
386 watermarks->d.cstate_pstate.pstate_change_ns, prog_wm_value);
388 REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
389 DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 1);
391 REG_UPDATE(DCHUBBUB_ARB_SAT_LEVEL,
392 DCHUBBUB_ARB_SAT_LEVEL, 60 * refclk_mhz);
393 REG_UPDATE(DCHUBBUB_ARB_DF_REQ_OUTSTAND,
394 DCHUBBUB_ARB_MIN_REQ_OUTSTAND, 68);
396 REG_UPDATE_2(DCHUBBUB_ARB_DRAM_STATE_CNTL,
397 DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_VALUE, 0,
398 DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_ENABLE, force_en);
401 REG_UPDATE_2(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
402 DCHUBBUB_ARB_WATERMARK_CHANGE_DONE_INTERRUPT_DISABLE, 1,
403 DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 1);
407 void hubbub1_update_dchub(
408 struct hubbub *hubbub,
409 struct dchub_init_data *dh_data)
411 /* TODO: port code from dal2 */
412 switch (dh_data->fb_mode) {
413 case FRAME_BUFFER_MODE_ZFB_ONLY:
414 /*For ZFB case need to put DCHUB FB BASE and TOP upside down to indicate ZFB mode*/
415 REG_UPDATE(DCHUBBUB_SDPIF_FB_TOP,
418 REG_UPDATE(DCHUBBUB_SDPIF_FB_BASE,
419 SDPIF_FB_BASE, 0x0FFFF);
421 REG_UPDATE(DCHUBBUB_SDPIF_AGP_BASE,
422 SDPIF_AGP_BASE, dh_data->zfb_phys_addr_base >> 22);
424 REG_UPDATE(DCHUBBUB_SDPIF_AGP_BOT,
425 SDPIF_AGP_BOT, dh_data->zfb_mc_base_addr >> 22);
427 REG_UPDATE(DCHUBBUB_SDPIF_AGP_TOP,
428 SDPIF_AGP_TOP, (dh_data->zfb_mc_base_addr +
429 dh_data->zfb_size_in_byte - 1) >> 22);
431 case FRAME_BUFFER_MODE_MIXED_ZFB_AND_LOCAL:
432 /*Should not touch FB LOCATION (done by VBIOS on AsicInit table)*/
434 REG_UPDATE(DCHUBBUB_SDPIF_AGP_BASE,
435 SDPIF_AGP_BASE, dh_data->zfb_phys_addr_base >> 22);
437 REG_UPDATE(DCHUBBUB_SDPIF_AGP_BOT,
438 SDPIF_AGP_BOT, dh_data->zfb_mc_base_addr >> 22);
440 REG_UPDATE(DCHUBBUB_SDPIF_AGP_TOP,
441 SDPIF_AGP_TOP, (dh_data->zfb_mc_base_addr +
442 dh_data->zfb_size_in_byte - 1) >> 22);
444 case FRAME_BUFFER_MODE_LOCAL_ONLY:
445 /*Should not touch FB LOCATION (done by VBIOS on AsicInit table)*/
446 REG_UPDATE(DCHUBBUB_SDPIF_AGP_BASE,
449 REG_UPDATE(DCHUBBUB_SDPIF_AGP_BOT,
450 SDPIF_AGP_BOT, 0X03FFFF);
452 REG_UPDATE(DCHUBBUB_SDPIF_AGP_TOP,
459 dh_data->dchub_initialzied = true;
460 dh_data->dchub_info_valid = false;
463 void hubbub1_toggle_watermark_change_req(struct hubbub *hubbub)
465 uint32_t watermark_change_req;
467 REG_GET(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
468 DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, &watermark_change_req);
470 if (watermark_change_req)
471 watermark_change_req = 0;
473 watermark_change_req = 1;
475 REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
476 DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, watermark_change_req);
479 static const struct hubbub_funcs hubbub1_funcs = {
480 .update_dchub = hubbub1_update_dchub
483 void hubbub1_construct(struct hubbub *hubbub,
484 struct dc_context *ctx,
485 const struct dcn_hubbub_registers *hubbub_regs,
486 const struct dcn_hubbub_shift *hubbub_shift,
487 const struct dcn_hubbub_mask *hubbub_mask)
491 hubbub->funcs = &hubbub1_funcs;
493 hubbub->regs = hubbub_regs;
494 hubbub->shifts = hubbub_shift;
495 hubbub->masks = hubbub_mask;
497 hubbub->debug_test_index_pstate = 0x7;