Lines Matching refs:chan
44 OUT_RINGp(struct nouveau_channel *chan, const void *data, unsigned nr_dwords)
47 u32 *mem = ttm_kmap_obj_virtual(&chan->push.buffer->kmap, &is_iomem);
48 mem = &mem[chan->dma.cur];
53 chan->dma.cur += nr_dwords;
69 READ_GET(struct nouveau_channel *chan, uint64_t *prev_get, int *timeout)
73 val = nvif_rd32(&chan->user, chan->user_get);
74 if (chan->user_get_hi)
75 val |= (uint64_t)nvif_rd32(&chan->user, chan->user_get_hi) << 32;
92 if (val < chan->push.addr ||
93 val > chan->push.addr + (chan->dma.max << 2))
96 return (val - chan->push.addr) >> 2;
100 nv50_dma_push(struct nouveau_channel *chan, u64 offset, int length)
102 struct nvif_user *user = &chan->drm->client.device.user;
103 struct nouveau_bo *pb = chan->push.buffer;
104 int ip = (chan->dma.ib_put * 2) + chan->dma.ib_base;
106 BUG_ON(chan->dma.ib_free < 1);
111 chan->dma.ib_put = (chan->dma.ib_put + 1) & chan->dma.ib_max;
117 nvif_wr32(&chan->user, 0x8c, chan->dma.ib_put);
119 user->func->doorbell(user, chan->token);
120 chan->dma.ib_free--;
124 nv50_dma_push_wait(struct nouveau_channel *chan, int count)
128 while (chan->dma.ib_free < count) {
129 uint32_t get = nvif_rd32(&chan->user, 0x88);
141 chan->dma.ib_free = get - chan->dma.ib_put;
142 if (chan->dma.ib_free <= 0)
143 chan->dma.ib_free += chan->dma.ib_max;
150 nv50_dma_wait(struct nouveau_channel *chan, int slots, int count)
155 ret = nv50_dma_push_wait(chan, slots + 1);
159 while (chan->dma.free < count) {
160 int get = READ_GET(chan, &prev_get, &cnt);
168 if (get <= chan->dma.cur) {
169 chan->dma.free = chan->dma.max - chan->dma.cur;
170 if (chan->dma.free >= count)
173 FIRE_RING(chan);
175 get = READ_GET(chan, &prev_get, &cnt);
182 chan->dma.cur = 0;
183 chan->dma.put = 0;
186 chan->dma.free = get - chan->dma.cur - 1;
193 nouveau_dma_wait(struct nouveau_channel *chan, int slots, int size)
198 if (chan->dma.ib_max)
199 return nv50_dma_wait(chan, slots, size);
201 while (chan->dma.free < size) {
202 get = READ_GET(chan, &prev_get, &cnt);
218 if (get <= chan->dma.cur) {
232 chan->dma.free = chan->dma.max - chan->dma.cur;
233 if (chan->dma.free >= size)
240 OUT_RING(chan, chan->push.addr | 0x20000000);
248 get = READ_GET(chan, &prev_get, &cnt);
259 chan->dma.cur =
260 chan->dma.put = NOUVEAU_DMA_SKIPS;
269 chan->dma.free = get - chan->dma.cur - 1;