2 #ifndef __NVC0_WINSYS_H__
3 #define __NVC0_WINSYS_H__
7 #include "pipe/p_defines.h"
9 #include "nouveau/nouveau_bo.h"
10 #include "nouveau/nouveau_channel.h"
11 #include "nouveau/nouveau_device.h"
12 #include "nouveau/nouveau_resource.h"
13 #include "nouveau/nouveau_reloc.h"
15 #include "nvc0_resource.h" /* OUT_RESRC */
17 #ifndef NV04_PFIFO_MAX_PACKET_LEN
18 #define NV04_PFIFO_MAX_PACKET_LEN 2047
21 #define SLEEP(us) usleep(us)
23 extern uint64_t nouveau_bo_gpu_address(struct nouveau_bo
*);
25 #define NVC0_SUBCH_3D 1
26 #define NVC0_SUBCH_2D 2
27 #define NVC0_SUBCH_MF 3
29 #define NVC0_MF_(n) NVC0_M2MF_##n
31 #define RING_3D(n) ((NVC0_SUBCH_3D << 13) | (NVC0_3D_##n >> 2))
32 #define RING_2D(n) ((NVC0_SUBCH_2D << 13) | (NVC0_2D_##n >> 2))
33 #define RING_MF(n) ((NVC0_SUBCH_MF << 13) | (NVC0_MF_(n) >> 2))
35 #define RING_3D_(m) ((NVC0_SUBCH_3D << 13) | ((m) >> 2))
36 #define RING_2D_(m) ((NVC0_SUBCH_2D << 13) | ((m) >> 2))
37 #define RING_MF_(m) ((NVC0_SUBCH_MF << 13) | ((m) >> 2))
39 #define RING_ANY(m) ((NVC0_SUBCH_3D << 13) | ((m) >> 2))
41 int nouveau_pushbuf_flush(struct nouveau_channel
*, unsigned min
);
43 static inline uint32_t
44 nouveau_bo_tile_layout(struct nouveau_bo
*bo
)
46 return bo
->tile_flags
& NOUVEAU_BO_TILE_LAYOUT_MASK
;
50 WAIT_RING(struct nouveau_channel
*chan
, unsigned size
)
52 if (chan
->cur
+ size
> chan
->end
)
53 nouveau_pushbuf_flush(chan
, size
);
57 OUT_RING(struct nouveau_channel
*chan
, uint32_t data
)
59 *(chan
->cur
++) = (data
);
62 /* incremental methods */
64 BEGIN_RING(struct nouveau_channel
*chan
, uint32_t mthd
, unsigned size
)
66 WAIT_RING(chan
, size
+ 1);
67 OUT_RING (chan
, (0x2 << 28) | (size
<< 16) | mthd
);
72 BEGIN_RING_NI(struct nouveau_channel
*chan
, uint32_t mthd
, unsigned size
)
74 WAIT_RING(chan
, size
+ 1);
75 OUT_RING (chan
, (0x6 << 28) | (size
<< 16) | mthd
);
80 BEGIN_RING_1I(struct nouveau_channel
*chan
, uint32_t mthd
, unsigned size
)
82 WAIT_RING(chan
, size
+ 1);
83 OUT_RING (chan
, (0xa << 28) | (size
<< 16) | mthd
);
88 INLIN_RING(struct nouveau_channel
*chan
, uint32_t mthd
, unsigned data
)
91 OUT_RING (chan
, (0x8 << 28) | (data
<< 16) | mthd
);
95 nouveau_pushbuf_marker_emit(struct nouveau_channel
*chan
,
96 unsigned wait_dwords
, unsigned wait_relocs
);
98 nouveau_pushbuf_emit_reloc(struct nouveau_channel
*, void *ptr
,
99 struct nouveau_bo
*, uint32_t data
, uint32_t data2
,
100 uint32_t flags
, uint32_t vor
, uint32_t tor
);
102 nouveau_pushbuf_submit(struct nouveau_channel
*chan
, struct nouveau_bo
*bo
,
103 unsigned offset
, unsigned length
);
106 MARK_RING(struct nouveau_channel
*chan
, unsigned dwords
, unsigned relocs
)
108 return nouveau_pushbuf_marker_emit(chan
, dwords
, relocs
);
112 OUT_RINGf(struct nouveau_channel
*chan
, float data
)
114 union { uint32_t i
; float f
; } u
;
119 static INLINE
unsigned
120 AVAIL_RING(struct nouveau_channel
*chan
)
122 return chan
->end
- chan
->cur
;
126 OUT_RINGp(struct nouveau_channel
*chan
, const void *data
, unsigned size
)
128 memcpy(chan
->cur
, data
, size
* 4);
133 OUT_RELOC(struct nouveau_channel
*chan
, struct nouveau_bo
*bo
,
134 unsigned data
, unsigned flags
, unsigned vor
, unsigned tor
)
136 return nouveau_pushbuf_emit_reloc(chan
, chan
->cur
++, bo
,
137 data
, 0, flags
, vor
, tor
);
141 OUT_RELOCl(struct nouveau_channel
*chan
, struct nouveau_bo
*bo
,
142 unsigned delta
, unsigned flags
)
144 return OUT_RELOC(chan
, bo
, delta
, flags
| NOUVEAU_BO_LOW
, 0, 0);
148 OUT_RELOCh(struct nouveau_channel
*chan
, struct nouveau_bo
*bo
,
149 unsigned delta
, unsigned flags
)
151 return OUT_RELOC(chan
, bo
, delta
, flags
| NOUVEAU_BO_HIGH
, 0, 0);
155 OUT_RESRCh(struct nouveau_channel
*chan
, struct nvc0_resource
*res
,
156 unsigned delta
, unsigned flags
)
158 return OUT_RELOCh(chan
, res
->bo
, res
->offset
+ delta
, res
->domain
| flags
);
162 OUT_RESRCl(struct nouveau_channel
*chan
, struct nvc0_resource
*res
,
163 unsigned delta
, unsigned flags
)
165 return OUT_RELOCl(chan
, res
->bo
, res
->offset
+ delta
, res
->domain
| flags
);
169 FIRE_RING(struct nouveau_channel
*chan
)
171 nouveau_pushbuf_flush(chan
, 0);