Compare commits
10 Commits
master
...
f15-user-s
Author | SHA1 | Date |
---|---|---|
Steve Dickson | 8893f983a4 | |
Chuck Ebbert | 535b4d942d | |
Chuck Ebbert | 06ad6a4c25 | |
Chuck Ebbert | 6236c85dc6 | |
Kyle McMartin | a13914ae1e | |
Dave Airlie | e04a1dcc80 | |
Ben Skeggs | 1abc854706 | |
Chuck Ebbert | c5e062a0ef | |
Matthew Garrett | 93c9d72918 | |
Dennis Gilmore | e53e7fadc2 |
|
@ -0,0 +1,89 @@
|
|||
From lenb@kernel.org Wed Mar 23 03:07:45 2011
|
||||
From: Len Brown <lenb@kernel.org>
|
||||
To: linux-acpi@vger.kernel.org
|
||||
Cc: Kyle McMartin <kyle@redhat.com>, Len Brown <len.brown@intel.com>
|
||||
Subject: [PATCH 35/42] ACPI battery: fribble sysfs files from a resume notifier
|
||||
Date: Wed, 23 Mar 2011 02:42:48 -0400
|
||||
|
||||
From: Kyle McMartin <kyle@redhat.com>
|
||||
|
||||
Commit da8aeb92 re-poked the battery on resume, but Linus reports that
|
||||
it broke his eee and partially reverted it in b23fffd7. Unfortunately
|
||||
this also results in my x201s giving crack values until the sysfs files
|
||||
are poked again. In the revert message, it was suggested that we poke it
|
||||
from a PM notifier, so let's do that.
|
||||
|
||||
With this in place, I haven't noticed the units going nutty on my
|
||||
gnome-power-manager across a dozen suspends or so...
|
||||
|
||||
Signed-off-by: Kyle McMartin <kyle@redhat.com>
|
||||
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
|
||||
Signed-off-by: Len Brown <len.brown@intel.com>
|
||||
---
|
||||
drivers/acpi/battery.c | 22 ++++++++++++++++++++++
|
||||
1 files changed, 22 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
|
||||
index ac1a599..fcc13ac 100644
|
||||
--- a/drivers/acpi/battery.c
|
||||
+++ b/drivers/acpi/battery.c
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <linux/async.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/slab.h>
|
||||
+#include <linux/suspend.h>
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
#include <linux/proc_fs.h>
|
||||
@@ -102,6 +103,7 @@ struct acpi_battery {
|
||||
struct mutex lock;
|
||||
struct power_supply bat;
|
||||
struct acpi_device *device;
|
||||
+ struct notifier_block pm_nb;
|
||||
unsigned long update_time;
|
||||
int rate_now;
|
||||
int capacity_now;
|
||||
@@ -940,6 +942,21 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
|
||||
power_supply_changed(&battery->bat);
|
||||
}
|
||||
|
||||
+static int battery_notify(struct notifier_block *nb,
|
||||
+ unsigned long mode, void *_unused)
|
||||
+{
|
||||
+ struct acpi_battery *battery = container_of(nb, struct acpi_battery,
|
||||
+ pm_nb);
|
||||
+ switch (mode) {
|
||||
+ case PM_POST_SUSPEND:
|
||||
+ sysfs_remove_battery(battery);
|
||||
+ sysfs_add_battery(battery);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int acpi_battery_add(struct acpi_device *device)
|
||||
{
|
||||
int result = 0;
|
||||
@@ -972,6 +989,10 @@ static int acpi_battery_add(struct acpi_device *device)
|
||||
#endif
|
||||
kfree(battery);
|
||||
}
|
||||
+
|
||||
+ battery->pm_nb.notifier_call = battery_notify;
|
||||
+ register_pm_notifier(&battery->pm_nb);
|
||||
+
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -982,6 +1003,7 @@ static int acpi_battery_remove(struct acpi_device *device, int type)
|
||||
if (!device || !acpi_driver_data(device))
|
||||
return -EINVAL;
|
||||
battery = acpi_driver_data(device);
|
||||
+ unregister_pm_notifier(&battery->pm_nb);
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_battery_remove_fs(device);
|
||||
#endif
|
||||
--
|
||||
1.7.4.1.343.ga91df
|
||||
|
|
@ -99,9 +99,9 @@ index baa25ad..abc5bd7 100644
|
|||
--- a/drivers/hid/hid-core.c
|
||||
+++ b/drivers/hid/hid-core.c
|
||||
@@ -1244,8 +1244,6 @@ static const struct hid_device_id hid_blacklist[] = {
|
||||
#if defined(CONFIG_HID_ACRUX_FF) || defined(CONFIG_HID_ACRUX_FF_MODULE)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) },
|
||||
#endif
|
||||
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
|
||||
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },
|
||||
|
|
|
@ -3071,6 +3071,7 @@ CONFIG_HID_TOPSEED=m
|
|||
CONFIG_HID_THRUSTMASTER=m
|
||||
CONFIG_HID_ZEROPLUS=m
|
||||
CONFIG_HID_ZYDACRON=m
|
||||
CONFIG_HID_ACRUX=m
|
||||
CONFIG_HID_ACRUX_FF=m
|
||||
CONFIG_HID_EMS_FF=m
|
||||
CONFIG_HID_ELECOM=m
|
||||
|
@ -3547,6 +3548,15 @@ CONFIG_NFSD_V3=y
|
|||
CONFIG_NFSD_V3_ACL=y
|
||||
CONFIG_NFSD_V4=y
|
||||
CONFIG_NFS_FSCACHE=y
|
||||
# Enable pNFS
|
||||
CONFIG_PNFS_OBJLAYOUT=m
|
||||
CONFIG_PNFS_BLOCK=m
|
||||
CONFIG_PNFS_PANLAYOUT=m
|
||||
CONFIG_PNFSD_LOCAL_EXPORT=y
|
||||
CONFIG_PNFSD=y
|
||||
CONFIG_SPNFS=y
|
||||
CONFIG_SPNFS_LAYOUTSEGMENTS=y
|
||||
CONFIG_SPNFS_BLOCK=y
|
||||
# CONFIG_NFS_USE_LEGACY_DNS is not set
|
||||
# CONFIG_NFS_USE_NEW_IDMAPPER is not set
|
||||
# CONFIG_NFSD_DEPRECATED is not set
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
From: Stuart Hayes <stuart_hayes@yahoo.com>
|
||||
Date: Wed, 2 Mar 2011 12:42:05 +0000 (+0100)
|
||||
Subject: dcdbas: force SMI to happen when expected
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=dd65c736d1b5312c80c88a64bf521db4959eded5
|
||||
|
||||
dcdbas: force SMI to happen when expected
|
||||
|
||||
The dcdbas driver can do an I/O write to cause a SMI to occur. The SMI handler
|
||||
looks at certain registers and memory locations, so the SMI needs to happen
|
||||
immediately. On some systems I/O writes are posted, though, causing the SMI to
|
||||
happen well after the "outb" occurred, which causes random failures. Following
|
||||
the "outb" with an "inb" forces the write to go through even if it is posted.
|
||||
|
||||
Signed-off-by: Stuart Hayes <stuart_hayes@yahoo.com>
|
||||
Acked-by: Doug Warzecha <douglas_warzecha@dell.com>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
|
||||
---
|
||||
|
||||
diff --git a/drivers/firmware/dcdbas.c b/drivers/firmware/dcdbas.c
|
||||
index 69ad529..ea5ac2d 100644
|
||||
--- a/drivers/firmware/dcdbas.c
|
||||
+++ b/drivers/firmware/dcdbas.c
|
||||
@@ -268,8 +268,10 @@ int dcdbas_smi_request(struct smi_cmd *smi_cmd)
|
||||
}
|
||||
|
||||
/* generate SMI */
|
||||
+ /* inb to force posted write through and make SMI happen now */
|
||||
asm volatile (
|
||||
- "outb %b0,%w1"
|
||||
+ "outb %b0,%w1\n"
|
||||
+ "inb %w1"
|
||||
: /* no output args */
|
||||
: "a" (smi_cmd->command_code),
|
||||
"d" (smi_cmd->command_address),
|
|
@ -0,0 +1,80 @@
|
|||
From 3b936797f5e4623ae1b80a5f0c4df30a17360bf5 Mon Sep 17 00:00:00 2001
|
||||
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Date: Thu, 17 Mar 2011 15:23:22 +0000
|
||||
Subject: [PATCH] drm/i915: Fix pipelined fencing
|
||||
|
||||
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=34584
|
||||
Cc: Andy Whitcroft <apw@canonical.com>
|
||||
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
---
|
||||
drivers/gpu/drm/i915/i915_gem.c | 46 ++++++++++++++++----------------------
|
||||
1 files changed, 19 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
|
||||
index 36e66cc..10378a3 100644
|
||||
--- a/drivers/gpu/drm/i915/i915_gem.c
|
||||
+++ b/drivers/gpu/drm/i915/i915_gem.c
|
||||
@@ -2544,8 +2544,25 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
|
||||
reg = &dev_priv->fence_regs[obj->fence_reg];
|
||||
list_move_tail(®->lru_list, &dev_priv->mm.fence_list);
|
||||
|
||||
- if (!obj->fenced_gpu_access && !obj->last_fenced_seqno)
|
||||
- pipelined = NULL;
|
||||
+ if (obj->tiling_changed) {
|
||||
+ ret = i915_gem_object_flush_fence(obj,
|
||||
+ pipelined,
|
||||
+ interruptible);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (!obj->fenced_gpu_access && !obj->last_fenced_seqno)
|
||||
+ pipelined = NULL;
|
||||
+
|
||||
+ if (pipelined) {
|
||||
+ reg->setup_seqno =
|
||||
+ i915_gem_next_request_seqno(dev, pipelined);
|
||||
+ obj->last_fenced_seqno = reg->setup_seqno;
|
||||
+ obj->last_fenced_ring = pipelined;
|
||||
+ }
|
||||
+
|
||||
+ goto update;
|
||||
+ }
|
||||
|
||||
if (!pipelined) {
|
||||
if (reg->setup_seqno) {
|
||||
@@ -2568,31 +2585,6 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
|
||||
interruptible);
|
||||
if (ret)
|
||||
return ret;
|
||||
- } else if (obj->tiling_changed) {
|
||||
- if (obj->fenced_gpu_access) {
|
||||
- if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
|
||||
- ret = i915_gem_flush_ring(obj->base.dev, obj->ring,
|
||||
- 0, obj->base.write_domain);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- obj->fenced_gpu_access = false;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (!obj->fenced_gpu_access && !obj->last_fenced_seqno)
|
||||
- pipelined = NULL;
|
||||
- BUG_ON(!pipelined && reg->setup_seqno);
|
||||
-
|
||||
- if (obj->tiling_changed) {
|
||||
- if (pipelined) {
|
||||
- reg->setup_seqno =
|
||||
- i915_gem_next_request_seqno(dev, pipelined);
|
||||
- obj->last_fenced_seqno = reg->setup_seqno;
|
||||
- obj->last_fenced_ring = pipelined;
|
||||
- }
|
||||
- goto update;
|
||||
}
|
||||
|
||||
return 0;
|
||||
--
|
||||
1.5.6.5
|
||||
|
|
@ -1,21 +1,24 @@
|
|||
drivers/gpu/drm/nouveau/nouveau_bios.c | 25 +--
|
||||
drivers/gpu/drm/nouveau/nouveau_bios.c | 78 +++++--
|
||||
drivers/gpu/drm/nouveau/nouveau_bo.c | 6 +-
|
||||
drivers/gpu/drm/nouveau/nouveau_channel.c | 2 +-
|
||||
drivers/gpu/drm/nouveau/nouveau_display.c | 2 +-
|
||||
drivers/gpu/drm/nouveau/nouveau_dp.c | 2 -
|
||||
drivers/gpu/drm/nouveau/nouveau_drv.h | 15 +-
|
||||
drivers/gpu/drm/nouveau/nouveau_fence.c | 190 ++++++++++------
|
||||
drivers/gpu/drm/nouveau/nouveau_fence.c | 205 +++++++++++------
|
||||
drivers/gpu/drm/nouveau/nouveau_mem.c | 50 +++-
|
||||
drivers/gpu/drm/nouveau/nouveau_object.c | 22 ++-
|
||||
drivers/gpu/drm/nouveau/nouveau_perf.c | 2 +-
|
||||
drivers/gpu/drm/nouveau/nouveau_sgdma.c | 341 +++++++++++++++++++++++++----
|
||||
drivers/gpu/drm/nouveau/nouveau_state.c | 10 +-
|
||||
drivers/gpu/drm/nouveau/nouveau_temp.c | 4 +-
|
||||
drivers/gpu/drm/nouveau/nouveau_util.c | 23 ++-
|
||||
drivers/gpu/drm/nouveau/nouveau_util.h | 4 +
|
||||
drivers/gpu/drm/nouveau/nouveau_vm.c | 13 +-
|
||||
drivers/gpu/drm/nouveau/nv04_dfp.c | 13 +-
|
||||
drivers/gpu/drm/nouveau/nv04_fifo.c | 19 ++-
|
||||
drivers/gpu/drm/nouveau/nv40_fb.c | 59 +++++-
|
||||
drivers/gpu/drm/nouveau/nv50_display.c | 7 +-
|
||||
drivers/gpu/drm/nouveau/nv50_evo.c | 1 +
|
||||
drivers/gpu/drm/nouveau/nv50_fb.c | 150 ++++++++++++-
|
||||
drivers/gpu/drm/nouveau/nv50_fifo.c | 3 +-
|
||||
drivers/gpu/drm/nouveau/nv50_gpio.c | 13 +-
|
||||
|
@ -24,13 +27,68 @@
|
|||
drivers/gpu/drm/nouveau/nv84_crypt.c | 2 +-
|
||||
drivers/gpu/drm/nouveau/nvc0_fifo.c | 15 +-
|
||||
drivers/gpu/drm/nouveau/nvc0_graph.c | 2 -
|
||||
26 files changed, 841 insertions(+), 281 deletions(-)
|
||||
29 files changed, 912 insertions(+), 294 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c
|
||||
index 6bdab89..b8ff1e7 100644
|
||||
index 6bdab89..1bb1261 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nouveau_bios.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nouveau_bios.c
|
||||
@@ -5950,6 +5950,11 @@ apply_dcb_connector_quirks(struct nvbios *bios, int idx)
|
||||
@@ -269,7 +269,7 @@ struct init_tbl_entry {
|
||||
int (*handler)(struct nvbios *, uint16_t, struct init_exec *);
|
||||
};
|
||||
|
||||
-static int parse_init_table(struct nvbios *, unsigned int, struct init_exec *);
|
||||
+static int parse_init_table(struct nvbios *, uint16_t, struct init_exec *);
|
||||
|
||||
#define MACRO_INDEX_SIZE 2
|
||||
#define MACRO_SIZE 8
|
||||
@@ -2011,6 +2011,27 @@ init_sub_direct(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
|
||||
}
|
||||
|
||||
static int
|
||||
+init_jump(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
|
||||
+{
|
||||
+ /*
|
||||
+ * INIT_JUMP opcode: 0x5C ('\')
|
||||
+ *
|
||||
+ * offset (8 bit): opcode
|
||||
+ * offset + 1 (16 bit): offset (in bios)
|
||||
+ *
|
||||
+ * Continue execution of init table from 'offset'
|
||||
+ */
|
||||
+
|
||||
+ uint16_t jmp_offset = ROM16(bios->data[offset + 1]);
|
||||
+
|
||||
+ if (!iexec->execute)
|
||||
+ return 3;
|
||||
+
|
||||
+ BIOSLOG(bios, "0x%04X: Jump to 0x%04X\n", offset, jmp_offset);
|
||||
+ return jmp_offset - offset;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
init_i2c_if(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
|
||||
{
|
||||
/*
|
||||
@@ -3659,6 +3680,7 @@ static struct init_tbl_entry itbl_entry[] = {
|
||||
{ "INIT_ZM_REG_SEQUENCE" , 0x58, init_zm_reg_sequence },
|
||||
/* INIT_INDIRECT_REG (0x5A, 7, 0, 0) removed due to no example of use */
|
||||
{ "INIT_SUB_DIRECT" , 0x5B, init_sub_direct },
|
||||
+ { "INIT_JUMP" , 0x5C, init_jump },
|
||||
{ "INIT_I2C_IF" , 0x5E, init_i2c_if },
|
||||
{ "INIT_COPY_NV_REG" , 0x5F, init_copy_nv_reg },
|
||||
{ "INIT_ZM_INDEX_IO" , 0x62, init_zm_index_io },
|
||||
@@ -3700,8 +3722,7 @@ static struct init_tbl_entry itbl_entry[] = {
|
||||
#define MAX_TABLE_OPS 1000
|
||||
|
||||
static int
|
||||
-parse_init_table(struct nvbios *bios, unsigned int offset,
|
||||
- struct init_exec *iexec)
|
||||
+parse_init_table(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
|
||||
{
|
||||
/*
|
||||
* Parses all commands in an init table.
|
||||
@@ -5950,6 +5971,11 @@ apply_dcb_connector_quirks(struct nvbios *bios, int idx)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -42,7 +100,7 @@ index 6bdab89..b8ff1e7 100644
|
|||
static void
|
||||
parse_dcb_connector_table(struct nvbios *bios)
|
||||
{
|
||||
@@ -5986,23 +5991,9 @@ parse_dcb_connector_table(struct nvbios *bios)
|
||||
@@ -5986,23 +6012,9 @@ parse_dcb_connector_table(struct nvbios *bios)
|
||||
|
||||
cte->type = (cte->entry & 0x000000ff) >> 0;
|
||||
cte->index2 = (cte->entry & 0x00000f00) >> 8;
|
||||
|
@ -69,6 +127,39 @@ index 6bdab89..b8ff1e7 100644
|
|||
|
||||
if (cte->type == 0xff)
|
||||
continue;
|
||||
@@ -6342,6 +6354,32 @@ apply_dcb_encoder_quirks(struct drm_device *dev, int idx, u32 *conn, u32 *conf)
|
||||
}
|
||||
}
|
||||
|
||||
+ /* XFX GT-240X-YA
|
||||
+ *
|
||||
+ * So many things wrong here, replace the entire encoder table..
|
||||
+ */
|
||||
+ if (nv_match_device(dev, 0x0ca3, 0x1682, 0x3003)) {
|
||||
+ if (idx == 0) {
|
||||
+ *conn = 0x02001300; /* VGA, connector 1 */
|
||||
+ *conf = 0x00000028;
|
||||
+ } else
|
||||
+ if (idx == 1) {
|
||||
+ *conn = 0x01010312; /* DVI, connector 0 */
|
||||
+ *conf = 0x00020030;
|
||||
+ } else
|
||||
+ if (idx == 2) {
|
||||
+ *conn = 0x01010310; /* VGA, connector 0 */
|
||||
+ *conf = 0x00000028;
|
||||
+ } else
|
||||
+ if (idx == 3) {
|
||||
+ *conn = 0x02022362; /* HDMI, connector 2 */
|
||||
+ *conf = 0x00020010;
|
||||
+ } else {
|
||||
+ *conn = 0x0000000e; /* EOL */
|
||||
+ *conf = 0x00000000;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
return true;
|
||||
}
|
||||
|
||||
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
|
||||
index a521840..53a8000 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
|
||||
|
@ -185,10 +276,18 @@ index 982d70b..2cae8e7 100644
|
|||
/* nvc0_fb.c */
|
||||
extern int nvc0_fb_init(struct drm_device *);
|
||||
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c
|
||||
index 221b846..8b46392 100644
|
||||
index 221b846..594911f 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
|
||||
@@ -32,8 +32,7 @@
|
||||
@@ -27,13 +27,15 @@
|
||||
#include "drmP.h"
|
||||
#include "drm.h"
|
||||
|
||||
+#include <linux/ktime.h>
|
||||
+#include <linux/hrtimer.h>
|
||||
+
|
||||
#include "nouveau_drv.h"
|
||||
#include "nouveau_ramht.h"
|
||||
#include "nouveau_dma.h"
|
||||
|
||||
#define USE_REFCNT(dev) (nouveau_private(dev)->chipset >= 0x10)
|
||||
|
@ -198,7 +297,33 @@ index 221b846..8b46392 100644
|
|||
|
||||
struct nouveau_fence {
|
||||
struct nouveau_channel *channel;
|
||||
@@ -259,11 +258,12 @@ __nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr)
|
||||
@@ -230,7 +232,8 @@ int
|
||||
__nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr)
|
||||
{
|
||||
unsigned long timeout = jiffies + (3 * DRM_HZ);
|
||||
- unsigned long sleep_time = jiffies + 1;
|
||||
+ unsigned long sleep_time = NSEC_PER_MSEC / 1000;
|
||||
+ ktime_t t;
|
||||
int ret = 0;
|
||||
|
||||
while (1) {
|
||||
@@ -244,8 +247,13 @@ __nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr)
|
||||
|
||||
__set_current_state(intr ? TASK_INTERRUPTIBLE
|
||||
: TASK_UNINTERRUPTIBLE);
|
||||
- if (lazy && time_after_eq(jiffies, sleep_time))
|
||||
- schedule_timeout(1);
|
||||
+ if (lazy) {
|
||||
+ t = ktime_set(0, sleep_time);
|
||||
+ schedule_hrtimeout(&t, HRTIMER_MODE_REL);
|
||||
+ sleep_time *= 2;
|
||||
+ if (sleep_time > NSEC_PER_MSEC)
|
||||
+ sleep_time = NSEC_PER_MSEC;
|
||||
+ }
|
||||
|
||||
if (intr && signal_pending(current)) {
|
||||
ret = -ERESTARTSYS;
|
||||
@@ -259,11 +267,12 @@ __nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr)
|
||||
}
|
||||
|
||||
static struct nouveau_semaphore *
|
||||
|
@ -213,7 +338,7 @@ index 221b846..8b46392 100644
|
|||
|
||||
if (!USE_SEMA(dev))
|
||||
return NULL;
|
||||
@@ -277,9 +277,9 @@ alloc_semaphore(struct drm_device *dev)
|
||||
@@ -277,9 +286,9 @@ alloc_semaphore(struct drm_device *dev)
|
||||
goto fail;
|
||||
|
||||
spin_lock(&dev_priv->fence.lock);
|
||||
|
@ -225,7 +350,7 @@ index 221b846..8b46392 100644
|
|||
spin_unlock(&dev_priv->fence.lock);
|
||||
|
||||
if (!sema->mem)
|
||||
@@ -287,7 +287,8 @@ alloc_semaphore(struct drm_device *dev)
|
||||
@@ -287,7 +296,8 @@ alloc_semaphore(struct drm_device *dev)
|
||||
|
||||
kref_init(&sema->ref);
|
||||
sema->dev = dev;
|
||||
|
@ -235,7 +360,7 @@ index 221b846..8b46392 100644
|
|||
|
||||
return sema;
|
||||
fail:
|
||||
@@ -296,7 +297,7 @@ fail:
|
||||
@@ -296,7 +306,7 @@ fail:
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -244,7 +369,7 @@ index 221b846..8b46392 100644
|
|||
{
|
||||
struct nouveau_semaphore *sema =
|
||||
container_of(ref, struct nouveau_semaphore, ref);
|
||||
@@ -318,61 +319,107 @@ semaphore_work(void *priv, bool signalled)
|
||||
@@ -318,61 +328,107 @@ semaphore_work(void *priv, bool signalled)
|
||||
if (unlikely(!signalled))
|
||||
nouveau_bo_wr32(dev_priv->fence.bo, sema->mem->start / 4, 1);
|
||||
|
||||
|
@ -360,6 +485,19 @@ index 221b846..8b46392 100644
|
|||
+ if (dev_priv->chipset < 0xc0) {
|
||||
+ struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
|
||||
+ u64 offset = vma->offset + sema->mem->start;
|
||||
+
|
||||
+ ret = RING_SPACE(chan, 5);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ BEGIN_RING(chan, NvSubSw, 0x0010, 4);
|
||||
+ OUT_RING (chan, upper_32_bits(offset));
|
||||
+ OUT_RING (chan, lower_32_bits(offset));
|
||||
+ OUT_RING (chan, 1);
|
||||
+ OUT_RING (chan, 2); /* RELEASE */
|
||||
+ } else {
|
||||
+ struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
|
||||
+ u64 offset = vma->offset + sema->mem->start;
|
||||
|
||||
- BEGIN_RING(chan, NvSubSw, method, 1);
|
||||
- OUT_RING(chan, 1);
|
||||
|
@ -376,19 +514,6 @@ index 221b846..8b46392 100644
|
|||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ BEGIN_RING(chan, NvSubSw, 0x0010, 4);
|
||||
+ OUT_RING (chan, upper_32_bits(offset));
|
||||
+ OUT_RING (chan, lower_32_bits(offset));
|
||||
+ OUT_RING (chan, 1);
|
||||
+ OUT_RING (chan, 2); /* RELEASE */
|
||||
+ } else {
|
||||
+ struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
|
||||
+ u64 offset = vma->offset + sema->mem->start;
|
||||
+
|
||||
+ ret = RING_SPACE(chan, 5);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
|
||||
+ OUT_RING (chan, upper_32_bits(offset));
|
||||
+ OUT_RING (chan, lower_32_bits(offset));
|
||||
|
@ -397,7 +522,7 @@ index 221b846..8b46392 100644
|
|||
}
|
||||
|
||||
/* Delay semaphore destruction until its work is done */
|
||||
@@ -383,7 +430,6 @@ emit_semaphore(struct nouveau_channel *chan, int method,
|
||||
@@ -383,7 +439,6 @@ emit_semaphore(struct nouveau_channel *chan, int method,
|
||||
kref_get(&sema->ref);
|
||||
nouveau_fence_work(fence, semaphore_work, sema);
|
||||
nouveau_fence_unref(&fence);
|
||||
|
@ -405,7 +530,7 @@ index 221b846..8b46392 100644
|
|||
return 0;
|
||||
}
|
||||
|
||||
@@ -400,7 +446,7 @@ nouveau_fence_sync(struct nouveau_fence *fence,
|
||||
@@ -400,7 +455,7 @@ nouveau_fence_sync(struct nouveau_fence *fence,
|
||||
nouveau_fence_signalled(fence)))
|
||||
goto out;
|
||||
|
||||
|
@ -414,7 +539,7 @@ index 221b846..8b46392 100644
|
|||
if (!sema) {
|
||||
/* Early card or broken userspace, fall back to
|
||||
* software sync. */
|
||||
@@ -418,17 +464,17 @@ nouveau_fence_sync(struct nouveau_fence *fence,
|
||||
@@ -418,17 +473,17 @@ nouveau_fence_sync(struct nouveau_fence *fence,
|
||||
}
|
||||
|
||||
/* Make wchan wait until it gets signalled */
|
||||
|
@ -435,7 +560,7 @@ index 221b846..8b46392 100644
|
|||
out:
|
||||
if (chan)
|
||||
nouveau_channel_put_unlocked(&chan);
|
||||
@@ -449,22 +495,23 @@ nouveau_fence_channel_init(struct nouveau_channel *chan)
|
||||
@@ -449,22 +504,23 @@ nouveau_fence_channel_init(struct nouveau_channel *chan)
|
||||
struct nouveau_gpuobj *obj = NULL;
|
||||
int ret;
|
||||
|
||||
|
@ -467,7 +592,7 @@ index 221b846..8b46392 100644
|
|||
struct ttm_mem_reg *mem = &dev_priv->fence.bo->bo.mem;
|
||||
|
||||
ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY,
|
||||
@@ -484,14 +531,20 @@ nouveau_fence_channel_init(struct nouveau_channel *chan)
|
||||
@@ -484,14 +540,20 @@ nouveau_fence_channel_init(struct nouveau_channel *chan)
|
||||
return ret;
|
||||
BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
|
||||
OUT_RING(chan, NvSema);
|
||||
|
@ -489,7 +614,7 @@ index 221b846..8b46392 100644
|
|||
return 0;
|
||||
}
|
||||
|
||||
@@ -519,11 +572,12 @@ int
|
||||
@@ -519,11 +581,12 @@ int
|
||||
nouveau_fence_init(struct drm_device *dev)
|
||||
{
|
||||
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||
|
@ -606,6 +731,19 @@ index 30b6544..3c12461 100644
|
|||
}
|
||||
}
|
||||
|
||||
diff --git a/drivers/gpu/drm/nouveau/nouveau_perf.c b/drivers/gpu/drm/nouveau/nouveau_perf.c
|
||||
index ac62a1b..670e3cb 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nouveau_perf.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nouveau_perf.c
|
||||
@@ -134,7 +134,7 @@ nouveau_perf_init(struct drm_device *dev)
|
||||
case 0x13:
|
||||
case 0x15:
|
||||
perflvl->fanspeed = entry[55];
|
||||
- perflvl->voltage = entry[56];
|
||||
+ perflvl->voltage = (recordlen > 56) ? entry[56] : 0;
|
||||
perflvl->core = ROM32(entry[1]) * 10;
|
||||
perflvl->memory = ROM32(entry[5]) * 20;
|
||||
break;
|
||||
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
|
||||
index 9a250eb..a26383b 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c
|
||||
|
@ -1161,6 +1299,30 @@ index 97d82ae..b4658f7 100644
|
|||
} else {
|
||||
kfree(vm);
|
||||
return -ENOSYS;
|
||||
diff --git a/drivers/gpu/drm/nouveau/nv04_dfp.c b/drivers/gpu/drm/nouveau/nv04_dfp.c
|
||||
index c82db37..12098bf 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nv04_dfp.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nv04_dfp.c
|
||||
@@ -581,12 +581,13 @@ static void nv04_dfp_restore(struct drm_encoder *encoder)
|
||||
int head = nv_encoder->restore.head;
|
||||
|
||||
if (nv_encoder->dcb->type == OUTPUT_LVDS) {
|
||||
- struct drm_display_mode *native_mode = nouveau_encoder_connector_get(nv_encoder)->native_mode;
|
||||
- if (native_mode)
|
||||
- call_lvds_script(dev, nv_encoder->dcb, head, LVDS_PANEL_ON,
|
||||
- native_mode->clock);
|
||||
- else
|
||||
- NV_ERROR(dev, "Not restoring LVDS without native mode\n");
|
||||
+ struct nouveau_connector *connector =
|
||||
+ nouveau_encoder_connector_get(nv_encoder);
|
||||
+
|
||||
+ if (connector && connector->native_mode)
|
||||
+ call_lvds_script(dev, nv_encoder->dcb, head,
|
||||
+ LVDS_PANEL_ON,
|
||||
+ connector->native_mode->clock);
|
||||
|
||||
} else if (nv_encoder->dcb->type == OUTPUT_TMDS) {
|
||||
int clock = nouveau_hw_pllvals_to_clk
|
||||
diff --git a/drivers/gpu/drm/nouveau/nv04_fifo.c b/drivers/gpu/drm/nouveau/nv04_fifo.c
|
||||
index f89d104..db465a3 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nv04_fifo.c
|
||||
|
@ -1329,6 +1491,18 @@ index 7cc94ed..a804a35 100644
|
|||
delayed |= clock;
|
||||
intr1 &= ~clock;
|
||||
}
|
||||
diff --git a/drivers/gpu/drm/nouveau/nv50_evo.c b/drivers/gpu/drm/nouveau/nv50_evo.c
|
||||
index 0ea090f..3055dbe 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nv50_evo.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nv50_evo.c
|
||||
@@ -182,6 +182,7 @@ nv50_evo_channel_init(struct nouveau_channel *evo)
|
||||
nv_mask(dev, 0x610028, 0x00000000, 0x00010001 << id);
|
||||
|
||||
evo->dma.max = (4096/4) - 2;
|
||||
+ evo->dma.max &= ~7;
|
||||
evo->dma.put = 0;
|
||||
evo->dma.cur = evo->dma.put;
|
||||
evo->dma.free = evo->dma.max - evo->dma.cur;
|
||||
diff --git a/drivers/gpu/drm/nouveau/nv50_fb.c b/drivers/gpu/drm/nouveau/nv50_fb.c
|
||||
index 50290de..efc8cd4 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nv50_fb.c
|
||||
|
|
|
@ -1,403 +0,0 @@
|
|||
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();
|
|
@ -1,229 +0,0 @@
|
|||
diff --git a/drivers/media/video/hdpvr/Makefile b/drivers/media/video/hdpvr/Makefile
|
||||
index e0230fc..3baa9f6 100644
|
||||
--- a/drivers/media/video/hdpvr/Makefile
|
||||
+++ b/drivers/media/video/hdpvr/Makefile
|
||||
@@ -1,6 +1,4 @@
|
||||
-hdpvr-objs := hdpvr-control.o hdpvr-core.o hdpvr-video.o
|
||||
-
|
||||
-hdpvr-$(CONFIG_I2C) += hdpvr-i2c.o
|
||||
+hdpvr-objs := hdpvr-control.o hdpvr-core.o hdpvr-video.o hdpvr-i2c.o
|
||||
|
||||
obj-$(CONFIG_VIDEO_HDPVR) += hdpvr.o
|
||||
|
||||
diff --git a/drivers/media/video/hdpvr/hdpvr-core.c b/drivers/media/video/hdpvr/hdpvr-core.c
|
||||
index 830d47b..70cfdc8 100644
|
||||
--- a/drivers/media/video/hdpvr/hdpvr-core.c
|
||||
+++ b/drivers/media/video/hdpvr/hdpvr-core.c
|
||||
@@ -364,14 +364,13 @@ static int hdpvr_probe(struct usb_interface *interface,
|
||||
goto error;
|
||||
}
|
||||
|
||||
-#ifdef CONFIG_I2C
|
||||
- /* until i2c is working properly */
|
||||
- retval = 0; /* hdpvr_register_i2c_adapter(dev); */
|
||||
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
||||
+ retval = hdpvr_register_i2c_adapter(dev);
|
||||
if (retval < 0) {
|
||||
v4l2_err(&dev->v4l2_dev, "registering i2c adapter failed\n");
|
||||
goto error;
|
||||
}
|
||||
-#endif /* CONFIG_I2C */
|
||||
+#endif
|
||||
|
||||
/* let the user know what node this device is now attached to */
|
||||
v4l2_info(&dev->v4l2_dev, "device now attached to %s\n",
|
||||
diff --git a/drivers/media/video/hdpvr/hdpvr-i2c.c b/drivers/media/video/hdpvr/hdpvr-i2c.c
|
||||
index 463b81b..60cdc06 100644
|
||||
--- a/drivers/media/video/hdpvr/hdpvr-i2c.c
|
||||
+++ b/drivers/media/video/hdpvr/hdpvr-i2c.c
|
||||
@@ -10,6 +10,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
||||
+
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
@@ -22,8 +24,11 @@
|
||||
#define REQTYPE_I2C_WRITE 0xb0
|
||||
#define REQTYPE_I2C_WRITE_STATT 0xd0
|
||||
|
||||
-static int hdpvr_i2c_read(struct hdpvr_device *dev, unsigned char addr,
|
||||
- char *data, int len)
|
||||
+#define HDPVR_HW_Z8F0811_IR_TX_I2C_ADDR 0x70
|
||||
+#define HDPVR_HW_Z8F0811_IR_RX_I2C_ADDR 0x71
|
||||
+
|
||||
+static int hdpvr_i2c_read(struct hdpvr_device *dev, int bus,
|
||||
+ unsigned char addr, char *data, int len)
|
||||
{
|
||||
int ret;
|
||||
char *buf = kmalloc(len, GFP_KERNEL);
|
||||
@@ -33,7 +38,7 @@ static int hdpvr_i2c_read(struct hdpvr_device *dev, unsigned char addr,
|
||||
ret = usb_control_msg(dev->udev,
|
||||
usb_rcvctrlpipe(dev->udev, 0),
|
||||
REQTYPE_I2C_READ, CTRL_READ_REQUEST,
|
||||
- 0x100|addr, 0, buf, len, 1000);
|
||||
+ (bus << 8) | addr, 0, buf, len, 1000);
|
||||
|
||||
if (ret == len) {
|
||||
memcpy(data, buf, len);
|
||||
@@ -46,8 +51,8 @@ static int hdpvr_i2c_read(struct hdpvr_device *dev, unsigned char addr,
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int hdpvr_i2c_write(struct hdpvr_device *dev, unsigned char addr,
|
||||
- char *data, int len)
|
||||
+static int hdpvr_i2c_write(struct hdpvr_device *dev, int bus,
|
||||
+ unsigned char addr, char *data, int len)
|
||||
{
|
||||
int ret;
|
||||
char *buf = kmalloc(len, GFP_KERNEL);
|
||||
@@ -58,7 +63,7 @@ static int hdpvr_i2c_write(struct hdpvr_device *dev, unsigned char addr,
|
||||
ret = usb_control_msg(dev->udev,
|
||||
usb_sndctrlpipe(dev->udev, 0),
|
||||
REQTYPE_I2C_WRITE, CTRL_WRITE_REQUEST,
|
||||
- 0x100|addr, 0, buf, len, 1000);
|
||||
+ (bus << 8) | addr, 0, buf, len, 1000);
|
||||
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
@@ -68,7 +73,7 @@ static int hdpvr_i2c_write(struct hdpvr_device *dev, unsigned char addr,
|
||||
REQTYPE_I2C_WRITE_STATT, CTRL_READ_REQUEST,
|
||||
0, 0, buf, 2, 1000);
|
||||
|
||||
- if (ret == 2)
|
||||
+ if ((ret == 2) && (buf[1] == (len - 1)))
|
||||
ret = 0;
|
||||
else if (ret >= 0)
|
||||
ret = -EIO;
|
||||
@@ -93,10 +98,10 @@ static int hdpvr_transfer(struct i2c_adapter *i2c_adapter, struct i2c_msg *msgs,
|
||||
addr = msgs[i].addr << 1;
|
||||
|
||||
if (msgs[i].flags & I2C_M_RD)
|
||||
- retval = hdpvr_i2c_read(dev, addr, msgs[i].buf,
|
||||
+ retval = hdpvr_i2c_read(dev, 1, addr, msgs[i].buf,
|
||||
msgs[i].len);
|
||||
else
|
||||
- retval = hdpvr_i2c_write(dev, addr, msgs[i].buf,
|
||||
+ retval = hdpvr_i2c_write(dev, 1, addr, msgs[i].buf,
|
||||
msgs[i].len);
|
||||
}
|
||||
|
||||
@@ -115,30 +120,58 @@ static struct i2c_algorithm hdpvr_algo = {
|
||||
.functionality = hdpvr_functionality,
|
||||
};
|
||||
|
||||
+static struct i2c_adapter hdpvr_i2c_adapter_template = {
|
||||
+ .name = "Hauppage HD PVR I2C",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .id = I2C_HW_B_HDPVR,
|
||||
+ .algo = &hdpvr_algo,
|
||||
+};
|
||||
+
|
||||
+static struct i2c_board_info hdpvr_i2c_board_info = {
|
||||
+ I2C_BOARD_INFO("ir_tx_z8f0811_haup", HDPVR_HW_Z8F0811_IR_TX_I2C_ADDR),
|
||||
+ I2C_BOARD_INFO("ir_rx_z8f0811_haup", HDPVR_HW_Z8F0811_IR_RX_I2C_ADDR),
|
||||
+};
|
||||
+
|
||||
+static int hdpvr_activate_ir(struct hdpvr_device *dev)
|
||||
+{
|
||||
+ char buffer[8];
|
||||
+
|
||||
+ mutex_lock(&dev->i2c_mutex);
|
||||
+
|
||||
+ hdpvr_i2c_read(dev, 0, 0x54, buffer, 1);
|
||||
+
|
||||
+ buffer[0] = 0;
|
||||
+ buffer[1] = 0x8;
|
||||
+ hdpvr_i2c_write(dev, 1, 0x54, buffer, 2);
|
||||
+
|
||||
+ buffer[1] = 0x18;
|
||||
+ hdpvr_i2c_write(dev, 1, 0x54, buffer, 2);
|
||||
+
|
||||
+ mutex_unlock(&dev->i2c_mutex);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int hdpvr_register_i2c_adapter(struct hdpvr_device *dev)
|
||||
{
|
||||
- struct i2c_adapter *i2c_adap;
|
||||
int retval = -ENOMEM;
|
||||
|
||||
- i2c_adap = kzalloc(sizeof(struct i2c_adapter), GFP_KERNEL);
|
||||
- if (i2c_adap == NULL)
|
||||
- goto error;
|
||||
+ hdpvr_activate_ir(dev);
|
||||
|
||||
- strlcpy(i2c_adap->name, "Hauppauge HD PVR I2C",
|
||||
- sizeof(i2c_adap->name));
|
||||
- i2c_adap->algo = &hdpvr_algo;
|
||||
- i2c_adap->owner = THIS_MODULE;
|
||||
- i2c_adap->dev.parent = &dev->udev->dev;
|
||||
+ memcpy(&dev->i2c_adapter, &hdpvr_i2c_adapter_template,
|
||||
+ sizeof(struct i2c_adapter));
|
||||
+ dev->i2c_adapter.dev.parent = &dev->udev->dev;
|
||||
|
||||
- i2c_set_adapdata(i2c_adap, dev);
|
||||
+ i2c_set_adapdata(&dev->i2c_adapter, dev);
|
||||
|
||||
- retval = i2c_add_adapter(i2c_adap);
|
||||
+ retval = i2c_add_adapter(&dev->i2c_adapter);
|
||||
+ if (retval)
|
||||
+ goto error;
|
||||
|
||||
- if (!retval)
|
||||
- dev->i2c_adapter = i2c_adap;
|
||||
- else
|
||||
- kfree(i2c_adap);
|
||||
+ i2c_new_device(&dev->i2c_adapter, &hdpvr_i2c_board_info);
|
||||
|
||||
error:
|
||||
return retval;
|
||||
}
|
||||
+
|
||||
+#endif
|
||||
diff --git a/drivers/media/video/hdpvr/hdpvr-video.c b/drivers/media/video/hdpvr/hdpvr-video.c
|
||||
index c338f3f..26fd9bf 100644
|
||||
--- a/drivers/media/video/hdpvr/hdpvr-video.c
|
||||
+++ b/drivers/media/video/hdpvr/hdpvr-video.c
|
||||
@@ -1221,12 +1221,9 @@ static void hdpvr_device_release(struct video_device *vdev)
|
||||
v4l2_device_unregister(&dev->v4l2_dev);
|
||||
|
||||
/* deregister I2C adapter */
|
||||
-#ifdef CONFIG_I2C
|
||||
+#if defined(CONFIG_I2C) || (CONFIG_I2C_MODULE)
|
||||
mutex_lock(&dev->i2c_mutex);
|
||||
- if (dev->i2c_adapter)
|
||||
- i2c_del_adapter(dev->i2c_adapter);
|
||||
- kfree(dev->i2c_adapter);
|
||||
- dev->i2c_adapter = NULL;
|
||||
+ i2c_del_adapter(&dev->i2c_adapter);
|
||||
mutex_unlock(&dev->i2c_mutex);
|
||||
#endif /* CONFIG_I2C */
|
||||
|
||||
diff --git a/drivers/media/video/hdpvr/hdpvr.h b/drivers/media/video/hdpvr/hdpvr.h
|
||||
index b0f046d..2107055 100644
|
||||
--- a/drivers/media/video/hdpvr/hdpvr.h
|
||||
+++ b/drivers/media/video/hdpvr/hdpvr.h
|
||||
@@ -102,7 +102,7 @@ struct hdpvr_device {
|
||||
struct work_struct worker;
|
||||
|
||||
/* I2C adapter */
|
||||
- struct i2c_adapter *i2c_adapter;
|
||||
+ struct i2c_adapter i2c_adapter;
|
||||
/* I2C lock */
|
||||
struct mutex i2c_mutex;
|
||||
|
||||
diff --git a/include/linux/i2c-id.h b/include/linux/i2c-id.h
|
||||
index 4bef5c5..4385341 100644
|
||||
--- a/include/linux/i2c-id.h
|
||||
+++ b/include/linux/i2c-id.h
|
||||
@@ -33,5 +33,6 @@
|
||||
|
||||
/* --- Bit algorithm adapters */
|
||||
#define I2C_HW_B_CX2388x 0x01001b /* connexant 2388x based tv cards */
|
||||
+#define I2C_HW_B_HDPVR 0x010025 /* Hauppauge HD PVR */
|
||||
|
||||
#endif /* LINUX_I2C_ID_H */
|
80
kernel.spec
80
kernel.spec
|
@ -23,7 +23,8 @@ Summary: The Linux kernel
|
|||
#
|
||||
# (Uncomment the '#' and both spaces below to set the buildid.)
|
||||
#
|
||||
# % define buildid .local
|
||||
%define buildid .pnfs.2011.03.25
|
||||
|
||||
###################################################################
|
||||
|
||||
# The buildid can also be specified on the rpmbuild command line
|
||||
|
@ -51,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 7
|
||||
%global fedora_build %{baserelease}
|
||||
|
||||
# base_sublevel is the kernel version we're starting with and patching
|
||||
|
@ -63,7 +64,7 @@ Summary: The Linux kernel
|
|||
%if 0%{?released_kernel}
|
||||
|
||||
# Do we have a -stable update to apply?
|
||||
%define stable_update 0
|
||||
%define stable_update 1
|
||||
# Is it a -stable RC?
|
||||
%define stable_rc 0
|
||||
# Set rpm version accordingly
|
||||
|
@ -345,7 +346,7 @@ Summary: The Linux kernel
|
|||
%define asmarch sparc
|
||||
%define all_arch_configs kernel-%{version}-sparc64*.config
|
||||
%define make_target image
|
||||
%define kernel_image arch/sparc/boot/image
|
||||
%define kernel_image vmlinux
|
||||
%define image_install_path boot
|
||||
%define with_perf 0
|
||||
%endif
|
||||
|
@ -642,9 +643,10 @@ Patch391: linux-2.6-acpi-video-dos.patch
|
|||
Patch393: acpi-ec-add-delay-before-write.patch
|
||||
Patch394: linux-2.6-acpi-debug-infinite-loop.patch
|
||||
|
||||
Patch399: acpi_battery-fribble-sysfs-files-from-a-resume-notifier.patch
|
||||
|
||||
Patch450: linux-2.6-input-kill-stupid-messages.patch
|
||||
Patch452: linux-2.6.30-no-pcspkr-modalias.patch
|
||||
Patch454: thinkpad-acpi-fix-backlight.patch
|
||||
|
||||
Patch460: linux-2.6-serial-460800.patch
|
||||
|
||||
|
@ -672,6 +674,8 @@ Patch1555: fix_xen_guest_on_old_EC2.patch
|
|||
Patch1810: drm-nouveau-updates.patch
|
||||
Patch1819: drm-intel-big-hammer.patch
|
||||
# intel drm is all merged upstream
|
||||
# fix for 945G corruption will hit stable eventually
|
||||
Patch1821: drm-i915-fix-pipelined-fencing.patch
|
||||
Patch1824: drm-intel-next.patch
|
||||
# make sure the lvds comes back on lid open
|
||||
Patch1825: drm-intel-make-lvds-work.patch
|
||||
|
@ -698,7 +702,6 @@ Patch2910: linux-2.6-v4l-dvb-add-lgdt3304-support.patch
|
|||
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
|
||||
|
||||
|
@ -721,10 +724,8 @@ Patch12018: neuter_intel_microcode_load.patch
|
|||
Patch12101: apple_backlight.patch
|
||||
Patch12102: efifb_update.patch
|
||||
Patch12200: acpi_reboot.patch
|
||||
Patch12210: efi_default_physical.patch
|
||||
|
||||
# Runtime power management
|
||||
Patch12202: linux-2.6-ehci-check-port-status.patch
|
||||
Patch12203: linux-2.6-usb-pci-autosuspend.patch
|
||||
Patch12204: linux-2.6-enable-more-pci-autosuspend.patch
|
||||
Patch12205: runtime_pm_fixups.patch
|
||||
|
@ -733,6 +734,15 @@ Patch12303: dmar-disable-when-ricoh-multifunction.patch
|
|||
|
||||
Patch12421: fs-call-security_d_instantiate-in-d_obtain_alias.patch
|
||||
|
||||
# Fix possible memory corruption on Dell HW
|
||||
Patch12430: dcdbas-force-smi-to-happen-when-expected.patch
|
||||
|
||||
# CVE-2011-1182
|
||||
Patch12431: prevent-rt_sigqueueinfo-and-rt_tgsigqueueinfo-from-spoofing-the-signal-code.patch
|
||||
|
||||
Patch30000: pnfs-all-2.6.38-2011-03-25.patch
|
||||
Patch30001: linux-2.6-pnfs-compile.patch
|
||||
Patch30002: linux-2.6.35-inline.patch
|
||||
%endif
|
||||
|
||||
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
|
||||
|
@ -1225,6 +1235,7 @@ ApplyPatch linux-2.6-defaults-acpi-video.patch
|
|||
ApplyPatch linux-2.6-acpi-video-dos.patch
|
||||
ApplyPatch acpi-ec-add-delay-before-write.patch
|
||||
ApplyPatch linux-2.6-acpi-debug-infinite-loop.patch
|
||||
ApplyPatch acpi_battery-fribble-sysfs-files-from-a-resume-notifier.patch
|
||||
|
||||
# Various low-impact patches to aid debugging.
|
||||
ApplyPatch linux-2.6-debug-sizeof-structs.patch
|
||||
|
@ -1265,8 +1276,6 @@ ApplyPatch die-floppy-die.patch
|
|||
|
||||
ApplyPatch linux-2.6.30-no-pcspkr-modalias.patch
|
||||
|
||||
#ApplyPatch thinkpad-acpi-fix-backlight.patch
|
||||
|
||||
# Allow to use 480600 baud on 16C950 UARTs
|
||||
ApplyPatch linux-2.6-serial-460800.patch
|
||||
|
||||
|
@ -1307,6 +1316,7 @@ ApplyPatch drm-intel-big-hammer.patch
|
|||
ApplyPatch drm-intel-make-lvds-work.patch
|
||||
ApplyPatch linux-2.6-intel-iommu-igfx.patch
|
||||
ApplyPatch drm-intel-edp-fixes.patch
|
||||
ApplyPatch drm-i915-fix-pipelined-fencing.patch
|
||||
# rhbz#681285 (i965: crash in brw_wm_surface_state.c::prepare_wm_surfaces()
|
||||
# where intelObj->mt == NULL)
|
||||
#ApplyPatch drm-i915-gen4-has-non-power-of-two-strides.patch
|
||||
|
@ -1330,8 +1340,6 @@ ApplyOptionalPatch linux-2.6-v4l-dvb-experimental.patch
|
|||
|
||||
# http://www.lirc.org/
|
||||
#ApplyOptionalPatch lirc-staging-2.6.36-fixes.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
|
||||
|
@ -1349,10 +1357,8 @@ ApplyPatch neuter_intel_microcode_load.patch
|
|||
ApplyPatch apple_backlight.patch
|
||||
ApplyPatch efifb_update.patch
|
||||
ApplyPatch acpi_reboot.patch
|
||||
ApplyPatch efi_default_physical.patch
|
||||
|
||||
# Runtime PM
|
||||
ApplyPatch linux-2.6-ehci-check-port-status.patch
|
||||
#ApplyPatch linux-2.6-usb-pci-autosuspend.patch
|
||||
### Broken by implicit notify support & ACPICA rebase
|
||||
###ApplyPatch linux-2.6-enable-more-pci-autosuspend.patch
|
||||
|
@ -1364,6 +1370,15 @@ ApplyPatch dmar-disable-when-ricoh-multifunction.patch
|
|||
# rhbz#662344,600690
|
||||
ApplyPatch fs-call-security_d_instantiate-in-d_obtain_alias.patch
|
||||
|
||||
# Fix possible memory corruption on Dell HW
|
||||
ApplyPatch dcdbas-force-smi-to-happen-when-expected.patch
|
||||
|
||||
# CVE-2011-1182
|
||||
ApplyPatch prevent-rt_sigqueueinfo-and-rt_tgsigqueueinfo-from-spoofing-the-signal-code.patch
|
||||
|
||||
ApplyPatch pnfs-all-2.6.38-2011-03-25.patch
|
||||
ApplyPatch linux-2.6-pnfs-compile.patch
|
||||
ApplyPatch linux-2.6.35-inline.patch
|
||||
# END OF PATCH APPLICATIONS
|
||||
|
||||
%endif
|
||||
|
@ -1972,6 +1987,43 @@ fi
|
|||
# and build.
|
||||
|
||||
%changelog
|
||||
* Sat Mar 26 2011 Steve Dickson <steved@redhat.com> 2.6.38.1-6.pnfs
|
||||
- Updated to the latest pNFS branch: pnfs-all-2.6.38-2011-03-25
|
||||
|
||||
* Fri Mar 25 2011 Chuck Ebbert <cebbert@redhat.com>
|
||||
- CVE-2011-1182: kernel signal spoofing issue
|
||||
- Drop unused patches already applied upstream:
|
||||
hdpvr-ir-enable.patch
|
||||
thinkpad-acpi-fix-backlight.patch
|
||||
|
||||
* Wed Mar 23 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38.1-6
|
||||
- Linux 2.6.38.1
|
||||
- Drop linux-2.6-ehci-check-port-status.patch, merged in .38.1
|
||||
- Add dcdbas-force-smi-to-happen-when-expected.patch
|
||||
|
||||
* Wed Mar 23 2011 Kyle McMartin <kmcmartin@redhat.com>
|
||||
- Re-create ACPI battery sysfs files on resume from suspend, fixes the
|
||||
upstream changes to the dropped
|
||||
acpi-update-battery-information-on-notification-0x81.patch.
|
||||
|
||||
* Wed Mar 23 2011 Dave Airlie <airlied@redhat.com> 2.6.38-5
|
||||
- i915: add fix for 945G misrendering terminal
|
||||
|
||||
* Tue Mar 22 2011 Ben Skeggs <bskeggs@redhat.com> 2.6.38-4
|
||||
- nouveau: implement missing bios opcode 0x5c (rhbz#688569)
|
||||
- nouveau: a couple of minor fixes from nouveau git
|
||||
|
||||
* Mon Mar 21 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-3
|
||||
- Add contents of 2.6.38.1 patch queue (in git-linus.diff)
|
||||
|
||||
* Thu Mar 17 2011 Matthew Garrett <mjg@redhat.com> 2.6.38-2
|
||||
- drop efi_default_physical.patch - it's actually setting up something that's
|
||||
neither physical nor virtual, and it's probably breaking EFI boots
|
||||
|
||||
* Wed Mar 16 2011 Dennis Gilmore <dennis@ausil.us>
|
||||
- build sparc imagae as vmlinux
|
||||
- fixes buildid conflicts since the sparc kernel is just a elf image
|
||||
|
||||
* Tue Mar 15 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-1
|
||||
- Linux 2.6.38
|
||||
|
||||
|
|
|
@ -1,54 +0,0 @@
|
|||
commit e17a07a9e0b62d5a5f0a5683ecbabad3aa95a4d5
|
||||
Author: Matthew Garrett <mjg@redhat.com>
|
||||
Date: Tue Jan 11 12:19:40 2011 -0500
|
||||
|
||||
ehci: Check individual port status registers on resume
|
||||
|
||||
If a device plug/unplug is detected on an ATI SB700 USB controller in D3,
|
||||
it appears to set the port status register but not the controller status
|
||||
register. As a result we'll fail to detect the plug event. Check the port
|
||||
status register on resume as well in order to catch this case.
|
||||
|
||||
Signed-off-by: Matthew Garrett <mjg@redhat.com>
|
||||
|
||||
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
|
||||
index 796ea0c..d9c0748 100644
|
||||
--- a/drivers/usb/host/ehci-hub.c
|
||||
+++ b/drivers/usb/host/ehci-hub.c
|
||||
@@ -106,6 +106,27 @@ static void ehci_handover_companion_ports(struct ehci_hcd *ehci)
|
||||
ehci->owned_ports = 0;
|
||||
}
|
||||
|
||||
+static int ehci_port_change(struct ehci_hcd *ehci)
|
||||
+{
|
||||
+ int i = HCS_N_PORTS(ehci->hcs_params);
|
||||
+
|
||||
+ /* First check if the controller indicates a change event */
|
||||
+
|
||||
+ if (ehci_readl(ehci, &ehci->regs->status) & STS_PCD)
|
||||
+ return 1;
|
||||
+
|
||||
+ /*
|
||||
+ * Not all controllers appear to update this while going from D3 to D0,
|
||||
+ * so check the individual port status registers as well
|
||||
+ */
|
||||
+
|
||||
+ while (i--)
|
||||
+ if (ehci_readl(ehci, &ehci->regs->port_status[i]) & PORT_CSC)
|
||||
+ return 1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void ehci_adjust_port_wakeup_flags(struct ehci_hcd *ehci,
|
||||
bool suspending, bool do_wakeup)
|
||||
{
|
||||
@@ -168,7 +189,7 @@ static void ehci_adjust_port_wakeup_flags(struct ehci_hcd *ehci,
|
||||
}
|
||||
|
||||
/* Does the root hub have a port wakeup pending? */
|
||||
- if (!suspending && (ehci_readl(ehci, &ehci->regs->status) & STS_PCD))
|
||||
+ if (!suspending && ehci_port_change(ehci))
|
||||
usb_hcd_resume_root_hub(ehci_to_hcd(ehci));
|
||||
|
||||
spin_unlock_irqrestore(&ehci->lock, flags);
|
|
@ -0,0 +1,12 @@
|
|||
diff -up linux-2.6.38.noarch/include/net/inet_connection_sock.h.orig linux-2.6.38.noarch/include/net/inet_connection_sock.h
|
||||
--- linux-2.6.38.noarch/include/net/inet_connection_sock.h.orig 2011-03-26 08:15:35.417892830 -0400
|
||||
+++ linux-2.6.38.noarch/include/net/inet_connection_sock.h 2011-03-26 08:15:45.301801362 -0400
|
||||
@@ -23,7 +23,7 @@
|
||||
#include <net/inet_sock.h>
|
||||
#include <net/request_sock.h>
|
||||
|
||||
-#define INET_CSK_DEBUG 1
|
||||
+//#define INET_CSK_DEBUG 1
|
||||
|
||||
/* Cancel timers, when they are not required. */
|
||||
#undef INET_CSK_CLEAR_TIMERS
|
|
@ -0,0 +1,11 @@
|
|||
diff -up linux-2.6.34.noarch/arch/x86/Makefile.orig linux-2.6.34.noarch/arch/x86/Makefile
|
||||
--- linux-2.6.34.noarch/arch/x86/Makefile.orig 2010-07-01 13:33:21.859627499 -0400
|
||||
+++ linux-2.6.34.noarch/arch/x86/Makefile 2010-07-01 13:36:26.751576450 -0400
|
||||
@@ -81,6 +81,7 @@ ifdef CONFIG_CC_STACKPROTECTOR
|
||||
$(warning stack protector enabled but no compiler support)
|
||||
endif
|
||||
endif
|
||||
+KBUILD_CFLAGS += -fno-inline-functions-called-once
|
||||
|
||||
# Don't unroll struct assignments with kmemcheck enabled
|
||||
ifeq ($(CONFIG_KMEMCHECK),y)
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,64 @@
|
|||
From: Julien Tinnes <jln@google.com>
|
||||
Date: Fri, 18 Mar 2011 22:05:21 +0000 (-0700)
|
||||
Subject: Prevent rt_sigqueueinfo and rt_tgsigqueueinfo from spoofing the signal code
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=da48524eb20662618854bb3df2db01fc65f3070c
|
||||
|
||||
Prevent rt_sigqueueinfo and rt_tgsigqueueinfo from spoofing the signal code
|
||||
|
||||
Userland should be able to trust the pid and uid of the sender of a
|
||||
signal if the si_code is SI_TKILL.
|
||||
|
||||
Unfortunately, the kernel has historically allowed sigqueueinfo() to
|
||||
send any si_code at all (as long as it was negative - to distinguish it
|
||||
from kernel-generated signals like SIGILL etc), so it could spoof a
|
||||
SI_TKILL with incorrect siginfo values.
|
||||
|
||||
Happily, it looks like glibc has always set si_code to the appropriate
|
||||
SI_QUEUE, so there are probably no actual user code that ever uses
|
||||
anything but the appropriate SI_QUEUE flag.
|
||||
|
||||
So just tighten the check for si_code (we used to allow any negative
|
||||
value), and add a (one-time) warning in case there are binaries out
|
||||
there that might depend on using other si_code values.
|
||||
|
||||
Signed-off-by: Julien Tinnes <jln@google.com>
|
||||
Acked-by: Oleg Nesterov <oleg@redhat.com>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
|
||||
diff --git a/kernel/signal.c b/kernel/signal.c
|
||||
index 4e3cff1..3175186 100644
|
||||
--- a/kernel/signal.c
|
||||
+++ b/kernel/signal.c
|
||||
@@ -2421,9 +2421,13 @@ SYSCALL_DEFINE3(rt_sigqueueinfo, pid_t, pid, int, sig,
|
||||
return -EFAULT;
|
||||
|
||||
/* Not even root can pretend to send signals from the kernel.
|
||||
- Nor can they impersonate a kill(), which adds source info. */
|
||||
- if (info.si_code >= 0)
|
||||
+ * Nor can they impersonate a kill()/tgkill(), which adds source info.
|
||||
+ */
|
||||
+ if (info.si_code != SI_QUEUE) {
|
||||
+ /* We used to allow any < 0 si_code */
|
||||
+ WARN_ON_ONCE(info.si_code < 0);
|
||||
return -EPERM;
|
||||
+ }
|
||||
info.si_signo = sig;
|
||||
|
||||
/* POSIX.1b doesn't mention process groups. */
|
||||
@@ -2437,9 +2441,13 @@ long do_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig, siginfo_t *info)
|
||||
return -EINVAL;
|
||||
|
||||
/* Not even root can pretend to send signals from the kernel.
|
||||
- Nor can they impersonate a kill(), which adds source info. */
|
||||
- if (info->si_code >= 0)
|
||||
+ * Nor can they impersonate a kill()/tgkill(), which adds source info.
|
||||
+ */
|
||||
+ if (info->si_code != SI_QUEUE) {
|
||||
+ /* We used to allow any < 0 si_code */
|
||||
+ WARN_ON_ONCE(info->si_code < 0);
|
||||
return -EPERM;
|
||||
+ }
|
||||
info->si_signo = sig;
|
||||
|
||||
return do_send_specific(tgid, pid, sig, info);
|
1
sources
1
sources
|
@ -1 +1,2 @@
|
|||
7d471477bfa67546f902da62227fa976 linux-2.6.38.tar.bz2
|
||||
bd2be4d0465345e4e9355d6773f5f6fe patch-2.6.38.1.bz2
|
||||
|
|
|
@ -1,56 +0,0 @@
|
|||
diff -up linux-2.6.34.noarch/drivers/platform/x86/thinkpad_acpi.c.orig linux-2.6.34.noarch/drivers/platform/x86/thinkpad_acpi.c
|
||||
--- linux-2.6.34.noarch/drivers/platform/x86/thinkpad_acpi.c.orig 2010-05-17 16:28:13.254200070 -0400
|
||||
+++ linux-2.6.34.noarch/drivers/platform/x86/thinkpad_acpi.c 2010-05-17 16:29:56.471200083 -0400
|
||||
@@ -3397,7 +3397,7 @@ static int __init hotkey_init(struct ibm
|
||||
/* update bright_acpimode... */
|
||||
tpacpi_check_std_acpi_brightness_support();
|
||||
|
||||
- if (tp_features.bright_acpimode && acpi_video_backlight_support()) {
|
||||
+ if (acpi_video_backlight_support()) {
|
||||
printk(TPACPI_INFO
|
||||
"This ThinkPad has standard ACPI backlight "
|
||||
"brightness control, supported by the ACPI "
|
||||
@@ -6189,26 +6189,24 @@ static int __init brightness_init(struct
|
||||
* going to publish a backlight interface
|
||||
*/
|
||||
b = tpacpi_check_std_acpi_brightness_support();
|
||||
- if (b > 0) {
|
||||
|
||||
- if (acpi_video_backlight_support()) {
|
||||
- if (brightness_enable > 1) {
|
||||
- printk(TPACPI_NOTICE
|
||||
- "Standard ACPI backlight interface "
|
||||
- "available, not loading native one.\n");
|
||||
- return 1;
|
||||
- } else if (brightness_enable == 1) {
|
||||
- printk(TPACPI_NOTICE
|
||||
- "Backlight control force enabled, even if standard "
|
||||
- "ACPI backlight interface is available\n");
|
||||
- }
|
||||
- } else {
|
||||
- if (brightness_enable > 1) {
|
||||
- printk(TPACPI_NOTICE
|
||||
- "Standard ACPI backlight interface not "
|
||||
- "available, thinkpad_acpi native "
|
||||
- "brightness control enabled\n");
|
||||
- }
|
||||
+ if (acpi_video_backlight_support()) {
|
||||
+ if (brightness_enable > 1) {
|
||||
+ printk(TPACPI_NOTICE
|
||||
+ "Standard ACPI backlight interface "
|
||||
+ "available, not loading native one.\n");
|
||||
+ return 1;
|
||||
+ } else if (brightness_enable == 1) {
|
||||
+ printk(TPACPI_NOTICE
|
||||
+ "Backlight control force enabled, even if standard "
|
||||
+ "ACPI backlight interface is available\n");
|
||||
+ }
|
||||
+ } else {
|
||||
+ if (brightness_enable > 1) {
|
||||
+ printk(TPACPI_NOTICE
|
||||
+ "Standard ACPI backlight interface not "
|
||||
+ "available, thinkpad_acpi native "
|
||||
+ "brightness control enabled\n");
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue