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