Lines Matching refs:push

46 	struct drm_nouveau_gem_pushbuf_push push[NOUVEAU_GEM_MAX_PUSH];
71 nouveau_pushbuf(struct nouveau_pushbuf *push)
73 return (struct nouveau_pushbuf_priv *)push;
80 pushbuf_kref_fits(struct nouveau_pushbuf *push, struct nouveau_bo *bo,
83 struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(push);
85 struct nouveau_device *dev = push->client->device;
148 pushbuf_kref(struct nouveau_pushbuf *push, struct nouveau_bo *bo,
151 struct nouveau_device *dev = push->client->device;
152 struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(push);
170 fpush = cli_push_get(push->client, bo);
171 if (fpush && fpush != push)
174 kref = cli_kref_get(push->client, bo);
196 !pushbuf_kref_fits(push, bo, &domains))
212 cli_kref_set(push->client, bo, kref, push);
220 pushbuf_krel(struct nouveau_pushbuf *push, struct nouveau_bo *bo,
223 struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(push);
230 pkref = cli_kref_get(push->client, nvpb->bo);
231 bkref = cli_kref_get(push->client, bo);
237 krel->reloc_bo_offset = (push->cur - nvpb->ptr) * 4;
292 kpsh = krec->push;
311 pushbuf_submit(struct nouveau_pushbuf *push, struct nouveau_object *chan)
313 struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(push);
315 struct nouveau_device *dev = push->client->device;
328 if (push->kick_notify)
329 push->kick_notify(push);
331 nouveau_pushbuf_data(push, NULL, 0, 0);
340 req.push = (uint64_t)(unsigned long)krec->push;
398 pushbuf_flush(struct nouveau_pushbuf *push)
400 struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(push);
407 if (push->channel) {
408 ret = pushbuf_submit(push, push->channel);
410 nouveau_pushbuf_data(push, NULL, 0, 0);
418 cli_kref_set(push->client, bo, NULL, NULL);
419 if (push->channel)
440 pushbuf_refn_fail(struct nouveau_pushbuf *push, int sref, int srel)
442 struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(push);
449 cli_kref_set(push->client, bo, NULL, NULL);
458 pushbuf_refn(struct nouveau_pushbuf *push, bool retry,
461 struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(push);
468 kref = pushbuf_kref(push, refs[i].bo, refs[i].flags);
476 pushbuf_refn_fail(push, sref, krec->nr_reloc);
478 pushbuf_flush(push);
479 nouveau_pushbuf_space(push, 0, 0, 0);
480 return pushbuf_refn(push, false, refs, nr);
488 pushbuf_validate(struct nouveau_pushbuf *push, bool retry)
490 struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(push);
493 struct nouveau_bufctx *bctx = push->bufctx;
498 ret = nouveau_pushbuf_space(push, relocs, relocs, 0);
509 kref = pushbuf_kref(push, bref->bo, bref->flags);
516 pushbuf_krel(push, bref->bo, bref->packet, 0, 0, 0);
517 *push->cur++ = 0;
518 pushbuf_krel(push, bref->bo, bref->data, bref->flags,
520 *push->cur++ = 0;
528 pushbuf_refn_fail(push, sref, srel);
530 pushbuf_flush(push);
531 return pushbuf_validate(push, false);
546 struct nouveau_pushbuf *push;
581 push = &nvpb->base;
582 push->client = client;
583 push->channel = immediate ? chan : NULL;
584 push->flags = NOUVEAU_BO_RD;
586 push->flags |= NOUVEAU_BO_GART;
590 push->flags |= NOUVEAU_BO_VRAM;
599 nouveau_pushbuf_del(&push);
605 *ppush = push;
636 nouveau_pushbuf_bufctx(struct nouveau_pushbuf *push, struct nouveau_bufctx *ctx)
638 struct nouveau_bufctx *prev = push->bufctx;
639 push->bufctx = ctx;
644 nouveau_pushbuf_space(struct nouveau_pushbuf *push,
647 struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(push);
649 struct nouveau_client *client = push->client;
655 if (push->cur + dwords >= push->end) {
658 if (nvpb->bo_next == nvpb->bo_nr && push->channel)
674 * if the new buffer won't fit, or if the kernel push/reloc limits
677 if ((bo && ( push->channel ||
678 !pushbuf_kref(push, bo, push->flags))) ||
682 pushbuf_flush(push);
688 ret = nouveau_bo_map(bo, NOUVEAU_BO_WR, push->client);
692 nouveau_pushbuf_data(push, NULL, 0, 0);
698 push->cur = nvpb->bgn;
699 push->end = push->cur + (nvpb->bo->size / 4);
700 push->end -= 2 + push->rsvd_kick; /* space for suffix */
703 pushbuf_kref(push, nvpb->bo, push->flags);
704 return flushed ? pushbuf_validate(push, false) : 0;
708 nouveau_pushbuf_data(struct nouveau_pushbuf *push, struct nouveau_bo *bo,
711 struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(push);
716 if (bo != nvpb->bo && nvpb->bgn != push->cur) {
718 *push->cur++ = nvpb->suffix0;
719 *push->cur++ = nvpb->suffix1;
722 nouveau_pushbuf_data(push, nvpb->bo,
724 (push->cur - nvpb->bgn) * 4);
725 nvpb->bgn = push->cur;
729 kref = cli_kref_get(push->client, bo);
731 kpsh = &krec->push[krec->nr_push++];
739 nouveau_pushbuf_refn(struct nouveau_pushbuf *push,
742 return pushbuf_refn(push, true, refs, nr);
746 nouveau_pushbuf_reloc(struct nouveau_pushbuf *push, struct nouveau_bo *bo,
749 *push->cur = pushbuf_krel(push, bo, data, flags, vor, tor);
750 push->cur++;
754 nouveau_pushbuf_validate(struct nouveau_pushbuf *push)
756 return pushbuf_validate(push, true);
760 nouveau_pushbuf_refd(struct nouveau_pushbuf *push, struct nouveau_bo *bo)
765 if (cli_push_get(push->client, bo) == push) {
766 kref = cli_kref_get(push->client, bo);
778 nouveau_pushbuf_kick(struct nouveau_pushbuf *push, struct nouveau_object *chan)
780 if (!push->channel)
781 return pushbuf_submit(push, chan);
782 pushbuf_flush(push);
783 return pushbuf_validate(push, false);