diff options
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 502 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/sid.h | 89 |
2 files changed, 549 insertions, 42 deletions
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index ad77dbe1ba7b..6c5cbe0e80b9 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -4553,6 +4553,450 @@ void si_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) | |||
4553 | } | 4553 | } |
4554 | 4554 | ||
4555 | /* | 4555 | /* |
4556 | * Power and clock gating | ||
4557 | */ | ||
4558 | static void si_wait_for_rlc_serdes(struct radeon_device *rdev) | ||
4559 | { | ||
4560 | int i; | ||
4561 | |||
4562 | for (i = 0; i < rdev->usec_timeout; i++) { | ||
4563 | if (RREG32(RLC_SERDES_MASTER_BUSY_0) == 0) | ||
4564 | break; | ||
4565 | udelay(1); | ||
4566 | } | ||
4567 | |||
4568 | for (i = 0; i < rdev->usec_timeout; i++) { | ||
4569 | if (RREG32(RLC_SERDES_MASTER_BUSY_1) == 0) | ||
4570 | break; | ||
4571 | udelay(1); | ||
4572 | } | ||
4573 | } | ||
4574 | |||
4575 | static void si_enable_gui_idle_interrupt(struct radeon_device *rdev, | ||
4576 | bool enable) | ||
4577 | { | ||
4578 | u32 tmp = RREG32(CP_INT_CNTL_RING0); | ||
4579 | u32 mask; | ||
4580 | int i; | ||
4581 | |||
4582 | if (enable) | ||
4583 | tmp |= (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); | ||
4584 | else | ||
4585 | tmp &= ~(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); | ||
4586 | WREG32(CP_INT_CNTL_RING0, tmp); | ||
4587 | |||
4588 | if (!enable) { | ||
4589 | /* read a gfx register */ | ||
4590 | tmp = RREG32(DB_DEPTH_INFO); | ||
4591 | |||
4592 | mask = RLC_BUSY_STATUS | GFX_POWER_STATUS | GFX_CLOCK_STATUS | GFX_LS_STATUS; | ||
4593 | for (i = 0; i < rdev->usec_timeout; i++) { | ||
4594 | if ((RREG32(RLC_STAT) & mask) == (GFX_CLOCK_STATUS | GFX_POWER_STATUS)) | ||
4595 | break; | ||
4596 | udelay(1); | ||
4597 | } | ||
4598 | } | ||
4599 | } | ||
4600 | |||
4601 | static void si_set_uvd_dcm(struct radeon_device *rdev, | ||
4602 | bool sw_mode) | ||
4603 | { | ||
4604 | u32 tmp, tmp2; | ||
4605 | |||
4606 | tmp = RREG32(UVD_CGC_CTRL); | ||
4607 | tmp &= ~(CLK_OD_MASK | CG_DT_MASK); | ||
4608 | tmp |= DCM | CG_DT(1) | CLK_OD(4); | ||
4609 | |||
4610 | if (sw_mode) { | ||
4611 | tmp &= ~0x7ffff800; | ||
4612 | tmp2 = DYN_OR_EN | DYN_RR_EN | G_DIV_ID(7); | ||
4613 | } else { | ||
4614 | tmp |= 0x7ffff800; | ||
4615 | tmp2 = 0; | ||
4616 | } | ||
4617 | |||
4618 | WREG32(UVD_CGC_CTRL, tmp); | ||
4619 | WREG32_UVD_CTX(UVD_CGC_CTRL2, tmp2); | ||
4620 | } | ||
4621 | |||
4622 | static void si_init_uvd_internal_cg(struct radeon_device *rdev) | ||
4623 | { | ||
4624 | bool hw_mode = true; | ||
4625 | |||
4626 | if (hw_mode) { | ||
4627 | si_set_uvd_dcm(rdev, false); | ||
4628 | } else { | ||
4629 | u32 tmp = RREG32(UVD_CGC_CTRL); | ||
4630 | tmp &= ~DCM; | ||
4631 | WREG32(UVD_CGC_CTRL, tmp); | ||
4632 | } | ||
4633 | } | ||
4634 | |||
4635 | static u32 si_halt_rlc(struct radeon_device *rdev) | ||
4636 | { | ||
4637 | u32 data, orig; | ||
4638 | |||
4639 | orig = data = RREG32(RLC_CNTL); | ||
4640 | |||
4641 | if (data & RLC_ENABLE) { | ||
4642 | data &= ~RLC_ENABLE; | ||
4643 | WREG32(RLC_CNTL, data); | ||
4644 | |||
4645 | si_wait_for_rlc_serdes(rdev); | ||
4646 | } | ||
4647 | |||
4648 | return orig; | ||
4649 | } | ||
4650 | |||
4651 | static void si_update_rlc(struct radeon_device *rdev, u32 rlc) | ||
4652 | { | ||
4653 | u32 tmp; | ||
4654 | |||
4655 | tmp = RREG32(RLC_CNTL); | ||
4656 | if (tmp != rlc) | ||
4657 | WREG32(RLC_CNTL, rlc); | ||
4658 | } | ||
4659 | |||
4660 | static void si_enable_dma_pg(struct radeon_device *rdev, bool enable) | ||
4661 | { | ||
4662 | u32 data, orig; | ||
4663 | |||
4664 | orig = data = RREG32(DMA_PG); | ||
4665 | if (enable) | ||
4666 | data |= PG_CNTL_ENABLE; | ||
4667 | else | ||
4668 | data &= ~PG_CNTL_ENABLE; | ||
4669 | if (orig != data) | ||
4670 | WREG32(DMA_PG, data); | ||
4671 | } | ||
4672 | |||
4673 | static void si_init_dma_pg(struct radeon_device *rdev) | ||
4674 | { | ||
4675 | u32 tmp; | ||
4676 | |||
4677 | WREG32(DMA_PGFSM_WRITE, 0x00002000); | ||
4678 | WREG32(DMA_PGFSM_CONFIG, 0x100010ff); | ||
4679 | |||
4680 | for (tmp = 0; tmp < 5; tmp++) | ||
4681 | WREG32(DMA_PGFSM_WRITE, 0); | ||
4682 | } | ||
4683 | |||
4684 | static void si_enable_gfx_cgpg(struct radeon_device *rdev, | ||
4685 | bool enable) | ||
4686 | { | ||
4687 | u32 tmp; | ||
4688 | |||
4689 | if (enable) { | ||
4690 | tmp = RLC_PUD(0x10) | RLC_PDD(0x10) | RLC_TTPD(0x10) | RLC_MSD(0x10); | ||
4691 | WREG32(RLC_TTOP_D, tmp); | ||
4692 | |||
4693 | tmp = RREG32(RLC_PG_CNTL); | ||
4694 | tmp |= GFX_PG_ENABLE; | ||
4695 | WREG32(RLC_PG_CNTL, tmp); | ||
4696 | |||
4697 | tmp = RREG32(RLC_AUTO_PG_CTRL); | ||
4698 | tmp |= AUTO_PG_EN; | ||
4699 | WREG32(RLC_AUTO_PG_CTRL, tmp); | ||
4700 | } else { | ||
4701 | tmp = RREG32(RLC_AUTO_PG_CTRL); | ||
4702 | tmp &= ~AUTO_PG_EN; | ||
4703 | WREG32(RLC_AUTO_PG_CTRL, tmp); | ||
4704 | |||
4705 | tmp = RREG32(DB_RENDER_CONTROL); | ||
4706 | } | ||
4707 | } | ||
4708 | |||
4709 | static void si_init_gfx_cgpg(struct radeon_device *rdev) | ||
4710 | { | ||
4711 | u32 tmp; | ||
4712 | |||
4713 | WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8); | ||
4714 | |||
4715 | tmp = RREG32(RLC_PG_CNTL); | ||
4716 | tmp |= GFX_PG_SRC; | ||
4717 | WREG32(RLC_PG_CNTL, tmp); | ||
4718 | |||
4719 | WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8); | ||
4720 | |||
4721 | tmp = RREG32(RLC_AUTO_PG_CTRL); | ||
4722 | |||
4723 | tmp &= ~GRBM_REG_SGIT_MASK; | ||
4724 | tmp |= GRBM_REG_SGIT(0x700); | ||
4725 | tmp &= ~PG_AFTER_GRBM_REG_ST_MASK; | ||
4726 | WREG32(RLC_AUTO_PG_CTRL, tmp); | ||
4727 | } | ||
4728 | |||
4729 | static u32 get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh) | ||
4730 | { | ||
4731 | u32 mask = 0, tmp, tmp1; | ||
4732 | int i; | ||
4733 | |||
4734 | si_select_se_sh(rdev, se, sh); | ||
4735 | tmp = RREG32(CC_GC_SHADER_ARRAY_CONFIG); | ||
4736 | tmp1 = RREG32(GC_USER_SHADER_ARRAY_CONFIG); | ||
4737 | si_select_se_sh(rdev, 0xffffffff, 0xffffffff); | ||
4738 | |||
4739 | tmp &= 0xffff0000; | ||
4740 | |||
4741 | tmp |= tmp1; | ||
4742 | tmp >>= 16; | ||
4743 | |||
4744 | for (i = 0; i < rdev->config.si.max_cu_per_sh; i ++) { | ||
4745 | mask <<= 1; | ||
4746 | mask |= 1; | ||
4747 | } | ||
4748 | |||
4749 | return (~tmp) & mask; | ||
4750 | } | ||
4751 | |||
4752 | static void si_init_ao_cu_mask(struct radeon_device *rdev) | ||
4753 | { | ||
4754 | u32 i, j, k, active_cu_number = 0; | ||
4755 | u32 mask, counter, cu_bitmap; | ||
4756 | u32 tmp = 0; | ||
4757 | |||
4758 | for (i = 0; i < rdev->config.si.max_shader_engines; i++) { | ||
4759 | for (j = 0; j < rdev->config.si.max_sh_per_se; j++) { | ||
4760 | mask = 1; | ||
4761 | cu_bitmap = 0; | ||
4762 | counter = 0; | ||
4763 | for (k = 0; k < rdev->config.si.max_cu_per_sh; k++) { | ||
4764 | if (get_cu_active_bitmap(rdev, i, j) & mask) { | ||
4765 | if (counter < 2) | ||
4766 | cu_bitmap |= mask; | ||
4767 | counter++; | ||
4768 | } | ||
4769 | mask <<= 1; | ||
4770 | } | ||
4771 | |||
4772 | active_cu_number += counter; | ||
4773 | tmp |= (cu_bitmap << (i * 16 + j * 8)); | ||
4774 | } | ||
4775 | } | ||
4776 | |||
4777 | WREG32(RLC_PG_AO_CU_MASK, tmp); | ||
4778 | |||
4779 | tmp = RREG32(RLC_MAX_PG_CU); | ||
4780 | tmp &= ~MAX_PU_CU_MASK; | ||
4781 | tmp |= MAX_PU_CU(active_cu_number); | ||
4782 | WREG32(RLC_MAX_PG_CU, tmp); | ||
4783 | } | ||
4784 | |||
4785 | static void si_enable_cgcg(struct radeon_device *rdev, | ||
4786 | bool enable) | ||
4787 | { | ||
4788 | u32 data, orig, tmp; | ||
4789 | |||
4790 | orig = data = RREG32(RLC_CGCG_CGLS_CTRL); | ||
4791 | |||
4792 | si_enable_gui_idle_interrupt(rdev, enable); | ||
4793 | |||
4794 | if (enable) { | ||
4795 | WREG32(RLC_GCPM_GENERAL_3, 0x00000080); | ||
4796 | |||
4797 | tmp = si_halt_rlc(rdev); | ||
4798 | |||
4799 | WREG32(RLC_SERDES_WR_MASTER_MASK_0, 0xffffffff); | ||
4800 | WREG32(RLC_SERDES_WR_MASTER_MASK_1, 0xffffffff); | ||
4801 | WREG32(RLC_SERDES_WR_CTRL, 0x00b000ff); | ||
4802 | |||
4803 | si_wait_for_rlc_serdes(rdev); | ||
4804 | |||
4805 | si_update_rlc(rdev, tmp); | ||
4806 | |||
4807 | WREG32(RLC_SERDES_WR_CTRL, 0x007000ff); | ||
4808 | |||
4809 | data |= CGCG_EN | CGLS_EN; | ||
4810 | } else { | ||
4811 | RREG32(CB_CGTT_SCLK_CTRL); | ||
4812 | RREG32(CB_CGTT_SCLK_CTRL); | ||
4813 | RREG32(CB_CGTT_SCLK_CTRL); | ||
4814 | RREG32(CB_CGTT_SCLK_CTRL); | ||
4815 | |||
4816 | data &= ~(CGCG_EN | CGLS_EN); | ||
4817 | } | ||
4818 | |||
4819 | if (orig != data) | ||
4820 | WREG32(RLC_CGCG_CGLS_CTRL, data); | ||
4821 | } | ||
4822 | |||
4823 | static void si_enable_mgcg(struct radeon_device *rdev, | ||
4824 | bool enable) | ||
4825 | { | ||
4826 | u32 data, orig, tmp = 0; | ||
4827 | |||
4828 | if (enable) { | ||
4829 | orig = data = RREG32(CGTS_SM_CTRL_REG); | ||
4830 | data = 0x96940200; | ||
4831 | if (orig != data) | ||
4832 | WREG32(CGTS_SM_CTRL_REG, data); | ||
4833 | |||
4834 | orig = data = RREG32(CP_MEM_SLP_CNTL); | ||
4835 | data |= CP_MEM_LS_EN; | ||
4836 | if (orig != data) | ||
4837 | WREG32(CP_MEM_SLP_CNTL, data); | ||
4838 | |||
4839 | orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE); | ||
4840 | data &= 0xffffffc0; | ||
4841 | if (orig != data) | ||
4842 | WREG32(RLC_CGTT_MGCG_OVERRIDE, data); | ||
4843 | |||
4844 | tmp = si_halt_rlc(rdev); | ||
4845 | |||
4846 | WREG32(RLC_SERDES_WR_MASTER_MASK_0, 0xffffffff); | ||
4847 | WREG32(RLC_SERDES_WR_MASTER_MASK_1, 0xffffffff); | ||
4848 | WREG32(RLC_SERDES_WR_CTRL, 0x00d000ff); | ||
4849 | |||
4850 | si_update_rlc(rdev, tmp); | ||
4851 | } else { | ||
4852 | orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE); | ||
4853 | data |= 0x00000003; | ||
4854 | if (orig != data) | ||
4855 | WREG32(RLC_CGTT_MGCG_OVERRIDE, data); | ||
4856 | |||
4857 | data = RREG32(CP_MEM_SLP_CNTL); | ||
4858 | if (data & CP_MEM_LS_EN) { | ||
4859 | data &= ~CP_MEM_LS_EN; | ||
4860 | WREG32(CP_MEM_SLP_CNTL, data); | ||
4861 | } | ||
4862 | orig = data = RREG32(CGTS_SM_CTRL_REG); | ||
4863 | data |= LS_OVERRIDE | OVERRIDE; | ||
4864 | if (orig != data) | ||
4865 | WREG32(CGTS_SM_CTRL_REG, data); | ||
4866 | |||
4867 | tmp = si_halt_rlc(rdev); | ||
4868 | |||
4869 | WREG32(RLC_SERDES_WR_MASTER_MASK_0, 0xffffffff); | ||
4870 | WREG32(RLC_SERDES_WR_MASTER_MASK_1, 0xffffffff); | ||
4871 | WREG32(RLC_SERDES_WR_CTRL, 0x00e000ff); | ||
4872 | |||
4873 | si_update_rlc(rdev, tmp); | ||
4874 | } | ||
4875 | } | ||
4876 | |||
4877 | static void si_enable_uvd_mgcg(struct radeon_device *rdev, | ||
4878 | bool enable) | ||
4879 | { | ||
4880 | u32 orig, data, tmp; | ||
4881 | |||
4882 | if (enable) { | ||
4883 | tmp = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL); | ||
4884 | tmp |= 0x3fff; | ||
4885 | WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, tmp); | ||
4886 | |||
4887 | orig = data = RREG32(UVD_CGC_CTRL); | ||
4888 | data |= DCM; | ||
4889 | if (orig != data) | ||
4890 | WREG32(UVD_CGC_CTRL, data); | ||
4891 | |||
4892 | WREG32_SMC(SMC_CG_IND_START + CG_CGTT_LOCAL_0, 0); | ||
4893 | WREG32_SMC(SMC_CG_IND_START + CG_CGTT_LOCAL_1, 0); | ||
4894 | } else { | ||
4895 | tmp = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL); | ||
4896 | tmp &= ~0x3fff; | ||
4897 | WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, tmp); | ||
4898 | |||
4899 | orig = data = RREG32(UVD_CGC_CTRL); | ||
4900 | data &= ~DCM; | ||
4901 | if (orig != data) | ||
4902 | WREG32(UVD_CGC_CTRL, data); | ||
4903 | |||
4904 | WREG32_SMC(SMC_CG_IND_START + CG_CGTT_LOCAL_0, 0xffffffff); | ||
4905 | WREG32_SMC(SMC_CG_IND_START + CG_CGTT_LOCAL_1, 0xffffffff); | ||
4906 | } | ||
4907 | } | ||
4908 | |||
4909 | static const u32 mc_cg_registers[] = | ||
4910 | { | ||
4911 | MC_HUB_MISC_HUB_CG, | ||
4912 | MC_HUB_MISC_SIP_CG, | ||
4913 | MC_HUB_MISC_VM_CG, | ||
4914 | MC_XPB_CLK_GAT, | ||
4915 | ATC_MISC_CG, | ||
4916 | MC_CITF_MISC_WR_CG, | ||
4917 | MC_CITF_MISC_RD_CG, | ||
4918 | MC_CITF_MISC_VM_CG, | ||
4919 | VM_L2_CG, | ||
4920 | }; | ||
4921 | |||
4922 | static void si_enable_mc_ls(struct radeon_device *rdev, | ||
4923 | bool enable) | ||
4924 | { | ||
4925 | int i; | ||
4926 | u32 orig, data; | ||
4927 | |||
4928 | for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) { | ||
4929 | orig = data = RREG32(mc_cg_registers[i]); | ||
4930 | if (enable) | ||
4931 | data |= MC_LS_ENABLE; | ||
4932 | else | ||
4933 | data &= ~MC_LS_ENABLE; | ||
4934 | if (data != orig) | ||
4935 | WREG32(mc_cg_registers[i], data); | ||
4936 | } | ||
4937 | } | ||
4938 | |||
4939 | |||
4940 | static void si_init_cg(struct radeon_device *rdev) | ||
4941 | { | ||
4942 | bool has_uvd = true; | ||
4943 | |||
4944 | si_enable_mgcg(rdev, true); | ||
4945 | si_enable_cgcg(rdev, true); | ||
4946 | /* disable MC LS on Tahiti */ | ||
4947 | if (rdev->family == CHIP_TAHITI) | ||
4948 | si_enable_mc_ls(rdev, false); | ||
4949 | if (has_uvd) { | ||
4950 | si_enable_uvd_mgcg(rdev, true); | ||
4951 | si_init_uvd_internal_cg(rdev); | ||
4952 | } | ||
4953 | } | ||
4954 | |||
4955 | static void si_fini_cg(struct radeon_device *rdev) | ||
4956 | { | ||
4957 | bool has_uvd = true; | ||
4958 | |||
4959 | if (has_uvd) | ||
4960 | si_enable_uvd_mgcg(rdev, false); | ||
4961 | si_enable_cgcg(rdev, false); | ||
4962 | si_enable_mgcg(rdev, false); | ||
4963 | } | ||
4964 | |||
4965 | static void si_init_pg(struct radeon_device *rdev) | ||
4966 | { | ||
4967 | bool has_pg = false; | ||
4968 | |||
4969 | /* only cape verde supports PG */ | ||
4970 | if (rdev->family == CHIP_VERDE) | ||
4971 | has_pg = true; | ||
4972 | |||
4973 | if (has_pg) { | ||
4974 | si_init_ao_cu_mask(rdev); | ||
4975 | si_init_dma_pg(rdev); | ||
4976 | si_enable_dma_pg(rdev, true); | ||
4977 | si_init_gfx_cgpg(rdev); | ||
4978 | si_enable_gfx_cgpg(rdev, true); | ||
4979 | } else { | ||
4980 | WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8); | ||
4981 | WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8); | ||
4982 | } | ||
4983 | } | ||
4984 | |||
4985 | static void si_fini_pg(struct radeon_device *rdev) | ||
4986 | { | ||
4987 | bool has_pg = false; | ||
4988 | |||
4989 | /* only cape verde supports PG */ | ||
4990 | if (rdev->family == CHIP_VERDE) | ||
4991 | has_pg = true; | ||
4992 | |||
4993 | if (has_pg) { | ||
4994 | si_enable_dma_pg(rdev, false); | ||
4995 | si_enable_gfx_cgpg(rdev, false); | ||
4996 | } | ||
4997 | } | ||
4998 | |||
4999 | /* | ||
4556 | * RLC | 5000 | * RLC |
4557 | */ | 5001 | */ |
4558 | void si_rlc_fini(struct radeon_device *rdev) | 5002 | void si_rlc_fini(struct radeon_device *rdev) |
@@ -4715,47 +5159,16 @@ int si_rlc_init(struct radeon_device *rdev) | |||
4715 | return 0; | 5159 | return 0; |
4716 | } | 5160 | } |
4717 | 5161 | ||
4718 | static void si_enable_gui_idle_interrupt(struct radeon_device *rdev, | 5162 | static void si_rlc_reset(struct radeon_device *rdev) |
4719 | bool enable) | ||
4720 | { | 5163 | { |
4721 | u32 tmp = RREG32(CP_INT_CNTL_RING0); | 5164 | u32 tmp = RREG32(GRBM_SOFT_RESET); |
4722 | u32 mask; | ||
4723 | int i; | ||
4724 | |||
4725 | if (enable) | ||
4726 | tmp |= (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); | ||
4727 | else | ||
4728 | tmp &= ~(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); | ||
4729 | WREG32(CP_INT_CNTL_RING0, tmp); | ||
4730 | |||
4731 | if (!enable) { | ||
4732 | /* read a gfx register */ | ||
4733 | tmp = RREG32(DB_DEPTH_INFO); | ||
4734 | 5165 | ||
4735 | mask = RLC_BUSY_STATUS | GFX_POWER_STATUS | GFX_CLOCK_STATUS | GFX_LS_STATUS; | 5166 | tmp |= SOFT_RESET_RLC; |
4736 | for (i = 0; i < rdev->usec_timeout; i++) { | 5167 | WREG32(GRBM_SOFT_RESET, tmp); |
4737 | if ((RREG32(RLC_STAT) & mask) == (GFX_CLOCK_STATUS | GFX_POWER_STATUS)) | 5168 | udelay(50); |
4738 | break; | 5169 | tmp &= ~SOFT_RESET_RLC; |
4739 | udelay(1); | 5170 | WREG32(GRBM_SOFT_RESET, tmp); |
4740 | } | 5171 | udelay(50); |
4741 | } | ||
4742 | } | ||
4743 | |||
4744 | static void si_wait_for_rlc_serdes(struct radeon_device *rdev) | ||
4745 | { | ||
4746 | int i; | ||
4747 | |||
4748 | for (i = 0; i < rdev->usec_timeout; i++) { | ||
4749 | if (RREG32(RLC_SERDES_MASTER_BUSY_0) == 0) | ||
4750 | break; | ||
4751 | udelay(1); | ||
4752 | } | ||
4753 | |||
4754 | for (i = 0; i < rdev->usec_timeout; i++) { | ||
4755 | if (RREG32(RLC_SERDES_MASTER_BUSY_1) == 0) | ||
4756 | break; | ||
4757 | udelay(1); | ||
4758 | } | ||
4759 | } | 5172 | } |
4760 | 5173 | ||
4761 | static void si_rlc_stop(struct radeon_device *rdev) | 5174 | static void si_rlc_stop(struct radeon_device *rdev) |
@@ -4814,6 +5227,12 @@ static int si_rlc_resume(struct radeon_device *rdev) | |||
4814 | 5227 | ||
4815 | si_rlc_stop(rdev); | 5228 | si_rlc_stop(rdev); |
4816 | 5229 | ||
5230 | si_rlc_reset(rdev); | ||
5231 | |||
5232 | si_init_pg(rdev); | ||
5233 | |||
5234 | si_init_cg(rdev); | ||
5235 | |||
4817 | WREG32(RLC_RL_BASE, 0); | 5236 | WREG32(RLC_RL_BASE, 0); |
4818 | WREG32(RLC_RL_SIZE, 0); | 5237 | WREG32(RLC_RL_SIZE, 0); |
4819 | WREG32(RLC_LB_CNTL, 0); | 5238 | WREG32(RLC_LB_CNTL, 0); |
@@ -4821,9 +5240,6 @@ static int si_rlc_resume(struct radeon_device *rdev) | |||
4821 | WREG32(RLC_LB_CNTR_INIT, 0); | 5240 | WREG32(RLC_LB_CNTR_INIT, 0); |
4822 | WREG32(RLC_LB_INIT_CU_MASK, 0xffffffff); | 5241 | WREG32(RLC_LB_INIT_CU_MASK, 0xffffffff); |
4823 | 5242 | ||
4824 | WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8); | ||
4825 | WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8); | ||
4826 | |||
4827 | WREG32(RLC_MC_CNTL, 0); | 5243 | WREG32(RLC_MC_CNTL, 0); |
4828 | WREG32(RLC_UCODE_CNTL, 0); | 5244 | WREG32(RLC_UCODE_CNTL, 0); |
4829 | 5245 | ||
@@ -6041,6 +6457,8 @@ void si_fini(struct radeon_device *rdev) | |||
6041 | cayman_dma_fini(rdev); | 6457 | cayman_dma_fini(rdev); |
6042 | si_irq_fini(rdev); | 6458 | si_irq_fini(rdev); |
6043 | si_rlc_fini(rdev); | 6459 | si_rlc_fini(rdev); |
6460 | si_fini_cg(rdev); | ||
6461 | si_fini_pg(rdev); | ||
6044 | radeon_wb_fini(rdev); | 6462 | radeon_wb_fini(rdev); |
6045 | radeon_vm_manager_fini(rdev); | 6463 | radeon_vm_manager_fini(rdev); |
6046 | radeon_ib_pool_fini(rdev); | 6464 | radeon_ib_pool_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h index 8786b6c93c67..17210ec36c02 100644 --- a/drivers/gpu/drm/radeon/sid.h +++ b/drivers/gpu/drm/radeon/sid.h | |||
@@ -30,6 +30,12 @@ | |||
30 | #define VERDE_GB_ADDR_CONFIG_GOLDEN 0x12010002 | 30 | #define VERDE_GB_ADDR_CONFIG_GOLDEN 0x12010002 |
31 | #define HAINAN_GB_ADDR_CONFIG_GOLDEN 0x02010001 | 31 | #define HAINAN_GB_ADDR_CONFIG_GOLDEN 0x02010001 |
32 | 32 | ||
33 | /* CG IND registers are accessed via SMC indirect space + SMC_CG_IND_START */ | ||
34 | #define SMC_CG_IND_START 0xc0030000 | ||
35 | |||
36 | #define CG_CGTT_LOCAL_0 0x400 | ||
37 | #define CG_CGTT_LOCAL_1 0x401 | ||
38 | |||
33 | /* discrete uvd clocks */ | 39 | /* discrete uvd clocks */ |
34 | #define CG_UPLL_FUNC_CNTL 0x634 | 40 | #define CG_UPLL_FUNC_CNTL 0x634 |
35 | # define UPLL_RESET_MASK 0x00000001 | 41 | # define UPLL_RESET_MASK 0x00000001 |
@@ -224,6 +230,10 @@ | |||
224 | #define VM_CONTEXT0_PAGE_TABLE_END_ADDR 0x157C | 230 | #define VM_CONTEXT0_PAGE_TABLE_END_ADDR 0x157C |
225 | #define VM_CONTEXT1_PAGE_TABLE_END_ADDR 0x1580 | 231 | #define VM_CONTEXT1_PAGE_TABLE_END_ADDR 0x1580 |
226 | 232 | ||
233 | #define VM_L2_CG 0x15c0 | ||
234 | #define MC_CG_ENABLE (1 << 18) | ||
235 | #define MC_LS_ENABLE (1 << 19) | ||
236 | |||
227 | #define MC_SHARED_CHMAP 0x2004 | 237 | #define MC_SHARED_CHMAP 0x2004 |
228 | #define NOOFCHAN_SHIFT 12 | 238 | #define NOOFCHAN_SHIFT 12 |
229 | #define NOOFCHAN_MASK 0x0000f000 | 239 | #define NOOFCHAN_MASK 0x0000f000 |
@@ -249,6 +259,17 @@ | |||
249 | 259 | ||
250 | #define MC_SHARED_BLACKOUT_CNTL 0x20ac | 260 | #define MC_SHARED_BLACKOUT_CNTL 0x20ac |
251 | 261 | ||
262 | #define MC_HUB_MISC_HUB_CG 0x20b8 | ||
263 | #define MC_HUB_MISC_VM_CG 0x20bc | ||
264 | |||
265 | #define MC_HUB_MISC_SIP_CG 0x20c0 | ||
266 | |||
267 | #define MC_XPB_CLK_GAT 0x2478 | ||
268 | |||
269 | #define MC_CITF_MISC_RD_CG 0x2648 | ||
270 | #define MC_CITF_MISC_WR_CG 0x264c | ||
271 | #define MC_CITF_MISC_VM_CG 0x2650 | ||
272 | |||
252 | #define MC_ARB_RAMCFG 0x2760 | 273 | #define MC_ARB_RAMCFG 0x2760 |
253 | #define NOOFBANK_SHIFT 0 | 274 | #define NOOFBANK_SHIFT 0 |
254 | #define NOOFBANK_MASK 0x00000003 | 275 | #define NOOFBANK_MASK 0x00000003 |
@@ -289,6 +310,8 @@ | |||
289 | #define HDP_MISC_CNTL 0x2F4C | 310 | #define HDP_MISC_CNTL 0x2F4C |
290 | #define HDP_FLUSH_INVALIDATE_CACHE (1 << 0) | 311 | #define HDP_FLUSH_INVALIDATE_CACHE (1 << 0) |
291 | 312 | ||
313 | #define ATC_MISC_CG 0x3350 | ||
314 | |||
292 | #define IH_RB_CNTL 0x3e00 | 315 | #define IH_RB_CNTL 0x3e00 |
293 | # define IH_RB_ENABLE (1 << 0) | 316 | # define IH_RB_ENABLE (1 << 0) |
294 | # define IH_IB_SIZE(x) ((x) << 1) /* log2 */ | 317 | # define IH_IB_SIZE(x) ((x) << 1) /* log2 */ |
@@ -639,6 +662,9 @@ | |||
639 | #define CGTS_USER_TCC_DISABLE 0x914C | 662 | #define CGTS_USER_TCC_DISABLE 0x914C |
640 | #define TCC_DISABLE_MASK 0xFFFF0000 | 663 | #define TCC_DISABLE_MASK 0xFFFF0000 |
641 | #define TCC_DISABLE_SHIFT 16 | 664 | #define TCC_DISABLE_SHIFT 16 |
665 | #define CGTS_SM_CTRL_REG 0x9150 | ||
666 | #define OVERRIDE (1 << 21) | ||
667 | #define LS_OVERRIDE (1 << 22) | ||
642 | 668 | ||
643 | #define SPI_LB_CU_MASK 0x9354 | 669 | #define SPI_LB_CU_MASK 0x9354 |
644 | 670 | ||
@@ -730,6 +756,8 @@ | |||
730 | #define CB_PERFCOUNTER3_SELECT0 0x9a38 | 756 | #define CB_PERFCOUNTER3_SELECT0 0x9a38 |
731 | #define CB_PERFCOUNTER3_SELECT1 0x9a3c | 757 | #define CB_PERFCOUNTER3_SELECT1 0x9a3c |
732 | 758 | ||
759 | #define CB_CGTT_SCLK_CTRL 0x9a60 | ||
760 | |||
733 | #define GC_USER_RB_BACKEND_DISABLE 0x9B7C | 761 | #define GC_USER_RB_BACKEND_DISABLE 0x9B7C |
734 | #define BACKEND_DISABLE_MASK 0x00FF0000 | 762 | #define BACKEND_DISABLE_MASK 0x00FF0000 |
735 | #define BACKEND_DISABLE_SHIFT 16 | 763 | #define BACKEND_DISABLE_SHIFT 16 |
@@ -787,6 +815,9 @@ | |||
787 | # define CP_RINGID1_INT_STAT (1 << 30) | 815 | # define CP_RINGID1_INT_STAT (1 << 30) |
788 | # define CP_RINGID0_INT_STAT (1 << 31) | 816 | # define CP_RINGID0_INT_STAT (1 << 31) |
789 | 817 | ||
818 | #define CP_MEM_SLP_CNTL 0xC1E4 | ||
819 | # define CP_MEM_LS_EN (1 << 0) | ||
820 | |||
790 | #define CP_DEBUG 0xC1FC | 821 | #define CP_DEBUG 0xC1FC |
791 | 822 | ||
792 | #define RLC_CNTL 0xC300 | 823 | #define RLC_CNTL 0xC300 |
@@ -815,11 +846,49 @@ | |||
815 | # define GFX_CLOCK_STATUS (1 << 2) | 846 | # define GFX_CLOCK_STATUS (1 << 2) |
816 | # define GFX_LS_STATUS (1 << 3) | 847 | # define GFX_LS_STATUS (1 << 3) |
817 | 848 | ||
849 | #define RLC_PG_CNTL 0xC35C | ||
850 | # define GFX_PG_ENABLE (1 << 0) | ||
851 | # define GFX_PG_SRC (1 << 1) | ||
852 | |||
853 | #define RLC_CGTT_MGCG_OVERRIDE 0xC400 | ||
854 | #define RLC_CGCG_CGLS_CTRL 0xC404 | ||
855 | # define CGCG_EN (1 << 0) | ||
856 | # define CGLS_EN (1 << 1) | ||
857 | |||
858 | #define RLC_TTOP_D 0xC414 | ||
859 | # define RLC_PUD(x) ((x) << 0) | ||
860 | # define RLC_PUD_MASK (0xff << 0) | ||
861 | # define RLC_PDD(x) ((x) << 8) | ||
862 | # define RLC_PDD_MASK (0xff << 8) | ||
863 | # define RLC_TTPD(x) ((x) << 16) | ||
864 | # define RLC_TTPD_MASK (0xff << 16) | ||
865 | # define RLC_MSD(x) ((x) << 24) | ||
866 | # define RLC_MSD_MASK (0xff << 24) | ||
867 | |||
818 | #define RLC_LB_INIT_CU_MASK 0xC41C | 868 | #define RLC_LB_INIT_CU_MASK 0xC41C |
819 | 869 | ||
870 | #define RLC_PG_AO_CU_MASK 0xC42C | ||
871 | #define RLC_MAX_PG_CU 0xC430 | ||
872 | # define MAX_PU_CU(x) ((x) << 0) | ||
873 | # define MAX_PU_CU_MASK (0xff << 0) | ||
874 | #define RLC_AUTO_PG_CTRL 0xC434 | ||
875 | # define AUTO_PG_EN (1 << 0) | ||
876 | # define GRBM_REG_SGIT(x) ((x) << 3) | ||
877 | # define GRBM_REG_SGIT_MASK (0xffff << 3) | ||
878 | # define PG_AFTER_GRBM_REG_ST(x) ((x) << 19) | ||
879 | # define PG_AFTER_GRBM_REG_ST_MASK (0x1fff << 19) | ||
880 | |||
881 | #define RLC_SERDES_WR_MASTER_MASK_0 0xC454 | ||
882 | #define RLC_SERDES_WR_MASTER_MASK_1 0xC458 | ||
883 | #define RLC_SERDES_WR_CTRL 0xC45C | ||
884 | |||
820 | #define RLC_SERDES_MASTER_BUSY_0 0xC464 | 885 | #define RLC_SERDES_MASTER_BUSY_0 0xC464 |
821 | #define RLC_SERDES_MASTER_BUSY_1 0xC468 | 886 | #define RLC_SERDES_MASTER_BUSY_1 0xC468 |
822 | 887 | ||
888 | #define RLC_GCPM_GENERAL_3 0xC478 | ||
889 | |||
890 | #define DB_RENDER_CONTROL 0x28000 | ||
891 | |||
823 | #define DB_DEPTH_INFO 0x2803c | 892 | #define DB_DEPTH_INFO 0x2803c |
824 | 893 | ||
825 | #define PA_SC_RASTER_CONFIG 0x28350 | 894 | #define PA_SC_RASTER_CONFIG 0x28350 |
@@ -1016,6 +1085,21 @@ | |||
1016 | #define UVD_RBC_RB_RPTR 0xF690 | 1085 | #define UVD_RBC_RB_RPTR 0xF690 |
1017 | #define UVD_RBC_RB_WPTR 0xF694 | 1086 | #define UVD_RBC_RB_WPTR 0xF694 |
1018 | 1087 | ||
1088 | #define UVD_CGC_CTRL 0xF4B0 | ||
1089 | # define DCM (1 << 0) | ||
1090 | # define CG_DT(x) ((x) << 2) | ||
1091 | # define CG_DT_MASK (0xf << 2) | ||
1092 | # define CLK_OD(x) ((x) << 6) | ||
1093 | # define CLK_OD_MASK (0x1f << 6) | ||
1094 | |||
1095 | /* UVD CTX indirect */ | ||
1096 | #define UVD_CGC_MEM_CTRL 0xC0 | ||
1097 | #define UVD_CGC_CTRL2 0xC1 | ||
1098 | # define DYN_OR_EN (1 << 0) | ||
1099 | # define DYN_RR_EN (1 << 1) | ||
1100 | # define G_DIV_ID(x) ((x) << 2) | ||
1101 | # define G_DIV_ID_MASK (0x7 << 2) | ||
1102 | |||
1019 | /* | 1103 | /* |
1020 | * PM4 | 1104 | * PM4 |
1021 | */ | 1105 | */ |
@@ -1260,6 +1344,11 @@ | |||
1260 | # define DMA_IDLE (1 << 0) | 1344 | # define DMA_IDLE (1 << 0) |
1261 | #define DMA_TILING_CONFIG 0xd0b8 | 1345 | #define DMA_TILING_CONFIG 0xd0b8 |
1262 | 1346 | ||
1347 | #define DMA_PG 0xd0d4 | ||
1348 | # define PG_CNTL_ENABLE (1 << 0) | ||
1349 | #define DMA_PGFSM_CONFIG 0xd0d8 | ||
1350 | #define DMA_PGFSM_WRITE 0xd0dc | ||
1351 | |||
1263 | #define DMA_PACKET(cmd, b, t, s, n) ((((cmd) & 0xF) << 28) | \ | 1352 | #define DMA_PACKET(cmd, b, t, s, n) ((((cmd) & 0xF) << 28) | \ |
1264 | (((b) & 0x1) << 26) | \ | 1353 | (((b) & 0x1) << 26) | \ |
1265 | (((t) & 0x1) << 23) | \ | 1354 | (((t) & 0x1) << 23) | \ |