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
PUSH_RELOC(struct nouveau_pushbuf * push,struct nouveau_bo * bo,uint32_t offset,uint32_t flags,uint32_t vor,uint32_t tor)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 *
bufctx(struct nouveau_pushbuf * push)30 bufctx(struct nouveau_pushbuf *push)
31 {
32 struct nouveau_bufctx **pctx = push->user_priv;
33 return *pctx;
34 }
35
36 static INLINE void
PUSH_RESET(struct nouveau_pushbuf * push,int bin)37 PUSH_RESET(struct nouveau_pushbuf *push, int bin)
38 {
39 nouveau_bufctx_reset(bufctx(push), bin);
40 }
41
42 static INLINE void
PUSH_REFN(struct nouveau_pushbuf * push,int bin,struct nouveau_bo * bo,uint32_t access)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
PUSH_MTHDl(struct nouveau_pushbuf * push,int subc,int mthd,int bin,struct nouveau_bo * bo,uint32_t offset,uint32_t access)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
PUSH_MTHDo(struct nouveau_pushbuf * push,int subc,int mthd,int bin,struct nouveau_bo * bo,uint32_t access,uint32_t vor,uint32_t tor)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
PUSH_MTHDs(struct nouveau_pushbuf * push,int subc,int mthd,int bin,struct nouveau_bo * bo,uint32_t data,uint32_t access,uint32_t vor,uint32_t tor)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 *
PUSH_MTHD(struct nouveau_pushbuf * push,int subc,int mthd,int bin,struct nouveau_bo * bo,uint32_t data,uint32_t access,uint32_t vor,uint32_t tor)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
PUSH_RESRC(struct nouveau_pushbuf * push,int subc,int mthd,int bin,struct nv04_resource * r,uint32_t data,uint32_t access,uint32_t vor,uint32_t tor)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
BEGIN_NV04(struct nouveau_pushbuf * push,int subc,int mthd,int size)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
BEGIN_NI04(struct nouveau_pushbuf * push,int subc,int mthd,int size)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