aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/evergreen.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2011-01-04 17:31:08 -0500
committerDave Airlie <airlied@redhat.com>2011-01-04 17:31:08 -0500
commit4f125010d2d02c481a0fdf5aee23a9f937bc5de1 (patch)
treedcdcd2ba1d0bb980b57ced9a1b2b5b17c84c8f57 /drivers/gpu/drm/radeon/evergreen.c
parent204663c48711ddceee09df46269cd34d49d1f7be (diff)
parent989d873fc5b6a96695b97738dea8d9f02a60f8ab (diff)
Merge branch 'master' of /home/airlied/kernel/linux-2.6 into drm-core-next
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen.c')
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 499122c8ccc9..ec641ce64764 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -811,6 +811,8 @@ void evergreen_pcie_gart_tlb_flush(struct radeon_device *rdev)
811 unsigned i; 811 unsigned i;
812 u32 tmp; 812 u32 tmp;
813 813
814 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
815
814 WREG32(VM_CONTEXT0_REQUEST_RESPONSE, REQUEST_TYPE(1)); 816 WREG32(VM_CONTEXT0_REQUEST_RESPONSE, REQUEST_TYPE(1));
815 for (i = 0; i < rdev->usec_timeout; i++) { 817 for (i = 0; i < rdev->usec_timeout; i++) {
816 /* read MC_STATUS */ 818 /* read MC_STATUS */
@@ -2090,7 +2092,6 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev)
2090static int evergreen_gpu_soft_reset(struct radeon_device *rdev) 2092static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
2091{ 2093{
2092 struct evergreen_mc_save save; 2094 struct evergreen_mc_save save;
2093 u32 srbm_reset = 0;
2094 u32 grbm_reset = 0; 2095 u32 grbm_reset = 0;
2095 2096
2096 dev_info(rdev->dev, "GPU softreset \n"); 2097 dev_info(rdev->dev, "GPU softreset \n");
@@ -2129,16 +2130,6 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
2129 udelay(50); 2130 udelay(50);
2130 WREG32(GRBM_SOFT_RESET, 0); 2131 WREG32(GRBM_SOFT_RESET, 0);
2131 (void)RREG32(GRBM_SOFT_RESET); 2132 (void)RREG32(GRBM_SOFT_RESET);
2132
2133 /* reset all the system blocks */
2134 srbm_reset = SRBM_SOFT_RESET_ALL_MASK;
2135
2136 dev_info(rdev->dev, " SRBM_SOFT_RESET=0x%08X\n", srbm_reset);
2137 WREG32(SRBM_SOFT_RESET, srbm_reset);
2138 (void)RREG32(SRBM_SOFT_RESET);
2139 udelay(50);
2140 WREG32(SRBM_SOFT_RESET, 0);
2141 (void)RREG32(SRBM_SOFT_RESET);
2142 /* Wait a little for things to settle down */ 2133 /* Wait a little for things to settle down */
2143 udelay(50); 2134 udelay(50);
2144 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", 2135 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
@@ -2149,10 +2140,6 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
2149 RREG32(GRBM_STATUS_SE1)); 2140 RREG32(GRBM_STATUS_SE1));
2150 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", 2141 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
2151 RREG32(SRBM_STATUS)); 2142 RREG32(SRBM_STATUS));
2152 /* After reset we need to reinit the asic as GPU often endup in an
2153 * incoherent state.
2154 */
2155 atom_asic_init(rdev->mode_info.atom_context);
2156 evergreen_mc_resume(rdev, &save); 2143 evergreen_mc_resume(rdev, &save);
2157 return 0; 2144 return 0;
2158} 2145}
@@ -2819,6 +2806,11 @@ int evergreen_resume(struct radeon_device *rdev)
2819{ 2806{
2820 int r; 2807 int r;
2821 2808
2809 /* reset the asic, the gfx blocks are often in a bad state
2810 * after the driver is unloaded or after a resume
2811 */
2812 if (radeon_asic_reset(rdev))
2813 dev_warn(rdev->dev, "GPU reset failed !\n");
2822 /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, 2814 /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
2823 * posting will perform necessary task to bring back GPU into good 2815 * posting will perform necessary task to bring back GPU into good
2824 * shape. 2816 * shape.
@@ -2939,6 +2931,11 @@ int evergreen_init(struct radeon_device *rdev)
2939 r = radeon_atombios_init(rdev); 2931 r = radeon_atombios_init(rdev);
2940 if (r) 2932 if (r)
2941 return r; 2933 return r;
2934 /* reset the asic, the gfx blocks are often in a bad state
2935 * after the driver is unloaded or after a resume
2936 */
2937 if (radeon_asic_reset(rdev))
2938 dev_warn(rdev->dev, "GPU reset failed !\n");
2942 /* Post card if necessary */ 2939 /* Post card if necessary */
2943 if (!evergreen_card_posted(rdev)) { 2940 if (!evergreen_card_posted(rdev)) {
2944 if (!rdev->bios) { 2941 if (!rdev->bios) {