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>