via_dmabuffer.h revision 90b17f1b
17e6fb56fSmrg/*
290b17f1bSmrg * Copyright (C) Thomas Hellstrom (2005)
37e6fb56fSmrg *
47e6fb56fSmrg * Permission is hereby granted, free of charge, to any person obtaining a
57e6fb56fSmrg * copy of this software and associated documentation files (the "Software"),
67e6fb56fSmrg * to deal in the Software without restriction, including without limitation
77e6fb56fSmrg * the rights to use, copy, modify, merge, publish, distribute, sub license,
87e6fb56fSmrg * and/or sell copies of the Software, and to permit persons to whom the
97e6fb56fSmrg * Software is furnished to do so, subject to the following conditions:
107e6fb56fSmrg *
117e6fb56fSmrg * The above copyright notice and this permission notice (including the
127e6fb56fSmrg * next paragraph) shall be included in all copies or substantial portions
137e6fb56fSmrg * of the Software.
147e6fb56fSmrg *
157e6fb56fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
167e6fb56fSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
177e6fb56fSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
187e6fb56fSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
197e6fb56fSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
207e6fb56fSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
217e6fb56fSmrg * DEALINGS IN THE SOFTWARE.
227e6fb56fSmrg */
237e6fb56fSmrg
247e6fb56fSmrg#ifndef VIA_DMABUFFER_H
257e6fb56fSmrg#define VIA_DMABUFFER_H
267e6fb56fSmrg
277e6fb56fSmrg#include "via_3d_reg.h"
287e6fb56fSmrg
297e6fb56fSmrgtypedef struct _ViaCommandBuffer
307e6fb56fSmrg{
317e6fb56fSmrg    ScrnInfoPtr pScrn;
327e6fb56fSmrg    CARD32 *buf;
337e6fb56fSmrg    CARD32 waitFlags;
347e6fb56fSmrg    unsigned pos;
357e6fb56fSmrg    unsigned bufSize;
367e6fb56fSmrg    int mode;
377e6fb56fSmrg    int header_start;
387e6fb56fSmrg    int rindex;
397e6fb56fSmrg    Bool has3dState;
407e6fb56fSmrg    void (*flushFunc) (struct _ViaCommandBuffer * cb);
417e6fb56fSmrg} ViaCommandBuffer;
427e6fb56fSmrg
437e6fb56fSmrg#define VIA_DMASIZE 16384
447e6fb56fSmrg
457e6fb56fSmrg#define H1_ADDR(val) (((val) >> 2) | 0xF0000000)
467e6fb56fSmrg#define WAITFLAGS(flags)			\
477e6fb56fSmrg    (cb)->waitFlags |= (flags)
487e6fb56fSmrg
497e6fb56fSmrg#define BEGIN_RING(size)					\
507e6fb56fSmrg    do {								\
517e6fb56fSmrg	if (cb->flushFunc && (cb->pos > (cb->bufSize-(size)))) {	\
527e6fb56fSmrg	    cb->flushFunc(cb);					\
537e6fb56fSmrg	}								\
547e6fb56fSmrg    } while(0)
557e6fb56fSmrg
567e6fb56fSmrg#define BEGIN_H2(paraType, h2size)			\
577e6fb56fSmrg  do{							\
587e6fb56fSmrg    BEGIN_RING((h2size)+6);				\
597e6fb56fSmrg    if (cb->mode == 2 && (paraType) == cb->rindex)	\
607e6fb56fSmrg      break;						\
617e6fb56fSmrg    if (cb->pos & 1)					\
627e6fb56fSmrg      OUT_RING(HC_DUMMY);				\
637e6fb56fSmrg    cb->header_start = cb->pos;				\
647e6fb56fSmrg    cb->rindex = paraType;				\
657e6fb56fSmrg    cb->mode = 2;					\
667e6fb56fSmrg    OUT_RING(HALCYON_HEADER2);				\
677e6fb56fSmrg    OUT_RING((paraType) << 16);						\
687e6fb56fSmrg    if (!cb->has3dState && ((paraType) != HC_ParaType_CmdVdata)) {	\
697e6fb56fSmrg      cb->has3dState = TRUE;						\
707e6fb56fSmrg    }									\
717e6fb56fSmrg  } while(0);
727e6fb56fSmrg
737e6fb56fSmrg#define OUT_RING(val) do{	\
747e6fb56fSmrg	(cb)->buf[(cb)->pos++] = (val);	\
757e6fb56fSmrg    } while(0);
767e6fb56fSmrg
777e6fb56fSmrg#define OUT_RING_QW(val1, val2)			\
787e6fb56fSmrg    do {						\
797e6fb56fSmrg	(cb)->buf[(cb)->pos++] = (val1);		\
807e6fb56fSmrg	(cb)->buf[(cb)->pos++] = (val2);		\
817e6fb56fSmrg    } while (0)
827e6fb56fSmrg
837e6fb56fSmrg#define ADVANCE_RING \
847e6fb56fSmrg  cb->flushFunc(cb)
857e6fb56fSmrg
867e6fb56fSmrg#define RING_VARS \
877e6fb56fSmrg  ViaCommandBuffer *cb = &pVia->cb
887e6fb56fSmrg
897e6fb56fSmrg#define OUT_RING_H1(val1, val2) \
907e6fb56fSmrg  OUT_RING_QW(H1_ADDR(val1), val2)
917e6fb56fSmrg
927e6fb56fSmrg#define OUT_RING_SubA(val1, val2) \
937e6fb56fSmrg  OUT_RING(((val1) << HC_SubA_SHIFT) | ((val2) & HC_Para_MASK))
947e6fb56fSmrg
957e6fb56fSmrg#endif
96