From owner-svn-src-head@FreeBSD.ORG Sat Nov 14 14:16:04 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3A3BB1065672; Sat, 14 Nov 2009 14:16:04 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0FAE38FC19; Sat, 14 Nov 2009 14:16:04 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id nAEEG36s000981; Sat, 14 Nov 2009 14:16:03 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id nAEEG3K8000980; Sat, 14 Nov 2009 14:16:03 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <200911141416.nAEEG3K8000980@svn.freebsd.org> From: Alexander Motin Date: Sat, 14 Nov 2009 14:16:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r199268 - head/sys/i386/cpufreq X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 14 Nov 2009 14:16:04 -0000 Author: mav Date: Sat Nov 14 14:16:02 2009 New Revision: 199268 URL: http://svn.freebsd.org/changeset/base/199268 Log: Desktop Core2Duo/Core2Quad CPUs are unable to control frequency of single CPU core, only pair of them. As result, both cores are running on highest one of requested frequencies, and that is reported by status register. Such behavior confuses frequency validation logic, as it runs on only one core, as SMP is not yet launched, making EIST completely unusable. To workaround this, add check for validation result. If we haven't found at least two usable frequencies, then probably we are looking bad and have to trust data provided by BIOS as-is. Modified: head/sys/i386/cpufreq/est.c Modified: head/sys/i386/cpufreq/est.c ============================================================================== --- head/sys/i386/cpufreq/est.c Sat Nov 14 12:19:00 2009 (r199267) +++ head/sys/i386/cpufreq/est.c Sat Nov 14 14:16:02 2009 (r199268) @@ -1088,7 +1088,7 @@ est_acpi_info(device_t dev, freq_info ** struct cf_setting *sets; freq_info *table; device_t perf_dev; - int count, error, i, j; + int count, error, i, j, check = 1; uint16_t saved_id16; perf_dev = device_find_child(device_get_parent(dev), "acpi_perf", -1); @@ -1113,13 +1113,14 @@ est_acpi_info(device_t dev, freq_info ** goto out; } est_get_id16(&saved_id16); +restart: for (i = 0, j = 0; i < count; i++) { /* * Confirm id16 value is correct. */ if (sets[i].freq > 0) { - error = est_set_id16(dev, sets[i].spec[0], 1); - if (error != 0) { + if (check && + est_set_id16(dev, sets[i].spec[0], 1) != 0) { if (bootverbose) device_printf(dev, "Invalid freq %u, " "ignored.\n", sets[i].freq); @@ -1132,6 +1133,14 @@ est_acpi_info(device_t dev, freq_info ** } } } + if (count >= 2 && j < 2) { + if (bootverbose) { + device_printf(dev, "Too much freqs ignored. " + "May be a check problem. Restore all.\n"); + } + check = 0; + goto restart; + } /* restore saved setting */ est_set_id16(dev, saved_id16, 0);