diff options
| author | Koen Kooi <koen@openembedded.org> | 2007-03-12 20:24:12 +0000 |
|---|---|---|
| committer | Koen Kooi <koen@openembedded.org> | 2007-03-12 20:24:12 +0000 |
| commit | 925e5796e12d9a70da5fbaddc6fddfa1cd644f56 (patch) | |
| tree | dfb7ba53d683911d1fd079f22f6a36290b9b69c4 | |
| parent | a4387c8e6f727bdee91f8062be68053bc7b5d3c4 (diff) | |
| parent | 3b23228ed78c8b4c2b7d376eb020a0e8980249b2 (diff) | |
merge of '22707d4a2732d846be50633b33777233881d2761'
and 'cc36c0fcd3ef4d293e42c2d04104ccaeb774fc1f'
| -rw-r--r-- | packages/xorg-xserver/xserver-kdrive/kdrive-imageon.patch | 1104 | ||||
| -rw-r--r-- | packages/xorg-xserver/xserver-kdrive_X11R7.1-1.1.0.bb | 2 |
2 files changed, 705 insertions, 401 deletions
diff --git a/packages/xorg-xserver/xserver-kdrive/kdrive-imageon.patch b/packages/xorg-xserver/xserver-kdrive/kdrive-imageon.patch index 376074951f..86ab49e1b2 100644 --- a/packages/xorg-xserver/xserver-kdrive/kdrive-imageon.patch +++ b/packages/xorg-xserver/xserver-kdrive/kdrive-imageon.patch @@ -1,4 +1,3 @@ - # Author: Manuel Teira <manuel.teira@telefonica.net> (sirfred in #oe) # Description: New driver for the Imageon ATI Card. Implementing: # -Hardware solid fills @@ -12,8 +11,8 @@ # Patch managed by http://www.holgerschurig.de/patcher.html # ---- xorg-server-X11R7.1-1.1.0.orig/configure.ac~kdrive-imageon -+++ xorg-server-X11R7.1-1.1.0.orig/configure.ac +--- xorg-server-X11R7.1-1.1.0.work/configure.ac~kdrive-imageon ++++ xorg-server-X11R7.1-1.1.0.work/configure.ac @@ -435,6 +435,7 @@ AC_ARG_ENABLE(kdrive, AS_HELP_STRING([--enable-kdrive], [Build kdrive servers (default: no)]), [KDRIVE=$enableval], [KDRIVE=no]) AC_ARG_ENABLE(xephyr, AS_HELP_STRING([--enable-xephyr], [Build the kdrive Xephyr server (default: auto)]), [XEPHYR=$enableval], [XEPHYR=auto]) @@ -42,8 +41,8 @@ hw/kdrive/i810/Makefile hw/kdrive/linux/Makefile hw/kdrive/mach64/Makefile ---- xorg-server-X11R7.1-1.1.0.orig/hw/kdrive/Makefile.am~kdrive-imageon -+++ xorg-server-X11R7.1-1.1.0.orig/hw/kdrive/Makefile.am +--- xorg-server-X11R7.1-1.1.0.work/hw/kdrive/Makefile.am~kdrive-imageon ++++ xorg-server-X11R7.1-1.1.0.work/hw/kdrive/Makefile.am @@ -1,18 +1,9 @@ -if KDRIVEVESA -VESA_SUBDIRS = vesa ati chips epson i810 mach64 mga neomagic nvidia pm2 r128 \ @@ -78,7 +77,7 @@ DIST_SUBDIRS = vesa ati chips epson i810 mach64 mga neomagic nvidia pm2 r128 \ smi via fbdev sdl ephyr src linux fake sis300 --- /dev/null -+++ xorg-server-X11R7.1-1.1.0.orig/hw/kdrive/imageon/Makefile.am ++++ xorg-server-X11R7.1-1.1.0.work/hw/kdrive/imageon/Makefile.am @@ -0,0 +1,47 @@ +if KDRIVEFBDEV +FBDEV_INCLUDES =-I$(top_srcdir)/hw/kdrive/fbdev @@ -128,8 +127,8 @@ + libimageon.a \ + $(FBDEV_LIBS) --- /dev/null -+++ xorg-server-X11R7.1-1.1.0.orig/hw/kdrive/imageon/imageon.c -@@ -0,0 +1,523 @@ ++++ xorg-server-X11R7.1-1.1.0.work/hw/kdrive/imageon/imageon.c +@@ -0,0 +1,607 @@ +/* + * Copyright © 2007 Manuel Teira + * @@ -157,19 +156,69 @@ +#endif +#include "imageon.h" +#include "imageon_regs.h" ++#include "imageon_support.h" ++ ++W100CardEntry w100_cards[] = { ++ {0x1002, 0x5644, 0, "ATI Imageon 3200"}, ++ {0x1002, 0x5741, W100XVSupport, "ATI Imageon 100"}, ++ {0x1002, 0x5744, 0, "ATI Imageon 3220"}, ++ {0, 0, 0, NULL} ++}; + -+struct pci_id_entry w100_pci_ids[] = { -+ {0x1002, 0x5644, 0, "ATI Imageon 3200"}, -+ {0x1002, 0x5741, 0, "ATI Imageon 100"}, -+ {0x1002, 0x5744, 0, "ATI Imageon 3220"}, -+ {0, 0, 0, NULL} ++W100ModeSpec w100_modes[] = { ++ {800, 600, 16, W100_EXTMEM, FALSE}, ++ {640, 480, 16, W100_EXTMEM, FALSE}, ++ {320, 240, 16, W100_INTMEM, FALSE}, ++ { 0, 0, 0, 0, FALSE} +}; + ++W100StartupInfo w100StartupInfo; ++ ++extern void (*tslib_transform_coords)(long *x, long *y, void *closure); ++extern void *tslib_transform_closure; ++ ++static void ++W100Startup(W100CardInfo *w100c) ++{ ++ int i; ++ DBG_IMAGEON(("--W100Startup\n")); ++ W100ModeSpec *modes; ++ /* Take the current graphics mode */ ++ if (!W100GetFbMode(w100c, &w100StartupInfo.mode)) { ++ ErrorF("(E) Unable to get current mode\n"); ++ } ++ w100StartupInfo.randr = W100GetRotation(w100c); ++ w100StartupInfo.portrait = w100StartupInfo.mode.width < w100StartupInfo.mode.height; ++ ++ /* Test the valid modes */ ++ for (modes = w100_modes; modes->width; modes++) { ++ modes->supported = W100CheckFbMode(w100c, modes); ++ } ++ ++ DBG_IMAGEON(("Startup Mode: %dx%d@%d, rot: %d, portrait: %s\n", ++ w100StartupInfo.mode.width, ++ w100StartupInfo.mode.height, ++ w100StartupInfo.mode.bpp, ++ w100StartupInfo.randr, ++ w100StartupInfo.portrait ? "Yes" : "No")); ++ ++ /* Tell the kernel to never switch off external memory */ ++ W100SysFsSet(w100c, W100_SYSFS_BASE "extmem", "1"); ++ ++ /* Disable framebuffer accel */ ++ W100SysFsSet(w100c, W100_SYSFS_BASE "accel", "0"); ++ ++ /* Enable fastsysclk */ ++ W100SysFsSet(w100c, W100_SYSFS_BASE "fastpllclk", "1"); ++ ++} ++ ++ +static Bool +W100Map(KdCardInfo * card, W100CardInfo *w100c) +{ -+ w100c->mem_base = (CARD8 *) KdMapDevice(W100_MEM_BASE, -+ W100_MEM_SIZE); ++ DBG_IMAGEON(("--W100Map\n")); ++ w100c->mem_base = (CARD8 *) KdMapDevice(W100_MEM_BASE, W100_MEM_SIZE); + + if (w100c->mem_base == NULL) { + return FALSE; @@ -182,8 +231,7 @@ + * There's only difference when HAVE_ASM_MTRR_H is defined. + * So, this call is doing nothing. + */ -+ KdSetMappedMode(W100_MEM_BASE, W100_MEM_SIZE, -+ KD_MAPPED_MODE_REGISTERS); ++ KdSetMappedMode(W100_MEM_BASE, W100_MEM_SIZE, KD_MAPPED_MODE_REGISTERS); + + return TRUE; +} @@ -191,77 +239,108 @@ +static void +W100Unmap(KdCardInfo * card, W100CardInfo *w100c) +{ ++ DBG_IMAGEON(("--W100Unmap\n")); + if (w100c->mem_base) { -+ KdResetMappedMode(W100_MEM_BASE, W100_MEM_SIZE, ++ KdResetMappedMode(W100_MEM_BASE, W100_MEM_SIZE, + KD_MAPPED_MODE_REGISTERS); + KdUnmapDevice((void *) w100c->mem_base, W100_MEM_SIZE); + w100c->mem_base = w100c->reg_base = 0; + } +} + ++static void W100MemSetup(W100CardInfo *w100c) ++{ ++ int reg_value; ++ int int_start, int_size; ++ int ext_start, ext_size; ++ int i; ++ DBG_IMAGEON(("--W100MemSetup\n")); ++ ++ for (i = 0; i < w100c->num_memareas; i++) { ++ xfree(w100c->memareas[i]); ++ } ++ xfree(w100c->memareas); ++ ++ reg_value = MMIO_IN32(mmMC_FB_LOCATION); ++ int_start = (reg_value & 0xffff) << 8; ++ int_size = (((reg_value >> 16) & 0xffff) - (reg_value & 0xffff)) << 8; ++ DBG_IMAGEON(("(I) MC_FB_LOCATION: 0x%08x. Start: 0x%08x, size: %d\n", ++ reg_value, int_start, int_size)); ++ ++ reg_value = MMIO_IN32(mmMC_EXT_MEM_LOCATION); ++ ext_start = (reg_value & 0xffff) << 8; ++ ext_size = (((reg_value >> 16) & 0xffff) - (reg_value & 0xffff)) << 8; ++ DBG_IMAGEON(("(I) MC_EXT_MEM_LOCATION: 0x%08x. Start: 0x%08x, size: %d\n", ++ reg_value, ext_start, ext_size)); ++ ++ w100c->num_memareas = (ext_size > 0) ? 2 : 1; ++ w100c->memareas = xcalloc(sizeof(W100MemArea *), w100c->num_memareas); ++ ++ w100c->memareas[W100_INTMEM] = xcalloc(sizeof(W100MemArea), 1); ++ w100c->memareas[W100_INTMEM]->priority = KD_VIDMEM_MAXPRIO; ++ w100c->memareas[W100_INTMEM]->start = (CARD8 *) int_start; ++ w100c->memareas[W100_INTMEM]->size = int_size; ++ ++ if (w100c->num_memareas == 2) { ++ w100c->memareas[W100_EXTMEM] = xcalloc(sizeof(W100MemArea), 1); ++ w100c->memareas[W100_EXTMEM]->priority = KD_VIDMEM_MINPRIO; ++ w100c->memareas[W100_EXTMEM]->start = (CARD8 *) ext_start; ++ w100c->memareas[W100_EXTMEM]->size = ext_size; ++ } ++ ++ for (i = 0; i < w100c->num_memareas; i++) { ++ DBG_IMAGEON(("(I) Memory mapped at 0x%08x(0x%08x), size %d bytes\n", ++ W100_CARD2HOST(w100c->memareas[i]->start), ++ w100c->memareas[i]->start, ++ w100c->memareas[i]->size)); ++ } ++ ++} ++ +static Bool +W100CardInit(KdCardInfo * card) +{ + W100CardInfo *w100c; -+ int i; -+ int ext_mem; -+ int int_mem; -+ Bool initialized = FALSE; ++ ++ W100CardEntry *model = &w100_cards[0]; ++ static Bool initialized = FALSE; ++ ++ DBG_IMAGEON(("--W100CardInit\n")); + + w100c = xcalloc(sizeof(W100CardInfo), 1); + if (w100c == NULL) + return FALSE; + -+ if (!initialized && fbdevInitialize(card, &w100c->fbdev)) { -+ initialized = TRUE; ++ if (!fbdevInitialize(card, &w100c->fbdev)) { ++ return FALSE; + } + -+ if (!initialized || !W100Map(card, w100c)) { ++ if (!W100Map(card, w100c)) { + xfree(w100c); + return FALSE; + } + card->driver = w100c; + -+ for (i = 0; w100_pci_ids[i].name != NULL; i++) { -+ if (w100_pci_ids[i].device == card->attr.deviceID) { -+ w100c->pci_id = &w100_pci_ids[i]; ++ while (model->name) { ++ if (model->device == card->attr.deviceID) { ++ w100c->card_id = model; + break; + } ++ model++; + } -+ ErrorF("Using ATI card: %s\n", w100c->pci_id->name); -+ -+ ext_mem = MMIO_IN32(mmMC_EXT_MEM_LOCATION); -+ int_mem = MMIO_IN32(mmMC_FB_LOCATION); -+ -+ w100c->memareas[0].priority = KD_VIDMEM_MAXPRIO; -+ w100c->memareas[0].start = (CARD8 *) ((int_mem & 0xffff) << 8); -+ w100c->memareas[0].size = -+ (((int_mem >> 16) & 0xffff) - (int_mem & 0xffff)) << 8; + ++ ErrorF("(I) Using ATI card: %s\n", w100c->card_id->name); + -+ w100c->memareas[1].priority = KD_VIDMEM_MINPRIO; -+ w100c->memareas[1].start = (CARD8 *)((ext_mem & 0xffff) << 8); -+ w100c->memareas[1].size = -+ (((ext_mem >> 16) & 0xffff) - (ext_mem & 0xffff)) << 8; ++ if (!initialized) { ++ initialized = TRUE; ++ W100Startup(w100c); ++ } + -+ /* Get some register values */ -+ w100c->regs.ENG_CNTL = MMIO_IN32(mmENG_CNTL); -+ w100c->regs.VIDEO_CTRL = MMIO_IN32(mmVIDEO_CTRL); -+ w100c->regs.GRAPHIC_H_DISP = MMIO_IN32(mmGRAPHIC_H_DISP); -+ w100c->regs.GRAPHIC_V_DISP = MMIO_IN32(mmGRAPHIC_V_DISP); ++ w100c->hw_window.mode = W100GetModeSpec(w100c, &w100StartupInfo.mode); ++ w100c->hw_window.randr = w100StartupInfo.randr; + -+ DBG_IMAGEON(("Internal memory at 0x%08x(0x%08x), size %d bytes\n" -+ "External memory at 0x%08x(0x%08x), size %d bytes\n", -+ w100c->memareas[0].start, -+ W100_CARD2HOST(w100c->memareas[0].start), -+ w100c->memareas[0].size, -+ w100c->memareas[1].start, -+ W100_CARD2HOST(w100c->memareas[1].start), -+ w100c->memareas[1].size)); -+ -+ /* TODO: Change this to honour the framebuffer initial orientation? */ -+ w100c->defaultRandR = RR_Rotate_90; -+ w100c->hwScreen.randr = w100c->defaultRandR; ++ tslib_transform_closure = w100c; ++ tslib_transform_coords = W100TransformTsLibCoordinates; + return TRUE; +} + @@ -271,45 +350,63 @@ +{ + W100CardInfo *w100c = (W100CardInfo *) card->driver; + ++ DBG_IMAGEON(("--W100CardFini\n")); + W100Unmap(card, w100c); + fbdevCardFini(card); +} + +static void -+W100MemSetup(KdScreenInfo *screen) ++W100Setup(KdScreenInfo *screen) +{ + W100CardInfo(screen); + W100MemArea *mem; ++ KdMouseMatrix m; + int fb_size, i; + ++ DBG_IMAGEON(("--W100Setup\n")); ++ ++ /* Adjust mode */ ++ w100c->hw_window.width = screen->width; ++ w100c->hw_window.height = screen->height; ++ w100c->hw_window.bpp = screen->fb[0].bitsPerPixel; ++ W100SetupGraphicWindow(w100c); ++ ++ /* Get some register values */ ++ w100c->regs.ENG_CNTL = MMIO_IN32(mmENG_CNTL); ++ w100c->regs.VIDEO_CTRL = MMIO_IN32(mmVIDEO_CTRL); ++ w100c->regs.GRAPHIC_H_DISP = MMIO_IN32(mmGRAPHIC_H_DISP); ++ w100c->regs.GRAPHIC_V_DISP = MMIO_IN32(mmGRAPHIC_V_DISP); ++ w100c->regs.DISP_DEBUG2 = MMIO_IN32(mmDISP_DEBUG2); ++ ++ W100MemSetup(w100c); ++ + /* Clear the VideoMemAreas set up by the framebuffer initialization */ + for (i = 0; i < screen->num_videomem_areas; i++) { + xfree(screen->videomem_areas[i]); + } + xfree(screen->videomem_areas); + -+ screen->videomem_areas = xcalloc(sizeof(KdVideoMemArea *), -+ W100_MEMAREAS); -+ screen->num_videomem_areas = W100_MEMAREAS; ++ screen->videomem_areas = xcalloc(sizeof(KdVideoMemArea *), ++ w100c->num_memareas); ++ screen->num_videomem_areas = w100c->num_memareas; + ++ screen->fb[0].byteStride = screen->width * screen->fb[0].bitsPerPixel / 8; + fb_size = screen->fb[0].byteStride * screen->height; -+ DBG_IMAGEON(("Framebuffer required size: %d bytes\n", fb_size)); -+ /* Try to place the framebuffer in the best VideoMemArea */ -+ for (i = 0; i < W100_MEMAREAS; i++) { -+ mem = &w100c->memareas[i]; ++ ++ DBG_IMAGEON(("(I) Framebuffer required size: %d bytes\n", fb_size)); ++ ++ for (i = 0; i < w100c->num_memareas; i++) { ++ mem = w100c->memareas[i]; + screen->videomem_areas[i] = xcalloc(sizeof(KdVideoMemArea), 1); -+ if (fb_size <= mem->size) { -+ DBG_IMAGEON(("Setting FrameBuffer to w100 address 0x%08x\n", -+ mem->start)); -+ screen->fb[0].frameBuffer = W100_CARD2HOST(mem->start); -+ screen->videomem_areas[i]->priority = mem->priority; -+ screen->videomem_areas[i]->base = W100_CARD2HOST(mem->start); -+ screen->videomem_areas[i]->size = mem->size; ++ screen->videomem_areas[i]->priority = mem->priority; ++ screen->videomem_areas[i]->base = W100_CARD2HOST(mem->start); ++ screen->videomem_areas[i]->size = mem->size; ++ if (w100c->hw_window.mode->fbpool == i) { ++ DBG_IMAGEON(("(I) FrameBuffer in w100 memzone 0x%08x(0x%08x)\n", ++ W100_CARD2HOST(mem->start), mem->start)); + screen->videomem_areas[i]->available_offset = fb_size; ++ screen->fb[0].frameBuffer = W100_CARD2HOST(mem->start); + } else { -+ screen->videomem_areas[i]->priority = mem->priority; -+ screen->videomem_areas[i]->base = W100_CARD2HOST(mem->start); -+ screen->videomem_areas[i]->size = mem->size; + screen->videomem_areas[i]->available_offset = 0; + } + DBG_IMAGEON(("New videomem_area(priority:%d, start:0x%08x, size:%d, available_offset:%d\n", @@ -319,24 +416,29 @@ + screen->videomem_areas[i]->available_offset)); + } + -+ w100c->hwScreen.x = 0; -+ w100c->hwScreen.y = 0; -+ w100c->hwScreen.width = screen->width; -+ w100c->hwScreen.height = screen->height; -+ w100c->hwScreen.bpp = screen->fb[0].bitsPerPixel; -+ w100c->hwScreen.offset = W100_HOST2CARD(screen->fb[0].frameBuffer); + ++ w100c->hw_window.offset = W100_HOST2CARD(screen->fb[0].frameBuffer); ++ ++ ++ W100ComputeMouseMatrix(&m, screen->randr, ++ w100StartupInfo.portrait ? ++ W100_MIN(screen->width, screen->height) : ++ W100_MAX(screen->width, screen->height), ++ w100StartupInfo.portrait ? ++ W100_MAX(screen->width, screen->height) : ++ W100_MIN(screen->width, screen->height)); ++ ++ KdSetMouseMatrix(&m); + -+ DBG_IMAGEON(("HWScreen(x:%d,y:%d,width:%d,height:%d,bpp:%d,offset:0x%08x" ++ DBG_IMAGEON(("Window(width:%d,height:%d,bpp:%d,offset:0x%08x" + "(0x%08x), randr:%d)\n", -+ w100c->hwScreen.x, -+ w100c->hwScreen.y, -+ w100c->hwScreen.width, -+ w100c->hwScreen.height, -+ w100c->hwScreen.bpp, -+ w100c->hwScreen.offset, ++ w100c->hw_window.width, ++ w100c->hw_window.height, ++ w100c->hw_window.bpp, ++ w100c->hw_window.offset, + screen->fb[0].frameBuffer, -+ w100c->hwScreen.randr)); ++ w100c->hw_window.randr)); ++ +} + +static Bool @@ -346,6 +448,7 @@ + W100CardInfo(screen); + Bool success = FALSE; + ++ DBG_IMAGEON(("--W100ScreenInit\n")); + w100s = xcalloc(sizeof(W100ScreenInfo), 1); + if (w100s == NULL) + return FALSE; @@ -354,10 +457,6 @@ + w100s->screen = screen; + screen->driver = w100s; + -+ if (screen->fb[0].depth == 0) { -+ screen->fb[0].depth = 16; -+ } -+ + success = fbdevScreenInitialize(screen, &w100s->fbdev); + + if (!success) { @@ -366,7 +465,7 @@ + return FALSE; + } + -+ W100MemSetup(screen); ++ W100Setup(screen); + + return TRUE; +} @@ -375,8 +474,7 @@ +W100ScreenFini(KdScreenInfo * screen) +{ + W100ScreenInfo *w100s = (W100ScreenInfo *) screen->driver; -+ W100CardInfo *w100c = screen->card->driver; -+ ++ DBG_IMAGEON(("--W100ScreenFini\n")); + fbdevScreenFini(screen); + xfree(w100s); + screen->driver = 0; @@ -388,7 +486,10 @@ + KdScreenPriv(pScreen); + W100CardInfo(pScreenPriv); + -+ W100InitVideo(pScreen); ++ DBG_IMAGEON(("--W100InitScreen\n")); ++ if (w100c->card_id->caps & W100XVSupport) { ++ W100InitVideo(pScreen); ++ } + return fbdevInitScreen(pScreen); +} + @@ -403,35 +504,42 @@ + KdScreenInfo *screen = pScreenPriv->screen; + W100CardInfo(pScreenPriv); + Bool screenEnabled = pScreenPriv->enabled; -+ KdMouseMatrix m; + -+ DBG_IMAGEON(("W100RandRSetConfig(randr:%d,pSize:%dx%d)\n", ++ DBG_IMAGEON(("--W100RandRSetConfig(randr:%d,pSize:%dx%d)\n", + randr, pSize->width, pSize->height)); + -+ + if (screenEnabled) { + KdDisableScreen(pScreen); + } -+ KdOffscreenSwapOut(screen->pScreen); + + if (randr & (RR_Rotate_0|RR_Rotate_180)) { -+ pScreen->width = w100c->fbdev.var.xres; -+ pScreen->height = w100c->fbdev.var.yres; + pScreen->mmWidth = screen->width_mm; + pScreen->mmHeight = screen->height_mm; ++ pScreen->width = pSize->width; ++ pScreen->height = pSize->height; + } else { -+ pScreen->width = w100c->fbdev.var.yres; -+ pScreen->height = w100c->fbdev.var.xres; + pScreen->mmWidth = screen->height_mm; + pScreen->mmHeight = screen->width_mm; ++ pScreen->width = pSize->height; ++ pScreen->height = pSize->width; + } + -+ KdComputeMouseMatrix(&m, randr, screen->width, screen->height); -+ KdSetMouseMatrix(&m); -+ ++ screen->randr = randr; + screen->width = pScreen->width; + screen->height = pScreen->height; -+ screen->fb[0].byteStride = screen->width * screen->fb[0].bitsPerPixel / 8; ++ w100c->hw_window.randr = KdAddRotation(randr, w100StartupInfo.randr); ++ w100c->hw_window.mode = W100GetBestMode(w100c, pScreen->width, pScreen->height); ++ ++ KdOffscreenSwapOut(screen->pScreen); ++ ++ W100Setup(screen); ++ ++ DBG_IMAGEON(("ModifyPixMapHeader(width:%d,height:%d,depth:%d,bpp:%d,bs:%d,fb:0x%08x)\n", pScreen->width, pScreen->height, ++ screen->fb[0].depth, ++ screen->fb[0].bitsPerPixel, ++ screen->fb[0].byteStride, ++ screen->fb[0].frameBuffer)); ++ + + (*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap(pScreen), + pScreen->width, @@ -442,77 +550,38 @@ + screen->fb[0].frameBuffer); + + -+ w100c->hwScreen.randr &= ~RR_Rotate_All; -+ switch (randr & RR_Rotate_All) { -+ case RR_Rotate_0: -+ switch (w100c->defaultRandR) { -+ case RR_Rotate_0: -+ w100c->hwScreen.randr |= RR_Rotate_0; -+ break; -+ case RR_Rotate_90: -+ w100c->hwScreen.randr |= RR_Rotate_90; -+ break; -+ case RR_Rotate_180: -+ w100c->hwScreen.randr |= RR_Rotate_180; -+ break; -+ case RR_Rotate_270: -+ w100c->hwScreen.randr |= RR_Rotate_270; -+ break; -+ } -+ break; -+ case RR_Rotate_90: -+ switch (w100c->defaultRandR) { -+ case RR_Rotate_0: -+ w100c->hwScreen.randr |= RR_Rotate_90; -+ break; -+ case RR_Rotate_90: -+ w100c->hwScreen.randr |= RR_Rotate_0; -+ break; -+ case RR_Rotate_180: -+ w100c->hwScreen.randr |= RR_Rotate_270; -+ break; -+ case RR_Rotate_270: -+ w100c->hwScreen.randr |= RR_Rotate_180; -+ break; -+ } -+ break; -+ case RR_Rotate_180: -+ switch (w100c->defaultRandR) { -+ case RR_Rotate_0: -+ w100c->hwScreen.randr |= RR_Rotate_180; -+ break; -+ case RR_Rotate_90: -+ w100c->hwScreen.randr |= RR_Rotate_270; -+ break; -+ case RR_Rotate_180: -+ w100c->hwScreen.randr |= RR_Rotate_0; -+ break; -+ case RR_Rotate_270: -+ w100c->hwScreen.randr |= RR_Rotate_90; -+ break; -+ } -+ break; -+ case RR_Rotate_270: -+ switch (w100c->defaultRandR) { -+ case RR_Rotate_0: -+ w100c->hwScreen.randr |= RR_Rotate_270; -+ break; -+ case RR_Rotate_90: -+ w100c->hwScreen.randr |= RR_Rotate_180; -+ break; -+ case RR_Rotate_180: -+ w100c->hwScreen.randr |= RR_Rotate_90; -+ break; -+ case RR_Rotate_270: -+ w100c->hwScreen.randr |= RR_Rotate_0; -+ break; -+ } -+ break; -+ } -+ + if (screenEnabled) { + KdEnableScreen(pScreen); + } ++ return TRUE; ++} ++ ++static Bool W100RandRGetInfo(ScreenPtr pScreen, Rotation *rotations) ++{ ++ KdScreenPriv(pScreen); ++ KdScreenInfo *screen = pScreenPriv->screen; ++ W100CardInfo(pScreenPriv); ++ RRScreenSizePtr pSize; ++ Rotation randr; ++ W100ModeSpec *modes; ++ int i; ++ ++ DBG_IMAGEON(("--W100RandRGetInfo\n")); ++ ++ *rotations = RR_Rotate_All; ++ ++ for (modes = w100_modes; modes->width; modes++) { ++ if (modes->supported) { ++ pSize = RRRegisterSize(pScreen, ++ modes->width, ++ modes->height, ++ screen->width_mm, ++ screen->height_mm); ++ if (modes == w100c->hw_window.mode) { ++ RRSetCurrentConfig(pScreen, screen->randr, 0, pSize); ++ } ++ } ++ } + + return TRUE; +} @@ -520,8 +589,9 @@ +static Bool W100RandRInit(ScreenPtr pScreen) +{ + rrScrPrivPtr pScrPriv = rrGetScrPriv(pScreen); -+ ++ DBG_IMAGEON(("--W100RandRInit\n")); + pScrPriv->rrSetConfig = W100RandRSetConfig; ++ pScrPriv->rrGetInfo = W100RandRGetInfo; + return TRUE; +} + @@ -532,7 +602,7 @@ +{ + KdScreenPriv(pScreen); + W100CardInfo(pScreenPriv); -+ ++ DBG_IMAGEON(("--W100FinishInitScreen\n")); + if (!fbdevFinishInitScreen(pScreen)) + return FALSE; + @@ -556,6 +626,7 @@ +W100Preserve(KdCardInfo * card) +{ + W100CardInfo *w100c = card->driver; ++ DBG_IMAGEON(("--W100Preserve\n")); + + fbdevPreserve(card); +} @@ -564,6 +635,7 @@ +W100Restore(KdCardInfo * card) +{ + W100CardInfo *w100c = card->driver; ++ DBG_IMAGEON(("--W100Restore\n")); + fbdevRestore(card); +} + @@ -572,7 +644,7 @@ +{ + KdScreenPriv(pScreen); + W100CardInfo(pScreenPriv); -+ ++ DBG_IMAGEON(("--W100DPMS\n")); + return fbdevDPMS(pScreen, mode); +} + @@ -582,17 +654,28 @@ + KdScreenPriv(pScreen); + W100CardInfo(pScreenPriv); + -+ DBG_IMAGEON(("W100Enable\n")); ++ DBG_IMAGEON(("--W100Enable\n")); + ++ /* + if (!fbdevEnable(pScreen)) + return FALSE; ++ */ + + if (w100c->mem_base == NULL) { + if (!W100Map(pScreenPriv->screen->card, w100c)) { + return FALSE; + } -+ W100MemSetup(pScreenPriv->screen); ++ W100Setup(pScreenPriv->screen); + } ++ W100SetupGraphicEngine(w100c); ++ ++ graphic_offset_u go; ++ go.val = MMIO_IN32(mmGRAPHIC_OFFSET); ++ DBG_IMAGEON(("Graphic offset is 0x%08x(0x%08x)\n", ++ go.f.graphic_offset, ++ W100_CARD2HOST(go.f.graphic_offset))); ++ ++ + return TRUE; +} + @@ -601,8 +684,8 @@ +{ + KdScreenPriv(pScreen); + W100CardInfo(pScreenPriv); -+ DBG_IMAGEON(("W100Disable\n")); -+ W100Unmap(pScreenPriv->card, w100c); ++ DBG_IMAGEON(("--W100Disable\n")); ++ //W100Unmap(pScreenPriv->card, w100c); + + fbdevDisable(pScreen); +} @@ -654,7 +737,7 @@ + W100PutColors, /* putColors */ +}; --- /dev/null -+++ xorg-server-X11R7.1-1.1.0.orig/hw/kdrive/imageon/imageon_const.h ++++ xorg-server-X11R7.1-1.1.0.work/hw/kdrive/imageon/imageon_const.h @@ -0,0 +1,161 @@ +/* + * Copyright © 2007 Manuel Teira @@ -818,8 +901,8 @@ + +#endif --- /dev/null -+++ xorg-server-X11R7.1-1.1.0.orig/hw/kdrive/imageon/imageon_cursor.c -@@ -0,0 +1,571 @@ ++++ xorg-server-X11R7.1-1.1.0.work/hw/kdrive/imageon/imageon_cursor.c +@@ -0,0 +1,563 @@ +/* + * Copyright © 2007 Manuel Teira + * @@ -949,7 +1032,7 @@ + x1 = 0; + y1 = 0; + for (y2 = W100_CURSOR_HEIGHT - 1; y2 >= 0; --y2) { -+ for (x2 = W100_CURSOR_WIDTH - 1; x2 >= 0; --x2) { ++ for (x2 = 0; x2 < W100_CURSOR_WIDTH; x2++) { + SetPixelVal(dst, x2, y2, PixelVal(src, x1, y1)); + ++x1; + if (x1 >= W100_CURSOR_WIDTH) { @@ -963,7 +1046,7 @@ + x1 = 0; + y1 = 0; + for (x2 = 0; x2 < W100_CURSOR_WIDTH; x2++) { -+ for (y2 = W100_CURSOR_HEIGHT - 1; y2 >= 0; --y2) { ++ for (y2 = 0; y2 < W100_CURSOR_HEIGHT; y2++) { + SetPixelVal(dst, x2, y2, PixelVal(src, x1, y1)); + ++x1; + if (x1 >= W100_CURSOR_WIDTH) { @@ -1030,9 +1113,6 @@ + int line, i; + int h, w; + -+ DBG_IMAGEON(("W100LoadCursor(xhot:%d,yhot:%d,width:%d,height:%d)\n", -+ bits->xhot, bits->yhot, -+ bits->width, bits->height)); + + pCurPriv->pCursor = pCursor; + pCurPriv->xhot = bits->xhot; @@ -1073,13 +1153,18 @@ + } + + /* Rotate the pixmap to get the correct orientation */ -+ W100RotateCursor(w100c->hwScreen.randr, ++ W100RotateCursor(w100c->hw_window.randr, + (CARD32*) tmpCursor0, + (CARD32*) tmpCursor1); + + /* Correct endianness */ + src = (CARD32*) tmpCursor1; + dst = (CARD32*) (pCurPriv->area->vidmem->base + pCurPriv->area->offset); ++ DBG_IMAGEON(("W100LoadCursor(xhot:%d,yhot:%d,width:%d,height:%d) dst(0x%08x)\n", ++ bits->xhot, bits->yhot, ++ bits->width, bits->height, ++ dst)); ++ + for (line = 0; line < h; line++) { + for (i = 0; i < lwsrc; i++) { + dst[i] = BigEndian(src[i]); @@ -1087,6 +1172,7 @@ + src += lwsrc; + dst += lwsrc; + } ++ + W100SetCursorColors(pScreen); +} + @@ -1117,13 +1203,14 @@ + W100CardInfo(pScreenPriv); + W100ScreenInfo(pScreenPriv); + W100Cursor *pCurPriv = &w100s->cursor; -+ CARD16 xoffs, yoffs; ++ int xoffs, yoffs; + cursor_offset_u cursor_offset; + cursor_h_pos_u hpos; + cursor_v_pos_u vpos; + graphic_h_disp_u graphic_hdisp; + graphic_v_disp_u graphic_vdisp; -+ int tx, ty; ++ int tx, ty, tw, th; ++ + + if (!pCurPriv->has_cursor) { + return; @@ -1132,60 +1219,42 @@ + return; + } + -+ DBG_IMAGEON(("W100MoveCursor(x:%d,y:%d)\n", x, y)); -+ + graphic_hdisp.val = w100c->regs.GRAPHIC_H_DISP; + graphic_vdisp.val = w100c->regs.GRAPHIC_V_DISP; -+ + xoffs = 0; + yoffs = 0; -+ + x -= pCurPriv->xhot; -+ if (x < 0) { -+ switch(w100c->hwScreen.randr & RR_Rotate_All) { -+ case RR_Rotate_0: -+ case RR_Rotate_180: -+ xoffs = -x; -+ break; -+ case RR_Rotate_90: -+ case RR_Rotate_270: -+ yoffs = -y; -+ break; -+ } -+ x = 0; -+ } + y -= pCurPriv->yhot; -+ if (y < 0) { -+ switch(w100c->hwScreen.randr & RR_Rotate_All) { -+ case RR_Rotate_0: -+ case RR_Rotate_180: -+ yoffs = -y; -+ break; -+ case RR_Rotate_90: -+ case RR_Rotate_270: -+ xoffs = -y; -+ break; -+ } -+ y = 0; -+ } -+ + tx = W100MapToHWX(w100c, x, y, pCurPriv->width, pCurPriv->height); + ty = W100MapToHWY(w100c, x, y, pCurPriv->width, pCurPriv->height); ++ tw = W100MapToHWW(w100c, x, y, pCurPriv->width, pCurPriv->height); ++ th = W100MapToHWH(w100c, x, y, pCurPriv->width, pCurPriv->height); + -+ DBG_IMAGEON(("W100MoveCursor dst(x:%d,y:%d)," -+ "mapped(x:%d,y:%d,xoffs:%d,yoffs:%d\n", -+ x, y, tx, ty, xoffs, yoffs)); ++ if (tx < 0) { ++ xoffs = -tx; ++ tw -= xoffs; ++ tx = 0; ++ } + ++ if (ty < 0) { ++ yoffs = -ty; ++ th -= yoffs; ++ ty = 0; ++ } ++ ++ hpos.f.cur_h_start = graphic_hdisp.f.graphic_h_start + tx; ++ hpos.f.cur_h_end = hpos.f.cur_h_start + tw; ++ hpos.f.cur_en = 1; ++ vpos.f.cur_v_start = graphic_vdisp.f.graphic_v_start + ty; ++ vpos.f.cur_v_end = vpos.f.cur_v_start + th; + cursor_offset.f.cur_x_offset = xoffs; + cursor_offset.f.cur_y_offset = yoffs; + cursor_offset.f.cur_offset = (CARD32) + W100_HOST2CARD(pCurPriv->area->vidmem->base + + pCurPriv->area->offset); -+ hpos.f.cur_en = 1; -+ hpos.f.cur_h_start = graphic_hdisp.f.graphic_h_start + tx; -+ hpos.f.cur_h_end = hpos.f.cur_h_start + pCurPriv->width; -+ vpos.f.cur_v_start = graphic_vdisp.f.graphic_v_start + ty; -+ vpos.f.cur_v_end = vpos.f.cur_v_start + pCurPriv->height; ++ DBG_IMAGEON(("W100MoveCursor dst(x:%d,y:%d)," ++ "mapped(x:%d,y:%d,xoffs:%d,yoffs:%d)\n", ++ x, y, tx, ty, xoffs, yoffs)); + + W100DisableDisplayUpdate(w100c); + MMIO_OUT32(mmCURSOR1_OFFSET, cursor_offset.val); @@ -1199,7 +1268,6 @@ + +} + -+ +static Bool +W100RealizeCursor(ScreenPtr pScreen, CursorPtr pCursor) +{ @@ -1320,6 +1388,11 @@ + } + if (pCurPriv->area == NULL) { + FatalError("Couldn't allocate offscreen memory for cursor.\n"); ++ } else { ++ DBG_IMAGEON(("Cursor memory at 0x%08x(0x%08x)\n", ++ pCurPriv->area->vidmem->base + pCurPriv->area->offset, ++ W100_HOST2CARD(pCurPriv->area->vidmem->base ++ + pCurPriv->area->offset))); + } + if (pCurPriv->pCursor) { + int x, y; @@ -1348,6 +1421,8 @@ + if (pCurPriv->pCursor) { + W100UnloadCursor(pScreen); + } ++ ++ pCurPriv->area = NULL; +} + +Bool @@ -1392,8 +1467,8 @@ + pCurPriv->pCursor = NULL; +} --- /dev/null -+++ xorg-server-X11R7.1-1.1.0.orig/hw/kdrive/imageon/imageon_draw.c -@@ -0,0 +1,241 @@ ++++ xorg-server-X11R7.1-1.1.0.work/hw/kdrive/imageon/imageon_draw.c +@@ -0,0 +1,237 @@ +/* + * Copyright © 2007 Manuel Teira + * @@ -1574,7 +1649,7 @@ + W100ScreenInfo(pScreenPriv); + + -+ DBG_IMAGEON(("W100InitAccel: %d/%d depth/bpp\n", ++ DBG_IMAGEON(("--W100InitAccel: %d/%d depth/bpp\n", + pScreenPriv->screen->fb[0].depth, + pScreenPriv->screen->fb[0].bitsPerPixel)); + @@ -1588,7 +1663,7 @@ + w100s->kaa.DoneCopy = W100DoneCopy; + + w100s->kaa.flags |= KAA_OFFSCREEN_PIXMAPS; -+ /* Offset alignment, not sure if this is enough */ ++ /* Offset alignment, not sure if this is enought */ + w100s->kaa.offsetAlign = 0; + w100s->kaa.pitchAlign = 16; + @@ -1606,7 +1681,7 @@ + W100ScreenInfo(pScreenPriv); + W100CardInfo(pScreenPriv); + -+ DBG_IMAGEON(("W100EnableAccel\n")); ++ DBG_IMAGEON(("--W100EnableAccel\n")); + + w100s->kaa.PrepareBlend = NULL; + w100s->kaa.Blend = NULL; @@ -1617,27 +1692,23 @@ + w100s->kaa.DoneComposite = NULL; + w100s->kaa.UploadToScreen = NULL; + w100s->kaa.UploadToScratch = NULL; -+ -+ W100SetupGraphicEngine(w100c); -+ W100SetupGraphicWindow(w100c); -+ + kaaMarkSync(pScreen); +} + +void +W100DisableAccel(ScreenPtr pScreen) +{ -+ DBG_IMAGEON(("W100DisableAccel\n")); ++ DBG_IMAGEON(("--W100DisableAccel\n")); +} + +void +W100FiniAccel(ScreenPtr pScreen) +{ -+ DBG_IMAGEON(("W100FiniAccel\n")); ++ DBG_IMAGEON(("--W100FiniAccel\n")); +} --- /dev/null -+++ xorg-server-X11R7.1-1.1.0.orig/hw/kdrive/imageon/imageon.h -@@ -0,0 +1,229 @@ ++++ xorg-server-X11R7.1-1.1.0.work/hw/kdrive/imageon/imageon.h +@@ -0,0 +1,261 @@ +/* + * Copyright © 2007 Manuel Teira + * @@ -1689,6 +1760,10 @@ +#define W100_CARD2HOST(x) (w100c->mem_base + (CARD32)(x)) +#define W100_HOST2CARD(x) ((x) - (CARD32)(w100c->mem_base)) +#define W100_MEMAREAS (2) ++#define W100_INTMEM (0) ++#define W100_EXTMEM (1) ++ ++#define W100_SYSFS_BASE "/sys/bus/platform/devices/w100fb/" + +#define MMIO_OUT32(a, v) (*(VOL32 *)((w100c->reg_base) + (a)) = (v)) +#define MMIO_IN32(a) (*(VOL32 *)((w100c->reg_base) + (a))) @@ -1696,6 +1771,8 @@ +#define W100_MAX(x, y) ((x) > (y) ? x : y) +#define W100_MIN(x, y) ((x) < (y) ? x : y) + ++#define W100_ALIGN(q, a) ((q + a - 1) & ~(a - 1)) ++ +#define TIMEOUT_LOCALS struct timeval _target, _curtime; + +static inline Bool @@ -1722,12 +1799,31 @@ +typedef volatile CARD16 VOL16; +typedef volatile CARD32 VOL32; + -+struct pci_id_entry { ++typedef struct _W100CardEntry { + CARD16 vendor; + CARD16 device; + CARD8 caps; + char *name; -+}; ++} W100CardEntry; ++ ++ ++typedef enum _W100Caps { ++ W100XVSupport = 1 ++} W100Caps; |
