diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 100 |
1 files changed, 41 insertions, 59 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 9ecdf621a74a..d02493cf9175 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -681,53 +681,53 @@ static void gfx_v8_0_init_golden_registers(struct amdgpu_device *adev) | |||
681 | case CHIP_TOPAZ: | 681 | case CHIP_TOPAZ: |
682 | amdgpu_program_register_sequence(adev, | 682 | amdgpu_program_register_sequence(adev, |
683 | iceland_mgcg_cgcg_init, | 683 | iceland_mgcg_cgcg_init, |
684 | (const u32)ARRAY_SIZE(iceland_mgcg_cgcg_init)); | 684 | ARRAY_SIZE(iceland_mgcg_cgcg_init)); |
685 | amdgpu_program_register_sequence(adev, | 685 | amdgpu_program_register_sequence(adev, |
686 | golden_settings_iceland_a11, | 686 | golden_settings_iceland_a11, |
687 | (const u32)ARRAY_SIZE(golden_settings_iceland_a11)); | 687 | ARRAY_SIZE(golden_settings_iceland_a11)); |
688 | amdgpu_program_register_sequence(adev, | 688 | amdgpu_program_register_sequence(adev, |
689 | iceland_golden_common_all, | 689 | iceland_golden_common_all, |
690 | (const u32)ARRAY_SIZE(iceland_golden_common_all)); | 690 | ARRAY_SIZE(iceland_golden_common_all)); |
691 | break; | 691 | break; |
692 | case CHIP_FIJI: | 692 | case CHIP_FIJI: |
693 | amdgpu_program_register_sequence(adev, | 693 | amdgpu_program_register_sequence(adev, |
694 | fiji_mgcg_cgcg_init, | 694 | fiji_mgcg_cgcg_init, |
695 | (const u32)ARRAY_SIZE(fiji_mgcg_cgcg_init)); | 695 | ARRAY_SIZE(fiji_mgcg_cgcg_init)); |
696 | amdgpu_program_register_sequence(adev, | 696 | amdgpu_program_register_sequence(adev, |
697 | golden_settings_fiji_a10, | 697 | golden_settings_fiji_a10, |
698 | (const u32)ARRAY_SIZE(golden_settings_fiji_a10)); | 698 | ARRAY_SIZE(golden_settings_fiji_a10)); |
699 | amdgpu_program_register_sequence(adev, | 699 | amdgpu_program_register_sequence(adev, |
700 | fiji_golden_common_all, | 700 | fiji_golden_common_all, |
701 | (const u32)ARRAY_SIZE(fiji_golden_common_all)); | 701 | ARRAY_SIZE(fiji_golden_common_all)); |
702 | break; | 702 | break; |
703 | 703 | ||
704 | case CHIP_TONGA: | 704 | case CHIP_TONGA: |
705 | amdgpu_program_register_sequence(adev, | 705 | amdgpu_program_register_sequence(adev, |
706 | tonga_mgcg_cgcg_init, | 706 | tonga_mgcg_cgcg_init, |
707 | (const u32)ARRAY_SIZE(tonga_mgcg_cgcg_init)); | 707 | ARRAY_SIZE(tonga_mgcg_cgcg_init)); |
708 | amdgpu_program_register_sequence(adev, | 708 | amdgpu_program_register_sequence(adev, |
709 | golden_settings_tonga_a11, | 709 | golden_settings_tonga_a11, |
710 | (const u32)ARRAY_SIZE(golden_settings_tonga_a11)); | 710 | ARRAY_SIZE(golden_settings_tonga_a11)); |
711 | amdgpu_program_register_sequence(adev, | 711 | amdgpu_program_register_sequence(adev, |
712 | tonga_golden_common_all, | 712 | tonga_golden_common_all, |
713 | (const u32)ARRAY_SIZE(tonga_golden_common_all)); | 713 | ARRAY_SIZE(tonga_golden_common_all)); |
714 | break; | 714 | break; |
715 | case CHIP_POLARIS11: | 715 | case CHIP_POLARIS11: |
716 | case CHIP_POLARIS12: | 716 | case CHIP_POLARIS12: |
717 | amdgpu_program_register_sequence(adev, | 717 | amdgpu_program_register_sequence(adev, |
718 | golden_settings_polaris11_a11, | 718 | golden_settings_polaris11_a11, |
719 | (const u32)ARRAY_SIZE(golden_settings_polaris11_a11)); | 719 | ARRAY_SIZE(golden_settings_polaris11_a11)); |
720 | amdgpu_program_register_sequence(adev, | 720 | amdgpu_program_register_sequence(adev, |
721 | polaris11_golden_common_all, | 721 | polaris11_golden_common_all, |
722 | (const u32)ARRAY_SIZE(polaris11_golden_common_all)); | 722 | ARRAY_SIZE(polaris11_golden_common_all)); |
723 | break; | 723 | break; |
724 | case CHIP_POLARIS10: | 724 | case CHIP_POLARIS10: |
725 | amdgpu_program_register_sequence(adev, | 725 | amdgpu_program_register_sequence(adev, |
726 | golden_settings_polaris10_a11, | 726 | golden_settings_polaris10_a11, |
727 | (const u32)ARRAY_SIZE(golden_settings_polaris10_a11)); | 727 | ARRAY_SIZE(golden_settings_polaris10_a11)); |
728 | amdgpu_program_register_sequence(adev, | 728 | amdgpu_program_register_sequence(adev, |
729 | polaris10_golden_common_all, | 729 | polaris10_golden_common_all, |
730 | (const u32)ARRAY_SIZE(polaris10_golden_common_all)); | 730 | ARRAY_SIZE(polaris10_golden_common_all)); |
731 | WREG32_SMC(ixCG_ACLK_CNTL, 0x0000001C); | 731 | WREG32_SMC(ixCG_ACLK_CNTL, 0x0000001C); |
732 | if (adev->pdev->revision == 0xc7 && | 732 | if (adev->pdev->revision == 0xc7 && |
733 | ((adev->pdev->subsystem_device == 0xb37 && adev->pdev->subsystem_vendor == 0x1002) || | 733 | ((adev->pdev->subsystem_device == 0xb37 && adev->pdev->subsystem_vendor == 0x1002) || |
@@ -740,24 +740,24 @@ static void gfx_v8_0_init_golden_registers(struct amdgpu_device *adev) | |||
740 | case CHIP_CARRIZO: | 740 | case CHIP_CARRIZO: |
741 | amdgpu_program_register_sequence(adev, | 741 | amdgpu_program_register_sequence(adev, |
742 | cz_mgcg_cgcg_init, | 742 | cz_mgcg_cgcg_init, |
743 | (const u32)ARRAY_SIZE(cz_mgcg_cgcg_init)); | 743 | ARRAY_SIZE(cz_mgcg_cgcg_init)); |
744 | amdgpu_program_register_sequence(adev, | 744 | amdgpu_program_register_sequence(adev, |
745 | cz_golden_settings_a11, | 745 | cz_golden_settings_a11, |
746 | (const u32)ARRAY_SIZE(cz_golden_settings_a11)); | 746 | ARRAY_SIZE(cz_golden_settings_a11)); |
747 | amdgpu_program_register_sequence(adev, | 747 | amdgpu_program_register_sequence(adev, |
748 | cz_golden_common_all, | 748 | cz_golden_common_all, |
749 | (const u32)ARRAY_SIZE(cz_golden_common_all)); | 749 | ARRAY_SIZE(cz_golden_common_all)); |
750 | break; | 750 | break; |
751 | case CHIP_STONEY: | 751 | case CHIP_STONEY: |
752 | amdgpu_program_register_sequence(adev, | 752 | amdgpu_program_register_sequence(adev, |
753 | stoney_mgcg_cgcg_init, | 753 | stoney_mgcg_cgcg_init, |
754 | (const u32)ARRAY_SIZE(stoney_mgcg_cgcg_init)); | 754 | ARRAY_SIZE(stoney_mgcg_cgcg_init)); |
755 | amdgpu_program_register_sequence(adev, | 755 | amdgpu_program_register_sequence(adev, |
756 | stoney_golden_settings_a11, | 756 | stoney_golden_settings_a11, |
757 | (const u32)ARRAY_SIZE(stoney_golden_settings_a11)); | 757 | ARRAY_SIZE(stoney_golden_settings_a11)); |
758 | amdgpu_program_register_sequence(adev, | 758 | amdgpu_program_register_sequence(adev, |
759 | stoney_golden_common_all, | 759 | stoney_golden_common_all, |
760 | (const u32)ARRAY_SIZE(stoney_golden_common_all)); | 760 | ARRAY_SIZE(stoney_golden_common_all)); |
761 | break; | 761 | break; |
762 | default: | 762 | default: |
763 | break; | 763 | break; |
@@ -804,7 +804,7 @@ static int gfx_v8_0_ring_test_ring(struct amdgpu_ring *ring) | |||
804 | DRM_UDELAY(1); | 804 | DRM_UDELAY(1); |
805 | } | 805 | } |
806 | if (i < adev->usec_timeout) { | 806 | if (i < adev->usec_timeout) { |
807 | DRM_INFO("ring test on %d succeeded in %d usecs\n", | 807 | DRM_DEBUG("ring test on %d succeeded in %d usecs\n", |
808 | ring->idx, i); | 808 | ring->idx, i); |
809 | } else { | 809 | } else { |
810 | DRM_ERROR("amdgpu: ring %d test failed (scratch(0x%04X)=0x%08X)\n", | 810 | DRM_ERROR("amdgpu: ring %d test failed (scratch(0x%04X)=0x%08X)\n", |
@@ -856,7 +856,7 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout) | |||
856 | } | 856 | } |
857 | tmp = RREG32(scratch); | 857 | tmp = RREG32(scratch); |
858 | if (tmp == 0xDEADBEEF) { | 858 | if (tmp == 0xDEADBEEF) { |
859 | DRM_INFO("ib test on ring %d succeeded\n", ring->idx); | 859 | DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx); |
860 | r = 0; | 860 | r = 0; |
861 | } else { | 861 | } else { |
862 | DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n", | 862 | DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n", |
@@ -2114,7 +2114,6 @@ static int gfx_v8_0_sw_fini(void *handle) | |||
2114 | amdgpu_gfx_compute_mqd_sw_fini(adev); | 2114 | amdgpu_gfx_compute_mqd_sw_fini(adev); |
2115 | amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq.ring, &adev->gfx.kiq.irq); | 2115 | amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq.ring, &adev->gfx.kiq.irq); |
2116 | amdgpu_gfx_kiq_fini(adev); | 2116 | amdgpu_gfx_kiq_fini(adev); |
2117 | amdgpu_bo_free_kernel(&adev->virt.csa_obj, &adev->virt.csa_vmid0_addr, NULL); | ||
2118 | 2117 | ||
2119 | gfx_v8_0_mec_fini(adev); | 2118 | gfx_v8_0_mec_fini(adev); |
2120 | gfx_v8_0_rlc_fini(adev); | 2119 | gfx_v8_0_rlc_fini(adev); |
@@ -3851,6 +3850,14 @@ static void gfx_v8_0_wait_for_rlc_serdes(struct amdgpu_device *adev) | |||
3851 | break; | 3850 | break; |
3852 | udelay(1); | 3851 | udelay(1); |
3853 | } | 3852 | } |
3853 | if (k == adev->usec_timeout) { | ||
3854 | gfx_v8_0_select_se_sh(adev, 0xffffffff, | ||
3855 | 0xffffffff, 0xffffffff); | ||
3856 | mutex_unlock(&adev->grbm_idx_mutex); | ||
3857 | DRM_INFO("Timeout wait for RLC serdes %u,%u\n", | ||
3858 | i, j); | ||
3859 | return; | ||
3860 | } | ||
3854 | } | 3861 | } |
3855 | } | 3862 | } |
3856 | gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); | 3863 | gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
@@ -4305,37 +4312,8 @@ static int gfx_v8_0_cp_gfx_start(struct amdgpu_device *adev) | |||
4305 | 4312 | ||
4306 | amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2)); | 4313 | amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2)); |
4307 | amdgpu_ring_write(ring, mmPA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START); | 4314 | amdgpu_ring_write(ring, mmPA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START); |
4308 | switch (adev->asic_type) { | 4315 | amdgpu_ring_write(ring, adev->gfx.config.rb_config[0][0].raster_config); |
4309 | case CHIP_TONGA: | 4316 | amdgpu_ring_write(ring, adev->gfx.config.rb_config[0][0].raster_config_1); |
4310 | case CHIP_POLARIS10: | ||
4311 | amdgpu_ring_write(ring, 0x16000012); | ||
4312 | amdgpu_ring_write(ring, 0x0000002A); | ||
4313 | break; | ||
4314 | case CHIP_POLARIS11: | ||
4315 | case CHIP_POLARIS12: | ||
4316 | amdgpu_ring_write(ring, 0x16000012); | ||
4317 | amdgpu_ring_write(ring, 0x00000000); | ||
4318 | break; | ||
4319 | case CHIP_FIJI: | ||
4320 | amdgpu_ring_write(ring, 0x3a00161a); | ||
4321 | amdgpu_ring_write(ring, 0x0000002e); | ||
4322 | break; | ||
4323 | case CHIP_CARRIZO: | ||
4324 | amdgpu_ring_write(ring, 0x00000002); | ||
4325 | amdgpu_ring_write(ring, 0x00000000); | ||
4326 | break; | ||
4327 | case CHIP_TOPAZ: | ||
4328 | amdgpu_ring_write(ring, adev->gfx.config.num_rbs == 1 ? | ||
4329 | 0x00000000 : 0x00000002); | ||
4330 | amdgpu_ring_write(ring, 0x00000000); | ||
4331 | break; | ||
4332 | case CHIP_STONEY: | ||
4333 | amdgpu_ring_write(ring, 0x00000000); | ||
4334 | amdgpu_ring_write(ring, 0x00000000); | ||
4335 | break; | ||
4336 | default: | ||
4337 | BUG(); | ||
4338 | } | ||
4339 | 4317 | ||
4340 | amdgpu_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); | 4318 | amdgpu_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); |
4341 | amdgpu_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE); | 4319 | amdgpu_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE); |
@@ -4816,7 +4794,7 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring) | |||
4816 | 4794 | ||
4817 | gfx_v8_0_kiq_setting(ring); | 4795 | gfx_v8_0_kiq_setting(ring); |
4818 | 4796 | ||
4819 | if (adev->in_sriov_reset) { /* for GPU_RESET case */ | 4797 | if (adev->in_gpu_reset) { /* for GPU_RESET case */ |
4820 | /* reset MQD to a clean status */ | 4798 | /* reset MQD to a clean status */ |
4821 | if (adev->gfx.mec.mqd_backup[mqd_idx]) | 4799 | if (adev->gfx.mec.mqd_backup[mqd_idx]) |
4822 | memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation)); | 4800 | memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation)); |
@@ -4853,7 +4831,7 @@ static int gfx_v8_0_kcq_init_queue(struct amdgpu_ring *ring) | |||
4853 | struct vi_mqd *mqd = ring->mqd_ptr; | 4831 | struct vi_mqd *mqd = ring->mqd_ptr; |
4854 | int mqd_idx = ring - &adev->gfx.compute_ring[0]; | 4832 | int mqd_idx = ring - &adev->gfx.compute_ring[0]; |
4855 | 4833 | ||
4856 | if (!adev->in_sriov_reset && !adev->gfx.in_suspend) { | 4834 | if (!adev->in_gpu_reset && !adev->gfx.in_suspend) { |
4857 | memset((void *)mqd, 0, sizeof(struct vi_mqd_allocation)); | 4835 | memset((void *)mqd, 0, sizeof(struct vi_mqd_allocation)); |
4858 | ((struct vi_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF; | 4836 | ((struct vi_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF; |
4859 | ((struct vi_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF; | 4837 | ((struct vi_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF; |
@@ -4865,13 +4843,10 @@ static int gfx_v8_0_kcq_init_queue(struct amdgpu_ring *ring) | |||
4865 | 4843 | ||
4866 | if (adev->gfx.mec.mqd_backup[mqd_idx]) | 4844 | if (adev->gfx.mec.mqd_backup[mqd_idx]) |
4867 | memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct vi_mqd_allocation)); | 4845 | memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct vi_mqd_allocation)); |
4868 | } else if (adev->in_sriov_reset) { /* for GPU_RESET case */ | 4846 | } else if (adev->in_gpu_reset) { /* for GPU_RESET case */ |
4869 | /* reset MQD to a clean status */ | 4847 | /* reset MQD to a clean status */ |
4870 | if (adev->gfx.mec.mqd_backup[mqd_idx]) | 4848 | if (adev->gfx.mec.mqd_backup[mqd_idx]) |
4871 | memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation)); | 4849 | memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation)); |
4872 | /* reset ring buffer */ | ||
4873 | ring->wptr = 0; | ||
4874 | amdgpu_ring_clear_ring(ring); | ||
4875 | } else { | 4850 | } else { |
4876 | amdgpu_ring_clear_ring(ring); | 4851 | amdgpu_ring_clear_ring(ring); |
4877 | } | 4852 | } |
@@ -4946,6 +4921,13 @@ static int gfx_v8_0_kiq_resume(struct amdgpu_device *adev) | |||
4946 | /* Test KCQs */ | 4921 | /* Test KCQs */ |
4947 | for (i = 0; i < adev->gfx.num_compute_rings; i++) { | 4922 | for (i = 0; i < adev->gfx.num_compute_rings; i++) { |
4948 | ring = &adev->gfx.compute_ring[i]; | 4923 | ring = &adev->gfx.compute_ring[i]; |
4924 | if (adev->in_gpu_reset) { | ||
4925 | /* move reset ring buffer to here to workaround | ||
4926 | * compute ring test failed | ||
4927 | */ | ||
4928 | ring->wptr = 0; | ||
4929 | amdgpu_ring_clear_ring(ring); | ||
4930 | } | ||
4949 | ring->ready = true; | 4931 | ring->ready = true; |
4950 | r = amdgpu_ring_test_ring(ring); | 4932 | r = amdgpu_ring_test_ring(ring); |
4951 | if (r) | 4933 | if (r) |