SFI: Simple Firmware Interface - v3
Subsystems (7)
Len Brown
reviewercover SFI: Simple Firmware Interface - v3
Changes since v2:
re-based to v2.6.31-rc6
included here some patches from the ACPI tree
that prepare for SFI
deleted MMAP table parsing code
It isn't needed in the kernel, since on all known SFI boxes today, the booter parses this table for us.
fixed some build issues, generally related to CONFIG_ACPI=n
various cosmetic changes in response to v2 code review
What is left to do:
x86_32 can set CONFIG_PCI_MMCONFIG=y when
SFI=y and ACPI=n, but x86_64 can not, yet.
A number of drivers will use SFI and will provide their own table parsers, but those will come later.
thanks,
-Len
Len Brown
reviewerPATCH 1/11 ACPI: Move definition of PREFIX from acpi_bus.h to internal..h
From: Len Brown <[email protected]>
Linux/ACPI core files using internal.h all PREFIX "ACPI: ", however, not all ACPI drivers use/want it -- and they should not have to #undef PREFIX to define their own.
Add GPL commment to internal.h while we are there.
This does not change any actual console output, asside from a whitespace fix.
--- arch/x86/pci/mmconfig-shared.c | 2 ++ drivers/acpi/ac.c | 2 ++ drivers/acpi/battery.c | 2 ++ drivers/acpi/blacklist.c | 2 ++ drivers/acpi/button.c | 2 ++ drivers/acpi/cm_sbs.c | 2 ++ drivers/acpi/container.c | 2 ++ drivers/acpi/dock.c | 2 ++ drivers/acpi/ec.c | 1 - drivers/acpi/event.c | 2 ++ drivers/acpi/fan.c | 2 ++ drivers/acpi/glue.c | 2 ++ drivers/acpi/internal.h | 22 +++++++++++++++++++++- drivers/acpi/numa.c | 2 ++ drivers/acpi/pci_irq.c | 2 ++ drivers/acpi/pci_link.c | 2 ++ drivers/acpi/pci_root.c | 2 ++ drivers/acpi/power.c | 2 ++ drivers/acpi/processor_core.c | 2 ++ drivers/acpi/processor_idle.c | 2 ++ drivers/acpi/processor_perflib.c | 2 ++ drivers/acpi/processor_thermal.c | 2 ++ drivers/acpi/processor_throttling.c | 2 ++ drivers/acpi/sbs.c | 2 ++ drivers/acpi/sbshc.c | 2 ++ drivers/acpi/system.c | 2 ++ drivers/acpi/thermal.c | 2 ++ drivers/acpi/utils.c | 2 ++ drivers/acpi/video.c | 2 ++ drivers/acpi/video_detect.c | 2 ++ drivers/pci/dmar.c | 3 +-- drivers/platform/x86/fujitsu-laptop.c | 4 ++-- drivers/platform/x86/wmi.c | 1 - include/acpi/acpi_bus.h | 2 -- 34 files changed, 80 insertions(+), 9 deletions(-)
arch/x86/pci/mmconfig-shared.c +2 -0
@@ -18,6 +18,8 @@#include <asm/e820.h> #include <asm/pci_x86.h> +#define PREFIX "ACPI: " +/* aperture is up to 256MB but BIOS may reserve less */ #define MMCONFIG_APER_MIN (2 * 1024*1024)#define MMCONFIG_APER_MAX (256 * 1024*1024)
drivers/acpi/ac.c +2 -0
@@ -37,6 +37,8 @@#include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> +#define PREFIX "ACPI: " +#define ACPI_AC_CLASS "ac_adapter"#define ACPI_AC_DEVICE_NAME "AC Adapter"#define ACPI_AC_FILE_STATE "state"
drivers/acpi/battery.c +2 -0
@@ -45,6 +45,8 @@#include <linux/power_supply.h> #endif +#define PREFIX "ACPI: " +#define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF#define ACPI_BATTERY_CLASS "battery"
drivers/acpi/blacklist.c +2 -0
@@ -34,6 +34,8 @@#include <acpi/acpi_bus.h> #include <linux/dmi.h> +#include "internal.h" +enum acpi_blacklist_predicates { all_versions, less_than_or_equal,
drivers/acpi/button.c +2 -0
@@ -33,6 +33,8 @@#include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> +#define PREFIX "ACPI: " +#define ACPI_BUTTON_CLASS "button"#define ACPI_BUTTON_FILE_INFO "info"#define ACPI_BUTTON_FILE_STATE "state"
drivers/acpi/cm_sbs.c +2 -0
@@ -28,6 +28,8 @@#include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> +#define PREFIX "ACPI: " +ACPI_MODULE_NAME ("cm_sbs" );#define ACPI_AC_CLASS "ac_adapter"#define ACPI_BATTERY_CLASS "battery"
drivers/acpi/container.c +2 -0
@@ -35,6 +35,8 @@#include <acpi/acpi_drivers.h> #include <acpi/container.h> +#define PREFIX "ACPI: " +#define ACPI_CONTAINER_DEVICE_NAME "ACPI container device"#define ACPI_CONTAINER_CLASS "container"
drivers/acpi/dock.c +2 -0
@@ -33,6 +33,8 @@#include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> +#define PREFIX "ACPI: " +#define ACPI_DOCK_DRIVER_DESCRIPTION "ACPI Dock Station Driver"ACPI_MODULE_NAME ("dock" );
drivers/acpi/ec.c +0 -1
@@ -47,7 +47,6 @@#define ACPI_EC_DEVICE_NAME "Embedded Controller"#define ACPI_EC_FILE_INFO "info" -#undef PREFIX#define PREFIX "ACPI: EC: "/* EC status register */
drivers/acpi/event.c +2 -0
@@ -14,6 +14,8 @@#include <net/netlink.h> #include <net/genetlink.h> +#include "internal.h" +#define _COMPONENT ACPI_SYSTEM_COMPONENTACPI_MODULE_NAME ("event" );
drivers/acpi/fan.c +2 -0
@@ -34,6 +34,8 @@#include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> +#define PREFIX "ACPI: " +#define ACPI_FAN_CLASS "fan"#define ACPI_FAN_FILE_STATE "state"
drivers/acpi/glue.c +2 -0
@@ -12,6 +12,8 @@#include <linux/rwsem.h> #include <linux/acpi.h> +#include "internal.h" +#define ACPI_GLUE_DEBUG 0#if ACPI_GLUE_DEBUG #define DBG(x...) printk(PREFIX x)
drivers/acpi/internal.h +21 -1
@@ -1,4 +1,24 @@ -/* For use by Linux/ACPI infrastructure, not drivers */ +/* +* acpi/internal.h +* For use by Linux/ACPI infrastructure, not drivers +* +* Copyright (c) 2009, Intel Corporation. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms and conditions of the GNU General Public License, +* version 2, as published by the Free Software Foundation. +* +* This program is distributed in the hope 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. +* +* 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., +* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#define PREFIX "ACPI: "int init_acpi_device_notify (void );int acpi_scan_init (void );
drivers/acpi/numa.c +2 -0
@@ -30,6 +30,8 @@#include <linux/acpi.h> #include <acpi/acpi_bus.h> +#define PREFIX "ACPI: " +#define ACPI_NUMA 0x80000000#define _COMPONENT ACPI_NUMAACPI_MODULE_NAME ("numa" );
drivers/acpi/pci_irq.c +2 -0
@@ -40,6 +40,8 @@#include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> +#define PREFIX "ACPI: " +#define _COMPONENT ACPI_PCI_COMPONENTACPI_MODULE_NAME ("pci_irq" );
drivers/acpi/pci_link.c +2 -0
@@ -43,6 +43,8 @@#include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> +#define PREFIX "ACPI: " +#define _COMPONENT ACPI_PCI_COMPONENTACPI_MODULE_NAME ("pci_link" );#define ACPI_PCI_LINK_CLASS "pci_irq_routing"
drivers/acpi/pci_root.c +2 -0
@@ -36,6 +36,8 @@#include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> +#define PREFIX "ACPI: " +#define _COMPONENT ACPI_PCI_COMPONENTACPI_MODULE_NAME ("pci_root" );#define ACPI_PCI_ROOT_CLASS "pci_bridge"
drivers/acpi/power.c +2 -0
@@ -44,6 +44,8 @@#include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> +#define PREFIX "ACPI: " +#define _COMPONENT ACPI_POWER_COMPONENTACPI_MODULE_NAME ("power" );#define ACPI_POWER_CLASS "power_resource"
drivers/acpi/processor_core.c +2 -0
@@ -59,6 +59,8 @@#include <acpi/acpi_drivers.h> #include <acpi/processor.h> +#define PREFIX "ACPI: " +#define ACPI_PROCESSOR_CLASS "processor"#define ACPI_PROCESSOR_DEVICE_NAME "Processor"#define ACPI_PROCESSOR_FILE_INFO "info"
drivers/acpi/processor_idle.c +2 -0
@@ -60,6 +60,8 @@#include <acpi/processor.h> #include <asm/processor.h> +#define PREFIX "ACPI: " +#define ACPI_PROCESSOR_CLASS "processor"#define _COMPONENT ACPI_PROCESSOR_COMPONENTACPI_MODULE_NAME ("processor_idle" );
drivers/acpi/processor_perflib.c +2 -0
@@ -39,6 +39,8 @@#include <acpi/acpi_drivers.h> #include <acpi/processor.h> +#define PREFIX "ACPI: " +#define ACPI_PROCESSOR_CLASS "processor"#define ACPI_PROCESSOR_FILE_PERFORMANCE "performance"#define _COMPONENT ACPI_PROCESSOR_COMPONENT
drivers/acpi/processor_thermal.c +2 -0
@@ -40,6 +40,8 @@#include <acpi/processor.h> #include <acpi/acpi_drivers.h> +#define PREFIX "ACPI: " +#define ACPI_PROCESSOR_CLASS "processor"#define _COMPONENT ACPI_PROCESSOR_COMPONENTACPI_MODULE_NAME ("processor_thermal" );
drivers/acpi/processor_throttling.c +2 -0
@@ -41,6 +41,8 @@#include <acpi/acpi_drivers.h> #include <acpi/processor.h> +#define PREFIX "ACPI: " +#define ACPI_PROCESSOR_CLASS "processor"#define _COMPONENT ACPI_PROCESSOR_COMPONENTACPI_MODULE_NAME ("processor_throttling" );
drivers/acpi/sbs.c +2 -0
@@ -46,6 +46,8 @@#include "sbshc.h" +#define PREFIX "ACPI: " +#define ACPI_SBS_CLASS "sbs"#define ACPI_AC_CLASS "ac_adapter"#define ACPI_BATTERY_CLASS "battery"
drivers/acpi/sbshc.c +2 -0
@@ -15,6 +15,8 @@#include <linux/interrupt.h> #include "sbshc.h" +#define PREFIX "ACPI: " +#define ACPI_SMB_HC_CLASS "smbus_host_controller"#define ACPI_SMB_HC_DEVICE_NAME "ACPI SMBus HC"
drivers/acpi/system.c +2 -0
@@ -31,6 +31,8 @@#include <acpi/acpi_drivers.h> +#define PREFIX "ACPI: " +#define _COMPONENT ACPI_SYSTEM_COMPONENTACPI_MODULE_NAME ("system" );
drivers/acpi/thermal.c +2 -0
@@ -47,6 +47,8 @@#include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> +#define PREFIX "ACPI: " +#define ACPI_THERMAL_CLASS "thermal_zone"#define ACPI_THERMAL_DEVICE_NAME "Thermal Zone"#define ACPI_THERMAL_FILE_STATE "state"
drivers/acpi/utils.c +2 -0
@@ -30,6 +30,8 @@#include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> +#include "internal.h" +#define _COMPONENT ACPI_BUS_COMPONENTACPI_MODULE_NAME ("utils" );
drivers/acpi/video.c +2 -0
@@ -44,6 +44,8 @@#include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> +#define PREFIX "ACPI: " +#define ACPI_VIDEO_CLASS "video"#define ACPI_VIDEO_BUS_NAME "Video Bus"#define ACPI_VIDEO_DEVICE_NAME "Video Device"
drivers/acpi/video_detect.c +2 -0
@@ -38,6 +38,8 @@#include <linux/dmi.h> #include <linux/pci.h> +#define PREFIX "ACPI: " +ACPI_MODULE_NAME ("video" );#define _COMPONENT ACPI_VIDEO_COMPONENT
drivers/pci/dmar.c +1 -2
@@ -34,8 +34,7 @@#include <linux/irq.h> #include <linux/interrupt.h> -#undef PREFIX -#define PREFIX "DMAR:" +#define PREFIX "DMAR: "/* No locks are needed as DMA remapping hardware unit * list is constructed at boot time and hotplug of
drivers/platform/x86/fujitsu-laptop.c +2 -2
@@ -700,7 +700,7 @@ static int acpi_fujitsu_add(struct acpi_device *device) goto end; } - printk(KERN_INFO PREFIX "%s [%s] (%s)\n", +printk (KERN_INFO "ACPI: %s [%s] (%s)\n" ,acpi_device_name (device),acpi_device_bid (device), !device->power.state ?"on" :"off" );
@@ -874,7 +874,7 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) goto end; } - printk(KERN_INFO PREFIX "%s [%s] (%s)\n", +printk (KERN_INFO "ACPI: %s [%s] (%s)\n" ,acpi_device_name (device),acpi_device_bid (device), !device->power.state ?"on" :"off" );
drivers/platform/x86/wmi.c +0 -1
@@ -42,7 +42,6 @@ MODULE_LICENSE("GPL");#define ACPI_WMI_CLASS "wmi" -#undef PREFIX#define PREFIX "ACPI: WMI: "static DEFINE_MUTEX (wmi_data_lock);
include/acpi/acpi_bus.h +0 -2
@@ -30,8 +30,6 @@#include <acpi/acpi.h> -#define PREFIX "ACPI: " -/* TBD: Make dynamic */ #define ACPI_MAX_HANDLES 10struct acpi_handle_list {
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 2/11 ACPI, PCI: Change PREFIX to "PCI" from "ACPI" in mmconfig-shared.c
In reply to Len BrownFrom: Len Brown <[email protected]>
--- arch/x86/pci/mmconfig-shared.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
arch/x86/pci/mmconfig-shared.c +1 -1
@@ -18,7 +18,7 @@#include <asm/e820.h> #include <asm/pci_x86.h> -#define PREFIX "ACPI: " +#define PREFIX "PCI: "/* aperture is up to 256MB but BIOS may reserve less */ #define MMCONFIG_APER_MIN (2 * 1024*1024)
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 3/11 ACPI: check acpi_disabled in acpi_table_parse() and acpi_table_parse_entries()
In reply to Len BrownFrom: Len Brown <[email protected]>
Allow consumers of the acpi_table_parse()/acpi_table_parse_entries() API to gracefully handle the acpi_disabled=1 case via return value rather than checking the global flag themselves.
--- drivers/acpi/tables.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
drivers/acpi/tables.c +6 -0
@@ -213,6 +213,9 @@ acpi_table_parse_entries(char *id,unsigned long table_end;acpi_size tbl_size; +if (acpi_disabled) +return -ENODEV ; +if (!handler)return -EINVAL ;
@@ -277,6 +280,9 @@ int __init acpi_table_parse(char *id, acpi_table_handler handler)struct acpi_table_header *table =NULL ;acpi_size tbl_size; +if (acpi_disabled) +return -ENODEV ; +if (!handler)return -EINVAL ;
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 4/11 ACPI: Handle CONFIG_ACPI=n better from linux/acpi.h
In reply to Len BrownFrom: Feng Tang <[email protected]>
linux/acpi.h is the top level header for interfacing with the ACPI sub-system, so acpi_disabled should be up there instead of down in asm/acpi.h -- particularly since asm/acpi.h doesn't exist for all architectures.
Same story for acpi_table_parse(), which is a top-level API to Linux/ACPI.
This is necessary for building some code that used to always depend on CONFIG_ACPI=y, but will soon also need to build with CONFIG_ACPI=n.
--- arch/x86/include/asm/acpi.h | 1 - include/linux/acpi.h | 11 ++++++++++- 2 files changed, 10 insertions(+), 2 deletions(-)
arch/x86/include/asm/acpi.h +0 -1
@@ -144,7 +144,6 @@ static inline unsigned int acpi_processor_cstate_check(unsigned int max_cstate)#else /* !CONFIG_ACPI */ -#define acpi_disabled 1#define acpi_lapic 0#define acpi_ioapic 0static inline void acpi_noirq_set (void ) { }
include/linux/acpi.h +10 -1
@@ -292,7 +292,10 @@ void __init acpi_s4_no_nvs(void);extern acpi_status acpi_pci_osc_control_set (acpi_handle handle,u32 flags);extern void acpi_early_init (void ); -#else /* CONFIG_ACPI */ +#else /* !CONFIG_ACPI */ + +#define acpi_disabled 1 +static inline void acpi_early_init (void ) { }static inline int early_acpi_boot_init (void )
@@ -331,5 +334,11 @@ static inline int acpi_check_mem_region(resource_size_t start,return 0 ; } +struct acpi_table_header ; +static inline int acpi_table_parse (char *id, +int (*handler)(struct acpi_table_header *)) +{ +return -1 ; +}#endif /* !CONFIG_ACPI */ #endif /*_LINUX_ACPI_H*/
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 5/11 ACPI, x86: expose some IO-APIC routines when CONFIG_ACPI=n
In reply to Len BrownFrom: Feng Tang <[email protected]>
Some IO-APIC routines are ACPI specific now, but need to be exposed when CONFIG_ACPI=n for the benefit of SFI.
Remove #ifdef ACPI around these routines:
io_apic_get_unique_id(int ioapic, int apic_id);io_apic_get_version(int ioapic);io_apic_get_redir_entries(int ioapic);
Move these routines from ACPI-specific boot.c to io_apic.c:
uniq_ioapic_id(u8 id)mp_find_ioapic()mp_find_ioapic_pin()mp_register_ioapic()
Also, since uniq_ioapic_id() is now no longer static, re-name it to io_apic_unique_id() for consistency with the other public io_apic routines.
For simplicity, do not #ifdef the resulting code ACPI || SFI, thought that could be done in the future if it is important to optimize the !ACPI !SFI IO-APIC x86 kernel for size.
--- arch/x86/include/asm/io_apic.h | 13 ++++- arch/x86/kernel/acpi/boot.c | 102 +--------------------------------------- arch/x86/kernel/apic/io_apic.c | 103 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 109 insertions(+), 109 deletions(-)
arch/x86/include/asm/io_apic.h +11 -2
@@ -150,11 +150,10 @@ extern int timer_through_8259;#define io_apic_assign_pci_irqs \ (mp_irq_entries && !skip_ioapic_setup && io_apic_irqs) -#ifdef CONFIG_ACPI +extern u8 io_apic_unique_id (u8 id);extern int io_apic_get_unique_id (int ioapic,int apic_id);extern int io_apic_get_version (int ioapic);extern int io_apic_get_redir_entries (int ioapic); -#endif /* CONFIG_ACPI */ struct io_apic_irq_attr ; extern int io_apic_set_pci_routing(struct device *dev, int irq,
@@ -177,6 +176,16 @@ extern int setup_ioapic_entry(int apic, int irq, int polarity, int vector, int pin);extern void ioapic_write_entry (int apic,int pin,struct IO_APIC_route_entry e); + +struct mp_ioapic_gsi { +int gsi_base; +int gsi_end; +}; +extern struct mp_ioapic_gsi mp_gsi_routing[]; +int mp_find_ioapic (int gsi); +int mp_find_ioapic_pin (int ioapic,int gsi); +void __init mp_register_ioapic (int id,u32 address,u32 gsi_base); +#else /* !CONFIG_X86_IO_APIC */ #define io_apic_assign_pci_irqs 0static const int timer_through_8259 =0 ;
arch/x86/kernel/acpi/boot.c +1 -101
114 lines not on this page · raw message
arch/x86/kernel/apic/io_apic.c +97 -6
125 lines not on this page · raw message
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 6/11 SFI: Simple Firmware Interface - MAINTAINERS, Kconfig
In reply to Len BrownFrom: Len Brown <[email protected]>
CONFIG_SFI=y enables the kernel to boot and run optimally on platforms that support the Simple Firmware Interface.
Thanks to Jacob Pan for prototyping the initial Linux SFI support, and to Feng Tang for Linux bring-up and debug both in emulation and on Moorestown hardware.
See http://simplefirmware.org for more information on SFI.
--- MAINTAINERS | 12 ++++++++++++ drivers/sfi/Kconfig | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 0 deletions(-) create mode 100644 drivers/sfi/Kconfig
MAINTAINERS +12 -0
@@ -4561,6 +4561,18 @@ L: [email protected] S: Supported F: drivers/pci/hotplug/shpchp* +SIMPLE FIRMWARE INTERFACE (SFI) +P: Len Brown +M: [email protected] +L: [email protected] +W: http://simplefirmware.org/ +T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-sfi-2.6.git +S: Supported +F: arch/x86/kernel/*sfi* +F: drivers/sfi/ +F: include/linux/sfi*.h + + SIMTEC EB110ATX (Chalice CATS) P: Ben Dooks M: Vincent Sanders <[email protected]>
drivers/sfi/Kconfig new file +17 -0
@@ -0,0 +1,17 @@ +# +# SFI Configuration +# + +menuconfig SFI + bool "SFI (Simple Firmware Interface) Support" + ---help--- + The Simple Firmware Interface (SFI) provides a lightweight method + for platform firmware to pass information to the operating system + via static tables in memory. Kernel SFI support is required to + boot on SFI-only platforms. Currently, all SFI-only platforms are + based on the 2nd generation Intel Atom processor platform, + code-named Moorestown. + + For more information, see http://simplefirmware.org + + Say 'Y' here to enable the kernel to boot on SFI-only platforms.
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 7/11 SFI: create linux/sfi.h
In reply to Len BrownFrom: Feng Tang <[email protected]>
include/linux/include/sfi.h defines everything that customers of SFI need to know in order to use the SFI suport in the kernel.
The primary API is sfi_table_parse(), where a driver or another part of the kernel can supply a handler to parse the named table.
sfi.h also includes the currently defined table signatures and table formats.
--- include/linux/sfi.h | 206 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 206 insertions(+), 0 deletions(-) create mode 100644 include/linux/sfi.h
include/linux/sfi.h new file +206 -0
@@ -0,0 +1,206 @@ +/* sfi.h Simple Firmware Interface */ + +/* + +This file is provided under a dual BSD/GPLv2 license. When using or +redistributing this file, you may do so under either license. + +GPL LICENSE SUMMARY + +Copyright(c) 2009 Intel Corporation. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the terms of version 2 of the GNU General Public License as +published by the Free Software Foundation. + +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. + +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., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. +The full GNU General Public License is included in this distribution +in the file called LICENSE.GPL. + +BSD LICENSE + +Copyright(c) 2009 Intel Corporation. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the +distribution. +* Neither the name of Intel Corporation nor the names of its +contributors may be used to endorse or promote products derived +from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef _LINUX_SFI_H +#define _LINUX_SFI_H + +/* Table signatures reserved by the SFI specification */ +#define SFI_SIG_SYST "SYST" +#define SFI_SIG_FREQ "FREQ" +#define SFI_SIG_IDLE "IDLE" +#define SFI_SIG_CPUS "CPUS" +#define SFI_SIG_MTMR "MTMR" +#define SFI_SIG_MRTC "MRTC" +#define SFI_SIG_MMAP "MMAP" +#define SFI_SIG_APIC "APIC" +#define SFI_SIG_XSDT "XSDT" +#define SFI_SIG_WAKE "WAKE" +#define SFI_SIG_SPIB "SPIB" +#define SFI_SIG_I2CB "I2CB" +#define SFI_SIG_GPEM "GPEM" + +#define SFI_SIGNATURE_SIZE 4 +#define SFI_OEM_ID_SIZE 6 +#define SFI_OEM_TABLE_ID_SIZE 8 + +#define SFI_SYST_SEARCH_BEGIN 0x000E0000 +#define SFI_SYST_SEARCH_END 0x000FFFFF + +#define SFI_GET_NUM_ENTRIES (ptable, entry_type) \ + ((ptable->header.len - sizeof(struct sfi_table_header)) / \ + (sizeof(entry_type))) +/* +* Table structures must be byte-packed to match the SFI specification, +* as they are provided by the BIOS. +*/ +struct sfi_table_header { +char sig[SFI_SIGNATURE_SIZE ]; +u32 len; +u8 rev; +u8 csum; +char oem_id[SFI_OEM_ID_SIZE ]; +char oem_table_id[SFI_OEM_TABLE_ID_SIZE ]; +} __packed; + +struct sfi_table_simple { +struct sfi_table_header header; +u64 pentry[1 ]; +} __packed; + +/* Comply with UEFI spec 2.1 */ +struct sfi_mem_entry { +u32 type; +u64 phys_start; +u64 virt_start; +u64 pages; +u64 attrib; +} __packed; + +struct sfi_cpu_table_entry { +u32 apic_id; +} __packed; + +struct sfi_cstate_table_entry { +u32 hint;/* MWAIT hint */ +u32 latency;/* latency in ms */ +} __packed; + +struct sfi_apic_table_entry { +u64 phys_addr;/* phy base addr for APIC reg */ +} __packed; + +struct sfi_freq_table_entry { +u32 freq_mhz;/* in MHZ */ +u32 latency;/* transition latency in ms */ +u32 ctrl_val;/* value to write to PERF_CTL */ +} __packed; + +struct sfi_wake_table_entry { +u64 phys_addr;/* pointer to where the wake vector locates */ +} __packed; + +struct sfi_timer_table_entry { +u64 phys_addr;/* phy base addr for the timer */ +u32 freq_hz;/* in HZ */ +u32 irq; +} __packed; + +struct sfi_rtc_table_entry { +u64 phys_addr;/* phy base addr for the RTC */ +u32 irq; +} __packed; + +struct sfi_spi_table_entry { +u16 host_num;/* attached to host 0, 1...*/ +u16 cs;/* chip select */ +u16 irq_info; +char name[16 ]; +u8 dev_info[10 ]; +} __packed; + +struct sfi_i2c_table_entry { +u16 host_num; +u16 addr;/* slave addr */ +u16 irq_info; +char name[16 ]; +u8 dev_info[10 ]; +} __packed; + +struct sfi_gpe_table_entry { +u16 logical_id;/* logical id */ +u16 phys_id;/* physical GPE id */ +} __packed; + + +typedef int (*sfi_table_handler ) (struct sfi_table_header *table); + +#ifdef CONFIG_SFI +extern void __init sfi_init (void ); +extern int __init sfi_platform_init (void ); +extern void __init sfi_init_late (void ); +extern int sfi_table_parse (char *signature,char *oem_id,char *oem_table_id, +sfi_table_handler handler); + +extern int sfi_disabled; +static inline void disable_sfi (void ) +{ + sfi_disabled =1 ; +} + +#else /* !CONFIG_SFI */ + +static inline void sfi_init (void ) +{ +} + +static inline void sfi_init_late (void ) +{ +} + +#define sfi_disabled 0 + +static inline int sfi_table_parse (char *signature,char *oem_id, +char *oem_table_id, +sfi_table_handler handler) +{ +return -1 ; +} + +#endif /* !CONFIG_SFI */ + +#endif /*_LINUX_SFI_H*/
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 8/11 SFI: add platform-independent core support
In reply to Len BrownFrom: Feng Tang <[email protected]>
drivers/sfi/sfi_core.c contains the generic SFI implementation. It has a private header, sfi_core.h, for its own use and the private use of future files in drivers/sfi/
--- drivers/Makefile | 1 + drivers/sfi/Makefile | 3 + drivers/sfi/sfi_core.c | 412 ++++++++++++++++++++++++++++++++++++++++++++++++ drivers/sfi/sfi_core.h | 70 ++++++++ init/main.c | 2 + 5 files changed, 488 insertions(+), 0 deletions(-) create mode 100644 drivers/sfi/Makefile create mode 100644 drivers/sfi/sfi_core.c create mode 100644 drivers/sfi/sfi_core.h
drivers/Makefile +1 -0
@@ -11,6 +11,7 @@ obj-$(CONFIG_PARISC) += parisc/ obj-$(CONFIG_RAPIDIO) += rapidio/ obj-y += video/ obj-$(CONFIG_ACPI) += acpi/ +obj-$(CONFIG_SFI) += sfi/ # PnP must come after ACPI since it will eventually need to check if acpi # was used and do nothing if so obj-$(CONFIG_PNP) += pnp/
drivers/sfi/Makefile new file +3 -0
@@ -0,0 +1,3 @@ +obj-y += sfi_acpi.o +obj-y += sfi_core.o +
drivers/sfi/sfi_core.c new file +412 -0
412 lines not on this page · raw message
drivers/sfi/sfi_core.h new file +70 -0
70 lines not on this page · raw message
init/main.c +2 -0
@@ -68,6 +68,7 @@#include <linux/async.h> #include <linux/kmemcheck.h> #include <linux/kmemtrace.h> +#include <linux/sfi.h> #include <trace/boot.h> #include <asm/io.h>
@@ -712,6 +713,7 @@ asmlinkage void __init start_kernel(void)check_bugs ();acpi_early_init ();/* before LAPIC and SMP init */ +sfi_init_late ();ftrace_init ();
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 9/11 SFI: add capability to parse ACPI tables
In reply to Len BrownFrom: Feng Tang <[email protected]>
Extend SFI to access standard ACPI tables.
(eg. the PCI MCFG) using sfi_acpi_table_parse().
Note that this is _not_ a hybrid ACPI + SFI mode. The platform boots in either ACPI mode or SFI mode.
SFI runs only with acpi_disabled=1, which can be set at build-time via CONFIG_ACPI=n, or at boot time by the failure to find ACPI platform support.
So this extension simply allows SFI-platforms to re-use existing standard table formats that happen to be defined to live in ACPI envelopes.
--- drivers/sfi/sfi_acpi.c | 175 ++++++++++++++++++++++++++++++++++++++++++++++ include/linux/sfi_acpi.h | 93 ++++++++++++++++++++++++ 2 files changed, 268 insertions(+), 0 deletions(-) create mode 100644 drivers/sfi/sfi_acpi.c create mode 100644 include/linux/sfi_acpi.h
drivers/sfi/sfi_acpi.c new file +175 -0
@@ -0,0 +1,175 @@ +/* sfi_acpi.c Simple Firmware Interface - ACPI extensions */ + +/* + +This file is provided under a dual BSD/GPLv2 license. When using or +redistributing this file, you may do so under either license. + +GPL LICENSE SUMMARY + +Copyright(c) 2009 Intel Corporation. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the terms of version 2 of the GNU General Public License as +published by the Free Software Foundation. + +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. + +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., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. +The full GNU General Public License is included in this distribution +in the file called LICENSE.GPL. + +BSD LICENSE + +Copyright(c) 2009 Intel Corporation. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the +distribution. +* Neither the name of Intel Corporation nor the names of its +contributors may be used to endorse or promote products derived +from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#define KMSG_COMPONENT "SFI" +#define pr_fmt (fmt) KMSG_COMPONENT ": " fmt + +#include <linux/kernel.h> +#include <acpi/acpi.h> + +#include <linux/sfi.h> +#include "sfi_core.h" + +/* +* SFI can access ACPI-defined tables via an optional ACPI XSDT. +* +* This allows re-use, and avoids re-definition, of standard tables. +* For example, the "MCFG" table is defined by PCI, reserved by ACPI, +* and is expected to be present many SFI-only systems. +*/ + +static struct acpi_table_xsdt *xsdt_va__read_mostly ; + +#define XSDT_GET_NUM_ENTRIES (ptable, entry_type) \ + ((ptable->header.length - sizeof(struct acpi_table_header)) / \ + (sizeof(entry_type))) + +static inline struct sfi_table_header *acpi_to_sfi_th ( +struct acpi_table_header *th) +{ +return (struct sfi_table_header *)th; +} + +static inline struct acpi_table_header *sfi_to_acpi_th ( +struct sfi_table_header *th) +{ +return (struct acpi_table_header *)th; +} + +/* +* sfi_acpi_parse_xsdt() +* +* Parse the ACPI XSDT for later access by sfi_acpi_table_parse(). +*/ +static int __init sfi_acpi_parse_xsdt (struct sfi_table_header *th) +{ +struct sfi_table_key key =SFI_ANY_KEY ; +int tbl_cnt, i; +void *ret; + + xsdt_va = (struct acpi_table_xsdt *)th; + tbl_cnt =XSDT_GET_NUM_ENTRIES (xsdt_va, u64); +for (i =0 ; i < tbl_cnt; i++) { + ret =sfi_check_table (xsdt_va->table_offset_entry[i], &key); +if (IS_ERR (ret)) { +disable_sfi (); +return -1 ; + } + } + +return 0 ; +} + +int __init sfi_acpi_init (void ) +{ +struct sfi_table_key xsdt_key = { .sig =SFI_SIG_XSDT }; + +sfi_table_parse (SFI_SIG_XSDT ,NULL ,NULL , sfi_acpi_parse_xsdt); + +/* Only call the get_table to keep the table mapped */ + xsdt_va = (struct acpi_table_xsdt *)sfi_get_table (&xsdt_key); +return 0 ; +} + +static struct acpi_table_header *sfi_acpi_get_table (struct sfi_table_key *key) +{ +u32 tbl_cnt, i; +void *ret; + + tbl_cnt =XSDT_GET_NUM_ENTRIES (xsdt_va, u64); +for (i =0 ; i < tbl_cnt; i++) { + ret =sfi_check_table (xsdt_va->table_offset_entry[i], key); +if (!IS_ERR (ret) && ret) +return sfi_to_acpi_th (ret); + } + +return NULL ; +} + +static void sfi_acpi_put_table (struct acpi_table_header *table) +{ +sfi_put_table (acpi_to_sfi_th (table)); +} + +/* +* sfi_acpi_table_parse() +* +* Find specified table in XSDT, run handler on it and return its return value +*/ +int sfi_acpi_table_parse (char *signature,char *oem_id,char *oem_table_id, +int (*handler)(struct acpi_table_header *)) +{ +struct acpi_table_header *table =NULL ; +struct sfi_table_key key; +int ret =0 ; + +if (sfi_disabled) +return -1 ; + + key.sig = signature; + key.oem_id = oem_id; + key.oem_table_id = oem_table_id; + + table =sfi_acpi_get_table (&key); +if (!table) +return -EINVAL ; + + ret =handler (table); +sfi_acpi_put_table (table); +return ret; +}
include/linux/sfi_acpi.h new file +93 -0
93 lines not on this page · raw message
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 10/11 x86: add arch-specific SFI support
In reply to Len BrownFrom: Feng Tang <[email protected]>
arch/x86/kernel/sfi.c serves the dual-purpose of supporting the SFI core with arch specific code, as well as a home for the arch-specific code that uses SFI.
analogous to ACPI, drivers/sfi/Kconfig is pulled in by arch/x86/Kconfig
--- arch/x86/Kconfig | 2 + arch/x86/kernel/Makefile | 1 + arch/x86/kernel/setup.c | 3 + arch/x86/kernel/sfi.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 0 deletions(-) create mode 100644 arch/x86/kernel/sfi.c
arch/x86/Kconfig +2 -0
@@ -1683,6 +1683,8 @@ source "kernel/power/Kconfig" source "drivers/acpi/Kconfig" +source "drivers/sfi/Kconfig" + config X86_APM_BOOT bool default y
arch/x86/kernel/Makefile +1 -0
@@ -55,6 +55,7 @@ obj-y += step.o obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-y += cpu/ obj-y += acpi/ +obj-$(CONFIG_SFI) += sfi.o obj-y += reboot.o obj-$(CONFIG_MCA) += mca_32.o obj-$(CONFIG_X86_MSR) += msr.o
arch/x86/kernel/setup.c +3 -0
@@ -27,6 +27,7 @@#include <linux/screen_info.h> #include <linux/ioport.h> #include <linux/acpi.h> +#include <linux/sfi.h> #include <linux/apm_bios.h> #include <linux/initrd.h> #include <linux/bootmem.h>
@@ -990,6 +991,8 @@ void __init setup_arch(char **cmdline_p)*/ acpi_boot_init (); +sfi_init (); +#if defined(CONFIG_X86_MPPARSE ) || defined(CONFIG_X86_VISWS )/* * get boot-time SMP configuration:
arch/x86/kernel/sfi.c new file +133 -0
133 lines not on this page · raw message
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 11/11 SFI: Hook PCI MMCONFIG
In reply to Len BrownFrom: Feng Tang <[email protected]>
First check ACPI, and if that fails, ask SFI to find the MCFG.
--- arch/x86/Kconfig | 2 +- arch/x86/pci/mmconfig-shared.c | 6 ++++-- arch/x86/pci/mmconfig_32.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-)
arch/x86/Kconfig +1 -1
@@ -1880,7 +1880,7 @@ config PCI_DIRECT config PCI_MMCONFIG def_bool y - depends on X86_32 && PCI && ACPI && (PCI_GOMMCONFIG || PCI_GOANY) + depends on X86_32 && PCI && (ACPI || SFI) && (PCI_GOMMCONFIG || PCI_GOANY) config PCI_OLPC def_bool y
arch/x86/pci/mmconfig-shared.c +4 -2
@@ -13,10 +13,12 @@#include <linux/pci.h> #include <linux/init.h> #include <linux/acpi.h> +#include <linux/sfi_acpi.h> #include <linux/bitmap.h> #include <linux/sort.h> #include <asm/e820.h> #include <asm/pci_x86.h> +#include <asm/acpi.h> #define PREFIX "PCI: "
@@ -493,7 +495,7 @@ static void __init pci_mmcfg_reject_broken(int early) (unsigned int )cfg->start_bus_number, (unsigned int)cfg->end_bus_number); -if (!early) +if (!early && !acpi_disabled) valid =is_mmconf_reserved (is_acpi_reserved, addr, size, i, cfg,0 );if (valid)
@@ -608,7 +610,7 @@ static void __init __pci_mmcfg_init(int early) }if (!known_bridge) -acpi_table_parse (ACPI_SIG_MCFG , pci_parse_mcfg); +acpi_sfi_table_parse (ACPI_SIG_MCFG , pci_parse_mcfg);pci_mmcfg_reject_broken (early);
arch/x86/pci/mmconfig_32.c +1 -1
@@ -11,9 +11,9 @@#include <linux/pci.h> #include <linux/init.h> -#include <linux/acpi.h> #include <asm/e820.h> #include <asm/pci_x86.h> +#include <acpi/acpi.h> /* Assume systems with more busses have correct MCFG */ #define mmcfg_virt_addr ((void __iomem *) fix_to_virt(FIX_PCIE_MCFG))
Signature · 1 line
1.6.0.6
Quoted 15 lines · Len Brown
Changes since v2:
re-based to v2.6.31-rc6
included here some patches from the ACPI tree
that prepare for SFIdeleted MMAP table parsing code
It isn't needed in the kernel, since on all known SFI boxes today, the booter parses this table for us.fixed some build issues, generally related to
CONFIG_ACPI=nvarious cosmetic changes in response to v2 code review
Quoted 7 lines
What is left to do:
x86_32can setCONFIG_PCI_MMCONFIG=ywhen
SFI=y and ACPI=n, butx86_64can not, yet.A number of drivers will use SFI and will provide their own table parsers, but those will come later.
Ok, this iteration is even nicer.
A patch technical request/suggestion. I guess you'd like to keep these bits in the ACPI tree, so that you can test it and merge it with ongoing ACPI changes, right?
That would be fine to me for all the arch/x86/ touching patches, except for this one:
[PATCH 05/11] ACPI, x86: expose some IO-APIC routines when CONFIG_ACPI=n
I'd like to pick this one up into tip:x86/apic, because there's ongoing work in this area. (also, by the looks of it, i'd not be surprised if this patch needed some testing. This is fragile code with quirky Kconfig dependencies.)
I can create a standalone topic for this (based on .31-rc6), containing this single commit, which you could pull into the ACPI tree? That way we both can have this commit and nobody is held up, and both trees can be pushed to Linus in the .32 merge window, independently of each other.
Ingo
Len Brown
reviewerQuoted 2 lines
Ok, this iteration is even nicer.
Thank you, Ingo, both for the thoughtful review,
and your kind words.
Quoted 16 lines
Reviewed-by Ingo Molnar <[email protected]>A patch technical request/suggestion. I guess you'd like to keep these bits in the ACPI tree, so that you can test it and merge it with ongoing ACPI changes, right?
That would be fine to me for all the
arch/x86/touching patches, except for this one:[PATCH 05/11] ACPI, x86: expose some IO-APIC routines when
CONFIG_ACPI=nI'd like to pick this one up into tip:x86/apic, because there's ongoing work in this area. (also, by the looks of it, i'd not be surprised if this patch needed some testing. This is fragile code with quirky
Kconfigdependencies.)
Quoted 5 lines
I can create a standalone topic for this (based on .31-rc6), containing this single commit, which you could pull into the ACPI tree? That way we both can have this commit and nobody is held up, and both trees can be pushed to Linus in the .32 merge window, independently of each other.
Sure.
Go ahead and pull that patch onto an 2.6.31-rc8 based branch from here:git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-sfi-2.6.git for-ingo
As the previous patches did not depend on it, I simply rebased that one to rc8 and moved the other patches after it.
Yes, I use a single git database for ACPI and SFI so they can share things such as this patch, but rather than make SFI a branch in the kernel.org ACPI tree, it has its own tree, since most of SFI is independent of ACPI.
thanks,
-Len Brown, Intel Open Source Technology Center
Quoted 28 lines · Len Brown
Quoted 2 lines
Ok, this iteration is even nicer.
Thank you, Ingo, both for the thoughtful review,
and your kind words.Quoted 16 lines
Reviewed-by Ingo Molnar <[email protected]>A patch technical request/suggestion. I guess you'd like to keep these bits in the ACPI tree, so that you can test it and merge it with ongoing ACPI changes, right?
That would be fine to me for all the
arch/x86/touching patches, except for this one:[PATCH 05/11] ACPI, x86: expose some IO-APIC routines when
CONFIG_ACPI=nI'd like to pick this one up into tip:x86/apic, because there's ongoing work in this area. (also, by the looks of it, i'd not be surprised if this patch needed some testing. This is fragile code with quirky
Kconfigdependencies.)Quoted 5 lines
I can create a standalone topic for this (based on .31-rc6), containing this single commit, which you could pull into the ACPI tree? That way we both can have this commit and nobody is held up, and both trees can be pushed to Linus in the .32 merge window, independently of each other.
Quoted 7 lines
Sure.
Go ahead and pull that patch onto an 2.6.31-rc8 based branch from here:
git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-sfi-2.6.gitfor-ingoAs the previous patches did not depend on it, I simply rebased that one to rc8 and moved the other patches after it.
Pulled, thanks Len!
Ingo