From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933441AbbBDN16 (ORCPT ); Wed, 4 Feb 2015 08:27:58 -0500 Received: from v094114.home.net.pl ([79.96.170.134]:53095 "HELO v094114.home.net.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1753195AbbBDN1w (ORCPT ); Wed, 4 Feb 2015 08:27:52 -0500 From: "Rafael J. Wysocki" To: al.stone@linaro.org Cc: lenb@kernel.org, catalin.marinas@arm.com, will.deacon@arm.com, robert.moore@intel.com, tony.luck@intel.com, fenghua.yu@intel.com, linux-ia64@vger.kernel.org, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, devel@acpica.org, linux-arm-kernel@lists.infradead.org, linaro-acpi@lists.linaro.org, linaro-kernel@lists.linaro.org, patches@linaro.org Subject: Re: [PATCH v2 1/5] ACPI: move acpi_os_handler() so it can be made arch-dependent later Date: Wed, 04 Feb 2015 14:50:47 +0100 Message-ID: <3836210.OLr0JokInG@vostro.rjw.lan> User-Agent: KMail/4.11.5 (Linux/3.16.0-rc5+; KDE/4.11.5; x86_64; ; ) In-Reply-To: <1423009304-5007-2-git-send-email-al.stone@linaro.org> References: <1423009304-5007-1-git-send-email-al.stone@linaro.org> <1423009304-5007-2-git-send-email-al.stone@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="utf-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tuesday, February 03, 2015 05:21:40 PM al.stone@linaro.org wrote: > From: Al Stone > > In order to deprecate the use of _OSI for arm64 or other new architectures, > we need to make the default handler something we can change for various > platforms. This patch moves the definition of acpi_osi_handler() -- the > function used by ACPICA as a callback for evaluating _OSI -- into a separate > file. Subsequent patches will change which files get built so that we can > then build the version of _OSI we need for a particular architecture. > > There is no functional change. > > Signed-off-by: Al Stone > --- > drivers/acpi/Makefile | 2 +- > drivers/acpi/osi.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++ > drivers/acpi/osl.c | 24 ------------ > include/linux/acpi.h | 1 + > 4 files changed, 102 insertions(+), 25 deletions(-) > create mode 100644 drivers/acpi/osi.c > > diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile > index c346011..df348b3 100644 > --- a/drivers/acpi/Makefile > +++ b/drivers/acpi/Makefile > @@ -18,7 +18,7 @@ obj-y += acpi.o \ > acpica/ > > # All the builtin files are in the "acpi." module_param namespace. > -acpi-y += osl.o utils.o reboot.o > +acpi-y += osl.o utils.o reboot.o osi.o > acpi-y += nvs.o > > # Power management related files > diff --git a/drivers/acpi/osi.c b/drivers/acpi/osi.c > new file mode 100644 > index 0000000..fff2b0c > --- /dev/null > +++ b/drivers/acpi/osi.c > @@ -0,0 +1,100 @@ > +/* > + * osi.c - _OSI implementation (moved from drivers/acpi/osl.c) > + * > + * Copyright (C) 2000 Andrew Henroid > + * Copyright (C) 2001, 2002 Andy Grover > + * Copyright (C) 2001, 2002 Paul Diefenbaugh > + * Copyright (c) 2008 Intel Corporation > + * Author: Matthew Wilcox > + * > + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. Nit: The street address of the FSF is not really useful here. What if they move? :-) > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > + * > + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > + * > + */ > + > +#include > + > +#define _COMPONENT ACPI_OS_SERVICES > +ACPI_MODULE_NAME("osl"); > + > +#define PREFIX "ACPI: " > + > +/* > + * The story of _OSI(Linux) > + * > + * From pre-history through Linux-2.6.22, > + * Linux responded TRUE upon a BIOS OSI(Linux) query. > + * > + * Unfortunately, reference BIOS writers got wind of this > + * and put OSI(Linux) in their example code, quickly exposing > + * this string as ill-conceived and opening the door to > + * an un-bounded number of BIOS incompatibilities. > + * > + * For example, OSI(Linux) was used on resume to re-POST a > + * video card on one system, because Linux at that time > + * could not do a speedy restore in its native driver. > + * But then upon gaining quick native restore capability, > + * Linux has no way to tell the BIOS to skip the time-consuming > + * POST -- putting Linux at a permanent performance disadvantage. > + * On another system, the BIOS writer used OSI(Linux) > + * to infer native OS support for IPMI! On other systems, > + * OSI(Linux) simply got in the way of Linux claiming to > + * be compatible with other operating systems, exposing > + * BIOS issues such as skipped device initialization. > + * > + * So "Linux" turned out to be a really poor chose of > + * OSI string, and from Linux-2.6.23 onward we respond FALSE. > + * > + * BIOS writers should NOT query _OSI(Linux) on future systems. > + * Linux will complain on the console when it sees it, and return FALSE. > + * To get Linux to return TRUE for your system will require > + * a kernel source update to add a DMI entry, > + * or boot with "acpi_osi=Linux" > + */ > + > +static struct osi_linux { > + unsigned int enable:1; > + unsigned int dmi:1; > + unsigned int cmdline:1; > + unsigned int default_disabling:1; > +} osi_linux = {0, 0, 0, 0}; > + > +u32 acpi_osi_handler(acpi_string interface, u32 supported) > +{ > + if (!strcmp("Linux", interface)) { > + > + printk_once(KERN_NOTICE FW_BUG PREFIX > + "BIOS _OSI(Linux) query %s%s\n", > + osi_linux.enable ? "honored" : "ignored", > + osi_linux.cmdline ? " via cmdline" : > + osi_linux.dmi ? " via DMI" : ""); > + } > + > + if (!strcmp("Darwin", interface)) { > + /* > + * Apple firmware will behave poorly if it receives positive > + * answers to "Darwin" and any other OS. Respond positively > + * to Darwin and then disable all other vendor strings. > + */ > + acpi_update_interfaces(ACPI_DISABLE_ALL_VENDOR_STRINGS); > + supported = ACPI_UINT32_MAX; > + } > + > + return supported; > +} > + > diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c > index f9eeae8..c7f1cd6 100644 > --- a/drivers/acpi/osl.c > +++ b/drivers/acpi/osl.c > @@ -141,30 +141,6 @@ static struct osi_linux { > unsigned int default_disabling:1; > } osi_linux = {0, 0, 0, 0}; > > -static u32 acpi_osi_handler(acpi_string interface, u32 supported) > -{ > - if (!strcmp("Linux", interface)) { > - > - printk_once(KERN_NOTICE FW_BUG PREFIX > - "BIOS _OSI(Linux) query %s%s\n", > - osi_linux.enable ? "honored" : "ignored", > - osi_linux.cmdline ? " via cmdline" : > - osi_linux.dmi ? " via DMI" : ""); > - } > - > - if (!strcmp("Darwin", interface)) { > - /* > - * Apple firmware will behave poorly if it receives positive > - * answers to "Darwin" and any other OS. Respond positively > - * to Darwin and then disable all other vendor strings. > - */ > - acpi_update_interfaces(ACPI_DISABLE_ALL_VENDOR_STRINGS); > - supported = ACPI_UINT32_MAX; > - } > - > - return supported; > -} > - > static void __init acpi_request_region (struct acpi_generic_address *gas, > unsigned int length, char *desc) > { > diff --git a/include/linux/acpi.h b/include/linux/acpi.h > index 87f365e..ec18ab0 100644 > --- a/include/linux/acpi.h > +++ b/include/linux/acpi.h > @@ -271,6 +271,7 @@ static inline int acpi_video_display_switch_support(void) > extern int acpi_blacklisted(void); > extern void acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d); > extern void acpi_osi_setup(char *str); > +extern u32 acpi_osi_handler(acpi_string interface, u32 supported); > > #ifdef CONFIG_ACPI_NUMA > int acpi_get_node(acpi_handle handle); > -- I speak only for myself. Rafael J. Wysocki, Intel Open Source Technology Center.