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 22 static INLINE void 23 PUSH_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 29 static INLINE struct nouveau_bufctx * 30 bufctx(struct nouveau_pushbuf *push) 31 { 32 struct nouveau_bufctx **pctx = push->user_priv; 33 return *pctx; 34 } 35 36 static INLINE void 37 PUSH_RESET(struct nouveau_pushbuf *push, int bin) 38 { 39 nouveau_bufctx_reset(bufctx(push), bin); 40 } 41 42 static INLINE void 43 PUSH_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 49 static INLINE void 50 PUSH_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 58 static INLINE void 59 PUSH_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 70 static INLINE void 71 PUSH_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 83 static INLINE struct nouveau_bufref * 84 PUSH_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 102 static INLINE void 103 PUSH_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 111 static INLINE void 112 BEGIN_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 118 static INLINE void 119 BEGIN_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