| .. | .. |
|---|
| 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 | } |
|---|