Subject: Re: xsrc/20560 (was Re: X doesn't work on my 164LX)
To: David Hopper <dhop@nwlink.com>
From: None <naoki@fukaumi.org>
List: port-alpha
Date: 01/07/2004 01:48:23
Hi,

At Mon, 05 Jan 2004 20:46:07 -0800,
David Hopper wrote:
> I think this patch is much cleaner than the (now dysfunctional) patch from
> xsrc/20560.  I'm appending it to the bug report FWIW.

More simple patch (comment out "msb_set" again) is below.

But my patch is for CVS HEAD version of X source from XFree86.org. It
may not be usable until xsrc is updated to XF86 4.4.0.

# Should send-pr to XFree86.org ?

And I found a problem on my machine.

Exec XFree86 twice gets screen corrupt.

e.g.
  startx -> exit -> startx
    or
  startx -> switch console (Ctrl+Alt+Fn) -> switch back to X

  => X screen corrupted and lost control of video card (no screen update)
     + Under some condition(?), XFree86 eats cpu power around 100% ;)

No screen update, but keyboard still works. So I can do:

  Ctrl+Alt+Fn (screen still broken) -> exec shutdown -r now
    -> machine reboot and return normal state

My patch may not be enough to work correctly...

--
FUKAUMI Naoki

Index: alpha_video.c
===================================================================
RCS file: /home/fun/cvsroot/XFree86/xc/programs/Xserver/hw/xfree86/os-support/bsd/alpha_video.c,v
retrieving revision 1.6
diff -u -r1.6 alpha_video.c
--- alpha_video.c	30 Dec 2003 15:18:30 -0000	1.6
+++ alpha_video.c	6 Jan 2004 07:23:19 -0000
@@ -117,6 +117,8 @@
 #endif
 }
 #else /* __NetBSD__ */
+static unsigned long hae_thresh = (1UL << 24);
+static unsigned long hae_mask = 0xf8000000UL;
 static struct alpha_bus_window *abw;
 static int abw_count = -1;
 
@@ -558,22 +560,20 @@
 readSparse8(pointer Base, register unsigned long Offset)
 {
     register unsigned long result, shift;
-#ifndef __NetBSD__
     register unsigned long msb;
-#endif
     mem_barrier();
     Offset += (unsigned long)Base - (unsigned long)memBase;
     shift = (Offset & 0x3) << 3;
-#ifndef __NetBSD__
       if (Offset >= (hae_thresh)) {
         msb = Offset & hae_mask;
         Offset -= msb;
+#ifndef __NetBSD__
 	if (msb_set != msb) {
 	sethae(msb);
 	msb_set = msb;
 	}
-      }
 #endif
+      }
     result = *(vuip) ((unsigned long)memSBase + (Offset << 5));
     result >>= shift;
     return 0xffUL & result;
@@ -583,23 +583,21 @@
 readSparse16(pointer Base, register unsigned long Offset)
 {
     register unsigned long result, shift;
-#ifndef __NetBSD__
     register unsigned long msb;
-#endif
 
     mem_barrier();
     Offset += (unsigned long)Base - (unsigned long)memBase;
     shift = (Offset & 0x2) << 3;
-#ifndef __NetBSD__
     if (Offset >= (hae_thresh)) {
         msb = Offset & hae_mask;
         Offset -= msb;
+#ifndef __NetBSD__
       if (msb_set != msb) {
 	sethae(msb);
 	msb_set = msb;
       }
-    }
 #endif
+    }
     result = *(vuip)((unsigned long)memSBase+(Offset<<5)+(1<<(5-2)));
     result >>= shift;
     return 0xffffUL & result;
@@ -615,46 +613,42 @@
 static void
 writeSparse8(int Value, pointer Base, register unsigned long Offset)
 {
-#ifndef __NetBSD__
     register unsigned long msb;
-#endif
     register unsigned int b = Value & 0xffU;
 
     write_mem_barrier();
     Offset += (unsigned long)Base - (unsigned long)memBase;
-#ifndef __NetBSD__
     if (Offset >= (hae_thresh)) {
       msb = Offset & hae_mask;
       Offset -= msb;
+#ifndef __NetBSD__
       if (msb_set != msb) {
 	sethae(msb);
 	msb_set = msb;
       }
-    }
 #endif
+    }
     *(vuip) ((unsigned long)memSBase + (Offset << 5)) = b * 0x01010101;
 }
 
 static void
 writeSparse16(int Value, pointer Base, register unsigned long Offset)
 {
-#ifndef __NetBSD__
     register unsigned long msb;
-#endif
     register unsigned int w = Value & 0xffffU;
 
     write_mem_barrier();
     Offset += (unsigned long)Base - (unsigned long)memBase;
-#ifndef __NetBSD__
     if (Offset >= (hae_thresh)) {
       msb = Offset & hae_mask;
       Offset -= msb;
+#ifndef __NetBSD__
       if (msb_set != msb) {
 	sethae(msb);
 	msb_set = msb;
       }
-    }
 #endif
+    }
     *(vuip)((unsigned long)memSBase+(Offset<<5)+(1<<(5-2))) =
       w * 0x00010001;
 
@@ -671,44 +665,40 @@
 static void
 writeSparseNB8(int Value, pointer Base, register unsigned long Offset)
 {
-#ifndef __NetBSD__
     register unsigned long msb;
-#endif
     register unsigned int b = Value & 0xffU;
 
     Offset += (unsigned long)Base - (unsigned long)memBase;
-#ifndef __NetBSD__
     if (Offset >= (hae_thresh)) {
       msb = Offset & hae_mask;
       Offset -= msb;
+#ifndef __NetBSD__
       if (msb_set != msb) {
 	sethae(msb);
 	msb_set = msb;
       }
-    }
 #endif
+    }
     *(vuip) ((unsigned long)memSBase + (Offset << 5)) = b * 0x01010101;
 }
 
 static void
 writeSparseNB16(int Value, pointer Base, register unsigned long Offset)
 {
-#ifndef __NetBSD__
     register unsigned long msb;
-#endif
     register unsigned int w = Value & 0xffffU;
 
     Offset += (unsigned long)Base - (unsigned long)memBase;
-#ifndef __NetBSD__
     if (Offset >= (hae_thresh)) {
       msb = Offset & hae_mask ;
       Offset -= msb;
+#ifndef __NetBSD__
       if (msb_set != msb) {
 	sethae(msb);
 	msb_set = msb;
       }
-    }
 #endif
+    }
     *(vuip)((unsigned long)memSBase+(Offset<<5)+(1<<(5-2))) =
       w * 0x00010001;
 }