.. | .. |
---|
95 | 95 | .res_type = vmw_res_shader, |
---|
96 | 96 | .needs_backup = true, |
---|
97 | 97 | .may_evict = true, |
---|
| 98 | + .prio = 3, |
---|
| 99 | + .dirty_prio = 3, |
---|
98 | 100 | .type_name = "guest backed shaders", |
---|
99 | 101 | .backup_placement = &vmw_mob_placement, |
---|
100 | 102 | .create = vmw_gb_shader_create, |
---|
.. | .. |
---|
106 | 108 | static const struct vmw_res_func vmw_dx_shader_func = { |
---|
107 | 109 | .res_type = vmw_res_shader, |
---|
108 | 110 | .needs_backup = true, |
---|
109 | | - .may_evict = false, |
---|
| 111 | + .may_evict = true, |
---|
| 112 | + .prio = 3, |
---|
| 113 | + .dirty_prio = 3, |
---|
110 | 114 | .type_name = "dx shaders", |
---|
111 | 115 | .backup_placement = &vmw_mob_placement, |
---|
112 | 116 | .create = vmw_dx_shader_create, |
---|
.. | .. |
---|
186 | 190 | shader->num_input_sig = num_input_sig; |
---|
187 | 191 | shader->num_output_sig = num_output_sig; |
---|
188 | 192 | |
---|
189 | | - vmw_resource_activate(res, vmw_hw_shader_destroy); |
---|
| 193 | + res->hw_destroy = vmw_hw_shader_destroy; |
---|
190 | 194 | return 0; |
---|
191 | 195 | } |
---|
192 | 196 | |
---|
.. | .. |
---|
218 | 222 | goto out_no_fifo; |
---|
219 | 223 | } |
---|
220 | 224 | |
---|
221 | | - cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
---|
| 225 | + cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd)); |
---|
222 | 226 | if (unlikely(cmd == NULL)) { |
---|
223 | | - DRM_ERROR("Failed reserving FIFO space for shader " |
---|
224 | | - "creation.\n"); |
---|
225 | 227 | ret = -ENOMEM; |
---|
226 | 228 | goto out_no_fifo; |
---|
227 | 229 | } |
---|
.. | .. |
---|
254 | 256 | |
---|
255 | 257 | BUG_ON(bo->mem.mem_type != VMW_PL_MOB); |
---|
256 | 258 | |
---|
257 | | - cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
---|
258 | | - if (unlikely(cmd == NULL)) { |
---|
259 | | - DRM_ERROR("Failed reserving FIFO space for shader " |
---|
260 | | - "binding.\n"); |
---|
| 259 | + cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd)); |
---|
| 260 | + if (unlikely(cmd == NULL)) |
---|
261 | 261 | return -ENOMEM; |
---|
262 | | - } |
---|
263 | 262 | |
---|
264 | 263 | cmd->header.id = SVGA_3D_CMD_BIND_GB_SHADER; |
---|
265 | 264 | cmd->header.size = sizeof(cmd->body); |
---|
.. | .. |
---|
285 | 284 | |
---|
286 | 285 | BUG_ON(res->backup->base.mem.mem_type != VMW_PL_MOB); |
---|
287 | 286 | |
---|
288 | | - cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
---|
289 | | - if (unlikely(cmd == NULL)) { |
---|
290 | | - DRM_ERROR("Failed reserving FIFO space for shader " |
---|
291 | | - "unbinding.\n"); |
---|
| 287 | + cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd)); |
---|
| 288 | + if (unlikely(cmd == NULL)) |
---|
292 | 289 | return -ENOMEM; |
---|
293 | | - } |
---|
294 | 290 | |
---|
295 | 291 | cmd->header.id = SVGA_3D_CMD_BIND_GB_SHADER; |
---|
296 | 292 | cmd->header.size = sizeof(cmd->body); |
---|
.. | .. |
---|
328 | 324 | mutex_lock(&dev_priv->binding_mutex); |
---|
329 | 325 | vmw_binding_res_list_scrub(&res->binding_head); |
---|
330 | 326 | |
---|
331 | | - cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
---|
| 327 | + cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd)); |
---|
332 | 328 | if (unlikely(cmd == NULL)) { |
---|
333 | | - DRM_ERROR("Failed reserving FIFO space for shader " |
---|
334 | | - "destruction.\n"); |
---|
335 | 329 | mutex_unlock(&dev_priv->binding_mutex); |
---|
336 | 330 | return -ENOMEM; |
---|
337 | 331 | } |
---|
.. | .. |
---|
400 | 394 | if (!list_empty(&shader->cotable_head) || !shader->committed) |
---|
401 | 395 | return 0; |
---|
402 | 396 | |
---|
403 | | - cmd = vmw_fifo_reserve_dx(dev_priv, sizeof(*cmd), |
---|
404 | | - shader->ctx->id); |
---|
405 | | - if (unlikely(cmd == NULL)) { |
---|
406 | | - DRM_ERROR("Failed reserving FIFO space for shader " |
---|
407 | | - "scrubbing.\n"); |
---|
| 397 | + cmd = VMW_FIFO_RESERVE_DX(dev_priv, sizeof(*cmd), shader->ctx->id); |
---|
| 398 | + if (unlikely(cmd == NULL)) |
---|
408 | 399 | return -ENOMEM; |
---|
409 | | - } |
---|
410 | 400 | |
---|
411 | 401 | cmd->header.id = SVGA_3D_CMD_DX_BIND_SHADER; |
---|
412 | 402 | cmd->header.size = sizeof(cmd->body); |
---|
.. | .. |
---|
437 | 427 | |
---|
438 | 428 | WARN_ON_ONCE(!shader->committed); |
---|
439 | 429 | |
---|
440 | | - if (!list_empty(&res->mob_head)) { |
---|
| 430 | + if (vmw_resource_mob_attached(res)) { |
---|
441 | 431 | mutex_lock(&dev_priv->binding_mutex); |
---|
442 | 432 | ret = vmw_dx_shader_unscrub(res); |
---|
443 | 433 | mutex_unlock(&dev_priv->binding_mutex); |
---|
.. | .. |
---|
491 | 481 | return 0; |
---|
492 | 482 | |
---|
493 | 483 | WARN_ON_ONCE(!shader->committed); |
---|
494 | | - cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
---|
495 | | - if (unlikely(cmd == NULL)) { |
---|
496 | | - DRM_ERROR("Failed reserving FIFO space for shader " |
---|
497 | | - "scrubbing.\n"); |
---|
| 484 | + cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd)); |
---|
| 485 | + if (unlikely(cmd == NULL)) |
---|
498 | 486 | return -ENOMEM; |
---|
499 | | - } |
---|
500 | 487 | |
---|
501 | 488 | cmd->header.id = SVGA_3D_CMD_DX_BIND_SHADER; |
---|
502 | 489 | cmd->header.size = sizeof(cmd->body); |
---|
.. | .. |
---|
562 | 549 | { |
---|
563 | 550 | struct vmw_dx_shader *entry, *next; |
---|
564 | 551 | |
---|
565 | | - WARN_ON_ONCE(!mutex_is_locked(&dev_priv->binding_mutex)); |
---|
| 552 | + lockdep_assert_held_once(&dev_priv->binding_mutex); |
---|
566 | 553 | |
---|
567 | 554 | list_for_each_entry_safe(entry, next, list, cotable_head) { |
---|
568 | 555 | WARN_ON(vmw_dx_shader_scrub(&entry->res)); |
---|
.. | .. |
---|
636 | 623 | |
---|
637 | 624 | res = &shader->res; |
---|
638 | 625 | shader->ctx = ctx; |
---|
639 | | - shader->cotable = vmw_context_cotable(ctx, SVGA_COTABLE_DXSHADER); |
---|
| 626 | + shader->cotable = vmw_resource_reference |
---|
| 627 | + (vmw_context_cotable(ctx, SVGA_COTABLE_DXSHADER)); |
---|
640 | 628 | shader->id = user_key; |
---|
641 | 629 | shader->committed = false; |
---|
642 | 630 | INIT_LIST_HEAD(&shader->cotable_head); |
---|
.. | .. |
---|
656 | 644 | goto out_resource_init; |
---|
657 | 645 | |
---|
658 | 646 | res->id = shader->id; |
---|
659 | | - vmw_resource_activate(res, vmw_hw_shader_destroy); |
---|
| 647 | + res->hw_destroy = vmw_hw_shader_destroy; |
---|
660 | 648 | |
---|
661 | 649 | out_resource_init: |
---|
662 | 650 | vmw_resource_unreference(&res); |
---|
.. | .. |
---|
740 | 728 | }; |
---|
741 | 729 | int ret; |
---|
742 | 730 | |
---|
743 | | - /* |
---|
744 | | - * Approximate idr memory usage with 128 bytes. It will be limited |
---|
745 | | - * by maximum number_of shaders anyway. |
---|
746 | | - */ |
---|
747 | 731 | if (unlikely(vmw_user_shader_size == 0)) |
---|
748 | 732 | vmw_user_shader_size = |
---|
749 | | - ttm_round_pot(sizeof(struct vmw_user_shader)) + 128; |
---|
| 733 | + ttm_round_pot(sizeof(struct vmw_user_shader)) + |
---|
| 734 | + VMW_IDA_ACC_SIZE + TTM_OBJ_EXTRA_SIZE; |
---|
750 | 735 | |
---|
751 | 736 | ret = ttm_mem_global_alloc(vmw_mem_glob(dev_priv), |
---|
752 | 737 | vmw_user_shader_size, |
---|
.. | .. |
---|
792 | 777 | } |
---|
793 | 778 | |
---|
794 | 779 | if (handle) |
---|
795 | | - *handle = ushader->base.hash.key; |
---|
| 780 | + *handle = ushader->base.handle; |
---|
796 | 781 | out_err: |
---|
797 | 782 | vmw_resource_unreference(&res); |
---|
798 | 783 | out: |
---|
.. | .. |
---|
814 | 799 | }; |
---|
815 | 800 | int ret; |
---|
816 | 801 | |
---|
817 | | - /* |
---|
818 | | - * Approximate idr memory usage with 128 bytes. It will be limited |
---|
819 | | - * by maximum number_of shaders anyway. |
---|
820 | | - */ |
---|
821 | 802 | if (unlikely(vmw_shader_size == 0)) |
---|
822 | 803 | vmw_shader_size = |
---|
823 | | - ttm_round_pot(sizeof(struct vmw_shader)) + 128; |
---|
| 804 | + ttm_round_pot(sizeof(struct vmw_shader)) + |
---|
| 805 | + VMW_IDA_ACC_SIZE; |
---|
824 | 806 | |
---|
825 | 807 | ret = ttm_mem_global_alloc(vmw_mem_glob(dev_priv), |
---|
826 | 808 | vmw_shader_size, |
---|
.. | .. |
---|
870 | 852 | ret = vmw_user_bo_lookup(tfile, buffer_handle, |
---|
871 | 853 | &buffer, NULL); |
---|
872 | 854 | if (unlikely(ret != 0)) { |
---|
873 | | - DRM_ERROR("Could not find buffer for shader " |
---|
874 | | - "creation.\n"); |
---|
| 855 | + VMW_DEBUG_USER("Couldn't find buffer for shader creation.\n"); |
---|
875 | 856 | return ret; |
---|
876 | 857 | } |
---|
877 | 858 | |
---|
878 | 859 | if ((u64)buffer->base.num_pages * PAGE_SIZE < |
---|
879 | 860 | (u64)size + (u64)offset) { |
---|
880 | | - DRM_ERROR("Illegal buffer- or shader size.\n"); |
---|
| 861 | + VMW_DEBUG_USER("Illegal buffer- or shader size.\n"); |
---|
881 | 862 | ret = -EINVAL; |
---|
882 | 863 | goto out_bad_arg; |
---|
883 | 864 | } |
---|
.. | .. |
---|
891 | 872 | shader_type = SVGA3D_SHADERTYPE_PS; |
---|
892 | 873 | break; |
---|
893 | 874 | default: |
---|
894 | | - DRM_ERROR("Illegal shader type.\n"); |
---|
| 875 | + VMW_DEBUG_USER("Illegal shader type.\n"); |
---|
895 | 876 | ret = -EINVAL; |
---|
896 | 877 | goto out_bad_arg; |
---|
897 | 878 | } |
---|