[oe-commits] org.oe.dev xserver-kdrive-imageon: add (another) w100 based xserver, closes #1752

manuel.teira commit openembedded-commits at lists.openembedded.org
Fri Jan 5 20:19:05 UTC 2007


xserver-kdrive-imageon: add (another) w100 based xserver, closes #1752

Author: manuel.teira at telefonica.net
Branch: org.openembedded.dev
Revision: 4bb665b48000f22ac064febc79e5831fc6456ca2
ViewMTN: http://monotone.openembedded.org/revision.psp?id=4bb665b48000f22ac064febc79e5831fc6456ca2
Files:
1
packages/xorg-xserver/xserver-kdrive/kdrive-imageon.patch
packages/xorg-xserver/xserver-kdrive/kdrive-vidmemarea.patch
packages/xorg-xserver/xserver-kdrive-imageon_X11R7.1-1.1.0.bb
Diffs:

#
# mt diff -rcaaf27827c768f1855eb33459546f2fec5fe4dce -r4bb665b48000f22ac064febc79e5831fc6456ca2
#
# 
# 
# add_file "packages/xorg-xserver/xserver-kdrive/kdrive-imageon.patch"
#  content [c658c6303d6aa12d36ac8d9a3eaa7af52377f390]
# 
# add_file "packages/xorg-xserver/xserver-kdrive/kdrive-vidmemarea.patch"
#  content [5c3466ed287eb3247cd8053685133434dc65a5a3]
# 
# add_file "packages/xorg-xserver/xserver-kdrive-imageon_X11R7.1-1.1.0.bb"
#  content [7d115b4144ec42bcdd096174385d6b0ab4db2a39]
# 
============================================================
--- packages/xorg-xserver/xserver-kdrive/kdrive-imageon.patch	c658c6303d6aa12d36ac8d9a3eaa7af52377f390
+++ packages/xorg-xserver/xserver-kdrive/kdrive-imageon.patch	c658c6303d6aa12d36ac8d9a3eaa7af52377f390
@@ -0,0 +1,8574 @@
+
+#
+# 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
+@@ -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])
+ AC_ARG_ENABLE(xsdl,           AS_HELP_STRING([--enable-xsdl], [Build the kdrive Xsdl server (default: auto)]), [XSDL=$enableval], [XSDL=auto])
++AC_ARG_ENABLE(imageon,        AS_HELP_STRING([--enable-imageon], [Build the kdrive Ximageon server (default: no)]), [KDRIVEIMAGEON=$enableval], [KDRIVEIMAGEON=no])
+ dnl xprint
+ AC_ARG_ENABLE(freetype,       AS_HELP_STRING([ --enable-freetype], [Build Xprint FreeType backend (default: yes)]), [XP_USE_FREETYPE=$enableval],[XP_USE_FREETYPE=no])
+ AC_ARG_WITH(freetype-config,  AS_HELP_STRING([ --with-freetype-config=PROG], [Use FreeType configuration program PROG (default: auto)]), freetype_config=$withval, freetype_config=auto)
+@@ -1509,6 +1510,11 @@
+ AC_SUBST([XSDL_INCS])
+ 
+ 
++AM_CONDITIONAL(KDRIVEIMAGEON, [test "x$KDRIVEIMAGEON" = xyes])
++if test "x$KDRIVEIMAGEON" = xyes; then
++        AC_DEFINE(KDRIVEIMAGEON, 1, [Build Ximageon server])
++fi
++
+ dnl these only go in xkb-config.h (which is shared by the Xorg and Xnest servers)
+ AC_DEFINE(__XKBDEFRULES__, "xorg", [Default XKB rules])
+ AC_DEFINE_DIR(XKB_BASE_DIRECTORY, XKBPATH, [Path to XKB data])
+@@ -1750,6 +1756,7 @@
+ hw/kdrive/epson/Makefile
+ hw/kdrive/fake/Makefile
+ hw/kdrive/fbdev/Makefile
++hw/kdrive/imageon/Makefile
+ 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
+@@ -1,18 +1,9 @@
+-if KDRIVEVESA
+-VESA_SUBDIRS = vesa ati chips epson i810 mach64 mga neomagic nvidia pm2 r128 \
+-               smi via
+-endif
+-
+ if KDRIVEFBDEV
+ FBDEV_SUBDIRS = fbdev
+ endif
+ 
+-if XSDLSERVER
+-XSDL_SUBDIRS = sdl
+-endif
+-
+-if XEPHYR
+-XEPHYR_SUBDIRS = ephyr
++if KDRIVEIMAGEON
++IMAGEON_SUBDIRS = imageon
+ endif
+ 
+ SUBDIRS =			\
+@@ -20,9 +11,9 @@
+ 	linux			\
+ 	$(XSDL_SUBDIRS)		\
+ 	$(FBDEV_SUBDIRS)	\
++	$(IMAGEON_SUBDIRS)	\
+ 	$(VESA_SUBDIRS)		\
+-	$(XEPHYR_SUBDIRS)       \
+-	fake
++	$(XEPHYR_SUBDIRS) 
+ 
+ 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
+@@ -0,0 +1,47 @@
++if KDRIVEFBDEV
++FBDEV_INCLUDES =-I$(top_srcdir)/hw/kdrive/fbdev
++FBDEV_LIBS = $(top_builddir)/hw/kdrive/fbdev/libfbdev.a
++endif
++
++INCLUDES = 					\
++	@KDRIVE_INCS@				\
++	$(FBDEV_INCLUDES)			\
++	@KDRIVE_CFLAGS@
++
++bin_PROGRAMS = Ximageon
++
++if TSLIB
++TSLIB_FLAG = -lts
++endif
++
++noinst_LIBRARIES = libimageon.a
++
++libimageon_a_SOURCES = 	  \
++	imageon.h	  \
++	imageon_regs.h    \
++	imageon_const.h   \
++	imageon.c	  \
++	imageon_cursor.c  \
++	imageon_draw.c	  \
++	imageon_support.c \
++	imageon_video.c
++
++
++
++Ximageon_SOURCES = \
++	imageon_stub.c
++
++W100_LIBS =				\
++	libimageon.a 			\
++	$(FBDEV_LIBS)			\
++	@KDRIVE_LIBS@
++
++Ximageon_LDADD = \
++	$(W100_LIBS)			\
++	@XSERVER_LIBS@			\
++	$(TSLIB_FLAG)
++
++
++Ximageon_DEPENDENCIES =			\
++        libimageon.a                    \
++        $(FBDEV_LIBS) 
+--- /dev/null
++++ xorg-server-X11R7.1-1.1.0.orig/hw/kdrive/imageon/imageon.c
+@@ -0,0 +1,523 @@
++/*
++ * Copyright © 2007 Manuel Teira
++ *
++ * 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 Manuel Teira not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  Manuel Teira makes no
++ * representations about the suitability of this software for any purpose.  It
++ * is provided "as is" without express or implied warranty.
++ *
++ * MANUEL TEIRA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL MANUEL TEIRA 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 "imageon.h"
++#include "imageon_regs.h"
++
++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}
++};
++
++static Bool
++W100Map(KdCardInfo * card, W100CardInfo *w100c)
++{
++    w100c->mem_base = (CARD8 *) KdMapDevice(W100_MEM_BASE,
++                                            W100_MEM_SIZE);
++
++    if (w100c->mem_base == NULL) {
++        return FALSE;
++    }
++
++    w100c->reg_base = w100c->mem_base + W100_REG_OFFSET;
++
++    /* 
++     * It doesn't matter mapping all the area as registers.
++     * 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);
++
++    return TRUE;
++}
++
++static void
++W100Unmap(KdCardInfo * card, W100CardInfo *w100c)
++{
++    if (w100c->mem_base) {
++        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 Bool
++W100CardInit(KdCardInfo * card)
++{
++    W100CardInfo *w100c;
++    int i;
++    int ext_mem;
++    int int_mem;
++    Bool initialized = FALSE;
++
++    w100c = xcalloc(sizeof(W100CardInfo), 1);
++    if (w100c == NULL)
++        return FALSE;
++
++    if (!initialized && fbdevInitialize(card, &w100c->fbdev)) {
++        initialized = TRUE;
++    }
++
++    if (!initialized || !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];
++            break;
++        }
++    }
++    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;
++
++
++    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;
++
++    /* 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);
++
++    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;
++    return TRUE;
++}
++
++
++static void
++W100CardFini(KdCardInfo * card)
++{
++    W100CardInfo *w100c = (W100CardInfo *) card->driver;
++
++    W100Unmap(card, w100c);
++    fbdevCardFini(card);
++}
++
++static void
++W100MemSetup(KdScreenInfo *screen)
++{
++    W100CardInfo(screen);
++    W100MemArea *mem;
++    int fb_size, i;
++
++    /* 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;
++
++    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];
++        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]->available_offset = fb_size;
++        } 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",
++                     screen->videomem_areas[i]->priority,
++                     screen->videomem_areas[i]->base,
++                     screen->videomem_areas[i]->size,
++                     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);
++
++
++    DBG_IMAGEON(("HWScreen(x:%d,y:%d,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,
++                 screen->fb[0].frameBuffer,
++                 w100c->hwScreen.randr));
++}
++
++static Bool
++W100ScreenInit(KdScreenInfo * screen)
++{
++    W100ScreenInfo *w100s;
++    W100CardInfo(screen);
++    Bool success = FALSE;
++
++    w100s = xcalloc(sizeof(W100ScreenInfo), 1);
++    if (w100s == NULL)
++        return FALSE;
++
++    w100s->w100c = w100c;
++    w100s->screen = screen;
++    screen->driver = w100s;
++
++    if (screen->fb[0].depth == 0) {
++        screen->fb[0].depth = 16;
++    }
++
++    success = fbdevScreenInitialize(screen, &w100s->fbdev);
++
++    if (!success) {
++        screen->driver = NULL;
++        xfree(w100s);
++        return FALSE;
++    }
++
++    W100MemSetup(screen);
++
++    return TRUE;
++}
++
++static void
++W100ScreenFini(KdScreenInfo * screen)
++{
++    W100ScreenInfo *w100s = (W100ScreenInfo *) screen->driver;
++    W100CardInfo *w100c = screen->card->driver;
++
++    fbdevScreenFini(screen);
++    xfree(w100s);
++    screen->driver = 0;
++}
++
++static Bool
++W100InitScreen(ScreenPtr pScreen)
++{
++    KdScreenPriv(pScreen);
++    W100CardInfo(pScreenPriv);
++
++    W100InitVideo(pScreen);
++    return fbdevInitScreen(pScreen);
++}
++
++#ifdef RANDR
++
++static Bool W100RandRSetConfig(ScreenPtr pScreen,
++                               Rotation randr,
++                               int rate,
++                               RRScreenSizePtr pSize)
++{
++    KdScreenPriv(pScreen);
++    KdScreenInfo *screen = pScreenPriv->screen;
++    W100CardInfo(pScreenPriv);
++    Bool screenEnabled = pScreenPriv->enabled;
++    KdMouseMatrix m;
++
++    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;
++    } else {
++        pScreen->width    = w100c->fbdev.var.yres;
++	pScreen->height   = w100c->fbdev.var.xres;
++	pScreen->mmWidth  = screen->height_mm;
++	pScreen->mmHeight = screen->width_mm;
++    }
++
++    KdComputeMouseMatrix(&m, randr, screen->width, screen->height);
++    KdSetMouseMatrix(&m);
++
++    screen->width = pScreen->width;
++    screen->height = pScreen->height;
++    screen->fb[0].byteStride = screen->width * screen->fb[0].bitsPerPixel / 8;
++
++    (*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap(pScreen),
++                                    pScreen->width,
++                                    pScreen->height,
++                                    screen->fb[0].depth,
++                                    screen->fb[0].bitsPerPixel,
++                                    screen->fb[0].byteStride,
++                                    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->hwScree%s
>>> DIFF TRUNCATED @ 16K






More information about the Openembedded-commits mailing list