[oe-commits] org.oe.dev kdrive: update imageon patch, closes #1983

manuel.teira commit openembedded-commits at lists.openembedded.org
Mon Mar 12 20:25:51 UTC 2007


kdrive: update imageon patch, closes #1983

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

#
# mt diff -r3bc6872ce914467c560f817b262f8d528b2cf3ed -rcc36c0fcd3ef4d293e42c2d04104ccaeb774fc1f
#
# 
# 
# patch "packages/xorg-xserver/xserver-kdrive/kdrive-imageon.patch"
#  from [a329abe43cd073c23c1cc8ac921523089138a468]
#    to [881e5df2d39a5d0328a523adf964eb5b828632d6]
# 
# patch "packages/xorg-xserver/xserver-kdrive_X11R7.1-1.1.0.bb"
#  from [08f1cd89ec5cf72188999dcf7e52dac193271aaa]
#    to [cedb090e5ae9382d497e17b3691ca32e0291d371]
# 
============================================================
--- packages/xorg-xserver/xserver-kdrive/kdrive-imageon.patch	a329abe43cd073c23c1cc8ac921523089138a468
+++ packages/xorg-xserver/xserver-kdrive/kdrive-imageon.patch	881e5df2d39a5d0328a523adf964eb5b828632d6
@@ -1,4 +1,3 @@
-
 # Author: Manuel Teira <manuel.teira at 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"
 +
-+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}
++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}
 +};
 +
++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);
++    ErrorF("(I) Using ATI card: %s\n", w100c->card_id->name);
 +
-+    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;
++    if (!initialized) {
++        initialized = TRUE;
++        W100Startup(w100c);
++    }
 +
++    w100c->hw_window.mode  = W100GetModeSpec(w100c, &w100StartupInfo.mode);
++    w100c->hw_window.randr = w100StartupInfo.randr;
 +
-+    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;
++    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);
 +
-+    DBG_IMAGEON(("HWScreen(x:%d,y:%d,width:%d,height:%d,bpp:%d,offset:0x%08x"
++
++    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(("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 = xca%s
>>> DIFF TRUNCATED @ 16K






More information about the Openembedded-commits mailing list