.. | .. |
---|
25 | 25 | * |
---|
26 | 26 | **************************************************************************/ |
---|
27 | 27 | |
---|
| 28 | +#include <linux/highmem.h> |
---|
| 29 | + |
---|
28 | 30 | #include "vmwgfx_drv.h" |
---|
29 | 31 | |
---|
30 | 32 | /* |
---|
.. | .. |
---|
146 | 148 | mob->pt_level += VMW_MOBFMT_PTDEPTH_1 - SVGA3D_MOBFMT_PTDEPTH_1; |
---|
147 | 149 | } |
---|
148 | 150 | |
---|
149 | | - cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
---|
| 151 | + cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd)); |
---|
150 | 152 | if (unlikely(cmd == NULL)) { |
---|
151 | | - DRM_ERROR("Failed reserving FIFO space for OTable setup.\n"); |
---|
152 | 153 | ret = -ENOMEM; |
---|
153 | 154 | goto out_no_fifo; |
---|
154 | 155 | } |
---|
.. | .. |
---|
202 | 203 | return; |
---|
203 | 204 | |
---|
204 | 205 | bo = otable->page_table->pt_bo; |
---|
205 | | - cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
---|
206 | | - if (unlikely(cmd == NULL)) { |
---|
207 | | - DRM_ERROR("Failed reserving FIFO space for OTable " |
---|
208 | | - "takedown.\n"); |
---|
| 206 | + cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd)); |
---|
| 207 | + if (unlikely(cmd == NULL)) |
---|
209 | 208 | return; |
---|
210 | | - } |
---|
211 | 209 | |
---|
212 | 210 | memset(cmd, 0, sizeof(*cmd)); |
---|
213 | 211 | cmd->header.id = SVGA_3D_CMD_SET_OTABLE_BASE; |
---|
.. | .. |
---|
240 | 238 | unsigned long offset; |
---|
241 | 239 | unsigned long bo_size; |
---|
242 | 240 | struct vmw_otable *otables = batch->otables; |
---|
243 | | - struct ttm_operation_ctx ctx = { |
---|
244 | | - .interruptible = false, |
---|
245 | | - .no_wait_gpu = false |
---|
246 | | - }; |
---|
247 | 241 | SVGAOTableType i; |
---|
248 | 242 | int ret; |
---|
249 | 243 | |
---|
.. | .. |
---|
257 | 251 | bo_size += otables[i].size; |
---|
258 | 252 | } |
---|
259 | 253 | |
---|
260 | | - ret = ttm_bo_create(&dev_priv->bdev, bo_size, |
---|
261 | | - ttm_bo_type_device, |
---|
262 | | - &vmw_sys_ne_placement, |
---|
263 | | - 0, false, &batch->otable_bo); |
---|
264 | | - |
---|
| 254 | + ret = vmw_bo_create_and_populate(dev_priv, bo_size, &batch->otable_bo); |
---|
265 | 255 | if (unlikely(ret != 0)) |
---|
266 | | - goto out_no_bo; |
---|
267 | | - |
---|
268 | | - ret = ttm_bo_reserve(batch->otable_bo, false, true, NULL); |
---|
269 | | - BUG_ON(ret != 0); |
---|
270 | | - ret = vmw_bo_driver.ttm_tt_populate(batch->otable_bo->ttm, &ctx); |
---|
271 | | - if (unlikely(ret != 0)) |
---|
272 | | - goto out_unreserve; |
---|
273 | | - ret = vmw_bo_map_dma(batch->otable_bo); |
---|
274 | | - if (unlikely(ret != 0)) |
---|
275 | | - goto out_unreserve; |
---|
276 | | - |
---|
277 | | - ttm_bo_unreserve(batch->otable_bo); |
---|
| 256 | + return ret; |
---|
278 | 257 | |
---|
279 | 258 | offset = 0; |
---|
280 | 259 | for (i = 0; i < batch->num_otables; ++i) { |
---|
.. | .. |
---|
291 | 270 | |
---|
292 | 271 | return 0; |
---|
293 | 272 | |
---|
294 | | -out_unreserve: |
---|
295 | | - ttm_bo_unreserve(batch->otable_bo); |
---|
296 | 273 | out_no_setup: |
---|
297 | 274 | for (i = 0; i < batch->num_otables; ++i) { |
---|
298 | 275 | if (batch->otables[i].enabled) |
---|
.. | .. |
---|
300 | 277 | &batch->otables[i]); |
---|
301 | 278 | } |
---|
302 | 279 | |
---|
303 | | - ttm_bo_unref(&batch->otable_bo); |
---|
304 | | -out_no_bo: |
---|
| 280 | + ttm_bo_put(batch->otable_bo); |
---|
| 281 | + batch->otable_bo = NULL; |
---|
305 | 282 | return ret; |
---|
306 | 283 | } |
---|
307 | 284 | |
---|
.. | .. |
---|
321 | 298 | struct vmw_otable **otables = &dev_priv->otable_batch.otables; |
---|
322 | 299 | int ret; |
---|
323 | 300 | |
---|
324 | | - if (dev_priv->has_dx) { |
---|
| 301 | + if (has_sm4_context(dev_priv)) { |
---|
325 | 302 | *otables = kmemdup(dx_tables, sizeof(dx_tables), GFP_KERNEL); |
---|
326 | 303 | if (!(*otables)) |
---|
327 | 304 | return -ENOMEM; |
---|
.. | .. |
---|
365 | 342 | vmw_bo_fence_single(bo, NULL); |
---|
366 | 343 | ttm_bo_unreserve(bo); |
---|
367 | 344 | |
---|
368 | | - ttm_bo_unref(&batch->otable_bo); |
---|
| 345 | + ttm_bo_put(batch->otable_bo); |
---|
| 346 | + batch->otable_bo = NULL; |
---|
369 | 347 | } |
---|
370 | 348 | |
---|
371 | 349 | /* |
---|
.. | .. |
---|
432 | 410 | static int vmw_mob_pt_populate(struct vmw_private *dev_priv, |
---|
433 | 411 | struct vmw_mob *mob) |
---|
434 | 412 | { |
---|
435 | | - int ret; |
---|
436 | | - struct ttm_operation_ctx ctx = { |
---|
437 | | - .interruptible = false, |
---|
438 | | - .no_wait_gpu = false |
---|
439 | | - }; |
---|
440 | | - |
---|
441 | 413 | BUG_ON(mob->pt_bo != NULL); |
---|
442 | 414 | |
---|
443 | | - ret = ttm_bo_create(&dev_priv->bdev, mob->num_pages * PAGE_SIZE, |
---|
444 | | - ttm_bo_type_device, |
---|
445 | | - &vmw_sys_ne_placement, |
---|
446 | | - 0, false, &mob->pt_bo); |
---|
447 | | - if (unlikely(ret != 0)) |
---|
448 | | - return ret; |
---|
449 | | - |
---|
450 | | - ret = ttm_bo_reserve(mob->pt_bo, false, true, NULL); |
---|
451 | | - |
---|
452 | | - BUG_ON(ret != 0); |
---|
453 | | - ret = vmw_bo_driver.ttm_tt_populate(mob->pt_bo->ttm, &ctx); |
---|
454 | | - if (unlikely(ret != 0)) |
---|
455 | | - goto out_unreserve; |
---|
456 | | - ret = vmw_bo_map_dma(mob->pt_bo); |
---|
457 | | - if (unlikely(ret != 0)) |
---|
458 | | - goto out_unreserve; |
---|
459 | | - |
---|
460 | | - ttm_bo_unreserve(mob->pt_bo); |
---|
461 | | - |
---|
462 | | - return 0; |
---|
463 | | - |
---|
464 | | -out_unreserve: |
---|
465 | | - ttm_bo_unreserve(mob->pt_bo); |
---|
466 | | - ttm_bo_unref(&mob->pt_bo); |
---|
467 | | - |
---|
468 | | - return ret; |
---|
| 415 | + return vmw_bo_create_and_populate(dev_priv, mob->num_pages * PAGE_SIZE, &mob->pt_bo); |
---|
469 | 416 | } |
---|
470 | 417 | |
---|
471 | 418 | /** |
---|
.. | .. |
---|
580 | 527 | */ |
---|
581 | 528 | void vmw_mob_destroy(struct vmw_mob *mob) |
---|
582 | 529 | { |
---|
583 | | - if (mob->pt_bo) |
---|
584 | | - ttm_bo_unref(&mob->pt_bo); |
---|
| 530 | + if (mob->pt_bo) { |
---|
| 531 | + ttm_bo_put(mob->pt_bo); |
---|
| 532 | + mob->pt_bo = NULL; |
---|
| 533 | + } |
---|
585 | 534 | kfree(mob); |
---|
586 | 535 | } |
---|
587 | 536 | |
---|
.. | .. |
---|
609 | 558 | BUG_ON(ret != 0); |
---|
610 | 559 | } |
---|
611 | 560 | |
---|
612 | | - cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
---|
613 | | - if (unlikely(cmd == NULL)) { |
---|
614 | | - DRM_ERROR("Failed reserving FIFO space for Memory " |
---|
615 | | - "Object unbinding.\n"); |
---|
616 | | - } else { |
---|
| 561 | + cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd)); |
---|
| 562 | + if (cmd) { |
---|
617 | 563 | cmd->header.id = SVGA_3D_CMD_DESTROY_GB_MOB; |
---|
618 | 564 | cmd->header.size = sizeof(cmd->body); |
---|
619 | 565 | cmd->body.mobid = mob->id; |
---|
620 | 566 | vmw_fifo_commit(dev_priv, sizeof(*cmd)); |
---|
621 | 567 | } |
---|
| 568 | + |
---|
622 | 569 | if (bo) { |
---|
623 | 570 | vmw_bo_fence_single(bo, NULL); |
---|
624 | 571 | ttm_bo_unreserve(bo); |
---|
.. | .. |
---|
678 | 625 | |
---|
679 | 626 | vmw_fifo_resource_inc(dev_priv); |
---|
680 | 627 | |
---|
681 | | - cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
---|
682 | | - if (unlikely(cmd == NULL)) { |
---|
683 | | - DRM_ERROR("Failed reserving FIFO space for Memory " |
---|
684 | | - "Object binding.\n"); |
---|
| 628 | + cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd)); |
---|
| 629 | + if (unlikely(cmd == NULL)) |
---|
685 | 630 | goto out_no_cmd_space; |
---|
686 | | - } |
---|
687 | 631 | |
---|
688 | 632 | cmd->header.id = SVGA_3D_CMD_DEFINE_GB_MOB64; |
---|
689 | 633 | cmd->header.size = sizeof(cmd->body); |
---|
.. | .. |
---|
698 | 642 | |
---|
699 | 643 | out_no_cmd_space: |
---|
700 | 644 | vmw_fifo_resource_dec(dev_priv); |
---|
701 | | - if (pt_set_up) |
---|
702 | | - ttm_bo_unref(&mob->pt_bo); |
---|
| 645 | + if (pt_set_up) { |
---|
| 646 | + ttm_bo_put(mob->pt_bo); |
---|
| 647 | + mob->pt_bo = NULL; |
---|
| 648 | + } |
---|
703 | 649 | |
---|
704 | 650 | return -ENOMEM; |
---|
705 | 651 | } |
---|