aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2016-01-10 19:00:38 -0500
committerDave Airlie <airlied@redhat.com>2016-01-10 19:00:38 -0500
commitb483666bb4939ee14501da9978e5f87e4aa22228 (patch)
tree0c87132a3f776f39df78e47526ed997fcb99dfc8
parentc11b8989635166c5a1e6aac1853a847bd664f8db (diff)
parent13c240ef95e6569956ba9c731a650cecb3603f0e (diff)
Merge branch 'drm-next-4.5' of git://people.freedesktop.org/~agd5f/linux into drm-next
Misc fixes for amdgpu and radeon for 4.5. The bulk of the changes are smatch fixes and cleanups. This also includes the DP MST fixes from Mykola. Beyond that some fixes from Christian to avoid -ENOMEM errors in some corner cases in the CS ioctl, some suspend and resume fixes, and some powerplay fixes. * 'drm-next-4.5' of git://people.freedesktop.org/~agd5f/linux: (33 commits) drm/radeon: fix trivial typo in warning message radeon: r100: Silence 'may be used uninitialized' warnings drm/amdgpu: add warning to amdgpu_bo_gpu_offset() v2 drm/amd/powerplay: implement power down asic task for CZ drm/amd/powerplay: enable power down asic task. (v2) drm/amd/powerplay: enable set boot state task drm/amd/powerplay: add thermal control task when resume. drm/amdgpu: fix hex/decimal bug when show gpu load. drm/amdgpu: Show gpu load when display gpu performance for Fiji of VI. drm/amdgpu: Show gpu load when display gpu performance for Ci. drm/amd/powerplay: Reload and initialize the smc firmware on powerplay resume. drm/amd/powerplay: add powerplay valid check to avoid null point. (v2) drm/amd/powerplay: fix Smatch static checker warnings drm/amd/powerplay: fix Smatch static checker warnings with indenting (v2) drm/amd/powerplay: fix bug that NULL checks are reversed. amdgpu/dce11: Add test for crtc < 0 to various DCEv11 functions amdgpu/dce11: Remove division from dce_v11_0_vblank_wait() amdgpu/vce3: Simplify vce_v3_0_hw_init and ensure both rings default to not ready. amdgpu/vce3: Remove magic constants from harvest register masks. amdgpu/vce3: Simplify vce_v3_0_process_interrupt() ...
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c18
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/ci_dpm.c14
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v11_0.c16
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v3_0.c89
-rw-r--r--drivers/gpu/drm/amd/powerplay/amd_powerplay.c32
-rw-r--r--drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c1
-rw-r--r--drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c9
-rw-r--r--drivers/gpu/drm/amd/powerplay/eventmgr/psm.c3
-rw-r--r--drivers/gpu/drm/amd/powerplay/eventmgr/psm.h2
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c75
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/fiji_hwmgr.c64
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/fiji_powertune.c12
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/functiontables.c13
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c18
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c3
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/ppevvmath.h555
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.c15
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c40
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c20
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h2
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/hwmgr.h6
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/pp_instance.h3
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c2
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c10
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c2
-rw-r--r--drivers/gpu/drm/drm_dp_mst_topology.c141
-rw-r--r--drivers/gpu/drm/radeon/r100.c5
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_kms.c2
-rw-r--r--include/drm/drm_dp_mst_helper.h2
34 files changed, 670 insertions, 511 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
index 6fa0feac27f8..59485d0b3cfb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
@@ -843,15 +843,15 @@ static int amdgpu_cgs_acpi_eval_object(void *cgs_device,
843 if (info->input_count > 0) { 843 if (info->input_count > 0) {
844 if (info->pinput_argument == NULL) 844 if (info->pinput_argument == NULL)
845 return -EINVAL; 845 return -EINVAL;
846 argument = info->pinput_argument; 846 argument = info->pinput_argument;
847 func_no = argument->value; 847 func_no = argument->value;
848 for (i = 0; i < info->input_count; i++) { 848 for (i = 0; i < info->input_count; i++) {
849 if (((argument->type == ACPI_TYPE_STRING) || 849 if (((argument->type == ACPI_TYPE_STRING) ||
850 (argument->type == ACPI_TYPE_BUFFER)) 850 (argument->type == ACPI_TYPE_BUFFER)) &&
851 && (argument->pointer == NULL)) 851 (argument->pointer == NULL))
852 return -EINVAL; 852 return -EINVAL;
853 argument++; 853 argument++;
854 } 854 }
855 } 855 }
856 856
857 if (info->output_count > 0) { 857 if (info->output_count > 0) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
index ea756e77b023..5107fb291bdb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
@@ -96,6 +96,7 @@ static inline void amdgpu_bo_unreserve(struct amdgpu_bo *bo)
96 */ 96 */
97static inline u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo) 97static inline u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo)
98{ 98{
99 WARN_ON_ONCE(bo->tbo.mem.mem_type == TTM_PL_SYSTEM);
99 return bo->tbo.offset; 100 return bo->tbo.offset;
100} 101}
101 102
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
index 3b78982abaf1..4386cbac7f97 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
@@ -807,7 +807,7 @@ void amdgpu_pm_compute_clocks(struct amdgpu_device *adev)
807 struct amdgpu_ring *ring = adev->rings[i]; 807 struct amdgpu_ring *ring = adev->rings[i];
808 if (ring && ring->ready) 808 if (ring && ring->ready)
809 amdgpu_fence_wait_empty(ring); 809 amdgpu_fence_wait_empty(ring);
810 } 810 }
811 mutex_unlock(&adev->ring_lock); 811 mutex_unlock(&adev->ring_lock);
812 812
813 amdgpu_dpm_dispatch_task(adev, AMD_PP_EVENT_DISPLAY_CONFIG_CHANGE, NULL, NULL); 813 amdgpu_dpm_dispatch_task(adev, AMD_PP_EVENT_DISPLAY_CONFIG_CHANGE, NULL, NULL);
diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
index 57a2e347f04d..8b4731d4e10e 100644
--- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
@@ -1395,7 +1395,6 @@ static void ci_thermal_stop_thermal_controller(struct amdgpu_device *adev)
1395 ci_fan_ctrl_set_default_mode(adev); 1395 ci_fan_ctrl_set_default_mode(adev);
1396} 1396}
1397 1397
1398#if 0
1399static int ci_read_smc_soft_register(struct amdgpu_device *adev, 1398static int ci_read_smc_soft_register(struct amdgpu_device *adev,
1400 u16 reg_offset, u32 *value) 1399 u16 reg_offset, u32 *value)
1401{ 1400{
@@ -1405,7 +1404,6 @@ static int ci_read_smc_soft_register(struct amdgpu_device *adev,
1405 pi->soft_regs_start + reg_offset, 1404 pi->soft_regs_start + reg_offset,
1406 value, pi->sram_end); 1405 value, pi->sram_end);
1407} 1406}
1408#endif
1409 1407
1410static int ci_write_smc_soft_register(struct amdgpu_device *adev, 1408static int ci_write_smc_soft_register(struct amdgpu_device *adev,
1411 u16 reg_offset, u32 value) 1409 u16 reg_offset, u32 value)
@@ -6084,11 +6082,23 @@ ci_dpm_debugfs_print_current_performance_level(struct amdgpu_device *adev,
6084 struct amdgpu_ps *rps = &pi->current_rps; 6082 struct amdgpu_ps *rps = &pi->current_rps;
6085 u32 sclk = ci_get_average_sclk_freq(adev); 6083 u32 sclk = ci_get_average_sclk_freq(adev);
6086 u32 mclk = ci_get_average_mclk_freq(adev); 6084 u32 mclk = ci_get_average_mclk_freq(adev);
6085 u32 activity_percent = 50;
6086 int ret;
6087
6088 ret = ci_read_smc_soft_register(adev, offsetof(SMU7_SoftRegisters, AverageGraphicsA),
6089 &activity_percent);
6090
6091 if (ret == 0) {
6092 activity_percent += 0x80;
6093 activity_percent >>= 8;
6094 activity_percent = activity_percent > 100 ? 100 : activity_percent;
6095 }
6087 6096
6088 seq_printf(m, "uvd %sabled\n", pi->uvd_enabled ? "en" : "dis"); 6097 seq_printf(m, "uvd %sabled\n", pi->uvd_enabled ? "en" : "dis");
6089 seq_printf(m, "vce %sabled\n", rps->vce_active ? "en" : "dis"); 6098 seq_printf(m, "vce %sabled\n", rps->vce_active ? "en" : "dis");
6090 seq_printf(m, "power level avg sclk: %u mclk: %u\n", 6099 seq_printf(m, "power level avg sclk: %u mclk: %u\n",
6091 sclk, mclk); 6100 sclk, mclk);
6101 seq_printf(m, "GPU load: %u %%\n", activity_percent);
6092} 6102}
6093 6103
6094static void ci_dpm_print_power_state(struct amdgpu_device *adev, 6104static void ci_dpm_print_power_state(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
index 8701661a8868..8e67249d4367 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
@@ -211,9 +211,9 @@ static bool dce_v11_0_is_counter_moving(struct amdgpu_device *adev, int crtc)
211 */ 211 */
212static void dce_v11_0_vblank_wait(struct amdgpu_device *adev, int crtc) 212static void dce_v11_0_vblank_wait(struct amdgpu_device *adev, int crtc)
213{ 213{
214 unsigned i = 0; 214 unsigned i = 100;
215 215
216 if (crtc >= adev->mode_info.num_crtc) 216 if (crtc < 0 || crtc >= adev->mode_info.num_crtc)
217 return; 217 return;
218 218
219 if (!(RREG32(mmCRTC_CONTROL + crtc_offsets[crtc]) & CRTC_CONTROL__CRTC_MASTER_EN_MASK)) 219 if (!(RREG32(mmCRTC_CONTROL + crtc_offsets[crtc]) & CRTC_CONTROL__CRTC_MASTER_EN_MASK))
@@ -223,14 +223,16 @@ static void dce_v11_0_vblank_wait(struct amdgpu_device *adev, int crtc)
223 * wait for another frame. 223 * wait for another frame.
224 */ 224 */
225 while (dce_v11_0_is_in_vblank(adev, crtc)) { 225 while (dce_v11_0_is_in_vblank(adev, crtc)) {
226 if (i++ % 100 == 0) { 226 if (i++ == 100) {
227 i = 0;
227 if (!dce_v11_0_is_counter_moving(adev, crtc)) 228 if (!dce_v11_0_is_counter_moving(adev, crtc))
228 break; 229 break;
229 } 230 }
230 } 231 }
231 232
232 while (!dce_v11_0_is_in_vblank(adev, crtc)) { 233 while (!dce_v11_0_is_in_vblank(adev, crtc)) {
233 if (i++ % 100 == 0) { 234 if (i++ == 100) {
235 i = 0;
234 if (!dce_v11_0_is_counter_moving(adev, crtc)) 236 if (!dce_v11_0_is_counter_moving(adev, crtc))
235 break; 237 break;
236 } 238 }
@@ -239,7 +241,7 @@ static void dce_v11_0_vblank_wait(struct amdgpu_device *adev, int crtc)
239 241
240static u32 dce_v11_0_vblank_get_counter(struct amdgpu_device *adev, int crtc) 242static u32 dce_v11_0_vblank_get_counter(struct amdgpu_device *adev, int crtc)
241{ 243{
242 if (crtc >= adev->mode_info.num_crtc) 244 if (crtc < 0 || crtc >= adev->mode_info.num_crtc)
243 return 0; 245 return 0;
244 else 246 else
245 return RREG32(mmCRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]); 247 return RREG32(mmCRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]);
@@ -3384,7 +3386,7 @@ static void dce_v11_0_crtc_vblank_int_ack(struct amdgpu_device *adev,
3384{ 3386{
3385 u32 tmp; 3387 u32 tmp;
3386 3388
3387 if (crtc >= adev->mode_info.num_crtc) { 3389 if (crtc < 0 || crtc >= adev->mode_info.num_crtc) {
3388 DRM_DEBUG("invalid crtc %d\n", crtc); 3390 DRM_DEBUG("invalid crtc %d\n", crtc);
3389 return; 3391 return;
3390 } 3392 }
@@ -3399,7 +3401,7 @@ static void dce_v11_0_crtc_vline_int_ack(struct amdgpu_device *adev,
3399{ 3401{
3400 u32 tmp; 3402 u32 tmp;
3401 3403
3402 if (crtc >= adev->mode_info.num_crtc) { 3404 if (crtc < 0 || crtc >= adev->mode_info.num_crtc) {
3403 DRM_DEBUG("invalid crtc %d\n", crtc); 3405 DRM_DEBUG("invalid crtc %d\n", crtc);
3404 return; 3406 return;
3405 } 3407 }
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index dababe40a685..3f956065d069 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -1016,7 +1016,6 @@ static int gmc_v7_0_suspend(void *handle)
1016 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1016 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1017 1017
1018 if (adev->vm_manager.enabled) { 1018 if (adev->vm_manager.enabled) {
1019 amdgpu_vm_manager_fini(adev);
1020 gmc_v7_0_vm_fini(adev); 1019 gmc_v7_0_vm_fini(adev);
1021 adev->vm_manager.enabled = false; 1020 adev->vm_manager.enabled = false;
1022 } 1021 }
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index adc25f87fc18..c0c9a0101eb4 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -1037,7 +1037,6 @@ static int gmc_v8_0_suspend(void *handle)
1037 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1037 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1038 1038
1039 if (adev->vm_manager.enabled) { 1039 if (adev->vm_manager.enabled) {
1040 amdgpu_vm_manager_fini(adev);
1041 gmc_v8_0_vm_fini(adev); 1040 gmc_v8_0_vm_fini(adev);
1042 adev->vm_manager.enabled = false; 1041 adev->vm_manager.enabled = false;
1043 } 1042 }
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
index 35f48ad7644d..e99af81e4aec 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
@@ -314,14 +314,11 @@ static int vce_v3_0_start(struct amdgpu_device *adev)
314static unsigned vce_v3_0_get_harvest_config(struct amdgpu_device *adev) 314static unsigned vce_v3_0_get_harvest_config(struct amdgpu_device *adev)
315{ 315{
316 u32 tmp; 316 u32 tmp;
317 unsigned ret;
318 317
319 /* Fiji, Stoney are single pipe */ 318 /* Fiji, Stoney are single pipe */
320 if ((adev->asic_type == CHIP_FIJI) || 319 if ((adev->asic_type == CHIP_FIJI) ||
321 (adev->asic_type == CHIP_STONEY)){ 320 (adev->asic_type == CHIP_STONEY))
322 ret = AMDGPU_VCE_HARVEST_VCE1; 321 return AMDGPU_VCE_HARVEST_VCE1;
323 return ret;
324 }
325 322
326 /* Tonga and CZ are dual or single pipe */ 323 /* Tonga and CZ are dual or single pipe */
327 if (adev->flags & AMD_IS_APU) 324 if (adev->flags & AMD_IS_APU)
@@ -335,19 +332,14 @@ static unsigned vce_v3_0_get_harvest_config(struct amdgpu_device *adev)
335 332
336 switch (tmp) { 333 switch (tmp) {
337 case 1: 334 case 1:
338 ret = AMDGPU_VCE_HARVEST_VCE0; 335 return AMDGPU_VCE_HARVEST_VCE0;
339 break;
340 case 2: 336 case 2:
341 ret = AMDGPU_VCE_HARVEST_VCE1; 337 return AMDGPU_VCE_HARVEST_VCE1;
342 break;
343 case 3: 338 case 3:
344 ret = AMDGPU_VCE_HARVEST_VCE0 | AMDGPU_VCE_HARVEST_VCE1; 339 return AMDGPU_VCE_HARVEST_VCE0 | AMDGPU_VCE_HARVEST_VCE1;
345 break;
346 default: 340 default:
347 ret = 0; 341 return 0;
348 } 342 }
349
350 return ret;
351} 343}
352 344
353static int vce_v3_0_early_init(void *handle) 345static int vce_v3_0_early_init(void *handle)
@@ -422,28 +414,22 @@ static int vce_v3_0_sw_fini(void *handle)
422 414
423static int vce_v3_0_hw_init(void *handle) 415static int vce_v3_0_hw_init(void *handle)
424{ 416{
425 struct amdgpu_ring *ring; 417 int r, i;
426 int r;
427 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 418 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
428 419
429 r = vce_v3_0_start(adev); 420 r = vce_v3_0_start(adev);
430 if (r) 421 if (r)
431 return r; 422 return r;
432 423
433 ring = &adev->vce.ring[0]; 424 adev->vce.ring[0].ready = false;
434 ring->ready = true; 425 adev->vce.ring[1].ready = false;
435 r = amdgpu_ring_test_ring(ring);
436 if (r) {
437 ring->ready = false;
438 return r;
439 }
440 426
441 ring = &adev->vce.ring[1]; 427 for (i = 0; i < 2; i++) {
442 ring->ready = true; 428 r = amdgpu_ring_test_ring(&adev->vce.ring[i]);
443 r = amdgpu_ring_test_ring(ring); 429 if (r)
444 if (r) { 430 return r;
445 ring->ready = false; 431 else
446 return r; 432 adev->vce.ring[i].ready = true;
447 } 433 }
448 434
449 DRM_INFO("VCE initialized successfully.\n"); 435 DRM_INFO("VCE initialized successfully.\n");
@@ -543,17 +529,9 @@ static bool vce_v3_0_is_idle(void *handle)
543{ 529{
544 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 530 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
545 u32 mask = 0; 531 u32 mask = 0;
546 int idx;
547 532
548 for (idx = 0; idx < 2; ++idx) { 533 mask |= (adev->vce.harvest_config & AMDGPU_VCE_HARVEST_VCE0) ? 0 : SRBM_STATUS2__VCE0_BUSY_MASK;
549 if (adev->vce.harvest_config & (1 << idx)) 534 mask |= (adev->vce.harvest_config & AMDGPU_VCE_HARVEST_VCE1) ? 0 : SRBM_STATUS2__VCE1_BUSY_MASK;
550 continue;
551
552 if (idx == 0)
553 mask |= SRBM_STATUS2__VCE0_BUSY_MASK;
554 else
555 mask |= SRBM_STATUS2__VCE1_BUSY_MASK;
556 }
557 535
558 return !(RREG32(mmSRBM_STATUS2) & mask); 536 return !(RREG32(mmSRBM_STATUS2) & mask);
559} 537}
@@ -562,23 +540,11 @@ static int vce_v3_0_wait_for_idle(void *handle)
562{ 540{
563 unsigned i; 541 unsigned i;
564 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 542 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
565 u32 mask = 0;
566 int idx;
567
568 for (idx = 0; idx < 2; ++idx) {
569 if (adev->vce.harvest_config & (1 << idx))
570 continue;
571
572 if (idx == 0)
573 mask |= SRBM_STATUS2__VCE0_BUSY_MASK;
574 else
575 mask |= SRBM_STATUS2__VCE1_BUSY_MASK;
576 }
577 543
578 for (i = 0; i < adev->usec_timeout; i++) { 544 for (i = 0; i < adev->usec_timeout; i++)
579 if (!(RREG32(mmSRBM_STATUS2) & mask)) 545 if (vce_v3_0_is_idle(handle))
580 return 0; 546 return 0;
581 } 547
582 return -ETIMEDOUT; 548 return -ETIMEDOUT;
583} 549}
584 550
@@ -586,17 +552,10 @@ static int vce_v3_0_soft_reset(void *handle)
586{ 552{
587 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 553 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
588 u32 mask = 0; 554 u32 mask = 0;
589 int idx;
590 555
591 for (idx = 0; idx < 2; ++idx) { 556 mask |= (adev->vce.harvest_config & AMDGPU_VCE_HARVEST_VCE0) ? 0 : SRBM_SOFT_RESET__SOFT_RESET_VCE0_MASK;
592 if (adev->vce.harvest_config & (1 << idx)) 557 mask |= (adev->vce.harvest_config & AMDGPU_VCE_HARVEST_VCE1) ? 0 : SRBM_SOFT_RESET__SOFT_RESET_VCE1_MASK;
593 continue;
594 558
595 if (idx == 0)
596 mask |= SRBM_SOFT_RESET__SOFT_RESET_VCE0_MASK;
597 else
598 mask |= SRBM_SOFT_RESET__SOFT_RESET_VCE1_MASK;
599 }
600 WREG32_P(mmSRBM_SOFT_RESET, mask, 559 WREG32_P(mmSRBM_SOFT_RESET, mask,
601 ~(SRBM_SOFT_RESET__SOFT_RESET_VCE0_MASK | 560 ~(SRBM_SOFT_RESET__SOFT_RESET_VCE0_MASK |
602 SRBM_SOFT_RESET__SOFT_RESET_VCE1_MASK)); 561 SRBM_SOFT_RESET__SOFT_RESET_VCE1_MASK));
@@ -698,10 +657,8 @@ static int vce_v3_0_process_interrupt(struct amdgpu_device *adev,
698 657
699 switch (entry->src_data) { 658 switch (entry->src_data) {
700 case 0: 659 case 0:
701 amdgpu_fence_process(&adev->vce.ring[0]);
702 break;
703 case 1: 660 case 1:
704 amdgpu_fence_process(&adev->vce.ring[1]); 661 amdgpu_fence_process(&adev->vce.ring[entry->src_data]);
705 break; 662 break;
706 default: 663 default:
707 DRM_ERROR("Unhandled interrupt: %d %d\n", 664 DRM_ERROR("Unhandled interrupt: %d %d\n",
diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
index db0370bd60e3..8f5d5edcf193 100644
--- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
+++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
@@ -30,6 +30,12 @@
30#include "power_state.h" 30#include "power_state.h"
31#include "eventmanager.h" 31#include "eventmanager.h"
32 32
33#define PP_CHECK(handle) \
34 do { \
35 if ((handle) == NULL || (handle)->pp_valid != PP_VALID) \
36 return -EINVAL; \
37 } while (0)
38
33static int pp_early_init(void *handle) 39static int pp_early_init(void *handle)
34{ 40{
35 return 0; 41 return 0;
@@ -197,13 +203,29 @@ static int pp_resume(void *handle)
197 struct pp_instance *pp_handle; 203 struct pp_instance *pp_handle;
198 struct pp_eventmgr *eventmgr; 204 struct pp_eventmgr *eventmgr;
199 struct pem_event_data event_data = { {0} }; 205 struct pem_event_data event_data = { {0} };
206 struct pp_smumgr *smumgr;
207 int ret;
200 208
201 if (handle == NULL) 209 if (handle == NULL)
202 return -EINVAL; 210 return -EINVAL;
203 211
204 pp_handle = (struct pp_instance *)handle; 212 pp_handle = (struct pp_instance *)handle;
213 smumgr = pp_handle->smu_mgr;
214
215 if (smumgr == NULL || smumgr->smumgr_funcs == NULL ||
216 smumgr->smumgr_funcs->start_smu == NULL)
217 return -EINVAL;
218
219 ret = smumgr->smumgr_funcs->start_smu(smumgr);
220 if (ret) {
221 printk(KERN_ERR "[ powerplay ] smc start failed\n");
222 smumgr->smumgr_funcs->smu_fini(smumgr);
223 return ret;
224 }
225
205 eventmgr = pp_handle->eventmgr; 226 eventmgr = pp_handle->eventmgr;
206 pem_handle_event(eventmgr, AMD_PP_EVENT_RESUME, &event_data); 227 pem_handle_event(eventmgr, AMD_PP_EVENT_RESUME, &event_data);
228
207 return 0; 229 return 0;
208} 230}
209 231
@@ -537,6 +559,8 @@ static int amd_pp_instance_init(struct amd_pp_init *pp_init,
537 if (handle == NULL) 559 if (handle == NULL)
538 return -ENOMEM; 560 return -ENOMEM;
539 561
562 handle->pp_valid = PP_VALID;
563
540 ret = smum_init(pp_init, handle); 564 ret = smum_init(pp_init, handle);
541 if (ret) 565 if (ret)
542 goto fail_smum; 566 goto fail_smum;
@@ -611,12 +635,12 @@ int amd_powerplay_display_configuration_change(void *handle, const void *input)
611 struct pp_hwmgr *hwmgr; 635 struct pp_hwmgr *hwmgr;
612 const struct amd_pp_display_configuration *display_config = input; 636 const struct amd_pp_display_configuration *display_config = input;
613 637
614 if (handle == NULL) 638 PP_CHECK((struct pp_instance *)handle);
615 return -EINVAL;
616 639
617 hwmgr = ((struct pp_instance *)handle)->hwmgr; 640 hwmgr = ((struct pp_instance *)handle)->hwmgr;
618 641
619 phm_store_dal_configuration_data(hwmgr, display_config); 642 phm_store_dal_configuration_data(hwmgr, display_config);
643
620 return 0; 644 return 0;
621} 645}
622 646
@@ -625,7 +649,9 @@ int amd_powerplay_get_display_power_level(void *handle,
625{ 649{
626 struct pp_hwmgr *hwmgr; 650 struct pp_hwmgr *hwmgr;
627 651
628 if (handle == NULL || output == NULL) 652 PP_CHECK((struct pp_instance *)handle);
653
654 if (output == NULL)
629 return -EINVAL; 655 return -EINVAL;
630 656
631 hwmgr = ((struct pp_instance *)handle)->hwmgr; 657 hwmgr = ((struct pp_instance *)handle)->hwmgr;
diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c
index 9458394aec05..83be3cf210e0 100644
--- a/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c
+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c
@@ -143,6 +143,7 @@ static const pem_event_action *resume_event[] = {
143 enable_dynamic_state_management_tasks, 143 enable_dynamic_state_management_tasks,
144 enable_clock_power_gatings_tasks, 144 enable_clock_power_gatings_tasks,
145 enable_disable_bapm_tasks, 145 enable_disable_bapm_tasks,
146 initialize_thermal_controller_tasks,
146 reset_boot_state_tasks, 147 reset_boot_state_tasks,
147 adjust_power_state_tasks, 148 adjust_power_state_tasks,
148 enable_disable_fps_tasks, 149 enable_disable_fps_tasks,
diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c
index f0700d077925..5cd123472db4 100644
--- a/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c
+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c
@@ -68,13 +68,14 @@ int pem_task_adjust_power_state(struct pp_eventmgr *eventmgr, struct pem_event_d
68 68
69int pem_task_power_down_asic(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data) 69int pem_task_power_down_asic(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
70{ 70{
71 /* TODO */ 71 return phm_power_down_asic(eventmgr->hwmgr);
72 return 0;
73} 72}
74 73
75int pem_task_set_boot_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data) 74int pem_task_set_boot_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
76{ 75{
77 /* TODO */ 76 if (pem_is_event_data_valid(event_data->valid_fields, PEM_EventDataValid_RequestedStateID))
77 return psm_set_states(eventmgr, &(event_data->requested_state_id));
78
78 return 0; 79 return 0;
79} 80}
80 81
@@ -343,7 +344,7 @@ int pem_task_disable_gfx_clock_gating(struct pp_eventmgr *eventmgr, struct pem_e
343int pem_task_set_performance_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data) 344int pem_task_set_performance_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
344{ 345{
345 if (pem_is_event_data_valid(event_data->valid_fields, PEM_EventDataValid_RequestedStateID)) 346 if (pem_is_event_data_valid(event_data->valid_fields, PEM_EventDataValid_RequestedStateID))
346 return psm_set_performance_states(eventmgr, &(event_data->requested_state_id)); 347 return psm_set_states(eventmgr, &(event_data->requested_state_id));
347 348
348 return 0; 349 return 0;
349} 350}
diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c
index 5740fbfcbeab..a46225c0fc01 100644
--- a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c
+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c
@@ -62,7 +62,7 @@ int psm_get_state_by_classification(struct pp_eventmgr *eventmgr, enum PP_StateC
62 return -1; 62 return -1;
63} 63}
64 64
65int psm_set_performance_states(struct pp_eventmgr *eventmgr, unsigned long *state_id) 65int psm_set_states(struct pp_eventmgr *eventmgr, unsigned long *state_id)
66{ 66{
67 struct pp_power_state *state; 67 struct pp_power_state *state;
68 int table_entries; 68 int table_entries;
@@ -82,7 +82,6 @@ int psm_set_performance_states(struct pp_eventmgr *eventmgr, unsigned long *stat
82 return -1; 82 return -1;
83} 83}
84 84
85
86int psm_adjust_power_state_dynamic(struct pp_eventmgr *eventmgr, bool skip) 85int psm_adjust_power_state_dynamic(struct pp_eventmgr *eventmgr, bool skip)
87{ 86{
88 87
diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.h b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.h
index 1380470fdb1c..fbdff3e02aa3 100644
--- a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.h
+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.h
@@ -31,7 +31,7 @@ int psm_get_ui_state(struct pp_eventmgr *eventmgr, enum PP_StateUILabel ui_label
31 31
32int psm_get_state_by_classification(struct pp_eventmgr *eventmgr, enum PP_StateClassificationFlag flag, unsigned long *state_id); 32int psm_get_state_by_classification(struct pp_eventmgr *eventmgr, enum PP_StateClassificationFlag flag, unsigned long *state_id);
33 33
34int psm_set_performance_states(struct pp_eventmgr *eventmgr, unsigned long *state_id); 34int psm_set_states(struct pp_eventmgr *eventmgr, unsigned long *state_id);
35 35
36int psm_adjust_power_state_dynamic(struct pp_eventmgr *eventmgr, bool skip); 36int psm_adjust_power_state_dynamic(struct pp_eventmgr *eventmgr, bool skip);
37 37
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
index 5bac36baa13c..0874ab42ee95 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
@@ -579,7 +579,7 @@ static int cz_tf_init_sclk_limit(struct pp_hwmgr *hwmgr, void *input,
579 hwmgr->dyn_state.vddc_dependency_on_sclk; 579 hwmgr->dyn_state.vddc_dependency_on_sclk;
580 unsigned long clock = 0, level; 580 unsigned long clock = 0, level;
581 581
582 if (NULL == table && table->count <= 0) 582 if (NULL == table || table->count <= 0)
583 return -EINVAL; 583 return -EINVAL;
584 584
585 cz_hwmgr->sclk_dpm.soft_min_clk = table->entries[0].clk; 585 cz_hwmgr->sclk_dpm.soft_min_clk = table->entries[0].clk;
@@ -606,7 +606,7 @@ static int cz_tf_init_uvd_limit(struct pp_hwmgr *hwmgr, void *input,
606 hwmgr->dyn_state.uvd_clock_voltage_dependency_table; 606 hwmgr->dyn_state.uvd_clock_voltage_dependency_table;
607 unsigned long clock = 0, level; 607 unsigned long clock = 0, level;
608 608
609 if (NULL == table && table->count <= 0) 609 if (NULL == table || table->count <= 0)
610 return -EINVAL; 610 return -EINVAL;
611 611
612 cz_hwmgr->uvd_dpm.soft_min_clk = 0; 612 cz_hwmgr->uvd_dpm.soft_min_clk = 0;
@@ -634,7 +634,7 @@ static int cz_tf_init_vce_limit(struct pp_hwmgr *hwmgr, void *input,
634 hwmgr->dyn_state.vce_clock_voltage_dependency_table; 634 hwmgr->dyn_state.vce_clock_voltage_dependency_table;
635 unsigned long clock = 0, level; 635 unsigned long clock = 0, level;
636 636
637 if (NULL == table && table->count <= 0) 637 if (NULL == table || table->count <= 0)
638 return -EINVAL; 638 return -EINVAL;
639 639
640 cz_hwmgr->vce_dpm.soft_min_clk = 0; 640 cz_hwmgr->vce_dpm.soft_min_clk = 0;
@@ -662,7 +662,7 @@ static int cz_tf_init_acp_limit(struct pp_hwmgr *hwmgr, void *input,
662 hwmgr->dyn_state.acp_clock_voltage_dependency_table; 662 hwmgr->dyn_state.acp_clock_voltage_dependency_table;
663 unsigned long clock = 0, level; 663 unsigned long clock = 0, level;
664 664
665 if (NULL == table && table->count <= 0) 665 if (NULL == table || table->count <= 0)
666 return -EINVAL; 666 return -EINVAL;
667 667
668 cz_hwmgr->acp_dpm.soft_min_clk = 0; 668 cz_hwmgr->acp_dpm.soft_min_clk = 0;
@@ -925,6 +925,54 @@ static struct phm_master_table_header cz_setup_asic_master = {
925 cz_setup_asic_list 925 cz_setup_asic_list
926}; 926};
927 927
928static int cz_tf_power_up_display_clock_sys_pll(struct pp_hwmgr *hwmgr,
929 void *input, void *output,
930 void *storage, int result)
931{
932 struct cz_hwmgr *hw_data = (struct cz_hwmgr *)(hwmgr->backend);
933 hw_data->disp_clk_bypass_pending = false;
934 hw_data->disp_clk_bypass = false;
935
936 return 0;
937}
938
939static int cz_tf_clear_nb_dpm_flag(struct pp_hwmgr *hwmgr,
940 void *input, void *output,
941 void *storage, int result)
942{
943 struct cz_hwmgr *hw_data = (struct cz_hwmgr *)(hwmgr->backend);
944 hw_data->is_nb_dpm_enabled = false;
945
946 return 0;
947}
948
949static int cz_tf_reset_cc6_data(struct pp_hwmgr *hwmgr,
950 void *input, void *output,
951 void *storage, int result)
952{
953 struct cz_hwmgr *hw_data = (struct cz_hwmgr *)(hwmgr->backend);
954
955 hw_data->cc6_settings.cc6_setting_changed = false;
956 hw_data->cc6_settings.cpu_pstate_separation_time = 0;
957 hw_data->cc6_settings.cpu_cc6_disable = false;
958 hw_data->cc6_settings.cpu_pstate_disable = false;
959
960 return 0;
961}
962
963static struct phm_master_table_item cz_power_down_asic_list[] = {
964 {NULL, cz_tf_power_up_display_clock_sys_pll},
965 {NULL, cz_tf_clear_nb_dpm_flag},
966 {NULL, cz_tf_reset_cc6_data},
967 {NULL, NULL}
968};
969
970static struct phm_master_table_header cz_power_down_asic_master = {
971 0,
972 PHM_MasterTableFlag_None,
973 cz_power_down_asic_list
974};
975
928static int cz_tf_program_voting_clients(struct pp_hwmgr *hwmgr, void *input, 976static int cz_tf_program_voting_clients(struct pp_hwmgr *hwmgr, void *input,
929 void *output, void *storage, int result) 977 void *output, void *storage, int result)
930{ 978{
@@ -1126,6 +1174,13 @@ static int cz_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
1126 return result; 1174 return result;
1127 } 1175 }
1128 1176
1177 result = phm_construct_table(hwmgr, &cz_power_down_asic_master,
1178 &(hwmgr->power_down_asic));
1179 if (result != 0) {
1180 printk(KERN_ERR "[ powerplay ] Fail to construct power down ASIC\n");
1181 return result;
1182 }
1183
1129 result = phm_construct_table(hwmgr, &cz_disable_dpm_master, 1184 result = phm_construct_table(hwmgr, &cz_disable_dpm_master,
1130 &(hwmgr->disable_dynamic_state_management)); 1185 &(hwmgr->disable_dynamic_state_management));
1131 if (result != 0) { 1186 if (result != 0) {
@@ -1183,7 +1238,7 @@ int cz_phm_unforce_dpm_levels(struct pp_hwmgr *hwmgr)
1183 hwmgr->dyn_state.vddc_dependency_on_sclk; 1238 hwmgr->dyn_state.vddc_dependency_on_sclk;
1184 unsigned long clock = 0, level; 1239 unsigned long clock = 0, level;
1185 1240
1186 if (NULL == table && table->count <= 0) 1241 if (NULL == table || table->count <= 0)
1187 return -EINVAL; 1242 return -EINVAL;
1188 1243
1189 cz_hwmgr->sclk_dpm.soft_min_clk = table->entries[0].clk; 1244 cz_hwmgr->sclk_dpm.soft_min_clk = table->entries[0].clk;
@@ -1494,7 +1549,7 @@ cz_print_current_perforce_level(struct pp_hwmgr *hwmgr, struct seq_file *m)
1494 uint32_t vce_index = PHM_GET_FIELD(cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixTARGET_AND_CURRENT_PROFILE_INDEX_2), 1549 uint32_t vce_index = PHM_GET_FIELD(cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixTARGET_AND_CURRENT_PROFILE_INDEX_2),
1495 TARGET_AND_CURRENT_PROFILE_INDEX_2, CURR_VCE_INDEX); 1550 TARGET_AND_CURRENT_PROFILE_INDEX_2, CURR_VCE_INDEX);
1496 1551
1497 uint32_t sclk, vclk, dclk, ecclk, tmp, active_percent; 1552 uint32_t sclk, vclk, dclk, ecclk, tmp, activity_percent;
1498 uint16_t vddnb, vddgfx; 1553 uint16_t vddnb, vddgfx;
1499 int result; 1554 int result;
1500 1555
@@ -1536,13 +1591,13 @@ cz_print_current_perforce_level(struct pp_hwmgr *hwmgr, struct seq_file *m)
1536 1591
1537 result = smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_GetAverageGraphicsActivity); 1592 result = smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_GetAverageGraphicsActivity);
1538 if (0 == result) { 1593 if (0 == result) {
1539 active_percent = cgs_read_register(hwmgr->device, mmSMU_MP1_SRBM2P_ARG_0); 1594 activity_percent = cgs_read_register(hwmgr->device, mmSMU_MP1_SRBM2P_ARG_0);
1540 active_percent = active_percent > 100 ? 100 : active_percent; 1595 activity_percent = activity_percent > 100 ? 100 : activity_percent;
1541 } else { 1596 } else {
1542 active_percent = 50; 1597 activity_percent = 50;
1543 } 1598 }
1544 1599
1545 seq_printf(m, "\n [GPU load]: %u %%\n\n", active_percent); 1600 seq_printf(m, "\n [GPU load]: %u %%\n\n", activity_percent);
1546} 1601}
1547 1602
1548static void cz_hw_print_display_cfg( 1603static void cz_hw_print_display_cfg(
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/fiji_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/fiji_hwmgr.c
index 94f404c121b7..28031a7eddba 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/fiji_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/fiji_hwmgr.c
@@ -914,7 +914,7 @@ static int fiji_trim_voltage_table(struct pp_hwmgr *hwmgr,
914 GFP_KERNEL); 914 GFP_KERNEL);
915 915
916 if (NULL == table) 916 if (NULL == table)
917 return -EINVAL; 917 return -ENOMEM;
918 918
919 table->mask_low = vol_table->mask_low; 919 table->mask_low = vol_table->mask_low;
920 table->phase_delay = vol_table->phase_delay; 920 table->phase_delay = vol_table->phase_delay;
@@ -941,8 +941,9 @@ static int fiji_trim_voltage_table(struct pp_hwmgr *hwmgr,
941 memcpy(vol_table, table, sizeof(struct pp_atomctrl_voltage_table)); 941 memcpy(vol_table, table, sizeof(struct pp_atomctrl_voltage_table));
942 kfree(table); 942 kfree(table);
943 943
944 return 0; 944 return 0;
945} 945}
946
946static int fiji_get_svi2_mvdd_voltage_table(struct pp_hwmgr *hwmgr, 947static int fiji_get_svi2_mvdd_voltage_table(struct pp_hwmgr *hwmgr,
947 phm_ppt_v1_clock_voltage_dependency_table *dep_table) 948 phm_ppt_v1_clock_voltage_dependency_table *dep_table)
948{ 949{
@@ -1112,7 +1113,7 @@ static int fiji_construct_voltage_tables(struct pp_hwmgr *hwmgr)
1112 fiji_trim_voltage_table_to_fit_state_table(hwmgr, 1113 fiji_trim_voltage_table_to_fit_state_table(hwmgr,
1113 SMU73_MAX_LEVELS_MVDD, &(data->mvdd_voltage_table))); 1114 SMU73_MAX_LEVELS_MVDD, &(data->mvdd_voltage_table)));
1114 1115
1115 return 0; 1116 return 0;
1116} 1117}
1117 1118
1118static int fiji_initialize_mc_reg_table(struct pp_hwmgr *hwmgr) 1119static int fiji_initialize_mc_reg_table(struct pp_hwmgr *hwmgr)
@@ -1158,7 +1159,7 @@ static int fiji_program_static_screen_threshold_parameters(
1158 CG_STATIC_SCREEN_PARAMETER, STATIC_SCREEN_THRESHOLD, 1159 CG_STATIC_SCREEN_PARAMETER, STATIC_SCREEN_THRESHOLD,
1159 data->static_screen_threshold); 1160 data->static_screen_threshold);
1160 1161
1161 return 0; 1162 return 0;
1162} 1163}
1163 1164
1164/** 1165/**
@@ -1295,7 +1296,7 @@ static int fiji_process_firmware_header(struct pp_hwmgr *hwmgr)
1295 1296
1296 error |= (0 != result); 1297 error |= (0 != result);
1297 1298
1298 return error ? -1 : 0; 1299 return error ? -1 : 0;
1299} 1300}
1300 1301
1301/* Copy one arb setting to another and then switch the active set. 1302/* Copy one arb setting to another and then switch the active set.
@@ -1339,12 +1340,12 @@ static int fiji_copy_and_switch_arb_sets(struct pp_hwmgr *hwmgr,
1339 return -EINVAL; 1340 return -EINVAL;
1340 } 1341 }
1341 1342
1342 mc_cg_config = cgs_read_register(hwmgr->device, mmMC_CG_CONFIG); 1343 mc_cg_config = cgs_read_register(hwmgr->device, mmMC_CG_CONFIG);
1343 mc_cg_config |= 0x0000000F; 1344 mc_cg_config |= 0x0000000F;
1344 cgs_write_register(hwmgr->device, mmMC_CG_CONFIG, mc_cg_config); 1345 cgs_write_register(hwmgr->device, mmMC_CG_CONFIG, mc_cg_config);
1345 PHM_WRITE_FIELD(hwmgr->device, MC_ARB_CG, CG_ARB_REQ, arb_dest); 1346 PHM_WRITE_FIELD(hwmgr->device, MC_ARB_CG, CG_ARB_REQ, arb_dest);
1346 1347
1347 return 0; 1348 return 0;
1348} 1349}
1349 1350
1350/** 1351/**
@@ -1927,17 +1928,17 @@ static int fiji_populate_single_graphic_level(struct pp_hwmgr *hwmgr,
1927 1928
1928 threshold = clock * data->fast_watermark_threshold / 100; 1929 threshold = clock * data->fast_watermark_threshold / 100;
1929 1930
1930 /* 1931 /*
1931 * TODO: get minimum clocks from dal configaration 1932 * TODO: get minimum clocks from dal configaration
1932 * PECI_GetMinClockSettings(hwmgr->pPECI, &minClocks); 1933 * PECI_GetMinClockSettings(hwmgr->pPECI, &minClocks);
1933 */ 1934 */
1934 /* data->DisplayTiming.minClockInSR = minClocks.engineClockInSR; */ 1935 /* data->DisplayTiming.minClockInSR = minClocks.engineClockInSR; */
1935 1936
1936 /* get level->DeepSleepDivId 1937 /* get level->DeepSleepDivId
1937 if (phm_cap_enabled(hwmgr->platformDescriptor.platformCaps, PHM_PlatformCaps_SclkDeepSleep)) 1938 if (phm_cap_enabled(hwmgr->platformDescriptor.platformCaps, PHM_PlatformCaps_SclkDeepSleep))
1938 { 1939 {
1939 level->DeepSleepDivId = PhwFiji_GetSleepDividerIdFromClock(hwmgr, clock, minClocks.engineClockInSR); 1940 level->DeepSleepDivId = PhwFiji_GetSleepDividerIdFromClock(hwmgr, clock, minClocks.engineClockInSR);
1940 } */ 1941 } */
1941 1942
1942 /* Default to slow, highest DPM level will be 1943 /* Default to slow, highest DPM level will be
1943 * set to PPSMC_DISPLAY_WATERMARK_LOW later. 1944 * set to PPSMC_DISPLAY_WATERMARK_LOW later.
@@ -2756,7 +2757,7 @@ static int fiji_populate_clock_stretcher_data_table(struct pp_hwmgr *hwmgr)
2756 SclkFrequency) / 100); 2757 SclkFrequency) / 100);
2757 if (fiji_clock_stretcher_lookup_table[stretch_amount2][0] < 2758 if (fiji_clock_stretcher_lookup_table[stretch_amount2][0] <
2758 clock_freq_u16 && 2759 clock_freq_u16 &&
2759 fiji_clock_stretcher_lookup_table[stretch_amount2][1] > 2760 fiji_clock_stretcher_lookup_table[stretch_amount2][1] >
2760 clock_freq_u16) { 2761 clock_freq_u16) {
2761 /* Program PWR_CKS_CNTL. CKS_USE_FOR_LOW_FREQ */ 2762 /* Program PWR_CKS_CNTL. CKS_USE_FOR_LOW_FREQ */
2762 value |= (fiji_clock_stretcher_lookup_table[stretch_amount2][3]) << 16; 2763 value |= (fiji_clock_stretcher_lookup_table[stretch_amount2][3]) << 16;
@@ -3172,9 +3173,9 @@ static int fiji_enable_sclk_mclk_dpm(struct pp_hwmgr *hwmgr)
3172 /* enable SCLK dpm */ 3173 /* enable SCLK dpm */
3173 if(!data->sclk_dpm_key_disabled) 3174 if(!data->sclk_dpm_key_disabled)
3174 PP_ASSERT_WITH_CODE( 3175 PP_ASSERT_WITH_CODE(
3175 (0 == smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_DPM_Enable)), 3176 (0 == smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_DPM_Enable)),
3176 "Failed to enable SCLK DPM during DPM Start Function!", 3177 "Failed to enable SCLK DPM during DPM Start Function!",
3177 return -1); 3178 return -1);
3178 3179
3179 /* enable MCLK dpm */ 3180 /* enable MCLK dpm */
3180 if(0 == data->mclk_dpm_key_disabled) { 3181 if(0 == data->mclk_dpm_key_disabled) {
@@ -3320,7 +3321,7 @@ static int fiji_start_dpm(struct pp_hwmgr *hwmgr)
3320 return -1); 3321 return -1);
3321 } 3322 }
3322 3323
3323 return 0; 3324 return 0;
3324} 3325}
3325 3326
3326static void fiji_set_dpm_event_sources(struct pp_hwmgr *hwmgr, 3327static void fiji_set_dpm_event_sources(struct pp_hwmgr *hwmgr,
@@ -3378,7 +3379,7 @@ static int fiji_enable_auto_throttle_source(struct pp_hwmgr *hwmgr,
3378 3379
3379static int fiji_enable_thermal_auto_throttle(struct pp_hwmgr *hwmgr) 3380static int fiji_enable_thermal_auto_throttle(struct pp_hwmgr *hwmgr)
3380{ 3381{
3381 return fiji_enable_auto_throttle_source(hwmgr, PHM_AutoThrottleSource_Thermal); 3382 return fiji_enable_auto_throttle_source(hwmgr, PHM_AutoThrottleSource_Thermal);
3382} 3383}
3383 3384
3384static int fiji_enable_dpm_tasks(struct pp_hwmgr *hwmgr) 3385static int fiji_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
@@ -4865,7 +4866,9 @@ static int fiji_dpm_get_mclk(struct pp_hwmgr *hwmgr, bool low)
4865static void fiji_print_current_perforce_level( 4866static void fiji_print_current_perforce_level(
4866 struct pp_hwmgr *hwmgr, struct seq_file *m) 4867 struct pp_hwmgr *hwmgr, struct seq_file *m)
4867{ 4868{
4868 uint32_t sclk, mclk; 4869 uint32_t sclk, mclk, activity_percent = 0;
4870 uint32_t offset;
4871 struct fiji_hwmgr *data = (struct fiji_hwmgr *)(hwmgr->backend);
4869 4872
4870 smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_API_GetSclkFrequency); 4873 smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_API_GetSclkFrequency);
4871 4874
@@ -4876,6 +4879,13 @@ static void fiji_print_current_perforce_level(
4876 mclk = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0); 4879 mclk = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0);
4877 seq_printf(m, "\n [ mclk ]: %u MHz\n\n [ sclk ]: %u MHz\n", 4880 seq_printf(m, "\n [ mclk ]: %u MHz\n\n [ sclk ]: %u MHz\n",
4878 mclk / 100, sclk / 100); 4881 mclk / 100, sclk / 100);
4882
4883 offset = data->soft_regs_start + offsetof(SMU73_SoftRegisters, AverageGraphicsActivity);
4884 activity_percent = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, offset);
4885 activity_percent += 0x80;
4886 activity_percent >>= 8;
4887
4888 seq_printf(m, "\n [GPU load]: %u%%\n\n", activity_percent > 100 ? 100 : activity_percent);
4879} 4889}
4880 4890
4881static int fiji_program_display_gap(struct pp_hwmgr *hwmgr) 4891static int fiji_program_display_gap(struct pp_hwmgr *hwmgr)
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/fiji_powertune.c b/drivers/gpu/drm/amd/powerplay/hwmgr/fiji_powertune.c
index f89c98fd759e..6efcb2bac45f 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/fiji_powertune.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/fiji_powertune.c
@@ -93,9 +93,9 @@ void fiji_initialize_power_tune_defaults(struct pp_hwmgr *hwmgr)
93 */ 93 */
94static uint16_t scale_fan_gain_settings(uint16_t raw_setting) 94static uint16_t scale_fan_gain_settings(uint16_t raw_setting)
95{ 95{
96 uint32_t tmp; 96 uint32_t tmp;
97 tmp = raw_setting * 4096 / 100; 97 tmp = raw_setting * 4096 / 100;
98 return (uint16_t)tmp; 98 return (uint16_t)tmp;
99} 99}
100 100
101static void get_scl_sda_value(uint8_t line, uint8_t *scl, uint8_t* sda) 101static void get_scl_sda_value(uint8_t line, uint8_t *scl, uint8_t* sda)
@@ -546,8 +546,8 @@ int fiji_power_control_set_level(struct pp_hwmgr *hwmgr)
546 * but message to be 8 bit fraction for messages 546 * but message to be 8 bit fraction for messages
547 */ 547 */
548 target_tdp = ((100 + adjust_percent) * (int)(cac_table->usTDP * 256)) / 100; 548 target_tdp = ((100 + adjust_percent) * (int)(cac_table->usTDP * 256)) / 100;
549 result = fiji_set_overdriver_target_tdp(hwmgr, (uint32_t)target_tdp); 549 result = fiji_set_overdriver_target_tdp(hwmgr, (uint32_t)target_tdp);
550 } 550 }
551 551
552 return result; 552 return result;
553} 553}
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/functiontables.c b/drivers/gpu/drm/amd/powerplay/hwmgr/functiontables.c
index 5abde8f6d108..9deadabbc81c 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/functiontables.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/functiontables.c
@@ -66,7 +66,7 @@ int phm_dispatch_table(struct pp_hwmgr *hwmgr,
66 temp_storage = kzalloc(rt_table->storage_size, GFP_KERNEL); 66 temp_storage = kzalloc(rt_table->storage_size, GFP_KERNEL);
67 if (temp_storage == NULL) { 67 if (temp_storage == NULL) {
68 printk(KERN_ERR "[ powerplay ] Could not allocate table temporary storage\n"); 68 printk(KERN_ERR "[ powerplay ] Could not allocate table temporary storage\n");
69 return -1; 69 return -ENOMEM;
70 } 70 }
71 } 71 }
72 72
@@ -90,7 +90,7 @@ int phm_construct_table(struct pp_hwmgr *hwmgr,
90 90
91 if (hwmgr == NULL || master_table == NULL || rt_table == NULL) { 91 if (hwmgr == NULL || master_table == NULL || rt_table == NULL) {
92 printk(KERN_ERR "[ powerplay ] Invalid Parameter!\n"); 92 printk(KERN_ERR "[ powerplay ] Invalid Parameter!\n");
93 return -1; 93 return -EINVAL;
94 } 94 }
95 95
96 for (table_item = master_table->master_list; 96 for (table_item = master_table->master_list;
@@ -102,8 +102,9 @@ int phm_construct_table(struct pp_hwmgr *hwmgr,
102 102
103 size = (function_count + 1) * sizeof(phm_table_function); 103 size = (function_count + 1) * sizeof(phm_table_function);
104 run_time_list = kzalloc(size, GFP_KERNEL); 104 run_time_list = kzalloc(size, GFP_KERNEL);
105
105 if (NULL == run_time_list) 106 if (NULL == run_time_list)
106 return -1; 107 return -ENOMEM;
107 108
108 rtf = run_time_list; 109 rtf = run_time_list;
109 for (table_item = master_table->master_list; 110 for (table_item = master_table->master_list;
@@ -111,7 +112,7 @@ int phm_construct_table(struct pp_hwmgr *hwmgr,
111 if ((rtf - run_time_list) > function_count) { 112 if ((rtf - run_time_list) > function_count) {
112 printk(KERN_ERR "[ powerplay ] Check function results have changed\n"); 113 printk(KERN_ERR "[ powerplay ] Check function results have changed\n");
113 kfree(run_time_list); 114 kfree(run_time_list);
114 return -1; 115 return -EINVAL;
115 } 116 }
116 117
117 if ((NULL == table_item->isFunctionNeededInRuntimeTable) || 118 if ((NULL == table_item->isFunctionNeededInRuntimeTable) ||
@@ -123,7 +124,7 @@ int phm_construct_table(struct pp_hwmgr *hwmgr,
123 if ((rtf - run_time_list) > function_count) { 124 if ((rtf - run_time_list) > function_count) {
124 printk(KERN_ERR "[ powerplay ] Check function results have changed\n"); 125 printk(KERN_ERR "[ powerplay ] Check function results have changed\n");
125 kfree(run_time_list); 126 kfree(run_time_list);
126 return -1; 127 return -EINVAL;
127 } 128 }
128 129
129 *rtf = NULL; 130 *rtf = NULL;
@@ -138,7 +139,7 @@ int phm_destroy_table(struct pp_hwmgr *hwmgr,
138{ 139{
139 if (hwmgr == NULL || rt_table == NULL) { 140 if (hwmgr == NULL || rt_table == NULL) {
140 printk(KERN_ERR "[ powerplay ] Invalid Parameter\n"); 141 printk(KERN_ERR "[ powerplay ] Invalid Parameter\n");
141 return -1; 142 return -EINVAL;
142 } 143 }
143 144
144 if (NULL == rt_table->function_list) 145 if (NULL == rt_table->function_list)
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
index 001b8bb4143d..0f2d5e4bc241 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
@@ -90,6 +90,22 @@ int phm_setup_asic(struct pp_hwmgr *hwmgr)
90 return 0; 90 return 0;
91} 91}
92 92
93int phm_power_down_asic(struct pp_hwmgr *hwmgr)
94{
95 PHM_FUNC_CHECK(hwmgr);
96
97 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
98 PHM_PlatformCaps_TablelessHardwareInterface)) {
99 if (NULL != hwmgr->hwmgr_func->power_off_asic)
100 return hwmgr->hwmgr_func->power_off_asic(hwmgr);
101 } else {
102 return phm_dispatch_table(hwmgr, &(hwmgr->power_down_asic),
103 NULL, NULL);
104 }
105
106 return 0;
107}
108
93int phm_set_power_state(struct pp_hwmgr *hwmgr, 109int phm_set_power_state(struct pp_hwmgr *hwmgr,
94 const struct pp_hw_power_state *pcurrent_state, 110 const struct pp_hw_power_state *pcurrent_state,
95 const struct pp_hw_power_state *pnew_power_state) 111 const struct pp_hw_power_state *pnew_power_state)
@@ -247,7 +263,6 @@ int phm_register_thermal_interrupt(struct pp_hwmgr *hwmgr, const void *info)
247*/ 263*/
248int phm_start_thermal_controller(struct pp_hwmgr *hwmgr, struct PP_TemperatureRange *temperature_range) 264int phm_start_thermal_controller(struct pp_hwmgr *hwmgr, struct PP_TemperatureRange *temperature_range)
249{ 265{
250
251 return phm_dispatch_table(hwmgr, &(hwmgr->start_thermal_controller), temperature_range, NULL); 266 return phm_dispatch_table(hwmgr, &(hwmgr->start_thermal_controller), temperature_range, NULL);
252} 267}
253 268
@@ -317,4 +332,3 @@ int phm_set_cpu_power_state(struct pp_hwmgr *hwmgr)
317 332
318 return 0; 333 return 0;
319} 334}
320
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
index ca4554b402f9..5fb98aa2e719 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
@@ -111,6 +111,9 @@ int hw_init_power_state_table(struct pp_hwmgr *hwmgr)
111 111
112 hwmgr->ps = kzalloc(size * table_entries, GFP_KERNEL); 112 hwmgr->ps = kzalloc(size * table_entries, GFP_KERNEL);
113 113
114 if (hwmgr->ps == NULL)
115 return -ENOMEM;
116
114 state = hwmgr->ps; 117 state = hwmgr->ps;
115 118
116 for (i = 0; i < table_entries; i++) { 119 for (i = 0; i < table_entries; i++) {
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppevvmath.h b/drivers/gpu/drm/amd/powerplay/hwmgr/ppevvmath.h
index 42f2423cddea..b7429a527828 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppevvmath.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppevvmath.h
@@ -117,379 +117,380 @@ int GetRoundedValue(fInt); /* Incomplete function - Usef
117 */ 117 */
118fInt fExponential(fInt exponent) /*Can be used to calculate e^exponent*/ 118fInt fExponential(fInt exponent) /*Can be used to calculate e^exponent*/
119{ 119{
120 uint32_t i; 120 uint32_t i;
121 bool bNegated = false; 121 bool bNegated = false;
122 122
123 fInt fPositiveOne = ConvertToFraction(1); 123 fInt fPositiveOne = ConvertToFraction(1);
124 fInt fZERO = ConvertToFraction(0); 124 fInt fZERO = ConvertToFraction(0);
125 125
126 fInt lower_bound = Divide(78, 10000); 126 fInt lower_bound = Divide(78, 10000);
127 fInt solution = fPositiveOne; /*Starting off with baseline of 1 */ 127 fInt solution = fPositiveOne; /*Starting off with baseline of 1 */
128 fInt error_term; 128 fInt error_term;
129 129
130 uint32_t k_array[11] = {55452, 27726, 13863, 6931, 4055, 2231, 1178, 606, 308, 155, 78}; 130 uint32_t k_array[11] = {55452, 27726, 13863, 6931, 4055, 2231, 1178, 606, 308, 155, 78};
131 uint32_t expk_array[11] = {2560000, 160000, 40000, 20000, 15000, 12500, 11250, 10625, 10313, 10156, 10078}; 131 uint32_t expk_array[11] = {2560000, 160000, 40000, 20000, 15000, 12500, 11250, 10625, 10313, 10156, 10078};
132 132
133 if (GreaterThan(fZERO, exponent)) { 133 if (GreaterThan(fZERO, exponent)) {
134 exponent = fNegate(exponent); 134 exponent = fNegate(exponent);
135 bNegated = true; 135 bNegated = true;
136 } 136 }
137 137
138 while (GreaterThan(exponent, lower_bound)) { 138 while (GreaterThan(exponent, lower_bound)) {
139 for (i = 0; i < 11; i++) { 139 for (i = 0; i < 11; i++) {
140 if (GreaterThan(exponent, GetScaledFraction(k_array[i], 10000))) { 140 if (GreaterThan(exponent, GetScaledFraction(k_array[i], 10000))) {
141 exponent = fSubtract(exponent, GetScaledFraction(k_array[i], 10000)); 141 exponent = fSubtract(exponent, GetScaledFraction(k_array[i], 10000));
142 solution = fMultiply(solution, GetScaledFraction(expk_array[i], 10000)); 142 solution = fMultiply(solution, GetScaledFraction(expk_array[i], 10000));
143 } 143 }
144 } 144 }
145 } 145 }
146 146
147 error_term = fAdd(fPositiveOne, exponent); 147 error_term = fAdd(fPositiveOne, exponent);
148 148
149 solution = fMultiply(solution, error_term); 149 solution = fMultiply(solution, error_term);
150 150
151 if (bNegated) 151 if (bNegated)
152 solution = fDivide(fPositiveOne, solution); 152 solution = fDivide(fPositiveOne, solution);
153 153
154 return solution; 154 return solution;
155} 155}
156 156
157fInt fNaturalLog(fInt value) 157fInt fNaturalLog(fInt value)
158{ 158{
159 uint32_t i; 159 uint32_t i;
160 fInt upper_bound = Divide(8, 1000); 160 fInt upper_bound = Divide(8, 1000);
161 fInt fNegativeOne = ConvertToFraction(-1); 161 fInt fNegativeOne = ConvertToFraction(-1);
162 fInt solution = ConvertToFraction(0); /*Starting off with baseline of 0 */ 162 fInt solution = ConvertToFraction(0); /*Starting off with baseline of 0 */
163 fInt error_term; 163 fInt error_term;
164 164
165 uint32_t k_array[10] = {160000, 40000, 20000, 15000, 12500, 11250, 10625, 10313, 10156, 10078}; 165 uint32_t k_array[10] = {160000, 40000, 20000, 15000, 12500, 11250, 10625, 10313, 10156, 10078};
166 uint32_t logk_array[10] = {27726, 13863, 6931, 4055, 2231, 1178, 606, 308, 155, 78}; 166 uint32_t logk_array[10] = {27726, 13863, 6931, 4055, 2231, 1178, 606, 308, 155, 78};
167 167
168 while (GreaterThan(fAdd(value, fNegativeOne), upper_bound)) { 168 while (GreaterThan(fAdd(value, fNegativeOne), upper_bound)) {
169 for (i = 0; i < 10; i++) { 169 for (i = 0; i < 10; i++) {
170 if (GreaterThan(value, GetScaledFraction(k_array[i], 10000))) { 170 if (GreaterThan(value, GetScaledFraction(k_array[i], 10000))) {
171 value = fDivide(value, GetScaledFraction(k_array[i], 10000)); 171 value = fDivide(value, GetScaledFraction(k_array[i], 10000));
172 solution = fAdd(solution, GetScaledFraction(logk_array[i], 10000)); 172 solution = fAdd(solution, GetScaledFraction(logk_array[i], 10000));
173 } 173 }
174 } 174 }
175 } 175 }
176 176
177 error_term = fAdd(fNegativeOne, value); 177 error_term = fAdd(fNegativeOne, value);
178 178
179 return (fAdd(solution, error_term)); 179 return (fAdd(solution, error_term));
180} 180}
181 181
182fInt fDecodeLinearFuse(uint32_t fuse_value, fInt f_min, fInt f_range, uint32_t bitlength) 182fInt fDecodeLinearFuse(uint32_t fuse_value, fInt f_min, fInt f_range, uint32_t bitlength)
183{ 183{
184 fInt f_fuse_value = Convert_ULONG_ToFraction(fuse_value); 184 fInt f_fuse_value = Convert_ULONG_ToFraction(fuse_value);
185 fInt f_bit_max_value = Convert_ULONG_ToFraction((uPow(2, bitlength)) - 1); 185 fInt f_bit_max_value = Convert_ULONG_ToFraction((uPow(2, bitlength)) - 1);
186 186
187 fInt f_decoded_value; 187 fInt f_decoded_value;
188 188
189 f_decoded_value = fDivide(f_fuse_value, f_bit_max_value); 189 f_decoded_value = fDivide(f_fuse_value, f_bit_max_value);
190 f_decoded_value = fMultiply(f_decoded_value, f_range); 190 f_decoded_value = fMultiply(f_decoded_value, f_range);
191 f_decoded_value = fAdd(f_decoded_value, f_min); 191 f_decoded_value = fAdd(f_decoded_value, f_min);
192 192
193 return f_decoded_value; 193 return f_decoded_value;
194} 194}
195 195
196 196
197fInt fDecodeLogisticFuse(uint32_t fuse_value, fInt f_average, fInt f_range, uint32_t bitlength) 197fInt fDecodeLogisticFuse(uint32_t fuse_value, fInt f_average, fInt f_range, uint32_t bitlength)
198{ 198{
199 fInt f_fuse_value = Convert_ULONG_ToFraction(fuse_value); 199 fInt f_fuse_value = Convert_ULONG_ToFraction(fuse_value);
200 fInt f_bit_max_value = Convert_ULONG_ToFraction((uPow(2, bitlength)) - 1); 200 fInt f_bit_max_value = Convert_ULONG_ToFraction((uPow(2, bitlength)) - 1);
201 201
202 fInt f_CONSTANT_NEG13 = ConvertToFraction(-13); 202 fInt f_CONSTANT_NEG13 = ConvertToFraction(-13);
203 fInt f_CONSTANT1 = ConvertToFraction(1); 203 fInt f_CONSTANT1 = ConvertToFraction(1);
204 204
205 fInt f_decoded_value; 205 fInt f_decoded_value;
206 206
207 f_decoded_value = fSubtract(fDivide(f_bit_max_value, f_fuse_value), f_CONSTANT1); 207 f_decoded_value = fSubtract(fDivide(f_bit_max_value, f_fuse_value), f_CONSTANT1);
208 f_decoded_value = fNaturalLog(f_decoded_value); 208 f_decoded_value = fNaturalLog(f_decoded_value);
209 f_decoded_value = fMultiply(f_decoded_value, fDivide(f_range, f_CONSTANT_NEG13)); 209 f_decoded_value = fMultiply(f_decoded_value, fDivide(f_range, f_CONSTANT_NEG13));
210 f_decoded_value = fAdd(f_decoded_value, f_average); 210 f_decoded_value = fAdd(f_decoded_value, f_average);
211 211
212 return f_decoded_value; 212 return f_decoded_value;
213} 213}
214 214
215fInt fDecodeLeakageID (uint32_t leakageID_fuse, fInt ln_max_div_min, fInt f_min, uint32_t bitlength) 215fInt fDecodeLeakageID (uint32_t leakageID_fuse, fInt ln_max_div_min, fInt f_min, uint32_t bitlength)
216{ 216{
217 fInt fLeakage; 217 fInt fLeakage;
218 fInt f_bit_max_value = Convert_ULONG_ToFraction((uPow(2, bitlength)) - 1); 218 fInt f_bit_max_value = Convert_ULONG_ToFraction((uPow(2, bitlength)) - 1);
219 219
220 fLeakage = fMultiply(ln_max_div_min, Convert_ULONG_ToFraction(leakageID_fuse)); 220 fLeakage = fMultiply(ln_max_div_min, Convert_ULONG_ToFraction(leakageID_fuse));
221 fLeakage = fDivide(fLeakage, f_bit_max_value); 221 fLeakage = fDivide(fLeakage, f_bit_max_value);
222 fLeakage = fExponential(fLeakage); 222 fLeakage = fExponential(fLeakage);
223 fLeakage = fMultiply(fLeakage, f_min); 223 fLeakage = fMultiply(fLeakage, f_min);
224 224
225 return fLeakage; 225 return fLeakage;
226} 226}
227 227
228fInt ConvertToFraction(int X) /*Add all range checking here. Is it possible to make fInt a private declaration? */ 228fInt ConvertToFraction(int X) /*Add all range checking here. Is it possible to make fInt a private declaration? */
229{ 229{
230 fInt temp; 230 fInt temp;
231 231
232 if (X <= MAX) 232 if (X <= MAX)
233 temp.full = (X << SHIFT_AMOUNT); 233 temp.full = (X << SHIFT_AMOUNT);
234 else 234 else
235 temp.full = 0; 235 temp.full = 0;
236 236
237 return temp; 237 return temp;
238} 238}
239 239
240fInt fNegate(fInt X) 240fInt fNegate(fInt X)
241{ 241{
242 fInt CONSTANT_NEGONE = ConvertToFraction(-1); 242 fInt CONSTANT_NEGONE = ConvertToFraction(-1);
243 return (fMultiply(X, CONSTANT_NEGONE)); 243 return (fMultiply(X, CONSTANT_NEGONE));
244} 244}
245 245
246fInt Convert_ULONG_ToFraction(uint32_t X) 246fInt Convert_ULONG_ToFraction(uint32_t X)
247{ 247{
248 fInt temp; 248 fInt temp;
249 249
250 if (X <= MAX) 250 if (X <= MAX)
251 temp.full = (X << SHIFT_AMOUNT); 251 temp.full = (X << SHIFT_AMOUNT);
252 else 252 else
253 temp.full = 0; 253 temp.full = 0;
254 254
255 return temp; 255 return temp;
256} 256}
257 257
258fInt GetScaledFraction(int X, int factor) 258fInt GetScaledFraction(int X, int factor)
259{ 259{
260 int times_shifted, factor_shifted; 260 int times_shifted, factor_shifted;
261 bool bNEGATED; 261 bool bNEGATED;
262 fInt fValue; 262 fInt fValue;
263 263
264 times_shifted = 0; 264 times_shifted = 0;
265 factor_shifted = 0; 265 factor_shifted = 0;
266 bNEGATED = false; 266 bNEGATED = false;
267 267
268 if (X < 0) { 268 if (X < 0) {
269 X = -1*X; 269 X = -1*X;
270 bNEGATED = true; 270 bNEGATED = true;
271 } 271 }
272 272
273 if (factor < 0) { 273 if (factor < 0) {
274 factor = -1*factor; 274 factor = -1*factor;
275 275 bNEGATED = !bNEGATED; /*If bNEGATED = true due to X < 0, this will cover the case of negative cancelling negative */
276 bNEGATED = !bNEGATED; /*If bNEGATED = true due to X < 0, this will cover the case of negative cancelling negative */ 276 }
277 } 277
278 278 if ((X > MAX) || factor > MAX) {
279 if ((X > MAX) || factor > MAX) { 279 if ((X/factor) <= MAX) {
280 if ((X/factor) <= MAX) { 280 while (X > MAX) {
281 while (X > MAX) { 281 X = X >> 1;
282 X = X >> 1; 282 times_shifted++;
283 times_shifted++; 283 }
284 } 284
285 285 while (factor > MAX) {
286 while (factor > MAX) { 286 factor = factor >> 1;
287 factor = factor >> 1; 287 factor_shifted++;
288 factor_shifted++; 288 }
289 } 289 } else {
290 } else { 290 fValue.full = 0;
291 fValue.full = 0; 291 return fValue;
292 return fValue; 292 }
293 } 293 }
294 } 294
295 295 if (factor == 1)
296 if (factor == 1) 296 return (ConvertToFraction(X));
297 return (ConvertToFraction(X)); 297
298 298 fValue = fDivide(ConvertToFraction(X * uPow(-1, bNEGATED)), ConvertToFraction(factor));
299 fValue = fDivide(ConvertToFraction(X * uPow(-1, bNEGATED)), ConvertToFraction(factor)); 299
300 300 fValue.full = fValue.full << times_shifted;
301 fValue.full = fValue.full << times_shifted; 301 fValue.full = fValue.full >> factor_shifted;
302 fValue.full = fValue.full >> factor_shifted; 302
303 303 return fValue;
304 return fValue;
305} 304}
306 305
307/* Addition using two fInts */ 306/* Addition using two fInts */
308fInt fAdd (fInt X, fInt Y) 307fInt fAdd (fInt X, fInt Y)
309{ 308{
310 fInt Sum; 309 fInt Sum;
311 310
312 Sum.full = X.full + Y.full; 311 Sum.full = X.full + Y.full;
313 312
314 return Sum; 313 return Sum;
315} 314}
316 315
317/* Addition using two fInts */ 316/* Addition using two fInts */
318fInt fSubtract (fInt X, fInt Y) 317fInt fSubtract (fInt X, fInt Y)
319{ 318{
320 fInt Difference; 319 fInt Difference;
321 320
322 Difference.full = X.full - Y.full; 321 Difference.full = X.full - Y.full;
323 322
324 return Difference; 323 return Difference;
325} 324}
326 325
327bool Equal(fInt A, fInt B) 326bool Equal(fInt A, fInt B)
328{ 327{
329 if (A.full == B.full) 328 if (A.full == B.full)
330 return true; 329 return true;
331 else 330 else
332 return false; 331 return false;
333} 332}
334 333
335bool GreaterThan(fInt A, fInt B) 334bool GreaterThan(fInt A, fInt B)
336{ 335{
337 if (A.full > B.full) 336 if (A.full > B.full)
338 return true; 337 return true;
339 else 338 else
340 return false; 339 return false;
341} 340}
342 341
343fInt fMultiply (fInt X, fInt Y) /* Uses 64-bit integers (int64_t) */ 342fInt fMultiply (fInt X, fInt Y) /* Uses 64-bit integers (int64_t) */
344{ 343{
345 fInt Product; 344 fInt Product;
346 int64_t tempProduct; 345 int64_t tempProduct;
347 bool X_LessThanOne, Y_LessThanOne; 346 bool X_LessThanOne, Y_LessThanOne;
348 347
349 X_LessThanOne = (X.partial.real == 0 && X.partial.decimal != 0 && X.full >= 0); 348 X_LessThanOne = (X.partial.real == 0 && X.partial.decimal != 0 && X.full >= 0);
350 Y_LessThanOne = (Y.partial.real == 0 && Y.partial.decimal != 0 && Y.full >= 0); 349 Y_LessThanOne = (Y.partial.real == 0 && Y.partial.decimal != 0 && Y.full >= 0);
351 350
352 /*The following is for a very specific common case: Non-zero number with ONLY fractional portion*/ 351 /*The following is for a very specific common case: Non-zero number with ONLY fractional portion*/
353 /* TEMPORARILY DISABLED - CAN BE USED TO IMPROVE PRECISION 352 /* TEMPORARILY DISABLED - CAN BE USED TO IMPROVE PRECISION
354 353
355 if (X_LessThanOne && Y_LessThanOne) { 354 if (X_LessThanOne && Y_LessThanOne) {
356 Product.full = X.full * Y.full; 355 Product.full = X.full * Y.full;
357 return Product 356 return Product
358 }*/ 357 }*/
359 358
360 tempProduct = ((int64_t)X.full) * ((int64_t)Y.full); /*Q(16,16)*Q(16,16) = Q(32, 32) - Might become a negative number! */ 359 tempProduct = ((int64_t)X.full) * ((int64_t)Y.full); /*Q(16,16)*Q(16,16) = Q(32, 32) - Might become a negative number! */
361 tempProduct = tempProduct >> 16; /*Remove lagging 16 bits - Will lose some precision from decimal; */ 360 tempProduct = tempProduct >> 16; /*Remove lagging 16 bits - Will lose some precision from decimal; */
362 Product.full = (int)tempProduct; /*The int64_t will lose the leading 16 bits that were part of the integer portion */ 361 Product.full = (int)tempProduct; /*The int64_t will lose the leading 16 bits that were part of the integer portion */
363 362
364 return Product; 363 return Product;
365} 364}
366 365
367fInt fDivide (fInt X, fInt Y) 366fInt fDivide (fInt X, fInt Y)
368{ 367{
369 fInt fZERO, fQuotient; 368 fInt fZERO, fQuotient;
370 int64_t longlongX, longlongY; 369 int64_t longlongX, longlongY;
371 370
372 fZERO = ConvertToFraction(0); 371 fZERO = ConvertToFraction(0);
373 372
374 if (Equal(Y, fZERO)) 373 if (Equal(Y, fZERO))
375 return fZERO; 374 return fZERO;
376 375
377 longlongX = (int64_t)X.full; 376 longlongX = (int64_t)X.full;
378 longlongY = (int64_t)Y.full; 377 longlongY = (int64_t)Y.full;
379 378
380 longlongX = longlongX << 16; /*Q(16,16) -> Q(32,32) */ 379 longlongX = longlongX << 16; /*Q(16,16) -> Q(32,32) */
381 380
382 do_div(longlongX, longlongY); /*Q(32,32) divided by Q(16,16) = Q(16,16) Back to original format */ 381 div64_s64(longlongX, longlongY); /*Q(32,32) divided by Q(16,16) = Q(16,16) Back to original format */
383 382
384 fQuotient.full = (int)longlongX; 383 fQuotient.full = (int)longlongX;
385 return fQuotient; 384 return fQuotient;
386} 385}
387 386
388int ConvertBackToInteger (fInt A) /*THIS is the function that will be used to check with the Golden settings table*/ 387int ConvertBackToInteger (fInt A) /*THIS is the function that will be used to check with the Golden settings table*/
389{ 388{
390 fInt fullNumber, scaledDecimal, scaledReal; 389 fInt fullNumber, scaledDecimal, scaledReal;
391 390
392 scaledReal.full = GetReal(A) * uPow(10, PRECISION-1); /* DOUBLE CHECK THISSSS!!! */ 391 scaledReal.full = GetReal(A) * uPow(10, PRECISION-1); /* DOUBLE CHECK THISSSS!!! */
393 392
394 scaledDecimal.full = uGetScaledDecimal(A); 393 scaledDecimal.full = uGetScaledDecimal(A);
395 394
396 fullNumber = fAdd(scaledDecimal,scaledReal); 395 fullNumber = fAdd(scaledDecimal,scaledReal);
397 396
398 return fullNumber.full; 397 return fullNumber.full;
399} 398}
400 399
401fInt fGetSquare(fInt A) 400fInt fGetSquare(fInt A)
402{ 401{
403 return fMultiply(A,A); 402 return fMultiply(A,A);
404} 403}
405 404
406/* x_new = x_old - (x_old^2 - C) / (2 * x_old) */ 405/* x_new = x_old - (x_old^2 - C) / (2 * x_old) */
407fInt fSqrt(fInt num) 406fInt fSqrt(fInt num)
408{ 407{
409 fInt F_divide_Fprime, Fprime; 408 fInt F_divide_Fprime, Fprime;
410 fInt test; 409 fInt test;
411 fInt twoShifted; 410 fInt twoShifted;
412 int seed, counter, error; 411 int seed, counter, error;
413 fInt x_new, x_old, C, y; 412 fInt x_new, x_old, C, y;
414 413
415 fInt fZERO = ConvertToFraction(0); 414 fInt fZERO = ConvertToFraction(0);
416 /* (0 > num) is the same as (num < 0), i.e., num is negative */
417 if (GreaterThan(fZERO, num) || Equal(fZERO, num))
418 return fZERO;
419 415
420 C = num; 416 /* (0 > num) is the same as (num < 0), i.e., num is negative */
421 417
422 if (num.partial.real > 3000) 418 if (GreaterThan(fZERO, num) || Equal(fZERO, num))
423 seed = 60; 419 return fZERO;
424 else if (num.partial.real > 1000)
425 seed = 30;
426 else if (num.partial.real > 100)
427 seed = 10;
428 else
429 seed = 2;
430 420
431 counter = 0; 421 C = num;
432 422
433 if (Equal(num, fZERO)) /*Square Root of Zero is zero */ 423 if (num.partial.real > 3000)
434 return fZERO; 424 seed = 60;
425 else if (num.partial.real > 1000)
426 seed = 30;
427 else if (num.partial.real > 100)
428 seed = 10;
429 else
430 seed = 2;
431
432 counter = 0;
435 433
436 twoShifted = ConvertToFraction(2); 434 if (Equal(num, fZERO)) /*Square Root of Zero is zero */
437 x_new = ConvertToFraction(seed); 435 return fZERO;
438 436
439 do { 437 twoShifted = ConvertToFraction(2);
440 counter++; 438 x_new = ConvertToFraction(seed);
441 439
442 x_old.full = x_new.full; 440 do {
441 counter++;
443 442
444 test = fGetSquare(x_old); /*1.75*1.75 is reverting back to 1 when shifted down */ 443 x_old.full = x_new.full;
445 y = fSubtract(test, C); /*y = f(x) = x^2 - C; */
446 444
447 Fprime = fMultiply(twoShifted, x_old); 445 test = fGetSquare(x_old); /*1.75*1.75 is reverting back to 1 when shifted down */
448 F_divide_Fprime = fDivide(y, Fprime); 446 y = fSubtract(test, C); /*y = f(x) = x^2 - C; */
449 447
450 x_new = fSubtract(x_old, F_divide_Fprime); 448 Fprime = fMultiply(twoShifted, x_old);
449 F_divide_Fprime = fDivide(y, Fprime);
451 450
452 error = ConvertBackToInteger(x_new) - ConvertBackToInteger(x_old); 451 x_new = fSubtract(x_old, F_divide_Fprime);
453 452
454 if (counter > 20) /*20 is already way too many iterations. If we dont have an answer by then, we never will*/ 453 error = ConvertBackToInteger(x_new) - ConvertBackToInteger(x_old);
455 return x_new;
456 454
457 } while (uAbs(error) > 0); 455 if (counter > 20) /*20 is already way too many iterations. If we dont have an answer by then, we never will*/
456 return x_new;
458 457
459 return (x_new); 458 } while (uAbs(error) > 0);
459
460 return (x_new);
460} 461}
461 462
462void SolveQuadracticEqn(fInt A, fInt B, fInt C, fInt Roots[]) 463void SolveQuadracticEqn(fInt A, fInt B, fInt C, fInt Roots[])
463{ 464{
464 fInt* pRoots = &Roots[0]; 465 fInt *pRoots = &Roots[0];
465 fInt temp, root_first, root_second; 466 fInt temp, root_first, root_second;
466 fInt f_CONSTANT10, f_CONSTANT100; 467 fInt f_CONSTANT10, f_CONSTANT100;
467 468
468 f_CONSTANT100 = ConvertToFraction(100); 469 f_CONSTANT100 = ConvertToFraction(100);
469 f_CONSTANT10 = ConvertToFraction(10); 470 f_CONSTANT10 = ConvertToFraction(10);
470 471
471 while(GreaterThan(A, f_CONSTANT100) || GreaterThan(B, f_CONSTANT100) || GreaterThan(C, f_CONSTANT100)) { 472 while(GreaterThan(A, f_CONSTANT100) || GreaterThan(B, f_CONSTANT100) || GreaterThan(C, f_CONSTANT100)) {
472 A = fDivide(A, f_CONSTANT10); 473 A = fDivide(A, f_CONSTANT10);
473 B = fDivide(B, f_CONSTANT10); 474 B = fDivide(B, f_CONSTANT10);
474 C = fDivide(C, f_CONSTANT10); 475 C = fDivide(C, f_CONSTANT10);
475 } 476 }
476 477
477 temp = fMultiply(ConvertToFraction(4), A); /* root = 4*A */ 478 temp = fMultiply(ConvertToFraction(4), A); /* root = 4*A */
478 temp = fMultiply(temp, C); /* root = 4*A*C */ 479 temp = fMultiply(temp, C); /* root = 4*A*C */
479 temp = fSubtract(fGetSquare(B), temp); /* root = b^2 - 4AC */ 480 temp = fSubtract(fGetSquare(B), temp); /* root = b^2 - 4AC */
480 temp = fSqrt(temp); /*root = Sqrt (b^2 - 4AC); */ 481 temp = fSqrt(temp); /*root = Sqrt (b^2 - 4AC); */
481 482
482 root_first = fSubtract(fNegate(B), temp); /* b - Sqrt(b^2 - 4AC) */ 483 root_first = fSubtract(fNegate(B), temp); /* b - Sqrt(b^2 - 4AC) */
483 root_second = fAdd(fNegate(B), temp); /* b + Sqrt(b^2 - 4AC) */ 484 root_second = fAdd(fNegate(B), temp); /* b + Sqrt(b^2 - 4AC) */
484 485
485 root_first = fDivide(root_first, ConvertToFraction(2)); /* [b +- Sqrt(b^2 - 4AC)]/[2] */ 486 root_first = fDivide(root_first, ConvertToFraction(2)); /* [b +- Sqrt(b^2 - 4AC)]/[2] */
486 root_first = fDivide(root_first, A); /*[b +- Sqrt(b^2 - 4AC)]/[2*A] */ 487 root_first = fDivide(root_first, A); /*[b +- Sqrt(b^2 - 4AC)]/[2*A] */
487 488
488 root_second = fDivide(root_second, ConvertToFraction(2)); /* [b +- Sqrt(b^2 - 4AC)]/[2] */ 489 root_second = fDivide(root_second, ConvertToFraction(2)); /* [b +- Sqrt(b^2 - 4AC)]/[2] */
489 root_second = fDivide(root_second, A); /*[b +- Sqrt(b^2 - 4AC)]/[2*A] */ 490 root_second = fDivide(root_second, A); /*[b +- Sqrt(b^2 - 4AC)]/[2*A] */
490 491
491 *(pRoots + 0) = root_first; 492 *(pRoots + 0) = root_first;
492 *(pRoots + 1) = root_second; 493 *(pRoots + 1) = root_second;
493} 494}
494 495
495/* ----------------------------------------------------------------------------- 496/* -----------------------------------------------------------------------------
@@ -500,61 +501,58 @@ void SolveQuadracticEqn(fInt A, fInt B, fInt C, fInt Roots[])
500/* Addition using two normal ints - Temporary - Use only for testing purposes?. */ 501/* Addition using two normal ints - Temporary - Use only for testing purposes?. */
501fInt Add (int X, int Y) 502fInt Add (int X, int Y)
502{ 503{
503 fInt A, B, Sum; 504 fInt A, B, Sum;
504 505
505 A.full = (X << SHIFT_AMOUNT); 506 A.full = (X << SHIFT_AMOUNT);
506 B.full = (Y << SHIFT_AMOUNT); 507 B.full = (Y << SHIFT_AMOUNT);
507 508
508 Sum.full = A.full + B.full; 509 Sum.full = A.full + B.full;
509 510
510 return Sum; 511 return Sum;
511} 512}
512 513
513/* Conversion Functions */ 514/* Conversion Functions */
514int GetReal (fInt A) 515int GetReal (fInt A)
515{ 516{
516 return (A.full >> SHIFT_AMOUNT); 517 return (A.full >> SHIFT_AMOUNT);
517} 518}
518 519
519/* Temporarily Disabled */ 520/* Temporarily Disabled */
520int GetRoundedValue(fInt A) /*For now, round the 3rd decimal place */ 521int GetRoundedValue(fInt A) /*For now, round the 3rd decimal place */
521{ 522{
522 /* ROUNDING TEMPORARLY DISABLED 523 /* ROUNDING TEMPORARLY DISABLED
523 int temp = A.full; 524 int temp = A.full;
524 525 int decimal_cutoff, decimal_mask = 0x000001FF;
525 int decimal_cutoff, decimal_mask = 0x000001FF; 526 decimal_cutoff = temp & decimal_mask;
526 527 if (decimal_cutoff > 0x147) {
527 decimal_cutoff = temp & decimal_mask; 528 temp += 673;
528 529 }*/
529 530
530 if (decimal_cutoff > 0x147) { 531 return ConvertBackToInteger(A)/10000; /*Temporary - in case this was used somewhere else */
531 temp += 673;
532 }*/
533
534 return ConvertBackToInteger(A)/10000; /*Temporary - in case this was used somewhere else */
535} 532}
536 533
537fInt Multiply (int X, int Y) 534fInt Multiply (int X, int Y)
538{ 535{
539 fInt A, B, Product; 536 fInt A, B, Product;
540 537
541 A.full = X << SHIFT_AMOUNT; 538 A.full = X << SHIFT_AMOUNT;
542 B.full = Y << SHIFT_AMOUNT; 539 B.full = Y << SHIFT_AMOUNT;
543 540
544 Product = fMultiply(A, B); 541 Product = fMultiply(A, B);
545 542
546 return Product; 543 return Product;
547} 544}
545
548fInt Divide (int X, int Y) 546fInt Divide (int X, int Y)
549{ 547{
550 fInt A, B, Quotient; 548 fInt A, B, Quotient;
551 549
552 A.full = X << SHIFT_AMOUNT; 550 A.full = X << SHIFT_AMOUNT;
553 B.full = Y << SHIFT_AMOUNT; 551 B.full = Y << SHIFT_AMOUNT;
554 552
555 Quotient = fDivide(A, B); 553 Quotient = fDivide(A, B);
556 554
557 return Quotient; 555 return Quotient;
558} 556}
559 557
560int uGetScaledDecimal (fInt A) /*Converts the fractional portion to whole integers - Costly function */ 558int uGetScaledDecimal (fInt A) /*Converts the fractional portion to whole integers - Costly function */
@@ -563,16 +561,13 @@ int uGetScaledDecimal (fInt A) /*Converts the fractional portion to whole intege
563 int i, scaledDecimal = 0, tmp = A.partial.decimal; 561 int i, scaledDecimal = 0, tmp = A.partial.decimal;
564 562
565 for (i = 0; i < PRECISION; i++) { 563 for (i = 0; i < PRECISION; i++) {
566 dec[i] = tmp / (1 << SHIFT_AMOUNT); 564 dec[i] = tmp / (1 << SHIFT_AMOUNT);
567 565 tmp = tmp - ((1 << SHIFT_AMOUNT)*dec[i]);
568 tmp = tmp - ((1 << SHIFT_AMOUNT)*dec[i]); 566 tmp *= 10;
569 567 scaledDecimal = scaledDecimal + dec[i]*uPow(10, PRECISION - 1 -i);
570 tmp *= 10; 568 }
571
572 scaledDecimal = scaledDecimal + dec[i]*uPow(10, PRECISION - 1 -i);
573 }
574 569
575 return scaledDecimal; 570 return scaledDecimal;
576} 571}
577 572
578int uPow(int base, int power) 573int uPow(int base, int power)
@@ -601,17 +596,17 @@ int uAbs(int X)
601 596
602fInt fRoundUpByStepSize(fInt A, fInt fStepSize, bool error_term) 597fInt fRoundUpByStepSize(fInt A, fInt fStepSize, bool error_term)
603{ 598{
604 fInt solution; 599 fInt solution;
605 600
606 solution = fDivide(A, fStepSize); 601 solution = fDivide(A, fStepSize);
607 solution.partial.decimal = 0; /*All fractional digits changes to 0 */ 602 solution.partial.decimal = 0; /*All fractional digits changes to 0 */
608 603
609 if (error_term) 604 if (error_term)
610 solution.partial.real += 1; /*Error term of 1 added */ 605 solution.partial.real += 1; /*Error term of 1 added */
611 606
612 solution = fMultiply(solution, fStepSize); 607 solution = fMultiply(solution, fStepSize);
613 solution = fAdd(solution, fStepSize); 608 solution = fAdd(solution, fStepSize);
614 609
615 return solution; 610 return solution;
616} 611}
617 612
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.c b/drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.c
index 1d385f473776..2f1a14fe05b1 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.c
@@ -735,8 +735,8 @@ static int init_non_clock_fields(struct pp_hwmgr *hwmgr,
735 735
736 ps->memory.dllOff = (0 != tmp); 736 ps->memory.dllOff = (0 != tmp);
737 737
738 ps->memory.m3arb = (uint8_t)(le32_to_cpu(pnon_clock_info->ulCapsAndSettings) & 738 ps->memory.m3arb = (le32_to_cpu(pnon_clock_info->ulCapsAndSettings) &
739 ATOM_PPLIB_M3ARB_MASK) >> ATOM_PPLIB_M3ARB_SHIFT; 739 ATOM_PPLIB_M3ARB_MASK) >> ATOM_PPLIB_M3ARB_SHIFT;
740 740
741 ps->temperatures.min = PP_TEMPERATURE_UNITS_PER_CENTIGRADES * 741 ps->temperatures.min = PP_TEMPERATURE_UNITS_PER_CENTIGRADES *
742 pnon_clock_info->ucMinTemperature; 742 pnon_clock_info->ucMinTemperature;
@@ -1322,11 +1322,17 @@ static int get_cac_leakage_table(struct pp_hwmgr *hwmgr,
1322 struct phm_cac_leakage_table *cac_leakage_table; 1322 struct phm_cac_leakage_table *cac_leakage_table;
1323 unsigned long table_size, i; 1323 unsigned long table_size, i;
1324 1324
1325 if (hwmgr == NULL || table == NULL || ptable == NULL)
1326 return -EINVAL;
1327
1325 table_size = sizeof(ULONG) + 1328 table_size = sizeof(ULONG) +
1326 (sizeof(struct phm_cac_leakage_table) * table->ucNumEntries); 1329 (sizeof(struct phm_cac_leakage_table) * table->ucNumEntries);
1327 1330
1328 cac_leakage_table = kzalloc(table_size, GFP_KERNEL); 1331 cac_leakage_table = kzalloc(table_size, GFP_KERNEL);
1329 1332
1333 if (cac_leakage_table == NULL)
1334 return -ENOMEM;
1335
1330 cac_leakage_table->count = (ULONG)table->ucNumEntries; 1336 cac_leakage_table->count = (ULONG)table->ucNumEntries;
1331 1337
1332 for (i = 0; i < cac_leakage_table->count; i++) { 1338 for (i = 0; i < cac_leakage_table->count; i++) {
@@ -1349,7 +1355,7 @@ static int get_cac_leakage_table(struct pp_hwmgr *hwmgr,
1349static int get_platform_power_management_table(struct pp_hwmgr *hwmgr, 1355static int get_platform_power_management_table(struct pp_hwmgr *hwmgr,
1350 ATOM_PPLIB_PPM_Table *atom_ppm_table) 1356 ATOM_PPLIB_PPM_Table *atom_ppm_table)
1351{ 1357{
1352 struct phm_ppm_table *ptr = kzalloc(sizeof(ATOM_PPLIB_PPM_Table), GFP_KERNEL); 1358 struct phm_ppm_table *ptr = kzalloc(sizeof(struct phm_ppm_table), GFP_KERNEL);
1353 1359
1354 if (NULL == ptr) 1360 if (NULL == ptr)
1355 return -ENOMEM; 1361 return -ENOMEM;
@@ -1466,6 +1472,9 @@ static int init_phase_shedding_table(struct pp_hwmgr *hwmgr,
1466 1472
1467 table = kzalloc(size, GFP_KERNEL); 1473 table = kzalloc(size, GFP_KERNEL);
1468 1474
1475 if (table == NULL)
1476 return -ENOMEM;
1477
1469 table->count = (unsigned long)ptable->ucNumEntries; 1478 table->count = (unsigned long)ptable->ucNumEntries;
1470 1479
1471 for (i = 0; i < table->count; i++) { 1480 for (i = 0; i < table->count; i++) {
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c
index 3cb5d041b3cf..44a925006479 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c
@@ -115,9 +115,12 @@ const unsigned long PhwTonga_Magic = (unsigned long)(PHM_VIslands_Magic);
115struct tonga_power_state *cast_phw_tonga_power_state( 115struct tonga_power_state *cast_phw_tonga_power_state(
116 struct pp_hw_power_state *hw_ps) 116 struct pp_hw_power_state *hw_ps)
117{ 117{
118 if (hw_ps == NULL)
119 return NULL;
120
118 PP_ASSERT_WITH_CODE((PhwTonga_Magic == hw_ps->magic), 121 PP_ASSERT_WITH_CODE((PhwTonga_Magic == hw_ps->magic),
119 "Invalid Powerstate Type!", 122 "Invalid Powerstate Type!",
120 return NULL;); 123 return NULL);
121 124
122 return (struct tonga_power_state *)hw_ps; 125 return (struct tonga_power_state *)hw_ps;
123} 126}
@@ -125,9 +128,12 @@ struct tonga_power_state *cast_phw_tonga_power_state(
125const struct tonga_power_state *cast_const_phw_tonga_power_state( 128const struct tonga_power_state *cast_const_phw_tonga_power_state(
126 const struct pp_hw_power_state *hw_ps) 129 const struct pp_hw_power_state *hw_ps)
127{ 130{
131 if (hw_ps == NULL)
132 return NULL;
133
128 PP_ASSERT_WITH_CODE((PhwTonga_Magic == hw_ps->magic), 134 PP_ASSERT_WITH_CODE((PhwTonga_Magic == hw_ps->magic),
129 "Invalid Powerstate Type!", 135 "Invalid Powerstate Type!",
130 return NULL;); 136 return NULL);
131 137
132 return (const struct tonga_power_state *)hw_ps; 138 return (const struct tonga_power_state *)hw_ps;
133} 139}
@@ -1678,9 +1684,9 @@ static int tonga_populate_smc_uvd_level(struct pp_hwmgr *hwmgr,
1678 CONVERT_FROM_HOST_TO_SMC_UL(table->UvdLevel[count].VclkFrequency); 1684 CONVERT_FROM_HOST_TO_SMC_UL(table->UvdLevel[count].VclkFrequency);
1679 CONVERT_FROM_HOST_TO_SMC_UL(table->UvdLevel[count].DclkFrequency); 1685 CONVERT_FROM_HOST_TO_SMC_UL(table->UvdLevel[count].DclkFrequency);
1680 //CONVERT_FROM_HOST_TO_SMC_UL((uint32_t)table->UvdLevel[count].MinVoltage); 1686 //CONVERT_FROM_HOST_TO_SMC_UL((uint32_t)table->UvdLevel[count].MinVoltage);
1681 } 1687 }
1682 1688
1683 return result; 1689 return result;
1684 1690
1685} 1691}
1686 1692
@@ -1719,7 +1725,7 @@ static int tonga_populate_smc_vce_level(struct pp_hwmgr *hwmgr,
1719 PP_ASSERT_WITH_CODE((0 == result), 1725 PP_ASSERT_WITH_CODE((0 == result),
1720 "can not find divide id for VCE engine clock", return result); 1726 "can not find divide id for VCE engine clock", return result);
1721 1727
1722 table->VceLevel[count].Divider = (uint8_t)dividers.pll_post_divider; 1728 table->VceLevel[count].Divider = (uint8_t)dividers.pll_post_divider;
1723 1729
1724 CONVERT_FROM_HOST_TO_SMC_UL(table->VceLevel[count].Frequency); 1730 CONVERT_FROM_HOST_TO_SMC_UL(table->VceLevel[count].Frequency);
1725 } 1731 }
@@ -1804,7 +1810,7 @@ static int tonga_populate_smc_samu_level(struct pp_hwmgr *hwmgr,
1804 PP_ASSERT_WITH_CODE((0 == result), 1810 PP_ASSERT_WITH_CODE((0 == result),
1805 "can not find divide id for samu clock", return result); 1811 "can not find divide id for samu clock", return result);
1806 1812
1807 table->SamuLevel[count].Divider = (uint8_t)dividers.pll_post_divider; 1813 table->SamuLevel[count].Divider = (uint8_t)dividers.pll_post_divider;
1808 1814
1809 CONVERT_FROM_HOST_TO_SMC_UL(table->SamuLevel[count].Frequency); 1815 CONVERT_FROM_HOST_TO_SMC_UL(table->SamuLevel[count].Frequency);
1810 } 1816 }
@@ -1847,7 +1853,7 @@ static int tonga_calculate_mclk_params(
1847 "Error retrieving Memory Clock Parameters from VBIOS.", return result); 1853 "Error retrieving Memory Clock Parameters from VBIOS.", return result);
1848 1854
1849 /* MPLL_FUNC_CNTL setup*/ 1855 /* MPLL_FUNC_CNTL setup*/
1850 mpll_func_cntl = PHM_SET_FIELD(mpll_func_cntl, MPLL_FUNC_CNTL, BWCTRL, mpll_param.bw_ctrl); 1856 mpll_func_cntl = PHM_SET_FIELD(mpll_func_cntl, MPLL_FUNC_CNTL, BWCTRL, mpll_param.bw_ctrl);
1851 1857
1852 /* MPLL_FUNC_CNTL_1 setup*/ 1858 /* MPLL_FUNC_CNTL_1 setup*/
1853 mpll_func_cntl_1 = PHM_SET_FIELD(mpll_func_cntl_1, 1859 mpll_func_cntl_1 = PHM_SET_FIELD(mpll_func_cntl_1,
@@ -3864,6 +3870,7 @@ int tonga_copy_vbios_smc_reg_table(const pp_atomctrl_mc_reg_table *table, phw_to
3864 table->mc_reg_table_entry[i].mc_data[j]; 3870 table->mc_reg_table_entry[i].mc_data[j];
3865 } 3871 }
3866 } 3872 }
3873
3867 ni_table->num_entries = table->num_entries; 3874 ni_table->num_entries = table->num_entries;
3868 3875
3869 return 0; 3876 return 0;
@@ -3989,7 +3996,7 @@ int tonga_initialize_mc_reg_table(struct pp_hwmgr *hwmgr)
3989 table = kzalloc(sizeof(pp_atomctrl_mc_reg_table), GFP_KERNEL); 3996 table = kzalloc(sizeof(pp_atomctrl_mc_reg_table), GFP_KERNEL);
3990 3997
3991 if (NULL == table) 3998 if (NULL == table)
3992 return -1; 3999 return -ENOMEM;
3993 4000
3994 /* Program additional LP registers that are no longer programmed by VBIOS */ 4001 /* Program additional LP registers that are no longer programmed by VBIOS */
3995 cgs_write_register(hwmgr->device, mmMC_SEQ_RAS_TIMING_LP, cgs_read_register(hwmgr->device, mmMC_SEQ_RAS_TIMING)); 4002 cgs_write_register(hwmgr->device, mmMC_SEQ_RAS_TIMING_LP, cgs_read_register(hwmgr->device, mmMC_SEQ_RAS_TIMING));
@@ -5150,7 +5157,7 @@ static int tonga_get_pp_table_entry(struct pp_hwmgr *hwmgr,
5150static void 5157static void
5151tonga_print_current_perforce_level(struct pp_hwmgr *hwmgr, struct seq_file *m) 5158tonga_print_current_perforce_level(struct pp_hwmgr *hwmgr, struct seq_file *m)
5152{ 5159{
5153 uint32_t sclk, mclk, active_percent; 5160 uint32_t sclk, mclk, activity_percent;
5154 uint32_t offset; 5161 uint32_t offset;
5155 struct tonga_hwmgr *data = (struct tonga_hwmgr *)(hwmgr->backend); 5162 struct tonga_hwmgr *data = (struct tonga_hwmgr *)(hwmgr->backend);
5156 5163
@@ -5165,11 +5172,11 @@ tonga_print_current_perforce_level(struct pp_hwmgr *hwmgr, struct seq_file *m)
5165 5172
5166 5173
5167 offset = data->soft_regs_start + offsetof(SMU72_SoftRegisters, AverageGraphicsActivity); 5174 offset = data->soft_regs_start + offsetof(SMU72_SoftRegisters, AverageGraphicsActivity);
5168 active_percent = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, offset); 5175 activity_percent = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, offset);
5169 active_percent += 80; 5176 activity_percent += 0x80;
5170 active_percent >>= 8; 5177 activity_percent >>= 8;
5171 5178
5172 seq_printf(m, "\n [GPU load]: %u%%\n\n", active_percent > 100 ? 100 : active_percent); 5179 seq_printf(m, "\n [GPU load]: %u%%\n\n", activity_percent > 100 ? 100 : activity_percent);
5173 5180
5174} 5181}
5175 5182
@@ -5470,7 +5477,6 @@ static int tonga_generate_dpm_level_enable_mask(struct pp_hwmgr *hwmgr, const vo
5470 struct tonga_hwmgr *data = (struct tonga_hwmgr *)(hwmgr->backend); 5477 struct tonga_hwmgr *data = (struct tonga_hwmgr *)(hwmgr->backend);
5471 const struct tonga_power_state *tonga_ps = cast_const_phw_tonga_power_state(states->pnew_state); 5478 const struct tonga_power_state *tonga_ps = cast_const_phw_tonga_power_state(states->pnew_state);
5472 5479
5473
5474 result = tonga_trim_dpm_states(hwmgr, tonga_ps); 5480 result = tonga_trim_dpm_states(hwmgr, tonga_ps);
5475 if (0 != result) 5481 if (0 != result)
5476 return result; 5482 return result;
@@ -5732,7 +5738,7 @@ static int tonga_set_max_fan_pwm_output(struct pp_hwmgr *hwmgr, uint16_t us_max_
5732 if (phm_is_hw_access_blocked(hwmgr)) 5738 if (phm_is_hw_access_blocked(hwmgr))
5733 return 0; 5739 return 0;
5734 5740
5735 return (0 == smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_SetFanPwmMax, us_max_fan_pwm) ? 0 : -EINVAL); 5741 return (0 == smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_SetFanPwmMax, us_max_fan_pwm) ? 0 : -1);
5736} 5742}
5737 5743
5738int tonga_notify_smc_display_config_after_ps_adjustment(struct pp_hwmgr *hwmgr) 5744int tonga_notify_smc_display_config_after_ps_adjustment(struct pp_hwmgr *hwmgr)
@@ -5826,7 +5832,7 @@ static int tonga_set_max_fan_rpm_output(struct pp_hwmgr *hwmgr, uint16_t us_max_
5826 if (phm_is_hw_access_blocked(hwmgr)) 5832 if (phm_is_hw_access_blocked(hwmgr))
5827 return 0; 5833 return 0;
5828 5834
5829 return (0 == smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_SetFanRpmMax, us_max_fan_pwm) ? 0 : -EINVAL); 5835 return (0 == smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_SetFanRpmMax, us_max_fan_pwm) ? 0 : -1);
5830} 5836}
5831 5837
5832uint32_t tonga_get_xclk(struct pp_hwmgr *hwmgr) 5838uint32_t tonga_get_xclk(struct pp_hwmgr *hwmgr)
@@ -5962,7 +5968,7 @@ int tonga_check_states_equal(struct pp_hwmgr *hwmgr, const struct pp_hw_power_st
5962 const struct tonga_power_state *psb = cast_const_phw_tonga_power_state(pstate2); 5968 const struct tonga_power_state *psb = cast_const_phw_tonga_power_state(pstate2);
5963 int i; 5969 int i;
5964 5970
5965 if (pstate1 == NULL || pstate2 == NULL || equal == NULL) 5971 if (equal == NULL || psa == NULL || psb == NULL)
5966 return -EINVAL; 5972 return -EINVAL;
5967 5973
5968 /* If the two states don't even have the same number of performance levels they cannot be the same state. */ 5974 /* If the two states don't even have the same number of performance levels they cannot be the same state. */
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c
index ae216fe8547d..34f4bef3691f 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c
@@ -168,7 +168,7 @@ static int get_vddc_lookup_table(
168 kzalloc(table_size, GFP_KERNEL); 168 kzalloc(table_size, GFP_KERNEL);
169 169
170 if (NULL == table) 170 if (NULL == table)
171 return -1; 171 return -ENOMEM;
172 172
173 memset(table, 0x00, table_size); 173 memset(table, 0x00, table_size);
174 174
@@ -206,7 +206,7 @@ static int get_platform_power_management_table(
206 (struct phm_ppt_v1_information *)(hwmgr->pptable); 206 (struct phm_ppt_v1_information *)(hwmgr->pptable);
207 207
208 if (NULL == ptr) 208 if (NULL == ptr)
209 return -1; 209 return -ENOMEM;
210 210
211 ptr->ppm_design 211 ptr->ppm_design
212 = atom_ppm_table->ucPpmDesign; 212 = atom_ppm_table->ucPpmDesign;
@@ -327,7 +327,7 @@ static int get_valid_clk(
327 table = (struct phm_clock_array *)kzalloc(table_size, GFP_KERNEL); 327 table = (struct phm_clock_array *)kzalloc(table_size, GFP_KERNEL);
328 328
329 if (NULL == table) 329 if (NULL == table)
330 return -1; 330 return -ENOMEM;
331 331
332 memset(table, 0x00, table_size); 332 memset(table, 0x00, table_size);
333 333
@@ -378,7 +378,7 @@ static int get_mclk_voltage_dependency_table(
378 kzalloc(table_size, GFP_KERNEL); 378 kzalloc(table_size, GFP_KERNEL);
379 379
380 if (NULL == mclk_table) 380 if (NULL == mclk_table)
381 return -1; 381 return -ENOMEM;
382 382
383 memset(mclk_table, 0x00, table_size); 383 memset(mclk_table, 0x00, table_size);
384 384
@@ -421,7 +421,7 @@ static int get_sclk_voltage_dependency_table(
421 kzalloc(table_size, GFP_KERNEL); 421 kzalloc(table_size, GFP_KERNEL);
422 422
423 if (NULL == sclk_table) 423 if (NULL == sclk_table)
424 return -1; 424 return -ENOMEM;
425 425
426 memset(sclk_table, 0x00, table_size); 426 memset(sclk_table, 0x00, table_size);
427 427
@@ -464,7 +464,7 @@ static int get_pcie_table(
464 pcie_table = (phm_ppt_v1_pcie_table *)kzalloc(table_size, GFP_KERNEL); 464 pcie_table = (phm_ppt_v1_pcie_table *)kzalloc(table_size, GFP_KERNEL);
465 465
466 if (NULL == pcie_table) 466 if (NULL == pcie_table)
467 return -1; 467 return -ENOMEM;
468 468
469 memset(pcie_table, 0x00, table_size); 469 memset(pcie_table, 0x00, table_size);
470 470
@@ -506,14 +506,14 @@ static int get_cac_tdp_table(
506 tdp_table = kzalloc(table_size, GFP_KERNEL); 506 tdp_table = kzalloc(table_size, GFP_KERNEL);
507 507
508 if (NULL == tdp_table) 508 if (NULL == tdp_table)
509 return -1; 509 return -ENOMEM;
510 510
511 memset(tdp_table, 0x00, table_size); 511 memset(tdp_table, 0x00, table_size);
512 512
513 hwmgr->dyn_state.cac_dtp_table = kzalloc(table_size, GFP_KERNEL); 513 hwmgr->dyn_state.cac_dtp_table = kzalloc(table_size, GFP_KERNEL);
514 514
515 if (NULL == hwmgr->dyn_state.cac_dtp_table) 515 if (NULL == hwmgr->dyn_state.cac_dtp_table)
516 return -1; 516 return -ENOMEM;
517 517
518 memset(hwmgr->dyn_state.cac_dtp_table, 0x00, table_size); 518 memset(hwmgr->dyn_state.cac_dtp_table, 0x00, table_size);
519 519
@@ -614,7 +614,7 @@ static int get_mm_clock_voltage_table(
614 kzalloc(table_size, GFP_KERNEL); 614 kzalloc(table_size, GFP_KERNEL);
615 615
616 if (NULL == mm_table) 616 if (NULL == mm_table)
617 return -1; 617 return -ENOMEM;
618 618
619 memset(mm_table, 0x00, table_size); 619 memset(mm_table, 0x00, table_size);
620 620
@@ -943,7 +943,7 @@ int tonga_pp_tables_initialize(struct pp_hwmgr *hwmgr)
943 hwmgr->pptable = kzalloc(sizeof(struct phm_ppt_v1_information), GFP_KERNEL); 943 hwmgr->pptable = kzalloc(sizeof(struct phm_ppt_v1_information), GFP_KERNEL);
944 944
945 PP_ASSERT_WITH_CODE((NULL != hwmgr->pptable), 945 PP_ASSERT_WITH_CODE((NULL != hwmgr->pptable),
946 "Failed to allocate hwmgr->pptable!", return -1); 946 "Failed to allocate hwmgr->pptable!", return -ENOMEM);
947 947
948 memset(hwmgr->pptable, 0x00, sizeof(struct phm_ppt_v1_information)); 948 memset(hwmgr->pptable, 0x00, sizeof(struct phm_ppt_v1_information));
949 949
diff --git a/drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h b/drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h
index a503306c3d0e..91795efe1336 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h
@@ -379,5 +379,7 @@ extern int phm_get_dal_power_level(struct pp_hwmgr *hwmgr,
379 379
380extern int phm_set_cpu_power_state(struct pp_hwmgr *hwmgr); 380extern int phm_set_cpu_power_state(struct pp_hwmgr *hwmgr);
381 381
382extern int phm_power_down_asic(struct pp_hwmgr *hwmgr);
383
382#endif /* _HARDWARE_MANAGER_H_ */ 384#endif /* _HARDWARE_MANAGER_H_ */
383 385
diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
index eb0f1b22d42d..aeaa3dbba525 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
@@ -325,7 +325,8 @@ struct pp_hwmgr_func {
325 bool cc6_disable, bool pstate_disable, 325 bool cc6_disable, bool pstate_disable,
326 bool pstate_switch_disable); 326 bool pstate_switch_disable);
327 int (*get_dal_power_level)(struct pp_hwmgr *hwmgr, 327 int (*get_dal_power_level)(struct pp_hwmgr *hwmgr,
328 struct amd_pp_dal_clock_info*info); 328 struct amd_pp_dal_clock_info *info);
329 int (*power_off_asic)(struct pp_hwmgr *hwmgr);
329}; 330};
330 331
331struct pp_table_func { 332struct pp_table_func {
@@ -576,9 +577,10 @@ struct pp_hwmgr {
576 void *pptable; 577 void *pptable;
577 struct phm_platform_descriptor platform_descriptor; 578 struct phm_platform_descriptor platform_descriptor;
578 void *backend; 579 void *backend;
579 enum PP_DAL_POWERLEVEL dal_power_level; 580 enum PP_DAL_POWERLEVEL dal_power_level;
580 struct phm_dynamic_state_info dyn_state; 581 struct phm_dynamic_state_info dyn_state;
581 struct phm_runtime_table_header setup_asic; 582 struct phm_runtime_table_header setup_asic;
583 struct phm_runtime_table_header power_down_asic;
582 struct phm_runtime_table_header disable_dynamic_state_management; 584 struct phm_runtime_table_header disable_dynamic_state_management;
583 struct phm_runtime_table_header enable_dynamic_state_management; 585 struct phm_runtime_table_header enable_dynamic_state_management;
584 struct phm_runtime_table_header set_power_state; 586 struct phm_runtime_table_header set_power_state;
diff --git a/drivers/gpu/drm/amd/powerplay/inc/pp_instance.h b/drivers/gpu/drm/amd/powerplay/inc/pp_instance.h
index 7b60b617dff6..4d8ed1f33de4 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/pp_instance.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/pp_instance.h
@@ -27,7 +27,10 @@
27#include "hwmgr.h" 27#include "hwmgr.h"
28#include "eventmgr.h" 28#include "eventmgr.h"
29 29
30#define PP_VALID 0x1F1F1F1F
31
30struct pp_instance { 32struct pp_instance {
33 uint32_t pp_valid;
31 struct pp_smumgr *smu_mgr; 34 struct pp_smumgr *smu_mgr;
32 struct pp_hwmgr *hwmgr; 35 struct pp_hwmgr *hwmgr;
33 struct pp_eventmgr *eventmgr; 36 struct pp_eventmgr *eventmgr;
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c
index e74023bd4e0d..873a8d264d5c 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c
@@ -818,7 +818,7 @@ static int cz_smu_fini(struct pp_smumgr *smumgr)
818 return -EINVAL; 818 return -EINVAL;
819 819
820 cz_smu = (struct cz_smumgr *)smumgr->backend; 820 cz_smu = (struct cz_smumgr *)smumgr->backend;
821 if (!cz_smu) { 821 if (cz_smu) {
822 cgs_free_gpu_mem(smumgr->device, 822 cgs_free_gpu_mem(smumgr->device,
823 cz_smu->toc_buffer.handle); 823 cz_smu->toc_buffer.handle);
824 cgs_free_gpu_mem(smumgr->device, 824 cgs_free_gpu_mem(smumgr->device,
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
index 45997e609fd6..cdbb9f89bf36 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
@@ -228,9 +228,9 @@ int fiji_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg)
228 } 228 }
229 229
230 cgs_write_register(smumgr->device, mmSMC_MESSAGE_0, msg); 230 cgs_write_register(smumgr->device, mmSMC_MESSAGE_0, msg);
231 SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0); 231 SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0);
232 232
233 return 0; 233 return 0;
234} 234}
235 235
236/** 236/**
@@ -557,7 +557,7 @@ static int fiji_request_smu_specific_fw_load(struct pp_smumgr *smumgr, uint32_t
557 /* For non-virtualization cases, 557 /* For non-virtualization cases,
558 * SMU loads all FWs at once in fiji_request_smu_load_fw. 558 * SMU loads all FWs at once in fiji_request_smu_load_fw.
559 */ 559 */
560 return 0; 560 return 0;
561} 561}
562 562
563static int fiji_start_smu_in_protection_mode(struct pp_smumgr *smumgr) 563static int fiji_start_smu_in_protection_mode(struct pp_smumgr *smumgr)
@@ -723,7 +723,7 @@ static int fiji_start_avfs_btc(struct pp_smumgr *smumgr)
723 /* clear reset */ 723 /* clear reset */
724 cgs_write_register(smumgr->device, mmGRBM_SOFT_RESET, 0); 724 cgs_write_register(smumgr->device, mmGRBM_SOFT_RESET, 0);
725 725
726 return result; 726 return result;
727} 727}
728 728
729int fiji_setup_pm_fuse_for_avfs(struct pp_smumgr *smumgr) 729int fiji_setup_pm_fuse_for_avfs(struct pp_smumgr *smumgr)
@@ -1033,7 +1033,7 @@ int fiji_smum_init(struct pp_smumgr *smumgr)
1033 fiji_smu = kzalloc(sizeof(struct fiji_smumgr), GFP_KERNEL); 1033 fiji_smu = kzalloc(sizeof(struct fiji_smumgr), GFP_KERNEL);
1034 1034
1035 if (fiji_smu == NULL) 1035 if (fiji_smu == NULL)
1036 return -1; 1036 return -ENOMEM;
1037 1037
1038 smumgr->backend = fiji_smu; 1038 smumgr->backend = fiji_smu;
1039 smumgr->smumgr_funcs = &fiji_smu_funcs; 1039 smumgr->smumgr_funcs = &fiji_smu_funcs;
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c
index 62ff76010aa6..d166fd925dbb 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c
@@ -810,7 +810,7 @@ int tonga_smum_init(struct pp_smumgr *smumgr)
810 tonga_smu = kzalloc(sizeof(struct tonga_smumgr), GFP_KERNEL); 810 tonga_smu = kzalloc(sizeof(struct tonga_smumgr), GFP_KERNEL);
811 811
812 if (tonga_smu == NULL) 812 if (tonga_smu == NULL)
813 return -1; 813 return -ENOMEM;
814 814
815 smumgr->backend = tonga_smu; 815 smumgr->backend = tonga_smu;
816 smumgr->smumgr_funcs = &tonga_smu_funcs; 816 smumgr->smumgr_funcs = &tonga_smu_funcs;
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
index c5a942b15d63..6ed90a2437e5 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -978,17 +978,17 @@ static struct drm_dp_mst_port *drm_dp_get_port(struct drm_dp_mst_branch *mstb, u
978static u8 drm_dp_calculate_rad(struct drm_dp_mst_port *port, 978static u8 drm_dp_calculate_rad(struct drm_dp_mst_port *port,
979 u8 *rad) 979 u8 *rad)
980{ 980{
981 int lct = port->parent->lct; 981 int parent_lct = port->parent->lct;
982 int shift = 4; 982 int shift = 4;
983 int idx = lct / 2; 983 int idx = (parent_lct - 1) / 2;
984 if (lct > 1) { 984 if (parent_lct > 1) {
985 memcpy(rad, port->parent->rad, idx); 985 memcpy(rad, port->parent->rad, idx + 1);
986 shift = (lct % 2) ? 4 : 0; 986 shift = (parent_lct % 2) ? 4 : 0;
987 } else 987 } else
988 rad[0] = 0; 988 rad[0] = 0;
989 989
990 rad[idx] |= port->port_num << shift; 990 rad[idx] |= port->port_num << shift;
991 return lct + 1; 991 return parent_lct + 1;
992} 992}
993 993
994/* 994/*
@@ -1044,7 +1044,7 @@ static void build_mst_prop_path(const struct drm_dp_mst_branch *mstb,
1044 snprintf(proppath, proppath_size, "mst:%d", mstb->mgr->conn_base_id); 1044 snprintf(proppath, proppath_size, "mst:%d", mstb->mgr->conn_base_id);
1045 for (i = 0; i < (mstb->lct - 1); i++) { 1045 for (i = 0; i < (mstb->lct - 1); i++) {
1046 int shift = (i % 2) ? 0 : 4; 1046 int shift = (i % 2) ? 0 : 4;
1047 int port_num = mstb->rad[i / 2] >> shift; 1047 int port_num = (mstb->rad[i / 2] >> shift) & 0xf;
1048 snprintf(temp, sizeof(temp), "-%d", port_num); 1048 snprintf(temp, sizeof(temp), "-%d", port_num);
1049 strlcat(proppath, temp, proppath_size); 1049 strlcat(proppath, temp, proppath_size);
1050 } 1050 }
@@ -1195,7 +1195,7 @@ static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device(struct drm_dp_mst_
1195 1195
1196 for (i = 0; i < lct - 1; i++) { 1196 for (i = 0; i < lct - 1; i++) {
1197 int shift = (i % 2) ? 0 : 4; 1197 int shift = (i % 2) ? 0 : 4;
1198 int port_num = rad[i / 2] >> shift; 1198 int port_num = (rad[i / 2] >> shift) & 0xf;
1199 1199
1200 list_for_each_entry(port, &mstb->ports, next) { 1200 list_for_each_entry(port, &mstb->ports, next) {
1201 if (port->port_num == port_num) { 1201 if (port->port_num == port_num) {
@@ -1215,6 +1215,50 @@ out:
1215 return mstb; 1215 return mstb;
1216} 1216}
1217 1217
1218static struct drm_dp_mst_branch *get_mst_branch_device_by_guid_helper(
1219 struct drm_dp_mst_branch *mstb,
1220 uint8_t *guid)
1221{
1222 struct drm_dp_mst_branch *found_mstb;
1223 struct drm_dp_mst_port *port;
1224
1225 list_for_each_entry(port, &mstb->ports, next) {
1226 if (!port->mstb)
1227 continue;
1228
1229 if (port->guid_valid && memcmp(port->guid, guid, 16) == 0)
1230 return port->mstb;
1231
1232 found_mstb = get_mst_branch_device_by_guid_helper(port->mstb, guid);
1233
1234 if (found_mstb)
1235 return found_mstb;
1236 }
1237
1238 return NULL;
1239}
1240
1241static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device_by_guid(
1242 struct drm_dp_mst_topology_mgr *mgr,
1243 uint8_t *guid)
1244{
1245 struct drm_dp_mst_branch *mstb;
1246
1247 /* find the port by iterating down */
1248 mutex_lock(&mgr->lock);
1249
1250 if (mgr->guid_valid && memcmp(mgr->guid, guid, 16) == 0)
1251 mstb = mgr->mst_primary;
1252 else
1253 mstb = get_mst_branch_device_by_guid_helper(mgr->mst_primary, guid);
1254
1255 if (mstb)
1256 kref_get(&mstb->kref);
1257
1258 mutex_unlock(&mgr->lock);
1259 return mstb;
1260}
1261
1218static void drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *mgr, 1262static void drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *mgr,
1219 struct drm_dp_mst_branch *mstb) 1263 struct drm_dp_mst_branch *mstb)
1220{ 1264{
@@ -1325,6 +1369,7 @@ static int set_hdr_from_dst_qlock(struct drm_dp_sideband_msg_hdr *hdr,
1325 struct drm_dp_sideband_msg_tx *txmsg) 1369 struct drm_dp_sideband_msg_tx *txmsg)
1326{ 1370{
1327 struct drm_dp_mst_branch *mstb = txmsg->dst; 1371 struct drm_dp_mst_branch *mstb = txmsg->dst;
1372 u8 req_type;
1328 1373
1329 /* both msg slots are full */ 1374 /* both msg slots are full */
1330 if (txmsg->seqno == -1) { 1375 if (txmsg->seqno == -1) {
@@ -1341,7 +1386,13 @@ static int set_hdr_from_dst_qlock(struct drm_dp_sideband_msg_hdr *hdr,
1341 txmsg->seqno = 1; 1386 txmsg->seqno = 1;
1342 mstb->tx_slots[txmsg->seqno] = txmsg; 1387 mstb->tx_slots[txmsg->seqno] = txmsg;
1343 } 1388 }
1344 hdr->broadcast = 0; 1389
1390 req_type = txmsg->msg[0] & 0x7f;
1391 if (req_type == DP_CONNECTION_STATUS_NOTIFY ||
1392 req_type == DP_RESOURCE_STATUS_NOTIFY)
1393 hdr->broadcast = 1;
1394 else
1395 hdr->broadcast = 0;
1345 hdr->path_msg = txmsg->path_msg; 1396 hdr->path_msg = txmsg->path_msg;
1346 hdr->lct = mstb->lct; 1397 hdr->lct = mstb->lct;
1347 hdr->lcr = mstb->lct - 1; 1398 hdr->lcr = mstb->lct - 1;
@@ -1443,26 +1494,18 @@ static void process_single_down_tx_qlock(struct drm_dp_mst_topology_mgr *mgr)
1443} 1494}
1444 1495
1445/* called holding qlock */ 1496/* called holding qlock */
1446static void process_single_up_tx_qlock(struct drm_dp_mst_topology_mgr *mgr) 1497static void process_single_up_tx_qlock(struct drm_dp_mst_topology_mgr *mgr,
1498 struct drm_dp_sideband_msg_tx *txmsg)
1447{ 1499{
1448 struct drm_dp_sideband_msg_tx *txmsg;
1449 int ret; 1500 int ret;
1450 1501
1451 /* construct a chunk from the first msg in the tx_msg queue */ 1502 /* construct a chunk from the first msg in the tx_msg queue */
1452 if (list_empty(&mgr->tx_msg_upq)) {
1453 mgr->tx_up_in_progress = false;
1454 return;
1455 }
1456
1457 txmsg = list_first_entry(&mgr->tx_msg_upq, struct drm_dp_sideband_msg_tx, next);
1458 ret = process_single_tx_qlock(mgr, txmsg, true); 1503 ret = process_single_tx_qlock(mgr, txmsg, true);
1459 if (ret == 1) { 1504
1460 /* up txmsgs aren't put in slots - so free after we send it */ 1505 if (ret != 1)
1461 list_del(&txmsg->next);
1462 kfree(txmsg);
1463 } else if (ret)
1464 DRM_DEBUG_KMS("failed to send msg in q %d\n", ret); 1506 DRM_DEBUG_KMS("failed to send msg in q %d\n", ret);
1465 mgr->tx_up_in_progress = true; 1507
1508 txmsg->dst->tx_slots[txmsg->seqno] = NULL;
1466} 1509}
1467 1510
1468static void drm_dp_queue_down_tx(struct drm_dp_mst_topology_mgr *mgr, 1511static void drm_dp_queue_down_tx(struct drm_dp_mst_topology_mgr *mgr,
@@ -1856,11 +1899,12 @@ static int drm_dp_send_up_ack_reply(struct drm_dp_mst_topology_mgr *mgr,
1856 drm_dp_encode_up_ack_reply(txmsg, req_type); 1899 drm_dp_encode_up_ack_reply(txmsg, req_type);
1857 1900
1858 mutex_lock(&mgr->qlock); 1901 mutex_lock(&mgr->qlock);
1859 list_add_tail(&txmsg->next, &mgr->tx_msg_upq); 1902
1860 if (!mgr->tx_up_in_progress) { 1903 process_single_up_tx_qlock(mgr, txmsg);
1861 process_single_up_tx_qlock(mgr); 1904
1862 }
1863 mutex_unlock(&mgr->qlock); 1905 mutex_unlock(&mgr->qlock);
1906
1907 kfree(txmsg);
1864 return 0; 1908 return 0;
1865} 1909}
1866 1910
@@ -2157,28 +2201,50 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr)
2157 2201
2158 if (mgr->up_req_recv.have_eomt) { 2202 if (mgr->up_req_recv.have_eomt) {
2159 struct drm_dp_sideband_msg_req_body msg; 2203 struct drm_dp_sideband_msg_req_body msg;
2160 struct drm_dp_mst_branch *mstb; 2204 struct drm_dp_mst_branch *mstb = NULL;
2161 bool seqno; 2205 bool seqno;
2162 mstb = drm_dp_get_mst_branch_device(mgr, 2206
2163 mgr->up_req_recv.initial_hdr.lct, 2207 if (!mgr->up_req_recv.initial_hdr.broadcast) {
2164 mgr->up_req_recv.initial_hdr.rad); 2208 mstb = drm_dp_get_mst_branch_device(mgr,
2165 if (!mstb) { 2209 mgr->up_req_recv.initial_hdr.lct,
2166 DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct); 2210 mgr->up_req_recv.initial_hdr.rad);
2167 memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); 2211 if (!mstb) {
2168 return 0; 2212 DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct);
2213 memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx));
2214 return 0;
2215 }
2169 } 2216 }
2170 2217
2171 seqno = mgr->up_req_recv.initial_hdr.seqno; 2218 seqno = mgr->up_req_recv.initial_hdr.seqno;
2172 drm_dp_sideband_parse_req(&mgr->up_req_recv, &msg); 2219 drm_dp_sideband_parse_req(&mgr->up_req_recv, &msg);
2173 2220
2174 if (msg.req_type == DP_CONNECTION_STATUS_NOTIFY) { 2221 if (msg.req_type == DP_CONNECTION_STATUS_NOTIFY) {
2175 drm_dp_send_up_ack_reply(mgr, mstb, msg.req_type, seqno, false); 2222 drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false);
2223
2224 if (!mstb)
2225 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.conn_stat.guid);
2226
2227 if (!mstb) {
2228 DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct);
2229 memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx));
2230 return 0;
2231 }
2232
2176 drm_dp_update_port(mstb, &msg.u.conn_stat); 2233 drm_dp_update_port(mstb, &msg.u.conn_stat);
2177 DRM_DEBUG_KMS("Got CSN: pn: %d ldps:%d ddps: %d mcs: %d ip: %d pdt: %d\n", msg.u.conn_stat.port_number, msg.u.conn_stat.legacy_device_plug_status, msg.u.conn_stat.displayport_device_plug_status, msg.u.conn_stat.message_capability_status, msg.u.conn_stat.input_port, msg.u.conn_stat.peer_device_type); 2234 DRM_DEBUG_KMS("Got CSN: pn: %d ldps:%d ddps: %d mcs: %d ip: %d pdt: %d\n", msg.u.conn_stat.port_number, msg.u.conn_stat.legacy_device_plug_status, msg.u.conn_stat.displayport_device_plug_status, msg.u.conn_stat.message_capability_status, msg.u.conn_stat.input_port, msg.u.conn_stat.peer_device_type);
2178 (*mgr->cbs->hotplug)(mgr); 2235 (*mgr->cbs->hotplug)(mgr);
2179 2236
2180 } else if (msg.req_type == DP_RESOURCE_STATUS_NOTIFY) { 2237 } else if (msg.req_type == DP_RESOURCE_STATUS_NOTIFY) {
2181 drm_dp_send_up_ack_reply(mgr, mstb, msg.req_type, seqno, false); 2238 drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false);
2239 if (!mstb)
2240 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.resource_stat.guid);
2241
2242 if (!mstb) {
2243 DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct);
2244 memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx));
2245 return 0;
2246 }
2247
2182 DRM_DEBUG_KMS("Got RSN: pn: %d avail_pbn %d\n", msg.u.resource_stat.port_number, msg.u.resource_stat.available_pbn); 2248 DRM_DEBUG_KMS("Got RSN: pn: %d avail_pbn %d\n", msg.u.resource_stat.port_number, msg.u.resource_stat.available_pbn);
2183 } 2249 }
2184 2250
@@ -2770,7 +2836,6 @@ int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
2770 mutex_init(&mgr->qlock); 2836 mutex_init(&mgr->qlock);
2771 mutex_init(&mgr->payload_lock); 2837 mutex_init(&mgr->payload_lock);
2772 mutex_init(&mgr->destroy_connector_lock); 2838 mutex_init(&mgr->destroy_connector_lock);
2773 INIT_LIST_HEAD(&mgr->tx_msg_upq);
2774 INIT_LIST_HEAD(&mgr->tx_msg_downq); 2839 INIT_LIST_HEAD(&mgr->tx_msg_downq);
2775 INIT_LIST_HEAD(&mgr->destroy_connector_list); 2840 INIT_LIST_HEAD(&mgr->destroy_connector_list);
2776 INIT_WORK(&mgr->work, drm_dp_mst_link_probe_work); 2841 INIT_WORK(&mgr->work, drm_dp_mst_link_probe_work);
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index 9e7e2bf03b81..5eae0a88dd3e 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -3150,7 +3150,8 @@ void r100_bandwidth_update(struct radeon_device *rdev)
3150{ 3150{
3151 fixed20_12 trcd_ff, trp_ff, tras_ff, trbs_ff, tcas_ff; 3151 fixed20_12 trcd_ff, trp_ff, tras_ff, trbs_ff, tcas_ff;
3152 fixed20_12 sclk_ff, mclk_ff, sclk_eff_ff, sclk_delay_ff; 3152 fixed20_12 sclk_ff, mclk_ff, sclk_eff_ff, sclk_delay_ff;
3153 fixed20_12 peak_disp_bw, mem_bw, pix_clk, pix_clk2, temp_ff, crit_point_ff; 3153 fixed20_12 peak_disp_bw, mem_bw, pix_clk, pix_clk2, temp_ff;
3154 fixed20_12 crit_point_ff = {0};
3154 uint32_t temp, data, mem_trcd, mem_trp, mem_tras; 3155 uint32_t temp, data, mem_trcd, mem_trp, mem_tras;
3155 fixed20_12 memtcas_ff[8] = { 3156 fixed20_12 memtcas_ff[8] = {
3156 dfixed_init(1), 3157 dfixed_init(1),
@@ -3204,7 +3205,7 @@ void r100_bandwidth_update(struct radeon_device *rdev)
3204 fixed20_12 min_mem_eff; 3205 fixed20_12 min_mem_eff;
3205 fixed20_12 mc_latency_sclk, mc_latency_mclk, k1; 3206 fixed20_12 mc_latency_sclk, mc_latency_mclk, k1;
3206 fixed20_12 cur_latency_mclk, cur_latency_sclk; 3207 fixed20_12 cur_latency_mclk, cur_latency_sclk;
3207 fixed20_12 disp_latency, disp_latency_overhead, disp_drain_rate, 3208 fixed20_12 disp_latency, disp_latency_overhead, disp_drain_rate = {0},
3208 disp_drain_rate2, read_return_rate; 3209 disp_drain_rate2, read_return_rate;
3209 fixed20_12 time_disp1_drop_priority; 3210 fixed20_12 time_disp1_drop_priority;
3210 int c; 3211 int c;
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index d690df545b4d..902b59cebac5 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -1150,7 +1150,7 @@ static void radeon_check_arguments(struct radeon_device *rdev)
1150 } 1150 }
1151 1151
1152 if (radeon_vm_size < 1) { 1152 if (radeon_vm_size < 1) {
1153 dev_warn(rdev->dev, "VM size (%d) to small, min is 1GB\n", 1153 dev_warn(rdev->dev, "VM size (%d) too small, min is 1GB\n",
1154 radeon_vm_size); 1154 radeon_vm_size);
1155 radeon_vm_size = 4; 1155 radeon_vm_size = 4;
1156 } 1156 }
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
index 4fab44e0f36b..414953c46a38 100644
--- a/drivers/gpu/drm/radeon/radeon_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_kms.c
@@ -759,7 +759,7 @@ u32 radeon_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe)
759 u32 count; 759 u32 count;
760 struct radeon_device *rdev = dev->dev_private; 760 struct radeon_device *rdev = dev->dev_private;
761 761
762 if (pipe < 0 || pipe >= rdev->num_crtc) { 762 if (pipe >= rdev->num_crtc) {
763 DRM_ERROR("Invalid crtc %u\n", pipe); 763 DRM_ERROR("Invalid crtc %u\n", pipe);
764 return -EINVAL; 764 return -EINVAL;
765 } 765 }
diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h
index 74b5888bbc73..4fc55a87dfee 100644
--- a/include/drm/drm_dp_mst_helper.h
+++ b/include/drm/drm_dp_mst_helper.h
@@ -451,9 +451,7 @@ struct drm_dp_mst_topology_mgr {
451 the mstb tx_slots and txmsg->state once they are queued */ 451 the mstb tx_slots and txmsg->state once they are queued */
452 struct mutex qlock; 452 struct mutex qlock;
453 struct list_head tx_msg_downq; 453 struct list_head tx_msg_downq;
454 struct list_head tx_msg_upq;
455 bool tx_down_in_progress; 454 bool tx_down_in_progress;
456 bool tx_up_in_progress;
457 455
458 /* payload info + lock for it */ 456 /* payload info + lock for it */
459 struct mutex payload_lock; 457 struct mutex payload_lock;