MacBook users: possible fix for the SMP problem
Maxim Sobolev
sobomax at FreeBSD.org
Fri Nov 9 16:46:26 PST 2007
I don't have the original 1st gen MacBook to test this on anymore, but
it looks good. Please make sure it gets both into 6.3 and 7.0 releases.
Thanks!
-Maxim
Rui Paulo wrote:
> 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@ 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
> @@ -130,6 +130,9 @@ 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);
> @@ -616,11 +619,31 @@ 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
>
More information about the freebsd-hardware
mailing list