hc
2024-05-10 cde9070d9970eef1f7ec2360586c802a16230ad8
kernel/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
....@@ -95,6 +95,8 @@
9595 .res_type = vmw_res_shader,
9696 .needs_backup = true,
9797 .may_evict = true,
98
+ .prio = 3,
99
+ .dirty_prio = 3,
98100 .type_name = "guest backed shaders",
99101 .backup_placement = &vmw_mob_placement,
100102 .create = vmw_gb_shader_create,
....@@ -106,7 +108,9 @@
106108 static const struct vmw_res_func vmw_dx_shader_func = {
107109 .res_type = vmw_res_shader,
108110 .needs_backup = true,
109
- .may_evict = false,
111
+ .may_evict = true,
112
+ .prio = 3,
113
+ .dirty_prio = 3,
110114 .type_name = "dx shaders",
111115 .backup_placement = &vmw_mob_placement,
112116 .create = vmw_dx_shader_create,
....@@ -186,7 +190,7 @@
186190 shader->num_input_sig = num_input_sig;
187191 shader->num_output_sig = num_output_sig;
188192
189
- vmw_resource_activate(res, vmw_hw_shader_destroy);
193
+ res->hw_destroy = vmw_hw_shader_destroy;
190194 return 0;
191195 }
192196
....@@ -218,10 +222,8 @@
218222 goto out_no_fifo;
219223 }
220224
221
- cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd));
225
+ cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd));
222226 if (unlikely(cmd == NULL)) {
223
- DRM_ERROR("Failed reserving FIFO space for shader "
224
- "creation.\n");
225227 ret = -ENOMEM;
226228 goto out_no_fifo;
227229 }
....@@ -254,12 +256,9 @@
254256
255257 BUG_ON(bo->mem.mem_type != VMW_PL_MOB);
256258
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))
261261 return -ENOMEM;
262
- }
263262
264263 cmd->header.id = SVGA_3D_CMD_BIND_GB_SHADER;
265264 cmd->header.size = sizeof(cmd->body);
....@@ -285,12 +284,9 @@
285284
286285 BUG_ON(res->backup->base.mem.mem_type != VMW_PL_MOB);
287286
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))
292289 return -ENOMEM;
293
- }
294290
295291 cmd->header.id = SVGA_3D_CMD_BIND_GB_SHADER;
296292 cmd->header.size = sizeof(cmd->body);
....@@ -328,10 +324,8 @@
328324 mutex_lock(&dev_priv->binding_mutex);
329325 vmw_binding_res_list_scrub(&res->binding_head);
330326
331
- cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd));
327
+ cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd));
332328 if (unlikely(cmd == NULL)) {
333
- DRM_ERROR("Failed reserving FIFO space for shader "
334
- "destruction.\n");
335329 mutex_unlock(&dev_priv->binding_mutex);
336330 return -ENOMEM;
337331 }
....@@ -400,13 +394,9 @@
400394 if (!list_empty(&shader->cotable_head) || !shader->committed)
401395 return 0;
402396
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))
408399 return -ENOMEM;
409
- }
410400
411401 cmd->header.id = SVGA_3D_CMD_DX_BIND_SHADER;
412402 cmd->header.size = sizeof(cmd->body);
....@@ -437,7 +427,7 @@
437427
438428 WARN_ON_ONCE(!shader->committed);
439429
440
- if (!list_empty(&res->mob_head)) {
430
+ if (vmw_resource_mob_attached(res)) {
441431 mutex_lock(&dev_priv->binding_mutex);
442432 ret = vmw_dx_shader_unscrub(res);
443433 mutex_unlock(&dev_priv->binding_mutex);
....@@ -491,12 +481,9 @@
491481 return 0;
492482
493483 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))
498486 return -ENOMEM;
499
- }
500487
501488 cmd->header.id = SVGA_3D_CMD_DX_BIND_SHADER;
502489 cmd->header.size = sizeof(cmd->body);
....@@ -562,7 +549,7 @@
562549 {
563550 struct vmw_dx_shader *entry, *next;
564551
565
- WARN_ON_ONCE(!mutex_is_locked(&dev_priv->binding_mutex));
552
+ lockdep_assert_held_once(&dev_priv->binding_mutex);
566553
567554 list_for_each_entry_safe(entry, next, list, cotable_head) {
568555 WARN_ON(vmw_dx_shader_scrub(&entry->res));
....@@ -636,7 +623,8 @@
636623
637624 res = &shader->res;
638625 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));
640628 shader->id = user_key;
641629 shader->committed = false;
642630 INIT_LIST_HEAD(&shader->cotable_head);
....@@ -656,7 +644,7 @@
656644 goto out_resource_init;
657645
658646 res->id = shader->id;
659
- vmw_resource_activate(res, vmw_hw_shader_destroy);
647
+ res->hw_destroy = vmw_hw_shader_destroy;
660648
661649 out_resource_init:
662650 vmw_resource_unreference(&res);
....@@ -740,13 +728,10 @@
740728 };
741729 int ret;
742730
743
- /*
744
- * Approximate idr memory usage with 128 bytes. It will be limited
745
- * by maximum number_of shaders anyway.
746
- */
747731 if (unlikely(vmw_user_shader_size == 0))
748732 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;
750735
751736 ret = ttm_mem_global_alloc(vmw_mem_glob(dev_priv),
752737 vmw_user_shader_size,
....@@ -792,7 +777,7 @@
792777 }
793778
794779 if (handle)
795
- *handle = ushader->base.hash.key;
780
+ *handle = ushader->base.handle;
796781 out_err:
797782 vmw_resource_unreference(&res);
798783 out:
....@@ -814,13 +799,10 @@
814799 };
815800 int ret;
816801
817
- /*
818
- * Approximate idr memory usage with 128 bytes. It will be limited
819
- * by maximum number_of shaders anyway.
820
- */
821802 if (unlikely(vmw_shader_size == 0))
822803 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;
824806
825807 ret = ttm_mem_global_alloc(vmw_mem_glob(dev_priv),
826808 vmw_shader_size,
....@@ -870,14 +852,13 @@
870852 ret = vmw_user_bo_lookup(tfile, buffer_handle,
871853 &buffer, NULL);
872854 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");
875856 return ret;
876857 }
877858
878859 if ((u64)buffer->base.num_pages * PAGE_SIZE <
879860 (u64)size + (u64)offset) {
880
- DRM_ERROR("Illegal buffer- or shader size.\n");
861
+ VMW_DEBUG_USER("Illegal buffer- or shader size.\n");
881862 ret = -EINVAL;
882863 goto out_bad_arg;
883864 }
....@@ -891,7 +872,7 @@
891872 shader_type = SVGA3D_SHADERTYPE_PS;
892873 break;
893874 default:
894
- DRM_ERROR("Illegal shader type.\n");
875
+ VMW_DEBUG_USER("Illegal shader type.\n");
895876 ret = -EINVAL;
896877 goto out_bad_arg;
897878 }