summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/xorg-xserver/xserver-kdrive/w100.patch6385
-rw-r--r--packages/xorg-xserver/xserver-kdrive_X11R7.1-1.1.0.bb12
-rw-r--r--packages/xorg-xserver/xserver-kdrive_git.bb12
3 files changed, 6401 insertions, 8 deletions
diff --git a/packages/xorg-xserver/xserver-kdrive/w100.patch b/packages/xorg-xserver/xserver-kdrive/w100.patch
new file mode 100644
index 0000000000..2ff1639b9a
--- /dev/null
+++ b/packages/xorg-xserver/xserver-kdrive/w100.patch
@@ -0,0 +1,6385 @@
+Index: xorg-server-X11R7.1-1.1.0/hw/kdrive/w100/ati.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ xorg-server-X11R7.1-1.1.0/hw/kdrive/w100/ati.c 2006-09-02 11:47:21.000000000 +0200
+@@ -0,0 +1,434 @@
++/*
++ * Copyright © 2006 Alberto Mardegan <mardy@users.sourceforge.net>
++ *
++ * 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 appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of Alberto Mardegan not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission. Alberto Mardegan makes no
++ * representations about the suitability of this software for any purpose. It
++ * is provided "as is" without express or implied warranty.
++ *
++ * ALBERTO MARDEGAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL ALBERTO MARDEGAN 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.
++ */
++
++#ifdef HAVE_CONFIG_H
++#include <kdrive-config.h>
++#endif
++#include "ati.h"
++#include "w100_regs.h"
++
++
++struct pci_id_entry ati_pci_ids[] = {
++ {0x1002, 0x5644, 0, "ATI Imageon 3200"},
++ {0x1002, 0x5741, 0, "ATI Imageon 100"},
++ {0x1002, 0x5744, 0, "ATI Imageon 3220"},
++ {0, 0, 0, NULL}
++};
++
++
++static Bool
++ATICardInit(KdCardInfo * card)
++{
++ ATICardInfo *atic;
++ int i;
++ Bool initialized = FALSE;
++
++ atic = xcalloc(sizeof(ATICardInfo), 1);
++ if (atic == NULL)
++ return FALSE;
++
++#ifdef KDRIVEFBDEV
++ if (!initialized && fbdevInitialize(card, &atic->backend_priv.fbdev)) {
++ atic->use_fbdev = TRUE;
++ initialized = TRUE;
++ atic->backend_funcs.cardfini = fbdevCardFini;
++ atic->backend_funcs.scrfini = fbdevScreenFini;
++ atic->backend_funcs.initScreen = fbdevInitScreen;
++ atic->backend_funcs.finishInitScreen = fbdevFinishInitScreen;
++ atic->backend_funcs.createRes = fbdevCreateResources;
++ atic->backend_funcs.preserve = fbdevPreserve;
++ atic->backend_funcs.restore = fbdevRestore;
++ atic->backend_funcs.dpms = fbdevDPMS;
++ atic->backend_funcs.enable = fbdevEnable;
++ atic->backend_funcs.disable = fbdevDisable;
++ atic->backend_funcs.getColors = fbdevGetColors;
++ atic->backend_funcs.putColors = fbdevPutColors;
++#ifdef RANDR
++ atic->backend_funcs.randrSetConfig = fbdevRandRSetConfig;
++#endif
++ }
++#endif
++#ifdef KDRIVEVESA
++ if (!initialized && vesaInitialize(card, &atic->backend_priv.vesa)) {
++ atic->use_vesa = TRUE;
++ initialized = TRUE;
++ atic->backend_funcs.cardfini = vesaCardFini;
++ atic->backend_funcs.scrfini = vesaScreenFini;
++ atic->backend_funcs.initScreen = vesaInitScreen;
++ atic->backend_funcs.finishInitScreen = vesaFinishInitScreen;
++ atic->backend_funcs.createRes = vesaCreateResources;
++ atic->backend_funcs.preserve = vesaPreserve;
++ atic->backend_funcs.restore = vesaRestore;
++ atic->backend_funcs.dpms = vesaDPMS;
++ atic->backend_funcs.enable = vesaEnable;
++ atic->backend_funcs.disable = vesaDisable;
++ atic->backend_funcs.getColors = vesaGetColors;
++ atic->backend_funcs.putColors = vesaPutColors;
++#ifdef RANDR
++ atic->backend_funcs.randrSetConfig = vesaRandRSetConfig;
++#endif
++ }
++#endif
++
++ if (!initialized || !ATIMap(card, atic)) {
++ xfree(atic);
++ return FALSE;
++ }
++
++ card->driver = atic;
++
++ for (i = 0; ati_pci_ids[i].name != NULL; i++) {
++ if (ati_pci_ids[i].device == card->attr.deviceID) {
++ atic->pci_id = &ati_pci_ids[i];
++ break;
++ }
++ }
++
++ ErrorF("Using ATI card: %s\n", atic->pci_id->name);
++
++ return TRUE;
++}
++
++static void
++ATICardFini(KdCardInfo * card)
++{
++ ATICardInfo *atic = (ATICardInfo *) card->driver;
++
++ ATIUnmap(card, atic);
++ atic->backend_funcs.cardfini(card);
++}
++
++/*
++ * Once screen->off_screen_base is set, this function
++ * allocates the remaining memory appropriately
++ */
++
++static void
++ATISetOffscreen(KdScreenInfo * screen)
++{
++ ATICardInfo(screen);
++ int screen_size;
++ char *mmio = atic->reg_base;
++
++ /* check (and adjust) pitch */
++ if (mmio) {
++ int byteStride = screen->fb[0].byteStride;
++ int bitStride;
++ int pixelStride;
++ int bpp = screen->fb[0].bitsPerPixel;
++
++ /*
++ * Ensure frame buffer is correctly aligned
++ */
++ if (byteStride & 0x3f) {
++ byteStride = (byteStride + 0x3f) & ~0x3f;
++ bitStride = byteStride * 8;
++ pixelStride = bitStride / bpp;
++
++ screen->fb[0].byteStride = byteStride;
++ screen->fb[0].pixelStride = pixelStride;
++ }
++ }
++
++ screen_size = screen->fb[0].byteStride * screen->height;
++
++ screen->off_screen_base = screen_size;
++
++}
++
++static Bool
++ATIScreenInit(KdScreenInfo * screen)
++{
++ ATIScreenInfo *atis;
++ ATICardInfo(screen);
++ Bool success = FALSE;
++
++ atis = xcalloc(sizeof(ATIScreenInfo), 1);
++ if (atis == NULL)
++ return FALSE;
++
++ atis->atic = atic;
++ atis->screen = screen;
++ screen->driver = atis;
++
++ if (screen->fb[0].depth == 0)
++ screen->fb[0].depth = 16;
++#ifdef KDRIVEFBDEV
++ if (atic->use_fbdev) {
++ success = fbdevScreenInitialize(screen, &atis->backend_priv.fbdev);
++ }
++#endif
++#ifdef KDRIVEVESA
++ if (atic->use_vesa) {
++ success = vesaScreenInitialize(screen, &atis->backend_priv.vesa);
++ }
++#endif
++
++ if (!success) {
++ screen->driver = NULL;
++ xfree(atis);
++ return FALSE;
++ }
++
++ ErrorF
++ ("Offscreen memory at offset %08x, memory base %08x, size %08x\n",
++ screen->off_screen_base, screen->memory_base,
++ screen->memory_size);
++ ATISetOffscreen(screen);
++
++ return TRUE;
++}
++
++#ifdef RANDR
++static Bool
++ATIRandRSetConfig(ScreenPtr pScreen,
++ Rotation randr, int rate, RRScreenSizePtr pSize)
++{
++ KdScreenPriv(pScreen);
++ KdScreenInfo *screen = pScreenPriv->screen;
++ ATICardInfo *atic = screen->card->driver;
++ Bool ret;
++
++ ATIDrawDisable(pScreen);
++ ret = atic->backend_funcs.randrSetConfig(pScreen, randr, rate, pSize);
++ ATISetOffscreen(screen);
++ /*
++ * Set frame buffer mapping
++ */
++ (*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap(pScreen),
++ pScreen->width,
++ pScreen->height,
++ screen->fb[0].depth,
++ screen->fb[0].bitsPerPixel,
++ screen->fb[0].byteStride,
++ screen->fb[0].frameBuffer);
++
++ ATIDrawEnable(pScreen);
++ return ret;
++}
++
++static Bool
++ATIRandRInit(ScreenPtr pScreen)
++{
++ rrScrPrivPtr pScrPriv;
++
++ pScrPriv = rrGetScrPriv(pScreen);
++ pScrPriv->rrSetConfig = ATIRandRSetConfig;
++ return TRUE;
++}
++#endif
++
++static void
++ATIScreenFini(KdScreenInfo * screen)
++{
++ ATIScreenInfo *atis = (ATIScreenInfo *) screen->driver;
++ ATICardInfo *atic = screen->card->driver;
++
++ atic->backend_funcs.scrfini(screen);
++ xfree(atis);
++ screen->driver = 0;
++}
++
++Bool
++ATIMap(KdCardInfo * card, ATICardInfo * atic)
++{
++ atic->mem_base = (CARD8 *) KdMapDevice(ATI_MEM_BASE(card),
++ ATI_MEM_SIZE(card));
++
++ if (atic->mem_base == NULL)
++ return FALSE;
++ atic->reg_base = atic->mem_base + 0x10000; /* XXX */
++
++ KdSetMappedMode(ATI_MEM_BASE(card), ATI_MEM_SIZE(card),
++ KD_MAPPED_MODE_REGISTERS);
++
++ return TRUE;
++}
++
++void
++ATIUnmap(KdCardInfo * card, ATICardInfo * atic)
++{
++ if (atic->reg_base) {
++ KdResetMappedMode(ATI_REG_BASE(card), ATI_REG_SIZE(card),
++ KD_MAPPED_MODE_REGISTERS);
++ KdUnmapDevice((void *) atic->reg_base, ATI_REG_SIZE(card));
++ atic->reg_base = 0;
++ }
++}
++
++static Bool
++ATIInitScreen(ScreenPtr pScreen)
++{
++ KdScreenPriv(pScreen);
++ ATICardInfo(pScreenPriv);
++
++ return atic->backend_funcs.initScreen(pScreen);
++}
++
++static Bool
++ATIFinishInitScreen(ScreenPtr pScreen)
++{
++ KdScreenPriv(pScreen);
++ ATICardInfo(pScreenPriv);
++
++ if (!atic->backend_funcs.finishInitScreen(pScreen))
++ return FALSE;
++#ifdef RANDR
++ if (!ATIRandRInit(pScreen))
++ return FALSE;
++#endif
++ return TRUE;
++}
++
++static Bool
++ATICreateResources(ScreenPtr pScreen)
++{
++ KdScreenPriv(pScreen);
++ ATICardInfo(pScreenPriv);
++
++ return atic->backend_funcs.createRes(pScreen);
++}
++
++static void
++ATIPreserve(KdCardInfo * card)
++{
++ ATICardInfo *atic = card->driver;
++
++ atic->backend_funcs.preserve(card);
++}
++
++static void
++ATIRestore(KdCardInfo * card)
++{
++ ATICardInfo *atic = card->driver;
++
++ ATIUnmap(card, atic);
++
++ atic->backend_funcs.restore(card);
++}
++
++static Bool
++ATIDPMS(ScreenPtr pScreen, int mode)
++{
++ KdScreenPriv(pScreen);
++ ATICardInfo(pScreenPriv);
++
++ return atic->backend_funcs.dpms(pScreen, mode);
++}
++
++static Bool
++ATIEnable(ScreenPtr pScreen)
++{
++ KdScreenPriv(pScreen);
++ ATICardInfo(pScreenPriv);
++ mc_ext_mem_location_u eml;
++ char *mmio;
++
++ if (!atic->backend_funcs.enable(pScreen))
++ return FALSE;
++
++ if ((atic->reg_base == NULL)
++ && !ATIMap(pScreenPriv->screen->card, atic))
++ return FALSE;
++
++ mmio = atic->reg_base;
++ eml.val = MMIO_IN32(mmio, mmMC_EXT_MEM_LOCATION);
++ atic->ext_mem_location = eml.f.mc_ext_mem_start << 8;
++ ATISetOffscreen(pScreenPriv->screen);
++
++ return TRUE;
++}
++
++static void
++ATIDisable(ScreenPtr pScreen)
++{
++ KdScreenPriv(pScreen);
++ ATICardInfo(pScreenPriv);
++
++ ATIUnmap(pScreenPriv->card, atic);
++
++ atic->backend_funcs.disable(pScreen);
++}
++
++static void
++ATIGetColors(ScreenPtr pScreen, int fb, int n, xColorItem * pdefs)
++{
++ KdScreenPriv(pScreen);
++ ATICardInfo(pScreenPriv);
++
++ atic->backend_funcs.getColors(pScreen, fb, n, pdefs);
++}
++
++static void
++ATIPutColors(ScreenPtr pScreen, int fb, int n, xColorItem * pdefs)
++{
++ KdScreenPriv(pScreen);
++ ATICardInfo(pScreenPriv);
++
++ atic->backend_funcs.putColors(pScreen, fb, n, pdefs);
++}
++
++/* Compute log base 2 of val. */
++int
++ATILog2(int val)
++{
++ int bits;
++
++ for (bits = 0; val != 0; val >>= 1, ++bits);
++ return bits - 1;
++}
++
++
++
++KdCardFuncs ATIFuncs = {
++ ATICardInit, /* cardinit */
++ ATIScreenInit, /* scrinit */
++ ATIInitScreen, /* initScreen */
++ ATIFinishInitScreen, /* finishInitScreen */
++ ATICreateResources, /* createRes */
++ ATIPreserve, /* preserve */
++ ATIEnable, /* enable */
++ ATIDPMS, /* dpms */
++ ATIDisable, /* disable */
++ ATIRestore, /* restore */
++ ATIScreenFini, /* scrfini */
++ ATICardFini, /* cardfini */
++
++#define ATICursorInit 0
++#define ATICursorEnable 0
++#define ATICursorDisable 0
++#define ATICursorFini 0
++#define ATIRecolorCursor 0
++ ATICursorInit, /* initCursor */
++ ATICursorEnable, /* enableCursor */
++ ATICursorDisable, /* disableCursor */
++ ATICursorFini, /* finiCursor */
++ ATIRecolorCursor, /* recolorCursor */
++
++ ATIDrawInit, /* initAccel */
++ ATIDrawEnable, /* enableAccel */
++ ATIDrawDisable, /* disableAccel */
++ ATIDrawFini, /* finiAccel */
++
++ ATIGetColors, /* getColors */
++ ATIPutColors, /* putColors */
++};
+Index: xorg-server-X11R7.1-1.1.0/hw/kdrive/w100/ati_cursor.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ xorg-server-X11R7.1-1.1.0/hw/kdrive/w100/ati_cursor.c 2006-09-02 11:47:21.000000000 +0200
+@@ -0,0 +1,93 @@
++/*
++ * Copyright © 2006 Alberto Mardegan <mardy@users.sourceforge.net>
++ *
++ * 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 appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of Alberto Mardegan not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission. Alberto Mardegan makes no
++ * representations about the suitability of this software for any purpose. It
++ * is provided "as is" without express or implied warranty.
++ *
++ * ALBERTO MARDEGAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL ALBERTO MARDEGAN 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.
++ */
++
++#ifdef HAVE_CONFIG_H
++#include <kdrive-config.h>
++#endif
++#include "ati.h"
++#include "cursorstr.h"
++#include "ati_draw.h"
++
++static void
++ATIMoveCursor(ScreenPtr pScreen, int x, int y)
++{
++}
++
++
++static Bool
++ATIRealizeCursor(ScreenPtr pScreen, CursorPtr pCursor)
++{
++ return FALSE;
++}
++
++
++static Bool
++ATIUnrealizeCursor(ScreenPtr pScreen, CursorPtr pCursor)
++{
++ return TRUE;
++}
++
++
++static void
++ATISetCursor(ScreenPtr pScreen, CursorPtr pCursor, int x, int y)
++{
++}
++
++
++miPointerSpriteFuncRec ATIPointerSpriteFuncs = {
++ ATIRealizeCursor,
++ ATIUnrealizeCursor,
++ ATISetCursor,
++ ATIMoveCursor,
++};
++
++
++void
++ATICursorEnable(ScreenPtr pScreen)
++{
++}
++
++
++void
++ATICursorDisable(ScreenPtr pScreen)
++{
++}
++
++
++Bool
++ATICursorInit(ScreenPtr pScreen)
++{
++ return FALSE;
++}
++
++
++void
++ATIRecolorCursor(ScreenPtr pScreen, int ndef, xColorItem * pdef)
++{
++ return;
++}
++
++
++void
++ATICursorFini(ScreenPtr pScreen)
++{
++}
+Index: xorg-server-X11R7.1-1.1.0/hw/kdrive/w100/ati_dma.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ xorg-server-X11R7.1-1.1.0/hw/kdrive/w100/ati_dma.c 2006-09-02 11:47:21.000000000 +0200
+@@ -0,0 +1,333 @@
++/*
++ * Copyright © 2006 Alberto Mardegan <mardy@users.sourceforge.net>
++ *
++ * 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 appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of Alberto Mardegan not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission. Alberto Mardegan makes no
++ * representations about the suitability of this software for any purpose. It
++ * is provided "as is" without express or implied warranty.
++ *
++ * ALBERTO MARDEGAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL ALBERTO MARDEGAN 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.
++ */
++
++#include <sys/time.h>
++
++#include "ati.h"
++#include "w100_regs.h"
++#include "w100_const.h"
++#include "ati_dma.h"
++#include "ati_draw.h"
++
++
++#define DEBUG_FIFO 0
++
++extern CARD32 w100_microcode[][2];
++
++#if DEBUG_FIFO
++static void
++ATIDebugFifo(ATIScreenInfo * atis)
++{
++ ATICardInfo *atic = atis->atic;
++ char *mmio = atic->reg_base;
++
++ ErrorF("mmCP_CSQ_CNTL: 0x%08x\n", MMIO_IN32(mmio, mmCP_CSQ_CNTL));
++ ErrorF("mmCP_CSQ_STAT: 0x%08x\n", MMIO_IN32(mmio, mmCP_CSQ_STAT));
++ ErrorF("mmRBBM_STATUS: 0x%08x\n", MMIO_IN32(mmio, mmRBBM_STATUS));
++}
++#endif
++
++static void
++ATIUploadMicrocode(ATIScreenInfo * atis)
++{
++ ATICardInfo *atic = atis->atic;
++ char *mmio = atic->reg_base;
++ int i;
++
++ MMIO_OUT32(mmio, mmCP_ME_RAM_ADDR, 0);
++ for (i = 0; i < 256; i++) {
++ MMIO_OUT32(mmio, mmCP_ME_RAM_DATAH, w100_microcode[i][1]);
++ MMIO_OUT32(mmio, mmCP_ME_RAM_DATAL, w100_microcode[i][0]);
++ }
++}
++
++/* Required when reading from video memory after acceleration to make sure all
++ * data has been flushed to video memory from the pixel cache.
++ */
++static void
++ATIFlushPixelCache(ATIScreenInfo * atis)
++{
++ ATICardInfo *atic = atis->atic;
++ char *mmio = atic->reg_base;
++ rbbm_status_u rs;
++ TIMEOUT_LOCALS;
++
++ WHILE_NOT_TIMEOUT(.2) {
++ rs.val = MMIO_IN32(mmio, mmRBBM_STATUS);
++ if (!rs.f.gui_active)
++ break;
++ }
++ if (TIMEDOUT())
++ ErrorF("Timeout flushing pixel cache.\n");
++}
++
++static void
++ATIEngineReset(ATIScreenInfo * atis)
++{
++ ATICardInfo *atic = atis->atic;
++ char *mmio = atic->reg_base;
++ CARD32 sclk_cntl;
++ sclk_cntl_u sc;
++ rbbm_soft_reset_u rsr;
++
++#if DEBUG_FIFO
++ ErrorF("Engine Reset!\n");
++ ATIDebugFifo(atis);
++#endif
++
++ ATIFlushPixelCache(atis);
++
++ sc.val = sclk_cntl = MMIO_IN32(mmio, mmSCLK_CNTL);
++ sc.f.sclk_force_e2 = sc.f.sclk_force_e3 = sc.f.sclk_force_idct = 1;
++ MMIO_OUT32(mmio, mmSCLK_CNTL, sc.val);
++
++ rsr.val = 0;
++ rsr.f.soft_reset_e2 = 1;
++ MMIO_OUT32(mmio, mmRBBM_SOFT_RESET, rsr.val);
++ MMIO_OUT32(mmio, mmRBBM_SOFT_RESET, 0);
++
++ MMIO_OUT32(mmio, mmSCLK_CNTL, sclk_cntl);
++}
++
++inline void
++ATIWaitAvailMMIO(ATIScreenInfo * atis, int n)
++{
++ ATICardInfo *atic = atis->atic;
++ char *mmio = atic->reg_base;
++ rbbm_status_u rs;
++ TIMEOUT_LOCALS;
++
++ if (atis->mmio_avail >= n) {
++ atis->mmio_avail -= n;
++ return;
++ }
++ WHILE_NOT_TIMEOUT(.2) {
++ rs.val = MMIO_IN32(mmio, mmRBBM_STATUS);
++ atis->mmio_avail = rs.f.cmdfifo_avail;
++ if (atis->mmio_avail >= n)
++ break;
++ ErrorF("Available %d slots.\n", atis->mmio_avail);
++ }
++ if (TIMEDOUT()) {
++ ErrorF("Timeout waiting for %d MMIO slots.\n", n);
++ ATIEngineReset(atis);
++ ATIDrawSetup(atis->screen->pScreen);
++ }
++ atis->mmio_avail -= n;
++}
++
++
++void
++ATIWaitIdle(ATIScreenInfo * atis)
++{
++ ATICardInfo *atic = atis->atic;
++ char *mmio = atic->reg_base;
++ rbbm_status_u rs;
++ TIMEOUT_LOCALS;
++
++ /* Empty the fifo */
++ ATIWaitAvailMMIO(atis, 16);
++
++ WHILE_NOT_TIMEOUT(.2) {
++ rs.val = MMIO_IN32(mmio, mmRBBM_STATUS);
++ if (!rs.f.gui_active)
++ break;
++#if DEBUG_FIFO
++ ATIDebugFifo(atis);
++#endif
++ /* don't know if this is needed, but it's in aticore */
++ MMIO_IN32(mmio, mmCP_RB_RPTR);
++ }
++ if (TIMEDOUT()) {
++ ErrorF("Timeout idling accelerator, resetting...\n");
++ ATIEngineReset(atis);
++ ATIDrawSetup(atis->screen->pScreen);
++ }
++
++ ATIFlushPixelCache(atis);
++
++#if DEBUG_FIFO
++ ErrorF("Idle?\n");
++ ATIDebugFifo(atis);
++#endif
++}
++
++
++static Bool
++ATIDMAInit(ScreenPtr pScreen, Bool use_agp)
++{
++ KdScreenPriv(pScreen);
++ ATIScreenInfo(pScreenPriv);
++ ATICardInfo(pScreenPriv);
++ char *mmio = atic->reg_base;
++ int dma_offset, rbsize = 10;
++ wrap_start_dir_u wsd;
++ wrap_buf_a_u wba;
++ cp_rb_cntl_u rc;
++ cp_csq_cntl_u cc;
++ CARD32 mem_offset;
++
++ /* with rbsize = 10, DMA buffer will be of 0x2000 (8192) bytes */
++ atis->ring_count = 1 << (rbsize + 1);
++ atis->ring_mask = atis->ring_count - 1;
++ atis->ring_len = atis->ring_count * 4;
++ atis->dma_space = KdOffscreenAlloc(pScreen, atis->ring_len,
++ 16, TRUE, NULL, NULL);
++ if (atis->dma_space == NULL)
++ return FALSE;
++
++ wsd.val = MMIO_IN32(mmio, mmWRAP_START_DIR);
++ atis->ring_addr =
++ (CARD32 *) (atic->mem_base + (wsd.f.start_addr << 1));
++ dma_offset = atis->dma_space->offset;
++
++ ATIUploadMicrocode(atis);
++ ATIEngineReset(atis);
++
++ atis->ring_read = 0;
++ atis->ring_write = 0;
++ atis->ring_free = atis->ring_count;
++
++ mem_offset = atic->ext_mem_location + atis->dma_space->offset;
++ MMIO_OUT32(mmio, mmCP_RB_BASE, mem_offset);
++ MMIO_OUT32(mmio, mmCP_RB_WPTR, atis->ring_write);
++ MMIO_OUT32(mmio, mmCP_RB_RPTR, atis->ring_read);
++ MMIO_OUT32(mmio, mmCP_RB_RPTR_ADDR, 0);
++
++ wba.val = 0;
++ wba.f.offset_addr_a = mem_offset;
++ switch (rbsize) {
++ case 9:
++ wba.f.block_size_a = WB_BLOCK_SIZE_A_0;
++ break;
++ case 10:
++ wba.f.block_size_a = WB_BLOCK_SIZE_A_1;
++ break;
++ case 11:
++ wba.f.block_size_a = WB_BLOCK_SIZE_A_2;
++ break;
++ case 12:
++ wba.f.block_size_a = WB_BLOCK_SIZE_A_3;
++ break;
++ case 13:
++ wba.f.block_size_a = WB_BLOCK_SIZE_A_4;
++ break;
++ }
++ MMIO_OUT32(mmio, mmWRAP_BUF_A, wba.val);
++
++ rc.val = 0;
++ rc.f.rb_no_update = 1;
++ rc.f.rb_bufsz = rbsize;
++ MMIO_OUT32(mmio, mmCP_RB_CNTL, rc.val);
++
++ cc.val = 0;
++ cc.f.csq_mode = CSQ_CNTL_MODE_FREERUN;
++ MMIO_OUT32(mmio, mmCP_CSQ_CNTL, cc.val);
++
++ return TRUE;
++}
++
++static Bool
++ATIDMAFini(ScreenPtr pScreen)
++{
++ KdScreenPriv(pScreen);
++ ATIScreenInfo(pScreenPriv);
++ ATICardInfo(pScreenPriv);
++ char *mmio = atic->reg_base;
++
++ MMIO_OUT32(mmio, mmCP_CSQ_CNTL, 0);
++
++ ATIEngineReset(atis);
++
++ //KdOffscreenFree(pScreen, atis->dma_space);
++
++ return TRUE;
++}
++
++void
++ATIDMASetup(ScreenPtr pScreen)
++{
++ KdScreenPriv(pScreen);
++ ATIScreenInfo(pScreenPriv);
++
++ atis->using_dma = FALSE;
++ atis->using_pio = FALSE;
++ if (ATIDMAInit(pScreen, FALSE))
++ atis->using_dma = TRUE;
++
++ if (atis->using_dma)
++ ErrorF("Initialized DMA\n");
++}
++
++void
++ATIDMATeardown(ScreenPtr pScreen)
++{
++ KdScreenPriv(pScreen);
++ ATIScreenInfo(pScreenPriv);
++
++ ATIWaitIdle(atis);
++
++ if (atis->using_dma)
++ ATIDMAFini(pScreen);
++
++ atis->using_pio = FALSE;
++ atis->using_dma = FALSE;
++}
++
++
++CARD32 *
++ATIRequestEntries(ATIScreenInfo * atis, int n)
++{
++ char *mmio = atis->atic->reg_base;
++ CARD32 *ptr;
++ TIMEOUT_LOCALS;
++
++ WHILE_NOT_TIMEOUT(1) {
++ if (atis->ring_free > n) {
++ ptr = atis->ring_addr + atis->ring_write;
++ return ptr;
++ }
++ atis->ring_read = MMIO_IN32(mmio, mmCP_RB_RPTR);
++ atis->ring_write = MMIO_IN32(mmio, mmCP_RB_WPTR);
++
++ if (atis->ring_read == atis->ring_write) {
++ atis->ring_free = atis->ring_count;
++ } else {
++ atis->ring_free =
++ (atis->ring_count +
++ atis->ring_read - atis->ring_write) & atis->ring_mask;
++ }
++ }
++ if (TIMEDOUT())
++ ErrorF("Timeout waiting for %d entries.\n", n);
++ return NULL;
++}
++
++void
++ATISubmitEntries(ATIScreenInfo * atis, int n)
++{
++ char *mmio = atis->atic->reg_base;
++ atis->ring_free -= n;
++ atis->ring_write += n;
++ atis->ring_write &= atis->ring_mask;
++ MMIO_OUT32(mmio, mmCP_RB_WPTR, atis->ring_write);
++}
+Index: xorg-server-X11R7.1-1.1.0/hw/kdrive/w100/ati_dma.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ xorg-server-X11R7.1-1.1.0/hw/kdrive/w100/ati_dma.h 2006-09-02 11:47:21.000000000 +0200
+@@ -0,0 +1,176 @@
++/*
++ * Copyright © 2004 Eric Anholt
++ *
++ * 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 appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of Eric Anholt not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission. Eric Anholt makes no
++ * representations about the suitability of this software for any purpose. It
++ * is provided "as is" without express or implied warranty.
++ *
++ * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL ERIC ANHOLT 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.
++ */
++/* $Header: /cvs/xserver/xserver/hw/kdrive/ati/ati_dma.h,v 1.5 2005-01-27 05:25:57 anholt Exp $ */
++
++#ifndef _ATI_DMA_H_
++#define _ATI_DMA_H_
++
++#define CCE_DEBUG 1
++
++/* CCE packet defines */
++
++#define ATI_CCE_PACKETTYPE_MASK 0xc0000000
++#define ATI_CCE_PACKET0 0x00000000
++#define ATI_CCE_PACKET0_COUNT_MASK 0x3fff0000
++#define ATI_CCE_PACKET0_ONE_REG_WR 0x00008000
++#define ATI_CCE_PACKET0_REG_MASK 0x000007ff
++#define ATI_CCE_PACKET1 0x40000000
++#define ATI_CCE_PACKET1_REG_1 0x000007ff
++#define ATI_CCE_PACKET1_REG_2 0x003ff800
++#define ATI_CCE_PACKET1_REG_2_SHIFT 10
++#define ATI_CCE_PACKET2 0x80000000
++#define ATI_CCE_PACKET3 0xc0000000
++#define ATI_CCE_PACKET3_COUNT_MASK 0x3fff0000
++#define ATI_CCE_PACKET3_IT_OPCODE_MASK 0x0000ff00
++
++
++#if !CCE_DEBUG
++#define DMA_PACKET0(reg, count) \
++ (ATI_CCE_PACKET0 | (((count) - 1) << 16) | ((reg) >> 2))
++#else
++#define DMA_PACKET0(reg, count) \
++ (__packet0count = (count), __reg = (reg), \
++ ATI_CCE_PACKET0 | (((count) - 1) << 16) | ((reg) >> 2))
++#endif
++#define DMA_PACKET1(reg1, reg2) \
++ (ATI_CCE_PACKET1 | \
++ (((reg2) >> 2) << ATI_CCE_PACKET1_REG_2_SHIFT) | ((reg1) >> 2))
++#define DMA_PACKET3(type, count) \
++ ((type) | (((count) - 1) << 16))
++
++
++
++#ifdef USE_DMA
++
++#if !CCE_DEBUG
++
++#define RING_LOCALS \
++ CARD32 *__head; int __count
++#define BEGIN_DMA(n) \
++do { \
++ __head = ATIRequestEntries(atis, n); \
++ __count = 0; \
++} while (0)
++#define END_DMA() do { \
++ ATISubmitEntries(atis, __count); \
++} while (0)
++
++#else /* CCE_DEBUG */
++#define RING_LOCALS \
++ CARD32 *__head; int __count, __total, __reg, __packet0count
++#define BEGIN_DMA(n) \
++do { \
++ __head = ATIRequestEntries(atis, n); \
++ __count = 0; \
++ __total = n; \
++ __reg = 0; \
++ __packet0count = 0; \
++} while (0)
++#define END_DMA() do { \
++ if (__count != __total) \
++ FatalError("count != total (%d vs %d) at %s:%d\n", \
++ __count, __total, __FILE__, __LINE__); \
++ ATISubmitEntries(atis, __count); \
++} while (0)
++
++#endif /* CCE_DEBUG */
++
++#define BEGIN_DMA_REG(n) BEGIN_DMA(n * 2)
++#define END_DMA_REG() END_DMA()
++
++#define OUT_REG(reg, val) \
++do { \
++ OUT_RING(DMA_PACKET0(reg, 1)); \
++ OUT_RING(val); \
++} while (0)
++
++
++#else /* USE_DMA */
++
++
++#define RING_LOCALS char *__mmio = atis->atic->reg_base
++#define BEGIN_DMA_REG(n) \
++do { \
++ ATIWaitAvailMMIO(atis, n); \
++} while (0)
++#define END_DMA_REG() do {} while (0)
++#define OUT_REG(reg, val) MMIO_OUT32(__mmio, reg, val)
++#endif /* USE_DMA */
++
++
++#define OUT_RING(val) do { \
++ __head[__count++] = (val); \
++} while (0)
++
++#define OUT_RING_REG(reg, val) do { \
++ if (__reg != reg) \
++ FatalError("unexpected reg (0x%x vs 0x%x) at %s:%d\n", \
++ reg, __reg, __FILE__, __LINE__); \
++ if (__packet0count-- <= 0) \
++ FatalError("overrun of packet0 at %s:%d\n", \
++ __FILE__, __LINE__); \
++ __head[__count++] = (val); \
++ __reg += 4; \
++} while (0)
++
++#define OUT_RING_F(x) OUT_RING(GET_FLOAT_BITS(x))
++
++#define TIMEOUT_LOCALS struct timeval _target, _curtime
++
++static inline Bool
++tv_le(struct timeval *tv1, struct timeval *tv2)
++{
++ if (tv1->tv_sec < tv2->tv_sec ||
++ (tv1->tv_sec == tv2->tv_sec && tv1->tv_usec < tv2->tv_usec))
++ return TRUE;
++ else
++ return FALSE;
++}
++
++#define WHILE_NOT_TIMEOUT(_timeout) \
++ gettimeofday(&_target, NULL); \
++ _target.tv_usec += ((_timeout) * 1000000); \
++ _target.tv_sec += _target.tv_usec / 1000000; \
++ _target.tv_usec = _target.tv_usec % 1000000; \
++ while (gettimeofday(&_curtime, NULL), tv_le(&_curtime, &_target))
++
++#define TIMEDOUT() (!tv_le(&_curtime, &_target))
++
++
++void
++ATIFlushIndirect(ATIScreenInfo *atis, Bool discard);
++
++void
++ATIDMASetup(ScreenPtr pScreen);
++
++void
++ATIDMATeardown(ScreenPtr pScreen);
++
++CARD32 *
++ATIRequestEntries(ATIScreenInfo *atis, int n);
++
++void
++ATISubmitEntries(ATIScreenInfo *atis, int n);
++
++inline void
++ATIWaitAvailMMIO(ATIScreenInfo *atis, int n);
++#endif /* _ATI_DMA_H_ */
+Index: xorg-server-X11R7.1-1.1.0/hw/kdrive/w100/ati_draw.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ xorg-server-X11R7.1-1.1.0/hw/kdrive/w100/ati_draw.c 2006-09-02 11:47:21.000000000 +0200
+@@ -0,0 +1,477 @@
++/*
++ * Copyright © 2006 Alberto Mardegan <mardy@users.sourceforge.net>
++ *
++ * 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 appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of Alberto Mardegan not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission. Alberto Mardegan makes no
++ * representations about the suitability of this software for any purpose. It
++ * is provided "as is" without express or implied warranty.
++ *
++ * ALBERTO MARDEGAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL ALBERTO MARDEGAN 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.
++ */
++
++#define USE_DMA
++#define DRAW_USING_PACKET3
++
++#ifdef HAVE_CONFIG_H
++#include <kdrive-config.h>
++#endif
++#include "ati.h"
++#include "w100_regs.h"
++#include "w100_const.h"
++#include "ati_dma.h"
++#include "ati_draw.h"
++#include "kaa.h"
++
++
++CARD8 ATISolidRop[16] = {
++ /* GXclear */ 0x00,
++ /* 0 */
++ /* GXand */ 0xa0,
++ /* src AND dst */
++ /* GXandReverse */ 0x50,
++ /* src AND NOT dst */
++ /* GXcopy */ 0xf0,
++ /* src */
++ /* GXandInverted */ 0x0a,
++ /* NOT src AND dst */
++ /* GXnoop */ 0xaa,
++ /* dst */
++ /* GXxor */ 0x5a,
++ /* src XOR dst */
++ /* GXor */ 0xfa,
++ /* src OR dst */
++ /* GXnor */ 0x05,
++ /* NOT src AND NOT dst */
++ /* GXequiv */ 0xa5,
++ /* NOT src XOR dst */
++ /