aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/dce_v6_0.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v6_0.c317
1 files changed, 118 insertions, 199 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
index b948d6cb1399..44547f951d92 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
@@ -46,6 +46,16 @@ static const u32 crtc_offsets[6] =
46 SI_CRTC5_REGISTER_OFFSET 46 SI_CRTC5_REGISTER_OFFSET
47}; 47};
48 48
49static const u32 hpd_offsets[] =
50{
51 DC_HPD1_INT_STATUS - DC_HPD1_INT_STATUS,
52 DC_HPD2_INT_STATUS - DC_HPD1_INT_STATUS,
53 DC_HPD3_INT_STATUS - DC_HPD1_INT_STATUS,
54 DC_HPD4_INT_STATUS - DC_HPD1_INT_STATUS,
55 DC_HPD5_INT_STATUS - DC_HPD1_INT_STATUS,
56 DC_HPD6_INT_STATUS - DC_HPD1_INT_STATUS,
57};
58
49static const uint32_t dig_offsets[] = { 59static const uint32_t dig_offsets[] = {
50 SI_CRTC0_REGISTER_OFFSET, 60 SI_CRTC0_REGISTER_OFFSET,
51 SI_CRTC1_REGISTER_OFFSET, 61 SI_CRTC1_REGISTER_OFFSET,
@@ -94,15 +104,6 @@ static const struct {
94 .hpd = DISP_INTERRUPT_STATUS_CONTINUE5__DC_HPD6_INTERRUPT_MASK 104 .hpd = DISP_INTERRUPT_STATUS_CONTINUE5__DC_HPD6_INTERRUPT_MASK
95} }; 105} };
96 106
97static const uint32_t hpd_int_control_offsets[6] = {
98 DC_HPD1_INT_CONTROL,
99 DC_HPD2_INT_CONTROL,
100 DC_HPD3_INT_CONTROL,
101 DC_HPD4_INT_CONTROL,
102 DC_HPD5_INT_CONTROL,
103 DC_HPD6_INT_CONTROL,
104};
105
106static u32 dce_v6_0_audio_endpt_rreg(struct amdgpu_device *adev, 107static u32 dce_v6_0_audio_endpt_rreg(struct amdgpu_device *adev,
107 u32 block_offset, u32 reg) 108 u32 block_offset, u32 reg)
108{ 109{
@@ -257,34 +258,11 @@ static bool dce_v6_0_hpd_sense(struct amdgpu_device *adev,
257{ 258{
258 bool connected = false; 259 bool connected = false;
259 260
260 switch (hpd) { 261 if (hpd >= adev->mode_info.num_hpd)
261 case AMDGPU_HPD_1: 262 return connected;
262 if (RREG32(DC_HPD1_INT_STATUS) & DC_HPDx_SENSE) 263
263 connected = true; 264 if (RREG32(DC_HPD1_INT_STATUS + hpd_offsets[hpd]) & DC_HPDx_SENSE)
264 break; 265 connected = true;
265 case AMDGPU_HPD_2:
266 if (RREG32(DC_HPD2_INT_STATUS) & DC_HPDx_SENSE)
267 connected = true;
268 break;
269 case AMDGPU_HPD_3:
270 if (RREG32(DC_HPD3_INT_STATUS) & DC_HPDx_SENSE)
271 connected = true;
272 break;
273 case AMDGPU_HPD_4:
274 if (RREG32(DC_HPD4_INT_STATUS) & DC_HPDx_SENSE)
275 connected = true;
276 break;
277 case AMDGPU_HPD_5:
278 if (RREG32(DC_HPD5_INT_STATUS) & DC_HPDx_SENSE)
279 connected = true;
280 break;
281 case AMDGPU_HPD_6:
282 if (RREG32(DC_HPD6_INT_STATUS) & DC_HPDx_SENSE)
283 connected = true;
284 break;
285 default:
286 break;
287 }
288 266
289 return connected; 267 return connected;
290} 268}
@@ -303,58 +281,15 @@ static void dce_v6_0_hpd_set_polarity(struct amdgpu_device *adev,
303 u32 tmp; 281 u32 tmp;
304 bool connected = dce_v6_0_hpd_sense(adev, hpd); 282 bool connected = dce_v6_0_hpd_sense(adev, hpd);
305 283
306 switch (hpd) { 284 if (hpd >= adev->mode_info.num_hpd)
307 case AMDGPU_HPD_1: 285 return;
308 tmp = RREG32(DC_HPD1_INT_CONTROL); 286
309 if (connected) 287 tmp = RREG32(DC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
310 tmp &= ~DC_HPDx_INT_POLARITY; 288 if (connected)
311 else 289 tmp &= ~DC_HPDx_INT_POLARITY;
312 tmp |= DC_HPDx_INT_POLARITY; 290 else
313 WREG32(DC_HPD1_INT_CONTROL, tmp); 291 tmp |= DC_HPDx_INT_POLARITY;
314 break; 292 WREG32(DC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
315 case AMDGPU_HPD_2:
316 tmp = RREG32(DC_HPD2_INT_CONTROL);
317 if (connected)
318 tmp &= ~DC_HPDx_INT_POLARITY;
319 else
320 tmp |= DC_HPDx_INT_POLARITY;
321 WREG32(DC_HPD2_INT_CONTROL, tmp);
322 break;
323 case AMDGPU_HPD_3:
324 tmp = RREG32(DC_HPD3_INT_CONTROL);
325 if (connected)
326 tmp &= ~DC_HPDx_INT_POLARITY;
327 else
328 tmp |= DC_HPDx_INT_POLARITY;
329 WREG32(DC_HPD3_INT_CONTROL, tmp);
330 break;
331 case AMDGPU_HPD_4:
332 tmp = RREG32(DC_HPD4_INT_CONTROL);
333 if (connected)
334 tmp &= ~DC_HPDx_INT_POLARITY;
335 else
336 tmp |= DC_HPDx_INT_POLARITY;
337 WREG32(DC_HPD4_INT_CONTROL, tmp);
338 break;
339 case AMDGPU_HPD_5:
340 tmp = RREG32(DC_HPD5_INT_CONTROL);
341 if (connected)
342 tmp &= ~DC_HPDx_INT_POLARITY;
343 else
344 tmp |= DC_HPDx_INT_POLARITY;
345 WREG32(DC_HPD5_INT_CONTROL, tmp);
346 break;
347 case AMDGPU_HPD_6:
348 tmp = RREG32(DC_HPD6_INT_CONTROL);
349 if (connected)
350 tmp &= ~DC_HPDx_INT_POLARITY;
351 else
352 tmp |= DC_HPDx_INT_POLARITY;
353 WREG32(DC_HPD6_INT_CONTROL, tmp);
354 break;
355 default:
356 break;
357 }
358} 293}
359 294
360/** 295/**
@@ -369,34 +304,17 @@ static void dce_v6_0_hpd_init(struct amdgpu_device *adev)
369{ 304{
370 struct drm_device *dev = adev->ddev; 305 struct drm_device *dev = adev->ddev;
371 struct drm_connector *connector; 306 struct drm_connector *connector;
372 u32 tmp = DC_HPDx_CONNECTION_TIMER(0x9c4) | 307 u32 tmp;
373 DC_HPDx_RX_INT_TIMER(0xfa) | DC_HPDx_EN;
374 308
375 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 309 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
376 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 310 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
377 311
378 switch (amdgpu_connector->hpd.hpd) { 312 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
379 case AMDGPU_HPD_1: 313 continue;
380 WREG32(DC_HPD1_CONTROL, tmp); 314
381 break; 315 tmp = RREG32(DC_HPD1_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]);
382 case AMDGPU_HPD_2: 316 tmp |= DC_HPDx_EN;
383 WREG32(DC_HPD2_CONTROL, tmp); 317 WREG32(DC_HPD1_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
384 break;
385 case AMDGPU_HPD_3:
386 WREG32(DC_HPD3_CONTROL, tmp);
387 break;
388 case AMDGPU_HPD_4:
389 WREG32(DC_HPD4_CONTROL, tmp);
390 break;
391 case AMDGPU_HPD_5:
392 WREG32(DC_HPD5_CONTROL, tmp);
393 break;
394 case AMDGPU_HPD_6:
395 WREG32(DC_HPD6_CONTROL, tmp);
396 break;
397 default:
398 break;
399 }
400 318
401 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || 319 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
402 connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { 320 connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
@@ -405,34 +323,9 @@ static void dce_v6_0_hpd_init(struct amdgpu_device *adev)
405 * https://bugzilla.redhat.com/show_bug.cgi?id=726143 323 * https://bugzilla.redhat.com/show_bug.cgi?id=726143
406 * also avoid interrupt storms during dpms. 324 * also avoid interrupt storms during dpms.
407 */ 325 */
408 u32 dc_hpd_int_cntl_reg, dc_hpd_int_cntl; 326 tmp = RREG32(DC_HPD1_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]);
409 327 tmp &= ~DC_HPDx_INT_EN;
410 switch (amdgpu_connector->hpd.hpd) { 328 WREG32(DC_HPD1_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);
411 case AMDGPU_HPD_1:
412 dc_hpd_int_cntl_reg = DC_HPD1_INT_CONTROL;
413 break;
414 case AMDGPU_HPD_2:
415 dc_hpd_int_cntl_reg = DC_HPD2_INT_CONTROL;
416 break;
417 case AMDGPU_HPD_3:
418 dc_hpd_int_cntl_reg = DC_HPD3_INT_CONTROL;
419 break;
420 case AMDGPU_HPD_4:
421 dc_hpd_int_cntl_reg = DC_HPD4_INT_CONTROL;
422 break;
423 case AMDGPU_HPD_5:
424 dc_hpd_int_cntl_reg = DC_HPD5_INT_CONTROL;
425 break;
426 case AMDGPU_HPD_6:
427 dc_hpd_int_cntl_reg = DC_HPD6_INT_CONTROL;
428 break;
429 default:
430 continue;
431 }
432
433 dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg);
434 dc_hpd_int_cntl &= ~DC_HPDx_INT_EN;
435 WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl);
436 continue; 329 continue;
437 } 330 }
438 331
@@ -454,32 +347,18 @@ static void dce_v6_0_hpd_fini(struct amdgpu_device *adev)
454{ 347{
455 struct drm_device *dev = adev->ddev; 348 struct drm_device *dev = adev->ddev;
456 struct drm_connector *connector; 349 struct drm_connector *connector;
350 u32 tmp;
457 351
458 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 352 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
459 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 353 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
460 354
461 switch (amdgpu_connector->hpd.hpd) { 355 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
462 case AMDGPU_HPD_1: 356 continue;
463 WREG32(DC_HPD1_CONTROL, 0); 357
464 break; 358 tmp = RREG32(DC_HPD1_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]);
465 case AMDGPU_HPD_2: 359 tmp &= ~DC_HPDx_EN;
466 WREG32(DC_HPD2_CONTROL, 0); 360 WREG32(DC_HPD1_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], 0);
467 break; 361
468 case AMDGPU_HPD_3:
469 WREG32(DC_HPD3_CONTROL, 0);
470 break;
471 case AMDGPU_HPD_4:
472 WREG32(DC_HPD4_CONTROL, 0);
473 break;
474 case AMDGPU_HPD_5:
475 WREG32(DC_HPD5_CONTROL, 0);
476 break;
477 case AMDGPU_HPD_6:
478 WREG32(DC_HPD6_CONTROL, 0);
479 break;
480 default:
481 break;
482 }
483 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); 362 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
484 } 363 }
485} 364}
@@ -611,12 +490,55 @@ static void dce_v6_0_resume_mc_access(struct amdgpu_device *adev,
611static void dce_v6_0_set_vga_render_state(struct amdgpu_device *adev, 490static void dce_v6_0_set_vga_render_state(struct amdgpu_device *adev,
612 bool render) 491 bool render)
613{ 492{
614 if (!render) 493 if (!render)
615 WREG32(R_000300_VGA_RENDER_CONTROL, 494 WREG32(R_000300_VGA_RENDER_CONTROL,
616 RREG32(R_000300_VGA_RENDER_CONTROL) & C_000300_VGA_VSTATUS_CNTL); 495 RREG32(R_000300_VGA_RENDER_CONTROL) & C_000300_VGA_VSTATUS_CNTL);
617 496
618} 497}
619 498
499static int dce_v6_0_get_num_crtc(struct amdgpu_device *adev)
500{
501 int num_crtc = 0;
502
503 switch (adev->asic_type) {
504 case CHIP_TAHITI:
505 case CHIP_PITCAIRN:
506 case CHIP_VERDE:
507 num_crtc = 6;
508 break;
509 case CHIP_OLAND:
510 num_crtc = 2;
511 break;
512 default:
513 num_crtc = 0;
514 }
515 return num_crtc;
516}
517
518void dce_v6_0_disable_dce(struct amdgpu_device *adev)
519{
520 /*Disable VGA render and enabled crtc, if has DCE engine*/
521 if (amdgpu_atombios_has_dce_engine_info(adev)) {
522 u32 tmp;
523 int crtc_enabled, i;
524
525 dce_v6_0_set_vga_render_state(adev, false);
526
527 /*Disable crtc*/
528 for (i = 0; i < dce_v6_0_get_num_crtc(adev); i++) {
529 crtc_enabled = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) &
530 EVERGREEN_CRTC_MASTER_EN;
531 if (crtc_enabled) {
532 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
533 tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
534 tmp &= ~EVERGREEN_CRTC_MASTER_EN;
535 WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
536 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
537 }
538 }
539 }
540}
541
620static void dce_v6_0_program_fmt(struct drm_encoder *encoder) 542static void dce_v6_0_program_fmt(struct drm_encoder *encoder)
621{ 543{
622 544
@@ -2338,21 +2260,20 @@ static int dce_v6_0_early_init(void *handle)
2338 dce_v6_0_set_display_funcs(adev); 2260 dce_v6_0_set_display_funcs(adev);
2339 dce_v6_0_set_irq_funcs(adev); 2261 dce_v6_0_set_irq_funcs(adev);
2340 2262
2263 adev->mode_info.num_crtc = dce_v6_0_get_num_crtc(adev);
2264
2341 switch (adev->asic_type) { 2265 switch (adev->asic_type) {
2342 case CHIP_TAHITI: 2266 case CHIP_TAHITI:
2343 case CHIP_PITCAIRN: 2267 case CHIP_PITCAIRN:
2344 case CHIP_VERDE: 2268 case CHIP_VERDE:
2345 adev->mode_info.num_crtc = 6;
2346 adev->mode_info.num_hpd = 6; 2269 adev->mode_info.num_hpd = 6;
2347 adev->mode_info.num_dig = 6; 2270 adev->mode_info.num_dig = 6;
2348 break; 2271 break;
2349 case CHIP_OLAND: 2272 case CHIP_OLAND:
2350 adev->mode_info.num_crtc = 2;
2351 adev->mode_info.num_hpd = 2; 2273 adev->mode_info.num_hpd = 2;
2352 adev->mode_info.num_dig = 2; 2274 adev->mode_info.num_dig = 2;
2353 break; 2275 break;
2354 default: 2276 default:
2355 /* FIXME: not supported yet */
2356 return -EINVAL; 2277 return -EINVAL;
2357 } 2278 }
2358 2279
@@ -2588,42 +2509,23 @@ static int dce_v6_0_set_hpd_interrupt_state(struct amdgpu_device *adev,
2588 unsigned type, 2509 unsigned type,
2589 enum amdgpu_interrupt_state state) 2510 enum amdgpu_interrupt_state state)
2590{ 2511{
2591 u32 dc_hpd_int_cntl_reg, dc_hpd_int_cntl; 2512 u32 dc_hpd_int_cntl;
2592 2513
2593 switch (type) { 2514 if (type >= adev->mode_info.num_hpd) {
2594 case AMDGPU_HPD_1:
2595 dc_hpd_int_cntl_reg = DC_HPD1_INT_CONTROL;
2596 break;
2597 case AMDGPU_HPD_2:
2598 dc_hpd_int_cntl_reg = DC_HPD2_INT_CONTROL;
2599 break;
2600 case AMDGPU_HPD_3:
2601 dc_hpd_int_cntl_reg = DC_HPD3_INT_CONTROL;
2602 break;
2603 case AMDGPU_HPD_4:
2604 dc_hpd_int_cntl_reg = DC_HPD4_INT_CONTROL;
2605 break;
2606 case AMDGPU_HPD_5:
2607 dc_hpd_int_cntl_reg = DC_HPD5_INT_CONTROL;
2608 break;
2609 case AMDGPU_HPD_6:
2610 dc_hpd_int_cntl_reg = DC_HPD6_INT_CONTROL;
2611 break;
2612 default:
2613 DRM_DEBUG("invalid hdp %d\n", type); 2515 DRM_DEBUG("invalid hdp %d\n", type);
2614 return 0; 2516 return 0;
2615 } 2517 }
2616 2518
2617 switch (state) { 2519 switch (state) {
2618 case AMDGPU_IRQ_STATE_DISABLE: 2520 case AMDGPU_IRQ_STATE_DISABLE:
2619 dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg); 2521 dc_hpd_int_cntl = RREG32(DC_HPD1_INT_CONTROL + hpd_offsets[type]);
2620 dc_hpd_int_cntl &= ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); 2522 dc_hpd_int_cntl &= ~DC_HPDx_INT_EN;
2621 WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl); 2523 WREG32(DC_HPD1_INT_CONTROL + hpd_offsets[type], dc_hpd_int_cntl);
2622 break; 2524 break;
2623 case AMDGPU_IRQ_STATE_ENABLE: 2525 case AMDGPU_IRQ_STATE_ENABLE:
2624 dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg); 2526 dc_hpd_int_cntl = RREG32(DC_HPD1_INT_CONTROL + hpd_offsets[type]);
2625 dc_hpd_int_cntl |= (DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); 2527 dc_hpd_int_cntl |= DC_HPDx_INT_EN;
2626 WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl); 2528 WREG32(DC_HPD1_INT_CONTROL + hpd_offsets[type], dc_hpd_int_cntl);
2627 break; 2529 break;
2628 default: 2530 default:
2629 break; 2531 break;
@@ -2796,7 +2698,7 @@ static int dce_v6_0_hpd_irq(struct amdgpu_device *adev,
2796 struct amdgpu_irq_src *source, 2698 struct amdgpu_irq_src *source,
2797 struct amdgpu_iv_entry *entry) 2699 struct amdgpu_iv_entry *entry)
2798{ 2700{
2799 uint32_t disp_int, mask, int_control, tmp; 2701 uint32_t disp_int, mask, tmp;
2800 unsigned hpd; 2702 unsigned hpd;
2801 2703
2802 if (entry->src_data >= adev->mode_info.num_hpd) { 2704 if (entry->src_data >= adev->mode_info.num_hpd) {
@@ -2807,12 +2709,11 @@ static int dce_v6_0_hpd_irq(struct amdgpu_device *adev,
2807 hpd = entry->src_data; 2709 hpd = entry->src_data;
2808 disp_int = RREG32(interrupt_status_offsets[hpd].reg); 2710 disp_int = RREG32(interrupt_status_offsets[hpd].reg);
2809 mask = interrupt_status_offsets[hpd].hpd; 2711 mask = interrupt_status_offsets[hpd].hpd;
2810 int_control = hpd_int_control_offsets[hpd];
2811 2712
2812 if (disp_int & mask) { 2713 if (disp_int & mask) {
2813 tmp = RREG32(int_control); 2714 tmp = RREG32(DC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
2814 tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK; 2715 tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
2815 WREG32(int_control, tmp); 2716 WREG32(DC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
2816 schedule_work(&adev->hotplug_work); 2717 schedule_work(&adev->hotplug_work);
2817 DRM_INFO("IH: HPD%d\n", hpd + 1); 2718 DRM_INFO("IH: HPD%d\n", hpd + 1);
2818 } 2719 }
@@ -2833,7 +2734,7 @@ static int dce_v6_0_set_powergating_state(void *handle,
2833 return 0; 2734 return 0;
2834} 2735}
2835 2736
2836const struct amd_ip_funcs dce_v6_0_ip_funcs = { 2737static const struct amd_ip_funcs dce_v6_0_ip_funcs = {
2837 .name = "dce_v6_0", 2738 .name = "dce_v6_0",
2838 .early_init = dce_v6_0_early_init, 2739 .early_init = dce_v6_0_early_init,
2839 .late_init = NULL, 2740 .late_init = NULL,
@@ -3174,3 +3075,21 @@ static void dce_v6_0_set_irq_funcs(struct amdgpu_device *adev)
3174 adev->hpd_irq.num_types = AMDGPU_HPD_LAST; 3075 adev->hpd_irq.num_types = AMDGPU_HPD_LAST;
3175 adev->hpd_irq.funcs = &dce_v6_0_hpd_irq_funcs; 3076 adev->hpd_irq.funcs = &dce_v6_0_hpd_irq_funcs;
3176} 3077}
3078
3079const struct amdgpu_ip_block_version dce_v6_0_ip_block =
3080{
3081 .type = AMD_IP_BLOCK_TYPE_DCE,
3082 .major = 6,
3083 .minor = 0,
3084 .rev = 0,
3085 .funcs = &dce_v6_0_ip_funcs,
3086};
3087
3088const struct amdgpu_ip_block_version dce_v6_4_ip_block =
3089{
3090 .type = AMD_IP_BLOCK_TYPE_DCE,
3091 .major = 6,
3092 .minor = 4,
3093 .rev = 0,
3094 .funcs = &dce_v6_0_ip_funcs,
3095};