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