aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRex Zhu <Rex.Zhu@amd.com>2017-05-04 02:51:31 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-05-05 18:14:56 -0400
commit5784d5cca66b362e3588c189eada757cf664ae6c (patch)
treed5c70db0b0ac2080e81f74ffc88acd1ed737ed77
parent652bd0c3441d861402bf7347088c846b6799c5b8 (diff)
drm/amd/powerplay: Setup sw CTF to allow graceful exit when temperature exceeds maximum.
cherry-pick from amd windows driver. Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c73
1 files changed, 45 insertions, 28 deletions
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c
index 5da88ba4a53c..d5f53d04fa08 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c
@@ -381,14 +381,10 @@ int vega10_thermal_get_temperature(struct pp_hwmgr *hwmgr)
381 381
382 temp = cgs_read_register(hwmgr->device, reg); 382 temp = cgs_read_register(hwmgr->device, reg);
383 383
384 temp = (temp & CG_MULT_THERMAL_STATUS__CTF_TEMP_MASK) >> 384 temp = (temp & CG_MULT_THERMAL_STATUS__ASIC_MAX_TEMP_MASK) >>
385 CG_MULT_THERMAL_STATUS__CTF_TEMP__SHIFT; 385 CG_MULT_THERMAL_STATUS__ASIC_MAX_TEMP__SHIFT;
386 386
387 /* Bit 9 means the reading is lower than the lowest usable value. */ 387 temp = temp & 0x1ff;
388 if (temp & 0x200)
389 temp = VEGA10_THERMAL_MAXIMUM_TEMP_READING;
390 else
391 temp = temp & 0x1ff;
392 388
393 temp *= PP_TEMPERATURE_UNITS_PER_CENTIGRADES; 389 temp *= PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
394 390
@@ -424,23 +420,28 @@ static int vega10_thermal_set_temperature_range(struct pp_hwmgr *hwmgr,
424 mmTHM_THERMAL_INT_CTRL_BASE_IDX, mmTHM_THERMAL_INT_CTRL); 420 mmTHM_THERMAL_INT_CTRL_BASE_IDX, mmTHM_THERMAL_INT_CTRL);
425 421
426 val = cgs_read_register(hwmgr->device, reg); 422 val = cgs_read_register(hwmgr->device, reg);
427 val &= ~(THM_THERMAL_INT_CTRL__DIG_THERM_INTH_MASK); 423
428 val |= (high / PP_TEMPERATURE_UNITS_PER_CENTIGRADES) << 424 val &= (~THM_THERMAL_INT_CTRL__MAX_IH_CREDIT_MASK);
429 THM_THERMAL_INT_CTRL__DIG_THERM_INTH__SHIFT; 425 val |= (5 << THM_THERMAL_INT_CTRL__MAX_IH_CREDIT__SHIFT);
430 val &= ~(THM_THERMAL_INT_CTRL__DIG_THERM_INTL_MASK); 426
431 val |= (low / PP_TEMPERATURE_UNITS_PER_CENTIGRADES) << 427 val &= (~THM_THERMAL_INT_CTRL__THERM_IH_HW_ENA_MASK);
432 THM_THERMAL_INT_CTRL__DIG_THERM_INTL__SHIFT; 428 val |= (1 << THM_THERMAL_INT_CTRL__THERM_IH_HW_ENA__SHIFT);
429
430 val &= (~THM_THERMAL_INT_CTRL__DIG_THERM_INTH_MASK);
431 val |= ((high / PP_TEMPERATURE_UNITS_PER_CENTIGRADES)
432 << THM_THERMAL_INT_CTRL__DIG_THERM_INTH__SHIFT);
433
434 val &= (~THM_THERMAL_INT_CTRL__DIG_THERM_INTL_MASK);
435 val |= ((low / PP_TEMPERATURE_UNITS_PER_CENTIGRADES)
436 << THM_THERMAL_INT_CTRL__DIG_THERM_INTL__SHIFT);
437
438 val = val & (~THM_THERMAL_INT_CTRL__THERM_TRIGGER_MASK_MASK);
439
433 cgs_write_register(hwmgr->device, reg, val); 440 cgs_write_register(hwmgr->device, reg, val);
434 441
435 reg = soc15_get_register_offset(THM_HWID, 0, 442 reg = soc15_get_register_offset(THM_HWID, 0,
436 mmTHM_TCON_HTC_BASE_IDX, mmTHM_TCON_HTC); 443 mmTHM_TCON_HTC_BASE_IDX, mmTHM_TCON_HTC);
437 444
438 val = cgs_read_register(hwmgr->device, reg);
439 val &= ~(THM_TCON_HTC__HTC_TMP_LMT_MASK);
440 val |= (high / PP_TEMPERATURE_UNITS_PER_CENTIGRADES) <<
441 THM_TCON_HTC__HTC_TMP_LMT__SHIFT;
442 cgs_write_register(hwmgr->device, reg, val);
443
444 return 0; 445 return 0;
445} 446}
446 447
@@ -482,18 +483,28 @@ static int vega10_thermal_initialize(struct pp_hwmgr *hwmgr)
482static int vega10_thermal_enable_alert(struct pp_hwmgr *hwmgr) 483static int vega10_thermal_enable_alert(struct pp_hwmgr *hwmgr)
483{ 484{
484 struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend); 485 struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend);
486 uint32_t val = 0;
487 uint32_t reg;
485 488
486 if (data->smu_features[GNLD_FW_CTF].supported) { 489 if (data->smu_features[GNLD_FW_CTF].supported) {
487 if (data->smu_features[GNLD_FW_CTF].enabled) 490 if (data->smu_features[GNLD_FW_CTF].enabled)
488 printk("[Thermal_EnableAlert] FW CTF Already Enabled!\n"); 491 printk("[Thermal_EnableAlert] FW CTF Already Enabled!\n");
492
493 PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
494 true,
495 data->smu_features[GNLD_FW_CTF].smu_feature_bitmap),
496 "Attempt to Enable FW CTF feature Failed!",
497 return -1);
498 data->smu_features[GNLD_FW_CTF].enabled = true;
489 } 499 }
490 500
491 PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr, 501 val |= (1 << THM_THERMAL_INT_ENA__THERM_INTH_CLR__SHIFT);
492 true, 502 val |= (1 << THM_THERMAL_INT_ENA__THERM_INTL_CLR__SHIFT);
493 data->smu_features[GNLD_FW_CTF].smu_feature_bitmap), 503 val |= (1 << THM_THERMAL_INT_ENA__THERM_TRIGGER_CLR__SHIFT);
494 "Attempt to Enable FW CTF feature Failed!", 504
495 return -1); 505 reg = soc15_get_register_offset(THM_HWID, 0, mmTHM_THERMAL_INT_ENA_BASE_IDX, mmTHM_THERMAL_INT_ENA);
496 data->smu_features[GNLD_FW_CTF].enabled = true; 506 cgs_write_register(hwmgr->device, reg, val);
507
497 return 0; 508 return 0;
498} 509}
499 510
@@ -504,18 +515,24 @@ static int vega10_thermal_enable_alert(struct pp_hwmgr *hwmgr)
504int vega10_thermal_disable_alert(struct pp_hwmgr *hwmgr) 515int vega10_thermal_disable_alert(struct pp_hwmgr *hwmgr)
505{ 516{
506 struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend); 517 struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend);
518 uint32_t reg;
507 519
508 if (data->smu_features[GNLD_FW_CTF].supported) { 520 if (data->smu_features[GNLD_FW_CTF].supported) {
509 if (!data->smu_features[GNLD_FW_CTF].enabled) 521 if (!data->smu_features[GNLD_FW_CTF].enabled)
510 printk("[Thermal_EnableAlert] FW CTF Already disabled!\n"); 522 printk("[Thermal_EnableAlert] FW CTF Already disabled!\n");
511 }
512 523
513 PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr, 524
525 PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
514 false, 526 false,
515 data->smu_features[GNLD_FW_CTF].smu_feature_bitmap), 527 data->smu_features[GNLD_FW_CTF].smu_feature_bitmap),
516 "Attempt to disable FW CTF feature Failed!", 528 "Attempt to disable FW CTF feature Failed!",
517 return -1); 529 return -1);
518 data->smu_features[GNLD_FW_CTF].enabled = false; 530 data->smu_features[GNLD_FW_CTF].enabled = false;
531 }
532
533 reg = soc15_get_register_offset(THM_HWID, 0, mmTHM_THERMAL_INT_ENA_BASE_IDX, mmTHM_THERMAL_INT_ENA);
534 cgs_write_register(hwmgr->device, reg, 0);
535
519 return 0; 536 return 0;
520} 537}
521 538