diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/dce_v6_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | 317 |
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 | ||
49 | static 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 | |||
49 | static const uint32_t dig_offsets[] = { | 59 | static 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 | ||
97 | static 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 | |||
106 | static u32 dce_v6_0_audio_endpt_rreg(struct amdgpu_device *adev, | 107 | static 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, | |||
611 | static void dce_v6_0_set_vga_render_state(struct amdgpu_device *adev, | 490 | static 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 | ||
499 | static 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 | |||
518 | void 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 | |||
620 | static void dce_v6_0_program_fmt(struct drm_encoder *encoder) | 542 | static 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 | ||
2836 | const struct amd_ip_funcs dce_v6_0_ip_funcs = { | 2737 | static 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 | |||
3079 | const 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 | |||
3088 | const 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 | }; | ||