radeon_cursor.c revision 486efd68
1209ff23fSmrg/*
2209ff23fSmrg * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
3209ff23fSmrg *                VA Linux Systems Inc., Fremont, California.
4209ff23fSmrg *
5209ff23fSmrg * All Rights Reserved.
6209ff23fSmrg *
7209ff23fSmrg * Permission is hereby granted, free of charge, to any person obtaining
8209ff23fSmrg * a copy of this software and associated documentation files (the
9209ff23fSmrg * "Software"), to deal in the Software without restriction, including
10209ff23fSmrg * without limitation on the rights to use, copy, modify, merge,
11209ff23fSmrg * publish, distribute, sublicense, and/or sell copies of the Software,
12209ff23fSmrg * and to permit persons to whom the Software is furnished to do so,
13209ff23fSmrg * subject to the following conditions:
14209ff23fSmrg *
15209ff23fSmrg * The above copyright notice and this permission notice (including the
16209ff23fSmrg * next paragraph) shall be included in all copies or substantial
17209ff23fSmrg * portions of the Software.
18209ff23fSmrg *
19209ff23fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20209ff23fSmrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21209ff23fSmrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22209ff23fSmrg * NON-INFRINGEMENT.  IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR
23209ff23fSmrg * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
24209ff23fSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25209ff23fSmrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26209ff23fSmrg * DEALINGS IN THE SOFTWARE.
27209ff23fSmrg */
28209ff23fSmrg
29209ff23fSmrg#ifdef HAVE_CONFIG_H
30209ff23fSmrg#include "config.h"
31209ff23fSmrg#endif
32209ff23fSmrg
33209ff23fSmrg#define RADEONCTRACE(x)
34209ff23fSmrg/*#define RADEONCTRACE(x) RADEONTRACE(x) */
35209ff23fSmrg
36209ff23fSmrg/*
37209ff23fSmrg * Authors:
38209ff23fSmrg *   Kevin E. Martin <martin@xfree86.org>
39209ff23fSmrg *   Rickard E. Faith <faith@valinux.com>
40209ff23fSmrg *
41209ff23fSmrg * References:
42209ff23fSmrg *
43209ff23fSmrg * !!!! FIXME !!!!
44209ff23fSmrg *   RAGE 128 VR/ RAGE 128 GL Register Reference Manual (Technical
45209ff23fSmrg *   Reference Manual P/N RRG-G04100-C Rev. 0.04), ATI Technologies: April
46209ff23fSmrg *   1999.
47209ff23fSmrg *
48209ff23fSmrg *   RAGE 128 Software Development Manual (Technical Reference Manual P/N
49209ff23fSmrg *   SDK-G04000 Rev. 0.01), ATI Technologies: June 1999.
50209ff23fSmrg *
51209ff23fSmrg */
52209ff23fSmrg
53209ff23fSmrg				/* Driver data structures */
54209ff23fSmrg#include "radeon.h"
55209ff23fSmrg#include "radeon_version.h"
56209ff23fSmrg#include "radeon_reg.h"
57209ff23fSmrg#include "radeon_macros.h"
58209ff23fSmrg
59209ff23fSmrg				/* X and server generic header files */
60209ff23fSmrg#include "xf86.h"
61209ff23fSmrg
62209ff23fSmrg#define CURSOR_WIDTH	64
63209ff23fSmrg#define CURSOR_HEIGHT	64
64209ff23fSmrg
65209ff23fSmrg/*
66209ff23fSmrg * The cursor bits are always 32bpp.  On MSBFirst buses,
67209ff23fSmrg * configure byte swapping to swap 32 bit units when writing
68209ff23fSmrg * the cursor image.  Byte swapping must always be returned
69209ff23fSmrg * to its previous value before returning.
70209ff23fSmrg */
71209ff23fSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN
72209ff23fSmrg
73209ff23fSmrg#define CURSOR_SWAPPING_DECL_MMIO   unsigned char *RADEONMMIO = info->MMIO;
74209ff23fSmrg#define CURSOR_SWAPPING_START() \
75209ff23fSmrg  do { \
76486efd68Smrg  if (info->ChipFamily < CHIP_FAMILY_R600) \
77209ff23fSmrg    OUTREG(RADEON_SURFACE_CNTL, \
78209ff23fSmrg	   (info->ModeReg->surface_cntl | \
79209ff23fSmrg	     RADEON_NONSURF_AP0_SWP_32BPP | RADEON_NONSURF_AP1_SWP_32BPP) & \
80209ff23fSmrg	   ~(RADEON_NONSURF_AP0_SWP_16BPP | RADEON_NONSURF_AP1_SWP_16BPP)); \
81209ff23fSmrg  } while (0)
82486efd68Smrg#define CURSOR_SWAPPING_END()	\
83486efd68Smrg  do { \
84486efd68Smrg  if (info->ChipFamily < CHIP_FAMILY_R600) \
85486efd68Smrg      OUTREG(RADEON_SURFACE_CNTL, info->ModeReg->surface_cntl); \
86486efd68Smrg  } while (0)
87209ff23fSmrg#else
88209ff23fSmrg
89209ff23fSmrg#define CURSOR_SWAPPING_DECL_MMIO
90209ff23fSmrg#define CURSOR_SWAPPING_START()
91209ff23fSmrg#define CURSOR_SWAPPING_END()
92209ff23fSmrg
93209ff23fSmrg#endif
94209ff23fSmrg
95209ff23fSmrgstatic void
96209ff23fSmrgavivo_setup_cursor(xf86CrtcPtr crtc, Bool enable)
97209ff23fSmrg{
98209ff23fSmrg    ScrnInfoPtr pScrn = crtc->scrn;
99209ff23fSmrg    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
100209ff23fSmrg    RADEONInfoPtr  info = RADEONPTR(crtc->scrn);
101209ff23fSmrg    unsigned char     *RADEONMMIO = info->MMIO;
102209ff23fSmrg
103486efd68Smrg    /* always use the same cursor mode even if the cursor is disabled,
104486efd68Smrg     * otherwise you may end up with cursor curruption bands
105486efd68Smrg     */
106486efd68Smrg    OUTREG(AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset, (AVIVO_D1CURSOR_MODE_24BPP << AVIVO_D1CURSOR_MODE_SHIFT));
107209ff23fSmrg
108209ff23fSmrg    if (enable) {
109209ff23fSmrg	OUTREG(AVIVO_D1CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
110209ff23fSmrg	       info->fbLocation + radeon_crtc->cursor_offset + pScrn->fbOffset);
111209ff23fSmrg	OUTREG(AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset,
112209ff23fSmrg	       AVIVO_D1CURSOR_EN | (AVIVO_D1CURSOR_MODE_24BPP << AVIVO_D1CURSOR_MODE_SHIFT));
113209ff23fSmrg    }
114209ff23fSmrg}
115209ff23fSmrg
116209ff23fSmrgstatic void
117209ff23fSmrgavivo_lock_cursor(xf86CrtcPtr crtc, Bool lock)
118209ff23fSmrg{
119209ff23fSmrg    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
120209ff23fSmrg    RADEONInfoPtr  info = RADEONPTR(crtc->scrn);
121209ff23fSmrg    unsigned char     *RADEONMMIO = info->MMIO;
122209ff23fSmrg    uint32_t tmp;
123209ff23fSmrg
124209ff23fSmrg    tmp = INREG(AVIVO_D1CUR_UPDATE + radeon_crtc->crtc_offset);
125209ff23fSmrg
126209ff23fSmrg    if (lock)
127209ff23fSmrg	tmp |= AVIVO_D1CURSOR_UPDATE_LOCK;
128209ff23fSmrg    else
129209ff23fSmrg	tmp &= ~AVIVO_D1CURSOR_UPDATE_LOCK;
130209ff23fSmrg
131209ff23fSmrg    OUTREG(AVIVO_D1CUR_UPDATE + radeon_crtc->crtc_offset, tmp);
132209ff23fSmrg}
133209ff23fSmrg
134209ff23fSmrgvoid
135209ff23fSmrgradeon_crtc_show_cursor (xf86CrtcPtr crtc)
136209ff23fSmrg{
137209ff23fSmrg    ScrnInfoPtr pScrn = crtc->scrn;
138209ff23fSmrg    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
139209ff23fSmrg    int crtc_id = radeon_crtc->crtc_id;
140209ff23fSmrg    RADEONInfoPtr      info       = RADEONPTR(pScrn);
141209ff23fSmrg    unsigned char     *RADEONMMIO = info->MMIO;
142209ff23fSmrg
143209ff23fSmrg    if (IS_AVIVO_VARIANT) {
144209ff23fSmrg	avivo_lock_cursor(crtc, TRUE);
145209ff23fSmrg	avivo_setup_cursor(crtc, TRUE);
146209ff23fSmrg	avivo_lock_cursor(crtc, FALSE);
147209ff23fSmrg    } else {
148209ff23fSmrg        switch (crtc_id) {
149209ff23fSmrg        case 0:
150209ff23fSmrg            OUTREG(RADEON_MM_INDEX, RADEON_CRTC_GEN_CNTL);
151209ff23fSmrg	    break;
152209ff23fSmrg        case 1:
153209ff23fSmrg            OUTREG(RADEON_MM_INDEX, RADEON_CRTC2_GEN_CNTL);
154209ff23fSmrg	    break;
155209ff23fSmrg        default:
156209ff23fSmrg            return;
157209ff23fSmrg        }
158209ff23fSmrg
159209ff23fSmrg        OUTREGP(RADEON_MM_DATA, RADEON_CRTC_CUR_EN | 2 << 20,
160209ff23fSmrg                ~(RADEON_CRTC_CUR_EN | RADEON_CRTC_CUR_MODE_MASK));
161209ff23fSmrg    }
162209ff23fSmrg}
163209ff23fSmrg
164209ff23fSmrgvoid
165209ff23fSmrgradeon_crtc_hide_cursor (xf86CrtcPtr crtc)
166209ff23fSmrg{
167209ff23fSmrg    ScrnInfoPtr pScrn = crtc->scrn;
168209ff23fSmrg    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
169209ff23fSmrg    int crtc_id = radeon_crtc->crtc_id;
170209ff23fSmrg    RADEONInfoPtr      info       = RADEONPTR(pScrn);
171209ff23fSmrg    unsigned char     *RADEONMMIO = info->MMIO;
172209ff23fSmrg
173209ff23fSmrg    if (IS_AVIVO_VARIANT) {
174209ff23fSmrg	avivo_lock_cursor(crtc, TRUE);
175209ff23fSmrg	avivo_setup_cursor(crtc, FALSE);
176209ff23fSmrg	avivo_lock_cursor(crtc, FALSE);
177209ff23fSmrg    } else {
178209ff23fSmrg	switch(crtc_id) {
179209ff23fSmrg    	case 0:
180209ff23fSmrg            OUTREG(RADEON_MM_INDEX, RADEON_CRTC_GEN_CNTL);
181209ff23fSmrg            break;
182209ff23fSmrg    	case 1:
183209ff23fSmrg	    OUTREG(RADEON_MM_INDEX, RADEON_CRTC2_GEN_CNTL);
184209ff23fSmrg	    break;
185209ff23fSmrg        default:
186209ff23fSmrg	    return;
187209ff23fSmrg        }
188209ff23fSmrg
189209ff23fSmrg        OUTREGP(RADEON_MM_DATA, 0, ~RADEON_CRTC_CUR_EN);
190209ff23fSmrg   }
191209ff23fSmrg}
192209ff23fSmrg
193209ff23fSmrgvoid
194209ff23fSmrgradeon_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
195209ff23fSmrg{
196209ff23fSmrg    ScrnInfoPtr pScrn = crtc->scrn;
197486efd68Smrg    RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
198209ff23fSmrg    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
199209ff23fSmrg    int crtc_id = radeon_crtc->crtc_id;
200209ff23fSmrg    RADEONInfoPtr      info       = RADEONPTR(pScrn);
201209ff23fSmrg    unsigned char     *RADEONMMIO = info->MMIO;
202209ff23fSmrg    int xorigin = 0, yorigin = 0;
203209ff23fSmrg    int stride = 256;
204209ff23fSmrg    DisplayModePtr mode = &crtc->mode;
205209ff23fSmrg
206209ff23fSmrg    if (x < 0)                        xorigin = -x+1;
207209ff23fSmrg    if (y < 0)                        yorigin = -y+1;
208209ff23fSmrg    if (xorigin >= CURSOR_WIDTH)  xorigin = CURSOR_WIDTH - 1;
209209ff23fSmrg    if (yorigin >= CURSOR_HEIGHT) yorigin = CURSOR_HEIGHT - 1;
210209ff23fSmrg
211209ff23fSmrg    if (IS_AVIVO_VARIANT) {
212486efd68Smrg	int w = CURSOR_WIDTH;
213486efd68Smrg
214209ff23fSmrg	/* avivo cursor spans the full fb width */
215b7e1c893Smrg	if (crtc->rotatedData == NULL) {
216b7e1c893Smrg	    x += crtc->x;
217b7e1c893Smrg	    y += crtc->y;
218b7e1c893Smrg	}
219486efd68Smrg
220486efd68Smrg	if (pRADEONEnt->Controller[0]->enabled &&
221486efd68Smrg	    pRADEONEnt->Controller[1]->enabled) {
222486efd68Smrg	    int cursor_end, frame_end;
223486efd68Smrg
224486efd68Smrg	    cursor_end = x - xorigin + w;
225486efd68Smrg	    frame_end = crtc->x + mode->CrtcHDisplay;
226486efd68Smrg
227486efd68Smrg	    if (cursor_end >= frame_end) {
228486efd68Smrg		w = w - (cursor_end - frame_end);
229486efd68Smrg		if (!(frame_end & 0x7f))
230486efd68Smrg		    w--;
231486efd68Smrg	    } else {
232486efd68Smrg		if (!(cursor_end & 0x7f))
233486efd68Smrg		    w--;
234486efd68Smrg	    }
235486efd68Smrg	    if (w <= 0)
236486efd68Smrg		w = 1;
237486efd68Smrg	}
238486efd68Smrg
239209ff23fSmrg	avivo_lock_cursor(crtc, TRUE);
240209ff23fSmrg	OUTREG(AVIVO_D1CUR_POSITION + radeon_crtc->crtc_offset, ((xorigin ? 0 : x) << 16)
241209ff23fSmrg	       | (yorigin ? 0 : y));
242209ff23fSmrg	OUTREG(AVIVO_D1CUR_HOT_SPOT + radeon_crtc->crtc_offset, (xorigin << 16) | yorigin);
243486efd68Smrg	OUTREG(AVIVO_D1CUR_SIZE + radeon_crtc->crtc_offset, ((w - 1) << 16) | (CURSOR_HEIGHT - 1));
244209ff23fSmrg	avivo_lock_cursor(crtc, FALSE);
245209ff23fSmrg    } else {
246b7e1c893Smrg	if (mode->Flags & V_DBLSCAN)
247b7e1c893Smrg	    y *= 2;
248b7e1c893Smrg
249209ff23fSmrg	if (crtc_id == 0) {
250209ff23fSmrg	    OUTREG(RADEON_CUR_HORZ_VERT_OFF,  (RADEON_CUR_LOCK
251209ff23fSmrg					       | (xorigin << 16)
252209ff23fSmrg					       | yorigin));
253209ff23fSmrg	    OUTREG(RADEON_CUR_HORZ_VERT_POSN, (RADEON_CUR_LOCK
254209ff23fSmrg					       | ((xorigin ? 0 : x) << 16)
255209ff23fSmrg					       | (yorigin ? 0 : y)));
256209ff23fSmrg	    RADEONCTRACE(("cursor_offset: 0x%x, yorigin: %d, stride: %d, temp %08X\n",
257209ff23fSmrg			  radeon_crtc->cursor_offset + pScrn->fbOffset, yorigin, stride, temp));
258209ff23fSmrg	    OUTREG(RADEON_CUR_OFFSET,
259209ff23fSmrg		   radeon_crtc->cursor_offset + pScrn->fbOffset + yorigin * stride);
260209ff23fSmrg	} else if (crtc_id == 1) {
261209ff23fSmrg	    OUTREG(RADEON_CUR2_HORZ_VERT_OFF,  (RADEON_CUR2_LOCK
262209ff23fSmrg						| (xorigin << 16)
263209ff23fSmrg						| yorigin));
264209ff23fSmrg	    OUTREG(RADEON_CUR2_HORZ_VERT_POSN, (RADEON_CUR2_LOCK
265209ff23fSmrg						| ((xorigin ? 0 : x) << 16)
266209ff23fSmrg						| (yorigin ? 0 : y)));
267209ff23fSmrg	    RADEONCTRACE(("cursor_offset2: 0x%x, yorigin: %d, stride: %d, temp %08X\n",
268209ff23fSmrg			  radeon_crtc->cursor_offset + pScrn->fbOffset, yorigin, stride, temp));
269209ff23fSmrg	    OUTREG(RADEON_CUR2_OFFSET,
270209ff23fSmrg		   radeon_crtc->cursor_offset + pScrn->fbOffset + yorigin * stride);
271209ff23fSmrg	}
272209ff23fSmrg    }
273209ff23fSmrg}
274209ff23fSmrg
275209ff23fSmrgvoid
276209ff23fSmrgradeon_crtc_set_cursor_colors (xf86CrtcPtr crtc, int bg, int fg)
277209ff23fSmrg{
278209ff23fSmrg    ScrnInfoPtr pScrn = crtc->scrn;
279209ff23fSmrg    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
280209ff23fSmrg    RADEONInfoPtr info = RADEONPTR(pScrn);
281209ff23fSmrg    uint32_t *pixels = (uint32_t *)(pointer)(info->FB + radeon_crtc->cursor_offset);
282209ff23fSmrg    int            pixel, i;
283209ff23fSmrg    CURSOR_SWAPPING_DECL_MMIO
284209ff23fSmrg
285209ff23fSmrg    RADEONCTRACE(("RADEONSetCursorColors\n"));
286209ff23fSmrg
287209ff23fSmrg#ifdef ARGB_CURSOR
288209ff23fSmrg    /* Don't recolour cursors set with SetCursorARGB. */
289209ff23fSmrg    if (info->cursor_argb)
290209ff23fSmrg       return;
291209ff23fSmrg#endif
292209ff23fSmrg
293209ff23fSmrg    fg |= 0xff000000;
294209ff23fSmrg    bg |= 0xff000000;
295209ff23fSmrg
296209ff23fSmrg    /* Don't recolour the image if we don't have to. */
297209ff23fSmrg    if (fg == info->cursor_fg && bg == info->cursor_bg)
298209ff23fSmrg       return;
299209ff23fSmrg
300209ff23fSmrg    CURSOR_SWAPPING_START();
301209ff23fSmrg
302209ff23fSmrg    /* Note: We assume that the pixels are either fully opaque or fully
303209ff23fSmrg     * transparent, so we won't premultiply them, and we can just
304209ff23fSmrg     * check for non-zero pixel values; those are either fg or bg
305209ff23fSmrg     */
306209ff23fSmrg    for (i = 0; i < CURSOR_WIDTH * CURSOR_HEIGHT; i++, pixels++)
307209ff23fSmrg       if ((pixel = *pixels))
308209ff23fSmrg           *pixels = (pixel == info->cursor_fg) ? fg : bg;
309209ff23fSmrg
310209ff23fSmrg    CURSOR_SWAPPING_END();
311209ff23fSmrg    info->cursor_fg = fg;
312209ff23fSmrg    info->cursor_bg = bg;
313209ff23fSmrg}
314209ff23fSmrg
315209ff23fSmrg#ifdef ARGB_CURSOR
316209ff23fSmrg
317209ff23fSmrgvoid
318209ff23fSmrgradeon_crtc_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image)
319209ff23fSmrg{
320209ff23fSmrg    ScrnInfoPtr pScrn = crtc->scrn;
321209ff23fSmrg    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
322209ff23fSmrg    RADEONInfoPtr  info = RADEONPTR(pScrn);
323209ff23fSmrg    CURSOR_SWAPPING_DECL_MMIO
324209ff23fSmrg    uint32_t *d = (uint32_t *)(pointer)(info->FB + radeon_crtc->cursor_offset);
325209ff23fSmrg
326209ff23fSmrg    RADEONCTRACE(("RADEONLoadCursorARGB\n"));
327209ff23fSmrg
328209ff23fSmrg    info->cursor_argb = TRUE;
329209ff23fSmrg
330209ff23fSmrg    CURSOR_SWAPPING_START();
331209ff23fSmrg
332209ff23fSmrg    memcpy (d, image, CURSOR_HEIGHT * CURSOR_WIDTH * 4);
333209ff23fSmrg
334209ff23fSmrg    CURSOR_SWAPPING_END ();
335209ff23fSmrg}
336209ff23fSmrg
337209ff23fSmrg#endif
338209ff23fSmrg
339209ff23fSmrg
340209ff23fSmrg/* Initialize hardware cursor support. */
341209ff23fSmrgBool RADEONCursorInit(ScreenPtr pScreen)
342209ff23fSmrg{
343209ff23fSmrg    ScrnInfoPtr        pScrn   = xf86Screens[pScreen->myNum];
344209ff23fSmrg    RADEONInfoPtr      info    = RADEONPTR(pScrn);
345486efd68Smrg    unsigned char     *RADEONMMIO = info->MMIO;
346209ff23fSmrg    xf86CrtcConfigPtr  xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
347209ff23fSmrg    int                c;
348209ff23fSmrg
349486efd68Smrg    for (c = 0; c < xf86_config->num_crtc; c++) {
350486efd68Smrg	xf86CrtcPtr crtc = xf86_config->crtc[c];
351486efd68Smrg	RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
352209ff23fSmrg
353486efd68Smrg	if (!info->useEXA) {
354486efd68Smrg	    int size_bytes  = CURSOR_WIDTH * 4 * CURSOR_HEIGHT;
355486efd68Smrg	    int align = IS_AVIVO_VARIANT ? 4096 : 256;
356209ff23fSmrg
357b7e1c893Smrg	    radeon_crtc->cursor_offset =
358b7e1c893Smrg		radeon_legacy_allocate_memory(pScrn, &radeon_crtc->cursor_mem, size_bytes, align);
359b7e1c893Smrg
360b7e1c893Smrg	    if (radeon_crtc->cursor_offset == 0)
361b7e1c893Smrg		return FALSE;
362b7e1c893Smrg
363b7e1c893Smrg	    xf86DrvMsg(pScrn->scrnIndex, X_INFO,
364b7e1c893Smrg		       "Will use %d kb for hardware cursor %d at offset 0x%08x\n",
365b7e1c893Smrg		       (size_bytes * xf86_config->num_crtc) / 1024,
366b7e1c893Smrg		       c,
367b7e1c893Smrg		       (unsigned int)radeon_crtc->cursor_offset);
368209ff23fSmrg	}
369486efd68Smrg	/* set the cursor mode the same on both crtcs to avoid corruption */
370486efd68Smrg	if (IS_AVIVO_VARIANT)
371486efd68Smrg	    OUTREG(AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset,
372486efd68Smrg		   (AVIVO_D1CURSOR_MODE_24BPP << AVIVO_D1CURSOR_MODE_SHIFT));
373209ff23fSmrg    }
374209ff23fSmrg
375209ff23fSmrg    return xf86_cursors_init (pScreen, CURSOR_WIDTH, CURSOR_HEIGHT,
376209ff23fSmrg			      (HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
377209ff23fSmrg			       HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
378209ff23fSmrg			       HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1 |
379209ff23fSmrg			       HARDWARE_CURSOR_ARGB));
380209ff23fSmrg}
381