Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 29 Apr 2002 07:20:05 +0100
From:      David Malone <dwmalone@maths.tcd.ie>
To:        Jake Bishop <jb3insf@pacbell.net>
Cc:        freebsd-stable@freebsd.org
Subject:   Re: Asus A7A266
Message-ID:  <20020429062005.GA18456@walton.maths.tcd.ie>
In-Reply-To: <3CCCE286.A984CD57@pacbell.net>
References:  <3CCCE286.A984CD57@pacbell.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Apr 28, 2002 at 11:04:54PM -0700, Jake Bishop wrote:
> Has anyone got X working with an Asus A7A266 motherboard?

If you are using XFree4 you'll probably need the patch I committed
to -STABLE last night. I've included it below if you want to test
it.

	David.


Index: sys/i386/i386/i686_mem.c
===================================================================
RCS file: /cvs/FreeBSD-CVS/src/sys/i386/i386/i686_mem.c,v
retrieving revision 1.8.2.1
diff -u -r1.8.2.1 i686_mem.c
--- sys/i386/i386/i686_mem.c	30 Sep 2000 02:49:32 -0000	1.8.2.1
+++ sys/i386/i386/i686_mem.c	28 Apr 2002 22:26:03 -0000
@@ -82,6 +82,8 @@
 						 struct mem_range_desc *mrd);
 static void			i686_mrfetch(struct mem_range_softc *sc);
 static int			i686_mtrrtype(int flags);
+static int			i686_mrt2mtrr(int flags, int oldval);
+static int			i686_mtrrconflict(int flag1, int flag2);
 static void			i686_mrstore(struct mem_range_softc *sc);
 static void			i686_mrstoreone(void *arg);
 static struct mem_range_desc	*i686_mtrrfixsearch(struct mem_range_softc *sc,
@@ -97,29 +99,35 @@
 static int i686_mtrrtomrt[] = {
     MDF_UNCACHEABLE,
     MDF_WRITECOMBINE,
-    0,
-    0,
+    MDF_UNKNOWN,
+    MDF_UNKNOWN,
     MDF_WRITETHROUGH,
     MDF_WRITEPROTECT,
     MDF_WRITEBACK
 };
 
+#define MTRRTOMRTLEN (sizeof(i686_mtrrtomrt) / sizeof(i686_mtrrtomrt[0]))
+
+static int
+i686_mtrr2mrt(int val) {
+	if (val < 0 || val >= MTRRTOMRTLEN)
+		return MDF_UNKNOWN;
+	return i686_mtrrtomrt[val];
+}
+
 /* 
- * i686 MTRR conflict matrix for overlapping ranges 
- *
- * Specifically, this matrix allows writeback and uncached ranges
- * to overlap (the overlapped region is uncached).  The array index
- * is the translated i686 code for the flags (because they map well).
+ * i686 MTRR conflicts. Writeback and uncachable may overlap.
  */
-static int i686_mtrrconflict[] = {
-    MDF_WRITECOMBINE | MDF_WRITETHROUGH | MDF_WRITEPROTECT,
-    MDF_ATTRMASK,
-    0,
-    0,
-    MDF_ATTRMASK,
-    MDF_ATTRMASK,
-    MDF_WRITECOMBINE | MDF_WRITETHROUGH | MDF_WRITEPROTECT
-};
+static int
+i686_mtrrconflict(int flag1, int flag2) {
+	flag1 &= MDF_ATTRMASK;
+	flag2 &= MDF_ATTRMASK;
+	if (flag1 == flag2 ||
+	    (flag1 == MDF_WRITEBACK && flag2 == MDF_UNCACHEABLE) ||
+	    (flag2 == MDF_WRITEBACK && flag1 == MDF_UNCACHEABLE))
+		return 0;
+	return 1;
+}
 
 /*
  * Look for an exactly-matching range.
@@ -158,7 +166,7 @@
 	    msrv = rdmsr(msr);
 	    for (j = 0; j < 8; j++, mrd++) {
 		mrd->mr_flags = (mrd->mr_flags & ~MDF_ATTRMASK) |
-		    i686_mtrrtomrt[msrv & 0xff] |
+		    i686_mtrr2mrt(msrv & 0xff) |
 		    MDF_ACTIVE;
 		if (mrd->mr_owner[0] == 0)
 		    strcpy(mrd->mr_owner, mem_owner_bios);
@@ -170,7 +178,7 @@
 	    msrv = rdmsr(msr);
 	    for (j = 0; j < 8; j++, mrd++) {
 		mrd->mr_flags = (mrd->mr_flags & ~MDF_ATTRMASK) |
-		    i686_mtrrtomrt[msrv & 0xff] |
+		    i686_mtrr2mrt(msrv & 0xff) |
 		    MDF_ACTIVE;
 		if (mrd->mr_owner[0] == 0)
 		    strcpy(mrd->mr_owner, mem_owner_bios);
@@ -182,7 +190,7 @@
 	    msrv = rdmsr(msr);
 	    for (j = 0; j < 8; j++, mrd++) {
 		mrd->mr_flags = (mrd->mr_flags & ~MDF_ATTRMASK) |
-		    i686_mtrrtomrt[msrv & 0xff] |
+		    i686_mtrr2mrt(msrv & 0xff) |
 		    MDF_ACTIVE;
 		if (mrd->mr_owner[0] == 0)
 		    strcpy(mrd->mr_owner, mem_owner_bios);
@@ -196,7 +204,7 @@
     for (; (mrd - sc->mr_desc) < sc->mr_ndesc; msr += 2, mrd++) {
 	msrv = rdmsr(msr);
 	mrd->mr_flags = (mrd->mr_flags & ~MDF_ATTRMASK) |
-	    i686_mtrrtomrt[msrv & 0xff];
+	    i686_mtrr2mrt(msrv & 0xff);
 	mrd->mr_base = msrv & 0x0000000ffffff000LL;
 	msrv = rdmsr(msr + 1);
 	mrd->mr_flags = (msrv & 0x800) ? 
@@ -222,8 +230,8 @@
 
     flags &= MDF_ATTRMASK;
 
-    for (i = 0; i < (sizeof(i686_mtrrtomrt) / sizeof(i686_mtrrtomrt[0])); i++) {
-	if (i686_mtrrtomrt[i] == 0)
+    for (i = 0; i < MTRRTOMRTLEN; i++) {
+	if (i686_mtrrtomrt[i] == MDF_UNKNOWN)
 	    continue;
 	if (flags == i686_mtrrtomrt[i])
 	    return(i);
@@ -231,6 +239,16 @@
     return(-1);
 }
 
+static int
+i686_mrt2mtrr(int flags, int oldval)
+{
+	int val;
+
+	if ((val = i686_mtrrtype(flags)) == -1)
+		return oldval & 0xff;
+	return val & 0xff;
+}
+
 /*
  * Update running CPU(s) MTRRs to match the ranges in the descriptor
  * list.
@@ -265,7 +283,7 @@
 {
     struct mem_range_softc 	*sc = (struct mem_range_softc *)arg;
     struct mem_range_desc	*mrd;
-    u_int64_t			msrv;
+    u_int64_t			omsrv, msrv;
     int				i, j, msr;
     u_int			cr4save;
 
@@ -283,9 +301,10 @@
 	msr = MSR_MTRR64kBase;
 	for (i = 0; i < (MTRR_N64K / 8); i++, msr++) {
 	    msrv = 0;
+	    omsrv = rdmsr(msr);
 	    for (j = 7; j >= 0; j--) {
 		msrv = msrv << 8;
-		msrv |= (i686_mtrrtype((mrd + j)->mr_flags) & 0xff);
+		msrv |= i686_mrt2mtrr((mrd + j)->mr_flags, omsrv >> (j*8));
 	    }
 	    wrmsr(msr, msrv);
 	    mrd += 8;
@@ -293,9 +312,10 @@
 	msr = MSR_MTRR16kBase;
 	for (i = 0; i < (MTRR_N16K / 8); i++, msr++) {
 	    msrv = 0;
+	    omsrv = rdmsr(msr);
 	    for (j = 7; j >= 0; j--) {
 		msrv = msrv << 8;
-		msrv |= (i686_mtrrtype((mrd + j)->mr_flags) & 0xff);
+		msrv |= i686_mrt2mtrr((mrd + j)->mr_flags, omsrv >> (j*8));
 	    }
 	    wrmsr(msr, msrv);
 	    mrd += 8;
@@ -303,9 +323,10 @@
 	msr = MSR_MTRR4kBase;
 	for (i = 0; i < (MTRR_N4K / 8); i++, msr++) {
 	    msrv = 0;
+	    omsrv = rdmsr(msr);
 	    for (j = 7; j >= 0; j--) {
 		msrv = msrv << 8;
-		msrv |= (i686_mtrrtype((mrd + j)->mr_flags) & 0xff);
+		msrv |= i686_mrt2mtrr((mrd + j)->mr_flags, omsrv >> (j*8));
 	    }
 	    wrmsr(msr, msrv);
 	    mrd += 8;
@@ -316,9 +337,10 @@
     msr = MSR_MTRRVarBase;
     for (; (mrd - sc->mr_desc) < sc->mr_ndesc; msr += 2, mrd++) {
 	/* base/type register */
+	omsrv = rdmsr(msr);
 	if (mrd->mr_flags & MDF_ACTIVE) {
 	    msrv = mrd->mr_base & 0x0000000ffffff000LL;
-	    msrv |= (i686_mtrrtype(mrd->mr_flags) & 0xff);
+	    msrv |= i686_mrt2mtrr(mrd->mr_flags, omsrv);
 	} else {
 	    msrv = 0;
 	}
@@ -419,8 +441,7 @@
 	    /* non-exact overlap ? */
 	    if (mroverlap(curr_md, mrd)) {
 		/* between conflicting region types? */
-		if ((i686_mtrrconflict[i686_mtrrtype(curr_md->mr_flags)] & mrd->mr_flags) ||
-		    (i686_mtrrconflict[i686_mtrrtype(mrd->mr_flags)] & curr_md->mr_flags))
+		if (i686_mtrrconflict(curr_md->mr_flags, mrd->mr_flags))
 		    return(EINVAL);
 	    }
 	} else if (free_md == NULL) {
@@ -453,7 +474,7 @@
     case MEMRANGE_SET_UPDATE:
 	/* make sure that what's being asked for is even possible at all */
 	if (!mrvalid(mrd->mr_base, mrd->mr_len) ||
-	    (i686_mtrrtype(mrd->mr_flags & MDF_ATTRMASK) == -1))
+	    i686_mtrrtype(mrd->mr_flags) == -1)
 	    return(EINVAL);
 
 #define FIXTOP	((MTRR_N64K * 0x10000) + (MTRR_N16K * 0x4000) + (MTRR_N4K * 0x1000))
Index: sys/sys/memrange.h
===================================================================
RCS file: /cvs/FreeBSD-CVS/src/sys/sys/memrange.h,v
retrieving revision 1.4
diff -u -r1.4 memrange.h
--- sys/sys/memrange.h	29 Dec 1999 04:24:44 -0000	1.4
+++ sys/sys/memrange.h	28 Apr 2002 22:26:11 -0000
@@ -10,6 +10,7 @@
 #define MDF_WRITETHROUGH	(1<<2)	/* write-through cached */
 #define MDF_WRITEBACK		(1<<3)	/* write-back cached */
 #define MDF_WRITEPROTECT	(1<<4)	/* read-only region */
+#define MDF_UNKNOWN		(1<<5)	/* any state we don't understand */
 #define MDF_ATTRMASK		(0x00ffffff)
 
 #define MDF_FIXBASE		(1<<24)	/* fixed base */
Index: usr.sbin/memcontrol/memcontrol.c
===================================================================
RCS file: /cvs/FreeBSD-CVS/src/usr.sbin/memcontrol/memcontrol.c,v
retrieving revision 1.3.4.3
diff -u -r1.3.4.3 memcontrol.c
--- usr.sbin/memcontrol/memcontrol.c	19 Jul 2001 05:05:21 -0000	1.3.4.3
+++ usr.sbin/memcontrol/memcontrol.c	28 Apr 2002 22:26:28 -0000
@@ -50,6 +50,7 @@
     {"write-through",	MDF_WRITETHROUGH,	MDF_SETTABLE},
     {"write-back",	MDF_WRITEBACK,		MDF_SETTABLE},
     {"write-protect",	MDF_WRITEPROTECT,	MDF_SETTABLE},
+    {"unknown",		MDF_UNKNOWN,		0},
     {"fixed-base",	MDF_FIXBASE,		0},
     {"fixed-length",	MDF_FIXLEN,		0},
     {"set-by-firmware",	MDF_FIRMWARE,		0},

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020429062005.GA18456>