summaryrefslogtreecommitdiff
path: root/src/sis_accel.h
blob: 59d583d8b2fe52804b5fbfe4bf09f90ac1bfd085 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_accel.h,v 1.11 2004/01/04 18:07:59 twini Exp $ */
/*
 * 2D acceleration for 5597/5598 and 6326
 * Definitions for the SIS engine communication
 *
 * Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England.
 * Parts Copyright (C) 2001-2004 Thomas Winischhofer, Vienna, Austria.
 *
 * Licensed under the following terms:
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appears in all copies and that both that copyright
 * notice and this permission notice appear in supporting documentation, and
 * and that the name of the copyright holder not be used in advertising
 * or publicity pertaining to distribution of the software without specific,
 * written prior permission. The copyright holder makes no representations
 * about the suitability of this software for any purpose.  It is provided
 * "as is" without expressed or implied warranty.
 *
 * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
 * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 *
 * Authors:  Alan Hourihane <alanh@fairlite.demon.co.uk>,
 *           Mike Chapman <mike@paranoia.com>,
 *           Juanjo Santamarta <santamarta@ctv.es>,
 *           Mitani Hiroshi <hmitani@drl.mei.co.jp>,
 *           David Thomas <davtom@dream.org.uk>,
 *	     Thomas Winischhofer <thomas@winischhofer.net>.
 */


/* Definitions for the SIS engine communication. ------------------------------------ */

/* For pre-530 chipsets only!!! */

/* Engine Registers for 1st generation engines (5597/5598/6326) */
const int sisReg32MMIO[] = {
            0x8280,0x8284,0x8288,0x828C,0x8290,0x8294,
            0x8298,0x829C,0x82A0,0x82A4,0x82A8,0x82AC
};

#define BR(x) sisReg32MMIO[x]

/* These are done using Memory Mapped IO, of the registers */
/*
 * Modified for Sis by Xavier Ducoin (xavier@rd.lectra.fr)
 *
 */

/* Command Reg 0 (0x82aa, [15:0]) */
#define sisSRCBG            0x0000   /* source select */
#define sisSRCFG            0x0001
#define sisSRCVIDEO         0x0002
#define sisSRCSYSTEM        0x0003

#define sisPATFG            0x0004   /* pattern select */
#define sisPATREG           0x0008
#define sisPATBG            0x0000

#define sisLEFT2RIGHT       0x0010   /* Direction select */
#define sisRIGHT2LEFT       0x0000
#define sisTOP2BOTTOM       0x0020
#define sisBOTTOM2TOP       0x0000
#define sisXINCREASE        sisLEFT2RIGHT
#define sisYINCREASE        sisTOP2BOTTOM

#define sisCLIPENABL        0x0040   /* Clipping select */
#define sisCLIPINTRN        0x0080
#define sisCLIPEXTRN        0x0000

#define sisCMDBLT           0x0000   /* Command select */
#define sisCMDBLTMSK        0x0100
#define sisCMDCOLEXP        0x0200
#define sisCMDLINE          0x0300
#define sisFLGECOLEXP       0x2000
#define sisCMDECOLEXP       (sisCMDCOLEXP | sisFLGECOLEXP)

#define sisLASTPIX          0x0800   /* Line parameters */
#define sisXMAJOR           0x0400


/* Macros to do useful things with the SIS BitBLT engine */

#define sisBLTSync \
  while(MMIO_IN16(pSiS->IOBase, BR(10) + 2) & 0x4000) {}

/* According to SiS 6326 2D programming guide, 16 bits position at   */
/* 0x82A8 returns queue free. But this don't work, so don't wait     */
/* anything when turbo-queue is enabled. If there are frequent syncs */
/* this should work. But not for xaa_benchmark :-(     */

/* TW: Bit 16 only applies to the hardware queue, not the software
 *     (=turbo) queue.
 */

#define sisBLTWAIT \
  if(!pSiS->TurboQueue) { \
    while(MMIO_IN16(pSiS->IOBase, BR(10) + 2) & 0x4000) {} \
  } else { \
    sisBLTSync \
  }

#define sisSETPATREG() \
   ((unsigned char *)(pSiS->IOBase + BR(11)))

#define sisSETPATREGL() \
   ((unsigned long *)(pSiS->IOBase + BR(11)))

/* trigger command */
#define sisSETCMD(op) \
  { \
  unsigned long temp; \
  MMIO_OUT16(pSiS->IOBase, BR(10) + 2, op); \
  temp = MMIO_IN32(pSiS->IOBase, BR(10)); \
  (void)temp; \
  }

/* set foreground color and fg ROP */
#define sisSETFGROPCOL(rop, color) \
   MMIO_OUT32(pSiS->IOBase, BR(4), ((rop << 24) | (color & 0xFFFFFF)));

/* set background color and bg ROP */
#define sisSETBGROPCOL(rop, color) \
   MMIO_OUT32(pSiS->IOBase, BR(5), ((rop << 24) | (color & 0xFFFFFF)));

/* background color */
#define sisSETBGCOLOR(bgColor) \
   MMIO_OUT32(pSiS->IOBase, BR(5), (bgColor));
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(5)) = (bgColor)
#endif

/* foreground color */
#define sisSETFGCOLOR(fgColor) \
   MMIO_OUT32(pSiS->IOBase, BR(4), (fgcolor));
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(4)) = (fgColor)
#endif

/* ROP */
#define sisSETROPFG(op) \
   MMIO_OUT8(pSiS->IOBase, BR(4) + 3, op);
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(4)) = ((*(volatile unsigned int *)(pSiS->IOBase + BR(4)))&0xffffff) | (op<<24)
#endif

#define sisSETROPBG(op) \
  MMIO_OUT8(pSiS->IOBase, BR(5) + 3, op);
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(5)) = ((*(volatile unsigned int *)(pSiS->IOBase + BR(5)))&0xffffff) | (op<<24)
#endif

#define sisSETROP(op) \
   sisSETROPFG(op); sisSETROPBG(op);

/* source and dest address */
#define sisSETSRCADDR(srcAddr) \
  MMIO_OUT32(pSiS->IOBase, BR(0), (srcAddr & 0x3FFFFFL));
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(0)) = srcAddr & 0x3FFFFFL
#endif

#define sisSETDSTADDR(dstAddr) \
  MMIO_OUT32(pSiS->IOBase, BR(1), (dstAddr & 0x3FFFFFL));
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(1)) = dstAddr & 0x3FFFFFL
#endif

/* pitch */
#define sisSETPITCH(srcPitch,dstPitch) \
  MMIO_OUT32(pSiS->IOBase, BR(2), ((((dstPitch) & 0xFFFF) << 16) | ((srcPitch) & 0xFFFF)));
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(2)) = ((dstPitch&0xFFFF)<<16)| \
      (srcPitch&0xFFFF)
#endif

#define sisSETSRCPITCH(srcPitch) \
  MMIO_OUT16(pSiS->IOBase, BR(2), ((srcPitch) & 0xFFFF));

#define sisSETDSTPITCH(dstPitch) \
  MMIO_OUT16(pSiS->IOBase, BR(2) + 2, ((dstPitch) & 0xFFFF));

/* Height and width
 * According to SIS 2D Engine Programming Guide
 * height -1, width - 1 independant of Bpp
 */
#define sisSETHEIGHTWIDTH(Height, Width) \
  MMIO_OUT32(pSiS->IOBase, BR(3), ((((Height) & 0xFFFF) << 16) | ((Width) & 0xFFFF)));
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(3)) = (((Height)&0xFFFF)<<16)| \
      ((Width)&0xFFFF)
#endif

/* Clipping */
#define sisSETCLIPTOP(x, y) \
   MMIO_OUT32(pSiS->IOBase, BR(8), ((((y) & 0xFFFF) << 16) | ((x) & 0xFFFF)));
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(8)) = (((y)&0xFFFF)<<16)| \
      ((x)&0xFFFF)
#endif

#define sisSETCLIPBOTTOM(x, y) \
   MMIO_OUT32(pSiS->IOBase, BR(9), ((((y) & 0xFFFF) << 16) | ((x) & 0xFFFF)));
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(9)) = (((y)&0xFFFF)<<16)| \
      ((x)&0xFFFF)
#endif

/* Line drawing */
#define sisSETXStart(XStart) \
  MMIO_OUT32(pSiS->IOBase, BR(0), ((XStart) & 0xFFFF));
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(0)) = XStart&0xFFFF
#endif

#define sisSETYStart(YStart) \
  MMIO_OUT32(pSiS->IOBase, BR(1), ((YStart) & 0xFFFF));
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(1)) = YStart&0xFFFF
#endif

#define sisSETLineMajorCount(MajorAxisCount) \
   MMIO_OUT32(pSiS->IOBase, BR(3), ((MajorAxisCount) & 0xFFFF));
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(3)) = MajorAxisCount&0xFFFF
#endif

#define sisSETLineSteps(K1,K2) \
   MMIO_OUT32(pSiS->IOBase, BR(6), ((((K1) & 0xFFFF) << 16) | ((K2) & 0xFFFF)));
#if 0
  *(volatile unsigned int *)(pSiS->IOBase + BR(6)) = (((K1)&0xFFFF)<<16)| \
      ((K2)&0xFFFF)
#endif

#define sisSETLineErrorTerm(ErrorTerm) \
   MMIO_OUT16(pSiS->IOBase, BR(7), (ErrorTerm));
#if 0
  *(volatile unsigned short *)(pSiS->IOBase + BR(7)) = ErrorTerm
#endif