diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_agp.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_agp.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_agp.c b/drivers/gpu/drm/radeon/radeon_agp.c index 54bf49a6d676..28e473f1f56f 100644 --- a/drivers/gpu/drm/radeon/radeon_agp.c +++ b/drivers/gpu/drm/radeon/radeon_agp.c | |||
@@ -134,19 +134,27 @@ int radeon_agp_init(struct radeon_device *rdev) | |||
134 | int ret; | 134 | int ret; |
135 | 135 | ||
136 | /* Acquire AGP. */ | 136 | /* Acquire AGP. */ |
137 | if (!rdev->ddev->agp->acquired) { | 137 | ret = drm_agp_acquire(rdev->ddev); |
138 | ret = drm_agp_acquire(rdev->ddev); | 138 | if (ret) { |
139 | if (ret) { | 139 | DRM_ERROR("Unable to acquire AGP: %d\n", ret); |
140 | DRM_ERROR("Unable to acquire AGP: %d\n", ret); | 140 | return ret; |
141 | return ret; | ||
142 | } | ||
143 | } | 141 | } |
144 | 142 | ||
145 | ret = drm_agp_info(rdev->ddev, &info); | 143 | ret = drm_agp_info(rdev->ddev, &info); |
146 | if (ret) { | 144 | if (ret) { |
145 | drm_agp_release(rdev->ddev); | ||
147 | DRM_ERROR("Unable to get AGP info: %d\n", ret); | 146 | DRM_ERROR("Unable to get AGP info: %d\n", ret); |
148 | return ret; | 147 | return ret; |
149 | } | 148 | } |
149 | |||
150 | if (rdev->ddev->agp->agp_info.aper_size < 32) { | ||
151 | drm_agp_release(rdev->ddev); | ||
152 | dev_warn(rdev->dev, "AGP aperture too small (%zuM) " | ||
153 | "need at least 32M, disabling AGP\n", | ||
154 | rdev->ddev->agp->agp_info.aper_size); | ||
155 | return -EINVAL; | ||
156 | } | ||
157 | |||
150 | mode.mode = info.mode; | 158 | mode.mode = info.mode; |
151 | agp_status = (RREG32(RADEON_AGP_STATUS) | RADEON_AGPv3_MODE) & mode.mode; | 159 | agp_status = (RREG32(RADEON_AGP_STATUS) | RADEON_AGPv3_MODE) & mode.mode; |
152 | is_v3 = !!(agp_status & RADEON_AGPv3_MODE); | 160 | is_v3 = !!(agp_status & RADEON_AGPv3_MODE); |
@@ -221,11 +229,16 @@ int radeon_agp_init(struct radeon_device *rdev) | |||
221 | ret = drm_agp_enable(rdev->ddev, mode); | 229 | ret = drm_agp_enable(rdev->ddev, mode); |
222 | if (ret) { | 230 | if (ret) { |
223 | DRM_ERROR("Unable to enable AGP (mode = 0x%lx)\n", mode.mode); | 231 | DRM_ERROR("Unable to enable AGP (mode = 0x%lx)\n", mode.mode); |
232 | drm_agp_release(rdev->ddev); | ||
224 | return ret; | 233 | return ret; |
225 | } | 234 | } |
226 | 235 | ||
227 | rdev->mc.agp_base = rdev->ddev->agp->agp_info.aper_base; | 236 | rdev->mc.agp_base = rdev->ddev->agp->agp_info.aper_base; |
228 | rdev->mc.gtt_size = rdev->ddev->agp->agp_info.aper_size << 20; | 237 | rdev->mc.gtt_size = rdev->ddev->agp->agp_info.aper_size << 20; |
238 | rdev->mc.gtt_start = rdev->mc.agp_base; | ||
239 | rdev->mc.gtt_end = rdev->mc.gtt_start + rdev->mc.gtt_size - 1; | ||
240 | dev_info(rdev->dev, "GTT: %lluM 0x%08llX - 0x%08llX\n", | ||
241 | rdev->mc.gtt_size >> 20, rdev->mc.gtt_start, rdev->mc.gtt_end); | ||
229 | 242 | ||
230 | /* workaround some hw issues */ | 243 | /* workaround some hw issues */ |
231 | if (rdev->family < CHIP_R200) { | 244 | if (rdev->family < CHIP_R200) { |
@@ -252,10 +265,8 @@ void radeon_agp_resume(struct radeon_device *rdev) | |||
252 | void radeon_agp_fini(struct radeon_device *rdev) | 265 | void radeon_agp_fini(struct radeon_device *rdev) |
253 | { | 266 | { |
254 | #if __OS_HAS_AGP | 267 | #if __OS_HAS_AGP |
255 | if (rdev->flags & RADEON_IS_AGP) { | 268 | if (rdev->ddev->agp && rdev->ddev->agp->acquired) { |
256 | if (rdev->ddev->agp && rdev->ddev->agp->acquired) { | 269 | drm_agp_release(rdev->ddev); |
257 | drm_agp_release(rdev->ddev); | ||
258 | } | ||
259 | } | 270 | } |
260 | #endif | 271 | #endif |
261 | } | 272 | } |