1fa225cbcSrjs/**************************************************************************
2fa225cbcSrjs
3fa225cbcSrjsCopyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
4fa225cbcSrjsCopyright © 2002 David Dawes
5fa225cbcSrjs
6fa225cbcSrjsAll Rights Reserved.
7fa225cbcSrjs
8fa225cbcSrjsPermission is hereby granted, free of charge, to any person obtaining a
9fa225cbcSrjscopy of this software and associated documentation files (the
10fa225cbcSrjs"Software"), to deal in the Software without restriction, including
11fa225cbcSrjswithout limitation the rights to use, copy, modify, merge, publish,
12fa225cbcSrjsdistribute, sub license, and/or sell copies of the Software, and to
13fa225cbcSrjspermit persons to whom the Software is furnished to do so, subject to
14fa225cbcSrjsthe following conditions:
15fa225cbcSrjs
16fa225cbcSrjsThe above copyright notice and this permission notice (including the
17fa225cbcSrjsnext paragraph) shall be included in all copies or substantial portions
18fa225cbcSrjsof the Software.
19fa225cbcSrjs
20fa225cbcSrjsTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21fa225cbcSrjsOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22fa225cbcSrjsMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
23fa225cbcSrjsIN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
24fa225cbcSrjsANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25fa225cbcSrjsTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26fa225cbcSrjsSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27fa225cbcSrjs
28fa225cbcSrjs**************************************************************************/
29fa225cbcSrjs
30fa225cbcSrjs#ifndef _INTEL_RING_H
31fa225cbcSrjs#define _INTEL_RING_H
32fa225cbcSrjs
33fa225cbcSrjs#define OUT_RING(n) do {						\
34fa225cbcSrjs    if (I810_DEBUG & DEBUG_VERBOSE_RING)				\
35fa225cbcSrjs	ErrorF("OUT_RING 0x%08x: 0x%08x, (mask %x)\n",			\
36fa225cbcSrjs	       pI830->ring_next, (unsigned int)(n),			\
37fa225cbcSrjs	       pI830->ring.tail_mask);					\
38fa225cbcSrjs    *(volatile uint32_t *)(pI830->ring.virtual_start +			\
39fa225cbcSrjs			   pI830->ring_next) = n;			\
40fa225cbcSrjs    pI830->ring_used += 4;						\
41fa225cbcSrjs    pI830->ring_next += 4;						\
42fa225cbcSrjs    pI830->ring_next &= pI830->ring.tail_mask;				\
43fa225cbcSrjs} while (0)
44fa225cbcSrjs
45fa225cbcSrjs#define OUT_RING_F(x) do {			\
46fa225cbcSrjs	union intfloat tmp;			\
47fa225cbcSrjs	tmp.f = (float)(x);			\
48fa225cbcSrjs	OUT_RING(tmp.ui);			\
49fa225cbcSrjs} while(0)
50fa225cbcSrjs
51fa225cbcSrjs#define ADVANCE_LP_RING() do {						\
52fa225cbcSrjs    if (pI830->ring_emitting == 0)					\
53fa225cbcSrjs	FatalError("%s: ADVANCE_LP_RING called with no matching "	\
54fa225cbcSrjs		   "BEGIN_LP_RING\n", __FUNCTION__);			\
55fa225cbcSrjs    if (pI830->ring_used > pI830->ring_emitting)			\
56fa225cbcSrjs	FatalError("%s: ADVANCE_LP_RING: exceeded allocation %d/%d\n ",	\
57fa225cbcSrjs		   __FUNCTION__, pI830->ring_used,			\
58fa225cbcSrjs		   pI830->ring_emitting);				\
59fa225cbcSrjs    if (pI830->ring_used < pI830->ring_emitting)			\
60fa225cbcSrjs	FatalError("%s: ADVANCE_LP_RING: under-used allocation %d/%d\n ", \
61fa225cbcSrjs		   __FUNCTION__, pI830->ring_used,			\
62fa225cbcSrjs		   pI830->ring_emitting);				\
63fa225cbcSrjs    pI830->ring.tail = pI830->ring_next;				\
64fa225cbcSrjs    pI830->ring.space -= pI830->ring_used;				\
65fa225cbcSrjs    if (pI830->ring_next & 0x07)					\
66fa225cbcSrjs	FatalError("%s: ADVANCE_LP_RING: "				\
67fa225cbcSrjs		   "ring_next (0x%x) isn't on a QWord boundary\n",	\
68fa225cbcSrjs		   __FUNCTION__, pI830->ring_next);			\
69fa225cbcSrjs    OUTREG(LP_RING + RING_TAIL, pI830->ring_next);			\
70fa225cbcSrjs    pI830->ring_emitting = 0;						\
71fa225cbcSrjs} while (0)
72fa225cbcSrjs
73fa225cbcSrjs#define BEGIN_LP_RING(n)						\
74fa225cbcSrjsdo {									\
75fa225cbcSrjs    if (pI830->ring_emitting != 0)					\
76fa225cbcSrjs	FatalError("%s: BEGIN_LP_RING called without closing "		\
77fa225cbcSrjs		   "ADVANCE_LP_RING\n", __FUNCTION__);			\
78fa225cbcSrjs    if ((n) > 2 && (I810_DEBUG&DEBUG_ALWAYS_SYNC))			\
79fa225cbcSrjs	i830_wait_ring_idle(pScrn);					\
80fa225cbcSrjs    pI830->ring_emitting = (n) * 4;					\
81fa225cbcSrjs    if ((n) & 1)							\
82fa225cbcSrjs	pI830->ring_emitting += 4;					\
83fa225cbcSrjs    if (pI830->ring.space < pI830->ring_emitting)			\
84fa225cbcSrjs	WaitRingFunc(pScrn, pI830->ring_emitting, 0);			\
85fa225cbcSrjs    pI830->ring_next = pI830->ring.tail;				\
86fa225cbcSrjs    if (I810_DEBUG & DEBUG_VERBOSE_RING)				\
87fa225cbcSrjs	ErrorF( "BEGIN_LP_RING %d in %s\n", n, FUNCTION_NAME);		\
88fa225cbcSrjs    pI830->ring_used = 0;						\
89fa225cbcSrjs    if ((n) & 1)							\
90fa225cbcSrjs	OUT_RING(MI_NOOP);						\
91fa225cbcSrjs} while (0)
92fa225cbcSrjs
93fa225cbcSrjs#endif /* _INTEL_RING_H */
94