ast_cursor.c revision 15fb4814
115fb4814Smrg/*
215fb4814Smrg * Copyright (c) 2005 ASPEED Technology Inc.
315fb4814Smrg *
415fb4814Smrg * Permission to use, copy, modify, distribute, and sell this software and its
515fb4814Smrg * documentation for any purpose is hereby granted without fee, provided that
615fb4814Smrg * the above copyright notice appear in all copies and that both that
715fb4814Smrg * copyright notice and this permission notice appear in supporting
815fb4814Smrg * documentation, and that the name of the authors not be used in
915fb4814Smrg * advertising or publicity pertaining to distribution of the software without
1015fb4814Smrg * specific, written prior permission.  The authors makes no representations
1115fb4814Smrg * about the suitability of this software for any purpose.  It is provided
1215fb4814Smrg * "as is" without express or implied warranty.
1315fb4814Smrg *
1415fb4814Smrg * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
1515fb4814Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
1615fb4814Smrg * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
1715fb4814Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
1815fb4814Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
1915fb4814Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
2015fb4814Smrg * PERFORMANCE OF THIS SOFTWARE.
2115fb4814Smrg */
2215fb4814Smrg
2315fb4814Smrg#ifdef HAVE_CONFIG_H
2415fb4814Smrg#include <config.h>
2515fb4814Smrg#endif
2615fb4814Smrg#include "xf86.h"
2715fb4814Smrg#include "xf86_OSproc.h"
2815fb4814Smrg#include "xf86Resources.h"
2915fb4814Smrg#include "xf86RAC.h"
3015fb4814Smrg#include "xf86cmap.h"
3115fb4814Smrg#include "compiler.h"
3215fb4814Smrg#include "mibstore.h"
3315fb4814Smrg#include "vgaHW.h"
3415fb4814Smrg#include "mipointer.h"
3515fb4814Smrg#include "micmap.h"
3615fb4814Smrg
3715fb4814Smrg#include "fb.h"
3815fb4814Smrg#include "regionstr.h"
3915fb4814Smrg#include "xf86xv.h"
4015fb4814Smrg#include <X11/extensions/Xv.h>
4115fb4814Smrg#include "vbe.h"
4215fb4814Smrg
4315fb4814Smrg#include "xf86PciInfo.h"
4415fb4814Smrg#include "xf86Pci.h"
4515fb4814Smrg
4615fb4814Smrg/* framebuffer offscreen manager */
4715fb4814Smrg#include "xf86fbman.h"
4815fb4814Smrg
4915fb4814Smrg/* include xaa includes */
5015fb4814Smrg#include "xaa.h"
5115fb4814Smrg#include "xaarop.h"
5215fb4814Smrg
5315fb4814Smrg/* H/W cursor support */
5415fb4814Smrg#include "xf86Cursor.h"
5515fb4814Smrg#include "cursorstr.h"
5615fb4814Smrg
5715fb4814Smrg/* Driver specific headers */
5815fb4814Smrg#include "ast.h"
5915fb4814Smrg
6015fb4814Smrg#ifdef	HWC
6115fb4814Smrg/* Prototype type declaration */
6215fb4814SmrgBool ASTCursorInit(ScreenPtr pScreen);
6315fb4814SmrgBool bInitHWC(ScrnInfoPtr pScrn, ASTRecPtr pAST);
6415fb4814Smrgstatic void ASTShowCursor(ScrnInfoPtr pScrn);
6515fb4814Smrgstatic void ASTHideCursor(ScrnInfoPtr pScrn);
6615fb4814Smrgstatic void ASTSetCursorPosition(ScrnInfoPtr pScrn, int x, int y);
6715fb4814Smrgstatic void ASTSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg);
6815fb4814Smrgstatic void ASTLoadCursorImage(ScrnInfoPtr pScrn, UCHAR *src);
6915fb4814Smrgstatic Bool ASTUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs);
7015fb4814Smrgstatic void ASTLoadCursorARGB(ScrnInfoPtr pScrn, CursorPtr pCurs);
7115fb4814Smrgstatic Bool ASTUseHWCursorARGB(ScreenPtr pScreen, CursorPtr pCurs);
7215fb4814Smrg
7315fb4814Smrgstatic void ASTFireCursor(ScrnInfoPtr pScrn);
7415fb4814Smrg
7515fb4814SmrgBool
7615fb4814SmrgASTCursorInit(ScreenPtr pScreen)
7715fb4814Smrg{
7815fb4814Smrg    ScrnInfoPtr	pScrn = xf86Screens[pScreen->myNum];
7915fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
8015fb4814Smrg    xf86CursorInfoPtr infoPtr;
8115fb4814Smrg
8215fb4814Smrg    infoPtr = xf86CreateCursorInfoRec();
8315fb4814Smrg    if(!infoPtr) return FALSE;
8415fb4814Smrg
8515fb4814Smrg    pAST->HWCInfoPtr = infoPtr;
8615fb4814Smrg
8715fb4814Smrg    infoPtr->Flags = HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
8815fb4814Smrg                     HARDWARE_CURSOR_INVERT_MASK |
8915fb4814Smrg                     HARDWARE_CURSOR_BIT_ORDER_MSBFIRST;
9015fb4814Smrg
9115fb4814Smrg    infoPtr->MaxWidth  = MAX_HWC_WIDTH;
9215fb4814Smrg    infoPtr->MaxHeight = MAX_HWC_HEIGHT;
9315fb4814Smrg    infoPtr->ShowCursor = ASTShowCursor;
9415fb4814Smrg    infoPtr->HideCursor = ASTHideCursor;
9515fb4814Smrg    infoPtr->SetCursorPosition = ASTSetCursorPosition;
9615fb4814Smrg    infoPtr->SetCursorColors = ASTSetCursorColors;
9715fb4814Smrg    infoPtr->LoadCursorImage = ASTLoadCursorImage;
9815fb4814Smrg    infoPtr->UseHWCursor = ASTUseHWCursor;
9915fb4814Smrg#ifdef ARGB_CURSOR
10015fb4814Smrg    infoPtr->UseHWCursorARGB = ASTUseHWCursorARGB;
10115fb4814Smrg    infoPtr->LoadCursorARGB = ASTLoadCursorARGB;
10215fb4814Smrg#endif
10315fb4814Smrg
10415fb4814Smrg    return(xf86InitCursor(pScreen, infoPtr));
10515fb4814Smrg
10615fb4814Smrg}
10715fb4814Smrg
10815fb4814SmrgBool bInitHWC(ScrnInfoPtr pScrn, ASTRecPtr pAST)
10915fb4814Smrg{
11015fb4814Smrg    ScreenPtr	pScreen;
11115fb4814Smrg
11215fb4814Smrg    /* init cursor cache info */
11315fb4814Smrg    /* Set HWC_NUM in Options instead */
11415fb4814Smrg    /* pAST->HWCInfo.HWC_NUM = DEFAULT_HWC_NUM; */
11515fb4814Smrg    pAST->HWCInfo.HWC_NUM_Next = 0;
11615fb4814Smrg
11715fb4814Smrg    /* allocate HWC cache */
11815fb4814Smrg    if (!pAST->pHWCPtr) {
11915fb4814Smrg        pScreen = screenInfo.screens[pScrn->scrnIndex];
12015fb4814Smrg        pAST->pHWCPtr = xf86AllocateOffscreenLinear (pScreen, (HWC_SIZE+HWC_SIGNATURE_SIZE)*pAST->HWCInfo.HWC_NUM, HWC_ALIGN, NULL, NULL, NULL);
12115fb4814Smrg
12215fb4814Smrg        if (!pAST->pHWCPtr) {
12315fb4814Smrg           xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Allocate HWC Cache failed \n");
12415fb4814Smrg           return (FALSE);
12515fb4814Smrg        }
12615fb4814Smrg
12715fb4814Smrg        pAST->HWCInfo.ulHWCOffsetAddr  = pAST->pHWCPtr->offset*((pScrn->bitsPerPixel + 1) / 8);
12815fb4814Smrg        pAST->HWCInfo.pjHWCVirtualAddr = pAST->FBVirtualAddr + pAST->HWCInfo.ulHWCOffsetAddr;
12915fb4814Smrg    }
13015fb4814Smrg
13115fb4814Smrg    return (TRUE);
13215fb4814Smrg}
13315fb4814Smrg
13415fb4814Smrg
13515fb4814Smrgstatic void
13615fb4814SmrgASTShowCursor(ScrnInfoPtr pScrn)
13715fb4814Smrg{
13815fb4814Smrg    ASTRecPtr   pAST = ASTPTR(pScrn);
13915fb4814Smrg    UCHAR 	jReg;
14015fb4814Smrg
14115fb4814Smrg    jReg= 0x02;
14215fb4814Smrg    if (pAST->HWCInfo.cursortype ==HWC_COLOR)
14315fb4814Smrg        jReg |= 0x01;
14415fb4814Smrg
14515fb4814Smrg    SetIndexRegMask(CRTC_PORT, 0xCB, 0xFC, jReg);	/* enable mono */
14615fb4814Smrg
14715fb4814Smrg}
14815fb4814Smrg
14915fb4814Smrgstatic void
15015fb4814SmrgASTHideCursor(ScrnInfoPtr pScrn)
15115fb4814Smrg{
15215fb4814Smrg    ASTRecPtr  pAST = ASTPTR(pScrn);
15315fb4814Smrg
15415fb4814Smrg    SetIndexRegMask(CRTC_PORT, 0xCB, 0xFC, 0x00);	/* disable HWC */
15515fb4814Smrg
15615fb4814Smrg}
15715fb4814Smrg
15815fb4814Smrgstatic void
15915fb4814SmrgASTSetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
16015fb4814Smrg{
16115fb4814Smrg    ASTRecPtr	pAST = ASTPTR(pScrn);
16215fb4814Smrg    DisplayModePtr mode = pAST->ModePtr;
16315fb4814Smrg    int		x_offset, y_offset;
16415fb4814Smrg    UCHAR 	*pjSignature;
16515fb4814Smrg
16615fb4814Smrg    /* Set cursor info to Offscreen */
16715fb4814Smrg    pjSignature = (UCHAR *) pAST->HWCInfo.pjHWCVirtualAddr + (HWC_SIZE+HWC_SIGNATURE_SIZE)*pAST->HWCInfo.HWC_NUM_Next + HWC_SIZE;
16815fb4814Smrg    *((ULONG *) (pjSignature + HWC_SIGNATURE_X)) = x;
16915fb4814Smrg    *((ULONG *) (pjSignature + HWC_SIGNATURE_Y)) = y;
17015fb4814Smrg
17115fb4814Smrg    x_offset = pAST->HWCInfo.offset_x;
17215fb4814Smrg    y_offset = pAST->HWCInfo.offset_y;
17315fb4814Smrg
17415fb4814Smrg    if(x < 0) {
17515fb4814Smrg       x_offset = (-x) + pAST->HWCInfo.offset_x;
17615fb4814Smrg       x = 0;
17715fb4814Smrg    }
17815fb4814Smrg
17915fb4814Smrg    if(y < 0) {
18015fb4814Smrg       y_offset = (-y) + pAST->HWCInfo.offset_y;
18115fb4814Smrg       y = 0;
18215fb4814Smrg    }
18315fb4814Smrg
18415fb4814Smrg    if(mode->Flags & V_DBLSCAN)  y *= 2;
18515fb4814Smrg
18615fb4814Smrg    /* Set to Reg. */
18715fb4814Smrg    SetIndexReg(CRTC_PORT, 0xC2, (UCHAR) (x_offset));
18815fb4814Smrg    SetIndexReg(CRTC_PORT, 0xC3, (UCHAR) (y_offset));
18915fb4814Smrg    SetIndexReg(CRTC_PORT, 0xC4, (UCHAR) (x & 0xFF));
19015fb4814Smrg    SetIndexReg(CRTC_PORT, 0xC5, (UCHAR) ((x >> 8) & 0x0F));
19115fb4814Smrg    SetIndexReg(CRTC_PORT, 0xC6, (UCHAR) (y & 0xFF));
19215fb4814Smrg    SetIndexReg(CRTC_PORT, 0xC7, (UCHAR) ((y >> 8) & 0x07));
19315fb4814Smrg
19415fb4814Smrg    /* Fire HWC */
19515fb4814Smrg    ASTFireCursor(pScrn);
19615fb4814Smrg
19715fb4814Smrg}
19815fb4814Smrg
19915fb4814Smrgstatic void
20015fb4814SmrgASTSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg)
20115fb4814Smrg{
20215fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
20315fb4814Smrg
20415fb4814Smrg    pAST->HWCInfo.fg = (fg & 0x0F) | (((fg>>8) & 0x0F) << 4) | (((fg>>16) & 0x0F) << 8);
20515fb4814Smrg    pAST->HWCInfo.bg = (bg & 0x0F) | (((bg>>8) & 0x0F) << 4) | (((bg>>16) & 0x0F) << 8);
20615fb4814Smrg}
20715fb4814Smrg
20815fb4814Smrgstatic void
20915fb4814SmrgASTLoadCursorImage(ScrnInfoPtr pScrn, UCHAR *src)
21015fb4814Smrg{
21115fb4814Smrg    ASTRecPtr	pAST = ASTPTR(pScrn);
21215fb4814Smrg    int 	i, j, k;
21315fb4814Smrg    UCHAR 	*pjSrcAnd, *pjSrcXor, *pjDstData;
21415fb4814Smrg    ULONG   	ulTempDstAnd32[2], ulTempDstXor32[2], ulTempDstData32[2];
21515fb4814Smrg    UCHAR    	jTempSrcAnd32, jTempSrcXor32;
21615fb4814Smrg    ULONG	ulCheckSum = 0;
21715fb4814Smrg    ULONG 	ulPatternAddr;
21815fb4814Smrg
21915fb4814Smrg    /* init cursor info. */
22015fb4814Smrg    pAST->HWCInfo.cursortype = HWC_MONO;
22115fb4814Smrg    pAST->HWCInfo.width  = (USHORT) MAX_HWC_WIDTH;
22215fb4814Smrg    pAST->HWCInfo.height = (USHORT) MAX_HWC_HEIGHT;
22315fb4814Smrg    pAST->HWCInfo.offset_x = MAX_HWC_WIDTH - pAST->HWCInfo.width;
22415fb4814Smrg    pAST->HWCInfo.offset_y = MAX_HWC_HEIGHT - pAST->HWCInfo.height;
22515fb4814Smrg
22615fb4814Smrg    /* copy cursor image to cache */
22715fb4814Smrg    pjSrcXor = src;
22815fb4814Smrg    pjSrcAnd = src + (MAX_HWC_WIDTH*MAX_HWC_HEIGHT/8);
22915fb4814Smrg    pjDstData =  pAST->HWCInfo.pjHWCVirtualAddr+(HWC_SIZE+HWC_SIGNATURE_SIZE)*pAST->HWCInfo.HWC_NUM_Next;
23015fb4814Smrg
23115fb4814Smrg    for (j = 0; j < MAX_HWC_HEIGHT; j++)
23215fb4814Smrg    {
23315fb4814Smrg       for (i = 0; i < (MAX_HWC_WIDTH/8); i++ )
23415fb4814Smrg       {
23515fb4814Smrg       	    for (k=7; k>0; k-=2)
23615fb4814Smrg       	    {
23715fb4814Smrg                jTempSrcAnd32 = *((UCHAR *) pjSrcAnd);
23815fb4814Smrg                jTempSrcXor32 = *((UCHAR *) pjSrcXor);
23915fb4814Smrg                ulTempDstAnd32[0] = ((jTempSrcAnd32 >> k) & 0x01) ? 0x00008000L:0x00L;
24015fb4814Smrg                ulTempDstXor32[0] = ((jTempSrcXor32 >> k) & 0x01) ? 0x00004000L:0x00L;
24115fb4814Smrg                ulTempDstData32[0] = ((jTempSrcXor32 >> k) & 0x01) ? pAST->HWCInfo.fg:pAST->HWCInfo.bg;
24215fb4814Smrg                ulTempDstAnd32[1] = ((jTempSrcAnd32 >> (k-1)) & 0x01) ? 0x80000000L:0x00L;
24315fb4814Smrg                ulTempDstXor32[1] = ((jTempSrcXor32 >> (k-1)) & 0x01) ? 0x40000000L:0x00L;
24415fb4814Smrg                ulTempDstData32[1] = ((jTempSrcXor32 >> (k-1)) & 0x01) ? (pAST->HWCInfo.fg << 16):(pAST->HWCInfo.bg << 16);
24515fb4814Smrg                *((ULONG *) pjDstData) = ulTempDstAnd32[0] | ulTempDstXor32[0] | ulTempDstData32[0] | ulTempDstAnd32[1] | ulTempDstXor32[1] | ulTempDstData32[1];
24615fb4814Smrg                ulCheckSum += *((ULONG *) pjDstData);
24715fb4814Smrg                pjDstData += 4;
24815fb4814Smrg
24915fb4814Smrg            }
25015fb4814Smrg            pjSrcAnd ++;
25115fb4814Smrg            pjSrcXor ++;
25215fb4814Smrg
25315fb4814Smrg       }
25415fb4814Smrg
25515fb4814Smrg    }
25615fb4814Smrg
25715fb4814Smrg    /* Write Checksum as signature */
25815fb4814Smrg    pjDstData = (UCHAR *) pAST->HWCInfo.pjHWCVirtualAddr + (HWC_SIZE+HWC_SIGNATURE_SIZE)*pAST->HWCInfo.HWC_NUM_Next + HWC_SIZE;
25915fb4814Smrg    *((ULONG *) pjDstData) = ulCheckSum;
26015fb4814Smrg    *((ULONG *) (pjDstData + HWC_SIGNATURE_SizeX)) = pAST->HWCInfo.width;
26115fb4814Smrg    *((ULONG *) (pjDstData + HWC_SIGNATURE_SizeY)) = pAST->HWCInfo.height;
26215fb4814Smrg    *((ULONG *) (pjDstData + HWC_SIGNATURE_HOTSPOTX)) = 0;
26315fb4814Smrg    *((ULONG *) (pjDstData + HWC_SIGNATURE_HOTSPOTY)) = 0;
26415fb4814Smrg
26515fb4814Smrg    /* set pattern offset */
26615fb4814Smrg    ulPatternAddr = ((pAST->HWCInfo.ulHWCOffsetAddr+(HWC_SIZE+HWC_SIGNATURE_SIZE)*pAST->HWCInfo.HWC_NUM_Next) >> 3);
26715fb4814Smrg    SetIndexReg(CRTC_PORT, 0xC8, (UCHAR) (ulPatternAddr & 0xFF));
26815fb4814Smrg    SetIndexReg(CRTC_PORT, 0xC9, (UCHAR) ((ulPatternAddr >> 8) & 0xFF));
26915fb4814Smrg    SetIndexReg(CRTC_PORT, 0xCA, (UCHAR) ((ulPatternAddr >> 16) & 0xFF));
27015fb4814Smrg
27115fb4814Smrg    /* update HWC_NUM_Next */
27215fb4814Smrg    pAST->HWCInfo.HWC_NUM_Next = (pAST->HWCInfo.HWC_NUM_Next+1) % pAST->HWCInfo.HWC_NUM;
27315fb4814Smrg
27415fb4814Smrg}
27515fb4814Smrg
27615fb4814Smrgstatic Bool
27715fb4814SmrgASTUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs)
27815fb4814Smrg{
27915fb4814Smrg    return TRUE;
28015fb4814Smrg}
28115fb4814Smrg
28215fb4814Smrgstatic void
28315fb4814SmrgASTLoadCursorARGB(ScrnInfoPtr pScrn, CursorPtr pCurs)
28415fb4814Smrg{
28515fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
28615fb4814Smrg
28715fb4814Smrg    UCHAR	*pjDstXor, *pjSrcXor;
28815fb4814Smrg    ULONG       i, j, ulSrcWidth, ulSrcHeight;
28915fb4814Smrg    ULONG	ulPerPixelCopy, ulTwoPixelCopy;
29015fb4814Smrg    LONG        lAlphaDstDelta, lLastAlphaDstDelta;
29115fb4814Smrg    union
29215fb4814Smrg    {
29315fb4814Smrg        ULONG   ul;
29415fb4814Smrg        UCHAR   b[4];
29515fb4814Smrg    } ulSrcData32[2], ulData32;
29615fb4814Smrg    union
29715fb4814Smrg    {
29815fb4814Smrg        USHORT  us;
29915fb4814Smrg        UCHAR   b[2];
30015fb4814Smrg    } usData16;
30115fb4814Smrg    ULONG	ulCheckSum = 0;
30215fb4814Smrg    ULONG 	ulPatternAddr;
30315fb4814Smrg
30415fb4814Smrg    /* init cursor info. */
30515fb4814Smrg    pAST->HWCInfo.cursortype = HWC_COLOR;
30615fb4814Smrg    pAST->HWCInfo.width  = pCurs->bits->width;
30715fb4814Smrg    pAST->HWCInfo.height = pCurs->bits->height;
30815fb4814Smrg    pAST->HWCInfo.offset_x = MAX_HWC_WIDTH - pAST->HWCInfo.width;
30915fb4814Smrg    pAST->HWCInfo.offset_y = MAX_HWC_HEIGHT - pAST->HWCInfo.height;
31015fb4814Smrg
31115fb4814Smrg    /* copy cursor image to cache */
31215fb4814Smrg    ulSrcWidth  =  pAST->HWCInfo.width;
31315fb4814Smrg    ulSrcHeight =  pAST->HWCInfo.height;
31415fb4814Smrg
31515fb4814Smrg    lAlphaDstDelta = MAX_HWC_WIDTH << 1;
31615fb4814Smrg    lLastAlphaDstDelta = lAlphaDstDelta - (ulSrcWidth << 1);
31715fb4814Smrg
31815fb4814Smrg    pjSrcXor  = (UCHAR *) pCurs->bits->argb;;
31915fb4814Smrg    pjDstXor  = (UCHAR *) pAST->HWCInfo.pjHWCVirtualAddr + (HWC_SIZE+HWC_SIGNATURE_SIZE)*pAST->HWCInfo.HWC_NUM_Next
32015fb4814Smrg                        + lLastAlphaDstDelta + (MAX_HWC_HEIGHT - ulSrcHeight) * lAlphaDstDelta;
32115fb4814Smrg
32215fb4814Smrg    ulPerPixelCopy =  ulSrcWidth & 1;
32315fb4814Smrg    ulTwoPixelCopy =  ulSrcWidth >> 1;
32415fb4814Smrg
32515fb4814Smrg    for (j = 0; j < ulSrcHeight; j++)
32615fb4814Smrg    {
32715fb4814Smrg
32815fb4814Smrg        for (i = 0; i < ulTwoPixelCopy; i++ )
32915fb4814Smrg        {
33015fb4814Smrg            ulSrcData32[0].ul = *((ULONG *) pjSrcXor) & 0xF0F0F0F0;
33115fb4814Smrg            ulSrcData32[1].ul = *((ULONG *) (pjSrcXor+4)) & 0xF0F0F0F0;
33215fb4814Smrg            ulData32.b[0] = ulSrcData32[0].b[1] | (ulSrcData32[0].b[0] >> 4);
33315fb4814Smrg            ulData32.b[1] = ulSrcData32[0].b[3] | (ulSrcData32[0].b[2] >> 4);
33415fb4814Smrg            ulData32.b[2] = ulSrcData32[1].b[1] | (ulSrcData32[1].b[0] >> 4);
33515fb4814Smrg            ulData32.b[3] = ulSrcData32[1].b[3] | (ulSrcData32[1].b[2] >> 4);
33615fb4814Smrg            *((ULONG *) pjDstXor) = ulData32.ul;
33715fb4814Smrg            ulCheckSum += (ULONG) ulData32.ul;
33815fb4814Smrg            pjDstXor += 4;
33915fb4814Smrg            pjSrcXor += 8;
34015fb4814Smrg        }
34115fb4814Smrg
34215fb4814Smrg        for (i = 0; i < ulPerPixelCopy; i++ )
34315fb4814Smrg        {
34415fb4814Smrg            ulSrcData32[0].ul = *((ULONG *) pjSrcXor) & 0xF0F0F0F0;
34515fb4814Smrg            usData16.b[0] = ulSrcData32[0].b[1] | (ulSrcData32[0].b[0] >> 4);
34615fb4814Smrg            usData16.b[1] = ulSrcData32[0].b[3] | (ulSrcData32[0].b[2] >> 4);
34715fb4814Smrg            *((USHORT *) pjDstXor) = usData16.us;
34815fb4814Smrg            ulCheckSum += (ULONG) usData16.us;
34915fb4814Smrg            pjDstXor += 2;
35015fb4814Smrg            pjSrcXor += 4;
35115fb4814Smrg        }
35215fb4814Smrg
35315fb4814Smrg        /* Point to next source and dest scans */
35415fb4814Smrg        pjDstXor += lLastAlphaDstDelta;
35515fb4814Smrg
35615fb4814Smrg    } /* end of for-loop */
35715fb4814Smrg
35815fb4814Smrg    /* Write Checksum as signature */
35915fb4814Smrg    pjDstXor = (UCHAR *) pAST->HWCInfo.pjHWCVirtualAddr + (HWC_SIZE+HWC_SIGNATURE_SIZE)*pAST->HWCInfo.HWC_NUM_Next + HWC_SIZE;
36015fb4814Smrg    *((ULONG *) pjDstXor) = ulCheckSum;
36115fb4814Smrg    *((ULONG *) (pjDstXor + HWC_SIGNATURE_SizeX)) = pAST->HWCInfo.width;
36215fb4814Smrg    *((ULONG *) (pjDstXor + HWC_SIGNATURE_SizeY)) = pAST->HWCInfo.height;
36315fb4814Smrg    *((ULONG *) (pjDstXor + HWC_SIGNATURE_HOTSPOTX)) = 0;
36415fb4814Smrg    *((ULONG *) (pjDstXor + HWC_SIGNATURE_HOTSPOTY)) = 0;
36515fb4814Smrg
36615fb4814Smrg    /* set pattern offset */
36715fb4814Smrg    ulPatternAddr = ((pAST->HWCInfo.ulHWCOffsetAddr +(HWC_SIZE+HWC_SIGNATURE_SIZE)*pAST->HWCInfo.HWC_NUM_Next) >> 3);
36815fb4814Smrg    SetIndexReg(CRTC_PORT, 0xC8, (UCHAR) (ulPatternAddr & 0xFF));
36915fb4814Smrg    SetIndexReg(CRTC_PORT, 0xC9, (UCHAR) ((ulPatternAddr >> 8) & 0xFF));
37015fb4814Smrg    SetIndexReg(CRTC_PORT, 0xCA, (UCHAR) ((ulPatternAddr >> 16) & 0xFF));
37115fb4814Smrg
37215fb4814Smrg    /* update HWC_NUM_Next */
37315fb4814Smrg    pAST->HWCInfo.HWC_NUM_Next = (pAST->HWCInfo.HWC_NUM_Next+1) % pAST->HWCInfo.HWC_NUM;
37415fb4814Smrg
37515fb4814Smrg}
37615fb4814Smrg
37715fb4814Smrgstatic Bool
37815fb4814SmrgASTUseHWCursorARGB(ScreenPtr pScreen, CursorPtr pCurs)
37915fb4814Smrg{
38015fb4814Smrg    return TRUE;
38115fb4814Smrg}
38215fb4814Smrg
38315fb4814Smrgstatic void
38415fb4814SmrgASTFireCursor(ScrnInfoPtr pScrn)
38515fb4814Smrg{
38615fb4814Smrg    ASTRecPtr  pAST = ASTPTR(pScrn);
38715fb4814Smrg
38815fb4814Smrg    SetIndexRegMask(CRTC_PORT, 0xCB, 0xFF, 0x00);	/* dummp write to fire HWC */
38915fb4814Smrg
39015fb4814Smrg}
39115fb4814Smrg
39215fb4814Smrg#endif	/* End of HWC */
393