Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Dec 1998 21:46:56 -0500 (EST)
From:      Brian Feldman <green@unixhelp.org>
To:        current@FreeBSD.ORG
Subject:   K6-2 (3?) CPU_WT_ALLOC
Message-ID:  <Pine.BSF.4.05.9812242143080.9437-200000@janus.syracuse.net>

next in thread | raw e-mail | index | archive | help
  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--0-644874553-914554016=:9437
Content-Type: TEXT/PLAIN; charset=US-ASCII

  CPU_WT_ALLOC does not work correctly for K6-2s of model 8+ and probably K6-3s
(when they appear on the market soon). In addition, print_AMD_info() incorrectly
printfs write allocation's size. I've fixed them, so they now Do The Right
Thing, and added a "NO_MEMORY_HOLE" option to easily allow 15-16mb range
handling for us K6 and K6-2 users. A patch follows in cleartext and encoded
forms.

 Brian Feldman						  _ __  ___ ___ ___  
 green@unixhelp.org				      _ __ ___ | _ ) __|   \ 
		      http://www.freebsd.org/	 _ __ ___ ____ | _ \__ \ |) |
 FreeBSD: The Power to Serve!		   _ __ ___ ____ _____ |___/___/___/ 

--- src/sys/i386/conf/options.i386.orig	Wed Dec 23 20:36:45 1998
+++ src/sys/i386/conf/options.i386	Wed Dec 23 20:36:56 1998
@@ -57,6 +57,7 @@
 CPU_WT_ALLOC			opt_cpu.h
 CYRIX_CACHE_WORKS		opt_cpu.h
 CYRIX_CACHE_REALLY_WORKS	opt_cpu.h
+NO_MEMORY_HOLE			opt_cpu.h
 
 # The CPU type affects the endian conversion functions all over the kernel.
 I386_CPU		opt_global.h
--- src/sys/i386/i386/identcpu.c.orig	Mon Dec 21 23:12:18 1998
+++ src/sys/i386/i386/identcpu.c	Wed Dec 23 20:30:39 1998
@@ -68,6 +68,7 @@
 #if defined(I586_CPU) && defined(CPU_WT_ALLOC)
 void	enable_K5_wt_alloc(void);
 void	enable_K6_wt_alloc(void);
+void	enable_K6_2_wt_alloc(void);
 #endif
 void panicifcpuunsupported(void);
 static void identifycyrix(void);
@@ -291,9 +292,11 @@
 		if ((cpu_id & 0xf00) == 0x500) {
 			if (((cpu_id & 0x0f0) > 0)
 			    && ((cpu_id & 0x0f0) < 0x60)
-			    && ((cpu_id & 0x00f) > 3)) {
+			    && ((cpu_id & 0x00f) > 3))
 				enable_K5_wt_alloc();
-			} else if ((cpu_id & 0x0f0) > 0x50)
+			else if ((cpu_id & 0x0f0) > 0x70)
+				enable_K6_2_wt_alloc();
+			else if ((cpu_id & 0x0f0) > 0x50)
 				enable_K6_wt_alloc();
 		}
 #endif
@@ -860,18 +863,28 @@
 	switch (cpu_id & 0xFF0) {
 	case 0x560:	/* K6 0.35u */
 	case 0x570:	/* K6 0.25u */
-	case 0x580:	/* K6-2 */
-	case 0x590:	/* K6-3 */
 		amd_whcr = rdmsr(0xc0000082);
 		if (!(amd_whcr & 0x00fe)) {
 			printf("Write Allocate Disable\n");
 		} else {
 			printf("Write Allocate Enable Limit: %dM bytes\n",
-			    (u_int32_t)(amd_whcr & 0x00fe) * 2);
+			    (u_int32_t)(amd_whcr & 0x00fe) * 4);
 			printf("Write Allocate 15-16M bytes: %s\n",
 			    (amd_whcr & 0x0001) ? "Enable" : "Disable");
 			printf("Hardware Write Allocate Control: %s\n",
 			    (amd_whcr & 0x0100) ? "Enable" : "Disable");
+		}
+		break;
+	case 0x580:	/* K6-2 */
+	case 0x590:	/* K6-3 */
+		amd_whcr = rdmsr(0xc0000082);
+		if (!(amd_whcr & (0x3ff << 22))) {
+			printf("Write Allocate Disable\n");
+		} else {
+			printf("Write Allocate Enable Limit: %dM bytes\n",
+			    (u_int32_t)((amd_whcr & (0x3ff << 22)) >> 22) * 4);
+			printf("Write Allocate 15-16M bytes: %s\n",
+			    (amd_whcr & (1 << 16)) ? "Enable" : "Disable");
 		}
 		break;
 	}
--- src/sys/i386/i386/initcpu.c.orig	Mon Dec 21 23:01:26 1998
+++ src/sys/i386/i386/initcpu.c	Wed Dec 23 19:53:10 1998
@@ -44,6 +44,7 @@
 #if defined(I586_CPU) && defined(CPU_WT_ALLOC)
 void	enable_K5_wt_alloc(void);
 void	enable_K6_wt_alloc(void);
+void	enable_K6_2_wt_alloc(void);
 #endif
 
 #ifdef I486_CPU
@@ -628,8 +629,9 @@
 	whcr &= ~0x00feLL;
 	whcr |= (size << 1);
 
-#ifdef PC98
+#if defined(PC98) || defined(NO_MEMORY_HOLE)
 	if (whcr & 0x00feLL) {
+#ifdef PC98
 		/*
 		 * If bit 2 of port 0x43b is 0, disable wrte allocate for the
 		 * 15-16M range.
@@ -637,6 +639,7 @@
 		if (!(inb(0x43b) & 4))
 			whcr &= ~0x0001LL;
 		else
+#endif
 			whcr |=  0x0001LL;
 	}
 #else
@@ -644,7 +647,68 @@
 	 * There is no way to know wheter 15-16M hole exists or not. 
 	 * Therefore, we disable write allocate for this range.
 	 */
-	whcr &= 0x00feLL;
+	whcr &= ~0x0001LL;
+#endif
+	wrmsr(0x0c0000082, whcr);
+
+	write_eflags(eflags);
+	enable_intr();
+}
+
+void
+enable_K6_2_wt_alloc(void)
+{
+	quad_t	size;
+	u_int64_t	whcr;
+	u_long	eflags;
+
+	eflags = read_eflags();
+	disable_intr();
+	wbinvd();
+
+#ifdef CPU_DISABLE_CACHE
+	/*
+	 * Certain K6-2 box becomes unstable when write allocation is
+	 * enabled.
+	 */
+	/*
+	 * The AMD-K6 processer provides the 64-bit Test Register 12(TR12),
+	 * but only the Cache Inhibit(CI) (bit 3 of TR12) is suppported.
+	 * All other bits in TR12 have no effect on the processer's operation.
+	 * The I/O Trap Restart function (bit 9 of TR12) is always enabled
+	 * on the AMD-K6.
+	 */
+	wrmsr(0x0000000e, (u_int64_t)0x0008);
+#endif
+	/* Don't assume that memory size is aligned with 4M. */
+	if (Maxmem > 0)
+	  size = ((Maxmem >> 8) + 3) >> 2;
+	else
+	  size = 0;
+
+	/* Limit is 4092M bytes. */
+	size &= 0x3ff;
+	whcr = (rdmsr(0xc0000082) & ~(0x3ffLL << 22)) | (size << 22);
+
+#if defined(PC98) || defined(NO_MEMORY_HOLE)
+	if (whcr & (0x3ffLL << 22)) {
+#ifdef PC98
+		/*
+		 * If bit 2 of port 0x43b is 0, disable wrte allocate for the
+		 * 15-16M range.
+		 */
+		if (!(inb(0x43b) & 4))
+			whcr &= ~(1LL << 16);
+		else
+#endif
+			whcr |=  1LL << 16;
+	}
+#else
+	/*
+	 * There is no way to know wheter 15-16M hole exists or not. 
+	 * Therefore, we disable write allocate for this range.
+	 */
+	whcr &= ~(1LL << 16);
 #endif
 	wrmsr(0x0c0000082, whcr);
 

--0-644874553-914554016=:9437
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="K6-2.patch"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.BSF.4.05.9812242146560.9437@janus.syracuse.net>
Content-Description: 
Content-Disposition: attachment; filename="K6-2.patch"

LS0tIHNyYy9zeXMvaTM4Ni9jb25mL29wdGlvbnMuaTM4Ni5vcmlnCVdlZCBE
ZWMgMjMgMjA6MzY6NDUgMTk5OA0KKysrIHNyYy9zeXMvaTM4Ni9jb25mL29w
dGlvbnMuaTM4NglXZWQgRGVjIDIzIDIwOjM2OjU2IDE5OTgNCkBAIC01Nyw2
ICs1Nyw3IEBADQogQ1BVX1dUX0FMTE9DCQkJb3B0X2NwdS5oDQogQ1lSSVhf
Q0FDSEVfV09SS1MJCW9wdF9jcHUuaA0KIENZUklYX0NBQ0hFX1JFQUxMWV9X
T1JLUwlvcHRfY3B1LmgNCitOT19NRU1PUllfSE9MRQkJCW9wdF9jcHUuaA0K
IA0KICMgVGhlIENQVSB0eXBlIGFmZmVjdHMgdGhlIGVuZGlhbiBjb252ZXJz
aW9uIGZ1bmN0aW9ucyBhbGwgb3ZlciB0aGUga2VybmVsLg0KIEkzODZfQ1BV
CQlvcHRfZ2xvYmFsLmgNCi0tLSBzcmMvc3lzL2kzODYvaTM4Ni9pZGVudGNw
dS5jLm9yaWcJTW9uIERlYyAyMSAyMzoxMjoxOCAxOTk4DQorKysgc3JjL3N5
cy9pMzg2L2kzODYvaWRlbnRjcHUuYwlXZWQgRGVjIDIzIDIwOjMwOjM5IDE5
OTgNCkBAIC02OCw2ICs2OCw3IEBADQogI2lmIGRlZmluZWQoSTU4Nl9DUFUp
ICYmIGRlZmluZWQoQ1BVX1dUX0FMTE9DKQ0KIHZvaWQJZW5hYmxlX0s1X3d0
X2FsbG9jKHZvaWQpOw0KIHZvaWQJZW5hYmxlX0s2X3d0X2FsbG9jKHZvaWQp
Ow0KK3ZvaWQJZW5hYmxlX0s2XzJfd3RfYWxsb2Modm9pZCk7DQogI2VuZGlm
DQogdm9pZCBwYW5pY2lmY3B1dW5zdXBwb3J0ZWQodm9pZCk7DQogc3RhdGlj
IHZvaWQgaWRlbnRpZnljeXJpeCh2b2lkKTsNCkBAIC0yOTEsOSArMjkyLDEx
IEBADQogCQlpZiAoKGNwdV9pZCAmIDB4ZjAwKSA9PSAweDUwMCkgew0KIAkJ
CWlmICgoKGNwdV9pZCAmIDB4MGYwKSA+IDApDQogCQkJICAgICYmICgoY3B1
X2lkICYgMHgwZjApIDwgMHg2MCkNCi0JCQkgICAgJiYgKChjcHVfaWQgJiAw
eDAwZikgPiAzKSkgew0KKwkJCSAgICAmJiAoKGNwdV9pZCAmIDB4MDBmKSA+
IDMpKQ0KIAkJCQllbmFibGVfSzVfd3RfYWxsb2MoKTsNCi0JCQl9IGVsc2Ug
aWYgKChjcHVfaWQgJiAweDBmMCkgPiAweDUwKQ0KKwkJCWVsc2UgaWYgKChj
cHVfaWQgJiAweDBmMCkgPiAweDcwKQ0KKwkJCQllbmFibGVfSzZfMl93dF9h
bGxvYygpOw0KKwkJCWVsc2UgaWYgKChjcHVfaWQgJiAweDBmMCkgPiAweDUw
KQ0KIAkJCQllbmFibGVfSzZfd3RfYWxsb2MoKTsNCiAJCX0NCiAjZW5kaWYN
CkBAIC04NjAsMTggKzg2MywyOCBAQA0KIAlzd2l0Y2ggKGNwdV9pZCAmIDB4
RkYwKSB7DQogCWNhc2UgMHg1NjA6CS8qIEs2IDAuMzV1ICovDQogCWNhc2Ug
MHg1NzA6CS8qIEs2IDAuMjV1ICovDQotCWNhc2UgMHg1ODA6CS8qIEs2LTIg
Ki8NCi0JY2FzZSAweDU5MDoJLyogSzYtMyAqLw0KIAkJYW1kX3doY3IgPSBy
ZG1zcigweGMwMDAwMDgyKTsNCiAJCWlmICghKGFtZF93aGNyICYgMHgwMGZl
KSkgew0KIAkJCXByaW50ZigiV3JpdGUgQWxsb2NhdGUgRGlzYWJsZVxuIik7
DQogCQl9IGVsc2Ugew0KIAkJCXByaW50ZigiV3JpdGUgQWxsb2NhdGUgRW5h
YmxlIExpbWl0OiAlZE0gYnl0ZXNcbiIsDQotCQkJICAgICh1X2ludDMyX3Qp
KGFtZF93aGNyICYgMHgwMGZlKSAqIDIpOw0KKwkJCSAgICAodV9pbnQzMl90
KShhbWRfd2hjciAmIDB4MDBmZSkgKiA0KTsNCiAJCQlwcmludGYoIldyaXRl
IEFsbG9jYXRlIDE1LTE2TSBieXRlczogJXNcbiIsDQogCQkJICAgIChhbWRf
d2hjciAmIDB4MDAwMSkgPyAiRW5hYmxlIiA6ICJEaXNhYmxlIik7DQogCQkJ
cHJpbnRmKCJIYXJkd2FyZSBXcml0ZSBBbGxvY2F0ZSBDb250cm9sOiAlc1xu
IiwNCiAJCQkgICAgKGFtZF93aGNyICYgMHgwMTAwKSA/ICJFbmFibGUiIDog
IkRpc2FibGUiKTsNCisJCX0NCisJCWJyZWFrOw0KKwljYXNlIDB4NTgwOgkv
KiBLNi0yICovDQorCWNhc2UgMHg1OTA6CS8qIEs2LTMgKi8NCisJCWFtZF93
aGNyID0gcmRtc3IoMHhjMDAwMDA4Mik7DQorCQlpZiAoIShhbWRfd2hjciAm
ICgweDNmZiA8PCAyMikpKSB7DQorCQkJcHJpbnRmKCJXcml0ZSBBbGxvY2F0
ZSBEaXNhYmxlXG4iKTsNCisJCX0gZWxzZSB7DQorCQkJcHJpbnRmKCJXcml0
ZSBBbGxvY2F0ZSBFbmFibGUgTGltaXQ6ICVkTSBieXRlc1xuIiwNCisJCQkg
ICAgKHVfaW50MzJfdCkoKGFtZF93aGNyICYgKDB4M2ZmIDw8IDIyKSkgPj4g
MjIpICogNCk7DQorCQkJcHJpbnRmKCJXcml0ZSBBbGxvY2F0ZSAxNS0xNk0g
Ynl0ZXM6ICVzXG4iLA0KKwkJCSAgICAoYW1kX3doY3IgJiAoMSA8PCAxNikp
ID8gIkVuYWJsZSIgOiAiRGlzYWJsZSIpOw0KIAkJfQ0KIAkJYnJlYWs7DQog
CX0NCi0tLSBzcmMvc3lzL2kzODYvaTM4Ni9pbml0Y3B1LmMub3JpZwlNb24g
RGVjIDIxIDIzOjAxOjI2IDE5OTgNCisrKyBzcmMvc3lzL2kzODYvaTM4Ni9p
bml0Y3B1LmMJV2VkIERlYyAyMyAxOTo1MzoxMCAxOTk4DQpAQCAtNDQsNiAr
NDQsNyBAQA0KICNpZiBkZWZpbmVkKEk1ODZfQ1BVKSAmJiBkZWZpbmVkKENQ
VV9XVF9BTExPQykNCiB2b2lkCWVuYWJsZV9LNV93dF9hbGxvYyh2b2lkKTsN
CiB2b2lkCWVuYWJsZV9LNl93dF9hbGxvYyh2b2lkKTsNCit2b2lkCWVuYWJs
ZV9LNl8yX3d0X2FsbG9jKHZvaWQpOw0KICNlbmRpZg0KIA0KICNpZmRlZiBJ
NDg2X0NQVQ0KQEAgLTYyOCw4ICs2MjksOSBAQA0KIAl3aGNyICY9IH4weDAw
ZmVMTDsNCiAJd2hjciB8PSAoc2l6ZSA8PCAxKTsNCiANCi0jaWZkZWYgUEM5
OA0KKyNpZiBkZWZpbmVkKFBDOTgpIHx8IGRlZmluZWQoTk9fTUVNT1JZX0hP
TEUpDQogCWlmICh3aGNyICYgMHgwMGZlTEwpIHsNCisjaWZkZWYgUEM5OA0K
IAkJLyoNCiAJCSAqIElmIGJpdCAyIG9mIHBvcnQgMHg0M2IgaXMgMCwgZGlz
YWJsZSB3cnRlIGFsbG9jYXRlIGZvciB0aGUNCiAJCSAqIDE1LTE2TSByYW5n
ZS4NCkBAIC02MzcsNiArNjM5LDcgQEANCiAJCWlmICghKGluYigweDQzYikg
JiA0KSkNCiAJCQl3aGNyICY9IH4weDAwMDFMTDsNCiAJCWVsc2UNCisjZW5k
aWYNCiAJCQl3aGNyIHw9ICAweDAwMDFMTDsNCiAJfQ0KICNlbHNlDQpAQCAt
NjQ0LDcgKzY0Nyw2OCBAQA0KIAkgKiBUaGVyZSBpcyBubyB3YXkgdG8ga25v
dyB3aGV0ZXIgMTUtMTZNIGhvbGUgZXhpc3RzIG9yIG5vdC4gDQogCSAqIFRo
ZXJlZm9yZSwgd2UgZGlzYWJsZSB3cml0ZSBhbGxvY2F0ZSBmb3IgdGhpcyBy
YW5nZS4NCiAJICovDQotCXdoY3IgJj0gMHgwMGZlTEw7DQorCXdoY3IgJj0g
fjB4MDAwMUxMOw0KKyNlbmRpZg0KKwl3cm1zcigweDBjMDAwMDA4Miwgd2hj
cik7DQorDQorCXdyaXRlX2VmbGFncyhlZmxhZ3MpOw0KKwllbmFibGVfaW50
cigpOw0KK30NCisNCit2b2lkDQorZW5hYmxlX0s2XzJfd3RfYWxsb2Modm9p
ZCkNCit7DQorCXF1YWRfdAlzaXplOw0KKwl1X2ludDY0X3QJd2hjcjsNCisJ
dV9sb25nCWVmbGFnczsNCisNCisJZWZsYWdzID0gcmVhZF9lZmxhZ3MoKTsN
CisJZGlzYWJsZV9pbnRyKCk7DQorCXdiaW52ZCgpOw0KKw0KKyNpZmRlZiBD
UFVfRElTQUJMRV9DQUNIRQ0KKwkvKg0KKwkgKiBDZXJ0YWluIEs2LTIgYm94
IGJlY29tZXMgdW5zdGFibGUgd2hlbiB3cml0ZSBhbGxvY2F0aW9uIGlzDQor
CSAqIGVuYWJsZWQuDQorCSAqLw0KKwkvKg0KKwkgKiBUaGUgQU1ELUs2IHBy
b2Nlc3NlciBwcm92aWRlcyB0aGUgNjQtYml0IFRlc3QgUmVnaXN0ZXIgMTIo
VFIxMiksDQorCSAqIGJ1dCBvbmx5IHRoZSBDYWNoZSBJbmhpYml0KENJKSAo
Yml0IDMgb2YgVFIxMikgaXMgc3VwcHBvcnRlZC4NCisJICogQWxsIG90aGVy
IGJpdHMgaW4gVFIxMiBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgcHJvY2Vzc2Vy
J3Mgb3BlcmF0aW9uLg0KKwkgKiBUaGUgSS9PIFRyYXAgUmVzdGFydCBmdW5j
dGlvbiAoYml0IDkgb2YgVFIxMikgaXMgYWx3YXlzIGVuYWJsZWQNCisJICog
b24gdGhlIEFNRC1LNi4NCisJICovDQorCXdybXNyKDB4MDAwMDAwMGUsICh1
X2ludDY0X3QpMHgwMDA4KTsNCisjZW5kaWYNCisJLyogRG9uJ3QgYXNzdW1l
IHRoYXQgbWVtb3J5IHNpemUgaXMgYWxpZ25lZCB3aXRoIDRNLiAqLw0KKwlp
ZiAoTWF4bWVtID4gMCkNCisJICBzaXplID0gKChNYXhtZW0gPj4gOCkgKyAz
KSA+PiAyOw0KKwllbHNlDQorCSAgc2l6ZSA9IDA7DQorDQorCS8qIExpbWl0
IGlzIDQwOTJNIGJ5dGVzLiAqLw0KKwlzaXplICY9IDB4M2ZmOw0KKwl3aGNy
ID0gKHJkbXNyKDB4YzAwMDAwODIpICYgfigweDNmZkxMIDw8IDIyKSkgfCAo
c2l6ZSA8PCAyMik7DQorDQorI2lmIGRlZmluZWQoUEM5OCkgfHwgZGVmaW5l
ZChOT19NRU1PUllfSE9MRSkNCisJaWYgKHdoY3IgJiAoMHgzZmZMTCA8PCAy
MikpIHsNCisjaWZkZWYgUEM5OA0KKwkJLyoNCisJCSAqIElmIGJpdCAyIG9m
IHBvcnQgMHg0M2IgaXMgMCwgZGlzYWJsZSB3cnRlIGFsbG9jYXRlIGZvciB0
aGUNCisJCSAqIDE1LTE2TSByYW5nZS4NCisJCSAqLw0KKwkJaWYgKCEoaW5i
KDB4NDNiKSAmIDQpKQ0KKwkJCXdoY3IgJj0gfigxTEwgPDwgMTYpOw0KKwkJ
ZWxzZQ0KKyNlbmRpZg0KKwkJCXdoY3IgfD0gIDFMTCA8PCAxNjsNCisJfQ0K
KyNlbHNlDQorCS8qDQorCSAqIFRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdo
ZXRlciAxNS0xNk0gaG9sZSBleGlzdHMgb3Igbm90LiANCisJICogVGhlcmVm
b3JlLCB3ZSBkaXNhYmxlIHdyaXRlIGFsbG9jYXRlIGZvciB0aGlzIHJhbmdl
Lg0KKwkgKi8NCisJd2hjciAmPSB+KDFMTCA8PCAxNik7DQogI2VuZGlmDQog
CXdybXNyKDB4MGMwMDAwMDgyLCB3aGNyKTsNCiANCg==
--0-644874553-914554016=:9437--

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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.05.9812242143080.9437-200000>