forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
....@@ -80,9 +80,10 @@
8080 {1, sizeof(SVGACOTableDXDepthStencilEntry), NULL},
8181 {1, sizeof(SVGACOTableDXRasterizerStateEntry), NULL},
8282 {1, sizeof(SVGACOTableDXSamplerEntry), NULL},
83
- {1, sizeof(SVGACOTableDXStreamOutputEntry), NULL},
83
+ {1, sizeof(SVGACOTableDXStreamOutputEntry), &vmw_dx_streamoutput_cotable_list_scrub},
8484 {1, sizeof(SVGACOTableDXQueryEntry), NULL},
85
- {1, sizeof(SVGACOTableDXShaderEntry), &vmw_dx_shader_cotable_list_scrub}
85
+ {1, sizeof(SVGACOTableDXShaderEntry), &vmw_dx_shader_cotable_list_scrub},
86
+ {1, sizeof(SVGACOTableDXUAViewEntry), &vmw_view_cotable_list_destroy}
8687 };
8788
8889 /*
....@@ -102,6 +103,7 @@
102103 SVGA_COTABLE_SAMPLER,
103104 SVGA_COTABLE_STREAMOUTPUT,
104105 SVGA_COTABLE_DXQUERY,
106
+ SVGA_COTABLE_UAVIEW,
105107 };
106108
107109 static int vmw_cotable_bind(struct vmw_resource *res,
....@@ -116,6 +118,8 @@
116118 .res_type = vmw_res_cotable,
117119 .needs_backup = true,
118120 .may_evict = true,
121
+ .prio = 3,
122
+ .dirty_prio = 3,
119123 .type_name = "context guest backed object tables",
120124 .backup_placement = &vmw_mob_placement,
121125 .create = vmw_cotable_create,
....@@ -169,14 +173,11 @@
169173 } *cmd;
170174
171175 WARN_ON_ONCE(bo->mem.mem_type != VMW_PL_MOB);
172
- lockdep_assert_held(&bo->resv->lock.base);
176
+ dma_resv_assert_held(bo->base.resv);
173177
174
- cmd = vmw_fifo_reserve_dx(dev_priv, sizeof(*cmd), SVGA3D_INVALID_ID);
175
- if (!cmd) {
176
- DRM_ERROR("Failed reserving FIFO space for cotable "
177
- "binding.\n");
178
+ cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd));
179
+ if (!cmd)
178180 return -ENOMEM;
179
- }
180181
181182 WARN_ON(vcotbl->ctx->id == SVGA3D_INVALID_ID);
182183 WARN_ON(bo->mem.mem_type != VMW_PL_MOB);
....@@ -262,12 +263,9 @@
262263 if (readback)
263264 submit_size += sizeof(*cmd0);
264265
265
- cmd1 = vmw_fifo_reserve_dx(dev_priv, submit_size, SVGA3D_INVALID_ID);
266
- if (!cmd1) {
267
- DRM_ERROR("Failed reserving FIFO space for cotable "
268
- "unbinding.\n");
266
+ cmd1 = VMW_FIFO_RESERVE(dev_priv, submit_size);
267
+ if (!cmd1)
269268 return -ENOMEM;
270
- }
271269
272270 vcotbl->size_read_back = 0;
273271 if (readback) {
....@@ -313,11 +311,11 @@
313311 struct ttm_buffer_object *bo = val_buf->bo;
314312 struct vmw_fence_obj *fence;
315313
316
- if (list_empty(&res->mob_head))
314
+ if (!vmw_resource_mob_attached(res))
317315 return 0;
318316
319317 WARN_ON_ONCE(bo->mem.mem_type != VMW_PL_MOB);
320
- lockdep_assert_held(&bo->resv->lock.base);
318
+ dma_resv_assert_held(bo->base.resv);
321319
322320 mutex_lock(&dev_priv->binding_mutex);
323321 if (!vcotbl->scrubbed)
....@@ -351,13 +349,10 @@
351349 struct vmw_fence_obj *fence;
352350
353351 if (!vcotbl->scrubbed) {
354
- cmd = vmw_fifo_reserve_dx(dev_priv, sizeof(*cmd),
355
- SVGA3D_INVALID_ID);
356
- if (!cmd) {
357
- DRM_ERROR("Failed reserving FIFO space for cotable "
358
- "readback.\n");
352
+ cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd));
353
+ if (!cmd)
359354 return -ENOMEM;
360
- }
355
+
361356 cmd->header.id = SVGA_3D_CMD_DX_READBACK_COTABLE;
362357 cmd->header.size = sizeof(cmd->body);
363358 cmd->body.cid = vcotbl->ctx->id;
....@@ -462,6 +457,7 @@
462457 goto out_wait;
463458 }
464459
460
+ vmw_resource_mob_detach(res);
465461 res->backup = buf;
466462 res->backup_size = new_size;
467463 vcotbl->size_read_back = cur_size_read_back;
....@@ -476,12 +472,12 @@
476472 res->backup = old_buf;
477473 res->backup_size = old_size;
478474 vcotbl->size_read_back = old_size_read_back;
475
+ vmw_resource_mob_attach(res);
479476 goto out_wait;
480477 }
481478
479
+ vmw_resource_mob_attach(res);
482480 /* Let go of the old mob. */
483
- list_del(&res->mob_head);
484
- list_add_tail(&res->mob_head, &buf->res_list);
485481 vmw_bo_unreference(&old_buf);
486482 res->id = vcotbl->type;
487483
....@@ -505,7 +501,7 @@
505501 * is called before bind() in the validation sequence is instead used for two
506502 * things.
507503 * 1) Unscrub the cotable if it is scrubbed and still attached to a backup
508
- * buffer, that is, if @res->mob_head is non-empty.
504
+ * buffer.
509505 * 2) Resize the cotable if needed.
510506 */
511507 static int vmw_cotable_create(struct vmw_resource *res)
....@@ -521,7 +517,7 @@
521517 new_size *= 2;
522518
523519 if (likely(new_size <= res->backup_size)) {
524
- if (vcotbl->scrubbed && !list_empty(&res->mob_head)) {
520
+ if (vcotbl->scrubbed && vmw_resource_mob_attached(res)) {
525521 ret = vmw_cotable_unscrub(res);
526522 if (ret)
527523 return ret;
....@@ -615,7 +611,7 @@
615611 vcotbl->type = type;
616612 vcotbl->ctx = ctx;
617613
618
- vmw_resource_activate(&vcotbl->res, vmw_hw_cotable_destroy);
614
+ vcotbl->res.hw_destroy = vmw_hw_cotable_destroy;
619615
620616 return &vcotbl->res;
621617