diff options
author | Rex Zhu <Rex.Zhu@amd.com> | 2017-05-04 02:51:31 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-05-05 18:14:56 -0400 |
commit | 5784d5cca66b362e3588c189eada757cf664ae6c (patch) | |
tree | d5c70db0b0ac2080e81f74ffc88acd1ed737ed77 | |
parent | 652bd0c3441d861402bf7347088c846b6799c5b8 (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.c | 73 |
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) | |||
482 | static int vega10_thermal_enable_alert(struct pp_hwmgr *hwmgr) | 483 | static 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) | |||
504 | int vega10_thermal_disable_alert(struct pp_hwmgr *hwmgr) | 515 | int 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 | ||