hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
....@@ -33,49 +33,57 @@
3333 static const struct ttm_place vram_placement_flags = {
3434 .fpfn = 0,
3535 .lpfn = 0,
36
- .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
36
+ .mem_type = TTM_PL_VRAM,
37
+ .flags = TTM_PL_FLAG_CACHED
3738 };
3839
3940 static const struct ttm_place vram_ne_placement_flags = {
4041 .fpfn = 0,
4142 .lpfn = 0,
42
- .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
43
+ .mem_type = TTM_PL_VRAM,
44
+ .flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
4345 };
4446
4547 static const struct ttm_place sys_placement_flags = {
4648 .fpfn = 0,
4749 .lpfn = 0,
48
- .flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED
50
+ .mem_type = TTM_PL_SYSTEM,
51
+ .flags = TTM_PL_FLAG_CACHED
4952 };
5053
5154 static const struct ttm_place sys_ne_placement_flags = {
5255 .fpfn = 0,
5356 .lpfn = 0,
54
- .flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
57
+ .mem_type = TTM_PL_SYSTEM,
58
+ .flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
5559 };
5660
5761 static const struct ttm_place gmr_placement_flags = {
5862 .fpfn = 0,
5963 .lpfn = 0,
60
- .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
64
+ .mem_type = VMW_PL_GMR,
65
+ .flags = TTM_PL_FLAG_CACHED
6166 };
6267
6368 static const struct ttm_place gmr_ne_placement_flags = {
6469 .fpfn = 0,
6570 .lpfn = 0,
66
- .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
71
+ .mem_type = VMW_PL_GMR,
72
+ .flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
6773 };
6874
6975 static const struct ttm_place mob_placement_flags = {
7076 .fpfn = 0,
7177 .lpfn = 0,
72
- .flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
78
+ .mem_type = VMW_PL_MOB,
79
+ .flags = TTM_PL_FLAG_CACHED
7380 };
7481
7582 static const struct ttm_place mob_ne_placement_flags = {
7683 .fpfn = 0,
7784 .lpfn = 0,
78
- .flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
85
+ .mem_type = VMW_PL_MOB,
86
+ .flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
7987 };
8088
8189 struct ttm_placement vmw_vram_placement = {
....@@ -89,11 +97,13 @@
8997 {
9098 .fpfn = 0,
9199 .lpfn = 0,
92
- .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
100
+ .mem_type = TTM_PL_VRAM,
101
+ .flags = TTM_PL_FLAG_CACHED
93102 }, {
94103 .fpfn = 0,
95104 .lpfn = 0,
96
- .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
105
+ .mem_type = VMW_PL_GMR,
106
+ .flags = TTM_PL_FLAG_CACHED
97107 }
98108 };
99109
....@@ -101,11 +111,13 @@
101111 {
102112 .fpfn = 0,
103113 .lpfn = 0,
104
- .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
114
+ .mem_type = VMW_PL_GMR,
115
+ .flags = TTM_PL_FLAG_CACHED
105116 }, {
106117 .fpfn = 0,
107118 .lpfn = 0,
108
- .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
119
+ .mem_type = TTM_PL_VRAM,
120
+ .flags = TTM_PL_FLAG_CACHED
109121 }
110122 };
111123
....@@ -120,12 +132,14 @@
120132 {
121133 .fpfn = 0,
122134 .lpfn = 0,
123
- .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED |
135
+ .mem_type = TTM_PL_VRAM,
136
+ .flags = TTM_PL_FLAG_CACHED |
124137 TTM_PL_FLAG_NO_EVICT
125138 }, {
126139 .fpfn = 0,
127140 .lpfn = 0,
128
- .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED |
141
+ .mem_type = VMW_PL_GMR,
142
+ .flags = TTM_PL_FLAG_CACHED |
129143 TTM_PL_FLAG_NO_EVICT
130144 }
131145 };
....@@ -169,19 +183,23 @@
169183 {
170184 .fpfn = 0,
171185 .lpfn = 0,
172
- .flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED
186
+ .mem_type = TTM_PL_SYSTEM,
187
+ .flags = TTM_PL_FLAG_CACHED
173188 }, {
174189 .fpfn = 0,
175190 .lpfn = 0,
176
- .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
191
+ .mem_type = TTM_PL_VRAM,
192
+ .flags = TTM_PL_FLAG_CACHED
177193 }, {
178194 .fpfn = 0,
179195 .lpfn = 0,
180
- .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
196
+ .mem_type = VMW_PL_GMR,
197
+ .flags = TTM_PL_FLAG_CACHED
181198 }, {
182199 .fpfn = 0,
183200 .lpfn = 0,
184
- .flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
201
+ .mem_type = VMW_PL_MOB,
202
+ .flags = TTM_PL_FLAG_CACHED
185203 }
186204 };
187205
....@@ -189,15 +207,18 @@
189207 {
190208 .fpfn = 0,
191209 .lpfn = 0,
192
- .flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED
210
+ .mem_type = TTM_PL_SYSTEM,
211
+ .flags = TTM_PL_FLAG_CACHED
193212 }, {
194213 .fpfn = 0,
195214 .lpfn = 0,
196
- .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
215
+ .mem_type = VMW_PL_GMR,
216
+ .flags = TTM_PL_FLAG_CACHED
197217 }, {
198218 .fpfn = 0,
199219 .lpfn = 0,
200
- .flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
220
+ .mem_type = VMW_PL_MOB,
221
+ .flags = TTM_PL_FLAG_CACHED
201222 }
202223 };
203224
....@@ -246,6 +267,7 @@
246267 struct vmw_sg_table vsgt;
247268 uint64_t sg_alloc_size;
248269 bool mapped;
270
+ bool bound;
249271 };
250272
251273 const size_t vmw_tt_size = sizeof(struct vmw_ttm_tt);
....@@ -266,7 +288,9 @@
266288
267289 static bool __vmw_piter_sg_next(struct vmw_piter *viter)
268290 {
269
- return __sg_page_iter_next(&viter->iter);
291
+ bool ret = __vmw_piter_non_sg_next(viter);
292
+
293
+ return __sg_page_iter_dma_next(&viter->iter) && ret;
270294 }
271295
272296
....@@ -283,12 +307,6 @@
283307 {
284308 return viter->pages[viter->i];
285309 }
286
-
287
-static struct page *__vmw_piter_sg_page(struct vmw_piter *viter)
288
-{
289
- return sg_page_iter_page(&viter->iter);
290
-}
291
-
292310
293311 /**
294312 * Helper functions to return the DMA address of the current page.
....@@ -330,26 +348,23 @@
330348 {
331349 viter->i = p_offset - 1;
332350 viter->num_pages = vsgt->num_pages;
351
+ viter->page = &__vmw_piter_non_sg_page;
352
+ viter->pages = vsgt->pages;
333353 switch (vsgt->mode) {
334354 case vmw_dma_phys:
335355 viter->next = &__vmw_piter_non_sg_next;
336356 viter->dma_address = &__vmw_piter_phys_addr;
337
- viter->page = &__vmw_piter_non_sg_page;
338
- viter->pages = vsgt->pages;
339357 break;
340358 case vmw_dma_alloc_coherent:
341359 viter->next = &__vmw_piter_non_sg_next;
342360 viter->dma_address = &__vmw_piter_dma_addr;
343
- viter->page = &__vmw_piter_non_sg_page;
344361 viter->addrs = vsgt->addrs;
345
- viter->pages = vsgt->pages;
346362 break;
347363 case vmw_dma_map_populate:
348364 case vmw_dma_map_bind:
349365 viter->next = &__vmw_piter_sg_next;
350366 viter->dma_address = &__vmw_piter_sg_addr;
351
- viter->page = &__vmw_piter_sg_page;
352
- __sg_page_iter_start(&viter->iter, vsgt->sgt->sgl,
367
+ __sg_page_iter_start(&viter->iter.base, vsgt->sgt->sgl,
353368 vsgt->sgt->orig_nents, p_offset);
354369 break;
355370 default:
....@@ -369,8 +384,7 @@
369384 {
370385 struct device *dev = vmw_tt->dev_priv->dev->dev;
371386
372
- dma_unmap_sg(dev, vmw_tt->sgt.sgl, vmw_tt->sgt.nents,
373
- DMA_BIDIRECTIONAL);
387
+ dma_unmap_sgtable(dev, &vmw_tt->sgt, DMA_BIDIRECTIONAL, 0);
374388 vmw_tt->sgt.nents = vmw_tt->sgt.orig_nents;
375389 }
376390
....@@ -390,16 +404,8 @@
390404 static int vmw_ttm_map_for_dma(struct vmw_ttm_tt *vmw_tt)
391405 {
392406 struct device *dev = vmw_tt->dev_priv->dev->dev;
393
- int ret;
394407
395
- ret = dma_map_sg(dev, vmw_tt->sgt.sgl, vmw_tt->sgt.orig_nents,
396
- DMA_BIDIRECTIONAL);
397
- if (unlikely(ret == 0))
398
- return -ENOMEM;
399
-
400
- vmw_tt->sgt.nents = ret;
401
-
402
- return 0;
408
+ return dma_map_sgtable(dev, &vmw_tt->sgt, DMA_BIDIRECTIONAL, 0);
403409 }
404410
405411 /**
....@@ -426,6 +432,7 @@
426432 int ret = 0;
427433 static size_t sgl_size;
428434 static size_t sgt_size;
435
+ struct scatterlist *sg;
429436
430437 if (vmw_tt->mapped)
431438 return 0;
....@@ -448,18 +455,20 @@
448455 if (unlikely(ret != 0))
449456 return ret;
450457
451
- ret = __sg_alloc_table_from_pages
452
- (&vmw_tt->sgt, vsgt->pages, vsgt->num_pages, 0,
453
- (unsigned long) vsgt->num_pages << PAGE_SHIFT,
454
- dma_get_max_seg_size(dev_priv->dev->dev),
455
- GFP_KERNEL);
456
- if (unlikely(ret != 0))
458
+ sg = __sg_alloc_table_from_pages(&vmw_tt->sgt, vsgt->pages,
459
+ vsgt->num_pages, 0,
460
+ (unsigned long) vsgt->num_pages << PAGE_SHIFT,
461
+ dma_get_max_seg_size(dev_priv->dev->dev),
462
+ NULL, 0, GFP_KERNEL);
463
+ if (IS_ERR(sg)) {
464
+ ret = PTR_ERR(sg);
457465 goto out_sg_alloc_fail;
466
+ }
458467
459
- if (vsgt->num_pages > vmw_tt->sgt.nents) {
468
+ if (vsgt->num_pages > vmw_tt->sgt.orig_nents) {
460469 uint64_t over_alloc =
461470 sgl_size * (vsgt->num_pages -
462
- vmw_tt->sgt.nents);
471
+ vmw_tt->sgt.orig_nents);
463472
464473 ttm_mem_global_free(glob, over_alloc);
465474 vmw_tt->sg_alloc_size -= over_alloc;
....@@ -526,43 +535,6 @@
526535 vmw_tt->mapped = false;
527536 }
528537
529
-
530
-/**
531
- * vmw_bo_map_dma - Make sure buffer object pages are visible to the device
532
- *
533
- * @bo: Pointer to a struct ttm_buffer_object
534
- *
535
- * Wrapper around vmw_ttm_map_dma, that takes a TTM buffer object pointer
536
- * instead of a pointer to a struct vmw_ttm_backend as argument.
537
- * Note that the buffer object must be either pinned or reserved before
538
- * calling this function.
539
- */
540
-int vmw_bo_map_dma(struct ttm_buffer_object *bo)
541
-{
542
- struct vmw_ttm_tt *vmw_tt =
543
- container_of(bo->ttm, struct vmw_ttm_tt, dma_ttm.ttm);
544
-
545
- return vmw_ttm_map_dma(vmw_tt);
546
-}
547
-
548
-
549
-/**
550
- * vmw_bo_unmap_dma - Make sure buffer object pages are visible to the device
551
- *
552
- * @bo: Pointer to a struct ttm_buffer_object
553
- *
554
- * Wrapper around vmw_ttm_unmap_dma, that takes a TTM buffer object pointer
555
- * instead of a pointer to a struct vmw_ttm_backend as argument.
556
- */
557
-void vmw_bo_unmap_dma(struct ttm_buffer_object *bo)
558
-{
559
- struct vmw_ttm_tt *vmw_tt =
560
- container_of(bo->ttm, struct vmw_ttm_tt, dma_ttm.ttm);
561
-
562
- vmw_ttm_unmap_dma(vmw_tt);
563
-}
564
-
565
-
566538 /**
567539 * vmw_bo_sg_table - Return a struct vmw_sg_table object for a
568540 * TTM buffer object
....@@ -583,11 +555,18 @@
583555 }
584556
585557
586
-static int vmw_ttm_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)
558
+static int vmw_ttm_bind(struct ttm_bo_device *bdev,
559
+ struct ttm_tt *ttm, struct ttm_resource *bo_mem)
587560 {
588561 struct vmw_ttm_tt *vmw_be =
589562 container_of(ttm, struct vmw_ttm_tt, dma_ttm.ttm);
590
- int ret;
563
+ int ret = 0;
564
+
565
+ if (!bo_mem)
566
+ return -EINVAL;
567
+
568
+ if (vmw_be->bound)
569
+ return 0;
591570
592571 ret = vmw_ttm_map_dma(vmw_be);
593572 if (unlikely(ret != 0))
....@@ -598,8 +577,9 @@
598577
599578 switch (bo_mem->mem_type) {
600579 case VMW_PL_GMR:
601
- return vmw_gmr_bind(vmw_be->dev_priv, &vmw_be->vsgt,
580
+ ret = vmw_gmr_bind(vmw_be->dev_priv, &vmw_be->vsgt,
602581 ttm->num_pages, vmw_be->gmr_id);
582
+ break;
603583 case VMW_PL_MOB:
604584 if (unlikely(vmw_be->mob == NULL)) {
605585 vmw_be->mob =
....@@ -608,19 +588,25 @@
608588 return -ENOMEM;
609589 }
610590
611
- return vmw_mob_bind(vmw_be->dev_priv, vmw_be->mob,
591
+ ret = vmw_mob_bind(vmw_be->dev_priv, vmw_be->mob,
612592 &vmw_be->vsgt, ttm->num_pages,
613593 vmw_be->gmr_id);
594
+ break;
614595 default:
615596 BUG();
616597 }
617
- return 0;
598
+ vmw_be->bound = true;
599
+ return ret;
618600 }
619601
620
-static int vmw_ttm_unbind(struct ttm_tt *ttm)
602
+static void vmw_ttm_unbind(struct ttm_bo_device *bdev,
603
+ struct ttm_tt *ttm)
621604 {
622605 struct vmw_ttm_tt *vmw_be =
623606 container_of(ttm, struct vmw_ttm_tt, dma_ttm.ttm);
607
+
608
+ if (!vmw_be->bound)
609
+ return;
624610
625611 switch (vmw_be->mem_type) {
626612 case VMW_PL_GMR:
....@@ -635,16 +621,17 @@
635621
636622 if (vmw_be->dev_priv->map_mode == vmw_dma_map_bind)
637623 vmw_ttm_unmap_dma(vmw_be);
638
-
639
- return 0;
624
+ vmw_be->bound = false;
640625 }
641626
642627
643
-static void vmw_ttm_destroy(struct ttm_tt *ttm)
628
+static void vmw_ttm_destroy(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
644629 {
645630 struct vmw_ttm_tt *vmw_be =
646631 container_of(ttm, struct vmw_ttm_tt, dma_ttm.ttm);
647632
633
+ vmw_ttm_unbind(bdev, ttm);
634
+ ttm_tt_destroy_common(bdev, ttm);
648635 vmw_ttm_unmap_dma(vmw_be);
649636 if (vmw_be->dev_priv->map_mode == vmw_dma_alloc_coherent)
650637 ttm_dma_tt_fini(&vmw_be->dma_ttm);
....@@ -658,7 +645,8 @@
658645 }
659646
660647
661
-static int vmw_ttm_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
648
+static int vmw_ttm_populate(struct ttm_bo_device *bdev,
649
+ struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
662650 {
663651 struct vmw_ttm_tt *vmw_tt =
664652 container_of(ttm, struct vmw_ttm_tt, dma_ttm.ttm);
....@@ -666,7 +654,7 @@
666654 struct ttm_mem_global *glob = vmw_mem_glob(dev_priv);
667655 int ret;
668656
669
- if (ttm->state != tt_unpopulated)
657
+ if (ttm_tt_is_populated(ttm))
670658 return 0;
671659
672660 if (dev_priv->map_mode == vmw_dma_alloc_coherent) {
....@@ -686,7 +674,8 @@
686674 return ret;
687675 }
688676
689
-static void vmw_ttm_unpopulate(struct ttm_tt *ttm)
677
+static void vmw_ttm_unpopulate(struct ttm_bo_device *bdev,
678
+ struct ttm_tt *ttm)
690679 {
691680 struct vmw_ttm_tt *vmw_tt = container_of(ttm, struct vmw_ttm_tt,
692681 dma_ttm.ttm);
....@@ -710,12 +699,6 @@
710699 ttm_pool_unpopulate(ttm);
711700 }
712701
713
-static struct ttm_backend_func vmw_ttm_func = {
714
- .bind = vmw_ttm_bind,
715
- .unbind = vmw_ttm_unbind,
716
- .destroy = vmw_ttm_destroy,
717
-};
718
-
719702 static struct ttm_tt *vmw_ttm_tt_create(struct ttm_buffer_object *bo,
720703 uint32_t page_flags)
721704 {
....@@ -726,7 +709,6 @@
726709 if (!vmw_be)
727710 return NULL;
728711
729
- vmw_be->dma_ttm.ttm.func = &vmw_ttm_func;
730712 vmw_be->dev_priv = container_of(bo->bdev, struct vmw_private, bdev);
731713 vmw_be->mob = NULL;
732714
....@@ -743,50 +725,6 @@
743725 return NULL;
744726 }
745727
746
-static int vmw_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
747
-{
748
- return 0;
749
-}
750
-
751
-static int vmw_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
752
- struct ttm_mem_type_manager *man)
753
-{
754
- switch (type) {
755
- case TTM_PL_SYSTEM:
756
- /* System memory */
757
-
758
- man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
759
- man->available_caching = TTM_PL_FLAG_CACHED;
760
- man->default_caching = TTM_PL_FLAG_CACHED;
761
- break;
762
- case TTM_PL_VRAM:
763
- /* "On-card" video ram */
764
- man->func = &ttm_bo_manager_func;
765
- man->gpu_offset = 0;
766
- man->flags = TTM_MEMTYPE_FLAG_FIXED | TTM_MEMTYPE_FLAG_MAPPABLE;
767
- man->available_caching = TTM_PL_FLAG_CACHED;
768
- man->default_caching = TTM_PL_FLAG_CACHED;
769
- break;
770
- case VMW_PL_GMR:
771
- case VMW_PL_MOB:
772
- /*
773
- * "Guest Memory Regions" is an aperture like feature with
774
- * one slot per bo. There is an upper limit of the number of
775
- * slots as well as the bo size.
776
- */
777
- man->func = &vmw_gmrid_manager_func;
778
- man->gpu_offset = 0;
779
- man->flags = TTM_MEMTYPE_FLAG_CMA | TTM_MEMTYPE_FLAG_MAPPABLE;
780
- man->available_caching = TTM_PL_FLAG_CACHED;
781
- man->default_caching = TTM_PL_FLAG_CACHED;
782
- break;
783
- default:
784
- DRM_ERROR("Unsupported memory type %u\n", (unsigned)type);
785
- return -EINVAL;
786
- }
787
- return 0;
788
-}
789
-
790728 static void vmw_evict_flags(struct ttm_buffer_object *bo,
791729 struct ttm_placement *placement)
792730 {
....@@ -801,26 +739,18 @@
801739 return vmw_user_bo_verify_access(bo, tfile);
802740 }
803741
804
-static int vmw_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
742
+static int vmw_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_resource *mem)
805743 {
806
- struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
807744 struct vmw_private *dev_priv = container_of(bdev, struct vmw_private, bdev);
808745
809
- mem->bus.addr = NULL;
810
- mem->bus.is_iomem = false;
811
- mem->bus.offset = 0;
812
- mem->bus.size = mem->num_pages << PAGE_SHIFT;
813
- mem->bus.base = 0;
814
- if (!(man->flags & TTM_MEMTYPE_FLAG_MAPPABLE))
815
- return -EINVAL;
816746 switch (mem->mem_type) {
817747 case TTM_PL_SYSTEM:
818748 case VMW_PL_GMR:
819749 case VMW_PL_MOB:
820750 return 0;
821751 case TTM_PL_VRAM:
822
- mem->bus.offset = mem->start << PAGE_SHIFT;
823
- mem->bus.base = dev_priv->vram_start;
752
+ mem->bus.offset = (mem->start << PAGE_SHIFT) +
753
+ dev_priv->vram_start;
824754 mem->bus.is_iomem = true;
825755 break;
826756 default:
....@@ -829,20 +759,11 @@
829759 return 0;
830760 }
831761
832
-static void vmw_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
833
-{
834
-}
835
-
836
-static int vmw_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
837
-{
838
- return 0;
839
-}
840
-
841762 /**
842763 * vmw_move_notify - TTM move_notify_callback
843764 *
844765 * @bo: The TTM buffer object about to move.
845
- * @mem: The struct ttm_mem_reg indicating to what memory
766
+ * @mem: The struct ttm_resource indicating to what memory
846767 * region the move is taking place.
847768 *
848769 * Calls move_notify for all subsystems needing it.
....@@ -850,7 +771,7 @@
850771 */
851772 static void vmw_move_notify(struct ttm_buffer_object *bo,
852773 bool evict,
853
- struct ttm_mem_reg *mem)
774
+ struct ttm_resource *mem)
854775 {
855776 vmw_bo_move_notify(bo, mem);
856777 vmw_query_move_notify(bo, mem);
....@@ -873,15 +794,49 @@
873794 .ttm_tt_create = &vmw_ttm_tt_create,
874795 .ttm_tt_populate = &vmw_ttm_populate,
875796 .ttm_tt_unpopulate = &vmw_ttm_unpopulate,
876
- .invalidate_caches = vmw_invalidate_caches,
877
- .init_mem_type = vmw_init_mem_type,
797
+ .ttm_tt_bind = &vmw_ttm_bind,
798
+ .ttm_tt_unbind = &vmw_ttm_unbind,
799
+ .ttm_tt_destroy = &vmw_ttm_destroy,
878800 .eviction_valuable = ttm_bo_eviction_valuable,
879801 .evict_flags = vmw_evict_flags,
880802 .move = NULL,
881803 .verify_access = vmw_verify_access,
882804 .move_notify = vmw_move_notify,
883805 .swap_notify = vmw_swap_notify,
884
- .fault_reserve_notify = &vmw_ttm_fault_reserve_notify,
885806 .io_mem_reserve = &vmw_ttm_io_mem_reserve,
886
- .io_mem_free = &vmw_ttm_io_mem_free,
887807 };
808
+
809
+int vmw_bo_create_and_populate(struct vmw_private *dev_priv,
810
+ unsigned long bo_size,
811
+ struct ttm_buffer_object **bo_p)
812
+{
813
+ struct ttm_operation_ctx ctx = {
814
+ .interruptible = false,
815
+ .no_wait_gpu = false
816
+ };
817
+ struct ttm_buffer_object *bo;
818
+ int ret;
819
+
820
+ ret = ttm_bo_create(&dev_priv->bdev, bo_size,
821
+ ttm_bo_type_device,
822
+ &vmw_sys_ne_placement,
823
+ 0, false, &bo);
824
+
825
+ if (unlikely(ret != 0))
826
+ return ret;
827
+
828
+ ret = ttm_bo_reserve(bo, false, true, NULL);
829
+ BUG_ON(ret != 0);
830
+ ret = vmw_ttm_populate(bo->bdev, bo->ttm, &ctx);
831
+ if (likely(ret == 0)) {
832
+ struct vmw_ttm_tt *vmw_tt =
833
+ container_of(bo->ttm, struct vmw_ttm_tt, dma_ttm.ttm);
834
+ ret = vmw_ttm_map_dma(vmw_tt);
835
+ }
836
+
837
+ ttm_bo_unreserve(bo);
838
+
839
+ if (likely(ret == 0))
840
+ *bo_p = bo;
841
+ return ret;
842
+}