diff options
author | Le Ma <le.ma@amd.com> | 2019-08-09 06:57:15 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2019-08-12 13:47:49 -0400 |
commit | cb15e8046d0df90deeec9ed79dc432043f11d07b (patch) | |
tree | 88e09852f37998b3990a16dfe7379d827410c479 | |
parent | 15e2f43a72cfe2c122281e7872ad8eaa71387d98 (diff) |
drm/amdgpu: add mmhub clock gating for Arcturus
Add 2 mmhub instances CG
Signed-off-by: Le Ma <le.ma@amd.com>
Reviewed-by: Kevin Wang <kevin1.wang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c | 126 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.h | 3 |
3 files changed, 135 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index cf0241ee4e6d..e48fd19fd09c 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | |||
@@ -1469,9 +1469,9 @@ static int gmc_v9_0_set_clockgating_state(void *handle, | |||
1469 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 1469 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
1470 | 1470 | ||
1471 | if (adev->asic_type == CHIP_ARCTURUS) | 1471 | if (adev->asic_type == CHIP_ARCTURUS) |
1472 | return 0; | 1472 | mmhub_v9_4_set_clockgating(adev, state); |
1473 | 1473 | else | |
1474 | mmhub_v1_0_set_clockgating(adev, state); | 1474 | mmhub_v1_0_set_clockgating(adev, state); |
1475 | 1475 | ||
1476 | athub_v1_0_set_clockgating(adev, state); | 1476 | athub_v1_0_set_clockgating(adev, state); |
1477 | 1477 | ||
@@ -1483,9 +1483,9 @@ static void gmc_v9_0_get_clockgating_state(void *handle, u32 *flags) | |||
1483 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 1483 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
1484 | 1484 | ||
1485 | if (adev->asic_type == CHIP_ARCTURUS) | 1485 | if (adev->asic_type == CHIP_ARCTURUS) |
1486 | return; | 1486 | mmhub_v9_4_get_clockgating(adev, flags); |
1487 | 1487 | else | |
1488 | mmhub_v1_0_get_clockgating(adev, flags); | 1488 | mmhub_v1_0_get_clockgating(adev, flags); |
1489 | 1489 | ||
1490 | athub_v1_0_get_clockgating(adev, flags); | 1490 | athub_v1_0_get_clockgating(adev, flags); |
1491 | } | 1491 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c index 33b0de54a5da..e52e4d1860f5 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c | |||
@@ -515,3 +515,129 @@ void mmhub_v9_4_init(struct amdgpu_device *adev) | |||
515 | i * MMHUB_INSTANCE_REGISTER_OFFSET; | 515 | i * MMHUB_INSTANCE_REGISTER_OFFSET; |
516 | } | 516 | } |
517 | } | 517 | } |
518 | |||
519 | static void mmhub_v9_4_update_medium_grain_clock_gating(struct amdgpu_device *adev, | ||
520 | bool enable) | ||
521 | { | ||
522 | uint32_t def, data, def1, data1; | ||
523 | int i, j; | ||
524 | int dist = mmDAGB1_CNTL_MISC2 - mmDAGB0_CNTL_MISC2; | ||
525 | |||
526 | for (i = 0; i < MMHUB_NUM_INSTANCES; i++) { | ||
527 | def = data = RREG32_SOC15_OFFSET(MMHUB, 0, | ||
528 | mmATCL2_0_ATC_L2_MISC_CG, | ||
529 | i * MMHUB_INSTANCE_REGISTER_OFFSET); | ||
530 | |||
531 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG)) | ||
532 | data |= ATCL2_0_ATC_L2_MISC_CG__ENABLE_MASK; | ||
533 | else | ||
534 | data &= ~ATCL2_0_ATC_L2_MISC_CG__ENABLE_MASK; | ||
535 | |||
536 | if (def != data) | ||
537 | WREG32_SOC15_OFFSET(MMHUB, 0, mmATCL2_0_ATC_L2_MISC_CG, | ||
538 | i * MMHUB_INSTANCE_REGISTER_OFFSET, data); | ||
539 | |||
540 | for (j = 0; j < 5; j++) { | ||
541 | def1 = data1 = RREG32_SOC15_OFFSET(MMHUB, 0, | ||
542 | mmDAGB0_CNTL_MISC2, | ||
543 | i * MMHUB_INSTANCE_REGISTER_OFFSET + | ||
544 | j * dist); | ||
545 | if (enable && | ||
546 | (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG)) { | ||
547 | data1 &= | ||
548 | ~(DAGB0_CNTL_MISC2__DISABLE_WRREQ_CG_MASK | | ||
549 | DAGB0_CNTL_MISC2__DISABLE_WRRET_CG_MASK | | ||
550 | DAGB0_CNTL_MISC2__DISABLE_RDREQ_CG_MASK | | ||
551 | DAGB0_CNTL_MISC2__DISABLE_RDRET_CG_MASK | | ||
552 | DAGB0_CNTL_MISC2__DISABLE_TLBWR_CG_MASK | | ||
553 | DAGB0_CNTL_MISC2__DISABLE_TLBRD_CG_MASK); | ||
554 | } else { | ||
555 | data1 |= | ||
556 | (DAGB0_CNTL_MISC2__DISABLE_WRREQ_CG_MASK | | ||
557 | DAGB0_CNTL_MISC2__DISABLE_WRRET_CG_MASK | | ||
558 | DAGB0_CNTL_MISC2__DISABLE_RDREQ_CG_MASK | | ||
559 | DAGB0_CNTL_MISC2__DISABLE_RDRET_CG_MASK | | ||
560 | DAGB0_CNTL_MISC2__DISABLE_TLBWR_CG_MASK | | ||
561 | DAGB0_CNTL_MISC2__DISABLE_TLBRD_CG_MASK); | ||
562 | } | ||
563 | |||
564 | if (def1 != data1) | ||
565 | WREG32_SOC15_OFFSET(MMHUB, 0, | ||
566 | mmDAGB0_CNTL_MISC2, | ||
567 | i * MMHUB_INSTANCE_REGISTER_OFFSET + | ||
568 | j * dist, data1); | ||
569 | |||
570 | if (i == 1 && j == 3) | ||
571 | break; | ||
572 | } | ||
573 | } | ||
574 | } | ||
575 | |||
576 | static void mmhub_v9_4_update_medium_grain_light_sleep(struct amdgpu_device *adev, | ||
577 | bool enable) | ||
578 | { | ||
579 | uint32_t def, data; | ||
580 | int i; | ||
581 | |||
582 | for (i = 0; i < MMHUB_NUM_INSTANCES; i++) { | ||
583 | def = data = RREG32_SOC15_OFFSET(MMHUB, 0, | ||
584 | mmATCL2_0_ATC_L2_MISC_CG, | ||
585 | i * MMHUB_INSTANCE_REGISTER_OFFSET); | ||
586 | |||
587 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_LS)) | ||
588 | data |= ATCL2_0_ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK; | ||
589 | else | ||
590 | data &= ~ATCL2_0_ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK; | ||
591 | |||
592 | if (def != data) | ||
593 | WREG32_SOC15_OFFSET(MMHUB, 0, mmATCL2_0_ATC_L2_MISC_CG, | ||
594 | i * MMHUB_INSTANCE_REGISTER_OFFSET, data); | ||
595 | } | ||
596 | } | ||
597 | |||
598 | int mmhub_v9_4_set_clockgating(struct amdgpu_device *adev, | ||
599 | enum amd_clockgating_state state) | ||
600 | { | ||
601 | if (amdgpu_sriov_vf(adev)) | ||
602 | return 0; | ||
603 | |||
604 | switch (adev->asic_type) { | ||
605 | case CHIP_ARCTURUS: | ||
606 | mmhub_v9_4_update_medium_grain_clock_gating(adev, | ||
607 | state == AMD_CG_STATE_GATE ? true : false); | ||
608 | mmhub_v9_4_update_medium_grain_light_sleep(adev, | ||
609 | state == AMD_CG_STATE_GATE ? true : false); | ||
610 | break; | ||
611 | default: | ||
612 | break; | ||
613 | } | ||
614 | |||
615 | return 0; | ||
616 | } | ||
617 | |||
618 | /* TODO: get 2 mmhub instances CG state */ | ||
619 | void mmhub_v9_4_get_clockgating(struct amdgpu_device *adev, u32 *flags) | ||
620 | { | ||
621 | int data, data1; | ||
622 | |||
623 | if (amdgpu_sriov_vf(adev)) | ||
624 | *flags = 0; | ||
625 | |||
626 | /* AMD_CG_SUPPORT_MC_MGCG */ | ||
627 | data = RREG32_SOC15(MMHUB, 0, mmATCL2_0_ATC_L2_MISC_CG); | ||
628 | |||
629 | data1 = RREG32_SOC15(MMHUB, 0, mmATCL2_0_ATC_L2_MISC_CG); | ||
630 | |||
631 | if ((data & ATCL2_0_ATC_L2_MISC_CG__ENABLE_MASK) && | ||
632 | !(data1 & (DAGB0_CNTL_MISC2__DISABLE_WRREQ_CG_MASK | | ||
633 | DAGB0_CNTL_MISC2__DISABLE_WRRET_CG_MASK | | ||
634 | DAGB0_CNTL_MISC2__DISABLE_RDREQ_CG_MASK | | ||
635 | DAGB0_CNTL_MISC2__DISABLE_RDRET_CG_MASK | | ||
636 | DAGB0_CNTL_MISC2__DISABLE_TLBWR_CG_MASK | | ||
637 | DAGB0_CNTL_MISC2__DISABLE_TLBRD_CG_MASK))) | ||
638 | *flags |= AMD_CG_SUPPORT_MC_MGCG; | ||
639 | |||
640 | /* AMD_CG_SUPPORT_MC_LS */ | ||
641 | if (data & ATCL2_0_ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK) | ||
642 | *flags |= AMD_CG_SUPPORT_MC_LS; | ||
643 | } | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.h b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.h index 9ba3dd808826..d435cfcec1a8 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.h +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.h | |||
@@ -29,5 +29,8 @@ void mmhub_v9_4_gart_disable(struct amdgpu_device *adev); | |||
29 | void mmhub_v9_4_set_fault_enable_default(struct amdgpu_device *adev, | 29 | void mmhub_v9_4_set_fault_enable_default(struct amdgpu_device *adev, |
30 | bool value); | 30 | bool value); |
31 | void mmhub_v9_4_init(struct amdgpu_device *adev); | 31 | void mmhub_v9_4_init(struct amdgpu_device *adev); |
32 | int mmhub_v9_4_set_clockgating(struct amdgpu_device *adev, | ||
33 | enum amd_clockgating_state state); | ||
34 | void mmhub_v9_4_get_clockgating(struct amdgpu_device *adev, u32 *flags); | ||
32 | 35 | ||
33 | #endif | 36 | #endif |