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