Merge branch 'master' into rawhide/user/myoung/xendom0
Conflicts: kernel.spec
This commit is contained in:
commit
1e71a89379
|
@ -3,5 +3,4 @@ patch-*.bz2
|
|||
clog
|
||||
*.rpm
|
||||
kernel-2.6.*/
|
||||
/patch-2.6.37-rc5.bz2
|
||||
/patch-2.6.37-rc5-git2.bz2
|
||||
/patch-2.6.37-rc7.bz2
|
||||
|
|
|
@ -12,14 +12,33 @@ and recreate the battery in order to populate the fields correctly.
|
|||
|
||||
Signed-off-by: Matthew Garrett <mjg@redhat.com>
|
||||
---
|
||||
drivers/acpi/battery.c | 20 +++++++++++++++-----
|
||||
1 files changed, 15 insertions(+), 5 deletions(-)
|
||||
|
||||
drivers/acpi/battery.c | 24 +++++++++++++++++-------
|
||||
1 files changed, 17 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
|
||||
index 95649d3..2a774a8 100644
|
||||
index 9fb9d5a..8da9c88 100644
|
||||
--- a/drivers/acpi/battery.c
|
||||
+++ b/drivers/acpi/battery.c
|
||||
@@ -605,9 +605,10 @@ static void acpi_battery_quirks2(struct acpi_battery *battery)
|
||||
@@ -130,7 +130,7 @@ struct acpi_battery {
|
||||
unsigned long flags;
|
||||
};
|
||||
|
||||
-static int acpi_battery_update(struct acpi_battery *battery);
|
||||
+static int acpi_battery_update(struct acpi_battery *battery, bool get_info);
|
||||
|
||||
#define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
|
||||
|
||||
@@ -186,7 +186,7 @@ static int acpi_battery_get_property(struct power_supply *psy,
|
||||
int ret = 0;
|
||||
struct acpi_battery *battery = to_acpi_battery(psy);
|
||||
|
||||
- if (acpi_battery_update(battery))
|
||||
+ if (acpi_battery_update(battery, false))
|
||||
return -ENODEV;
|
||||
|
||||
if (acpi_battery_present(battery)) {
|
||||
@@ -610,9 +610,11 @@ static void acpi_battery_quirks2(struct acpi_battery *battery)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -28,13 +47,14 @@ index 95649d3..2a774a8 100644
|
|||
{
|
||||
int result, old_present = acpi_battery_present(battery);
|
||||
+ int old_power_unit = battery->power_unit;
|
||||
+
|
||||
result = acpi_battery_get_status(battery);
|
||||
if (result)
|
||||
return result;
|
||||
@@ -628,6 +629,14 @@ static int acpi_battery_update(struct acpi_battery *battery)
|
||||
@@ -631,6 +633,14 @@ static int acpi_battery_update(struct acpi_battery *battery)
|
||||
}
|
||||
if (!battery->bat.dev)
|
||||
sysfs_add_battery(battery);
|
||||
result = acpi_battery_get_state(battery);
|
||||
acpi_battery_quirks2(battery);
|
||||
+ if (get_info) {
|
||||
+ acpi_battery_get_info(battery);
|
||||
+ if (old_power_unit != battery->power_unit) {
|
||||
|
@ -43,10 +63,10 @@ index 95649d3..2a774a8 100644
|
|||
+ sysfs_add_battery(battery);
|
||||
+ }
|
||||
+ }
|
||||
result = acpi_battery_get_state(battery);
|
||||
acpi_battery_quirks2(battery);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -803,7 +812,7 @@ static print_func acpi_print_funcs[ACPI_BATTERY_NUMFILES] = {
|
||||
@@ -808,7 +818,7 @@ static print_func acpi_print_funcs[ACPI_BATTERY_NUMFILES] = {
|
||||
static int acpi_battery_read(int fid, struct seq_file *seq)
|
||||
{
|
||||
struct acpi_battery *battery = seq->private;
|
||||
|
@ -55,17 +75,16 @@ index 95649d3..2a774a8 100644
|
|||
return acpi_print_funcs[fid](seq, result);
|
||||
}
|
||||
|
||||
@@ -914,7 +923,8 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
|
||||
@@ -919,7 +929,7 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
|
||||
if (!battery)
|
||||
return;
|
||||
old = battery->bat.dev;
|
||||
- acpi_battery_update(battery);
|
||||
+ acpi_battery_update(battery, (event == ACPI_BATTERY_NOTIFY_INFO ? true
|
||||
+ : false));
|
||||
+ acpi_battery_update(battery, (event == ACPI_BATTERY_NOTIFY_INFO));
|
||||
acpi_bus_generate_proc_event(device, event,
|
||||
acpi_battery_present(battery));
|
||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||
@@ -943,7 +953,7 @@ static int acpi_battery_add(struct acpi_device *device)
|
||||
@@ -948,7 +958,7 @@ static int acpi_battery_add(struct acpi_device *device)
|
||||
if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle,
|
||||
"_BIX", &handle)))
|
||||
set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags);
|
||||
|
@ -74,7 +93,7 @@ index 95649d3..2a774a8 100644
|
|||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
result = acpi_battery_add_fs(device);
|
||||
#endif
|
||||
@@ -984,7 +994,7 @@ static int acpi_battery_resume(struct acpi_device *device)
|
||||
@@ -989,7 +999,7 @@ static int acpi_battery_resume(struct acpi_device *device)
|
||||
return -EINVAL;
|
||||
battery = acpi_driver_data(device);
|
||||
battery->update_time = 0;
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
Improve our reboot handling for compatibility with Windows. Upstream in .38?
|
||||
|
||||
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
|
||||
index c495aa8..c770e66 100644
|
||||
--- a/arch/x86/kernel/reboot.c
|
||||
+++ b/arch/x86/kernel/reboot.c
|
||||
@@ -34,7 +34,7 @@ EXPORT_SYMBOL(pm_power_off);
|
||||
|
||||
static const struct desc_ptr no_idt = {};
|
||||
static int reboot_mode;
|
||||
-enum reboot_type reboot_type = BOOT_KBD;
|
||||
+enum reboot_type reboot_type = BOOT_ACPI;
|
||||
int reboot_force;
|
||||
|
||||
#if defined(CONFIG_X86_32) && defined(CONFIG_SMP)
|
||||
@@ -538,9 +538,23 @@ void __attribute__((weak)) mach_reboot_fixups(void)
|
||||
{
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Windows does the following on reboot:
|
||||
+ * 1) If the FADT has the ACPI reboot register flag set, try it
|
||||
+ * 2) If still alive, write to the keyboard controller
|
||||
+ * 3) If still alive, write to the ACPI reboot register again
|
||||
+ * 4) Ig still alive, write to the keyboard controller again
|
||||
+ *
|
||||
+ * If the machine is still alive at this stage, it gives up. We default to
|
||||
+ * following the same pattern, except that if we're still alive after (4) we'll
|
||||
+ * try to force a triple fault and then cycle between hitting the keyboard
|
||||
+ * controller and doing that
|
||||
+ */
|
||||
static void native_machine_emergency_restart(void)
|
||||
{
|
||||
int i;
|
||||
+ int attempt = 0;
|
||||
+ int orig_reboot_type = reboot_type;
|
||||
|
||||
if (reboot_emergency)
|
||||
emergency_vmx_disable_all();
|
||||
@@ -562,6 +576,13 @@ static void native_machine_emergency_restart(void)
|
||||
outb(0xfe, 0x64); /* pulse reset low */
|
||||
udelay(50);
|
||||
}
|
||||
+ if (attempt == 0 && orig_reboot_type == BOOT_ACPI) {
|
||||
+ attempt = 1;
|
||||
+ reboot_type = BOOT_ACPI;
|
||||
+ } else {
|
||||
+ reboot_type = BOOT_TRIPLE;
|
||||
+ }
|
||||
+ break;
|
||||
|
||||
case BOOT_TRIPLE:
|
||||
load_idt(&no_idt);
|
||||
diff --git a/drivers/acpi/acpica/hwxface.c b/drivers/acpi/acpica/hwxface.c
|
||||
index 50cc3be..c6a4e63 100644
|
||||
--- a/drivers/acpi/acpica/hwxface.c
|
||||
+++ b/drivers/acpi/acpica/hwxface.c
|
||||
@@ -82,12 +82,11 @@ acpi_status acpi_reset(void)
|
||||
/*
|
||||
* For I/O space, write directly to the OSL. This bypasses the port
|
||||
* validation mechanism, which may block a valid write to the reset
|
||||
- * register.
|
||||
+ * register. Spec section 4.7.3.6 requires register width to be 8.
|
||||
*/
|
||||
status =
|
||||
acpi_os_write_port((acpi_io_address) reset_reg->address,
|
||||
- acpi_gbl_FADT.reset_value,
|
||||
- reset_reg->bit_width);
|
||||
+ acpi_gbl_FADT.reset_value, 8);
|
||||
} else {
|
||||
/* Write the reset value to the reset register */
|
||||
|
||||
diff --git a/drivers/acpi/reboot.c b/drivers/acpi/reboot.c
|
||||
index 93f9114..a6c77e8b 100644
|
||||
--- a/drivers/acpi/reboot.c
|
||||
+++ b/drivers/acpi/reboot.c
|
||||
@@ -15,9 +15,15 @@ void acpi_reboot(void)
|
||||
|
||||
rr = &acpi_gbl_FADT.reset_register;
|
||||
|
||||
- /* Is the reset register supported? */
|
||||
- if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER) ||
|
||||
- rr->bit_width != 8 || rr->bit_offset != 0)
|
||||
+ /* ACPI reset register was only introduced with v2 of the FADT */
|
||||
+
|
||||
+ if (acpi_gbl_FADT.header.revision < 2)
|
||||
+ return;
|
||||
+
|
||||
+ /* Is the reset register supported? The spec says we should be
|
||||
+ * checking the bit width and bit offset, but Windows ignores
|
||||
+ * these fields */
|
||||
+ if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER))
|
||||
return;
|
||||
|
||||
reset_value = acpi_gbl_FADT.reset_value;
|
||||
@@ -45,6 +51,4 @@ void acpi_reboot(void)
|
||||
acpi_reset();
|
||||
break;
|
||||
}
|
||||
- /* Wait ten seconds */
|
||||
- acpi_os_stall(10000000);
|
||||
}
|
|
@ -0,0 +1,688 @@
|
|||
Various fixes to the Apple backlight driver. Upstream in .38?
|
||||
|
||||
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
|
||||
index e54a337..fb5df46 100644
|
||||
--- a/drivers/video/backlight/Kconfig
|
||||
+++ b/drivers/video/backlight/Kconfig
|
||||
@@ -236,12 +236,12 @@ config BACKLIGHT_MAX8925
|
||||
If you have a LCD backlight connected to the WLED output of MAX8925
|
||||
WLED output, say Y here to enable this driver.
|
||||
|
||||
-config BACKLIGHT_MBP_NVIDIA
|
||||
- tristate "MacBook Pro Nvidia Backlight Driver"
|
||||
+config BACKLIGHT_APPLE
|
||||
+ tristate "Apple Backlight Driver"
|
||||
depends on X86
|
||||
help
|
||||
- If you have an Apple Macbook Pro with Nvidia graphics hardware say Y
|
||||
- to enable a driver for its backlight
|
||||
+ If you have an Intel-based Apple say Y to enable a driver for its
|
||||
+ backlight
|
||||
|
||||
config BACKLIGHT_TOSA
|
||||
tristate "Sharp SL-6000 Backlight Driver"
|
||||
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
|
||||
index 44c0f81..ebaecc0 100644
|
||||
--- a/drivers/video/backlight/Makefile
|
||||
+++ b/drivers/video/backlight/Makefile
|
||||
@@ -26,7 +26,7 @@ obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o
|
||||
obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_MAX8925) += max8925_bl.o
|
||||
-obj-$(CONFIG_BACKLIGHT_MBP_NVIDIA) += mbp_nvidia_bl.o
|
||||
+obj-$(CONFIG_BACKLIGHT_APPLE) += apple_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_WM831X) += wm831x_bl.o
|
||||
diff --git a/drivers/video/backlight/apple_bl.c b/drivers/video/backlight/apple_bl.c
|
||||
new file mode 100644
|
||||
index 0000000..8f808c7
|
||||
--- /dev/null
|
||||
+++ b/drivers/video/backlight/apple_bl.c
|
||||
@@ -0,0 +1,240 @@
|
||||
+/*
|
||||
+ * Backlight Driver for Intel-based Apples
|
||||
+ *
|
||||
+ * Copyright (c) Red Hat <mjg@redhat.com>
|
||||
+ * Based on code from Pommed:
|
||||
+ * Copyright (C) 2006 Nicolas Boichat <nicolas @boichat.ch>
|
||||
+ * Copyright (C) 2006 Felipe Alfaro Solana <felipe_alfaro @linuxmail.org>
|
||||
+ * Copyright (C) 2007 Julien BLACHE <jb@jblache.org>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This driver triggers SMIs which cause the firmware to change the
|
||||
+ * backlight brightness. This is icky in many ways, but it's impractical to
|
||||
+ * get at the firmware code in order to figure out what it's actually doing.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/backlight.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/pci.h>
|
||||
+#include <linux/acpi.h>
|
||||
+
|
||||
+static struct backlight_device *apple_backlight_device;
|
||||
+
|
||||
+struct hw_data {
|
||||
+ /* I/O resource to allocate. */
|
||||
+ unsigned long iostart;
|
||||
+ unsigned long iolen;
|
||||
+ /* Backlight operations structure. */
|
||||
+ const struct backlight_ops backlight_ops;
|
||||
+ void (*set_brightness)(int);
|
||||
+};
|
||||
+
|
||||
+static const struct hw_data *hw_data;
|
||||
+
|
||||
+#define DRIVER "apple_backlight: "
|
||||
+
|
||||
+/* Module parameters. */
|
||||
+static int debug;
|
||||
+module_param_named(debug, debug, int, 0644);
|
||||
+MODULE_PARM_DESC(debug, "Set to one to enable debugging messages.");
|
||||
+
|
||||
+/*
|
||||
+ * Implementation for machines with Intel chipset.
|
||||
+ */
|
||||
+static void intel_chipset_set_brightness(int intensity)
|
||||
+{
|
||||
+ outb(0x04 | (intensity << 4), 0xb3);
|
||||
+ outb(0xbf, 0xb2);
|
||||
+}
|
||||
+
|
||||
+static int intel_chipset_send_intensity(struct backlight_device *bd)
|
||||
+{
|
||||
+ int intensity = bd->props.brightness;
|
||||
+
|
||||
+ if (debug)
|
||||
+ printk(KERN_DEBUG DRIVER "setting brightness to %d\n",
|
||||
+ intensity);
|
||||
+
|
||||
+ intel_chipset_set_brightness(intensity);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int intel_chipset_get_intensity(struct backlight_device *bd)
|
||||
+{
|
||||
+ int intensity;
|
||||
+
|
||||
+ outb(0x03, 0xb3);
|
||||
+ outb(0xbf, 0xb2);
|
||||
+ intensity = inb(0xb3) >> 4;
|
||||
+
|
||||
+ if (debug)
|
||||
+ printk(KERN_DEBUG DRIVER "read brightness of %d\n",
|
||||
+ intensity);
|
||||
+
|
||||
+ return intensity;
|
||||
+}
|
||||
+
|
||||
+static const struct hw_data intel_chipset_data = {
|
||||
+ .iostart = 0xb2,
|
||||
+ .iolen = 2,
|
||||
+ .backlight_ops = {
|
||||
+ .options = BL_CORE_SUSPENDRESUME,
|
||||
+ .get_brightness = intel_chipset_get_intensity,
|
||||
+ .update_status = intel_chipset_send_intensity,
|
||||
+ },
|
||||
+ .set_brightness = intel_chipset_set_brightness,
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * Implementation for machines with Nvidia chipset.
|
||||
+ */
|
||||
+static void nvidia_chipset_set_brightness(int intensity)
|
||||
+{
|
||||
+ outb(0x04 | (intensity << 4), 0x52f);
|
||||
+ outb(0xbf, 0x52e);
|
||||
+}
|
||||
+
|
||||
+static int nvidia_chipset_send_intensity(struct backlight_device *bd)
|
||||
+{
|
||||
+ int intensity = bd->props.brightness;
|
||||
+
|
||||
+ if (debug)
|
||||
+ printk(KERN_DEBUG DRIVER "setting brightness to %d\n",
|
||||
+ intensity);
|
||||
+
|
||||
+ nvidia_chipset_set_brightness(intensity);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int nvidia_chipset_get_intensity(struct backlight_device *bd)
|
||||
+{
|
||||
+ int intensity;
|
||||
+
|
||||
+ outb(0x03, 0x52f);
|
||||
+ outb(0xbf, 0x52e);
|
||||
+ intensity = inb(0x52f) >> 4;
|
||||
+
|
||||
+ if (debug)
|
||||
+ printk(KERN_DEBUG DRIVER "read brightness of %d\n",
|
||||
+ intensity);
|
||||
+
|
||||
+ return intensity;
|
||||
+}
|
||||
+
|
||||
+static const struct hw_data nvidia_chipset_data = {
|
||||
+ .iostart = 0x52e,
|
||||
+ .iolen = 2,
|
||||
+ .backlight_ops = {
|
||||
+ .options = BL_CORE_SUSPENDRESUME,
|
||||
+ .get_brightness = nvidia_chipset_get_intensity,
|
||||
+ .update_status = nvidia_chipset_send_intensity
|
||||
+ },
|
||||
+ .set_brightness = nvidia_chipset_set_brightness,
|
||||
+};
|
||||
+
|
||||
+static int __devinit apple_bl_add(struct acpi_device *dev)
|
||||
+{
|
||||
+ struct backlight_properties props;
|
||||
+ struct pci_dev *host;
|
||||
+ int intensity;
|
||||
+
|
||||
+ host = pci_get_bus_and_slot(0, 0);
|
||||
+
|
||||
+ if (!host) {
|
||||
+ printk(KERN_ERR DRIVER "unable to find PCI host\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ if (host->vendor == PCI_VENDOR_ID_INTEL)
|
||||
+ hw_data = &intel_chipset_data;
|
||||
+ else if (host->vendor == PCI_VENDOR_ID_NVIDIA)
|
||||
+ hw_data = &nvidia_chipset_data;
|
||||
+
|
||||
+ pci_dev_put(host);
|
||||
+
|
||||
+ if (!hw_data) {
|
||||
+ printk(KERN_ERR DRIVER "unknown hardware\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ /* Check that the hardware responds - this may not work under EFI */
|
||||
+
|
||||
+ intensity = hw_data->backlight_ops.get_brightness(NULL);
|
||||
+
|
||||
+ if (!intensity) {
|
||||
+ hw_data->set_brightness(1);
|
||||
+ if (!hw_data->backlight_ops.get_brightness(NULL))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ hw_data->set_brightness(0);
|
||||
+ }
|
||||
+
|
||||
+ if (!request_region(hw_data->iostart, hw_data->iolen,
|
||||
+ "Apple backlight"))
|
||||
+ return -ENXIO;
|
||||
+
|
||||
+ memset(&props, 0, sizeof(struct backlight_properties));
|
||||
+ props.max_brightness = 15;
|
||||
+ apple_backlight_device = backlight_device_register("apple_backlight",
|
||||
+ NULL, NULL, &hw_data->backlight_ops, &props);
|
||||
+
|
||||
+ if (IS_ERR(apple_backlight_device)) {
|
||||
+ release_region(hw_data->iostart, hw_data->iolen);
|
||||
+ return PTR_ERR(apple_backlight_device);
|
||||
+ }
|
||||
+
|
||||
+ apple_backlight_device->props.brightness =
|
||||
+ hw_data->backlight_ops.get_brightness(apple_backlight_device);
|
||||
+ backlight_update_status(apple_backlight_device);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int __devexit apple_bl_remove(struct acpi_device *dev, int type)
|
||||
+{
|
||||
+ backlight_device_unregister(apple_backlight_device);
|
||||
+
|
||||
+ release_region(hw_data->iostart, hw_data->iolen);
|
||||
+ hw_data = NULL;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct acpi_device_id apple_bl_ids[] = {
|
||||
+ {"APP0002", 0},
|
||||
+ {"", 0},
|
||||
+};
|
||||
+
|
||||
+static struct acpi_driver apple_bl_driver = {
|
||||
+ .name = "Apple backlight",
|
||||
+ .ids = apple_bl_ids,
|
||||
+ .ops = {
|
||||
+ .add = apple_bl_add,
|
||||
+ .remove = apple_bl_remove,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static int __init apple_bl_init(void)
|
||||
+{
|
||||
+ return acpi_bus_register_driver(&apple_bl_driver);
|
||||
+}
|
||||
+
|
||||
+static void __exit apple_bl_exit(void)
|
||||
+{
|
||||
+ acpi_bus_unregister_driver(&apple_bl_driver);
|
||||
+}
|
||||
+
|
||||
+module_init(apple_bl_init);
|
||||
+module_exit(apple_bl_exit);
|
||||
+
|
||||
+MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>");
|
||||
+MODULE_DESCRIPTION("Apple Backlight Driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_DEVICE_TABLE(acpi, apple_bl_ids);
|
||||
+MODULE_ALIAS("mbp_nvidia_bl");
|
||||
diff --git a/drivers/video/backlight/mbp_nvidia_bl.c b/drivers/video/backlight/mbp_nvidia_bl.c
|
||||
deleted file mode 100644
|
||||
index 1485f73..0000000
|
||||
--- a/drivers/video/backlight/mbp_nvidia_bl.c
|
||||
+++ /dev/null
|
||||
@@ -1,400 +0,0 @@
|
||||
-/*
|
||||
- * Backlight Driver for Nvidia 8600 in Macbook Pro
|
||||
- *
|
||||
- * Copyright (c) Red Hat <mjg@redhat.com>
|
||||
- * Based on code from Pommed:
|
||||
- * Copyright (C) 2006 Nicolas Boichat <nicolas @boichat.ch>
|
||||
- * Copyright (C) 2006 Felipe Alfaro Solana <felipe_alfaro @linuxmail.org>
|
||||
- * Copyright (C) 2007 Julien BLACHE <jb@jblache.org>
|
||||
- *
|
||||
- * This program is free software; you can redistribute it and/or modify
|
||||
- * it under the terms of the GNU General Public License version 2 as
|
||||
- * published by the Free Software Foundation.
|
||||
- *
|
||||
- * This driver triggers SMIs which cause the firmware to change the
|
||||
- * backlight brightness. This is icky in many ways, but it's impractical to
|
||||
- * get at the firmware code in order to figure out what it's actually doing.
|
||||
- */
|
||||
-
|
||||
-#include <linux/module.h>
|
||||
-#include <linux/kernel.h>
|
||||
-#include <linux/init.h>
|
||||
-#include <linux/platform_device.h>
|
||||
-#include <linux/backlight.h>
|
||||
-#include <linux/err.h>
|
||||
-#include <linux/dmi.h>
|
||||
-#include <linux/io.h>
|
||||
-
|
||||
-static struct backlight_device *mbp_backlight_device;
|
||||
-
|
||||
-/* Structure to be passed to the DMI_MATCH function. */
|
||||
-struct dmi_match_data {
|
||||
- /* I/O resource to allocate. */
|
||||
- unsigned long iostart;
|
||||
- unsigned long iolen;
|
||||
- /* Backlight operations structure. */
|
||||
- const struct backlight_ops backlight_ops;
|
||||
-};
|
||||
-
|
||||
-/* Module parameters. */
|
||||
-static int debug;
|
||||
-module_param_named(debug, debug, int, 0644);
|
||||
-MODULE_PARM_DESC(debug, "Set to one to enable debugging messages.");
|
||||
-
|
||||
-/*
|
||||
- * Implementation for MacBooks with Intel chipset.
|
||||
- */
|
||||
-static int intel_chipset_send_intensity(struct backlight_device *bd)
|
||||
-{
|
||||
- int intensity = bd->props.brightness;
|
||||
-
|
||||
- if (debug)
|
||||
- printk(KERN_DEBUG "mbp_nvidia_bl: setting brightness to %d\n",
|
||||
- intensity);
|
||||
-
|
||||
- outb(0x04 | (intensity << 4), 0xb3);
|
||||
- outb(0xbf, 0xb2);
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int intel_chipset_get_intensity(struct backlight_device *bd)
|
||||
-{
|
||||
- int intensity;
|
||||
-
|
||||
- outb(0x03, 0xb3);
|
||||
- outb(0xbf, 0xb2);
|
||||
- intensity = inb(0xb3) >> 4;
|
||||
-
|
||||
- if (debug)
|
||||
- printk(KERN_DEBUG "mbp_nvidia_bl: read brightness of %d\n",
|
||||
- intensity);
|
||||
-
|
||||
- return intensity;
|
||||
-}
|
||||
-
|
||||
-static const struct dmi_match_data intel_chipset_data = {
|
||||
- .iostart = 0xb2,
|
||||
- .iolen = 2,
|
||||
- .backlight_ops = {
|
||||
- .options = BL_CORE_SUSPENDRESUME,
|
||||
- .get_brightness = intel_chipset_get_intensity,
|
||||
- .update_status = intel_chipset_send_intensity,
|
||||
- }
|
||||
-};
|
||||
-
|
||||
-/*
|
||||
- * Implementation for MacBooks with Nvidia chipset.
|
||||
- */
|
||||
-static int nvidia_chipset_send_intensity(struct backlight_device *bd)
|
||||
-{
|
||||
- int intensity = bd->props.brightness;
|
||||
-
|
||||
- if (debug)
|
||||
- printk(KERN_DEBUG "mbp_nvidia_bl: setting brightness to %d\n",
|
||||
- intensity);
|
||||
-
|
||||
- outb(0x04 | (intensity << 4), 0x52f);
|
||||
- outb(0xbf, 0x52e);
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int nvidia_chipset_get_intensity(struct backlight_device *bd)
|
||||
-{
|
||||
- int intensity;
|
||||
-
|
||||
- outb(0x03, 0x52f);
|
||||
- outb(0xbf, 0x52e);
|
||||
- intensity = inb(0x52f) >> 4;
|
||||
-
|
||||
- if (debug)
|
||||
- printk(KERN_DEBUG "mbp_nvidia_bl: read brightness of %d\n",
|
||||
- intensity);
|
||||
-
|
||||
- return intensity;
|
||||
-}
|
||||
-
|
||||
-static const struct dmi_match_data nvidia_chipset_data = {
|
||||
- .iostart = 0x52e,
|
||||
- .iolen = 2,
|
||||
- .backlight_ops = {
|
||||
- .options = BL_CORE_SUSPENDRESUME,
|
||||
- .get_brightness = nvidia_chipset_get_intensity,
|
||||
- .update_status = nvidia_chipset_send_intensity
|
||||
- }
|
||||
-};
|
||||
-
|
||||
-/*
|
||||
- * DMI matching.
|
||||
- */
|
||||
-static /* const */ struct dmi_match_data *driver_data;
|
||||
-
|
||||
-static int mbp_dmi_match(const struct dmi_system_id *id)
|
||||
-{
|
||||
- driver_data = id->driver_data;
|
||||
-
|
||||
- printk(KERN_INFO "mbp_nvidia_bl: %s detected\n", id->ident);
|
||||
- return 1;
|
||||
-}
|
||||
-
|
||||
-static const struct dmi_system_id __initdata mbp_device_table[] = {
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBook 1,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&intel_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBook 2,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&intel_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBook 3,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook3,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&intel_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBook 4,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&intel_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBook 4,2",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4,2"),
|
||||
- },
|
||||
- .driver_data = (void *)&intel_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookPro 1,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&intel_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookPro 1,2",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,2"),
|
||||
- },
|
||||
- .driver_data = (void *)&intel_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookPro 2,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&intel_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookPro 2,2",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2"),
|
||||
- },
|
||||
- .driver_data = (void *)&intel_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookPro 3,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&intel_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookPro 3,2",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,2"),
|
||||
- },
|
||||
- .driver_data = (void *)&intel_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookPro 4,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro4,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&intel_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookAir 1,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir1,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&intel_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBook 5,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&nvidia_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBook 5,2",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,2"),
|
||||
- },
|
||||
- .driver_data = (void *)&nvidia_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBook 6,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook6,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&nvidia_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookAir 2,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir2,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&nvidia_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookPro 5,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&nvidia_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookPro 5,2",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,2"),
|
||||
- },
|
||||
- .driver_data = (void *)&nvidia_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookPro 5,3",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,3"),
|
||||
- },
|
||||
- .driver_data = (void *)&nvidia_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookPro 5,4",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,4"),
|
||||
- },
|
||||
- .driver_data = (void *)&nvidia_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookPro 5,5",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,5"),
|
||||
- },
|
||||
- .driver_data = (void *)&nvidia_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookAir 3,1",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir3,1"),
|
||||
- },
|
||||
- .driver_data = (void *)&nvidia_chipset_data,
|
||||
- },
|
||||
- {
|
||||
- .callback = mbp_dmi_match,
|
||||
- .ident = "MacBookAir 3,2",
|
||||
- .matches = {
|
||||
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir3,2"),
|
||||
- },
|
||||
- .driver_data = (void *)&nvidia_chipset_data,
|
||||
- },
|
||||
- { }
|
||||
-};
|
||||
-
|
||||
-static int __init mbp_init(void)
|
||||
-{
|
||||
- struct backlight_properties props;
|
||||
- if (!dmi_check_system(mbp_device_table))
|
||||
- return -ENODEV;
|
||||
-
|
||||
- if (!request_region(driver_data->iostart, driver_data->iolen,
|
||||
- "Macbook Pro backlight"))
|
||||
- return -ENXIO;
|
||||
-
|
||||
- memset(&props, 0, sizeof(struct backlight_properties));
|
||||
- props.max_brightness = 15;
|
||||
- mbp_backlight_device = backlight_device_register("mbp_backlight", NULL,
|
||||
- NULL,
|
||||
- &driver_data->backlight_ops,
|
||||
- &props);
|
||||
- if (IS_ERR(mbp_backlight_device)) {
|
||||
- release_region(driver_data->iostart, driver_data->iolen);
|
||||
- return PTR_ERR(mbp_backlight_device);
|
||||
- }
|
||||
-
|
||||
- mbp_backlight_device->props.brightness =
|
||||
- driver_data->backlight_ops.get_brightness(mbp_backlight_device);
|
||||
- backlight_update_status(mbp_backlight_device);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static void __exit mbp_exit(void)
|
||||
-{
|
||||
- backlight_device_unregister(mbp_backlight_device);
|
||||
-
|
||||
- release_region(driver_data->iostart, driver_data->iolen);
|
||||
-}
|
||||
-
|
||||
-module_init(mbp_init);
|
||||
-module_exit(mbp_exit);
|
||||
-
|
||||
-MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>");
|
||||
-MODULE_DESCRIPTION("Nvidia-based Macbook Pro Backlight Driver");
|
||||
-MODULE_LICENSE("GPL");
|
||||
-MODULE_DEVICE_TABLE(dmi, mbp_device_table);
|
File diff suppressed because it is too large
Load Diff
|
@ -1434,11 +1434,11 @@ CONFIG_ATMEL=m
|
|||
CONFIG_B43=m
|
||||
CONFIG_B43_PCMCIA=y
|
||||
CONFIG_B43_SDIO=y
|
||||
CONFIG_B43_DEBUG=y
|
||||
# CONFIG_B43_DEBUG is not set
|
||||
CONFIG_B43_PHY_LP=y
|
||||
# CONFIG_B43_FORCE_PIO is not set
|
||||
CONFIG_B43LEGACY=m
|
||||
CONFIG_B43LEGACY_DEBUG=y
|
||||
# CONFIG_B43LEGACY_DEBUG is not set
|
||||
CONFIG_B43LEGACY_DMA=y
|
||||
CONFIG_B43LEGACY_PIO=y
|
||||
CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y
|
||||
|
@ -3307,6 +3307,8 @@ CONFIG_USB_ZERO=m
|
|||
|
||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
|
||||
# CONFIG_USB_OTG is not set
|
||||
|
||||
#
|
||||
# Sonics Silicon Backplane
|
||||
#
|
||||
|
@ -3840,7 +3842,7 @@ CONFIG_IBMASR=m
|
|||
CONFIG_PM_DEBUG=y
|
||||
CONFIG_PM_TRACE=y
|
||||
# CONFIG_PM_VERBOSE is not set
|
||||
CONFIG_PM_TEST_SUSPEND=y
|
||||
# CONFIG_PM_TEST_SUSPEND is not set
|
||||
CONFIG_PM_RUNTIME=y
|
||||
|
||||
## BEGIN ISA Junk.
|
||||
|
@ -4287,7 +4289,7 @@ CONFIG_USB_ATMEL=m
|
|||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
|
||||
# CONFIG_FUNCTION_GRAPH_TRACER is not set
|
||||
CONFIG_BOOT_TRACER=y
|
||||
# CONFIG_BOOT_TRACER is not set
|
||||
CONFIG_EARLY_PRINTK_DBGP=y
|
||||
|
||||
CONFIG_SECURITYFS=y
|
||||
|
@ -4380,6 +4382,7 @@ CONFIG_BLK_DEV_DRBD=m
|
|||
|
||||
# CONFIG_MDIO_GPIO is not set
|
||||
# CONFIG_KEYBOARD_GPIO is not set
|
||||
# CONFIG_KEYBOARD_GPIO_POLLED is not set
|
||||
# CONFIG_MOUSE_GPIO is not set
|
||||
# CONFIG_I2C_GPIO is not set
|
||||
# CONFIG_DEBUG_GPIO is not set
|
||||
|
|
102
config-nodebug
102
config-nodebug
|
@ -2,98 +2,98 @@ CONFIG_SND_VERBOSE_PRINTK=y
|
|||
CONFIG_SND_DEBUG=y
|
||||
CONFIG_SND_PCM_XRUN_DEBUG=y
|
||||
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
CONFIG_DEBUG_RT_MUTEXES=y
|
||||
CONFIG_DEBUG_LOCK_ALLOC=y
|
||||
CONFIG_PROVE_LOCKING=y
|
||||
CONFIG_DEBUG_VM=y
|
||||
CONFIG_DEBUG_SPINLOCK=y
|
||||
CONFIG_PROVE_RCU=y
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||
# CONFIG_PROVE_LOCKING is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_PROVE_RCU is not set
|
||||
# CONFIG_PROVE_RCU_REPEATEDLY is not set
|
||||
CONFIG_DEBUG_PER_CPU_MAPS=y
|
||||
# CONFIG_DEBUG_PER_CPU_MAPS is not set
|
||||
CONFIG_CPUMASK_OFFSTACK=y
|
||||
|
||||
CONFIG_CPU_NOTIFIER_ERROR_INJECT=m
|
||||
# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set
|
||||
|
||||
CONFIG_FAULT_INJECTION=y
|
||||
CONFIG_FAILSLAB=y
|
||||
CONFIG_FAIL_PAGE_ALLOC=y
|
||||
CONFIG_FAIL_MAKE_REQUEST=y
|
||||
CONFIG_FAULT_INJECTION_DEBUG_FS=y
|
||||
CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
|
||||
CONFIG_FAIL_IO_TIMEOUT=y
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_FAILSLAB is not set
|
||||
# CONFIG_FAIL_PAGE_ALLOC is not set
|
||||
# CONFIG_FAIL_MAKE_REQUEST is not set
|
||||
# CONFIG_FAULT_INJECTION_DEBUG_FS is not set
|
||||
# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set
|
||||
# CONFIG_FAIL_IO_TIMEOUT is not set
|
||||
|
||||
CONFIG_SLUB_DEBUG_ON=y
|
||||
# CONFIG_SLUB_DEBUG_ON is not set
|
||||
|
||||
CONFIG_LOCK_STAT=y
|
||||
# CONFIG_LOCK_STAT is not set
|
||||
|
||||
CONFIG_DEBUG_STACK_USAGE=y
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
|
||||
CONFIG_ACPI_DEBUG=y
|
||||
# CONFIG_ACPI_DEBUG is not set
|
||||
# CONFIG_ACPI_DEBUG_FUNC_TRACE is not set
|
||||
|
||||
CONFIG_DEBUG_SG=y
|
||||
# CONFIG_DEBUG_SG is not set
|
||||
|
||||
# CONFIG_DEBUG_PAGEALLOC is not set
|
||||
|
||||
CONFIG_DEBUG_WRITECOUNT=y
|
||||
CONFIG_DEBUG_OBJECTS=y
|
||||
# CONFIG_DEBUG_WRITECOUNT is not set
|
||||
# CONFIG_DEBUG_OBJECTS is not set
|
||||
# CONFIG_DEBUG_OBJECTS_SELFTEST is not set
|
||||
CONFIG_DEBUG_OBJECTS_FREE=y
|
||||
CONFIG_DEBUG_OBJECTS_TIMERS=y
|
||||
# CONFIG_DEBUG_OBJECTS_FREE is not set
|
||||
# CONFIG_DEBUG_OBJECTS_TIMERS is not set
|
||||
CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
|
||||
|
||||
CONFIG_X86_PTDUMP=y
|
||||
# CONFIG_X86_PTDUMP is not set
|
||||
|
||||
CONFIG_CAN_DEBUG_DEVICES=y
|
||||
# CONFIG_CAN_DEBUG_DEVICES is not set
|
||||
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
|
||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||
# CONFIG_SYSCTL_SYSCALL_CHECK is not set
|
||||
|
||||
CONFIG_DEBUG_NOTIFIERS=y
|
||||
# CONFIG_DEBUG_NOTIFIERS is not set
|
||||
|
||||
CONFIG_DMA_API_DEBUG=y
|
||||
# CONFIG_DMA_API_DEBUG is not set
|
||||
|
||||
CONFIG_MMIOTRACE=y
|
||||
# CONFIG_MMIOTRACE is not set
|
||||
|
||||
CONFIG_DEBUG_CREDENTIALS=y
|
||||
# CONFIG_DEBUG_CREDENTIALS is not set
|
||||
|
||||
# off in both production debug and nodebug builds,
|
||||
# on in rawhide nodebug builds
|
||||
CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
|
||||
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
|
||||
|
||||
CONFIG_EXT4_DEBUG=y
|
||||
# CONFIG_EXT4_DEBUG is not set
|
||||
|
||||
CONFIG_DEBUG_PERF_USE_VMALLOC=y
|
||||
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
|
||||
|
||||
CONFIG_JBD2_DEBUG=y
|
||||
# CONFIG_JBD2_DEBUG is not set
|
||||
|
||||
CONFIG_DEBUG_CFQ_IOSCHED=y
|
||||
# CONFIG_DEBUG_CFQ_IOSCHED is not set
|
||||
|
||||
CONFIG_DRBD_FAULT_INJECTION=y
|
||||
# CONFIG_DRBD_FAULT_INJECTION is not set
|
||||
|
||||
CONFIG_ATH_DEBUG=y
|
||||
CONFIG_CARL9170_DEBUGFS=y
|
||||
CONFIG_IWLWIFI_DEVICE_TRACING=y
|
||||
# CONFIG_ATH_DEBUG is not set
|
||||
# CONFIG_CARL9170_DEBUGFS is not set
|
||||
# CONFIG_IWLWIFI_DEVICE_TRACING is not set
|
||||
|
||||
CONFIG_DEBUG_OBJECTS_WORK=y
|
||||
CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y
|
||||
# CONFIG_DEBUG_OBJECTS_WORK is not set
|
||||
# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
|
||||
|
||||
CONFIG_DMADEVICES_DEBUG=y
|
||||
CONFIG_DMADEVICES_VDEBUG=y
|
||||
# CONFIG_DMADEVICES_DEBUG is not set
|
||||
# CONFIG_DMADEVICES_VDEBUG is not set
|
||||
|
||||
CONFIG_PM_ADVANCED_DEBUG=y
|
||||
|
||||
CONFIG_CEPH_LIB_PRETTYDEBUG=y
|
||||
CONFIG_QUOTA_DEBUG=y
|
||||
# CONFIG_CEPH_LIB_PRETTYDEBUG is not set
|
||||
# CONFIG_QUOTA_DEBUG is not set
|
||||
|
||||
# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
|
||||
CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
|
||||
|
||||
CONFIG_PCI_DEFAULT_USE_CRS=y
|
||||
|
||||
CONFIG_KGDB_KDB=y
|
||||
CONFIG_KDB_KEYBOARD=y
|
||||
|
||||
CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y
|
||||
CONFIG_TEST_LIST_SORT=y
|
||||
# CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER is not set
|
||||
# CONFIG_TEST_LIST_SORT is not set
|
||||
|
|
|
@ -432,7 +432,7 @@ CONFIG_SYSPROF_TRACER=y
|
|||
|
||||
CONFIG_HP_ILO=m
|
||||
|
||||
CONFIG_BACKLIGHT_MBP_NVIDIA=m
|
||||
CONFIG_BACKLIGHT_APPLE=m
|
||||
|
||||
CONFIG_OPROFILE_IBS=y
|
||||
CONFIG_MICROCODE_INTEL=y
|
||||
|
|
|
@ -15,7 +15,7 @@ CONFIG_NUMA=y
|
|||
CONFIG_K8_NUMA=y
|
||||
CONFIG_X86_64_ACPI_NUMA=y
|
||||
# CONFIG_NUMA_EMU is not set
|
||||
CONFIG_NR_CPUS=512
|
||||
CONFIG_NR_CPUS=256
|
||||
CONFIG_X86_POWERNOW_K8=m
|
||||
CONFIG_X86_P4_CLOCKMOD=m
|
||||
CONFIG_IA32_EMULATION=y
|
||||
|
@ -343,7 +343,7 @@ CONFIG_SYSPROF_TRACER=y
|
|||
|
||||
CONFIG_X86_MPPARSE=y
|
||||
|
||||
CONFIG_BACKLIGHT_MBP_NVIDIA=m
|
||||
CONFIG_BACKLIGHT_APPLE=m
|
||||
|
||||
CONFIG_OPROFILE_IBS=y
|
||||
CONFIG_MICROCODE_INTEL=y
|
||||
|
|
|
@ -0,0 +1,403 @@
|
|||
Default EFI to physical rather than virtual. Upstream seem to be going
|
||||
in this direction.
|
||||
|
||||
diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h
|
||||
index 8e4a165..3c62f15 100644
|
||||
--- a/arch/x86/include/asm/efi.h
|
||||
+++ b/arch/x86/include/asm/efi.h
|
||||
@@ -93,6 +93,9 @@ extern int add_efi_memmap;
|
||||
extern void efi_memblock_x86_reserve_range(void);
|
||||
extern void efi_call_phys_prelog(void);
|
||||
extern void efi_call_phys_epilog(void);
|
||||
+extern void efi_call_phys_prelog_in_physmode(void);
|
||||
+extern void efi_call_phys_epilog_in_physmode(void);
|
||||
+extern void efi_pagetable_init(void);
|
||||
|
||||
#ifndef CONFIG_EFI
|
||||
/*
|
||||
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
|
||||
index 0fe27d7..e1158b0 100644
|
||||
--- a/arch/x86/platform/efi/efi.c
|
||||
+++ b/arch/x86/platform/efi/efi.c
|
||||
@@ -58,6 +58,7 @@ struct efi_memory_map memmap;
|
||||
|
||||
static struct efi efi_phys __initdata;
|
||||
static efi_system_table_t efi_systab __initdata;
|
||||
+static efi_runtime_services_t phys_runtime;
|
||||
|
||||
static int __init setup_noefi(char *arg)
|
||||
{
|
||||
@@ -172,7 +173,7 @@ static efi_status_t __init phys_efi_set_virtual_address_map(
|
||||
return status;
|
||||
}
|
||||
|
||||
-static efi_status_t __init phys_efi_get_time(efi_time_t *tm,
|
||||
+static efi_status_t __init phys_efi_get_time_early(efi_time_t *tm,
|
||||
efi_time_cap_t *tc)
|
||||
{
|
||||
efi_status_t status;
|
||||
@@ -183,6 +184,112 @@ static efi_status_t __init phys_efi_get_time(efi_time_t *tm,
|
||||
return status;
|
||||
}
|
||||
|
||||
+static efi_status_t phys_efi_get_time(efi_time_t *tm,
|
||||
+ efi_time_cap_t *tc)
|
||||
+{
|
||||
+ efi_status_t status;
|
||||
+
|
||||
+ efi_call_phys_prelog_in_physmode();
|
||||
+ status = efi_call_phys2((void*)phys_runtime.get_time, tm, tc);
|
||||
+ efi_call_phys_epilog_in_physmode();
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
+static efi_status_t __init phys_efi_set_time(efi_time_t *tm)
|
||||
+{
|
||||
+ efi_status_t status;
|
||||
+
|
||||
+ efi_call_phys_prelog_in_physmode();
|
||||
+ status = efi_call_phys1((void*)phys_runtime.set_time, tm);
|
||||
+ efi_call_phys_epilog_in_physmode();
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
+static efi_status_t phys_efi_get_wakeup_time(efi_bool_t *enabled,
|
||||
+ efi_bool_t *pending,
|
||||
+ efi_time_t *tm)
|
||||
+{
|
||||
+ efi_status_t status;
|
||||
+
|
||||
+ efi_call_phys_prelog_in_physmode();
|
||||
+ status = efi_call_phys3((void*)phys_runtime.get_wakeup_time, enabled,
|
||||
+ pending, tm);
|
||||
+ efi_call_phys_epilog_in_physmode();
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
+static efi_status_t phys_efi_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm)
|
||||
+{
|
||||
+ efi_status_t status;
|
||||
+ efi_call_phys_prelog_in_physmode();
|
||||
+ status = efi_call_phys2((void*)phys_runtime.set_wakeup_time, enabled,
|
||||
+ tm);
|
||||
+ efi_call_phys_epilog_in_physmode();
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
+static efi_status_t phys_efi_get_variable(efi_char16_t *name,
|
||||
+ efi_guid_t *vendor,
|
||||
+ u32 *attr,
|
||||
+ unsigned long *data_size,
|
||||
+ void *data)
|
||||
+{
|
||||
+ efi_status_t status;
|
||||
+ efi_call_phys_prelog_in_physmode();
|
||||
+ status = efi_call_phys5((void*)phys_runtime.get_variable, name, vendor,
|
||||
+ attr, data_size, data);
|
||||
+ efi_call_phys_epilog_in_physmode();
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
+static efi_status_t phys_efi_get_next_variable(unsigned long *name_size,
|
||||
+ efi_char16_t *name,
|
||||
+ efi_guid_t *vendor)
|
||||
+{
|
||||
+ efi_status_t status;
|
||||
+
|
||||
+ efi_call_phys_prelog_in_physmode();
|
||||
+ status = efi_call_phys3((void*)phys_runtime.get_next_variable,
|
||||
+ name_size, name, vendor);
|
||||
+ efi_call_phys_epilog_in_physmode();
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
+static efi_status_t phys_efi_set_variable(efi_char16_t *name,
|
||||
+ efi_guid_t *vendor,
|
||||
+ unsigned long attr,
|
||||
+ unsigned long data_size,
|
||||
+ void *data)
|
||||
+{
|
||||
+ efi_status_t status;
|
||||
+ efi_call_phys_prelog_in_physmode();
|
||||
+ status = efi_call_phys5((void*)phys_runtime.set_variable, name,
|
||||
+ vendor, attr, data_size, data);
|
||||
+ efi_call_phys_epilog_in_physmode();
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
+static efi_status_t phys_efi_get_next_high_mono_count(u32 *count)
|
||||
+{
|
||||
+ efi_status_t status;
|
||||
+ efi_call_phys_prelog_in_physmode();
|
||||
+ status = efi_call_phys1((void*)phys_runtime.get_next_high_mono_count,
|
||||
+ count);
|
||||
+ efi_call_phys_epilog_in_physmode();
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
+static void phys_efi_reset_system(int reset_type,
|
||||
+ efi_status_t status,
|
||||
+ unsigned long data_size,
|
||||
+ efi_char16_t *data)
|
||||
+{
|
||||
+ efi_call_phys_prelog_in_physmode();
|
||||
+ efi_call_phys4((void*)phys_runtime.reset_system, reset_type, status,
|
||||
+ data_size, data);
|
||||
+ efi_call_phys_epilog_in_physmode();
|
||||
+}
|
||||
+
|
||||
int efi_set_rtc_mmss(unsigned long nowtime)
|
||||
{
|
||||
int real_seconds, real_minutes;
|
||||
@@ -435,7 +542,9 @@ void __init efi_init(void)
|
||||
* Make efi_get_time can be called before entering
|
||||
* virtual mode.
|
||||
*/
|
||||
- efi.get_time = phys_efi_get_time;
|
||||
+ efi.get_time = phys_efi_get_time_early;
|
||||
+
|
||||
+ memcpy(&phys_runtime, runtime, sizeof(efi_runtime_services_t));
|
||||
} else
|
||||
printk(KERN_ERR "Could not map the EFI runtime service "
|
||||
"table!\n");
|
||||
@@ -466,6 +575,14 @@ void __init efi_init(void)
|
||||
#if EFI_DEBUG
|
||||
print_efi_memmap();
|
||||
#endif
|
||||
+
|
||||
+#ifndef CONFIG_X86_64
|
||||
+ /*
|
||||
+ * Only x86_64 supports physical mode as of now. Use virtual mode
|
||||
+ * forcibly.
|
||||
+ */
|
||||
+ usevirtefi = 1;
|
||||
+#endif
|
||||
}
|
||||
|
||||
static void __init runtime_code_page_mkexec(void)
|
||||
@@ -579,6 +696,27 @@ void __init efi_enter_virtual_mode(void)
|
||||
memmap.map = NULL;
|
||||
}
|
||||
|
||||
+void __init efi_setup_physical_mode(void)
|
||||
+{
|
||||
+#ifdef CONFIG_X86_64
|
||||
+ efi_pagetable_init();
|
||||
+#endif
|
||||
+ efi.get_time = phys_efi_get_time;
|
||||
+ efi.set_time = phys_efi_set_time;
|
||||
+ efi.get_wakeup_time = phys_efi_get_wakeup_time;
|
||||
+ efi.set_wakeup_time = phys_efi_set_wakeup_time;
|
||||
+ efi.get_variable = phys_efi_get_variable;
|
||||
+ efi.get_next_variable = phys_efi_get_next_variable;
|
||||
+ efi.set_variable = phys_efi_set_variable;
|
||||
+ efi.get_next_high_mono_count =
|
||||
+ phys_efi_get_next_high_mono_count;
|
||||
+ efi.reset_system = phys_efi_reset_system;
|
||||
+ efi.set_virtual_address_map = NULL; /* Not needed */
|
||||
+
|
||||
+ early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);
|
||||
+ memmap.map = NULL;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Convenience functions to obtain memory types and attributes
|
||||
*/
|
||||
diff --git a/arch/x86/platform/efi/efi_32.c b/arch/x86/platform/efi/efi_32.c
|
||||
index 5cab48e..90767b1 100644
|
||||
--- a/arch/x86/platform/efi/efi_32.c
|
||||
+++ b/arch/x86/platform/efi/efi_32.c
|
||||
@@ -110,3 +110,7 @@ void efi_call_phys_epilog(void)
|
||||
|
||||
local_irq_restore(efi_rt_eflags);
|
||||
}
|
||||
+
|
||||
+void efi_call_phys_prelog_in_physmode(void) { /* Not supported */ }
|
||||
+void efi_call_phys_epilog_in_physmode(void) { /* Not supported */ }
|
||||
+
|
||||
diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c
|
||||
index ac0621a..ad19fe9 100644
|
||||
--- a/arch/x86/platform/efi/efi_64.c
|
||||
+++ b/arch/x86/platform/efi/efi_64.c
|
||||
@@ -39,7 +39,9 @@
|
||||
#include <asm/fixmap.h>
|
||||
|
||||
static pgd_t save_pgd __initdata;
|
||||
-static unsigned long efi_flags __initdata;
|
||||
+static DEFINE_PER_CPU(unsigned long, efi_flags);
|
||||
+static DEFINE_PER_CPU(unsigned long, save_cr3);
|
||||
+static pgd_t efi_pgd[PTRS_PER_PGD] __page_aligned_bss;
|
||||
|
||||
static void __init early_mapping_set_exec(unsigned long start,
|
||||
unsigned long end,
|
||||
@@ -80,7 +82,7 @@ void __init efi_call_phys_prelog(void)
|
||||
unsigned long vaddress;
|
||||
|
||||
early_runtime_code_mapping_set_exec(1);
|
||||
- local_irq_save(efi_flags);
|
||||
+ local_irq_save(get_cpu_var(efi_flags));
|
||||
vaddress = (unsigned long)__va(0x0UL);
|
||||
save_pgd = *pgd_offset_k(0x0UL);
|
||||
set_pgd(pgd_offset_k(0x0UL), *pgd_offset_k(vaddress));
|
||||
@@ -94,10 +96,23 @@ void __init efi_call_phys_epilog(void)
|
||||
*/
|
||||
set_pgd(pgd_offset_k(0x0UL), save_pgd);
|
||||
__flush_tlb_all();
|
||||
- local_irq_restore(efi_flags);
|
||||
+ local_irq_restore(get_cpu_var(efi_flags));
|
||||
early_runtime_code_mapping_set_exec(0);
|
||||
}
|
||||
|
||||
+void efi_call_phys_prelog_in_physmode(void)
|
||||
+{
|
||||
+ local_irq_save(get_cpu_var(efi_flags));
|
||||
+ get_cpu_var(save_cr3)= read_cr3();
|
||||
+ write_cr3(virt_to_phys(efi_pgd));
|
||||
+}
|
||||
+
|
||||
+void efi_call_phys_epilog_in_physmode(void)
|
||||
+{
|
||||
+ write_cr3(get_cpu_var(save_cr3));
|
||||
+ local_irq_restore(get_cpu_var(efi_flags));
|
||||
+}
|
||||
+
|
||||
void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size,
|
||||
u32 type)
|
||||
{
|
||||
@@ -112,3 +127,78 @@ void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size,
|
||||
|
||||
return (void __iomem *)__va(phys_addr);
|
||||
}
|
||||
+
|
||||
+static pud_t *fill_pud(pgd_t *pgd, unsigned long vaddr)
|
||||
+{
|
||||
+ if (pgd_none(*pgd)) {
|
||||
+ pud_t *pud = (pud_t *)get_zeroed_page(GFP_ATOMIC);
|
||||
+ set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(pud)));
|
||||
+ if (pud != pud_offset(pgd, 0))
|
||||
+ printk(KERN_ERR "EFI PAGETABLE BUG #00! %p <-> %p\n",
|
||||
+ pud, pud_offset(pgd, 0));
|
||||
+ }
|
||||
+ return pud_offset(pgd, vaddr);
|
||||
+}
|
||||
+
|
||||
+static pmd_t *fill_pmd(pud_t *pud, unsigned long vaddr)
|
||||
+{
|
||||
+ if (pud_none(*pud)) {
|
||||
+ pmd_t *pmd = (pmd_t *)get_zeroed_page(GFP_ATOMIC);
|
||||
+ set_pud(pud, __pud(_PAGE_TABLE | __pa(pmd)));
|
||||
+ if (pmd != pmd_offset(pud, 0))
|
||||
+ printk(KERN_ERR "EFI PAGETABLE BUG #01! %p <-> %p\n",
|
||||
+ pmd, pmd_offset(pud, 0));
|
||||
+ }
|
||||
+ return pmd_offset(pud, vaddr);
|
||||
+}
|
||||
+
|
||||
+static pte_t *fill_pte(pmd_t *pmd, unsigned long vaddr)
|
||||
+{
|
||||
+ if (pmd_none(*pmd)) {
|
||||
+ pte_t *pte = (pte_t *)get_zeroed_page(GFP_ATOMIC);
|
||||
+ set_pmd(pmd, __pmd(_PAGE_TABLE | __pa(pte)));
|
||||
+ if (pte != pte_offset_kernel(pmd, 0))
|
||||
+ printk(KERN_ERR "EFI PAGETABLE BUG #02!\n");
|
||||
+ }
|
||||
+ return pte_offset_kernel(pmd, vaddr);
|
||||
+}
|
||||
+
|
||||
+void __init efi_pagetable_init(void)
|
||||
+{
|
||||
+ efi_memory_desc_t *md;
|
||||
+ unsigned long size;
|
||||
+ u64 start_pfn, end_pfn, pfn, vaddr;
|
||||
+ void *p;
|
||||
+ pgd_t *pgd;
|
||||
+ pud_t *pud;
|
||||
+ pmd_t *pmd;
|
||||
+ pte_t *pte;
|
||||
+
|
||||
+ memset(efi_pgd, 0, sizeof(efi_pgd));
|
||||
+ for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
|
||||
+ md = p;
|
||||
+ if (!(md->type & EFI_RUNTIME_SERVICES_CODE) &&
|
||||
+ !(md->type & EFI_RUNTIME_SERVICES_DATA))
|
||||
+ continue;
|
||||
+
|
||||
+ start_pfn = md->phys_addr >> PAGE_SHIFT;
|
||||
+ size = md->num_pages << EFI_PAGE_SHIFT;
|
||||
+ end_pfn = PFN_UP(md->phys_addr + size);
|
||||
+
|
||||
+ for (pfn = start_pfn; pfn <= end_pfn; pfn++) {
|
||||
+ vaddr = pfn << PAGE_SHIFT;
|
||||
+ pgd = efi_pgd + pgd_index(vaddr);
|
||||
+ pud = fill_pud(pgd, vaddr);
|
||||
+ pmd = fill_pmd(pud, vaddr);
|
||||
+ pte = fill_pte(pmd, vaddr);
|
||||
+ if (md->type & EFI_RUNTIME_SERVICES_CODE)
|
||||
+ set_pte(pte, pfn_pte(pfn, PAGE_KERNEL_EXEC));
|
||||
+ else
|
||||
+ set_pte(pte, pfn_pte(pfn, PAGE_KERNEL));
|
||||
+ }
|
||||
+ }
|
||||
+ pgd = efi_pgd + pgd_index(PAGE_OFFSET);
|
||||
+ set_pgd(pgd, *pgd_offset_k(PAGE_OFFSET));
|
||||
+ pgd = efi_pgd + pgd_index(__START_KERNEL_map);
|
||||
+ set_pgd(pgd, *pgd_offset_k(__START_KERNEL_map));
|
||||
+}
|
||||
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||
index fb737bc..c4e310e 100644
|
||||
--- a/include/linux/efi.h
|
||||
+++ b/include/linux/efi.h
|
||||
@@ -290,6 +290,7 @@ extern void efi_map_pal_code (void);
|
||||
extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
|
||||
extern void efi_gettimeofday (struct timespec *ts);
|
||||
extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if possible */
|
||||
+extern void efi_setup_physical_mode(void);
|
||||
extern u64 efi_get_iobase (void);
|
||||
extern u32 efi_mem_type (unsigned long phys_addr);
|
||||
extern u64 efi_mem_attributes (unsigned long phys_addr);
|
||||
diff --git a/include/linux/init.h b/include/linux/init.h
|
||||
index 577671c..2f1b28f 100644
|
||||
--- a/include/linux/init.h
|
||||
+++ b/include/linux/init.h
|
||||
@@ -149,6 +149,7 @@ extern int do_one_initcall(initcall_t fn);
|
||||
extern char __initdata boot_command_line[];
|
||||
extern char *saved_command_line;
|
||||
extern unsigned int reset_devices;
|
||||
+extern unsigned int usevirtefi;
|
||||
|
||||
/* used by init/main.c */
|
||||
void setup_arch(char **);
|
||||
diff --git a/init/main.c b/init/main.c
|
||||
index 8646401..726025e 100644
|
||||
--- a/init/main.c
|
||||
+++ b/init/main.c
|
||||
@@ -196,6 +196,14 @@ static int __init set_reset_devices(char *str)
|
||||
|
||||
__setup("reset_devices", set_reset_devices);
|
||||
|
||||
+unsigned int usevirtefi;
|
||||
+static int __init set_virt_efi(char *str)
|
||||
+{
|
||||
+ usevirtefi = 1;
|
||||
+ return 1;
|
||||
+}
|
||||
+__setup("virtefi", set_virt_efi);
|
||||
+
|
||||
static const char * argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
|
||||
const char * envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };
|
||||
static const char *panic_later, *panic_param;
|
||||
@@ -668,8 +676,12 @@ asmlinkage void __init start_kernel(void)
|
||||
pidmap_init();
|
||||
anon_vma_init();
|
||||
#ifdef CONFIG_X86
|
||||
- if (efi_enabled)
|
||||
- efi_enter_virtual_mode();
|
||||
+ if (efi_enabled) {
|
||||
+ if (usevirtefi)
|
||||
+ efi_enter_virtual_mode();
|
||||
+ else
|
||||
+ efi_setup_physical_mode();
|
||||
+ }
|
||||
#endif
|
||||
thread_info_cache_init();
|
||||
cred_init();
|
|
@ -0,0 +1,217 @@
|
|||
Fix up efifb so it works properly on the 11" Macbook Air. Upstream in .38?
|
||||
|
||||
diff --git a/drivers/video/efifb.c b/drivers/video/efifb.c
|
||||
index 70477c2..476ffb1 100644
|
||||
--- a/drivers/video/efifb.c
|
||||
+++ b/drivers/video/efifb.c
|
||||
@@ -53,6 +53,7 @@ enum {
|
||||
M_MB_7_1, /* MacBook, 7th rev. */
|
||||
M_MB_SR, /* MacBook, 2nd gen, (Santa Rosa) */
|
||||
M_MBA, /* MacBook Air */
|
||||
+ M_MBA_3, /* Macbook Air, 3rd rev */
|
||||
M_MBP, /* MacBook Pro */
|
||||
M_MBP_2, /* MacBook Pro 2nd gen */
|
||||
M_MBP_2_2, /* MacBook Pro 2,2nd gen */
|
||||
@@ -67,40 +68,49 @@ enum {
|
||||
M_UNKNOWN /* placeholder */
|
||||
};
|
||||
|
||||
+#define OVERRIDE_NONE 0x0
|
||||
+#define OVERRIDE_BASE 0x1
|
||||
+#define OVERRIDE_STRIDE 0x2
|
||||
+#define OVERRIDE_HEIGHT 0x4
|
||||
+#define OVERRIDE_WIDTH 0x8
|
||||
+
|
||||
static struct efifb_dmi_info {
|
||||
char *optname;
|
||||
unsigned long base;
|
||||
int stride;
|
||||
int width;
|
||||
int height;
|
||||
+ int flags;
|
||||
} dmi_list[] __initdata = {
|
||||
- [M_I17] = { "i17", 0x80010000, 1472 * 4, 1440, 900 },
|
||||
- [M_I20] = { "i20", 0x80010000, 1728 * 4, 1680, 1050 }, /* guess */
|
||||
- [M_I20_SR] = { "imac7", 0x40010000, 1728 * 4, 1680, 1050 },
|
||||
- [M_I24] = { "i24", 0x80010000, 2048 * 4, 1920, 1200 }, /* guess */
|
||||
- [M_I24_8_1] = { "imac8", 0xc0060000, 2048 * 4, 1920, 1200 },
|
||||
- [M_I24_10_1] = { "imac10", 0xc0010000, 2048 * 4, 1920, 1080 },
|
||||
- [M_I27_11_1] = { "imac11", 0xc0010000, 2560 * 4, 2560, 1440 },
|
||||
- [M_MINI]= { "mini", 0x80000000, 2048 * 4, 1024, 768 },
|
||||
- [M_MINI_3_1] = { "mini31", 0x40010000, 1024 * 4, 1024, 768 },
|
||||
- [M_MINI_4_1] = { "mini41", 0xc0010000, 2048 * 4, 1920, 1200 },
|
||||
- [M_MB] = { "macbook", 0x80000000, 2048 * 4, 1280, 800 },
|
||||
- [M_MB_5_1] = { "macbook51", 0x80010000, 2048 * 4, 1280, 800 },
|
||||
- [M_MB_6_1] = { "macbook61", 0x80010000, 2048 * 4, 1280, 800 },
|
||||
- [M_MB_7_1] = { "macbook71", 0x80010000, 2048 * 4, 1280, 800 },
|
||||
- [M_MBA] = { "mba", 0x80000000, 2048 * 4, 1280, 800 },
|
||||
- [M_MBP] = { "mbp", 0x80010000, 1472 * 4, 1440, 900 },
|
||||
- [M_MBP_2] = { "mbp2", 0, 0, 0, 0 }, /* placeholder */
|
||||
- [M_MBP_2_2] = { "mbp22", 0x80010000, 1472 * 4, 1440, 900 },
|
||||
- [M_MBP_SR] = { "mbp3", 0x80030000, 2048 * 4, 1440, 900 },
|
||||
- [M_MBP_4] = { "mbp4", 0xc0060000, 2048 * 4, 1920, 1200 },
|
||||
- [M_MBP_5_1] = { "mbp51", 0xc0010000, 2048 * 4, 1440, 900 },
|
||||
- [M_MBP_5_2] = { "mbp52", 0xc0010000, 2048 * 4, 1920, 1200 },
|
||||
- [M_MBP_5_3] = { "mbp53", 0xd0010000, 2048 * 4, 1440, 900 },
|
||||
- [M_MBP_6_1] = { "mbp61", 0x90030000, 2048 * 4, 1920, 1200 },
|
||||
- [M_MBP_6_2] = { "mbp62", 0x90030000, 2048 * 4, 1680, 1050 },
|
||||
- [M_MBP_7_1] = { "mbp71", 0xc0010000, 2048 * 4, 1280, 800 },
|
||||
- [M_UNKNOWN] = { NULL, 0, 0, 0, 0 }
|
||||
+ [M_I17] = { "i17", 0x80010000, 1472 * 4, 1440, 900, OVERRIDE_NONE },
|
||||
+ [M_I20] = { "i20", 0x80010000, 1728 * 4, 1680, 1050, OVERRIDE_NONE }, /* guess */
|
||||
+ [M_I20_SR] = { "imac7", 0x40010000, 1728 * 4, 1680, 1050, OVERRIDE_NONE },
|
||||
+ [M_I24] = { "i24", 0x80010000, 2048 * 4, 1920, 1200, OVERRIDE_NONE }, /* guess */
|
||||
+ [M_I24_8_1] = { "imac8", 0xc0060000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
|
||||
+ [M_I24_10_1] = { "imac10", 0xc0010000, 2048 * 4, 1920, 1080, OVERRIDE_NONE },
|
||||
+ [M_I27_11_1] = { "imac11", 0xc0010000, 2560 * 4, 2560, 1440, OVERRIDE_NONE },
|
||||
+ [M_MINI]= { "mini", 0x80000000, 2048 * 4, 1024, 768, OVERRIDE_NONE },
|
||||
+ [M_MINI_3_1] = { "mini31", 0x40010000, 1024 * 4, 1024, 768, OVERRIDE_NONE },
|
||||
+ [M_MINI_4_1] = { "mini41", 0xc0010000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
|
||||
+ [M_MB] = { "macbook", 0x80000000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
|
||||
+ [M_MB_5_1] = { "macbook51", 0x80010000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
|
||||
+ [M_MB_6_1] = { "macbook61", 0x80010000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
|
||||
+ [M_MB_7_1] = { "macbook71", 0x80010000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
|
||||
+ [M_MBA] = { "mba", 0x80000000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
|
||||
+ /* 11" Macbook Air 3,1 passes the wrong stride */
|
||||
+ [M_MBA_3] = { "mba3", 0, 2048 * 4, 0, 0, OVERRIDE_STRIDE },
|
||||
+ [M_MBP] = { "mbp", 0x80010000, 1472 * 4, 1440, 900, OVERRIDE_NONE },
|
||||
+ [M_MBP_2] = { "mbp2", 0, 0, 0, 0, OVERRIDE_NONE }, /* placeholder */
|
||||
+ [M_MBP_2_2] = { "mbp22", 0x80010000, 1472 * 4, 1440, 900, OVERRIDE_NONE },
|
||||
+ [M_MBP_SR] = { "mbp3", 0x80030000, 2048 * 4, 1440, 900, OVERRIDE_NONE },
|
||||
+ [M_MBP_4] = { "mbp4", 0xc0060000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
|
||||
+ [M_MBP_5_1] = { "mbp51", 0xc0010000, 2048 * 4, 1440, 900, OVERRIDE_NONE },
|
||||
+ [M_MBP_5_2] = { "mbp52", 0xc0010000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
|
||||
+ [M_MBP_5_3] = { "mbp53", 0xd0010000, 2048 * 4, 1440, 900, OVERRIDE_NONE },
|
||||
+ [M_MBP_6_1] = { "mbp61", 0x90030000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
|
||||
+ [M_MBP_6_2] = { "mbp62", 0x90030000, 2048 * 4, 1680, 1050, OVERRIDE_NONE },
|
||||
+ [M_MBP_7_1] = { "mbp71", 0xc0010000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
|
||||
+ [M_UNKNOWN] = { NULL, 0, 0, 0, 0, OVERRIDE_NONE }
|
||||
};
|
||||
|
||||
static int set_system(const struct dmi_system_id *id);
|
||||
@@ -138,6 +148,7 @@ static const struct dmi_system_id dmi_system_table[] __initconst = {
|
||||
EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook6,1", M_MB_6_1),
|
||||
EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook7,1", M_MB_7_1),
|
||||
EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookAir1,1", M_MBA),
|
||||
+ EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookAir3,1", M_MBA_3),
|
||||
EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro1,1", M_MBP),
|
||||
EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro2,1", M_MBP_2),
|
||||
EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro2,2", M_MBP_2_2),
|
||||
@@ -154,16 +165,22 @@ static const struct dmi_system_id dmi_system_table[] __initconst = {
|
||||
{},
|
||||
};
|
||||
|
||||
+#define choose_value(dmivalue, fwvalue, field, flags) ({ \
|
||||
+ typeof(fwvalue) _ret_ = fwvalue; \
|
||||
+ if ((flags) & (field)) \
|
||||
+ _ret_ = dmivalue; \
|
||||
+ else if ((fwvalue) == 0) \
|
||||
+ _ret_ = dmivalue; \
|
||||
+ _ret_; \
|
||||
+ })
|
||||
+
|
||||
static int set_system(const struct dmi_system_id *id)
|
||||
{
|
||||
struct efifb_dmi_info *info = id->driver_data;
|
||||
- if (info->base == 0)
|
||||
- return 0;
|
||||
|
||||
- printk(KERN_INFO "efifb: dmi detected %s - framebuffer at %p "
|
||||
- "(%dx%d, stride %d)\n", id->ident,
|
||||
- (void *)info->base, info->width, info->height,
|
||||
- info->stride);
|
||||
+ if (info->base == 0 && info->height == 0 && info->width == 0
|
||||
+ && info->stride == 0)
|
||||
+ return 0;
|
||||
|
||||
/* Trust the bootloader over the DMI tables */
|
||||
if (screen_info.lfb_base == 0) {
|
||||
@@ -171,40 +188,47 @@ static int set_system(const struct dmi_system_id *id)
|
||||
struct pci_dev *dev = NULL;
|
||||
int found_bar = 0;
|
||||
#endif
|
||||
- screen_info.lfb_base = info->base;
|
||||
+ if (info->base) {
|
||||
+ screen_info.lfb_base = choose_value(info->base,
|
||||
+ screen_info.lfb_base, OVERRIDE_BASE,
|
||||
+ info->flags);
|
||||
|
||||
#if defined(CONFIG_PCI)
|
||||
- /* make sure that the address in the table is actually on a
|
||||
- * VGA device's PCI BAR */
|
||||
-
|
||||
- for_each_pci_dev(dev) {
|
||||
- int i;
|
||||
- if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
|
||||
- continue;
|
||||
- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
||||
- resource_size_t start, end;
|
||||
-
|
||||
- start = pci_resource_start(dev, i);
|
||||
- if (start == 0)
|
||||
- break;
|
||||
- end = pci_resource_end(dev, i);
|
||||
- if (screen_info.lfb_base >= start &&
|
||||
- screen_info.lfb_base < end) {
|
||||
- found_bar = 1;
|
||||
+ /* make sure that the address in the table is actually
|
||||
+ * on a VGA device's PCI BAR */
|
||||
+
|
||||
+ for_each_pci_dev(dev) {
|
||||
+ int i;
|
||||
+ if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
|
||||
+ continue;
|
||||
+ for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
||||
+ resource_size_t start, end;
|
||||
+
|
||||
+ start = pci_resource_start(dev, i);
|
||||
+ if (start == 0)
|
||||
+ break;
|
||||
+ end = pci_resource_end(dev, i);
|
||||
+ if (screen_info.lfb_base >= start &&
|
||||
+ screen_info.lfb_base < end) {
|
||||
+ found_bar = 1;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
- }
|
||||
- if (!found_bar)
|
||||
- screen_info.lfb_base = 0;
|
||||
+ if (!found_bar)
|
||||
+ screen_info.lfb_base = 0;
|
||||
#endif
|
||||
+ }
|
||||
}
|
||||
if (screen_info.lfb_base) {
|
||||
- if (screen_info.lfb_linelength == 0)
|
||||
- screen_info.lfb_linelength = info->stride;
|
||||
- if (screen_info.lfb_width == 0)
|
||||
- screen_info.lfb_width = info->width;
|
||||
- if (screen_info.lfb_height == 0)
|
||||
- screen_info.lfb_height = info->height;
|
||||
+ screen_info.lfb_linelength = choose_value(info->stride,
|
||||
+ screen_info.lfb_linelength, OVERRIDE_STRIDE,
|
||||
+ info->flags);
|
||||
+ screen_info.lfb_width = choose_value(info->width,
|
||||
+ screen_info.lfb_width, OVERRIDE_WIDTH,
|
||||
+ info->flags);
|
||||
+ screen_info.lfb_height = choose_value(info->height,
|
||||
+ screen_info.lfb_height, OVERRIDE_HEIGHT,
|
||||
+ info->flags);
|
||||
if (screen_info.orig_video_isVGA == 0)
|
||||
screen_info.orig_video_isVGA = VIDEO_TYPE_EFI;
|
||||
} else {
|
||||
@@ -214,6 +238,13 @@ static int set_system(const struct dmi_system_id *id)
|
||||
screen_info.orig_video_isVGA = 0;
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+ printk(KERN_INFO "efifb: dmi detected %s - framebuffer at %p "
|
||||
+ "(%dx%d, stride %d)\n", id->ident,
|
||||
+ (void *)screen_info.lfb_base, screen_info.lfb_width,
|
||||
+ screen_info.lfb_height, screen_info.lfb_linelength);
|
||||
+
|
||||
+
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
diff --git a/drivers/media/dvb/b2c2/flexcop-pci.c b/drivers/media/dvb/b2c2/flexcop-pci.c
|
||||
index 227c020..7465308 100644
|
||||
--- a/drivers/media/dvb/b2c2/flexcop-pci.c
|
||||
+++ b/drivers/media/dvb/b2c2/flexcop-pci.c
|
||||
@@ -39,6 +39,7 @@ MODULE_PARM_DESC(debug,
|
||||
|
||||
#define DRIVER_VERSION "0.1"
|
||||
#define DRIVER_NAME "Technisat/B2C2 FlexCop II/IIb/III Digital TV PCI Driver"
|
||||
+#define FLEXCOP_MODULE_NAME "b2c2-flexcop"
|
||||
#define DRIVER_AUTHOR "Patrick Boettcher <patrick.boettcher@desy.de>"
|
||||
|
||||
struct flexcop_pci {
|
||||
@@ -299,7 +300,7 @@ static int flexcop_pci_init(struct flexcop_pci *fc_pci)
|
||||
return ret;
|
||||
pci_set_master(fc_pci->pdev);
|
||||
|
||||
- if ((ret = pci_request_regions(fc_pci->pdev, DRIVER_NAME)) != 0)
|
||||
+ if ((ret = pci_request_regions(fc_pci->pdev, FLEXCOP_MODULE_NAME)) != 0)
|
||||
goto err_pci_disable_device;
|
||||
|
||||
fc_pci->io_mem = pci_iomap(fc_pci->pdev, 0, 0x800);
|
||||
@@ -313,7 +314,7 @@ static int flexcop_pci_init(struct flexcop_pci *fc_pci)
|
||||
pci_set_drvdata(fc_pci->pdev, fc_pci);
|
||||
spin_lock_init(&fc_pci->irq_lock);
|
||||
if ((ret = request_irq(fc_pci->pdev->irq, flexcop_pci_isr,
|
||||
- IRQF_SHARED, DRIVER_NAME, fc_pci)) != 0)
|
||||
+ IRQF_SHARED, FLEXCOP_MODULE_NAME, fc_pci)) != 0)
|
||||
goto err_pci_iounmap;
|
||||
|
||||
fc_pci->init_state |= FC_PCI_INIT;
|
|
@ -0,0 +1,65 @@
|
|||
From linux-fsdevel-owner@vger.kernel.org Thu Nov 18 21:03:11 2010
|
||||
From: Josef Bacik <josef@redhat.com>
|
||||
To: linux-fsdevel@vger.kernel.org, eparis@redhat.com,
|
||||
linux-kernel@vger.kernel.org, sds@tycho.nsa.gov,
|
||||
selinux@tycho.nsa.gov, bfields@fieldses.org
|
||||
Subject: [PATCH] fs: call security_d_instantiate in d_obtain_alias V2
|
||||
Date: Thu, 18 Nov 2010 20:52:55 -0500
|
||||
Message-Id: <1290131575-2489-1-git-send-email-josef@redhat.com>
|
||||
X-Mailing-List: linux-fsdevel@vger.kernel.org
|
||||
|
||||
While trying to track down some NFS problems with BTRFS, I kept noticing I was
|
||||
getting -EACCESS for no apparent reason. Eric Paris and printk() helped me
|
||||
figure out that it was SELinux that was giving me grief, with the following
|
||||
denial
|
||||
|
||||
type=AVC msg=audit(1290013638.413:95): avc: denied { 0x800000 } for pid=1772
|
||||
comm="nfsd" name="" dev=sda1 ino=256 scontext=system_u:system_r:kernel_t:s0
|
||||
tcontext=system_u:object_r:unlabeled_t:s0 tclass=file
|
||||
|
||||
Turns out this is because in d_obtain_alias if we can't find an alias we create
|
||||
one and do all the normal instantiation stuff, but we don't do the
|
||||
security_d_instantiate.
|
||||
|
||||
Usually we are protected from getting a hashed dentry that hasn't yet run
|
||||
security_d_instantiate() by the parent's i_mutex, but obviously this isn't an
|
||||
option there, so in order to deal with the case that a second thread comes in
|
||||
and finds our new dentry before we get to run security_d_instantiate(), we go
|
||||
ahead and call it if we find a dentry already. Eric assures me that this is ok
|
||||
as the code checks to see if the dentry has been initialized already so calling
|
||||
security_d_instantiate() against the same dentry multiple times is ok. With
|
||||
this patch I'm no longer getting errant -EACCESS values.
|
||||
|
||||
Signed-off-by: Josef Bacik <josef@redhat.com>
|
||||
---
|
||||
V1->V2:
|
||||
-added second security_d_instantiate() call
|
||||
|
||||
fs/dcache.c | 3 +++
|
||||
1 files changed, 3 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/fs/dcache.c b/fs/dcache.c
|
||||
index 23702a9..119d489 100644
|
||||
--- a/fs/dcache.c
|
||||
+++ b/fs/dcache.c
|
||||
@@ -1201,9 +1201,12 @@ struct dentry *d_obtain_alias(struct inode *inode)
|
||||
spin_unlock(&tmp->d_lock);
|
||||
|
||||
spin_unlock(&dcache_lock);
|
||||
+ security_d_instantiate(tmp, inode);
|
||||
return tmp;
|
||||
|
||||
out_iput:
|
||||
+ if (res && !IS_ERR(res))
|
||||
+ security_d_instantiate(res, inode);
|
||||
iput(inode);
|
||||
return res;
|
||||
}
|
||||
--
|
||||
1.6.6.1
|
||||
|
||||
--
|
||||
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
|
||||
the body of a message to majordomo@vger.kernel.org
|
||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
||||
|
80
kernel.spec
80
kernel.spec
|
@ -52,7 +52,7 @@ Summary: The Linux kernel
|
|||
# For non-released -rc kernels, this will be prepended with "0.", so
|
||||
# for example a 3 here will become 0.3
|
||||
#
|
||||
%global baserelease 1
|
||||
%global baserelease 2
|
||||
%global fedora_build %{baserelease}
|
||||
|
||||
# base_sublevel is the kernel version we're starting with and patching
|
||||
|
@ -83,9 +83,9 @@ Summary: The Linux kernel
|
|||
# The next upstream release sublevel (base_sublevel+1)
|
||||
%define upstream_sublevel %(echo $((%{base_sublevel} + 1)))
|
||||
# The rc snapshot level
|
||||
%define rcrev 5
|
||||
%define rcrev 7
|
||||
# The git snapshot level
|
||||
%define gitrev 2
|
||||
%define gitrev 0
|
||||
# Set rpm version accordingly
|
||||
%define rpmversion 2.6.%{upstream_sublevel}
|
||||
%endif
|
||||
|
@ -129,7 +129,7 @@ Summary: The Linux kernel
|
|||
%define doc_build_fail true
|
||||
%endif
|
||||
|
||||
%define rawhide_skip_docs 1
|
||||
%define rawhide_skip_docs 0
|
||||
%if 0%{?rawhide_skip_docs}
|
||||
%define with_doc 0
|
||||
%define doc_build_fail true
|
||||
|
@ -150,7 +150,7 @@ Summary: The Linux kernel
|
|||
# Set debugbuildsenabled to 1 for production (build separate debug kernels)
|
||||
# and 0 for rawhide (all kernels are debug kernels).
|
||||
# See also 'make debug' and 'make release'.
|
||||
%define debugbuildsenabled 0
|
||||
%define debugbuildsenabled 1
|
||||
|
||||
# Want to build a vanilla kernel build without any non-upstream patches?
|
||||
%define with_vanilla %{?_with_vanilla: 1} %{?!_with_vanilla: 0}
|
||||
|
@ -683,6 +683,8 @@ Patch2912: linux-2.6-v4l-dvb-ir-core-update.patch
|
|||
#Patch2916: lirc-staging-2.6.36-fixes.patch
|
||||
Patch2917: hdpvr-ir-enable.patch
|
||||
|
||||
Patch2918: flexcop-fix-xlate_proc_name-warning.patch
|
||||
|
||||
# fs fixes
|
||||
|
||||
# NFSv4
|
||||
|
@ -699,6 +701,13 @@ Patch12018: neuter_intel_microcode_load.patch
|
|||
|
||||
Patch12030: tpm-fix-stall-on-boot.patch
|
||||
|
||||
Patch12100: applesmc_update.patch
|
||||
Patch12101: apple_backlight.patch
|
||||
Patch12102: efifb_update.patch
|
||||
Patch12103: linux-next-macbook-air-input.patch
|
||||
Patch12200: acpi_reboot.patch
|
||||
Patch12210: efi_default_physical.patch
|
||||
|
||||
# Runtime power management
|
||||
Patch12203: linux-2.6-usb-pci-autosuspend.patch
|
||||
Patch12204: linux-2.6-enable-more-pci-autosuspend.patch
|
||||
|
@ -711,10 +720,9 @@ Patch12401: debug-tty-print-dev-name.patch
|
|||
Patch12410: mm-page-allocator-adjust-the-per-cpu-counter-threshold-when-memory-is-low.patch
|
||||
Patch12411: mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch
|
||||
|
||||
# rhbz#650934
|
||||
Patch12420: sched-cure-more-NO_HZ-load-average-woes.patch
|
||||
Patch12421: fs-call-security_d_instantiate-in-d_obtain_alias.patch
|
||||
|
||||
Patch12421: orinoco-initialise-priv_hw-before-assigning-the-interrupt.patch
|
||||
Patch12422: net-AF_PACKET-vmalloc.patch
|
||||
|
||||
# Xen patches
|
||||
# git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git branches
|
||||
|
@ -1299,6 +1307,9 @@ ApplyOptionalPatch linux-2.6-v4l-dvb-experimental.patch
|
|||
# enable IR receiver on Hauppauge HD PVR (v4l-dvb merge pending)
|
||||
ApplyPatch hdpvr-ir-enable.patch
|
||||
|
||||
# rhbz#664852
|
||||
ApplyPatch flexcop-fix-xlate_proc_name-warning.patch
|
||||
|
||||
# Patches headed upstream
|
||||
ApplyPatch disable-i8042-check-on-apple-mac.patch
|
||||
|
||||
|
@ -1309,6 +1320,14 @@ ApplyPatch neuter_intel_microcode_load.patch
|
|||
# try to fix stalls during boot (#530393)
|
||||
ApplyPatch tpm-fix-stall-on-boot.patch
|
||||
|
||||
# various fixes for Apple and EFI
|
||||
ApplyPatch applesmc_update.patch
|
||||
ApplyPatch apple_backlight.patch
|
||||
ApplyPatch efifb_update.patch
|
||||
ApplyPatch linux-next-macbook-air-input.patch
|
||||
ApplyPatch acpi_reboot.patch
|
||||
ApplyPatch efi_default_physical.patch
|
||||
|
||||
# Runtime PM
|
||||
ApplyPatch linux-2.6-usb-pci-autosuspend.patch
|
||||
ApplyPatch linux-2.6-enable-more-pci-autosuspend.patch
|
||||
|
@ -1324,11 +1343,11 @@ ApplyPatch debug-tty-print-dev-name.patch
|
|||
ApplyPatch mm-page-allocator-adjust-the-per-cpu-counter-threshold-when-memory-is-low.patch
|
||||
ApplyPatch mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch
|
||||
|
||||
# rhbz#650934
|
||||
ApplyPatch sched-cure-more-NO_HZ-load-average-woes.patch
|
||||
# rhbz#662344,600690
|
||||
ApplyPatch fs-call-security_d_instantiate-in-d_obtain_alias.patch
|
||||
|
||||
# rhbz657864
|
||||
ApplyPatch orinoco-initialise-priv_hw-before-assigning-the-interrupt.patch
|
||||
# rhbz#637619
|
||||
ApplyPatch net-AF_PACKET-vmalloc.patch
|
||||
|
||||
# Xen patches
|
||||
ApplyPatch xen.next-2.6.37.patch
|
||||
|
@ -1949,6 +1968,43 @@ fi
|
|||
# || ||
|
||||
|
||||
%changelog
|
||||
* Thu Dec 23 2010 Kyle McMartin <kyle@redhat.com>
|
||||
- Pull in flexcop procfs rename patch since it's still not upstream. (#664852)
|
||||
|
||||
* Tue Dec 21 2010 Kyle McMartin <kyle@redhat.com> 2.6.37.0.rc7.git0.2
|
||||
- Linux 2.6.37-rc7
|
||||
- CONFIG_USB_OTG=n (seems unnecessary?)
|
||||
- Enable release builds until .37 releases in rawhide.
|
||||
|
||||
* Sun Dec 19 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc6.git5.1
|
||||
- Linux 2.6.37-rc6-git5
|
||||
- sched-cure-more-NO_HZ-load-average-woes.patch: upstream.
|
||||
|
||||
* Sat Dec 18 2010 Kyle McMartin <kyle@redhat.com>
|
||||
- Patch from nhorman against f13:
|
||||
Enhance AF_PACKET to allow non-contiguous buffer alloc (#637619)
|
||||
|
||||
* Sat Dec 18 2010 Kyle McMartin <kyle@redhat.com>
|
||||
- Fix SELinux issues with NFS/btrfs and/or xfsdump. (#662344)
|
||||
|
||||
* Fri Dec 17 2010 Matthew Garrett <mjg@redhat.com> 2.6.37-0.rc6.git0.3
|
||||
- efi_default_physical.patch: Revert hunk that breaks boot
|
||||
- linux-next-macbook-air-input.patch: Add input support for new Macbook Airs
|
||||
|
||||
* Thu Dec 16 2010 Matthew Garrett <mjg@redhat.com> 2.6.37-0.rc6.git0.2
|
||||
- applesmc_update.patch: Make the driver more generic. Should help Apples.
|
||||
- apple_backlight.patch: Make sure that this loads on all hardware.
|
||||
- efifb_update.patch: Fixes for the 11 inch Macbook Air
|
||||
- acpi_reboot.patch: Should make reboot work better on most hardware
|
||||
- efi_default_physical.patch: Some machines dislike EFI virtual mode
|
||||
|
||||
* Wed Dec 15 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc6.git0.1
|
||||
- Linux 2.6.37-rc6
|
||||
- Re-activate acpi patch which rejected on the previous commit.
|
||||
|
||||
* Wed Dec 15 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc5.git5.1
|
||||
- 2.6.37-rc5-git5
|
||||
|
||||
* Tue Dec 14 2010 Michael Young <m.a.young@durham.ac.uk>
|
||||
- test an irq patch in xen.pcifront.fixes.patch
|
||||
|
||||
|
|
|
@ -0,0 +1,185 @@
|
|||
Support for USB HID devices on the new Macbook Airs. From -next.
|
||||
|
||||
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
|
||||
index eaeca56..6c52203 100644
|
||||
--- a/drivers/hid/hid-apple.c
|
||||
+++ b/drivers/hid/hid-apple.c
|
||||
@@ -59,6 +59,27 @@ struct apple_key_translation {
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
+static const struct apple_key_translation macbookair_fn_keys[] = {
|
||||
+ { KEY_BACKSPACE, KEY_DELETE },
|
||||
+ { KEY_ENTER, KEY_INSERT },
|
||||
+ { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
|
||||
+ { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY },
|
||||
+ { KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY },
|
||||
+ { KEY_F4, KEY_DASHBOARD, APPLE_FLAG_FKEY },
|
||||
+ { KEY_F6, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY },
|
||||
+ { KEY_F7, KEY_PLAYPAUSE, APPLE_FLAG_FKEY },
|
||||
+ { KEY_F8, KEY_NEXTSONG, APPLE_FLAG_FKEY },
|
||||
+ { KEY_F9, KEY_MUTE, APPLE_FLAG_FKEY },
|
||||
+ { KEY_F10, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY },
|
||||
+ { KEY_F11, KEY_VOLUMEUP, APPLE_FLAG_FKEY },
|
||||
+ { KEY_F12, KEY_EJECTCD, APPLE_FLAG_FKEY },
|
||||
+ { KEY_UP, KEY_PAGEUP },
|
||||
+ { KEY_DOWN, KEY_PAGEDOWN },
|
||||
+ { KEY_LEFT, KEY_HOME },
|
||||
+ { KEY_RIGHT, KEY_END },
|
||||
+ { }
|
||||
+};
|
||||
+
|
||||
static const struct apple_key_translation apple_fn_keys[] = {
|
||||
{ KEY_BACKSPACE, KEY_DELETE },
|
||||
{ KEY_ENTER, KEY_INSERT },
|
||||
@@ -157,10 +178,15 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
|
||||
if (fnmode) {
|
||||
int do_translate;
|
||||
|
||||
- trans = apple_find_translation((hid->product < 0x21d ||
|
||||
- hid->product >= 0x300) ?
|
||||
- powerbook_fn_keys : apple_fn_keys,
|
||||
- usage->code);
|
||||
+ if(hid->product >= USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI &&
|
||||
+ hid->product <= USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) {
|
||||
+ trans = apple_find_translation(macbookair_fn_keys, usage->code);
|
||||
+ } else if (hid->product < 0x21d || hid->product >= 0x300) {
|
||||
+ trans = apple_find_translation(powerbook_fn_keys, usage->code);
|
||||
+ } else {
|
||||
+ trans = apple_find_translation(apple_fn_keys, usage->code);
|
||||
+ }
|
||||
+
|
||||
if (trans) {
|
||||
if (test_bit(usage->code, asc->pressed_fn))
|
||||
do_translate = 1;
|
||||
@@ -436,6 +462,18 @@ static const struct hid_device_id apple_devices[] = {
|
||||
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI),
|
||||
+ .driver_data = APPLE_HAS_FN },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO),
|
||||
+ .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS),
|
||||
+ .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI),
|
||||
+ .driver_data = APPLE_HAS_FN },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO),
|
||||
+ .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS),
|
||||
+ .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI),
|
||||
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),
|
||||
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
|
||||
index b3393e1..53ac909 100644
|
||||
--- a/drivers/hid/hid-core.c
|
||||
+++ b/drivers/hid/hid-core.c
|
||||
@@ -1274,6 +1274,12 @@ static const struct hid_device_id hid_blacklist[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) },
|
||||
@@ -1760,6 +1766,12 @@ static const struct hid_device_id hid_mouse_ignore_list[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
|
||||
{ }
|
||||
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
||||
index 68114db..104b9f9 100644
|
||||
--- a/drivers/hid/hid-ids.h
|
||||
+++ b/drivers/hid/hid-ids.h
|
||||
@@ -97,6 +97,12 @@
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238
|
||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI 0x023f
|
||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_ISO 0x0240
|
||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_JIS 0x0241
|
||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI 0x0242
|
||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO 0x0243
|
||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS 0x0244
|
||||
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239
|
||||
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a
|
||||
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b
|
||||
|
||||
diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c
|
||||
index b952317..ee82851 100644
|
||||
--- a/drivers/input/mouse/bcm5974.c
|
||||
+++ b/drivers/input/mouse/bcm5974.c
|
||||
@@ -55,6 +55,14 @@
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238
|
||||
+/* MacbookAir3,2 (unibody), aka wellspring5 */
|
||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI 0x023f
|
||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_ISO 0x0240
|
||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_JIS 0x0241
|
||||
+/* MacbookAir3,1 (unibody), aka wellspring4 */
|
||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI 0x0242
|
||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO 0x0243
|
||||
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS 0x0244
|
||||
|
||||
#define BCM5974_DEVICE(prod) { \
|
||||
.match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \
|
||||
@@ -80,6 +88,14 @@ static const struct usb_device_id bcm5974_table[] = {
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI),
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_ISO),
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_JIS),
|
||||
+ /* MacbookAir3,2 */
|
||||
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI),
|
||||
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_ISO),
|
||||
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_JIS),
|
||||
+ /* MacbookAir3,1 */
|
||||
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI),
|
||||
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO),
|
||||
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS),
|
||||
/* Terminating entry */
|
||||
{}
|
||||
};
|
||||
@@ -234,6 +250,30 @@ static const struct bcm5974_config bcm5974_config_table[] = {
|
||||
{ DIM_X, DIM_X / SN_COORD, -4460, 5166 },
|
||||
{ DIM_Y, DIM_Y / SN_COORD, -75, 6700 }
|
||||
},
|
||||
+ {
|
||||
+ USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI,
|
||||
+ USB_DEVICE_ID_APPLE_WELLSPRING4_ISO,
|
||||
+ USB_DEVICE_ID_APPLE_WELLSPRING4_JIS,
|
||||
+ HAS_INTEGRATED_BUTTON,
|
||||
+ 0x84, sizeof(struct bt_data),
|
||||
+ 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS,
|
||||
+ { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 300 },
|
||||
+ { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
|
||||
+ { DIM_X, DIM_X / SN_COORD, -4620, 5140 },
|
||||
+ { DIM_Y, DIM_Y / SN_COORD, -150, 6600 }
|
||||
+ },
|
||||
+ {
|
||||
+ USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI,
|
||||
+ USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO,
|
||||
+ USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS,
|
||||
+ HAS_INTEGRATED_BUTTON,
|
||||
+ 0x84, sizeof(struct bt_data),
|
||||
+ 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS,
|
||||
+ { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 300 },
|
||||
+ { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
|
||||
+ { DIM_X, DIM_X / SN_COORD, -4616, 5112 },
|
||||
+ { DIM_Y, DIM_Y / SN_COORD, -142, 5234 }
|
||||
+ },
|
||||
{}
|
||||
};
|
|
@ -0,0 +1,254 @@
|
|||
Author: Neil Horman <nhorman@tuxdriver.com>
|
||||
Date: Fri Dec 17 13:35:36 2010 -0500
|
||||
|
||||
Enhance AF_PACKET to support using non-contiguous memory when allocating ring
|
||||
buffer space. This is a combined backport of the following commits from
|
||||
net-next-2.6:
|
||||
0e3125c755445664f00ad036e4fc2cd32fd52877
|
||||
bbce5a59e4e0e6e1dbc85492caaf310ff6611309
|
||||
0af55bb58f8fa7865004ac48d16affe125ac1b7f
|
||||
920b8d913bd3d963d5c88bca160a272b71e0c95a
|
||||
|
||||
diff -up linux-2.6.34.x86_64/net/packet/af_packet.c.orig linux-2.6.34.x86_64/net/packet/af_packet.c
|
||||
--- linux-2.6.34.x86_64/net/packet/af_packet.c.orig 2010-12-17 12:16:58.000000000 -0500
|
||||
+++ linux-2.6.34.x86_64/net/packet/af_packet.c 2010-12-17 12:30:14.000000000 -0500
|
||||
@@ -61,6 +61,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kmod.h>
|
||||
#include <linux/slab.h>
|
||||
+#include <linux/vmalloc.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <net/ip.h>
|
||||
#include <net/protocol.h>
|
||||
@@ -161,8 +162,14 @@ struct packet_mreq_max {
|
||||
static int packet_set_ring(struct sock *sk, struct tpacket_req *req,
|
||||
int closing, int tx_ring);
|
||||
|
||||
+#define PGV_FROM_VMALLOC 1
|
||||
+struct pgv {
|
||||
+ char *buffer;
|
||||
+ unsigned char flags;
|
||||
+};
|
||||
+
|
||||
struct packet_ring_buffer {
|
||||
- char **pg_vec;
|
||||
+ struct pgv *pg_vec;
|
||||
unsigned int head;
|
||||
unsigned int frames_per_block;
|
||||
unsigned int frame_size;
|
||||
@@ -214,6 +221,13 @@ struct packet_skb_cb {
|
||||
|
||||
#define PACKET_SKB_CB(__skb) ((struct packet_skb_cb *)((__skb)->cb))
|
||||
|
||||
+static inline struct page *pgv_to_page(void *addr)
|
||||
+{
|
||||
+ if (is_vmalloc_addr(addr))
|
||||
+ return vmalloc_to_page(addr);
|
||||
+ return virt_to_page(addr);
|
||||
+}
|
||||
+
|
||||
static void __packet_set_status(struct packet_sock *po, void *frame, int status)
|
||||
{
|
||||
union {
|
||||
@@ -226,11 +240,11 @@ static void __packet_set_status(struct p
|
||||
switch (po->tp_version) {
|
||||
case TPACKET_V1:
|
||||
h.h1->tp_status = status;
|
||||
- flush_dcache_page(virt_to_page(&h.h1->tp_status));
|
||||
+ flush_dcache_page(pgv_to_page(&h.h1->tp_status));
|
||||
break;
|
||||
case TPACKET_V2:
|
||||
h.h2->tp_status = status;
|
||||
- flush_dcache_page(virt_to_page(&h.h2->tp_status));
|
||||
+ flush_dcache_page(pgv_to_page(&h.h2->tp_status));
|
||||
break;
|
||||
default:
|
||||
pr_err("TPACKET version not supported\n");
|
||||
@@ -253,10 +267,10 @@ static int __packet_get_status(struct pa
|
||||
h.raw = frame;
|
||||
switch (po->tp_version) {
|
||||
case TPACKET_V1:
|
||||
- flush_dcache_page(virt_to_page(&h.h1->tp_status));
|
||||
+ flush_dcache_page(pgv_to_page(&h.h1->tp_status));
|
||||
return h.h1->tp_status;
|
||||
case TPACKET_V2:
|
||||
- flush_dcache_page(virt_to_page(&h.h2->tp_status));
|
||||
+ flush_dcache_page(pgv_to_page(&h.h2->tp_status));
|
||||
return h.h2->tp_status;
|
||||
default:
|
||||
pr_err("TPACKET version not supported\n");
|
||||
@@ -280,7 +294,8 @@ static void *packet_lookup_frame(struct
|
||||
pg_vec_pos = position / rb->frames_per_block;
|
||||
frame_offset = position % rb->frames_per_block;
|
||||
|
||||
- h.raw = rb->pg_vec[pg_vec_pos] + (frame_offset * rb->frame_size);
|
||||
+ h.raw = rb->pg_vec[pg_vec_pos].buffer +
|
||||
+ (frame_offset * rb->frame_size);
|
||||
|
||||
if (status != __packet_get_status(po, h.raw))
|
||||
return NULL;
|
||||
@@ -771,15 +786,11 @@ static int tpacket_rcv(struct sk_buff *s
|
||||
__packet_set_status(po, h.raw, status);
|
||||
smp_mb();
|
||||
{
|
||||
- struct page *p_start, *p_end;
|
||||
- u8 *h_end = h.raw + macoff + snaplen - 1;
|
||||
+ u8 *start, *end;
|
||||
|
||||
- p_start = virt_to_page(h.raw);
|
||||
- p_end = virt_to_page(h_end);
|
||||
- while (p_start <= p_end) {
|
||||
- flush_dcache_page(p_start);
|
||||
- p_start++;
|
||||
- }
|
||||
+ end = (u8 *)PAGE_ALIGN((unsigned long)h.raw + macoff + snaplen);
|
||||
+ for (start = h.raw; start < end; start += PAGE_SIZE)
|
||||
+ flush_dcache_page(pgv_to_page(start));
|
||||
}
|
||||
|
||||
sk->sk_data_ready(sk, 0);
|
||||
@@ -886,7 +897,6 @@ static int tpacket_fill_skb(struct packe
|
||||
}
|
||||
|
||||
err = -EFAULT;
|
||||
- page = virt_to_page(data);
|
||||
offset = offset_in_page(data);
|
||||
len_max = PAGE_SIZE - offset;
|
||||
len = ((to_write > len_max) ? len_max : to_write);
|
||||
@@ -905,11 +915,11 @@ static int tpacket_fill_skb(struct packe
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
+ page = pgv_to_page(data);
|
||||
+ data += len;
|
||||
flush_dcache_page(page);
|
||||
get_page(page);
|
||||
- skb_fill_page_desc(skb,
|
||||
- nr_frags,
|
||||
- page++, offset, len);
|
||||
+ skb_fill_page_desc(skb, nr_frags, page, offset, len);
|
||||
to_write -= len;
|
||||
offset = 0;
|
||||
len_max = PAGE_SIZE;
|
||||
@@ -2230,37 +2240,76 @@ static const struct vm_operations_struct
|
||||
.close = packet_mm_close,
|
||||
};
|
||||
|
||||
-static void free_pg_vec(char **pg_vec, unsigned int order, unsigned int len)
|
||||
+static void free_pg_vec(struct pgv *pg_vec, unsigned int order,
|
||||
+ unsigned int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
- if (likely(pg_vec[i]))
|
||||
- free_pages((unsigned long) pg_vec[i], order);
|
||||
+ if (likely(pg_vec[i].buffer)) {
|
||||
+ if (pg_vec[i].flags & PGV_FROM_VMALLOC)
|
||||
+ vfree(pg_vec[i].buffer);
|
||||
+ else
|
||||
+ free_pages((unsigned long)pg_vec[i].buffer,
|
||||
+ order);
|
||||
+ pg_vec[i].buffer = NULL;
|
||||
+ }
|
||||
}
|
||||
kfree(pg_vec);
|
||||
}
|
||||
|
||||
-static inline char *alloc_one_pg_vec_page(unsigned long order)
|
||||
+static inline char *alloc_one_pg_vec_page(unsigned long order,
|
||||
+ unsigned char *flags)
|
||||
{
|
||||
- gfp_t gfp_flags = GFP_KERNEL | __GFP_COMP | __GFP_ZERO | __GFP_NOWARN;
|
||||
+ char *buffer = NULL;
|
||||
+ gfp_t gfp_flags = GFP_KERNEL | __GFP_COMP |
|
||||
+ __GFP_ZERO | __GFP_NOWARN | __GFP_NORETRY;
|
||||
+
|
||||
+ buffer = (char *) __get_free_pages(gfp_flags, order);
|
||||
|
||||
- return (char *) __get_free_pages(gfp_flags, order);
|
||||
+ if (buffer)
|
||||
+ return buffer;
|
||||
+
|
||||
+ /*
|
||||
+ * __get_free_pages failed, fall back to vmalloc
|
||||
+ */
|
||||
+ *flags |= PGV_FROM_VMALLOC;
|
||||
+ buffer = vmalloc((1 << order) * PAGE_SIZE);
|
||||
+
|
||||
+ if (buffer) {
|
||||
+ memset(buffer, 0, (1 << order) * PAGE_SIZE);
|
||||
+ return buffer;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * vmalloc failed, lets dig into swap here
|
||||
+ */
|
||||
+ *flags = 0;
|
||||
+ gfp_flags &= ~__GFP_NORETRY;
|
||||
+ buffer = (char *)__get_free_pages(gfp_flags, order);
|
||||
+ if (buffer)
|
||||
+ return buffer;
|
||||
+
|
||||
+ /*
|
||||
+ * complete and utter failure
|
||||
+ */
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
-static char **alloc_pg_vec(struct tpacket_req *req, int order)
|
||||
+static struct pgv *alloc_pg_vec(struct tpacket_req *req, int order)
|
||||
{
|
||||
unsigned int block_nr = req->tp_block_nr;
|
||||
- char **pg_vec;
|
||||
+ struct pgv *pg_vec;
|
||||
int i;
|
||||
|
||||
- pg_vec = kzalloc(block_nr * sizeof(char *), GFP_KERNEL);
|
||||
+ pg_vec = kcalloc(block_nr, sizeof(struct pgv), GFP_KERNEL);
|
||||
if (unlikely(!pg_vec))
|
||||
goto out;
|
||||
|
||||
for (i = 0; i < block_nr; i++) {
|
||||
- pg_vec[i] = alloc_one_pg_vec_page(order);
|
||||
- if (unlikely(!pg_vec[i]))
|
||||
+ pg_vec[i].buffer = alloc_one_pg_vec_page(order,
|
||||
+ &pg_vec[i].flags);
|
||||
+ if (unlikely(!pg_vec[i].buffer))
|
||||
goto out_free_pgvec;
|
||||
}
|
||||
|
||||
@@ -2276,7 +2325,7 @@ out_free_pgvec:
|
||||
static int packet_set_ring(struct sock *sk, struct tpacket_req *req,
|
||||
int closing, int tx_ring)
|
||||
{
|
||||
- char **pg_vec = NULL;
|
||||
+ struct pgv *pg_vec = NULL;
|
||||
struct packet_sock *po = pkt_sk(sk);
|
||||
int was_running, order = 0;
|
||||
struct packet_ring_buffer *rb;
|
||||
@@ -2438,15 +2487,22 @@ static int packet_mmap(struct file *file
|
||||
continue;
|
||||
|
||||
for (i = 0; i < rb->pg_vec_len; i++) {
|
||||
- struct page *page = virt_to_page(rb->pg_vec[i]);
|
||||
+ struct page *page;
|
||||
+ void *kaddr = rb->pg_vec[i].buffer;
|
||||
int pg_num;
|
||||
|
||||
for (pg_num = 0; pg_num < rb->pg_vec_pages;
|
||||
- pg_num++, page++) {
|
||||
+ pg_num++) {
|
||||
+ if (rb->pg_vec[i].flags & PGV_FROM_VMALLOC)
|
||||
+ page = vmalloc_to_page(kaddr);
|
||||
+ else
|
||||
+ page = virt_to_page(kaddr);
|
||||
+
|
||||
err = vm_insert_page(vma, start, page);
|
||||
if (unlikely(err))
|
||||
goto out;
|
||||
start += PAGE_SIZE;
|
||||
+ kaddr += PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,91 +0,0 @@
|
|||
From 17f1e34b178ffc0111d768f48a86b58fd0c88c56 Mon Sep 17 00:00:00 2001
|
||||
From: David Kilroy <kilroyd@googlemail.com>
|
||||
Date: Tue, 7 Dec 2010 18:50:42 +0000
|
||||
Subject: [PATCH] orinoco: initialise priv->hw before assigning the interrupt
|
||||
|
||||
The interrupt handler takes a lock - but since commit bcad6e80f3f this
|
||||
lock goes through an indirection specified in the hermes_t structure.
|
||||
We must therefore initialise the structure before setting up the
|
||||
interrupt handler.
|
||||
|
||||
Fix orinoco_cs and spectrum_cs
|
||||
|
||||
<https://bugzilla.kernel.org/show_bug.cgi?id=23932>
|
||||
|
||||
Bisected by: Matt Domsch <Matt_Domsch@dell.com>
|
||||
Signed-off by: David Kilroy <kilroyd@googlemail.com>
|
||||
Cc: stable@kernel.org
|
||||
Signed-off-by: John W. Linville <linville@tuxdriver.com>
|
||||
---
|
||||
drivers/net/wireless/orinoco/orinoco_cs.c | 14 +++++++-------
|
||||
drivers/net/wireless/orinoco/spectrum_cs.c | 14 +++++++-------
|
||||
2 files changed, 14 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/orinoco/orinoco_cs.c b/drivers/net/wireless/orinoco/orinoco_cs.c
|
||||
index 71b3d68..32954c4 100644
|
||||
--- a/drivers/net/wireless/orinoco/orinoco_cs.c
|
||||
+++ b/drivers/net/wireless/orinoco/orinoco_cs.c
|
||||
@@ -151,20 +151,20 @@ orinoco_cs_config(struct pcmcia_device *link)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
- ret = pcmcia_request_irq(link, orinoco_interrupt);
|
||||
- if (ret)
|
||||
- goto failed;
|
||||
-
|
||||
- /* We initialize the hermes structure before completing PCMCIA
|
||||
- * configuration just in case the interrupt handler gets
|
||||
- * called. */
|
||||
mem = ioport_map(link->resource[0]->start,
|
||||
resource_size(link->resource[0]));
|
||||
if (!mem)
|
||||
goto failed;
|
||||
|
||||
+ /* We initialize the hermes structure before completing PCMCIA
|
||||
+ * configuration just in case the interrupt handler gets
|
||||
+ * called. */
|
||||
hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING);
|
||||
|
||||
+ ret = pcmcia_request_irq(link, orinoco_interrupt);
|
||||
+ if (ret)
|
||||
+ goto failed;
|
||||
+
|
||||
ret = pcmcia_enable_device(link);
|
||||
if (ret)
|
||||
goto failed;
|
||||
diff --git a/drivers/net/wireless/orinoco/spectrum_cs.c b/drivers/net/wireless/orinoco/spectrum_cs.c
|
||||
index fb859a5..db34c28 100644
|
||||
--- a/drivers/net/wireless/orinoco/spectrum_cs.c
|
||||
+++ b/drivers/net/wireless/orinoco/spectrum_cs.c
|
||||
@@ -214,21 +214,21 @@ spectrum_cs_config(struct pcmcia_device *link)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
- ret = pcmcia_request_irq(link, orinoco_interrupt);
|
||||
- if (ret)
|
||||
- goto failed;
|
||||
-
|
||||
- /* We initialize the hermes structure before completing PCMCIA
|
||||
- * configuration just in case the interrupt handler gets
|
||||
- * called. */
|
||||
mem = ioport_map(link->resource[0]->start,
|
||||
resource_size(link->resource[0]));
|
||||
if (!mem)
|
||||
goto failed;
|
||||
|
||||
+ /* We initialize the hermes structure before completing PCMCIA
|
||||
+ * configuration just in case the interrupt handler gets
|
||||
+ * called. */
|
||||
hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING);
|
||||
hw->eeprom_pda = true;
|
||||
|
||||
+ ret = pcmcia_request_irq(link, orinoco_interrupt);
|
||||
+ if (ret)
|
||||
+ goto failed;
|
||||
+
|
||||
ret = pcmcia_enable_device(link);
|
||||
if (ret)
|
||||
goto failed;
|
||||
--
|
||||
1.7.3.3
|
||||
|
|
@ -1,273 +0,0 @@
|
|||
From bounces.tip@hpa.at.zytor.com Wed Dec 8 15:40:48 2010
|
||||
From: tip-bot for Peter Zijlstra <a.p.zijlstra@chello.nl>
|
||||
In-Reply-To: <1291129145.32004.874.camel@laptop>
|
||||
References: <1291129145.32004.874.camel@laptop>
|
||||
Subject: [tip:sched/urgent] sched: Cure more NO_HZ load average woes
|
||||
Message-ID: <tip-0f004f5a696a9434b7214d0d3cbd0525ee77d428@git.kernel.org>
|
||||
Git-Commit-ID: 0f004f5a696a9434b7214d0d3cbd0525ee77d428
|
||||
|
||||
Commit-ID: 0f004f5a696a9434b7214d0d3cbd0525ee77d428
|
||||
Gitweb: http://git.kernel.org/tip/0f004f5a696a9434b7214d0d3cbd0525ee77d428
|
||||
Author: Peter Zijlstra <a.p.zijlstra@chello.nl>
|
||||
AuthorDate: Tue, 30 Nov 2010 19:48:45 +0100
|
||||
Committer: Ingo Molnar <mingo@elte.hu>
|
||||
CommitDate: Wed, 8 Dec 2010 20:15:04 +0100
|
||||
|
||||
sched: Cure more NO_HZ load average woes
|
||||
|
||||
There's a long-running regression that proved difficult to fix and
|
||||
which is hitting certain people and is rather annoying in its effects.
|
||||
|
||||
Damien reported that after 74f5187ac8 (sched: Cure load average vs
|
||||
NO_HZ woes) his load average is unnaturally high, he also noted that
|
||||
even with that patch reverted the load avgerage numbers are not
|
||||
correct.
|
||||
|
||||
The problem is that the previous patch only solved half the NO_HZ
|
||||
problem, it addressed the part of going into NO_HZ mode, not of
|
||||
comming out of NO_HZ mode. This patch implements that missing half.
|
||||
|
||||
When comming out of NO_HZ mode there are two important things to take
|
||||
care of:
|
||||
|
||||
- Folding the pending idle delta into the global active count.
|
||||
- Correctly aging the averages for the idle-duration.
|
||||
|
||||
So with this patch the NO_HZ interaction should be complete and
|
||||
behaviour between CONFIG_NO_HZ=[yn] should be equivalent.
|
||||
|
||||
Furthermore, this patch slightly changes the load average computation
|
||||
by adding a rounding term to the fixed point multiplication.
|
||||
|
||||
Reported-by: Damien Wyart <damien.wyart@free.fr>
|
||||
Reported-by: Tim McGrath <tmhikaru@gmail.com>
|
||||
Tested-by: Damien Wyart <damien.wyart@free.fr>
|
||||
Tested-by: Orion Poplawski <orion@cora.nwra.com>
|
||||
Tested-by: Kyle McMartin <kyle@mcmartin.ca>
|
||||
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
|
||||
Cc: stable@kernel.org
|
||||
Cc: Chase Douglas <chase.douglas@canonical.com>
|
||||
LKML-Reference: <1291129145.32004.874.camel@laptop>
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
---
|
||||
include/linux/sched.h | 2 +-
|
||||
kernel/sched.c | 150 +++++++++++++++++++++++++++++++++++++++++++++----
|
||||
kernel/timer.c | 2 +-
|
||||
3 files changed, 141 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/include/linux/sched.h b/include/linux/sched.h
|
||||
index 2c79e92..2238745 100644
|
||||
--- a/include/linux/sched.h
|
||||
+++ b/include/linux/sched.h
|
||||
@@ -143,7 +143,7 @@ extern unsigned long nr_iowait_cpu(int cpu);
|
||||
extern unsigned long this_cpu_load(void);
|
||||
|
||||
|
||||
-extern void calc_global_load(void);
|
||||
+extern void calc_global_load(unsigned long ticks);
|
||||
|
||||
extern unsigned long get_parent_ip(unsigned long addr);
|
||||
|
||||
diff --git a/kernel/sched.c b/kernel/sched.c
|
||||
index dc91a4d..6b7c26a 100644
|
||||
--- a/kernel/sched.c
|
||||
+++ b/kernel/sched.c
|
||||
@@ -3119,6 +3119,15 @@ static long calc_load_fold_active(struct rq *this_rq)
|
||||
return delta;
|
||||
}
|
||||
|
||||
+static unsigned long
|
||||
+calc_load(unsigned long load, unsigned long exp, unsigned long active)
|
||||
+{
|
||||
+ load *= exp;
|
||||
+ load += active * (FIXED_1 - exp);
|
||||
+ load += 1UL << (FSHIFT - 1);
|
||||
+ return load >> FSHIFT;
|
||||
+}
|
||||
+
|
||||
#ifdef CONFIG_NO_HZ
|
||||
/*
|
||||
* For NO_HZ we delay the active fold to the next LOAD_FREQ update.
|
||||
@@ -3148,6 +3157,128 @@ static long calc_load_fold_idle(void)
|
||||
|
||||
return delta;
|
||||
}
|
||||
+
|
||||
+/**
|
||||
+ * fixed_power_int - compute: x^n, in O(log n) time
|
||||
+ *
|
||||
+ * @x: base of the power
|
||||
+ * @frac_bits: fractional bits of @x
|
||||
+ * @n: power to raise @x to.
|
||||
+ *
|
||||
+ * By exploiting the relation between the definition of the natural power
|
||||
+ * function: x^n := x*x*...*x (x multiplied by itself for n times), and
|
||||
+ * the binary encoding of numbers used by computers: n := \Sum n_i * 2^i,
|
||||
+ * (where: n_i \elem {0, 1}, the binary vector representing n),
|
||||
+ * we find: x^n := x^(\Sum n_i * 2^i) := \Prod x^(n_i * 2^i), which is
|
||||
+ * of course trivially computable in O(log_2 n), the length of our binary
|
||||
+ * vector.
|
||||
+ */
|
||||
+static unsigned long
|
||||
+fixed_power_int(unsigned long x, unsigned int frac_bits, unsigned int n)
|
||||
+{
|
||||
+ unsigned long result = 1UL << frac_bits;
|
||||
+
|
||||
+ if (n) for (;;) {
|
||||
+ if (n & 1) {
|
||||
+ result *= x;
|
||||
+ result += 1UL << (frac_bits - 1);
|
||||
+ result >>= frac_bits;
|
||||
+ }
|
||||
+ n >>= 1;
|
||||
+ if (!n)
|
||||
+ break;
|
||||
+ x *= x;
|
||||
+ x += 1UL << (frac_bits - 1);
|
||||
+ x >>= frac_bits;
|
||||
+ }
|
||||
+
|
||||
+ return result;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * a1 = a0 * e + a * (1 - e)
|
||||
+ *
|
||||
+ * a2 = a1 * e + a * (1 - e)
|
||||
+ * = (a0 * e + a * (1 - e)) * e + a * (1 - e)
|
||||
+ * = a0 * e^2 + a * (1 - e) * (1 + e)
|
||||
+ *
|
||||
+ * a3 = a2 * e + a * (1 - e)
|
||||
+ * = (a0 * e^2 + a * (1 - e) * (1 + e)) * e + a * (1 - e)
|
||||
+ * = a0 * e^3 + a * (1 - e) * (1 + e + e^2)
|
||||
+ *
|
||||
+ * ...
|
||||
+ *
|
||||
+ * an = a0 * e^n + a * (1 - e) * (1 + e + ... + e^n-1) [1]
|
||||
+ * = a0 * e^n + a * (1 - e) * (1 - e^n)/(1 - e)
|
||||
+ * = a0 * e^n + a * (1 - e^n)
|
||||
+ *
|
||||
+ * [1] application of the geometric series:
|
||||
+ *
|
||||
+ * n 1 - x^(n+1)
|
||||
+ * S_n := \Sum x^i = -------------
|
||||
+ * i=0 1 - x
|
||||
+ */
|
||||
+static unsigned long
|
||||
+calc_load_n(unsigned long load, unsigned long exp,
|
||||
+ unsigned long active, unsigned int n)
|
||||
+{
|
||||
+
|
||||
+ return calc_load(load, fixed_power_int(exp, FSHIFT, n), active);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * NO_HZ can leave us missing all per-cpu ticks calling
|
||||
+ * calc_load_account_active(), but since an idle CPU folds its delta into
|
||||
+ * calc_load_tasks_idle per calc_load_account_idle(), all we need to do is fold
|
||||
+ * in the pending idle delta if our idle period crossed a load cycle boundary.
|
||||
+ *
|
||||
+ * Once we've updated the global active value, we need to apply the exponential
|
||||
+ * weights adjusted to the number of cycles missed.
|
||||
+ */
|
||||
+static void calc_global_nohz(unsigned long ticks)
|
||||
+{
|
||||
+ long delta, active, n;
|
||||
+
|
||||
+ if (time_before(jiffies, calc_load_update))
|
||||
+ return;
|
||||
+
|
||||
+ /*
|
||||
+ * If we crossed a calc_load_update boundary, make sure to fold
|
||||
+ * any pending idle changes, the respective CPUs might have
|
||||
+ * missed the tick driven calc_load_account_active() update
|
||||
+ * due to NO_HZ.
|
||||
+ */
|
||||
+ delta = calc_load_fold_idle();
|
||||
+ if (delta)
|
||||
+ atomic_long_add(delta, &calc_load_tasks);
|
||||
+
|
||||
+ /*
|
||||
+ * If we were idle for multiple load cycles, apply them.
|
||||
+ */
|
||||
+ if (ticks >= LOAD_FREQ) {
|
||||
+ n = ticks / LOAD_FREQ;
|
||||
+
|
||||
+ active = atomic_long_read(&calc_load_tasks);
|
||||
+ active = active > 0 ? active * FIXED_1 : 0;
|
||||
+
|
||||
+ avenrun[0] = calc_load_n(avenrun[0], EXP_1, active, n);
|
||||
+ avenrun[1] = calc_load_n(avenrun[1], EXP_5, active, n);
|
||||
+ avenrun[2] = calc_load_n(avenrun[2], EXP_15, active, n);
|
||||
+
|
||||
+ calc_load_update += n * LOAD_FREQ;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Its possible the remainder of the above division also crosses
|
||||
+ * a LOAD_FREQ period, the regular check in calc_global_load()
|
||||
+ * which comes after this will take care of that.
|
||||
+ *
|
||||
+ * Consider us being 11 ticks before a cycle completion, and us
|
||||
+ * sleeping for 4*LOAD_FREQ + 22 ticks, then the above code will
|
||||
+ * age us 4 cycles, and the test in calc_global_load() will
|
||||
+ * pick up the final one.
|
||||
+ */
|
||||
+}
|
||||
#else
|
||||
static void calc_load_account_idle(struct rq *this_rq)
|
||||
{
|
||||
@@ -3157,6 +3288,10 @@ static inline long calc_load_fold_idle(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+static void calc_global_nohz(unsigned long ticks)
|
||||
+{
|
||||
+}
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -3174,24 +3309,17 @@ void get_avenrun(unsigned long *loads, unsigned long offset, int shift)
|
||||
loads[2] = (avenrun[2] + offset) << shift;
|
||||
}
|
||||
|
||||
-static unsigned long
|
||||
-calc_load(unsigned long load, unsigned long exp, unsigned long active)
|
||||
-{
|
||||
- load *= exp;
|
||||
- load += active * (FIXED_1 - exp);
|
||||
- return load >> FSHIFT;
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* calc_load - update the avenrun load estimates 10 ticks after the
|
||||
* CPUs have updated calc_load_tasks.
|
||||
*/
|
||||
-void calc_global_load(void)
|
||||
+void calc_global_load(unsigned long ticks)
|
||||
{
|
||||
- unsigned long upd = calc_load_update + 10;
|
||||
long active;
|
||||
|
||||
- if (time_before(jiffies, upd))
|
||||
+ calc_global_nohz(ticks);
|
||||
+
|
||||
+ if (time_before(jiffies, calc_load_update + 10))
|
||||
return;
|
||||
|
||||
active = atomic_long_read(&calc_load_tasks);
|
||||
diff --git a/kernel/timer.c b/kernel/timer.c
|
||||
index 68a9ae7..7bd715f 100644
|
||||
--- a/kernel/timer.c
|
||||
+++ b/kernel/timer.c
|
||||
@@ -1319,7 +1319,7 @@ void do_timer(unsigned long ticks)
|
||||
{
|
||||
jiffies_64 += ticks;
|
||||
update_wall_time();
|
||||
- calc_global_load();
|
||||
+ calc_global_load(ticks);
|
||||
}
|
||||
|
||||
#ifdef __ARCH_WANT_SYS_ALARM
|
||||
|
Loading…
Reference in New Issue