Rev 1990 | Rev 2005 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1990 | Rev 2004 | ||
---|---|---|---|
Line 195... | Line 195... | ||
195 | return; |
195 | return; |
196 | } |
196 | } |
197 | } |
197 | } |
198 | } |
198 | } |
Line -... | Line 199... | ||
- | 199 | ||
- | 200 | void radeon_wb_disable(struct radeon_device *rdev) |
|
- | 201 | { |
|
- | 202 | int r; |
|
- | 203 | ||
- | 204 | if (rdev->wb.wb_obj) { |
|
- | 205 | r = radeon_bo_reserve(rdev->wb.wb_obj, false); |
|
- | 206 | if (unlikely(r != 0)) |
|
- | 207 | return; |
|
- | 208 | radeon_bo_kunmap(rdev->wb.wb_obj); |
|
- | 209 | radeon_bo_unpin(rdev->wb.wb_obj); |
|
- | 210 | radeon_bo_unreserve(rdev->wb.wb_obj); |
|
- | 211 | } |
|
- | 212 | rdev->wb.enabled = false; |
|
- | 213 | } |
|
- | 214 | ||
- | 215 | void radeon_wb_fini(struct radeon_device *rdev) |
|
- | 216 | { |
|
- | 217 | radeon_wb_disable(rdev); |
|
- | 218 | if (rdev->wb.wb_obj) { |
|
- | 219 | radeon_bo_unref(&rdev->wb.wb_obj); |
|
- | 220 | rdev->wb.wb = NULL; |
|
- | 221 | rdev->wb.wb_obj = NULL; |
|
- | 222 | } |
|
- | 223 | } |
|
- | 224 | ||
- | 225 | int radeon_wb_init(struct radeon_device *rdev) |
|
- | 226 | { |
|
- | 227 | int r; |
|
- | 228 | ||
- | 229 | if (rdev->wb.wb_obj == NULL) { |
|
- | 230 | r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true, |
|
- | 231 | RADEON_GEM_DOMAIN_GTT, &rdev->wb.wb_obj); |
|
- | 232 | if (r) { |
|
- | 233 | dev_warn(rdev->dev, "(%d) create WB bo failed\n", r); |
|
- | 234 | return r; |
|
- | 235 | } |
|
- | 236 | } |
|
- | 237 | r = radeon_bo_reserve(rdev->wb.wb_obj, false); |
|
- | 238 | if (unlikely(r != 0)) { |
|
- | 239 | radeon_wb_fini(rdev); |
|
- | 240 | return r; |
|
- | 241 | } |
|
- | 242 | r = radeon_bo_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT, |
|
- | 243 | &rdev->wb.gpu_addr); |
|
- | 244 | if (r) { |
|
- | 245 | radeon_bo_unreserve(rdev->wb.wb_obj); |
|
- | 246 | dev_warn(rdev->dev, "(%d) pin WB bo failed\n", r); |
|
- | 247 | radeon_wb_fini(rdev); |
|
- | 248 | return r; |
|
- | 249 | } |
|
- | 250 | r = radeon_bo_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb); |
|
- | 251 | radeon_bo_unreserve(rdev->wb.wb_obj); |
|
- | 252 | if (r) { |
|
- | 253 | dev_warn(rdev->dev, "(%d) map WB bo failed\n", r); |
|
- | 254 | radeon_wb_fini(rdev); |
|
- | 255 | return r; |
|
- | 256 | } |
|
- | 257 | ||
- | 258 | /* clear wb memory */ |
|
- | 259 | memset((char *)rdev->wb.wb, 0, RADEON_GPU_PAGE_SIZE); |
|
- | 260 | /* disable event_write fences */ |
|
- | 261 | rdev->wb.use_event = false; |
|
- | 262 | /* disabled via module param */ |
|
- | 263 | if (radeon_no_wb == 1) |
|
- | 264 | rdev->wb.enabled = false; |
|
- | 265 | else { |
|
- | 266 | /* often unreliable on AGP */ |
|
- | 267 | // if (rdev->flags & RADEON_IS_AGP) { |
|
- | 268 | // rdev->wb.enabled = false; |
|
- | 269 | // } else { |
|
- | 270 | rdev->wb.enabled = true; |
|
- | 271 | /* event_write fences are only available on r600+ */ |
|
- | 272 | if (rdev->family >= CHIP_R600) |
|
- | 273 | rdev->wb.use_event = true; |
|
- | 274 | // } |
|
- | 275 | } |
|
- | 276 | /* always use writeback/events on NI */ |
|
- | 277 | if (ASIC_IS_DCE5(rdev)) { |
|
- | 278 | rdev->wb.enabled = true; |
|
- | 279 | rdev->wb.use_event = true; |
|
- | 280 | } |
|
- | 281 | ||
- | 282 | dev_info(rdev->dev, "WB %sabled\n", rdev->wb.enabled ? "en" : "dis"); |
|
- | 283 | ||
- | 284 | return 0; |
|
- | 285 | } |
|
199 | 286 | ||
200 | /** |
287 | /** |
201 | * radeon_vram_location - try to find VRAM location |
288 | * radeon_vram_location - try to find VRAM location |
202 | * @rdev: radeon device structure holding all necessary informations |
289 | * @rdev: radeon device structure holding all necessary informations |
203 | * @mc: memory controller structure holding memory informations |
290 | * @mc: memory controller structure holding memory informations |