diff options
author | Dave Airlie <airlied@redhat.com> | 2011-01-04 17:31:08 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-01-04 17:31:08 -0500 |
commit | 4f125010d2d02c481a0fdf5aee23a9f937bc5de1 (patch) | |
tree | dcdcd2ba1d0bb980b57ced9a1b2b5b17c84c8f57 /drivers/gpu/drm/radeon/evergreen.c | |
parent | 204663c48711ddceee09df46269cd34d49d1f7be (diff) | |
parent | 989d873fc5b6a96695b97738dea8d9f02a60f8ab (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.c | 27 |
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) | |||
2090 | static int evergreen_gpu_soft_reset(struct radeon_device *rdev) | 2092 | static 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) { |