Re: MacBook users: possible fix for the SMP problem

From: Rui Paulo <rpaulo_at_FreeBSD.org>
Date: Fri, 9 Nov 2007 11:40:48 +0000
On 7 Nov 2007, at 21:48, Scott Long wrote:

> Rui Paulo wrote:
>> On Nov 7, 2007 7:50 PM, Maxim Sobolev <sobomax_at_freebsd.org> wrote:
>>> I don't really like the fact that it has to be turned on manually.  
>>> Is it
>>> possible to make this automatic based on BIOS Id or something like  
>>> this?
>> Yes, I can turn this on for MacBooks.
>
> Yeah, at least have it on by default for the systems that we know have
> the problem.  I still think that it needs wider application, but as  
> long
> as the immediate and identifiable issue is addressed, I'm happy.


Ok, if there are no objections, I plan to request approval from my  
mentor and from re_at_ for the following patch:

Index: clock.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/clock.c,v
retrieving revision 1.240
diff -u -p -r1.240 clock.c
--- clock.c	26 Oct 2007 03:23:54 -0000	1.240
+++ clock.c	9 Nov 2007 11:34:56 -0000
_at__at_ -130,6 +130,9 _at__at_ static	u_char	rtc_statusb = RTCSB_24HR;
  #define	ACQUIRED	2
  #define	ACQUIRE_PENDING	3

+/* Intel ICH register */
+#define ICH_PMBASE	0x400
+
  static	u_char	timer2_state;

  static	unsigned i8254_get_timecount(struct timecounter *tc);
_at__at_ -616,11 +619,31 _at__at_ i8254_init(void)
  void
  startrtclock()
  {
+	char *ichenv, *sysenv;
  	u_int delta, freq;

  	writertc(RTC_STATUSA, rtc_statusa);
  	writertc(RTC_STATUSB, RTCSB_24HR);

+	/*
+	 * On some systems, namely MacBooks, we need to disallow the
+	 * legacy USB circuit to generate an SMI# because this can
+	 * cause several problems, namely: incorrect CPU frequency
+	 * detection and failure to start the APs.
+	 */
+	ichenv = getenv("hw.ich.disable_legacy_usb");
+	sysenv = getenv("smbios.system.product");
+	if ((ichenv !=  NULL) || (sysenv != NULL &&
+	    strncmp(sysenv, "MacBook", 7) == 0)) {
+		if (bootverbose)
+			printf("Disabling LEGACY_USB_EN bit on Intel ICH.\n");
+		outl(ICH_PMBASE + 0x30, inl(ICH_PMBASE + 0x30) & ~0x8);
+		if (ichenv)
+			freeenv(ichenv);
+		if (sysenv)
+			freeenv(sysenv);
+	}
+	
  	freq = calibrate_clocks();
  #ifdef CLK_CALIBRATION_LOOP
  	if (bootverbose) {


--
Rui Paulo
Received on Fri Nov 09 2007 - 10:41:09 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:21 UTC