2 * Copyright 2007 Nouveau Project
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 #include <sys/ioctl.h>
31 #include "nouveau_private.h"
34 nouveau_bo_init(struct nouveau_device
*dev
)
40 nouveau_bo_takedown(struct nouveau_device
*dev
)
45 nouveau_bo_allocated(struct nouveau_bo_priv
*nvbo
)
47 if (nvbo
->sysmem
|| nvbo
->handle
|| (nvbo
->flags
& NOUVEAU_BO_PIN
))
53 nouveau_bo_ualloc(struct nouveau_bo_priv
*nvbo
)
55 if (nvbo
->user
|| nvbo
->sysmem
) {
60 nvbo
->sysmem
= malloc(nvbo
->size
);
68 nouveau_bo_ufree(struct nouveau_bo_priv
*nvbo
)
78 nouveau_bo_kfree_nomm(struct nouveau_bo_priv
*nvbo
)
80 struct nouveau_device_priv
*nvdev
= nouveau_device(nvbo
->base
.device
);
81 struct drm_nouveau_mem_free req
;
84 drmUnmap(nvbo
->map
, nvbo
->size
);
88 req
.offset
= nvbo
->offset
;
89 if (nvbo
->domain
& NOUVEAU_BO_GART
)
90 req
.flags
= NOUVEAU_MEM_AGP
| NOUVEAU_MEM_PCI
;
92 if (nvbo
->domain
& NOUVEAU_BO_VRAM
)
93 req
.flags
= NOUVEAU_MEM_FB
;
94 drmCommandWrite(nvdev
->fd
, DRM_NOUVEAU_MEM_FREE
, &req
, sizeof(req
));
100 nouveau_bo_kfree(struct nouveau_bo_priv
*nvbo
)
102 struct nouveau_device_priv
*nvdev
= nouveau_device(nvbo
->base
.device
);
103 struct drm_gem_close req
;
108 if (!nvdev
->mm_enabled
) {
109 nouveau_bo_kfree_nomm(nvbo
);
114 munmap(nvbo
->map
, nvbo
->size
);
118 req
.handle
= nvbo
->handle
;
120 ioctl(nvdev
->fd
, DRM_IOCTL_GEM_CLOSE
, &req
);
124 nouveau_bo_kalloc_nomm(struct nouveau_bo_priv
*nvbo
)
126 struct nouveau_device_priv
*nvdev
= nouveau_device(nvbo
->base
.device
);
127 struct drm_nouveau_mem_alloc req
;
133 if (!(nvbo
->flags
& (NOUVEAU_BO_VRAM
|NOUVEAU_BO_GART
)))
134 nvbo
->flags
|= (NOUVEAU_BO_GART
| NOUVEAU_BO_VRAM
);
136 req
.size
= nvbo
->size
;
137 req
.alignment
= nvbo
->align
;
139 if (nvbo
->flags
& NOUVEAU_BO_VRAM
)
140 req
.flags
|= NOUVEAU_MEM_FB
;
141 if (nvbo
->flags
& NOUVEAU_BO_GART
)
142 req
.flags
|= (NOUVEAU_MEM_AGP
| NOUVEAU_MEM_PCI
);
143 if (nvbo
->flags
& NOUVEAU_BO_TILED
) {
144 req
.flags
|= NOUVEAU_MEM_TILE
;
145 if (nvbo
->flags
& NOUVEAU_BO_ZTILE
)
146 req
.flags
|= NOUVEAU_MEM_TILE_ZETA
;
148 req
.flags
|= NOUVEAU_MEM_MAPPED
;
150 ret
= drmCommandWriteRead(nvdev
->fd
, DRM_NOUVEAU_MEM_ALLOC
,
155 nvbo
->handle
= req
.map_handle
;
156 nvbo
->size
= req
.size
;
157 nvbo
->offset
= req
.offset
;
158 if (req
.flags
& (NOUVEAU_MEM_AGP
| NOUVEAU_MEM_PCI
))
159 nvbo
->domain
= NOUVEAU_BO_GART
;
161 if (req
.flags
& NOUVEAU_MEM_FB
)
162 nvbo
->domain
= NOUVEAU_BO_VRAM
;
168 nouveau_bo_kalloc(struct nouveau_bo_priv
*nvbo
, struct nouveau_channel
*chan
)
170 struct nouveau_device_priv
*nvdev
= nouveau_device(nvbo
->base
.device
);
171 struct drm_nouveau_gem_new req
;
174 if (nvbo
->handle
|| (nvbo
->flags
& NOUVEAU_BO_PIN
))
177 if (!nvdev
->mm_enabled
)
178 return nouveau_bo_kalloc_nomm(nvbo
);
180 req
.channel_hint
= chan
? chan
->id
: 0;
182 req
.size
= nvbo
->size
;
183 req
.align
= nvbo
->align
;
187 if (nvbo
->flags
& NOUVEAU_BO_VRAM
)
188 req
.domain
|= NOUVEAU_GEM_DOMAIN_VRAM
;
190 if (nvbo
->flags
& NOUVEAU_BO_GART
)
191 req
.domain
|= NOUVEAU_GEM_DOMAIN_GART
;
193 if (nvbo
->flags
& NOUVEAU_BO_TILED
) {
194 req
.domain
|= NOUVEAU_GEM_DOMAIN_TILE
;
195 if (nvbo
->flags
& NOUVEAU_BO_ZTILE
)
196 req
.domain
|= NOUVEAU_GEM_DOMAIN_TILE_ZETA
;
200 req
.domain
|= (NOUVEAU_GEM_DOMAIN_VRAM
|
201 NOUVEAU_GEM_DOMAIN_GART
);
204 ret
= drmCommandWriteRead(nvdev
->fd
, DRM_NOUVEAU_GEM_NEW
,
208 nvbo
->handle
= nvbo
->base
.handle
= req
.handle
;
209 nvbo
->size
= req
.size
;
210 nvbo
->domain
= req
.domain
;
211 nvbo
->offset
= req
.offset
;
217 nouveau_bo_kmap_nomm(struct nouveau_bo_priv
*nvbo
)
219 struct nouveau_device_priv
*nvdev
= nouveau_device(nvbo
->base
.device
);
222 ret
= drmMap(nvdev
->fd
, nvbo
->handle
, nvbo
->size
, &nvbo
->map
);
232 nouveau_bo_kmap(struct nouveau_bo_priv
*nvbo
)
234 struct nouveau_device_priv
*nvdev
= nouveau_device(nvbo
->base
.device
);
235 struct drm_nouveau_gem_mmap req
;
244 if (!nvdev
->mm_enabled
)
245 return nouveau_bo_kmap_nomm(nvbo
);
247 req
.handle
= nvbo
->handle
;
248 ret
= drmCommandWriteRead(nvdev
->fd
, DRM_NOUVEAU_GEM_MMAP
,
253 nvbo
->map
= (void *)(unsigned long)req
.vaddr
;
258 nouveau_bo_new(struct nouveau_device
*dev
, uint32_t flags
, int align
,
259 int size
, struct nouveau_bo
**bo
)
261 struct nouveau_bo_priv
*nvbo
;
264 if (!dev
|| !bo
|| *bo
)
267 nvbo
= calloc(1, sizeof(struct nouveau_bo_priv
));
270 nvbo
->base
.device
= dev
;
271 nvbo
->base
.size
= size
;
274 /* Don't set NOUVEAU_BO_PIN here, or nouveau_bo_allocated() will
275 * decided the buffer's already allocated when it's not. The
276 * call to nouveau_bo_pin() later will set this flag.
278 nvbo
->flags
= (flags
& ~NOUVEAU_BO_PIN
);
282 /*XXX: murder me violently */
283 if (flags
& NOUVEAU_BO_TILED
) {
284 nvbo
->base
.tiled
= 1;
285 if (flags
& NOUVEAU_BO_ZTILE
)
286 nvbo
->base
.tiled
|= 2;
289 if (flags
& NOUVEAU_BO_PIN
) {
290 ret
= nouveau_bo_pin((void *)nvbo
, nvbo
->flags
);
292 nouveau_bo_ref(NULL
, (void *)nvbo
);
302 nouveau_bo_user(struct nouveau_device
*dev
, void *ptr
, int size
,
303 struct nouveau_bo
**bo
)
305 struct nouveau_bo_priv
*nvbo
;
308 ret
= nouveau_bo_new(dev
, 0, 0, size
, bo
);
311 nvbo
= nouveau_bo(*bo
);
319 nouveau_bo_fake(struct nouveau_device
*dev
, uint64_t offset
, uint32_t flags
,
320 uint32_t size
, void *map
, struct nouveau_bo
**bo
)
322 struct nouveau_bo_priv
*nvbo
;
325 ret
= nouveau_bo_new(dev
, flags
& ~NOUVEAU_BO_PIN
, 0, size
, bo
);
328 nvbo
= nouveau_bo(*bo
);
330 nvbo
->flags
= flags
| NOUVEAU_BO_PIN
;
331 nvbo
->domain
= (flags
& (NOUVEAU_BO_VRAM
|NOUVEAU_BO_GART
));
332 nvbo
->offset
= offset
;
333 nvbo
->size
= nvbo
->base
.size
= size
;
335 nvbo
->base
.flags
= nvbo
->flags
;
336 nvbo
->base
.offset
= nvbo
->offset
;
341 nouveau_bo_handle_get(struct nouveau_bo
*bo
, uint32_t *handle
)
343 struct nouveau_device_priv
*nvdev
= nouveau_device(bo
->device
);
344 struct nouveau_bo_priv
*nvbo
= nouveau_bo(bo
);
350 if (!nvbo
->global_handle
) {
351 struct drm_gem_flink req
;
353 ret
= nouveau_bo_kalloc(nvbo
, NULL
);
357 if (nvdev
->mm_enabled
) {
358 req
.handle
= nvbo
->handle
;
359 ret
= ioctl(nvdev
->fd
, DRM_IOCTL_GEM_FLINK
, &req
);
361 nouveau_bo_kfree(nvbo
);
365 nvbo
->global_handle
= req
.name
;
367 nvbo
->global_handle
= nvbo
->offset
;
371 *handle
= nvbo
->global_handle
;
376 nouveau_bo_handle_ref(struct nouveau_device
*dev
, uint32_t handle
,
377 struct nouveau_bo
**bo
)
379 struct nouveau_device_priv
*nvdev
= nouveau_device(dev
);
380 struct nouveau_bo_priv
*nvbo
;
381 struct drm_gem_open req
;
384 ret
= nouveau_bo_new(dev
, 0, 0, 0, bo
);
387 nvbo
= nouveau_bo(*bo
);
389 if (!nvdev
->mm_enabled
) {
391 nvbo
->offset
= handle
;
392 nvbo
->domain
= NOUVEAU_BO_VRAM
;
393 nvbo
->flags
= NOUVEAU_BO_VRAM
| NOUVEAU_BO_PIN
;
394 nvbo
->base
.offset
= nvbo
->offset
;
395 nvbo
->base
.flags
= nvbo
->flags
;
398 ret
= ioctl(nvdev
->fd
, DRM_IOCTL_GEM_OPEN
, &req
);
400 nouveau_bo_ref(NULL
, bo
);
404 nvbo
->size
= req
.size
;
405 nvbo
->handle
= req
.handle
;
408 nvbo
->base
.handle
= nvbo
->handle
;
413 nouveau_bo_del_cb(void *priv
)
415 struct nouveau_bo_priv
*nvbo
= priv
;
417 nouveau_fence_ref(NULL
, &nvbo
->fence
);
418 nouveau_fence_ref(NULL
, &nvbo
->wr_fence
);
419 nouveau_bo_kfree(nvbo
);
424 nouveau_bo_del(struct nouveau_bo
**bo
)
426 struct nouveau_bo_priv
*nvbo
;
430 nvbo
= nouveau_bo(*bo
);
433 if (--nvbo
->refcount
)
437 nvbo
->pending
= NULL
;
438 nouveau_pushbuf_flush(nvbo
->pending_channel
, 0);
441 nouveau_bo_ufree(nvbo
);
443 if (!nouveau_device(nvbo
->base
.device
)->mm_enabled
&& nvbo
->fence
) {
444 nouveau_fence_flush(nvbo
->fence
->channel
);
445 if (nouveau_fence(nvbo
->fence
)->signalled
) {
446 nouveau_bo_del_cb(nvbo
);
448 nouveau_fence_signal_cb(nvbo
->fence
,
449 nouveau_bo_del_cb
, nvbo
);
452 nouveau_bo_del_cb(nvbo
);
457 nouveau_bo_ref(struct nouveau_bo
*ref
, struct nouveau_bo
**pbo
)
463 nouveau_bo(ref
)->refcount
++;
473 nouveau_bo_wait_nomm(struct nouveau_bo
*bo
, int cpu_write
)
475 struct nouveau_bo_priv
*nvbo
= nouveau_bo(bo
);
479 ret
= nouveau_fence_wait(&nvbo
->fence
);
481 ret
= nouveau_fence_wait(&nvbo
->wr_fence
);
485 nvbo
->write_marker
= 0;
490 nouveau_bo_wait(struct nouveau_bo
*bo
, int cpu_write
)
492 struct nouveau_device_priv
*nvdev
= nouveau_device(bo
->device
);
493 struct nouveau_bo_priv
*nvbo
= nouveau_bo(bo
);
494 struct drm_nouveau_gem_cpu_prep req
;
497 if (!nvbo
->global_handle
&& !nvbo
->write_marker
&& !cpu_write
)
501 (nvbo
->pending
->write_domains
|| cpu_write
)) {
502 nvbo
->pending
= NULL
;
503 nouveau_pushbuf_flush(nvbo
->pending_channel
, 0);
506 if (!nvdev
->mm_enabled
)
507 return nouveau_bo_wait_nomm(bo
, cpu_write
);
509 req
.handle
= nvbo
->handle
;
510 ret
= drmCommandWrite(nvdev
->fd
, DRM_NOUVEAU_GEM_CPU_PREP
,
515 nvbo
->write_marker
= 0;
520 nouveau_bo_map(struct nouveau_bo
*bo
, uint32_t flags
)
522 struct nouveau_bo_priv
*nvbo
= nouveau_bo(bo
);
525 if (!nvbo
|| bo
->map
)
528 if (!nouveau_bo_allocated(nvbo
)) {
529 if (nvbo
->flags
& (NOUVEAU_BO_VRAM
| NOUVEAU_BO_GART
)) {
530 ret
= nouveau_bo_kalloc(nvbo
, NULL
);
535 if (!nouveau_bo_allocated(nvbo
)) {
536 ret
= nouveau_bo_ualloc(nvbo
);
543 bo
->map
= nvbo
->sysmem
;
545 ret
= nouveau_bo_kmap(nvbo
);
549 ret
= nouveau_bo_wait(bo
, (flags
& NOUVEAU_BO_WR
));
560 nouveau_bo_unmap(struct nouveau_bo
*bo
)
562 struct nouveau_device_priv
*nvdev
= nouveau_device(bo
->device
);
563 struct nouveau_bo_priv
*nvbo
= nouveau_bo(bo
);
565 if (nvdev
->mm_enabled
&& bo
->map
&& !nvbo
->sysmem
) {
566 struct nouveau_device_priv
*nvdev
= nouveau_device(bo
->device
);
567 struct drm_nouveau_gem_cpu_fini req
;
569 req
.handle
= nvbo
->handle
;
570 drmCommandWrite(nvdev
->fd
, DRM_NOUVEAU_GEM_CPU_FINI
,
578 nouveau_bo_validate_nomm(struct nouveau_bo_priv
*nvbo
, uint32_t flags
)
580 struct nouveau_bo
*new = NULL
;
581 uint32_t t_handle
, t_domain
, t_offset
, t_size
;
585 if ((flags
& NOUVEAU_BO_VRAM
) && nvbo
->domain
== NOUVEAU_BO_VRAM
)
587 if ((flags
& NOUVEAU_BO_GART
) && nvbo
->domain
== NOUVEAU_BO_GART
)
589 assert(flags
& (NOUVEAU_BO_VRAM
|NOUVEAU_BO_GART
));
591 /* Keep tiling info */
592 flags
|= (nvbo
->flags
& (NOUVEAU_BO_TILED
|NOUVEAU_BO_ZTILE
));
594 ret
= nouveau_bo_new(nvbo
->base
.device
, flags
, 0, nvbo
->size
, &new);
598 ret
= nouveau_bo_kalloc(nouveau_bo(new), NULL
);
600 nouveau_bo_ref(NULL
, &new);
604 if (nvbo
->handle
|| nvbo
->sysmem
) {
605 nouveau_bo_kmap(nouveau_bo(new));
607 if (!nvbo
->base
.map
) {
608 nouveau_bo_map(&nvbo
->base
, NOUVEAU_BO_RD
);
609 memcpy(nouveau_bo(new)->map
, nvbo
->base
.map
, nvbo
->base
.size
);
610 nouveau_bo_unmap(&nvbo
->base
);
612 memcpy(nouveau_bo(new)->map
, nvbo
->base
.map
, nvbo
->base
.size
);
616 t_handle
= nvbo
->handle
;
617 t_domain
= nvbo
->domain
;
618 t_offset
= nvbo
->offset
;
622 nvbo
->handle
= nouveau_bo(new)->handle
;
623 nvbo
->domain
= nouveau_bo(new)->domain
;
624 nvbo
->offset
= nouveau_bo(new)->offset
;
625 nvbo
->size
= nouveau_bo(new)->size
;
626 nvbo
->map
= nouveau_bo(new)->map
;
628 nouveau_bo(new)->handle
= t_handle
;
629 nouveau_bo(new)->domain
= t_domain
;
630 nouveau_bo(new)->offset
= t_offset
;
631 nouveau_bo(new)->size
= t_size
;
632 nouveau_bo(new)->map
= t_map
;
634 nouveau_bo_ref(NULL
, &new);
640 nouveau_bo_pin_nomm(struct nouveau_bo
*bo
, uint32_t flags
)
642 struct nouveau_bo_priv
*nvbo
= nouveau_bo(bo
);
646 if (!(flags
& (NOUVEAU_BO_VRAM
| NOUVEAU_BO_GART
)))
649 ret
= nouveau_bo_validate_nomm(nvbo
, flags
& ~NOUVEAU_BO_PIN
);
656 /* Fill in public nouveau_bo members */
657 bo
->flags
= nvbo
->domain
;
658 bo
->offset
= nvbo
->offset
;
664 nouveau_bo_pin(struct nouveau_bo
*bo
, uint32_t flags
)
666 struct nouveau_device_priv
*nvdev
= nouveau_device(bo
->device
);
667 struct nouveau_bo_priv
*nvbo
= nouveau_bo(bo
);
668 struct drm_nouveau_gem_pin req
;
674 if (!nvdev
->mm_enabled
)
675 return nouveau_bo_pin_nomm(bo
, flags
);
677 /* Ensure we have a kernel object... */
679 if (!(flags
& (NOUVEAU_BO_VRAM
| NOUVEAU_BO_GART
)))
683 ret
= nouveau_bo_kalloc(nvbo
, NULL
);
688 /* Now force it to stay put :) */
689 req
.handle
= nvbo
->handle
;
691 if (nvbo
->flags
& NOUVEAU_BO_VRAM
)
692 req
.domain
|= NOUVEAU_GEM_DOMAIN_VRAM
;
693 if (nvbo
->flags
& NOUVEAU_BO_GART
)
694 req
.domain
|= NOUVEAU_GEM_DOMAIN_GART
;
696 ret
= drmCommandWriteRead(nvdev
->fd
, DRM_NOUVEAU_GEM_PIN
, &req
,
697 sizeof(struct drm_nouveau_gem_pin
));
700 nvbo
->offset
= req
.offset
;
701 nvbo
->domain
= req
.domain
;
703 nvbo
->flags
|= NOUVEAU_BO_PIN
;
705 /* Fill in public nouveau_bo members */
706 if (nvbo
->domain
& NOUVEAU_GEM_DOMAIN_VRAM
)
707 bo
->flags
= NOUVEAU_BO_VRAM
;
708 if (nvbo
->domain
& NOUVEAU_GEM_DOMAIN_GART
)
709 bo
->flags
= NOUVEAU_BO_GART
;
710 bo
->offset
= nvbo
->offset
;
716 nouveau_bo_unpin(struct nouveau_bo
*bo
)
718 struct nouveau_device_priv
*nvdev
= nouveau_device(bo
->device
);
719 struct nouveau_bo_priv
*nvbo
= nouveau_bo(bo
);
720 struct drm_nouveau_gem_unpin req
;
725 if (nvdev
->mm_enabled
) {
726 req
.handle
= nvbo
->handle
;
727 drmCommandWrite(nvdev
->fd
, DRM_NOUVEAU_GEM_UNPIN
,
731 nvbo
->pinned
= bo
->offset
= bo
->flags
= 0;
735 nouveau_bo_tile(struct nouveau_bo
*bo
, uint32_t flags
, uint32_t delta
,
738 struct nouveau_device_priv
*nvdev
= nouveau_device(bo
->device
);
739 struct nouveau_bo_priv
*nvbo
= nouveau_bo(bo
);
740 uint32_t kern_flags
= 0;
743 if (flags
& NOUVEAU_BO_TILED
) {
744 kern_flags
|= NOUVEAU_MEM_TILE
;
745 if (flags
& NOUVEAU_BO_ZTILE
)
746 kern_flags
|= NOUVEAU_MEM_TILE_ZETA
;
749 if (nvdev
->mm_enabled
) {
750 struct drm_nouveau_gem_tile req
;
752 req
.handle
= nvbo
->handle
;
755 req
.flags
= kern_flags
;
756 ret
= drmCommandWrite(nvdev
->fd
, DRM_NOUVEAU_GEM_TILE
,
759 struct drm_nouveau_mem_tile req
;
761 req
.offset
= nvbo
->offset
;
764 req
.flags
= kern_flags
;
766 if (flags
& NOUVEAU_BO_VRAM
)
767 req
.flags
|= NOUVEAU_MEM_FB
;
768 if (flags
& NOUVEAU_BO_GART
)
769 req
.flags
|= NOUVEAU_MEM_AGP
;
771 ret
= drmCommandWrite(nvdev
->fd
, DRM_NOUVEAU_MEM_TILE
,
779 nouveau_bo_busy(struct nouveau_bo
*bo
, uint32_t access
)
781 struct nouveau_device_priv
*nvdev
= nouveau_device(bo
->device
);
782 struct nouveau_bo_priv
*nvbo
= nouveau_bo(bo
);
784 if (!nvdev
->mm_enabled
) {
785 struct nouveau_fence
*fence
;
787 if (nvbo
->pending
&& (nvbo
->pending
->write_domains
||
788 (access
& NOUVEAU_BO_WR
)))
791 if (access
& NOUVEAU_BO_WR
)
794 fence
= nvbo
->wr_fence
;
795 return !nouveau_fence(fence
)->signalled
;
801 struct drm_nouveau_gem_pushbuf_bo
*
802 nouveau_bo_emit_buffer(struct nouveau_channel
*chan
, struct nouveau_bo
*bo
)
804 struct nouveau_pushbuf_priv
*nvpb
= nouveau_pushbuf(chan
->pushbuf
);
805 struct nouveau_bo_priv
*nvbo
= nouveau_bo(bo
);
806 struct drm_nouveau_gem_pushbuf_bo
*pbbo
;
807 struct nouveau_bo
*ref
= NULL
;
811 return nvbo
->pending
;
814 ret
= nouveau_bo_kalloc(nvbo
, chan
);
819 void *sysmem_tmp
= nvbo
->sysmem
;
822 ret
= nouveau_bo_map(bo
, NOUVEAU_BO_WR
);
825 nvbo
->sysmem
= sysmem_tmp
;
827 memcpy(bo
->map
, nvbo
->sysmem
, nvbo
->base
.size
);
828 nouveau_bo_unmap(bo
);
829 nouveau_bo_ufree(nvbo
);
833 if (nvpb
->nr_buffers
>= NOUVEAU_PUSHBUF_MAX_BUFFERS
)
835 pbbo
= nvpb
->buffers
+ nvpb
->nr_buffers
++;
836 nvbo
->pending
= pbbo
;
837 nvbo
->pending_channel
= chan
;
839 nouveau_bo_ref(bo
, &ref
);
840 pbbo
->user_priv
= (uint64_t)(unsigned long)ref
;
841 pbbo
->handle
= nvbo
->handle
;
842 pbbo
->valid_domains
= NOUVEAU_GEM_DOMAIN_VRAM
| NOUVEAU_GEM_DOMAIN_GART
;
843 pbbo
->read_domains
= 0;
844 pbbo
->write_domains
= 0;
845 pbbo
->presumed_domain
= nvbo
->domain
;
846 pbbo
->presumed_offset
= nvbo
->offset
;
847 pbbo
->presumed_ok
= 1;