1#ifndef __NV30_WINSYS_H__ 2#define __NV30_WINSYS_H__ 3 4#include <string.h> 5#include "nouveau/nouveau_winsys.h" 6#include "nouveau/nouveau_buffer.h" 7 8/*XXX: rnn */ 9#define NV40_3D_VTXTEX_OFFSET(i) (0x0900 + ((i) * 0x20)) // 401e80 10#define NV40_3D_VTXTEX_FORMAT(i) (0x0904 + ((i) * 0x20)) // 401e90 11#define NV40_3D_VTXTEX_WRAP(i) (0x0908 + ((i) * 0x20)) // 401ea0 12#define NV40_3D_VTXTEX_ENABLE(i) (0x090c + ((i) * 0x20)) // 401eb0 13#define NV40_3D_VTXTEX_SWZ(i) (0x0910 + ((i) * 0x20)) // 401ec0 14#define NV40_3D_VTXTEX_FILTER(i) (0x0914 + ((i) * 0x20)) // 401ed0 15#define NV40_3D_VTXTEX_SIZE(i) (0x0918 + ((i) * 0x20)) // 401ee0 16#define NV40_3D_VTXTEX_BCOL(i) (0x091c + ((i) * 0x20)) // 401ef0 17#define NV30_3D_VTX_CACHE_INVALIDATE_1710 0x1710 18#define NV30_3D_R1718 0x1718 19#define NV40_3D_PRIM_RESTART_ENABLE 0x1dac 20#define NV40_3D_PRIM_RESTART_INDEX 0x1db0 21 22static INLINE void 23PUSH_RELOC(struct nouveau_pushbuf *push, struct nouveau_bo *bo, uint32_t offset, 24 uint32_t flags, uint32_t vor, uint32_t tor) 25{ 26 nouveau_pushbuf_reloc(push, bo, offset, flags, vor, tor); 27} 28 29static INLINE struct nouveau_bufctx * 30bufctx(struct nouveau_pushbuf *push) 31{ 32 struct nouveau_bufctx **pctx = push->user_priv; 33 return *pctx; 34} 35 36static INLINE void 37PUSH_RESET(struct nouveau_pushbuf *push, int bin) 38{ 39 nouveau_bufctx_reset(bufctx(push), bin); 40} 41 42static INLINE void 43PUSH_REFN(struct nouveau_pushbuf *push, int bin, 44 struct nouveau_bo *bo, uint32_t access) 45{ 46 nouveau_bufctx_refn(bufctx(push), bin, bo, access); 47} 48 49static INLINE void 50PUSH_MTHDl(struct nouveau_pushbuf *push, int subc, int mthd, int bin, 51 struct nouveau_bo *bo, uint32_t offset, uint32_t access) 52{ 53 nouveau_bufctx_mthd(bufctx(push), bin, (1 << 18) | (subc << 13) | mthd, 54 bo, offset, access | NOUVEAU_BO_LOW, 0, 0)->priv = NULL; 55 PUSH_DATA(push, bo->offset + offset); 56} 57 58static INLINE void 59PUSH_MTHDo(struct nouveau_pushbuf *push, int subc, int mthd, int bin, 60 struct nouveau_bo *bo, uint32_t access, uint32_t vor, uint32_t tor) 61{ 62 nouveau_bufctx_mthd(bufctx(push), bin, (1 << 18) | (subc << 13) | mthd, 63 bo, 0, access | NOUVEAU_BO_OR, vor, tor)->priv = NULL; 64 if (bo->flags & NOUVEAU_BO_VRAM) 65 PUSH_DATA(push, vor); 66 else 67 PUSH_DATA(push, tor); 68} 69 70static INLINE void 71PUSH_MTHDs(struct nouveau_pushbuf *push, int subc, int mthd, int bin, 72 struct nouveau_bo *bo, uint32_t data, uint32_t access, 73 uint32_t vor, uint32_t tor) 74{ 75 nouveau_bufctx_mthd(bufctx(push), bin, (1 << 18) | (subc << 13) | mthd, 76 bo, data, access | NOUVEAU_BO_OR, vor, tor)->priv = NULL; 77 if (bo->flags & NOUVEAU_BO_VRAM) 78 PUSH_DATA(push, data | vor); 79 else 80 PUSH_DATA(push, data | tor); 81} 82 83static INLINE struct nouveau_bufref * 84PUSH_MTHD(struct nouveau_pushbuf *push, int subc, int mthd, int bin, 85 struct nouveau_bo *bo, uint32_t data, uint32_t access, 86 uint32_t vor, uint32_t tor) 87{ 88 struct nouveau_bufref *bref = 89 nouveau_bufctx_mthd(bufctx(push), bin, (1 << 18) | (subc << 13) | mthd, 90 bo, data, access | NOUVEAU_BO_OR, vor, tor); 91 if (access & NOUVEAU_BO_LOW) 92 data += bo->offset; 93 if (bo->flags & NOUVEAU_BO_VRAM) 94 data |= vor; 95 else 96 data |= tor; 97 PUSH_DATA(push, data); 98 bref->priv = NULL; 99 return bref; 100} 101 102static INLINE void 103PUSH_RESRC(struct nouveau_pushbuf *push, int subc, int mthd, int bin, 104 struct nv04_resource *r, uint32_t data, uint32_t access, 105 uint32_t vor, uint32_t tor) 106{ 107 PUSH_MTHD(push, subc, mthd, bin, r->bo, r->offset + data, 108 r->domain | access, vor, tor)->priv = r; 109} 110 111static INLINE void 112BEGIN_NV04(struct nouveau_pushbuf *push, int subc, int mthd, int size) 113{ 114 PUSH_SPACE(push, size + 1); 115 PUSH_DATA (push, 0x00000000 | (size << 18) | (subc << 13) | mthd); 116} 117 118static INLINE void 119BEGIN_NI04(struct nouveau_pushbuf *push, int subc, int mthd, int size) 120{ 121 PUSH_SPACE(push, size + 1); 122 PUSH_DATA (push, 0x40000000 | (size << 18) | (subc << 13) | mthd); 123} 124 125/* subchannel assignment 126 * 127 * 0: <1.0.0 - used by kernel for m2mf 128 * 1.0.0 - used by kernel for nvsw 129 * 130 * 1: <1.0.0 - used by kernel for nvsw 131 * 1.0.0 - free for userspace 132 * 133 * 2-7: free for userspace on all kernel versions 134 */ 135 136#define SUBC_M2MF(mthd) 2, (mthd) 137#define NV03_M2MF(mthd) SUBC_M2MF(NV03_M2MF_##mthd) 138 139#define SUBC_SF2D(mthd) 3, (mthd) 140#define NV04_SF2D(mthd) SUBC_SF2D(NV04_SURFACE_2D_##mthd) 141 142#define SUBC_SSWZ(mthd) 4, (mthd) 143#define NV04_SSWZ(mthd) SUBC_SSWZ(NV04_SURFACE_SWZ_##mthd) 144 145#define SUBC_SIFM(mthd) 5, (mthd) 146#define NV03_SIFM(mthd) SUBC_SIFM(NV03_SIFM_##mthd) 147#define NV05_SIFM(mthd) SUBC_SIFM(NV05_SIFM_##mthd) 148 149#define SUBC_3D(mthd) 7, (mthd) 150#define NV30_3D(mthd) SUBC_3D(NV30_3D_##mthd) 151#define NV40_3D(mthd) SUBC_3D(NV40_3D_##mthd) 152 153#define NV01_SUBC(subc, mthd) SUBC_##subc((NV01_SUBCHAN_##mthd)) 154#define NV11_SUBC(subc, mthd) SUBC_##subc((NV11_SUBCHAN_##mthd)) 155 156#define NV04_GRAPH(subc, mthd) SUBC_##subc((NV04_GRAPH_##mthd)) 157 158#endif 159