Blame view
drivers/gpu/drm/nouveau/nouveau_dma.h
3.54 KB
6ee738610 drm/nouveau: Add ... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/* * Copyright (C) 2007 Ben Skeggs. * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __NOUVEAU_DMA_H__ #define __NOUVEAU_DMA_H__ |
ebb945a94 drm/nouveau: port... |
29 30 |
#include "nouveau_bo.h" #include "nouveau_chan.h" |
6ee738610 drm/nouveau: Add ... |
31 |
|
ebb945a94 drm/nouveau: port... |
32 |
int nouveau_dma_wait(struct nouveau_channel *, int slots, int size); |
19ca10d82 drm/nouveau/gem: ... |
33 |
void nv50_dma_push(struct nouveau_channel *, u64 addr, int length); |
9a391ad8a drm/nv50: switch ... |
34 |
|
6ee738610 drm/nouveau: Add ... |
35 36 37 38 39 40 41 42 43 44 45 |
/* * There's a hw race condition where you can't jump to your PUT offset, * to avoid this we jump to offset + SKIPS and fill the difference with * NOPs. * * xf86-video-nv configures the DMA fetch size to 32 bytes, and uses * a SKIPS value of 8. Lets assume that the race condition is to do * with writing into the fetch area, we configure a fetch size of 128 * bytes so we need a larger SKIPS value. */ #define NOUVEAU_DMA_SKIPS (128 / 4) |
f45f55c4b drm/nouveau: remo... |
46 |
/* Object handles - for stuff that's doesn't use handle == oclass. */ |
6ee738610 drm/nouveau: Add ... |
47 |
enum { |
6ee738610 drm/nouveau: Add ... |
48 49 |
NvDmaFB = 0x80000002, NvDmaTT = 0x80000003, |
6ee738610 drm/nouveau: Add ... |
50 |
NvNotify0 = 0x80000006, |
0c6c1c2fb drm/nouveau: Use ... |
51 |
NvSema = 0x8000000f, |
cdccc70ef drm/nv50-nvc0: in... |
52 53 |
NvEvoSema0 = 0x80000010, NvEvoSema1 = 0x80000011, |
6ee738610 drm/nouveau: Add ... |
54 |
}; |
6ee738610 drm/nouveau: Add ... |
55 56 57 |
static __must_check inline int RING_SPACE(struct nouveau_channel *chan, int size) { |
9a391ad8a drm/nv50: switch ... |
58 |
int ret; |
6ee738610 drm/nouveau: Add ... |
59 |
|
9a391ad8a drm/nv50: switch ... |
60 61 62 |
ret = nouveau_dma_wait(chan, 1, size); if (ret) return ret; |
6ee738610 drm/nouveau: Add ... |
63 64 65 66 67 68 69 70 |
chan->dma.free -= size; return 0; } static inline void OUT_RING(struct nouveau_channel *chan, int data) { |
ebb945a94 drm/nouveau: port... |
71 |
nouveau_bo_wr32(chan->push.buffer, chan->dma.cur++, data); |
6ee738610 drm/nouveau: Add ... |
72 |
} |
6ee738610 drm/nouveau: Add ... |
73 |
#define WRITE_PUT(val) do { \ |
85b2331b3 drm: Kill DRM_*ME... |
74 |
mb(); \ |
ebb945a94 drm/nouveau: port... |
75 |
nouveau_bo_rd32(chan->push.buffer, 0); \ |
24e8375b1 drm/nouveau: sepa... |
76 |
nvif_wr32(&chan->user, chan->user_put, ((val) << 2) + chan->push.addr);\ |
6ee738610 drm/nouveau: Add ... |
77 78 79 80 81 |
} while (0) static inline void FIRE_RING(struct nouveau_channel *chan) { |
6ee738610 drm/nouveau: Add ... |
82 83 84 |
if (chan->dma.cur == chan->dma.put) return; chan->accel_done = true; |
9a391ad8a drm/nv50: switch ... |
85 |
if (chan->dma.ib_max) { |
19ca10d82 drm/nouveau/gem: ... |
86 |
nv50_dma_push(chan, chan->push.addr + (chan->dma.put << 2), |
a1606a959 drm/nouveau: new ... |
87 |
(chan->dma.cur - chan->dma.put) << 2); |
9a391ad8a drm/nv50: switch ... |
88 89 90 |
} else { WRITE_PUT(chan->dma.cur); } |
6ee738610 drm/nouveau: Add ... |
91 92 93 94 95 96 97 98 |
chan->dma.put = chan->dma.cur; } static inline void WIND_RING(struct nouveau_channel *chan) { chan->dma.cur = chan->dma.put; } |
ebb945a94 drm/nouveau: port... |
99 100 101 102 103 104 |
/* NV_SW object class */ #define NV_SW_DMA_VBLSEM 0x0000018c #define NV_SW_VBLSEM_OFFSET 0x00000400 #define NV_SW_VBLSEM_RELEASE_VALUE 0x00000404 #define NV_SW_VBLSEM_RELEASE 0x00000408 #define NV_SW_PAGE_FLIP 0x00000500 |
6ee738610 drm/nouveau: Add ... |
105 |
#endif |