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
|
--- a/drivers/hid/hid-core.c
|
||||||
+++ b/drivers/hid/hid-core.c
|
+++ b/drivers/hid/hid-core.c
|
||||||
@@ -1244,8 +1244,6 @@ static const struct hid_device_id hid_blacklist[] = {
|
@@ -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) },
|
{ 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_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_IRCONTROL4) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },
|
{ 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_THRUSTMASTER=m
|
||||||
CONFIG_HID_ZEROPLUS=m
|
CONFIG_HID_ZEROPLUS=m
|
||||||
CONFIG_HID_ZYDACRON=m
|
CONFIG_HID_ZYDACRON=m
|
||||||
|
CONFIG_HID_ACRUX=m
|
||||||
CONFIG_HID_ACRUX_FF=m
|
CONFIG_HID_ACRUX_FF=m
|
||||||
CONFIG_HID_EMS_FF=m
|
CONFIG_HID_EMS_FF=m
|
||||||
CONFIG_HID_ELECOM=m
|
CONFIG_HID_ELECOM=m
|
||||||
|
@ -3547,6 +3548,15 @@ CONFIG_NFSD_V3=y
|
||||||
CONFIG_NFSD_V3_ACL=y
|
CONFIG_NFSD_V3_ACL=y
|
||||||
CONFIG_NFSD_V4=y
|
CONFIG_NFSD_V4=y
|
||||||
CONFIG_NFS_FSCACHE=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_LEGACY_DNS is not set
|
||||||
# CONFIG_NFS_USE_NEW_IDMAPPER is not set
|
# CONFIG_NFS_USE_NEW_IDMAPPER is not set
|
||||||
# CONFIG_NFSD_DEPRECATED 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_bo.c | 6 +-
|
||||||
drivers/gpu/drm/nouveau/nouveau_channel.c | 2 +-
|
drivers/gpu/drm/nouveau/nouveau_channel.c | 2 +-
|
||||||
drivers/gpu/drm/nouveau/nouveau_display.c | 2 +-
|
drivers/gpu/drm/nouveau/nouveau_display.c | 2 +-
|
||||||
drivers/gpu/drm/nouveau/nouveau_dp.c | 2 -
|
drivers/gpu/drm/nouveau/nouveau_dp.c | 2 -
|
||||||
drivers/gpu/drm/nouveau/nouveau_drv.h | 15 +-
|
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_mem.c | 50 +++-
|
||||||
drivers/gpu/drm/nouveau/nouveau_object.c | 22 ++-
|
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_sgdma.c | 341 +++++++++++++++++++++++++----
|
||||||
drivers/gpu/drm/nouveau/nouveau_state.c | 10 +-
|
drivers/gpu/drm/nouveau/nouveau_state.c | 10 +-
|
||||||
drivers/gpu/drm/nouveau/nouveau_temp.c | 4 +-
|
drivers/gpu/drm/nouveau/nouveau_temp.c | 4 +-
|
||||||
drivers/gpu/drm/nouveau/nouveau_util.c | 23 ++-
|
drivers/gpu/drm/nouveau/nouveau_util.c | 23 ++-
|
||||||
drivers/gpu/drm/nouveau/nouveau_util.h | 4 +
|
drivers/gpu/drm/nouveau/nouveau_util.h | 4 +
|
||||||
drivers/gpu/drm/nouveau/nouveau_vm.c | 13 +-
|
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/nv04_fifo.c | 19 ++-
|
||||||
drivers/gpu/drm/nouveau/nv40_fb.c | 59 +++++-
|
drivers/gpu/drm/nouveau/nv40_fb.c | 59 +++++-
|
||||||
drivers/gpu/drm/nouveau/nv50_display.c | 7 +-
|
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_fb.c | 150 ++++++++++++-
|
||||||
drivers/gpu/drm/nouveau/nv50_fifo.c | 3 +-
|
drivers/gpu/drm/nouveau/nv50_fifo.c | 3 +-
|
||||||
drivers/gpu/drm/nouveau/nv50_gpio.c | 13 +-
|
drivers/gpu/drm/nouveau/nv50_gpio.c | 13 +-
|
||||||
|
@ -24,13 +27,68 @@
|
||||||
drivers/gpu/drm/nouveau/nv84_crypt.c | 2 +-
|
drivers/gpu/drm/nouveau/nv84_crypt.c | 2 +-
|
||||||
drivers/gpu/drm/nouveau/nvc0_fifo.c | 15 +-
|
drivers/gpu/drm/nouveau/nvc0_fifo.c | 15 +-
|
||||||
drivers/gpu/drm/nouveau/nvc0_graph.c | 2 -
|
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
|
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
|
--- a/drivers/gpu/drm/nouveau/nouveau_bios.c
|
||||||
+++ b/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
|
static void
|
||||||
parse_dcb_connector_table(struct nvbios *bios)
|
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->type = (cte->entry & 0x000000ff) >> 0;
|
||||||
cte->index2 = (cte->entry & 0x00000f00) >> 8;
|
cte->index2 = (cte->entry & 0x00000f00) >> 8;
|
||||||
|
@ -69,6 +127,39 @@ index 6bdab89..b8ff1e7 100644
|
||||||
|
|
||||||
if (cte->type == 0xff)
|
if (cte->type == 0xff)
|
||||||
continue;
|
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
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
|
||||||
index a521840..53a8000 100644
|
index a521840..53a8000 100644
|
||||||
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
|
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
|
||||||
|
@ -185,10 +276,18 @@ index 982d70b..2cae8e7 100644
|
||||||
/* nvc0_fb.c */
|
/* nvc0_fb.c */
|
||||||
extern int nvc0_fb_init(struct drm_device *);
|
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
|
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
|
--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
|
||||||
+++ b/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"
|
#include "nouveau_dma.h"
|
||||||
|
|
||||||
#define USE_REFCNT(dev) (nouveau_private(dev)->chipset >= 0x10)
|
#define USE_REFCNT(dev) (nouveau_private(dev)->chipset >= 0x10)
|
||||||
|
@ -198,7 +297,33 @@ index 221b846..8b46392 100644
|
||||||
|
|
||||||
struct nouveau_fence {
|
struct nouveau_fence {
|
||||||
struct nouveau_channel *channel;
|
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 *
|
static struct nouveau_semaphore *
|
||||||
|
@ -213,7 +338,7 @@ index 221b846..8b46392 100644
|
||||||
|
|
||||||
if (!USE_SEMA(dev))
|
if (!USE_SEMA(dev))
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -277,9 +277,9 @@ alloc_semaphore(struct drm_device *dev)
|
@@ -277,9 +286,9 @@ alloc_semaphore(struct drm_device *dev)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
spin_lock(&dev_priv->fence.lock);
|
spin_lock(&dev_priv->fence.lock);
|
||||||
|
@ -225,7 +350,7 @@ index 221b846..8b46392 100644
|
||||||
spin_unlock(&dev_priv->fence.lock);
|
spin_unlock(&dev_priv->fence.lock);
|
||||||
|
|
||||||
if (!sema->mem)
|
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);
|
kref_init(&sema->ref);
|
||||||
sema->dev = dev;
|
sema->dev = dev;
|
||||||
|
@ -235,7 +360,7 @@ index 221b846..8b46392 100644
|
||||||
|
|
||||||
return sema;
|
return sema;
|
||||||
fail:
|
fail:
|
||||||
@@ -296,7 +297,7 @@ fail:
|
@@ -296,7 +306,7 @@ fail:
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -244,7 +369,7 @@ index 221b846..8b46392 100644
|
||||||
{
|
{
|
||||||
struct nouveau_semaphore *sema =
|
struct nouveau_semaphore *sema =
|
||||||
container_of(ref, struct nouveau_semaphore, ref);
|
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))
|
if (unlikely(!signalled))
|
||||||
nouveau_bo_wr32(dev_priv->fence.bo, sema->mem->start / 4, 1);
|
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) {
|
+ if (dev_priv->chipset < 0xc0) {
|
||||||
+ struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
|
+ struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
|
||||||
+ u64 offset = vma->offset + sema->mem->start;
|
+ 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);
|
- BEGIN_RING(chan, NvSubSw, method, 1);
|
||||||
- OUT_RING(chan, 1);
|
- OUT_RING(chan, 1);
|
||||||
|
@ -376,19 +514,6 @@ index 221b846..8b46392 100644
|
||||||
+ if (ret)
|
+ if (ret)
|
||||||
+ return 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);
|
+ BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
|
||||||
+ OUT_RING (chan, upper_32_bits(offset));
|
+ OUT_RING (chan, upper_32_bits(offset));
|
||||||
+ OUT_RING (chan, lower_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 */
|
/* 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);
|
kref_get(&sema->ref);
|
||||||
nouveau_fence_work(fence, semaphore_work, sema);
|
nouveau_fence_work(fence, semaphore_work, sema);
|
||||||
nouveau_fence_unref(&fence);
|
nouveau_fence_unref(&fence);
|
||||||
|
@ -405,7 +530,7 @@ index 221b846..8b46392 100644
|
||||||
return 0;
|
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)))
|
nouveau_fence_signalled(fence)))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -414,7 +539,7 @@ index 221b846..8b46392 100644
|
||||||
if (!sema) {
|
if (!sema) {
|
||||||
/* Early card or broken userspace, fall back to
|
/* Early card or broken userspace, fall back to
|
||||||
* software sync. */
|
* 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 */
|
/* Make wchan wait until it gets signalled */
|
||||||
|
@ -435,7 +560,7 @@ index 221b846..8b46392 100644
|
||||||
out:
|
out:
|
||||||
if (chan)
|
if (chan)
|
||||||
nouveau_channel_put_unlocked(&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;
|
struct nouveau_gpuobj *obj = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -467,7 +592,7 @@ index 221b846..8b46392 100644
|
||||||
struct ttm_mem_reg *mem = &dev_priv->fence.bo->bo.mem;
|
struct ttm_mem_reg *mem = &dev_priv->fence.bo->bo.mem;
|
||||||
|
|
||||||
ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY,
|
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;
|
return ret;
|
||||||
BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
|
BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
|
||||||
OUT_RING(chan, NvSema);
|
OUT_RING(chan, NvSema);
|
||||||
|
@ -489,7 +614,7 @@ index 221b846..8b46392 100644
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -519,11 +572,12 @@ int
|
@@ -519,11 +581,12 @@ int
|
||||||
nouveau_fence_init(struct drm_device *dev)
|
nouveau_fence_init(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
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
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
|
||||||
index 9a250eb..a26383b 100644
|
index 9a250eb..a26383b 100644
|
||||||
--- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c
|
--- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c
|
||||||
|
@ -1161,6 +1299,30 @@ index 97d82ae..b4658f7 100644
|
||||||
} else {
|
} else {
|
||||||
kfree(vm);
|
kfree(vm);
|
||||||
return -ENOSYS;
|
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
|
diff --git a/drivers/gpu/drm/nouveau/nv04_fifo.c b/drivers/gpu/drm/nouveau/nv04_fifo.c
|
||||||
index f89d104..db465a3 100644
|
index f89d104..db465a3 100644
|
||||||
--- a/drivers/gpu/drm/nouveau/nv04_fifo.c
|
--- a/drivers/gpu/drm/nouveau/nv04_fifo.c
|
||||||
|
@ -1329,6 +1491,18 @@ index 7cc94ed..a804a35 100644
|
||||||
delayed |= clock;
|
delayed |= clock;
|
||||||
intr1 &= ~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
|
diff --git a/drivers/gpu/drm/nouveau/nv50_fb.c b/drivers/gpu/drm/nouveau/nv50_fb.c
|
||||||
index 50290de..efc8cd4 100644
|
index 50290de..efc8cd4 100644
|
||||||
--- a/drivers/gpu/drm/nouveau/nv50_fb.c
|
--- 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.)
|
# (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
|
# 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 non-released -rc kernels, this will be prepended with "0.", so
|
||||||
# for example a 3 here will become 0.3
|
# for example a 3 here will become 0.3
|
||||||
#
|
#
|
||||||
%global baserelease 1
|
%global baserelease 7
|
||||||
%global fedora_build %{baserelease}
|
%global fedora_build %{baserelease}
|
||||||
|
|
||||||
# base_sublevel is the kernel version we're starting with and patching
|
# base_sublevel is the kernel version we're starting with and patching
|
||||||
|
@ -63,7 +64,7 @@ Summary: The Linux kernel
|
||||||
%if 0%{?released_kernel}
|
%if 0%{?released_kernel}
|
||||||
|
|
||||||
# Do we have a -stable update to apply?
|
# Do we have a -stable update to apply?
|
||||||
%define stable_update 0
|
%define stable_update 1
|
||||||
# Is it a -stable RC?
|
# Is it a -stable RC?
|
||||||
%define stable_rc 0
|
%define stable_rc 0
|
||||||
# Set rpm version accordingly
|
# Set rpm version accordingly
|
||||||
|
@ -345,7 +346,7 @@ Summary: The Linux kernel
|
||||||
%define asmarch sparc
|
%define asmarch sparc
|
||||||
%define all_arch_configs kernel-%{version}-sparc64*.config
|
%define all_arch_configs kernel-%{version}-sparc64*.config
|
||||||
%define make_target image
|
%define make_target image
|
||||||
%define kernel_image arch/sparc/boot/image
|
%define kernel_image vmlinux
|
||||||
%define image_install_path boot
|
%define image_install_path boot
|
||||||
%define with_perf 0
|
%define with_perf 0
|
||||||
%endif
|
%endif
|
||||||
|
@ -642,9 +643,10 @@ Patch391: linux-2.6-acpi-video-dos.patch
|
||||||
Patch393: acpi-ec-add-delay-before-write.patch
|
Patch393: acpi-ec-add-delay-before-write.patch
|
||||||
Patch394: linux-2.6-acpi-debug-infinite-loop.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
|
Patch450: linux-2.6-input-kill-stupid-messages.patch
|
||||||
Patch452: linux-2.6.30-no-pcspkr-modalias.patch
|
Patch452: linux-2.6.30-no-pcspkr-modalias.patch
|
||||||
Patch454: thinkpad-acpi-fix-backlight.patch
|
|
||||||
|
|
||||||
Patch460: linux-2.6-serial-460800.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
|
Patch1810: drm-nouveau-updates.patch
|
||||||
Patch1819: drm-intel-big-hammer.patch
|
Patch1819: drm-intel-big-hammer.patch
|
||||||
# intel drm is all merged upstream
|
# 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
|
Patch1824: drm-intel-next.patch
|
||||||
# make sure the lvds comes back on lid open
|
# make sure the lvds comes back on lid open
|
||||||
Patch1825: drm-intel-make-lvds-work.patch
|
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
|
Patch2912: linux-2.6-v4l-dvb-ir-core-update.patch
|
||||||
|
|
||||||
#Patch2916: lirc-staging-2.6.36-fixes.patch
|
#Patch2916: lirc-staging-2.6.36-fixes.patch
|
||||||
#Patch2917: hdpvr-ir-enable.patch
|
|
||||||
|
|
||||||
Patch2918: flexcop-fix-xlate_proc_name-warning.patch
|
Patch2918: flexcop-fix-xlate_proc_name-warning.patch
|
||||||
|
|
||||||
|
@ -721,10 +724,8 @@ Patch12018: neuter_intel_microcode_load.patch
|
||||||
Patch12101: apple_backlight.patch
|
Patch12101: apple_backlight.patch
|
||||||
Patch12102: efifb_update.patch
|
Patch12102: efifb_update.patch
|
||||||
Patch12200: acpi_reboot.patch
|
Patch12200: acpi_reboot.patch
|
||||||
Patch12210: efi_default_physical.patch
|
|
||||||
|
|
||||||
# Runtime power management
|
# Runtime power management
|
||||||
Patch12202: linux-2.6-ehci-check-port-status.patch
|
|
||||||
Patch12203: linux-2.6-usb-pci-autosuspend.patch
|
Patch12203: linux-2.6-usb-pci-autosuspend.patch
|
||||||
Patch12204: linux-2.6-enable-more-pci-autosuspend.patch
|
Patch12204: linux-2.6-enable-more-pci-autosuspend.patch
|
||||||
Patch12205: runtime_pm_fixups.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
|
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
|
%endif
|
||||||
|
|
||||||
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
|
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 linux-2.6-acpi-video-dos.patch
|
||||||
ApplyPatch acpi-ec-add-delay-before-write.patch
|
ApplyPatch acpi-ec-add-delay-before-write.patch
|
||||||
ApplyPatch linux-2.6-acpi-debug-infinite-loop.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.
|
# Various low-impact patches to aid debugging.
|
||||||
ApplyPatch linux-2.6-debug-sizeof-structs.patch
|
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 linux-2.6.30-no-pcspkr-modalias.patch
|
||||||
|
|
||||||
#ApplyPatch thinkpad-acpi-fix-backlight.patch
|
|
||||||
|
|
||||||
# Allow to use 480600 baud on 16C950 UARTs
|
# Allow to use 480600 baud on 16C950 UARTs
|
||||||
ApplyPatch linux-2.6-serial-460800.patch
|
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 drm-intel-make-lvds-work.patch
|
||||||
ApplyPatch linux-2.6-intel-iommu-igfx.patch
|
ApplyPatch linux-2.6-intel-iommu-igfx.patch
|
||||||
ApplyPatch drm-intel-edp-fixes.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()
|
# rhbz#681285 (i965: crash in brw_wm_surface_state.c::prepare_wm_surfaces()
|
||||||
# where intelObj->mt == NULL)
|
# where intelObj->mt == NULL)
|
||||||
#ApplyPatch drm-i915-gen4-has-non-power-of-two-strides.patch
|
#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/
|
# http://www.lirc.org/
|
||||||
#ApplyOptionalPatch lirc-staging-2.6.36-fixes.patch
|
#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
|
# rhbz#664852
|
||||||
ApplyPatch flexcop-fix-xlate_proc_name-warning.patch
|
ApplyPatch flexcop-fix-xlate_proc_name-warning.patch
|
||||||
|
@ -1349,10 +1357,8 @@ ApplyPatch neuter_intel_microcode_load.patch
|
||||||
ApplyPatch apple_backlight.patch
|
ApplyPatch apple_backlight.patch
|
||||||
ApplyPatch efifb_update.patch
|
ApplyPatch efifb_update.patch
|
||||||
ApplyPatch acpi_reboot.patch
|
ApplyPatch acpi_reboot.patch
|
||||||
ApplyPatch efi_default_physical.patch
|
|
||||||
|
|
||||||
# Runtime PM
|
# Runtime PM
|
||||||
ApplyPatch linux-2.6-ehci-check-port-status.patch
|
|
||||||
#ApplyPatch linux-2.6-usb-pci-autosuspend.patch
|
#ApplyPatch linux-2.6-usb-pci-autosuspend.patch
|
||||||
### Broken by implicit notify support & ACPICA rebase
|
### Broken by implicit notify support & ACPICA rebase
|
||||||
###ApplyPatch linux-2.6-enable-more-pci-autosuspend.patch
|
###ApplyPatch linux-2.6-enable-more-pci-autosuspend.patch
|
||||||
|
@ -1364,6 +1370,15 @@ ApplyPatch dmar-disable-when-ricoh-multifunction.patch
|
||||||
# rhbz#662344,600690
|
# rhbz#662344,600690
|
||||||
ApplyPatch fs-call-security_d_instantiate-in-d_obtain_alias.patch
|
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
|
# END OF PATCH APPLICATIONS
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
|
@ -1972,6 +1987,43 @@ fi
|
||||||
# and build.
|
# and build.
|
||||||
|
|
||||||
%changelog
|
%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
|
* Tue Mar 15 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-1
|
||||||
- Linux 2.6.38
|
- 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
|
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