[kernel/f15] Rebase to 3.2.2

Dave Jones davej at fedoraproject.org
Mon Jan 30 17:01:48 UTC 2012


commit 8c3a2d06dc1aec56f0b0bff92e81df4c512b8aa6
Author: Dave Jones <davej at redhat.com>
Date:   Mon Jan 30 12:01:31 2012 -0500

    Rebase to 3.2.2

 .gitignore                                         |    1 +
 ...imit-direct-reclaim-for-higher-order-allo.patch |   54 -
 ...claim-compaction-if-compaction-can-procee.patch |   81 -
 01-block-add-and-use-scsi_blk_cmd_ioctl.patch      |  166 -
 ...SCSI-passthrough-ioctls-on-partition-devs.patch |  165 -
 ...ont-fwd-ioctls-from-LVs-to-underlying-dev.patch |   91 -
 Bluetooth-Add-support-for-BCM20702A0.patch         |   15 -
 HID-wacom-Set-input-bits-before-registration.patch |  131 -
 ...8xx-Fix-NULL-pointer-dereference-in-slave.patch |   35 -
 add-appleir-usb-driver.patch                       |  701 -
 alps.patch                                         |  243 +-
 arm-tegra-usb-no-reset.patch                       |   29 -
 b44-Use-dev_kfree_skb_irq-in-b44_tx.patch          |   62 -
 bcma-brcmsmac-compat.patch                         |   35 -
 ...member-vlan-pkts-not-received-in-promisco.patch |   63 -
 benet-remove-bogus-unlikely-on-vlan-check.patch    |   39 -
 brcm80211.patch                                    |97238 --------------------
 cciss-fix-irqf-shared.patch                        |   39 -
 config-arm-generic                                 |   14 +
 config-arm-imx                                     |    3 +
 config-arm-omap-generic                            |   22 +
 config-arm-tegra                                   |    7 +
 config-debug                                       |    5 +-
 config-generic                                     | 1037 +-
 config-nodebug                                     |    5 +-
 config-powerpc-generic                             |   97 +-
 config-powerpc32-generic                           |   64 +-
 config-powerpc64                                   |   69 +-
 config-s390x                                       |    2 +
 config-sparc64-generic                             |   14 +-
 config-x86-32-generic                              |    9 +-
 config-x86-generic                                 |   25 +-
 config-x86_64-generic                              |   15 +-
 drm-i915-sdvo-lvds-is-digital.patch                |   83 -
 drm-lower-severity-radeon-lockup.diff              |   13 -
 drm-nouveau-updates.patch                          | 8526 --
 elantech.patch                                     | 2180 -
 epoll-limit-paths.patch                            |    8 +-
 ...-Support-check-none-nocheck-mount-options.patch |   51 +
 ...rent-block-device-if-fsync-called-on-part.patch |  106 +
 hvcs_pi_buf_alloc.patch                            |   43 -
 kernel.spec                                        |  170 +-
 linux-2.6-32bit-mmap-exec-randomization.patch      |   27 +-
 linux-2.6-debug-taint-vm.patch                     |   51 -
 linux-2.6-e1000-ich9-montevina.patch               |   28 +-
 linux-2.6-i386-nx-emulation.patch                  |   22 -
 linux-2.6-intel-iommu-igfx.patch                   |   35 +-
 ...revent-information-leak-after-failed-read.patch |   41 -
 mac80211_offchannel_rework_revert.patch            |  594 -
 media-dib0700-correct-error-message.patch          |  103 -
 ...ynchronous-compaction-for-THP-allocations.patch |  115 -
 msi-irq-sysfs-warning.patch                        |   87 +
 net-sky2-88e8059-fix-link-speed.patch              |   42 -
 nfs-client-freezer.patch                           |  112 +-
 proc-clean-up-and-fix-proc-pid-mem-handling.patch  |  268 -
 rcu-avoid-just-onlined-cpu-resched.patch           |   47 -
 rcu-reintroduce-missing-calls.patch                |  632 +
 rcutree-avoid-false-quiescent-states.patch         |   67 -
 ...ake-rds_sock_lock-BH-rather-than-IRQ-safe.patch |  116 +
 rtl8192cu-Fix-WARNING-on-suspend-resume.patch      |   54 +-
 samsung-laptop-brightness-fixes-3.2.patch          |  238 -
 sources                                            |    4 +-
 sysfs-msi-irq-per-device.patch                     |  239 +
 thp-reduce-khugepaged-freezing-latency.patch       |   54 -
 tpm_tis-delay-after-aborting-cmd.patch             |   17 +
 udlfb-bind-framebuffer-to-interface.patch          |   33 -
 utrace.patch                                       | 1652 +-
 x86-code-dump-fix-truncation.patch                 |   73 -
 68 files changed, 2824 insertions(+), 113683 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index edb6bec..a23ef2d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 clog
+*.xz
 *.bz2
 *.rpm
 *.orig
diff --git a/alps.patch b/alps.patch
index e76dc54..331716d 100644
--- a/alps.patch
+++ b/alps.patch
@@ -1,7 +1,7 @@
-From ed11aa781242216bc72f1cd7d757a4f40be10329 Mon Sep 17 00:00:00 2001
+From d4b347b29b4d14647c7394f7167bf6785dc98e50 Mon Sep 17 00:00:00 2001
 From: Seth Forshee <seth.forshee at canonical.com>
 Date: Mon, 7 Nov 2011 19:53:15 -0800
-Subject: [PATCH 1/7] Input: ALPS - move protocol information to Documentation
+Subject: [PATCH 1/6] Input: ALPS - move protocol information to Documentation
 
 In preparation for new protocol support, move the protocol
 information currently documented in alps.c to
@@ -99,10 +99,10 @@ index 0000000..ab5478f
 + byte 7:    0   y6   y5   y4   y3   y2   y1   y0
 + byte 8:    0   z6   z5   z4   z3   z2   z1   z0
 diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index 99d5876..ad15e7c 100644
+index 003587c..19d0943 100644
 --- a/drivers/input/mouse/alps.c
 +++ b/drivers/input/mouse/alps.c
-@@ -74,42 +74,7 @@ static const struct alps_model_info alps_model_data[] = {
+@@ -67,42 +67,7 @@ static const struct alps_model_info alps_model_data[] = {
   * isn't valid per PS/2 spec.
   */
  
@@ -150,10 +150,10 @@ index 99d5876..ad15e7c 100644
 1.7.7.3
 
 
-From 27b8ed51ee660e9a59cf325d6339f38b216fbb31 Mon Sep 17 00:00:00 2001
+From fa629ef5222193214da9a2b3c94369f79353bec9 Mon Sep 17 00:00:00 2001
 From: Seth Forshee <seth.forshee at canonical.com>
 Date: Mon, 7 Nov 2011 19:53:24 -0800
-Subject: [PATCH 2/7] Input: ALPS - add protocol version field in
+Subject: [PATCH 2/6] Input: ALPS - add protocol version field in
  alps_model_info
 
 In preparation for adding support for more ALPS protocol versions,
@@ -164,28 +164,24 @@ version 1 and version 2, repsectively.
 Signed-off-by: Seth Forshee <seth.forshee at canonical.com>
 Acked-by: Chase Douglas <chase.douglas at canonical.com>
 Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
-
-Conflicts:
-
-	drivers/input/mouse/alps.c
 ---
  drivers/input/mouse/alps.c |   47 +++++++++++++++++++++----------------------
  drivers/input/mouse/alps.h |    4 +++
  2 files changed, 27 insertions(+), 24 deletions(-)
 
 diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index ad15e7c..572cb21 100644
+index 19d0943..77b776d 100644
 --- a/drivers/input/mouse/alps.c
 +++ b/drivers/input/mouse/alps.c
-@@ -30,7 +30,6 @@
- #define dbg(format, arg...) do {} while (0)
- #endif
+@@ -23,7 +23,6 @@
+ #include "psmouse.h"
+ #include "alps.h"
  
 -#define ALPS_OLDPROTO		0x01	/* old style input */
  #define ALPS_DUALPOINT		0x02	/* touchpad has trackstick */
  #define ALPS_PASS		0x04	/* device has a pass-through port */
  
-@@ -42,30 +41,30 @@
+@@ -35,30 +34,30 @@
  					   6-byte ALPS packet */
  
  static const struct alps_model_info alps_model_data[] = {
@@ -238,7 +234,7 @@ index ad15e7c..572cb21 100644
  };
  
  /*
-@@ -119,7 +118,7 @@ static void alps_process_packet(struct psmouse *psmouse)
+@@ -112,7 +111,7 @@ static void alps_process_packet(struct psmouse *psmouse)
  	int x, y, z, ges, fin, left, right, middle;
  	int back = 0, forward = 0;
  
@@ -268,10 +264,10 @@ index 904ed8b..4ce9bba 100644
 1.7.7.3
 
 
-From dfab9d3e073f2a58e4ba3837a726e9a0e33ea5df Mon Sep 17 00:00:00 2001
+From b46615fe9215214ac00e26d35fc54dbe1c510803 Mon Sep 17 00:00:00 2001
 From: Seth Forshee <seth.forshee at canonical.com>
 Date: Mon, 7 Nov 2011 19:53:30 -0800
-Subject: [PATCH 3/7] Input: ALPS - remove assumptions about packet size
+Subject: [PATCH 3/6] Input: ALPS - remove assumptions about packet size
 
 In preparation for version 4 protocol support, which has 8-byte
 data packets, remove all hard-coded assumptions about packet size
@@ -285,10 +281,10 @@ Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
  1 files changed, 5 insertions(+), 5 deletions(-)
 
 diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index 572cb21..f699698 100644
+index 77b776d..44a0a71 100644
 --- a/drivers/input/mouse/alps.c
 +++ b/drivers/input/mouse/alps.c
-@@ -315,7 +315,7 @@ static void alps_flush_packet(unsigned long data)
+@@ -308,7 +308,7 @@ static void alps_flush_packet(unsigned long data)
  
  	serio_pause_rx(psmouse->ps2dev.serio);
  
@@ -297,7 +293,7 @@ index 572cb21..f699698 100644
  
  		/*
  		 * We did not any more data in reasonable amount of time.
-@@ -365,15 +365,15 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
+@@ -359,8 +359,8 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
  		return PSMOUSE_BAD_DATA;
  	}
  
@@ -306,8 +302,9 @@ index 572cb21..f699698 100644
 +	/* Bytes 2 - pktsize should have 0 in the highest bit */
 +	if (psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize &&
  	    (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) {
- 		dbg("refusing packet[%i] = %x\n",
- 		    psmouse->pktcnt - 1, psmouse->packet[psmouse->pktcnt - 1]);
+ 		psmouse_dbg(psmouse, "refusing packet[%i] = %x\n",
+ 			    psmouse->pktcnt - 1,
+@@ -368,7 +368,7 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
  		return PSMOUSE_BAD_DATA;
  	}
  
@@ -316,7 +313,7 @@ index 572cb21..f699698 100644
  		alps_process_packet(psmouse);
  		return PSMOUSE_FULL_PACKET;
  	}
-@@ -531,7 +531,7 @@ static int alps_tap_mode(struct psmouse *psmouse, int enable)
+@@ -529,7 +529,7 @@ static int alps_tap_mode(struct psmouse *psmouse, int enable)
  static int alps_poll(struct psmouse *psmouse)
  {
  	struct alps_data *priv = psmouse->private;
@@ -329,10 +326,10 @@ index 572cb21..f699698 100644
 1.7.7.3
 
 
-From 35f17ba201d7a8b8adc59811effafe62a331fd9e Mon Sep 17 00:00:00 2001
+From 25bded7cd60fa460e520e9f819bd06f4c5cb53f0 Mon Sep 17 00:00:00 2001
 From: Seth Forshee <seth.forshee at canonical.com>
 Date: Mon, 7 Nov 2011 19:53:36 -0800
-Subject: [PATCH 4/7] Input: ALPS - add support for protocol versions 3 and 4
+Subject: [PATCH 4/6] Input: ALPS - add support for protocol versions 3 and 4
 
 This patch adds support for two ALPS touchpad protocols not
 supported currently by the driver, which I am arbitrarily naming
@@ -345,23 +342,19 @@ of the v3 protocol.
 Signed-off-by: Seth Forshee <seth.forshee at canonical.com>
 Acked-by: Chase Douglas <chase.douglas at canonical.com>
 Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
-
-Conflicts:
-
-	drivers/input/mouse/alps.c
 ---
- drivers/input/mouse/alps.c    |  790 +++++++++++++++++++++++++++++++++++++++--
+ drivers/input/mouse/alps.c    |  791 +++++++++++++++++++++++++++++++++++++++--
  drivers/input/mouse/alps.h    |   14 +
  drivers/input/mouse/psmouse.h |    1 +
- 3 files changed, 767 insertions(+), 38 deletions(-)
+ 3 files changed, 768 insertions(+), 38 deletions(-)
 
 diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index f699698..b2bc8ca 100644
+index 44a0a71..a0248fd 100644
 --- a/drivers/input/mouse/alps.c
 +++ b/drivers/input/mouse/alps.c
-@@ -30,6 +30,49 @@
- #define dbg(format, arg...) do {} while (0)
- #endif
+@@ -23,6 +23,50 @@
+ #include "psmouse.h"
+ #include "alps.h"
  
 +/*
 + * Definitions for ALPS version 3 and 4 command mode protocol
@@ -406,10 +399,11 @@ index f699698..b2bc8ca 100644
 +	{ PSMOUSE_CMD_SETSCALE11,	0x00 }, /* f */
 +};
 +
++
  #define ALPS_DUALPOINT		0x02	/* touchpad has trackstick */
  #define ALPS_PASS		0x04	/* device has a pass-through port */
  
-@@ -41,30 +84,33 @@
+@@ -34,30 +78,33 @@
  					   6-byte ALPS packet */
  
  static const struct alps_model_info alps_model_data[] = {
@@ -465,7 +459,7 @@ index f699698..b2bc8ca 100644
  };
  
  /*
-@@ -108,7 +154,7 @@ static void alps_report_buttons(struct psmouse *psmouse,
+@@ -101,7 +148,7 @@ static void alps_report_buttons(struct psmouse *psmouse,
  	input_sync(dev2);
  }
  
@@ -474,7 +468,7 @@ index f699698..b2bc8ca 100644
  {
  	struct alps_data *priv = psmouse->private;
  	const struct alps_model_info *model = priv->i;
-@@ -210,6 +256,224 @@ static void alps_process_packet(struct psmouse *psmouse)
+@@ -203,6 +250,224 @@ static void alps_process_packet(struct psmouse *psmouse)
  	input_sync(dev);
  }
  
@@ -699,7 +693,7 @@ index f699698..b2bc8ca 100644
  static void alps_report_bare_ps2_packet(struct psmouse *psmouse,
  					unsigned char packet[],
  					bool report_buttons)
-@@ -381,11 +645,127 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
+@@ -376,11 +641,127 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
  	return PSMOUSE_GOOD_DATA;
  }
  
@@ -827,7 +821,7 @@ index f699698..b2bc8ca 100644
  	int i;
  
  	/*
-@@ -431,12 +811,41 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int
+@@ -428,12 +809,41 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int
  		*version = (param[0] << 8) | (param[1] << 4) | i;
  	}
  
@@ -873,7 +867,7 @@ index f699698..b2bc8ca 100644
  }
  
  /*
-@@ -444,7 +853,7 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int
+@@ -441,7 +851,7 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int
   * subsequent commands. It looks like glidepad is behind stickpointer,
   * I'd thought it would be other way around...
   */
@@ -882,7 +876,7 @@ index f699698..b2bc8ca 100644
  {
  	struct ps2dev *ps2dev = &psmouse->ps2dev;
  	int cmd = enable ? PSMOUSE_CMD_SETSCALE21 : PSMOUSE_CMD_SETSCALE11;
-@@ -461,7 +870,7 @@ static int alps_passthrough_mode(struct psmouse *psmouse, bool enable)
+@@ -458,7 +868,7 @@ static int alps_passthrough_mode(struct psmouse *psmouse, bool enable)
  	return 0;
  }
  
@@ -891,7 +885,7 @@ index f699698..b2bc8ca 100644
  {
  	struct ps2dev *ps2dev = &psmouse->ps2dev;
  
-@@ -535,13 +944,13 @@ static int alps_poll(struct psmouse *psmouse)
+@@ -533,13 +943,13 @@ static int alps_poll(struct psmouse *psmouse)
  	bool poll_failed;
  
  	if (priv->i->flags & ALPS_PASS)
@@ -907,7 +901,7 @@ index f699698..b2bc8ca 100644
  
  	if (poll_failed || (buf[0] & priv->i->mask0) != priv->i->byte0)
  		return -1;
-@@ -558,13 +967,13 @@ static int alps_poll(struct psmouse *psmouse)
+@@ -556,13 +966,13 @@ static int alps_poll(struct psmouse *psmouse)
  	return 0;
  }
  
@@ -923,13 +917,13 @@ index f699698..b2bc8ca 100644
  		return -1;
  	}
  
-@@ -573,13 +982,13 @@ static int alps_hw_init(struct psmouse *psmouse)
+@@ -571,13 +981,13 @@ static int alps_hw_init(struct psmouse *psmouse)
  		return -1;
  	}
  
 -	if (alps_absolute_mode(psmouse)) {
 +	if (alps_absolute_mode_v1_v2(psmouse)) {
- 		printk(KERN_ERR "alps.c: Failed to enable absolute mode\n");
+ 		psmouse_err(psmouse, "Failed to enable absolute mode\n");
  		return -1;
  	}
  
@@ -939,7 +933,7 @@ index f699698..b2bc8ca 100644
  		return -1;
  	}
  
-@@ -592,6 +1001,297 @@ static int alps_hw_init(struct psmouse *psmouse)
+@@ -590,6 +1000,297 @@ static int alps_hw_init(struct psmouse *psmouse)
  	return 0;
  }
  
@@ -1237,7 +1231,7 @@ index f699698..b2bc8ca 100644
  static int alps_reconnect(struct psmouse *psmouse)
  {
  	const struct alps_model_info *model;
-@@ -632,6 +1332,8 @@ int alps_init(struct psmouse *psmouse)
+@@ -630,6 +1331,8 @@ int alps_init(struct psmouse *psmouse)
  
  	psmouse->private = priv;
  
@@ -1246,7 +1240,7 @@ index f699698..b2bc8ca 100644
  	model = alps_get_model(psmouse, &version);
  	if (!model)
  		goto init_fail;
-@@ -659,8 +1361,20 @@ int alps_init(struct psmouse *psmouse)
+@@ -657,8 +1360,20 @@ int alps_init(struct psmouse *psmouse)
  		BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_RIGHT);
  
  	dev1->evbit[BIT_WORD(EV_ABS)] |= BIT_MASK(EV_ABS);
@@ -1269,7 +1263,7 @@ index f699698..b2bc8ca 100644
  	input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0);
  
  	if (model->flags & ALPS_WHEEL) {
-@@ -703,7 +1417,7 @@ int alps_init(struct psmouse *psmouse)
+@@ -701,7 +1416,7 @@ int alps_init(struct psmouse *psmouse)
  	psmouse->poll = alps_poll;
  	psmouse->disconnect = alps_disconnect;
  	psmouse->reconnect = alps_reconnect;
@@ -1320,7 +1314,7 @@ index 4ce9bba..62db7f4 100644
  int alps_detect(struct psmouse *psmouse, bool set_properties);
  int alps_init(struct psmouse *psmouse);
 diff --git a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h
-index 593e910..c2b5aa6 100644
+index 9b84b0c..11a9c6c 100644
 --- a/drivers/input/mouse/psmouse.h
 +++ b/drivers/input/mouse/psmouse.h
 @@ -8,6 +8,7 @@
@@ -1335,10 +1329,10 @@ index 593e910..c2b5aa6 100644
 1.7.7.3
 
 
-From 8a2d5b12d0a47daf178a842ca009eaf344033cf8 Mon Sep 17 00:00:00 2001
+From 01ce661fc83005947dc958a5739c153843af8a73 Mon Sep 17 00:00:00 2001
 From: Seth Forshee <seth.forshee at canonical.com>
 Date: Mon, 7 Nov 2011 19:54:13 -0800
-Subject: [PATCH 5/7] Input: ALPS - add semi-MT support for v3 protocol
+Subject: [PATCH 5/6] Input: ALPS - add semi-MT support for v3 protocol
 
 Signed-off-by: Seth Forshee <seth.forshee at canonical.com>
 Acked-by: Chase Douglas <chase.douglas at canonical.com>
@@ -1349,7 +1343,7 @@ Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
  2 files changed, 215 insertions(+), 19 deletions(-)
 
 diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index b2bc8ca..15383e1 100644
+index a0248fd..bd87380 100644
 --- a/drivers/input/mouse/alps.c
 +++ b/drivers/input/mouse/alps.c
 @@ -17,6 +17,7 @@
@@ -1360,7 +1354,7 @@ index b2bc8ca..15383e1 100644
  #include <linux/serio.h>
  #include <linux/libps2.h>
  
-@@ -33,6 +34,12 @@
+@@ -26,6 +27,12 @@
  /*
   * Definitions for ALPS version 3 and 4 command mode protocol
   */
@@ -1373,7 +1367,7 @@ index b2bc8ca..15383e1 100644
  #define ALPS_CMD_NIBBLE_10	0x01f2
  
  static const struct alps_nibble_commands alps_v3_nibble_commands[] = {
-@@ -256,6 +263,137 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
+@@ -250,6 +257,137 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
  	input_sync(dev);
  }
  
@@ -1511,7 +1505,7 @@ index b2bc8ca..15383e1 100644
  static void alps_process_trackstick_packet_v3(struct psmouse *psmouse)
  {
  	struct alps_data *priv = psmouse->private;
-@@ -324,16 +462,17 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
+@@ -318,16 +456,17 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
  	struct input_dev *dev2 = priv->dev2;
  	int x, y, z;
  	int left, right, middle;
@@ -1535,7 +1529,7 @@ index b2bc8ca..15383e1 100644
  		/*
  		 * Sometimes a position packet will indicate a multi-packet
  		 * sequence, but then what follows is another position
-@@ -341,18 +480,49 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
+@@ -335,18 +474,49 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
  		 * position packet as usual.
  		 */
  		if (packet[0] & 0x40) {
@@ -1591,7 +1585,7 @@ index b2bc8ca..15383e1 100644
  
  	left = packet[3] & 0x01;
  	right = packet[3] & 0x02;
-@@ -372,22 +542,38 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
+@@ -366,22 +536,38 @@ static void alps_process_touchpad_packet_v3(struct psmouse *psmouse)
  	if (x && y && !z)
  		return;
  
@@ -1635,7 +1629,7 @@ index b2bc8ca..15383e1 100644
  	input_sync(dev);
  
  	if (!(priv->quirks & ALPS_QUIRK_TRACKSTICK_BUTTONS)) {
-@@ -1369,9 +1555,18 @@ int alps_init(struct psmouse *psmouse)
+@@ -1368,9 +1554,18 @@ int alps_init(struct psmouse *psmouse)
  		input_set_abs_params(dev1, ABS_Y, 0, 767, 0, 0);
  		break;
  	case ALPS_PROTO_V3:
@@ -1672,10 +1666,10 @@ index 62db7f4..a00a4ab 100644
 1.7.7.3
 
 
-From 281688737cb83dd113cfab809b2c78841451ba32 Mon Sep 17 00:00:00 2001
+From 7cf801cfc0774b777aa6861cf4a43a90b112b1ed Mon Sep 17 00:00:00 2001
 From: Seth Forshee <seth.forshee at canonical.com>
 Date: Mon, 7 Nov 2011 19:54:35 -0800
-Subject: [PATCH 6/7] Input: ALPS - add documentation for protocol versions 3
+Subject: [PATCH 6/6] Input: ALPS - add documentation for protocol versions 3
  and 4
 
 Also converts from using "old" and "new" to describe the already-known
@@ -1865,126 +1859,3 @@ index ab5478f..f274c28 100644
 -- 
 1.7.7.3
 
-
-From 8114d422321fa6bb724a03faf25b101868d6e03d Mon Sep 17 00:00:00 2001
-From: Josh Boyer <jwboyer at redhat.com>
-Date: Mon, 12 Dec 2011 15:12:00 -0500
-Subject: [PATCH 7/7] Revert psmouse_* print format changes from the
- backported patches.  Sigh
-
-Signed-off-by: Josh Boyer <jwboyer at redhat.com>
----
- drivers/input/mouse/alps.c |   29 ++++++++++++-----------------
- 1 files changed, 12 insertions(+), 17 deletions(-)
-
-diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
-index 15383e1..4925a63 100644
---- a/drivers/input/mouse/alps.c
-+++ b/drivers/input/mouse/alps.c
-@@ -403,7 +403,7 @@ static void alps_process_trackstick_packet_v3(struct psmouse *psmouse)
- 
- 	/* Sanity check packet */
- 	if (!(packet[0] & 0x40)) {
--		psmouse_dbg(psmouse, "Bad trackstick packet, discarding\n");
-+		dbg("Bad trackstick packet, discarding\n");
- 		return;
- 	}
- 
-@@ -922,13 +922,12 @@ static int alps_enter_command_mode(struct psmouse *psmouse,
- 	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP) ||
- 	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP) ||
- 	    ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
--		psmouse_err(psmouse, "failed to enter command mode\n");
-+		printk(KERN_ERR "alps.c: failed to enter command mode\n");
- 		return -1;
- 	}
- 
- 	if (param[0] != 0x88 && param[1] != 0x07) {
--		psmouse_dbg(psmouse,
--			    "unknown response while entering command mode: %2.2x %2.2x %2.2x\n",
-+		dbg("unknown response while entering command mode: %2.2x %2.2x %2.2x\n",
- 			    param[0], param[1], param[2]);
- 		return -1;
- 	}
-@@ -1012,8 +1011,7 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int
- 		 */
- 		model = NULL;
- 		if (alps_enter_command_mode(psmouse, param)) {
--			psmouse_warn(psmouse,
--				     "touchpad failed to enter command mode\n");
-+			printk(KERN_WARNING "alps.c: touchpad failed to enter command mode\n");
- 		} else {
- 			for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) {
- 				if (alps_model_data[i].proto_version > ALPS_PROTO_V2 &&
-@@ -1025,8 +1023,7 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int
- 			alps_exit_command_mode(psmouse);
- 
- 			if (!model)
--				psmouse_dbg(psmouse,
--					    "Unknown command mode response %2.2x\n",
-+				dbg("Unknown command mode response %2.2x\n",
- 					    param[0]);
- 		}
- 	}
-@@ -1263,10 +1260,9 @@ static int alps_hw_init_v3(struct psmouse *psmouse)
- 		    ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
- 		    ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
- 		    ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
--			psmouse_warn(psmouse, "trackstick E7 report failed\n");
-+			printk(KERN_WARNING "alps.c: trackstick E7 report failed\n");
- 		} else {
--			psmouse_dbg(psmouse,
--				    "trackstick E7 report: %2.2x %2.2x %2.2x\n",
-+			dbg("trackstick E7 report: %2.2x %2.2x %2.2x\n",
- 				    param[0], param[1], param[2]);
- 
- 			/*
-@@ -1280,8 +1276,7 @@ static int alps_hw_init_v3(struct psmouse *psmouse)
- 			    ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
- 			    alps_command_mode_send_nibble(psmouse, 0x9) ||
- 			    alps_command_mode_send_nibble(psmouse, 0x4)) {
--				psmouse_err(psmouse,
--					    "Error sending magic E6 sequence\n");
-+				printk(KERN_ERR "alps.c: Error sending magic E6 sequence\n");
- 				goto error_passthrough;
- 			}
- 		}
-@@ -1293,7 +1288,7 @@ static int alps_hw_init_v3(struct psmouse *psmouse)
- 	}
- 
- 	if (alps_absolute_mode_v3(psmouse)) {
--		psmouse_err(psmouse, "Failed to enter absolute mode\n");
-+		printk(KERN_ERR "alps.c: Failed to enter absolute mode\n");
- 		goto error;
- 	}
- 
-@@ -1343,7 +1338,7 @@ static int alps_hw_init_v3(struct psmouse *psmouse)
- 	param[0] = 0x64;
- 	if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE) ||
- 	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE)) {
--		psmouse_err(psmouse, "Failed to enable data reporting\n");
-+		printk(KERN_ERR "alps.c: Failed to enable data reporting\n");
- 		return -1;
- 	}
- 
-@@ -1392,7 +1387,7 @@ static int alps_hw_init_v4(struct psmouse *psmouse)
- 		goto error;
- 
- 	if (alps_absolute_mode_v4(psmouse)) {
--		psmouse_err(psmouse, "Failed to enter absolute mode\n");
-+		printk(KERN_ERR "alps.c: Failed to enter absolute mode\n");
- 		goto error;
- 	}
- 
-@@ -1440,7 +1435,7 @@ static int alps_hw_init_v4(struct psmouse *psmouse)
- 	param[0] = 0x64;
- 	if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE) ||
- 	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE)) {
--		psmouse_err(psmouse, "Failed to enable data reporting\n");
-+		printk(KERN_ERR "alps.c: Failed to enable data reporting\n");
- 		return -1;
- 	}
- 
--- 
-1.7.7.3
-
diff --git a/config-arm-generic b/config-arm-generic
index 3141e66..558c7c4 100644
--- a/config-arm-generic
+++ b/config-arm-generic
@@ -152,6 +152,11 @@ CONFIG_MMC_SDHCI_OF=m
 CONFIG_MMC_SDHCI_PXAV3=m
 CONFIG_MMC_SDHCI_PXAV2=m
 
+CONFIG_ARM_APPENDED_DTB=y
+CONFIG_MTD_OF_PARTS=y
+CONFIG_PL330_DMA=y
+# CONFIG_ARM_KPROBES_TEST is not set
+# CONFIG_ARM_ATAG_DTB_COMPAT is not set
 
 # CONFIG_FTGMAC100 is not set
 # CONFIG_FTMAC100 is not set
@@ -180,3 +185,12 @@ CONFIG_LSM_MMAP_MIN_ADDR=32768
 # CONFIG_SND_ALI5451 is not set
 # CONFIG_DRM_NOUVEAU is not set 
 # CONFIG_MLX4_EN is not set
+
+# FIXME: Guesses, need checking
+# CONFIG_MACH_EUKREA_CPUIMX35SD is not set
+CONFIG_ARM_ERRATA_720789=y
+CONFIG_ARM_ERRATA_751472=y
+# CONFIG_FB_MX3 is not set
+# CONFIG_MX3_IPU is not set
+# CONFIG_MX3_IPU_IRQS is not set
+
diff --git a/config-arm-imx b/config-arm-imx
index 5ed7ae2..2dbe10a 100644
--- a/config-arm-imx
+++ b/config-arm-imx
@@ -93,3 +93,6 @@ CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
 CONFIG_CPU_FREQ_TABLE=y
 CONFIG_CPU_FREQ_STAT=y
 CONFIG_CPU_FREQ_STAT_DETAILS=y
+
+CONFIG_PL310_ERRATA_769419=y
+CONFIG_LEDS_RENESAS_TPU=y
diff --git a/config-arm-omap-generic b/config-arm-omap-generic
index 03913d3..d623e18 100644
--- a/config-arm-omap-generic
+++ b/config-arm-omap-generic
@@ -1061,3 +1061,25 @@ CONFIG_LIBCRC32C=y
 CONFIG_CRYSTALHD=m
 
 CONFIG_GPIO_GENERIC_PLATFORM=y
+
+CONFIG_MACH_OMAP_GENERIC=y
+CONFIG_PL310_ERRATA_753970=y
+CONFIG_ARM_CPU_TOPOLOGY=y
+CONFIG_SCHED_MC=y
+CONFIG_SCHED_SMT=y
+CONFIG_ETHERNET=y
+CONFIG_NET_VENDOR_BROADCOM=y
+CONFIG_NET_VENDOR_MICROCHIP=y
+CONFIG_SENSORS_AD7314=m
+CONFIG_REGULATOR_GPIO=y
+CONFIG_VIDEO_MT9P031=m
+CONFIG_VIDEO_MT9T001=m
+CONFIG_VIDEO_S5K6AA=m
+CONFIG_PANEL_DVI=m
+CONFIG_PANEL_PICODLP=m
+CONFIG_USB_RENESAS_USBHS=m
+CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
+CONFIG_LEDS_RENESAS_TPU=y
+# CONFIG_OMAP_IOMMU is not set
+CONFIG_USB_RENESAS_USBHS_HCD=m
+
diff --git a/config-arm-tegra b/config-arm-tegra
index b131978..495e91e 100644
--- a/config-arm-tegra
+++ b/config-arm-tegra
@@ -83,3 +83,10 @@ CONFIG_CPU_FREQ_STAT=y
 CONFIG_CPU_FREQ_STAT_DETAILS=y
 
 CONFIG_CRYSTALHD=m
+
+CONFIG_MACH_VENTANA=y
+CONFIG_PL310_ERRATA_753970=y
+CONFIG_ARM_CPU_TOPOLOGY=y
+CONFIG_SCHED_MC=y
+CONFIG_SCHED_SMT=y
+CONFIG_LEDS_RENESAS_TPU=y
diff --git a/config-debug b/config-debug
index a252390..19ae465 100644
--- a/config-debug
+++ b/config-debug
@@ -24,6 +24,7 @@ CONFIG_FAIL_MAKE_REQUEST=y
 CONFIG_FAULT_INJECTION_DEBUG_FS=y
 CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
 CONFIG_FAIL_IO_TIMEOUT=y
+CONFIG_FAIL_MMC_REQUEST=y
 
 CONFIG_SLUB_DEBUG_ON=y
 
@@ -81,7 +82,6 @@ CONFIG_CARL9170_DEBUGFS=y
 CONFIG_IWLWIFI_DEVICE_TRACING=y
 
 CONFIG_DEBUG_OBJECTS_WORK=y
-# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
 
 CONFIG_DMADEVICES_DEBUG=y
 CONFIG_DMADEVICES_VDEBUG=y
@@ -99,9 +99,8 @@ CONFIG_KDB_KEYBOARD=y
 CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y
 CONFIG_TEST_LIST_SORT=y
 
-CONFIG_DEBUG_SET_MODULE_RONX=y
-
 CONFIG_DETECT_HUNG_TASK=y
 CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
 
+CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y
diff --git a/config-generic b/config-generic
index a459ec6..bd2c476 100644
--- a/config-generic
+++ b/config-generic
@@ -32,7 +32,7 @@ CONFIG_KERNEL_GZIP=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+CONFIG_BSD_PROCESS_ACCT_V3=y
 CONFIG_FHANDLE=y
 CONFIG_TASKSTATS=y
 CONFIG_TASK_DELAY_ACCT=y
@@ -68,6 +68,7 @@ CONFIG_SLUB=y
 
 CONFIG_MISC_DEVICES=y
 # CONFIG_AD525X_DPOT is not set
+# CONFIG_ATMEL_PWM is not set
 CONFIG_IWMC3200TOP=m
 # CONFIG_IWMC3200TOP_DEBUG is not set
 CONFIG_IWMC3200TOP_DEBUGFS=y
@@ -80,7 +81,7 @@ CONFIG_MODULE_UNLOAD=y
 # CONFIG_MODULE_FORCE_LOAD is not set
 # -- MODULE_FORCE_UNLOAD is controlled by config-debug/nodebug
 # CONFIG_MODVERSIONS is not set
-CONFIG_MODULE_SRCVERSION_ALL=y
+# CONFIG_MODULE_SRCVERSION_ALL is not set
 
 #
 # Bus options (PCI, PCMCIA, EISA, MCA, ISA)
@@ -89,6 +90,8 @@ CONFIG_PCI=y
 # CONFIG_PCI_DEBUG is not set
 CONFIG_PCI_STUB=y
 CONFIG_PCI_IOV=y
+CONFIG_PCI_PRI=y
+CONFIG_PCI_PASID=y
 CONFIG_HT_IRQ=y
 CONFIG_PCI_MSI=y
 CONFIG_PCIEPORTBUS=y
@@ -157,6 +160,7 @@ CONFIG_INFINIBAND_AMSO1100=m
 # CONFIG_INFINIBAND_AMSO1100_DEBUG is not set
 CONFIG_INFINIBAND_CXGB3=m
 CONFIG_INFINIBAND_CXGB4=m
+CONFIG_SCSI_CXGB3_ISCSI=m
 CONFIG_SCSI_CXGB4_ISCSI=m
 # CONFIG_INFINIBAND_CXGB3_DEBUG is not set
 CONFIG_MLX4_INFINIBAND=m
@@ -170,7 +174,7 @@ CONFIG_INFINIBAND_QIB=m
 CONFIG_BINFMT_ELF=y
 CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
 # CONFIG_BINFMT_AOUT is not set
-CONFIG_BINFMT_MISC=y
+CONFIG_BINFMT_MISC=m
 
 #
 # Device Drivers
@@ -273,6 +277,7 @@ CONFIG_MTDRAM_ERASE_SIZE=128
 # CONFIG_MTD_DOCPROBE is not set
 # CONFIG_MTD_DOCPROBE_ADVANCED is not set
 # CONFIG_MTD_DOCPROBE_ADDRESS is not set
+# CONFIG_MTD_DOCG3 is not set
 
 #
 # NAND Flash Device Drivers
@@ -351,13 +356,14 @@ CONFIG_BLK_CPQ_DA=m
 CONFIG_BLK_CPQ_CISS_DA=m
 CONFIG_CISS_SCSI_TAPE=y
 CONFIG_BLK_DEV_DAC960=m
+CONFIG_BLK_DEV_DRBD=m
 CONFIG_BLK_DEV_UMEM=m
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
 CONFIG_BLK_DEV_CRYPTOLOOP=m
 CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_OSD=m
-CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM=m
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=16384
 CONFIG_BLK_DEV_INITRD=y
@@ -432,6 +438,7 @@ CONFIG_BLK_DEV_IDEDMA=y
 CONFIG_VIRTIO_BLK=m
 CONFIG_VIRTIO_PCI=y
 CONFIG_VIRTIO_BALLOON=m
+CONFIG_VIRTIO_MMIO=m
 CONFIG_VIRTIO_NET=m
 CONFIG_VMXNET3=m
 CONFIG_HW_RANDOM_VIRTIO=m
@@ -498,15 +505,13 @@ CONFIG_SCSI_3W_9XXX=m
 CONFIG_SCSI_ACARD=m
 CONFIG_SCSI_AACRAID=m
 CONFIG_SCSI_AIC7XXX=m
-CONFIG_SCSI_AIC94XX=m
-# CONFIG_AIC94XX_DEBUG is not set
+CONFIG_SCSI_AIC7XXX_OLD=m
 CONFIG_AIC7XXX_CMDS_PER_DEVICE=4
 CONFIG_AIC7XXX_RESET_DELAY_MS=15000
 # CONFIG_AIC7XXX_BUILD_FIRMWARE is not set
 # CONFIG_AIC7XXX_DEBUG_ENABLE is not set
 CONFIG_AIC7XXX_DEBUG_MASK=0
 # CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set
-CONFIG_SCSI_AIC7XXX_OLD=m
 CONFIG_SCSI_AIC79XX=m
 CONFIG_AIC79XX_CMDS_PER_DEVICE=4
 CONFIG_AIC79XX_RESET_DELAY_MS=15000
@@ -514,6 +519,8 @@ CONFIG_AIC79XX_RESET_DELAY_MS=15000
 # CONFIG_AIC79XX_DEBUG_ENABLE is not set
 CONFIG_AIC79XX_DEBUG_MASK=0
 # CONFIG_AIC79XX_REG_PRETTY_PRINT is not set
+CONFIG_SCSI_AIC94XX=m
+# CONFIG_AIC94XX_DEBUG is not set
 # CONFIG_SCSI_ADVANSYS is not set
 CONFIG_SCSI_BFA_FC=m
 CONFIG_MEGARAID_NEWGEN=y
@@ -528,6 +535,8 @@ CONFIG_SCSI_MPT2SAS=m
 CONFIG_SCSI_MPT2SAS_MAX_SGE=128
 CONFIG_SCSI_MPT2SAS_LOGGING=y
 
+CONFIG_SCSI_MVUMI=m
+
 CONFIG_SCSI_OSD_INITIATOR=m
 CONFIG_SCSI_OSD_ULD=m
 CONFIG_SCSI_OSD_DPRINT_SENSE=1
@@ -543,6 +552,59 @@ CONFIG_SCSI_PM8001=m
 CONFIG_VMWARE_PVSCSI=m
 CONFIG_VMWARE_BALLOON=m
 
+CONFIG_SCSI_ARCMSR=m
+CONFIG_SCSI_BUSLOGIC=m
+CONFIG_SCSI_INITIO=m
+CONFIG_SCSI_FLASHPOINT=y
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_EATA_PIO is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+CONFIG_SCSI_GDTH=m
+CONFIG_SCSI_HPTIOP=m
+CONFIG_SCSI_IPS=m
+CONFIG_SCSI_INIA100=m
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
+# CONFIG_SCSI_IZIP_EPP16 is not set
+# CONFIG_SCSI_IZIP_SLOW_CTR is not set
+CONFIG_SCSI_STEX=m
+CONFIG_SCSI_SYM53C8XX_2=m
+CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
+CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+CONFIG_SCSI_SYM53C8XX_MMIO=y
+CONFIG_SCSI_QLOGIC_1280=m
+CONFIG_SCSI_DC395x=m
+# CONFIG_SCSI_NSP32 is not set
+CONFIG_SCSI_DEBUG=m
+CONFIG_SCSI_DC390T=m
+CONFIG_SCSI_QLA_FC=m
+CONFIG_SCSI_QLA_ISCSI=m
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_DPT_I2O is not set
+CONFIG_SCSI_LPFC=m
+# CONFIG_SCSI_LPFC_DEBUG_FS is not set
+
+# PCMCIA SCSI adapter support
+# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
+
+# ISA SCSI Controllers. Sorry your life sucks.
+# CONFIG_SCSI_AHA152X is not set
+# CONFIG_SCSI_AHA1542 is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_GENERIC_NCR5380 is not set
+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
+# CONFIG_SCSI_NCR53C406A is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_U14_34F is not set
+# CONFIG_SCSI_ULTRASTOR is not set
+
+
 CONFIG_ATA=y
 CONFIG_ATA_BMDMA=y
 CONFIG_ATA_VERBOSE_ERROR=y
@@ -622,48 +684,6 @@ CONFIG_PATA_VIA=m
 CONFIG_PATA_WINBOND=m
 CONFIG_PATA_ATP867X=m
 
-CONFIG_SCSI_BUSLOGIC=m
-CONFIG_SCSI_INITIO=m
-CONFIG_SCSI_FLASHPOINT=y
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_EATA_PIO is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-CONFIG_SCSI_GDTH=m
-CONFIG_SCSI_HPTIOP=m
-CONFIG_SCSI_IPS=m
-CONFIG_SCSI_INIA100=m
-CONFIG_SCSI_PPA=m
-CONFIG_SCSI_IMM=m
-# CONFIG_SCSI_IZIP_EPP16 is not set
-# CONFIG_SCSI_IZIP_SLOW_CTR is not set
-CONFIG_SCSI_STEX=m
-CONFIG_SCSI_SYM53C8XX_2=m
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
-CONFIG_SCSI_SYM53C8XX_MMIO=y
-CONFIG_SCSI_QLOGIC_1280=m
-CONFIG_SCSI_DC395x=m
-# CONFIG_SCSI_NSP32 is not set
-CONFIG_SCSI_DEBUG=m
-CONFIG_SCSI_DC390T=m
-CONFIG_SCSI_QLA_FC=m
-CONFIG_SCSI_QLA_ISCSI=m
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_DPT_I2O is not set
-CONFIG_SCSI_LPFC=m
-
-#
-# PCMCIA SCSI adapter support
-#
-CONFIG_SCSI_LOWLEVEL_PCMCIA=y
-CONFIG_PCMCIA_AHA152X=m
-# CONFIG_PCMCIA_FDOMAIN is not set
-CONFIG_PCMCIA_NINJA_SCSI=m
-CONFIG_PCMCIA_QLOGIC=m
-CONFIG_PCMCIA_SYM53C500=m
-
 
 #
 # Multi-device support (RAID and LVM)
@@ -687,6 +707,9 @@ CONFIG_DM_DEBUG=y
 CONFIG_DM_MIRROR=y
 CONFIG_DM_MULTIPATH=m
 CONFIG_DM_SNAPSHOT=y
+CONFIG_DM_THIN_PROVISIONING=m
+# CONFIG_DM_DEBUG_BLOCK_STACK_TRACING is not set
+# CONFIG_DM_DEBUG_SPACE_MAPS is not set
 CONFIG_DM_UEVENT=y
 CONFIG_DM_ZERO=y
 CONFIG_DM_LOG_USERSPACE=m
@@ -737,6 +760,8 @@ CONFIG_FIREWIRE_NOSY=m
 #
 CONFIG_NET=y
 
+CONFIG_NET_DMA=y
+
 CONFIG_TCP_CONG_ADVANCED=y
 CONFIG_TCP_CONG_BIC=m
 CONFIG_TCP_CONG_CUBIC=y
@@ -801,6 +826,7 @@ CONFIG_IP_VS_PROTO_UDP=y
 CONFIG_IP_VS_PROTO_ESP=y
 CONFIG_IP_VS_PROTO_AH=y
 CONFIG_IP_VS_PROTO_SCTP=y
+CONFIG_IP_VS_IPV6=y
 CONFIG_IP_VS_RR=m
 CONFIG_IP_VS_WRR=m
 CONFIG_IP_VS_LC=m
@@ -814,7 +840,7 @@ CONFIG_IP_VS_NQ=m
 CONFIG_IP_VS_FTP=m
 CONFIG_IP_VS_PE_SIP=m
 
-CONFIG_IPV6=m
+CONFIG_IPV6=y
 CONFIG_IPV6_PRIVACY=y
 CONFIG_IPV6_ROUTER_PREF=y
 CONFIG_IPV6_ROUTE_INFO=y
@@ -845,21 +871,31 @@ CONFIG_NET_9P_RDMA=m
 # CONFIG_DECNET is not set
 CONFIG_BRIDGE=m
 CONFIG_BRIDGE_IGMP_SNOOPING=y
+
+# PHY timestamping adds overhead
 # CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+
 CONFIG_NETFILTER=y
 CONFIG_NETFILTER_ADVANCED=y
 CONFIG_NF_CONNTRACK=m
 CONFIG_NETFILTER_NETLINK=m
 CONFIG_NETFILTER_NETLINK_QUEUE=m
 CONFIG_NETFILTER_NETLINK_LOG=m
+CONFIG_NETFILTER_TPROXY=m
 CONFIG_NETFILTER_XTABLES=y
 CONFIG_NETFILTER_XT_SET=m
 CONFIG_NETFILTER_XT_MARK=m
 CONFIG_NETFILTER_XT_CONNMARK=m
+
+CONFIG_NETFILTER_XT_TARGET_AUDIT=m
+CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
 CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
 CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
 CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
+CONFIG_NETFILTER_XT_TARGET_CT=m
 CONFIG_NETFILTER_XT_TARGET_DSCP=m
+CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
+CONFIG_NETFILTER_XT_TARGET_LED=m
 CONFIG_NETFILTER_XT_TARGET_MARK=m
 CONFIG_NETFILTER_XT_TARGET_NFLOG=m
 CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
@@ -870,24 +906,31 @@ CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
 CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
 CONFIG_NETFILTER_XT_TARGET_TRACE=m
 CONFIG_NETFILTER_XT_TARGET_TEE=m
-CONFIG_NETFILTER_XT_TARGET_LED=m
-CONFIG_NETFILTER_XT_TARGET_CT=m
+CONFIG_NETFILTER_XT_TARGET_TPROXY=m
+
+CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
+CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
 CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+CONFIG_NETFILTER_XT_MATCH_CPU=m
 CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
 CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
 CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
 CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
 CONFIG_NETFILTER_XT_MATCH_DCCP=m
+CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m
 CONFIG_NETFILTER_XT_MATCH_DSCP=m
 CONFIG_NETFILTER_XT_MATCH_ESP=m
 CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
 CONFIG_NETFILTER_XT_MATCH_HELPER=m
+CONFIG_NETFILTER_XT_MATCH_HL=m
 CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
+CONFIG_NETFILTER_XT_MATCH_IPVS=m
 CONFIG_NETFILTER_XT_MATCH_LENGTH=m
 CONFIG_NETFILTER_XT_MATCH_LIMIT=m
 CONFIG_NETFILTER_XT_MATCH_MAC=m
 CONFIG_NETFILTER_XT_MATCH_MARK=m
 CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+CONFIG_NETFILTER_XT_MATCH_OSF=m
 CONFIG_NETFILTER_XT_MATCH_OWNER=m
 CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
 CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
@@ -895,23 +938,15 @@ CONFIG_NETFILTER_XT_MATCH_POLICY=m
 CONFIG_NETFILTER_XT_MATCH_QUOTA=m
 CONFIG_NETFILTER_XT_MATCH_RATEEST=m
 CONFIG_NETFILTER_XT_MATCH_REALM=m
+CONFIG_NETFILTER_XT_MATCH_RECENT=m
 CONFIG_NETFILTER_XT_MATCH_SCTP=m
+CONFIG_NETFILTER_XT_MATCH_SOCKET=m
 CONFIG_NETFILTER_XT_MATCH_STATE=y
 CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
 CONFIG_NETFILTER_XT_MATCH_STRING=m
 CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
 CONFIG_NETFILTER_XT_MATCH_TIME=m
 CONFIG_NETFILTER_XT_MATCH_U32=m
-CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
-CONFIG_NETFILTER_XT_MATCH_HL=m
-CONFIG_NETFILTER_XT_MATCH_OSF=m
-CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
-CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
-CONFIG_NETFILTER_XT_MATCH_CPU=m
-CONFIG_NETFILTER_XT_MATCH_IPVS=m
-CONFIG_NETFILTER_XT_TARGET_AUDIT=m
-CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
-CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m
 
 # CONFIG_NETFILTER_DEBUG is not set
 CONFIG_BRIDGE_NETFILTER=y
@@ -1058,7 +1093,7 @@ CONFIG_LLC=m
 CONFIG_IPX=m
 # CONFIG_IPX_INTERN is not set
 CONFIG_ATALK=m
-CONFIG_DEV_APPLETALK=y
+CONFIG_DEV_APPLETALK=m
 CONFIG_IPDDP=m
 CONFIG_IPDDP_ENCAP=y
 CONFIG_IPDDP_DECAP=y
@@ -1072,7 +1107,7 @@ CONFIG_IP_DCCP_CCID2=m
 CONFIG_IP_DCCP_CCID3=y
 # CONFIG_IP_DCCP_CCID3_DEBUG is not set
 # CONFIG_IP_DCCP_DEBUG is not set
-CONFIG_NET_DCCPPROBE=m
+# CONFIG_NET_DCCPPROBE is not set
 
 #
 # TIPC Configuration (EXPERIMENTAL)
@@ -1102,6 +1137,7 @@ CONFIG_NET_SCH_TBF=m
 CONFIG_NET_SCH_TEQL=m
 CONFIG_NET_SCH_SFB=m
 CONFIG_NET_SCH_MQPRIO=m
+CONFIG_NET_SCH_MULTIQ=m
 CONFIG_NET_SCH_CHOKE=m
 CONFIG_NET_SCH_QFQ=m
 CONFIG_NET_CLS=y
@@ -1127,6 +1163,7 @@ CONFIG_NET_EMATCH_STACK=32
 CONFIG_NET_EMATCH_TEXT=m
 CONFIG_NET_EMATCH_U32=m
 
+CONFIG_NET_ACT_CSUM=m
 CONFIG_NET_ACT_GACT=m
 CONFIG_GACT_PROB=y
 CONFIG_NET_ACT_IPT=m
@@ -1135,7 +1172,7 @@ CONFIG_NET_ACT_NAT=m
 CONFIG_NET_ACT_PEDIT=m
 CONFIG_NET_ACT_POLICE=m
 CONFIG_NET_ACT_SIMP=m
-CONFIG_NET_ACT_CSUM=m
+CONFIG_NET_ACT_SKBEDIT=m
 
 CONFIG_DCB=y
 
@@ -1221,42 +1258,43 @@ CONFIG_RFKILL_INPUT=y
 #
 # Ethernet (10 or 100Mbit)
 #
-CONFIG_NETDEV_1000=y
-CONFIG_NETDEV_10000=y
-CONFIG_NET_ETHERNET=y
-CONFIG_PHYLIB=m
-CONFIG_BROADCOM_PHY=m
-CONFIG_CICADA_PHY=m
-CONFIG_DAVICOM_PHY=m
-CONFIG_FIXED_PHY=y
-CONFIG_MDIO_BITBANG=m
-CONFIG_NATIONAL_PHY=m
-CONFIG_ICPLUS_PHY=m
-CONFIG_BCM63XX_PHY=m
-CONFIG_LSI_ET1011C_PHY=m
-CONFIG_LXT_PHY=m
-CONFIG_MARVELL_PHY=m
-CONFIG_QSEMI_PHY=m
-CONFIG_REALTEK_PHY=m
-CONFIG_SMSC_PHY=m
-CONFIG_STE10XP=m
-CONFIG_VITESSE_PHY=m
-CONFIG_MICREL_PHY=m
 
-CONFIG_MII=m
-CONFIG_HAPPYMEAL=m
-CONFIG_SUNGEM=m
-CONFIG_NET_VENDOR_3COM=y
-CONFIG_VORTEX=m
-CONFIG_TYPHOON=m
-CONFIG_DNET=m
-CONFIG_STMMAC_ETH=m
-# CONFIG_STMMAC_DA is not set
-# CONFIG_STMMAC_DUAL_MAC is not set
-# CONFIG_STMMAC_TIMER is not set
+CONFIG_NET_VENDOR_ADAPTEC=y
+CONFIG_ADAPTEC_STARFIRE=m
 
-# CONFIG_PCH_GBE is not set
+CONFIG_NET_VENDOR_ALTEON=y
+CONFIG_ACENIC=m
+# CONFIG_ACENIC_OMIT_TIGON_I is not set
+
+CONFIG_NET_VENDOR_AMD=y
+# CONFIG_LANCE is not set
+CONFIG_PCNET32=m
+CONFIG_AMD8111_ETH=m
+CONFIG_PCMCIA_NMCLAN=m
+
+CONFIG_NET_VENDOR_ATHEROS=y
+CONFIG_ATL2=m
+CONFIG_ATL1=m
+CONFIG_ATL1C=m
+CONFIG_ATL1E=m
 
+CONFIG_NET_VENDOR_BROCADE=y
+CONFIG_BNA=m
+
+CONFIG_NET_VENDOR_CHELSIO=y
+CONFIG_CHELSIO_T1=m
+CONFIG_CHELSIO_T1_1G=y
+CONFIG_CHELSIO_T3=m
+CONFIG_CHELSIO_T4=m
+CONFIG_CHELSIO_T4VF=m
+
+# CONFIG_NET_VENDOR_CIRRUS is not set
+#
+CONFIG_NET_VENDOR_CISCO=y
+CONFIG_ENIC=m
+
+CONFIG_NET_VENDOR_DEC=y
+CONFIG_EWRK3=m
 #
 # Tulip family network device support
 #
@@ -1273,115 +1311,194 @@ CONFIG_WINBOND_840=m
 CONFIG_DM9102=m
 CONFIG_PCMCIA_XIRCOM=m
 CONFIG_ULI526X=m
-# CONFIG_HP100 is not set
-CONFIG_LNE390=m
-CONFIG_NE3210=m
-CONFIG_ES3210=m
-CONFIG_NET_PCI=y
-CONFIG_PCNET32=m
-CONFIG_AMD8111_ETH=m
-CONFIG_ADAPTEC_STARFIRE=m
-CONFIG_KSZ884X_PCI=m
-CONFIG_B44=m
-CONFIG_B44_PCI=y
-CONFIG_BNX2=m
-CONFIG_CNIC=m
-CONFIG_QLA3XXX=m
-CONFIG_ATL1=m
-CONFIG_ATL1C=m
-CONFIG_ATL2=m
-CONFIG_ATL1E=m
+
+CONFIG_NET_VENDOR_DLINK=y
+CONFIG_DE600=m
+CONFIG_DE620=m
+CONFIG_DL2K=m
+CONFIG_SUNDANCE=m
+# CONFIG_SUNDANCE_MMIO is not set
+
+CONFIG_NET_VENDOR_EMULEX=y
+CONFIG_BE2NET=m
+
+CONFIG_NET_VENDOR_EXAR=y
+CONFIG_S2IO=m
+CONFIG_VXGE=m
+# CONFIG_VXGE_DEBUG_TRACE_ALL is not set
+
+# CONFIG_NET_VENDOR_FARADAY is not set
+# CONFIG_NET_VENDOR_FUJITSU is not set
+# CONFIG_NET_VENDOR_HP is not set
+CONFIG_NET_VENDOR_INTEL=y
 CONFIG_E100=m
-CONFIG_FEALNX=m
-CONFIG_FORCEDETH=m
+CONFIG_E1000=m
+CONFIG_E1000E=m
+CONFIG_IGB=m
+CONFIG_IGB_DCA=y
+CONFIG_IGBVF=m
+CONFIG_IXGB=m
+CONFIG_IXGBEVF=m
+CONFIG_IXGBE=m
+CONFIG_IXGBE_DCA=y
+CONFIG_IXGBE_DCB=y
+
+# CONFIG_NET_VENDOR_I825XX is not set
+CONFIG_NET_VENDOR_MARVELL=y
+CONFIG_SKGE=m
+# CONFIG_SKGE_DEBUG is not set
+CONFIG_SKGE_GENESIS=y
+CONFIG_SKY2=m
+# CONFIG_SKY2_DEBUG is not set
+
+CONFIG_NET_VENDOR_MICREL=y
+CONFIG_KSZ884X_PCI=m
+# CONFIG_KS8842 is not set
+# CONFIG_KS8851_MLL is not set
+
+CONFIG_NET_VENDOR_MYRI=y
+CONFIG_MYRI10GE=m
+CONFIG_MYRI10GE_DCA=y
+
+CONFIG_NET_VENDOR_NATSEMI=y
 CONFIG_NATSEMI=m
+CONFIG_NS83820=m
+
+CONFIG_NET_VENDOR_8390=y
+# CONFIG_AC3200 is not set
+CONFIG_PCMCIA_AXNET=m
 CONFIG_NE2K_PCI=m
+CONFIG_NE3210=m
+CONFIG_PCMCIA_PCNET=m
+
+CONFIG_NET_VENDOR_NVIDIA=y
+CONFIG_FORCEDETH=m
+
+CONFIG_NET_VENDOR_OKI=y
+# CONFIG_PCH_GBE is not set
+
+CONFIG_NET_PACKET_ENGINE=y
+CONFIG_HAMACHI=m
+CONFIG_YELLOWFIN=m
+
+CONFIG_NET_VENDOR_QLOGIC=y
+CONFIG_QLA3XXX=m
+CONFIG_QLCNIC=m
+CONFIG_QLGE=m
+CONFIG_NETXEN_NIC=m
+
+CONFIG_NET_VENDOR_REALTEK=y
+CONFIG_ATP=m
 CONFIG_8139CP=m
 CONFIG_8139TOO=m
 # CONFIG_8139TOO_PIO is not set
 # CONFIG_8139TOO_TUNE_TWISTER is not set
 CONFIG_8139TOO_8129=y
 # CONFIG_8139_OLD_RX_RESET is not set
+CONFIG_R8169=m
+
+CONFIG_NET_VENDOR_RDC=y
+CONFIG_R6040=m
+
+# CONFIG_NET_VENDOR_SEEQ is not set
+
+CONFIG_NET_VENDOR_SILAN=y
+CONFIG_SC92031=m
+
+CONFIG_NET_VENDOR_SIS=y
 CONFIG_SIS900=m
 CONFIG_SIS190=m
+
+CONFIG_NET_VENDOR_SMSC=y
+# CONFIG_SMC9194 is not set
+CONFIG_PCMCIA_SMC91C92=m
 CONFIG_EPIC100=m
-CONFIG_SC92031=m
 CONFIG_SMSC9420=m
-CONFIG_SUNDANCE=m
-# CONFIG_SUNDANCE_MMIO is not set
+
+CONFIG_NET_VENDOR_STMICRO=y
+CONFIG_STMMAC_ETH=m
+# CONFIG_STMMAC_DA is not set
+# CONFIG_STMMAC_DUAL_MAC is not set
+# CONFIG_STMMAC_TIMER is not set
+# CONFIG_STMMAC_DEBUG_FS is not set
+
+CONFIG_NET_VENDOR_SUN=y
+CONFIG_HAPPYMEAL=m
+CONFIG_SUNGEM=m
+CONFIG_CASSINI=m
+CONFIG_NIU=m
+
+CONFIG_NET_VENDOR_TEHUTI=y
+CONFIG_TEHUTI=m
+
+CONFIG_NET_VENDOR_TI=y
 CONFIG_TLAN=m
+
+CONFIG_NET_VENDOR_VIA=y
 CONFIG_VIA_RHINE=m
 CONFIG_VIA_RHINE_MMIO=y
 CONFIG_VIA_VELOCITY=m
+
+CONFIG_NET_VENDOR_XIRCOM=y
+CONFIG_PCMCIA_XIRC2PS=m
+
+CONFIG_PHYLIB=y
+CONFIG_BROADCOM_PHY=m
+CONFIG_CICADA_PHY=m
+CONFIG_DAVICOM_PHY=m
+CONFIG_FIXED_PHY=y
+CONFIG_MDIO_BITBANG=m
+CONFIG_NATIONAL_PHY=m
+CONFIG_ICPLUS_PHY=m
+CONFIG_BCM63XX_PHY=m
+CONFIG_LSI_ET1011C_PHY=m
+CONFIG_LXT_PHY=m
+CONFIG_MARVELL_PHY=m
+CONFIG_QSEMI_PHY=m
+CONFIG_REALTEK_PHY=m
+CONFIG_SMSC_PHY=m
+CONFIG_STE10XP=m
+CONFIG_VITESSE_PHY=m
+CONFIG_MICREL_PHY=m
+
+CONFIG_MII=m
+CONFIG_NET_VENDOR_3COM=y
+CONFIG_VORTEX=m
+CONFIG_TYPHOON=m
+CONFIG_DNET=m
+
+
+CONFIG_LNE390=m
+CONFIG_ES3210=m
+CONFIG_NET_PCI=y
+CONFIG_B44=m
+CONFIG_B44_PCI=y
+CONFIG_BNX2=m
+CONFIG_CNIC=m
+CONFIG_FEALNX=m
 CONFIG_NET_POCKET=y
-CONFIG_ATP=m
-CONFIG_DE600=m
-CONFIG_DE620=m
-CONFIG_CASSINI=m
 CONFIG_ETHOC=m
-# CONFIG_KS8842 is not set
-# CONFIG_KS8851_MLL is not set
 
 #
 # Ethernet (1000 Mbit)
 #
-CONFIG_ACENIC=m
-# CONFIG_ACENIC_OMIT_TIGON_I is not set
-CONFIG_DL2K=m
-CONFIG_E1000=m
-CONFIG_E1000E=m
-CONFIG_IGB=m
-CONFIG_IGB_DCA=y
-CONFIG_IGBVF=m
-CONFIG_NS83820=m
-CONFIG_HAMACHI=m
-CONFIG_YELLOWFIN=m
-CONFIG_R8169=m
-CONFIG_SKGE=m
-# CONFIG_SKGE_DEBUG is not set
-CONFIG_SKGE_GENESIS=y
 CONFIG_TIGON3=m
-CONFIG_SKY2=m
-# CONFIG_SKY2_DEBUG is not set
 CONFIG_JME=m
 
-#
-# Ethernet (10000 Mbit)
-#
-CONFIG_CHELSIO_T1=m
-CONFIG_CHELSIO_T1_1G=y
-CONFIG_CHELSIO_T3=m
-CONFIG_CHELSIO_T4=m
-CONFIG_CHELSIO_T4VF=m
-CONFIG_IP1000=m
-CONFIG_IXGB=m
-CONFIG_IXGBEVF=m
-CONFIG_IXGBE=m
-CONFIG_IXGBE_DCA=y
-CONFIG_IXGBE_DCB=y
-CONFIG_MYRI10GE=m
-CONFIG_MYRI10GE_DCA=y
-CONFIG_NETXEN_NIC=m
-CONFIG_NIU=m
-CONFIG_S2IO=m
-CONFIG_VXGE=m
-# CONFIG_VXGE_DEBUG_TRACE_ALL is not set
-CONFIG_TEHUTI=m
-CONFIG_ENIC=m
+#
+# Ethernet (10000 Mbit)
+#
+CONFIG_IP1000=m
 CONFIG_MLX4_EN=m
 # CONFIG_MLX4_DEBUG is not set
-CONFIG_QLCNIC=m
-CONFIG_QLGE=m
-CONFIG_BNA=m
 CONFIG_SFC=m
 CONFIG_SFC_MTD=y
-CONFIG_BE2NET=m
 
-CONFIG_FDDI=y
+# CONFIG_FDDI is not set
 # CONFIG_DEFXX is not set
-CONFIG_SKFP=m
+# CONFIG_SKFP is not set
 # CONFIG_HIPPI is not set
-CONFIG_PLIP=m
+# CONFIG_PLIP is not set
 CONFIG_PPP=m
 CONFIG_PPP_MULTILINK=y
 CONFIG_PPP_FILTER=y
@@ -1389,13 +1506,10 @@ CONFIG_PPP_ASYNC=m
 CONFIG_PPP_SYNC_TTY=m
 CONFIG_PPP_DEFLATE=m
 CONFIG_IPPP_FILTER=y
-# CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPP_BSDCOMP=y
 CONFIG_PPPOE=m
 CONFIG_PPP_MPPE=m
-CONFIG_SLIP=m
-CONFIG_SLIP_COMPRESSED=y
-CONFIG_SLIP_SMART=y
-# CONFIG_SLIP_MODE_SLIP6 is not set
+# CONFIG_SLIP is not set
 
 #
 # Wireless LAN
@@ -1444,6 +1558,8 @@ CONFIG_ATH_COMMON=m
 CONFIG_ATH5K=m
 CONFIG_ATH5K_DEBUG=y
 # CONFIG_ATH5K_TRACER is not set
+CONFIG_ATH6KL=m
+CONFIG_ATH6KL_DEBUG=y
 CONFIG_ATH9K=m
 CONFIG_ATH9K_PCI=y
 CONFIG_ATH9K_AHB=y
@@ -1454,6 +1570,7 @@ CONFIG_ATH9K_HTC=m
 CONFIG_ATH9K_RATE_CONTROL=y
 CONFIG_CARL9170=m
 CONFIG_CARL9170_LEDS=y
+# CONFIG_CARL9170_HWRNG is not set
 CONFIG_AT76C50X_USB=m
 CONFIG_AIRO=m
 CONFIG_AIRO_CS=m
@@ -1466,6 +1583,7 @@ CONFIG_B43_BCMA_PIO=y
 # CONFIG_B43_DEBUG is not set
 CONFIG_B43_PHY_LP=y
 CONFIG_B43_PHY_N=y
+CONFIG_B43_PHY_HT=y
 # CONFIG_B43_FORCE_PIO is not set
 CONFIG_B43LEGACY=m
 # CONFIG_B43LEGACY_DEBUG is not set
@@ -1474,6 +1592,9 @@ CONFIG_B43LEGACY_PIO=y
 CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y
 # CONFIG_B43LEGACY_DMA_MODE is not set
 # CONFIG_B43LEGACY_PIO_MODE is not set
+CONFIG_BRCMSMAC=m
+CONFIG_BRCMFMAC=m
+# CONFIG_BRCMDBG is not set
 CONFIG_HERMES=m
 CONFIG_HERMES_CACHE_FW_ON_INIT=y
 # CONFIG_HERMES_PRISM is not set
@@ -1573,24 +1694,12 @@ CONFIG_RTL8192DE=m
 
 CONFIG_MWIFIEX=m
 CONFIG_MWIFIEX_SDIO=m
-
-CONFIG_BRCMFMAC=m
-CONFIG_BRCMSMAC=m
-# CONFIG_BRCMDBG is not set
+CONFIG_MWIFIEX_PCIE=m
 
 #
 # Token Ring devices
 #
 # CONFIG_TR is not set
-# CONFIG_IBMOL is not set
-# CONFIG_3C359 is not set
-# Broken with gcc4.1
-# CONFIG_TMS380TR is not set
-# CONFIG_TMSPCI is not set
-# CONFIG_ABYSS is not set
-# CONFIG_IBMLS is not set
-# CONFIG_PCMCIA_IBMTR is not set
-
 
 CONFIG_NET_FC=y
 
@@ -1606,11 +1715,6 @@ CONFIG_NET_PCMCIA=y
 CONFIG_PCMCIA_3C589=m
 CONFIG_PCMCIA_3C574=m
 CONFIG_PCMCIA_FMVJ18X=m
-CONFIG_PCMCIA_PCNET=m
-CONFIG_PCMCIA_NMCLAN=m
-CONFIG_PCMCIA_SMC91C92=m
-CONFIG_PCMCIA_XIRC2PS=m
-CONFIG_PCMCIA_AXNET=m
 
 #
 # Amateur Radio support
@@ -1618,27 +1722,9 @@ CONFIG_PCMCIA_AXNET=m
 CONFIG_HAMRADIO=y
 CONFIG_AX25=m
 CONFIG_AX25_DAMA_SLAVE=y
-CONFIG_CAN=m
-CONFIG_CAN_RAW=m
-CONFIG_CAN_BCM=m
-CONFIG_CAN_VCAN=m
-CONFIG_CAN_DEV=m
-CONFIG_CAN_CALC_BITTIMING=y
-CONFIG_CAN_SJA1000=m
-CONFIG_CAN_SJA1000_ISA=m
-CONFIG_CAN_SJA1000_PLATFORM=m
-CONFIG_CAN_EMS_PCI=m
-CONFIG_CAN_EMS_USB=m
-CONFIG_CAN_ESD_USB2=m
-CONFIG_CAN_KVASER_PCI=m
-CONFIG_CAN_PLX_PCI=m
-CONFIG_CAN_TSCAN1=m
-CONFIG_CAN_SLCAN=m
-CONFIG_CAN_SOFTING=m
-CONFIG_CAN_SOFTING_CS=m
-CONFIG_CAN_C_CAN=m
-CONFIG_CAN_C_CAN_PLATFORM=m
-# CONFIG_PCH_CAN is not set
+
+# CONFIG_CAN is not set
+
 CONFIG_NETROM=m
 CONFIG_ROSE=m
 CONFIG_MKISS=m
@@ -1654,7 +1740,7 @@ CONFIG_BAYCOM_PAR=m
 CONFIG_BAYCOM_EPP=m
 CONFIG_YAM=m
 
-CONFIG_NFC=m
+# CONFIG_NFC is not set
 
 #
 # IrDA (infrared) support
@@ -1887,6 +1973,7 @@ CONFIG_INPUT_CM109=m
 CONFIG_INPUT_POLLDEV=m
 CONFIG_INPUT_SPARSEKMAP=m
 # CONFIG_INPUT_ADXL34X is not set
+# CONFIG_INPUT_BMA150 is not set
 CONFIG_INPUT_CMA3000=m
 CONFIG_INPUT_CMA3000_I2C=m
 
@@ -1989,6 +2076,7 @@ CONFIG_TOUCHSCREEN_MCS5000=m
 CONFIG_TOUCHSCREEN_MK712=m
 CONFIG_TOUCHSCREEN_PENMOUNT=m
 # CONFIG_TOUCHSCREEN_TPS6507X is not set
+CONFIG_TOUCHSCREEN_TSC_SERIO=m
 CONFIG_TOUCHSCREEN_TSC2007=m
 CONFIG_TOUCHSCREEN_TOUCHIT213=m
 CONFIG_TOUCHSCREEN_TOUCHRIGHT=m
@@ -2010,7 +2098,6 @@ CONFIG_INPUT_UINPUT=m
 CONFIG_INPUT_WISTRON_BTNS=m
 CONFIG_INPUT_ATLAS_BTNS=m
 
-CONFIG_INPUT_ATI_REMOTE=m
 CONFIG_INPUT_ATI_REMOTE2=m
 CONFIG_INPUT_KEYSPAN_REMOTE=m
 
@@ -2065,6 +2152,7 @@ CONFIG_SERIAL_8250_MANY_PORTS=y
 CONFIG_SERIAL_8250_SHARE_IRQ=y
 # CONFIG_SERIAL_8250_DETECT_IRQ is not set
 CONFIG_SERIAL_8250_RSA=y
+# CONFIG_SERIAL_8250_DW is not set
 CONFIG_CYCLADES=m
 # CONFIG_CYZ_INTR is not set
 # CONFIG_MOXA_INTELLIO is not set
@@ -2274,12 +2362,14 @@ CONFIG_SENSORS_MAX6642=m
 CONFIG_SENSORS_ADM1275=m
 CONFIG_SENSORS_UCD9000=m
 CONFIG_SENSORS_UCD9200=m
+CONFIG_SENSORS_ZL6100=m
 CONFIG_SENSORS_EMC6W201=m
 
 CONFIG_PMBUS=m
 CONFIG_SENSORS_PMBUS=m
 CONFIG_SENSORS_MAX16064=m
 CONFIG_SENSORS_LM25066=m
+CONFIG_SENSORS_LTC2978=m
 CONFIG_SENSORS_MAX34440=m
 CONFIG_SENSORS_MAX8688=m
 CONFIG_SENSORS_MAX1668=m
@@ -2290,25 +2380,7 @@ CONFIG_SENSORS_MAX1668=m
 # CONFIG_SERIAL_PCH_UART is not set
 # CONFIG_USB_SWITCH_FSA9480 is not set
 
-CONFIG_W1=m
-CONFIG_W1_CON=y
-# This is busted.
-# If we enable it, it steals Matrox cards, and the
-# framebuffer drivers stop working.
-# CONFIG_W1_MASTER_MATROX is not set
-CONFIG_W1_MASTER_DS2482=m
-CONFIG_W1_MASTER_DS2490=m
-CONFIG_W1_MASTER_DS1WM=m
-CONFIG_W1_SLAVE_THERM=m
-CONFIG_W1_SLAVE_SMEM=m
-CONFIG_W1_SLAVE_DS2431=m
-CONFIG_W1_SLAVE_DS2433=m
-CONFIG_W1_SLAVE_DS2433_CRC=y
-CONFIG_W1_SLAVE_DS2760=m
-CONFIG_W1_SLAVE_DS2423=m
-CONFIG_W1_SLAVE_DS2408=m
-CONFIG_W1_SLAVE_DS2780=m
-CONFIG_W1_SLAVE_BQ27000=m
+# CONFIG_W1 is not set
 
 #
 # Mice
@@ -2345,6 +2417,7 @@ CONFIG_MACHZ_WDT=m
 # CONFIG_SC520_WDT is not set
 CONFIG_ALIM7101_WDT=m
 CONFIG_ALIM1535_WDT=m
+CONFIG_IT87_WDT=m
 CONFIG_ITCO_WDT=m
 CONFIG_ITCO_VENDOR_SUPPORT=y
 # CONFIG_SC1200_WDT is not set
@@ -2358,12 +2431,15 @@ CONFIG_IT8712F_WDT=m
 CONFIG_SMSC_SCH311X_WDT=m
 CONFIG_W83977F_WDT=m
 CONFIG_PCIPCWATCHDOG=m
+# CONFIG_PCWATCHDOG is not set
 CONFIG_USBPCWATCHDOG=m
 # CONFIG_SBC_EPX_C3_WATCHDOG is not set
 CONFIG_WM8350_WATCHDOG=m
 CONFIG_WM831X_WATCHDOG=m
 # CONFIG_MAX63XX_WATCHDOG is not set
 # CONFIG_DW_WATCHDOG is not set
+CONFIG_W83697UG_WDT=m
+# CONFIG_WDT is not set
 
 CONFIG_HW_RANDOM=y
 CONFIG_HW_RANDOM_TIMERIOMEM=m
@@ -2380,6 +2456,7 @@ CONFIG_RTC_INTF_DEV=y
 # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
 CONFIG_RTC_DRV_CMOS=y
 CONFIG_RTC_DRV_DS1307=m
+CONFIG_RTC_DRV_DS1511=m
 CONFIG_RTC_DRV_DS1553=m
 CONFIG_RTC_DRV_DS1672=m
 CONFIG_RTC_DRV_DS1742=m
@@ -2434,24 +2511,31 @@ CONFIG_AGP_SIS=y
 CONFIG_AGP_SWORKS=y
 CONFIG_AGP_VIA=y
 CONFIG_AGP_EFFICEON=y
+
 CONFIG_VGA_ARB=y
 CONFIG_VGA_ARB_MAX_GPUS=16
-CONFIG_STUB_POULSBO=m
+
+# CONFIG_STUB_POULSBO is not set
+
 CONFIG_DRM=m
-CONFIG_DRM_TDFX=m
-CONFIG_DRM_R128=m
+# CONFIG_DRM_TDFX is not set
+# CONFIG_DRM_R128 is not set
 CONFIG_DRM_RADEON=m
 CONFIG_DRM_RADEON_KMS=y
-CONFIG_DRM_I810=m
-CONFIG_DRM_MGA=m
-CONFIG_DRM_SIS=m
-CONFIG_DRM_SAVAGE=m
+# CONFIG_DRM_I810 is not set
+# CONFIG_DRM_MGA is not set
+# CONFIG_DRM_SIS is not set
+# CONFIG_DRM_SAVAGE is not set
 CONFIG_DRM_I915=m
 CONFIG_DRM_I915_KMS=y
-CONFIG_DRM_VIA=m
+# CONFIG_DRM_VIA is not set
 CONFIG_DRM_NOUVEAU=m
 CONFIG_DRM_NOUVEAU_BACKLIGHT=y
 CONFIG_DRM_NOUVEAU_DEBUG=y
+CONFIG_DRM_PSB=m
+# CONFIG_DRM_PSB_MRST is not set
+# CONFIG_DRM_PSB_MFLD is not set
+# CONFIG_DRM_PSB_CDV is not set
 CONFIG_DRM_I2C_CH7006=m
 CONFIG_DRM_I2C_SIL164=m
 CONFIG_DRM_VMWGFX=m
@@ -2501,7 +2585,7 @@ CONFIG_VIDEO_CAFE_CCIC=m
 CONFIG_VIDEO_CPIA2=m
 CONFIG_VIDEO_CQCAM=m
 CONFIG_VIDEO_CX23885=m
-# CONFIG_MEDIA_ALTERA_CI is not set
+CONFIG_MEDIA_ALTERA_CI=m
 CONFIG_VIDEO_CX18=m
 CONFIG_VIDEO_CX18_ALSA=m
 CONFIG_VIDEO_CX88=m
@@ -2523,6 +2607,7 @@ CONFIG_VIDEO_IVTV=m
 CONFIG_VIDEO_MEYE=m
 CONFIG_VIDEO_MXB=m
 CONFIG_VIDEO_PVRUSB2_DVB=y
+# CONFIG_VIDEO_PMS is not set
 CONFIG_VIDEO_HDPVR=m
 CONFIG_VIDEO_SAA6588=m
 CONFIG_VIDEO_SAA7134=m
@@ -2541,6 +2626,9 @@ CONFIG_VIDEO_ZORAN_LML33R10=m
 CONFIG_VIDEO_ZORAN_ZR36060=m
 CONFIG_VIDEO_FB_IVTV=m
 CONFIG_VIDEO_SAA7164=m
+CONFIG_VIDEO_TM6000=m
+CONFIG_VIDEO_TM6000_ALSA=m
+CONFIG_VIDEO_TM6000_DVB=m
 CONFIG_VIDEO_TLG2300=m
 # CONFIG_VIDEO_TIMBERDALE is not set
 # CONFIG_VIDEO_M5MOLS is not set
@@ -2668,6 +2756,13 @@ CONFIG_DVB_USB_ANYSEE=m
 CONFIG_DVB_USB_DW2102=m
 CONFIG_DVB_USB_FRIIO=m
 CONFIG_DVB_USB_EC168=m
+CONFIG_DVB_USB_PCTV452E=m
+CONFIG_DVB_USB_IT913X=m
+CONFIG_DVB_USB_MXL111SF=m
+CONFIG_DVB_TDA10071=m
+CONFIG_DVB_LNBP22=m
+CONFIG_DVB_A8293=m
+CONFIG_DVB_IT913X_FE=m
 CONFIG_DVB_DM1105=m
 CONFIG_DVB_S921=m
 CONFIG_DVB_ISL6405=m
@@ -2747,6 +2842,7 @@ CONFIG_VIDEO_PVRUSB2_SYSFS=y
 CONFIG_RC_CORE=m
 CONFIG_RC_LOOPBACK=m
 CONFIG_RC_MAP=m
+CONFIG_RC_ATI_REMOTE=m
 CONFIG_IR_NEC_DECODER=m
 CONFIG_IR_RC5_DECODER=m
 CONFIG_IR_RC6_DECODER=m
@@ -2761,6 +2857,9 @@ CONFIG_IR_ITE_CIR=m
 CONFIG_IR_NUVOTON=m
 CONFIG_IR_FINTEK=m
 CONFIG_IR_REDRAT3=m
+CONFIG_IR_ENE=m
+CONFIG_IR_STREAMZAP=m
+CONFIG_IR_WINBOND_CIR=m
 
 CONFIG_V4L_MEM2MEM_DRIVERS=y
 # CONFIG_VIDEO_MEM2MEM_TESTDEV is not set
@@ -2779,19 +2878,16 @@ CONFIG_VIDEO_OUTPUT_CONTROL=m
 
 CONFIG_FB=y
 # CONFIG_FB_FOREIGN_ENDIAN is not set
-CONFIG_FB_3DFX=m
-CONFIG_FB_3DFX_ACCEL=y
-CONFIG_FB_3DFX_I2C=y
+# CONFIG_FB_3DFX is not set
 # CONFIG_FB_ARC is not set
 # CONFIG_FB_ARK is not set
-CONFIG_FB_ATY128=m
-CONFIG_FB_ATY=m
-CONFIG_FB_ATY_CT=y
-CONFIG_FB_ATY_GX=y
-CONFIG_FB_ATY_GENERIC_LCD=y
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_ATY_CT is not set
+# CONFIG_FB_ATY_GX is not set
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_CARMINE is not set
-CONFIG_FB_CIRRUS=m
+# CONFIG_FB_CIRRUS is not set
 # CONFIG_FB_CYBER2000 is not set
 # CONFIG_FB_GEODE is not set
 # CONFIG_FB_HECUBA is not set
@@ -2803,39 +2899,34 @@ CONFIG_FB_I810_I2C=y
 # CONFIG_FB_INTEL is not set
 # CONFIG_FB_INTEL_DEBUG is not set
 # CONFIG_FB_INTEL_I2C is not set
-CONFIG_FB_KYRO=m
+# CONFIG_FB_KYRO is not set
 # CONFIG_FB_LE80578 is not set
-CONFIG_FB_MATROX=m
-CONFIG_FB_MATROX_MILLENIUM=y
-CONFIG_FB_MATROX_MYSTIQUE=y
-CONFIG_FB_MATROX_G=y
-CONFIG_FB_MATROX_I2C=m
-CONFIG_FB_MATROX_MAVEN=m
-CONFIG_FB_NEOMAGIC=m
-CONFIG_FB_NVIDIA=m
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_MATROX_MILLENIUM is not set
+# CONFIG_FB_MATROX_MYSTIQUE is not set
+# CONFIG_FB_MATROX_G is not set
+# CONFIG_FB_MATROX_I2C is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_NVIDIA is not set
+# CONFIG_FB_NVIDIA_I2C is not set
 # CONFIG_FB_NVIDIA_DEBUG is not set
-CONFIG_FB_NVIDIA_I2C=y
 # CONFIG_FB_PM2 is not set
 # CONFIG_FB_PM2_FIFO_DISCONNECT is not set
 # CONFIG_FB_PM3 is not set
-CONFIG_FB_RADEON=m
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_RADEON_I2C is not set
 # CONFIG_FB_RADEON_DEBUG is not set
-CONFIG_FB_RADEON_I2C=y
-CONFIG_FB_RIVA=m
+# CONFIG_FB_RIVA is not set
 # CONFIG_FB_RIVA_DEBUG is not set
 # CONFIG_FB_RIVA_I2C is not set
 # CONFIG_FB_S1D13XXX is not set
-CONFIG_FB_S3=m
-CONFIG_FB_S3_DDC=y
-CONFIG_FB_SAVAGE=m
-CONFIG_FB_SAVAGE_I2C=y
-CONFIG_FB_SAVAGE_ACCEL=y
+# CONFIG_FB_S3 is not set
+# CONFIG_FB_SAVAGE is not set
 # CONFIG_FB_SIS is not set
-CONFIG_FB_SIS_300=y
-CONFIG_FB_SIS_315=y
-CONFIG_FB_SM501=m
+# CONFIG_FB_SM501 is not set
+# CONFIG_FB_SMSCUFX is not set
 CONFIG_FB_TILEBLITTING=y
-CONFIG_FB_TRIDENT=m
+# CONFIG_FB_TRIDENT is not set
 # CONFIG_FB_UVESA is not set
 CONFIG_FB_VESA=y
 CONFIG_FB_VGA16=m
@@ -2843,14 +2934,14 @@ CONFIG_FB_VIRTUAL=m
 CONFIG_FB_VOODOO1=m
 # CONFIG_FB_VT8623 is not set
 CONFIG_FB_EFI=y
-CONFIG_FB_VIA=m
-CONFIG_FB_VIA_X_COMPATIBILITY=y
+# CONFIG_FB_VIA is not set
 # CONFIG_FB_VIA_DIRECT_PROCFS is not set
-CONFIG_FB_METRONOME=m
+# CONFIG_FB_METRONOME is not set
 # CONFIG_FB_MB862XX is not set
 # CONFIG_FB_PRE_INIT_FB is not set
 # CONFIG_FB_TMIO is not set
 # CONFIG_FB_BROADSHEET is not set
+CONFIG_FB_UDL=m
 
 # CONFIG_FIRMWARE_EDID is not set
 
@@ -3032,9 +3123,7 @@ CONFIG_SND_USB_6FIRE=m
 #
 # PCMCIA devices
 #
-CONFIG_SND_PCMCIA=y
-CONFIG_SND_VXPOCKET=m
-CONFIG_SND_PDAUDIOCF=m
+# CONFIG_SND_PCMCIA is not set
 
 CONFIG_SND_FIREWIRE=y
 CONFIG_SND_FIREWIRE_SPEAKERS=m
@@ -3076,7 +3165,7 @@ CONFIG_USB_SL811_HCD=m
 CONFIG_USB_SL811_HCD_ISO=y
 # CONFIG_USB_SL811_CS is not set
 # CONFIG_USB_R8A66597_HCD is not set
-CONFIG_USB_XHCI_HCD=m
+CONFIG_USB_XHCI_HCD=y
 # CONFIG_USB_XHCI_HCD_DEBUGGING is not set
 CONFIG_USB_ISP1362_HCD=m
 
@@ -3109,7 +3198,6 @@ CONFIG_USB_STORAGE_REALTEK=m
 CONFIG_REALTEK_AUTOPM=y
 CONFIG_USB_STORAGE_ENE_UB6250=m
 # CONFIG_USB_LIBUSUAL is not set
-# uas is broken (#717633, #744099)
 # CONFIG_USB_UAS is not set
 
 
@@ -3125,6 +3213,7 @@ CONFIG_HID=m
 CONFIG_HIDRAW=y
 CONFIG_HID_PID=y
 CONFIG_LOGITECH_FF=y
+CONFIG_HID_LOGITECH_DJ=m
 CONFIG_LOGIWII_FF=y
 CONFIG_LOGIRUMBLEPAD2_FF=y
 CONFIG_PANTHERLORD_FF=y
@@ -3138,10 +3227,12 @@ CONFIG_DRAGONRISE_FF=y
 CONFIG_GREENASIA_FF=y
 CONFIG_SMARTJOYPLUS_FF=y
 CONFIG_LOGIG940_FF=y
+CONFIG_LOGIWHEELS_FF=y
 CONFIG_HID_MAGICMOUSE=y
 CONFIG_HID_MULTITOUCH=m
 CONFIG_HID_NTRIG=y
 CONFIG_HID_QUANTA=y
+CONFIG_HID_PRIMAX=m
 CONFIG_HID_PRODIKEYS=m
 CONFIG_HID_DRAGONRISE=m
 CONFIG_HID_GYRATION=m
@@ -3218,6 +3309,7 @@ CONFIG_USB_GSPCA_SPCA561=m
 CONFIG_USB_GSPCA_STK014=m
 CONFIG_USB_GSPCA_SUNPLUS=m
 CONFIG_USB_GSPCA_T613=m
+CONFIG_USB_GSPCA_TOPRO=m
 CONFIG_USB_GSPCA_TV8532=m
 CONFIG_USB_GSPCA_VC032X=m
 CONFIG_USB_GSPCA_ZC3XX=m
@@ -3241,22 +3333,7 @@ CONFIG_USB_S2255=m
 # CONFIG_VIDEO_SH_MOBILE_CSI2 is not set
 # CONFIG_USB_SN9C102 is not set
 CONFIG_USB_ZR364XX=m
-CONFIG_SOC_CAMERA=m
-CONFIG_SOC_CAMERA_MT9M001=m
-CONFIG_SOC_CAMERA_MT9V022=m
-CONFIG_SOC_CAMERA_PLATFORM=m
-CONFIG_SOC_CAMERA_MT9M111=m
-CONFIG_SOC_CAMERA_MT9T031=m
-CONFIG_SOC_CAMERA_TW9910=m
-CONFIG_SOC_CAMERA_OV772X=m
-CONFIG_SOC_CAMERA_MT9T112=m
-CONFIG_SOC_CAMERA_RJ54N1=m
-CONFIG_SOC_CAMERA_OV9640=m
-CONFIG_SOC_CAMERA_OV6650=m
-CONFIG_SOC_CAMERA_OV5642=m
-CONFIG_SOC_CAMERA_IMX074=m
-CONFIG_SOC_CAMERA_OV2640=m
-CONFIG_SOC_CAMERA_OV9740=m
+# CONFIG_SOC_CAMERA is not set
 
 #
 # USB Network adaptors
@@ -3361,6 +3438,7 @@ CONFIG_USB_SERIAL_OTI6858=m
 CONFIG_USB_SERIAL_OPTICON=m
 CONFIG_USB_SERIAL_OMNINET=m
 CONFIG_USB_SERIAL_PL2303=m
+# CONFIG_USB_SERIAL_QUATECH2 is not set
 CONFIG_USB_SERIAL_SAFE=m
 CONFIG_USB_SERIAL_SAFE_PADDED=y
 CONFIG_USB_SERIAL_SIERRAWIRELESS=m
@@ -3401,6 +3479,7 @@ CONFIG_USB_FTDI_ELAN=m
 CONFIG_USB_FILE_STORAGE=m
 # CONFIG_USB_FILE_STORAGE_TEST is not set
 # CONFIG_USB_GADGET is not set
+# CONFIG_USB_DWC3 is not set
 # CONFIG_USB_GADGETFS is not set
 # CONFIG_USB_ISP116X_HCD is not set
 # CONFIG_USB_ISP1760_HCD is not set
@@ -3482,25 +3561,22 @@ CONFIG_MFD_WM8400=m
 # CONFIG_MFD_JANZ_CMODIO is not set
 # CONFIG_MFD_WM831X_I2C is not set
 # CONFIG_MFD_CS5535 is not set
+# CONFIG_MFD_STMPE is not set
+# CONFIG_MFD_MAX8998 is not set
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_MFD_TC3589X is not set
+# CONFIG_MFD_WL1273_CORE is not set
 
 #
 # File systems
 #
 CONFIG_MISC_FILESYSTEMS=y
 
-CONFIG_EXT2_FS=m
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT2_FS_POSIX_ACL=y
-CONFIG_EXT2_FS_SECURITY=y
-CONFIG_EXT2_FS_XIP=y
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_DEFAULTS_TO_ORDERED=y
-CONFIG_EXT3_FS_XATTR=y
-CONFIG_EXT3_FS_POSIX_ACL=y
-CONFIG_EXT3_FS_SECURITY=y
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
+# ext4 is used for ext2 and ext3 filesystems
+# CONFIG_EXT2_FS is not set
+# CONFIG_EXT3_FS is not set
 CONFIG_EXT4_FS=y
+CONFIG_EXT4_USE_FOR_EXT23=y
 CONFIG_EXT4_FS_XATTR=y
 CONFIG_EXT4_FS_POSIX_ACL=y
 CONFIG_EXT4_FS_SECURITY=y
@@ -3534,13 +3610,14 @@ CONFIG_DNOTIFY=y
 # Autofsv3 is obsolete.
 # systemd is dependant upon AUTOFS, so build it in.
 CONFIG_AUTOFS4_FS=y
-CONFIG_EXOFS_FS=m
+# CONFIG_EXOFS_FS is not set
 # CONFIG_EXOFS_DEBUG is not set
-CONFIG_NILFS2_FS=m
-CONFIG_LOGFS=m
+# CONFIG_NILFS2_FS is not set
+# CONFIG_LOGFS is not set
 CONFIG_CEPH_FS=m
 CONFIG_BLK_DEV_RBD=m
 CONFIG_CEPH_LIB=m
+# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set
 
 CONFIG_FSCACHE=m
 CONFIG_FSCACHE_STATS=y
@@ -3593,27 +3670,21 @@ CONFIG_HFS_FS=m
 CONFIG_HFSPLUS_FS=m
 CONFIG_BEFS_FS=m
 # CONFIG_BEFS_DEBUG is not set
-CONFIG_BFS_FS=m
-CONFIG_EFS_FS=m
-CONFIG_JFFS2_FS=m
-CONFIG_JFFS2_FS_DEBUG=0
-# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_FS_XATTR=y
-CONFIG_JFFS2_FS_POSIX_ACL=y
-CONFIG_JFFS2_FS_SECURITY=y
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS2_FS is not set
+
 CONFIG_CRAMFS=m
 CONFIG_SQUASHFS=m
 CONFIG_SQUASHFS_XATTR=y
 CONFIG_SQUASHFS_LZO=y
 CONFIG_SQUASHFS_XZ=y
 CONFIG_SQUASHFS_ZLIB=y
+# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
 # CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_VXFS_FS=m
+# CONFIG_VXFS_FS is not set
 # CONFIG_HPFS_FS is not set
-CONFIG_QNX4FS_FS=m
+# CONFIG_QNX4FS_FS is not set
 CONFIG_SYSV_FS=m
 CONFIG_UFS_FS=m
 # CONFIG_UFS_FS_WRITE is not set
@@ -3622,7 +3693,7 @@ CONFIG_9P_FS=m
 CONFIG_9P_FSCACHE=y
 CONFIG_9P_FS_POSIX_ACL=y
 CONFIG_FUSE_FS=m
-CONFIG_OMFS_FS=m
+# CONFIG_OMFS_FS is not set
 CONFIG_CUSE=m
 
 #
@@ -3685,17 +3756,14 @@ CONFIG_OCFS2_FS_USERSPACE_CLUSTER=m
 CONFIG_BTRFS_FS=m
 CONFIG_BTRFS_FS_POSIX_ACL=y
 
-CONFIG_CONFIGFS_FS=m
+CONFIG_CONFIGFS_FS=y
 
 CONFIG_DLM=m
 CONFIG_DLM_DEBUG=y
 CONFIG_GFS2_FS=m
 CONFIG_GFS2_FS_LOCKING_DLM=y
 
-CONFIG_UBIFS_FS=m
-CONFIG_UBIFS_FS_XATTR=y
-# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
-# CONFIG_UBIFS_FS_DEBUG is not set
+# CONFIG_UBIFS_FS is not set
 
 #
 # Partition Types
@@ -3782,24 +3850,68 @@ CONFIG_FRAME_POINTER=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 # CONFIG_DEBUG_DRIVER is not set
 CONFIG_HEADERS_CHECK=y
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_RCU_TRACE is not set
 # CONFIG_LKDTM is not set
 
 # CONFIG_RT_MUTEX_TESTER is not set
 # CONFIG_DEBUG_LOCKDEP is not set
 # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
 
+# DEBUG options that don't get enabled/disabled with 'make debug/release'
+#
+# Kmemleak still produces a lot of false positives.
+# CONFIG_DEBUG_KMEMLEAK is not set
+#
+# This generates a huge amount of dmesg spew
+# CONFIG_DEBUG_KOBJECT is not set
+#
+#
+# These debug options are deliberatly left on (even in 'make release' kernels).
+# They aren't that much of a performance impact, and the value
+# from getting useful bug-reports makes it worth leaving them on.
+CONFIG_DYNAMIC_DEBUG=y
+CONFIG_DEBUG_HIGHMEM=y
+CONFIG_BOOT_PRINTK_DELAY=y
+CONFIG_DEBUG_LIST=y
+CONFIG_DEBUG_SHIRQ=y
+CONFIG_DEBUG_DEVRES=y
+CONFIG_DEBUG_RODATA_TEST=y
+CONFIG_DEBUG_NX_TEST=m
+CONFIG_DEBUG_SET_MODULE_RONX=y
+CONFIG_DEBUG_BOOT_PARAMS=y
+# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
+CONFIG_LOCKUP_DETECTOR=y
+# CONFIG_DEBUG_INFO_REDUCED is not set
+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set
+CONFIG_ATOMIC64_SELFTEST=y
+CONFIG_MEMORY_FAILURE=y
+CONFIG_HWPOISON_INJECT=m
+# CONFIG_DEBUG_SECTION_MISMATCH is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+CONFIG_LATENCYTOP=y
+CONFIG_RESOURCE_COUNTERS=y
+# CONFIG_COMPAT_BRK is not set
+# CONFIG_DEBUG_VIRTUAL is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+CONFIG_EARLY_PRINTK_DBGP=y
+# CONFIG_PAGE_POISONING is not set
+# CONFIG_CRASH_DUMP is not set
+# CONFIG_CRASH is not set
+# CONFIG_GCOV_KERNEL is not set
+# CONFIG_RAMOOPS is not set
+
 CONFIG_KGDB=y
 CONFIG_KGDB_SERIAL_CONSOLE=y
 CONFIG_KGDB_TESTS=y
 CONFIG_KGDB_LOW_LEVEL_TRAP=y
 # CONFIG_KGDB_TESTS_ON_BOOT is not set
 
+
 #
 # Security options
 #
 CONFIG_SECURITY=y
+CONFIG_SECURITYFS=y
 # CONFIG_SECURITY_DMESG_RESTRICT is not set
 CONFIG_SECURITY_NETWORK=y
 CONFIG_SECURITY_NETWORK_XFRM=y
@@ -3811,6 +3923,7 @@ CONFIG_SECURITY_SELINUX_DEVELOP=y
 CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
 CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
 CONFIG_SECURITY_SELINUX_AVC_STATS=y
+# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
 # CONFIG_SECURITY_SMACK is not set
 # CONFIG_SECURITY_TOMOYO is not set
 # CONFIG_SECURITY_APPARMOR is not set
@@ -3885,6 +3998,9 @@ CONFIG_CRYPTO_ANSI_CPRNG=m
 CONFIG_CRYPTO_DEV_HIFN_795X=m
 CONFIG_CRYPTO_DEV_HIFN_795X_RNG=y
 CONFIG_CRYPTO_PCRYPT=m
+CONFIG_CRYPTO_USER=m
+
+
 
 # Random number generation
 
@@ -3897,6 +4013,7 @@ CONFIG_CRC_CCITT=m
 CONFIG_CRC_ITU_T=m
 CONFIG_CRC_T10DIF=m
 CONFIG_CRC8=m
+# CONFIG_CRC7 is not set
 CONFIG_CORDIC=m
 
 CONFIG_CRYPTO_ZLIB=m
@@ -3933,6 +4050,7 @@ CONFIG_LCD_PLATFORM=m
 CONFIG_SCHEDSTATS=y
 CONFIG_SCHED_DEBUG=y
 CONFIG_FAIR_GROUP_SCHED=y
+CONFIG_CFS_BANDWIDTH=y
 CONFIG_SCHED_OMIT_FRAME_POINTER=y
 CONFIG_RT_GROUP_SCHED=y
 CONFIG_SCHED_AUTOGROUP=y
@@ -3951,7 +4069,6 @@ CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y # XXX disabled by default, pass 'swapaccount'
 # CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED is not set
 CONFIG_CGROUP_PERF=y
 CONFIG_BLK_CGROUP=y
-# CONFIG_DEBUG_BLK_CGROUP is not set
 
 # CONFIG_SYSFS_DEPRECATED is not set
 # CONFIG_SYSFS_DEPRECATED_V2 is not set
@@ -3966,6 +4083,8 @@ CONFIG_KEXEC=y
 
 CONFIG_HWMON=y
 # CONFIG_HWMON_DEBUG_CHIP is not set
+CONFIG_THERMAL_HWMON=y
+
 CONFIG_INOTIFY=y
 CONFIG_INOTIFY_USER=y
 
@@ -3976,19 +4095,18 @@ CONFIG_IBMASR=m
 
 CONFIG_PM_DEBUG=y
 CONFIG_PM_TRACE=y
-# CONFIG_PM_VERBOSE is not set
+CONFIG_PM_TRACE_RTC=y
 # CONFIG_PM_TEST_SUSPEND is not set
 CONFIG_PM_RUNTIME=y
+# CONFIG_PM_OPP is not set
 
 CONFIG_CPU_FREQ=y
-CONFIG_CPU_FREQ_DEBUG=y
-# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
-CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
 CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-CONFIG_CPU_FREQ_GOV_POWERSAVE=m
-CONFIG_CPU_FREQ_GOV_USERSPACE=m
-CONFIG_CPU_FREQ_GOV_ONDEMAND=m
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
 CONFIG_CPU_FREQ_TABLE=y
 CONFIG_CPU_FREQ_STAT=m
 CONFIG_CPU_FREQ_STAT_DETAILS=y
@@ -4001,53 +4119,22 @@ CONFIG_I82365=m
 # CONFIG_LTPC is not set
 # CONFIG_COPS is not set
 
-CONFIG_SCSI_AHA152X=m
-CONFIG_SCSI_AHA1542=m
-# CONFIG_SCSI_IN2000 is not set
-CONFIG_SCSI_ARCMSR=m
-CONFIG_SCSI_ARCMSR_AER=y
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_PAS16 is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
-# CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
 
 # CONFIG_EL1 is not set
 # CONFIG_EL2 is not set
-# CONFIG_ELPLUS is not set
-# CONFIG_EL16 is not set
 CONFIG_EL3=m
 # CONFIG_3C515 is not set
-# CONFIG_LANCE is not set
 CONFIG_NET_VENDOR_SMC=y
 # CONFIG_WD80x3 is not set
 CONFIG_ULTRA=m
-# CONFIG_SMC9194 is not set
 # CONFIG_NET_VENDOR_RACAL is not set
-# CONFIG_NI52 is not set
 # CONFIG_NI65 is not set
-# CONFIG_AT1700 is not set
 # CONFIG_DEPCA is not set
 CONFIG_NET_ISA=y
 CONFIG_NE2000=m
 # CONFIG_E2100 is not set
-CONFIG_EWRK3=m
-# CONFIG_EEXPRESS is not set
-# CONFIG_EEXPRESS_PRO is not set
 # CONFIG_HPLAN_PLUS is not set
 # CONFIG_HPLAN is not set
-# CONFIG_LP486E is not set
-# CONFIG_ETH16I is not set
-# CONFIG_ZNET is not set
-# CONFIG_SEEQ8005 is not set
-# CONFIG_AC3200 is not set
-# CONFIG_APRICOT is not set
-# CONFIG_CS89x0 is not set
 # CONFIG_IBMTR is not set
 # CONFIG_SKISA is not set
 # CONFIG_PROTEON is not set
@@ -4080,24 +4167,7 @@ CONFIG_EWRK3=m
 # CONFIG_SERIAL_8250_HUB6 is not set
 # CONFIG_SERIAL_8250_EXAR_ST16C554 is not set
 
-# CONFIG_PCWATCHDOG is not set
-# CONFIG_WDT is not set
-
-# CONFIG_VIDEO_PMS is not set
-CONFIG_RADIO_ADAPTERS=y
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_GEMTEK is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TEA5764 is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_ZOLTRIX is not set
-# CONFIG_RADIO_SAA7706H is not set
+# CONFIG_RADIO_ADAPTERS is not set
 
 # CONFIG_SND_OPL4_LIB is not set
 # CONFIG_SND_AD1816A is not set
@@ -4162,22 +4232,22 @@ CONFIG_LEDS_TRIGGER_HEARTBEAT=m
 CONFIG_LEDS_TRIGGER_BACKLIGHT=m
 CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
 CONFIG_LEDS_ALIX2=m
-CONFIG_LEDS_WM8350=m
-CONFIG_LEDS_LP3944=m
-CONFIG_LEDS_WM831X_STATUS=m
-CONFIG_LEDS_REGULATOR=m
-CONFIG_LEDS_LT3593=m
-CONFIG_LEDS_TRIGGER_GPIO=m
+CONFIG_LEDS_CLEVO_MAIL=m
 CONFIG_LEDS_INTEL_SS4200=m
+CONFIG_LEDS_LM3530=m
+CONFIG_LEDS_LP3944=m
 CONFIG_LEDS_LP5521=m
 CONFIG_LEDS_LP5523=m
-CONFIG_LEDS_LM3530=m
+CONFIG_LEDS_LT3593=m
+CONFIG_LEDS_REGULATOR=m
+CONFIG_LEDS_TRIGGER_GPIO=m
+CONFIG_LEDS_WM8350=m
+CONFIG_LEDS_WM831X_STATUS=m
 
 CONFIG_DMADEVICES=y
 CONFIG_DMA_ENGINE=y
 CONFIG_DW_DMAC=m
 # CONFIG_TIMB_DMA is not set
-CONFIG_NET_DMA=y
 # CONFIG_DMATEST is not set
 CONFIG_ASYNC_TX_DMA=y
 
@@ -4198,13 +4268,14 @@ CONFIG_FUNCTION_PROFILER=y
 CONFIG_RING_BUFFER_BENCHMARK=m
 CONFIG_FUNCTION_TRACER=y
 CONFIG_STACK_TRACER=y
+# CONFIG_FUNCTION_GRAPH_TRACER is not set
 
 CONFIG_KPROBES=y
+CONFIG_KPROBE_EVENT=y
+# CONFIG_KPROBES_SANITY_TEST is not set
 CONFIG_JUMP_LABEL=y
 CONFIG_OPTPROBES=y
 
-# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
-
 CONFIG_HZ_1000=y
 
 CONFIG_TIMER_STATS=y
@@ -4220,22 +4291,26 @@ CONFIG_CFAG12864B_RATE=20
 
 CONFIG_POWER_SUPPLY=m
 # CONFIG_POWER_SUPPLY_DEBUG is not set
+
 # CONFIG_TEST_POWER is not set
 CONFIG_APM_POWER=m
 # CONFIG_WM831X_POWER is not set
+
 # CONFIG_BATTERY_DS2760 is not set
 # CONFIG_BATTERY_DS2782 is not set
 # CONFIG_BATTERY_BQ20Z75 is not set
 # CONFIG_BATTERY_DS2780 is not set
-# CONFIG_CHARGER_ISP1704 is not set
-# CONFIG_CHARGER_MAX8903 is not set
 # CONFIG_BATTERY_BQ27x00 is not set
 # CONFIG_BATTERY_MAX17040 is not set
-# CONFIG_PDA_POWER is not set
-# CONFIG_CHARGER_GPIO is not set
 # CONFIG_BATTERY_MAX17042 is not set
+
+# CONFIG_CHARGER_ISP1704 is not set
+# CONFIG_CHARGER_MAX8903 is not set
+# CONFIG_CHARGER_GPIO is not set
 # CONFIG_CHARGER_PCF50633 is not set
 
+# CONFIG_PDA_POWER is not set
+
 CONFIG_AUXDISPLAY=y
 
 CONFIG_UIO=m
@@ -4247,7 +4322,6 @@ CONFIG_UIO_SERCOS3=m
 CONFIG_UIO_PCI_GENERIC=m
 # CONFIG_UIO_NETX is not set
 
-# CONFIG_CRC7 is not set
 
 
 # LIRC
@@ -4267,30 +4341,17 @@ CONFIG_LIRC_TTUSBIR=m
 
 # CONFIG_DEVKMEM is not set
 
-CONFIG_PM_TRACE_RTC=y
-CONFIG_R6040=m
-
 CONFIG_BNX2X=m
 CONFIG_SCSI_BNX2X_FCOE=m
 
 CONFIG_NOZOMI=m
 # CONFIG_TPS65010 is not set
-# CONFIG_DEBUG_SECTION_MISMATCH is not set
-# CONFIG_KPROBES_SANITY_TEST is not set
-# CONFIG_BACKTRACE_SELF_TEST is not set
-CONFIG_LATENCYTOP=y
-CONFIG_RESOURCE_COUNTERS=y
-# CONFIG_COMPAT_BRK is not set
-
 
-#FIXME: x86 generic?
-CONFIG_LEDS_CLEVO_MAIL=m
 CONFIG_INPUT_APANEL=m
 
 # CONFIG_INTEL_MENLOW is not set
 CONFIG_ENCLOSURE_SERVICES=m
 CONFIG_IPWIRELESS=m
-CONFIG_RTC_DRV_DS1511=m
 
 # CONFIG_BLK_DEV_XIP is not set
 CONFIG_MEMSTICK=m
@@ -4308,41 +4369,26 @@ CONFIG_A11Y_BRAILLE_CONSOLE=y
 
 # MT9V022_PCA9536_SWITCH is not set
 
-CONFIG_THERMAL_HWMON=y
-
 CONFIG_OPTIMIZE_INLINING=y
 
 # FIXME: This should be x86/ia64 only
 # CONFIG_HP_ILO is not set
 
 # CONFIG_GPIOLIB is not set
-
-
-CONFIG_NETFILTER_TPROXY=m
-CONFIG_NETFILTER_XT_TARGET_TPROXY=m
-CONFIG_NETFILTER_XT_MATCH_RECENT=m
-# CONFIG_NETFILTER_XT_MATCH_RECENT_PROC_COMPAT is not set
-CONFIG_NETFILTER_XT_MATCH_SOCKET=m
-
-# CONFIG_IP_VS_IPV6 is not set
+# CONFIG_PINCTRL is not set
 
 CONFIG_NET_DSA=y
 CONFIG_NET_DSA_MV88E6060=y
 CONFIG_NET_DSA_MV88E6131=y
 CONFIG_NET_DSA_MV88E6123_61_65=y
 
-CONFIG_NET_SCH_MULTIQ=m
-CONFIG_NET_ACT_SKBEDIT=m
+# Used by Maemo, we don't care.
+# CONFIG_PHONET is not set
 
-CONFIG_PHONET=m
+# CONFIG_ICS932S401 is not set
 
-CONFIG_ICS932S401=m
 # CONFIG_C2PORT is not set
 
-
-CONFIG_IT87_WDT=m
-CONFIG_W83697UG_WDT=m
-
 # CONFIG_REGULATOR is not set
 # CONFIG_REGULATOR_DEBUG is not set
 
@@ -4362,9 +4408,10 @@ CONFIG_UWB_WHCI=m
 CONFIG_UWB_I1480U=m
 
 CONFIG_STAGING=y
+CONFIG_STAGING_MEDIA=y
+# CONFIG_DVB_AS102 is not set
 # CONFIG_ET131X is not set
 # CONFIG_SLICOSS is not set
-# CONFIG_VIDEO_TM6000 is not set
 # CONFIG_WLAGS49_H2 is not set
 # CONFIG_WLAGS49_H25 is not set
 # CONFIG_VIDEO_DT3155 is not set
@@ -4391,7 +4438,6 @@ CONFIG_USB_ATMEL=m
 # CONFIG_RTL8192E is not set
 # CONFIG_INPUT_GPIO is not set
 # CONFIG_VIDEO_CX25821 is not set
-# CONFIG_HYPERV is not set
 # CONFIG_R8187SE is not set
 # CONFIG_RTL8192U is not set
 # CONFIG_BATMAN_ADV is not set
@@ -4411,51 +4457,41 @@ CONFIG_USB_ATMEL=m
 # CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set
 # CONFIG_TOUCHSCREEN_CLEARPAD_TM1217 is not set
 # CONFIG_RTS_PSTOR is not set
-# CONFIG_DRM_PSB is not set
-# CONFIG_ALTERA_STAPL is not set
+CONFIG_ALTERA_STAPL=m
 # CONFIG_DVB_CXD2099 is not set
 # CONFIG_USBIP_CORE is not set
 # CONFIG_INTEL_MEI is not set
 # CONFIG_ZCACHE is not set
-
-#
-# Android
+# CONFIG_RTS5139 is not set
+# CONFIG_NVEC_LEDS is not set
+# CONFIG_VT6655 is not set
 #
+# END OF STAGING
 
-# CONFIG_DEBUG_VIRTUAL is not set
-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
-# CONFIG_FUNCTION_GRAPH_TRACER is not set
-CONFIG_EARLY_PRINTK_DBGP=y
-
-CONFIG_SECURITYFS=y
-
-CONFIG_SCSI_CXGB3_ISCSI=m
 CONFIG_LIBFC=m
 CONFIG_LIBFCOE=m
 CONFIG_FCOE=m
 CONFIG_FCOE_FNIC=m
-# CONFIG_SCSI_LPFC_DEBUG_FS is not set
 
 CONFIG_NOP_USB_XCEIV=m
 
-CONFIG_IMA=y
+# CONFIG_IMA is not set
 CONFIG_IMA_MEASURE_PCR_IDX=10
 CONFIG_IMA_AUDIT=y
 CONFIG_IMA_LSM_RULES=y
 
-CONFIG_LSM_MMAP_MIN_ADDR=65536
-
-# CONFIG_PAGE_POISONING is not set
-
+# CONFIG_EVM is not set
 
-# CONFIG_CRASH_DUMP is not set
-# CONFIG_CRASH is not set
+CONFIG_LSM_MMAP_MIN_ADDR=65536
 
 CONFIG_STRIP_ASM_SYMS=y
 
 # CONFIG_RCU_FANOUT_EXACT is not set
 CONFIG_RCU_FAST_NO_HZ=y
 CONFIG_RCU_CPU_STALL_TIMEOUT=60
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_RCU_TRACE is not set
+CONFIG_SPARSE_RCU_POINTER=y
 
 CONFIG_KSM=y
 CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
@@ -4465,62 +4501,29 @@ CONFIG_FANOTIFY=y
 CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
 
 CONFIG_IEEE802154=m
+CONFIG_IEEE802154_6LOWPAN=m
 CONFIG_IEEE802154_DRIVERS=m
 CONFIG_IEEE802154_FAKEHARD=m
 
-# CONFIG_GCOV_KERNEL is not set
-
 CONFIG_PPS=m
 # CONFIG_PPS_CLIENT_KTIMER is not set
 CONFIG_PPS_CLIENT_LDISC=m
 # CONFIG_PPS_DEBUG is not set
 CONFIG_PPS_CLIENT_PARPORT=m
 CONFIG_PPS_GENERATOR_PARPORT=m
+CONFIG_PPS_CLIENT_GPIO=m
 CONFIG_NTP_PPS=y
 
 CONFIG_PTP_1588_CLOCK=m
 
-# CONFIG_USB_SERIAL_QUATECH2 is not set
-# CONFIG_VT6655 is not set
-CONFIG_FB_UDL=m
-
-# DEBUG options that don't get enabled/disabled with 'make debug/release'
-#
-# Kmemleak still produces a lot of false positives.
-# CONFIG_DEBUG_KMEMLEAK is not set
-#
-# This generates a huge amount of dmesg spew
-# CONFIG_DEBUG_KOBJECT is not set
-#
-#
-# These debug options are deliberatly left on (even in 'make release' kernels).
-# They aren't that much of a performance impact, and the value
-# from getting useful bug-reports makes it worth leaving them on.
-CONFIG_DYNAMIC_DEBUG=y
-CONFIG_DEBUG_HIGHMEM=y
-CONFIG_BOOT_PRINTK_DELAY=y
-CONFIG_DEBUG_LIST=y
-CONFIG_DEBUG_SHIRQ=y
-CONFIG_DEBUG_DEVRES=y
-CONFIG_DEBUG_RODATA_TEST=y
-CONFIG_DEBUG_NX_TEST=m
-CONFIG_DEBUG_BOOT_PARAMS=y
-CONFIG_LOCKUP_DETECTOR=y
-# CONFIG_DEBUG_INFO_REDUCED is not set
-# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
-# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set
-CONFIG_ATOMIC64_SELFTEST=y
-
-CONFIG_MEMORY_FAILURE=y
-CONFIG_HWPOISON_INJECT=m
 CONFIG_CLEANCACHE=y
 
-CONFIG_BLK_DEV_DRBD=m
-
 # CONFIG_MDIO_GPIO is not set
 # CONFIG_KEYBOARD_GPIO is not set
 # CONFIG_KEYBOARD_GPIO_POLLED is not set
 # CONFIG_MOUSE_GPIO is not set
+# CONFIG_I2C_DESIGNWARE_PLATFORM is not set
+# CONFIG_I2C_DESIGNWARE_PCI is not set
 # CONFIG_I2C_GPIO is not set
 # CONFIG_DEBUG_GPIO is not set
 # CONFIG_W1_MASTER_GPIO is not set
@@ -4544,32 +4547,14 @@ CONFIG_GPIO_SYSFS=y
 # CONFIG_GPIO_PCH is not set
 # CONFIG_GPIO_ML_IOH is not set
 
-CONFIG_KPROBE_EVENT=y
-
-# CONFIG_RAMOOPS is not set
-
-CONFIG_IR_ENE=m
-CONFIG_IR_STREAMZAP=m
-CONFIG_IR_WINBOND_CIR=m
-
 # CONFIG_GPIO_SX150X is not set
-# CONFIG_MFD_STMPE is not set
-# CONFIG_MFD_MAX8998 is not set
-# CONFIG_MFD_TPS6586X is not set
-# CONFIG_MFD_TC3589X is not set
-
-CONFIG_SPARSE_RCU_POINTER=y
-
-# CONFIG_PM_OPP is not set
-
 
+# FIXME: Why?
 CONFIG_EVENT_POWER_TRACING_DEPRECATED=y
 
+CONFIG_TEST_KSTRTOX=y
 # CONFIG_XZ_DEC_TEST is not set
 
-CONFIG_PN544_NFC=m
-CONFIG_NFC_PN533=m
-
 CONFIG_TARGET_CORE=m
 CONFIG_ISCSI_TARGET=m
 CONFIG_LOOPBACK_TARGET=m
@@ -4588,8 +4573,6 @@ CONFIG_PSTORE=y
 
 CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
 
-CONFIG_TEST_KSTRTOX=m
-
 CONFIG_BCMA=m
 CONFIG_BCMA_BLOCKIO=y
 CONFIG_BCMA_HOST_PCI_POSSIBLE=y
@@ -4598,6 +4581,6 @@ CONFIG_BCMA_HOST_PCI=y
 
 # CONFIG_GOOGLE_FIRMWARE is not set
 CONFIG_INTEL_MID_PTI=m
-
 CONFIG_IOMMU_SUPPORT=y
 
+# CONFIG_PM_DEVFREQ is not set
diff --git a/config-nodebug b/config-nodebug
index 084f88e..0f70aa0 100644
--- a/config-nodebug
+++ b/config-nodebug
@@ -24,6 +24,7 @@ CONFIG_CPUMASK_OFFSTACK=y
 # CONFIG_FAULT_INJECTION_DEBUG_FS is not set
 # CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set
 # CONFIG_FAIL_IO_TIMEOUT is not set
+# CONFIG_FAIL_MMC_REQUEST is not set
 
 # CONFIG_SLUB_DEBUG_ON is not set
 
@@ -81,7 +82,6 @@ CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
 # CONFIG_IWLWIFI_DEVICE_TRACING is not set
 
 # CONFIG_DEBUG_OBJECTS_WORK is not set
-# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
 
 # CONFIG_DMADEVICES_DEBUG is not set
 # CONFIG_DMADEVICES_VDEBUG is not set
@@ -99,9 +99,8 @@ CONFIG_KDB_KEYBOARD=y
 # CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER is not set
 # CONFIG_TEST_LIST_SORT is not set
 
-# CONFIG_DEBUG_SET_MODULE_RONX is not set
-
 # CONFIG_DETECT_HUNG_TASK is not set
 CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
 
+# CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK is not set
diff --git a/config-powerpc-generic b/config-powerpc-generic
index 186aa54..2ca0c3e 100644
--- a/config-powerpc-generic
+++ b/config-powerpc-generic
@@ -13,19 +13,6 @@ CONFIG_TAU_AVERAGE=y
 
 CONFIG_SECCOMP=y
 
-CONFIG_CPU_FREQ=y
-CONFIG_CPU_FREQ_DEBUG=y
-# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
-CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
-CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-CONFIG_CPU_FREQ_GOV_POWERSAVE=m
-CONFIG_CPU_FREQ_GOV_USERSPACE=m
-CONFIG_CPU_FREQ_GOV_ONDEMAND=m
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
-CONFIG_CPU_FREQ_TABLE=y
-CONFIG_CPU_FREQ_STAT=m
-CONFIG_CPU_FREQ_STAT_DETAILS=y
-
 CONFIG_PM=y
 
 CONFIG_PM_STD_PARTITION=""
@@ -51,20 +38,15 @@ CONFIG_AGP_UNINORTH=y
 CONFIG_FB_OF=y
 # CONFIG_FB_CONTROL is not set
 CONFIG_FB_IBM_GXT4500=y
-CONFIG_FB_RADEON=y
 CONFIG_FB_MATROX=y
-CONFIG_FB_NVIDIA=m
 # CONFIG_FB_VGA16 is not set
 CONFIG_FB_ATY128_BACKLIGHT=y
 CONFIG_FB_ATY_BACKLIGHT=y
-CONFIG_FB_RADEON_BACKLIGHT=y
 CONFIG_FB_RIVA_BACKLIGHT=y
-CONFIG_FB_NVIDIA_BACKLIGHT=y
-# FIXME: Do we care about this hardware ?
-CONFIG_FB_MB862XX=m
-CONFIG_FB_MB862XX_PCI_GDC=y
-CONFIG_FB_MB862XX_LIME=y
-CONFIG_FB_MB862XX_I2C=y
+# CONFIG_FB_MB862XX is not set
+# CONFIG_FB_MB862XX_PCI_GDC is not set
+# CONFIG_FB_MB862XX_LIME is not set
+# CONFIG_FB_MB862XX_I2C is not set
 
 
 CONFIG_SND_POWERMAC=m
@@ -178,7 +160,7 @@ CONFIG_IDE_TASK_IOCTL=y
 # CONFIG_BLK_DEV_SLC90E66 is not set
 # CONFIG_BLK_DEV_TRM290 is not set
 # CONFIG_BLK_DEV_VIA82CXXX is not set
-CONFIG_BLK_DEV_IDE_PMAC=y
+CONFIG_BLK_DEV_IDE_PMAC=m
 CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
 CONFIG_BLK_DEV_IDEDMA=y
 # CONFIG_BLK_DEV_HD is not set
@@ -200,8 +182,8 @@ CONFIG_EDAC_PASEMI=m
 CONFIG_EDAC_AMD8131=m
 CONFIG_EDAC_AMD8111=m
 
-CONFIG_AXON_RAM=m
-CONFIG_OPROFILE_CELL=y
+# CONFIG_AXON_RAM is not set
+# CONFIG_OPROFILE_CELL is not set
 
 CONFIG_SUSPEND_FREEZER=y
 # CONFIG_IDEPCI_PCIBUS_ORDER is not set
@@ -211,7 +193,7 @@ CONFIG_USB_EHCI_HCD_PPC_OF=y
 
 # CONFIG_MPC5121_ADS is not set
 # CONFIG_MPC5121_GENERIC is not set
-CONFIG_MTD_OF_PARTS=m
+CONFIG_MTD_OF_PARTS=y
 # CONFIG_MTD_NAND_FSL_ELBC is not set
 CONFIG_THERMAL=y
 
@@ -222,9 +204,9 @@ CONFIG_DMADEVICES=y
 
 CONFIG_SND_PPC=y
 
-CONFIG_PPC_82xx=y
-CONFIG_PPC_83xx=y
-CONFIG_PPC_86xx=y
+# CONFIG_PPC_82xx is not set
+# CONFIG_PPC_83xx is not set
+# CONFIG_PPC_86xx is not set
 CONFIG_EXTRA_TARGETS=""
 # CONFIG_CODE_PATCHING_SELFTEST is not set
 # CONFIG_FTR_FIXUP_SELFTEST is not set
@@ -238,27 +220,28 @@ CONFIG_EXTRA_TARGETS=""
 # CONFIG_SERIAL_QE is not set
 # CONFIG_I2C_CPM is not set
 
+CONFIG_NET_VENDOR_IBM=y
 
-CONFIG_SERIO_XILINX_XPS_PS2=m
+# CONFIG_SERIO_XILINX_XPS_PS2 is not set
 
 # CONFIG_PPC_SMLPAR is not set
 
-CONFIG_MGCOGE=y
-CONFIG_GEF_SBC610=y
-CONFIG_GEF_PPC9A=y
-CONFIG_GEF_SBC310=y
+# CONFIG_MGCOGE is not set
+# CONFIG_GEF_SBC610 is not set
+# CONFIG_GEF_PPC9A is not set
+# CONFIG_GEF_SBC310 is not set
 
-CONFIG_QUICC_ENGINE=y
-CONFIG_QE_GPIO=y
-CONFIG_MPC8xxx_GPIO=y
+# CONFIG_QUICC_ENGINE is not set
+# CONFIG_QE_GPIO is not set
+# CONFIG_MPC8xxx_GPIO is not set
 
 CONFIG_IDE_GD=y
 CONFIG_IDE_GD_ATA=y
 CONFIG_IDE_GD_ATAPI=y
 
-CONFIG_MCU_MPC8349EMITX=m
+# CONFIG_MCU_MPC8349EMITX is not set
 
-CONFIG_GPIO_XILINX=y
+# CONFIG_GPIO_XILINX is not set
 
 CONFIG_PMIC_DA903X=y
 CONFIG_BACKLIGHT_DA903X=m
@@ -279,11 +262,11 @@ CONFIG_TOUCHSCREEN_DA9034=m
 
 CONFIG_SIMPLE_GPIO=y
 
-CONFIG_FSL_PQ_MDIO=m
+# CONFIG_FSL_PQ_MDIO is not set
 
-CONFIG_PS3_VRAM=m
+# CONFIG_PS3_VRAM is not set
 CONFIG_MDIO_GPIO=m
-CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL=m
+# CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set
 # CONFIG_DEBUG_GPIO is not set
 CONFIG_GPIO_PCA953X=m
 CONFIG_GPIO_PCF857X=m
@@ -291,8 +274,6 @@ CONFIG_GPIO_PCF857X=m
 # CONFIG_USB_FHCI_HCD is not set
 # CONFIG_FHCI_DEBUG is not set
 
-# CONFIG_DRM_RADEON_KMS is not set
-
 # CONFIG_AMIGAONE is not set
 
 CONFIG_PPC_OF_BOOT_TRAMPOLINE=y
@@ -313,20 +294,20 @@ CONFIG_SWIOTLB=y
 
 CONFIG_PPC_DISABLE_WERROR=y
 
-CONFIG_XILINX_LL_TEMAC=m
-CONFIG_XILINX_EMACLITE=m
+# CONFIG_XILINX_LL_TEMAC is not set
+# CONFIG_XILINX_EMACLITE is not set
 
 CONFIG_GPIO_WM831X=m
 # CONFIG_GPIO_LANGWELL is not set
 # CONFIG_GPIO_UCB1400 is not set
-CONFIG_EDAC_MPC85XX=m
+# CONFIG_EDAC_MPC85XX is not set
 
 CONFIG_NR_IRQS=512
 CONFIG_SPARSE_IRQ=y
 
-CONFIG_PPC_MPC5200_LPBFIFO=m
-CONFIG_CAN_MSCAN=m
-CONFIG_CAN_MPC5XXX=m
+# CONFIG_PPC_MPC5200_LPBFIFO is not set
+# CONFIG_CAN_MSCAN is not set
+# CONFIG_CAN_MPC5XXX is not set
 CONFIG_PATA_MACIO=m
 CONFIG_SERIAL_GRLIB_GAISLER_APBUART=m
 # CONFIG_PMIC_ADP5520 is not set
@@ -347,7 +328,7 @@ CONFIG_SERIAL_GRLIB_GAISLER_APBUART=m
 # CONFIG_PPC_MPC512x is not set
 # CONFIG_RTC_DRV_MPC5121 is not set
 
-CONFIG_MPC512X_DMA=m
+# CONFIG_MPC512X_DMA is not set
 
 CONFIG_KVM_GUEST=y
 
@@ -358,15 +339,17 @@ CONFIG_I2C_MPC=m
 
 CONFIG_RFKILL_GPIO=m
 
-CONFIG_CRYPTO_DEV_FSL_CAAM=m
-CONFIG_CRYPTO_DEV_FSL_CAAM_RINGSIZE=9
-CONFIG_CRYPTO_DEV_FSL_CAAM_INTC=y
-CONFIG_CRYPTO_DEV_FSL_CAAM_INTC_COUNT_THLD=255
-CONFIG_CRYPTO_DEV_FSL_CAAM_INTC_TIME_THLD=2048
-CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API=m
+# CONFIG_CRYPTO_DEV_FSL_CAAM is not set
 
 # CONFIG_GPIO_GENERIC_PLATFORM is not set
 # CONFIG_GPIO_MCP23S08 is not set
 
+# CONFIG_CAN_FLEXCAN is not set
+# CONFIG_NET_VENDOR_XILINX is not set
+# CONFIG_PPC_EPAPR_HV_BYTECHAN is not set
+# CONFIG_IBM_EMAC is not set
+# CONFIG_NET_VENDOR_PASEMI is not set
+# CONFIG_NET_VENDOR_TOSHIBA is not set
+
 # Disable btrfs until it is shown to work with 64k pages (rhbz 747079)
 # CONFIG_BTRFS_FS is not set
diff --git a/config-powerpc32-generic b/config-powerpc32-generic
index 31c399e..e856b9f 100644
--- a/config-powerpc32-generic
+++ b/config-powerpc32-generic
@@ -7,17 +7,17 @@ CONFIG_PPC32=y
 CONFIG_CPU_FREQ_PMAC=y
 CONFIG_PPC_CHRP=y
 CONFIG_PPC_PMAC=y
-CONFIG_PPC_MPC52xx=y
+# CONFIG_PPC_MPC52xx is not set
 CONFIG_PPC_PREP=y
 
 # CONFIG_PPC_MPC5200_SIMPLE is not set
-CONFIG_SATA_FSL=m
+# CONFIG_SATA_FSL is not set
 # CONFIG_SATA_NV is not set
 
 # busted in .28git1
 # ERROR: "cacheable_memzero" [drivers/net/gianfar_driver.ko] undefined!
 # CONFIG_GIANFAR is not set
-CONFIG_USB_EHCI_FSL=y
+# CONFIG_USB_EHCI_FSL is not set
 
 CONFIG_PMAC_APM_EMU=y
 CONFIG_PMAC_BACKLIGHT=y
@@ -41,6 +41,7 @@ CONFIG_ADB_PMU_LED=y
 CONFIG_ADB_PMU_LED_IDE=y
 
 CONFIG_PMAC_MEDIABAY=y
+CONFIG_NET_VENDOR_APPLE=y
 CONFIG_BMAC=m
 CONFIG_MACE=m
 # CONFIG_MACE_AAUI_PORT is not set
@@ -72,24 +73,20 @@ CONFIG_BRIQ_PANEL=m
 # CONFIG_ATA_PIIX is not set
 # CONFIG_PATA_AMD is not set
 # CONFIG_PATA_ATIIXP is not set
-CONFIG_PATA_MPC52xx=m
+# CONFIG_PATA_MPC52xx is not set
 # CONFIG_PATA_MPIIX is not set
 # CONFIG_PATA_OLDPIIX is not set
 # CONFIG_PATA_OPTI is not set
 # CONFIG_PATA_SERVERWORKS is not set
 
-CONFIG_SERIAL_MPC52xx=y
-CONFIG_SERIAL_MPC52xx_CONSOLE=y
-CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
+# CONFIG_SERIAL_MPC52xx is not set
 # CONFIG_MPC5200_WDT is not set
 CONFIG_8xxx_WDT=m
 CONFIG_GEF_WDT=m
 
-CONFIG_PPC_MPC5200_BUGFIX=y
-CONFIG_FEC_MPC52xx=m
+# CONFIG_PPC_MPC5200_BUGFIX is not set
+# CONFIG_NET_VENDOR_FREESCALE is not set
 #CHECK: This may later become a tristate.
-CONFIG_FEC_MPC52xx_MDIO=y
-CONFIG_PPC_MPC5200_GPIO=y
 CONFIG_MDIO_GPIO=m
 
 CONFIG_SERIAL_OF_PLATFORM=y
@@ -144,26 +141,28 @@ CONFIG_VIRTUALIZATION=y
 CONFIG_SND_ISA=y
 CONFIG_CRYPTO_DEV_TALITOS=m
 
-CONFIG_FSL_EMB_PERFMON=y
-CONFIG_MPC8272_ADS=y
-CONFIG_PQ2FADS=y
-CONFIG_EP8248E=y
-CONFIG_MPC830x_RDB=y
-CONFIG_MPC831x_RDB=y
-CONFIG_MPC832x_MDS=y
-CONFIG_MPC832x_RDB=y
-CONFIG_MPC834x_MDS=y
-CONFIG_MPC834x_ITX=y
-CONFIG_MPC836x_MDS=y
-CONFIG_MPC836x_RDK=y
-CONFIG_MPC837x_MDS=y
-CONFIG_MPC837x_RDB=y
-CONFIG_SBC834x=y
-CONFIG_ASP834x=y
-CONFIG_KMETER1=y
-CONFIG_MPC8641_HPCN=y
-CONFIG_SBC8641D=y
-CONFIG_MPC8610_HPCD=y
+# CONFIG_FSL_EMB_PERFMON is not set
+# CONFIG_MPC8272_ADS is not set
+# CONFIG_PQ2FADS is not set
+# CONFIG_EP8248E is not set
+# CONFIG_MPC830x_RDB is not set
+# CONFIG_MPC831x_RDB is not set
+# CONFIG_MPC832x_MDS is not set
+# CONFIG_MPC832x_RDB is not set
+# CONFIG_MPC834x_MDS is not set
+# CONFIG_MPC834x_ITX is not set
+# CONFIG_MPC836x_MDS is not set
+# CONFIG_MPC836x_RDK is not set
+# CONFIG_MPC837x_MDS is not set
+# CONFIG_MPC837x_RDB is not set
+# CONFIG_SBC834x is not set
+# CONFIG_ASP834x is not set
+# CONFIG_KMETER1 is not set
+# CONFIG_MPC8641_HPCN is not set
+# CONFIG_SBC8641D is not set
+# CONFIG_MPC8610_HPCD is not set
+# CONFIG_FSL_LBC is not set
+# CONFIG_MTD_NAND_FSL_UPM is not set
 
 # CONFIG_USB_MUSB_HDRC is not set
 
@@ -172,8 +171,6 @@ CONFIG_MPC8610_HPCD=y
 # drivers/mtd/maps/sbc8240.c:172: warning: passing argument 1 of 'simple_map_init' from incompatible pointer type
 # drivers/mtd/maps/sbc8240.c:177: error: 'struct mtd_info' has no member named 'module'
 
-CONFIG_MTD_NAND_FSL_UPM=m
-
 CONFIG_RCU_FANOUT=32
 
 CONFIG_PERF_COUNTERS=y
@@ -185,3 +182,4 @@ CONFIG_KVM_BOOK3S_32=m
 # CONFIG_SCSI_QLA_ISCSI is not set
 
 CONFIG_BATTERY_PMU=m
+
diff --git a/config-powerpc64 b/config-powerpc64
index ad3edf1..42b5016 100644
--- a/config-powerpc64
+++ b/config-powerpc64
@@ -2,42 +2,23 @@ CONFIG_WINDFARM_PM81=y
 CONFIG_WINDFARM_PM91=y
 CONFIG_WINDFARM_PM121=y
 CONFIG_PPC_PMAC64=y
-CONFIG_PPC_MAPLE=y
-CONFIG_PPC_CELL=y
-CONFIG_PPC_IBM_CELL_BLADE=y
+# CONFIG_PPC_MAPLE is not set
+# CONFIG_PPC_CELL is not set
+# CONFIG_PPC_IBM_CELL_BLADE is not set
 CONFIG_PPC_ISERIES=y
 CONFIG_PPC_PSERIES=y
 CONFIG_PPC_PMAC=y
-CONFIG_PPC_PASEMI=y
+CONFIG_PPC_POWERNV=y
+CONFIG_PPC_POWERNV_RTAS=y
+# CONFIG_PPC_PASEMI is not set
 # CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set
-CONFIG_PPC_PS3=y
-CONFIG_PPC_CELLEB=y
-CONFIG_PPC_CELL_QPACE=y
-CONFIG_PS3_HTAB_SIZE=20
-# CONFIG_PS3_DYNAMIC_DMA is not set
-CONFIG_PS3_ADVANCED=y
-CONFIG_PS3_HTAB_SIZE=20
-# CONFIG_PS3_DYNAMIC_DMA is not set
-CONFIG_PS3_VUART=y
-CONFIG_PS3_PS3AV=y
-CONFIG_PS3_STORAGE=m
-CONFIG_PS3_DISK=m
-CONFIG_PS3_ROM=m
-CONFIG_PS3_FLASH=m
-CONFIG_PS3_LPM=y
-CONFIG_SND_PS3=m
-CONFIG_SND_PS3_DEFAULT_START_DELAY=1000
-CONFIG_GELIC_NET=m
-CONFIG_GELIC_WIRELESS=y
-CONFIG_GELIC_WIRELESS_OLD_PSK_INTERFACE=y
-CONFIG_CBE_THERM=m
-CONFIG_CBE_CPUFREQ=m
-CONFIG_CBE_CPUFREQ_PMI=m
-CONFIG_CBE_CPUFREQ_PMI_ENABLE=y
+# CONFIG_PPC_PS3 is not set
+# CONFIG_PPC_CELLEB is not set
+# CONFIG_PPC_CELL_QPACE is not set
 CONFIG_PMAC_RACKMETER=m
 CONFIG_IBMEBUS=y
-CONFIG_SPU_FS=m
 CONFIG_RTAS_FLASH=y
+# CONFIG_UDBG_RTAS_CONSOLE is not set
 CONFIG_PPC_SPLPAR=y
 CONFIG_SCANLOG=y
 CONFIG_LPARCFG=y
@@ -60,10 +41,9 @@ CONFIG_CPU_FREQ_PMAC64=y
 CONFIG_SCSI_IPR=m
 CONFIG_SCSI_IPR_TRACE=y
 CONFIG_SCSI_IPR_DUMP=y
-CONFIG_SPIDER_NET=m
 CONFIG_HVC_RTAS=y
 CONFIG_HVC_ISERIES=y
-CONFIG_CBE_RAS=y
+CONFIG_HVC_OPAL=y
 
 # iSeries device drivers
 #
@@ -75,19 +55,13 @@ CONFIG_VIOTAPE=m
 CONFIG_PASEMI_MAC=m
 CONFIG_SERIAL_OF_PLATFORM=m
 
-CONFIG_PPC_PASEMI_IOMMU=y
 CONFIG_SERIAL_TXX9=y
 CONFIG_SERIAL_TXX9_NR_UARTS=6
 CONFIG_SERIAL_TXX9_CONSOLE=y
 
 CONFIG_HVC_BEAT=y
 
-CONFIG_FB_PS3=y
-CONFIG_FB_PS3_DEFAULT_SIZE_M=18
-
 CONFIG_PPC_PMI=m
-CONFIG_PS3_SYS_MANAGER=y
-# CONFIG_BLK_DEV_CELLEB is not set
 
 CONFIG_PATA_SCC=m
 
@@ -95,7 +69,7 @@ CONFIG_APM_EMULATION=m
 
 CONFIG_PPC64=y
 CONFIG_VIRT_CPU_ACCOUNTING=y
-CONFIG_NR_CPUS=128
+CONFIG_NR_CPUS=1024
 # CONFIG_FB_PLATINUM is not set
 # CONFIG_FB_VALKYRIE is not set
 # CONFIG_FB_CT65550 is not set
@@ -138,19 +112,9 @@ CONFIG_SECCOMP=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 # CONFIG_BLK_DEV_PLATFORM is not set
-CONFIG_IBM_NEW_EMAC=m
-CONFIG_IBM_NEW_EMAC_RXB=128
-CONFIG_IBM_NEW_EMAC_TXB=64
-CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-# CONFIG_IBM_NEW_EMAC_DEBUG is not set
 
 # CONFIG_VIRQ_DEBUG is not set
-CONFIG_ELECTRA_CF=m
 
-CONFIG_MTD_NAND_PASEMI=m
-CONFIG_EDAC_CELL=m
 CONFIG_EDAC_CPC925=m
 CONFIG_FRAME_WARN=2048
 
@@ -164,14 +128,6 @@ CONFIG_SCSI_IBMVFC=m
 # CONFIG_SCSI_IBMVFC_TRACE is not set
 CONFIG_IBM_BSR=m
 
-CONFIG_SERIO_XILINX_XPS_PS2=m
-
-CONFIG_PPC_IBM_CELL_RESETBUTTON=y
-CONFIG_PPC_IBM_CELL_POWERBUTTON=m
-CONFIG_CBE_CPUFREQ_SPU_GOVERNOR=m
-
-CONFIG_RTC_DRV_PS3=y
-
 CONFIG_CRASH_DUMP=y
 CONFIG_RELOCATABLE=y
 
@@ -202,4 +158,3 @@ CONFIG_IO_EVENT_IRQ=y
 CONFIG_HW_RANDOM_AMD=m
 
 CONFIG_BPF_JIT=y
-CONFIG_CPU_FREQ_MAPLE=y
diff --git a/config-s390x b/config-s390x
index 5251b5b..f039421 100644
--- a/config-s390x
+++ b/config-s390x
@@ -237,3 +237,5 @@ CONFIG_STRICT_DEVMEM=y
 # CONFIG_WARN_DYNAMIC_STACK is not set
 
 CONFIG_CRYPTO_GHASH_S390=m
+CONFIG_NET_CORE=y
+CONFIG_ETHERNET=y
diff --git a/config-sparc64-generic b/config-sparc64-generic
index d95a9b1..e9b66f6 100644
--- a/config-sparc64-generic
+++ b/config-sparc64-generic
@@ -8,18 +8,7 @@ CONFIG_HZ=100
 
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
-CONFIG_CPU_FREQ=y
-CONFIG_CPU_FREQ_TABLE=m
-CONFIG_CPU_FREQ_DEBUG=y
-# CONFIG_CPU_FREQ_STAT is not set
-# CONFIG_CPU_FREQ_STAT_DETAILS is not set
-CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
-# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
-CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-CONFIG_CPU_FREQ_GOV_POWERSAVE=m
-CONFIG_CPU_FREQ_GOV_USERSPACE=m
-CONFIG_CPU_FREQ_GOV_ONDEMAND=m
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+
 CONFIG_US3_FREQ=m
 CONFIG_US2E_FREQ=m
 
@@ -54,6 +43,7 @@ CONFIG_I2C_ALI1535=m
 # CONFIG_VGASTATE is not set
 # CONFIG_FB_DDC is not set
 # CONFIG_FB_BW2 is not set
+# CONFIG_FB_GRVGA is not set
 CONFIG_FB_CG3=y
 CONFIG_FB_CG6=y
 # CONFIG_FB_RIVA is not set
diff --git a/config-x86-32-generic b/config-x86-32-generic
index caeae93..3b55ae5 100644
--- a/config-x86-32-generic
+++ b/config-x86-32-generic
@@ -57,9 +57,6 @@ CONFIG_FB_GEODE_GX=y
 # CONFIG_PCI_GOMMCONFIG is not set
 CONFIG_PCI_GOANY=y
 
-# FIXME: wtf? "x86 specific drivers"
-CONFIG_PCMCIA_FDOMAIN=m
-CONFIG_SCSI_FUTURE_DOMAIN=m
 CONFIG_IBM_ASM=m
 
 #
@@ -138,8 +135,6 @@ CONFIG_CRYPTO_TWOFISH_586=m
 
 CONFIG_VIDEO_CAFE_CCIC=m
 
-CONFIG_VMI=y
-
 CONFIG_XEN_MAX_DOMAIN_MEMORY=8
 
 CONFIG_MTD_NAND_CAFE=m
@@ -155,6 +150,7 @@ CONFIG_OLPC_XO1_PM=y
 CONFIG_OLPC_XO15_SCI=y
 CONFIG_OLPC_XO1_RTC=y
 CONFIG_OLPC_XO1_SCI=y
+# CONFIG_ALIX is not set
 # staging
 # CONFIG_FB_OLPC_DCON is not set
 
@@ -204,3 +200,6 @@ CONFIG_I2O_EXT_ADAPTEC=y
 CONFIG_I2O_CONFIG_OLD_IOCTL=y
 CONFIG_I2O_BUS=m
 
+# CONFIG_EDAC_SBRIDGE is not set
+
+# CONFIG_X86_WANT_INTEL_MID is not set
diff --git a/config-x86-generic b/config-x86-generic
index 23aecbb..fec30ea 100644
--- a/config-x86-generic
+++ b/config-x86-generic
@@ -36,10 +36,10 @@ CONFIG_FB_EFI=y
 # FIXME: 32bit only?
 # CONFIG_FB_N411 is not set
 
-CONFIG_DMAR=y
+CONFIG_INTEL_IOMMU=y
 CONFIG_DMAR_BROKEN_GFX_WA=y
-CONFIG_DMAR_FLOPPY_WA=y
-# CONFIG_DMAR_DEFAULT_ON is not set
+CONFIG_INTEL_IOMMU_FLOPPY_WA=y
+# CONFIG_INTEL_IOMMU_DEFAULT_ON is not set
 CONFIG_SCSI_ADVANSYS=m
 
 CONFIG_SECCOMP=y
@@ -59,7 +59,6 @@ CONFIG_DEBUG_STACKOVERFLOW=y
 CONFIG_ACPI=y
 CONFIG_ACPI_AC=y
 # CONFIG_ACPI_ASUS is not set
-CONFIG_ACPI_PROCFS_POWER=y
 CONFIG_ACPI_BATTERY=y
 CONFIG_ACPI_BUTTON=y
 CONFIG_ACPI_CONTAINER=m
@@ -73,6 +72,8 @@ CONFIG_ACPI_SLEEP=y
 CONFIG_ACPI_THERMAL=y
 CONFIG_ACPI_TOSHIBA=m
 CONFIG_ACPI_VIDEO=m
+# FIXME: Next two are deprecated. Remove them when they disappear upstream
+# CONFIG_ACPI_PROCFS_POWER is not set
 # CONFIG_ACPI_PROC_EVENT is not set
 CONFIG_PNPACPI=y
 CONFIG_ACPI_PROCESSOR_AGGREGATOR=m
@@ -85,10 +86,10 @@ CONFIG_ACPI_APEI_MEMORY_FAILURE=y
 CONFIG_ACPI_IPMI=m
 CONFIG_ACPI_CUSTOM_METHOD=m
 
-CONFIG_X86_ACPI_CPUFREQ=m
-CONFIG_X86_PCC_CPUFREQ=m
-CONFIG_X86_POWERNOW_K8=m
-CONFIG_X86_P4_CLOCKMOD=m
+CONFIG_X86_ACPI_CPUFREQ=y
+CONFIG_X86_PCC_CPUFREQ=y
+CONFIG_X86_POWERNOW_K8=y
+CONFIG_X86_P4_CLOCKMOD=y
 # CONFIG_X86_SPEEDSTEP_CENTRINO is not set
 
 #
@@ -227,8 +228,7 @@ CONFIG_PARAVIRT=y
 CONFIG_PARAVIRT_TIME_ACCOUNTING=y
 # CONFIG_PARAVIRT_DEBUG is not set
 
-# PARAVIRT_SPINLOCKS has a 5% perf hit
-# FIXME: Still true ? References?
+# PARAVIRT_SPINLOCKS has a 5% perf hit on native hw (see kconfig)
 # CONFIG_PARAVIRT_SPINLOCKS is not set
 
 CONFIG_KVM_CLOCK=y
@@ -310,7 +310,7 @@ CONFIG_HP_ILO=m
 CONFIG_BACKLIGHT_APPLE=m
 
 
-# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set
+CONFIG_X86_CHECK_BIOS_CORRUPTION=y
 
 # CONFIG_CMDLINE_BOOL is not set
 
@@ -381,3 +381,6 @@ CONFIG_HP_ACCEL=m
 CONFIG_SCHED_SMT=y
 CONFIG_CC_STACKPROTECTOR=y
 CONFIG_RELOCATABLE=y
+
+# CONFIG_HYPERV is not set
+
diff --git a/config-x86_64-generic b/config-x86_64-generic
index 693c3a8..f5b440a 100644
--- a/config-x86_64-generic
+++ b/config-x86_64-generic
@@ -22,8 +22,7 @@ CONFIG_AMD_IOMMU=y
 CONFIG_AMD_IOMMU_STATS=y
 # CONFIG_IOMMU_DEBUG is not set
 CONFIG_SWIOTLB=y
-CONFIG_CALGARY_IOMMU=y
-CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y
+# CONFIG_CALGARY_IOMMU is not set
 
 CONFIG_KEXEC_JUMP=y
 
@@ -44,6 +43,9 @@ CONFIG_CRYPTO_AES_X86_64=y
 CONFIG_CRYPTO_TWOFISH_X86_64=m
 CONFIG_CRYPTO_SALSA20_X86_64=m
 CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m
+CONFIG_CRYPTO_SHA1_SSSE3=m
+CONFIG_CRYPTO_BLOWFISH_X86_64=m
+CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=m
 
 # CONFIG_I2C_ALI1535 is not set
 # CONFIG_I2C_ALI1563 is not set
@@ -53,6 +55,7 @@ CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m
 
 CONFIG_EDAC_AMD64=m
 # CONFIG_EDAC_AMD64_ERROR_INJECTION is not set
+CONFIG_EDAC_SBRIDGE=m
 
 # CONFIG_PC8736x_GPIO is not set
 
@@ -62,8 +65,8 @@ CONFIG_SPARSEMEM=y
 CONFIG_HAVE_MEMORY_PRESENT=y
 CONFIG_SPARSEMEM_EXTREME=y
 CONFIG_SPARSEMEM_VMEMMAP=y
-CONFIG_MEMORY_HOTPLUG=y
-CONFIG_MEMORY_HOTREMOVE=y
+# CONFIG_MEMORY_HOTPLUG is not set
+# CONFIG_MEMORY_HOTREMOVE is not set
 
 # CONFIG_BLK_DEV_CMD640 is not set
 # CONFIG_BLK_DEV_RZ1000 is not set
@@ -79,7 +82,7 @@ CONFIG_SGI_GRU=m
 
 # CONFIG_VIDEO_CAFE_CCIC is not set
 
-CONFIG_XEN_MAX_DOMAIN_MEMORY=32
+CONFIG_XEN_MAX_DOMAIN_MEMORY=128
 # CONFIG_XEN_BALLOON_MEMORY_HOTPLUG is not set
 CONFIG_XEN_DEV_EVTCHN=m
 CONFIG_XEN_SYS_HYPERVISOR=y
@@ -95,7 +98,7 @@ CONFIG_DIRECT_GBPAGES=y
 CONFIG_X86_MPPARSE=y
 
 CONFIG_I7300_IDLE=m
-CONFIG_INTR_REMAP=y
+CONFIG_IRQ_REMAP=y
 
 CONFIG_X86_X2APIC=y
 CONFIG_SPARSE_IRQ=y
diff --git a/drm-nouveau-updates.patch b/drm-nouveau-updates.patch
index cd9bded..e69de29 100644
--- a/drm-nouveau-updates.patch
+++ b/drm-nouveau-updates.patch
@@ -1,8526 +0,0 @@
-diff --git a/drivers/gpu/drm/nouveau/Makefile b/drivers/gpu/drm/nouveau/Makefile
-index 0583677..35ef5b1 100644
---- a/drivers/gpu/drm/nouveau/Makefile
-+++ b/drivers/gpu/drm/nouveau/Makefile
-@@ -21,16 +21,17 @@ nouveau-y := nouveau_drv.o nouveau_state.o nouveau_channel.o nouveau_mem.o \
-              nv40_grctx.o nv50_grctx.o nvc0_grctx.o \
-              nv84_crypt.o \
-              nva3_copy.o nvc0_copy.o \
--             nv40_mpeg.o nv50_mpeg.o \
-+             nv31_mpeg.o nv50_mpeg.o \
-              nv04_instmem.o nv50_instmem.o nvc0_instmem.o \
--             nv50_evo.o nv50_crtc.o nv50_dac.o nv50_sor.o \
--             nv50_cursor.o nv50_display.o \
-              nv04_dac.o nv04_dfp.o nv04_tv.o nv17_tv.o nv17_tv_modes.o \
-              nv04_crtc.o nv04_display.o nv04_cursor.o \
-+             nv50_evo.o nv50_crtc.o nv50_dac.o nv50_sor.o \
-+             nv50_cursor.o nv50_display.o \
-+             nvd0_display.o \
-              nv04_fbcon.o nv50_fbcon.o nvc0_fbcon.o \
-              nv10_gpio.o nv50_gpio.o \
- 	     nv50_calc.o \
--	     nv04_pm.o nv50_pm.o nva3_pm.o \
-+	     nv04_pm.o nv40_pm.o nv50_pm.o nva3_pm.o nvc0_pm.o \
- 	     nv50_vram.o nvc0_vram.o \
- 	     nv50_vm.o nvc0_vm.o
- 
-diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c
-index 00a55df..fa22b28 100644
---- a/drivers/gpu/drm/nouveau/nouveau_backlight.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c
-@@ -37,8 +37,10 @@
- #include "nouveau_drv.h"
- #include "nouveau_drm.h"
- #include "nouveau_reg.h"
-+#include "nouveau_encoder.h"
- 
--static int nv40_get_intensity(struct backlight_device *bd)
-+static int
-+nv40_get_intensity(struct backlight_device *bd)
- {
- 	struct drm_device *dev = bl_get_data(bd);
- 	int val = (nv_rd32(dev, NV40_PMC_BACKLIGHT) & NV40_PMC_BACKLIGHT_MASK)
-@@ -47,7 +49,8 @@ static int nv40_get_intensity(struct backlight_device *bd)
- 	return val;
- }
- 
--static int nv40_set_intensity(struct backlight_device *bd)
-+static int
-+nv40_set_intensity(struct backlight_device *bd)
- {
- 	struct drm_device *dev = bl_get_data(bd);
- 	int val = bd->props.brightness;
-@@ -65,30 +68,8 @@ static const struct backlight_ops nv40_bl_ops = {
- 	.update_status = nv40_set_intensity,
- };
- 
--static int nv50_get_intensity(struct backlight_device *bd)
--{
--	struct drm_device *dev = bl_get_data(bd);
--
--	return nv_rd32(dev, NV50_PDISPLAY_SOR_BACKLIGHT);
--}
--
--static int nv50_set_intensity(struct backlight_device *bd)
--{
--	struct drm_device *dev = bl_get_data(bd);
--	int val = bd->props.brightness;
--
--	nv_wr32(dev, NV50_PDISPLAY_SOR_BACKLIGHT,
--		val | NV50_PDISPLAY_SOR_BACKLIGHT_ENABLE);
--	return 0;
--}
--
--static const struct backlight_ops nv50_bl_ops = {
--	.options = BL_CORE_SUSPENDRESUME,
--	.get_brightness = nv50_get_intensity,
--	.update_status = nv50_set_intensity,
--};
--
--static int nouveau_nv40_backlight_init(struct drm_connector *connector)
-+static int
-+nv40_backlight_init(struct drm_connector *connector)
- {
- 	struct drm_device *dev = connector->dev;
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
-@@ -113,34 +94,129 @@ static int nouveau_nv40_backlight_init(struct drm_connector *connector)
- 	return 0;
- }
- 
--static int nouveau_nv50_backlight_init(struct drm_connector *connector)
-+static int
-+nv50_get_intensity(struct backlight_device *bd)
-+{
-+	struct nouveau_encoder *nv_encoder = bl_get_data(bd);
-+	struct drm_device *dev = nv_encoder->base.base.dev;
-+	int or = nv_encoder->or;
-+	u32 div = 1025;
-+	u32 val;
-+
-+	val  = nv_rd32(dev, NV50_PDISP_SOR_PWM_CTL(or));
-+	val &= NV50_PDISP_SOR_PWM_CTL_VAL;
-+	return ((val * 100) + (div / 2)) / div;
-+}
-+
-+static int
-+nv50_set_intensity(struct backlight_device *bd)
-+{
-+	struct nouveau_encoder *nv_encoder = bl_get_data(bd);
-+	struct drm_device *dev = nv_encoder->base.base.dev;
-+	int or = nv_encoder->or;
-+	u32 div = 1025;
-+	u32 val = (bd->props.brightness * div) / 100;
-+
-+	nv_wr32(dev, NV50_PDISP_SOR_PWM_CTL(or),
-+		     NV50_PDISP_SOR_PWM_CTL_NEW | val);
-+	return 0;
-+}
-+
-+static const struct backlight_ops nv50_bl_ops = {
-+	.options = BL_CORE_SUSPENDRESUME,
-+	.get_brightness = nv50_get_intensity,
-+	.update_status = nv50_set_intensity,
-+};
-+
-+static int
-+nva3_get_intensity(struct backlight_device *bd)
-+{
-+	struct nouveau_encoder *nv_encoder = bl_get_data(bd);
-+	struct drm_device *dev = nv_encoder->base.base.dev;
-+	int or = nv_encoder->or;
-+	u32 div, val;
-+
-+	div  = nv_rd32(dev, NV50_PDISP_SOR_PWM_DIV(or));
-+	val  = nv_rd32(dev, NV50_PDISP_SOR_PWM_CTL(or));
-+	val &= NVA3_PDISP_SOR_PWM_CTL_VAL;
-+	if (div && div >= val)
-+		return ((val * 100) + (div / 2)) / div;
-+
-+	return 100;
-+}
-+
-+static int
-+nva3_set_intensity(struct backlight_device *bd)
-+{
-+	struct nouveau_encoder *nv_encoder = bl_get_data(bd);
-+	struct drm_device *dev = nv_encoder->base.base.dev;
-+	int or = nv_encoder->or;
-+	u32 div, val;
-+
-+	div = nv_rd32(dev, NV50_PDISP_SOR_PWM_DIV(or));
-+	val = (bd->props.brightness * div) / 100;
-+	if (div) {
-+		nv_wr32(dev, NV50_PDISP_SOR_PWM_CTL(or), val |
-+			     NV50_PDISP_SOR_PWM_CTL_NEW |
-+			     NVA3_PDISP_SOR_PWM_CTL_UNK);
-+		return 0;
-+	}
-+
-+	return -EINVAL;
-+}
-+
-+static const struct backlight_ops nva3_bl_ops = {
-+	.options = BL_CORE_SUSPENDRESUME,
-+	.get_brightness = nva3_get_intensity,
-+	.update_status = nva3_set_intensity,
-+};
-+
-+static int
-+nv50_backlight_init(struct drm_connector *connector)
- {
- 	struct drm_device *dev = connector->dev;
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nouveau_encoder *nv_encoder;
- 	struct backlight_properties props;
- 	struct backlight_device *bd;
-+	const struct backlight_ops *ops;
-+
-+	nv_encoder = find_encoder(connector, OUTPUT_LVDS);
-+	if (!nv_encoder) {
-+		nv_encoder = find_encoder(connector, OUTPUT_DP);
-+		if (!nv_encoder)
-+			return -ENODEV;
-+	}
- 
--	if (!nv_rd32(dev, NV50_PDISPLAY_SOR_BACKLIGHT))
-+	if (!nv_rd32(dev, NV50_PDISP_SOR_PWM_CTL(nv_encoder->or)))
- 		return 0;
- 
-+	if (dev_priv->chipset <= 0xa0 ||
-+	    dev_priv->chipset == 0xaa ||
-+	    dev_priv->chipset == 0xac)
-+		ops = &nv50_bl_ops;
-+	else
-+		ops = &nva3_bl_ops;
-+
- 	memset(&props, 0, sizeof(struct backlight_properties));
- 	props.type = BACKLIGHT_RAW;
--	props.max_brightness = 1025;
--	bd = backlight_device_register("nv_backlight", &connector->kdev, dev,
--				       &nv50_bl_ops, &props);
-+	props.max_brightness = 100;
-+	bd = backlight_device_register("nv_backlight", &connector->kdev,
-+				       nv_encoder, ops, &props);
- 	if (IS_ERR(bd))
- 		return PTR_ERR(bd);
- 
- 	dev_priv->backlight = bd;
--	bd->props.brightness = nv50_get_intensity(bd);
-+	bd->props.brightness = bd->ops->get_brightness(bd);
- 	backlight_update_status(bd);
- 	return 0;
- }
- 
--int nouveau_backlight_init(struct drm_connector *connector)
-+int
-+nouveau_backlight_init(struct drm_device *dev)
- {
--	struct drm_device *dev = connector->dev;
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct drm_connector *connector;
- 
- #ifdef CONFIG_ACPI
- 	if (acpi_video_backlight_support()) {
-@@ -150,21 +226,28 @@ int nouveau_backlight_init(struct drm_connector *connector)
- 	}
- #endif
- 
--	switch (dev_priv->card_type) {
--	case NV_40:
--		return nouveau_nv40_backlight_init(connector);
--	case NV_50:
--		return nouveau_nv50_backlight_init(connector);
--	default:
--		break;
-+	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
-+		if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS &&
-+		    connector->connector_type != DRM_MODE_CONNECTOR_eDP)
-+			continue;
-+
-+		switch (dev_priv->card_type) {
-+		case NV_40:
-+			return nv40_backlight_init(connector);
-+		case NV_50:
-+			return nv50_backlight_init(connector);
-+		default:
-+			break;
-+		}
- 	}
- 
-+
- 	return 0;
- }
- 
--void nouveau_backlight_exit(struct drm_connector *connector)
-+void
-+nouveau_backlight_exit(struct drm_device *dev)
- {
--	struct drm_device *dev = connector->dev;
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
- 
- 	if (dev_priv->backlight) {
-diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c
-index b311fab..032a820 100644
---- a/drivers/gpu/drm/nouveau/nouveau_bios.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_bios.c
-@@ -296,6 +296,11 @@ munge_reg(struct nvbios *bios, uint32_t reg)
- 	if (dev_priv->card_type < NV_50)
- 		return reg;
- 
-+	if (reg & 0x80000000) {
-+		BUG_ON(bios->display.crtc < 0);
-+		reg += bios->display.crtc * 0x800;
-+	}
-+
- 	if (reg & 0x40000000) {
- 		BUG_ON(!dcbent);
- 
-@@ -304,7 +309,7 @@ munge_reg(struct nvbios *bios, uint32_t reg)
- 			reg += 0x00000080;
- 	}
- 
--	reg &= ~0x60000000;
-+	reg &= ~0xe0000000;
- 	return reg;
- }
- 
-@@ -1174,22 +1179,19 @@ init_dp_condition(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
- 	 *
- 	 */
- 
--	struct bit_displayport_encoder_table *dpe = NULL;
- 	struct dcb_entry *dcb = bios->display.output;
- 	struct drm_device *dev = bios->dev;
- 	uint8_t cond = bios->data[offset + 1];
--	int dummy;
-+	uint8_t *table, *entry;
- 
- 	BIOSLOG(bios, "0x%04X: subop 0x%02X\n", offset, cond);
- 
- 	if (!iexec->execute)
- 		return 3;
- 
--	dpe = nouveau_bios_dp_table(dev, dcb, &dummy);
--	if (!dpe) {
--		NV_ERROR(dev, "0x%04X: INIT_3A: no encoder table!!\n", offset);
-+	table = nouveau_dp_bios_data(dev, dcb, &entry);
-+	if (!table)
- 		return 3;
--	}
- 
- 	switch (cond) {
- 	case 0:
-@@ -1203,7 +1205,7 @@ init_dp_condition(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
- 		break;
- 	case 1:
- 	case 2:
--		if (!(dpe->unknown & cond))
-+		if (!(entry[5] & cond))
- 			iexec->execute = false;
- 		break;
- 	case 5:
-@@ -3221,6 +3223,49 @@ init_8d(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
- 	return 1;
- }
- 
-+static void
-+init_gpio_unknv50(struct nvbios *bios, struct dcb_gpio_entry *gpio)
-+{
-+	const uint32_t nv50_gpio_ctl[2] = { 0xe100, 0xe28c };
-+	u32 r, s, v;
-+
-+	/* Not a clue, needs de-magicing */
-+	r = nv50_gpio_ctl[gpio->line >> 4];
-+	s = (gpio->line & 0x0f);
-+	v = bios_rd32(bios, r) & ~(0x00010001 << s);
-+	switch ((gpio->entry & 0x06000000) >> 25) {
-+	case 1:
-+		v |= (0x00000001 << s);
-+		break;
-+	case 2:
-+		v |= (0x00010000 << s);
-+		break;
-+	default:
-+		break;
-+	}
-+
-+	bios_wr32(bios, r, v);
-+}
-+
-+static void
-+init_gpio_unknvd0(struct nvbios *bios, struct dcb_gpio_entry *gpio)
-+{
-+	u32 v, i;
-+
-+	v  = bios_rd32(bios, 0x00d610 + (gpio->line * 4));
-+	v &= 0xffffff00;
-+	v |= (gpio->entry & 0x00ff0000) >> 16;
-+	bios_wr32(bios, 0x00d610 + (gpio->line * 4), v);
-+
-+	i = (gpio->entry & 0x1f000000) >> 24;
-+	if (i) {
-+		v  = bios_rd32(bios, 0x00d640 + ((i - 1) * 4));
-+		v &= 0xffffff00;
-+		v |= gpio->line;
-+		bios_wr32(bios, 0x00d640 + ((i - 1) * 4), v);
-+	}
-+}
-+
- static int
- init_gpio(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
- {
-@@ -3235,7 +3280,6 @@ init_gpio(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
- 
- 	struct drm_nouveau_private *dev_priv = bios->dev->dev_private;
- 	struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
--	const uint32_t nv50_gpio_ctl[2] = { 0xe100, 0xe28c };
- 	int i;
- 
- 	if (dev_priv->card_type < NV_50) {
-@@ -3248,33 +3292,20 @@ init_gpio(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
- 
- 	for (i = 0; i < bios->dcb.gpio.entries; i++) {
- 		struct dcb_gpio_entry *gpio = &bios->dcb.gpio.entry[i];
--		uint32_t r, s, v;
- 
- 		BIOSLOG(bios, "0x%04X: Entry: 0x%08X\n", offset, gpio->entry);
- 
- 		BIOSLOG(bios, "0x%04X: set gpio 0x%02x, state %d\n",
- 			offset, gpio->tag, gpio->state_default);
--		if (bios->execute)
--			pgpio->set(bios->dev, gpio->tag, gpio->state_default);
- 
--		/* The NVIDIA binary driver doesn't appear to actually do
--		 * any of this, my VBIOS does however.
--		 */
--		/* Not a clue, needs de-magicing */
--		r = nv50_gpio_ctl[gpio->line >> 4];
--		s = (gpio->line & 0x0f);
--		v = bios_rd32(bios, r) & ~(0x00010001 << s);
--		switch ((gpio->entry & 0x06000000) >> 25) {
--		case 1:
--			v |= (0x00000001 << s);
--			break;
--		case 2:
--			v |= (0x00010000 << s);
--			break;
--		default:
--			break;
--		}
--		bios_wr32(bios, r, v);
-+		if (!bios->execute)
-+			continue;
-+
-+		pgpio->set(bios->dev, gpio->tag, gpio->state_default);
-+		if (dev_priv->card_type < NV_D0)
-+			init_gpio_unknv50(bios, gpio);
-+		else
-+			init_gpio_unknvd0(bios, gpio);
- 	}
- 
- 	return 1;
-@@ -3737,6 +3768,10 @@ parse_init_table(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
- 	int count = 0, i, ret;
- 	uint8_t id;
- 
-+	/* catch NULL script pointers */
-+	if (offset == 0)
-+		return 0;
-+
- 	/*
- 	 * Loop until INIT_DONE causes us to break out of the loop
- 	 * (or until offset > bios length just in case... )
-@@ -4389,86 +4424,37 @@ int nouveau_bios_parse_lvds_table(struct drm_device *dev, int pxclk, bool *dl, b
- 	return 0;
- }
- 
--static uint8_t *
--bios_output_config_match(struct drm_device *dev, struct dcb_entry *dcbent,
--			 uint16_t record, int record_len, int record_nr,
--			 bool match_link)
-+/* BIT 'U'/'d' table encoder subtables have hashes matching them to
-+ * a particular set of encoders.
-+ *
-+ * This function returns true if a particular DCB entry matches.
-+ */
-+bool
-+bios_encoder_match(struct dcb_entry *dcb, u32 hash)
- {
--	struct drm_nouveau_private *dev_priv = dev->dev_private;
--	struct nvbios *bios = &dev_priv->vbios;
--	uint32_t entry;
--	uint16_t table;
--	int i, v;
-+	if ((hash & 0x000000f0) != (dcb->location << 4))
-+		return false;
-+	if ((hash & 0x0000000f) != dcb->type)
-+		return false;
-+	if (!(hash & (dcb->or << 16)))
-+		return false;
- 
--	switch (dcbent->type) {
-+	switch (dcb->type) {
- 	case OUTPUT_TMDS:
- 	case OUTPUT_LVDS:
- 	case OUTPUT_DP:
--		break;
--	default:
--		match_link = false;
--		break;
--	}
--
--	for (i = 0; i < record_nr; i++, record += record_len) {
--		table = ROM16(bios->data[record]);
--		if (!table)
--			continue;
--		entry = ROM32(bios->data[table]);
--
--		if (match_link) {
--			v = (entry & 0x00c00000) >> 22;
--			if (!(v & dcbent->sorconf.link))
--				continue;
-+		if (hash & 0x00c00000) {
-+			if (!(hash & (dcb->sorconf.link << 22)))
-+				return false;
- 		}
--
--		v = (entry & 0x000f0000) >> 16;
--		if (!(v & dcbent->or))
--			continue;
--
--		v = (entry & 0x000000f0) >> 4;
--		if (v != dcbent->location)
--			continue;
--
--		v = (entry & 0x0000000f);
--		if (v != dcbent->type)
--			continue;
--
--		return &bios->data[table];
--	}
--
--	return NULL;
--}
--
--void *
--nouveau_bios_dp_table(struct drm_device *dev, struct dcb_entry *dcbent,
--		      int *length)
--{
--	struct drm_nouveau_private *dev_priv = dev->dev_private;
--	struct nvbios *bios = &dev_priv->vbios;
--	uint8_t *table;
--
--	if (!bios->display.dp_table_ptr) {
--		NV_ERROR(dev, "No pointer to DisplayPort table\n");
--		return NULL;
--	}
--	table = &bios->data[bios->display.dp_table_ptr];
--
--	if (table[0] != 0x20 && table[0] != 0x21) {
--		NV_ERROR(dev, "DisplayPort table version 0x%02x unknown\n",
--			 table[0]);
--		return NULL;
-+	default:
-+		return true;
- 	}
--
--	*length = table[4];
--	return bios_output_config_match(dev, dcbent,
--					bios->display.dp_table_ptr + table[1],
--					table[2], table[3], table[0] >= 0x21);
- }
- 
- int
--nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
--			       uint32_t sub, int pxclk)
-+nouveau_bios_run_display_table(struct drm_device *dev, u16 type, int pclk,
-+			       struct dcb_entry *dcbent, int crtc)
- {
- 	/*
- 	 * The display script table is located by the BIT 'U' table.
-@@ -4498,7 +4484,7 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
- 	uint8_t *table = &bios->data[bios->display.script_table_ptr];
- 	uint8_t *otable = NULL;
- 	uint16_t script;
--	int i = 0;
-+	int i;
- 
- 	if (!bios->display.script_table_ptr) {
- 		NV_ERROR(dev, "No pointer to output script table\n");
-@@ -4550,30 +4536,33 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
- 
- 	NV_DEBUG_KMS(dev, "Searching for output entry for %d %d %d\n",
- 			dcbent->type, dcbent->location, dcbent->or);
--	otable = bios_output_config_match(dev, dcbent, table[1] +
--					  bios->display.script_table_ptr,
--					  table[2], table[3], table[0] >= 0x21);
-+	for (i = 0; i < table[3]; i++) {
-+		otable = ROMPTR(bios, table[table[1] + (i * table[2])]);
-+		if (otable && bios_encoder_match(dcbent, ROM32(otable[0])))
-+			break;
-+	}
-+
- 	if (!otable) {
- 		NV_DEBUG_KMS(dev, "failed to match any output table\n");
- 		return 1;
- 	}
- 
--	if (pxclk < -2 || pxclk > 0) {
-+	if (pclk < -2 || pclk > 0) {
- 		/* Try to find matching script table entry */
- 		for (i = 0; i < otable[5]; i++) {
--			if (ROM16(otable[table[4] + i*6]) == sub)
-+			if (ROM16(otable[table[4] + i*6]) == type)
- 				break;
- 		}
- 
- 		if (i == otable[5]) {
- 			NV_ERROR(dev, "Table 0x%04x not found for %d/%d, "
- 				      "using first\n",
--				 sub, dcbent->type, dcbent->or);
-+				 type, dcbent->type, dcbent->or);
- 			i = 0;
- 		}
- 	}
- 
--	if (pxclk == 0) {
-+	if (pclk == 0) {
- 		script = ROM16(otable[6]);
- 		if (!script) {
- 			NV_DEBUG_KMS(dev, "output script 0 not found\n");
-@@ -4581,9 +4570,9 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
- 		}
- 
- 		NV_DEBUG_KMS(dev, "0x%04X: parsing output script 0\n", script);
--		nouveau_bios_run_init_table(dev, script, dcbent);
-+		nouveau_bios_run_init_table(dev, script, dcbent, crtc);
- 	} else
--	if (pxclk == -1) {
-+	if (pclk == -1) {
- 		script = ROM16(otable[8]);
- 		if (!script) {
- 			NV_DEBUG_KMS(dev, "output script 1 not found\n");
-@@ -4591,9 +4580,9 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
- 		}
- 
- 		NV_DEBUG_KMS(dev, "0x%04X: parsing output script 1\n", script);
--		nouveau_bios_run_init_table(dev, script, dcbent);
-+		nouveau_bios_run_init_table(dev, script, dcbent, crtc);
- 	} else
--	if (pxclk == -2) {
-+	if (pclk == -2) {
- 		if (table[4] >= 12)
- 			script = ROM16(otable[10]);
- 		else
-@@ -4604,31 +4593,31 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
- 		}
- 
- 		NV_DEBUG_KMS(dev, "0x%04X: parsing output script 2\n", script);
--		nouveau_bios_run_init_table(dev, script, dcbent);
-+		nouveau_bios_run_init_table(dev, script, dcbent, crtc);
- 	} else
--	if (pxclk > 0) {
-+	if (pclk > 0) {
- 		script = ROM16(otable[table[4] + i*6 + 2]);
- 		if (script)
--			script = clkcmptable(bios, script, pxclk);
-+			script = clkcmptable(bios, script, pclk);
- 		if (!script) {
- 			NV_DEBUG_KMS(dev, "clock script 0 not found\n");
- 			return 1;
- 		}
- 
- 		NV_DEBUG_KMS(dev, "0x%04X: parsing clock script 0\n", script);
--		nouveau_bios_run_init_table(dev, script, dcbent);
-+		nouveau_bios_run_init_table(dev, script, dcbent, crtc);
- 	} else
--	if (pxclk < 0) {
-+	if (pclk < 0) {
- 		script = ROM16(otable[table[4] + i*6 + 4]);
- 		if (script)
--			script = clkcmptable(bios, script, -pxclk);
-+			script = clkcmptable(bios, script, -pclk);
- 		if (!script) {
- 			NV_DEBUG_KMS(dev, "clock script 1 not found\n");
- 			return 1;
- 		}
- 
- 		NV_DEBUG_KMS(dev, "0x%04X: parsing clock script 1\n", script);
--		nouveau_bios_run_init_table(dev, script, dcbent);
-+		nouveau_bios_run_init_table(dev, script, dcbent, crtc);
- 	}
- 
- 	return 0;
-@@ -5478,14 +5467,6 @@ parse_bit_U_tbl_entry(struct drm_device *dev, struct nvbios *bios,
- 	return 0;
- }
- 
--static int
--parse_bit_displayport_tbl_entry(struct drm_device *dev, struct nvbios *bios,
--				struct bit_entry *bitentry)
--{
--	bios->display.dp_table_ptr = ROM16(bios->data[bitentry->offset]);
--	return 0;
--}
--
- struct bit_table {
- 	const char id;
- 	int (* const parse_fn)(struct drm_device *, struct nvbios *, struct bit_entry *);
-@@ -5559,7 +5540,6 @@ parse_bit_structure(struct nvbios *bios, const uint16_t bitoffset)
- 	parse_bit_table(bios, bitoffset, &BIT_TABLE('L', lvds));
- 	parse_bit_table(bios, bitoffset, &BIT_TABLE('T', tmds));
- 	parse_bit_table(bios, bitoffset, &BIT_TABLE('U', U));
--	parse_bit_table(bios, bitoffset, &BIT_TABLE('d', displayport));
- 
- 	return 0;
- }
-@@ -5884,9 +5864,15 @@ parse_dcb_gpio_table(struct nvbios *bios)
- 			}
- 
- 			e->line = (e->entry & 0x0000001f) >> 0;
--			e->state_default = (e->entry & 0x01000000) >> 24;
--			e->state[0] = (e->entry & 0x18000000) >> 27;
--			e->state[1] = (e->entry & 0x60000000) >> 29;
-+			if (gpio[0] == 0x40) {
-+				e->state_default = (e->entry & 0x01000000) >> 24;
-+				e->state[0] = (e->entry & 0x18000000) >> 27;
-+				e->state[1] = (e->entry & 0x60000000) >> 29;
-+			} else {
-+				e->state_default = (e->entry & 0x00000080) >> 7;
-+				e->state[0] = (entry[4] >> 4) & 3;
-+				e->state[1] = (entry[4] >> 6) & 3;
-+			}
- 		}
- 	}
- 
-@@ -6156,7 +6142,14 @@ parse_dcb20_entry(struct drm_device *dev, struct dcb_table *dcb,
- 	}
- 	case OUTPUT_DP:
- 		entry->dpconf.sor.link = (conf & 0x00000030) >> 4;
--		entry->dpconf.link_bw = (conf & 0x00e00000) >> 21;
-+		switch ((conf & 0x00e00000) >> 21) {
-+		case 0:
-+			entry->dpconf.link_bw = 162000;
-+			break;
-+		default:
-+			entry->dpconf.link_bw = 270000;
-+			break;
-+		}
- 		switch ((conf & 0x0f000000) >> 24) {
- 		case 0xf:
- 			entry->dpconf.link_nr = 4;
-@@ -6769,7 +6762,7 @@ uint8_t *nouveau_bios_embedded_edid(struct drm_device *dev)
- 
- void
- nouveau_bios_run_init_table(struct drm_device *dev, uint16_t table,
--			    struct dcb_entry *dcbent)
-+			    struct dcb_entry *dcbent, int crtc)
- {
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
- 	struct nvbios *bios = &dev_priv->vbios;
-@@ -6777,11 +6770,22 @@ nouveau_bios_run_init_table(struct drm_device *dev, uint16_t table,
- 
- 	spin_lock_bh(&bios->lock);
- 	bios->display.output = dcbent;
-+	bios->display.crtc = crtc;
- 	parse_init_table(bios, table, &iexec);
- 	bios->display.output = NULL;
- 	spin_unlock_bh(&bios->lock);
- }
- 
-+void
-+nouveau_bios_init_exec(struct drm_device *dev, uint16_t table)
-+{
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nvbios *bios = &dev_priv->vbios;
-+	struct init_exec iexec = { true, false };
-+
-+	parse_init_table(bios, table, &iexec);
-+}
-+
- static bool NVInitVBIOS(struct drm_device *dev)
- {
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
-@@ -6863,9 +6867,8 @@ nouveau_run_vbios_init(struct drm_device *dev)
- 
- 	if (dev_priv->card_type >= NV_50) {
- 		for (i = 0; i < bios->dcb.entries; i++) {
--			nouveau_bios_run_display_table(dev,
--						       &bios->dcb.entry[i],
--						       0, 0);
-+			nouveau_bios_run_display_table(dev, 0, 0,
-+						       &bios->dcb.entry[i], -1);
- 		}
- 	}
- 
-diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.h b/drivers/gpu/drm/nouveau/nouveau_bios.h
-index 050c314..8adb69e 100644
---- a/drivers/gpu/drm/nouveau/nouveau_bios.h
-+++ b/drivers/gpu/drm/nouveau/nouveau_bios.h
-@@ -289,8 +289,8 @@ struct nvbios {
- 
- 	struct {
- 		struct dcb_entry *output;
-+		int crtc;
- 		uint16_t script_table_ptr;
--		uint16_t dp_table_ptr;
- 	} display;
- 
- 	struct {
-diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
-index 890d50e..7226f41 100644
---- a/drivers/gpu/drm/nouveau/nouveau_bo.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
-@@ -956,7 +956,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
- 			break;
- 		}
- 
--		if (dev_priv->card_type == NV_C0)
-+		if (dev_priv->card_type >= NV_C0)
- 			page_shift = node->page_shift;
- 		else
- 			page_shift = 12;
-diff --git a/drivers/gpu/drm/nouveau/nouveau_channel.c b/drivers/gpu/drm/nouveau/nouveau_channel.c
-index 0e3241c..bb6ec9e 100644
---- a/drivers/gpu/drm/nouveau/nouveau_channel.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_channel.c
-@@ -412,13 +412,17 @@ nouveau_ioctl_fifo_alloc(struct drm_device *dev, void *data,
- 		return ret;
- 	init->channel  = chan->id;
- 
--	if (chan->dma.ib_max)
--		init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_VRAM |
--					NOUVEAU_GEM_DOMAIN_GART;
--	else if (chan->pushbuf_bo->bo.mem.mem_type == TTM_PL_VRAM)
-+	if (nouveau_vram_pushbuf == 0) {
-+		if (chan->dma.ib_max)
-+			init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_VRAM |
-+						NOUVEAU_GEM_DOMAIN_GART;
-+		else if (chan->pushbuf_bo->bo.mem.mem_type == TTM_PL_VRAM)
-+			init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_VRAM;
-+		else
-+			init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_GART;
-+	} else {
- 		init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_VRAM;
--	else
--		init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_GART;
-+	}
- 
- 	if (dev_priv->card_type < NV_C0) {
- 		init->subchan[0].handle = NvM2MF;
-diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
-index 939d4df..e0d275e 100644
---- a/drivers/gpu/drm/nouveau/nouveau_connector.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
-@@ -39,7 +39,7 @@
- 
- static void nouveau_connector_hotplug(void *, int);
- 
--static struct nouveau_encoder *
-+struct nouveau_encoder *
- find_encoder(struct drm_connector *connector, int type)
- {
- 	struct drm_device *dev = connector->dev;
-@@ -116,10 +116,6 @@ nouveau_connector_destroy(struct drm_connector *connector)
- 				      nouveau_connector_hotplug, connector);
- 	}
- 
--	if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS ||
--	    connector->connector_type == DRM_MODE_CONNECTOR_eDP)
--		nouveau_backlight_exit(connector);
--
- 	kfree(nv_connector->edid);
- 	drm_sysfs_connector_remove(connector);
- 	drm_connector_cleanup(connector);
-@@ -712,11 +708,8 @@ nouveau_connector_mode_valid(struct drm_connector *connector,
- 	case OUTPUT_TV:
- 		return get_slave_funcs(encoder)->mode_valid(encoder, mode);
- 	case OUTPUT_DP:
--		if (nv_encoder->dp.link_bw == DP_LINK_BW_2_7)
--			max_clock = nv_encoder->dp.link_nr * 270000;
--		else
--			max_clock = nv_encoder->dp.link_nr * 162000;
--
-+		max_clock  = nv_encoder->dp.link_nr;
-+		max_clock *= nv_encoder->dp.link_bw;
- 		clock = clock * nouveau_connector_bpp(connector) / 8;
- 		break;
- 	default:
-@@ -871,7 +864,6 @@ nouveau_connector_create(struct drm_device *dev, int index)
- 					dev->mode_config.scaling_mode_property,
- 					nv_connector->scaling_mode);
- 		}
--		connector->polled = DRM_CONNECTOR_POLL_CONNECT;
- 		/* fall-through */
- 	case DCB_CONNECTOR_TV_0:
- 	case DCB_CONNECTOR_TV_1:
-@@ -888,27 +880,20 @@ nouveau_connector_create(struct drm_device *dev, int index)
- 				dev->mode_config.dithering_mode_property,
- 				nv_connector->use_dithering ?
- 				DRM_MODE_DITHERING_ON : DRM_MODE_DITHERING_OFF);
--
--		if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS) {
--			if (dev_priv->card_type >= NV_50)
--				connector->polled = DRM_CONNECTOR_POLL_HPD;
--			else
--				connector->polled = DRM_CONNECTOR_POLL_CONNECT;
--		}
- 		break;
- 	}
- 
--	if (pgpio->irq_register) {
-+	if (nv_connector->dcb->gpio_tag != 0xff && pgpio->irq_register) {
- 		pgpio->irq_register(dev, nv_connector->dcb->gpio_tag,
- 				    nouveau_connector_hotplug, connector);
-+
-+		connector->polled = DRM_CONNECTOR_POLL_HPD;
-+	} else {
-+		connector->polled = DRM_CONNECTOR_POLL_CONNECT;
- 	}
- 
- 	drm_sysfs_connector_add(connector);
- 
--	if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS ||
--	    connector->connector_type == DRM_MODE_CONNECTOR_eDP)
--		nouveau_backlight_init(connector);
--
- 	dcb->drm = connector;
- 	return dcb->drm;
- 
-@@ -925,22 +910,13 @@ nouveau_connector_hotplug(void *data, int plugged)
- 	struct drm_connector *connector = data;
- 	struct drm_device *dev = connector->dev;
- 
--	NV_INFO(dev, "%splugged %s\n", plugged ? "" : "un",
--		drm_get_connector_name(connector));
--
--	if (connector->encoder && connector->encoder->crtc &&
--	    connector->encoder->crtc->enabled) {
--		struct nouveau_encoder *nv_encoder = nouveau_encoder(connector->encoder);
--		struct drm_encoder_helper_funcs *helper =
--			connector->encoder->helper_private;
-+	NV_DEBUG(dev, "%splugged %s\n", plugged ? "" : "un",
-+		 drm_get_connector_name(connector));
- 
--		if (nv_encoder->dcb->type == OUTPUT_DP) {
--			if (plugged)
--				helper->dpms(connector->encoder, DRM_MODE_DPMS_ON);
--			else
--				helper->dpms(connector->encoder, DRM_MODE_DPMS_OFF);
--		}
--	}
-+	if (plugged)
-+		drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
-+	else
-+		drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
- 
- 	drm_helper_hpd_irq_event(dev);
- }
-diff --git a/drivers/gpu/drm/nouveau/nouveau_crtc.h b/drivers/gpu/drm/nouveau/nouveau_crtc.h
-index cb1ce2a..bf8e128 100644
---- a/drivers/gpu/drm/nouveau/nouveau_crtc.h
-+++ b/drivers/gpu/drm/nouveau/nouveau_crtc.h
-@@ -82,14 +82,13 @@ static inline struct drm_crtc *to_drm_crtc(struct nouveau_crtc *crtc)
- }
- 
- int nv50_crtc_create(struct drm_device *dev, int index);
--int nv50_cursor_init(struct nouveau_crtc *);
--void nv50_cursor_fini(struct nouveau_crtc *);
- int nv50_crtc_cursor_set(struct drm_crtc *drm_crtc, struct drm_file *file_priv,
- 			 uint32_t buffer_handle, uint32_t width,
- 			 uint32_t height);
- int nv50_crtc_cursor_move(struct drm_crtc *drm_crtc, int x, int y);
- 
- int nv04_cursor_init(struct nouveau_crtc *);
-+int nv50_cursor_init(struct nouveau_crtc *);
- 
- struct nouveau_connector *
- nouveau_crtc_connector_get(struct nouveau_crtc *crtc);
-diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
-index eb514ea..ddbabef 100644
---- a/drivers/gpu/drm/nouveau/nouveau_display.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
-@@ -105,9 +105,12 @@ nouveau_framebuffer_init(struct drm_device *dev,
- 		if (dev_priv->chipset == 0x50)
- 			nv_fb->r_format |= (tile_flags << 8);
- 
--		if (!tile_flags)
--			nv_fb->r_pitch = 0x00100000 | fb->pitch;
--		else {
-+		if (!tile_flags) {
-+			if (dev_priv->card_type < NV_D0)
-+				nv_fb->r_pitch = 0x00100000 | fb->pitch;
-+			else
-+				nv_fb->r_pitch = 0x01000000 | fb->pitch;
-+		} else {
- 			u32 mode = nvbo->tile_mode;
- 			if (dev_priv->card_type >= NV_C0)
- 				mode >>= 4;
-diff --git a/drivers/gpu/drm/nouveau/nouveau_dp.c b/drivers/gpu/drm/nouveau/nouveau_dp.c
-index 7beb82a..de5efe7 100644
---- a/drivers/gpu/drm/nouveau/nouveau_dp.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_dp.c
-@@ -28,557 +28,669 @@
- #include "nouveau_i2c.h"
- #include "nouveau_connector.h"
- #include "nouveau_encoder.h"
-+#include "nouveau_crtc.h"
- 
--static int
--auxch_rd(struct drm_encoder *encoder, int address, uint8_t *buf, int size)
--{
--	struct drm_device *dev = encoder->dev;
--	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
--	struct nouveau_i2c_chan *auxch;
--	int ret;
-+/******************************************************************************
-+ * aux channel util functions
-+ *****************************************************************************/
-+#define AUX_DBG(fmt, args...) do {                                             \
-+	if (nouveau_reg_debug & NOUVEAU_REG_DEBUG_AUXCH) {                     \
-+		NV_PRINTK(KERN_DEBUG, dev, "AUXCH(%d): " fmt, ch, ##args);     \
-+	}                                                                      \
-+} while (0)
-+#define AUX_ERR(fmt, args...) NV_ERROR(dev, "AUXCH(%d): " fmt, ch, ##args)
- 
--	auxch = nouveau_i2c_find(dev, nv_encoder->dcb->i2c_index);
--	if (!auxch)
--		return -ENODEV;
--
--	ret = nouveau_dp_auxch(auxch, 9, address, buf, size);
--	if (ret)
--		return ret;
--
--	return 0;
-+static void
-+auxch_fini(struct drm_device *dev, int ch)
-+{
-+	nv_mask(dev, 0x00e4e4 + (ch * 0x50), 0x00310000, 0x00000000);
- }
- 
- static int
--auxch_wr(struct drm_encoder *encoder, int address, uint8_t *buf, int size)
-+auxch_init(struct drm_device *dev, int ch)
- {
--	struct drm_device *dev = encoder->dev;
--	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
--	struct nouveau_i2c_chan *auxch;
--	int ret;
-+	const u32 unksel = 1; /* nfi which to use, or if it matters.. */
-+	const u32 ureq = unksel ? 0x00100000 : 0x00200000;
-+	const u32 urep = unksel ? 0x01000000 : 0x02000000;
-+	u32 ctrl, timeout;
- 
--	auxch = nouveau_i2c_find(dev, nv_encoder->dcb->i2c_index);
--	if (!auxch)
--		return -ENODEV;
-+	/* wait up to 1ms for any previous transaction to be done... */
-+	timeout = 1000;
-+	do {
-+		ctrl = nv_rd32(dev, 0x00e4e4 + (ch * 0x50));
-+		udelay(1);
-+		if (!timeout--) {
-+			AUX_ERR("begin idle timeout 0x%08x", ctrl);
-+			return -EBUSY;
-+		}
-+	} while (ctrl & 0x03010000);
- 
--	ret = nouveau_dp_auxch(auxch, 8, address, buf, size);
--	return ret;
-+	/* set some magic, and wait up to 1ms for it to appear */
-+	nv_mask(dev, 0x00e4e4 + (ch * 0x50), 0x00300000, ureq);
-+	timeout = 1000;
-+	do {
-+		ctrl = nv_rd32(dev, 0x00e4e4 + (ch * 0x50));
-+		udelay(1);
-+		if (!timeout--) {
-+			AUX_ERR("magic wait 0x%08x\n", ctrl);
-+			auxch_fini(dev, ch);
-+			return -EBUSY;
-+		}
-+	} while ((ctrl & 0x03000000) != urep);
-+
-+	return 0;
- }
- 
- static int
--nouveau_dp_lane_count_set(struct drm_encoder *encoder, uint8_t cmd)
-+auxch_tx(struct drm_device *dev, int ch, u8 type, u32 addr, u8 *data, u8 size)
- {
--	struct drm_device *dev = encoder->dev;
--	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
--	uint32_t tmp;
--	int or = nv_encoder->or, link = !(nv_encoder->dcb->sorconf.link & 1);
-+	u32 ctrl, stat, timeout, retries;
-+	u32 xbuf[4] = {};
-+	int ret, i;
- 
--	tmp  = nv_rd32(dev, NV50_SOR_DP_CTRL(or, link));
--	tmp &= ~(NV50_SOR_DP_CTRL_ENHANCED_FRAME_ENABLED |
--		 NV50_SOR_DP_CTRL_LANE_MASK);
--	tmp |= ((1 << (cmd & DP_LANE_COUNT_MASK)) - 1) << 16;
--	if (cmd & DP_LANE_COUNT_ENHANCED_FRAME_EN)
--		tmp |= NV50_SOR_DP_CTRL_ENHANCED_FRAME_ENABLED;
--	nv_wr32(dev, NV50_SOR_DP_CTRL(or, link), tmp);
-+	AUX_DBG("%d: 0x%08x %d\n", type, addr, size);
- 
--	return auxch_wr(encoder, DP_LANE_COUNT_SET, &cmd, 1);
--}
-+	ret = auxch_init(dev, ch);
-+	if (ret)
-+		goto out;
- 
--static int
--nouveau_dp_link_bw_set(struct drm_encoder *encoder, uint8_t cmd)
--{
--	struct drm_device *dev = encoder->dev;
--	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
--	uint32_t tmp;
--	int reg = 0x614300 + (nv_encoder->or * 0x800);
-+	stat = nv_rd32(dev, 0x00e4e8 + (ch * 0x50));
-+	if (!(stat & 0x10000000)) {
-+		AUX_DBG("sink not detected\n");
-+		ret = -ENXIO;
-+		goto out;
-+	}
- 
--	tmp  = nv_rd32(dev, reg);
--	tmp &= 0xfff3ffff;
--	if (cmd == DP_LINK_BW_2_7)
--		tmp |= 0x00040000;
--	nv_wr32(dev, reg, tmp);
-+	if (!(type & 1)) {
-+		memcpy(xbuf, data, size);
-+		for (i = 0; i < 16; i += 4) {
-+			AUX_DBG("wr 0x%08x\n", xbuf[i / 4]);
-+			nv_wr32(dev, 0x00e4c0 + (ch * 0x50) + i, xbuf[i / 4]);
-+		}
-+	}
- 
--	return auxch_wr(encoder, DP_LINK_BW_SET, &cmd, 1);
--}
-+	ctrl  = nv_rd32(dev, 0x00e4e4 + (ch * 0x50));
-+	ctrl &= ~0x0001f0ff;
-+	ctrl |= type << 12;
-+	ctrl |= size - 1;
-+	nv_wr32(dev, 0x00e4e0 + (ch * 0x50), addr);
- 
--static int
--nouveau_dp_link_train_set(struct drm_encoder *encoder, int pattern)
--{
--	struct drm_device *dev = encoder->dev;
--	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
--	uint32_t tmp;
--	uint8_t cmd;
--	int or = nv_encoder->or, link = !(nv_encoder->dcb->sorconf.link & 1);
--	int ret;
-+	/* retry transaction a number of times on failure... */
-+	ret = -EREMOTEIO;
-+	for (retries = 0; retries < 32; retries++) {
-+		/* reset, and delay a while if this is a retry */
-+		nv_wr32(dev, 0x00e4e4 + (ch * 0x50), 0x80000000 | ctrl);
-+		nv_wr32(dev, 0x00e4e4 + (ch * 0x50), 0x00000000 | ctrl);
-+		if (retries)
-+			udelay(400);
- 
--	tmp  = nv_rd32(dev, NV50_SOR_DP_CTRL(or, link));
--	tmp &= ~NV50_SOR_DP_CTRL_TRAINING_PATTERN;
--	tmp |= (pattern << 24);
--	nv_wr32(dev, NV50_SOR_DP_CTRL(or, link), tmp);
-+		/* transaction request, wait up to 1ms for it to complete */
-+		nv_wr32(dev, 0x00e4e4 + (ch * 0x50), 0x00010000 | ctrl);
- 
--	ret = auxch_rd(encoder, DP_TRAINING_PATTERN_SET, &cmd, 1);
--	if (ret)
--		return ret;
--	cmd &= ~DP_TRAINING_PATTERN_MASK;
--	cmd |= (pattern & DP_TRAINING_PATTERN_MASK);
--	return auxch_wr(encoder, DP_TRAINING_PATTERN_SET, &cmd, 1);
--}
-+		timeout = 1000;
-+		do {
-+			ctrl = nv_rd32(dev, 0x00e4e4 + (ch * 0x50));
-+			udelay(1);
-+			if (!timeout--) {
-+				AUX_ERR("tx req timeout 0x%08x\n", ctrl);
-+				goto out;
-+			}
-+		} while (ctrl & 0x00010000);
- 
--static int
--nouveau_dp_max_voltage_swing(struct drm_encoder *encoder)
--{
--	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
--	struct drm_device *dev = encoder->dev;
--	struct bit_displayport_encoder_table_entry *dpse;
--	struct bit_displayport_encoder_table *dpe;
--	int i, dpe_headerlen, max_vs = 0;
-+		/* read status, and check if transaction completed ok */
-+		stat = nv_mask(dev, 0x00e4e8 + (ch * 0x50), 0, 0);
-+		if (!(stat & 0x000f0f00)) {
-+			ret = 0;
-+			break;
-+		}
- 
--	dpe = nouveau_bios_dp_table(dev, nv_encoder->dcb, &dpe_headerlen);
--	if (!dpe)
--		return false;
--	dpse = (void *)((char *)dpe + dpe_headerlen);
-+		AUX_DBG("%02d 0x%08x 0x%08x\n", retries, ctrl, stat);
-+	}
- 
--	for (i = 0; i < dpe_headerlen; i++, dpse++) {
--		if (dpse->vs_level > max_vs)
--			max_vs = dpse->vs_level;
-+	if (type & 1) {
-+		for (i = 0; i < 16; i += 4) {
-+			xbuf[i / 4] = nv_rd32(dev, 0x00e4d0 + (ch * 0x50) + i);
-+			AUX_DBG("rd 0x%08x\n", xbuf[i / 4]);
-+		}
-+		memcpy(data, xbuf, size);
- 	}
- 
--	return max_vs;
-+out:
-+	auxch_fini(dev, ch);
-+	return ret;
- }
- 
--static int
--nouveau_dp_max_pre_emphasis(struct drm_encoder *encoder, int vs)
-+static u32
-+dp_link_bw_get(struct drm_device *dev, int or, int link)
- {
--	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
--	struct drm_device *dev = encoder->dev;
--	struct bit_displayport_encoder_table_entry *dpse;
--	struct bit_displayport_encoder_table *dpe;
--	int i, dpe_headerlen, max_pre = 0;
--
--	dpe = nouveau_bios_dp_table(dev, nv_encoder->dcb, &dpe_headerlen);
--	if (!dpe)
--		return false;
--	dpse = (void *)((char *)dpe + dpe_headerlen);
--
--	for (i = 0; i < dpe_headerlen; i++, dpse++) {
--		if (dpse->vs_level != vs)
--			continue;
-+	u32 ctrl = nv_rd32(dev, 0x614300 + (or * 0x800));
-+	if (!(ctrl & 0x000c0000))
-+		return 162000;
-+	return 270000;
-+}
- 
--		if (dpse->pre_level > max_pre)
--			max_pre = dpse->pre_level;
-+static int
-+dp_lane_count_get(struct drm_device *dev, int or, int link)
-+{
-+	u32 ctrl = nv_rd32(dev, NV50_SOR_DP_CTRL(or, link));
-+	switch (ctrl & 0x000f0000) {
-+	case 0x00010000: return 1;
-+	case 0x00030000: return 2;
-+	default:
-+		return 4;
- 	}
--
--	return max_pre;
- }
- 
--static bool
--nouveau_dp_link_train_adjust(struct drm_encoder *encoder, uint8_t *config)
-+void
-+nouveau_dp_tu_update(struct drm_device *dev, int or, int link, u32 clk, u32 bpp)
- {
--	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
--	struct drm_device *dev = encoder->dev;
--	struct bit_displayport_encoder_table *dpe;
--	int ret, i, dpe_headerlen, vs = 0, pre = 0;
--	uint8_t request[2];
-+	const u32 symbol = 100000;
-+	int bestTU = 0, bestVTUi = 0, bestVTUf = 0, bestVTUa = 0;
-+	int TU, VTUi, VTUf, VTUa;
-+	u64 link_data_rate, link_ratio, unk;
-+	u32 best_diff = 64 * symbol;
-+	u32 link_nr, link_bw, r;
- 
--	dpe = nouveau_bios_dp_table(dev, nv_encoder->dcb, &dpe_headerlen);
--	if (!dpe)
--		return false;
-+	/* calculate packed data rate for each lane */
-+	link_nr = dp_lane_count_get(dev, or, link);
-+	link_data_rate = (clk * bpp / 8) / link_nr;
- 
--	ret = auxch_rd(encoder, DP_ADJUST_REQUEST_LANE0_1, request, 2);
--	if (ret)
--		return false;
-+	/* calculate ratio of packed data rate to link symbol rate */
-+	link_bw = dp_link_bw_get(dev, or, link);
-+	link_ratio = link_data_rate * symbol;
-+	r = do_div(link_ratio, link_bw);
- 
--	NV_DEBUG_KMS(dev, "\t\tadjust 0x%02x 0x%02x\n", request[0], request[1]);
-+	for (TU = 64; TU >= 32; TU--) {
-+		/* calculate average number of valid symbols in each TU */
-+		u32 tu_valid = link_ratio * TU;
-+		u32 calc, diff;
- 
--	/* Keep all lanes at the same level.. */
--	for (i = 0; i < nv_encoder->dp.link_nr; i++) {
--		int lane_req = (request[i >> 1] >> ((i & 1) << 2)) & 0xf;
--		int lane_vs = lane_req & 3;
--		int lane_pre = (lane_req >> 2) & 3;
-+		/* find a hw representation for the fraction.. */
-+		VTUi = tu_valid / symbol;
-+		calc = VTUi * symbol;
-+		diff = tu_valid - calc;
-+		if (diff) {
-+			if (diff >= (symbol / 2)) {
-+				VTUf = symbol / (symbol - diff);
-+				if (symbol - (VTUf * diff))
-+					VTUf++;
- 
--		if (lane_vs > vs)
--			vs = lane_vs;
--		if (lane_pre > pre)
--			pre = lane_pre;
--	}
-+				if (VTUf <= 15) {
-+					VTUa  = 1;
-+					calc += symbol - (symbol / VTUf);
-+				} else {
-+					VTUa  = 0;
-+					VTUf  = 1;
-+					calc += symbol;
-+				}
-+			} else {
-+				VTUa  = 0;
-+				VTUf  = min((int)(symbol / diff), 15);
-+				calc += symbol / VTUf;
-+			}
- 
--	if (vs >= nouveau_dp_max_voltage_swing(encoder)) {
--		vs  = nouveau_dp_max_voltage_swing(encoder);
--		vs |= 4;
-+			diff = calc - tu_valid;
-+		} else {
-+			/* no remainder, but the hw doesn't like the fractional
-+			 * part to be zero.  decrement the integer part and
-+			 * have the fraction add a whole symbol back
-+			 */
-+			VTUa = 0;
-+			VTUf = 1;
-+			VTUi--;
-+		}
-+
-+		if (diff < best_diff) {
-+			best_diff = diff;
-+			bestTU = TU;
-+			bestVTUa = VTUa;
-+			bestVTUf = VTUf;
-+			bestVTUi = VTUi;
-+			if (diff == 0)
-+				break;
-+		}
- 	}
- 
--	if (pre >= nouveau_dp_max_pre_emphasis(encoder, vs & 3)) {
--		pre  = nouveau_dp_max_pre_emphasis(encoder, vs & 3);
--		pre |= 4;
-+	if (!bestTU) {
-+		NV_ERROR(dev, "DP: unable to find suitable config\n");
-+		return;
- 	}
- 
--	/* Update the configuration for all lanes.. */
--	for (i = 0; i < nv_encoder->dp.link_nr; i++)
--		config[i] = (pre << 3) | vs;
-+	/* XXX close to vbios numbers, but not right */
-+	unk  = (symbol - link_ratio) * bestTU;
-+	unk *= link_ratio;
-+	r = do_div(unk, symbol);
-+	r = do_div(unk, symbol);
-+	unk += 6;
- 
--	return true;
-+	nv_mask(dev, NV50_SOR_DP_CTRL(or, link), 0x000001fc, bestTU << 2);
-+	nv_mask(dev, NV50_SOR_DP_SCFG(or, link), 0x010f7f3f, bestVTUa << 24 |
-+							     bestVTUf << 16 |
-+							     bestVTUi << 8 |
-+							     unk);
- }
- 
--static bool
--nouveau_dp_link_train_commit(struct drm_encoder *encoder, uint8_t *config)
-+u8 *
-+nouveau_dp_bios_data(struct drm_device *dev, struct dcb_entry *dcb, u8 **entry)
- {
--	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
--	struct drm_device *dev = encoder->dev;
--	struct bit_displayport_encoder_table_entry *dpse;
--	struct bit_displayport_encoder_table *dpe;
--	int or = nv_encoder->or, link = !(nv_encoder->dcb->sorconf.link & 1);
--	int dpe_headerlen, ret, i;
--
--	NV_DEBUG_KMS(dev, "\t\tconfig 0x%02x 0x%02x 0x%02x 0x%02x\n",
--		 config[0], config[1], config[2], config[3]);
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nvbios *bios = &dev_priv->vbios;
-+	struct bit_entry d;
-+	u8 *table;
-+	int i;
- 
--	dpe = nouveau_bios_dp_table(dev, nv_encoder->dcb, &dpe_headerlen);
--	if (!dpe)
--		return false;
--	dpse = (void *)((char *)dpe + dpe_headerlen);
-+	if (bit_table(dev, 'd', &d)) {
-+		NV_ERROR(dev, "BIT 'd' table not found\n");
-+		return NULL;
-+	}
- 
--	for (i = 0; i < dpe->record_nr; i++, dpse++) {
--		if (dpse->vs_level == (config[0] & 3) &&
--		    dpse->pre_level == ((config[0] >> 3) & 3))
--			break;
-+	if (d.version != 1) {
-+		NV_ERROR(dev, "BIT 'd' table version %d unknown\n", d.version);
-+		return NULL;
- 	}
--	BUG_ON(i == dpe->record_nr);
- 
--	for (i = 0; i < nv_encoder->dp.link_nr; i++) {
--		const int shift[4] = { 16, 8, 0, 24 };
--		uint32_t mask = 0xff << shift[i];
--		uint32_t reg0, reg1, reg2;
-+	table = ROMPTR(bios, d.data[0]);
-+	if (!table) {
-+		NV_ERROR(dev, "displayport table pointer invalid\n");
-+		return NULL;
-+	}
- 
--		reg0  = nv_rd32(dev, NV50_SOR_DP_UNK118(or, link)) & ~mask;
--		reg0 |= (dpse->reg0 << shift[i]);
--		reg1  = nv_rd32(dev, NV50_SOR_DP_UNK120(or, link)) & ~mask;
--		reg1 |= (dpse->reg1 << shift[i]);
--		reg2  = nv_rd32(dev, NV50_SOR_DP_UNK130(or, link)) & 0xffff00ff;
--		reg2 |= (dpse->reg2 << 8);
--		nv_wr32(dev, NV50_SOR_DP_UNK118(or, link), reg0);
--		nv_wr32(dev, NV50_SOR_DP_UNK120(or, link), reg1);
--		nv_wr32(dev, NV50_SOR_DP_UNK130(or, link), reg2);
-+	switch (table[0]) {
-+	case 0x20:
-+	case 0x21:
-+	case 0x30:
-+		break;
-+	default:
-+		NV_ERROR(dev, "displayport table 0x%02x unknown\n", table[0]);
-+		return NULL;
- 	}
- 
--	ret = auxch_wr(encoder, DP_TRAINING_LANE0_SET, config, 4);
--	if (ret)
--		return false;
-+	for (i = 0; i < table[3]; i++) {
-+		*entry = ROMPTR(bios, table[table[1] + (i * table[2])]);
-+		if (*entry && bios_encoder_match(dcb, ROM32((*entry)[0])))
-+			return table;
-+	}
- 
--	return true;
-+	NV_ERROR(dev, "displayport encoder table not found\n");
-+	return NULL;
- }
- 
--bool
--nouveau_dp_link_train(struct drm_encoder *encoder)
-+/******************************************************************************
-+ * link training
-+ *****************************************************************************/
-+struct dp_state {
-+	struct dcb_entry *dcb;
-+	u8 *table;
-+	u8 *entry;
-+	int auxch;
-+	int crtc;
-+	int or;
-+	int link;
-+	u8 *dpcd;
-+	int link_nr;
-+	u32 link_bw;
-+	u8  stat[6];
-+	u8  conf[4];
-+};
-+
-+static void
-+dp_set_link_config(struct drm_device *dev, struct dp_state *dp)
- {
--	struct drm_device *dev = encoder->dev;
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
--	struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
--	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
--	struct nouveau_connector *nv_connector;
--	struct bit_displayport_encoder_table *dpe;
--	int dpe_headerlen;
--	uint8_t config[4], status[3];
--	bool cr_done, cr_max_vs, eq_done, hpd_state;
--	int ret = 0, i, tries, voltage;
-+	int or = dp->or, link = dp->link;
-+	u8 *entry, sink[2];
-+	u32 dp_ctrl;
-+	u16 script;
- 
--	NV_DEBUG_KMS(dev, "link training!!\n");
-+	NV_DEBUG_KMS(dev, "%d lanes at %d KB/s\n", dp->link_nr, dp->link_bw);
- 
--	nv_connector = nouveau_encoder_connector_get(nv_encoder);
--	if (!nv_connector)
--		return false;
--
--	dpe = nouveau_bios_dp_table(dev, nv_encoder->dcb, &dpe_headerlen);
--	if (!dpe) {
--		NV_ERROR(dev, "SOR-%d: no DP encoder table!\n", nv_encoder->or);
--		return false;
-+	/* set selected link rate on source */
-+	switch (dp->link_bw) {
-+	case 270000:
-+		nv_mask(dev, 0x614300 + (or * 0x800), 0x000c0000, 0x00040000);
-+		sink[0] = DP_LINK_BW_2_7;
-+		break;
-+	default:
-+		nv_mask(dev, 0x614300 + (or * 0x800), 0x000c0000, 0x00000000);
-+		sink[0] = DP_LINK_BW_1_62;
-+		break;
- 	}
- 
--	/* disable hotplug detect, this flips around on some panels during
--	 * link training.
-+	/* offset +0x0a of each dp encoder table entry is a pointer to another
-+	 * table, that has (among other things) pointers to more scripts that
-+	 * need to be executed, this time depending on link speed.
- 	 */
--	hpd_state = pgpio->irq_enable(dev, nv_connector->dcb->gpio_tag, false);
-+	entry = ROMPTR(&dev_priv->vbios, dp->entry[10]);
-+	if (entry) {
-+		if (dp->table[0] < 0x30) {
-+			while (dp->link_bw < (ROM16(entry[0]) * 10))
-+				entry += 4;
-+			script = ROM16(entry[2]);
-+		} else {
-+			while (dp->link_bw < (entry[0] * 27000))
-+				entry += 3;
-+			script = ROM16(entry[1]);
-+		}
- 
--	if (dpe->script0) {
--		NV_DEBUG_KMS(dev, "SOR-%d: running DP script 0\n", nv_encoder->or);
--		nouveau_bios_run_init_table(dev, le16_to_cpu(dpe->script0),
--					    nv_encoder->dcb);
-+		nouveau_bios_run_init_table(dev, script, dp->dcb, dp->crtc);
- 	}
- 
--train:
--	cr_done = eq_done = false;
-+	/* configure lane count on the source */
-+	dp_ctrl = ((1 << dp->link_nr) - 1) << 16;
-+	sink[1] = dp->link_nr;
-+	if (dp->dpcd[2] & DP_ENHANCED_FRAME_CAP) {
-+		dp_ctrl |= 0x00004000;
-+		sink[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
-+	}
- 
--	/* set link configuration */
--	NV_DEBUG_KMS(dev, "\tbegin train: bw %d, lanes %d\n",
--		 nv_encoder->dp.link_bw, nv_encoder->dp.link_nr);
-+	nv_mask(dev, NV50_SOR_DP_CTRL(or, link), 0x001f4000, dp_ctrl);
- 
--	ret = nouveau_dp_link_bw_set(encoder, nv_encoder->dp.link_bw);
--	if (ret)
--		return false;
-+	/* inform the sink of the new configuration */
-+	auxch_tx(dev, dp->auxch, 8, DP_LINK_BW_SET, sink, 2);
-+}
- 
--	config[0] = nv_encoder->dp.link_nr;
--	if (nv_encoder->dp.dpcd_version >= 0x11 &&
--	    nv_encoder->dp.enhanced_frame)
--		config[0] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
-+static void
-+dp_set_training_pattern(struct drm_device *dev, struct dp_state *dp, u8 tp)
-+{
-+	u8 sink_tp;
- 
--	ret = nouveau_dp_lane_count_set(encoder, config[0]);
--	if (ret)
--		return false;
-+	NV_DEBUG_KMS(dev, "training pattern %d\n", tp);
- 
--	/* clock recovery */
--	NV_DEBUG_KMS(dev, "\tbegin cr\n");
--	ret = nouveau_dp_link_train_set(encoder, DP_TRAINING_PATTERN_1);
--	if (ret)
--		goto stop;
-+	nv_mask(dev, NV50_SOR_DP_CTRL(dp->or, dp->link), 0x0f000000, tp << 24);
- 
--	tries = 0;
--	voltage = -1;
--	memset(config, 0x00, sizeof(config));
--	for (;;) {
--		if (!nouveau_dp_link_train_commit(encoder, config))
--			break;
-+	auxch_tx(dev, dp->auxch, 9, DP_TRAINING_PATTERN_SET, &sink_tp, 1);
-+	sink_tp &= ~DP_TRAINING_PATTERN_MASK;
-+	sink_tp |= tp;
-+	auxch_tx(dev, dp->auxch, 8, DP_TRAINING_PATTERN_SET, &sink_tp, 1);
-+}
- 
--		udelay(100);
-+static const u8 nv50_lane_map[] = { 16, 8, 0, 24 };
-+static const u8 nvaf_lane_map[] = { 24, 16, 8, 0 };
- 
--		ret = auxch_rd(encoder, DP_LANE0_1_STATUS, status, 2);
--		if (ret)
--			break;
--		NV_DEBUG_KMS(dev, "\t\tstatus: 0x%02x 0x%02x\n",
--			 status[0], status[1]);
-+static int
-+dp_link_train_commit(struct drm_device *dev, struct dp_state *dp)
-+{
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	u32 mask = 0, drv = 0, pre = 0, unk = 0;
-+	const u8 *shifts;
-+	int link = dp->link;
-+	int or = dp->or;
-+	int i;
- 
--		cr_done = true;
--		cr_max_vs = false;
--		for (i = 0; i < nv_encoder->dp.link_nr; i++) {
--			int lane = (status[i >> 1] >> ((i & 1) * 4)) & 0xf;
-+	if (dev_priv->chipset != 0xaf)
-+		shifts = nv50_lane_map;
-+	else
-+		shifts = nvaf_lane_map;
- 
--			if (!(lane & DP_LANE_CR_DONE)) {
--				cr_done = false;
--				if (config[i] & DP_TRAIN_MAX_PRE_EMPHASIS_REACHED)
--					cr_max_vs = true;
--				break;
-+	for (i = 0; i < dp->link_nr; i++) {
-+		u8 *conf = dp->entry + dp->table[4];
-+		u8 lane = (dp->stat[4 + (i >> 1)] >> ((i & 1) * 4)) & 0xf;
-+		u8 lpre = (lane & 0x0c) >> 2;
-+		u8 lvsw = (lane & 0x03) >> 0;
-+
-+		mask |= 0xff << shifts[i];
-+		unk |= 1 << (shifts[i] >> 3);
-+
-+		dp->conf[i] = (lpre << 3) | lvsw;
-+		if (lvsw == DP_TRAIN_VOLTAGE_SWING_1200)
-+			dp->conf[i] |= DP_TRAIN_MAX_SWING_REACHED;
-+		if (lpre == DP_TRAIN_PRE_EMPHASIS_9_5)
-+			dp->conf[i] |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
-+
-+		NV_DEBUG_KMS(dev, "config lane %d %02x\n", i, dp->conf[i]);
-+
-+		if (dp->table[0] < 0x30) {
-+			u8 *last = conf + (dp->entry[4] * dp->table[5]);
-+			while (lvsw != conf[0] || lpre != conf[1]) {
-+				conf += dp->table[5];
-+				if (conf >= last)
-+					return -EINVAL;
- 			}
--		}
- 
--		if ((config[0] & DP_TRAIN_VOLTAGE_SWING_MASK) != voltage) {
--			voltage = config[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
--			tries = 0;
--		}
-+			conf += 2;
-+		} else {
-+			/* no lookup table anymore, set entries for each
-+			 * combination of voltage swing and pre-emphasis
-+			 * level allowed by the DP spec.
-+			 */
-+			switch (lvsw) {
-+			case 0: lpre += 0; break;
-+			case 1: lpre += 4; break;
-+			case 2: lpre += 7; break;
-+			case 3: lpre += 9; break;
-+			}
- 
--		if (cr_done || cr_max_vs || (++tries == 5))
--			break;
-+			conf = conf + (lpre * dp->table[5]);
-+			conf++;
-+		}
- 
--		if (!nouveau_dp_link_train_adjust(encoder, config))
--			break;
-+		drv |= conf[0] << shifts[i];
-+		pre |= conf[1] << shifts[i];
-+		unk  = (unk & ~0x0000ff00) | (conf[2] << 8);
- 	}
- 
--	if (!cr_done)
--		goto stop;
-+	nv_mask(dev, NV50_SOR_DP_UNK118(or, link), mask, drv);
-+	nv_mask(dev, NV50_SOR_DP_UNK120(or, link), mask, pre);
-+	nv_mask(dev, NV50_SOR_DP_UNK130(or, link), 0x0000ff0f, unk);
-+
-+	return auxch_tx(dev, dp->auxch, 8, DP_TRAINING_LANE0_SET, dp->conf, 4);
-+}
-+
-+static int
-+dp_link_train_update(struct drm_device *dev, struct dp_state *dp, u32 delay)
-+{
-+	int ret;
-+
-+	udelay(delay);
- 
--	/* channel equalisation */
--	NV_DEBUG_KMS(dev, "\tbegin eq\n");
--	ret = nouveau_dp_link_train_set(encoder, DP_TRAINING_PATTERN_2);
-+	ret = auxch_tx(dev, dp->auxch, 9, DP_LANE0_1_STATUS, dp->stat, 6);
- 	if (ret)
--		goto stop;
-+		return ret;
- 
--	for (tries = 0; tries <= 5; tries++) {
--		udelay(400);
-+	NV_DEBUG_KMS(dev, "status %02x %02x %02x %02x %02x %02x\n",
-+		     dp->stat[0], dp->stat[1], dp->stat[2], dp->stat[3],
-+		     dp->stat[4], dp->stat[5]);
-+	return 0;
-+}
- 
--		ret = auxch_rd(encoder, DP_LANE0_1_STATUS, status, 3);
--		if (ret)
--			break;
--		NV_DEBUG_KMS(dev, "\t\tstatus: 0x%02x 0x%02x\n",
--			 status[0], status[1]);
-+static int
-+dp_link_train_cr(struct drm_device *dev, struct dp_state *dp)
-+{
-+	bool cr_done = false, abort = false;
-+	int voltage = dp->conf[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
-+	int tries = 0, i;
- 
--		eq_done = true;
--		if (!(status[2] & DP_INTERLANE_ALIGN_DONE))
--			eq_done = false;
-+	dp_set_training_pattern(dev, dp, DP_TRAINING_PATTERN_1);
- 
--		for (i = 0; eq_done && i < nv_encoder->dp.link_nr; i++) {
--			int lane = (status[i >> 1] >> ((i & 1) * 4)) & 0xf;
-+	do {
-+		if (dp_link_train_commit(dev, dp) ||
-+		    dp_link_train_update(dev, dp, 100))
-+			break;
- 
-+		cr_done = true;
-+		for (i = 0; i < dp->link_nr; i++) {
-+			u8 lane = (dp->stat[i >> 1] >> ((i & 1) * 4)) & 0xf;
- 			if (!(lane & DP_LANE_CR_DONE)) {
- 				cr_done = false;
-+				if (dp->conf[i] & DP_TRAIN_MAX_SWING_REACHED)
-+					abort = true;
- 				break;
- 			}
-+		}
- 
--			if (!(lane & DP_LANE_CHANNEL_EQ_DONE) ||
--			    !(lane & DP_LANE_SYMBOL_LOCKED)) {
--				eq_done = false;
--				break;
--			}
-+		if ((dp->conf[0] & DP_TRAIN_VOLTAGE_SWING_MASK) != voltage) {
-+			voltage = dp->conf[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
-+			tries = 0;
- 		}
-+	} while (!cr_done && !abort && ++tries < 5);
- 
--		if (eq_done || !cr_done)
--			break;
-+	return cr_done ? 0 : -1;
-+}
- 
--		if (!nouveau_dp_link_train_adjust(encoder, config) ||
--		    !nouveau_dp_link_train_commit(encoder, config))
--			break;
--	}
-+static int
-+dp_link_train_eq(struct drm_device *dev, struct dp_state *dp)
-+{
-+	bool eq_done, cr_done = true;
-+	int tries = 0, i;
- 
--stop:
--	/* end link training */
--	ret = nouveau_dp_link_train_set(encoder, DP_TRAINING_PATTERN_DISABLE);
--	if (ret)
--		return false;
-+	dp_set_training_pattern(dev, dp, DP_TRAINING_PATTERN_2);
- 
--	/* retry at a lower setting, if possible */
--	if (!ret && !(eq_done && cr_done)) {
--		NV_DEBUG_KMS(dev, "\twe failed\n");
--		if (nv_encoder->dp.link_bw != DP_LINK_BW_1_62) {
--			NV_DEBUG_KMS(dev, "retry link training at low rate\n");
--			nv_encoder->dp.link_bw = DP_LINK_BW_1_62;
--			goto train;
--		}
--	}
-+	do {
-+		if (dp_link_train_update(dev, dp, 400))
-+			break;
- 
--	if (dpe->script1) {
--		NV_DEBUG_KMS(dev, "SOR-%d: running DP script 1\n", nv_encoder->or);
--		nouveau_bios_run_init_table(dev, le16_to_cpu(dpe->script1),
--					    nv_encoder->dcb);
--	}
-+		eq_done = !!(dp->stat[2] & DP_INTERLANE_ALIGN_DONE);
-+		for (i = 0; i < dp->link_nr && eq_done; i++) {
-+			u8 lane = (dp->stat[i >> 1] >> ((i & 1) * 4)) & 0xf;
-+			if (!(lane & DP_LANE_CR_DONE))
-+				cr_done = false;
-+			if (!(lane & DP_LANE_CHANNEL_EQ_DONE) ||
-+			    !(lane & DP_LANE_SYMBOL_LOCKED))
-+				eq_done = false;
-+		}
- 
--	/* re-enable hotplug detect */
--	pgpio->irq_enable(dev, nv_connector->dcb->gpio_tag, hpd_state);
-+		if (dp_link_train_commit(dev, dp))
-+			break;
-+	} while (!eq_done && cr_done && ++tries <= 5);
- 
--	return eq_done;
-+	return eq_done ? 0 : -1;
- }
- 
- bool
--nouveau_dp_detect(struct drm_encoder *encoder)
-+nouveau_dp_link_train(struct drm_encoder *encoder, u32 datarate)
- {
-+	struct drm_nouveau_private *dev_priv = encoder->dev->dev_private;
-+	struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
- 	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
-+	struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc);
-+	struct nouveau_connector *nv_connector =
-+		nouveau_encoder_connector_get(nv_encoder);
- 	struct drm_device *dev = encoder->dev;
--	uint8_t dpcd[4];
--	int ret;
-+	struct nouveau_i2c_chan *auxch;
-+	const u32 bw_list[] = { 270000, 162000, 0 };
-+	const u32 *link_bw = bw_list;
-+	struct dp_state dp;
- 
--	ret = auxch_rd(encoder, 0x0000, dpcd, 4);
--	if (ret)
-+	auxch = nouveau_i2c_find(dev, nv_encoder->dcb->i2c_index);
-+	if (!auxch)
- 		return false;
- 
--	NV_DEBUG_KMS(dev, "encoder: link_bw %d, link_nr %d\n"
--		      "display: link_bw %d, link_nr %d version 0x%02x\n",
--		 nv_encoder->dcb->dpconf.link_bw,
--		 nv_encoder->dcb->dpconf.link_nr,
--		 dpcd[1], dpcd[2] & 0x0f, dpcd[0]);
-+	dp.table = nouveau_dp_bios_data(dev, nv_encoder->dcb, &dp.entry);
-+	if (!dp.table)
-+		return -EINVAL;
- 
--	nv_encoder->dp.dpcd_version = dpcd[0];
-+	dp.dcb = nv_encoder->dcb;
-+	dp.crtc = nv_crtc->index;
-+	dp.auxch = auxch->rd;
-+	dp.or = nv_encoder->or;
-+	dp.link = !(nv_encoder->dcb->sorconf.link & 1);
-+	dp.dpcd = nv_encoder->dp.dpcd;
- 
--	nv_encoder->dp.link_bw = dpcd[1];
--	if (nv_encoder->dp.link_bw != DP_LINK_BW_1_62 &&
--	    !nv_encoder->dcb->dpconf.link_bw)
--		nv_encoder->dp.link_bw = DP_LINK_BW_1_62;
-+	/* some sinks toggle hotplug in response to some of the actions
-+	 * we take during link training (DP_SET_POWER is one), we need
-+	 * to ignore them for the moment to avoid races.
-+	 */
-+	pgpio->irq_enable(dev, nv_connector->dcb->gpio_tag, false);
- 
--	nv_encoder->dp.link_nr = dpcd[2] & DP_MAX_LANE_COUNT_MASK;
--	if (nv_encoder->dp.link_nr > nv_encoder->dcb->dpconf.link_nr)
--		nv_encoder->dp.link_nr = nv_encoder->dcb->dpconf.link_nr;
-+	/* enable down-spreading, if possible */
-+	if (dp.table[1] >= 16) {
-+		u16 script = ROM16(dp.entry[14]);
-+		if (nv_encoder->dp.dpcd[3] & 1)
-+			script = ROM16(dp.entry[12]);
- 
--	nv_encoder->dp.enhanced_frame = (dpcd[2] & DP_ENHANCED_FRAME_CAP);
-+		nouveau_bios_run_init_table(dev, script, dp.dcb, dp.crtc);
-+	}
- 
--	return true;
--}
-+	/* execute pre-train script from vbios */
-+	nouveau_bios_run_init_table(dev, ROM16(dp.entry[6]), dp.dcb, dp.crtc);
- 
--int
--nouveau_dp_auxch(struct nouveau_i2c_chan *auxch, int cmd, int addr,
--		 uint8_t *data, int data_nr)
--{
--	struct drm_device *dev = auxch->dev;
--	uint32_t tmp, ctrl, stat = 0, data32[4] = {};
--	int ret = 0, i, index = auxch->rd;
-+	/* start off at highest link rate supported by encoder and display */
-+	while (*link_bw > nv_encoder->dp.link_bw)
-+		link_bw++;
- 
--	NV_DEBUG_KMS(dev, "ch %d cmd %d addr 0x%x len %d\n", index, cmd, addr, data_nr);
-+	while (link_bw[0]) {
-+		/* find minimum required lane count at this link rate */
-+		dp.link_nr = nv_encoder->dp.link_nr;
-+		while ((dp.link_nr >> 1) * link_bw[0] > datarate)
-+			dp.link_nr >>= 1;
- 
--	tmp = nv_rd32(dev, NV50_AUXCH_CTRL(auxch->rd));
--	nv_wr32(dev, NV50_AUXCH_CTRL(auxch->rd), tmp | 0x00100000);
--	tmp = nv_rd32(dev, NV50_AUXCH_CTRL(auxch->rd));
--	if (!(tmp & 0x01000000)) {
--		NV_ERROR(dev, "expected bit 24 == 1, got 0x%08x\n", tmp);
--		ret = -EIO;
--		goto out;
--	}
-+		/* drop link rate to minimum with this lane count */
-+		while ((link_bw[1] * dp.link_nr) > datarate)
-+			link_bw++;
-+		dp.link_bw = link_bw[0];
-+
-+		/* program selected link configuration */
-+		dp_set_link_config(dev, &dp);
- 
--	for (i = 0; i < 3; i++) {
--		tmp = nv_rd32(dev, NV50_AUXCH_STAT(auxch->rd));
--		if (tmp & NV50_AUXCH_STAT_STATE_READY)
-+		/* attempt to train the link at this configuration */
-+		memset(dp.stat, 0x00, sizeof(dp.stat));
-+		if (!dp_link_train_cr(dev, &dp) &&
-+		    !dp_link_train_eq(dev, &dp))
- 			break;
--		udelay(100);
--	}
- 
--	if (i == 3) {
--		ret = -EBUSY;
--		goto out;
-+		/* retry at lower rate */
-+		link_bw++;
- 	}
- 
--	if (!(cmd & 1)) {
--		memcpy(data32, data, data_nr);
--		for (i = 0; i < 4; i++) {
--			NV_DEBUG_KMS(dev, "wr %d: 0x%08x\n", i, data32[i]);
--			nv_wr32(dev, NV50_AUXCH_DATA_OUT(index, i), data32[i]);
--		}
--	}
-+	/* finish link training */
-+	dp_set_training_pattern(dev, &dp, DP_TRAINING_PATTERN_DISABLE);
- 
--	nv_wr32(dev, NV50_AUXCH_ADDR(index), addr);
--	ctrl  = nv_rd32(dev, NV50_AUXCH_CTRL(index));
--	ctrl &= ~(NV50_AUXCH_CTRL_CMD | NV50_AUXCH_CTRL_LEN);
--	ctrl |= (cmd << NV50_AUXCH_CTRL_CMD_SHIFT);
--	ctrl |= ((data_nr - 1) << NV50_AUXCH_CTRL_LEN_SHIFT);
-+	/* execute post-train script from vbios */
-+	nouveau_bios_run_init_table(dev, ROM16(dp.entry[8]), dp.dcb, dp.crtc);
- 
--	for (i = 0; i < 16; i++) {
--		nv_wr32(dev, NV50_AUXCH_CTRL(index), ctrl | 0x80000000);
--		nv_wr32(dev, NV50_AUXCH_CTRL(index), ctrl);
--		nv_wr32(dev, NV50_AUXCH_CTRL(index), ctrl | 0x00010000);
--		if (!nv_wait(dev, NV50_AUXCH_CTRL(index),
--			     0x00010000, 0x00000000)) {
--			NV_ERROR(dev, "expected bit 16 == 0, got 0x%08x\n",
--				 nv_rd32(dev, NV50_AUXCH_CTRL(index)));
--			ret = -EBUSY;
--			goto out;
--		}
-+	/* re-enable hotplug detect */
-+	pgpio->irq_enable(dev, nv_connector->dcb->gpio_tag, true);
-+	return true;
-+}
-+
-+bool
-+nouveau_dp_detect(struct drm_encoder *encoder)
-+{
-+	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
-+	struct drm_device *dev = encoder->dev;
-+	struct nouveau_i2c_chan *auxch;
-+	u8 *dpcd = nv_encoder->dp.dpcd;
-+	int ret;
- 
--		udelay(400);
-+	auxch = nouveau_i2c_find(dev, nv_encoder->dcb->i2c_index);
-+	if (!auxch)
-+		return false;
- 
--		stat = nv_rd32(dev, NV50_AUXCH_STAT(index));
--		if ((stat & NV50_AUXCH_STAT_REPLY_AUX) !=
--			    NV50_AUXCH_STAT_REPLY_AUX_DEFER)
--			break;
--	}
-+	ret = auxch_tx(dev, auxch->rd, 9, DP_DPCD_REV, dpcd, 8);
-+	if (ret)
-+		return false;
- 
--	if (i == 16) {
--		NV_ERROR(dev, "auxch DEFER too many times, bailing\n");
--		ret = -EREMOTEIO;
--		goto out;
--	}
-+	nv_encoder->dp.link_bw = 27000 * dpcd[1];
-+	nv_encoder->dp.link_nr = dpcd[2] & DP_MAX_LANE_COUNT_MASK;
- 
--	if (cmd & 1) {
--		if ((stat & NV50_AUXCH_STAT_COUNT) != data_nr) {
--			ret = -EREMOTEIO;
--			goto out;
--		}
-+	NV_DEBUG_KMS(dev, "display: %dx%d dpcd 0x%02x\n",
-+		     nv_encoder->dp.link_nr, nv_encoder->dp.link_bw, dpcd[0]);
-+	NV_DEBUG_KMS(dev, "encoder: %dx%d\n",
-+		     nv_encoder->dcb->dpconf.link_nr,
-+		     nv_encoder->dcb->dpconf.link_bw);
- 
--		for (i = 0; i < 4; i++) {
--			data32[i] = nv_rd32(dev, NV50_AUXCH_DATA_IN(index, i));
--			NV_DEBUG_KMS(dev, "rd %d: 0x%08x\n", i, data32[i]);
--		}
--		memcpy(data, data32, data_nr);
--	}
-+	if (nv_encoder->dcb->dpconf.link_nr < nv_encoder->dp.link_nr)
-+		nv_encoder->dp.link_nr = nv_encoder->dcb->dpconf.link_nr;
-+	if (nv_encoder->dcb->dpconf.link_bw < nv_encoder->dp.link_bw)
-+		nv_encoder->dp.link_bw = nv_encoder->dcb->dpconf.link_bw;
- 
--out:
--	tmp = nv_rd32(dev, NV50_AUXCH_CTRL(auxch->rd));
--	nv_wr32(dev, NV50_AUXCH_CTRL(auxch->rd), tmp & ~0x00100000);
--	tmp = nv_rd32(dev, NV50_AUXCH_CTRL(auxch->rd));
--	if (tmp & 0x01000000) {
--		NV_ERROR(dev, "expected bit 24 == 0, got 0x%08x\n", tmp);
--		ret = -EIO;
--	}
-+	NV_DEBUG_KMS(dev, "maximum: %dx%d\n",
-+		     nv_encoder->dp.link_nr, nv_encoder->dp.link_bw);
- 
--	udelay(400);
-+	return true;
-+}
- 
--	return ret ? ret : (stat & NV50_AUXCH_STAT_REPLY);
-+int
-+nouveau_dp_auxch(struct nouveau_i2c_chan *auxch, int cmd, int addr,
-+		 uint8_t *data, int data_nr)
-+{
-+	return auxch_tx(auxch->dev, auxch->rd, cmd, addr, data, data_nr);
- }
- 
- static int
- nouveau_dp_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
- {
- 	struct nouveau_i2c_chan *auxch = (struct nouveau_i2c_chan *)adap;
--	struct drm_device *dev = auxch->dev;
- 	struct i2c_msg *msg = msgs;
- 	int ret, mcnt = num;
- 
-@@ -602,19 +714,6 @@ nouveau_dp_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
- 			if (ret < 0)
- 				return ret;
- 
--			switch (ret & NV50_AUXCH_STAT_REPLY_I2C) {
--			case NV50_AUXCH_STAT_REPLY_I2C_ACK:
--				break;
--			case NV50_AUXCH_STAT_REPLY_I2C_NACK:
--				return -EREMOTEIO;
--			case NV50_AUXCH_STAT_REPLY_I2C_DEFER:
--				udelay(100);
--				continue;
--			default:
--				NV_ERROR(dev, "bad auxch reply: 0x%08x\n", ret);
--				return -EREMOTEIO;
--			}
--
- 			ptr += cnt;
- 			remaining -= cnt;
- 		}
-diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.c b/drivers/gpu/drm/nouveau/nouveau_drv.c
-index b30ddd8..c1e01f3 100644
---- a/drivers/gpu/drm/nouveau/nouveau_drv.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_drv.c
-@@ -41,7 +41,7 @@ int nouveau_agpmode = -1;
- module_param_named(agpmode, nouveau_agpmode, int, 0400);
- 
- MODULE_PARM_DESC(modeset, "Enable kernel modesetting");
--static int nouveau_modeset = -1; /* kms */
-+int nouveau_modeset = -1;
- module_param_named(modeset, nouveau_modeset, int, 0400);
- 
- MODULE_PARM_DESC(vbios, "Override default VBIOS location");
-diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
-index d7d51de..29837da 100644
---- a/drivers/gpu/drm/nouveau/nouveau_drv.h
-+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
-@@ -414,12 +414,13 @@ struct nouveau_gpio_engine {
- };
- 
- struct nouveau_pm_voltage_level {
--	u8 voltage;
--	u8 vid;
-+	u32 voltage; /* microvolts */
-+	u8  vid;
- };
- 
- struct nouveau_pm_voltage {
- 	bool supported;
-+	u8 version;
- 	u8 vid_mask;
- 
- 	struct nouveau_pm_voltage_level *level;
-@@ -428,17 +429,48 @@ struct nouveau_pm_voltage {
- 
- struct nouveau_pm_memtiming {
- 	int id;
--	u32 reg_100220;
--	u32 reg_100224;
--	u32 reg_100228;
--	u32 reg_10022c;
--	u32 reg_100230;
--	u32 reg_100234;
--	u32 reg_100238;
--	u32 reg_10023c;
--	u32 reg_100240;
-+	u32 reg_0; /* 0x10f290 on Fermi, 0x100220 for older */
-+	u32 reg_1;
-+	u32 reg_2;
-+	u32 reg_3;
-+	u32 reg_4;
-+	u32 reg_5;
-+	u32 reg_6;
-+	u32 reg_7;
-+	u32 reg_8;
-+	/* To be written to 0x1002c0 */
-+	u8 CL;
-+	u8 WR;
- };
- 
-+struct nouveau_pm_tbl_header{
-+	u8 version;
-+	u8 header_len;
-+	u8 entry_cnt;
-+	u8 entry_len;
-+};
-+
-+struct nouveau_pm_tbl_entry{
-+	u8 tWR;
-+	u8 tUNK_1;
-+	u8 tCL;
-+	u8 tRP;		/* Byte 3 */
-+	u8 empty_4;
-+	u8 tRAS;	/* Byte 5 */
-+	u8 empty_6;
-+	u8 tRFC;	/* Byte 7 */
-+	u8 empty_8;
-+	u8 tRC;		/* Byte 9 */
-+	u8 tUNK_10, tUNK_11, tUNK_12, tUNK_13, tUNK_14;
-+	u8 empty_15,empty_16,empty_17;
-+	u8 tUNK_18, tUNK_19, tUNK_20, tUNK_21;
-+};
-+
-+/* nouveau_mem.c */
-+void nv30_mem_timing_entry(struct drm_device *dev, struct nouveau_pm_tbl_header *hdr,
-+							struct nouveau_pm_tbl_entry *e, uint8_t magic_number,
-+							struct nouveau_pm_memtiming *timing);
-+
- #define NOUVEAU_PM_MAX_LEVEL 8
- struct nouveau_pm_level {
- 	struct device_attribute dev_attr;
-@@ -448,11 +480,19 @@ struct nouveau_pm_level {
- 	u32 core;
- 	u32 memory;
- 	u32 shader;
--	u32 unk05;
--	u32 unk0a;
-+	u32 rop;
-+	u32 copy;
-+	u32 daemon;
-+	u32 vdec;
-+	u32 unk05;	/* nv50:nva3, roughly.. */
-+	u32 unka0;	/* nva3:nvc0 */
-+	u32 hub01;	/* nvc0- */
-+	u32 hub06;	/* nvc0- */
-+	u32 hub07;	/* nvc0- */
- 
--	u8 voltage;
--	u8 fanspeed;
-+	u32 volt_min; /* microvolts */
-+	u32 volt_max;
-+	u8  fanspeed;
- 
- 	u16 memscript;
- 	struct nouveau_pm_memtiming *timing;
-@@ -496,6 +536,11 @@ struct nouveau_pm_engine {
- 	void *(*clock_pre)(struct drm_device *, struct nouveau_pm_level *,
- 			   u32 id, int khz);
- 	void (*clock_set)(struct drm_device *, void *);
-+
-+	int  (*clocks_get)(struct drm_device *, struct nouveau_pm_level *);
-+	void *(*clocks_pre)(struct drm_device *, struct nouveau_pm_level *);
-+	void (*clocks_set)(struct drm_device *, void *);
-+
- 	int (*voltage_get)(struct drm_device *);
- 	int (*voltage_set)(struct drm_device *, int voltage);
- 	int (*fanspeed_get)(struct drm_device *);
-@@ -504,7 +549,7 @@ struct nouveau_pm_engine {
- };
- 
- struct nouveau_vram_engine {
--	struct nouveau_mm *mm;
-+	struct nouveau_mm mm;
- 
- 	int  (*init)(struct drm_device *);
- 	void (*takedown)(struct drm_device *dev);
-@@ -623,6 +668,7 @@ enum nouveau_card_type {
- 	NV_40      = 0x40,
- 	NV_50      = 0x50,
- 	NV_C0      = 0xc0,
-+	NV_D0      = 0xd0
- };
- 
- struct drm_nouveau_private {
-@@ -633,8 +679,8 @@ struct drm_nouveau_private {
- 	enum nouveau_card_type card_type;
- 	/* exact chipset, derived from NV_PMC_BOOT_0 */
- 	int chipset;
--	int stepping;
- 	int flags;
-+	u32 crystal;
- 
- 	void __iomem *mmio;
- 
-@@ -721,7 +767,6 @@ struct drm_nouveau_private {
- 	uint64_t vram_size;
- 	uint64_t vram_sys_base;
- 
--	uint64_t fb_phys;
- 	uint64_t fb_available_size;
- 	uint64_t fb_mappable_pages;
- 	uint64_t fb_aper_free;
-@@ -784,6 +829,7 @@ nouveau_bo_ref(struct nouveau_bo *ref, struct nouveau_bo **pnvbo)
- }
- 
- /* nouveau_drv.c */
-+extern int nouveau_modeset;
- extern int nouveau_agpmode;
- extern int nouveau_duallink;
- extern int nouveau_uscript_lvds;
-@@ -824,6 +870,8 @@ extern bool nouveau_wait_eq(struct drm_device *, uint64_t timeout,
- 			    uint32_t reg, uint32_t mask, uint32_t val);
- extern bool nouveau_wait_ne(struct drm_device *, uint64_t timeout,
- 			    uint32_t reg, uint32_t mask, uint32_t val);
-+extern bool nouveau_wait_cb(struct drm_device *, u64 timeout,
-+			    bool (*cond)(void *), void *);
- extern bool nouveau_wait_for_idle(struct drm_device *);
- extern int  nouveau_card_init(struct drm_device *);
- 
-@@ -1006,15 +1054,15 @@ static inline int nouveau_acpi_edid(struct drm_device *dev, struct drm_connector
- 
- /* nouveau_backlight.c */
- #ifdef CONFIG_DRM_NOUVEAU_BACKLIGHT
--extern int nouveau_backlight_init(struct drm_connector *);
--extern void nouveau_backlight_exit(struct drm_connector *);
-+extern int nouveau_backlight_init(struct drm_device *);
-+extern void nouveau_backlight_exit(struct drm_device *);
- #else
--static inline int nouveau_backlight_init(struct drm_connector *dev)
-+static inline int nouveau_backlight_init(struct drm_device *dev)
- {
- 	return 0;
- }
- 
--static inline void nouveau_backlight_exit(struct drm_connector *dev) { }
-+static inline void nouveau_backlight_exit(struct drm_device *dev) { }
- #endif
- 
- /* nouveau_bios.c */
-@@ -1022,7 +1070,8 @@ extern int nouveau_bios_init(struct drm_device *);
- extern void nouveau_bios_takedown(struct drm_device *dev);
- extern int nouveau_run_vbios_init(struct drm_device *);
- extern void nouveau_bios_run_init_table(struct drm_device *, uint16_t table,
--					struct dcb_entry *);
-+					struct dcb_entry *, int crtc);
-+extern void nouveau_bios_init_exec(struct drm_device *, uint16_t table);
- extern struct dcb_gpio_entry *nouveau_bios_gpio_entry(struct drm_device *,
- 						      enum dcb_gpio_tag);
- extern struct dcb_connector_table_entry *
-@@ -1030,11 +1079,8 @@ nouveau_bios_connector_entry(struct drm_device *, int index);
- extern u32 get_pll_register(struct drm_device *, enum pll_types);
- extern int get_pll_limits(struct drm_device *, uint32_t limit_match,
- 			  struct pll_lims *);
--extern int nouveau_bios_run_display_table(struct drm_device *,
--					  struct dcb_entry *,
--					  uint32_t script, int pxclk);
--extern void *nouveau_bios_dp_table(struct drm_device *, struct dcb_entry *,
--				   int *length);
-+extern int nouveau_bios_run_display_table(struct drm_device *, u16 id, int clk,
-+					  struct dcb_entry *, int crtc);
- extern bool nouveau_bios_fp_mode(struct drm_device *, struct drm_display_mode *);
- extern uint8_t *nouveau_bios_embedded_edid(struct drm_device *);
- extern int nouveau_bios_parse_lvds_table(struct drm_device *, int pxclk,
-@@ -1043,6 +1089,7 @@ extern int run_tmds_table(struct drm_device *, struct dcb_entry *,
- 			  int head, int pxclk);
- extern int call_lvds_script(struct drm_device *, struct dcb_entry *, int head,
- 			    enum LVDS_script, int pxclk);
-+bool bios_encoder_match(struct dcb_entry *, u32 hash);
- 
- /* nouveau_ttm.c */
- int nouveau_ttm_global_init(struct drm_nouveau_private *);
-@@ -1053,7 +1100,9 @@ int nouveau_ttm_mmap(struct file *, struct vm_area_struct *);
- int nouveau_dp_auxch(struct nouveau_i2c_chan *auxch, int cmd, int addr,
- 		     uint8_t *data, int data_nr);
- bool nouveau_dp_detect(struct drm_encoder *);
--bool nouveau_dp_link_train(struct drm_encoder *);
-+bool nouveau_dp_link_train(struct drm_encoder *, u32 datarate);
-+void nouveau_dp_tu_update(struct drm_device *, int, int, u32, u32);
-+u8 *nouveau_dp_bios_data(struct drm_device *, struct dcb_entry *, u8 **);
- 
- /* nv04_fb.c */
- extern int  nv04_fb_init(struct drm_device *);
-@@ -1179,8 +1228,8 @@ extern int  nva3_copy_create(struct drm_device *dev);
- /* nvc0_copy.c */
- extern int  nvc0_copy_create(struct drm_device *dev, int engine);
- 
--/* nv40_mpeg.c */
--extern int  nv40_mpeg_create(struct drm_device *dev);
-+/* nv31_mpeg.c */
-+extern int  nv31_mpeg_create(struct drm_device *dev);
- 
- /* nv50_mpeg.c */
- extern int  nv50_mpeg_create(struct drm_device *dev);
-@@ -1265,6 +1314,11 @@ extern int nv04_display_create(struct drm_device *);
- extern int nv04_display_init(struct drm_device *);
- extern void nv04_display_destroy(struct drm_device *);
- 
-+/* nvd0_display.c */
-+extern int nvd0_display_create(struct drm_device *);
-+extern int nvd0_display_init(struct drm_device *);
-+extern void nvd0_display_destroy(struct drm_device *);
-+
- /* nv04_crtc.c */
- extern int nv04_crtc_create(struct drm_device *, int index);
- 
-@@ -1374,6 +1428,8 @@ int nv50_gpio_init(struct drm_device *dev);
- void nv50_gpio_fini(struct drm_device *dev);
- int nv50_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag);
- int nv50_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state);
-+int nvd0_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag);
-+int nvd0_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state);
- int  nv50_gpio_irq_register(struct drm_device *, enum dcb_gpio_tag,
- 			    void (*)(void *, int), void *);
- void nv50_gpio_irq_unregister(struct drm_device *, enum dcb_gpio_tag,
-@@ -1448,6 +1504,8 @@ static inline void nv_wr08(struct drm_device *dev, unsigned reg, u8 val)
- 	nouveau_wait_eq(dev, 2000000000ULL, (reg), (mask), (val))
- #define nv_wait_ne(dev, reg, mask, val) \
- 	nouveau_wait_ne(dev, 2000000000ULL, (reg), (mask), (val))
-+#define nv_wait_cb(dev, func, data) \
-+	nouveau_wait_cb(dev, 2000000000ULL, (func), (data))
- 
- /* PRAMIN access */
- static inline u32 nv_ri32(struct drm_device *dev, unsigned offset)
-@@ -1514,6 +1572,7 @@ enum {
- 	NOUVEAU_REG_DEBUG_RMVIO          = 0x80,
- 	NOUVEAU_REG_DEBUG_VGAATTR        = 0x100,
- 	NOUVEAU_REG_DEBUG_EVO            = 0x200,
-+	NOUVEAU_REG_DEBUG_AUXCH          = 0x400
- };
- 
- #define NV_REG_DEBUG(type, dev, fmt, arg...) do { \
-diff --git a/drivers/gpu/drm/nouveau/nouveau_encoder.h b/drivers/gpu/drm/nouveau/nouveau_encoder.h
-index ae69b61..e5d6e3f 100644
---- a/drivers/gpu/drm/nouveau/nouveau_encoder.h
-+++ b/drivers/gpu/drm/nouveau/nouveau_encoder.h
-@@ -49,17 +49,17 @@ struct nouveau_encoder {
- 
- 	union {
- 		struct {
--			int mc_unknown;
--			uint32_t unk0;
--			uint32_t unk1;
--			int dpcd_version;
-+			u8  dpcd[8];
- 			int link_nr;
- 			int link_bw;
--			bool enhanced_frame;
-+			u32 datarate;
- 		} dp;
- 	};
- };
- 
-+struct nouveau_encoder *
-+find_encoder(struct drm_connector *connector, int type);
-+
- static inline struct nouveau_encoder *nouveau_encoder(struct drm_encoder *enc)
- {
- 	struct drm_encoder_slave *slave = to_encoder_slave(enc);
-@@ -83,21 +83,4 @@ nouveau_encoder_connector_get(struct nouveau_encoder *encoder);
- int nv50_sor_create(struct drm_connector *, struct dcb_entry *);
- int nv50_dac_create(struct drm_connector *, struct dcb_entry *);
- 
--struct bit_displayport_encoder_table {
--	uint32_t match;
--	uint8_t  record_nr;
--	uint8_t  unknown;
--	uint16_t script0;
--	uint16_t script1;
--	uint16_t unknown_table;
--} __attribute__ ((packed));
--
--struct bit_displayport_encoder_table_entry {
--	uint8_t vs_level;
--	uint8_t pre_level;
--	uint8_t reg0;
--	uint8_t reg1;
--	uint8_t reg2;
--} __attribute__ ((packed));
--
- #endif /* __NOUVEAU_ENCODER_H__ */
-diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c
-index ae22dfa..2f6daae 100644
---- a/drivers/gpu/drm/nouveau/nouveau_fence.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
-@@ -519,7 +519,7 @@ nouveau_fence_channel_init(struct nouveau_channel *chan)
- 	if (USE_SEMA(dev) && dev_priv->chipset < 0x84) {
- 		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_FROM_MEMORY,
- 					     mem->start << PAGE_SHIFT,
- 					     mem->size, NV_MEM_ACCESS_RW,
- 					     NV_MEM_TARGET_VRAM, &obj);
-diff --git a/drivers/gpu/drm/nouveau/nouveau_i2c.c b/drivers/gpu/drm/nouveau/nouveau_i2c.c
-index cb389d0..f6a27fa 100644
---- a/drivers/gpu/drm/nouveau/nouveau_i2c.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_i2c.c
-@@ -107,6 +107,13 @@ nv4e_i2c_getsda(void *data)
- 	return !!((nv_rd32(dev, i2c->rd) >> 16) & 8);
- }
- 
-+static const uint32_t nv50_i2c_port[] = {
-+	0x00e138, 0x00e150, 0x00e168, 0x00e180,
-+	0x00e254, 0x00e274, 0x00e764, 0x00e780,
-+	0x00e79c, 0x00e7b8
-+};
-+#define NV50_I2C_PORTS ARRAY_SIZE(nv50_i2c_port)
-+
- static int
- nv50_i2c_getscl(void *data)
- {
-@@ -130,28 +137,32 @@ static void
- nv50_i2c_setscl(void *data, int state)
- {
- 	struct nouveau_i2c_chan *i2c = data;
--	struct drm_device *dev = i2c->dev;
- 
--	nv_wr32(dev, i2c->wr, 4 | (i2c->data ? 2 : 0) | (state ? 1 : 0));
-+	nv_wr32(i2c->dev, i2c->wr, 4 | (i2c->data ? 2 : 0) | (state ? 1 : 0));
- }
- 
- static void
- nv50_i2c_setsda(void *data, int state)
- {
- 	struct nouveau_i2c_chan *i2c = data;
--	struct drm_device *dev = i2c->dev;
- 
--	nv_wr32(dev, i2c->wr,
--			(nv_rd32(dev, i2c->rd) & 1) | 4 | (state ? 2 : 0));
-+	nv_mask(i2c->dev, i2c->wr, 0x00000006, 4 | (state ? 2 : 0));
- 	i2c->data = state;
- }
- 
--static const uint32_t nv50_i2c_port[] = {
--	0x00e138, 0x00e150, 0x00e168, 0x00e180,
--	0x00e254, 0x00e274, 0x00e764, 0x00e780,
--	0x00e79c, 0x00e7b8
--};
--#define NV50_I2C_PORTS ARRAY_SIZE(nv50_i2c_port)
-+static int
-+nvd0_i2c_getscl(void *data)
-+{
-+	struct nouveau_i2c_chan *i2c = data;
-+	return !!(nv_rd32(i2c->dev, i2c->rd) & 0x10);
-+}
-+
-+static int
-+nvd0_i2c_getsda(void *data)
-+{
-+	struct nouveau_i2c_chan *i2c = data;
-+	return !!(nv_rd32(i2c->dev, i2c->rd) & 0x20);
-+}
- 
- int
- nouveau_i2c_init(struct drm_device *dev, struct dcb_i2c_entry *entry, int index)
-@@ -163,7 +174,8 @@ nouveau_i2c_init(struct drm_device *dev, struct dcb_i2c_entry *entry, int index)
- 	if (entry->chan)
- 		return -EEXIST;
- 
--	if (dev_priv->card_type >= NV_50 && entry->read >= NV50_I2C_PORTS) {
-+	if (dev_priv->card_type >= NV_50 &&
-+	    dev_priv->card_type <= NV_C0 && entry->read >= NV50_I2C_PORTS) {
- 		NV_ERROR(dev, "unknown i2c port %d\n", entry->read);
- 		return -EINVAL;
- 	}
-@@ -192,10 +204,17 @@ nouveau_i2c_init(struct drm_device *dev, struct dcb_i2c_entry *entry, int index)
- 	case 5:
- 		i2c->bit.setsda = nv50_i2c_setsda;
- 		i2c->bit.setscl = nv50_i2c_setscl;
--		i2c->bit.getsda = nv50_i2c_getsda;
--		i2c->bit.getscl = nv50_i2c_getscl;
--		i2c->rd = nv50_i2c_port[entry->read];
--		i2c->wr = i2c->rd;
-+		if (dev_priv->card_type < NV_D0) {
-+			i2c->bit.getsda = nv50_i2c_getsda;
-+			i2c->bit.getscl = nv50_i2c_getscl;
-+			i2c->rd = nv50_i2c_port[entry->read];
-+			i2c->wr = i2c->rd;
-+		} else {
-+			i2c->bit.getsda = nvd0_i2c_getsda;
-+			i2c->bit.getscl = nvd0_i2c_getscl;
-+			i2c->rd = 0x00d014 + (entry->read * 0x20);
-+			i2c->wr = i2c->rd;
-+		}
- 		break;
- 	case 6:
- 		i2c->rd = entry->read;
-@@ -267,7 +286,10 @@ nouveau_i2c_find(struct drm_device *dev, int index)
- 			val  = 0xe001;
- 		}
- 
--		nv_wr32(dev, reg, (nv_rd32(dev, reg) & ~0xf003) | val);
-+		/* nfi, but neither auxch or i2c work if it's 1 */
-+		nv_mask(dev, reg + 0x0c, 0x00000001, 0x00000000);
-+		/* nfi, but switches auxch vs normal i2c */
-+		nv_mask(dev, reg + 0x00, 0x0000f003, val);
- 	}
- 
- 	if (!i2c->chan && nouveau_i2c_init(dev, i2c, index))
-diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c
-index f9ae2fc..36bec48 100644
---- a/drivers/gpu/drm/nouveau/nouveau_mem.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_mem.c
-@@ -408,8 +408,6 @@ nouveau_mem_vram_init(struct drm_device *dev)
- 	if (ret)
- 		return ret;
- 
--	dev_priv->fb_phys = pci_resource_start(dev->pdev, 1);
--
- 	ret = nouveau_ttm_global_init(dev_priv);
- 	if (ret)
- 		return ret;
-@@ -504,35 +502,146 @@ nouveau_mem_gart_init(struct drm_device *dev)
- 	return 0;
- }
- 
-+/* XXX: For now a dummy. More samples required, possibly even a card
-+ * Called from nouveau_perf.c */
-+void nv30_mem_timing_entry(struct drm_device *dev, struct nouveau_pm_tbl_header *hdr,
-+							struct nouveau_pm_tbl_entry *e, uint8_t magic_number,
-+							struct nouveau_pm_memtiming *timing) {
-+
-+	NV_DEBUG(dev,"Timing entry format unknown, please contact nouveau developers");
-+}
-+
-+void nv40_mem_timing_entry(struct drm_device *dev, struct nouveau_pm_tbl_header *hdr,
-+							struct nouveau_pm_tbl_entry *e, uint8_t magic_number,
-+							struct nouveau_pm_memtiming *timing) {
-+
-+	timing->reg_0 = (e->tRC << 24 | e->tRFC << 16 | e->tRAS << 8 | e->tRP);
-+
-+	/* XXX: I don't trust the -1's and +1's... they must come
-+	 *      from somewhere! */
-+	timing->reg_1 = (e->tWR + 2 + magic_number) << 24 |
-+				  1 << 16 |
-+				  (e->tUNK_1 + 2 + magic_number) << 8 |
-+				  (e->tCL + 2 - magic_number);
-+	timing->reg_2 = (magic_number << 24 | e->tUNK_12 << 16 | e->tUNK_11 << 8 | e->tUNK_10);
-+	timing->reg_2 |= 0x20200000;
-+
-+	NV_DEBUG(dev, "Entry %d: 220: %08x %08x %08x\n", timing->id,
-+		 timing->reg_0, timing->reg_1,timing->reg_2);
-+}
-+
-+void nv50_mem_timing_entry(struct drm_device *dev, struct bit_entry *P, struct nouveau_pm_tbl_header *hdr,
-+							struct nouveau_pm_tbl_entry *e, uint8_t magic_number,struct nouveau_pm_memtiming *timing) {
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+
-+	uint8_t unk18 = 1,
-+		unk19 = 1,
-+		unk20 = 0,
-+		unk21 = 0;
-+
-+	switch (min(hdr->entry_len, (u8) 22)) {
-+	case 22:
-+		unk21 = e->tUNK_21;
-+	case 21:
-+		unk20 = e->tUNK_20;
-+	case 20:
-+		unk19 = e->tUNK_19;
-+	case 19:
-+		unk18 = e->tUNK_18;
-+		break;
-+	}
-+
-+	timing->reg_0 = (e->tRC << 24 | e->tRFC << 16 | e->tRAS << 8 | e->tRP);
-+
-+	/* XXX: I don't trust the -1's and +1's... they must come
-+	 *      from somewhere! */
-+	timing->reg_1 = (e->tWR + unk19 + 1 + magic_number) << 24 |
-+				  max(unk18, (u8) 1) << 16 |
-+				  (e->tUNK_1 + unk19 + 1 + magic_number) << 8;
-+	if (dev_priv->chipset == 0xa8) {
-+		timing->reg_1 |= (e->tCL - 1);
-+	} else {
-+		timing->reg_1 |= (e->tCL + 2 - magic_number);
-+	}
-+	timing->reg_2 = (e->tUNK_12 << 16 | e->tUNK_11 << 8 | e->tUNK_10);
-+
-+	timing->reg_5 = (e->tRAS << 24 | e->tRC);
-+	timing->reg_5 += max(e->tUNK_10, e->tUNK_11) << 16;
-+
-+	if (P->version == 1) {
-+		timing->reg_2 |= magic_number << 24;
-+		timing->reg_3 = (0x14 + e->tCL) << 24 |
-+						0x16 << 16 |
-+						(e->tCL - 1) << 8 |
-+						(e->tCL - 1);
-+		timing->reg_4 = (nv_rd32(dev,0x10022c) & 0xffff0000) | e->tUNK_13 << 8  | e->tUNK_13;
-+		timing->reg_5 |= (e->tCL + 2) << 8;
-+		timing->reg_7 = 0x4000202 | (e->tCL - 1) << 16;
-+	} else {
-+		timing->reg_2 |= (unk19 - 1) << 24;
-+		/* XXX: reg_10022c for recentish cards pretty much unknown*/
-+		timing->reg_3 = e->tCL - 1;
-+		timing->reg_4 = (unk20 << 24 | unk21 << 16 |
-+							e->tUNK_13 << 8  | e->tUNK_13);
-+		/* XXX: +6? */
-+		timing->reg_5 |= (unk19 + 6) << 8;
-+
-+		/* XXX: reg_10023c currently unknown
-+		 * 10023c seen as 06xxxxxx, 0bxxxxxx or 0fxxxxxx */
-+		timing->reg_7 = 0x202;
-+	}
-+
-+	NV_DEBUG(dev, "Entry %d: 220: %08x %08x %08x %08x\n", timing->id,
-+		 timing->reg_0, timing->reg_1,
-+		 timing->reg_2, timing->reg_3);
-+	NV_DEBUG(dev, "         230: %08x %08x %08x %08x\n",
-+		 timing->reg_4, timing->reg_5,
-+		 timing->reg_6, timing->reg_7);
-+	NV_DEBUG(dev, "         240: %08x\n", timing->reg_8);
-+}
-+
-+void nvc0_mem_timing_entry(struct drm_device *dev, struct nouveau_pm_tbl_header *hdr,
-+							struct nouveau_pm_tbl_entry *e, struct nouveau_pm_memtiming *timing) {
-+	timing->reg_0 = (e->tRC << 24 | (e->tRFC & 0x7f) << 17 | e->tRAS << 8 | e->tRP);
-+	timing->reg_1 = (nv_rd32(dev,0x10f294) & 0xff000000) | (e->tUNK_11&0x0f) << 20 | (e->tUNK_19 << 7) | (e->tCL & 0x0f);
-+	timing->reg_2 = (nv_rd32(dev,0x10f298) & 0xff0000ff) | e->tWR << 16 | e->tUNK_1 << 8;
-+	timing->reg_3 = e->tUNK_20 << 9 | e->tUNK_13;
-+	timing->reg_4 = (nv_rd32(dev,0x10f2a0) & 0xfff000ff) | e->tUNK_12 << 15;
-+	NV_DEBUG(dev, "Entry %d: 290: %08x %08x %08x %08x\n", timing->id,
-+		 timing->reg_0, timing->reg_1,
-+		 timing->reg_2, timing->reg_3);
-+	NV_DEBUG(dev, "         2a0: %08x %08x %08x %08x\n",
-+		 timing->reg_4, timing->reg_5,
-+		 timing->reg_6, timing->reg_7);
-+}
-+
-+/**
-+ * Processes the Memory Timing BIOS table, stores generated
-+ * register values
-+ * @pre init scripts were run, memtiming regs are initialized
-+ */
- void
- nouveau_mem_timing_init(struct drm_device *dev)
- {
--	/* cards < NVC0 only */
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
- 	struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
- 	struct nouveau_pm_memtimings *memtimings = &pm->memtimings;
- 	struct nvbios *bios = &dev_priv->vbios;
- 	struct bit_entry P;
--	u8 tUNK_0, tUNK_1, tUNK_2;
--	u8 tRP;		/* Byte 3 */
--	u8 tRAS;	/* Byte 5 */
--	u8 tRFC;	/* Byte 7 */
--	u8 tRC;		/* Byte 9 */
--	u8 tUNK_10, tUNK_11, tUNK_12, tUNK_13, tUNK_14;
--	u8 tUNK_18, tUNK_19, tUNK_20, tUNK_21;
--	u8 magic_number = 0; /* Yeah... sorry*/
--	u8 *mem = NULL, *entry;
--	int i, recordlen, entries;
-+	struct nouveau_pm_tbl_header *hdr = NULL;
-+	uint8_t magic_number;
-+	u8 *entry;
-+	int i;
- 
- 	if (bios->type == NVBIOS_BIT) {
- 		if (bit_table(dev, 'P', &P))
- 			return;
- 
- 		if (P.version == 1)
--			mem = ROMPTR(bios, P.data[4]);
-+			hdr = (struct nouveau_pm_tbl_header *) ROMPTR(bios, P.data[4]);
- 		else
- 		if (P.version == 2)
--			mem = ROMPTR(bios, P.data[8]);
-+			hdr = (struct nouveau_pm_tbl_header *) ROMPTR(bios, P.data[8]);
- 		else {
- 			NV_WARN(dev, "unknown mem for BIT P %d\n", P.version);
- 		}
-@@ -541,150 +650,56 @@ nouveau_mem_timing_init(struct drm_device *dev)
- 		return;
- 	}
- 
--	if (!mem) {
-+	if (!hdr) {
- 		NV_DEBUG(dev, "memory timing table pointer invalid\n");
- 		return;
- 	}
- 
--	if (mem[0] != 0x10) {
--		NV_WARN(dev, "memory timing table 0x%02x unknown\n", mem[0]);
-+	if (hdr->version != 0x10) {
-+		NV_WARN(dev, "memory timing table 0x%02x unknown\n", hdr->version);
- 		return;
- 	}
- 
- 	/* validate record length */
--	entries   = mem[2];
--	recordlen = mem[3];
--	if (recordlen < 15) {
--		NV_ERROR(dev, "mem timing table length unknown: %d\n", mem[3]);
-+	if (hdr->entry_len < 15) {
-+		NV_ERROR(dev, "mem timing table length unknown: %d\n", hdr->entry_len);
- 		return;
- 	}
- 
- 	/* parse vbios entries into common format */
- 	memtimings->timing =
--		kcalloc(entries, sizeof(*memtimings->timing), GFP_KERNEL);
-+		kcalloc(hdr->entry_cnt, sizeof(*memtimings->timing), GFP_KERNEL);
- 	if (!memtimings->timing)
- 		return;
- 
- 	/* Get "some number" from the timing reg for NV_40 and NV_50
--	 * Used in calculations later */
--	if (dev_priv->card_type >= NV_40 && dev_priv->chipset < 0x98) {
-+	 * Used in calculations later... source unknown */
-+	magic_number = 0;
-+	if (P.version == 1) {
- 		magic_number = (nv_rd32(dev, 0x100228) & 0x0f000000) >> 24;
- 	}
- 
--	entry = mem + mem[1];
--	for (i = 0; i < entries; i++, entry += recordlen) {
-+	entry = (u8*) hdr + hdr->header_len;
-+	for (i = 0; i < hdr->entry_cnt; i++, entry += hdr->entry_len) {
- 		struct nouveau_pm_memtiming *timing = &pm->memtimings.timing[i];
- 		if (entry[0] == 0)
- 			continue;
- 
--		tUNK_18 = 1;
--		tUNK_19 = 1;
--		tUNK_20 = 0;
--		tUNK_21 = 0;
--		switch (min(recordlen, 22)) {
--		case 22:
--			tUNK_21 = entry[21];
--		case 21:
--			tUNK_20 = entry[20];
--		case 20:
--			tUNK_19 = entry[19];
--		case 19:
--			tUNK_18 = entry[18];
--		default:
--			tUNK_0  = entry[0];
--			tUNK_1  = entry[1];
--			tUNK_2  = entry[2];
--			tRP     = entry[3];
--			tRAS    = entry[5];
--			tRFC    = entry[7];
--			tRC     = entry[9];
--			tUNK_10 = entry[10];
--			tUNK_11 = entry[11];
--			tUNK_12 = entry[12];
--			tUNK_13 = entry[13];
--			tUNK_14 = entry[14];
--			break;
--		}
--
--		timing->reg_100220 = (tRC << 24 | tRFC << 16 | tRAS << 8 | tRP);
--
--		/* XXX: I don't trust the -1's and +1's... they must come
--		 *      from somewhere! */
--		timing->reg_100224 = (tUNK_0 + tUNK_19 + 1 + magic_number) << 24 |
--				      max(tUNK_18, (u8) 1) << 16 |
--				      (tUNK_1 + tUNK_19 + 1 + magic_number) << 8;
--		if (dev_priv->chipset == 0xa8) {
--			timing->reg_100224 |= (tUNK_2 - 1);
--		} else {
--			timing->reg_100224 |= (tUNK_2 + 2 - magic_number);
--		}
--
--		timing->reg_100228 = (tUNK_12 << 16 | tUNK_11 << 8 | tUNK_10);
--		if (dev_priv->chipset >= 0xa3 && dev_priv->chipset < 0xaa)
--			timing->reg_100228 |= (tUNK_19 - 1) << 24;
--		else
--			timing->reg_100228 |= magic_number << 24;
--
--		if (dev_priv->card_type == NV_40) {
--			/* NV40: don't know what the rest of the regs are..
--			 * And don't need to know either */
--			timing->reg_100228 |= 0x20200000;
--		} else if (dev_priv->card_type >= NV_50) {
--			if (dev_priv->chipset < 0x98 ||
--			    (dev_priv->chipset == 0x98 &&
--			     dev_priv->stepping <= 0xa1)) {
--				timing->reg_10022c = (0x14 + tUNK_2) << 24 |
--						     0x16 << 16 |
--						     (tUNK_2 - 1) << 8 |
--						     (tUNK_2 - 1);
--			} else {
--				/* XXX: reg_10022c for recentish cards */
--				timing->reg_10022c = tUNK_2 - 1;
--			}
--
--			timing->reg_100230 = (tUNK_20 << 24 | tUNK_21 << 16 |
--						  tUNK_13 << 8  | tUNK_13);
--
--			timing->reg_100234 = (tRAS << 24 | tRC);
--			timing->reg_100234 += max(tUNK_10, tUNK_11) << 16;
--
--			if (dev_priv->chipset < 0x98 ||
--			    (dev_priv->chipset == 0x98 &&
--			     dev_priv->stepping <= 0xa1)) {
--				timing->reg_100234 |= (tUNK_2 + 2) << 8;
--			} else {
--				/* XXX: +6? */
--				timing->reg_100234 |= (tUNK_19 + 6) << 8;
--			}
--
--			/* XXX; reg_100238
--			 * reg_100238: 0x00?????? */
--			timing->reg_10023c = 0x202;
--			if (dev_priv->chipset < 0x98 ||
--			    (dev_priv->chipset == 0x98 &&
--			     dev_priv->stepping <= 0xa1)) {
--				timing->reg_10023c |= 0x4000000 | (tUNK_2 - 1) << 16;
--			} else {
--				/* XXX: reg_10023c
--				 * currently unknown
--				 * 10023c seen as 06xxxxxx, 0bxxxxxx or 0fxxxxxx */
--			}
--
--			/* XXX: reg_100240? */
--		}
- 		timing->id = i;
-+		timing->WR = entry[0];
-+		timing->CL = entry[2];
- 
--		NV_DEBUG(dev, "Entry %d: 220: %08x %08x %08x %08x\n", i,
--			 timing->reg_100220, timing->reg_100224,
--			 timing->reg_100228, timing->reg_10022c);
--		NV_DEBUG(dev, "         230: %08x %08x %08x %08x\n",
--			 timing->reg_100230, timing->reg_100234,
--			 timing->reg_100238, timing->reg_10023c);
--		NV_DEBUG(dev, "         240: %08x\n", timing->reg_100240);
-+		if(dev_priv->card_type <= NV_40) {
-+			nv40_mem_timing_entry(dev,hdr,(struct nouveau_pm_tbl_entry*) entry,magic_number,&pm->memtimings.timing[i]);
-+		} else if(dev_priv->card_type == NV_50){
-+			nv50_mem_timing_entry(dev,&P,hdr,(struct nouveau_pm_tbl_entry*) entry,magic_number,&pm->memtimings.timing[i]);
-+		} else if(dev_priv->card_type == NV_C0) {
-+			nvc0_mem_timing_entry(dev,hdr,(struct nouveau_pm_tbl_entry*) entry,&pm->memtimings.timing[i]);
-+		}
- 	}
- 
--	memtimings->nr_timing = entries;
--	memtimings->supported = (dev_priv->chipset <= 0x98);
-+	memtimings->nr_timing = hdr->entry_cnt;
-+	memtimings->supported = P.version == 1;
- }
- 
- void
-@@ -693,7 +708,10 @@ nouveau_mem_timing_fini(struct drm_device *dev)
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
- 	struct nouveau_pm_memtimings *mem = &dev_priv->engine.pm.memtimings;
- 
--	kfree(mem->timing);
-+	if(mem->timing) {
-+		kfree(mem->timing);
-+		mem->timing = NULL;
-+	}
- }
- 
- static int
-diff --git a/drivers/gpu/drm/nouveau/nouveau_mm.c b/drivers/gpu/drm/nouveau/nouveau_mm.c
-index 1640dec..b29ffb3 100644
---- a/drivers/gpu/drm/nouveau/nouveau_mm.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_mm.c
-@@ -27,7 +27,7 @@
- #include "nouveau_mm.h"
- 
- static inline void
--region_put(struct nouveau_mm *rmm, struct nouveau_mm_node *a)
-+region_put(struct nouveau_mm *mm, struct nouveau_mm_node *a)
- {
- 	list_del(&a->nl_entry);
- 	list_del(&a->fl_entry);
-@@ -35,7 +35,7 @@ region_put(struct nouveau_mm *rmm, struct nouveau_mm_node *a)
- }
- 
- static struct nouveau_mm_node *
--region_split(struct nouveau_mm *rmm, struct nouveau_mm_node *a, u32 size)
-+region_split(struct nouveau_mm *mm, struct nouveau_mm_node *a, u32 size)
- {
- 	struct nouveau_mm_node *b;
- 
-@@ -57,33 +57,33 @@ region_split(struct nouveau_mm *rmm, struct nouveau_mm_node *a, u32 size)
- 	return b;
- }
- 
--#define node(root, dir) ((root)->nl_entry.dir == &rmm->nodes) ? NULL : \
-+#define node(root, dir) ((root)->nl_entry.dir == &mm->nodes) ? NULL : \
- 	list_entry((root)->nl_entry.dir, struct nouveau_mm_node, nl_entry)
- 
- void
--nouveau_mm_put(struct nouveau_mm *rmm, struct nouveau_mm_node *this)
-+nouveau_mm_put(struct nouveau_mm *mm, struct nouveau_mm_node *this)
- {
- 	struct nouveau_mm_node *prev = node(this, prev);
- 	struct nouveau_mm_node *next = node(this, next);
- 
--	list_add(&this->fl_entry, &rmm->free);
-+	list_add(&this->fl_entry, &mm->free);
- 	this->type = 0;
- 
- 	if (prev && prev->type == 0) {
- 		prev->length += this->length;
--		region_put(rmm, this);
-+		region_put(mm, this);
- 		this = prev;
- 	}
- 
- 	if (next && next->type == 0) {
- 		next->offset  = this->offset;
- 		next->length += this->length;
--		region_put(rmm, this);
-+		region_put(mm, this);
- 	}
- }
- 
- int
--nouveau_mm_get(struct nouveau_mm *rmm, int type, u32 size, u32 size_nc,
-+nouveau_mm_get(struct nouveau_mm *mm, int type, u32 size, u32 size_nc,
- 	       u32 align, struct nouveau_mm_node **pnode)
- {
- 	struct nouveau_mm_node *prev, *this, *next;
-@@ -92,17 +92,17 @@ nouveau_mm_get(struct nouveau_mm *rmm, int type, u32 size, u32 size_nc,
- 	u32 splitoff;
- 	u32 s, e;
- 
--	list_for_each_entry(this, &rmm->free, fl_entry) {
-+	list_for_each_entry(this, &mm->free, fl_entry) {
- 		e = this->offset + this->length;
- 		s = this->offset;
- 
- 		prev = node(this, prev);
- 		if (prev && prev->type != type)
--			s = roundup(s, rmm->block_size);
-+			s = roundup(s, mm->block_size);
- 
- 		next = node(this, next);
- 		if (next && next->type != type)
--			e = rounddown(e, rmm->block_size);
-+			e = rounddown(e, mm->block_size);
- 
- 		s  = (s + align_mask) & ~align_mask;
- 		e &= ~align_mask;
-@@ -110,10 +110,10 @@ nouveau_mm_get(struct nouveau_mm *rmm, int type, u32 size, u32 size_nc,
- 			continue;
- 
- 		splitoff = s - this->offset;
--		if (splitoff && !region_split(rmm, this, splitoff))
-+		if (splitoff && !region_split(mm, this, splitoff))
- 			return -ENOMEM;
- 
--		this = region_split(rmm, this, min(size, e - s));
-+		this = region_split(mm, this, min(size, e - s));
- 		if (!this)
- 			return -ENOMEM;
- 
-@@ -127,52 +127,49 @@ nouveau_mm_get(struct nouveau_mm *rmm, int type, u32 size, u32 size_nc,
- }
- 
- int
--nouveau_mm_init(struct nouveau_mm **prmm, u32 offset, u32 length, u32 block)
-+nouveau_mm_init(struct nouveau_mm *mm, u32 offset, u32 length, u32 block)
- {
--	struct nouveau_mm *rmm;
--	struct nouveau_mm_node *heap;
-+	struct nouveau_mm_node *node;
- 
--	heap = kzalloc(sizeof(*heap), GFP_KERNEL);
--	if (!heap)
--		return -ENOMEM;
--	heap->offset = roundup(offset, block);
--	heap->length = rounddown(offset + length, block) - heap->offset;
-+	if (block) {
-+		mutex_init(&mm->mutex);
-+		INIT_LIST_HEAD(&mm->nodes);
-+		INIT_LIST_HEAD(&mm->free);
-+		mm->block_size = block;
-+		mm->heap_nodes = 0;
-+	}
- 
--	rmm = kzalloc(sizeof(*rmm), GFP_KERNEL);
--	if (!rmm) {
--		kfree(heap);
-+	node = kzalloc(sizeof(*node), GFP_KERNEL);
-+	if (!node)
- 		return -ENOMEM;
--	}
--	rmm->block_size = block;
--	mutex_init(&rmm->mutex);
--	INIT_LIST_HEAD(&rmm->nodes);
--	INIT_LIST_HEAD(&rmm->free);
--	list_add(&heap->nl_entry, &rmm->nodes);
--	list_add(&heap->fl_entry, &rmm->free);
-+	node->offset = roundup(offset, mm->block_size);
-+	node->length = rounddown(offset + length, mm->block_size) - node->offset;
- 
--	*prmm = rmm;
-+	list_add_tail(&node->nl_entry, &mm->nodes);
-+	list_add_tail(&node->fl_entry, &mm->free);
-+	mm->heap_nodes++;
- 	return 0;
- }
- 
- int
--nouveau_mm_fini(struct nouveau_mm **prmm)
-+nouveau_mm_fini(struct nouveau_mm *mm)
- {
--	struct nouveau_mm *rmm = *prmm;
- 	struct nouveau_mm_node *node, *heap =
--		list_first_entry(&rmm->nodes, struct nouveau_mm_node, nl_entry);
-+		list_first_entry(&mm->nodes, struct nouveau_mm_node, nl_entry);
-+	int nodes = 0;
- 
--	if (!list_is_singular(&rmm->nodes)) {
--		printk(KERN_ERR "nouveau_mm not empty at destroy time!\n");
--		list_for_each_entry(node, &rmm->nodes, nl_entry) {
--			printk(KERN_ERR "0x%02x: 0x%08x 0x%08x\n",
--			       node->type, node->offset, node->length);
-+	list_for_each_entry(node, &mm->nodes, nl_entry) {
-+		if (nodes++ == mm->heap_nodes) {
-+			printk(KERN_ERR "nouveau_mm in use at destroy time!\n");
-+			list_for_each_entry(node, &mm->nodes, nl_entry) {
-+				printk(KERN_ERR "0x%02x: 0x%08x 0x%08x\n",
-+				       node->type, node->offset, node->length);
-+			}
-+			WARN_ON(1);
-+			return -EBUSY;
- 		}
--		WARN_ON(1);
--		return -EBUSY;
- 	}
- 
- 	kfree(heap);
--	kfree(rmm);
--	*prmm = NULL;
- 	return 0;
- }
-diff --git a/drivers/gpu/drm/nouveau/nouveau_mm.h b/drivers/gpu/drm/nouveau/nouveau_mm.h
-index b9c016d..57a600c 100644
---- a/drivers/gpu/drm/nouveau/nouveau_mm.h
-+++ b/drivers/gpu/drm/nouveau/nouveau_mm.h
-@@ -42,10 +42,11 @@ struct nouveau_mm {
- 	struct mutex mutex;
- 
- 	u32 block_size;
-+	int heap_nodes;
- };
- 
--int  nouveau_mm_init(struct nouveau_mm **, u32 offset, u32 length, u32 block);
--int  nouveau_mm_fini(struct nouveau_mm **);
-+int  nouveau_mm_init(struct nouveau_mm *, u32 offset, u32 length, u32 block);
-+int  nouveau_mm_fini(struct nouveau_mm *);
- int  nouveau_mm_pre(struct nouveau_mm *);
- int  nouveau_mm_get(struct nouveau_mm *, int type, u32 size, u32 size_nc,
- 		    u32 align, struct nouveau_mm_node **);
-diff --git a/drivers/gpu/drm/nouveau/nouveau_object.c b/drivers/gpu/drm/nouveau/nouveau_object.c
-index 159b7c4..02222c5 100644
---- a/drivers/gpu/drm/nouveau/nouveau_object.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_object.c
-@@ -693,6 +693,7 @@ nouveau_gpuobj_channel_init_pramin(struct nouveau_channel *chan)
- static int
- nvc0_gpuobj_channel_init(struct nouveau_channel *chan, struct nouveau_vm *vm)
- {
-+	struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
- 	struct drm_device *dev = chan->dev;
- 	struct nouveau_gpuobj *pgd = NULL;
- 	struct nouveau_vm_pgd *vpgd;
-@@ -722,6 +723,9 @@ nvc0_gpuobj_channel_init(struct nouveau_channel *chan, struct nouveau_vm *vm)
- 	nv_wo32(chan->ramin, 0x020c, 0x000000ff);
- 
- 	/* map display semaphore buffers into channel's vm */
-+	if (dev_priv->card_type >= NV_D0)
-+		return 0;
-+
- 	for (i = 0; i < 2; i++) {
- 		struct nv50_display_crtc *dispc = &nv50_display(dev)->crtc[i];
- 
-@@ -746,7 +750,7 @@ nouveau_gpuobj_channel_init(struct nouveau_channel *chan,
- 	int ret, i;
- 
- 	NV_DEBUG(dev, "ch%d vram=0x%08x tt=0x%08x\n", chan->id, vram_h, tt_h);
--	if (dev_priv->card_type == NV_C0)
-+	if (dev_priv->card_type >= NV_C0)
- 		return nvc0_gpuobj_channel_init(chan, vm);
- 
- 	/* Allocate a chunk of memory for per-channel object storage */
-@@ -793,7 +797,7 @@ nouveau_gpuobj_channel_init(struct nouveau_channel *chan,
- 			return ret;
- 
- 		/* dma objects for display sync channel semaphore blocks */
--		for (i = 0; i < 2; i++) {
-+		for (i = 0; i < dev->mode_config.num_crtc; i++) {
- 			struct nouveau_gpuobj *sem = NULL;
- 			struct nv50_display_crtc *dispc =
- 				&nv50_display(dev)->crtc[i];
-@@ -875,18 +879,18 @@ nouveau_gpuobj_channel_takedown(struct nouveau_channel *chan)
- 
- 	NV_DEBUG(dev, "ch%d\n", chan->id);
- 
--	if (dev_priv->card_type >= NV_50) {
-+	if (dev_priv->card_type >= NV_50 && dev_priv->card_type <= NV_C0) {
- 		struct nv50_display *disp = nv50_display(dev);
- 
--		for (i = 0; i < 2; i++) {
-+		for (i = 0; i < dev->mode_config.num_crtc; i++) {
- 			struct nv50_display_crtc *dispc = &disp->crtc[i];
- 			nouveau_bo_vma_del(dispc->sem.bo, &chan->dispc_vma[i]);
- 		}
--
--		nouveau_vm_ref(NULL, &chan->vm, chan->vm_pd);
--		nouveau_gpuobj_ref(NULL, &chan->vm_pd);
- 	}
- 
-+	nouveau_vm_ref(NULL, &chan->vm, chan->vm_pd);
-+	nouveau_gpuobj_ref(NULL, &chan->vm_pd);
-+
- 	if (drm_mm_initialized(&chan->ramin_heap))
- 		drm_mm_takedown(&chan->ramin_heap);
- 	nouveau_gpuobj_ref(NULL, &chan->ramin);
-diff --git a/drivers/gpu/drm/nouveau/nouveau_perf.c b/drivers/gpu/drm/nouveau/nouveau_perf.c
-index ef9dec0..9f178aa 100644
---- a/drivers/gpu/drm/nouveau/nouveau_perf.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_perf.c
-@@ -127,13 +127,57 @@ nouveau_perf_timing(struct drm_device *dev, struct bit_entry *P,
- 
- 	entry += ramcfg * recordlen;
- 	if (entry[1] >= pm->memtimings.nr_timing) {
--		NV_WARN(dev, "timingset %d does not exist\n", entry[1]);
-+		if (entry[1] != 0xff)
-+			NV_WARN(dev, "timingset %d does not exist\n", entry[1]);
- 		return NULL;
- 	}
- 
- 	return &pm->memtimings.timing[entry[1]];
- }
- 
-+static void
-+nouveau_perf_voltage(struct drm_device *dev, struct bit_entry *P,
-+		     struct nouveau_pm_level *perflvl)
-+{
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nvbios *bios = &dev_priv->vbios;
-+	u8 *vmap;
-+	int id;
-+
-+	id = perflvl->volt_min;
-+	perflvl->volt_min = 0;
-+
-+	/* boards using voltage table version <0x40 store the voltage
-+	 * level directly in the perflvl entry as a multiple of 10mV
-+	 */
-+	if (dev_priv->engine.pm.voltage.version < 0x40) {
-+		perflvl->volt_min = id * 10000;
-+		perflvl->volt_max = perflvl->volt_min;
-+		return;
-+	}
-+
-+	/* on newer ones, the perflvl stores an index into yet another
-+	 * vbios table containing a min/max voltage value for the perflvl
-+	 */
-+	if (P->version != 2 || P->length < 34) {
-+		NV_DEBUG(dev, "where's our volt map table ptr? %d %d\n",
-+			 P->version, P->length);
-+		return;
-+	}
-+
-+	vmap = ROMPTR(bios, P->data[32]);
-+	if (!vmap) {
-+		NV_DEBUG(dev, "volt map table pointer invalid\n");
-+		return;
-+	}
-+
-+	if (id < vmap[3]) {
-+		vmap += vmap[1] + (vmap[2] * id);
-+		perflvl->volt_min = ROM32(vmap[0]);
-+		perflvl->volt_max = ROM32(vmap[4]);
-+	}
-+}
-+
- void
- nouveau_perf_init(struct drm_device *dev)
- {
-@@ -141,6 +185,8 @@ nouveau_perf_init(struct drm_device *dev)
- 	struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
- 	struct nvbios *bios = &dev_priv->vbios;
- 	struct bit_entry P;
-+	struct nouveau_pm_memtimings *memtimings = &pm->memtimings;
-+	struct nouveau_pm_tbl_header mt_hdr;
- 	u8 version, headerlen, recordlen, entries;
- 	u8 *perf, *entry;
- 	int vid, i;
-@@ -188,6 +234,22 @@ nouveau_perf_init(struct drm_device *dev)
- 	}
- 
- 	entry = perf + headerlen;
-+
-+	/* For version 0x15, initialize memtiming table */
-+	if(version == 0x15) {
-+		memtimings->timing =
-+				kcalloc(entries, sizeof(*memtimings->timing), GFP_KERNEL);
-+		if(!memtimings) {
-+			NV_WARN(dev,"Could not allocate memtiming table\n");
-+			return;
-+		}
-+
-+		mt_hdr.entry_cnt = entries;
-+		mt_hdr.entry_len = 14;
-+		mt_hdr.version = version;
-+		mt_hdr.header_len = 4;
-+	}
-+
- 	for (i = 0; i < entries; i++) {
- 		struct nouveau_pm_level *perflvl = &pm->perflvl[pm->nr_perflvl];
- 
-@@ -203,7 +265,8 @@ nouveau_perf_init(struct drm_device *dev)
- 		case 0x13:
- 		case 0x15:
- 			perflvl->fanspeed = entry[55];
--			perflvl->voltage = (recordlen > 56) ? entry[56] : 0;
-+			if (recordlen > 56)
-+				perflvl->volt_min = entry[56];
- 			perflvl->core = ROM32(entry[1]) * 10;
- 			perflvl->memory = ROM32(entry[5]) * 20;
- 			break;
-@@ -211,9 +274,10 @@ nouveau_perf_init(struct drm_device *dev)
- 		case 0x23:
- 		case 0x24:
- 			perflvl->fanspeed = entry[4];
--			perflvl->voltage = entry[5];
--			perflvl->core = ROM16(entry[6]) * 1000;
--
-+			perflvl->volt_min = entry[5];
-+			perflvl->shader = ROM16(entry[6]) * 1000;
-+			perflvl->core = perflvl->shader;
-+			perflvl->core += (signed char)entry[8] * 1000;
- 			if (dev_priv->chipset == 0x49 ||
- 			    dev_priv->chipset == 0x4b)
- 				perflvl->memory = ROM16(entry[11]) * 1000;
-@@ -223,7 +287,7 @@ nouveau_perf_init(struct drm_device *dev)
- 			break;
- 		case 0x25:
- 			perflvl->fanspeed = entry[4];
--			perflvl->voltage = entry[5];
-+			perflvl->volt_min = entry[5];
- 			perflvl->core = ROM16(entry[6]) * 1000;
- 			perflvl->shader = ROM16(entry[10]) * 1000;
- 			perflvl->memory = ROM16(entry[12]) * 1000;
-@@ -232,7 +296,7 @@ nouveau_perf_init(struct drm_device *dev)
- 			perflvl->memscript = ROM16(entry[2]);
- 		case 0x35:
- 			perflvl->fanspeed = entry[6];
--			perflvl->voltage = entry[7];
-+			perflvl->volt_min = entry[7];
- 			perflvl->core = ROM16(entry[8]) * 1000;
- 			perflvl->shader = ROM16(entry[10]) * 1000;
- 			perflvl->memory = ROM16(entry[12]) * 1000;
-@@ -240,30 +304,34 @@ nouveau_perf_init(struct drm_device *dev)
- 			perflvl->unk05 = ROM16(entry[16]) * 1000;
- 			break;
- 		case 0x40:
--#define subent(n) entry[perf[2] + ((n) * perf[3])]
-+#define subent(n) (ROM16(entry[perf[2] + ((n) * perf[3])]) & 0xfff) * 1000
- 			perflvl->fanspeed = 0; /*XXX*/
--			perflvl->voltage = entry[2];
-+			perflvl->volt_min = entry[2];
- 			if (dev_priv->card_type == NV_50) {
--				perflvl->core = ROM16(subent(0)) & 0xfff;
--				perflvl->shader = ROM16(subent(1)) & 0xfff;
--				perflvl->memory = ROM16(subent(2)) & 0xfff;
-+				perflvl->core   = subent(0);
-+				perflvl->shader = subent(1);
-+				perflvl->memory = subent(2);
-+				perflvl->vdec   = subent(3);
-+				perflvl->unka0  = subent(4);
- 			} else {
--				perflvl->shader = ROM16(subent(3)) & 0xfff;
-+				perflvl->hub06  = subent(0);
-+				perflvl->hub01  = subent(1);
-+				perflvl->copy   = subent(2);
-+				perflvl->shader = subent(3);
-+				perflvl->rop    = subent(4);
-+				perflvl->memory = subent(5);
-+				perflvl->vdec   = subent(6);
-+				perflvl->daemon = subent(10);
-+				perflvl->hub07  = subent(11);
- 				perflvl->core   = perflvl->shader / 2;
--				perflvl->unk0a  = ROM16(subent(4)) & 0xfff;
--				perflvl->memory = ROM16(subent(5)) & 0xfff;
- 			}
--
--			perflvl->core *= 1000;
--			perflvl->shader *= 1000;
--			perflvl->memory *= 1000;
--			perflvl->unk0a *= 1000;
- 			break;
- 		}
- 
- 		/* make sure vid is valid */
--		if (pm->voltage.supported && perflvl->voltage) {
--			vid = nouveau_volt_vid_lookup(dev, perflvl->voltage);
-+		nouveau_perf_voltage(dev, &P, perflvl);
-+		if (pm->voltage.supported && perflvl->volt_min) {
-+			vid = nouveau_volt_vid_lookup(dev, perflvl->volt_min);
- 			if (vid < 0) {
- 				NV_DEBUG(dev, "drop perflvl %d, bad vid\n", i);
- 				entry += recordlen;
-@@ -272,7 +340,11 @@ nouveau_perf_init(struct drm_device *dev)
- 		}
- 
- 		/* get the corresponding memory timings */
--		if (version > 0x15) {
-+		if (version == 0x15) {
-+			memtimings->timing[i].id = i;
-+			nv30_mem_timing_entry(dev,&mt_hdr,(struct nouveau_pm_tbl_entry*) &entry[41],0,&memtimings->timing[i]);
-+			perflvl->timing = &memtimings->timing[i];
-+		} else if (version > 0x15) {
- 			/* last 3 args are for < 0x40, ignored for >= 0x40 */
- 			perflvl->timing =
- 				nouveau_perf_timing(dev, &P,
-diff --git a/drivers/gpu/drm/nouveau/nouveau_pm.c b/drivers/gpu/drm/nouveau/nouveau_pm.c
-index da8d994..a539fd2 100644
---- a/drivers/gpu/drm/nouveau/nouveau_pm.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_pm.c
-@@ -64,18 +64,26 @@ nouveau_pm_perflvl_set(struct drm_device *dev, struct nouveau_pm_level *perflvl)
- 	if (perflvl == pm->cur)
- 		return 0;
- 
--	if (pm->voltage.supported && pm->voltage_set && perflvl->voltage) {
--		ret = pm->voltage_set(dev, perflvl->voltage);
-+	if (pm->voltage.supported && pm->voltage_set && perflvl->volt_min) {
-+		ret = pm->voltage_set(dev, perflvl->volt_min);
- 		if (ret) {
- 			NV_ERROR(dev, "voltage_set %d failed: %d\n",
--				 perflvl->voltage, ret);
-+				 perflvl->volt_min, ret);
- 		}
- 	}
- 
--	nouveau_pm_clock_set(dev, perflvl, PLL_CORE, perflvl->core);
--	nouveau_pm_clock_set(dev, perflvl, PLL_SHADER, perflvl->shader);
--	nouveau_pm_clock_set(dev, perflvl, PLL_MEMORY, perflvl->memory);
--	nouveau_pm_clock_set(dev, perflvl, PLL_UNK05, perflvl->unk05);
-+	if (pm->clocks_pre) {
-+		void *state = pm->clocks_pre(dev, perflvl);
-+		if (IS_ERR(state))
-+			return PTR_ERR(state);
-+		pm->clocks_set(dev, state);
-+	} else
-+	if (pm->clock_set) {
-+		nouveau_pm_clock_set(dev, perflvl, PLL_CORE, perflvl->core);
-+		nouveau_pm_clock_set(dev, perflvl, PLL_SHADER, perflvl->shader);
-+		nouveau_pm_clock_set(dev, perflvl, PLL_MEMORY, perflvl->memory);
-+		nouveau_pm_clock_set(dev, perflvl, PLL_UNK05, perflvl->unk05);
-+	}
- 
- 	pm->cur = perflvl;
- 	return 0;
-@@ -92,9 +100,6 @@ nouveau_pm_profile_set(struct drm_device *dev, const char *profile)
- 	if (nouveau_perflvl_wr != 7777)
- 		return -EPERM;
- 
--	if (!pm->clock_set)
--		return -EINVAL;
--
- 	if (!strncmp(profile, "boot", 4))
- 		perflvl = &pm->boot;
- 	else {
-@@ -123,31 +128,37 @@ nouveau_pm_perflvl_get(struct drm_device *dev, struct nouveau_pm_level *perflvl)
- 	struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
- 	int ret;
- 
--	if (!pm->clock_get)
--		return -EINVAL;
--
- 	memset(perflvl, 0, sizeof(*perflvl));
- 
--	ret = pm->clock_get(dev, PLL_CORE);
--	if (ret > 0)
--		perflvl->core = ret;
-+	if (pm->clocks_get) {
-+		ret = pm->clocks_get(dev, perflvl);
-+		if (ret)
-+			return ret;
-+	} else
-+	if (pm->clock_get) {
-+		ret = pm->clock_get(dev, PLL_CORE);
-+		if (ret > 0)
-+			perflvl->core = ret;
- 
--	ret = pm->clock_get(dev, PLL_MEMORY);
--	if (ret > 0)
--		perflvl->memory = ret;
-+		ret = pm->clock_get(dev, PLL_MEMORY);
-+		if (ret > 0)
-+			perflvl->memory = ret;
- 
--	ret = pm->clock_get(dev, PLL_SHADER);
--	if (ret > 0)
--		perflvl->shader = ret;
-+		ret = pm->clock_get(dev, PLL_SHADER);
-+		if (ret > 0)
-+			perflvl->shader = ret;
- 
--	ret = pm->clock_get(dev, PLL_UNK05);
--	if (ret > 0)
--		perflvl->unk05 = ret;
-+		ret = pm->clock_get(dev, PLL_UNK05);
-+		if (ret > 0)
-+			perflvl->unk05 = ret;
-+	}
- 
- 	if (pm->voltage.supported && pm->voltage_get) {
- 		ret = pm->voltage_get(dev);
--		if (ret > 0)
--			perflvl->voltage = ret;
-+		if (ret > 0) {
-+			perflvl->volt_min = ret;
-+			perflvl->volt_max = ret;
-+		}
- 	}
- 
- 	return 0;
-@@ -156,7 +167,7 @@ nouveau_pm_perflvl_get(struct drm_device *dev, struct nouveau_pm_level *perflvl)
- static void
- nouveau_pm_perflvl_info(struct nouveau_pm_level *perflvl, char *ptr, int len)
- {
--	char c[16], s[16], v[16], f[16], t[16];
-+	char c[16], s[16], v[32], f[16], t[16], m[16];
- 
- 	c[0] = '\0';
- 	if (perflvl->core)
-@@ -166,9 +177,19 @@ nouveau_pm_perflvl_info(struct nouveau_pm_level *perflvl, char *ptr, int len)
- 	if (perflvl->shader)
- 		snprintf(s, sizeof(s), " shader %dMHz", perflvl->shader / 1000);
- 
-+	m[0] = '\0';
-+	if (perflvl->memory)
-+		snprintf(m, sizeof(m), " memory %dMHz", perflvl->memory / 1000);
-+
- 	v[0] = '\0';
--	if (perflvl->voltage)
--		snprintf(v, sizeof(v), " voltage %dmV", perflvl->voltage * 10);
-+	if (perflvl->volt_min && perflvl->volt_min != perflvl->volt_max) {
-+		snprintf(v, sizeof(v), " voltage %dmV-%dmV",
-+			 perflvl->volt_min / 1000, perflvl->volt_max / 1000);
-+	} else
-+	if (perflvl->volt_min) {
-+		snprintf(v, sizeof(v), " voltage %dmV",
-+			 perflvl->volt_min / 1000);
-+	}
- 
- 	f[0] = '\0';
- 	if (perflvl->fanspeed)
-@@ -178,8 +199,7 @@ nouveau_pm_perflvl_info(struct nouveau_pm_level *perflvl, char *ptr, int len)
- 	if (perflvl->timing)
- 		snprintf(t, sizeof(t), " timing %d", perflvl->timing->id);
- 
--	snprintf(ptr, len, "memory %dMHz%s%s%s%s%s\n", perflvl->memory / 1000,
--		 c, s, v, f, t);
-+	snprintf(ptr, len, "%s%s%s%s%s%s\n", c, s, m, t, v, f);
- }
- 
- static ssize_t
-@@ -190,7 +210,7 @@ nouveau_pm_get_perflvl_info(struct device *d,
- 	char *ptr = buf;
- 	int len = PAGE_SIZE;
- 
--	snprintf(ptr, len, "%d: ", perflvl->id);
-+	snprintf(ptr, len, "%d:", perflvl->id);
- 	ptr += strlen(buf);
- 	len -= strlen(buf);
- 
-@@ -211,9 +231,9 @@ nouveau_pm_get_perflvl(struct device *d, struct device_attribute *a, char *buf)
- 	if (!pm->cur)
- 		snprintf(ptr, len, "setting: boot\n");
- 	else if (pm->cur == &pm->boot)
--		snprintf(ptr, len, "setting: boot\nc: ");
-+		snprintf(ptr, len, "setting: boot\nc:");
- 	else
--		snprintf(ptr, len, "setting: static %d\nc: ", pm->cur->id);
-+		snprintf(ptr, len, "setting: static %d\nc:", pm->cur->id);
- 	ptr += strlen(buf);
- 	len -= strlen(buf);
- 
-@@ -292,7 +312,7 @@ nouveau_sysfs_fini(struct drm_device *dev)
- 	}
- }
- 
--#ifdef CONFIG_HWMON
-+#if defined(CONFIG_HWMON) || (defined(MODULE) && defined(CONFIG_HWMON_MODULE))
- static ssize_t
- nouveau_hwmon_show_temp(struct device *d, struct device_attribute *a, char *buf)
- {
-@@ -409,7 +429,7 @@ static const struct attribute_group hwmon_attrgroup = {
- static int
- nouveau_hwmon_init(struct drm_device *dev)
- {
--#ifdef CONFIG_HWMON
-+#if defined(CONFIG_HWMON) || (defined(MODULE) && defined(CONFIG_HWMON_MODULE))
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
- 	struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
- 	struct device *hwmon_dev;
-@@ -442,7 +462,7 @@ nouveau_hwmon_init(struct drm_device *dev)
- static void
- nouveau_hwmon_fini(struct drm_device *dev)
- {
--#ifdef CONFIG_HWMON
-+#if defined(CONFIG_HWMON) || (defined(MODULE) && defined(CONFIG_HWMON_MODULE))
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
- 	struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
- 
-@@ -488,7 +508,7 @@ nouveau_pm_init(struct drm_device *dev)
- 	NV_INFO(dev, "%d available performance level(s)\n", pm->nr_perflvl);
- 	for (i = 0; i < pm->nr_perflvl; i++) {
- 		nouveau_pm_perflvl_info(&pm->perflvl[i], info, sizeof(info));
--		NV_INFO(dev, "%d: %s", pm->perflvl[i].id, info);
-+		NV_INFO(dev, "%d:%s", pm->perflvl[i].id, info);
- 	}
- 
- 	/* determine current ("boot") performance level */
-@@ -498,7 +518,7 @@ nouveau_pm_init(struct drm_device *dev)
- 		pm->cur = &pm->boot;
- 
- 		nouveau_pm_perflvl_info(&pm->boot, info, sizeof(info));
--		NV_INFO(dev, "c: %s", info);
-+		NV_INFO(dev, "c:%s", info);
- 	}
- 
- 	/* switch performance levels now if requested */
-diff --git a/drivers/gpu/drm/nouveau/nouveau_pm.h b/drivers/gpu/drm/nouveau/nouveau_pm.h
-index 4a9838dd..8ac02cd 100644
---- a/drivers/gpu/drm/nouveau/nouveau_pm.h
-+++ b/drivers/gpu/drm/nouveau/nouveau_pm.h
-@@ -52,6 +52,11 @@ void *nv04_pm_clock_pre(struct drm_device *, struct nouveau_pm_level *,
- 			u32 id, int khz);
- void nv04_pm_clock_set(struct drm_device *, void *);
- 
-+/* nv40_pm.c */
-+int nv40_pm_clocks_get(struct drm_device *, struct nouveau_pm_level *);
-+void *nv40_pm_clocks_pre(struct drm_device *, struct nouveau_pm_level *);
-+void nv40_pm_clocks_set(struct drm_device *, void *);
-+
- /* nv50_pm.c */
- int nv50_pm_clock_get(struct drm_device *, u32 id);
- void *nv50_pm_clock_pre(struct drm_device *, struct nouveau_pm_level *,
-@@ -59,10 +64,12 @@ void *nv50_pm_clock_pre(struct drm_device *, struct nouveau_pm_level *,
- void nv50_pm_clock_set(struct drm_device *, void *);
- 
- /* nva3_pm.c */
--int nva3_pm_clock_get(struct drm_device *, u32 id);
--void *nva3_pm_clock_pre(struct drm_device *, struct nouveau_pm_level *,
--			u32 id, int khz);
--void nva3_pm_clock_set(struct drm_device *, void *);
-+int nva3_pm_clocks_get(struct drm_device *, struct nouveau_pm_level *);
-+void *nva3_pm_clocks_pre(struct drm_device *, struct nouveau_pm_level *);
-+void nva3_pm_clocks_set(struct drm_device *, void *);
-+
-+/* nvc0_pm.c */
-+int nvc0_pm_clocks_get(struct drm_device *, struct nouveau_pm_level *);
- 
- /* nouveau_temp.c */
- void nouveau_temp_init(struct drm_device *dev);
-diff --git a/drivers/gpu/drm/nouveau/nouveau_reg.h b/drivers/gpu/drm/nouveau/nouveau_reg.h
-index f18cdfc..43a96b9 100644
---- a/drivers/gpu/drm/nouveau/nouveau_reg.h
-+++ b/drivers/gpu/drm/nouveau/nouveau_reg.h
-@@ -826,9 +826,12 @@
- #define NV50_PDISPLAY_SOR_DPMS_STATE_ACTIVE                          0x00030000
- #define NV50_PDISPLAY_SOR_DPMS_STATE_BLANKED                         0x00080000
- #define NV50_PDISPLAY_SOR_DPMS_STATE_WAIT                            0x10000000
--#define NV50_PDISPLAY_SOR_BACKLIGHT                                  0x0061c084
--#define NV50_PDISPLAY_SOR_BACKLIGHT_ENABLE                           0x80000000
--#define NV50_PDISPLAY_SOR_BACKLIGHT_LEVEL                            0x00000fff
-+#define NV50_PDISP_SOR_PWM_DIV(i)                     (0x0061c080 + (i) * 0x800)
-+#define NV50_PDISP_SOR_PWM_CTL(i)                     (0x0061c084 + (i) * 0x800)
-+#define NV50_PDISP_SOR_PWM_CTL_NEW                                   0x80000000
-+#define NVA3_PDISP_SOR_PWM_CTL_UNK                                   0x40000000
-+#define NV50_PDISP_SOR_PWM_CTL_VAL                                   0x000007ff
-+#define NVA3_PDISP_SOR_PWM_CTL_VAL                                   0x00ffffff
- #define NV50_SOR_DP_CTRL(i, l)           (0x0061c10c + (i) * 0x800 + (l) * 0x80)
- #define NV50_SOR_DP_CTRL_ENABLED                                     0x00000001
- #define NV50_SOR_DP_CTRL_ENHANCED_FRAME_ENABLED                      0x00004000
-@@ -843,7 +846,7 @@
- #define NV50_SOR_DP_CTRL_TRAINING_PATTERN_2                          0x02000000
- #define NV50_SOR_DP_UNK118(i, l)         (0x0061c118 + (i) * 0x800 + (l) * 0x80)
- #define NV50_SOR_DP_UNK120(i, l)         (0x0061c120 + (i) * 0x800 + (l) * 0x80)
--#define NV50_SOR_DP_UNK128(i, l)         (0x0061c128 + (i) * 0x800 + (l) * 0x80)
-+#define NV50_SOR_DP_SCFG(i, l)           (0x0061c128 + (i) * 0x800 + (l) * 0x80)
- #define NV50_SOR_DP_UNK130(i, l)         (0x0061c130 + (i) * 0x800 + (l) * 0x80)
- 
- #define NV50_PDISPLAY_USER(i)                        ((i) * 0x1000 + 0x00640000)
-diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
-index 2706cb3..c8a463b 100644
---- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
-@@ -12,8 +12,8 @@ struct nouveau_sgdma_be {
- 	struct drm_device *dev;
- 
- 	dma_addr_t *pages;
--	bool *ttm_alloced;
- 	unsigned nr_pages;
-+	bool unmap_pages;
- 
- 	u64 offset;
- 	bool bound;
-@@ -26,43 +26,28 @@ nouveau_sgdma_populate(struct ttm_backend *be, unsigned long num_pages,
- {
- 	struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
- 	struct drm_device *dev = nvbe->dev;
-+	int i;
- 
- 	NV_DEBUG(nvbe->dev, "num_pages = %ld\n", num_pages);
- 
--	if (nvbe->pages)
--		return -EINVAL;
--
--	nvbe->pages = kmalloc(sizeof(dma_addr_t) * num_pages, GFP_KERNEL);
--	if (!nvbe->pages)
--		return -ENOMEM;
-+	nvbe->pages = dma_addrs;
-+	nvbe->nr_pages = num_pages;
-+	nvbe->unmap_pages = true;
- 
--	nvbe->ttm_alloced = kmalloc(sizeof(bool) * num_pages, GFP_KERNEL);
--	if (!nvbe->ttm_alloced) {
--		kfree(nvbe->pages);
--		nvbe->pages = NULL;
--		return -ENOMEM;
-+	/* this code path isn't called and is incorrect anyways */
-+	if (0) { /* dma_addrs[0] != DMA_ERROR_CODE) { */
-+		nvbe->unmap_pages = false;
-+		return 0;
- 	}
- 
--	nvbe->nr_pages = 0;
--	while (num_pages--) {
--		/* this code path isn't called and is incorrect anyways */
--		if (0) { /*dma_addrs[nvbe->nr_pages] != DMA_ERROR_CODE)*/
--			nvbe->pages[nvbe->nr_pages] =
--					dma_addrs[nvbe->nr_pages];
--		 	nvbe->ttm_alloced[nvbe->nr_pages] = true;
--		} else {
--			nvbe->pages[nvbe->nr_pages] =
--				pci_map_page(dev->pdev, pages[nvbe->nr_pages], 0,
--				     PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
--			if (pci_dma_mapping_error(dev->pdev,
--						  nvbe->pages[nvbe->nr_pages])) {
--				be->func->clear(be);
--				return -EFAULT;
--			}
--			nvbe->ttm_alloced[nvbe->nr_pages] = false;
-+	for (i = 0; i < num_pages; i++) {
-+		nvbe->pages[i] = pci_map_page(dev->pdev, pages[i], 0,
-+					      PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
-+		if (pci_dma_mapping_error(dev->pdev, nvbe->pages[i])) {
-+			nvbe->nr_pages = --i;
-+			be->func->clear(be);
-+			return -EFAULT;
- 		}
--
--		nvbe->nr_pages++;
- 	}
- 
- 	return 0;
-@@ -72,26 +57,20 @@ static void
- nouveau_sgdma_clear(struct ttm_backend *be)
- {
- 	struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
--	struct drm_device *dev;
--
--	if (nvbe && nvbe->pages) {
--		dev = nvbe->dev;
--		NV_DEBUG(dev, "\n");
-+	struct drm_device *dev = nvbe->dev;
- 
--		if (nvbe->bound)
--			be->func->unbind(be);
-+	if (nvbe->bound)
-+		be->func->unbind(be);
- 
-+	if (nvbe->unmap_pages) {
- 		while (nvbe->nr_pages--) {
--			if (!nvbe->ttm_alloced[nvbe->nr_pages])
--				pci_unmap_page(dev->pdev, nvbe->pages[nvbe->nr_pages],
-+			pci_unmap_page(dev->pdev, nvbe->pages[nvbe->nr_pages],
- 				       PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
- 		}
--		kfree(nvbe->pages);
--		kfree(nvbe->ttm_alloced);
--		nvbe->pages = NULL;
--		nvbe->ttm_alloced = NULL;
--		nvbe->nr_pages = 0;
-+		nvbe->unmap_pages = false;
- 	}
-+
-+	nvbe->pages = NULL;
- }
- 
- static void
-diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
-index 10656e4..82478e0 100644
---- a/drivers/gpu/drm/nouveau/nouveau_state.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
-@@ -286,9 +286,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
- 		engine->gpio.get		= nv10_gpio_get;
- 		engine->gpio.set		= nv10_gpio_set;
- 		engine->gpio.irq_enable		= NULL;
--		engine->pm.clock_get		= nv04_pm_clock_get;
--		engine->pm.clock_pre		= nv04_pm_clock_pre;
--		engine->pm.clock_set		= nv04_pm_clock_set;
-+		engine->pm.clocks_get		= nv40_pm_clocks_get;
-+		engine->pm.clocks_pre		= nv40_pm_clocks_pre;
-+		engine->pm.clocks_set		= nv40_pm_clocks_set;
- 		engine->pm.voltage_get		= nouveau_voltage_gpio_get;
- 		engine->pm.voltage_set		= nouveau_voltage_gpio_set;
- 		engine->pm.temp_get		= nv40_temp_get;
-@@ -299,7 +299,7 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
- 	case 0x50:
- 	case 0x80: /* gotta love NVIDIA's consistency.. */
- 	case 0x90:
--	case 0xA0:
-+	case 0xa0:
- 		engine->instmem.init		= nv50_instmem_init;
- 		engine->instmem.takedown	= nv50_instmem_takedown;
- 		engine->instmem.suspend		= nv50_instmem_suspend;
-@@ -359,9 +359,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
- 			engine->pm.clock_set	= nv50_pm_clock_set;
- 			break;
- 		default:
--			engine->pm.clock_get	= nva3_pm_clock_get;
--			engine->pm.clock_pre	= nva3_pm_clock_pre;
--			engine->pm.clock_set	= nva3_pm_clock_set;
-+			engine->pm.clocks_get	= nva3_pm_clocks_get;
-+			engine->pm.clocks_pre	= nva3_pm_clocks_pre;
-+			engine->pm.clocks_set	= nva3_pm_clocks_set;
- 			break;
- 		}
- 		engine->pm.voltage_get		= nouveau_voltage_gpio_get;
-@@ -376,7 +376,7 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
- 		engine->vram.put		= nv50_vram_del;
- 		engine->vram.flags_valid	= nv50_vram_flags_valid;
- 		break;
--	case 0xC0:
-+	case 0xc0:
- 		engine->instmem.init		= nvc0_instmem_init;
- 		engine->instmem.takedown	= nvc0_instmem_takedown;
- 		engine->instmem.suspend		= nvc0_instmem_suspend;
-@@ -422,12 +422,73 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
- 		engine->vram.put		= nv50_vram_del;
- 		engine->vram.flags_valid	= nvc0_vram_flags_valid;
- 		engine->pm.temp_get		= nv84_temp_get;
-+		engine->pm.clocks_get		= nvc0_pm_clocks_get;
-+		engine->pm.voltage_get		= nouveau_voltage_gpio_get;
-+		engine->pm.voltage_set		= nouveau_voltage_gpio_set;
-+		break;
-+	case 0xd0:
-+		engine->instmem.init		= nvc0_instmem_init;
-+		engine->instmem.takedown	= nvc0_instmem_takedown;
-+		engine->instmem.suspend		= nvc0_instmem_suspend;
-+		engine->instmem.resume		= nvc0_instmem_resume;
-+		engine->instmem.get		= nv50_instmem_get;
-+		engine->instmem.put		= nv50_instmem_put;
-+		engine->instmem.map		= nv50_instmem_map;
-+		engine->instmem.unmap		= nv50_instmem_unmap;
-+		engine->instmem.flush		= nv84_instmem_flush;
-+		engine->mc.init			= nv50_mc_init;
-+		engine->mc.takedown		= nv50_mc_takedown;
-+		engine->timer.init		= nv04_timer_init;
-+		engine->timer.read		= nv04_timer_read;
-+		engine->timer.takedown		= nv04_timer_takedown;
-+		engine->fb.init			= nvc0_fb_init;
-+		engine->fb.takedown		= nvc0_fb_takedown;
-+		engine->fifo.channels		= 128;
-+		engine->fifo.init		= nvc0_fifo_init;
-+		engine->fifo.takedown		= nvc0_fifo_takedown;
-+		engine->fifo.disable		= nvc0_fifo_disable;
-+		engine->fifo.enable		= nvc0_fifo_enable;
-+		engine->fifo.reassign		= nvc0_fifo_reassign;
-+		engine->fifo.channel_id		= nvc0_fifo_channel_id;
-+		engine->fifo.create_context	= nvc0_fifo_create_context;
-+		engine->fifo.destroy_context	= nvc0_fifo_destroy_context;
-+		engine->fifo.load_context	= nvc0_fifo_load_context;
-+		engine->fifo.unload_context	= nvc0_fifo_unload_context;
-+		engine->display.early_init	= nouveau_stub_init;
-+		engine->display.late_takedown	= nouveau_stub_takedown;
-+		engine->display.create		= nvd0_display_create;
-+		engine->display.init		= nvd0_display_init;
-+		engine->display.destroy		= nvd0_display_destroy;
-+		engine->gpio.init		= nv50_gpio_init;
-+		engine->gpio.takedown		= nouveau_stub_takedown;
-+		engine->gpio.get		= nvd0_gpio_get;
-+		engine->gpio.set		= nvd0_gpio_set;
-+		engine->gpio.irq_register	= nv50_gpio_irq_register;
-+		engine->gpio.irq_unregister	= nv50_gpio_irq_unregister;
-+		engine->gpio.irq_enable		= nv50_gpio_irq_enable;
-+		engine->vram.init		= nvc0_vram_init;
-+		engine->vram.takedown		= nv50_vram_fini;
-+		engine->vram.get		= nvc0_vram_new;
-+		engine->vram.put		= nv50_vram_del;
-+		engine->vram.flags_valid	= nvc0_vram_flags_valid;
-+		engine->pm.clocks_get		= nvc0_pm_clocks_get;
-+		engine->pm.voltage_get		= nouveau_voltage_gpio_get;
-+		engine->pm.voltage_set		= nouveau_voltage_gpio_set;
- 		break;
- 	default:
- 		NV_ERROR(dev, "NV%02x unsupported\n", dev_priv->chipset);
- 		return 1;
- 	}
- 
-+	/* headless mode */
-+	if (nouveau_modeset == 2) {
-+		engine->display.early_init = nouveau_stub_init;
-+		engine->display.late_takedown = nouveau_stub_takedown;
-+		engine->display.create = nouveau_stub_init;
-+		engine->display.init = nouveau_stub_init;
-+		engine->display.destroy = nouveau_stub_takedown;
-+	}
-+
- 	return 0;
- }
- 
-@@ -449,21 +510,6 @@ nouveau_vga_set_decode(void *priv, bool state)
- 		return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
- }
- 
--static int
--nouveau_card_init_channel(struct drm_device *dev)
--{
--	struct drm_nouveau_private *dev_priv = dev->dev_private;
--	int ret;
--
--	ret = nouveau_channel_alloc(dev, &dev_priv->channel, NULL,
--				    NvDmaFB, NvDmaTT);
--	if (ret)
--		return ret;
--
--	mutex_unlock(&dev_priv->channel->mutex);
--	return 0;
--}
--
- static void nouveau_switcheroo_set_state(struct pci_dev *pdev,
- 					 enum vga_switcheroo_state state)
- {
-@@ -630,8 +676,11 @@ nouveau_card_init(struct drm_device *dev)
- 			break;
- 		}
- 
--		if (dev_priv->card_type == NV_40)
--			nv40_mpeg_create(dev);
-+		if (dev_priv->card_type == NV_40 ||
-+		    dev_priv->chipset == 0x31 ||
-+		    dev_priv->chipset == 0x34 ||
-+		    dev_priv->chipset == 0x36)
-+			nv31_mpeg_create(dev);
- 		else
- 		if (dev_priv->card_type == NV_50 &&
- 		    (dev_priv->chipset < 0x98 || dev_priv->chipset == 0xa0))
-@@ -651,41 +700,69 @@ nouveau_card_init(struct drm_device *dev)
- 			goto out_engine;
- 	}
- 
--	ret = engine->display.create(dev);
-+	ret = nouveau_irq_init(dev);
- 	if (ret)
- 		goto out_fifo;
- 
--	ret = drm_vblank_init(dev, nv_two_heads(dev) ? 2 : 1);
--	if (ret)
--		goto out_vblank;
-+	/* initialise general modesetting */
-+	drm_mode_config_init(dev);
-+	drm_mode_create_scaling_mode_property(dev);
-+	drm_mode_create_dithering_property(dev);
-+	dev->mode_config.funcs = (void *)&nouveau_mode_config_funcs;
-+	dev->mode_config.fb_base = pci_resource_start(dev->pdev, 1);
-+	dev->mode_config.min_width = 0;
-+	dev->mode_config.min_height = 0;
-+	if (dev_priv->card_type < NV_10) {
-+		dev->mode_config.max_width = 2048;
-+		dev->mode_config.max_height = 2048;
-+	} else
-+	if (dev_priv->card_type < NV_50) {
-+		dev->mode_config.max_width = 4096;
-+		dev->mode_config.max_height = 4096;
-+	} else {
-+		dev->mode_config.max_width = 8192;
-+		dev->mode_config.max_height = 8192;
-+	}
- 
--	ret = nouveau_irq_init(dev);
-+	ret = engine->display.create(dev);
- 	if (ret)
--		goto out_vblank;
-+		goto out_irq;
- 
--	/* what about PVIDEO/PCRTC/PRAMDAC etc? */
-+	nouveau_backlight_init(dev);
- 
- 	if (dev_priv->eng[NVOBJ_ENGINE_GR]) {
- 		ret = nouveau_fence_init(dev);
- 		if (ret)
--			goto out_irq;
-+			goto out_disp;
- 
--		ret = nouveau_card_init_channel(dev);
-+		ret = nouveau_channel_alloc(dev, &dev_priv->channel, NULL,
-+					    NvDmaFB, NvDmaTT);
- 		if (ret)
- 			goto out_fence;
-+
-+		mutex_unlock(&dev_priv->channel->mutex);
-+	}
-+
-+	if (dev->mode_config.num_crtc) {
-+		ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
-+		if (ret)
-+			goto out_chan;
-+
-+		nouveau_fbcon_init(dev);
-+		drm_kms_helper_poll_init(dev);
- 	}
- 
--	nouveau_fbcon_init(dev);
--	drm_kms_helper_poll_init(dev);
- 	return 0;
- 
-+out_chan:
-+	nouveau_channel_put_unlocked(&dev_priv->channel);
- out_fence:
- 	nouveau_fence_fini(dev);
-+out_disp:
-+	nouveau_backlight_exit(dev);
-+	engine->display.destroy(dev);
- out_irq:
- 	nouveau_irq_fini(dev);
--out_vblank:
--	drm_vblank_cleanup(dev);
--	engine->display.destroy(dev);
- out_fifo:
- 	if (!dev_priv->noaccel)
- 		engine->fifo.takedown(dev);
-@@ -732,15 +809,20 @@ static void nouveau_card_takedown(struct drm_device *dev)
- 	struct nouveau_engine *engine = &dev_priv->engine;
- 	int e;
- 
--	drm_kms_helper_poll_fini(dev);
--	nouveau_fbcon_fini(dev);
-+	if (dev->mode_config.num_crtc) {
-+		drm_kms_helper_poll_fini(dev);
-+		nouveau_fbcon_fini(dev);
-+		drm_vblank_cleanup(dev);
-+	}
- 
- 	if (dev_priv->channel) {
- 		nouveau_channel_put_unlocked(&dev_priv->channel);
- 		nouveau_fence_fini(dev);
- 	}
- 
-+	nouveau_backlight_exit(dev);
- 	engine->display.destroy(dev);
-+	drm_mode_config_cleanup(dev);
- 
- 	if (!dev_priv->noaccel) {
- 		engine->fifo.takedown(dev);
-@@ -774,7 +856,6 @@ static void nouveau_card_takedown(struct drm_device *dev)
- 	engine->vram.takedown(dev);
- 
- 	nouveau_irq_fini(dev);
--	drm_vblank_cleanup(dev);
- 
- 	nouveau_pm_fini(dev);
- 	nouveau_bios_takedown(dev);
-@@ -907,7 +988,7 @@ static int nouveau_remove_conflicting_drivers(struct drm_device *dev)
- int nouveau_load(struct drm_device *dev, unsigned long flags)
- {
- 	struct drm_nouveau_private *dev_priv;
--	uint32_t reg0;
-+	uint32_t reg0, strap;
- 	resource_size_t mmio_start_offs;
- 	int ret;
- 
-@@ -951,13 +1032,11 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
- 
- 	/* Time to determine the card architecture */
- 	reg0 = nv_rd32(dev, NV03_PMC_BOOT_0);
--	dev_priv->stepping = 0; /* XXX: add stepping for pre-NV10? */
- 
- 	/* We're dealing with >=NV10 */
- 	if ((reg0 & 0x0f000000) > 0) {
- 		/* Bit 27-20 contain the architecture in hex */
- 		dev_priv->chipset = (reg0 & 0xff00000) >> 20;
--		dev_priv->stepping = (reg0 & 0xff);
- 	/* NV04 or NV05 */
- 	} else if ((reg0 & 0xff00fff0) == 0x20004000) {
- 		if (reg0 & 0x00f00000)
-@@ -987,6 +1066,9 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
- 	case 0xc0:
- 		dev_priv->card_type = NV_C0;
- 		break;
-+	case 0xd0:
-+		dev_priv->card_type = NV_D0;
-+		break;
- 	default:
- 		NV_INFO(dev, "Unsupported chipset 0x%08x\n", reg0);
- 		ret = -EINVAL;
-@@ -996,6 +1078,23 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
- 	NV_INFO(dev, "Detected an NV%2x generation card (0x%08x)\n",
- 		dev_priv->card_type, reg0);
- 
-+	/* determine frequency of timing crystal */
-+	strap = nv_rd32(dev, 0x101000);
-+	if ( dev_priv->chipset < 0x17 ||
-+	    (dev_priv->chipset >= 0x20 && dev_priv->chipset <= 0x25))
-+		strap &= 0x00000040;
-+	else
-+		strap &= 0x00400040;
-+
-+	switch (strap) {
-+	case 0x00000000: dev_priv->crystal = 13500; break;
-+	case 0x00000040: dev_priv->crystal = 14318; break;
-+	case 0x00400000: dev_priv->crystal = 27000; break;
-+	case 0x00400040: dev_priv->crystal = 25000; break;
-+	}
-+
-+	NV_DEBUG(dev, "crystal freq: %dKHz\n", dev_priv->crystal);
-+
- 	/* Determine whether we'll attempt acceleration or not, some
- 	 * cards are disabled by default here due to them being known
- 	 * non-functional, or never been tested due to lack of hw.
-@@ -1030,7 +1129,7 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
- 			ioremap(pci_resource_start(dev->pdev, ramin_bar),
- 				dev_priv->ramin_size);
- 		if (!dev_priv->ramin) {
--			NV_ERROR(dev, "Failed to PRAMIN BAR");
-+			NV_ERROR(dev, "Failed to map PRAMIN BAR\n");
- 			ret = -ENOMEM;
- 			goto err_mmio;
- 		}
-@@ -1130,7 +1229,7 @@ int nouveau_ioctl_getparam(struct drm_device *dev, void *data,
- 		getparam->value = 1;
- 		break;
- 	case NOUVEAU_GETPARAM_HAS_PAGEFLIP:
--		getparam->value = 1;
-+		getparam->value = dev_priv->card_type < NV_D0;
- 		break;
- 	case NOUVEAU_GETPARAM_GRAPH_UNITS:
- 		/* NV40 and NV50 versions are quite different, but register
-@@ -1198,6 +1297,23 @@ nouveau_wait_ne(struct drm_device *dev, uint64_t timeout,
- 	return false;
- }
- 
-+/* Wait until cond(data) == true, up until timeout has hit */
-+bool
-+nouveau_wait_cb(struct drm_device *dev, u64 timeout,
-+		bool (*cond)(void *), void *data)
-+{
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
-+	u64 start = ptimer->read(dev);
-+
-+	do {
-+		if (cond(data) == true)
-+			return true;
-+	} while (ptimer->read(dev) - start < timeout);
-+
-+	return false;
-+}
-+
- /* Waits for PGRAPH to go completely idle */
- bool nouveau_wait_for_idle(struct drm_device *dev)
- {
-diff --git a/drivers/gpu/drm/nouveau/nouveau_vm.c b/drivers/gpu/drm/nouveau/nouveau_vm.c
-index 244fd38..ef0832b 100644
---- a/drivers/gpu/drm/nouveau/nouveau_vm.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_vm.c
-@@ -172,9 +172,9 @@ nouveau_vm_unmap_pgt(struct nouveau_vm *vm, int big, u32 fpde, u32 lpde)
- 			vm->map_pgt(vpgd->obj, pde, vpgt->obj);
- 		}
- 
--		mutex_unlock(&vm->mm->mutex);
-+		mutex_unlock(&vm->mm.mutex);
- 		nouveau_gpuobj_ref(NULL, &pgt);
--		mutex_lock(&vm->mm->mutex);
-+		mutex_lock(&vm->mm.mutex);
- 	}
- }
- 
-@@ -191,18 +191,18 @@ nouveau_vm_map_pgt(struct nouveau_vm *vm, u32 pde, u32 type)
- 	pgt_size  = (1 << (vm->pgt_bits + 12)) >> type;
- 	pgt_size *= 8;
- 
--	mutex_unlock(&vm->mm->mutex);
-+	mutex_unlock(&vm->mm.mutex);
- 	ret = nouveau_gpuobj_new(vm->dev, NULL, pgt_size, 0x1000,
- 				 NVOBJ_FLAG_ZERO_ALLOC, &pgt);
--	mutex_lock(&vm->mm->mutex);
-+	mutex_lock(&vm->mm.mutex);
- 	if (unlikely(ret))
- 		return ret;
- 
- 	/* someone beat us to filling the PDE while we didn't have the lock */
- 	if (unlikely(vpgt->refcount[big]++)) {
--		mutex_unlock(&vm->mm->mutex);
-+		mutex_unlock(&vm->mm.mutex);
- 		nouveau_gpuobj_ref(NULL, &pgt);
--		mutex_lock(&vm->mm->mutex);
-+		mutex_lock(&vm->mm.mutex);
- 		return 0;
- 	}
- 
-@@ -223,10 +223,10 @@ nouveau_vm_get(struct nouveau_vm *vm, u64 size, u32 page_shift,
- 	u32 fpde, lpde, pde;
- 	int ret;
- 
--	mutex_lock(&vm->mm->mutex);
--	ret = nouveau_mm_get(vm->mm, page_shift, msize, 0, align, &vma->node);
-+	mutex_lock(&vm->mm.mutex);
-+	ret = nouveau_mm_get(&vm->mm, page_shift, msize, 0, align, &vma->node);
- 	if (unlikely(ret != 0)) {
--		mutex_unlock(&vm->mm->mutex);
-+		mutex_unlock(&vm->mm.mutex);
- 		return ret;
- 	}
- 
-@@ -245,13 +245,13 @@ nouveau_vm_get(struct nouveau_vm *vm, u64 size, u32 page_shift,
- 		if (ret) {
- 			if (pde != fpde)
- 				nouveau_vm_unmap_pgt(vm, big, fpde, pde - 1);
--			nouveau_mm_put(vm->mm, vma->node);
--			mutex_unlock(&vm->mm->mutex);
-+			nouveau_mm_put(&vm->mm, vma->node);
-+			mutex_unlock(&vm->mm.mutex);
- 			vma->node = NULL;
- 			return ret;
- 		}
- 	}
--	mutex_unlock(&vm->mm->mutex);
-+	mutex_unlock(&vm->mm.mutex);
- 
- 	vma->vm     = vm;
- 	vma->offset = (u64)vma->node->offset << 12;
-@@ -270,11 +270,11 @@ nouveau_vm_put(struct nouveau_vma *vma)
- 	fpde = (vma->node->offset >> vm->pgt_bits);
- 	lpde = (vma->node->offset + vma->node->length - 1) >> vm->pgt_bits;
- 
--	mutex_lock(&vm->mm->mutex);
-+	mutex_lock(&vm->mm.mutex);
- 	nouveau_vm_unmap_pgt(vm, vma->node->type != vm->spg_shift, fpde, lpde);
--	nouveau_mm_put(vm->mm, vma->node);
-+	nouveau_mm_put(&vm->mm, vma->node);
- 	vma->node = NULL;
--	mutex_unlock(&vm->mm->mutex);
-+	mutex_unlock(&vm->mm.mutex);
- }
- 
- int
-@@ -306,7 +306,7 @@ nouveau_vm_new(struct drm_device *dev, u64 offset, u64 length, u64 mm_offset,
- 			block = length;
- 
- 	} else
--	if (dev_priv->card_type == NV_C0) {
-+	if (dev_priv->card_type >= NV_C0) {
- 		vm->map_pgt = nvc0_vm_map_pgt;
- 		vm->map = nvc0_vm_map;
- 		vm->map_sg = nvc0_vm_map_sg;
-@@ -360,11 +360,11 @@ nouveau_vm_link(struct nouveau_vm *vm, struct nouveau_gpuobj *pgd)
- 
- 	nouveau_gpuobj_ref(pgd, &vpgd->obj);
- 
--	mutex_lock(&vm->mm->mutex);
-+	mutex_lock(&vm->mm.mutex);
- 	for (i = vm->fpde; i <= vm->lpde; i++)
- 		vm->map_pgt(pgd, i, vm->pgt[i - vm->fpde].obj);
- 	list_add(&vpgd->head, &vm->pgd_list);
--	mutex_unlock(&vm->mm->mutex);
-+	mutex_unlock(&vm->mm.mutex);
- 	return 0;
- }
- 
-@@ -377,7 +377,7 @@ nouveau_vm_unlink(struct nouveau_vm *vm, struct nouveau_gpuobj *mpgd)
- 	if (!mpgd)
- 		return;
- 
--	mutex_lock(&vm->mm->mutex);
-+	mutex_lock(&vm->mm.mutex);
- 	list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) {
- 		if (vpgd->obj == mpgd) {
- 			pgd = vpgd->obj;
-@@ -386,7 +386,7 @@ nouveau_vm_unlink(struct nouveau_vm *vm, struct nouveau_gpuobj *mpgd)
- 			break;
- 		}
- 	}
--	mutex_unlock(&vm->mm->mutex);
-+	mutex_unlock(&vm->mm.mutex);
- 
- 	nouveau_gpuobj_ref(NULL, &pgd);
- }
-diff --git a/drivers/gpu/drm/nouveau/nouveau_vm.h b/drivers/gpu/drm/nouveau/nouveau_vm.h
-index 579ca8c..6ce995f 100644
---- a/drivers/gpu/drm/nouveau/nouveau_vm.h
-+++ b/drivers/gpu/drm/nouveau/nouveau_vm.h
-@@ -51,7 +51,7 @@ struct nouveau_vma {
- 
- struct nouveau_vm {
- 	struct drm_device *dev;
--	struct nouveau_mm *mm;
-+	struct nouveau_mm mm;
- 	int refcount;
- 
- 	struct list_head pgd_list;
-diff --git a/drivers/gpu/drm/nouveau/nouveau_volt.c b/drivers/gpu/drm/nouveau/nouveau_volt.c
-index 75e87274..86d03e1 100644
---- a/drivers/gpu/drm/nouveau/nouveau_volt.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_volt.c
-@@ -27,7 +27,7 @@
- #include "nouveau_drv.h"
- #include "nouveau_pm.h"
- 
--static const enum dcb_gpio_tag vidtag[] = { 0x04, 0x05, 0x06, 0x1a };
-+static const enum dcb_gpio_tag vidtag[] = { 0x04, 0x05, 0x06, 0x1a, 0x73 };
- static int nr_vidtag = sizeof(vidtag) / sizeof(vidtag[0]);
- 
- int
-@@ -170,6 +170,13 @@ nouveau_volt_init(struct drm_device *dev)
- 		 */
- 		vidshift  = 2;
- 		break;
-+	case 0x40:
-+		headerlen = volt[1];
-+		recordlen = volt[2];
-+		entries   = volt[3]; /* not a clue what the entries are for.. */
-+		vidmask   = volt[11]; /* guess.. */
-+		vidshift  = 0;
-+		break;
- 	default:
- 		NV_WARN(dev, "voltage table 0x%02x unknown\n", volt[0]);
- 		return;
-@@ -197,16 +204,37 @@ nouveau_volt_init(struct drm_device *dev)
- 	}
- 
- 	/* parse vbios entries into common format */
--	voltage->level = kcalloc(entries, sizeof(*voltage->level), GFP_KERNEL);
--	if (!voltage->level)
--		return;
-+	voltage->version = volt[0];
-+	if (voltage->version < 0x40) {
-+		voltage->nr_level = entries;
-+		voltage->level =
-+			kcalloc(entries, sizeof(*voltage->level), GFP_KERNEL);
-+		if (!voltage->level)
-+			return;
- 
--	entry = volt + headerlen;
--	for (i = 0; i < entries; i++, entry += recordlen) {
--		voltage->level[i].voltage = entry[0];
--		voltage->level[i].vid     = entry[1] >> vidshift;
-+		entry = volt + headerlen;
-+		for (i = 0; i < entries; i++, entry += recordlen) {
-+			voltage->level[i].voltage = entry[0] * 10000;
-+			voltage->level[i].vid     = entry[1] >> vidshift;
-+		}
-+	} else {
-+		u32 volt_uv = ROM32(volt[4]);
-+		s16 step_uv = ROM16(volt[8]);
-+		u8 vid;
-+
-+		voltage->nr_level = voltage->vid_mask + 1;
-+		voltage->level = kcalloc(voltage->nr_level,
-+					 sizeof(*voltage->level), GFP_KERNEL);
-+		if (!voltage->level)
-+			return;
-+
-+		for (vid = 0; vid <= voltage->vid_mask; vid++) {
-+			voltage->level[vid].voltage = volt_uv;
-+			voltage->level[vid].vid = vid;
-+			volt_uv += step_uv;
-+		}
- 	}
--	voltage->nr_level  = entries;
-+
- 	voltage->supported = true;
- }
- 
-diff --git a/drivers/gpu/drm/nouveau/nv04_display.c b/drivers/gpu/drm/nouveau/nv04_display.c
-index 1715e14..6bd8518 100644
---- a/drivers/gpu/drm/nouveau/nv04_display.c
-+++ b/drivers/gpu/drm/nouveau/nv04_display.c
-@@ -126,27 +126,6 @@ nv04_display_create(struct drm_device *dev)
- 
- 	nouveau_hw_save_vga_fonts(dev, 1);
- 
--	drm_mode_config_init(dev);
--	drm_mode_create_scaling_mode_property(dev);
--	drm_mode_create_dithering_property(dev);
--
--	dev->mode_config.funcs = (void *)&nouveau_mode_config_funcs;
--
--	dev->mode_config.min_width = 0;
--	dev->mode_config.min_height = 0;
--	switch (dev_priv->card_type) {
--	case NV_04:
--		dev->mode_config.max_width = 2048;
--		dev->mode_config.max_height = 2048;
--		break;
--	default:
--		dev->mode_config.max_width = 4096;
--		dev->mode_config.max_height = 4096;
--		break;
--	}
--
--	dev->mode_config.fb_base = dev_priv->fb_phys;
--
- 	nv04_crtc_create(dev, 0);
- 	if (nv_two_heads(dev))
- 		nv04_crtc_create(dev, 1);
-@@ -235,8 +214,6 @@ nv04_display_destroy(struct drm_device *dev)
- 	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
- 		crtc->funcs->restore(crtc);
- 
--	drm_mode_config_cleanup(dev);
--
- 	nouveau_hw_save_vga_fonts(dev, 0);
- }
- 
-diff --git a/drivers/gpu/drm/nouveau/nv04_pm.c b/drivers/gpu/drm/nouveau/nv04_pm.c
-index eb1c70d..9ae92a8 100644
---- a/drivers/gpu/drm/nouveau/nv04_pm.c
-+++ b/drivers/gpu/drm/nouveau/nv04_pm.c
-@@ -68,6 +68,7 @@ void
- nv04_pm_clock_set(struct drm_device *dev, void *pre_state)
- {
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
- 	struct nv04_pm_state *state = pre_state;
- 	u32 reg = state->pll.reg;
- 
-@@ -85,6 +86,9 @@ nv04_pm_clock_set(struct drm_device *dev, void *pre_state)
- 		nv_mask(dev, 0x1002c0, 0, 1 << 8);
- 	}
- 
-+	if (reg == NV_PRAMDAC_NVPLL_COEFF)
-+		ptimer->init(dev);
-+
- 	kfree(state);
- }
- 
-diff --git a/drivers/gpu/drm/nouveau/nv04_timer.c b/drivers/gpu/drm/nouveau/nv04_timer.c
-index 1d09ddd..263301b 100644
---- a/drivers/gpu/drm/nouveau/nv04_timer.c
-+++ b/drivers/gpu/drm/nouveau/nv04_timer.c
-@@ -6,43 +6,75 @@
- int
- nv04_timer_init(struct drm_device *dev)
- {
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	u32 m, n, d;
-+
- 	nv_wr32(dev, NV04_PTIMER_INTR_EN_0, 0x00000000);
- 	nv_wr32(dev, NV04_PTIMER_INTR_0, 0xFFFFFFFF);
- 
--	/* Just use the pre-existing values when possible for now; these regs
--	 * are not written in nv (driver writer missed a /4 on the address), and
--	 * writing 8 and 3 to the correct regs breaks the timings on the LVDS
--	 * hardware sequencing microcode.
--	 * A correct solution (involving calculations with the GPU PLL) can
--	 * be done when kernel modesetting lands
--	 */
--	if (!nv_rd32(dev, NV04_PTIMER_NUMERATOR) ||
--				!nv_rd32(dev, NV04_PTIMER_DENOMINATOR)) {
--		nv_wr32(dev, NV04_PTIMER_NUMERATOR, 0x00000008);
--		nv_wr32(dev, NV04_PTIMER_DENOMINATOR, 0x00000003);
-+	/* aim for 31.25MHz, which gives us nanosecond timestamps */
-+	d = 1000000 / 32;
-+
-+	/* determine base clock for timer source */
-+	if (dev_priv->chipset < 0x40) {
-+		n = dev_priv->engine.pm.clock_get(dev, PLL_CORE);
-+	} else
-+	if (dev_priv->chipset == 0x40) {
-+		/*XXX: figure this out */
-+		n = 0;
-+	} else {
-+		n = dev_priv->crystal;
-+		m = 1;
-+		while (n < (d * 2)) {
-+			n += (n / m);
-+			m++;
-+		}
-+
-+		nv_wr32(dev, 0x009220, m - 1);
-+	}
-+
-+	if (!n) {
-+		NV_WARN(dev, "PTIMER: unknown input clock freq\n");
-+		if (!nv_rd32(dev, NV04_PTIMER_NUMERATOR) ||
-+		    !nv_rd32(dev, NV04_PTIMER_DENOMINATOR)) {
-+			nv_wr32(dev, NV04_PTIMER_NUMERATOR, 1);
-+			nv_wr32(dev, NV04_PTIMER_DENOMINATOR, 1);
-+		}
-+		return 0;
-+	}
-+
-+	/* reduce ratio to acceptable values */
-+	while (((n % 5) == 0) && ((d % 5) == 0)) {
-+		n /= 5;
-+		d /= 5;
- 	}
- 
-+	while (((n % 2) == 0) && ((d % 2) == 0)) {
-+		n /= 2;
-+		d /= 2;
-+	}
-+
-+	while (n > 0xffff || d > 0xffff) {
-+		n >>= 1;
-+		d >>= 1;
-+	}
-+
-+	nv_wr32(dev, NV04_PTIMER_NUMERATOR, n);
-+	nv_wr32(dev, NV04_PTIMER_DENOMINATOR, d);
- 	return 0;
- }
- 
--uint64_t
-+u64
- nv04_timer_read(struct drm_device *dev)
- {
--	uint32_t low;
--	/* From kmmio dumps on nv28 this looks like how the blob does this.
--	 * It reads the high dword twice, before and after.
--	 * The only explanation seems to be that the 64-bit timer counter
--	 * advances between high and low dword reads and may corrupt the
--	 * result. Not confirmed.
--	 */
--	uint32_t high2 = nv_rd32(dev, NV04_PTIMER_TIME_1);
--	uint32_t high1;
-+	u32 hi, lo;
-+
- 	do {
--		high1 = high2;
--		low = nv_rd32(dev, NV04_PTIMER_TIME_0);
--		high2 = nv_rd32(dev, NV04_PTIMER_TIME_1);
--	} while (high1 != high2);
--	return (((uint64_t)high2) << 32) | (uint64_t)low;
-+		hi = nv_rd32(dev, NV04_PTIMER_TIME_1);
-+		lo = nv_rd32(dev, NV04_PTIMER_TIME_0);
-+	} while (hi != nv_rd32(dev, NV04_PTIMER_TIME_1));
-+
-+	return ((u64)hi << 32 | lo);
- }
- 
- void
-diff --git a/drivers/gpu/drm/nouveau/nv31_mpeg.c b/drivers/gpu/drm/nouveau/nv31_mpeg.c
-new file mode 100644
-index 0000000..6f06a07
---- /dev/null
-+++ b/drivers/gpu/drm/nouveau/nv31_mpeg.c
-@@ -0,0 +1,344 @@
-+/*
-+ * Copyright 2011 Red Hat Inc.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
-+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ * OTHER DEALINGS IN THE SOFTWARE.
-+ *
-+ * Authors: Ben Skeggs
-+ */
-+
-+#include "drmP.h"
-+#include "nouveau_drv.h"
-+#include "nouveau_ramht.h"
-+
-+struct nv31_mpeg_engine {
-+	struct nouveau_exec_engine base;
-+	atomic_t refcount;
-+};
-+
-+
-+static int
-+nv31_mpeg_context_new(struct nouveau_channel *chan, int engine)
-+{
-+	struct nv31_mpeg_engine *pmpeg = nv_engine(chan->dev, engine);
-+
-+	if (!atomic_add_unless(&pmpeg->refcount, 1, 1))
-+		return -EBUSY;
-+
-+	chan->engctx[engine] = (void *)0xdeadcafe;
-+	return 0;
-+}
-+
-+static void
-+nv31_mpeg_context_del(struct nouveau_channel *chan, int engine)
-+{
-+	struct nv31_mpeg_engine *pmpeg = nv_engine(chan->dev, engine);
-+	atomic_dec(&pmpeg->refcount);
-+	chan->engctx[engine] = NULL;
-+}
-+
-+static int
-+nv40_mpeg_context_new(struct nouveau_channel *chan, int engine)
-+{
-+	struct drm_device *dev = chan->dev;
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nouveau_gpuobj *ctx = NULL;
-+	unsigned long flags;
-+	int ret;
-+
-+	NV_DEBUG(dev, "ch%d\n", chan->id);
-+
-+	ret = nouveau_gpuobj_new(dev, NULL, 264 * 4, 16, NVOBJ_FLAG_ZERO_ALLOC |
-+				 NVOBJ_FLAG_ZERO_FREE, &ctx);
-+	if (ret)
-+		return ret;
-+
-+	nv_wo32(ctx, 0x78, 0x02001ec1);
-+
-+	spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
-+	nv_mask(dev, 0x002500, 0x00000001, 0x00000000);
-+	if ((nv_rd32(dev, 0x003204) & 0x1f) == chan->id)
-+		nv_wr32(dev, 0x00330c, ctx->pinst >> 4);
-+	nv_wo32(chan->ramfc, 0x54, ctx->pinst >> 4);
-+	nv_mask(dev, 0x002500, 0x00000001, 0x00000001);
-+	spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
-+
-+	chan->engctx[engine] = ctx;
-+	return 0;
-+}
-+
-+static void
-+nv40_mpeg_context_del(struct nouveau_channel *chan, int engine)
-+{
-+	struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
-+	struct nouveau_gpuobj *ctx = chan->engctx[engine];
-+	struct drm_device *dev = chan->dev;
-+	unsigned long flags;
-+	u32 inst = 0x80000000 | (ctx->pinst >> 4);
-+
-+	spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
-+	nv_mask(dev, 0x00b32c, 0x00000001, 0x00000000);
-+	if (nv_rd32(dev, 0x00b318) == inst)
-+		nv_mask(dev, 0x00b318, 0x80000000, 0x00000000);
-+	nv_mask(dev, 0x00b32c, 0x00000001, 0x00000001);
-+	spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
-+
-+	nouveau_gpuobj_ref(NULL, &ctx);
-+	chan->engctx[engine] = NULL;
-+}
-+
-+static int
-+nv31_mpeg_object_new(struct nouveau_channel *chan, int engine,
-+		      u32 handle, u16 class)
-+{
-+	struct drm_device *dev = chan->dev;
-+	struct nouveau_gpuobj *obj = NULL;
-+	int ret;
-+
-+	ret = nouveau_gpuobj_new(dev, chan, 20, 16, NVOBJ_FLAG_ZERO_ALLOC |
-+				 NVOBJ_FLAG_ZERO_FREE, &obj);
-+	if (ret)
-+		return ret;
-+	obj->engine = 2;
-+	obj->class  = class;
-+
-+	nv_wo32(obj, 0x00, class);
-+
-+	ret = nouveau_ramht_insert(chan, handle, obj);
-+	nouveau_gpuobj_ref(NULL, &obj);
-+	return ret;
-+}
-+
-+static int
-+nv31_mpeg_init(struct drm_device *dev, int engine)
-+{
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nv31_mpeg_engine *pmpeg = nv_engine(dev, engine);
-+	int i;
-+
-+	/* VPE init */
-+	nv_mask(dev, 0x000200, 0x00000002, 0x00000000);
-+	nv_mask(dev, 0x000200, 0x00000002, 0x00000002);
-+	nv_wr32(dev, 0x00b0e0, 0x00000020); /* nvidia: rd 0x01, wr 0x20 */
-+	nv_wr32(dev, 0x00b0e8, 0x00000020); /* nvidia: rd 0x01, wr 0x20 */
-+
-+	for (i = 0; i < dev_priv->engine.fb.num_tiles; i++)
-+		pmpeg->base.set_tile_region(dev, i);
-+
-+	/* PMPEG init */
-+	nv_wr32(dev, 0x00b32c, 0x00000000);
-+	nv_wr32(dev, 0x00b314, 0x00000100);
-+	nv_wr32(dev, 0x00b220, nv44_graph_class(dev) ? 0x00000044 : 0x00000031);
-+	nv_wr32(dev, 0x00b300, 0x02001ec1);
-+	nv_mask(dev, 0x00b32c, 0x00000001, 0x00000001);
-+
-+	nv_wr32(dev, 0x00b100, 0xffffffff);
-+	nv_wr32(dev, 0x00b140, 0xffffffff);
-+
-+	if (!nv_wait(dev, 0x00b200, 0x00000001, 0x00000000)) {
-+		NV_ERROR(dev, "PMPEG init: 0x%08x\n", nv_rd32(dev, 0x00b200));
-+		return -EBUSY;
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+nv31_mpeg_fini(struct drm_device *dev, int engine, bool suspend)
-+{
-+	/*XXX: context save? */
-+	nv_mask(dev, 0x00b32c, 0x00000001, 0x00000000);
-+	nv_wr32(dev, 0x00b140, 0x00000000);
-+	return 0;
-+}
-+
-+static int
-+nv31_mpeg_mthd_dma(struct nouveau_channel *chan, u32 class, u32 mthd, u32 data)
-+{
-+	struct drm_device *dev = chan->dev;
-+	u32 inst = data << 4;
-+	u32 dma0 = nv_ri32(dev, inst + 0);
-+	u32 dma1 = nv_ri32(dev, inst + 4);
-+	u32 dma2 = nv_ri32(dev, inst + 8);
-+	u32 base = (dma2 & 0xfffff000) | (dma0 >> 20);
-+	u32 size = dma1 + 1;
-+
-+	/* only allow linear DMA objects */
-+	if (!(dma0 & 0x00002000))
-+		return -EINVAL;
-+
-+	if (mthd == 0x0190) {
-+		/* DMA_CMD */
-+		nv_mask(dev, 0x00b300, 0x00030000, (dma0 & 0x00030000));
-+		nv_wr32(dev, 0x00b334, base);
-+		nv_wr32(dev, 0x00b324, size);
-+	} else
-+	if (mthd == 0x01a0) {
-+		/* DMA_DATA */
-+		nv_mask(dev, 0x00b300, 0x000c0000, (dma0 & 0x00030000) << 2);
-+		nv_wr32(dev, 0x00b360, base);
-+		nv_wr32(dev, 0x00b364, size);
-+	} else {
-+		/* DMA_IMAGE, VRAM only */
-+		if (dma0 & 0x000c0000)
-+			return -EINVAL;
-+
-+		nv_wr32(dev, 0x00b370, base);
-+		nv_wr32(dev, 0x00b374, size);
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+nv31_mpeg_isr_chid(struct drm_device *dev, u32 inst)
-+{
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nouveau_gpuobj *ctx;
-+	unsigned long flags;
-+	int i;
-+
-+	/* hardcode drm channel id on nv3x, so swmthd lookup works */
-+	if (dev_priv->card_type < NV_40)
-+		return 0;
-+
-+	spin_lock_irqsave(&dev_priv->channels.lock, flags);
-+	for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
-+		if (!dev_priv->channels.ptr[i])
-+			continue;
-+
-+		ctx = dev_priv->channels.ptr[i]->engctx[NVOBJ_ENGINE_MPEG];
-+		if (ctx && ctx->pinst == inst)
-+			break;
-+	}
-+	spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
-+	return i;
-+}
-+
-+static void
-+nv31_vpe_set_tile_region(struct drm_device *dev, int i)
-+{
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
-+
-+	nv_wr32(dev, 0x00b008 + (i * 0x10), tile->pitch);
-+	nv_wr32(dev, 0x00b004 + (i * 0x10), tile->limit);
-+	nv_wr32(dev, 0x00b000 + (i * 0x10), tile->addr);
-+}
-+
-+static void
-+nv31_mpeg_isr(struct drm_device *dev)
-+{
-+	u32 inst = (nv_rd32(dev, 0x00b318) & 0x000fffff) << 4;
-+	u32 chid = nv31_mpeg_isr_chid(dev, inst);
-+	u32 stat = nv_rd32(dev, 0x00b100);
-+	u32 type = nv_rd32(dev, 0x00b230);
-+	u32 mthd = nv_rd32(dev, 0x00b234);
-+	u32 data = nv_rd32(dev, 0x00b238);
-+	u32 show = stat;
-+
-+	if (stat & 0x01000000) {
-+		/* happens on initial binding of the object */
-+		if (type == 0x00000020 && mthd == 0x0000) {
-+			nv_mask(dev, 0x00b308, 0x00000000, 0x00000000);
-+			show &= ~0x01000000;
-+		}
-+
-+		if (type == 0x00000010) {
-+			if (!nouveau_gpuobj_mthd_call2(dev, chid, 0x3174, mthd, data))
-+				show &= ~0x01000000;
-+		}
-+	}
-+
-+	nv_wr32(dev, 0x00b100, stat);
-+	nv_wr32(dev, 0x00b230, 0x00000001);
-+
-+	if (show && nouveau_ratelimit()) {
-+		NV_INFO(dev, "PMPEG: Ch %d [0x%08x] 0x%08x 0x%08x 0x%08x 0x%08x\n",
-+			chid, inst, stat, type, mthd, data);
-+	}
-+}
-+
-+static void
-+nv31_vpe_isr(struct drm_device *dev)
-+{
-+	if (nv_rd32(dev, 0x00b100))
-+		nv31_mpeg_isr(dev);
-+
-+	if (nv_rd32(dev, 0x00b800)) {
-+		u32 stat = nv_rd32(dev, 0x00b800);
-+		NV_INFO(dev, "PMSRCH: 0x%08x\n", stat);
-+		nv_wr32(dev, 0xb800, stat);
-+	}
-+}
-+
-+static void
-+nv31_mpeg_destroy(struct drm_device *dev, int engine)
-+{
-+	struct nv31_mpeg_engine *pmpeg = nv_engine(dev, engine);
-+
-+	nouveau_irq_unregister(dev, 0);
-+
-+	NVOBJ_ENGINE_DEL(dev, MPEG);
-+	kfree(pmpeg);
-+}
-+
-+int
-+nv31_mpeg_create(struct drm_device *dev)
-+{
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nv31_mpeg_engine *pmpeg;
-+
-+	pmpeg = kzalloc(sizeof(*pmpeg), GFP_KERNEL);
-+	if (!pmpeg)
-+		return -ENOMEM;
-+	atomic_set(&pmpeg->refcount, 0);
-+
-+	pmpeg->base.destroy = nv31_mpeg_destroy;
-+	pmpeg->base.init = nv31_mpeg_init;
-+	pmpeg->base.fini = nv31_mpeg_fini;
-+	if (dev_priv->card_type < NV_40) {
-+		pmpeg->base.context_new = nv31_mpeg_context_new;
-+		pmpeg->base.context_del = nv31_mpeg_context_del;
-+	} else {
-+		pmpeg->base.context_new = nv40_mpeg_context_new;
-+		pmpeg->base.context_del = nv40_mpeg_context_del;
-+	}
-+	pmpeg->base.object_new = nv31_mpeg_object_new;
-+
-+	/* ISR vector, PMC_ENABLE bit,  and TILE regs are shared between
-+	 * all VPE engines, for this driver's purposes the PMPEG engine
-+	 * will be treated as the "master" and handle the global VPE
-+	 * bits too
-+	 */
-+	pmpeg->base.set_tile_region = nv31_vpe_set_tile_region;
-+	nouveau_irq_register(dev, 0, nv31_vpe_isr);
-+
-+	NVOBJ_ENGINE_ADD(dev, MPEG, &pmpeg->base);
-+	NVOBJ_CLASS(dev, 0x3174, MPEG);
-+	NVOBJ_MTHD (dev, 0x3174, 0x0190, nv31_mpeg_mthd_dma);
-+	NVOBJ_MTHD (dev, 0x3174, 0x01a0, nv31_mpeg_mthd_dma);
-+	NVOBJ_MTHD (dev, 0x3174, 0x01b0, nv31_mpeg_mthd_dma);
-+
-+#if 0
-+	NVOBJ_ENGINE_ADD(dev, ME, &pme->base);
-+	NVOBJ_CLASS(dev, 0x4075, ME);
-+#endif
-+	return 0;
-+
-+}
-diff --git a/drivers/gpu/drm/nouveau/nv40_mpeg.c b/drivers/gpu/drm/nouveau/nv40_mpeg.c
-deleted file mode 100644
-index ad03a0e..0000000
---- a/drivers/gpu/drm/nouveau/nv40_mpeg.c
-+++ /dev/null
-@@ -1,311 +0,0 @@
--/*
-- * Copyright 2011 Red Hat Inc.
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a
-- * copy of this software and associated documentation files (the "Software"),
-- * to deal in the Software without restriction, including without limitation
-- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-- * and/or sell copies of the Software, and to permit persons to whom the
-- * Software is furnished to do so, subject to the following conditions:
-- *
-- * The above copyright notice and this permission notice shall be included in
-- * all copies or substantial portions of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
-- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-- * OTHER DEALINGS IN THE SOFTWARE.
-- *
-- * Authors: Ben Skeggs
-- */
--
--#include "drmP.h"
--#include "nouveau_drv.h"
--#include "nouveau_ramht.h"
--
--struct nv40_mpeg_engine {
--	struct nouveau_exec_engine base;
--};
--
--static int
--nv40_mpeg_context_new(struct nouveau_channel *chan, int engine)
--{
--	struct drm_device *dev = chan->dev;
--	struct drm_nouveau_private *dev_priv = dev->dev_private;
--	struct nouveau_gpuobj *ctx = NULL;
--	unsigned long flags;
--	int ret;
--
--	NV_DEBUG(dev, "ch%d\n", chan->id);
--
--	ret = nouveau_gpuobj_new(dev, NULL, 264 * 4, 16, NVOBJ_FLAG_ZERO_ALLOC |
--				 NVOBJ_FLAG_ZERO_FREE, &ctx);
--	if (ret)
--		return ret;
--
--	nv_wo32(ctx, 0x78, 0x02001ec1);
--
--	spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
--	nv_mask(dev, 0x002500, 0x00000001, 0x00000000);
--	if ((nv_rd32(dev, 0x003204) & 0x1f) == chan->id)
--		nv_wr32(dev, 0x00330c, ctx->pinst >> 4);
--	nv_wo32(chan->ramfc, 0x54, ctx->pinst >> 4);
--	nv_mask(dev, 0x002500, 0x00000001, 0x00000001);
--	spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
--
--	chan->engctx[engine] = ctx;
--	return 0;
--}
--
--static void
--nv40_mpeg_context_del(struct nouveau_channel *chan, int engine)
--{
--	struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
--	struct nouveau_gpuobj *ctx = chan->engctx[engine];
--	struct drm_device *dev = chan->dev;
--	unsigned long flags;
--	u32 inst = 0x80000000 | (ctx->pinst >> 4);
--
--	spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
--	nv_mask(dev, 0x00b32c, 0x00000001, 0x00000000);
--	if (nv_rd32(dev, 0x00b318) == inst)
--		nv_mask(dev, 0x00b318, 0x80000000, 0x00000000);
--	nv_mask(dev, 0x00b32c, 0x00000001, 0x00000001);
--	spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
--
--	nouveau_gpuobj_ref(NULL, &ctx);
--	chan->engctx[engine] = NULL;
--}
--
--static int
--nv40_mpeg_object_new(struct nouveau_channel *chan, int engine,
--		      u32 handle, u16 class)
--{
--	struct drm_device *dev = chan->dev;
--	struct nouveau_gpuobj *obj = NULL;
--	int ret;
--
--	ret = nouveau_gpuobj_new(dev, chan, 20, 16, NVOBJ_FLAG_ZERO_ALLOC |
--				 NVOBJ_FLAG_ZERO_FREE, &obj);
--	if (ret)
--		return ret;
--	obj->engine = 2;
--	obj->class  = class;
--
--	nv_wo32(obj, 0x00, class);
--
--	ret = nouveau_ramht_insert(chan, handle, obj);
--	nouveau_gpuobj_ref(NULL, &obj);
--	return ret;
--}
--
--static int
--nv40_mpeg_init(struct drm_device *dev, int engine)
--{
--	struct drm_nouveau_private *dev_priv = dev->dev_private;
--	struct nv40_mpeg_engine *pmpeg = nv_engine(dev, engine);
--	int i;
--
--	/* VPE init */
--	nv_mask(dev, 0x000200, 0x00000002, 0x00000000);
--	nv_mask(dev, 0x000200, 0x00000002, 0x00000002);
--	nv_wr32(dev, 0x00b0e0, 0x00000020); /* nvidia: rd 0x01, wr 0x20 */
--	nv_wr32(dev, 0x00b0e8, 0x00000020); /* nvidia: rd 0x01, wr 0x20 */
--
--	for (i = 0; i < dev_priv->engine.fb.num_tiles; i++)
--		pmpeg->base.set_tile_region(dev, i);
--
--	/* PMPEG init */
--	nv_wr32(dev, 0x00b32c, 0x00000000);
--	nv_wr32(dev, 0x00b314, 0x00000100);
--	nv_wr32(dev, 0x00b220, 0x00000044);
--	nv_wr32(dev, 0x00b300, 0x02001ec1);
--	nv_mask(dev, 0x00b32c, 0x00000001, 0x00000001);
--
--	nv_wr32(dev, 0x00b100, 0xffffffff);
--	nv_wr32(dev, 0x00b140, 0xffffffff);
--
--	if (!nv_wait(dev, 0x00b200, 0x00000001, 0x00000000)) {
--		NV_ERROR(dev, "PMPEG init: 0x%08x\n", nv_rd32(dev, 0x00b200));
--		return -EBUSY;
--	}
--
--	return 0;
--}
--
--static int
--nv40_mpeg_fini(struct drm_device *dev, int engine, bool suspend)
--{
--	/*XXX: context save? */
--	nv_mask(dev, 0x00b32c, 0x00000001, 0x00000000);
--	nv_wr32(dev, 0x00b140, 0x00000000);
--	return 0;
--}
--
--static int
--nv40_mpeg_mthd_dma(struct nouveau_channel *chan, u32 class, u32 mthd, u32 data)
--{
--	struct drm_device *dev = chan->dev;
--	u32 inst = data << 4;
--	u32 dma0 = nv_ri32(dev, inst + 0);
--	u32 dma1 = nv_ri32(dev, inst + 4);
--	u32 dma2 = nv_ri32(dev, inst + 8);
--	u32 base = (dma2 & 0xfffff000) | (dma0 >> 20);
--	u32 size = dma1 + 1;
--
--	/* only allow linear DMA objects */
--	if (!(dma0 & 0x00002000))
--		return -EINVAL;
--
--	if (mthd == 0x0190) {
--		/* DMA_CMD */
--		nv_mask(dev, 0x00b300, 0x00030000, (dma0 & 0x00030000));
--		nv_wr32(dev, 0x00b334, base);
--		nv_wr32(dev, 0x00b324, size);
--	} else
--	if (mthd == 0x01a0) {
--		/* DMA_DATA */
--		nv_mask(dev, 0x00b300, 0x000c0000, (dma0 & 0x00030000) << 2);
--		nv_wr32(dev, 0x00b360, base);
--		nv_wr32(dev, 0x00b364, size);
--	} else {
--		/* DMA_IMAGE, VRAM only */
--		if (dma0 & 0x000c0000)
--			return -EINVAL;
--
--		nv_wr32(dev, 0x00b370, base);
--		nv_wr32(dev, 0x00b374, size);
--	}
--
--	return 0;
--}
--
--static int
--nv40_mpeg_isr_chid(struct drm_device *dev, u32 inst)
--{
--	struct drm_nouveau_private *dev_priv = dev->dev_private;
--	struct nouveau_gpuobj *ctx;
--	unsigned long flags;
--	int i;
--
--	spin_lock_irqsave(&dev_priv->channels.lock, flags);
--	for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
--		if (!dev_priv->channels.ptr[i])
--			continue;
--
--		ctx = dev_priv->channels.ptr[i]->engctx[NVOBJ_ENGINE_MPEG];
--		if (ctx && ctx->pinst == inst)
--			break;
--	}
--	spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
--	return i;
--}
--
--static void
--nv40_vpe_set_tile_region(struct drm_device *dev, int i)
--{
--	struct drm_nouveau_private *dev_priv = dev->dev_private;
--	struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
--
--	nv_wr32(dev, 0x00b008 + (i * 0x10), tile->pitch);
--	nv_wr32(dev, 0x00b004 + (i * 0x10), tile->limit);
--	nv_wr32(dev, 0x00b000 + (i * 0x10), tile->addr);
--}
--
--static void
--nv40_mpeg_isr(struct drm_device *dev)
--{
--	u32 inst = (nv_rd32(dev, 0x00b318) & 0x000fffff) << 4;
--	u32 chid = nv40_mpeg_isr_chid(dev, inst);
--	u32 stat = nv_rd32(dev, 0x00b100);
--	u32 type = nv_rd32(dev, 0x00b230);
--	u32 mthd = nv_rd32(dev, 0x00b234);
--	u32 data = nv_rd32(dev, 0x00b238);
--	u32 show = stat;
--
--	if (stat & 0x01000000) {
--		/* happens on initial binding of the object */
--		if (type == 0x00000020 && mthd == 0x0000) {
--			nv_mask(dev, 0x00b308, 0x00000000, 0x00000000);
--			show &= ~0x01000000;
--		}
--
--		if (type == 0x00000010) {
--			if (!nouveau_gpuobj_mthd_call2(dev, chid, 0x3174, mthd, data))
--				show &= ~0x01000000;
--		}
--	}
--
--	nv_wr32(dev, 0x00b100, stat);
--	nv_wr32(dev, 0x00b230, 0x00000001);
--
--	if (show && nouveau_ratelimit()) {
--		NV_INFO(dev, "PMPEG: Ch %d [0x%08x] 0x%08x 0x%08x 0x%08x 0x%08x\n",
--			chid, inst, stat, type, mthd, data);
--	}
--}
--
--static void
--nv40_vpe_isr(struct drm_device *dev)
--{
--	if (nv_rd32(dev, 0x00b100))
--		nv40_mpeg_isr(dev);
--
--	if (nv_rd32(dev, 0x00b800)) {
--		u32 stat = nv_rd32(dev, 0x00b800);
--		NV_INFO(dev, "PMSRCH: 0x%08x\n", stat);
--		nv_wr32(dev, 0xb800, stat);
--	}
--}
--
--static void
--nv40_mpeg_destroy(struct drm_device *dev, int engine)
--{
--	struct nv40_mpeg_engine *pmpeg = nv_engine(dev, engine);
--
--	nouveau_irq_unregister(dev, 0);
--
--	NVOBJ_ENGINE_DEL(dev, MPEG);
--	kfree(pmpeg);
--}
--
--int
--nv40_mpeg_create(struct drm_device *dev)
--{
--	struct nv40_mpeg_engine *pmpeg;
--
--	pmpeg = kzalloc(sizeof(*pmpeg), GFP_KERNEL);
--	if (!pmpeg)
--		return -ENOMEM;
--
--	pmpeg->base.destroy = nv40_mpeg_destroy;
--	pmpeg->base.init = nv40_mpeg_init;
--	pmpeg->base.fini = nv40_mpeg_fini;
--	pmpeg->base.context_new = nv40_mpeg_context_new;
--	pmpeg->base.context_del = nv40_mpeg_context_del;
--	pmpeg->base.object_new = nv40_mpeg_object_new;
--
--	/* ISR vector, PMC_ENABLE bit,  and TILE regs are shared between
--	 * all VPE engines, for this driver's purposes the PMPEG engine
--	 * will be treated as the "master" and handle the global VPE
--	 * bits too
--	 */
--	pmpeg->base.set_tile_region = nv40_vpe_set_tile_region;
--	nouveau_irq_register(dev, 0, nv40_vpe_isr);
--
--	NVOBJ_ENGINE_ADD(dev, MPEG, &pmpeg->base);
--	NVOBJ_CLASS(dev, 0x3174, MPEG);
--	NVOBJ_MTHD (dev, 0x3174, 0x0190, nv40_mpeg_mthd_dma);
--	NVOBJ_MTHD (dev, 0x3174, 0x01a0, nv40_mpeg_mthd_dma);
--	NVOBJ_MTHD (dev, 0x3174, 0x01b0, nv40_mpeg_mthd_dma);
--
--#if 0
--	NVOBJ_ENGINE_ADD(dev, ME, &pme->base);
--	NVOBJ_CLASS(dev, 0x4075, ME);
--#endif
--	return 0;
--
--}
-diff --git a/drivers/gpu/drm/nouveau/nv40_pm.c b/drivers/gpu/drm/nouveau/nv40_pm.c
-new file mode 100644
-index 0000000..e676b0d
---- /dev/null
-+++ b/drivers/gpu/drm/nouveau/nv40_pm.c
-@@ -0,0 +1,348 @@
-+/*
-+ * Copyright 2011 Red Hat Inc.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
-+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ * OTHER DEALINGS IN THE SOFTWARE.
-+ *
-+ * Authors: Ben Skeggs
-+ */
-+
-+#include "drmP.h"
-+#include "nouveau_drv.h"
-+#include "nouveau_bios.h"
-+#include "nouveau_pm.h"
-+#include "nouveau_hw.h"
-+
-+#define min2(a,b) ((a) < (b) ? (a) : (b))
-+
-+static u32
-+read_pll_1(struct drm_device *dev, u32 reg)
-+{
-+	u32 ctrl = nv_rd32(dev, reg + 0x00);
-+	int P = (ctrl & 0x00070000) >> 16;
-+	int N = (ctrl & 0x0000ff00) >> 8;
-+	int M = (ctrl & 0x000000ff) >> 0;
-+	u32 ref = 27000, clk = 0;
-+
-+	if (ctrl & 0x80000000)
-+		clk = ref * N / M;
-+
-+	return clk >> P;
-+}
-+
-+static u32
-+read_pll_2(struct drm_device *dev, u32 reg)
-+{
-+	u32 ctrl = nv_rd32(dev, reg + 0x00);
-+	u32 coef = nv_rd32(dev, reg + 0x04);
-+	int N2 = (coef & 0xff000000) >> 24;
-+	int M2 = (coef & 0x00ff0000) >> 16;
-+	int N1 = (coef & 0x0000ff00) >> 8;
-+	int M1 = (coef & 0x000000ff) >> 0;
-+	int P = (ctrl & 0x00070000) >> 16;
-+	u32 ref = 27000, clk = 0;
-+
-+	if ((ctrl & 0x80000000) && M1) {
-+		clk = ref * N1 / M1;
-+		if ((ctrl & 0x40000100) == 0x40000000) {
-+			if (M2)
-+				clk = clk * N2 / M2;
-+			else
-+				clk = 0;
-+		}
-+	}
-+
-+	return clk >> P;
-+}
-+
-+static u32
-+read_clk(struct drm_device *dev, u32 src)
-+{
-+	switch (src) {
-+	case 3:
-+		return read_pll_2(dev, 0x004000);
-+	case 2:
-+		return read_pll_1(dev, 0x004008);
-+	default:
-+		break;
-+	}
-+
-+	return 0;
-+}
-+
-+int
-+nv40_pm_clocks_get(struct drm_device *dev, struct nouveau_pm_level *perflvl)
-+{
-+	u32 ctrl = nv_rd32(dev, 0x00c040);
-+
-+	perflvl->core   = read_clk(dev, (ctrl & 0x00000003) >> 0);
-+	perflvl->shader = read_clk(dev, (ctrl & 0x00000030) >> 4);
-+	perflvl->memory = read_pll_2(dev, 0x4020);
-+	return 0;
-+}
-+
-+struct nv40_pm_state {
-+	u32 ctrl;
-+	u32 npll_ctrl;
-+	u32 npll_coef;
-+	u32 spll;
-+	u32 mpll_ctrl;
-+	u32 mpll_coef;
-+};
-+
-+static int
-+nv40_calc_pll(struct drm_device *dev, u32 reg, struct pll_lims *pll,
-+	      u32 clk, int *N1, int *M1, int *N2, int *M2, int *log2P)
-+{
-+	struct nouveau_pll_vals coef;
-+	int ret;
-+
-+	ret = get_pll_limits(dev, reg, pll);
-+	if (ret)
-+		return ret;
-+
-+	if (clk < pll->vco1.maxfreq)
-+		pll->vco2.maxfreq = 0;
-+
-+	ret = nouveau_calc_pll_mnp(dev, pll, clk, &coef);
-+	if (ret == 0)
-+		return -ERANGE;
-+
-+	*N1 = coef.N1;
-+	*M1 = coef.M1;
-+	if (N2 && M2) {
-+		if (pll->vco2.maxfreq) {
-+			*N2 = coef.N2;
-+			*M2 = coef.M2;
-+		} else {
-+			*N2 = 1;
-+			*M2 = 1;
-+		}
-+	}
-+	*log2P = coef.log2P;
-+	return 0;
-+}
-+
-+void *
-+nv40_pm_clocks_pre(struct drm_device *dev, struct nouveau_pm_level *perflvl)
-+{
-+	struct nv40_pm_state *info;
-+	struct pll_lims pll;
-+	int N1, N2, M1, M2, log2P;
-+	int ret;
-+
-+	info = kmalloc(sizeof(*info), GFP_KERNEL);
-+	if (!info)
-+		return ERR_PTR(-ENOMEM);
-+
-+	/* core/geometric clock */
-+	ret = nv40_calc_pll(dev, 0x004000, &pll, perflvl->core,
-+			    &N1, &M1, &N2, &M2, &log2P);
-+	if (ret < 0)
-+		goto out;
-+
-+	if (N2 == M2) {
-+		info->npll_ctrl = 0x80000100 | (log2P << 16);
-+		info->npll_coef = (N1 << 8) | M1;
-+	} else {
-+		info->npll_ctrl = 0xc0000000 | (log2P << 16);
-+		info->npll_coef = (N2 << 24) | (M2 << 16) | (N1 << 8) | M1;
-+	}
-+
-+	/* use the second PLL for shader/rop clock, if it differs from core */
-+	if (perflvl->shader && perflvl->shader != perflvl->core) {
-+		ret = nv40_calc_pll(dev, 0x004008, &pll, perflvl->shader,
-+				    &N1, &M1, NULL, NULL, &log2P);
-+		if (ret < 0)
-+			goto out;
-+
-+		info->spll = 0xc0000000 | (log2P << 16) | (N1 << 8) | M1;
-+		info->ctrl = 0x00000223;
-+	} else {
-+		info->spll = 0x00000000;
-+		info->ctrl = 0x00000333;
-+	}
-+
-+	/* memory clock */
-+	if (!perflvl->memory) {
-+		info->mpll_ctrl = 0x00000000;
-+		goto out;
-+	}
-+
-+	ret = nv40_calc_pll(dev, 0x004020, &pll, perflvl->memory,
-+			    &N1, &M1, &N2, &M2, &log2P);
-+	if (ret < 0)
-+		goto out;
-+
-+	info->mpll_ctrl  = 0x80000000 | (log2P << 16);
-+	info->mpll_ctrl |= min2(pll.log2p_bias + log2P, pll.max_log2p) << 20;
-+	if (N2 == M2) {
-+		info->mpll_ctrl |= 0x00000100;
-+		info->mpll_coef  = (N1 << 8) | M1;
-+	} else {
-+		info->mpll_ctrl |= 0x40000000;
-+		info->mpll_coef  = (N2 << 24) | (M2 << 16) | (N1 << 8) | M1;
-+	}
-+
-+out:
-+	if (ret < 0) {
-+		kfree(info);
-+		info = ERR_PTR(ret);
-+	}
-+	return info;
-+}
-+
-+static bool
-+nv40_pm_gr_idle(void *data)
-+{
-+	struct drm_device *dev = data;
-+
-+	if ((nv_rd32(dev, 0x400760) & 0x000000f0) >> 4 !=
-+	    (nv_rd32(dev, 0x400760) & 0x0000000f))
-+		return false;
-+
-+	if (nv_rd32(dev, 0x400700))
-+		return false;
-+
-+	return true;
-+}
-+
-+void
-+nv40_pm_clocks_set(struct drm_device *dev, void *pre_state)
-+{
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nv40_pm_state *info = pre_state;
-+	unsigned long flags;
-+	struct bit_entry M;
-+	u32 crtc_mask = 0;
-+	u8 sr1[2];
-+	int i;
-+
-+	/* determine which CRTCs are active, fetch VGA_SR1 for each */
-+	for (i = 0; i < 2; i++) {
-+		u32 vbl = nv_rd32(dev, 0x600808 + (i * 0x2000));
-+		u32 cnt = 0;
-+		do {
-+			if (vbl != nv_rd32(dev, 0x600808 + (i * 0x2000))) {
-+				nv_wr08(dev, 0x0c03c4 + (i * 0x2000), 0x01);
-+				sr1[i] = nv_rd08(dev, 0x0c03c5 + (i * 0x2000));
-+				if (!(sr1[i] & 0x20))
-+					crtc_mask |= (1 << i);
-+				break;
-+			}
-+			udelay(1);
-+		} while (cnt++ < 32);
-+	}
-+
-+	/* halt and idle engines */
-+	spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
-+	nv_mask(dev, 0x002500, 0x00000001, 0x00000000);
-+	if (!nv_wait(dev, 0x002500, 0x00000010, 0x00000000))
-+		goto resume;
-+	nv_mask(dev, 0x003220, 0x00000001, 0x00000000);
-+	if (!nv_wait(dev, 0x003220, 0x00000010, 0x00000000))
-+		goto resume;
-+	nv_mask(dev, 0x003200, 0x00000001, 0x00000000);
-+	nv04_fifo_cache_pull(dev, false);
-+
-+	if (!nv_wait_cb(dev, nv40_pm_gr_idle, dev))
-+		goto resume;
-+
-+	/* set engine clocks */
-+	nv_mask(dev, 0x00c040, 0x00000333, 0x00000000);
-+	nv_wr32(dev, 0x004004, info->npll_coef);
-+	nv_mask(dev, 0x004000, 0xc0070100, info->npll_ctrl);
-+	nv_mask(dev, 0x004008, 0xc007ffff, info->spll);
-+	mdelay(5);
-+	nv_mask(dev, 0x00c040, 0x00000333, info->ctrl);
-+
-+	if (!info->mpll_ctrl)
-+		goto resume;
-+
-+	/* wait for vblank start on active crtcs, disable memory access */
-+	for (i = 0; i < 2; i++) {
-+		if (!(crtc_mask & (1 << i)))
-+			continue;
-+		nv_wait(dev, 0x600808 + (i * 0x2000), 0x00010000, 0x00000000);
-+		nv_wait(dev, 0x600808 + (i * 0x2000), 0x00010000, 0x00010000);
-+		nv_wr08(dev, 0x0c03c4 + (i * 0x2000), 0x01);
-+		nv_wr08(dev, 0x0c03c5 + (i * 0x2000), sr1[i] | 0x20);
-+	}
-+
-+	/* prepare ram for reclocking */
-+	nv_wr32(dev, 0x1002d4, 0x00000001); /* precharge */
-+	nv_wr32(dev, 0x1002d0, 0x00000001); /* refresh */
-+	nv_wr32(dev, 0x1002d0, 0x00000001); /* refresh */
-+	nv_mask(dev, 0x100210, 0x80000000, 0x00000000); /* no auto refresh */
-+	nv_wr32(dev, 0x1002dc, 0x00000001); /* enable self-refresh */
-+
-+	/* change the PLL of each memory partition */
-+	nv_mask(dev, 0x00c040, 0x0000c000, 0x00000000);
-+	switch (dev_priv->chipset) {
-+	case 0x40:
-+	case 0x45:
-+	case 0x41:
-+	case 0x42:
-+	case 0x47:
-+		nv_mask(dev, 0x004044, 0xc0771100, info->mpll_ctrl);
-+		nv_mask(dev, 0x00402c, 0xc0771100, info->mpll_ctrl);
-+		nv_wr32(dev, 0x004048, info->mpll_coef);
-+		nv_wr32(dev, 0x004030, info->mpll_coef);
-+	case 0x43:
-+	case 0x49:
-+	case 0x4b:
-+		nv_mask(dev, 0x004038, 0xc0771100, info->mpll_ctrl);
-+		nv_wr32(dev, 0x00403c, info->mpll_coef);
-+	default:
-+		nv_mask(dev, 0x004020, 0xc0771100, info->mpll_ctrl);
-+		nv_wr32(dev, 0x004024, info->mpll_coef);
-+		break;
-+	}
-+	udelay(100);
-+	nv_mask(dev, 0x00c040, 0x0000c000, 0x0000c000);
-+
-+	/* re-enable normal operation of memory controller */
-+	nv_wr32(dev, 0x1002dc, 0x00000000);
-+	nv_mask(dev, 0x100210, 0x80000000, 0x80000000);
-+	udelay(100);
-+
-+	/* execute memory reset script from vbios */
-+	if (!bit_table(dev, 'M', &M))
-+		nouveau_bios_init_exec(dev, ROM16(M.data[0]));
-+
-+	/* make sure we're in vblank (hopefully the same one as before), and
-+	 * then re-enable crtc memory access
-+	 */
-+	for (i = 0; i < 2; i++) {
-+		if (!(crtc_mask & (1 << i)))
-+			continue;
-+		nv_wait(dev, 0x600808 + (i * 0x2000), 0x00010000, 0x00010000);
-+		nv_wr08(dev, 0x0c03c4 + (i * 0x2000), 0x01);
-+		nv_wr08(dev, 0x0c03c5 + (i * 0x2000), sr1[i]);
-+	}
-+
-+	/* resume engines */
-+resume:
-+	nv_wr32(dev, 0x003250, 0x00000001);
-+	nv_mask(dev, 0x003220, 0x00000001, 0x00000001);
-+	nv_wr32(dev, 0x003200, 0x00000001);
-+	nv_wr32(dev, 0x002500, 0x00000001);
-+	spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
-+
-+	kfree(info);
-+}
-diff --git a/drivers/gpu/drm/nouveau/nv50_crtc.c b/drivers/gpu/drm/nouveau/nv50_crtc.c
-index 5d98907..882080e 100644
---- a/drivers/gpu/drm/nouveau/nv50_crtc.c
-+++ b/drivers/gpu/drm/nouveau/nv50_crtc.c
-@@ -329,8 +329,6 @@ nv50_crtc_destroy(struct drm_crtc *crtc)
- 
- 	drm_crtc_cleanup(&nv_crtc->base);
- 
--	nv50_cursor_fini(nv_crtc);
--
- 	nouveau_bo_unmap(nv_crtc->lut.nvbo);
- 	nouveau_bo_ref(NULL, &nv_crtc->lut.nvbo);
- 	nouveau_bo_unmap(nv_crtc->cursor.nvbo);
-diff --git a/drivers/gpu/drm/nouveau/nv50_cursor.c b/drivers/gpu/drm/nouveau/nv50_cursor.c
-index 9752c35..adfc9b6 100644
---- a/drivers/gpu/drm/nouveau/nv50_cursor.c
-+++ b/drivers/gpu/drm/nouveau/nv50_cursor.c
-@@ -137,21 +137,3 @@ nv50_cursor_init(struct nouveau_crtc *nv_crtc)
- 	nv_crtc->cursor.show = nv50_cursor_show;
- 	return 0;
- }
--
--void
--nv50_cursor_fini(struct nouveau_crtc *nv_crtc)
--{
--	struct drm_device *dev = nv_crtc->base.dev;
--	int idx = nv_crtc->index;
--
--	NV_DEBUG_KMS(dev, "\n");
--
--	nv_wr32(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(idx), 0);
--	if (!nv_wait(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(idx),
--		     NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS, 0)) {
--		NV_ERROR(dev, "timeout: CURSOR_CTRL2_STATUS == 0\n");
--		NV_ERROR(dev, "CURSOR_CTRL2 = 0x%08x\n",
--			 nv_rd32(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(idx)));
--	}
--}
--
-diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c
-index db1a5f4..d23ca00 100644
---- a/drivers/gpu/drm/nouveau/nv50_display.c
-+++ b/drivers/gpu/drm/nouveau/nv50_display.c
-@@ -247,6 +247,16 @@ static int nv50_display_disable(struct drm_device *dev)
- 		}
- 	}
- 
-+	for (i = 0; i < 2; i++) {
-+		nv_wr32(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(i), 0);
-+		if (!nv_wait(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(i),
-+			     NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS, 0)) {
-+			NV_ERROR(dev, "timeout: CURSOR_CTRL2_STATUS == 0\n");
-+			NV_ERROR(dev, "CURSOR_CTRL2 = 0x%08x\n",
-+				 nv_rd32(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(i)));
-+		}
-+	}
-+
- 	nv50_evo_fini(dev);
- 
- 	for (i = 0; i < 3; i++) {
-@@ -286,23 +296,6 @@ int nv50_display_create(struct drm_device *dev)
- 		return -ENOMEM;
- 	dev_priv->engine.display.priv = priv;
- 
--	/* init basic kernel modesetting */
--	drm_mode_config_init(dev);
--
--	/* Initialise some optional connector properties. */
--	drm_mode_create_scaling_mode_property(dev);
--	drm_mode_create_dithering_property(dev);
--
--	dev->mode_config.min_width = 0;
--	dev->mode_config.min_height = 0;
--
--	dev->mode_config.funcs = (void *)&nouveau_mode_config_funcs;
--
--	dev->mode_config.max_width = 8192;
--	dev->mode_config.max_height = 8192;
--
--	dev->mode_config.fb_base = dev_priv->fb_phys;
--
- 	/* Create CRTC objects */
- 	for (i = 0; i < 2; i++)
- 		nv50_crtc_create(dev, i);
-@@ -364,8 +357,6 @@ nv50_display_destroy(struct drm_device *dev)
- 
- 	NV_DEBUG_KMS(dev, "\n");
- 
--	drm_mode_config_cleanup(dev);
--
- 	nv50_display_disable(dev);
- 	nouveau_irq_unregister(dev, 26);
- 	kfree(disp);
-@@ -698,7 +689,7 @@ nv50_display_unk10_handler(struct drm_device *dev)
- 		struct dcb_entry *dcb = &dev_priv->vbios.dcb.entry[i];
- 
- 		if (dcb->type == type && (dcb->or & (1 << or))) {
--			nouveau_bios_run_display_table(dev, dcb, 0, -1);
-+			nouveau_bios_run_display_table(dev, 0, -1, dcb, -1);
- 			disp->irq.dcb = dcb;
- 			goto ack;
- 		}
-@@ -711,37 +702,6 @@ ack:
- }
- 
- static void
--nv50_display_unk20_dp_hack(struct drm_device *dev, struct dcb_entry *dcb)
--{
--	int or = ffs(dcb->or) - 1, link = !(dcb->dpconf.sor.link & 1);
--	struct drm_encoder *encoder;
--	uint32_t tmp, unk0 = 0, unk1 = 0;
--
--	if (dcb->type != OUTPUT_DP)
--		return;
--
--	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
--		struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
--
--		if (nv_encoder->dcb == dcb) {
--			unk0 = nv_encoder->dp.unk0;
--			unk1 = nv_encoder->dp.unk1;
--			break;
--		}
--	}
--
--	if (unk0 || unk1) {
--		tmp  = nv_rd32(dev, NV50_SOR_DP_CTRL(or, link));
--		tmp &= 0xfffffe03;
--		nv_wr32(dev, NV50_SOR_DP_CTRL(or, link), tmp | unk0);
--
--		tmp  = nv_rd32(dev, NV50_SOR_DP_UNK128(or, link));
--		tmp &= 0xfef080c0;
--		nv_wr32(dev, NV50_SOR_DP_UNK128(or, link), tmp | unk1);
--	}
--}
--
--static void
- nv50_display_unk20_handler(struct drm_device *dev)
- {
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
-@@ -753,7 +713,7 @@ nv50_display_unk20_handler(struct drm_device *dev)
- 	NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30);
- 	dcb = disp->irq.dcb;
- 	if (dcb) {
--		nouveau_bios_run_display_table(dev, dcb, 0, -2);
-+		nouveau_bios_run_display_table(dev, 0, -2, dcb, -1);
- 		disp->irq.dcb = NULL;
- 	}
- 
-@@ -837,9 +797,15 @@ nv50_display_unk20_handler(struct drm_device *dev)
- 	}
- 
- 	script = nv50_display_script_select(dev, dcb, mc, pclk);
--	nouveau_bios_run_display_table(dev, dcb, script, pclk);
-+	nouveau_bios_run_display_table(dev, script, pclk, dcb, -1);
- 
--	nv50_display_unk20_dp_hack(dev, dcb);
-+	if (type == OUTPUT_DP) {
-+		int link = !(dcb->dpconf.sor.link & 1);
-+		if ((mc & 0x000f0000) == 0x00020000)
-+			nouveau_dp_tu_update(dev, or, link, pclk, 18);
-+		else
-+			nouveau_dp_tu_update(dev, or, link, pclk, 24);
-+	}
- 
- 	if (dcb->type != OUTPUT_ANALOG) {
- 		tmp = nv_rd32(dev, NV50_PDISPLAY_SOR_CLK_CTRL2(or));
-@@ -904,7 +870,7 @@ nv50_display_unk40_handler(struct drm_device *dev)
- 	if (!dcb)
- 		goto ack;
- 
--	nouveau_bios_run_display_table(dev, dcb, script, -pclk);
-+	nouveau_bios_run_display_table(dev, script, -pclk, dcb, -1);
- 	nv50_display_unk40_dp_set_tmds(dev, dcb);
- 
- ack:
-diff --git a/drivers/gpu/drm/nouveau/nv50_gpio.c b/drivers/gpu/drm/nouveau/nv50_gpio.c
-index d4f4206..793a5cc 100644
---- a/drivers/gpu/drm/nouveau/nv50_gpio.c
-+++ b/drivers/gpu/drm/nouveau/nv50_gpio.c
-@@ -98,6 +98,37 @@ nv50_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state)
- }
- 
- int
-+nvd0_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag)
-+{
-+	struct dcb_gpio_entry *gpio;
-+	u32 v;
-+
-+	gpio = nouveau_bios_gpio_entry(dev, tag);
-+	if (!gpio)
-+		return -ENOENT;
-+
-+	v  = nv_rd32(dev, 0x00d610 + (gpio->line * 4));
-+	v &= 0x00004000;
-+	return (!!v == (gpio->state[1] & 1));
-+}
-+
-+int
-+nvd0_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state)
-+{
-+	struct dcb_gpio_entry *gpio;
-+	u32 v;
-+
-+	gpio = nouveau_bios_gpio_entry(dev, tag);
-+	if (!gpio)
-+		return -ENOENT;
-+
-+	v = gpio->state[state] ^ 2;
-+
-+	nv_mask(dev, 0x00d610 + (gpio->line * 4), 0x00003000, v << 12);
-+	return 0;
-+}
-+
-+int
- nv50_gpio_irq_register(struct drm_device *dev, enum dcb_gpio_tag tag,
- 		       void (*handler)(void *, int), void *data)
- {
-diff --git a/drivers/gpu/drm/nouveau/nv50_graph.c b/drivers/gpu/drm/nouveau/nv50_graph.c
-index d43c46c..8c979b3 100644
---- a/drivers/gpu/drm/nouveau/nv50_graph.c
-+++ b/drivers/gpu/drm/nouveau/nv50_graph.c
-@@ -120,70 +120,62 @@ nv50_graph_unload_context(struct drm_device *dev)
- 	return 0;
- }
- 
--static void
--nv50_graph_init_reset(struct drm_device *dev)
--{
--	uint32_t pmc_e = NV_PMC_ENABLE_PGRAPH | (1 << 21);
--	NV_DEBUG(dev, "\n");
--
--	nv_wr32(dev, NV03_PMC_ENABLE, nv_rd32(dev, NV03_PMC_ENABLE) & ~pmc_e);
--	nv_wr32(dev, NV03_PMC_ENABLE, nv_rd32(dev, NV03_PMC_ENABLE) |  pmc_e);
--}
--
--static void
--nv50_graph_init_intr(struct drm_device *dev)
--{
--	NV_DEBUG(dev, "\n");
--
--	nv_wr32(dev, NV03_PGRAPH_INTR, 0xffffffff);
--	nv_wr32(dev, 0x400138, 0xffffffff);
--	nv_wr32(dev, NV40_PGRAPH_INTR_EN, 0xffffffff);
--}
--
--static void
--nv50_graph_init_regs__nv(struct drm_device *dev)
-+static int
-+nv50_graph_init(struct drm_device *dev, int engine)
- {
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
--	uint32_t units = nv_rd32(dev, 0x1540);
-+	struct nv50_graph_engine *pgraph = nv_engine(dev, engine);
-+	u32 units = nv_rd32(dev, 0x001540);
- 	int i;
- 
- 	NV_DEBUG(dev, "\n");
- 
-+	/* master reset */
-+	nv_mask(dev, 0x000200, 0x00200100, 0x00000000);
-+	nv_mask(dev, 0x000200, 0x00200100, 0x00200100);
-+	nv_wr32(dev, 0x40008c, 0x00000004); /* HW_CTX_SWITCH_ENABLED */
-+
-+	/* reset/enable traps and interrupts */
- 	nv_wr32(dev, 0x400804, 0xc0000000);
- 	nv_wr32(dev, 0x406800, 0xc0000000);
- 	nv_wr32(dev, 0x400c04, 0xc0000000);
- 	nv_wr32(dev, 0x401800, 0xc0000000);
- 	nv_wr32(dev, 0x405018, 0xc0000000);
- 	nv_wr32(dev, 0x402000, 0xc0000000);
--
- 	for (i = 0; i < 16; i++) {
--		if (units & 1 << i) {
--			if (dev_priv->chipset < 0xa0) {
--				nv_wr32(dev, 0x408900 + (i << 12), 0xc0000000);
--				nv_wr32(dev, 0x408e08 + (i << 12), 0xc0000000);
--				nv_wr32(dev, 0x408314 + (i << 12), 0xc0000000);
--			} else {
--				nv_wr32(dev, 0x408600 + (i << 11), 0xc0000000);
--				nv_wr32(dev, 0x408708 + (i << 11), 0xc0000000);
--				nv_wr32(dev, 0x40831c + (i << 11), 0xc0000000);
--			}
-+		if (!(units & (1 << i)))
-+			continue;
-+
-+		if (dev_priv->chipset < 0xa0) {
-+			nv_wr32(dev, 0x408900 + (i << 12), 0xc0000000);
-+			nv_wr32(dev, 0x408e08 + (i << 12), 0xc0000000);
-+			nv_wr32(dev, 0x408314 + (i << 12), 0xc0000000);
-+		} else {
-+			nv_wr32(dev, 0x408600 + (i << 11), 0xc0000000);
-+			nv_wr32(dev, 0x408708 + (i << 11), 0xc0000000);
-+			nv_wr32(dev, 0x40831c + (i << 11), 0xc0000000);
- 		}
- 	}
- 
- 	nv_wr32(dev, 0x400108, 0xffffffff);
--
--	nv_wr32(dev, 0x400824, 0x00004000);
-+	nv_wr32(dev, 0x400138, 0xffffffff);
-+	nv_wr32(dev, 0x400100, 0xffffffff);
-+	nv_wr32(dev, 0x40013c, 0xffffffff);
- 	nv_wr32(dev, 0x400500, 0x00010001);
--}
--
--static void
--nv50_graph_init_zcull(struct drm_device *dev)
--{
--	struct drm_nouveau_private *dev_priv = dev->dev_private;
--	int i;
- 
--	NV_DEBUG(dev, "\n");
-+	/* upload context program, initialise ctxctl defaults */
-+	nv_wr32(dev, 0x400324, 0x00000000);
-+	for (i = 0; i < pgraph->ctxprog_size; i++)
-+		nv_wr32(dev, 0x400328, pgraph->ctxprog[i]);
-+	nv_wr32(dev, 0x400824, 0x00000000);
-+	nv_wr32(dev, 0x400828, 0x00000000);
-+	nv_wr32(dev, 0x40082c, 0x00000000);
-+	nv_wr32(dev, 0x400830, 0x00000000);
-+	nv_wr32(dev, 0x400724, 0x00000000);
-+	nv_wr32(dev, 0x40032c, 0x00000000);
-+	nv_wr32(dev, 0x400320, 4);	/* CTXCTL_CMD = NEWCTXDMA */
- 
-+	/* some unknown zcull magic */
- 	switch (dev_priv->chipset & 0xf0) {
- 	case 0x50:
- 	case 0x80:
-@@ -212,43 +204,7 @@ nv50_graph_init_zcull(struct drm_device *dev)
- 		nv_wr32(dev, 0x402c28 + (i * 8), 0x00000000);
- 		nv_wr32(dev, 0x402c2c + (i * 8), 0x00000000);
- 	}
--}
--
--static int
--nv50_graph_init_ctxctl(struct drm_device *dev)
--{
--	struct nv50_graph_engine *pgraph = nv_engine(dev, NVOBJ_ENGINE_GR);
--	int i;
--
--	NV_DEBUG(dev, "\n");
--
--	nv_wr32(dev, NV40_PGRAPH_CTXCTL_UCODE_INDEX, 0);
--	for (i = 0; i < pgraph->ctxprog_size; i++)
--		nv_wr32(dev, NV40_PGRAPH_CTXCTL_UCODE_DATA, pgraph->ctxprog[i]);
--
--	nv_wr32(dev, 0x40008c, 0x00000004); /* HW_CTX_SWITCH_ENABLED */
--	nv_wr32(dev, 0x400320, 4);
--	nv_wr32(dev, NV40_PGRAPH_CTXCTL_CUR, 0);
--	nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_POINTER, 0);
--	return 0;
--}
--
--static int
--nv50_graph_init(struct drm_device *dev, int engine)
--{
--	int ret;
--
--	NV_DEBUG(dev, "\n");
--
--	nv50_graph_init_reset(dev);
--	nv50_graph_init_regs__nv(dev);
--	nv50_graph_init_zcull(dev);
--
--	ret = nv50_graph_init_ctxctl(dev);
--	if (ret)
--		return ret;
- 
--	nv50_graph_init_intr(dev);
- 	return 0;
- }
- 
-diff --git a/drivers/gpu/drm/nouveau/nv50_grctx.c b/drivers/gpu/drm/nouveau/nv50_grctx.c
-index de9abff..d05c2c3 100644
---- a/drivers/gpu/drm/nouveau/nv50_grctx.c
-+++ b/drivers/gpu/drm/nouveau/nv50_grctx.c
-@@ -40,6 +40,12 @@
- #define CP_FLAG_UNK0B                 ((0 * 32) + 0xb)
- #define CP_FLAG_UNK0B_CLEAR           0
- #define CP_FLAG_UNK0B_SET             1
-+#define CP_FLAG_XFER_SWITCH           ((0 * 32) + 0xe)
-+#define CP_FLAG_XFER_SWITCH_DISABLE   0
-+#define CP_FLAG_XFER_SWITCH_ENABLE    1
-+#define CP_FLAG_STATE                 ((0 * 32) + 0x1c)
-+#define CP_FLAG_STATE_STOPPED         0
-+#define CP_FLAG_STATE_RUNNING         1
- #define CP_FLAG_UNK1D                 ((0 * 32) + 0x1d)
- #define CP_FLAG_UNK1D_CLEAR           0
- #define CP_FLAG_UNK1D_SET             1
-@@ -194,6 +200,9 @@ nv50_grctx_init(struct nouveau_grctx *ctx)
- 				   "the devs.\n");
- 		return -ENOSYS;
- 	}
-+
-+	cp_set (ctx, STATE, RUNNING);
-+	cp_set (ctx, XFER_SWITCH, ENABLE);
- 	/* decide whether we're loading/unloading the context */
- 	cp_bra (ctx, AUTO_SAVE, PENDING, cp_setup_save);
- 	cp_bra (ctx, USER_SAVE, PENDING, cp_setup_save);
-@@ -260,6 +269,8 @@ nv50_grctx_init(struct nouveau_grctx *ctx)
- 	cp_name(ctx, cp_exit);
- 	cp_set (ctx, USER_SAVE, NOT_PENDING);
- 	cp_set (ctx, USER_LOAD, NOT_PENDING);
-+	cp_set (ctx, XFER_SWITCH, DISABLE);
-+	cp_set (ctx, STATE, STOPPED);
- 	cp_out (ctx, CP_END);
- 	ctx->ctxvals_pos += 0x400; /* padding... no idea why you need it */
- 
-diff --git a/drivers/gpu/drm/nouveau/nv50_pm.c b/drivers/gpu/drm/nouveau/nv50_pm.c
-index 8a28100..3d5a86b 100644
---- a/drivers/gpu/drm/nouveau/nv50_pm.c
-+++ b/drivers/gpu/drm/nouveau/nv50_pm.c
-@@ -115,15 +115,15 @@ nv50_pm_clock_set(struct drm_device *dev, void *pre_state)
- 	    BIT_M.version == 1 && BIT_M.length >= 0x0b) {
- 		script = ROM16(BIT_M.data[0x05]);
- 		if (script)
--			nouveau_bios_run_init_table(dev, script, NULL);
-+			nouveau_bios_run_init_table(dev, script, NULL, -1);
- 		script = ROM16(BIT_M.data[0x07]);
- 		if (script)
--			nouveau_bios_run_init_table(dev, script, NULL);
-+			nouveau_bios_run_init_table(dev, script, NULL, -1);
- 		script = ROM16(BIT_M.data[0x09]);
- 		if (script)
--			nouveau_bios_run_init_table(dev, script, NULL);
-+			nouveau_bios_run_init_table(dev, script, NULL, -1);
- 
--		nouveau_bios_run_init_table(dev, perflvl->memscript, NULL);
-+		nouveau_bios_run_init_table(dev, perflvl->memscript, NULL, -1);
- 	}
- 
- 	if (state->type == PLL_MEMORY) {
-diff --git a/drivers/gpu/drm/nouveau/nv50_sor.c b/drivers/gpu/drm/nouveau/nv50_sor.c
-index ffe8b48..2633aa8 100644
---- a/drivers/gpu/drm/nouveau/nv50_sor.c
-+++ b/drivers/gpu/drm/nouveau/nv50_sor.c
-@@ -124,7 +124,7 @@ nv50_sor_dpms(struct drm_encoder *encoder, int mode)
- 		if (mode == DRM_MODE_DPMS_ON) {
- 			u8 status = DP_SET_POWER_D0;
- 			nouveau_dp_auxch(auxch, 8, DP_SET_POWER, &status, 1);
--			nouveau_dp_link_train(encoder);
-+			nouveau_dp_link_train(encoder, nv_encoder->dp.datarate);
- 		} else {
- 			u8 status = DP_SET_POWER_D3;
- 			nouveau_dp_auxch(auxch, 8, DP_SET_POWER, &status, 1);
-@@ -187,14 +187,13 @@ nv50_sor_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
- 	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
- 	struct drm_device *dev = encoder->dev;
- 	struct nouveau_crtc *crtc = nouveau_crtc(encoder->crtc);
-+	struct nouveau_connector *nv_connector;
- 	uint32_t mode_ctl = 0;
- 	int ret;
- 
- 	NV_DEBUG_KMS(dev, "or %d type %d -> crtc %d\n",
- 		     nv_encoder->or, nv_encoder->dcb->type, crtc->index);
- 
--	nv50_sor_dpms(encoder, DRM_MODE_DPMS_ON);
--
- 	switch (nv_encoder->dcb->type) {
- 	case OUTPUT_TMDS:
- 		if (nv_encoder->dcb->sorconf.link & 1) {
-@@ -206,7 +205,15 @@ nv50_sor_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
- 			mode_ctl = 0x0200;
- 		break;
- 	case OUTPUT_DP:
--		mode_ctl |= (nv_encoder->dp.mc_unknown << 16);
-+		nv_connector = nouveau_encoder_connector_get(nv_encoder);
-+		if (nv_connector && nv_connector->base.display_info.bpc == 6) {
-+			nv_encoder->dp.datarate = crtc->mode->clock * 18 / 8;
-+			mode_ctl |= 0x00020000;
-+		} else {
-+			nv_encoder->dp.datarate = crtc->mode->clock * 24 / 8;
-+			mode_ctl |= 0x00050000;
-+		}
-+
- 		if (nv_encoder->dcb->sorconf.link & 1)
- 			mode_ctl |= 0x00000800;
- 		else
-@@ -227,6 +234,8 @@ nv50_sor_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
- 	if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC)
- 		mode_ctl |= NV50_EVO_SOR_MODE_CTRL_NVSYNC;
- 
-+	nv50_sor_dpms(encoder, DRM_MODE_DPMS_ON);
-+
- 	ret = RING_SPACE(evo, 2);
- 	if (ret) {
- 		NV_ERROR(dev, "no space while connecting SOR\n");
-@@ -313,31 +322,6 @@ nv50_sor_create(struct drm_connector *connector, struct dcb_entry *entry)
- 	encoder->possible_crtcs = entry->heads;
- 	encoder->possible_clones = 0;
- 
--	if (nv_encoder->dcb->type == OUTPUT_DP) {
--		int or = nv_encoder->or, link = !(entry->dpconf.sor.link & 1);
--		uint32_t tmp;
--
--		tmp = nv_rd32(dev, 0x61c700 + (or * 0x800));
--		if (!tmp)
--			tmp = nv_rd32(dev, 0x610798 + (or * 8));
--
--		switch ((tmp & 0x00000f00) >> 8) {
--		case 8:
--		case 9:
--			nv_encoder->dp.mc_unknown = (tmp & 0x000f0000) >> 16;
--			tmp = nv_rd32(dev, NV50_SOR_DP_CTRL(or, link));
--			nv_encoder->dp.unk0 = tmp & 0x000001fc;
--			tmp = nv_rd32(dev, NV50_SOR_DP_UNK128(or, link));
--			nv_encoder->dp.unk1 = tmp & 0x010f7f3f;
--			break;
--		default:
--			break;
--		}
--
--		if (!nv_encoder->dp.mc_unknown)
--			nv_encoder->dp.mc_unknown = 5;
--	}
--
- 	drm_mode_connector_attach_encoder(connector, encoder);
- 	return 0;
- }
-diff --git a/drivers/gpu/drm/nouveau/nv50_vram.c b/drivers/gpu/drm/nouveau/nv50_vram.c
-index af32dae..9da2383 100644
---- a/drivers/gpu/drm/nouveau/nv50_vram.c
-+++ b/drivers/gpu/drm/nouveau/nv50_vram.c
-@@ -51,7 +51,7 @@ void
- nv50_vram_del(struct drm_device *dev, struct nouveau_mem **pmem)
- {
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
--	struct nouveau_mm *mm = dev_priv->engine.vram.mm;
-+	struct nouveau_mm *mm = &dev_priv->engine.vram.mm;
- 	struct nouveau_mm_node *this;
- 	struct nouveau_mem *mem;
- 
-@@ -82,7 +82,7 @@ nv50_vram_new(struct drm_device *dev, u64 size, u32 align, u32 size_nc,
- 	      u32 memtype, struct nouveau_mem **pmem)
- {
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
--	struct nouveau_mm *mm = dev_priv->engine.vram.mm;
-+	struct nouveau_mm *mm = &dev_priv->engine.vram.mm;
- 	struct nouveau_mm_node *r;
- 	struct nouveau_mem *mem;
- 	int comp = (memtype & 0x300) >> 8;
-diff --git a/drivers/gpu/drm/nouveau/nva3_pm.c b/drivers/gpu/drm/nouveau/nva3_pm.c
-index e4b2b9e..618c144 100644
---- a/drivers/gpu/drm/nouveau/nva3_pm.c
-+++ b/drivers/gpu/drm/nouveau/nva3_pm.c
-@@ -27,178 +27,316 @@
- #include "nouveau_bios.h"
- #include "nouveau_pm.h"
- 
--/* This is actually a lot more complex than it appears here, but hopefully
-- * this should be able to deal with what the VBIOS leaves for us..
-- *
-- * If not, well, I'll jump off that bridge when I come to it.
-- */
-+static u32 read_clk(struct drm_device *, int, bool);
-+static u32 read_pll(struct drm_device *, int, u32);
- 
--struct nva3_pm_state {
--	enum pll_types type;
--	u32 src0;
--	u32 src1;
--	u32 ctrl;
--	u32 coef;
--	u32 old_pnm;
--	u32 new_pnm;
--	u32 new_div;
--};
-+static u32
-+read_vco(struct drm_device *dev, int clk)
-+{
-+	u32 sctl = nv_rd32(dev, 0x4120 + (clk * 4));
-+	if ((sctl & 0x00000030) != 0x00000030)
-+		return read_pll(dev, 0x41, 0x00e820);
-+	return read_pll(dev, 0x42, 0x00e8a0);
-+}
- 
--static int
--nva3_pm_pll_offset(u32 id)
-+static u32
-+read_clk(struct drm_device *dev, int clk, bool ignore_en)
- {
--	static const u32 pll_map[] = {
--		0x00, PLL_CORE,
--		0x01, PLL_SHADER,
--		0x02, PLL_MEMORY,
--		0x00, 0x00
--	};
--	const u32 *map = pll_map;
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	u32 sctl, sdiv, sclk;
- 
--	while (map[1]) {
--		if (id == map[1])
--			return map[0];
--		map += 2;
-+	/* refclk for the 0xe8xx plls is a fixed frequency */
-+	if (clk >= 0x40) {
-+		if (dev_priv->chipset == 0xaf) {
-+			/* no joke.. seriously.. sigh.. */
-+			return nv_rd32(dev, 0x00471c) * 1000;
-+		}
-+
-+		return dev_priv->crystal;
- 	}
- 
--	return -ENOENT;
-+	sctl = nv_rd32(dev, 0x4120 + (clk * 4));
-+	if (!ignore_en && !(sctl & 0x00000100))
-+		return 0;
-+
-+	switch (sctl & 0x00003000) {
-+	case 0x00000000:
-+		return dev_priv->crystal;
-+	case 0x00002000:
-+		if (sctl & 0x00000040)
-+			return 108000;
-+		return 100000;
-+	case 0x00003000:
-+		sclk = read_vco(dev, clk);
-+		sdiv = ((sctl & 0x003f0000) >> 16) + 2;
-+		return (sclk * 2) / sdiv;
-+	default:
-+		return 0;
-+	}
- }
- 
--int
--nva3_pm_clock_get(struct drm_device *dev, u32 id)
-+static u32
-+read_pll(struct drm_device *dev, int clk, u32 pll)
-+{
-+	u32 ctrl = nv_rd32(dev, pll + 0);
-+	u32 sclk = 0, P = 1, N = 1, M = 1;
-+
-+	if (!(ctrl & 0x00000008)) {
-+		if (ctrl & 0x00000001) {
-+			u32 coef = nv_rd32(dev, pll + 4);
-+			M = (coef & 0x000000ff) >> 0;
-+			N = (coef & 0x0000ff00) >> 8;
-+			P = (coef & 0x003f0000) >> 16;
-+
-+			/* no post-divider on these.. */
-+			if ((pll & 0x00ff00) == 0x00e800)
-+				P = 1;
-+
-+			sclk = read_clk(dev, 0x00 + clk, false);
-+		}
-+	} else {
-+		sclk = read_clk(dev, 0x10 + clk, false);
-+	}
-+
-+	return sclk * N / (M * P);
-+}
-+
-+struct creg {
-+	u32 clk;
-+	u32 pll;
-+};
-+
-+static int
-+calc_clk(struct drm_device *dev, int clk, u32 pll, u32 khz, struct creg *reg)
- {
--	u32 src0, src1, ctrl, coef;
--	struct pll_lims pll;
--	int ret, off;
--	int P, N, M;
-+	struct pll_lims limits;
-+	u32 oclk, sclk, sdiv;
-+	int P, N, M, diff;
-+	int ret;
-+
-+	reg->pll = 0;
-+	reg->clk = 0;
-+	if (!khz) {
-+		NV_DEBUG(dev, "no clock for 0x%04x/0x%02x\n", pll, clk);
-+		return 0;
-+	}
-+
-+	switch (khz) {
-+	case 27000:
-+		reg->clk = 0x00000100;
-+		return khz;
-+	case 100000:
-+		reg->clk = 0x00002100;
-+		return khz;
-+	case 108000:
-+		reg->clk = 0x00002140;
-+		return khz;
-+	default:
-+		sclk = read_vco(dev, clk);
-+		sdiv = min((sclk * 2) / (khz - 2999), (u32)65);
-+		/* if the clock has a PLL attached, and we can get a within
-+		 * [-2, 3) MHz of a divider, we'll disable the PLL and use
-+		 * the divider instead.
-+		 *
-+		 * divider can go as low as 2, limited here because NVIDIA
-+		 * and the VBIOS on my NVA8 seem to prefer using the PLL
-+		 * for 810MHz - is there a good reason?
-+		 */
-+		if (sdiv > 4) {
-+			oclk = (sclk * 2) / sdiv;
-+			diff = khz - oclk;
-+			if (!pll || (diff >= -2000 && diff < 3000)) {
-+				reg->clk = (((sdiv - 2) << 16) | 0x00003100);
-+				return oclk;
-+			}
-+		}
- 
--	ret = get_pll_limits(dev, id, &pll);
-+		if (!pll) {
-+			NV_ERROR(dev, "bad freq %02x: %d %d\n", clk, khz, sclk);
-+			return -ERANGE;
-+		}
-+
-+		break;
-+	}
-+
-+	ret = get_pll_limits(dev, pll, &limits);
- 	if (ret)
- 		return ret;
- 
--	off = nva3_pm_pll_offset(id);
--	if (off < 0)
--		return off;
-+	limits.refclk = read_clk(dev, clk - 0x10, true);
-+	if (!limits.refclk)
-+		return -EINVAL;
-+
-+	ret = nva3_calc_pll(dev, &limits, khz, &N, NULL, &M, &P);
-+	if (ret >= 0) {
-+		reg->clk = nv_rd32(dev, 0x4120 + (clk * 4));
-+		reg->pll = (P << 16) | (N << 8) | M;
-+	}
-+	return ret;
-+}
-+
-+static void
-+prog_pll(struct drm_device *dev, int clk, u32 pll, struct creg *reg)
-+{
-+	const u32 src0 = 0x004120 + (clk * 4);
-+	const u32 src1 = 0x004160 + (clk * 4);
-+	const u32 ctrl = pll + 0;
-+	const u32 coef = pll + 4;
-+	u32 cntl;
-+
-+	if (!reg->clk && !reg->pll) {
-+		NV_DEBUG(dev, "no clock for %02x\n", clk);
-+		return;
-+	}
- 
--	src0 = nv_rd32(dev, 0x4120 + (off * 4));
--	src1 = nv_rd32(dev, 0x4160 + (off * 4));
--	ctrl = nv_rd32(dev, pll.reg + 0);
--	coef = nv_rd32(dev, pll.reg + 4);
--	NV_DEBUG(dev, "PLL %02x: 0x%08x 0x%08x 0x%08x 0x%08x\n",
--		      id, src0, src1, ctrl, coef);
-+	cntl = nv_rd32(dev, ctrl) & 0xfffffff2;
-+	if (reg->pll) {
-+		nv_mask(dev, src0, 0x00000101, 0x00000101);
-+		nv_wr32(dev, coef, reg->pll);
-+		nv_wr32(dev, ctrl, cntl | 0x00000015);
-+		nv_mask(dev, src1, 0x00000100, 0x00000000);
-+		nv_mask(dev, src1, 0x00000001, 0x00000000);
-+	} else {
-+		nv_mask(dev, src1, 0x003f3141, 0x00000101 | reg->clk);
-+		nv_wr32(dev, ctrl, cntl | 0x0000001d);
-+		nv_mask(dev, ctrl, 0x00000001, 0x00000000);
-+		nv_mask(dev, src0, 0x00000100, 0x00000000);
-+		nv_mask(dev, src0, 0x00000001, 0x00000000);
-+	}
-+}
- 
--	if (ctrl & 0x00000008) {
--		u32 div = ((src1 & 0x003c0000) >> 18) + 1;
--		return (pll.refclk * 2) / div;
-+static void
-+prog_clk(struct drm_device *dev, int clk, struct creg *reg)
-+{
-+	if (!reg->clk) {
-+		NV_DEBUG(dev, "no clock for %02x\n", clk);
-+		return;
- 	}
- 
--	P = (coef & 0x003f0000) >> 16;
--	N = (coef & 0x0000ff00) >> 8;
--	M = (coef & 0x000000ff);
--	return pll.refclk * N / M / P;
-+	nv_mask(dev, 0x004120 + (clk * 4), 0x003f3141, 0x00000101 | reg->clk);
-+}
-+
-+int
-+nva3_pm_clocks_get(struct drm_device *dev, struct nouveau_pm_level *perflvl)
-+{
-+	perflvl->core   = read_pll(dev, 0x00, 0x4200);
-+	perflvl->shader = read_pll(dev, 0x01, 0x4220);
-+	perflvl->memory = read_pll(dev, 0x02, 0x4000);
-+	perflvl->unka0  = read_clk(dev, 0x20, false);
-+	perflvl->vdec   = read_clk(dev, 0x21, false);
-+	perflvl->daemon = read_clk(dev, 0x25, false);
-+	perflvl->copy   = perflvl->core;
-+	return 0;
- }
- 
-+struct nva3_pm_state {
-+	struct creg nclk;
-+	struct creg sclk;
-+	struct creg mclk;
-+	struct creg vdec;
-+	struct creg unka0;
-+};
-+
- void *
--nva3_pm_clock_pre(struct drm_device *dev, struct nouveau_pm_level *perflvl,
--		  u32 id, int khz)
-+nva3_pm_clocks_pre(struct drm_device *dev, struct nouveau_pm_level *perflvl)
- {
--	struct nva3_pm_state *pll;
--	struct pll_lims limits;
--	int N, M, P, diff;
--	int ret, off;
-+	struct nva3_pm_state *info;
-+	int ret;
- 
--	ret = get_pll_limits(dev, id, &limits);
--	if (ret < 0)
--		return (ret == -ENOENT) ? NULL : ERR_PTR(ret);
-+	info = kzalloc(sizeof(*info), GFP_KERNEL);
-+	if (!info)
-+		return ERR_PTR(-ENOMEM);
- 
--	off = nva3_pm_pll_offset(id);
--	if (id < 0)
--		return ERR_PTR(-EINVAL);
-+	ret = calc_clk(dev, 0x10, 0x4200, perflvl->core, &info->nclk);
-+	if (ret < 0)
-+		goto out;
- 
-+	ret = calc_clk(dev, 0x11, 0x4220, perflvl->shader, &info->sclk);
-+	if (ret < 0)
-+		goto out;
- 
--	pll = kzalloc(sizeof(*pll), GFP_KERNEL);
--	if (!pll)
--		return ERR_PTR(-ENOMEM);
--	pll->type = id;
--	pll->src0 = 0x004120 + (off * 4);
--	pll->src1 = 0x004160 + (off * 4);
--	pll->ctrl = limits.reg + 0;
--	pll->coef = limits.reg + 4;
-+	ret = calc_clk(dev, 0x12, 0x4000, perflvl->memory, &info->mclk);
-+	if (ret < 0)
-+		goto out;
- 
--	/* If target clock is within [-2, 3) MHz of a divisor, we'll
--	 * use that instead of calculating MNP values
--	 */
--	pll->new_div = min((limits.refclk * 2) / (khz - 2999), 16);
--	if (pll->new_div) {
--		diff = khz - ((limits.refclk * 2) / pll->new_div);
--		if (diff < -2000 || diff >= 3000)
--			pll->new_div = 0;
--	}
-+	ret = calc_clk(dev, 0x20, 0x0000, perflvl->unka0, &info->unka0);
-+	if (ret < 0)
-+		goto out;
- 
--	if (!pll->new_div) {
--		ret = nva3_calc_pll(dev, &limits, khz, &N, NULL, &M, &P);
--		if (ret < 0)
--			return ERR_PTR(ret);
-+	ret = calc_clk(dev, 0x21, 0x0000, perflvl->vdec, &info->vdec);
-+	if (ret < 0)
-+		goto out;
- 
--		pll->new_pnm = (P << 16) | (N << 8) | M;
--		pll->new_div = 2 - 1;
--	} else {
--		pll->new_pnm = 0;
--		pll->new_div--;
-+out:
-+	if (ret < 0) {
-+		kfree(info);
-+		info = ERR_PTR(ret);
- 	}
-+	return info;
-+}
-+
-+static bool
-+nva3_pm_grcp_idle(void *data)
-+{
-+	struct drm_device *dev = data;
- 
--	if ((nv_rd32(dev, pll->src1) & 0x00000101) != 0x00000101)
--		pll->old_pnm = nv_rd32(dev, pll->coef);
--	return pll;
-+	if (!(nv_rd32(dev, 0x400304) & 0x00000001))
-+		return true;
-+	if (nv_rd32(dev, 0x400308) == 0x0050001c)
-+		return true;
-+	return false;
- }
- 
- void
--nva3_pm_clock_set(struct drm_device *dev, void *pre_state)
-+nva3_pm_clocks_set(struct drm_device *dev, void *pre_state)
- {
--	struct nva3_pm_state *pll = pre_state;
--	u32 ctrl = 0;
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nva3_pm_state *info = pre_state;
-+	unsigned long flags;
- 
--	/* For the memory clock, NVIDIA will build a "script" describing
--	 * the reclocking process and ask PDAEMON to execute it.
--	 */
--	if (pll->type == PLL_MEMORY) {
--		nv_wr32(dev, 0x100210, 0);
--		nv_wr32(dev, 0x1002dc, 1);
--		nv_wr32(dev, 0x004018, 0x00001000);
--		ctrl = 0x18000100;
-+	/* prevent any new grctx switches from starting */
-+	spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
-+	nv_wr32(dev, 0x400324, 0x00000000);
-+	nv_wr32(dev, 0x400328, 0x0050001c); /* wait flag 0x1c */
-+	/* wait for any pending grctx switches to complete */
-+	if (!nv_wait_cb(dev, nva3_pm_grcp_idle, dev)) {
-+		NV_ERROR(dev, "pm: ctxprog didn't go idle\n");
-+		goto cleanup;
- 	}
--
--	if (pll->old_pnm || !pll->new_pnm) {
--		nv_mask(dev, pll->src1, 0x003c0101, 0x00000101 |
--						    (pll->new_div << 18));
--		nv_wr32(dev, pll->ctrl, 0x0001001d | ctrl);
--		nv_mask(dev, pll->ctrl, 0x00000001, 0x00000000);
-+	/* freeze PFIFO */
-+	nv_mask(dev, 0x002504, 0x00000001, 0x00000001);
-+	if (!nv_wait(dev, 0x002504, 0x00000010, 0x00000010)) {
-+		NV_ERROR(dev, "pm: fifo didn't go idle\n");
-+		goto cleanup;
- 	}
- 
--	if (pll->new_pnm) {
--		nv_mask(dev, pll->src0, 0x00000101, 0x00000101);
--		nv_wr32(dev, pll->coef, pll->new_pnm);
--		nv_wr32(dev, pll->ctrl, 0x0001001d | ctrl);
--		nv_mask(dev, pll->ctrl, 0x00000010, 0x00000000);
--		nv_mask(dev, pll->ctrl, 0x00020010, 0x00020010);
--		nv_wr32(dev, pll->ctrl, 0x00010015 | ctrl);
--		nv_mask(dev, pll->src1, 0x00000100, 0x00000000);
--		nv_mask(dev, pll->src1, 0x00000001, 0x00000000);
--		if (pll->type == PLL_MEMORY)
--			nv_wr32(dev, 0x4018, 0x10005000);
--	} else {
--		nv_mask(dev, pll->ctrl, 0x00000001, 0x00000000);
--		nv_mask(dev, pll->src0, 0x00000100, 0x00000000);
--		nv_mask(dev, pll->src0, 0x00000001, 0x00000000);
--		if (pll->type == PLL_MEMORY)
--			nv_wr32(dev, 0x4018, 0x1000d000);
--	}
-+	prog_pll(dev, 0x00, 0x004200, &info->nclk);
-+	prog_pll(dev, 0x01, 0x004220, &info->sclk);
-+	prog_clk(dev, 0x20, &info->unka0);
-+	prog_clk(dev, 0x21, &info->vdec);
- 
--	if (pll->type == PLL_MEMORY) {
-+	if (info->mclk.clk || info->mclk.pll) {
-+		nv_wr32(dev, 0x100210, 0);
-+		nv_wr32(dev, 0x1002dc, 1);
-+		nv_wr32(dev, 0x004018, 0x00001000);
-+		prog_pll(dev, 0x02, 0x004000, &info->mclk);
-+		if (nv_rd32(dev, 0x4000) & 0x00000008)
-+			nv_wr32(dev, 0x004018, 0x1000d000);
-+		else
-+			nv_wr32(dev, 0x004018, 0x10005000);
- 		nv_wr32(dev, 0x1002dc, 0);
- 		nv_wr32(dev, 0x100210, 0x80000000);
- 	}
- 
--	kfree(pll);
-+cleanup:
-+	/* unfreeze PFIFO */
-+	nv_mask(dev, 0x002504, 0x00000001, 0x00000000);
-+	/* restore ctxprog to normal */
-+	nv_wr32(dev, 0x400324, 0x00000000);
-+	nv_wr32(dev, 0x400328, 0x0070009c); /* set flag 0x1c */
-+	/* unblock it if necessary */
-+	if (nv_rd32(dev, 0x400308) == 0x0050001c)
-+		nv_mask(dev, 0x400824, 0x10000000, 0x10000000);
-+	spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
-+	kfree(info);
- }
--
-diff --git a/drivers/gpu/drm/nouveau/nvc0_fb.c b/drivers/gpu/drm/nouveau/nvc0_fb.c
-index 08e6b11..5bf5503 100644
---- a/drivers/gpu/drm/nouveau/nvc0_fb.c
-+++ b/drivers/gpu/drm/nouveau/nvc0_fb.c
-@@ -32,6 +32,30 @@ struct nvc0_fb_priv {
- 	dma_addr_t r100c10;
- };
- 
-+static inline void
-+nvc0_mfb_subp_isr(struct drm_device *dev, int unit, int subp)
-+{
-+	u32 subp_base = 0x141000 + (unit * 0x2000) + (subp * 0x400);
-+	u32 stat = nv_rd32(dev, subp_base + 0x020);
-+
-+	if (stat) {
-+		NV_INFO(dev, "PMFB%d_SUBP%d: 0x%08x\n", unit, subp, stat);
-+		nv_wr32(dev, subp_base + 0x020, stat);
-+	}
-+}
-+
-+static void
-+nvc0_mfb_isr(struct drm_device *dev)
-+{
-+	u32 units = nv_rd32(dev, 0x00017c);
-+	while (units) {
-+		u32 subp, unit = ffs(units) - 1;
-+		for (subp = 0; subp < 2; subp++)
-+			nvc0_mfb_subp_isr(dev, unit, subp);
-+		units &= ~(1 << unit);
-+	}
-+}
-+
- static void
- nvc0_fb_destroy(struct drm_device *dev)
- {
-@@ -39,6 +63,8 @@ nvc0_fb_destroy(struct drm_device *dev)
- 	struct nouveau_fb_engine *pfb = &dev_priv->engine.fb;
- 	struct nvc0_fb_priv *priv = pfb->priv;
- 
-+	nouveau_irq_unregister(dev, 25);
-+
- 	if (priv->r100c10_page) {
- 		pci_unmap_page(dev->pdev, priv->r100c10, PAGE_SIZE,
- 			       PCI_DMA_BIDIRECTIONAL);
-@@ -74,6 +100,7 @@ nvc0_fb_create(struct drm_device *dev)
- 		return -EFAULT;
- 	}
- 
-+	nouveau_irq_register(dev, 25, nvc0_mfb_isr);
- 	return 0;
- }
- 
-diff --git a/drivers/gpu/drm/nouveau/nvc0_fifo.c b/drivers/gpu/drm/nouveau/nvc0_fifo.c
-index 6f9f341..dcbe0d5 100644
---- a/drivers/gpu/drm/nouveau/nvc0_fifo.c
-+++ b/drivers/gpu/drm/nouveau/nvc0_fifo.c
-@@ -322,7 +322,7 @@ nvc0_fifo_init(struct drm_device *dev)
- 	}
- 
- 	/* PSUBFIFO[n] */
--	for (i = 0; i < 3; i++) {
-+	for (i = 0; i < priv->spoon_nr; i++) {
- 		nv_mask(dev, 0x04013c + (i * 0x2000), 0x10000100, 0x00000000);
- 		nv_wr32(dev, 0x040108 + (i * 0x2000), 0xffffffff); /* INTR */
- 		nv_wr32(dev, 0x04010c + (i * 0x2000), 0xfffffeff); /* INTR_EN */
-diff --git a/drivers/gpu/drm/nouveau/nvc0_graph.c b/drivers/gpu/drm/nouveau/nvc0_graph.c
-index 5b2f6f4..4b8d0b3 100644
---- a/drivers/gpu/drm/nouveau/nvc0_graph.c
-+++ b/drivers/gpu/drm/nouveau/nvc0_graph.c
-@@ -390,7 +390,7 @@ nvc0_graph_init_gpc_0(struct drm_device *dev)
- 	}
- 
- 	nv_wr32(dev, GPC_BCAST(0x1bd4), magicgpc918);
--	nv_wr32(dev, GPC_BCAST(0x08ac), priv->rop_nr);
-+	nv_wr32(dev, GPC_BCAST(0x08ac), nv_rd32(dev, 0x100800));
- }
- 
- static void
-@@ -700,22 +700,6 @@ nvc0_graph_isr(struct drm_device *dev)
- 	nv_wr32(dev, 0x400500, 0x00010001);
- }
- 
--static void
--nvc0_runk140_isr(struct drm_device *dev)
--{
--	u32 units = nv_rd32(dev, 0x00017c) & 0x1f;
--
--	while (units) {
--		u32 unit = ffs(units) - 1;
--		u32 reg = 0x140000 + unit * 0x2000;
--		u32 st0 = nv_mask(dev, reg + 0x1020, 0, 0);
--		u32 st1 = nv_mask(dev, reg + 0x1420, 0, 0);
--
--		NV_DEBUG(dev, "PRUNK140: %d 0x%08x 0x%08x\n", unit, st0, st1);
--		units &= ~(1 << unit);
--	}
--}
--
- static int
- nvc0_graph_create_fw(struct drm_device *dev, const char *fwname,
- 		     struct nvc0_graph_fuc *fuc)
-@@ -764,7 +748,6 @@ nvc0_graph_destroy(struct drm_device *dev, int engine)
- 	}
- 
- 	nouveau_irq_unregister(dev, 12);
--	nouveau_irq_unregister(dev, 25);
- 
- 	nouveau_gpuobj_ref(NULL, &priv->unk4188b8);
- 	nouveau_gpuobj_ref(NULL, &priv->unk4188b4);
-@@ -803,7 +786,6 @@ nvc0_graph_create(struct drm_device *dev)
- 
- 	NVOBJ_ENGINE_ADD(dev, GR, &priv->base);
- 	nouveau_irq_register(dev, 12, nvc0_graph_isr);
--	nouveau_irq_register(dev, 25, nvc0_runk140_isr);
- 
- 	if (nouveau_ctxfw) {
- 		NV_INFO(dev, "PGRAPH: using external firmware\n");
-@@ -864,6 +846,9 @@ nvc0_graph_create(struct drm_device *dev)
- 	case 0xce: /* 4/4/0/0, 4 */
- 		priv->magic_not_rop_nr = 0x03;
- 		break;
-+	case 0xcf: /* 4/0/0/0, 3 */
-+		priv->magic_not_rop_nr = 0x03;
-+		break;
- 	}
- 
- 	if (!priv->magic_not_rop_nr) {
-@@ -889,20 +874,3 @@ error:
- 	nvc0_graph_destroy(dev, NVOBJ_ENGINE_GR);
- 	return ret;
- }
--
--MODULE_FIRMWARE("nouveau/nvc0_fuc409c");
--MODULE_FIRMWARE("nouveau/nvc0_fuc409d");
--MODULE_FIRMWARE("nouveau/nvc0_fuc41ac");
--MODULE_FIRMWARE("nouveau/nvc0_fuc41ad");
--MODULE_FIRMWARE("nouveau/nvc3_fuc409c");
--MODULE_FIRMWARE("nouveau/nvc3_fuc409d");
--MODULE_FIRMWARE("nouveau/nvc3_fuc41ac");
--MODULE_FIRMWARE("nouveau/nvc3_fuc41ad");
--MODULE_FIRMWARE("nouveau/nvc4_fuc409c");
--MODULE_FIRMWARE("nouveau/nvc4_fuc409d");
--MODULE_FIRMWARE("nouveau/nvc4_fuc41ac");
--MODULE_FIRMWARE("nouveau/nvc4_fuc41ad");
--MODULE_FIRMWARE("nouveau/fuc409c");
--MODULE_FIRMWARE("nouveau/fuc409d");
--MODULE_FIRMWARE("nouveau/fuc41ac");
--MODULE_FIRMWARE("nouveau/fuc41ad");
-diff --git a/drivers/gpu/drm/nouveau/nvc0_graph.h b/drivers/gpu/drm/nouveau/nvc0_graph.h
-index 55689e9..636fe98 100644
---- a/drivers/gpu/drm/nouveau/nvc0_graph.h
-+++ b/drivers/gpu/drm/nouveau/nvc0_graph.h
-@@ -82,6 +82,7 @@ nvc0_graph_class(struct drm_device *dev)
- 	case 0xc3:
- 	case 0xc4:
- 	case 0xce: /* guess, mmio trace shows only 0x9097 state */
-+	case 0xcf: /* guess, mmio trace shows only 0x9097 state */
- 		return 0x9097;
- 	case 0xc1:
- 		return 0x9197;
-diff --git a/drivers/gpu/drm/nouveau/nvc0_grctx.c b/drivers/gpu/drm/nouveau/nvc0_grctx.c
-index 31018ea..dd0e6a7 100644
---- a/drivers/gpu/drm/nouveau/nvc0_grctx.c
-+++ b/drivers/gpu/drm/nouveau/nvc0_grctx.c
-@@ -1678,7 +1678,10 @@ nvc0_grctx_generate_tp(struct drm_device *dev)
- 	nv_wr32(dev, 0x419c04, 0x00000006);
- 	nv_wr32(dev, 0x419c08, 0x00000002);
- 	nv_wr32(dev, 0x419c20, 0x00000000);
--	nv_wr32(dev, 0x419cb0, 0x00060048); //XXX: 0xce 0x00020048
-+	if (chipset == 0xce || chipset == 0xcf)
-+		nv_wr32(dev, 0x419cb0, 0x00020048);
-+	else
-+		nv_wr32(dev, 0x419cb0, 0x00060048);
- 	nv_wr32(dev, 0x419ce8, 0x00000000);
- 	nv_wr32(dev, 0x419cf4, 0x00000183);
- 	nv_wr32(dev, 0x419d20, chipset != 0xc1 ? 0x02180000 : 0x12180000);
-@@ -1783,11 +1786,7 @@ nvc0_grctx_generate(struct nouveau_channel *chan)
- 	nv_wr32(dev, 0x40587c, 0x00000000);
- 
- 	if (1) {
--		const u8 chipset_tp_max[] = { 16, 4, 0, 4, 8, 0, 0, 0,
--					      16, 0, 0, 0, 0, 0, 8, 0 };
--		u8 max = chipset_tp_max[dev_priv->chipset & 0x0f];
--		u8 tpnr[GPC_MAX];
--		u8 data[TP_MAX];
-+		u8 tpnr[GPC_MAX], data[TP_MAX];
- 
- 		memcpy(tpnr, priv->tp_nr, sizeof(priv->tp_nr));
- 		memset(data, 0x1f, sizeof(data));
-@@ -1801,7 +1800,7 @@ nvc0_grctx_generate(struct nouveau_channel *chan)
- 			data[tp] = gpc;
- 		}
- 
--		for (i = 0; i < max / 4; i++)
-+		for (i = 0; i < 4; i++)
- 			nv_wr32(dev, 0x4060a8 + (i * 4), ((u32 *)data)[i]);
- 	}
- 
-diff --git a/drivers/gpu/drm/nouveau/nvc0_grgpc.fuc b/drivers/gpu/drm/nouveau/nvc0_grgpc.fuc
-index 0ec2add..06f5e26 100644
---- a/drivers/gpu/drm/nouveau/nvc0_grgpc.fuc
-+++ b/drivers/gpu/drm/nouveau/nvc0_grgpc.fuc
-@@ -77,6 +77,11 @@ chipsets:
- .b16 nvc0_gpc_mmio_tail
- .b16 nvc0_tpc_mmio_head
- .b16 nvc3_tpc_mmio_tail
-+.b8  0xcf 0 0 0
-+.b16 nvc0_gpc_mmio_head
-+.b16 nvc0_gpc_mmio_tail
-+.b16 nvc0_tpc_mmio_head
-+.b16 nvcf_tpc_mmio_tail
- .b8  0 0 0 0
- 
- // GPC mmio lists
-@@ -134,8 +139,9 @@ mmctx_data(0x000750, 2)
- nvc0_tpc_mmio_tail:
- mmctx_data(0x000758, 1)
- mmctx_data(0x0002c4, 1)
--mmctx_data(0x0004bc, 1)
- mmctx_data(0x0006e0, 1)
-+nvcf_tpc_mmio_tail:
-+mmctx_data(0x0004bc, 1)
- nvc3_tpc_mmio_tail:
- mmctx_data(0x000544, 1)
- nvc1_tpc_mmio_tail:
-diff --git a/drivers/gpu/drm/nouveau/nvc0_grgpc.fuc.h b/drivers/gpu/drm/nouveau/nvc0_grgpc.fuc.h
-index 1896c89..6f82032 100644
---- a/drivers/gpu/drm/nouveau/nvc0_grgpc.fuc.h
-+++ b/drivers/gpu/drm/nouveau/nvc0_grgpc.fuc.h
-@@ -25,23 +25,26 @@ uint32_t nvc0_grgpc_data[] = {
- 	0x00000000,
- 	0x00000000,
- 	0x000000c0,
--	0x011000b0,
--	0x01640114,
-+	0x011c00bc,
-+	0x01700120,
- 	0x000000c1,
--	0x011400b0,
--	0x01780114,
-+	0x012000bc,
-+	0x01840120,
- 	0x000000c3,
--	0x011000b0,
--	0x01740114,
-+	0x011c00bc,
-+	0x01800120,
- 	0x000000c4,
--	0x011000b0,
--	0x01740114,
-+	0x011c00bc,
-+	0x01800120,
- 	0x000000c8,
--	0x011000b0,
--	0x01640114,
-+	0x011c00bc,
-+	0x01700120,
- 	0x000000ce,
--	0x011000b0,
--	0x01740114,
-+	0x011c00bc,
-+	0x01800120,
-+	0x000000cf,
-+	0x011c00bc,
-+	0x017c0120,
- 	0x00000000,
- 	0x00000380,
- 	0x14000400,
-@@ -90,8 +93,8 @@ uint32_t nvc0_grgpc_data[] = {
- 	0x04000750,
- 	0x00000758,
- 	0x000002c4,
--	0x000004bc,
- 	0x000006e0,
-+	0x000004bc,
- 	0x00000544,
- };
- 
-diff --git a/drivers/gpu/drm/nouveau/nvc0_grhub.fuc b/drivers/gpu/drm/nouveau/nvc0_grhub.fuc
-index a1a5991..e4f8c7e 100644
---- a/drivers/gpu/drm/nouveau/nvc0_grhub.fuc
-+++ b/drivers/gpu/drm/nouveau/nvc0_grhub.fuc
-@@ -56,6 +56,9 @@ chipsets:
- .b8  0xce 0 0 0
- .b16 nvc0_hub_mmio_head
- .b16 nvc0_hub_mmio_tail
-+.b8  0xcf 0 0 0
-+.b16 nvc0_hub_mmio_head
-+.b16 nvc0_hub_mmio_tail
- .b8  0 0 0 0
- 
- nvc0_hub_mmio_head:
-diff --git a/drivers/gpu/drm/nouveau/nvc0_grhub.fuc.h b/drivers/gpu/drm/nouveau/nvc0_grhub.fuc.h
-index b3b541b..241d326 100644
---- a/drivers/gpu/drm/nouveau/nvc0_grhub.fuc.h
-+++ b/drivers/gpu/drm/nouveau/nvc0_grhub.fuc.h
-@@ -23,17 +23,19 @@ uint32_t nvc0_grhub_data[] = {
- 	0x00000000,
- 	0x00000000,
- 	0x000000c0,
--	0x012c0090,
-+	0x01340098,
- 	0x000000c1,
--	0x01300090,
-+	0x01380098,
- 	0x000000c3,
--	0x012c0090,
-+	0x01340098,
- 	0x000000c4,
--	0x012c0090,
-+	0x01340098,
- 	0x000000c8,
--	0x012c0090,
-+	0x01340098,
- 	0x000000ce,
--	0x012c0090,
-+	0x01340098,
-+	0x000000cf,
-+	0x01340098,
- 	0x00000000,
- 	0x0417e91c,
- 	0x04400204,
-@@ -190,8 +192,6 @@ uint32_t nvc0_grhub_data[] = {
- 	0x00000000,
- 	0x00000000,
- 	0x00000000,
--	0x00000000,
--	0x00000000,
- };
- 
- uint32_t nvc0_grhub_code[] = {
-diff --git a/drivers/gpu/drm/nouveau/nvc0_pm.c b/drivers/gpu/drm/nouveau/nvc0_pm.c
-new file mode 100644
-index 0000000..929aded
---- /dev/null
-+++ b/drivers/gpu/drm/nouveau/nvc0_pm.c
-@@ -0,0 +1,155 @@
-+/*
-+ * Copyright 2011 Red Hat Inc.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
-+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ * OTHER DEALINGS IN THE SOFTWARE.
-+ *
-+ * Authors: Ben Skeggs
-+ */
-+
-+#include "drmP.h"
-+#include "nouveau_drv.h"
-+#include "nouveau_bios.h"
-+#include "nouveau_pm.h"
-+
-+static u32 read_div(struct drm_device *, int, u32, u32);
-+static u32 read_pll(struct drm_device *, u32);
-+
-+static u32
-+read_vco(struct drm_device *dev, u32 dsrc)
-+{
-+	u32 ssrc = nv_rd32(dev, dsrc);
-+	if (!(ssrc & 0x00000100))
-+		return read_pll(dev, 0x00e800);
-+	return read_pll(dev, 0x00e820);
-+}
-+
-+static u32
-+read_pll(struct drm_device *dev, u32 pll)
-+{
-+	u32 ctrl = nv_rd32(dev, pll + 0);
-+	u32 coef = nv_rd32(dev, pll + 4);
-+	u32 P = (coef & 0x003f0000) >> 16;
-+	u32 N = (coef & 0x0000ff00) >> 8;
-+	u32 M = (coef & 0x000000ff) >> 0;
-+	u32 sclk, doff;
-+
-+	if (!(ctrl & 0x00000001))
-+		return 0;
-+
-+	switch (pll & 0xfff000) {
-+	case 0x00e000:
-+		sclk = 27000;
-+		P = 1;
-+		break;
-+	case 0x137000:
-+		doff = (pll - 0x137000) / 0x20;
-+		sclk = read_div(dev, doff, 0x137120, 0x137140);
-+		break;
-+	case 0x132000:
-+		switch (pll) {
-+		case 0x132000:
-+			sclk = read_pll(dev, 0x132020);
-+			break;
-+		case 0x132020:
-+			sclk = read_div(dev, 0, 0x137320, 0x137330);
-+			break;
-+		default:
-+			return 0;
-+		}
-+		break;
-+	default:
-+		return 0;
-+	}
-+
-+	return sclk * N / M / P;
-+}
-+
-+static u32
-+read_div(struct drm_device *dev, int doff, u32 dsrc, u32 dctl)
-+{
-+	u32 ssrc = nv_rd32(dev, dsrc + (doff * 4));
-+	u32 sctl = nv_rd32(dev, dctl + (doff * 4));
-+
-+	switch (ssrc & 0x00000003) {
-+	case 0:
-+		if ((ssrc & 0x00030000) != 0x00030000)
-+			return 27000;
-+		return 108000;
-+	case 2:
-+		return 100000;
-+	case 3:
-+		if (sctl & 0x80000000) {
-+			u32 sclk = read_vco(dev, dsrc + (doff * 4));
-+			u32 sdiv = (sctl & 0x0000003f) + 2;
-+			return (sclk * 2) / sdiv;
-+		}
-+
-+		return read_vco(dev, dsrc + (doff * 4));
-+	default:
-+		return 0;
-+	}
-+}
-+
-+static u32
-+read_mem(struct drm_device *dev)
-+{
-+	u32 ssel = nv_rd32(dev, 0x1373f0);
-+	if (ssel & 0x00000001)
-+		return read_div(dev, 0, 0x137300, 0x137310);
-+	return read_pll(dev, 0x132000);
-+}
-+
-+static u32
-+read_clk(struct drm_device *dev, int clk)
-+{
-+	u32 sctl = nv_rd32(dev, 0x137250 + (clk * 4));
-+	u32 ssel = nv_rd32(dev, 0x137100);
-+	u32 sclk, sdiv;
-+
-+	if (ssel & (1 << clk)) {
-+		if (clk < 7)
-+			sclk = read_pll(dev, 0x137000 + (clk * 0x20));
-+		else
-+			sclk = read_pll(dev, 0x1370e0);
-+		sdiv = ((sctl & 0x00003f00) >> 8) + 2;
-+	} else {
-+		sclk = read_div(dev, clk, 0x137160, 0x1371d0);
-+		sdiv = ((sctl & 0x0000003f) >> 0) + 2;
-+	}
-+
-+	if (sctl & 0x80000000)
-+		return (sclk * 2) / sdiv;
-+	return sclk;
-+}
-+
-+int
-+nvc0_pm_clocks_get(struct drm_device *dev, struct nouveau_pm_level *perflvl)
-+{
-+	perflvl->shader = read_clk(dev, 0x00);
-+	perflvl->core   = perflvl->shader / 2;
-+	perflvl->memory = read_mem(dev);
-+	perflvl->rop    = read_clk(dev, 0x01);
-+	perflvl->hub07  = read_clk(dev, 0x02);
-+	perflvl->hub06  = read_clk(dev, 0x07);
-+	perflvl->hub01  = read_clk(dev, 0x08);
-+	perflvl->copy   = read_clk(dev, 0x09);
-+	perflvl->daemon = read_clk(dev, 0x0c);
-+	perflvl->vdec   = read_clk(dev, 0x0e);
-+	return 0;
-+}
-diff --git a/drivers/gpu/drm/nouveau/nvc0_vram.c b/drivers/gpu/drm/nouveau/nvc0_vram.c
-index e45a24d..edbfe93 100644
---- a/drivers/gpu/drm/nouveau/nvc0_vram.c
-+++ b/drivers/gpu/drm/nouveau/nvc0_vram.c
-@@ -61,7 +61,7 @@ nvc0_vram_new(struct drm_device *dev, u64 size, u32 align, u32 ncmin,
- 	      u32 type, struct nouveau_mem **pmem)
- {
- 	struct drm_nouveau_private *dev_priv = dev->dev_private;
--	struct nouveau_mm *mm = dev_priv->engine.vram.mm;
-+	struct nouveau_mm *mm = &dev_priv->engine.vram.mm;
- 	struct nouveau_mm_node *r;
- 	struct nouveau_mem *mem;
- 	int ret;
-@@ -106,12 +106,50 @@ nvc0_vram_init(struct drm_device *dev)
- 	struct nouveau_vram_engine *vram = &dev_priv->engine.vram;
- 	const u32 rsvd_head = ( 256 * 1024) >> 12; /* vga memory */
- 	const u32 rsvd_tail = (1024 * 1024) >> 12; /* vbios etc */
--	u32 length;
-+	u32 parts = nv_rd32(dev, 0x121c74);
-+	u32 bsize = nv_rd32(dev, 0x10f20c);
-+	u32 offset, length;
-+	bool uniform = true;
-+	int ret, i;
- 
--	dev_priv->vram_size  = nv_rd32(dev, 0x10f20c) << 20;
--	dev_priv->vram_size *= nv_rd32(dev, 0x121c74);
-+	NV_DEBUG(dev, "0x100800: 0x%08x\n", nv_rd32(dev, 0x100800));
-+	NV_DEBUG(dev, "parts 0x%08x bcast_mem_amount 0x%08x\n", parts, bsize);
- 
--	length = (dev_priv->vram_size >> 12) - rsvd_head - rsvd_tail;
-+	/* read amount of vram attached to each memory controller */
-+	for (i = 0; i < parts; i++) {
-+		u32 psize = nv_rd32(dev, 0x11020c + (i * 0x1000));
-+		if (psize != bsize) {
-+			if (psize < bsize)
-+				bsize = psize;
-+			uniform = false;
-+		}
-+
-+		NV_DEBUG(dev, "%d: mem_amount 0x%08x\n", i, psize);
-+
-+		dev_priv->vram_size += (u64)psize << 20;
-+	}
-+
-+	/* if all controllers have the same amount attached, there's no holes */
-+	if (uniform) {
-+		offset = rsvd_head;
-+		length = (dev_priv->vram_size >> 12) - rsvd_head - rsvd_tail;
-+		return nouveau_mm_init(&vram->mm, offset, length, 1);
-+	}
- 
--	return nouveau_mm_init(&vram->mm, rsvd_head, length, 1);
-+	/* otherwise, address lowest common amount from 0GiB */
-+	ret = nouveau_mm_init(&vram->mm, rsvd_head, (bsize << 8) * parts, 1);
-+	if (ret)
-+		return ret;
-+
-+	/* and the rest starting from (8GiB + common_size) */
-+	offset = (0x0200000000ULL >> 12) + (bsize << 8);
-+	length = (dev_priv->vram_size >> 12) - (bsize << 8) - rsvd_tail;
-+
-+	ret = nouveau_mm_init(&vram->mm, offset, length, 0);
-+	if (ret) {
-+		nouveau_mm_fini(&vram->mm);
-+		return ret;
-+	}
-+
-+	return 0;
- }
-diff --git a/drivers/gpu/drm/nouveau/nvd0_display.c b/drivers/gpu/drm/nouveau/nvd0_display.c
-new file mode 100644
-index 0000000..23d63b4
---- /dev/null
-+++ b/drivers/gpu/drm/nouveau/nvd0_display.c
-@@ -0,0 +1,1473 @@
-+/*
-+ * Copyright 2011 Red Hat Inc.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
-+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ * OTHER DEALINGS IN THE SOFTWARE.
-+ *
-+ * Authors: Ben Skeggs
-+ */
-+
-+#include <linux/dma-mapping.h>
-+
-+#include "drmP.h"
-+#include "drm_crtc_helper.h"
-+
-+#include "nouveau_drv.h"
-+#include "nouveau_connector.h"
-+#include "nouveau_encoder.h"
-+#include "nouveau_crtc.h"
-+#include "nouveau_dma.h"
-+#include "nouveau_fb.h"
-+#include "nv50_display.h"
-+
-+struct nvd0_display {
-+	struct nouveau_gpuobj *mem;
-+	struct {
-+		dma_addr_t handle;
-+		u32 *ptr;
-+	} evo[1];
-+
-+	struct tasklet_struct tasklet;
-+	u32 modeset;
-+};
-+
-+static struct nvd0_display *
-+nvd0_display(struct drm_device *dev)
-+{
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	return dev_priv->engine.display.priv;
-+}
-+
-+static inline int
-+evo_icmd(struct drm_device *dev, int id, u32 mthd, u32 data)
-+{
-+	int ret = 0;
-+	nv_mask(dev, 0x610700 + (id * 0x10), 0x00000001, 0x00000001);
-+	nv_wr32(dev, 0x610704 + (id * 0x10), data);
-+	nv_mask(dev, 0x610704 + (id * 0x10), 0x80000ffc, 0x80000000 | mthd);
-+	if (!nv_wait(dev, 0x610704 + (id * 0x10), 0x80000000, 0x00000000))
-+		ret = -EBUSY;
-+	nv_mask(dev, 0x610700 + (id * 0x10), 0x00000001, 0x00000000);
-+	return ret;
-+}
-+
-+static u32 *
-+evo_wait(struct drm_device *dev, int id, int nr)
-+{
-+	struct nvd0_display *disp = nvd0_display(dev);
-+	u32 put = nv_rd32(dev, 0x640000 + (id * 0x1000)) / 4;
-+
-+	if (put + nr >= (PAGE_SIZE / 4)) {
-+		disp->evo[id].ptr[put] = 0x20000000;
-+
-+		nv_wr32(dev, 0x640000 + (id * 0x1000), 0x00000000);
-+		if (!nv_wait(dev, 0x640004 + (id * 0x1000), ~0, 0x00000000)) {
-+			NV_ERROR(dev, "evo %d dma stalled\n", id);
-+			return NULL;
-+		}
-+
-+		put = 0;
-+	}
-+
-+	return disp->evo[id].ptr + put;
-+}
-+
-+static void
-+evo_kick(u32 *push, struct drm_device *dev, int id)
-+{
-+	struct nvd0_display *disp = nvd0_display(dev);
-+	nv_wr32(dev, 0x640000 + (id * 0x1000), (push - disp->evo[id].ptr) << 2);
-+}
-+
-+#define evo_mthd(p,m,s) *((p)++) = (((s) << 18) | (m))
-+#define evo_data(p,d)   *((p)++) = (d)
-+
-+static struct drm_crtc *
-+nvd0_display_crtc_get(struct drm_encoder *encoder)
-+{
-+	return nouveau_encoder(encoder)->crtc;
-+}
-+
-+/******************************************************************************
-+ * CRTC
-+ *****************************************************************************/
-+static int
-+nvd0_crtc_set_dither(struct nouveau_crtc *nv_crtc, bool on, bool update)
-+{
-+	struct drm_device *dev = nv_crtc->base.dev;
-+	u32 *push, mode;
-+
-+	mode = 0x00000000;
-+	if (on) {
-+		/* 0x11: 6bpc dynamic 2x2
-+		 * 0x13: 8bpc dynamic 2x2
-+		 * 0x19: 6bpc static 2x2
-+		 * 0x1b: 8bpc static 2x2
-+		 * 0x21: 6bpc temporal
-+		 * 0x23: 8bpc temporal
-+		 */
-+		mode = 0x00000011;
-+	}
-+
-+	push = evo_wait(dev, 0, 4);
-+	if (push) {
-+		evo_mthd(push, 0x0490 + (nv_crtc->index * 0x300), 1);
-+		evo_data(push, mode);
-+		if (update) {
-+			evo_mthd(push, 0x0080, 1);
-+			evo_data(push, 0x00000000);
-+		}
-+		evo_kick(push, dev, 0);
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+nvd0_crtc_set_scale(struct nouveau_crtc *nv_crtc, int type, bool update)
-+{
-+	struct drm_display_mode *mode = &nv_crtc->base.mode;
-+	struct drm_device *dev = nv_crtc->base.dev;
-+	struct nouveau_connector *nv_connector;
-+	u32 *push, outX, outY;
-+
-+	outX = mode->hdisplay;
-+	outY = mode->vdisplay;
-+
-+	nv_connector = nouveau_crtc_connector_get(nv_crtc);
-+	if (nv_connector && nv_connector->native_mode) {
-+		struct drm_display_mode *native = nv_connector->native_mode;
-+		u32 xratio = (native->hdisplay << 19) / mode->hdisplay;
-+		u32 yratio = (native->vdisplay << 19) / mode->vdisplay;
-+
-+		switch (type) {
-+		case DRM_MODE_SCALE_ASPECT:
-+			if (xratio > yratio) {
-+				outX = (mode->hdisplay * yratio) >> 19;
-+				outY = (mode->vdisplay * yratio) >> 19;
-+			} else {
-+				outX = (mode->hdisplay * xratio) >> 19;
-+				outY = (mode->vdisplay * xratio) >> 19;
-+			}
-+			break;
-+		case DRM_MODE_SCALE_FULLSCREEN:
-+			outX = native->hdisplay;
-+			outY = native->vdisplay;
-+			break;
-+		default:
-+			break;
-+		}
-+	}
-+
-+	push = evo_wait(dev, 0, 16);
-+	if (push) {
-+		evo_mthd(push, 0x04c0 + (nv_crtc->index * 0x300), 3);
-+		evo_data(push, (outY << 16) | outX);
-+		evo_data(push, (outY << 16) | outX);
-+		evo_data(push, (outY << 16) | outX);
-+		evo_mthd(push, 0x0494 + (nv_crtc->index * 0x300), 1);
-+		evo_data(push, 0x00000000);
-+		evo_mthd(push, 0x04b8 + (nv_crtc->index * 0x300), 1);
-+		evo_data(push, (mode->vdisplay << 16) | mode->hdisplay);
-+		if (update) {
-+			evo_mthd(push, 0x0080, 1);
-+			evo_data(push, 0x00000000);
-+		}
-+		evo_kick(push, dev, 0);
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+nvd0_crtc_set_image(struct nouveau_crtc *nv_crtc, struct drm_framebuffer *fb,
-+		    int x, int y, bool update)
-+{
-+	struct nouveau_framebuffer *nvfb = nouveau_framebuffer(fb);
-+	u32 *push;
-+
-+	push = evo_wait(fb->dev, 0, 16);
-+	if (push) {
-+		evo_mthd(push, 0x0460 + (nv_crtc->index * 0x300), 1);
-+		evo_data(push, nvfb->nvbo->bo.offset >> 8);
-+		evo_mthd(push, 0x0468 + (nv_crtc->index * 0x300), 4);
-+		evo_data(push, (fb->height << 16) | fb->width);
-+		evo_data(push, nvfb->r_pitch);
-+		evo_data(push, nvfb->r_format);
-+		evo_data(push, nvfb->r_dma);
-+		evo_mthd(push, 0x04b0 + (nv_crtc->index * 0x300), 1);
-+		evo_data(push, (y << 16) | x);
-+		if (update) {
-+			evo_mthd(push, 0x0080, 1);
-+			evo_data(push, 0x00000000);
-+		}
-+		evo_kick(push, fb->dev, 0);
-+	}
-+
-+	nv_crtc->fb.tile_flags = nvfb->r_dma;
-+	return 0;
-+}
-+
-+static void
-+nvd0_crtc_cursor_show(struct nouveau_crtc *nv_crtc, bool show, bool update)
-+{
-+	struct drm_device *dev = nv_crtc->base.dev;
-+	u32 *push = evo_wait(dev, 0, 16);
-+	if (push) {
-+		if (show) {
-+			evo_mthd(push, 0x0480 + (nv_crtc->index * 0x300), 2);
-+			evo_data(push, 0x85000000);
-+			evo_data(push, nv_crtc->cursor.nvbo->bo.offset >> 8);
-+			evo_mthd(push, 0x048c + (nv_crtc->index * 0x300), 1);
-+			evo_data(push, NvEvoVRAM);
-+		} else {
-+			evo_mthd(push, 0x0480 + (nv_crtc->index * 0x300), 1);
-+			evo_data(push, 0x05000000);
-+			evo_mthd(push, 0x048c + (nv_crtc->index * 0x300), 1);
-+			evo_data(push, 0x00000000);
-+		}
-+
-+		if (update) {
-+			evo_mthd(push, 0x0080, 1);
-+			evo_data(push, 0x00000000);
-+		}
-+
-+		evo_kick(push, dev, 0);
-+	}
-+}
-+
-+static void
-+nvd0_crtc_dpms(struct drm_crtc *crtc, int mode)
-+{
-+}
-+
-+static void
-+nvd0_crtc_prepare(struct drm_crtc *crtc)
-+{
-+	struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
-+	u32 *push;
-+
-+	push = evo_wait(crtc->dev, 0, 2);
-+	if (push) {
-+		evo_mthd(push, 0x0474 + (nv_crtc->index * 0x300), 1);
-+		evo_data(push, 0x00000000);
-+		evo_mthd(push, 0x0440 + (nv_crtc->index * 0x300), 1);
-+		evo_data(push, 0x03000000);
-+		evo_mthd(push, 0x045c + (nv_crtc->index * 0x300), 1);
-+		evo_data(push, 0x00000000);
-+		evo_kick(push, crtc->dev, 0);
-+	}
-+
-+	nvd0_crtc_cursor_show(nv_crtc, false, false);
-+}
-+
-+static void
-+nvd0_crtc_commit(struct drm_crtc *crtc)
-+{
-+	struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
-+	u32 *push;
-+
-+	push = evo_wait(crtc->dev, 0, 32);
-+	if (push) {
-+		evo_mthd(push, 0x0474 + (nv_crtc->index * 0x300), 1);
-+		evo_data(push, nv_crtc->fb.tile_flags);
-+		evo_mthd(push, 0x0440 + (nv_crtc->index * 0x300), 4);
-+		evo_data(push, 0x83000000);
-+		evo_data(push, nv_crtc->lut.nvbo->bo.offset >> 8);
-+		evo_data(push, 0x00000000);
-+		evo_data(push, 0x00000000);
-+		evo_mthd(push, 0x045c + (nv_crtc->index * 0x300), 1);
-+		evo_data(push, NvEvoVRAM);
-+		evo_mthd(push, 0x0430 + (nv_crtc->index * 0x300), 1);
-+		evo_data(push, 0xffffff00);
-+		evo_kick(push, crtc->dev, 0);
-+	}
-+
-+	nvd0_crtc_cursor_show(nv_crtc, nv_crtc->cursor.visible, true);
-+}
-+
-+static bool
-+nvd0_crtc_mode_fixup(struct drm_crtc *crtc, struct drm_display_mode *mode,
-+		     struct drm_display_mode *adjusted_mode)
-+{
-+	return true;
-+}
-+
-+static int
-+nvd0_crtc_swap_fbs(struct drm_crtc *crtc, struct drm_framebuffer *old_fb)
-+{
-+	struct nouveau_framebuffer *nvfb = nouveau_framebuffer(crtc->fb);
-+	int ret;
-+
-+	ret = nouveau_bo_pin(nvfb->nvbo, TTM_PL_FLAG_VRAM);
-+	if (ret)
-+		return ret;
-+
-+	if (old_fb) {
-+		nvfb = nouveau_framebuffer(old_fb);
-+		nouveau_bo_unpin(nvfb->nvbo);
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+nvd0_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *umode,
-+		   struct drm_display_mode *mode, int x, int y,
-+		   struct drm_framebuffer *old_fb)
-+{
-+	struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
-+	struct nouveau_connector *nv_connector;
-+	u32 htotal = mode->htotal;
-+	u32 vtotal = mode->vtotal;
-+	u32 hsyncw = mode->hsync_end - mode->hsync_start - 1;
-+	u32 vsyncw = mode->vsync_end - mode->vsync_start - 1;
-+	u32 hfrntp = mode->hsync_start - mode->hdisplay;
-+	u32 vfrntp = mode->vsync_start - mode->vdisplay;
-+	u32 hbackp = mode->htotal - mode->hsync_end;
-+	u32 vbackp = mode->vtotal - mode->vsync_end;
-+	u32 hss2be = hsyncw + hbackp;
-+	u32 vss2be = vsyncw + vbackp;
-+	u32 hss2de = htotal - hfrntp;
-+	u32 vss2de = vtotal - vfrntp;
-+	u32 syncs, *push;
-+	int ret;
-+
-+	syncs = 0x00000001;
-+	if (mode->flags & DRM_MODE_FLAG_NHSYNC)
-+		syncs |= 0x00000008;
-+	if (mode->flags & DRM_MODE_FLAG_NVSYNC)
-+		syncs |= 0x00000010;
-+
-+	ret = nvd0_crtc_swap_fbs(crtc, old_fb);
-+	if (ret)
-+		return ret;
-+
-+	push = evo_wait(crtc->dev, 0, 64);
-+	if (push) {
-+		evo_mthd(push, 0x0410 + (nv_crtc->index * 0x300), 5);
-+		evo_data(push, 0x00000000);
-+		evo_data(push, (vtotal << 16) | htotal);
-+		evo_data(push, (vsyncw << 16) | hsyncw);
-+		evo_data(push, (vss2be << 16) | hss2be);
-+		evo_data(push, (vss2de << 16) | hss2de);
-+		evo_mthd(push, 0x042c + (nv_crtc->index * 0x300), 1);
-+		evo_data(push, 0x00000000); /* ??? */
-+		evo_mthd(push, 0x0450 + (nv_crtc->index * 0x300), 3);
-+		evo_data(push, mode->clock * 1000);
-+		evo_data(push, 0x00200000); /* ??? */
-+		evo_data(push, mode->clock * 1000);
-+		evo_mthd(push, 0x0404 + (nv_crtc->index * 0x300), 1);
-+		evo_data(push, syncs);
-+		evo_kick(push, crtc->dev, 0);
-+	}
-+
-+	nv_connector = nouveau_crtc_connector_get(nv_crtc);
-+	nvd0_crtc_set_dither(nv_crtc, nv_connector->use_dithering, false);
-+	nvd0_crtc_set_scale(nv_crtc, nv_connector->scaling_mode, false);
-+	nvd0_crtc_set_image(nv_crtc, crtc->fb, x, y, false);
-+	return 0;
-+}
-+
-+static int
-+nvd0_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
-+			struct drm_framebuffer *old_fb)
-+{
-+	struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
-+	int ret;
-+
-+	if (!crtc->fb) {
-+		NV_DEBUG_KMS(crtc->dev, "No FB bound\n");
-+		return 0;
-+	}
-+
-+	ret = nvd0_crtc_swap_fbs(crtc, old_fb);
-+	if (ret)
-+		return ret;
-+
-+	nvd0_crtc_set_image(nv_crtc, crtc->fb, x, y, true);
-+	return 0;
-+}
-+
-+static int
-+nvd0_crtc_mode_set_base_atomic(struct drm_crtc *crtc,
-+			       struct drm_framebuffer *fb, int x, int y,
-+			       enum mode_set_atomic state)
-+{
-+	struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
-+	nvd0_crtc_set_image(nv_crtc, fb, x, y, true);
-+	return 0;
-+}
-+
-+static void
-+nvd0_crtc_lut_load(struct drm_crtc *crtc)
-+{
-+	struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
-+	void __iomem *lut = nvbo_kmap_obj_iovirtual(nv_crtc->lut.nvbo);
-+	int i;
-+
-+	for (i = 0; i < 256; i++) {
-+		writew(0x6000 + (nv_crtc->lut.r[i] >> 2), lut + (i * 0x20) + 0);
-+		writew(0x6000 + (nv_crtc->lut.g[i] >> 2), lut + (i * 0x20) + 2);
-+		writew(0x6000 + (nv_crtc->lut.b[i] >> 2), lut + (i * 0x20) + 4);
-+	}
-+}
-+
-+static int
-+nvd0_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
-+		     uint32_t handle, uint32_t width, uint32_t height)
-+{
-+	struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
-+	struct drm_device *dev = crtc->dev;
-+	struct drm_gem_object *gem;
-+	struct nouveau_bo *nvbo;
-+	bool visible = (handle != 0);
-+	int i, ret = 0;
-+
-+	if (visible) {
-+		if (width != 64 || height != 64)
-+			return -EINVAL;
-+
-+		gem = drm_gem_object_lookup(dev, file_priv, handle);
-+		if (unlikely(!gem))
-+			return -ENOENT;
-+		nvbo = nouveau_gem_object(gem);
-+
-+		ret = nouveau_bo_map(nvbo);
-+		if (ret == 0) {
-+			for (i = 0; i < 64 * 64; i++) {
-+				u32 v = nouveau_bo_rd32(nvbo, i);
-+				nouveau_bo_wr32(nv_crtc->cursor.nvbo, i, v);
-+			}
-+			nouveau_bo_unmap(nvbo);
-+		}
-+
-+		drm_gem_object_unreference_unlocked(gem);
-+	}
-+
-+	if (visible != nv_crtc->cursor.visible) {
-+		nvd0_crtc_cursor_show(nv_crtc, visible, true);
-+		nv_crtc->cursor.visible = visible;
-+	}
-+
-+	return ret;
-+}
-+
-+static int
-+nvd0_crtc_cursor_move(struct drm_crtc *crtc, int x, int y)
-+{
-+	struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
-+	const u32 data = (y << 16) | x;
-+
-+	nv_wr32(crtc->dev, 0x64d084 + (nv_crtc->index * 0x1000), data);
-+	nv_wr32(crtc->dev, 0x64d080 + (nv_crtc->index * 0x1000), 0x00000000);
-+	return 0;
-+}
-+
-+static void
-+nvd0_crtc_gamma_set(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b,
-+		    uint32_t start, uint32_t size)
-+{
-+	struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
-+	u32 end = max(start + size, (u32)256);
-+	u32 i;
-+
-+	for (i = start; i < end; i++) {
-+		nv_crtc->lut.r[i] = r[i];
-+		nv_crtc->lut.g[i] = g[i];
-+		nv_crtc->lut.b[i] = b[i];
-+	}
-+
-+	nvd0_crtc_lut_load(crtc);
-+}
-+
-+static void
-+nvd0_crtc_destroy(struct drm_crtc *crtc)
-+{
-+	struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
-+	nouveau_bo_unmap(nv_crtc->cursor.nvbo);
-+	nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo);
-+	nouveau_bo_unmap(nv_crtc->lut.nvbo);
-+	nouveau_bo_ref(NULL, &nv_crtc->lut.nvbo);
-+	drm_crtc_cleanup(crtc);
-+	kfree(crtc);
-+}
-+
-+static const struct drm_crtc_helper_funcs nvd0_crtc_hfunc = {
-+	.dpms = nvd0_crtc_dpms,
-+	.prepare = nvd0_crtc_prepare,
-+	.commit = nvd0_crtc_commit,
-+	.mode_fixup = nvd0_crtc_mode_fixup,
-+	.mode_set = nvd0_crtc_mode_set,
-+	.mode_set_base = nvd0_crtc_mode_set_base,
-+	.mode_set_base_atomic = nvd0_crtc_mode_set_base_atomic,
-+	.load_lut = nvd0_crtc_lut_load,
-+};
-+
-+static const struct drm_crtc_funcs nvd0_crtc_func = {
-+	.cursor_set = nvd0_crtc_cursor_set,
-+	.cursor_move = nvd0_crtc_cursor_move,
-+	.gamma_set = nvd0_crtc_gamma_set,
-+	.set_config = drm_crtc_helper_set_config,
-+	.destroy = nvd0_crtc_destroy,
-+};
-+
-+static void
-+nvd0_cursor_set_pos(struct nouveau_crtc *nv_crtc, int x, int y)
-+{
-+}
-+
-+static void
-+nvd0_cursor_set_offset(struct nouveau_crtc *nv_crtc, uint32_t offset)
-+{
-+}
-+
-+static int
-+nvd0_crtc_create(struct drm_device *dev, int index)
-+{
-+	struct nouveau_crtc *nv_crtc;
-+	struct drm_crtc *crtc;
-+	int ret, i;
-+
-+	nv_crtc = kzalloc(sizeof(*nv_crtc), GFP_KERNEL);
-+	if (!nv_crtc)
-+		return -ENOMEM;
-+
-+	nv_crtc->index = index;
-+	nv_crtc->set_dither = nvd0_crtc_set_dither;
-+	nv_crtc->set_scale = nvd0_crtc_set_scale;
-+	nv_crtc->cursor.set_offset = nvd0_cursor_set_offset;
-+	nv_crtc->cursor.set_pos = nvd0_cursor_set_pos;
-+	for (i = 0; i < 256; i++) {
-+		nv_crtc->lut.r[i] = i << 8;
-+		nv_crtc->lut.g[i] = i << 8;
-+		nv_crtc->lut.b[i] = i << 8;
-+	}
-+
-+	crtc = &nv_crtc->base;
-+	drm_crtc_init(dev, crtc, &nvd0_crtc_func);
-+	drm_crtc_helper_add(crtc, &nvd0_crtc_hfunc);
-+	drm_mode_crtc_set_gamma_size(crtc, 256);
-+
-+	ret = nouveau_bo_new(dev, 64 * 64 * 4, 0x100, TTM_PL_FLAG_VRAM,
-+			     0, 0x0000, &nv_crtc->cursor.nvbo);
-+	if (!ret) {
-+		ret = nouveau_bo_pin(nv_crtc->cursor.nvbo, TTM_PL_FLAG_VRAM);
-+		if (!ret)
-+			ret = nouveau_bo_map(nv_crtc->cursor.nvbo);
-+		if (ret)
-+			nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo);
-+	}
-+
-+	if (ret)
-+		goto out;
-+
-+	ret = nouveau_bo_new(dev, 8192, 0x100, TTM_PL_FLAG_VRAM,
-+			     0, 0x0000, &nv_crtc->lut.nvbo);
-+	if (!ret) {
-+		ret = nouveau_bo_pin(nv_crtc->lut.nvbo, TTM_PL_FLAG_VRAM);
-+		if (!ret)
-+			ret = nouveau_bo_map(nv_crtc->lut.nvbo);
-+		if (ret)
-+			nouveau_bo_ref(NULL, &nv_crtc->lut.nvbo);
-+	}
-+
-+	if (ret)
-+		goto out;
-+
-+	nvd0_crtc_lut_load(crtc);
-+
-+out:
-+	if (ret)
-+		nvd0_crtc_destroy(crtc);
-+	return ret;
-+}
-+
-+/******************************************************************************
-+ * DAC
-+ *****************************************************************************/
-+static void
-+nvd0_dac_dpms(struct drm_encoder *encoder, int mode)
-+{
-+	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
-+	struct drm_device *dev = encoder->dev;
-+	int or = nv_encoder->or;
-+	u32 dpms_ctrl;
-+
-+	dpms_ctrl = 0x80000000;
-+	if (mode == DRM_MODE_DPMS_STANDBY || mode == DRM_MODE_DPMS_OFF)
-+		dpms_ctrl |= 0x00000001;
-+	if (mode == DRM_MODE_DPMS_SUSPEND || mode == DRM_MODE_DPMS_OFF)
-+		dpms_ctrl |= 0x00000004;
-+
-+	nv_wait(dev, 0x61a004 + (or * 0x0800), 0x80000000, 0x00000000);
-+	nv_mask(dev, 0x61a004 + (or * 0x0800), 0xc000007f, dpms_ctrl);
-+	nv_wait(dev, 0x61a004 + (or * 0x0800), 0x80000000, 0x00000000);
-+}
-+
-+static bool
-+nvd0_dac_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode,
-+		    struct drm_display_mode *adjusted_mode)
-+{
-+	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
-+	struct nouveau_connector *nv_connector;
-+
-+	nv_connector = nouveau_encoder_connector_get(nv_encoder);
-+	if (nv_connector && nv_connector->native_mode) {
-+		if (nv_connector->scaling_mode != DRM_MODE_SCALE_NONE) {
-+			int id = adjusted_mode->base.id;
-+			*adjusted_mode = *nv_connector->native_mode;
-+			adjusted_mode->base.id = id;
-+		}
-+	}
-+
-+	return true;
-+}
-+
-+static void
-+nvd0_dac_prepare(struct drm_encoder *encoder)
-+{
-+}
-+
-+static void
-+nvd0_dac_commit(struct drm_encoder *encoder)
-+{
-+}
-+
-+static void
-+nvd0_dac_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
-+		  struct drm_display_mode *adjusted_mode)
-+{
-+	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
-+	struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc);
-+	u32 *push;
-+
-+	nvd0_dac_dpms(encoder, DRM_MODE_DPMS_ON);
-+
-+	push = evo_wait(encoder->dev, 0, 4);
-+	if (push) {
-+		evo_mthd(push, 0x0180 + (nv_encoder->or * 0x20), 2);
-+		evo_data(push, 1 << nv_crtc->index);
-+		evo_data(push, 0x00ff);
-+		evo_kick(push, encoder->dev, 0);
-+	}
-+
-+	nv_encoder->crtc = encoder->crtc;
-+}
-+
-+static void
-+nvd0_dac_disconnect(struct drm_encoder *encoder)
-+{
-+	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
-+	struct drm_device *dev = encoder->dev;
-+	u32 *push;
-+
-+	if (nv_encoder->crtc) {
-+		nvd0_crtc_prepare(nv_encoder->crtc);
-+
-+		push = evo_wait(dev, 0, 4);
-+		if (push) {
-+			evo_mthd(push, 0x0180 + (nv_encoder->or * 0x20), 1);
-+			evo_data(push, 0x00000000);
-+			evo_mthd(push, 0x0080, 1);
-+			evo_data(push, 0x00000000);
-+			evo_kick(push, dev, 0);
-+		}
-+
-+		nv_encoder->crtc = NULL;
-+	}
-+}
-+
-+static enum drm_connector_status
-+nvd0_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector)
-+{
-+	enum drm_connector_status status = connector_status_disconnected;
-+	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
-+	struct drm_device *dev = encoder->dev;
-+	int or = nv_encoder->or;
-+	u32 load;
-+
-+	nv_wr32(dev, 0x61a00c + (or * 0x800), 0x00100000);
-+	udelay(9500);
-+	nv_wr32(dev, 0x61a00c + (or * 0x800), 0x80000000);
-+
-+	load = nv_rd32(dev, 0x61a00c + (or * 0x800));
-+	if ((load & 0x38000000) == 0x38000000)
-+		status = connector_status_connected;
-+
-+	nv_wr32(dev, 0x61a00c + (or * 0x800), 0x00000000);
-+	return status;
-+}
-+
-+static void
-+nvd0_dac_destroy(struct drm_encoder *encoder)
-+{
-+	drm_encoder_cleanup(encoder);
-+	kfree(encoder);
-+}
-+
-+static const struct drm_encoder_helper_funcs nvd0_dac_hfunc = {
-+	.dpms = nvd0_dac_dpms,
-+	.mode_fixup = nvd0_dac_mode_fixup,
-+	.prepare = nvd0_dac_prepare,
-+	.commit = nvd0_dac_commit,
-+	.mode_set = nvd0_dac_mode_set,
-+	.disable = nvd0_dac_disconnect,
-+	.get_crtc = nvd0_display_crtc_get,
-+	.detect = nvd0_dac_detect
-+};
-+
-+static const struct drm_encoder_funcs nvd0_dac_func = {
-+	.destroy = nvd0_dac_destroy,
-+};
-+
-+static int
-+nvd0_dac_create(struct drm_connector *connector, struct dcb_entry *dcbe)
-+{
-+	struct drm_device *dev = connector->dev;
-+	struct nouveau_encoder *nv_encoder;
-+	struct drm_encoder *encoder;
-+
-+	nv_encoder = kzalloc(sizeof(*nv_encoder), GFP_KERNEL);
-+	if (!nv_encoder)
-+		return -ENOMEM;
-+	nv_encoder->dcb = dcbe;
-+	nv_encoder->or = ffs(dcbe->or) - 1;
-+
-+	encoder = to_drm_encoder(nv_encoder);
-+	encoder->possible_crtcs = dcbe->heads;
-+	encoder->possible_clones = 0;
-+	drm_encoder_init(dev, encoder, &nvd0_dac_func, DRM_MODE_ENCODER_DAC);
-+	drm_encoder_helper_add(encoder, &nvd0_dac_hfunc);
-+
-+	drm_mode_connector_attach_encoder(connector, encoder);
-+	return 0;
-+}
-+
-+/******************************************************************************
-+ * SOR
-+ *****************************************************************************/
-+static void
-+nvd0_sor_dpms(struct drm_encoder *encoder, int mode)
-+{
-+	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
-+	struct drm_device *dev = encoder->dev;
-+	struct drm_encoder *partner;
-+	int or = nv_encoder->or;
-+	u32 dpms_ctrl;
-+
-+	nv_encoder->last_dpms = mode;
-+
-+	list_for_each_entry(partner, &dev->mode_config.encoder_list, head) {
-+		struct nouveau_encoder *nv_partner = nouveau_encoder(partner);
-+
-+		if (partner->encoder_type != DRM_MODE_ENCODER_TMDS)
-+			continue;
-+
-+		if (nv_partner != nv_encoder &&
-+		    nv_partner->dcb->or == nv_encoder->or) {
-+			if (nv_partner->last_dpms == DRM_MODE_DPMS_ON)
-+				return;
-+			break;
-+		}
-+	}
-+
-+	dpms_ctrl  = (mode == DRM_MODE_DPMS_ON);
-+	dpms_ctrl |= 0x80000000;
-+
-+	nv_wait(dev, 0x61c004 + (or * 0x0800), 0x80000000, 0x00000000);
-+	nv_mask(dev, 0x61c004 + (or * 0x0800), 0x80000001, dpms_ctrl);
-+	nv_wait(dev, 0x61c004 + (or * 0x0800), 0x80000000, 0x00000000);
-+	nv_wait(dev, 0x61c030 + (or * 0x0800), 0x10000000, 0x00000000);
-+}
-+
-+static bool
-+nvd0_sor_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode,
-+		    struct drm_display_mode *adjusted_mode)
-+{
-+	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
-+	struct nouveau_connector *nv_connector;
-+
-+	nv_connector = nouveau_encoder_connector_get(nv_encoder);
-+	if (nv_connector && nv_connector->native_mode) {
-+		if (nv_connector->scaling_mode != DRM_MODE_SCALE_NONE) {
-+			int id = adjusted_mode->base.id;
-+			*adjusted_mode = *nv_connector->native_mode;
-+			adjusted_mode->base.id = id;
-+		}
-+	}
-+
-+	return true;
-+}
-+
-+static void
-+nvd0_sor_prepare(struct drm_encoder *encoder)
-+{
-+}
-+
-+static void
-+nvd0_sor_commit(struct drm_encoder *encoder)
-+{
-+}
-+
-+static void
-+nvd0_sor_mode_set(struct drm_encoder *encoder, struct drm_display_mode *umode,
-+		  struct drm_display_mode *mode)
-+{
-+	struct drm_nouveau_private *dev_priv = encoder->dev->dev_private;
-+	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
-+	struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc);
-+	struct nouveau_connector *nv_connector;
-+	struct nvbios *bios = &dev_priv->vbios;
-+	u32 mode_ctrl = (1 << nv_crtc->index);
-+	u32 *push, or_config;
-+
-+	nv_connector = nouveau_encoder_connector_get(nv_encoder);
-+	switch (nv_encoder->dcb->type) {
-+	case OUTPUT_TMDS:
-+		if (nv_encoder->dcb->sorconf.link & 1) {
-+			if (mode->clock < 165000)
-+				mode_ctrl |= 0x00000100;
-+			else
-+				mode_ctrl |= 0x00000500;
-+		} else {
-+			mode_ctrl |= 0x00000200;
-+		}
-+
-+		or_config = (mode_ctrl & 0x00000f00) >> 8;
-+		if (mode->clock >= 165000)
-+			or_config |= 0x0100;
-+		break;
-+	case OUTPUT_LVDS:
-+		or_config = (mode_ctrl & 0x00000f00) >> 8;
-+		if (bios->fp_no_ddc) {
-+			if (bios->fp.dual_link)
-+				or_config |= 0x0100;
-+			if (bios->fp.if_is_24bit)
-+				or_config |= 0x0200;
-+		} else {
-+			if (nv_connector->dcb->type == DCB_CONNECTOR_LVDS_SPWG) {
-+				if (((u8 *)nv_connector->edid)[121] == 2)
-+					or_config |= 0x0100;
-+			} else
-+			if (mode->clock >= bios->fp.duallink_transition_clk) {
-+				or_config |= 0x0100;
-+			}
-+
-+			if (or_config & 0x0100) {
-+				if (bios->fp.strapless_is_24bit & 2)
-+					or_config |= 0x0200;
-+			} else {
-+				if (bios->fp.strapless_is_24bit & 1)
-+					or_config |= 0x0200;
-+			}
-+
-+			if (nv_connector->base.display_info.bpc == 8)
-+				or_config |= 0x0200;
-+
-+		}
-+		break;
-+	default:
-+		BUG_ON(1);
-+		break;
-+	}
-+
-+	nvd0_sor_dpms(encoder, DRM_MODE_DPMS_ON);
-+
-+	push = evo_wait(encoder->dev, 0, 4);
-+	if (push) {
-+		evo_mthd(push, 0x0200 + (nv_encoder->or * 0x20), 2);
-+		evo_data(push, mode_ctrl);
-+		evo_data(push, or_config);
-+		evo_kick(push, encoder->dev, 0);
-+	}
-+
-+	nv_encoder->crtc = encoder->crtc;
-+}
-+
-+static void
-+nvd0_sor_disconnect(struct drm_encoder *encoder)
-+{
-+	struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
-+	struct drm_device *dev = encoder->dev;
-+	u32 *push;
-+
-+	if (nv_encoder->crtc) {
-+		nvd0_crtc_prepare(nv_encoder->crtc);
-+
-+		push = evo_wait(dev, 0, 4);
-+		if (push) {
-+			evo_mthd(push, 0x0200 + (nv_encoder->or * 0x20), 1);
-+			evo_data(push, 0x00000000);
-+			evo_mthd(push, 0x0080, 1);
-+			evo_data(push, 0x00000000);
-+			evo_kick(push, dev, 0);
-+		}
-+
-+		nv_encoder->crtc = NULL;
-+		nv_encoder->last_dpms = DRM_MODE_DPMS_OFF;
-+	}
-+}
-+
-+static void
-+nvd0_sor_destroy(struct drm_encoder *encoder)
-+{
-+	drm_encoder_cleanup(encoder);
-+	kfree(encoder);
-+}
-+
-+static const struct drm_encoder_helper_funcs nvd0_sor_hfunc = {
-+	.dpms = nvd0_sor_dpms,
-+	.mode_fixup = nvd0_sor_mode_fixup,
-+	.prepare = nvd0_sor_prepare,
-+	.commit = nvd0_sor_commit,
-+	.mode_set = nvd0_sor_mode_set,
-+	.disable = nvd0_sor_disconnect,
-+	.get_crtc = nvd0_display_crtc_get,
-+};
-+
-+static const struct drm_encoder_funcs nvd0_sor_func = {
-+	.destroy = nvd0_sor_destroy,
-+};
-+
-+static int
-+nvd0_sor_create(struct drm_connector *connector, struct dcb_entry *dcbe)
-+{
-+	struct drm_device *dev = connector->dev;
-+	struct nouveau_encoder *nv_encoder;
-+	struct drm_encoder *encoder;
-+
-+	nv_encoder = kzalloc(sizeof(*nv_encoder), GFP_KERNEL);
-+	if (!nv_encoder)
-+		return -ENOMEM;
-+	nv_encoder->dcb = dcbe;
-+	nv_encoder->or = ffs(dcbe->or) - 1;
-+	nv_encoder->last_dpms = DRM_MODE_DPMS_OFF;
-+
-+	encoder = to_drm_encoder(nv_encoder);
-+	encoder->possible_crtcs = dcbe->heads;
-+	encoder->possible_clones = 0;
-+	drm_encoder_init(dev, encoder, &nvd0_sor_func, DRM_MODE_ENCODER_TMDS);
-+	drm_encoder_helper_add(encoder, &nvd0_sor_hfunc);
-+
-+	drm_mode_connector_attach_encoder(connector, encoder);
-+	return 0;
-+}
-+
-+/******************************************************************************
-+ * IRQ
-+ *****************************************************************************/
-+static struct dcb_entry *
-+lookup_dcb(struct drm_device *dev, int id, u32 mc)
-+{
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	int type, or, i;
-+
-+	if (id < 4) {
-+		type = OUTPUT_ANALOG;
-+		or   = id;
-+	} else {
-+		switch (mc & 0x00000f00) {
-+		case 0x00000000: type = OUTPUT_LVDS; break;
-+		case 0x00000100: type = OUTPUT_TMDS; break;
-+		case 0x00000200: type = OUTPUT_TMDS; break;
-+		case 0x00000500: type = OUTPUT_TMDS; break;
-+		default:
-+			NV_ERROR(dev, "PDISP: unknown SOR mc 0x%08x\n", mc);
-+			return NULL;
-+		}
-+
-+		or = id - 4;
-+	}
-+
-+	for (i = 0; i < dev_priv->vbios.dcb.entries; i++) {
-+		struct dcb_entry *dcb = &dev_priv->vbios.dcb.entry[i];
-+		if (dcb->type == type && (dcb->or & (1 << or)))
-+			return dcb;
-+	}
-+
-+	NV_ERROR(dev, "PDISP: DCB for %d/0x%08x not found\n", id, mc);
-+	return NULL;
-+}
-+
-+static void
-+nvd0_display_unk1_handler(struct drm_device *dev, u32 crtc, u32 mask)
-+{
-+	struct dcb_entry *dcb;
-+	int i;
-+
-+	for (i = 0; mask && i < 8; i++) {
-+		u32 mcc = nv_rd32(dev, 0x640180 + (i * 0x20));
-+		if (!(mcc & (1 << crtc)))
-+			continue;
-+
-+		dcb = lookup_dcb(dev, i, mcc);
-+		if (!dcb)
-+			continue;
-+
-+		nouveau_bios_run_display_table(dev, 0x0000, -1, dcb, crtc);
-+	}
-+
-+	nv_wr32(dev, 0x6101d4, 0x00000000);
-+	nv_wr32(dev, 0x6109d4, 0x00000000);
-+	nv_wr32(dev, 0x6101d0, 0x80000000);
-+}
-+
-+static void
-+nvd0_display_unk2_handler(struct drm_device *dev, u32 crtc, u32 mask)
-+{
-+	struct dcb_entry *dcb;
-+	u32 or, tmp, pclk;
-+	int i;
-+
-+	for (i = 0; mask && i < 8; i++) {
-+		u32 mcc = nv_rd32(dev, 0x640180 + (i * 0x20));
-+		if (!(mcc & (1 << crtc)))
-+			continue;
-+
-+		dcb = lookup_dcb(dev, i, mcc);
-+		if (!dcb)
-+			continue;
-+
-+		nouveau_bios_run_display_table(dev, 0x0000, -2, dcb, crtc);
-+	}
-+
-+	pclk = nv_rd32(dev, 0x660450 + (crtc * 0x300)) / 1000;
-+	if (mask & 0x00010000) {
-+		nv50_crtc_set_clock(dev, crtc, pclk);
-+	}
-+
-+	for (i = 0; mask && i < 8; i++) {
-+		u32 mcp = nv_rd32(dev, 0x660180 + (i * 0x20));
-+		u32 cfg = nv_rd32(dev, 0x660184 + (i * 0x20));
-+		if (!(mcp & (1 << crtc)))
-+			continue;
-+
-+		dcb = lookup_dcb(dev, i, mcp);
-+		if (!dcb)
-+			continue;
-+		or = ffs(dcb->or) - 1;
-+
-+		nouveau_bios_run_display_table(dev, cfg, pclk, dcb, crtc);
-+
-+		nv_wr32(dev, 0x612200 + (crtc * 0x800), 0x00000000);
-+		switch (dcb->type) {
-+		case OUTPUT_ANALOG:
-+			nv_wr32(dev, 0x612280 + (or * 0x800), 0x00000000);
-+			break;
-+		case OUTPUT_TMDS:
-+		case OUTPUT_LVDS:
-+			if (cfg & 0x00000100)
-+				tmp = 0x00000101;
-+			else
-+				tmp = 0x00000000;
-+
-+			nv_mask(dev, 0x612300 + (or * 0x800), 0x00000707, tmp);
-+			break;
-+		default:
-+			break;
-+		}
-+
-+		break;
-+	}
-+
-+	nv_wr32(dev, 0x6101d4, 0x00000000);
-+	nv_wr32(dev, 0x6109d4, 0x00000000);
-+	nv_wr32(dev, 0x6101d0, 0x80000000);
-+}
-+
-+static void
-+nvd0_display_unk4_handler(struct drm_device *dev, u32 crtc, u32 mask)
-+{
-+	struct dcb_entry *dcb;
-+	int pclk, i;
-+
-+	pclk = nv_rd32(dev, 0x660450 + (crtc * 0x300)) / 1000;
-+
-+	for (i = 0; mask && i < 8; i++) {
-+		u32 mcp = nv_rd32(dev, 0x660180 + (i * 0x20));
-+		u32 cfg = nv_rd32(dev, 0x660184 + (i * 0x20));
-+		if (!(mcp & (1 << crtc)))
-+			continue;
-+
-+		dcb = lookup_dcb(dev, i, mcp);
-+		if (!dcb)
-+			continue;
-+
-+		nouveau_bios_run_display_table(dev, cfg, -pclk, dcb, crtc);
-+	}
-+
-+	nv_wr32(dev, 0x6101d4, 0x00000000);
-+	nv_wr32(dev, 0x6109d4, 0x00000000);
-+	nv_wr32(dev, 0x6101d0, 0x80000000);
-+}
-+
-+static void
-+nvd0_display_bh(unsigned long data)
-+{
-+	struct drm_device *dev = (struct drm_device *)data;
-+	struct nvd0_display *disp = nvd0_display(dev);
-+	u32 mask, crtc;
-+	int i;
-+
-+	if (drm_debug & (DRM_UT_DRIVER | DRM_UT_KMS)) {
-+		NV_INFO(dev, "PDISP: modeset req %d\n", disp->modeset);
-+		NV_INFO(dev, " STAT: 0x%08x 0x%08x 0x%08x\n",
-+			 nv_rd32(dev, 0x6101d0),
-+			 nv_rd32(dev, 0x6101d4), nv_rd32(dev, 0x6109d4));
-+		for (i = 0; i < 8; i++) {
-+			NV_INFO(dev, " %s%d: 0x%08x 0x%08x\n",
-+				i < 4 ? "DAC" : "SOR", i,
-+				nv_rd32(dev, 0x640180 + (i * 0x20)),
-+				nv_rd32(dev, 0x660180 + (i * 0x20)));
-+		}
-+	}
-+
-+	mask = nv_rd32(dev, 0x6101d4);
-+	crtc = 0;
-+	if (!mask) {
-+		mask = nv_rd32(dev, 0x6109d4);
-+		crtc = 1;
-+	}
-+
-+	if (disp->modeset & 0x00000001)
-+		nvd0_display_unk1_handler(dev, crtc, mask);
-+	if (disp->modeset & 0x00000002)
-+		nvd0_display_unk2_handler(dev, crtc, mask);
-+	if (disp->modeset & 0x00000004)
-+		nvd0_display_unk4_handler(dev, crtc, mask);
-+}
-+
-+static void
-+nvd0_display_intr(struct drm_device *dev)
-+{
-+	struct nvd0_display *disp = nvd0_display(dev);
-+	u32 intr = nv_rd32(dev, 0x610088);
-+
-+	if (intr & 0x00000002) {
-+		u32 stat = nv_rd32(dev, 0x61009c);
-+		int chid = ffs(stat) - 1;
-+		if (chid >= 0) {
-+			u32 mthd = nv_rd32(dev, 0x6101f0 + (chid * 12));
-+			u32 data = nv_rd32(dev, 0x6101f4 + (chid * 12));
-+			u32 unkn = nv_rd32(dev, 0x6101f8 + (chid * 12));
-+
-+			NV_INFO(dev, "EvoCh: chid %d mthd 0x%04x data 0x%08x "
-+				     "0x%08x 0x%08x\n",
-+				chid, (mthd & 0x0000ffc), data, mthd, unkn);
-+			nv_wr32(dev, 0x61009c, (1 << chid));
-+			nv_wr32(dev, 0x6101f0 + (chid * 12), 0x90000000);
-+		}
-+
-+		intr &= ~0x00000002;
-+	}
-+
-+	if (intr & 0x00100000) {
-+		u32 stat = nv_rd32(dev, 0x6100ac);
-+
-+		if (stat & 0x00000007) {
-+			disp->modeset = stat;
-+			tasklet_schedule(&disp->tasklet);
-+
-+			nv_wr32(dev, 0x6100ac, (stat & 0x00000007));
-+			stat &= ~0x00000007;
-+		}
-+
-+		if (stat) {
-+			NV_INFO(dev, "PDISP: unknown intr24 0x%08x\n", stat);
-+			nv_wr32(dev, 0x6100ac, stat);
-+		}
-+
-+		intr &= ~0x00100000;
-+	}
-+
-+	if (intr & 0x01000000) {
-+		u32 stat = nv_rd32(dev, 0x6100bc);
-+		nv_wr32(dev, 0x6100bc, stat);
-+		intr &= ~0x01000000;
-+	}
-+
-+	if (intr & 0x02000000) {
-+		u32 stat = nv_rd32(dev, 0x6108bc);
-+		nv_wr32(dev, 0x6108bc, stat);
-+		intr &= ~0x02000000;
-+	}
-+
-+	if (intr)
-+		NV_INFO(dev, "PDISP: unknown intr 0x%08x\n", intr);
-+}
-+
-+/******************************************************************************
-+ * Init
-+ *****************************************************************************/
-+static void
-+nvd0_display_fini(struct drm_device *dev)
-+{
-+	int i;
-+
-+	/* fini cursors */
-+	for (i = 14; i >= 13; i--) {
-+		if (!(nv_rd32(dev, 0x610490 + (i * 0x10)) & 0x00000001))
-+			continue;
-+
-+		nv_mask(dev, 0x610490 + (i * 0x10), 0x00000001, 0x00000000);
-+		nv_wait(dev, 0x610490 + (i * 0x10), 0x00010000, 0x00000000);
-+		nv_mask(dev, 0x610090, 1 << i, 0x00000000);
-+		nv_mask(dev, 0x6100a0, 1 << i, 0x00000000);
-+	}
-+
-+	/* fini master */
-+	if (nv_rd32(dev, 0x610490) & 0x00000010) {
-+		nv_mask(dev, 0x610490, 0x00000010, 0x00000000);
-+		nv_mask(dev, 0x610490, 0x00000003, 0x00000000);
-+		nv_wait(dev, 0x610490, 0x80000000, 0x00000000);
-+		nv_mask(dev, 0x610090, 0x00000001, 0x00000000);
-+		nv_mask(dev, 0x6100a0, 0x00000001, 0x00000000);
-+	}
-+}
-+
-+int
-+nvd0_display_init(struct drm_device *dev)
-+{
-+	struct nvd0_display *disp = nvd0_display(dev);
-+	u32 *push;
-+	int i;
-+
-+	if (nv_rd32(dev, 0x6100ac) & 0x00000100) {
-+		nv_wr32(dev, 0x6100ac, 0x00000100);
-+		nv_mask(dev, 0x6194e8, 0x00000001, 0x00000000);
-+		if (!nv_wait(dev, 0x6194e8, 0x00000002, 0x00000000)) {
-+			NV_ERROR(dev, "PDISP: 0x6194e8 0x%08x\n",
-+				 nv_rd32(dev, 0x6194e8));
-+			return -EBUSY;
-+		}
-+	}
-+
-+	/* nfi what these are exactly, i do know that SOR_MODE_CTRL won't
-+	 * work at all unless you do the SOR part below.
-+	 */
-+	for (i = 0; i < 3; i++) {
-+		u32 dac = nv_rd32(dev, 0x61a000 + (i * 0x800));
-+		nv_wr32(dev, 0x6101c0 + (i * 0x800), dac);
-+	}
-+
-+	for (i = 0; i < 4; i++) {
-+		u32 sor = nv_rd32(dev, 0x61c000 + (i * 0x800));
-+		nv_wr32(dev, 0x6301c4 + (i * 0x800), sor);
-+	}
-+
-+	for (i = 0; i < 2; i++) {
-+		u32 crtc0 = nv_rd32(dev, 0x616104 + (i * 0x800));
-+		u32 crtc1 = nv_rd32(dev, 0x616108 + (i * 0x800));
-+		u32 crtc2 = nv_rd32(dev, 0x61610c + (i * 0x800));
-+		nv_wr32(dev, 0x6101b4 + (i * 0x800), crtc0);
-+		nv_wr32(dev, 0x6101b8 + (i * 0x800), crtc1);
-+		nv_wr32(dev, 0x6101bc + (i * 0x800), crtc2);
-+	}
-+
-+	/* point at our hash table / objects, enable interrupts */
-+	nv_wr32(dev, 0x610010, (disp->mem->vinst >> 8) | 9);
-+	nv_mask(dev, 0x6100b0, 0x00000307, 0x00000307);
-+
-+	/* init master */
-+	nv_wr32(dev, 0x610494, (disp->evo[0].handle >> 8) | 3);
-+	nv_wr32(dev, 0x610498, 0x00010000);
-+	nv_wr32(dev, 0x61049c, 0x00000001);
-+	nv_mask(dev, 0x610490, 0x00000010, 0x00000010);
-+	nv_wr32(dev, 0x640000, 0x00000000);
-+	nv_wr32(dev, 0x610490, 0x01000013);
-+	if (!nv_wait(dev, 0x610490, 0x80000000, 0x00000000)) {
-+		NV_ERROR(dev, "PDISP: master 0x%08x\n",
-+			 nv_rd32(dev, 0x610490));
-+		return -EBUSY;
-+	}
-+	nv_mask(dev, 0x610090, 0x00000001, 0x00000001);
-+	nv_mask(dev, 0x6100a0, 0x00000001, 0x00000001);
-+
-+	/* init cursors */
-+	for (i = 13; i <= 14; i++) {
-+		nv_wr32(dev, 0x610490 + (i * 0x10), 0x00000001);
-+		if (!nv_wait(dev, 0x610490 + (i * 0x10), 0x00010000, 0x00010000)) {
-+			NV_ERROR(dev, "PDISP: curs%d 0x%08x\n", i,
-+				 nv_rd32(dev, 0x610490 + (i * 0x10)));
-+			return -EBUSY;
-+		}
-+
-+		nv_mask(dev, 0x610090, 1 << i, 1 << i);
-+		nv_mask(dev, 0x6100a0, 1 << i, 1 << i);
-+	}
-+
-+	push = evo_wait(dev, 0, 32);
-+	if (!push)
-+		return -EBUSY;
-+	evo_mthd(push, 0x0088, 1);
-+	evo_data(push, NvEvoSync);
-+	evo_mthd(push, 0x0084, 1);
-+	evo_data(push, 0x00000000);
-+	evo_mthd(push, 0x0084, 1);
-+	evo_data(push, 0x80000000);
-+	evo_mthd(push, 0x008c, 1);
-+	evo_data(push, 0x00000000);
-+	evo_kick(push, dev, 0);
-+
-+	return 0;
-+}
-+
-+void
-+nvd0_display_destroy(struct drm_device *dev)
-+{
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nvd0_display *disp = nvd0_display(dev);
-+	struct pci_dev *pdev = dev->pdev;
-+
-+	nvd0_display_fini(dev);
-+
-+	pci_free_consistent(pdev, PAGE_SIZE, disp->evo[0].ptr, disp->evo[0].handle);
-+	nouveau_gpuobj_ref(NULL, &disp->mem);
-+	nouveau_irq_unregister(dev, 26);
-+
-+	dev_priv->engine.display.priv = NULL;
-+	kfree(disp);
-+}
-+
-+int
-+nvd0_display_create(struct drm_device *dev)
-+{
-+	struct drm_nouveau_private *dev_priv = dev->dev_private;
-+	struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem;
-+	struct dcb_table *dcb = &dev_priv->vbios.dcb;
-+	struct drm_connector *connector, *tmp;
-+	struct pci_dev *pdev = dev->pdev;
-+	struct nvd0_display *disp;
-+	struct dcb_entry *dcbe;
-+	int ret, i;
-+
-+	disp = kzalloc(sizeof(*disp), GFP_KERNEL);
-+	if (!disp)
-+		return -ENOMEM;
-+	dev_priv->engine.display.priv = disp;
-+
-+	/* create crtc objects to represent the hw heads */
-+	for (i = 0; i < 2; i++) {
-+		ret = nvd0_crtc_create(dev, i);
-+		if (ret)
-+			goto out;
-+	}
-+
-+	/* create encoder/connector objects based on VBIOS DCB table */
-+	for (i = 0, dcbe = &dcb->entry[0]; i < dcb->entries; i++, dcbe++) {
-+		connector = nouveau_connector_create(dev, dcbe->connector);
-+		if (IS_ERR(connector))
-+			continue;
-+
-+		if (dcbe->location != DCB_LOC_ON_CHIP) {
-+			NV_WARN(dev, "skipping off-chip encoder %d/%d\n",
-+				dcbe->type, ffs(dcbe->or) - 1);
-+			continue;
-+		}
-+
-+		switch (dcbe->type) {
-+		case OUTPUT_TMDS:
-+		case OUTPUT_LVDS:
-+			nvd0_sor_create(connector, dcbe);
-+			break;
-+		case OUTPUT_ANALOG:
-+			nvd0_dac_create(connector, dcbe);
-+			break;
-+		default:
-+			NV_WARN(dev, "skipping unsupported encoder %d/%d\n",
-+				dcbe->type, ffs(dcbe->or) - 1);
-+			continue;
-+		}
-+	}
-+
-+	/* cull any connectors we created that don't have an encoder */
-+	list_for_each_entry_safe(connector, tmp, &dev->mode_config.connector_list, head) {
-+		if (connector->encoder_ids[0])
-+			continue;
-+
-+		NV_WARN(dev, "%s has no encoders, removing\n",
-+			drm_get_connector_name(connector));
-+		connector->funcs->destroy(connector);
-+	}
-+
-+	/* setup interrupt handling */
-+	tasklet_init(&disp->tasklet, nvd0_display_bh, (unsigned long)dev);
-+	nouveau_irq_register(dev, 26, nvd0_display_intr);
-+
-+	/* hash table and dma objects for the memory areas we care about */
-+	ret = nouveau_gpuobj_new(dev, NULL, 0x4000, 0x10000,
-+				 NVOBJ_FLAG_ZERO_ALLOC, &disp->mem);
-+	if (ret)
-+		goto out;
-+
-+	nv_wo32(disp->mem, 0x1000, 0x00000049);
-+	nv_wo32(disp->mem, 0x1004, (disp->mem->vinst + 0x2000) >> 8);
-+	nv_wo32(disp->mem, 0x1008, (disp->mem->vinst + 0x2fff) >> 8);
-+	nv_wo32(disp->mem, 0x100c, 0x00000000);
-+	nv_wo32(disp->mem, 0x1010, 0x00000000);
-+	nv_wo32(disp->mem, 0x1014, 0x00000000);
-+	nv_wo32(disp->mem, 0x0000, NvEvoSync);
-+	nv_wo32(disp->mem, 0x0004, (0x1000 << 9) | 0x00000001);
-+
-+	nv_wo32(disp->mem, 0x1020, 0x00000049);
-+	nv_wo32(disp->mem, 0x1024, 0x00000000);
-+	nv_wo32(disp->mem, 0x1028, (dev_priv->vram_size - 1) >> 8);
-+	nv_wo32(disp->mem, 0x102c, 0x00000000);
-+	nv_wo32(disp->mem, 0x1030, 0x00000000);
-+	nv_wo32(disp->mem, 0x1034, 0x00000000);
-+	nv_wo32(disp->mem, 0x0008, NvEvoVRAM);
-+	nv_wo32(disp->mem, 0x000c, (0x1020 << 9) | 0x00000001);
-+
-+	nv_wo32(disp->mem, 0x1040, 0x00000009);
-+	nv_wo32(disp->mem, 0x1044, 0x00000000);
-+	nv_wo32(disp->mem, 0x1048, (dev_priv->vram_size - 1) >> 8);
-+	nv_wo32(disp->mem, 0x104c, 0x00000000);
-+	nv_wo32(disp->mem, 0x1050, 0x00000000);
-+	nv_wo32(disp->mem, 0x1054, 0x00000000);
-+	nv_wo32(disp->mem, 0x0010, NvEvoVRAM_LP);
-+	nv_wo32(disp->mem, 0x0014, (0x1040 << 9) | 0x00000001);
-+
-+	nv_wo32(disp->mem, 0x1060, 0x0fe00009);
-+	nv_wo32(disp->mem, 0x1064, 0x00000000);
-+	nv_wo32(disp->mem, 0x1068, (dev_priv->vram_size - 1) >> 8);
-+	nv_wo32(disp->mem, 0x106c, 0x00000000);
-+	nv_wo32(disp->mem, 0x1070, 0x00000000);
-+	nv_wo32(disp->mem, 0x1074, 0x00000000);
-+	nv_wo32(disp->mem, 0x0018, NvEvoFB32);
-+	nv_wo32(disp->mem, 0x001c, (0x1060 << 9) | 0x00000001);
-+
-+	pinstmem->flush(dev);
-+
-+	/* push buffers for evo channels */
-+	disp->evo[0].ptr =
-+		pci_alloc_consistent(pdev, PAGE_SIZE, &disp->evo[0].handle);
-+	if (!disp->evo[0].ptr) {
-+		ret = -ENOMEM;
-+		goto out;
-+	}
-+
-+	ret = nvd0_display_init(dev);
-+	if (ret)
-+		goto out;
-+
-+out:
-+	if (ret)
-+		nvd0_display_destroy(dev);
-+	return ret;
-+}
diff --git a/epoll-limit-paths.patch b/epoll-limit-paths.patch
index 440db27..4ed306a 100644
--- a/epoll-limit-paths.patch
+++ b/epoll-limit-paths.patch
@@ -1,4 +1,4 @@
-From 6a4ca79652219cf22da800d990e5b46feaea1ad9 Mon Sep 17 00:00:00 2001
+From 0a6cc45426fe3baaf231efd7efe4300fd879efc8 Mon Sep 17 00:00:00 2001
 From: Jason Baron <jbaron at redhat.com>
 Date: Mon, 24 Oct 2011 14:59:02 +1100
 Subject: [PATCH] epoll: limit paths
@@ -91,7 +91,7 @@ Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
  3 files changed, 203 insertions(+), 25 deletions(-)
 
 diff --git a/fs/eventpoll.c b/fs/eventpoll.c
-index 4a53743..414ac74 100644
+index b84fad9..414ac74 100644
 --- a/fs/eventpoll.c
 +++ b/fs/eventpoll.c
 @@ -197,6 +197,12 @@ struct eventpoll {
@@ -137,7 +137,7 @@ index 4a53743..414ac74 100644
  	.llseek		= noop_llseek,
  };
  
--/* Fast test to see if the file is an evenpoll file */
+-/* Fast test to see if the file is an eventpoll file */
 -static inline int is_file_epoll(struct file *f)
 -{
 -	return f->f_op == &eventpoll_fops;
@@ -449,7 +449,7 @@ index f362733..657ab55 100644
  
  
 diff --git a/include/linux/fs.h b/include/linux/fs.h
-index 277f497..93778e0 100644
+index ba98668..d393a68 100644
 --- a/include/linux/fs.h
 +++ b/include/linux/fs.h
 @@ -985,6 +985,7 @@ struct file {
diff --git a/ext4-Support-check-none-nocheck-mount-options.patch b/ext4-Support-check-none-nocheck-mount-options.patch
new file mode 100644
index 0000000..281e423
--- /dev/null
+++ b/ext4-Support-check-none-nocheck-mount-options.patch
@@ -0,0 +1,51 @@
+From ea75f7357e3a881bd1bd0db5e483fc6a8681567b Mon Sep 17 00:00:00 2001
+From: Josh Boyer <jwboyer at redhat.com>
+Date: Tue, 10 Jan 2012 09:39:02 -0500
+Subject: [PATCH] ext4: Support "check=none" "nocheck" mount options
+
+The ext2/ext3 filesystems supported "check=none" and "nocheck" as mount options
+even though that was already the default behavior and it essentially did
+nothing.  When using ext4 to mount ext2/ext3 filesystems, that mount option
+causes the mount to fail.  That isn't as backward compatible as it could be,
+so add support to ext4 to accept the option.
+
+Signed-off-by: Josh Boyer <jwboyer at redhat.com>
+---
+ fs/ext4/super.c |    7 ++++++-
+ 1 files changed, 6 insertions(+), 1 deletions(-)
+
+diff --git a/fs/ext4/super.c b/fs/ext4/super.c
+index 3e1329e..5ff09e7 100644
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -1333,7 +1333,7 @@ enum {
+ 	Opt_nomblk_io_submit, Opt_block_validity, Opt_noblock_validity,
+ 	Opt_inode_readahead_blks, Opt_journal_ioprio,
+ 	Opt_dioread_nolock, Opt_dioread_lock,
+-	Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable,
++	Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable, Opt_nocheck,
+ };
+ 
+ static const match_table_t tokens = {
+@@ -1409,6 +1409,8 @@ static const match_table_t tokens = {
+ 	{Opt_init_itable, "init_itable=%u"},
+ 	{Opt_init_itable, "init_itable"},
+ 	{Opt_noinit_itable, "noinit_itable"},
++	{Opt_nocheck, "check=none"},
++	{Opt_nocheck, "nocheck"},
+ 	{Opt_err, NULL},
+ };
+ 
+@@ -1905,6 +1907,9 @@ set_qf_format:
+ 		case Opt_noinit_itable:
+ 			clear_opt(sb, INIT_INODE_TABLE);
+ 			break;
++		case Opt_nocheck:
++			/* ext2/ext3 used to "support" this option.  Silently eat it */
++			break;
+ 		default:
+ 			ext4_msg(sb, KERN_ERR,
+ 			       "Unrecognized mount option \"%s\" "
+-- 
+1.7.7.5
+
diff --git a/fs-Inval-cache-for-parent-block-device-if-fsync-called-on-part.patch b/fs-Inval-cache-for-parent-block-device-if-fsync-called-on-part.patch
new file mode 100644
index 0000000..5bab4f4
--- /dev/null
+++ b/fs-Inval-cache-for-parent-block-device-if-fsync-called-on-part.patch
@@ -0,0 +1,106 @@
+Path: news.gmane.org!not-for-mail
+From: Niels de Vos <ndevos at redhat.com>
+Newsgroups: gmane.linux.kernel,gmane.linux.file-systems
+Subject: [PATCH v2] fs: Invalidate the cache for a parent block-device if fsync() is called for a partition
+Date: Mon, 23 Jan 2012 10:38:29 +0000
+Lines: 58
+Approved: news at gmane.org
+Message-ID: <1327315109-7740-1-git-send-email-ndevos at redhat.com>
+References: <4F19356E.3020708 at redhat.com>
+NNTP-Posting-Host: lo.gmane.org
+X-Trace: dough.gmane.org 1327315263 30652 80.91.229.12 (23 Jan 2012 10:41:03 GMT)
+X-Complaints-To: usenet at dough.gmane.org
+NNTP-Posting-Date: Mon, 23 Jan 2012 10:41:03 +0000 (UTC)
+Cc: linux-kernel at vger.kernel.org, Niels de Vos <ndevos at redhat.com>,
+	"Bryn M. Reeves" <bmr at redhat.com>,
+	Mikulas Patocka <mpatocka at redhat.com>
+To: linux-fsdevel at vger.kernel.org
+Original-X-From: linux-kernel-owner at vger.kernel.org Mon Jan 23 11:40:58 2012
+Return-path: <linux-kernel-owner at vger.kernel.org>
+Envelope-to: glk-linux-kernel-3 at lo.gmane.org
+Original-Received: from vger.kernel.org ([209.132.180.67])
+	by lo.gmane.org with esmtp (Exim 4.69)
+	(envelope-from <linux-kernel-owner at vger.kernel.org>)
+	id 1RpHKb-0008Bu-Fh
+	for glk-linux-kernel-3 at lo.gmane.org; Mon, 23 Jan 2012 11:40:57 +0100
+Original-Received: (majordomo at vger.kernel.org) by vger.kernel.org via listexpand
+	id S1753263Ab2AWKkt (ORCPT <rfc822;glk-linux-kernel-3 at m.gmane.org>);
+	Mon, 23 Jan 2012 05:40:49 -0500
+Original-Received: from mx1.redhat.com ([209.132.183.28]:58739 "EHLO mx1.redhat.com"
+	rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP
+	id S1751990Ab2AWKks (ORCPT <rfc822;linux-kernel at vger.kernel.org>);
+	Mon, 23 Jan 2012 05:40:48 -0500
+Original-Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
+	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q0NAelMx027033
+	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
+	Mon, 23 Jan 2012 05:40:47 -0500
+Original-Received: from ndevos.usersys.redhat.com (dhcp-1-51.fab.redhat.com [10.33.1.51])
+	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q0NAejLn013691;
+	Mon, 23 Jan 2012 05:40:46 -0500
+In-Reply-To: <4F19356E.3020708 at redhat.com>
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
+Original-Sender: linux-kernel-owner at vger.kernel.org
+Precedence: bulk
+List-ID: <linux-kernel.vger.kernel.org>
+X-Mailing-List: linux-kernel at vger.kernel.org
+Xref: news.gmane.org gmane.linux.kernel:1242432 gmane.linux.file-systems:60751
+Archived-At: <http://permalink.gmane.org/gmane.linux.kernel/1242432>
+
+Executing an fsync() on a file-descriptor of a partition flushes the
+caches for that partition by calling blkdev_issue_flush(). However, it
+seems that reading data through the parent device will still return the
+old cached data.
+
+The cache for the block-device is not synced if the block-device is kept
+open (due to a mounted partition, for example). Only when all users for
+the disk have exited, the cache for the disk is made consistent again.
+
+Calling invalidate_bdev() on the parent block-device in case
+blkdev_fsync() was called for a partition, fixes this.
+
+The problem can be worked around by forcing the caches to be flushed
+with either
+	# blockdev --flushbufs ${dev_disk}
+or
+	# echo 3 > /proc/sys/vm/drop_caches
+
+CC: Bryn M. Reeves <bmr at redhat.com>
+CC: Mikulas Patocka <mpatocka at redhat.com>
+Signed-off-by: Niels de Vos <ndevos at redhat.com>
+
+---
+v2:
+- Do not call invalidate_bdev() from blkdev_issue_flush() and prevent
+  performance degration with journalled filesystems.
+
+  Suggested was to call invalidate_bdev() in fsync_bdev(), but this is
+  not in the call-path of mkfs.ext3 and similar tools. Hence the issue
+  persists.
+
+- Correct phrasing a little, changing ioctl-BLKFLSBUF is not required.
+
+- This issue also occurs when doing an ioctl-BLKFLSBUF on a partition.
+  Reading the whole disk will still return cached data. If this is an
+  issue, it will need a seperate patch.
+---
+ fs/block_dev.c |    4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
+
+diff --git a/fs/block_dev.c b/fs/block_dev.c
+index 0e575d1..433c4de 100644
+--- a/fs/block_dev.c
++++ b/fs/block_dev.c
+@@ -424,6 +424,10 @@ int blkdev_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
+ 	if (error == -EOPNOTSUPP)
+ 		error = 0;
+ 
++	/* invalidate parent block_device */
++	if (!error && bdev != bdev->bd_contains)
++		invalidate_bdev(bdev->bd_contains);
++
+ 	return error;
+ }
+ EXPORT_SYMBOL(blkdev_fsync);
+-- 
+1.7.6.5
+
diff --git a/kernel.spec b/kernel.spec
index 9d2d7da..848a58f 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -42,16 +42,16 @@ Summary: The Linux kernel
 # When changing real_sublevel below, reset this by hand to 1
 # (or to 0 and then use rpmdev-bumpspec).
 #
-%global baserelease 3
+%global baserelease 1
 %global fedora_build %{baserelease}
 
 # real_sublevel is the 3.x kernel version we're starting with
-%define real_sublevel 1
+%define real_sublevel 2
 # fake_sublevel is the 2.6.x version we're faking
 %define fake_sublevel %(echo $((40 + %{real_sublevel})))
 
 # Do we have a -stable update to apply?
-%define stable_update 10
+%define stable_update 2
 # Is it a -stable RC?
 %define stable_rc 0
 # Set rpm version accordingly
@@ -472,7 +472,7 @@ Version: %{rpmversion}
 Release: %{pkg_release}
 # DO NOT CHANGE THE 'ExclusiveArch' LINE TO TEMPORARILY EXCLUDE AN ARCHITECTURE BUILD.
 # SET %%nobuildarches (ABOVE) INSTEAD
-ExclusiveArch: noarch %{all_x86} x86_64 ppc ppc64 ia64 %{sparc} s390 s390x alpha alphaev56 %{arm}
+ExclusiveArch: noarch %{all_x86} x86_64 ppc ppc64 %{sparc} s390 s390x alpha alphaev56 %{arm}
 ExclusiveOS: Linux
 
 %kernel_reqprovconf
@@ -481,7 +481,7 @@ ExclusiveOS: Linux
 # List the packages used during the kernel build
 #
 BuildRequires: module-init-tools, patch >= 2.5.4, bash >= 2.03, sh-utils, tar
-BuildRequires: bzip2, findutils, gzip, m4, perl, make >= 3.78, diffutils, gawk
+BuildRequires: bzip2, xz, findutils, gzip, m4, perl, make >= 3.78, diffutils, gawk
 BuildRequires: gcc >= 3.4.2, binutils >= 2.12, redhat-rpm-config
 BuildRequires: net-tools
 BuildRequires: xmlto, asciidoc
@@ -506,7 +506,7 @@ BuildRequires: rpm-build >= 4.4.2.1-4
 %define debuginfo_args --strict-build-id
 %endif
 
-Source0: ftp://ftp.kernel.org/pub/linux/kernel/v3.x/linux-%{realversion}.tar.bz2
+Source0: ftp://ftp.kernel.org/pub/linux/kernel/v3.x/linux-%{realversion}.tar.xz
 
 Source11: genkey
 Source14: find-provides
@@ -549,11 +549,11 @@ Source1000: config-local
 # For a stable release kernel
 %if 0%{?stable_update}
 %if 0%{?stable_base}
-%define    stable_patch_00  patch-3.%{real_sublevel}.%{stable_base}.bz2
+%define    stable_patch_00  patch-3.%{real_sublevel}.%{stable_base}.xz
 Patch00: %{stable_patch_00}
 %endif
 %if 0%{?stable_rc}
-%define    stable_patch_01  patch-3.%{real_sublevel}.%{stable_update}-rc%{stable_rc}.bz2
+%define    stable_patch_01  patch-3.%{real_sublevel}.%{stable_update}-rc%{stable_rc}.xz
 Patch01: %{stable_patch_01}
 %endif
 %endif
@@ -580,8 +580,6 @@ Patch100: taint-vbox.patch
 Patch160: linux-2.6-32bit-mmap-exec-randomization.patch
 Patch161: linux-2.6-i386-nx-emulation.patch
 
-Patch202: linux-2.6-debug-taint-vm.patch
-
 Patch350: force-version-2.6.patch
 
 Patch383: linux-2.6-defaults-aspm.patch
@@ -608,9 +606,6 @@ Patch700: linux-2.6-e1000-ich9-montevina.patch
 
 Patch800: linux-2.6-crash-driver.patch
 
-# Platform
-Patch900: samsung-laptop-brightness-fixes-3.2.patch
-
 # crypto/
 
 # virt + ksm patches
@@ -624,10 +619,6 @@ Patch1810: drm-nouveau-updates.patch
 Patch1824: drm-intel-next.patch
 # hush the i915 fbc noise
 Patch1826: drm-i915-fbc-stfu.patch
-# rhbz#729882, https://bugs.freedesktop.org/attachment.cgi?id=49069
-Patch1827: drm-i915-sdvo-lvds-is-digital.patch
-
-Patch1850: drm-lower-severity-radeon-lockup.diff
 
 Patch1900: linux-2.6-intel-iommu-igfx.patch
 
@@ -640,10 +631,6 @@ Patch2899: linux-2.6-v4l-dvb-fixes.patch
 Patch2900: linux-2.6-v4l-dvb-update.patch
 Patch2901: linux-2.6-v4l-dvb-experimental.patch
 
-Patch2905: media-dib0700-correct-error-message.patch
-
-Patch3000: rcutree-avoid-false-quiescent-states.patch
-
 # fs fixes
 
 #rhbz 753346
@@ -652,41 +639,22 @@ Patch3500: jbd-jbd2-validate-sb-s_first-in-journal_get_superblo.patch
 # NFSv4
 
 # patches headed upstream
-Patch12010: add-appleir-usb-driver.patch
 
 Patch12016: disable-i8042-check-on-apple-mac.patch
 
-Patch12021: udlfb-bind-framebuffer-to-interface.patch
-
-Patch12025: rcu-avoid-just-onlined-cpu-resched.patch
 Patch12026: block-stray-block-put-after-teardown.patch
 Patch12030: epoll-limit-paths.patch
-Patch12031: HID-wacom-Set-input-bits-before-registration.patch
 
 Patch12303: dmar-disable-when-ricoh-multifunction.patch
 
 Patch13002: revert-efi-rtclock.patch
 Patch13003: efi-dont-map-boot-services-on-32bit.patch
 
-Patch13009: hvcs_pi_buf_alloc.patch
-
 Patch20000: utrace.patch
 
 # Flattened devicetree support
 Patch21000: arm-omap-dt-compat.patch
 Patch21001: arm-smsc-support-reading-mac-address-from-device-tree.patch
-Patch21002: arm-tegra-usb-no-reset.patch
-
-#rhbz #735946
-Patch21020: 0001-mm-vmscan-Limit-direct-reclaim-for-higher-order-allo.patch
-Patch21021: 0002-mm-Abort-reclaim-compaction-if-compaction-can-procee.patch
-Patch21022: mm-do-not-stall-in-synchronous-compaction-for-THP-allocations.patch
-
-#rhbz 748691
-Patch21030: be2net-non-member-vlan-pkts-not-received-in-promisco.patch
-Patch21031: benet-remove-bogus-unlikely-on-vlan-check.patch
-
-Patch21040: x86-code-dump-fix-truncation.patch
 
 #rhbz 717735
 Patch21045: nfs-client-freezer.patch
@@ -694,18 +662,10 @@ Patch21045: nfs-client-freezer.patch
 #rhbz 590880
 Patch21046: alps.patch
 
-#rhbz 741117
-Patch21048: b44-Use-dev_kfree_skb_irq-in-b44_tx.patch
-
-#rhbz 771006
-Patch21050: thp-reduce-khugepaged-freezing-latency.patch
-
-#rhbz 728607
-Patch21060: elantech.patch
-
-#rhbz 770233
-Patch21065: Bluetooth-Add-support-for-BCM20702A0.patch
+#rhbz 746097
+Patch21049: tpm_tis-delay-after-aborting-cmd.patch
 
+Patch21070: ext4-Support-check-none-nocheck-mount-options.patch
 Patch21071: ext4-Fix-error-handling-on-inode-bitmap-corruption.patch
 Patch21072: ext3-Fix-error-handling-on-inode-bitmap-corruption.patch
 
@@ -719,41 +679,31 @@ Patch21075: KVM-x86-fix-missing-checks-in-syscall-emulation.patch
 #rhbz 728740
 Patch21076: rtl8192cu-Fix-WARNING-on-suspend-resume.patch
 
-Patch21077: 01-block-add-and-use-scsi_blk_cmd_ioctl.patch
-Patch21078: 02-block-fail-SCSI-passthrough-ioctls-on-partition-devs.patch
-Patch21079: 03-dm-dont-fwd-ioctls-from-LVs-to-underlying-dev.patch
+#rhbz752176
+Patch21080: sysfs-msi-irq-per-device.patch
 
 #rhbz 782686
 Patch21082: procfs-parse-mount-options.patch
 Patch21083: procfs-add-hidepid-and-gid-mount-options.patch
 Patch21084: proc-fix-null-pointer-deref-in-proc_pid_permission.patch
 
-#rhbz 782681
-Patch21085: proc-clean-up-and-fix-proc-pid-mem-handling.patch
-
-#rhbz 782687
-Patch21086: loop-prevent-information-leak-after-failed-read.patch
+#rhbz 783211
+Patch21087: fs-Inval-cache-for-parent-block-device-if-fsync-called-on-part.patch
 
-#backport brcm80211 from 3.2-rc1
-Patch21090: brcm80211.patch
-Patch21091: bcma-brcmsmac-compat.patch
+#rhbz 771058
+Patch21100: msi-irq-sysfs-warning.patch
 
 # rhbz 754907
-Patch21100: cciss-fix-irqf-shared.patch
 Patch21101: hpsa-add-irqf-shared.patch
 
-#rhbz 731365
-Patch21220: mac80211_offchannel_rework_revert.patch
-
 Patch21225: pci-Rework-ASPM-disable-code.patch
 
 Patch21227: mac80211-fix-work-removal-on-deauth-request.patch
 
-#rhbz 781625
-Patch21228: SCSI-sym53c8xx-Fix-NULL-pointer-dereference-in-slave.patch
+#rhbz 718790
+Patch21230: rds-Make-rds_sock_lock-BH-rather-than-IRQ-safe.patch
 
-#rhbz #757839
-Patch21230: net-sky2-88e8059-fix-link-speed.patch
+Patch22000: rcu-reintroduce-missing-calls.patch
 
 %endif
 
@@ -1027,6 +977,7 @@ ApplyPatch()
   case "$patch" in
   *.bz2) bunzip2 < "$RPM_SOURCE_DIR/$patch" | $patch_command ${1+"$@"} ;;
   *.gz) gunzip < "$RPM_SOURCE_DIR/$patch" | $patch_command ${1+"$@"} ;;
+  *.xz)  unxz    < "$RPM_SOURCE_DIR/$patch" | $patch_command ${1+"$@"} ;;
   *) $patch_command ${1+"$@"} < "$RPM_SOURCE_DIR/$patch" ;;
   esac
 }
@@ -1177,7 +1128,6 @@ ApplyOptionalPatch linux-2.6-upstream-reverts.patch -R
 #
 ApplyPatch arm-omap-dt-compat.patch
 ApplyPatch arm-smsc-support-reading-mac-address-from-device-tree.patch
-ApplyPatch arm-tegra-usb-no-reset.patch
 
 ApplyPatch taint-vbox.patch
 #
@@ -1217,9 +1167,6 @@ ApplyPatch acpi-sony-nonvs-blacklist.patch
 # force UTSNAME to show version 2.6.4X
 ApplyPatch force-version-2.6.patch
 
-# Various low-impact patches to aid debugging.
-ApplyPatch linux-2.6-debug-taint-vm.patch
-
 #
 # PCI
 #
@@ -1278,9 +1225,6 @@ ApplyOptionalPatch drm-nouveau-updates.patch
 # Intel DRM
 ApplyOptionalPatch drm-intel-next.patch
 ApplyPatch drm-i915-fbc-stfu.patch
-ApplyPatch drm-i915-sdvo-lvds-is-digital.patch
-
-ApplyPatch drm-lower-severity-radeon-lockup.diff
 
 ApplyPatch linux-2.6-intel-iommu-igfx.patch
 
@@ -1294,21 +1238,12 @@ ApplyOptionalPatch linux-2.6-v4l-dvb-fixes.patch
 ApplyOptionalPatch linux-2.6-v4l-dvb-update.patch
 ApplyOptionalPatch linux-2.6-v4l-dvb-experimental.patch
 
-# Platform fixes not sent for -stable
-ApplyPatch samsung-laptop-brightness-fixes-3.2.patch
-
 # Patches headed upstream
-ApplyPatch rcutree-avoid-false-quiescent-states.patch
 
 ApplyPatch disable-i8042-check-on-apple-mac.patch
 
-ApplyPatch add-appleir-usb-driver.patch
-
-ApplyPatch udlfb-bind-framebuffer-to-interface.patch
 ApplyPatch epoll-limit-paths.patch
-ApplyPatch rcu-avoid-just-onlined-cpu-resched.patch
 ApplyPatch block-stray-block-put-after-teardown.patch
-ApplyPatch HID-wacom-Set-input-bits-before-registration.patch
 
 # rhbz#605888
 ApplyPatch dmar-disable-when-ricoh-multifunction.patch
@@ -1316,62 +1251,32 @@ ApplyPatch dmar-disable-when-ricoh-multifunction.patch
 ApplyPatch revert-efi-rtclock.patch
 ApplyPatch efi-dont-map-boot-services-on-32bit.patch
 
-ApplyPatch hvcs_pi_buf_alloc.patch
-
-ApplyPatch media-dib0700-correct-error-message.patch
-
 # utrace.
 ApplyPatch utrace.patch
 
-#rhbz #735946
-ApplyPatch 0001-mm-vmscan-Limit-direct-reclaim-for-higher-order-allo.patch
-ApplyPatch 0002-mm-Abort-reclaim-compaction-if-compaction-can-procee.patch
-ApplyPatch mm-do-not-stall-in-synchronous-compaction-for-THP-allocations.patch
-
-#rhbz 748691
-ApplyPatch be2net-non-member-vlan-pkts-not-received-in-promisco.patch
-ApplyPatch benet-remove-bogus-unlikely-on-vlan-check.patch
-
-#rhbz 736815
-ApplyPatch x86-code-dump-fix-truncation.patch
-
-#rhbz 728607
-ApplyPatch elantech.patch
-
-#backport brcm80211 from 3.2-rc1
-ApplyPatch brcm80211.patch
-# Remove overlap between bcma/b43 and brcmsmac and reenable bcm4331
-ApplyPatch bcma-brcmsmac-compat.patch
+#rhbz 752176
+ApplyPatch sysfs-msi-irq-per-device.patch
 
 # rhbz 754907
-ApplyPatch cciss-fix-irqf-shared.patch
 ApplyPatch hpsa-add-irqf-shared.patch
 
-#rhbz 731365
-ApplyPatch mac80211_offchannel_rework_revert.patch
-
 ApplyPatch pci-Rework-ASPM-disable-code.patch
 
 ApplyPatch mac80211-fix-work-removal-on-deauth-request.patch
 
-#rhbz #757839
-ApplyPatch net-sky2-88e8059-fix-link-speed.patch
-
 #rhbz 717735
 ApplyPatch nfs-client-freezer.patch
 
 #rhbz 590880
 ApplyPatch alps.patch
 
-#rhbz 741117
-ApplyPatch b44-Use-dev_kfree_skb_irq-in-b44_tx.patch
+#rhbz 746097
+ApplyPatch tpm_tis-delay-after-aborting-cmd.patch
 
-#rhbz 771006
-ApplyPatch thp-reduce-khugepaged-freezing-latency.patch
-
-#rhbz 770233
-ApplyPatch Bluetooth-Add-support-for-BCM20702A0.patch
+#rhbz 771058
+ApplyPatch msi-irq-sysfs-warning.patch
 
+ApplyPatch ext4-Support-check-none-nocheck-mount-options.patch
 ApplyPatch ext4-Fix-error-handling-on-inode-bitmap-corruption.patch
 ApplyPatch ext3-Fix-error-handling-on-inode-bitmap-corruption.patch
 
@@ -1382,24 +1287,18 @@ ApplyPatch KVM-x86-fix-missing-checks-in-syscall-emulation.patch
 #rhbz 728740
 ApplyPatch rtl8192cu-Fix-WARNING-on-suspend-resume.patch
 
-#rhbz 769911
-ApplyPatch 01-block-add-and-use-scsi_blk_cmd_ioctl.patch
-ApplyPatch 02-block-fail-SCSI-passthrough-ioctls-on-partition-devs.patch
-ApplyPatch 03-dm-dont-fwd-ioctls-from-LVs-to-underlying-dev.patch
-
 #rhbz 782686
 ApplyPatch procfs-parse-mount-options.patch
 ApplyPatch procfs-add-hidepid-and-gid-mount-options.patch
 ApplyPatch proc-fix-null-pointer-deref-in-proc_pid_permission.patch
 
-#rhbz 782681
-ApplyPatch proc-clean-up-and-fix-proc-pid-mem-handling.patch
+ApplyPatch rcu-reintroduce-missing-calls.patch
 
-#rhbz 782687
-ApplyPatch loop-prevent-information-leak-after-failed-read.patch
+#rhbz 718790
+ApplyPatch rds-Make-rds_sock_lock-BH-rather-than-IRQ-safe.patch
 
-#rhbz 781625
-ApplyPatch SCSI-sym53c8xx-Fix-NULL-pointer-dereference-in-slave.patch
+#rhbz 783211
+ApplyPatch fs-Inval-cache-for-parent-block-device-if-fsync-called-on-part.patch
 
 # END OF PATCH APPLICATIONS
 
@@ -2048,6 +1947,9 @@ fi
 # and build.
 
 %changelog
+* Mon Jan 30 2012 Dave Jones <davej at redhat.com> 2.6.42.2-1
+- Rebase to 3.2.2
+
 * Mon Jan 23 2012 Josh Boyer <jwboyer at redhat.com> 2.6.41.10-3
 - Fix NULL pointer dereference in sym53c8xx module (rhbz 781625)
 
diff --git a/linux-2.6-32bit-mmap-exec-randomization.patch b/linux-2.6-32bit-mmap-exec-randomization.patch
index 6008173..c253233 100644
--- a/linux-2.6-32bit-mmap-exec-randomization.patch
+++ b/linux-2.6-32bit-mmap-exec-randomization.patch
@@ -152,7 +152,7 @@ Main executable randomisation (PIE)      : 12 bits (guessed)
  struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
 --- a/arch/x86/mm/mmap.c
 +++ b/arch/x86/mm/mmap.c
-@@ -124,13 +124,16 @@ static unsigned long mmap_legacy_base(void)
+@@ -124,13 +124,19 @@ static unsigned long mmap_legacy_base(void)
   */
  void arch_pick_mmap_layout(struct mm_struct *mm)
  {
@@ -163,9 +163,12 @@ Main executable randomisation (PIE)      : 12 bits (guessed)
  	} else {
  		mm->mmap_base = mmap_base();
  		mm->get_unmapped_area = arch_get_unmapped_area_topdown;
++#ifdef CONFIG_X86_32
 +		if (!(current->personality & READ_IMPLIES_EXEC)
++		    && !(__supported_pte_mask & _PAGE_NX)
 +		    && mmap_is_ia32())
 +			mm->get_unmapped_exec_area = arch_get_unmapped_exec_area;
++#endif
  		mm->unmap_area = arch_unmap_area_topdown;
  	}
  }
@@ -224,3 +227,25 @@ Main executable randomisation (PIE)      : 12 bits (guessed)
  		if (new_addr & ~PAGE_MASK) {
  			ret = new_addr;
  			goto out;
+diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
+index 57d1868..29c0c35 100644
+--- a/arch/x86/kernel/process.c
++++ b/arch/x86/kernel/process.c
+@@ -669,6 +669,16 @@ unsigned long arch_align_stack(unsigned long sp)
+ unsigned long arch_randomize_brk(struct mm_struct *mm)
+ {
+ 	unsigned long range_end = mm->brk + 0x02000000;
+-	return randomize_range(mm->brk, range_end, 0) ? : mm->brk;
++	unsigned long bump = 0;
++#ifdef CONFIG_X86_32
++	/* in the case of NX emulation, shove the brk segment way out of the
++	   way of the exec randomization area, since it can collide with
++	   future allocations if not. */
++	if ( (mm->get_unmapped_exec_area == arch_get_unmapped_exec_area) &&
++	     (mm->brk < 0x08000000) ) {
++		bump = (TASK_SIZE/6);
++	}
++#endif
++	return bump + (randomize_range(mm->brk, range_end, 0) ? : mm->brk);
+ }
+ 
diff --git a/linux-2.6-e1000-ich9-montevina.patch b/linux-2.6-e1000-ich9-montevina.patch
index d45fd56..ec38a39 100644
--- a/linux-2.6-e1000-ich9-montevina.patch
+++ b/linux-2.6-e1000-ich9-montevina.patch
@@ -1,11 +1,22 @@
+From 802e6d8c8477a553a677b23a247d6d2638e01958 Mon Sep 17 00:00:00 2001
+From: Dave Jones <davej at redhat.com>
+Date: Wed, 26 Oct 2011 13:31:47 -0400
+Subject: [PATCH] e1000e: ich9 montevina
+
 This only showed up in one SDV (Montevina).
 The PCIE slots don't seem to like network cards, so this is the only hope
 to get networking working.  It's never going upstream, but it's low impact
 enough to carry just to keep those SDVs working.
+---
+ drivers/net/ethernet/intel/e1000e/ich8lan.c |    6 ++++++
+ drivers/net/ethernet/intel/e1000e/netdev.c  |    1 +
+ 2 files changed, 7 insertions(+), 0 deletions(-)
 
---- linux-2.6.35.noarch/drivers/net/e1000e/ich8lan.c~	2010-09-29 17:53:13.000000000 -0400
-+++ linux-2.6.35.noarch/drivers/net/e1000e/ich8lan.c	2010-09-29 17:54:00.000000000 -0400
-@@ -424,6 +424,12 @@ static s32 e1000_init_phy_params_ich8lan
+diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c
+index 6a17c62..0e40975 100644
+--- a/drivers/net/ethernet/intel/e1000e/ich8lan.c
++++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c
+@@ -452,6 +452,12 @@ static s32 e1000_init_phy_params_ich8lan(struct e1000_hw *hw)
  
  	/* Verify phy id */
  	switch (phy->id) {
@@ -18,9 +29,11 @@ enough to carry just to keep those SDVs working.
  	case IGP03E1000_E_PHY_ID:
  		phy->type = e1000_phy_igp_3;
  		phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT;
---- linux-2.6.35.noarch/drivers/net/e1000e/netdev.c~	2010-09-29 17:54:07.000000000 -0400
-+++ linux-2.6.35.noarch/drivers/net/e1000e/netdev.c	2010-09-29 17:54:29.000000000 -0400
-@@ -5994,6 +5994,7 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci
+diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
+index a855db1..edac30b 100644
+--- a/drivers/net/ethernet/intel/e1000e/netdev.c
++++ b/drivers/net/ethernet/intel/e1000e/netdev.c
+@@ -6359,6 +6359,7 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {
  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M), board_ich9lan },
  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_AMT), board_ich9lan },
  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_V), board_ich9lan },
@@ -28,3 +41,6 @@ enough to carry just to keep those SDVs working.
  
  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LM), board_ich9lan },
  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LF), board_ich9lan },
+-- 
+1.7.6.4
+
diff --git a/linux-2.6-i386-nx-emulation.patch b/linux-2.6-i386-nx-emulation.patch
index fb58c61..07a0fae 100644
--- a/linux-2.6-i386-nx-emulation.patch
+++ b/linux-2.6-i386-nx-emulation.patch
@@ -592,25 +592,3 @@
  	mmu_notifier_invalidate_range_start(mm, start, end);
  	if (is_vm_hugetlb_page(vma))
  		hugetlb_change_protection(vma, start, end, vma->vm_page_prot);
-diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
-index 57d1868..29c0c35 100644
---- a/arch/x86/kernel/process.c
-+++ b/arch/x86/kernel/process.c
-@@ -669,6 +669,16 @@ unsigned long arch_align_stack(unsigned long sp)
- unsigned long arch_randomize_brk(struct mm_struct *mm)
- {
- 	unsigned long range_end = mm->brk + 0x02000000;
--	return randomize_range(mm->brk, range_end, 0) ? : mm->brk;
-+	unsigned long bump = 0;
-+#ifdef CONFIG_X86_32
-+	/* in the case of NX emulation, shove the brk segment way out of the
-+	   way of the exec randomization area, since it can collide with
-+	   future allocations if not. */
-+	if ( (mm->get_unmapped_exec_area == arch_get_unmapped_exec_area) &&
-+	     (mm->brk < 0x08000000) ) {
-+		bump = (TASK_SIZE/6);
-+	}
-+#endif
-+	return bump + (randomize_range(mm->brk, range_end, 0) ? : mm->brk);
- }
- 
diff --git a/linux-2.6-intel-iommu-igfx.patch b/linux-2.6-intel-iommu-igfx.patch
index b2f8f19..3a45aba 100644
--- a/linux-2.6-intel-iommu-igfx.patch
+++ b/linux-2.6-intel-iommu-igfx.patch
@@ -1,6 +1,7 @@
-Subject: [PATCH] [intel_iommu] Default to igfx_off
+From 602e1f209dd983e40d989e871cd253e8187899b8 Mon Sep 17 00:00:00 2001
 From: drago01 <drago01 at gmail.com>
-To: fedora-kernel-list <fedora-kernel-list at redhat.com>
+Date: Wed, 26 Oct 2011 13:37:27 -0400
+Subject: [PATCH] Default to igfx_off
 
 This option seems to causes way to many issues, it is
 being investigated by Intel's chipset team for months now and
@@ -16,14 +17,14 @@ Signed-off-by: Adel Gadllah <adel.gadllah at gmail.com>
 Reviewed-by: Adam Jackson <ajax at redhat.com>
 ---
  Documentation/kernel-parameters.txt |   11 +++++------
- drivers/pci/intel-iommu.c           |    9 +++++----
+ drivers/iommu/intel-iommu.c         |    9 +++++----
  2 files changed, 10 insertions(+), 10 deletions(-)
 
 diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
-index e7848a0..9914485 100644
+index 81c287f..ee5693b 100644
 --- a/Documentation/kernel-parameters.txt
 +++ b/Documentation/kernel-parameters.txt
-@@ -992,12 +992,11 @@ and is between 256 and 4096 characters. It is defined in the file
+@@ -1014,12 +1014,11 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
  			Enable intel iommu driver.
  		off
  			Disable intel iommu driver.
@@ -40,22 +41,22 @@ index e7848a0..9914485 100644
 +			mapped as normal device.
  		forcedac [x86_64]
  			With this option iommu will not optimize to look
- 			for io virtual address below 32 bit forcing dual
-diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
-index 4173125..8f36786 100644
+ 			for io virtual address below 32-bit forcing dual
+diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
+index bdc447f..240db6b 100644
 --- a/drivers/iommu/intel-iommu.c
 +++ b/drivers/iommu/intel-iommu.c
-@@ -340,7 +340,8 @@ int dmar_disabled = 0;
- int dmar_disabled = 1;
- #endif /*CONFIG_DMAR_DEFAULT_ON*/
-
+@@ -408,7 +408,8 @@ int dmar_disabled = 1;
+ int intel_iommu_enabled = 0;
+ EXPORT_SYMBOL_GPL(intel_iommu_enabled);
+ 
 -static int dmar_map_gfx = 1;
 +/* disabled by default; causes way too many issues */
 +static int dmar_map_gfx = 0;
  static int dmar_forcedac;
  static int intel_iommu_strict;
-
-@@ -361,10 +362,10 @@ static int __init intel_iommu_setup(char *str)
+ static int intel_iommu_superpage = 1;
+@@ -433,10 +434,10 @@ static int __init intel_iommu_setup(char *str)
  		} else if (!strncmp(str, "off", 3)) {
  			dmar_disabled = 1;
  			printk(KERN_INFO "Intel-IOMMU: disabled\n");
@@ -70,9 +71,5 @@ index 4173125..8f36786 100644
  			printk(KERN_INFO
  				"Intel-IOMMU: Forcing DAC for PCI devices\n");
 -- 
-1.6.6.1
-_______________________________________________
-kernel mailing list
-kernel at lists.fedoraproject.org
-https://admin.fedoraproject.org/mailman/listinfo/kernel
+1.7.7.4
 
diff --git a/msi-irq-sysfs-warning.patch b/msi-irq-sysfs-warning.patch
new file mode 100644
index 0000000..dce440e
--- /dev/null
+++ b/msi-irq-sysfs-warning.patch
@@ -0,0 +1,87 @@
+commit 3ff0e97a1bc3059bfbcc1d864c5d4ff5f8d3c2b9
+Author: Neil Horman <nhorman at tuxdriver.com>
+Date:   Tue Jan 3 10:17:21 2012 -0500
+
+    msi: fix imbalanced refcount of msi irq sysfs objects
+    
+    This warning was recently reported to me:
+    
+    ------------[ cut here ]------------
+    WARNING: at lib/kobject.c:595 kobject_put+0x50/0x60()
+    Hardware name: VMware Virtual Platform
+    kobject: '(null)' (ffff880027b0df40): is not initialized, yet kobject_put() is
+    being called.
+    Modules linked in: vmxnet3(+) vmw_balloon i2c_piix4 i2c_core shpchp raid10
+    vmw_pvscsi
+    Pid: 630, comm: modprobe Tainted: G        W   3.1.6-1.fc16.x86_64 #1
+    Call Trace:
+     [<ffffffff8106b73f>] warn_slowpath_common+0x7f/0xc0
+     [<ffffffff8106b836>] warn_slowpath_fmt+0x46/0x50
+     [<ffffffff810da293>] ? free_desc+0x63/0x70
+     [<ffffffff812a9aa0>] kobject_put+0x50/0x60
+     [<ffffffff812e4c25>] free_msi_irqs+0xd5/0x120
+     [<ffffffff812e524c>] pci_enable_msi_block+0x24c/0x2c0
+     [<ffffffffa017c273>] vmxnet3_alloc_intr_resources+0x173/0x240 [vmxnet3]
+     [<ffffffffa0182e94>] vmxnet3_probe_device+0x615/0x834 [vmxnet3]
+     [<ffffffff812d141c>] local_pci_probe+0x5c/0xd0
+     [<ffffffff812d2cb9>] pci_device_probe+0x109/0x130
+     [<ffffffff8138ba2c>] driver_probe_device+0x9c/0x2b0
+     [<ffffffff8138bceb>] __driver_attach+0xab/0xb0
+     [<ffffffff8138bc40>] ? driver_probe_device+0x2b0/0x2b0
+     [<ffffffff8138bc40>] ? driver_probe_device+0x2b0/0x2b0
+     [<ffffffff8138a8ac>] bus_for_each_dev+0x5c/0x90
+     [<ffffffff8138b63e>] driver_attach+0x1e/0x20
+     [<ffffffff8138b240>] bus_add_driver+0x1b0/0x2a0
+     [<ffffffffa0188000>] ? 0xffffffffa0187fff
+     [<ffffffff8138c246>] driver_register+0x76/0x140
+     [<ffffffff815ca414>] ? printk+0x51/0x53
+     [<ffffffffa0188000>] ? 0xffffffffa0187fff
+     [<ffffffff812d2996>] __pci_register_driver+0x56/0xd0
+     [<ffffffffa018803a>] vmxnet3_init_module+0x3a/0x3c [vmxnet3]
+     [<ffffffff81002042>] do_one_initcall+0x42/0x180
+     [<ffffffff810aad71>] sys_init_module+0x91/0x200
+     [<ffffffff815dccc2>] system_call_fastpath+0x16/0x1b
+    ---[ end trace 44593438a59a9558 ]---
+    Using INTx interrupt, #Rx queues: 1.
+    
+    It occurs when populate_msi_sysfs fails, which in turn causes free_msi_irqs to
+    be called.  Because populate_msi_sysfs fails, we never registered any of the
+    msi irq sysfs objects, but free_msi_irqs still calls kobject_del and kobject_put
+    on each of them, which gets flagged in the above stack trace.
+    
+    The fix is pretty straightforward.  We can key of the parent pointer in the
+    kobject.  It is only set if the kobject_init_and_add succededs in
+    populate_msi_sysfs.  If anything fails there, each kobject has its parent reset
+    to NULL
+    
+    Signed-off-by: Neil Horman <nhorman at tuxdriver.com>
+    CC: Jesse Barnes <jbarnes at virtuousgeek.org>
+    CC: Bjorn Helgaas <bhelgaas at google.com>
+    CC: Greg Kroah-Hartman <gregkh at suse.de>
+    CC: linux-pci at vger.kernel.org
+
+diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
+index 337e16a..82de95e 100644
+--- a/drivers/pci/msi.c
++++ b/drivers/pci/msi.c
+@@ -323,8 +323,18 @@ static void free_msi_irqs(struct pci_dev *dev)
+ 			if (list_is_last(&entry->list, &dev->msi_list))
+ 				iounmap(entry->mask_base);
+ 		}
+-		kobject_del(&entry->kobj);
+-		kobject_put(&entry->kobj);
++
++		/*
++		 * Its possible that we get into this path
++		 * When populate_msi_sysfs fails, which means the entries
++		 * were not registered with sysfs.  In that case don't
++		 * unregister them.
++		 */
++		if (entry->kobj.parent) {
++			kobject_del(&entry->kobj);
++			kobject_put(&entry->kobj);
++		}
++
+ 		list_del(&entry->list);
+ 		kfree(entry);
+ 	}
diff --git a/nfs-client-freezer.patch b/nfs-client-freezer.patch
index 6b4d34d..5f5b083 100644
--- a/nfs-client-freezer.patch
+++ b/nfs-client-freezer.patch
@@ -1,106 +1,4 @@
 @@ -, +, @@ 
- fs/cifs/transport.c     |    3 ++-
- include/linux/freezer.h |   19 +++++++++++++++++--
- 2 files changed, 19 insertions(+), 3 deletions(-)
---- a/fs/cifs/transport.c	
-+++ a/fs/cifs/transport.c	
-@@ -26,6 +26,7 @@ 
- #include <linux/wait.h>
- #include <linux/net.h>
- #include <linux/delay.h>
-+#include <linux/freezer.h>
- #include <asm/uaccess.h>
- #include <asm/processor.h>
- #include <linux/mempool.h>
-@@ -324,7 +325,7 @@ wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *midQ)
- {
- 	int error;
- 
--	error = wait_event_killable(server->response_q,
-+	error = wait_event_freezekillable(server->response_q,
- 				    midQ->midState != MID_REQUEST_SUBMITTED);
- 	if (error < 0)
- 		return -ERESTARTSYS;
---- a/include/linux/freezer.h	
-+++ a/include/linux/freezer.h	
-@@ -134,10 +134,25 @@ static inline void set_freezable_with_signal(void)
- }
- 
- /*
-- * Freezer-friendly wrappers around wait_event_interruptible() and
-- * wait_event_interruptible_timeout(), originally defined in <linux/wait.h>
-+ * Freezer-friendly wrappers around wait_event_interruptible(),
-+ * wait_event_killable() and wait_event_interruptible_timeout(), originally
-+ * defined in <linux/wait.h>
-  */
- 
-+#define wait_event_freezekillable(wq, condition)			\
-+({									\
-+	int __retval;							\
-+	do {								\
-+		__retval = wait_event_killable(wq, 			\
-+				(condition) || freezing(current));	\
-+		if (__retval && !freezing(current))			\
-+			break;						\
-+		else if (!(condition))					\
-+			__retval = -ERESTARTSYS;			\
-+	} while (try_to_freeze());					\
-+	__retval;							\
-+})
-+
- #define wait_event_freezable(wq, condition)				\
- ({									\
- 	int __retval;							\
- include/linux/freezer.h |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
---- a/include/linux/freezer.h	
-+++ a/include/linux/freezer.h	
-@@ -143,7 +143,7 @@ static inline void set_freezable_with_signal(void)
- ({									\
- 	int __retval;							\
- 	do {								\
--		__retval = wait_event_killable(wq, 			\
-+		__retval = wait_event_killable(wq,			\
- 				(condition) || freezing(current));	\
- 		if (__retval && !freezing(current))			\
- 			break;						\
- include/linux/freezer.h |    3 +++
- 1 files changed, 3 insertions(+), 0 deletions(-)
---- a/include/linux/freezer.h	
-+++ a/include/linux/freezer.h	
-@@ -203,6 +203,9 @@ static inline void set_freezable_with_signal(void) {}
- #define wait_event_freezable_timeout(wq, condition, timeout)		\
- 		wait_event_interruptible_timeout(wq, condition, timeout)
- 
-+#define wait_event_freezekillable(wq, condition)		\
-+		wait_event_killable(wq, condition)
-+
- #endif /* !CONFIG_FREEZER */
- 
- #endif	/* FREEZER_H_INCLUDED */
-    description on Rafael's request.]
- include/linux/freezer.h |   11 +++--------
- 1 files changed, 3 insertions(+), 8 deletions(-)
---- a/include/linux/freezer.h	
-+++ a/include/linux/freezer.h	
-@@ -142,14 +142,9 @@ static inline void set_freezable_with_signal(void)
- #define wait_event_freezekillable(wq, condition)			\
- ({									\
- 	int __retval;							\
--	do {								\
--		__retval = wait_event_killable(wq,			\
--				(condition) || freezing(current));	\
--		if (__retval && !freezing(current))			\
--			break;						\
--		else if (!(condition))					\
--			__retval = -ERESTARTSYS;			\
--	} while (try_to_freeze());					\
-+	freezer_do_not_count();						\
-+	__retval = wait_event_killable(wq, (condition));		\
-+	freezer_count();						\
- 	__retval;							\
- })
- 
  fs/nfs/inode.c          |    3 ++-
  fs/nfs/nfs3proc.c       |    3 ++-
  fs/nfs/nfs4proc.c       |    5 +++--
@@ -156,7 +54,7 @@
  
  #include "nfs4_fs.h"
  #include "delegation.h"
-@@ -244,7 +245,7 @@ static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
+@@ -241,7 +242,7 @@ static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
  		*timeout = NFS4_POLL_RETRY_MIN;
  	if (*timeout > NFS4_POLL_RETRY_MAX)
  		*timeout = NFS4_POLL_RETRY_MAX;
@@ -165,7 +63,7 @@
  	if (fatal_signal_pending(current))
  		res = -ERESTARTSYS;
  	*timeout <<= 1;
-@@ -3970,7 +3971,7 @@ int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4
+@@ -3950,7 +3951,7 @@ int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4
  static unsigned long
  nfs4_set_lock_task_retry(unsigned long timeout)
  {
@@ -195,7 +93,7 @@
  	return res;
 --- a/include/linux/freezer.h	
 +++ a/include/linux/freezer.h	
-@@ -134,6 +134,29 @@ static inline void set_freezable_with_signal(void)
+@@ -135,6 +135,29 @@ static inline void set_freezable_with_signal(void)
  }
  
  /*
@@ -225,7 +123,7 @@
   * Freezer-friendly wrappers around wait_event_interruptible(),
   * wait_event_killable() and wait_event_interruptible_timeout(), originally
   * defined in <linux/wait.h>
-@@ -192,6 +215,11 @@ static inline int freezer_should_skip(struct task_struct *p) { return 0; }
+@@ -194,6 +217,11 @@ static inline int freezer_should_skip(struct task_struct *p) { return 0; }
  static inline void set_freezable(void) {}
  static inline void set_freezable_with_signal(void) {}
  
@@ -260,7 +158,7 @@
  1 files changed, 18 insertions(+), 3 deletions(-)
 --- a/include/linux/freezer.h	
 +++ a/include/linux/freezer.h	
-@@ -140,18 +140,33 @@ static inline void set_freezable_with_signal(void)
+@@ -141,18 +141,33 @@ static inline void set_freezable_with_signal(void)
   * while in this function.
   */
  
diff --git a/rcu-reintroduce-missing-calls.patch b/rcu-reintroduce-missing-calls.patch
new file mode 100644
index 0000000..b887df7
--- /dev/null
+++ b/rcu-reintroduce-missing-calls.patch
@@ -0,0 +1,632 @@
+commit cf778b00e96df6d64f8e21b8395d1f8a859ecdc7
+Author: Eric Dumazet <eric.dumazet at gmail.com>
+Date:   Thu Jan 12 04:41:32 2012 +0000
+
+    net: reintroduce missing rcu_assign_pointer() calls
+    
+    commit a9b3cd7f32 (rcu: convert uses of rcu_assign_pointer(x, NULL) to
+    RCU_INIT_POINTER) did a lot of incorrect changes, since it did a
+    complete conversion of rcu_assign_pointer(x, y) to RCU_INIT_POINTER(x,
+    y).
+    
+    We miss needed barriers, even on x86, when y is not NULL.
+    
+    Signed-off-by: Eric Dumazet <eric.dumazet at gmail.com>
+    CC: Stephen Hemminger <shemminger at vyatta.com>
+    CC: Paul E. McKenney <paulmck at linux.vnet.ibm.com>
+    Signed-off-by: David S. Miller <davem at davemloft.net>
+
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/core/netpoll.c linux-3.2.net/net/core/netpoll.c
+--- linux-3.2.noarch/net/core/netpoll.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/core/netpoll.c	2012-01-20 16:50:26.761797929 -0500
+@@ -763,7 +763,7 @@ int __netpoll_setup(struct netpoll *np)
+ 	}
+ 
+ 	/* last thing to do is link it to the net device structure */
+-	RCU_INIT_POINTER(ndev->npinfo, npinfo);
++	rcu_assign_pointer(ndev->npinfo, npinfo);
+ 
+ 	return 0;
+ 
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/core/net-sysfs.c linux-3.2.net/net/core/net-sysfs.c
+--- linux-3.2.noarch/net/core/net-sysfs.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/core/net-sysfs.c	2012-01-20 16:50:26.730798974 -0500
+@@ -990,9 +990,9 @@ static ssize_t store_xps_map(struct netd
+ 			nonempty = 1;
+ 	}
+ 
+-	if (nonempty)
+-		RCU_INIT_POINTER(dev->xps_maps, new_dev_maps);
+-	else {
++	if (nonempty) {
++		rcu_assign_pointer(dev->xps_maps, new_dev_maps);
++	} else {
+ 		kfree(new_dev_maps);
+ 		RCU_INIT_POINTER(dev->xps_maps, NULL);
+ 	}
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/decnet/dn_dev.c linux-3.2.net/net/decnet/dn_dev.c
+--- linux-3.2.noarch/net/decnet/dn_dev.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/decnet/dn_dev.c	2012-01-20 16:50:26.793796851 -0500
+@@ -388,7 +388,7 @@ static int dn_dev_insert_ifa(struct dn_d
+ 	}
+ 
+ 	ifa->ifa_next = dn_db->ifa_list;
+-	RCU_INIT_POINTER(dn_db->ifa_list, ifa);
++	rcu_assign_pointer(dn_db->ifa_list, ifa);
+ 
+ 	dn_ifaddr_notify(RTM_NEWADDR, ifa);
+ 	blocking_notifier_call_chain(&dnaddr_chain, NETDEV_UP, ifa);
+@@ -1093,7 +1093,7 @@ static struct dn_dev *dn_dev_create(stru
+ 
+ 	memcpy(&dn_db->parms, p, sizeof(struct dn_dev_parms));
+ 
+-	RCU_INIT_POINTER(dev->dn_ptr, dn_db);
++	rcu_assign_pointer(dev->dn_ptr, dn_db);
+ 	dn_db->dev = dev;
+ 	init_timer(&dn_db->timer);
+ 
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/ipv4/devinet.c linux-3.2.net/net/ipv4/devinet.c
+--- linux-3.2.noarch/net/ipv4/devinet.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/ipv4/devinet.c	2012-01-20 16:50:26.829795637 -0500
+@@ -258,7 +258,7 @@ static struct in_device *inetdev_init(st
+ 		ip_mc_up(in_dev);
+ 
+ 	/* we can receive as soon as ip_ptr is set -- do this last */
+-	RCU_INIT_POINTER(dev->ip_ptr, in_dev);
++	rcu_assign_pointer(dev->ip_ptr, in_dev);
+ out:
+ 	return in_dev;
+ out_kfree:
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/ipv4/fib_trie.c linux-3.2.net/net/ipv4/fib_trie.c
+--- linux-3.2.noarch/net/ipv4/fib_trie.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/ipv4/fib_trie.c	2012-01-20 16:50:26.865794425 -0500
+@@ -205,7 +205,7 @@ static inline struct tnode *node_parent_
+ 	return (struct tnode *)(parent & ~NODE_TYPE_MASK);
+ }
+ 
+-/* Same as RCU_INIT_POINTER
++/* Same as rcu_assign_pointer
+  * but that macro() assumes that value is a pointer.
+  */
+ static inline void node_set_parent(struct rt_trie_node *node, struct tnode *ptr)
+@@ -529,7 +529,7 @@ static void tnode_put_child_reorg(struct
+ 	if (n)
+ 		node_set_parent(n, tn);
+ 
+-	RCU_INIT_POINTER(tn->child[i], n);
++	rcu_assign_pointer(tn->child[i], n);
+ }
+ 
+ #define MAX_WORK 10
+@@ -1015,7 +1015,7 @@ static void trie_rebalance(struct trie *
+ 
+ 		tp = node_parent((struct rt_trie_node *) tn);
+ 		if (!tp)
+-			RCU_INIT_POINTER(t->trie, (struct rt_trie_node *)tn);
++			rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
+ 
+ 		tnode_free_flush();
+ 		if (!tp)
+@@ -1027,7 +1027,7 @@ static void trie_rebalance(struct trie *
+ 	if (IS_TNODE(tn))
+ 		tn = (struct tnode *)resize(t, (struct tnode *)tn);
+ 
+-	RCU_INIT_POINTER(t->trie, (struct rt_trie_node *)tn);
++	rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
+ 	tnode_free_flush();
+ }
+ 
+@@ -1164,7 +1164,7 @@ static struct list_head *fib_insert_node
+ 			put_child(t, (struct tnode *)tp, cindex,
+ 				  (struct rt_trie_node *)tn);
+ 		} else {
+-			RCU_INIT_POINTER(t->trie, (struct rt_trie_node *)tn);
++			rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
+ 			tp = tn;
+ 		}
+ 	}
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/ipv4/igmp.c linux-3.2.net/net/ipv4/igmp.c
+--- linux-3.2.noarch/net/ipv4/igmp.c	2012-01-20 16:22:44.923961882 -0500
++++ linux-3.2.net/net/ipv4/igmp.c	2012-01-20 16:50:26.898793315 -0500
+@@ -1244,7 +1244,7 @@ void ip_mc_inc_group(struct in_device *i
+ 
+ 	im->next_rcu = in_dev->mc_list;
+ 	in_dev->mc_count++;
+-	RCU_INIT_POINTER(in_dev->mc_list, im);
++	rcu_assign_pointer(in_dev->mc_list, im);
+ 
+ #ifdef CONFIG_IP_MULTICAST
+ 	igmpv3_del_delrec(in_dev, im->multiaddr);
+@@ -1816,7 +1816,7 @@ int ip_mc_join_group(struct sock *sk , s
+ 	iml->next_rcu = inet->mc_list;
+ 	iml->sflist = NULL;
+ 	iml->sfmode = MCAST_EXCLUDE;
+-	RCU_INIT_POINTER(inet->mc_list, iml);
++	rcu_assign_pointer(inet->mc_list, iml);
+ 	ip_mc_inc_group(in_dev, addr);
+ 	err = 0;
+ done:
+@@ -2003,7 +2003,7 @@ int ip_mc_source(int add, int omode, str
+ 			atomic_sub(IP_SFLSIZE(psl->sl_max), &sk->sk_omem_alloc);
+ 			kfree_rcu(psl, rcu);
+ 		}
+-		RCU_INIT_POINTER(pmc->sflist, newpsl);
++		rcu_assign_pointer(pmc->sflist, newpsl);
+ 		psl = newpsl;
+ 	}
+ 	rv = 1;	/* > 0 for insert logic below if sl_count is 0 */
+@@ -2106,7 +2106,7 @@ int ip_mc_msfilter(struct sock *sk, stru
+ 	} else
+ 		(void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,
+ 			0, NULL, 0);
+-	RCU_INIT_POINTER(pmc->sflist, newpsl);
++	rcu_assign_pointer(pmc->sflist, newpsl);
+ 	pmc->sfmode = msf->imsf_fmode;
+ 	err = 0;
+ done:
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/ipv4/ipip.c linux-3.2.net/net/ipv4/ipip.c
+--- linux-3.2.noarch/net/ipv4/ipip.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/ipv4/ipip.c	2012-01-20 16:50:26.916792707 -0500
+@@ -231,7 +231,7 @@ static void ipip_tunnel_unlink(struct ip
+ 	     (iter = rtnl_dereference(*tp)) != NULL;
+ 	     tp = &iter->next) {
+ 		if (t == iter) {
+-			RCU_INIT_POINTER(*tp, t->next);
++			rcu_assign_pointer(*tp, t->next);
+ 			break;
+ 		}
+ 	}
+@@ -241,8 +241,8 @@ static void ipip_tunnel_link(struct ipip
+ {
+ 	struct ip_tunnel __rcu **tp = ipip_bucket(ipn, t);
+ 
+-	RCU_INIT_POINTER(t->next, rtnl_dereference(*tp));
+-	RCU_INIT_POINTER(*tp, t);
++	rcu_assign_pointer(t->next, rtnl_dereference(*tp));
++	rcu_assign_pointer(*tp, t);
+ }
+ 
+ static struct ip_tunnel * ipip_tunnel_locate(struct net *net,
+@@ -792,7 +792,7 @@ static int __net_init ipip_fb_tunnel_ini
+ 		return -ENOMEM;
+ 
+ 	dev_hold(dev);
+-	RCU_INIT_POINTER(ipn->tunnels_wc[0], tunnel);
++	rcu_assign_pointer(ipn->tunnels_wc[0], tunnel);
+ 	return 0;
+ }
+ 
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/ipv4/ipmr.c linux-3.2.net/net/ipv4/ipmr.c
+--- linux-3.2.noarch/net/ipv4/ipmr.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/ipv4/ipmr.c	2012-01-20 16:50:26.946791698 -0500
+@@ -1225,7 +1225,7 @@ int ip_mroute_setsockopt(struct sock *sk
+ 
+ 		ret = ip_ra_control(sk, 1, mrtsock_destruct);
+ 		if (ret == 0) {
+-			RCU_INIT_POINTER(mrt->mroute_sk, sk);
++			rcu_assign_pointer(mrt->mroute_sk, sk);
+ 			IPV4_DEVCONF_ALL(net, MC_FORWARDING)++;
+ 		}
+ 		rtnl_unlock();
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/ipv6/addrconf.c linux-3.2.net/net/ipv6/addrconf.c
+--- linux-3.2.noarch/net/ipv6/addrconf.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/ipv6/addrconf.c	2012-01-20 16:50:26.977790653 -0500
+@@ -429,7 +429,7 @@ static struct inet6_dev * ipv6_add_dev(s
+ 	ndev->tstamp = jiffies;
+ 	addrconf_sysctl_register(ndev);
+ 	/* protected by rtnl_lock */
+-	RCU_INIT_POINTER(dev->ip6_ptr, ndev);
++	rcu_assign_pointer(dev->ip6_ptr, ndev);
+ 
+ 	/* Join all-node multicast group */
+ 	ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes);
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/ipv6/ip6_tunnel.c linux-3.2.net/net/ipv6/ip6_tunnel.c
+--- linux-3.2.noarch/net/ipv6/ip6_tunnel.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/ipv6/ip6_tunnel.c	2012-01-20 16:50:27.004789743 -0500
+@@ -218,8 +218,8 @@ ip6_tnl_link(struct ip6_tnl_net *ip6n, s
+ {
+ 	struct ip6_tnl __rcu **tp = ip6_tnl_bucket(ip6n, &t->parms);
+ 
+-	RCU_INIT_POINTER(t->next , rtnl_dereference(*tp));
+-	RCU_INIT_POINTER(*tp, t);
++	rcu_assign_pointer(t->next , rtnl_dereference(*tp));
++	rcu_assign_pointer(*tp, t);
+ }
+ 
+ /**
+@@ -237,7 +237,7 @@ ip6_tnl_unlink(struct ip6_tnl_net *ip6n,
+ 	     (iter = rtnl_dereference(*tp)) != NULL;
+ 	     tp = &iter->next) {
+ 		if (t == iter) {
+-			RCU_INIT_POINTER(*tp, t->next);
++			rcu_assign_pointer(*tp, t->next);
+ 			break;
+ 		}
+ 	}
+@@ -1450,7 +1450,7 @@ static int __net_init ip6_fb_tnl_dev_ini
+ 
+ 	t->parms.proto = IPPROTO_IPV6;
+ 	dev_hold(dev);
+-	RCU_INIT_POINTER(ip6n->tnls_wc[0], t);
++	rcu_assign_pointer(ip6n->tnls_wc[0], t);
+ 	return 0;
+ }
+ 
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/ipv6/raw.c linux-3.2.net/net/ipv6/raw.c
+--- linux-3.2.noarch/net/ipv6/raw.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/ipv6/raw.c	2012-01-20 16:50:27.022789138 -0500
+@@ -131,7 +131,7 @@ static mh_filter_t __rcu *mh_filter __re
+ 
+ int rawv6_mh_filter_register(mh_filter_t filter)
+ {
+-	RCU_INIT_POINTER(mh_filter, filter);
++	rcu_assign_pointer(mh_filter, filter);
+ 	return 0;
+ }
+ EXPORT_SYMBOL(rawv6_mh_filter_register);
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/ipv6/sit.c linux-3.2.net/net/ipv6/sit.c
+--- linux-3.2.noarch/net/ipv6/sit.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/ipv6/sit.c	2012-01-20 16:50:27.042788464 -0500
+@@ -182,7 +182,7 @@ static void ipip6_tunnel_unlink(struct s
+ 	     (iter = rtnl_dereference(*tp)) != NULL;
+ 	     tp = &iter->next) {
+ 		if (t == iter) {
+-			RCU_INIT_POINTER(*tp, t->next);
++			rcu_assign_pointer(*tp, t->next);
+ 			break;
+ 		}
+ 	}
+@@ -192,8 +192,8 @@ static void ipip6_tunnel_link(struct sit
+ {
+ 	struct ip_tunnel __rcu **tp = ipip6_bucket(sitn, t);
+ 
+-	RCU_INIT_POINTER(t->next, rtnl_dereference(*tp));
+-	RCU_INIT_POINTER(*tp, t);
++	rcu_assign_pointer(t->next, rtnl_dereference(*tp));
++	rcu_assign_pointer(*tp, t);
+ }
+ 
+ static void ipip6_tunnel_clone_6rd(struct net_device *dev, struct sit_net *sitn)
+@@ -393,7 +393,7 @@ ipip6_tunnel_add_prl(struct ip_tunnel *t
+ 	p->addr = a->addr;
+ 	p->flags = a->flags;
+ 	t->prl_count++;
+-	RCU_INIT_POINTER(t->prl, p);
++	rcu_assign_pointer(t->prl, p);
+ out:
+ 	return err;
+ }
+@@ -1177,7 +1177,7 @@ static int __net_init ipip6_fb_tunnel_in
+ 	if (!dev->tstats)
+ 		return -ENOMEM;
+ 	dev_hold(dev);
+-	RCU_INIT_POINTER(sitn->tunnels_wc[0], tunnel);
++	rcu_assign_pointer(sitn->tunnels_wc[0], tunnel);
+ 	return 0;
+ }
+ 
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/mac80211/agg-rx.c linux-3.2.net/net/mac80211/agg-rx.c
+--- linux-3.2.noarch/net/mac80211/agg-rx.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/mac80211/agg-rx.c	2012-01-20 16:50:27.058787924 -0500
+@@ -326,7 +326,7 @@ void ieee80211_process_addba_request(str
+ 	status = WLAN_STATUS_SUCCESS;
+ 
+ 	/* activate it for RX */
+-	RCU_INIT_POINTER(sta->ampdu_mlme.tid_rx[tid], tid_agg_rx);
++	rcu_assign_pointer(sta->ampdu_mlme.tid_rx[tid], tid_agg_rx);
+ 
+ 	if (timeout)
+ 		mod_timer(&tid_agg_rx->session_timer, TU_TO_EXP_TIME(timeout));
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/mac80211/cfg.c linux-3.2.net/net/mac80211/cfg.c
+--- linux-3.2.noarch/net/mac80211/cfg.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/mac80211/cfg.c	2012-01-20 16:50:27.082787116 -0500
+@@ -575,7 +575,7 @@ static int ieee80211_config_beacon(struc
+ 
+ 	sdata->vif.bss_conf.dtim_period = new->dtim_period;
+ 
+-	RCU_INIT_POINTER(sdata->u.ap.beacon, new);
++	rcu_assign_pointer(sdata->u.ap.beacon, new);
+ 
+ 	synchronize_rcu();
+ 
+@@ -922,7 +922,7 @@ static int ieee80211_change_station(stru
+ 				return -EBUSY;
+ 			}
+ 
+-			RCU_INIT_POINTER(vlansdata->u.vlan.sta, sta);
++			rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
+ 		}
+ 
+ 		sta->sdata = vlansdata;
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/mac80211/ibss.c linux-3.2.net/net/mac80211/ibss.c
+--- linux-3.2.noarch/net/mac80211/ibss.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/mac80211/ibss.c	2012-01-20 16:50:27.102786444 -0500
+@@ -184,7 +184,7 @@ static void __ieee80211_sta_join_ibss(st
+ 		*pos++ = 0; /* U-APSD no in use */
+ 	}
+ 
+-	RCU_INIT_POINTER(ifibss->presp, skb);
++	rcu_assign_pointer(ifibss->presp, skb);
+ 
+ 	sdata->vif.bss_conf.beacon_int = beacon_int;
+ 	sdata->vif.bss_conf.basic_rates = basic_rates;
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/mac80211/sta_info.c linux-3.2.net/net/mac80211/sta_info.c
+--- linux-3.2.noarch/net/mac80211/sta_info.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/mac80211/sta_info.c	2012-01-20 16:50:27.131785466 -0500
+@@ -73,7 +73,7 @@ static int sta_info_hash_del(struct ieee
+ 	if (!s)
+ 		return -ENOENT;
+ 	if (s == sta) {
+-		RCU_INIT_POINTER(local->sta_hash[STA_HASH(sta->sta.addr)],
++		rcu_assign_pointer(local->sta_hash[STA_HASH(sta->sta.addr)],
+ 				   s->hnext);
+ 		return 0;
+ 	}
+@@ -83,7 +83,7 @@ static int sta_info_hash_del(struct ieee
+ 		s = rcu_dereference_protected(s->hnext,
+ 					lockdep_is_held(&local->sta_lock));
+ 	if (rcu_access_pointer(s->hnext)) {
+-		RCU_INIT_POINTER(s->hnext, sta->hnext);
++		rcu_assign_pointer(s->hnext, sta->hnext);
+ 		return 0;
+ 	}
+ 
+@@ -232,7 +232,7 @@ static void sta_info_hash_add(struct iee
+ 			      struct sta_info *sta)
+ {
+ 	sta->hnext = local->sta_hash[STA_HASH(sta->sta.addr)];
+-	RCU_INIT_POINTER(local->sta_hash[STA_HASH(sta->sta.addr)], sta);
++	rcu_assign_pointer(local->sta_hash[STA_HASH(sta->sta.addr)], sta);
+ }
+ 
+ static void sta_unblock(struct work_struct *wk)
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/netfilter/nf_conntrack_core.c linux-3.2.net/net/netfilter/nf_conntrack_core.c
+--- linux-3.2.noarch/net/netfilter/nf_conntrack_core.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/netfilter/nf_conntrack_core.c	2012-01-20 16:50:27.169784186 -0500
+@@ -776,7 +776,7 @@ init_conntrack(struct net *net, struct n
+ 		if (exp->helper) {
+ 			help = nf_ct_helper_ext_add(ct, GFP_ATOMIC);
+ 			if (help)
+-				RCU_INIT_POINTER(help->helper, exp->helper);
++				rcu_assign_pointer(help->helper, exp->helper);
+ 		}
+ 
+ #ifdef CONFIG_NF_CONNTRACK_MARK
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/netfilter/nf_conntrack_ecache.c linux-3.2.net/net/netfilter/nf_conntrack_ecache.c
+--- linux-3.2.noarch/net/netfilter/nf_conntrack_ecache.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/netfilter/nf_conntrack_ecache.c	2012-01-20 16:50:27.187783578 -0500
+@@ -91,7 +91,7 @@ int nf_conntrack_register_notifier(struc
+ 		ret = -EBUSY;
+ 		goto out_unlock;
+ 	}
+-	RCU_INIT_POINTER(net->ct.nf_conntrack_event_cb, new);
++	rcu_assign_pointer(net->ct.nf_conntrack_event_cb, new);
+ 	mutex_unlock(&nf_ct_ecache_mutex);
+ 	return ret;
+ 
+@@ -128,7 +128,7 @@ int nf_ct_expect_register_notifier(struc
+ 		ret = -EBUSY;
+ 		goto out_unlock;
+ 	}
+-	RCU_INIT_POINTER(net->ct.nf_expect_event_cb, new);
++	rcu_assign_pointer(net->ct.nf_expect_event_cb, new);
+ 	mutex_unlock(&nf_ct_ecache_mutex);
+ 	return ret;
+ 
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/netfilter/nf_conntrack_extend.c linux-3.2.net/net/netfilter/nf_conntrack_extend.c
+--- linux-3.2.noarch/net/netfilter/nf_conntrack_extend.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/netfilter/nf_conntrack_extend.c	2012-01-20 16:50:27.204783008 -0500
+@@ -169,7 +169,7 @@ int nf_ct_extend_register(struct nf_ct_e
+ 	   before updating alloc_size */
+ 	type->alloc_size = ALIGN(sizeof(struct nf_ct_ext), type->align)
+ 			   + type->len;
+-	RCU_INIT_POINTER(nf_ct_ext_types[type->id], type);
++	rcu_assign_pointer(nf_ct_ext_types[type->id], type);
+ 	update_alloc_size(type);
+ out:
+ 	mutex_unlock(&nf_ct_ext_type_mutex);
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/netfilter/nf_conntrack_helper.c linux-3.2.net/net/netfilter/nf_conntrack_helper.c
+--- linux-3.2.noarch/net/netfilter/nf_conntrack_helper.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/netfilter/nf_conntrack_helper.c	2012-01-20 16:50:27.227782232 -0500
+@@ -145,7 +145,7 @@ int __nf_ct_try_assign_helper(struct nf_
+ 		memset(&help->help, 0, sizeof(help->help));
+ 	}
+ 
+-	RCU_INIT_POINTER(help->helper, helper);
++	rcu_assign_pointer(help->helper, helper);
+ out:
+ 	return ret;
+ }
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/netfilter/nf_conntrack_netlink.c linux-3.2.net/net/netfilter/nf_conntrack_netlink.c
+--- linux-3.2.noarch/net/netfilter/nf_conntrack_netlink.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/netfilter/nf_conntrack_netlink.c	2012-01-20 16:50:27.271780750 -0500
+@@ -1163,7 +1163,7 @@ ctnetlink_change_helper(struct nf_conn *
+ 		return -EOPNOTSUPP;
+ 	}
+ 
+-	RCU_INIT_POINTER(help->helper, helper);
++	rcu_assign_pointer(help->helper, helper);
+ 
+ 	return 0;
+ }
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/netfilter/nf_log.c linux-3.2.net/net/netfilter/nf_log.c
+--- linux-3.2.noarch/net/netfilter/nf_log.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/netfilter/nf_log.c	2012-01-20 16:50:27.280780448 -0500
+@@ -55,7 +55,7 @@ int nf_log_register(u_int8_t pf, struct
+ 		llog = rcu_dereference_protected(nf_loggers[pf],
+ 						 lockdep_is_held(&nf_log_mutex));
+ 		if (llog == NULL)
+-			RCU_INIT_POINTER(nf_loggers[pf], logger);
++			rcu_assign_pointer(nf_loggers[pf], logger);
+ 	}
+ 
+ 	mutex_unlock(&nf_log_mutex);
+@@ -92,7 +92,7 @@ int nf_log_bind_pf(u_int8_t pf, const st
+ 		mutex_unlock(&nf_log_mutex);
+ 		return -ENOENT;
+ 	}
+-	RCU_INIT_POINTER(nf_loggers[pf], logger);
++	rcu_assign_pointer(nf_loggers[pf], logger);
+ 	mutex_unlock(&nf_log_mutex);
+ 	return 0;
+ }
+@@ -250,7 +250,7 @@ static int nf_log_proc_dostring(ctl_tabl
+ 			mutex_unlock(&nf_log_mutex);
+ 			return -ENOENT;
+ 		}
+-		RCU_INIT_POINTER(nf_loggers[tindex], logger);
++		rcu_assign_pointer(nf_loggers[tindex], logger);
+ 		mutex_unlock(&nf_log_mutex);
+ 	} else {
+ 		mutex_lock(&nf_log_mutex);
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/netfilter/nfnetlink.c linux-3.2.net/net/netfilter/nfnetlink.c
+--- linux-3.2.noarch/net/netfilter/nfnetlink.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/netfilter/nfnetlink.c	2012-01-20 16:50:27.302779705 -0500
+@@ -59,7 +59,7 @@ int nfnetlink_subsys_register(const stru
+ 		nfnl_unlock();
+ 		return -EBUSY;
+ 	}
+-	RCU_INIT_POINTER(subsys_table[n->subsys_id], n);
++	rcu_assign_pointer(subsys_table[n->subsys_id], n);
+ 	nfnl_unlock();
+ 
+ 	return 0;
+@@ -210,7 +210,7 @@ static int __net_init nfnetlink_net_init
+ 	if (!nfnl)
+ 		return -ENOMEM;
+ 	net->nfnl_stash = nfnl;
+-	RCU_INIT_POINTER(net->nfnl, nfnl);
++	rcu_assign_pointer(net->nfnl, nfnl);
+ 	return 0;
+ }
+ 
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/netfilter/nf_queue.c linux-3.2.net/net/netfilter/nf_queue.c
+--- linux-3.2.noarch/net/netfilter/nf_queue.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/netfilter/nf_queue.c	2012-01-20 16:50:27.293780010 -0500
+@@ -40,7 +40,7 @@ int nf_register_queue_handler(u_int8_t p
+ 	else if (old)
+ 		ret = -EBUSY;
+ 	else {
+-		RCU_INIT_POINTER(queue_handler[pf], qh);
++		rcu_assign_pointer(queue_handler[pf], qh);
+ 		ret = 0;
+ 	}
+ 	mutex_unlock(&queue_handler_mutex);
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/netlabel/netlabel_domainhash.c linux-3.2.net/net/netlabel/netlabel_domainhash.c
+--- linux-3.2.noarch/net/netlabel/netlabel_domainhash.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/netlabel/netlabel_domainhash.c	2012-01-20 16:50:27.311779402 -0500
+@@ -282,7 +282,7 @@ int __init netlbl_domhsh_init(u32 size)
+ 		INIT_LIST_HEAD(&hsh_tbl->tbl[iter]);
+ 
+ 	spin_lock(&netlbl_domhsh_lock);
+-	RCU_INIT_POINTER(netlbl_domhsh, hsh_tbl);
++	rcu_assign_pointer(netlbl_domhsh, hsh_tbl);
+ 	spin_unlock(&netlbl_domhsh_lock);
+ 
+ 	return 0;
+@@ -330,7 +330,7 @@ int netlbl_domhsh_add(struct netlbl_dom_
+ 				    &rcu_dereference(netlbl_domhsh)->tbl[bkt]);
+ 		} else {
+ 			INIT_LIST_HEAD(&entry->list);
+-			RCU_INIT_POINTER(netlbl_domhsh_def, entry);
++			rcu_assign_pointer(netlbl_domhsh_def, entry);
+ 		}
+ 
+ 		if (entry->type == NETLBL_NLTYPE_ADDRSELECT) {
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/netlabel/netlabel_unlabeled.c linux-3.2.net/net/netlabel/netlabel_unlabeled.c
+--- linux-3.2.noarch/net/netlabel/netlabel_unlabeled.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/netlabel/netlabel_unlabeled.c	2012-01-20 16:50:27.327778863 -0500
+@@ -354,7 +354,7 @@ static struct netlbl_unlhsh_iface *netlb
+ 		INIT_LIST_HEAD(&iface->list);
+ 		if (netlbl_unlhsh_rcu_deref(netlbl_unlhsh_def) != NULL)
+ 			goto add_iface_failure;
+-		RCU_INIT_POINTER(netlbl_unlhsh_def, iface);
++		rcu_assign_pointer(netlbl_unlhsh_def, iface);
+ 	}
+ 	spin_unlock(&netlbl_unlhsh_lock);
+ 
+@@ -1447,11 +1447,9 @@ int __init netlbl_unlabel_init(u32 size)
+ 	for (iter = 0; iter < hsh_tbl->size; iter++)
+ 		INIT_LIST_HEAD(&hsh_tbl->tbl[iter]);
+ 
+-	rcu_read_lock();
+ 	spin_lock(&netlbl_unlhsh_lock);
+-	RCU_INIT_POINTER(netlbl_unlhsh, hsh_tbl);
++	rcu_assign_pointer(netlbl_unlhsh, hsh_tbl);
+ 	spin_unlock(&netlbl_unlhsh_lock);
+-	rcu_read_unlock();
+ 
+ 	register_netdevice_notifier(&netlbl_unlhsh_netdev_notifier);
+ 
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/phonet/af_phonet.c linux-3.2.net/net/phonet/af_phonet.c
+--- linux-3.2.noarch/net/phonet/af_phonet.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/phonet/af_phonet.c	2012-01-20 16:50:27.345778258 -0500
+@@ -480,7 +480,7 @@ int __init_or_module phonet_proto_regist
+ 	if (proto_tab[protocol])
+ 		err = -EBUSY;
+ 	else
+-		RCU_INIT_POINTER(proto_tab[protocol], pp);
++		rcu_assign_pointer(proto_tab[protocol], pp);
+ 	mutex_unlock(&proto_tab_lock);
+ 
+ 	return err;
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/phonet/pn_dev.c linux-3.2.net/net/phonet/pn_dev.c
+--- linux-3.2.noarch/net/phonet/pn_dev.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/phonet/pn_dev.c	2012-01-20 16:50:27.353777988 -0500
+@@ -390,7 +390,7 @@ int phonet_route_add(struct net_device *
+ 	daddr = daddr >> 2;
+ 	mutex_lock(&routes->lock);
+ 	if (routes->table[daddr] == NULL) {
+-		RCU_INIT_POINTER(routes->table[daddr], dev);
++		rcu_assign_pointer(routes->table[daddr], dev);
+ 		dev_hold(dev);
+ 		err = 0;
+ 	}
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/phonet/socket.c linux-3.2.net/net/phonet/socket.c
+--- linux-3.2.noarch/net/phonet/socket.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/phonet/socket.c	2012-01-20 16:50:27.365777583 -0500
+@@ -680,7 +680,7 @@ int pn_sock_bind_res(struct sock *sk, u8
+ 	mutex_lock(&resource_mutex);
+ 	if (pnres.sk[res] == NULL) {
+ 		sock_hold(sk);
+-		RCU_INIT_POINTER(pnres.sk[res], sk);
++		rcu_assign_pointer(pnres.sk[res], sk);
+ 		ret = 0;
+ 	}
+ 	mutex_unlock(&resource_mutex);
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/socket.c linux-3.2.net/net/socket.c
+--- linux-3.2.noarch/net/socket.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/socket.c	2012-01-20 16:50:27.410776068 -0500
+@@ -2472,7 +2472,7 @@ int sock_register(const struct net_proto
+ 				      lockdep_is_held(&net_family_lock)))
+ 		err = -EEXIST;
+ 	else {
+-		RCU_INIT_POINTER(net_families[ops->family], ops);
++		rcu_assign_pointer(net_families[ops->family], ops);
+ 		err = 0;
+ 	}
+ 	spin_unlock(&net_family_lock);
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/sunrpc/auth_gss/auth_gss.c linux-3.2.net/net/sunrpc/auth_gss/auth_gss.c
+--- linux-3.2.noarch/net/sunrpc/auth_gss/auth_gss.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/sunrpc/auth_gss/auth_gss.c	2012-01-20 16:50:27.428775461 -0500
+@@ -122,7 +122,7 @@ gss_cred_set_ctx(struct rpc_cred *cred,
+ 	if (!test_bit(RPCAUTH_CRED_NEW, &cred->cr_flags))
+ 		return;
+ 	gss_get_ctx(ctx);
+-	RCU_INIT_POINTER(gss_cred->gc_ctx, ctx);
++	rcu_assign_pointer(gss_cred->gc_ctx, ctx);
+ 	set_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags);
+ 	smp_mb__before_clear_bit();
+ 	clear_bit(RPCAUTH_CRED_NEW, &cred->cr_flags);
+diff -durpN '--exclude-from=/home/davej/.exclude' linux-3.2.noarch/net/xfrm/xfrm_user.c linux-3.2.net/net/xfrm/xfrm_user.c
+--- linux-3.2.noarch/net/xfrm/xfrm_user.c	2012-01-04 18:55:44.000000000 -0500
++++ linux-3.2.net/net/xfrm/xfrm_user.c	2012-01-20 16:50:27.449774754 -0500
+@@ -2927,7 +2927,7 @@ static int __net_init xfrm_user_net_init
+ 	if (nlsk == NULL)
+ 		return -ENOMEM;
+ 	net->xfrm.nlsk_stash = nlsk; /* Don't set to NULL */
+-	RCU_INIT_POINTER(net->xfrm.nlsk, nlsk);
++	rcu_assign_pointer(net->xfrm.nlsk, nlsk);
+ 	return 0;
+ }
+ 
diff --git a/rds-Make-rds_sock_lock-BH-rather-than-IRQ-safe.patch b/rds-Make-rds_sock_lock-BH-rather-than-IRQ-safe.patch
new file mode 100644
index 0000000..0946aad
--- /dev/null
+++ b/rds-Make-rds_sock_lock-BH-rather-than-IRQ-safe.patch
@@ -0,0 +1,116 @@
+From efc3dbc37412c027e363736b4f4c74ee5e8ecffc Mon Sep 17 00:00:00 2001
+From: "David S. Miller" <davem at davemloft.net>
+Date: Tue, 24 Jan 2012 17:03:44 -0500
+Subject: [PATCH] rds: Make rds_sock_lock BH rather than IRQ safe.
+
+rds_sock_info() triggers locking warnings because we try to perform a
+local_bh_enable() (via sock_i_ino()) while hardware interrupts are
+disabled (via taking rds_sock_lock).
+
+There is no reason for rds_sock_lock to be a hardware IRQ disabling
+lock, none of these access paths run in hardware interrupt context.
+
+Therefore making it a BH disabling lock is safe and sufficient to
+fix this bug.
+
+Reported-by: Kumar Sanghvi <kumaras at chelsio.com>
+Reported-by: Josh Boyer <jwboyer at gmail.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ net/rds/af_rds.c |   20 ++++++++------------
+ 1 files changed, 8 insertions(+), 12 deletions(-)
+
+diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c
+index bb6ad81..424ff62 100644
+--- a/net/rds/af_rds.c
++++ b/net/rds/af_rds.c
+@@ -68,7 +68,6 @@ static int rds_release(struct socket *sock)
+ {
+ 	struct sock *sk = sock->sk;
+ 	struct rds_sock *rs;
+-	unsigned long flags;
+ 
+ 	if (!sk)
+ 		goto out;
+@@ -94,10 +93,10 @@ static int rds_release(struct socket *sock)
+ 	rds_rdma_drop_keys(rs);
+ 	rds_notify_queue_get(rs, NULL);
+ 
+-	spin_lock_irqsave(&rds_sock_lock, flags);
++	spin_lock_bh(&rds_sock_lock);
+ 	list_del_init(&rs->rs_item);
+ 	rds_sock_count--;
+-	spin_unlock_irqrestore(&rds_sock_lock, flags);
++	spin_unlock_bh(&rds_sock_lock);
+ 
+ 	rds_trans_put(rs->rs_transport);
+ 
+@@ -409,7 +408,6 @@ static const struct proto_ops rds_proto_ops = {
+ 
+ static int __rds_create(struct socket *sock, struct sock *sk, int protocol)
+ {
+-	unsigned long flags;
+ 	struct rds_sock *rs;
+ 
+ 	sock_init_data(sock, sk);
+@@ -426,10 +424,10 @@ static int __rds_create(struct socket *sock, struct sock *sk, int protocol)
+ 	spin_lock_init(&rs->rs_rdma_lock);
+ 	rs->rs_rdma_keys = RB_ROOT;
+ 
+-	spin_lock_irqsave(&rds_sock_lock, flags);
++	spin_lock_bh(&rds_sock_lock);
+ 	list_add_tail(&rs->rs_item, &rds_sock_list);
+ 	rds_sock_count++;
+-	spin_unlock_irqrestore(&rds_sock_lock, flags);
++	spin_unlock_bh(&rds_sock_lock);
+ 
+ 	return 0;
+ }
+@@ -471,12 +469,11 @@ static void rds_sock_inc_info(struct socket *sock, unsigned int len,
+ {
+ 	struct rds_sock *rs;
+ 	struct rds_incoming *inc;
+-	unsigned long flags;
+ 	unsigned int total = 0;
+ 
+ 	len /= sizeof(struct rds_info_message);
+ 
+-	spin_lock_irqsave(&rds_sock_lock, flags);
++	spin_lock_bh(&rds_sock_lock);
+ 
+ 	list_for_each_entry(rs, &rds_sock_list, rs_item) {
+ 		read_lock(&rs->rs_recv_lock);
+@@ -492,7 +489,7 @@ static void rds_sock_inc_info(struct socket *sock, unsigned int len,
+ 		read_unlock(&rs->rs_recv_lock);
+ 	}
+ 
+-	spin_unlock_irqrestore(&rds_sock_lock, flags);
++	spin_unlock_bh(&rds_sock_lock);
+ 
+ 	lens->nr = total;
+ 	lens->each = sizeof(struct rds_info_message);
+@@ -504,11 +501,10 @@ static void rds_sock_info(struct socket *sock, unsigned int len,
+ {
+ 	struct rds_info_socket sinfo;
+ 	struct rds_sock *rs;
+-	unsigned long flags;
+ 
+ 	len /= sizeof(struct rds_info_socket);
+ 
+-	spin_lock_irqsave(&rds_sock_lock, flags);
++	spin_lock_bh(&rds_sock_lock);
+ 
+ 	if (len < rds_sock_count)
+ 		goto out;
+@@ -529,7 +525,7 @@ out:
+ 	lens->nr = rds_sock_count;
+ 	lens->each = sizeof(struct rds_info_socket);
+ 
+-	spin_unlock_irqrestore(&rds_sock_lock, flags);
++	spin_unlock_bh(&rds_sock_lock);
+ }
+ 
+ static void rds_exit(void)
+-- 
+1.7.7.6
+
diff --git a/rtl8192cu-Fix-WARNING-on-suspend-resume.patch b/rtl8192cu-Fix-WARNING-on-suspend-resume.patch
index e784b16..bdc8a54 100644
--- a/rtl8192cu-Fix-WARNING-on-suspend-resume.patch
+++ b/rtl8192cu-Fix-WARNING-on-suspend-resume.patch
@@ -1,8 +1,3 @@
-From e234ca17f2d5ce23606fceef2df6c02f8555547e Mon Sep 17 00:00:00 2001
-From: Josh Boyer <jwboyer at redhat.com>
-Date: Wed, 11 Jan 2012 13:35:33 -0500
-Subject: [PATCH] rtl8192cu: Fix WARNING on suspend/resume
-
 A recent LKML thread (http://lkml.indiana.edu/hypermail/linux/kernel/1112.3/00965.html)
 discusses warnings that occur during a suspend/resume cycle. The driver
 attempts to read the firmware file before userspace is ready, leading to the
@@ -20,6 +15,8 @@ https://bugzilla.redhat.com/show_bug.cgi?id=771002.
 
 Note: This patch also touches rtl8192ce as the "firmware" loaded message
 is now printed in the wrong place.
+Note: This patch also touches rtl8192ce as the "firmware" loaded message
+is now printed in the wrong place.
 
 Reported-by: Mohammed Arafa <bugzilla at xxxxxxxxxxxx>
 Reported-by: Dave Jones <davej at xxxxxxxxxx>
@@ -27,30 +24,25 @@ Signed-off-by: Larry Finger <Larry.Finger at xxxxxxxxxxxx>
 Cc: Linus Torvalds <torvalds at xxxxxxxxxxxxxxxxxxxx>
 Cc: Stable <stable at xxxxxxxxxxxxxxx>
 
-Backported to Fedora 3.1.x.
 ---
  drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c |    1 -
  drivers/net/wireless/rtlwifi/rtl8192ce/sw.c       |    1 +
  drivers/net/wireless/rtlwifi/rtl8192cu/sw.c       |   58 +++++++++++++++++----
  3 files changed, 49 insertions(+), 11 deletions(-)
 
-diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
-index 49a064b..e3c4ac7 100644
---- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
-+++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
-@@ -226,7 +226,6 @@ int rtl92c_download_fw(struct ieee80211_hw *hw)
+--- linux-2.6/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c	2012-01-13 13:07:58.830625006 -0500
++++ linux-2.6/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c	2012-01-13 13:08:06.825439927 -0500
+@@ -227,7 +227,6 @@ int rtl92c_download_fw(struct ieee80211_
  	u32 fwsize;
  	enum version_8192c version = rtlhal->version;
  
 -	pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name);
  	if (!rtlhal->pfirmware)
  		return 1;
- 
-diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
-index 373dc78..9c3a8f1 100644
---- a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
-+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
-@@ -171,6 +171,7 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
+
+--- linux-2.6/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c	
++++ linux-2.6/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c	
+@@ -186,6 +186,7 @@ int rtl92c_init_sw_vars(struct ieee80211
  	memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
  	rtlpriv->rtlhal.fwsize = firmware->size;
  	release_firmware(firmware);
@@ -58,21 +50,18 @@ index 373dc78..9c3a8f1 100644
  
  	return 0;
  }
-diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
-index ef63c0d..f4230dd 100644
---- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
-+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
-@@ -42,6 +42,9 @@
- #include "led.h"
+--- linux-2.6/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c	
++++ linux-2.6/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c	
+@@ -43,6 +43,8 @@ 
  #include "hw.h"
  #include <linux/vmalloc.h>
+ #include <linux/module.h>
 +#include <linux/atomic.h>
 +#include <linux/types.h>
-+
  
  MODULE_AUTHOR("Georgia		<georgia at realtek.com>");
  MODULE_AUTHOR("Ziv Huang	<ziv_huang at realtek.com>");
-@@ -50,6 +53,10 @@ MODULE_LICENSE("GPL");
+@@ -51,6 +53,10 @@ MODULE_LICENSE("GPL");
  MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless");
  MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin");
  
@@ -83,10 +72,10 @@ index ef63c0d..f4230dd 100644
  static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
  {
  	struct rtl_priv *rtlpriv = rtl_priv(hw);
-@@ -60,12 +67,21 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
- 	rtlpriv->dm.dm_flag = 0;
- 	rtlpriv->dm.disable_framebursting = 0;
+@@ -62,12 +68,21 @@ static int rtl92cu_init_sw_vars(struct i
+ 	rtlpriv->dm.disable_framebursting = false;
  	rtlpriv->dm.thermalvalue = 0;
+ 	rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
 -	rtlpriv->rtlhal.pfirmware = vmalloc(0x4000);
 -	if (!rtlpriv->rtlhal.pfirmware) {
 +
@@ -107,7 +96,7 @@ index ef63c0d..f4230dd 100644
  	/* request fw */
  	err = request_firmware(&firmware, rtlpriv->cfg->fw_name,
  			rtlpriv->io.dev);
-@@ -80,9 +96,14 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
+@@ -82,9 +97,14 @@ static int rtl92cu_init_sw_vars(struct i
  		release_firmware(firmware);
  		return 1;
  	}
@@ -123,7 +112,7 @@ index ef63c0d..f4230dd 100644
  
  	return 0;
  }
-@@ -91,12 +112,30 @@ static void rtl92cu_deinit_sw_vars(struct ieee80211_hw *hw)
+@@ -93,12 +113,30 @@ static void rtl92cu_deinit_sw_vars(struc
  {
  	struct rtl_priv *rtlpriv = rtl_priv(hw);
  
@@ -156,7 +145,7 @@ index ef63c0d..f4230dd 100644
  static struct rtl_hal_ops rtl8192cu_hal_ops = {
  	.init_sw_vars = rtl92cu_init_sw_vars,
  	.deinit_sw_vars = rtl92cu_deinit_sw_vars,
-@@ -338,11 +377,10 @@ static struct usb_driver rtl8192cu_driver = {
+@@ -374,11 +412,10 @@ static struct usb_driver rtl8192cu_drive
  	.disconnect = rtl_usb_disconnect,
  	.id_table = rtl8192c_usb_ids,
  
@@ -172,6 +161,3 @@ index ef63c0d..f4230dd 100644
  #ifdef CONFIG_AUTOSUSPEND
  	.supports_autosuspend = 1,
  #endif
--- 
-1.7.7.5
-
diff --git a/sources b/sources
index 030427a..6c0833d 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
-8d43453f8159b2332ad410b19d86a931  linux-3.1.tar.bz2
-a8e1c25a93a685ec2a1c3a808715fe9d  patch-3.1.10.bz2
+364066fa18767ec0ae5f4e4abcf9dc51  linux-3.2.tar.xz
+5e53edbf75fcaa3a8d1697f3a053102d  patch-3.2.2.xz
diff --git a/sysfs-msi-irq-per-device.patch b/sysfs-msi-irq-per-device.patch
new file mode 100644
index 0000000..a2bf57c
--- /dev/null
+++ b/sysfs-msi-irq-per-device.patch
@@ -0,0 +1,239 @@
+From: Neil Horman <nhorman at tuxdriver.com>
+Date: Thu, 6 Oct 2011 18:08:18 +0000 (-0400)
+Subject: PCI/sysfs: add per pci device msi[x] irq listing (v5)
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fjbarnes%2Fpci.git;a=commitdiff_plain;h=933aa5c1f69aa650f59ba783307fc7ed7cc5fafa
+
+PCI/sysfs: add per pci device msi[x] irq listing (v5)
+
+This patch adds a per-pci-device subdirectory in sysfs called:
+/sys/bus/pci/devices/<device>/msi_irqs
+
+This sub-directory exports the set of msi vectors allocated by a given
+pci device, by creating a numbered sub-directory for each vector beneath
+msi_irqs.  For each vector various attributes can be exported.
+Currently the only attribute is called mode, which tracks the
+operational mode of that vector (msi vs. msix)
+
+Acked-by: Greg Kroah-Hartman <gregkh at suse.de>
+Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org>
+---
+
+diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci
+index 349ecf2..34f5110 100644
+--- a/Documentation/ABI/testing/sysfs-bus-pci
++++ b/Documentation/ABI/testing/sysfs-bus-pci
+@@ -66,6 +66,24 @@ Description:
+ 		re-discover previously removed devices.
+ 		Depends on CONFIG_HOTPLUG.
+ 
++What:		/sys/bus/pci/devices/.../msi_irqs/
++Date:		September, 2011
++Contact:	Neil Horman <nhorman at tuxdriver.com>
++Description:
++		The /sys/devices/.../msi_irqs directory contains a variable set
++		of sub-directories, with each sub-directory being named after a
++		corresponding msi irq vector allocated to that device.  Each
++		numbered sub-directory N contains attributes of that irq.
++		Note that this directory is not created for device drivers which
++		do not support msi irqs
++
++What:		/sys/bus/pci/devices/.../msi_irqs/<N>/mode
++Date:		September 2011
++Contact:	Neil Horman <nhorman at tuxdriver.com>
++Description:
++		This attribute indicates the mode that the irq vector named by
++		the parent directory is in (msi vs. msix)
++
+ What:		/sys/bus/pci/devices/.../remove
+ Date:		January 2009
+ Contact:	Linux PCI developers <linux-pci at vger.kernel.org>
+diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
+index 2f10328..73613e2 100644
+--- a/drivers/pci/msi.c
++++ b/drivers/pci/msi.c
+@@ -322,6 +322,8 @@ static void free_msi_irqs(struct pci_dev *dev)
+ 			if (list_is_last(&entry->list, &dev->msi_list))
+ 				iounmap(entry->mask_base);
+ 		}
++		kobject_del(&entry->kobj);
++		kobject_put(&entry->kobj);
+ 		list_del(&entry->list);
+ 		kfree(entry);
+ 	}
+@@ -402,6 +404,98 @@ void pci_restore_msi_state(struct pci_dev *dev)
+ }
+ EXPORT_SYMBOL_GPL(pci_restore_msi_state);
+ 
++
++#define to_msi_attr(obj) container_of(obj, struct msi_attribute, attr)
++#define to_msi_desc(obj) container_of(obj, struct msi_desc, kobj)
++
++struct msi_attribute {
++	struct attribute        attr;
++	ssize_t (*show)(struct msi_desc *entry, struct msi_attribute *attr,
++			char *buf);
++	ssize_t (*store)(struct msi_desc *entry, struct msi_attribute *attr,
++			 const char *buf, size_t count);
++};
++
++static ssize_t show_msi_mode(struct msi_desc *entry, struct msi_attribute *atr,
++			     char *buf)
++{
++	return sprintf(buf, "%s\n", entry->msi_attrib.is_msix ? "msix" : "msi");
++}
++
++static ssize_t msi_irq_attr_show(struct kobject *kobj,
++				 struct attribute *attr, char *buf)
++{
++	struct msi_attribute *attribute = to_msi_attr(attr);
++	struct msi_desc *entry = to_msi_desc(kobj);
++
++	if (!attribute->show)
++		return -EIO;
++
++	return attribute->show(entry, attribute, buf);
++}
++
++static const struct sysfs_ops msi_irq_sysfs_ops = {
++	.show = msi_irq_attr_show,
++};
++
++static struct msi_attribute mode_attribute =
++	__ATTR(mode, S_IRUGO, show_msi_mode, NULL);
++
++
++struct attribute *msi_irq_default_attrs[] = {
++	&mode_attribute.attr,
++	NULL
++};
++
++void msi_kobj_release(struct kobject *kobj)
++{
++	struct msi_desc *entry = to_msi_desc(kobj);
++
++	pci_dev_put(entry->dev);
++}
++
++static struct kobj_type msi_irq_ktype = {
++	.release = msi_kobj_release,
++	.sysfs_ops = &msi_irq_sysfs_ops,
++	.default_attrs = msi_irq_default_attrs,
++};
++
++static int populate_msi_sysfs(struct pci_dev *pdev)
++{
++	struct msi_desc *entry;
++	struct kobject *kobj;
++	int ret;
++	int count = 0;
++
++	pdev->msi_kset = kset_create_and_add("msi_irqs", NULL, &pdev->dev.kobj);
++	if (!pdev->msi_kset)
++		return -ENOMEM;
++
++	list_for_each_entry(entry, &pdev->msi_list, list) {
++		kobj = &entry->kobj;
++		kobj->kset = pdev->msi_kset;
++		pci_dev_get(pdev);
++		ret = kobject_init_and_add(kobj, &msi_irq_ktype, NULL,
++				     "%u", entry->irq);
++		if (ret)
++			goto out_unroll;
++
++		count++;
++	}
++
++	return 0;
++
++out_unroll:
++	list_for_each_entry(entry, &pdev->msi_list, list) {
++		if (!count)
++			break;
++		kobject_del(&entry->kobj);
++		kobject_put(&entry->kobj);
++		count--;
++	}
++	return ret;
++}
++
+ /**
+  * msi_capability_init - configure device's MSI capability structure
+  * @dev: pointer to the pci_dev data structure of MSI device function
+@@ -453,6 +547,13 @@ static int msi_capability_init(struct pci_dev *dev, int nvec)
+ 		return ret;
+ 	}
+ 
++	ret = populate_msi_sysfs(dev);
++	if (ret) {
++		msi_mask_irq(entry, mask, ~mask);
++		free_msi_irqs(dev);
++		return ret;
++	}
++
+ 	/* Set MSI enabled bits	 */
+ 	pci_intx_for_msi(dev, 0);
+ 	msi_set_enable(dev, pos, 1);
+@@ -573,6 +674,12 @@ static int msix_capability_init(struct pci_dev *dev,
+ 
+ 	msix_program_entries(dev, entries);
+ 
++	ret = populate_msi_sysfs(dev);
++	if (ret) {
++		ret = 0;
++		goto error;
++	}
++
+ 	/* Set MSI-X enabled bits and unmask the function */
+ 	pci_intx_for_msi(dev, 0);
+ 	dev->msix_enabled = 1;
+@@ -731,6 +838,8 @@ void pci_disable_msi(struct pci_dev *dev)
+ 
+ 	pci_msi_shutdown(dev);
+ 	free_msi_irqs(dev);
++	kset_unregister(dev->msi_kset);
++	dev->msi_kset = NULL;
+ }
+ EXPORT_SYMBOL(pci_disable_msi);
+ 
+@@ -829,6 +938,8 @@ void pci_disable_msix(struct pci_dev *dev)
+ 
+ 	pci_msix_shutdown(dev);
+ 	free_msi_irqs(dev);
++	kset_unregister(dev->msi_kset);
++	dev->msi_kset = NULL;
+ }
+ EXPORT_SYMBOL(pci_disable_msix);
+ 
+diff --git a/include/linux/msi.h b/include/linux/msi.h
+index 05acced..ce93a34 100644
+--- a/include/linux/msi.h
++++ b/include/linux/msi.h
+@@ -1,6 +1,7 @@
+ #ifndef LINUX_MSI_H
+ #define LINUX_MSI_H
+ 
++#include <linux/kobject.h>
+ #include <linux/list.h>
+ 
+ struct msi_msg {
+@@ -44,6 +45,8 @@ struct msi_desc {
+ 
+ 	/* Last set MSI message */
+ 	struct msi_msg msg;
++
++	struct kobject kobj;
+ };
+ 
+ /*
+diff --git a/include/linux/pci.h b/include/linux/pci.h
+index 7cda65b..84225c7 100644
+--- a/include/linux/pci.h
++++ b/include/linux/pci.h
+@@ -336,6 +336,7 @@ struct pci_dev {
+ 	struct bin_attribute *res_attr_wc[DEVICE_COUNT_RESOURCE]; /* sysfs file for WC mapping of resources */
+ #ifdef CONFIG_PCI_MSI
+ 	struct list_head msi_list;
++	struct kset *msi_kset;
+ #endif
+ 	struct pci_vpd *vpd;
+ #ifdef CONFIG_PCI_ATS
diff --git a/tpm_tis-delay-after-aborting-cmd.patch b/tpm_tis-delay-after-aborting-cmd.patch
new file mode 100644
index 0000000..315284f
--- /dev/null
+++ b/tpm_tis-delay-after-aborting-cmd.patch
@@ -0,0 +1,17 @@
+This patch adds a delay after aborting a command. Some TPMs need
+this and will not process the subsequent command correctly otherwise.
+
+Signed-off-by: Stefan Berger <stefanb at linux.vnet.ibm.com>
+
+--- linux-3.1.noarch/drivers/char/tpm/tpm_tis.c~	2011-12-20 18:08:01.654464487 -0500
++++ linux-3.1.noarch/drivers/char/tpm/tpm_tis.c	2011-12-20 18:08:23.476380364 -0500
+@@ -432,6 +432,9 @@ static int probe_itpm(struct tpm_chip *c
+ out:
+ 	itpm = rem_itpm;
+ 	tpm_tis_ready(chip);
++	/* some TPMs need a break here otherwise they will not work
++	 * correctly on the immediately subsequent command */
++	msleep(chip->vendor.timeout_b);
+ 	release_locality(chip, chip->vendor.locality, 0);
+ 
+ 	return rc;
diff --git a/utrace.patch b/utrace.patch
index 576c737..060d351 100644
--- a/utrace.patch
+++ b/utrace.patch
@@ -1,39 +1,38 @@
 From davej  Wed Aug  3 15:16:11 2011
+From oleg at redhat.com Mon Nov 21 15:06:14 2011
 Return-Path: oleg at redhat.com
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:11 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
- zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:15:37 -0400 (EDT)
+Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
+ zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:14 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 92D6F9D8C5;
-	Wed,  3 Aug 2011 15:12:08 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id RRq2PiCBdMzK; Wed,  3 Aug 2011 15:12:08 -0400 (EDT)
-Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 75C149D898;
-	Wed,  3 Aug 2011 15:12:08 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 9A1F8D50F1;
+	Mon, 21 Nov 2011 15:06:14 -0500 (EST)
+Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id gJzpul4rDNnA; Mon, 21 Nov 2011 15:06:14 -0500 (EST)
+Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 7DD4BD50EA;
+	Mon, 21 Nov 2011 15:06:14 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JC01d029136;
-	Wed, 3 Aug 2011 15:12:01 -0400
+	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK6BJJ022074;
+	Mon, 21 Nov 2011 15:06:12 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:09:28 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:09:26 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:01:32 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:01:30 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 01/31] utrace core
-Message-ID: <20110803190926.GA30903 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 01/33] utrace core
+Message-ID: <20111121200130.GA27756 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
 Status: RO
 Content-Length: 139951
 Lines: 3867
@@ -711,10 +710,10 @@ index 3a1dafd..f0c0ea2 100644
  	if (p->files)
  		fdt = files_fdtable(p->files);
 diff --git a/include/linux/sched.h b/include/linux/sched.h
-index 20b03bf..c6d79af 100644
+index 68daf4f..4d45f93 100644
 --- a/include/linux/sched.h
 +++ b/include/linux/sched.h
-@@ -1406,6 +1406,11 @@ struct task_struct {
+@@ -1403,6 +1403,11 @@ struct task_struct {
  #endif
  	seccomp_t seccomp;
  
@@ -1425,7 +1424,7 @@ index 0000000..f251efe
 +
 +#endif	/* linux/utrace.h */
 diff --git a/init/Kconfig b/init/Kconfig
-index d627783..7afce1f 100644
+index 43298f9..3f670e5 100644
 --- a/init/Kconfig
 +++ b/init/Kconfig
 @@ -372,6 +372,15 @@ config AUDIT_TREE
@@ -1445,7 +1444,7 @@ index d627783..7afce1f 100644
  
  menu "RCU Subsystem"
 diff --git a/kernel/Makefile b/kernel/Makefile
-index d06467f..85828da 100644
+index e898c5b..e43bbfb 100644
 --- a/kernel/Makefile
 +++ b/kernel/Makefile
 @@ -68,6 +68,7 @@ obj-$(CONFIG_IKCONFIG) += configs.o
@@ -3906,47 +3905,40 @@ index 0000000..ef856c9
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:13 2011
+From oleg at redhat.com Mon Nov 21 15:06:17 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:13 -0400 (EDT)
 Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
  zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:15:37 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:17 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 419B39D8CF;
-	Wed,  3 Aug 2011 15:12:11 -0400 (EDT)
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 1CCED128D6B;
+	Mon, 21 Nov 2011 15:06:17 -0500 (EST)
 Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id AmaThyCcp1K4; Wed,  3 Aug 2011 15:12:11 -0400 (EDT)
-Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 2A0B29CE59;
-	Wed,  3 Aug 2011 15:12:11 -0400 (EDT)
+	with ESMTP id FWdJDV74o-ay; Mon, 21 Nov 2011 15:06:17 -0500 (EST)
+Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 082081285E4;
+	Mon, 21 Nov 2011 15:06:17 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JC3DW023262;
-	Wed, 3 Aug 2011 15:12:04 -0400
+	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK6E7d015251;
+	Mon, 21 Nov 2011 15:06:15 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:09:31 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:09:29 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:01:35 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:01:33 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 02/31] utrace: add utrace_init_task/utrace_free_task calls
-Message-ID: <20110803190929.GA30907 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 02/33] utrace: add utrace_init_task/utrace_free_task calls
+Message-ID: <20111121200133.GA27759 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
 Status: RO
 Content-Length: 1295
 Lines: 47
@@ -3966,7 +3958,7 @@ Signed-off-by: Oleg Nesterov <oleg at redhat.com>
  1 files changed, 5 insertions(+), 0 deletions(-)
 
 diff --git a/kernel/fork.c b/kernel/fork.c
-index e7ceaca..a9891da 100644
+index ba0d172..b8719c2 100644
 --- a/kernel/fork.c
 +++ b/kernel/fork.c
 @@ -66,6 +66,7 @@
@@ -3986,7 +3978,7 @@ index e7ceaca..a9891da 100644
  	free_task_struct(tsk);
  }
  EXPORT_SYMBOL(free_task);
-@@ -1096,6 +1099,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
+@@ -1093,6 +1096,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
  	if (!p)
  		goto fork_out;
  
@@ -3999,47 +3991,40 @@ index e7ceaca..a9891da 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:18 2011
+From oleg at redhat.com Mon Nov 21 15:06:20 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:18 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
- zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:07 -0400 (EDT)
+Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
+ zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:20 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id F28379DE70;
-	Wed,  3 Aug 2011 15:12:13 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id p92IDp0LZ5jX; Wed,  3 Aug 2011 15:12:13 -0400 (EDT)
-Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id D4E339DE68;
-	Wed,  3 Aug 2011 15:12:13 -0400 (EDT)
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 8779AD87BC;
+	Mon, 21 Nov 2011 15:06:20 -0500 (EST)
+Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id umzAMwRd7rMt; Mon, 21 Nov 2011 15:06:20 -0500 (EST)
+Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 72C98D8707;
+	Mon, 21 Nov 2011 15:06:20 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JC6IA023283;
-	Wed, 3 Aug 2011 15:12:07 -0400
+	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK6HAj015261;
+	Mon, 21 Nov 2011 15:06:18 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:09:34 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:09:32 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:01:39 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:01:36 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 03/31] tracehooks: add utrace hooks
-Message-ID: <20110803190932.GA30915 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 03/33] tracehooks: add utrace hooks
+Message-ID: <20111121200136.GA27766 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
 Status: RO
 Content-Length: 2310
 Lines: 75
@@ -4120,48 +4105,41 @@ index a71a292..8cc28bc 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:14 2011
+From oleg at redhat.com Mon Nov 21 15:06:23 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:14 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
- zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:15:37 -0400 (EDT)
+Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
+ zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:23 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 92FCA9D8FA;
-	Wed,  3 Aug 2011 15:12:16 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id lQaZCHUpw8DT; Wed,  3 Aug 2011 15:12:16 -0400 (EDT)
-Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 7479B9D8C9;
-	Wed,  3 Aug 2011 15:12:16 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 6559BD4FDE;
+	Mon, 21 Nov 2011 15:06:23 -0500 (EST)
+Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id 6BjISiO+cS1U; Mon, 21 Nov 2011 15:06:23 -0500 (EST)
+Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 50366D4C39;
+	Mon, 21 Nov 2011 15:06:23 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JC91G023308;
-	Wed, 3 Aug 2011 15:12:09 -0400
+	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK6KT9017533;
+	Mon, 21 Nov 2011 15:06:21 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:09:37 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:09:35 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:01:42 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:01:39 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 04/31] tracehooks: reintroduce
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 04/33] tracehooks: reintroduce
 	tracehook_consider_fatal_signal()
-Message-ID: <20110803190935.GA30918 at redhat.com>
+Message-ID: <20111121200139.GA27769 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
 Status: RO
 Content-Length: 3257
 Lines: 90
@@ -4177,7 +4155,7 @@ Signed-off-by: Oleg Nesterov <oleg at redhat.com>
  3 files changed, 26 insertions(+), 4 deletions(-)
 
 diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c
-index ffabcd9..1018ab6 100644
+index a9807dd..f506e1b 100644
 --- a/arch/s390/kernel/traps.c
 +++ b/arch/s390/kernel/traps.c
 @@ -329,7 +329,7 @@ void __kprobes do_per_trap(struct pt_regs *regs)
@@ -4189,7 +4167,7 @@ index ffabcd9..1018ab6 100644
  		return;
  	info.si_signo = SIGTRAP;
  	info.si_errno = 0;
-@@ -428,7 +428,7 @@ static void __kprobes illegal_op(struct pt_regs *regs, long pgm_int_code,
+@@ -429,7 +429,7 @@ static void __kprobes illegal_op(struct pt_regs *regs, long pgm_int_code,
  		if (get_user(*((__u16 *) opcode), (__u16 __user *) location))
  			return;
  		if (*((__u16 *) opcode) == S390_BREAKPOINT_U16) {
@@ -4232,7 +4210,7 @@ index 8cc28bc..ec2af67 100644
  /**
   * set_notify_resume - cause tracehook_notify_resume() to be called
 diff --git a/kernel/signal.c b/kernel/signal.c
-index 291c970..d7ef0da 100644
+index b3f78d0..d7b90cd 100644
 --- a/kernel/signal.c
 +++ b/kernel/signal.c
 @@ -494,7 +494,7 @@ int unhandled_signal(struct task_struct *tsk, int sig)
@@ -4257,46 +4235,39 @@ index 291c970..d7ef0da 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:20 2011
+From oleg at redhat.com Mon Nov 21 15:06:26 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:20 -0400 (EDT)
 Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
  zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:08 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:25 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 374FE9DE74;
-	Wed,  3 Aug 2011 15:12:19 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id E7A2DD498A;
+	Mon, 21 Nov 2011 15:06:25 -0500 (EST)
 Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id Sun0Twp72xGV; Wed,  3 Aug 2011 15:12:19 -0400 (EDT)
+	with ESMTP id 4L9zskFVsr4I; Mon, 21 Nov 2011 15:06:25 -0500 (EST)
 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 223E39DD25;
-	Wed,  3 Aug 2011 15:12:19 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id D3487D4C39;
+	Mon, 21 Nov 2011 15:06:25 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCBgK008326;
-	Wed, 3 Aug 2011 15:12:12 -0400
+	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK6Nnp017552;
+	Mon, 21 Nov 2011 15:06:24 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:09:39 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:09:37 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:01:44 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:01:42 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 05/31] add utrace hooks into sig_ignored() and
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 05/33] add utrace hooks into sig_ignored() and
 	recalc_sigpending()
-Message-ID: <20110803190937.GA30926 at redhat.com>
+Message-ID: <20111121200142.GA27777 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
 X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
 Status: RO
@@ -4327,7 +4298,7 @@ index f251efe..1b8da1c 100644
  
  /*
 diff --git a/kernel/signal.c b/kernel/signal.c
-index d7ef0da..0f9af0b 100644
+index d7b90cd..8594cb2 100644
 --- a/kernel/signal.c
 +++ b/kernel/signal.c
 @@ -87,7 +87,7 @@ static int sig_ignored(struct task_struct *t, int sig, int from_ancestor_ns)
@@ -4355,45 +4326,38 @@ index d7ef0da..0f9af0b 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:21 2011
+From oleg at redhat.com Mon Nov 21 15:06:28 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:21 -0400 (EDT)
 Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
  zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:09 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:28 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 054279DE7D;
-	Wed,  3 Aug 2011 15:12:22 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 6E4A6D4F4A;
+	Mon, 21 Nov 2011 15:06:28 -0500 (EST)
 Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id 1BosZIzYSIW0; Wed,  3 Aug 2011 15:12:21 -0400 (EDT)
+	with ESMTP id vEeGLyK1+rX9; Mon, 21 Nov 2011 15:06:28 -0500 (EST)
 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id E41DC9DE7B;
-	Wed,  3 Aug 2011 15:12:21 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 5AD50D4C39;
+	Mon, 21 Nov 2011 15:06:28 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id p73JCEgD022264;
-	Wed, 3 Aug 2011 15:12:15 -0400
+	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id pALK6QOB029543;
+	Mon, 21 Nov 2011 15:06:26 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:09:42 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:09:40 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:01:47 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:01:45 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 06/31] restore the EXEC/EXIT/CLONE utrace hooks
-Message-ID: <20110803190940.GA30929 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 06/33] restore the EXEC/EXIT/CLONE utrace hooks
+Message-ID: <20111121200145.GA27780 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
 X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
 Status: RO
@@ -4412,10 +4376,10 @@ Signed-off-by: Oleg Nesterov <oleg at redhat.com>
  4 files changed, 15 insertions(+), 1 deletions(-)
 
 diff --git a/fs/exec.c b/fs/exec.c
-index da80612..a0814cd 100644
+index 3625464..7d8f8bd 100644
 --- a/fs/exec.c
 +++ b/fs/exec.c
-@@ -1401,9 +1401,12 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
+@@ -1397,9 +1397,12 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
  			 */
  			bprm->recursion_depth = depth;
  			if (retval >= 0) {
@@ -4447,10 +4411,10 @@ index 1b8da1c..9ac0b1b 100644
  
  /*
 diff --git a/kernel/exit.c b/kernel/exit.c
-index 2913b35..c1b0ab6 100644
+index d0b7d98..f5eba3b 100644
 --- a/kernel/exit.c
 +++ b/kernel/exit.c
-@@ -913,6 +913,7 @@ NORET_TYPE void do_exit(long code)
+@@ -911,6 +911,7 @@ NORET_TYPE void do_exit(long code)
  	 */
  	set_fs(USER_DS);
  
@@ -4459,10 +4423,10 @@ index 2913b35..c1b0ab6 100644
  
  	validate_creds_for_do_exit(tsk);
 diff --git a/kernel/fork.c b/kernel/fork.c
-index a9891da..37f4a07 100644
+index b8719c2..09d5049 100644
 --- a/kernel/fork.c
 +++ b/kernel/fork.c
-@@ -1539,6 +1539,8 @@ long do_fork(unsigned long clone_flags,
+@@ -1535,6 +1535,8 @@ long do_fork(unsigned long clone_flags,
  
  		audit_finish_fork(p);
  
@@ -4471,7 +4435,7 @@ index a9891da..37f4a07 100644
  		/*
  		 * We set PF_STARTING at creation in case tracing wants to
  		 * use this to distinguish a fully live task from one that
-@@ -1550,6 +1552,8 @@ long do_fork(unsigned long clone_flags,
+@@ -1546,6 +1548,8 @@ long do_fork(unsigned long clone_flags,
  		wake_up_new_task(p);
  
  		/* forking complete and child started to run, tell ptracer */
@@ -4484,48 +4448,41 @@ index a9891da..37f4a07 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:23 2011
+From oleg at redhat.com Mon Nov 21 15:06:30 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:23 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
- zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:13 -0400 (EDT)
+Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
+ zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:30 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id B36EC9DE82;
-	Wed,  3 Aug 2011 15:12:24 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id 7Qqv+lXfqHw6; Wed,  3 Aug 2011 15:12:24 -0400 (EDT)
-Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 9F8AF9DD25;
-	Wed,  3 Aug 2011 15:12:24 -0400 (EDT)
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id D248D1284E0;
+	Mon, 21 Nov 2011 15:06:30 -0500 (EST)
+Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id divvekTmLScS; Mon, 21 Nov 2011 15:06:30 -0500 (EST)
+Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id BDC9412800E;
+	Mon, 21 Nov 2011 15:06:30 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCH0U023349;
-	Wed, 3 Aug 2011 15:12:17 -0400
+	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id pALK6Shj029546;
+	Mon, 21 Nov 2011 15:06:29 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:09:45 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:09:43 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:01:49 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:01:47 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 07/31] utrace: utrace_report_death() can use
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 07/33] utrace: utrace_report_death() can use
 	task_utrace_struct()
-Message-ID: <20110803190943.GA30936 at redhat.com>
+Message-ID: <20111121200147.GA27787 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
+X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
 Status: RO
 Content-Length: 1692
 Lines: 44
@@ -4575,45 +4532,38 @@ index ef856c9..1e750ad 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:15 2011
+From oleg at redhat.com Mon Nov 21 15:06:33 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:15 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
- zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:15:39 -0400 (EDT)
+Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
+ zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:33 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 76DA49D9C7;
-	Wed,  3 Aug 2011 15:12:27 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id 25xHJjCTouA4; Wed,  3 Aug 2011 15:12:27 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 62E1BD50A3;
+	Mon, 21 Nov 2011 15:06:33 -0500 (EST)
+Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id FB36YkOAHDc5; Mon, 21 Nov 2011 15:06:33 -0500 (EST)
 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 490E79D9AB;
-	Wed,  3 Aug 2011 15:12:27 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 4D161D4C39;
+	Mon, 21 Nov 2011 15:06:33 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCKXo023360;
-	Wed, 3 Aug 2011 15:12:20 -0400
+	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK6VBW022130;
+	Mon, 21 Nov 2011 15:06:31 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:09:47 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:09:45 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:01:52 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:01:50 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 08/31] restore the DEATH/REAP utrace hooks
-Message-ID: <20110803190945.GA30939 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 08/33] restore the DEATH/REAP utrace hooks
+Message-ID: <20111121200150.GA27790 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
 X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
 Status: RO
@@ -4666,7 +4616,7 @@ index 9a2e2f4..cf13839 100644
 +
  #endif	/* linux/utrace.h */
 diff --git a/kernel/exit.c b/kernel/exit.c
-index c1b0ab6..ba5ba22 100644
+index f5eba3b..746c5df 100644
 --- a/kernel/exit.c
 +++ b/kernel/exit.c
 @@ -168,6 +168,8 @@ void release_task(struct task_struct * p)
@@ -4678,7 +4628,7 @@ index c1b0ab6..ba5ba22 100644
  	/* don't need to get the RCU readlock here - the process is dead and
  	 * can't be modifying its own credentials. But shut RCU-lockdep up */
  	rcu_read_lock();
-@@ -860,6 +862,8 @@ static void exit_notify(struct task_struct *tsk, int group_dead)
+@@ -858,6 +860,8 @@ static void exit_notify(struct task_struct *tsk, int group_dead)
  		wake_up_process(tsk->signal->group_exit_task);
  	write_unlock_irq(&tasklist_lock);
  
@@ -4691,47 +4641,40 @@ index c1b0ab6..ba5ba22 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:22:02 2011
+From oleg at redhat.com Mon Nov 21 15:06:35 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:22:02 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
- zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:17:16 -0400 (EDT)
+Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
+ zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:35 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 26DB69DE8C;
-	Wed,  3 Aug 2011 15:12:30 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id DbxGfmFvtTiR; Wed,  3 Aug 2011 15:12:30 -0400 (EDT)
-Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 0A30A9DE91;
-	Wed,  3 Aug 2011 15:12:30 -0400 (EDT)
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id D4AB3D8761;
+	Mon, 21 Nov 2011 15:06:35 -0500 (EST)
+Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id TiShkH1f6rnj; Mon, 21 Nov 2011 15:06:35 -0500 (EST)
+Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id BCB85D877F;
+	Mon, 21 Nov 2011 15:06:35 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCMDQ008389;
-	Wed, 3 Aug 2011 15:12:23 -0400
+	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK6XNu015312;
+	Mon, 21 Nov 2011 15:06:34 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:09:50 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:09:48 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:01:54 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:01:52 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 09/31] utrace: remove jobctl bits
-Message-ID: <20110803190948.GA30942 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 09/33] utrace: remove jobctl bits
+Message-ID: <20111121200152.GA27793 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
 Status: RO
 Content-Length: 1888
 Lines: 56
@@ -4793,47 +4736,40 @@ index 1e750ad..5d3974e 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:17 2011
+From oleg at redhat.com Mon Nov 21 15:06:38 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:17 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
- zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:15:52 -0400 (EDT)
+Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
+ zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:38 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id AB6E39DA46;
-	Wed,  3 Aug 2011 15:12:32 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id LkzmRGslEelr; Wed,  3 Aug 2011 15:12:32 -0400 (EDT)
-Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 959659DA60;
-	Wed,  3 Aug 2011 15:12:32 -0400 (EDT)
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 425CED8707;
+	Mon, 21 Nov 2011 15:06:38 -0500 (EST)
+Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id 9paRC+dwSflh; Mon, 21 Nov 2011 15:06:38 -0500 (EST)
+Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 2DDBCD8410;
+	Mon, 21 Nov 2011 15:06:38 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCPx7023400;
-	Wed, 3 Aug 2011 15:12:25 -0400
+	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id pALK6a31031355;
+	Mon, 21 Nov 2011 15:06:36 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:09:53 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:09:51 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:01:56 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:01:55 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 10/31] ptrace: take ->siglock around s/TRACED/RUNNING/
-Message-ID: <20110803190951.GA30949 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 10/33] ptrace: take ->siglock around s/TRACED/RUNNING/
+Message-ID: <20111121200155.GA27801 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
+X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
 Status: RO
 Content-Length: 1624
 Lines: 56
@@ -4851,7 +4787,7 @@ Signed-off-by: Oleg Nesterov <oleg at redhat.com>
  2 files changed, 10 insertions(+), 1 deletions(-)
 
 diff --git a/kernel/ptrace.c b/kernel/ptrace.c
-index 9de3ecf..56b8fc1 100644
+index 24d0447..daf47bc 100644
 --- a/kernel/ptrace.c
 +++ b/kernel/ptrace.c
 @@ -589,6 +589,8 @@ static int ptrace_setsiginfo(struct task_struct *child, const siginfo_t *info)
@@ -4877,10 +4813,10 @@ index 9de3ecf..56b8fc1 100644
  	return 0;
  }
 diff --git a/kernel/signal.c b/kernel/signal.c
-index 0f9af0b..71f5cca 100644
+index 8594cb2..4512bb4 100644
 --- a/kernel/signal.c
 +++ b/kernel/signal.c
-@@ -1878,7 +1878,10 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
+@@ -1886,7 +1886,10 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
  		if (gstop_done)
  			do_notify_parent_cldstop(current, false, why);
  
@@ -4895,47 +4831,40 @@ index 0f9af0b..71f5cca 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:37 2011
+From oleg at redhat.com Mon Nov 21 15:06:40 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:37 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
- zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:29 -0400 (EDT)
+Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
+ zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:40 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 5034E9DEA4;
-	Wed,  3 Aug 2011 15:12:35 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id 8BhFlmqmXy8l; Wed,  3 Aug 2011 15:12:35 -0400 (EDT)
-Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 31AEE9DEAB;
-	Wed,  3 Aug 2011 15:12:35 -0400 (EDT)
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id B0D19D877F;
+	Mon, 21 Nov 2011 15:06:40 -0500 (EST)
+Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id 3jv-cDBpMP5B; Mon, 21 Nov 2011 15:06:40 -0500 (EST)
+Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 9C98DD8410;
+	Mon, 21 Nov 2011 15:06:40 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCRCZ008434;
-	Wed, 3 Aug 2011 15:12:28 -0400
+	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id pALK6cHF029573;
+	Mon, 21 Nov 2011 15:06:39 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:09:55 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:09:53 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:01:59 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:01:57 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 11/31] introduce wake_up_quiescent()
-Message-ID: <20110803190953.GA30952 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 11/33] introduce wake_up_quiescent()
+Message-ID: <20111121200157.GA27805 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
+X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
 Status: RO
 Content-Length: 3186
 Lines: 93
@@ -4968,7 +4897,7 @@ index a822300..2be3712 100644
  extern int do_send_sig_info(int sig, struct siginfo *info,
  				struct task_struct *p, bool group);
 diff --git a/kernel/ptrace.c b/kernel/ptrace.c
-index 56b8fc1..4194664 100644
+index daf47bc..8439ef1 100644
 --- a/kernel/ptrace.c
 +++ b/kernel/ptrace.c
 @@ -621,7 +621,7 @@ static int ptrace_resume(struct task_struct *child, long request,
@@ -4981,7 +4910,7 @@ index 56b8fc1..4194664 100644
  	}
  
 diff --git a/kernel/signal.c b/kernel/signal.c
-index 71f5cca..3e8e0b1 100644
+index 4512bb4..99a6008 100644
 --- a/kernel/signal.c
 +++ b/kernel/signal.c
 @@ -702,6 +702,14 @@ void signal_wake_up(struct task_struct *t, int resume)
@@ -5008,7 +4937,7 @@ index 71f5cca..3e8e0b1 100644
  			else
  				ptrace_trap_notify(t);
  		} while_each_thread(p, t);
-@@ -1879,7 +1887,7 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
+@@ -1887,7 +1895,7 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
  			do_notify_parent_cldstop(current, false, why);
  
  		spin_lock_irq(&current->sighand->siglock);
@@ -5034,49 +4963,42 @@ index 5d3974e..cebc390 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:22:01 2011
+From oleg at redhat.com Mon Nov 21 15:06:43 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:22:01 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
- zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:17:15 -0400 (EDT)
+Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
+ zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:43 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id F2DE19DC07;
-	Wed,  3 Aug 2011 15:12:37 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id IYfqfx8GhNWc; Wed,  3 Aug 2011 15:12:37 -0400 (EDT)
-Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id D645E9DAF7;
-	Wed,  3 Aug 2011 15:12:37 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 6488BD514C;
+	Mon, 21 Nov 2011 15:06:43 -0500 (EST)
+Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id TKQUj5mU4NYM; Mon, 21 Nov 2011 15:06:43 -0500 (EST)
+Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 4EC82D5000;
+	Mon, 21 Nov 2011 15:06:43 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCUNh008446;
-	Wed, 3 Aug 2011 15:12:31 -0400
+	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK6fp6015343;
+	Mon, 21 Nov 2011 15:06:41 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:09:58 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:09:56 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:02 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:01:59 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 12/31] introduce ptrace_signal_wake_up()
-Message-ID: <20110803190956.GA30959 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 12/33] introduce ptrace_signal_wake_up()
+Message-ID: <20111121200159.GA27812 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
 Status: RO
-Content-Length: 3667
+Content-Length: 3670
 Lines: 113
 
 Add the new helper, ptrace_signal_wake_up(), change ptrace.c/signal.c
@@ -5118,7 +5040,7 @@ index 800f113..6d9282a 100644
  extern long arch_ptrace(struct task_struct *child, long request,
  			unsigned long addr, unsigned long data);
 diff --git a/kernel/ptrace.c b/kernel/ptrace.c
-index 4194664..1a50090 100644
+index 8439ef1..a464ab5 100644
 --- a/kernel/ptrace.c
 +++ b/kernel/ptrace.c
 @@ -25,6 +25,18 @@
@@ -5167,7 +5089,7 @@ index 4194664..1a50090 100644
  
  		unlock_task_sighand(child, &flags);
  		ret = 0;
-@@ -760,7 +772,7 @@ int ptrace_request(struct task_struct *child, long request,
+@@ -757,7 +769,7 @@ int ptrace_request(struct task_struct *child, long request,
  			 * start of this trap and now.  Trigger re-trap.
  			 */
  			if (child->jobctl & JOBCTL_TRAP_NOTIFY)
@@ -5177,7 +5099,7 @@ index 4194664..1a50090 100644
  		}
  		unlock_task_sighand(child, &flags);
 diff --git a/kernel/signal.c b/kernel/signal.c
-index 3e8e0b1..0dc6abb 100644
+index 99a6008..7a47a93 100644
 --- a/kernel/signal.c
 +++ b/kernel/signal.c
 @@ -854,7 +854,7 @@ static void ptrace_trap_notify(struct task_struct *t)
@@ -5193,48 +5115,41 @@ index 3e8e0b1..0dc6abb 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:15:58 2011
+From oleg at redhat.com Mon Nov 21 15:06:46 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:15:58 -0400 (EDT)
 Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
  zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:13:17 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:46 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 8FF88DA558;
-	Wed,  3 Aug 2011 15:12:40 -0400 (EDT)
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 3A7AED8410;
+	Mon, 21 Nov 2011 15:06:46 -0500 (EST)
 Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id 1cOfIyuaRoO3; Wed,  3 Aug 2011 15:12:40 -0400 (EDT)
-Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
-	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 7B6E8DA4A9;
-	Wed,  3 Aug 2011 15:12:40 -0400 (EDT)
+	with ESMTP id jhYAwDyYmdhg; Mon, 21 Nov 2011 15:06:46 -0500 (EST)
+Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 25D5FD889A;
+	Mon, 21 Nov 2011 15:06:46 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCXpn023459;
-	Wed, 3 Aug 2011 15:12:33 -0400
+	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id pALK6h29029619;
+	Mon, 21 Nov 2011 15:06:44 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:01 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:09:59 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:04 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:02 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 13/31] wait_task_inactive: treat task->state and
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 13/33] wait_task_inactive: treat task->state and
 	match_state as bitmasks
-Message-ID: <20110803190959.GA30962 at redhat.com>
+Message-ID: <20111121200202.GA27816 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
+X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
 Status: RO
 Content-Length: 1558
 Lines: 39
@@ -5263,10 +5178,10 @@ Signed-off-by: Oleg Nesterov <oleg at redhat.com>
  1 files changed, 1 insertions(+), 1 deletions(-)
 
 diff --git a/kernel/sched.c b/kernel/sched.c
-index ccacdbd..66ef2fb 100644
+index 0e9344a..84ecc0a 100644
 --- a/kernel/sched.c
 +++ b/kernel/sched.c
-@@ -2289,7 +2289,7 @@ unsigned long wait_task_inactive(struct task_struct *p, long match_state)
+@@ -2443,7 +2443,7 @@ unsigned long wait_task_inactive(struct task_struct *p, long match_state)
  		 * is actually now running somewhere else!
  		 */
  		while (task_running(rq, p)) {
@@ -5279,47 +5194,40 @@ index ccacdbd..66ef2fb 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:24 2011
+From oleg at redhat.com Mon Nov 21 15:06:48 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:24 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
- zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:21 -0400 (EDT)
+Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
+ zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:48 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 34C189DC30;
-	Wed,  3 Aug 2011 15:12:43 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id RHggq6bqo+Q9; Wed,  3 Aug 2011 15:12:43 -0400 (EDT)
-Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 210D59DC14;
-	Wed,  3 Aug 2011 15:12:43 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id C2934D5000;
+	Mon, 21 Nov 2011 15:06:48 -0500 (EST)
+Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id ThT2PyhztDpQ; Mon, 21 Nov 2011 15:06:48 -0500 (EST)
+Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id ACE02D4F84;
+	Mon, 21 Nov 2011 15:06:48 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id p73JCZsD022395;
-	Wed, 3 Aug 2011 15:12:36 -0400
+	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK6kdb022201;
+	Mon, 21 Nov 2011 15:06:47 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:03 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:01 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:07 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:05 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 14/31] introduce TASK_UTRACED state
-Message-ID: <20110803191001.GA30969 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 14/33] introduce TASK_UTRACED state
+Message-ID: <20111121200205.GA27823 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
 Status: RO
 Content-Length: 2913
 Lines: 84
@@ -5358,10 +5266,10 @@ index f0c0ea2..e0daec4 100644
  
  static inline const char *get_task_state(struct task_struct *tsk)
 diff --git a/include/linux/sched.h b/include/linux/sched.h
-index c6d79af..f3f0a77 100644
+index 4d45f93..746b4d3 100644
 --- a/include/linux/sched.h
 +++ b/include/linux/sched.h
-@@ -184,16 +184,17 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
+@@ -185,16 +185,17 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
  #define TASK_UNINTERRUPTIBLE	2
  #define __TASK_STOPPED		4
  #define __TASK_TRACED		8
@@ -5386,7 +5294,7 @@ index c6d79af..f3f0a77 100644
  
  extern char ___assert_task_state[1 - 2*!!(
  		sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)];
-@@ -202,15 +203,16 @@ extern char ___assert_task_state[1 - 2*!!(
+@@ -203,15 +204,16 @@ extern char ___assert_task_state[1 - 2*!!(
  #define TASK_KILLABLE		(TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
  #define TASK_STOPPED		(TASK_WAKEKILL | __TASK_STOPPED)
  #define TASK_TRACED		(TASK_WAKEKILL | __TASK_TRACED)
@@ -5409,47 +5317,40 @@ index c6d79af..f3f0a77 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:02 2011
+From oleg at redhat.com Mon Nov 21 15:06:51 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:02 -0400 (EDT)
 Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
  zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:13:18 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:51 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id D7FFADA44E;
-	Wed,  3 Aug 2011 15:12:45 -0400 (EDT)
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 48F35D889C;
+	Mon, 21 Nov 2011 15:06:51 -0500 (EST)
 Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id LFGdvSMswLJT; Wed,  3 Aug 2011 15:12:45 -0400 (EDT)
-Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
-	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id BA46CDA441;
-	Wed,  3 Aug 2011 15:12:45 -0400 (EDT)
+	with ESMTP id ZXkDvXaDg0cN; Mon, 21 Nov 2011 15:06:51 -0500 (EST)
+Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 34485D889A;
+	Mon, 21 Nov 2011 15:06:51 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCcpZ029424;
-	Wed, 3 Aug 2011 15:12:39 -0400
+	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK6nlT022211;
+	Mon, 21 Nov 2011 15:06:49 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:06 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:04 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:09 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:08 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 15/31] utrace: use TASK_UTRACED instead of TASK_TRACED
-Message-ID: <20110803191004.GA30972 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 15/33] utrace: use TASK_UTRACED instead of TASK_TRACED
+Message-ID: <20111121200208.GA27826 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
 Status: RO
 Content-Length: 4316
 Lines: 130
@@ -5585,48 +5486,41 @@ index cebc390..2097103 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:21:40 2011
+From oleg at redhat.com Mon Nov 21 15:06:53 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:21:40 -0400 (EDT)
 Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
  zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:42 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:53 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 7035E9DECC;
-	Wed,  3 Aug 2011 15:12:48 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id B8F54D5296;
+	Mon, 21 Nov 2011 15:06:53 -0500 (EST)
 Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id rmRalMQFlNua; Wed,  3 Aug 2011 15:12:48 -0400 (EDT)
-Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 5CC809DEC9;
-	Wed,  3 Aug 2011 15:12:48 -0400 (EDT)
+	with ESMTP id PX4Y3H1mw0hD; Mon, 21 Nov 2011 15:06:53 -0500 (EST)
+Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id A4B5CD528E;
+	Mon, 21 Nov 2011 15:06:53 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id p73JCfwv010344;
-	Wed, 3 Aug 2011 15:12:41 -0400
+	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id pALK6pXd029643;
+	Mon, 21 Nov 2011 15:06:52 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:09 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:07 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:12 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:10 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 16/31] reintroduce tracehook_finish_jctl() as
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 16/33] reintroduce tracehook_finish_jctl() as
 	utrace_end_stop()
-Message-ID: <20110803191007.GA30979 at redhat.com>
+Message-ID: <20111121200210.GA27829 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
+X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
 Status: RO
 Content-Length: 2401
 Lines: 77
@@ -5670,10 +5564,10 @@ index cf13839..0279c74 100644
 +
  #endif	/* linux/utrace.h */
 diff --git a/kernel/signal.c b/kernel/signal.c
-index 0dc6abb..a625309 100644
+index 7a47a93..ba46eab 100644
 --- a/kernel/signal.c
 +++ b/kernel/signal.c
-@@ -1895,6 +1895,8 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
+@@ -1903,6 +1903,8 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
  		read_unlock(&tasklist_lock);
  	}
  
@@ -5682,7 +5576,7 @@ index 0dc6abb..a625309 100644
  	/*
  	 * While in TASK_TRACED, we were considered "frozen enough".
  	 * Now that we woke up, it's crucial if we're supposed to be
-@@ -2059,6 +2061,9 @@ static bool do_signal_stop(int signr)
+@@ -2067,6 +2069,9 @@ static bool do_signal_stop(int signr)
  
  		/* Now we don't run again until woken by SIGCONT or SIGKILL */
  		schedule();
@@ -5709,47 +5603,40 @@ index 2097103..d41b982 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:21:41 2011
+From oleg at redhat.com Mon Nov 21 15:06:56 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:21:41 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
- zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:42 -0400 (EDT)
+Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
+ zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:56 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 153719DD18;
-	Wed,  3 Aug 2011 15:12:51 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id ffM0oM8RRtgL; Wed,  3 Aug 2011 15:12:51 -0400 (EDT)
-Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 0253E9DEC9;
-	Wed,  3 Aug 2011 15:12:51 -0400 (EDT)
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 4A487D83A1;
+	Mon, 21 Nov 2011 15:06:56 -0500 (EST)
+Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id 3vHogPyhojlJ; Mon, 21 Nov 2011 15:06:56 -0500 (EST)
+Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 358A0D88B0;
+	Mon, 21 Nov 2011 15:06:56 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCh9Z023559;
-	Wed, 3 Aug 2011 15:12:44 -0400
+	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK6sHk017679;
+	Mon, 21 Nov 2011 15:06:54 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:11 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:09 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:14 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:12 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 17/31] teach wake_up_quiescent() to do "selective" wake_up
-Message-ID: <20110803191009.GA30982 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 17/33] teach wake_up_quiescent() to do "selective" wake_up
+Message-ID: <20111121200212.GA27836 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
 Status: RO
 Content-Length: 1335
 Lines: 46
@@ -5767,7 +5654,7 @@ Signed-off-by: Oleg Nesterov <oleg at redhat.com>
  1 files changed, 15 insertions(+), 0 deletions(-)
 
 diff --git a/kernel/signal.c b/kernel/signal.c
-index a625309..0d1675a 100644
+index ba46eab..e06f795 100644
 --- a/kernel/signal.c
 +++ b/kernel/signal.c
 @@ -701,11 +701,26 @@ void signal_wake_up(struct task_struct *t, int resume)
@@ -5801,48 +5688,41 @@ index a625309..0d1675a 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:21:43 2011
+From oleg at redhat.com Mon Nov 21 15:06:59 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:21:43 -0400 (EDT)
 Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
  zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:43 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:06:58 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id B0E899DECF;
-	Wed,  3 Aug 2011 15:12:53 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id C88E2D528B;
+	Mon, 21 Nov 2011 15:06:58 -0500 (EST)
 Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id s0bDFhAmsQWN; Wed,  3 Aug 2011 15:12:53 -0400 (EDT)
-Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 9DC6E9DEC9;
-	Wed,  3 Aug 2011 15:12:53 -0400 (EDT)
+	with ESMTP id nNrAxBD5KOME; Mon, 21 Nov 2011 15:06:58 -0500 (EST)
+Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id B2114D51C1;
+	Mon, 21 Nov 2011 15:06:58 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCkUr029453;
-	Wed, 3 Aug 2011 15:12:46 -0400
+	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id pALK6uQQ031440;
+	Mon, 21 Nov 2011 15:06:57 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:14 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:12 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:17 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:15 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 18/31] ptrace_stop: do not assume the task is running after
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 18/33] ptrace_stop: do not assume the task is running after
 	wake_up_quiescent()
-Message-ID: <20110803191012.GA30985 at redhat.com>
+Message-ID: <20111121200215.GA27839 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
+X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
 Status: RO
 Content-Length: 956
 Lines: 31
@@ -5857,10 +5737,10 @@ Signed-off-by: Oleg Nesterov <oleg at redhat.com>
  1 files changed, 8 insertions(+), 0 deletions(-)
 
 diff --git a/kernel/signal.c b/kernel/signal.c
-index 0d1675a..249760f 100644
+index e06f795..9348da6 100644
 --- a/kernel/signal.c
 +++ b/kernel/signal.c
-@@ -1908,6 +1908,14 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
+@@ -1916,6 +1916,14 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
  		if (clear_code)
  			current->exit_code = 0;
  		read_unlock(&tasklist_lock);
@@ -5879,48 +5759,41 @@ index 0d1675a..249760f 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:26 2011
+From oleg at redhat.com Mon Nov 21 15:07:01 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:26 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
- zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:22 -0400 (EDT)
+Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
+ zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:01 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 69B489DC62;
-	Wed,  3 Aug 2011 15:12:56 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id 4BNNeoYSdCTc; Wed,  3 Aug 2011 15:12:56 -0400 (EDT)
-Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 4A9899DC14;
-	Wed,  3 Aug 2011 15:12:56 -0400 (EDT)
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 4BF37D889A;
+	Mon, 21 Nov 2011 15:07:01 -0500 (EST)
+Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id 5p8tvlXAqUHr; Mon, 21 Nov 2011 15:07:01 -0500 (EST)
+Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 37C22D8757;
+	Mon, 21 Nov 2011 15:07:01 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCnRf023575;
-	Wed, 3 Aug 2011 15:12:49 -0400
+	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id pALK6xFJ031449;
+	Mon, 21 Nov 2011 15:06:59 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:16 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:14 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:19 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:18 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 19/31] get_signal_to_deliver: restore/restructure
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 19/33] get_signal_to_deliver: restore/restructure
 	utrace/ptrace signal reporting
-Message-ID: <20110803191014.GA30992 at redhat.com>
+Message-ID: <20111121200218.GA27846 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
+X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
 Status: RO
 Content-Length: 3556
 Lines: 115
@@ -5986,10 +5859,10 @@ index 0279c74..63103e2 100644
 +
  #endif	/* linux/utrace.h */
 diff --git a/kernel/signal.c b/kernel/signal.c
-index 249760f..3c783d3 100644
+index 9348da6..38ea4e6 100644
 --- a/kernel/signal.c
 +++ b/kernel/signal.c
-@@ -2234,17 +2234,27 @@ relock:
+@@ -2242,17 +2242,27 @@ relock:
  	for (;;) {
  		struct k_sigaction *ka;
  
@@ -6025,7 +5898,7 @@ index 249760f..3c783d3 100644
  
  		if (!signr)
  			break; /* will return 0 */
-@@ -2254,9 +2264,9 @@ relock:
+@@ -2262,9 +2272,9 @@ relock:
  					      regs, cookie);
  			if (!signr)
  				continue;
@@ -6041,46 +5914,39 @@ index 249760f..3c783d3 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:27 2011
+From oleg at redhat.com Mon Nov 21 15:07:03 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:27 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
- zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:22 -0400 (EDT)
+Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
+ zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:03 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 119589DC72;
-	Wed,  3 Aug 2011 15:12:59 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id Vxp8fnt8hEcf; Wed,  3 Aug 2011 15:12:59 -0400 (EDT)
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id CB362D89E9;
+	Mon, 21 Nov 2011 15:07:03 -0500 (EST)
+Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id wm2JqccPnhsV; Mon, 21 Nov 2011 15:07:03 -0500 (EST)
 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id F22049DCAE;
-	Wed,  3 Aug 2011 15:12:58 -0400 (EDT)
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id B6D25D89DE;
+	Mon, 21 Nov 2011 15:07:03 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id p73JCpO4010401;
-	Wed, 3 Aug 2011 15:12:52 -0400
+	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id pALK715f031455;
+	Mon, 21 Nov 2011 15:07:02 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:19 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:17 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:22 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:20 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 20/31] utrace_get_signal:
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 20/33] utrace_get_signal:
 	s/JOBCTL_STOP_PENDING/JOBCTL_PENDING_MASK/
-Message-ID: <20110803191017.GA30995 at redhat.com>
+Message-ID: <20111121200220.GA27849 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
 X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
 Status: RO
@@ -6121,47 +5987,40 @@ index d41b982..0bb0a06 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:03 2011
+From oleg at redhat.com Mon Nov 21 15:07:07 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:03 -0400 (EDT)
-Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
- zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:13:19 -0400 (EDT)
+Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
+ zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:06 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id A9253DA3CB;
-	Wed,  3 Aug 2011 15:13:01 -0400 (EDT)
-Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id HLlRhTJ2MbYS; Wed,  3 Aug 2011 15:13:01 -0400 (EDT)
-Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
-	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 9582C4C43B;
-	Wed,  3 Aug 2011 15:13:01 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 8C14BD4F84;
+	Mon, 21 Nov 2011 15:07:06 -0500 (EST)
+Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id 39eM-KKZxrZ3; Mon, 21 Nov 2011 15:07:06 -0500 (EST)
+Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 7628FD4FF4;
+	Mon, 21 Nov 2011 15:07:06 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCsFX008586;
-	Wed, 3 Aug 2011 15:12:54 -0400
+	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK74dN022253;
+	Mon, 21 Nov 2011 15:07:04 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:22 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:20 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:25 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:23 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 21/31] introduce ptrace_set_syscall_trace()
-Message-ID: <20110803191020.GA31002 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 21/33] introduce ptrace_set_syscall_trace()
+Message-ID: <20111121200223.GA27856 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
 Status: RO
 Content-Length: 1549
 Lines: 52
@@ -6176,7 +6035,7 @@ Signed-off-by: Oleg Nesterov <oleg at redhat.com>
  1 files changed, 10 insertions(+), 5 deletions(-)
 
 diff --git a/kernel/ptrace.c b/kernel/ptrace.c
-index 1a50090..dc2ad34 100644
+index a464ab5..43357e5 100644
 --- a/kernel/ptrace.c
 +++ b/kernel/ptrace.c
 @@ -38,6 +38,14 @@ void ptrace_signal_wake_up(struct task_struct *p, int quiescent)
@@ -6219,47 +6078,40 @@ index 1a50090..dc2ad34 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:21:45 2011
+From oleg at redhat.com Mon Nov 21 15:07:09 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:21:45 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
- zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:43 -0400 (EDT)
+Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
+ zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:09 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 5C4889DEE6;
-	Wed,  3 Aug 2011 15:13:04 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id eXIPU4nVv+7Z; Wed,  3 Aug 2011 15:13:04 -0400 (EDT)
-Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 3F82C9DED6;
-	Wed,  3 Aug 2011 15:13:04 -0400 (EDT)
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 1ADF01285E4;
+	Mon, 21 Nov 2011 15:07:09 -0500 (EST)
+Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id rF+XegsxVXnL; Mon, 21 Nov 2011 15:07:09 -0500 (EST)
+Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 067E41287D0;
+	Mon, 21 Nov 2011 15:07:09 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCueo029507;
-	Wed, 3 Aug 2011 15:12:57 -0400
+	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK76tD022270;
+	Mon, 21 Nov 2011 15:07:07 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:24 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:22 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:27 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:25 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 22/31] introduce PT_SYSCALL_TRACE flag
-Message-ID: <20110803191022.GA31005 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 22/33] introduce PT_SYSCALL_TRACE flag
+Message-ID: <20111121200225.GA27860 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
 Status: RO
 Content-Length: 2268
 Lines: 73
@@ -6315,7 +6167,7 @@ index ec2af67..eb9fe30 100644
  
  	ptrace_notify(SIGTRAP | ((ptrace & PT_TRACESYSGOOD) ? 0x80 : 0));
 diff --git a/kernel/ptrace.c b/kernel/ptrace.c
-index dc2ad34..7deb292 100644
+index 43357e5..1ac03eb 100644
 --- a/kernel/ptrace.c
 +++ b/kernel/ptrace.c
 @@ -40,10 +40,13 @@ void ptrace_signal_wake_up(struct task_struct *p, int quiescent)
@@ -6338,48 +6190,41 @@ index dc2ad34..7deb292 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:05 2011
+From oleg at redhat.com Mon Nov 21 15:07:11 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:05 -0400 (EDT)
-Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
- zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:13:20 -0400 (EDT)
+Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
+ zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:11 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id E516ADA488;
-	Wed,  3 Aug 2011 15:13:06 -0400 (EDT)
-Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id rP7Um8DZjclX; Wed,  3 Aug 2011 15:13:06 -0400 (EDT)
-Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
-	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id D155EDA3F8;
-	Wed,  3 Aug 2011 15:13:06 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id B7D62D4DCC;
+	Mon, 21 Nov 2011 15:07:11 -0500 (EST)
+Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id 1ENpGO166I-W; Mon, 21 Nov 2011 15:07:11 -0500 (EST)
+Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id A3A55D498A;
+	Mon, 21 Nov 2011 15:07:11 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JCxfF029532;
-	Wed, 3 Aug 2011 15:13:00 -0400
+	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK79AS017728;
+	Mon, 21 Nov 2011 15:07:10 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:27 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:25 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:30 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:28 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 23/31] utrace: don't clear TIF_SYSCALL_TRACE if it is
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 23/33] utrace: don't clear TIF_SYSCALL_TRACE if it is
 	needed by ptrace
-Message-ID: <20110803191025.GA31012 at redhat.com>
+Message-ID: <20111121200228.GA27863 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
 Status: RO
 Content-Length: 797
 Lines: 24
@@ -6409,47 +6254,40 @@ index 0bb0a06..bebf6de 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:08 2011
+From oleg at redhat.com Mon Nov 21 15:07:14 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:08 -0400 (EDT)
 Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
  zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:15:29 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:14 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 80872DA4B2;
-	Wed,  3 Aug 2011 15:13:09 -0400 (EDT)
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 5376AD8774;
+	Mon, 21 Nov 2011 15:07:14 -0500 (EST)
 Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id AbpC0Wk1ZhtT; Wed,  3 Aug 2011 15:13:09 -0400 (EDT)
-Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
-	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 6D97DDA3F8;
-	Wed,  3 Aug 2011 15:13:09 -0400 (EDT)
+	with ESMTP id 5Oc8ErfFfJSs; Mon, 21 Nov 2011 15:07:14 -0500 (EST)
+Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 3F2CFD81E9;
+	Mon, 21 Nov 2011 15:07:14 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id p73JD2RU022591;
-	Wed, 3 Aug 2011 15:13:02 -0400
+	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK7Cw3015467;
+	Mon, 21 Nov 2011 15:07:12 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:30 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:28 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:32 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:30 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 24/31] introduce task_utrace_lock/task_utrace_unlock
-Message-ID: <20110803191028.GA31015 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 24/33] introduce task_utrace_lock/task_utrace_unlock
+Message-ID: <20111121200230.GA27870 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
 Status: RO
 Content-Length: 2190
 Lines: 81
@@ -6536,48 +6374,41 @@ index bebf6de..960dd9e 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:21:46 2011
+From oleg at redhat.com Mon Nov 21 15:07:17 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:21:46 -0400 (EDT)
 Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
  zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:43 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:17 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 24B3E9DEF6;
-	Wed,  3 Aug 2011 15:13:12 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 01034D498A;
+	Mon, 21 Nov 2011 15:07:17 -0500 (EST)
 Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id 2jg9j3-p4bHL; Wed,  3 Aug 2011 15:13:12 -0400 (EDT)
-Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 119759DEF9;
-	Wed,  3 Aug 2011 15:13:12 -0400 (EDT)
+	with ESMTP id BglmrU3H2hJr; Mon, 21 Nov 2011 15:07:16 -0500 (EST)
+Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id E0D31D4FF4;
+	Mon, 21 Nov 2011 15:07:16 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id p73JD485022603;
-	Wed, 3 Aug 2011 15:13:05 -0400
+	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK7Egx015474;
+	Mon, 21 Nov 2011 15:07:15 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:32 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:30 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:35 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:33 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 25/31] teach ptrace_set_syscall_trace() to play well with
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 25/33] teach ptrace_set_syscall_trace() to play well with
 	utrace
-Message-ID: <20110803191030.GA31018 at redhat.com>
+Message-ID: <20111121200233.GA27873 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
 Status: RO
 Content-Length: 1545
 Lines: 49
@@ -6599,7 +6430,7 @@ Signed-off-by: Oleg Nesterov <oleg at redhat.com>
  1 files changed, 5 insertions(+), 1 deletions(-)
 
 diff --git a/kernel/ptrace.c b/kernel/ptrace.c
-index 7deb292..69850e9 100644
+index 1ac03eb..739183a 100644
 --- a/kernel/ptrace.c
 +++ b/kernel/ptrace.c
 @@ -24,6 +24,7 @@
@@ -6632,45 +6463,38 @@ index 7deb292..69850e9 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:29 2011
+From oleg at redhat.com Mon Nov 21 15:07:19 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:28 -0400 (EDT)
 Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
  zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:24 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:19 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 062709DE55;
-	Wed,  3 Aug 2011 15:13:15 -0400 (EDT)
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 8F87F128EAA;
+	Mon, 21 Nov 2011 15:07:19 -0500 (EST)
 Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id lhwVoEywGaPJ; Wed,  3 Aug 2011 15:13:14 -0400 (EDT)
+	with ESMTP id yittEjCd+X4F; Mon, 21 Nov 2011 15:07:19 -0500 (EST)
 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id E4C139DE11;
-	Wed,  3 Aug 2011 15:13:14 -0400 (EDT)
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 7BC701287D0;
+	Mon, 21 Nov 2011 15:07:19 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id p73JD7Go010523;
-	Wed, 3 Aug 2011 15:13:08 -0400
+	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id pALK7HbH031553;
+	Mon, 21 Nov 2011 15:07:18 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:35 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:33 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:38 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:36 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 26/31] introduce PT_SINGLE_STEP and PT_SINGLE_BLOCK
-Message-ID: <20110803191033.GA31025 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 26/33] introduce PT_SINGLE_STEP and PT_SINGLE_BLOCK
+Message-ID: <20111121200236.GA27880 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
 X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
 Status: RO
@@ -6762,7 +6586,7 @@ index eb9fe30..21c8ca2 100644
  }
  
 diff --git a/kernel/ptrace.c b/kernel/ptrace.c
-index 69850e9..d250a71 100644
+index 739183a..792080d 100644
 --- a/kernel/ptrace.c
 +++ b/kernel/ptrace.c
 @@ -630,13 +630,16 @@ static int ptrace_resume(struct task_struct *child, long request,
@@ -6786,48 +6610,41 @@ index 69850e9..d250a71 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:30 2011
+From oleg at redhat.com Mon Nov 21 15:07:22 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:30 -0400 (EDT)
 Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
  zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:25 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:22 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id B3BF49DE11;
-	Wed,  3 Aug 2011 15:13:17 -0400 (EDT)
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 0C136128FB0;
+	Mon, 21 Nov 2011 15:07:22 -0500 (EST)
 Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id zC72ecV9Jz07; Wed,  3 Aug 2011 15:13:17 -0400 (EDT)
-Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 98ACE9DE59;
-	Wed,  3 Aug 2011 15:13:17 -0400 (EDT)
+	with ESMTP id GNbS20gY5Jq9; Mon, 21 Nov 2011 15:07:21 -0500 (EST)
+Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id EB5821287D0;
+	Mon, 21 Nov 2011 15:07:21 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JDATh023726;
-	Wed, 3 Aug 2011 15:13:10 -0400
+	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id pALK7Kn1029766;
+	Mon, 21 Nov 2011 15:07:20 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:38 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:36 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:40 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:38 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 27/31] utrace: finish_resume_report: don't do
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 27/33] utrace: finish_resume_report: don't do
 	user_xxx_step() if ptrace_wants_step()
-Message-ID: <20110803191036.GA31028 at redhat.com>
+Message-ID: <20111121200238.GA27883 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
+X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
 Status: RO
 Content-Length: 2741
 Lines: 84
@@ -6917,48 +6734,41 @@ index 960dd9e..05e8532 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:32 2011
+From oleg at redhat.com Mon Nov 21 15:07:24 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:32 -0400 (EDT)
 Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
  zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:25 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:24 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 614CD9DE73;
-	Wed,  3 Aug 2011 15:13:20 -0400 (EDT)
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 8954F12914D;
+	Mon, 21 Nov 2011 15:07:24 -0500 (EST)
 Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id jcWOXzUaaIYu; Wed,  3 Aug 2011 15:13:20 -0400 (EDT)
-Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 438889DE59;
-	Wed,  3 Aug 2011 15:13:20 -0400 (EDT)
+	with ESMTP id 0lU8wXKC78yu; Mon, 21 Nov 2011 15:07:24 -0500 (EST)
+Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 759B61287D0;
+	Mon, 21 Nov 2011 15:07:24 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JDDZ7029595;
-	Wed, 3 Aug 2011 15:13:13 -0400
+	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK7Mi7022329;
+	Mon, 21 Nov 2011 15:07:23 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:40 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:38 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:43 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:41 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 28/31] ptrace: shift user_*_step() from ptrace_resume() to
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 28/33] ptrace: shift user_*_step() from ptrace_resume() to
 	ptrace_stop()
-Message-ID: <20110803191038.GA31035 at redhat.com>
+Message-ID: <20111121200241.GA27890 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
 Status: RO
 Content-Length: 2374
 Lines: 70
@@ -6990,7 +6800,7 @@ Signed-off-by: Oleg Nesterov <oleg at redhat.com>
  2 files changed, 11 insertions(+), 4 deletions(-)
 
 diff --git a/kernel/ptrace.c b/kernel/ptrace.c
-index d250a71..d1ef124 100644
+index 792080d..eba9a22 100644
 --- a/kernel/ptrace.c
 +++ b/kernel/ptrace.c
 @@ -635,14 +635,10 @@ static int ptrace_resume(struct task_struct *child, long request,
@@ -7009,10 +6819,10 @@ index d250a71..d1ef124 100644
  
  	child->exit_code = data;
 diff --git a/kernel/signal.c b/kernel/signal.c
-index 3c783d3..43a3e77 100644
+index 38ea4e6..b13d2bc 100644
 --- a/kernel/signal.c
 +++ b/kernel/signal.c
-@@ -1920,6 +1920,17 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
+@@ -1928,6 +1928,17 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
  
  	utrace_end_stop();
  
@@ -7034,45 +6844,38 @@ index 3c783d3..43a3e77 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:16:34 2011
+From oleg at redhat.com Mon Nov 21 15:07:27 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:16:34 -0400 (EDT)
 Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
  zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:25 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:27 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 1A6019DE59;
-	Wed,  3 Aug 2011 15:13:23 -0400 (EDT)
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 043581287D0;
+	Mon, 21 Nov 2011 15:07:27 -0500 (EST)
 Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id db2hhAqFwsPu; Wed,  3 Aug 2011 15:13:23 -0400 (EDT)
+	with ESMTP id 4WO1El1jiIrJ; Mon, 21 Nov 2011 15:07:26 -0500 (EST)
 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 034739DE83;
-	Wed,  3 Aug 2011 15:13:23 -0400 (EDT)
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id E3FCA129045;
+	Mon, 21 Nov 2011 15:07:26 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JDFNp008715;
-	Wed, 3 Aug 2011 15:13:16 -0400
+	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK7OdV017836;
+	Mon, 21 Nov 2011 15:07:25 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:43 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:41 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:45 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:43 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 29/31] ptrace_disable: no need to disable stepping
-Message-ID: <20110803191041.GA31039 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 29/33] ptrace_disable: no need to disable stepping
+Message-ID: <20111121200243.GA27893 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
 X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
 Status: RO
@@ -7109,47 +6912,40 @@ index d1557dc..96d315a 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:21:48 2011
+From oleg at redhat.com Mon Nov 21 15:07:29 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:21:48 -0400 (EDT)
 Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
  zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:52 -0400 (EDT)
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:29 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 95706917AF;
-	Wed,  3 Aug 2011 15:13:25 -0400 (EDT)
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 8A6E8D4C39;
+	Mon, 21 Nov 2011 15:07:29 -0500 (EST)
 Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
 	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id ctq4DF3wXncJ; Wed,  3 Aug 2011 15:13:25 -0400 (EDT)
-Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 7FD14914AF;
-	Wed,  3 Aug 2011 15:13:25 -0400 (EDT)
+	with ESMTP id NLURBx2yQes5; Mon, 21 Nov 2011 15:07:29 -0500 (EST)
+Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
+	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 7660DD498A;
+	Mon, 21 Nov 2011 15:07:29 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id p73JDIRO010579;
-	Wed, 3 Aug 2011 15:13:18 -0400
+	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK7RnP015578;
+	Mon, 21 Nov 2011 15:07:27 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:46 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:44 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:48 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:46 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 30/31] ptrace_report_syscall: check TIF_SYSCALL_EMU
-Message-ID: <20110803191044.GA31046 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 30/33] ptrace_report_syscall: check TIF_SYSCALL_EMU
+Message-ID: <20111121200246.GA27896 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
 Status: RO
 Content-Length: 858
 Lines: 28
@@ -7183,46 +6979,39 @@ index b6812d4..90ca578 100644
 1.5.5.1
 
 
-From davej  Wed Aug  3 15:21:49 2011
+From oleg at redhat.com Mon Nov 21 15:07:32 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Wed, 03 Aug 2011 15:21:49 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
- zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Wed, 3 Aug 2011 15:16:52 -0400 (EDT)
+Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
+ zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:32 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 400F49191F;
-	Wed,  3 Aug 2011 15:13:28 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id UeLOLM29JRc7; Wed,  3 Aug 2011 15:13:28 -0400 (EDT)
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 10D1312916C;
+	Mon, 21 Nov 2011 15:07:32 -0500 (EST)
+Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id Z14plX1oxaYL; Mon, 21 Nov 2011 15:07:32 -0500 (EST)
 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 2D05C903F6;
-	Wed,  3 Aug 2011 15:13:28 -0400 (EDT)
+	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id F12FF128E1D;
+	Mon, 21 Nov 2011 15:07:31 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p73JDKCA023784;
-	Wed, 3 Aug 2011 15:13:21 -0400
+	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK7T0q022460;
+	Mon, 21 Nov 2011 15:07:30 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Wed,  3 Aug 2011 21:10:48 +0200 (CEST)
-Date: Wed, 3 Aug 2011 21:10:46 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:50 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:48 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH 31/31] utrace_resume: check irqs_disabled() to shut up
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 31/33] utrace_resume: check irqs_disabled() to shut up
 	lockdep
-Message-ID: <20110803191046.GA31049 at redhat.com>
+Message-ID: <20111121200248.GA27903 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
 X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
 Status: RO
@@ -7256,49 +7045,41 @@ index 05e8532..c817a46 100644
 1.5.5.1
 
 
-From davej  Tue Aug  9 13:39:54 2011
+From oleg at redhat.com Mon Nov 21 15:07:34 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.51]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Tue, 09 Aug 2011 13:39:54 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO
- zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by
- mail04.corp.redhat.com with LMTP; Tue, 9 Aug 2011 13:39:44 -0400 (EDT)
+Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
+ zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:34 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 5FCAC12983C;
-	Tue,  9 Aug 2011 13:39:44 -0400 (EDT)
-Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id nDWbqog6fbHK; Tue,  9 Aug 2011 13:39:44 -0400 (EDT)
-Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])
-	by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 4BEF712983B;
-	Tue,  9 Aug 2011 13:39:44 -0400 (EDT)
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 860BCD8A3E;
+	Mon, 21 Nov 2011 15:07:34 -0500 (EST)
+Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id pVTbN1oF62dg; Mon, 21 Nov 2011 15:07:34 -0500 (EST)
+Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 6FBFFD87A3;
+	Mon, 21 Nov 2011 15:07:34 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id p79HdahY022801;
-	Tue, 9 Aug 2011 13:39:37 -0400
+	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id pALK7W0B029871;
+	Mon, 21 Nov 2011 15:07:32 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Tue,  9 Aug 2011 19:36:58 +0200 (CEST)
-Date: Tue, 9 Aug 2011 19:36:56 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:53 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:51 +0100
 From: Oleg Nesterov <oleg at redhat.com>
 To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
         Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
         Kyle McMartin <kmcmartin at redhat.com>
-Cc: kernel at lists.fedoraproject.org, utrace-devel at redhat.com
-Subject: [PATCH utrace-3.1 32/31] ptrace_report_syscall: check if
-	TIF_SYSCALL_EMU is defined
-Message-ID: <20110809173656.GC26443 at redhat.com>
-References: <20110802174514.GA23073 at redhat.com> <20110803190806.GA30619 at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 32/33] ptrace_report_syscall: check if TIF_SYSCALL_EMU is
+	defined
+Message-ID: <20111121200251.GA27906 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
-In-Reply-To: <20110803190806.GA30619 at redhat.com>
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
+X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
 Status: RO
 Content-Length: 839
 Lines: 31
@@ -7335,50 +7116,43 @@ index 90ca578..a1bac95 100644
 1.5.5.1
 
 
-From davej  Thu Sep  1 14:14:49 2011
+From oleg at redhat.com Mon Nov 21 15:07:37 2011
 Return-Path: oleg at redhat.com
-X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on
-	gelk.kernelslacker.org
-X-Spam-Level: 
-X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD,
-	UNPARSEABLE_RELAY autolearn=ham version=3.3.2
-Received: from mail.corp.redhat.com [10.5.5.52]
-	by gelk with IMAP (fetchmail-6.3.20)
-	for <davej at localhost> (single-drop); Thu, 01 Sep 2011 14:14:49 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com (LHLO
- zmta01.collab.prod.int.phx2.redhat.com) (10.5.5.31) by
- mail04.corp.redhat.com with LMTP; Thu, 1 Sep 2011 14:13:55 -0400 (EDT)
+Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
+ zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
+ zmail13.collab.prod.int.phx2.redhat.com with LMTP; Mon, 21 Nov 2011
+ 15:07:37 -0500 (EST)
 Received: from localhost (localhost.localdomain [127.0.0.1])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 1BA199C63F;
-	Thu,  1 Sep 2011 14:13:55 -0400 (EDT)
-Received: from zmta01.collab.prod.int.phx2.redhat.com ([127.0.0.1])
-	by localhost (zmta01.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id 0vQx9zlcQB36; Thu,  1 Sep 2011 14:13:55 -0400 (EDT)
-Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
-	by zmta01.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 009959C63D;
-	Thu,  1 Sep 2011 14:13:55 -0400 (EDT)
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 33405D8A50;
+	Mon, 21 Nov 2011 15:07:37 -0500 (EST)
+Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
+	by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id 3WH8FhvizjEA; Mon, 21 Nov 2011 15:07:37 -0500 (EST)
+Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
+	by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 1274FD89BB;
+	Mon, 21 Nov 2011 15:07:37 -0500 (EST)
 Received: from tranklukator.englab.brq.redhat.com (dhcp-1-232.brq.redhat.com [10.34.1.232])
-	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id p81IDrDX015389;
-	Thu, 1 Sep 2011 14:13:54 -0400
+	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id pALK7YHr017898;
+	Mon, 21 Nov 2011 15:07:35 -0500
 Received: by tranklukator.englab.brq.redhat.com (nbSMTP-1.00) for uid 500
-	oleg at redhat.com; Thu,  1 Sep 2011 20:10:54 +0200 (CEST)
-Date: Thu, 1 Sep 2011 20:10:53 +0200
+	oleg at redhat.com; Mon, 21 Nov 2011 21:02:55 +0100 (CET)
+Date: Mon, 21 Nov 2011 21:02:53 +0100
 From: Oleg Nesterov <oleg at redhat.com>
-To: Dave Jones <davej at redhat.com>
-Cc: kernel at lists.fedoraproject.org, cebbert at redhat.com
-Subject: [PATCH F-16] bz735118: utrace: s390: fix the compile problem with
-	traps.c
-Message-ID: <20110901181053.GA24990 at redhat.com>
+To: Dave Jones <davej at redhat.com>, "Frank Ch. Eigler" <fche at redhat.com>,
+        Josh Boyer <jwboyer at redhat.com>, Josh Stone <jistone at redhat.com>,
+        Kyle McMartin <kmcmartin at redhat.com>
+Cc: kernel at lists.fedoraproject.org
+Subject: [PATCH 33/33] utrace: s390: fix the compile problem with traps.c
+Message-ID: <20111121200253.GA27913 at redhat.com>
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
+In-Reply-To: <20111121200039.GA27699 at redhat.com>
 User-Agent: Mutt/1.5.18 (2008-05-17)
-X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
+X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
 Status: RO
-Content-Length: 777
-Lines: 27
-
-https://bugzilla.redhat.com/show_bug.cgi?id=735118
+Content-Length: 725
+Lines: 25
 
 d99e60e5 "tracehooks: reintroduce tracehook_consider_fatal_signal()"
 breaks the compilation of arch/s390/kernel/traps.c. Restore the
@@ -7390,7 +7164,7 @@ Signed-off-by: Oleg Nesterov <oleg at redhat.com>
  1 files changed, 1 insertions(+), 1 deletions(-)
 
 diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c
-index 1018ab6..50e975d 100644
+index f506e1b..3132498 100644
 --- a/arch/s390/kernel/traps.c
 +++ b/arch/s390/kernel/traps.c
 @@ -18,7 +18,7 @@


More information about the scm-commits mailing list