summaryrefslogtreecommitdiffstats
path: root/freed-ora/current/f14
diff options
context:
space:
mode:
authorAlexandre Oliva <lxoliva@fsfla.org>2010-11-10 10:12:31 +0000
committerAlexandre Oliva <lxoliva@fsfla.org>2010-11-10 10:12:31 +0000
commit37dd368ae79d59bac84c4b89df7d9e484c8fe950 (patch)
tree62d0e299cec25a495785cd30a894aaeab44d12e2 /freed-ora/current/f14
parent617b487868b10be50a2a2d843c9d66b343e572fa (diff)
downloadlinux-libre-raptor-37dd368ae79d59bac84c4b89df7d9e484c8fe950.tar.gz
linux-libre-raptor-37dd368ae79d59bac84c4b89df7d9e484c8fe950.zip
2.6.35.6-51.fc14
Diffstat (limited to 'freed-ora/current/f14')
-rw-r--r--freed-ora/current/f14/drm-nouveau-connector-fix.patch21
-rw-r--r--freed-ora/current/f14/drm-polling-fixes.patch703
-rw-r--r--freed-ora/current/f14/drm-revert-drm-fbdev-rework-output-polling-to-be-back-in-core.patch958
-rw-r--r--freed-ora/current/f14/kernel.spec14
-rw-r--r--freed-ora/current/f14/revert-drm-kms-toggle-poll-around-switcheroo.patch65
5 files changed, 732 insertions, 1029 deletions
diff --git a/freed-ora/current/f14/drm-nouveau-connector-fix.patch b/freed-ora/current/f14/drm-nouveau-connector-fix.patch
new file mode 100644
index 000000000..0f67d44dc
--- /dev/null
+++ b/freed-ora/current/f14/drm-nouveau-connector-fix.patch
@@ -0,0 +1,21 @@
+diff -up linux-2.6.35.x86_64/drivers/gpu/drm/nouveau/nouveau_connector.c.da linux-2.6.35.x86_64/drivers/gpu/drm/nouveau/nouveau_connector.c
+--- linux-2.6.35.x86_64/drivers/gpu/drm/nouveau/nouveau_connector.c.da 2010-11-08 19:55:42.000000000 -0500
++++ linux-2.6.35.x86_64/drivers/gpu/drm/nouveau/nouveau_connector.c 2010-11-08 19:55:49.000000000 -0500
+@@ -298,7 +298,7 @@ detect_analog:
+ }
+
+ static enum drm_connector_status
+-nouveau_connector_detect_lvds(struct drm_connector *connector)
++nouveau_connector_detect_lvds(struct drm_connector *connector, bool force)
+ {
+ struct drm_device *dev = connector->dev;
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+@@ -319,7 +319,7 @@ nouveau_connector_detect_lvds(struct drm
+
+ /* Try retrieving EDID via DDC */
+ if (!dev_priv->vbios.fp_no_ddc) {
+- status = nouveau_connector_detect(connector);
++ status = nouveau_connector_detect(connector, force);
+ if (status == connector_status_connected)
+ goto out;
+ }
diff --git a/freed-ora/current/f14/drm-polling-fixes.patch b/freed-ora/current/f14/drm-polling-fixes.patch
new file mode 100644
index 000000000..df4ad761a
--- /dev/null
+++ b/freed-ora/current/f14/drm-polling-fixes.patch
@@ -0,0 +1,703 @@
+commit 879d56da9b89b52de2109cadf1369967522428e8
+Author: Dave Airlie <airlied@redhat.com>
+Date: Tue Oct 26 12:55:52 2010 +1000
+
+ drm/radeon/kms: don't poll dac load detect.
+
+ This is slightly destructive, cpu intensive and can cause lockups.
+
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 2563a90cdda1fe490947dc032ce17bf1118afc39
+Author: Dave Airlie <airlied@redhat.com>
+Date: Tue Nov 9 10:26:00 2010 +1000
+
+ drm: Use a nondestructive mode for output detect when polling (v2)
+
+ v2: Julien Cristau pointed out that @nondestructive results in
+ double-negatives and confusion when trying to interpret the parameter,
+ so use @force instead. Much easier to type as well. ;-)
+
+ And fix the miscompilation of vmgfx reported by Sedat Dilek.
+
+ Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+ Cc: stable@kernel.org
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+ Conflicts:
+
+ drivers/gpu/drm/i915/intel_tv.c
+ drivers/gpu/drm/nouveau/nouveau_connector.c
+
+commit deb557bbbcaa7fa8281d51490c73b51f579bc84d
+Author: Dave Airlie <airlied@redhat.com>
+Date: Tue Nov 9 10:24:06 2010 +1000
+
+ drm: Use a nondestructive mode for output detect when polling
+
+ Destructive load-detection is very expensive and due to failings
+ elsewhere can trigger system wide stalls of up to 600ms. A simple
+ first step to correcting this is not to invoke such an expensive
+ and destructive load-detection operation automatically.
+
+ Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=29536
+ Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=16265
+ Reported-by: Bruno Prémont <bonbons@linux-vserver.org>
+ Tested-by: Sitsofe Wheeler <sitsofe@yahoo.com>
+ Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+ Cc: stable@kernel.org
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+ Conflicts:
+
+ drivers/gpu/drm/i915/intel_tv.c
+ drivers/gpu/drm/nouveau/nouveau_connector.c
+
+commit 8d5d3cd3612618a3c2214048788f0b2cc463ce0f
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Mon Sep 6 23:53:47 2010 +0100
+
+ drm: Fix regression in disable polling e58f637
+
+ I broke out my trusty i845 and found a new boot failure, which upon
+ inspection turned out to be a recursion within:
+
+ drm_helper_probe_single_connector_modes() -> drm_helper_hpd_irq_event()
+ -> intel_crt_detect() -> drm_helper_probe_single_connector_modes()
+
+ Calling drm_kms_helper_poll_enable() instead performs the desired
+ re-initialisation of the polling should the user have toggled the
+ parameter, without the recursive side-effect.
+
+ Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+ Cc: Dave Airlie <airlied@redhat.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit ec0becade1eae9b0f40b12ea4fcc3ea36e993ba3
+Author: Dave Airlie <airlied@redhat.com>
+Date: Tue Nov 9 09:48:34 2010 +1000
+
+ drm/kms: Add a module parameter to disable polling
+
+ Polling for a VGA device on an old system can be quite expensive,
+ causing latencies on the order of 600ms. As we hold the mode mutex for
+ this time and also need the same mutex to move the cursor, we trigger a
+ user-visible stall.
+
+ The real solution would involve improving the granulatity of the
+ locking and so perhaps performing some of the probing not under the lock
+ or some other updates can be done under different locks. Also reducing the
+ cost of probing for a non-existent monitor would be worthwhile. However,
+ exposing a parameter to disable polling is a simple workaround in the
+ meantime.
+
+ In order to accommodate users turning polling on and off at runtime, the
+ polling is potentially re-enabled on every probe. This is coupled to
+ the user calling xrandr, which seems to be a vaild time to reset the
+ polling timeout since the information on the connection has just been
+ updated. (The presumption being that all connections are probed in a
+ single xrandr pass, which is currently valid.)
+
+ References:
+
+ Bug 29536 - 2.6.35 causes ~600ms latency every 10s
+ https://bugs.freedesktop.org/show_bug.cgi?id=29536
+
+ Bug 16265 - Why is kslowd accumulating so much CPU time?
+ https://bugzilla.kernel.org/show_bug.cgi?id=16265
+
+ Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+ Reported-and-tested-by: Bruno Prémont <bonbons@linux-vserver.org>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+ Conflicts:
+
+ drivers/gpu/drm/drm_crtc_helper.c
+
+commit 77e90256db2f7e6424717f7cc984b22d2832243f
+Author: Dan Carpenter <error27@gmail.com>
+Date: Thu Aug 19 11:46:29 2010 +0200
+
+ drm: move dereference below check
+
+ "fb_helper_conn" is dereferenced before the check for NULL. It's never
+ actually NULL here, so this is mostly to keep the static checkers happy.
+
+ Signed-off-by: Dan Carpenter <error27@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 86e25290d9df7a84d185dfc037851d72d270a6c0
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Tue Jul 20 03:24:11 2010 -0400
+
+ drm/radeon/kms: make sure HPD is set to NONE on analog-only connectors
+
+ HPD is digital only.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 93d2725f536c17a85c35051beb4c41b7c1707db0
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Mon Oct 25 19:44:00 2010 -0400
+
+ drm/radeon/kms: MC vram map needs to be >= pci aperture size
+
+ The vram map in the radeon memory controller needs to be
+ >= the pci aperture size. Fixes:
+ https://bugs.freedesktop.org/show_bug.cgi?id=28402
+
+ The problematic cards in the above bug have 64 MB of vram,
+ but the pci aperture is 128 MB and the MC vram map was only
+ 64 MB. This can lead to hangs.
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Cc: stable@kernel.org
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+
+commit 3fd6d68cfa32d8a5c99ba24e3d2c669bffef45ec
+Author: Alex Deucher <alexdeucher@gmail.com>
+Date: Wed Oct 27 01:02:35 2010 -0400
+
+ drm/radeon/kms: fix handling of tex lookup disable in cs checker on r2xx
+
+ There are cases when multiple texture units have to be enabled,
+ but not actually used to sample. This patch checks to see if
+ the lookup_disable bit is set and if so, skips the texture check.
+
+ Fixes:
+ https://bugs.freedesktop.org/show_bug.cgi?id=25544
+
+ Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
+ Cc: stable@kernel.org
+ Signed-off-by: Dave Airlie <airlied@redhat.com>
+diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
+index 25d70d6..d537039 100644
+--- a/drivers/gpu/drm/drm_crtc_helper.c
++++ b/drivers/gpu/drm/drm_crtc_helper.c
+@@ -34,6 +34,9 @@
+ #include "drm_crtc_helper.h"
+ #include "drm_fb_helper.h"
+
++static bool drm_kms_helper_poll = true;
++module_param_named(poll, drm_kms_helper_poll, bool, 0600);
++
+ static void drm_mode_validate_flag(struct drm_connector *connector,
+ int flags)
+ {
+@@ -98,8 +101,10 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
+ connector->status = connector_status_disconnected;
+ if (connector->funcs->force)
+ connector->funcs->force(connector);
+- } else
+- connector->status = connector->funcs->detect(connector);
++ } else {
++ connector->status = connector->funcs->detect(connector, true);
++ drm_kms_helper_poll_enable(dev);
++ }
+
+ if (connector->status == connector_status_disconnected) {
+ DRM_DEBUG_KMS("%s is disconnected\n",
+@@ -820,6 +825,9 @@ static void output_poll_execute(struct slow_work *work)
+ bool repoll = false, changed = false;
+ int ret;
+
++ if (!drm_kms_helper_poll)
++ return;
++
+ mutex_lock(&dev->mode_config.mutex);
+ list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+
+@@ -839,7 +847,7 @@ static void output_poll_execute(struct slow_work *work)
+ !(connector->polled & DRM_CONNECTOR_POLL_HPD))
+ continue;
+
+- status = connector->funcs->detect(connector);
++ status = connector->funcs->detect(connector, false);
+ if (old_status != status)
+ changed = true;
+ }
+@@ -874,6 +882,9 @@ void drm_kms_helper_poll_enable(struct drm_device *dev)
+ struct drm_connector *connector;
+ int ret;
+
++ if (!dev->mode_config.poll_enabled || !drm_kms_helper_poll)
++ return;
++
+ list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+ if (connector->polled)
+ poll = true;
+@@ -909,9 +920,12 @@ void drm_helper_hpd_irq_event(struct drm_device *dev)
+ {
+ if (!dev->mode_config.poll_enabled)
+ return;
++
+ delayed_slow_work_cancel(&dev->mode_config.output_poll_slow_work);
+ /* schedule a slow work asap */
+- delayed_slow_work_enqueue(&dev->mode_config.output_poll_slow_work, 0);
++ if (drm_kms_helper_poll)
++ delayed_slow_work_enqueue(&dev->mode_config.output_poll_slow_work, 0);
++
+ }
+ EXPORT_SYMBOL(drm_helper_hpd_irq_event);
+
+diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
+index 7196620..cef8d8d 100644
+--- a/drivers/gpu/drm/drm_fb_helper.c
++++ b/drivers/gpu/drm/drm_fb_helper.c
+@@ -94,10 +94,11 @@ static bool drm_fb_helper_connector_parse_command_line(struct drm_fb_helper_conn
+ int i;
+ enum drm_connector_force force = DRM_FORCE_UNSPECIFIED;
+ struct drm_fb_helper_cmdline_mode *cmdline_mode;
+- struct drm_connector *connector = fb_helper_conn->connector;
++ struct drm_connector *connector;
+
+ if (!fb_helper_conn)
+ return false;
++ connector = fb_helper_conn->connector;
+
+ cmdline_mode = &fb_helper_conn->cmdline_mode;
+ if (!mode_option)
+diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
+index 101d381..9500af1 100644
+--- a/drivers/gpu/drm/drm_sysfs.c
++++ b/drivers/gpu/drm/drm_sysfs.c
+@@ -159,7 +159,7 @@ static ssize_t status_show(struct device *device,
+ struct drm_connector *connector = to_drm_connector(device);
+ enum drm_connector_status status;
+
+- status = connector->funcs->detect(connector);
++ status = connector->funcs->detect(connector, true);
+ return snprintf(buf, PAGE_SIZE, "%s\n",
+ drm_get_connector_status_name(status));
+ }
+diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
+index ee0732b..3886b47 100644
+--- a/drivers/gpu/drm/i915/intel_crt.c
++++ b/drivers/gpu/drm/i915/intel_crt.c
+@@ -402,7 +402,8 @@ intel_crt_load_detect(struct drm_crtc *crtc, struct intel_encoder *intel_encoder
+ return status;
+ }
+
+-static enum drm_connector_status intel_crt_detect(struct drm_connector *connector)
++static enum drm_connector_status
++intel_crt_detect(struct drm_connector *connector, bool force)
+ {
+ struct drm_device *dev = connector->dev;
+ struct drm_encoder *encoder = intel_attached_encoder(connector);
+@@ -421,6 +422,9 @@ static enum drm_connector_status intel_crt_detect(struct drm_connector *connecto
+ if (intel_crt_detect_ddc(encoder))
+ return connector_status_connected;
+
++ if (!force)
++ return connector->status;
++
+ /* for pre-945g platforms use load detect */
+ if (encoder->crtc && encoder->crtc->enabled) {
+ status = intel_crt_load_detect(encoder->crtc, intel_encoder);
+diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
+index d9de8f1..b58249d 100644
+--- a/drivers/gpu/drm/i915/intel_dp.c
++++ b/drivers/gpu/drm/i915/intel_dp.c
+@@ -1287,7 +1287,7 @@ ironlake_dp_detect(struct drm_connector *connector)
+ * \return false if DP port is disconnected.
+ */
+ static enum drm_connector_status
+-intel_dp_detect(struct drm_connector *connector)
++intel_dp_detect(struct drm_connector *connector, bool force)
+ {
+ struct drm_encoder *encoder = intel_attached_encoder(connector);
+ struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
+diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
+index 227feca..48a1889 100644
+--- a/drivers/gpu/drm/i915/intel_dvo.c
++++ b/drivers/gpu/drm/i915/intel_dvo.c
+@@ -211,7 +211,8 @@ static void intel_dvo_mode_set(struct drm_encoder *encoder,
+ *
+ * Unimplemented.
+ */
+-static enum drm_connector_status intel_dvo_detect(struct drm_connector *connector)
++static enum drm_connector_status
++intel_dvo_detect(struct drm_connector *connector, bool force)
+ {
+ struct drm_encoder *encoder = intel_attached_encoder(connector);
+ struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
+diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
+index 83bd764..d1decfc 100644
+--- a/drivers/gpu/drm/i915/intel_hdmi.c
++++ b/drivers/gpu/drm/i915/intel_hdmi.c
+@@ -134,7 +134,7 @@ static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
+ }
+
+ static enum drm_connector_status
+-intel_hdmi_detect(struct drm_connector *connector)
++intel_hdmi_detect(struct drm_connector *connector, bool force)
+ {
+ struct drm_encoder *encoder = intel_attached_encoder(connector);
+ struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
+diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
+index 7d42ff1..9ad3425 100644
+--- a/drivers/gpu/drm/i915/intel_lvds.c
++++ b/drivers/gpu/drm/i915/intel_lvds.c
+@@ -546,7 +546,8 @@ static void intel_lvds_mode_set(struct drm_encoder *encoder,
+ * connected and closed means disconnected. We also send hotplug events as
+ * needed, using lid status notification from the input layer.
+ */
+-static enum drm_connector_status intel_lvds_detect(struct drm_connector *connector)
++static enum drm_connector_status
++intel_lvds_detect(struct drm_connector *connector, bool force)
+ {
+ struct drm_device *dev = connector->dev;
+ enum drm_connector_status status = connector_status_connected;
+@@ -641,7 +642,9 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val,
+ * the LID nofication event.
+ */
+ if (connector)
+- connector->status = connector->funcs->detect(connector);
++ connector->status = connector->funcs->detect(connector,
++ false);
++
+ /* Don't force modeset on machines where it causes a GPU lockup */
+ if (dmi_check_system(intel_no_modeset_on_lid))
+ return NOTIFY_OK;
+diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
+index 76993ac..76c9b3d 100644
+--- a/drivers/gpu/drm/i915/intel_sdvo.c
++++ b/drivers/gpu/drm/i915/intel_sdvo.c
+@@ -1496,7 +1496,7 @@ intel_analog_is_connected(struct drm_device *dev)
+ if (!analog_connector)
+ return false;
+
+- if (analog_connector->funcs->detect(analog_connector) ==
++ if (analog_connector->funcs->detect(analog_connector, false) ==
+ connector_status_disconnected)
+ return false;
+
+@@ -1567,7 +1567,8 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector)
+ return status;
+ }
+
+-static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connector)
++static enum drm_connector_status
++intel_sdvo_detect(struct drm_connector *connector, bool force)
+ {
+ uint16_t response;
+ u8 status;
+diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
+index 6d553c2..ad40f1b 100644
+--- a/drivers/gpu/drm/i915/intel_tv.c
++++ b/drivers/gpu/drm/i915/intel_tv.c
+@@ -1336,7 +1336,7 @@ static void intel_tv_find_better_format(struct drm_connector *connector)
+ * we have a pipe programmed in order to probe the TV.
+ */
+ static enum drm_connector_status
+-intel_tv_detect(struct drm_connector *connector)
++intel_tv_detect(struct drm_connector *connector, bool force)
+ {
+ struct drm_crtc *crtc;
+ struct drm_display_mode mode;
+@@ -1351,7 +1351,7 @@ intel_tv_detect(struct drm_connector *connector)
+
+ if (encoder->crtc && encoder->crtc->enabled) {
+ type = intel_tv_detect_type(encoder->crtc, intel_encoder);
+- } else {
++ } else if (force) {
+ crtc = intel_get_load_detect_pipe(intel_encoder, connector,
+ &mode, &dpms_mode);
+ if (crtc) {
+@@ -1359,8 +1359,9 @@ intel_tv_detect(struct drm_connector *connector)
+ intel_release_load_detect_pipe(intel_encoder, connector,
+ dpms_mode);
+ } else
+- type = -1;
+- }
++ return connector_status_unknown;
++ } else
++ return connector->status;
+
+ tv_priv->type = type;
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
+index 149ed22..1085376 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
++++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
+@@ -228,7 +228,7 @@ nouveau_connector_set_encoder(struct drm_connector *connector,
+ }
+
+ static enum drm_connector_status
+-nouveau_connector_detect(struct drm_connector *connector)
++nouveau_connector_detect(struct drm_connector *connector, bool force)
+ {
+ struct drm_device *dev = connector->dev;
+ struct nouveau_connector *nv_connector = nouveau_connector(connector);
+diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
+index a89a15a..a3378ba 100644
+--- a/drivers/gpu/drm/radeon/r100.c
++++ b/drivers/gpu/drm/radeon/r100.c
+@@ -2321,6 +2321,9 @@ void r100_vram_init_sizes(struct radeon_device *rdev)
+ /* Fix for RN50, M6, M7 with 8/16/32(??) MBs of VRAM -
+ * Novell bug 204882 + along with lots of ubuntu ones
+ */
++ if (rdev->mc.aper_size > config_aper_size)
++ config_aper_size = rdev->mc.aper_size;
++
+ if (config_aper_size > rdev->mc.real_vram_size)
+ rdev->mc.mc_vram_size = config_aper_size;
+ else
+@@ -3229,6 +3232,8 @@ static int r100_cs_track_texture_check(struct radeon_device *rdev,
+ for (u = 0; u < track->num_texture; u++) {
+ if (!track->textures[u].enabled)
+ continue;
++ if (track->textures[u].lookup_disable)
++ continue;
+ robj = track->textures[u].robj;
+ if (robj == NULL) {
+ DRM_ERROR("No texture bound to unit %u\n", u);
+@@ -3462,6 +3467,7 @@ void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track
+ track->textures[i].robj = NULL;
+ /* CS IB emission code makes sure texture unit are disabled */
+ track->textures[i].enabled = false;
++ track->textures[i].lookup_disable = false;
+ track->textures[i].roundup_w = true;
+ track->textures[i].roundup_h = true;
+ if (track->separate_cube)
+diff --git a/drivers/gpu/drm/radeon/r100_track.h b/drivers/gpu/drm/radeon/r100_track.h
+index f47cdca..af65600 100644
+--- a/drivers/gpu/drm/radeon/r100_track.h
++++ b/drivers/gpu/drm/radeon/r100_track.h
+@@ -46,6 +46,7 @@ struct r100_cs_track_texture {
+ unsigned height_11;
+ bool use_pitch;
+ bool enabled;
++ bool lookup_disable;
+ bool roundup_w;
+ bool roundup_h;
+ unsigned compress_format;
+diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c
+index 0266d72..d2408c3 100644
+--- a/drivers/gpu/drm/radeon/r200.c
++++ b/drivers/gpu/drm/radeon/r200.c
+@@ -447,6 +447,8 @@ int r200_packet0_check(struct radeon_cs_parser *p,
+ track->textures[i].width = 1 << ((idx_value >> RADEON_TXFORMAT_WIDTH_SHIFT) & RADEON_TXFORMAT_WIDTH_MASK);
+ track->textures[i].height = 1 << ((idx_value >> RADEON_TXFORMAT_HEIGHT_SHIFT) & RADEON_TXFORMAT_HEIGHT_MASK);
+ }
++ if (idx_value & R200_TXFORMAT_LOOKUP_DISABLE)
++ track->textures[i].lookup_disable = true;
+ switch ((idx_value & RADEON_TXFORMAT_FORMAT_MASK)) {
+ case R200_TXFORMAT_I8:
+ case R200_TXFORMAT_RGB332:
+diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
+index adccbc2..1680600 100644
+--- a/drivers/gpu/drm/radeon/radeon_connectors.c
++++ b/drivers/gpu/drm/radeon/radeon_connectors.c
+@@ -467,7 +467,8 @@ static int radeon_lvds_mode_valid(struct drm_connector *connector,
+ return MODE_OK;
+ }
+
+-static enum drm_connector_status radeon_lvds_detect(struct drm_connector *connector)
++static enum drm_connector_status
++radeon_lvds_detect(struct drm_connector *connector, bool force)
+ {
+ struct radeon_connector *radeon_connector = to_radeon_connector(connector);
+ struct drm_encoder *encoder = radeon_best_single_encoder(connector);
+@@ -582,7 +583,8 @@ static int radeon_vga_mode_valid(struct drm_connector *connector,
+ return MODE_OK;
+ }
+
+-static enum drm_connector_status radeon_vga_detect(struct drm_connector *connector)
++static enum drm_connector_status
++radeon_vga_detect(struct drm_connector *connector, bool force)
+ {
+ struct radeon_connector *radeon_connector = to_radeon_connector(connector);
+ struct drm_encoder *encoder;
+@@ -621,6 +623,11 @@ static enum drm_connector_status radeon_vga_detect(struct drm_connector *connect
+ ret = connector_status_connected;
+ }
+ } else {
++
++ /* if we aren't forcing don't do destructive polling */
++ if (!force)
++ return connector->status;
++
+ if (radeon_connector->dac_load_detect && encoder) {
+ encoder_funcs = encoder->helper_private;
+ ret = encoder_funcs->detect(encoder, connector);
+@@ -679,7 +686,8 @@ static int radeon_tv_mode_valid(struct drm_connector *connector,
+ return MODE_OK;
+ }
+
+-static enum drm_connector_status radeon_tv_detect(struct drm_connector *connector)
++static enum drm_connector_status
++radeon_tv_detect(struct drm_connector *connector, bool force)
+ {
+ struct drm_encoder *encoder;
+ struct drm_encoder_helper_funcs *encoder_funcs;
+@@ -736,7 +744,8 @@ static int radeon_dvi_get_modes(struct drm_connector *connector)
+ * we have to check if this analog encoder is shared with anyone else (TV)
+ * if its shared we have to set the other connector to disconnected.
+ */
+-static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connector)
++static enum drm_connector_status
++radeon_dvi_detect(struct drm_connector *connector, bool force)
+ {
+ struct radeon_connector *radeon_connector = to_radeon_connector(connector);
+ struct drm_encoder *encoder = NULL;
+@@ -806,6 +815,11 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect
+ if ((ret == connector_status_connected) && (radeon_connector->use_digital == true))
+ goto out;
+
++ if (!force) {
++ ret = connector->status;
++ goto out;
++ }
++
+ /* find analog encoder */
+ if (radeon_connector->dac_load_detect) {
+ for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
+@@ -962,7 +976,8 @@ static int radeon_dp_get_modes(struct drm_connector *connector)
+ return ret;
+ }
+
+-static enum drm_connector_status radeon_dp_detect(struct drm_connector *connector)
++static enum drm_connector_status
++radeon_dp_detect(struct drm_connector *connector, bool force)
+ {
+ struct radeon_connector *radeon_connector = to_radeon_connector(connector);
+ enum drm_connector_status ret = connector_status_disconnected;
+@@ -1082,6 +1097,8 @@ radeon_add_atom_connector(struct drm_device *dev,
+ drm_connector_attach_property(&radeon_connector->base,
+ rdev->mode_info.load_detect_property,
+ 1);
++ /* no HPD on analog connectors */
++ radeon_connector->hpd.hpd = RADEON_HPD_NONE;
+ connector->polled = DRM_CONNECTOR_POLL_CONNECT;
+ break;
+ case DRM_MODE_CONNECTOR_DVIA:
+@@ -1096,6 +1113,8 @@ radeon_add_atom_connector(struct drm_device *dev,
+ drm_connector_attach_property(&radeon_connector->base,
+ rdev->mode_info.load_detect_property,
+ 1);
++ /* no HPD on analog connectors */
++ radeon_connector->hpd.hpd = RADEON_HPD_NONE;
+ break;
+ case DRM_MODE_CONNECTOR_DVII:
+ case DRM_MODE_CONNECTOR_DVID:
+@@ -1186,6 +1205,8 @@ radeon_add_atom_connector(struct drm_device *dev,
+ drm_connector_attach_property(&radeon_connector->base,
+ rdev->mode_info.tv_std_property,
+ radeon_atombios_get_tv_info(rdev));
++ /* no HPD on analog connectors */
++ radeon_connector->hpd.hpd = RADEON_HPD_NONE;
+ }
+ break;
+ case DRM_MODE_CONNECTOR_LVDS:
+@@ -1209,7 +1230,7 @@ radeon_add_atom_connector(struct drm_device *dev,
+ break;
+ }
+
+- if (hpd->hpd == RADEON_HPD_NONE) {
++ if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
+ if (i2c_bus->valid)
+ connector->polled = DRM_CONNECTOR_POLL_CONNECT;
+ } else
+@@ -1276,6 +1297,8 @@ radeon_add_legacy_connector(struct drm_device *dev,
+ drm_connector_attach_property(&radeon_connector->base,
+ rdev->mode_info.load_detect_property,
+ 1);
++ /* no HPD on analog connectors */
++ radeon_connector->hpd.hpd = RADEON_HPD_NONE;
+ connector->polled = DRM_CONNECTOR_POLL_CONNECT;
+ break;
+ case DRM_MODE_CONNECTOR_DVIA:
+@@ -1290,6 +1313,8 @@ radeon_add_legacy_connector(struct drm_device *dev,
+ drm_connector_attach_property(&radeon_connector->base,
+ rdev->mode_info.load_detect_property,
+ 1);
++ /* no HPD on analog connectors */
++ radeon_connector->hpd.hpd = RADEON_HPD_NONE;
+ break;
+ case DRM_MODE_CONNECTOR_DVII:
+ case DRM_MODE_CONNECTOR_DVID:
+@@ -1328,6 +1353,8 @@ radeon_add_legacy_connector(struct drm_device *dev,
+ drm_connector_attach_property(&radeon_connector->base,
+ rdev->mode_info.tv_std_property,
+ radeon_combios_get_tv_info(rdev));
++ /* no HPD on analog connectors */
++ radeon_connector->hpd.hpd = RADEON_HPD_NONE;
+ }
+ break;
+ case DRM_MODE_CONNECTOR_LVDS:
+@@ -1345,7 +1372,7 @@ radeon_add_legacy_connector(struct drm_device *dev,
+ break;
+ }
+
+- if (hpd->hpd == RADEON_HPD_NONE) {
++ if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
+ if (i2c_bus->valid)
+ connector->polled = DRM_CONNECTOR_POLL_CONNECT;
+ } else
+diff --git a/drivers/gpu/drm/radeon/radeon_reg.h b/drivers/gpu/drm/radeon/radeon_reg.h
+index c332f46..6492881 100644
+--- a/drivers/gpu/drm/radeon/radeon_reg.h
++++ b/drivers/gpu/drm/radeon/radeon_reg.h
+@@ -2836,6 +2836,7 @@
+ # define R200_TXFORMAT_ST_ROUTE_STQ5 (5 << 24)
+ # define R200_TXFORMAT_ST_ROUTE_MASK (7 << 24)
+ # define R200_TXFORMAT_ST_ROUTE_SHIFT 24
++# define R200_TXFORMAT_LOOKUP_DISABLE (1 << 27)
+ # define R200_TXFORMAT_ALPHA_MASK_ENABLE (1 << 28)
+ # define R200_TXFORMAT_CHROMA_KEY_ENABLE (1 << 29)
+ # define R200_TXFORMAT_CUBIC_MAP_ENABLE (1 << 30)
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
+index cfaf690..5b638cb 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
+@@ -335,7 +335,8 @@ static void vmw_ldu_connector_restore(struct drm_connector *connector)
+ }
+
+ static enum drm_connector_status
+- vmw_ldu_connector_detect(struct drm_connector *connector)
++ vmw_ldu_connector_detect(struct drm_connector *connector,
++ bool force)
+ {
+ if (vmw_connector_to_ldu(connector)->pref_active)
+ return connector_status_connected;
+@@ -516,7 +517,7 @@ static int vmw_ldu_init(struct vmw_private *dev_priv, unsigned unit)
+
+ drm_connector_init(dev, connector, &vmw_legacy_connector_funcs,
+ DRM_MODE_CONNECTOR_LVDS);
+- connector->status = vmw_ldu_connector_detect(connector);
++ connector->status = vmw_ldu_connector_detect(connector, true);
+
+ drm_encoder_init(dev, encoder, &vmw_legacy_encoder_funcs,
+ DRM_MODE_ENCODER_LVDS);
+@@ -610,7 +611,7 @@ int vmw_kms_ldu_update_layout(struct vmw_private *dev_priv, unsigned num,
+ ldu->pref_height = 600;
+ ldu->pref_active = false;
+ }
+- con->status = vmw_ldu_connector_detect(con);
++ con->status = vmw_ldu_connector_detect(con, true);
+ }
+
+ mutex_unlock(&dev->mode_config.mutex);
+diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
+index 93a1a31..afbb578 100644
+--- a/include/drm/drm_crtc.h
++++ b/include/drm/drm_crtc.h
+@@ -420,7 +420,15 @@ struct drm_connector_funcs {
+ void (*dpms)(struct drm_connector *connector, int mode);
+ void (*save)(struct drm_connector *connector);
+ void (*restore)(struct drm_connector *connector);
+- enum drm_connector_status (*detect)(struct drm_connector *connector);
++
++ /* Check to see if anything is attached to the connector.
++ * @force is set to false whilst polling, true when checking the
++ * connector due to user request. @force can be used by the driver
++ * to avoid expensive, destructive operations during automated
++ * probing.
++ */
++ enum drm_connector_status (*detect)(struct drm_connector *connector,
++ bool force);
+ int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height);
+ int (*set_property)(struct drm_connector *connector, struct drm_property *property,
+ uint64_t val);
diff --git a/freed-ora/current/f14/drm-revert-drm-fbdev-rework-output-polling-to-be-back-in-core.patch b/freed-ora/current/f14/drm-revert-drm-fbdev-rework-output-polling-to-be-back-in-core.patch
deleted file mode 100644
index 481a08fdc..000000000
--- a/freed-ora/current/f14/drm-revert-drm-fbdev-rework-output-polling-to-be-back-in-core.patch
+++ /dev/null
@@ -1,958 +0,0 @@
-From 5b904034b0ab5195d971b139d0c0b67ab21b063c Mon Sep 17 00:00:00 2001
-From: Kyle McMartin <kyle@dreadnought.i.jkkm.org>
-Date: Mon, 21 Jun 2010 20:33:16 +0100
-Subject: Revert "drm/fbdev: rework output polling to be back in the core. (v4)"
-
-This reverts commit eb1f8e4f3be898df808e2dfc131099f5831d491d.
-
-Conflicts:
-
- drivers/gpu/drm/drm_crtc_helper.c
- drivers/gpu/drm/i915/i915_dma.c
- drivers/gpu/drm/i915/intel_fb.c
- drivers/gpu/drm/nouveau/nouveau_fbcon.c
- drivers/gpu/drm/radeon/radeon_fb.c
- include/drm/drm_crtc_helper.h
----
- drivers/gpu/drm/Kconfig | 2 +-
- drivers/gpu/drm/drm_crtc_helper.c | 111 ------------------------
- drivers/gpu/drm/drm_fb_helper.c | 123 +++++++++++++++++++++++----
- drivers/gpu/drm/i915/i915_dma.c | 1 -
- drivers/gpu/drm/i915/i915_irq.c | 3 +-
- drivers/gpu/drm/i915/intel_crt.c | 5 -
- drivers/gpu/drm/i915/intel_display.c | 2 -
- drivers/gpu/drm/i915/intel_dp.c | 2 -
- drivers/gpu/drm/i915/intel_drv.h | 2 +-
- drivers/gpu/drm/i915/intel_fb.c | 14 ++--
- drivers/gpu/drm/i915/intel_hdmi.c | 1 -
- drivers/gpu/drm/i915/intel_sdvo.c | 2 -
- drivers/gpu/drm/nouveau/nouveau_connector.c | 12 ---
- drivers/gpu/drm/nouveau/nouveau_display.c | 1 -
- drivers/gpu/drm/nouveau/nouveau_fbcon.c | 13 ++-
- drivers/gpu/drm/nouveau/nouveau_fbcon.h | 2 +-
- drivers/gpu/drm/nouveau/nouveau_state.c | 5 +-
- drivers/gpu/drm/nouveau/nv50_display.c | 2 +-
- drivers/gpu/drm/radeon/radeon_connectors.c | 13 ---
- drivers/gpu/drm/radeon/radeon_display.c | 10 --
- drivers/gpu/drm/radeon/radeon_fb.c | 15 +++-
- drivers/gpu/drm/radeon/radeon_irq_kms.c | 5 +-
- drivers/gpu/drm/radeon/radeon_mode.h | 3 +-
- include/drm/drm_crtc.h | 17 ----
- include/drm/drm_crtc_helper.h | 6 --
- include/drm/drm_fb_helper.h | 13 +++-
- 26 files changed, 155 insertions(+), 230 deletions(-)
-
-diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
-index c2711c6..a51a1e4 100644
---- a/drivers/gpu/drm/Kconfig
-+++ b/drivers/gpu/drm/Kconfig
-@@ -9,7 +9,6 @@ menuconfig DRM
- depends on (AGP || AGP=n) && PCI && !EMULATED_CMPXCHG && MMU
- select I2C
- select I2C_ALGOBIT
-- select SLOW_WORK
- help
- Kernel-level support for the Direct Rendering Infrastructure (DRI)
- introduced in XFree86 4.0. If you say Y here, you need to select
-@@ -24,6 +23,7 @@ config DRM_KMS_HELPER
- depends on DRM
- select FB
- select FRAMEBUFFER_CONSOLE if !EMBEDDED
-+ select SLOW_WORK
- help
- FB and CRTC helpers for KMS drivers.
-
-diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
-index 9b2a541..b142ac2 100644
---- a/drivers/gpu/drm/drm_crtc_helper.c
-+++ b/drivers/gpu/drm/drm_crtc_helper.c
-@@ -807,114 +807,3 @@ int drm_helper_resume_force_mode(struct drm_device *dev)
- return 0;
- }
- EXPORT_SYMBOL(drm_helper_resume_force_mode);
--
--static struct slow_work_ops output_poll_ops;
--
--#define DRM_OUTPUT_POLL_PERIOD (10*HZ)
--static void output_poll_execute(struct slow_work *work)
--{
-- struct delayed_slow_work *delayed_work = container_of(work, struct delayed_slow_work, work);
-- struct drm_device *dev = container_of(delayed_work, struct drm_device, mode_config.output_poll_slow_work);
-- struct drm_connector *connector;
-- enum drm_connector_status old_status, status;
-- bool repoll = false, changed = false;
-- int ret;
--
-- mutex_lock(&dev->mode_config.mutex);
-- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
--
-- /* if this is HPD or polled don't check it -
-- TV out for instance */
-- if (!connector->polled)
-- continue;
--
-- else if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT))
-- repoll = true;
--
-- old_status = connector->status;
-- /* if we are connected and don't want to poll for disconnect
-- skip it */
-- if (old_status == connector_status_connected &&
-- !(connector->polled & DRM_CONNECTOR_POLL_DISCONNECT) &&
-- !(connector->polled & DRM_CONNECTOR_POLL_HPD))
-- continue;
--
-- status = connector->funcs->detect(connector);
-- if (old_status != status)
-- changed = true;
-- }
--
-- mutex_unlock(&dev->mode_config.mutex);
--
-- if (changed) {
-- /* send a uevent + call fbdev */
-- drm_sysfs_hotplug_event(dev);
-- if (dev->mode_config.funcs->output_poll_changed)
-- dev->mode_config.funcs->output_poll_changed(dev);
-- }
--
-- if (repoll) {
-- ret = delayed_slow_work_enqueue(delayed_work, DRM_OUTPUT_POLL_PERIOD);
-- if (ret)
-- DRM_ERROR("delayed enqueue failed %d\n", ret);
-- }
--}
--
--void drm_kms_helper_poll_disable(struct drm_device *dev)
--{
-- if (!dev->mode_config.poll_enabled)
-- return;
-- delayed_slow_work_cancel(&dev->mode_config.output_poll_slow_work);
--}
--EXPORT_SYMBOL(drm_kms_helper_poll_disable);
--
--void drm_kms_helper_poll_enable(struct drm_device *dev)
--{
-- bool poll = false;
-- struct drm_connector *connector;
-- int ret;
--
-- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
-- if (connector->polled)
-- poll = true;
-- }
--
-- if (poll) {
-- ret = delayed_slow_work_enqueue(&dev->mode_config.output_poll_slow_work, DRM_OUTPUT_POLL_PERIOD);
-- if (ret)
-- DRM_ERROR("delayed enqueue failed %d\n", ret);
-- }
--}
--EXPORT_SYMBOL(drm_kms_helper_poll_enable);
--
--void drm_kms_helper_poll_init(struct drm_device *dev)
--{
-- slow_work_register_user(THIS_MODULE);
-- delayed_slow_work_init(&dev->mode_config.output_poll_slow_work,
-- &output_poll_ops);
-- dev->mode_config.poll_enabled = true;
--
-- drm_kms_helper_poll_enable(dev);
--}
--EXPORT_SYMBOL(drm_kms_helper_poll_init);
--
--void drm_kms_helper_poll_fini(struct drm_device *dev)
--{
-- drm_kms_helper_poll_disable(dev);
-- slow_work_unregister_user(THIS_MODULE);
--}
--EXPORT_SYMBOL(drm_kms_helper_poll_fini);
--
--void drm_helper_hpd_irq_event(struct drm_device *dev)
--{
-- if (!dev->mode_config.poll_enabled)
-- return;
-- delayed_slow_work_cancel(&dev->mode_config.output_poll_slow_work);
-- /* schedule a slow work asap */
-- delayed_slow_work_enqueue(&dev->mode_config.output_poll_slow_work, 0);
--}
--EXPORT_SYMBOL(drm_helper_hpd_irq_event);
--
--static struct slow_work_ops output_poll_ops = {
-- .execute = output_poll_execute,
--};
-diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
-index 08c4c92..dcc6601 100644
---- a/drivers/gpu/drm/drm_fb_helper.c
-+++ b/drivers/gpu/drm/drm_fb_helper.c
-@@ -42,6 +42,8 @@ MODULE_LICENSE("GPL and additional rights");
-
- static LIST_HEAD(kernel_fb_helper_list);
-
-+static struct slow_work_ops output_status_change_ops;
-+
- /* simple single crtc case helper function */
- int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper)
- {
-@@ -423,13 +425,19 @@ static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper)
-
- int drm_fb_helper_init(struct drm_device *dev,
- struct drm_fb_helper *fb_helper,
-- int crtc_count, int max_conn_count)
-+ int crtc_count, int max_conn_count,
-+ bool polled)
- {
- struct drm_crtc *crtc;
- int ret = 0;
- int i;
-
- fb_helper->dev = dev;
-+ fb_helper->poll_enabled = polled;
-+
-+ slow_work_register_user(THIS_MODULE);
-+ delayed_slow_work_init(&fb_helper->output_status_change_slow_work,
-+ &output_status_change_ops);
-
- INIT_LIST_HEAD(&fb_helper->kernel_fb_list);
-
-@@ -486,6 +494,8 @@ void drm_fb_helper_fini(struct drm_fb_helper *fb_helper)
-
- drm_fb_helper_crtc_free(fb_helper);
-
-+ delayed_slow_work_cancel(&fb_helper->output_status_change_slow_work);
-+ slow_work_unregister_user(THIS_MODULE);
- }
- EXPORT_SYMBOL(drm_fb_helper_fini);
-
-@@ -703,7 +713,7 @@ int drm_fb_helper_set_par(struct fb_info *info)
-
- if (fb_helper->delayed_hotplug) {
- fb_helper->delayed_hotplug = false;
-- drm_fb_helper_hotplug_event(fb_helper);
-+ delayed_slow_work_enqueue(&fb_helper->output_status_change_slow_work, 0);
- }
- return 0;
- }
-@@ -816,7 +826,7 @@ int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper,
- if (crtc_count == 0 || sizes.fb_width == -1 || sizes.fb_height == -1) {
- /* hmm everyone went away - assume VGA cable just fell out
- and will come back later. */
-- DRM_INFO("Cannot find any crtc or sizes - going 1024x768\n");
-+ DRM_ERROR("Cannot find any crtc or sizes - going 1024x768\n");
- sizes.fb_width = sizes.surface_width = 1024;
- sizes.fb_height = sizes.surface_height = 768;
- }
-@@ -1362,7 +1372,12 @@ bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
- * we shouldn't end up with no modes here.
- */
- if (count == 0) {
-- printk(KERN_INFO "No connectors reported connected with modes\n");
-+ if (fb_helper->poll_enabled) {
-+ delayed_slow_work_enqueue(&fb_helper->output_status_change_slow_work,
-+ 5*HZ);
-+ printk(KERN_INFO "No connectors reported connected with modes - started polling\n");
-+ } else
-+ printk(KERN_INFO "No connectors reported connected with modes\n");
- }
- drm_setup_crtcs(fb_helper);
-
-@@ -1370,16 +1385,71 @@ bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
- }
- EXPORT_SYMBOL(drm_fb_helper_initial_config);
-
--bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
-+/* we got a hotplug irq - need to update fbcon */
-+void drm_helper_fb_hpd_irq_event(struct drm_fb_helper *fb_helper)
-+{
-+ /* if we don't have the fbdev registered yet do nothing */
-+ if (!fb_helper->fbdev)
-+ return;
-+
-+ /* schedule a slow work asap */
-+ delayed_slow_work_enqueue(&fb_helper->output_status_change_slow_work, 0);
-+}
-+EXPORT_SYMBOL(drm_helper_fb_hpd_irq_event);
-+
-+bool drm_helper_fb_hotplug_event(struct drm_fb_helper *fb_helper, bool polled)
- {
- int count = 0;
-+ int ret;
- u32 max_width, max_height, bpp_sel;
-- bool bound = false, crtcs_bound = false;
-- struct drm_crtc *crtc;
-
- if (!fb_helper->fb)
- return false;
-+ DRM_DEBUG_KMS("\n");
-+
-+ max_width = fb_helper->fb->width;
-+ max_height = fb_helper->fb->height;
-+ bpp_sel = fb_helper->fb->bits_per_pixel;
-+
-+ count = drm_fb_helper_probe_connector_modes(fb_helper, max_width,
-+ max_height);
-+ if (fb_helper->poll_enabled && !polled) {
-+ if (count) {
-+ delayed_slow_work_cancel(&fb_helper->output_status_change_slow_work);
-+ } else {
-+ ret = delayed_slow_work_enqueue(&fb_helper->output_status_change_slow_work, 5*HZ);
-+ }
-+ }
-+ drm_setup_crtcs(fb_helper);
-+
-+ return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel);
-+}
-+EXPORT_SYMBOL(drm_helper_fb_hotplug_event);
-+
-+/*
-+ * delayed work queue execution function
-+ * - check if fbdev is actually in use on the gpu
-+ * - if not set delayed flag and repoll if necessary
-+ * - check for connector status change
-+ * - repoll if 0 modes found
-+ *- call driver output status changed notifier
-+ */
-+static void output_status_change_execute(struct slow_work *work)
-+{
-+ struct delayed_slow_work *delayed_work = container_of(work, struct delayed_slow_work, work);
-+ struct drm_fb_helper *fb_helper = container_of(delayed_work, struct drm_fb_helper, output_status_change_slow_work);
-+ struct drm_connector *connector;
-+ enum drm_connector_status old_status, status;
-+ bool repoll, changed = false;
-+ int ret;
-+ int i;
-+ bool bound = false, crtcs_bound = false;
-+ struct drm_crtc *crtc;
-
-+ repoll = fb_helper->poll_enabled;
-+
-+ /* first of all check the fbcon framebuffer is actually bound to any crtc */
-+ /* take into account that no crtc at all maybe bound */
- list_for_each_entry(crtc, &fb_helper->dev->mode_config.crtc_list, head) {
- if (crtc->fb)
- crtcs_bound = true;
-@@ -1387,21 +1457,38 @@ bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
- bound = true;
- }
-
-- if (!bound && crtcs_bound) {
-+ if (bound == false && crtcs_bound) {
- fb_helper->delayed_hotplug = true;
-- return false;
-+ goto requeue;
- }
-- DRM_DEBUG_KMS("\n");
-
-- max_width = fb_helper->fb->width;
-- max_height = fb_helper->fb->height;
-- bpp_sel = fb_helper->fb->bits_per_pixel;
-+ for (i = 0; i < fb_helper->connector_count; i++) {
-+ connector = fb_helper->connector_info[i]->connector;
-+ old_status = connector->status;
-+ status = connector->funcs->detect(connector);
-+ if (old_status != status) {
-+ changed = true;
-+ }
-+ if (status == connector_status_connected && repoll) {
-+ DRM_DEBUG("%s is connected - stop polling\n", drm_get_connector_name(connector));
-+ repoll = false;
-+ }
-+ }
-
-- count = drm_fb_helper_probe_connector_modes(fb_helper, max_width,
-- max_height);
-- drm_setup_crtcs(fb_helper);
-+ if (changed) {
-+ if (fb_helper->funcs->fb_output_status_changed)
-+ fb_helper->funcs->fb_output_status_changed(fb_helper);
-+ }
-
-- return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel);
-+requeue:
-+ if (repoll) {
-+ ret = delayed_slow_work_enqueue(delayed_work, 5*HZ);
-+ if (ret)
-+ DRM_ERROR("delayed enqueue failed %d\n", ret);
-+ }
- }
--EXPORT_SYMBOL(drm_fb_helper_hotplug_event);
-+
-+static struct slow_work_ops output_status_change_ops = {
-+ .execute = output_status_change_execute,
-+};
-
-diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
-index 59a2bf8..76ace2d 100644
---- a/drivers/gpu/drm/i915/i915_dma.c
-+++ b/drivers/gpu/drm/i915/i915_dma.c
-@@ -1430,7 +1430,6 @@ static int i915_load_modeset_init(struct drm_device *dev,
- if (ret)
- goto cleanup_irq;
-
-- drm_kms_helper_poll_init(dev);
- return 0;
-
- cleanup_irq:
-diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
-index 2479be0..6350bd3 100644
---- a/drivers/gpu/drm/i915/i915_irq.c
-+++ b/drivers/gpu/drm/i915/i915_irq.c
-@@ -271,7 +271,8 @@ static void i915_hotplug_work_func(struct work_struct *work)
- }
- }
- /* Just fire off a uevent and let userspace tell us what to do */
-- drm_helper_hpd_irq_event(dev);
-+ intelfb_hotplug(dev, false);
-+ drm_sysfs_hotplug_event(dev);
- }
-
- static void i915_handle_rps_change(struct drm_device *dev)
-diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
-index 22ff384..125eded 100644
---- a/drivers/gpu/drm/i915/intel_crt.c
-+++ b/drivers/gpu/drm/i915/intel_crt.c
-@@ -584,10 +584,5 @@ void intel_crt_init(struct drm_device *dev)
-
- drm_sysfs_connector_add(connector);
-
-- if (I915_HAS_HOTPLUG(dev))
-- connector->polled = DRM_CONNECTOR_POLL_HPD;
-- else
-- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
--
- dev_priv->hotplug_supported_mask |= CRT_HOTPLUG_INT_STATUS;
- }
-diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
-index d753257..70537cf 100644
---- a/drivers/gpu/drm/i915/intel_display.c
-+++ b/drivers/gpu/drm/i915/intel_display.c
-@@ -5036,7 +5036,6 @@ intel_user_framebuffer_create(struct drm_device *dev,
-
- static const struct drm_mode_config_funcs intel_mode_funcs = {
- .fb_create = intel_user_framebuffer_create,
-- .output_poll_changed = intel_fb_output_poll_changed,
- };
-
- static struct drm_gem_object *
-@@ -5538,7 +5537,6 @@ void intel_modeset_cleanup(struct drm_device *dev)
-
- mutex_lock(&dev->struct_mutex);
-
-- drm_kms_helper_poll_fini(dev);
- intel_fbdev_fini(dev);
-
- list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
-diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
-index 49b54f0..1815df5 100644
---- a/drivers/gpu/drm/i915/intel_dp.c
-+++ b/drivers/gpu/drm/i915/intel_dp.c
-@@ -1393,8 +1393,6 @@ intel_dp_init(struct drm_device *dev, int output_reg)
- DRM_MODE_CONNECTOR_DisplayPort);
- drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs);
-
-- connector->polled = DRM_CONNECTOR_POLL_HPD;
--
- if (output_reg == DP_A)
- intel_encoder->type = INTEL_OUTPUT_EDP;
- else
-diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
-index df931f7..3230e8d 100644
---- a/drivers/gpu/drm/i915/intel_drv.h
-+++ b/drivers/gpu/drm/i915/intel_drv.h
-@@ -235,5 +235,5 @@ extern int intel_overlay_put_image(struct drm_device *dev, void *data,
- extern int intel_overlay_attrs(struct drm_device *dev, void *data,
- struct drm_file *file_priv);
-
--extern void intel_fb_output_poll_changed(struct drm_device *dev);
-+void intelfb_hotplug(struct drm_device *dev, bool polled);
- #endif /* __INTEL_DRV_H__ */
-diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
-index c3c5052..79098b3 100644
---- a/drivers/gpu/drm/i915/intel_fb.c
-+++ b/drivers/gpu/drm/i915/intel_fb.c
-@@ -211,6 +211,12 @@ static int intel_fb_find_or_create_single(struct drm_fb_helper *helper,
- return new_fb;
- }
-
-+void intelfb_hotplug(struct drm_device *dev, bool polled)
-+{
-+ drm_i915_private_t *dev_priv = dev->dev_private;
-+ drm_helper_fb_hpd_irq_event(&dev_priv->fbdev->helper);
-+}
-+
- static struct drm_fb_helper_funcs intel_fb_helper_funcs = {
- .gamma_set = intel_crtc_fb_gamma_set,
- .gamma_get = intel_crtc_fb_gamma_get,
-@@ -256,7 +262,7 @@ int intel_fbdev_init(struct drm_device *dev)
-
- ret = drm_fb_helper_init(dev, &ifbdev->helper,
- dev_priv->num_pipe,
-- INTELFB_CONN_LIMIT);
-+ INTELFB_CONN_LIMIT, false);
- if (ret) {
- kfree(ifbdev);
- return ret;
-@@ -278,9 +284,3 @@ void intel_fbdev_fini(struct drm_device *dev)
- dev_priv->fbdev = NULL;
- }
- MODULE_LICENSE("GPL and additional rights");
--
--void intel_fb_output_poll_changed(struct drm_device *dev)
--{
-- drm_i915_private_t *dev_priv = dev->dev_private;
-- drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper);
--}
-diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
-index 83bd764..acaca07 100644
---- a/drivers/gpu/drm/i915/intel_hdmi.c
-+++ b/drivers/gpu/drm/i915/intel_hdmi.c
-@@ -240,7 +240,6 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
-
- intel_encoder->type = INTEL_OUTPUT_HDMI;
-
-- connector->polled = DRM_CONNECTOR_POLL_HPD;
- connector->interlace_allowed = 0;
- connector->doublescan_allowed = 0;
- intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
-diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
-index 76993ac..1c716b5 100644
---- a/drivers/gpu/drm/i915/intel_sdvo.c
-+++ b/drivers/gpu/drm/i915/intel_sdvo.c
-@@ -2218,7 +2218,6 @@ intel_sdvo_dvi_init(struct intel_encoder *intel_encoder, int device)
- }
-
- connector = &intel_connector->base;
-- connector->polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT;
- encoder->encoder_type = DRM_MODE_ENCODER_TMDS;
- connector->connector_type = DRM_MODE_CONNECTOR_DVID;
-
-@@ -2285,7 +2284,6 @@ intel_sdvo_analog_init(struct intel_encoder *intel_encoder, int device)
- return false;
-
- connector = &intel_connector->base;
-- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
- encoder->encoder_type = DRM_MODE_ENCODER_DAC;
- connector->connector_type = DRM_MODE_CONNECTOR_VGA;
- sdvo_connector = intel_connector->dev_priv;
-diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
-index 149ed22..9a61f3c 100644
---- a/drivers/gpu/drm/nouveau/nouveau_connector.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
-@@ -846,7 +846,6 @@ nouveau_connector_create(struct drm_device *dev,
-
- switch (dcb->type) {
- case DCB_CONNECTOR_VGA:
-- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
- if (dev_priv->card_type >= NV_50) {
- drm_connector_attach_property(connector,
- dev->mode_config.scaling_mode_property,
-@@ -858,17 +857,6 @@ nouveau_connector_create(struct drm_device *dev,
- case DCB_CONNECTOR_TV_3:
- nv_connector->scaling_mode = DRM_MODE_SCALE_NONE;
- break;
-- case DCB_CONNECTOR_DP:
-- case DCB_CONNECTOR_eDP:
-- case DCB_CONNECTOR_HDMI_0:
-- case DCB_CONNECTOR_HDMI_1:
-- case DCB_CONNECTOR_DVI_I:
-- case DCB_CONNECTOR_DVI_D:
-- if (dev_priv->card_type >= NV_50)
-- connector->polled = DRM_CONNECTOR_POLL_HPD;
-- else
-- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
-- /* fall-through */
- default:
- nv_connector->scaling_mode = DRM_MODE_SCALE_FULLSCREEN;
-
-diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
-index 74e6b4e..9d7928f 100644
---- a/drivers/gpu/drm/nouveau/nouveau_display.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
-@@ -101,6 +101,5 @@ nouveau_user_framebuffer_create(struct drm_device *dev,
-
- const struct drm_mode_config_funcs nouveau_mode_config_funcs = {
- .fb_create = nouveau_user_framebuffer_create,
-- .output_poll_changed = nouveau_fbcon_output_poll_changed,
- };
-
-diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
-index c9a4a0d..0a59f96 100644
---- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
-@@ -326,11 +326,15 @@ nouveau_fbcon_find_or_create_single(struct drm_fb_helper *helper,
- return new_fb;
- }
-
--void
--nouveau_fbcon_output_poll_changed(struct drm_device *dev)
-+void nouveau_fbcon_hotplug(struct drm_device *dev)
- {
- struct drm_nouveau_private *dev_priv = dev->dev_private;
-- drm_fb_helper_hotplug_event(&dev_priv->nfbdev->helper);
-+ drm_helper_fb_hpd_irq_event(&dev_priv->nfbdev->helper);
-+}
-+
-+static void nouveau_fbcon_output_status_changed(struct drm_fb_helper *fb_helper)
-+{
-+ drm_helper_fb_hotplug_event(fb_helper, true);
- }
-
- int
-@@ -370,6 +374,7 @@ static struct drm_fb_helper_funcs nouveau_fbcon_helper_funcs = {
- .gamma_set = nouveau_fbcon_gamma_set,
- .gamma_get = nouveau_fbcon_gamma_get,
- .fb_probe = nouveau_fbcon_find_or_create_single,
-+ .fb_output_status_changed = nouveau_fbcon_output_status_changed,
- };
-
-
-@@ -387,7 +392,7 @@ int nouveau_fbcon_init(struct drm_device *dev)
- dev_priv->nfbdev = nfbdev;
- nfbdev->helper.funcs = &nouveau_fbcon_helper_funcs;
-
-- ret = drm_fb_helper_init(dev, &nfbdev->helper, 2, 4);
-+ ret = drm_fb_helper_init(dev, &nfbdev->helper, 2, 4, true);
- if (ret) {
- kfree(nfbdev);
- return ret;
-diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.h b/drivers/gpu/drm/nouveau/nouveau_fbcon.h
-index e7e1268..bf8e00d 100644
---- a/drivers/gpu/drm/nouveau/nouveau_fbcon.h
-+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.h
-@@ -58,6 +58,6 @@ void nouveau_fbcon_zfill_all(struct drm_device *dev);
- void nouveau_fbcon_save_disable_accel(struct drm_device *dev);
- void nouveau_fbcon_restore_accel(struct drm_device *dev);
-
--void nouveau_fbcon_output_poll_changed(struct drm_device *dev);
-+void nouveau_fbcon_hotplug(struct drm_device *dev);
- #endif /* __NV50_FBCON_H__ */
-
-diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
-index b02a231..4dcb976 100644
---- a/drivers/gpu/drm/nouveau/nouveau_state.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
-@@ -519,10 +519,8 @@ nouveau_card_init(struct drm_device *dev)
-
- dev_priv->init_state = NOUVEAU_CARD_INIT_DONE;
-
-- if (drm_core_check_feature(dev, DRIVER_MODESET)) {
-+ if (drm_core_check_feature(dev, DRIVER_MODESET))
- nouveau_fbcon_init(dev);
-- drm_kms_helper_poll_init(dev);
-- }
-
- return 0;
-
-@@ -844,7 +842,6 @@ int nouveau_unload(struct drm_device *dev)
- struct drm_nouveau_private *dev_priv = dev->dev_private;
-
- if (drm_core_check_feature(dev, DRIVER_MODESET)) {
-- drm_kms_helper_poll_fini(dev);
- nouveau_fbcon_fini(dev);
- if (dev_priv->card_type >= NV_50)
- nv50_display_destroy(dev);
-diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c
-index 580a5d1..e6a44af 100644
---- a/drivers/gpu/drm/nouveau/nv50_display.c
-+++ b/drivers/gpu/drm/nouveau/nv50_display.c
-@@ -980,7 +980,7 @@ nv50_display_irq_hotplug_bh(struct work_struct *work)
- if (dev_priv->chipset >= 0x90)
- nv_wr32(dev, 0xe074, nv_rd32(dev, 0xe074));
-
-- drm_helper_hpd_irq_event(dev);
-+ nouveau_fbcon_hotplug(dev);
- }
-
- void
-diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
-index 0c7ccc6..40a24c9 100644
---- a/drivers/gpu/drm/radeon/radeon_connectors.c
-+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
-@@ -1085,7 +1085,6 @@ radeon_add_atom_connector(struct drm_device *dev,
- drm_connector_attach_property(&radeon_connector->base,
- rdev->mode_info.load_detect_property,
- 1);
-- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
- break;
- case DRM_MODE_CONNECTOR_DVIA:
- drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
-@@ -1212,12 +1211,6 @@ radeon_add_atom_connector(struct drm_device *dev,
- break;
- }
-
-- if (hpd->hpd == RADEON_HPD_NONE) {
-- if (i2c_bus->valid)
-- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
-- } else
-- connector->polled = DRM_CONNECTOR_POLL_HPD;
--
- connector->display_info.subpixel_order = subpixel_order;
- drm_sysfs_connector_add(connector);
- return;
-@@ -1279,7 +1272,6 @@ radeon_add_legacy_connector(struct drm_device *dev,
- drm_connector_attach_property(&radeon_connector->base,
- rdev->mode_info.load_detect_property,
- 1);
-- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
- break;
- case DRM_MODE_CONNECTOR_DVIA:
- drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
-@@ -1348,11 +1340,6 @@ radeon_add_legacy_connector(struct drm_device *dev,
- break;
- }
-
-- if (hpd->hpd == RADEON_HPD_NONE) {
-- if (i2c_bus->valid)
-- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
-- } else
-- connector->polled = DRM_CONNECTOR_POLL_HPD;
- connector->display_info.subpixel_order = subpixel_order;
- drm_sysfs_connector_add(connector);
- return;
-diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
-index c73444a..ed756be 100644
---- a/drivers/gpu/drm/radeon/radeon_display.c
-+++ b/drivers/gpu/drm/radeon/radeon_display.c
-@@ -887,15 +887,8 @@ radeon_user_framebuffer_create(struct drm_device *dev,
- return &radeon_fb->base;
- }
-
--static void radeon_output_poll_changed(struct drm_device *dev)
--{
-- struct radeon_device *rdev = dev->dev_private;
-- radeon_fb_output_poll_changed(rdev);
--}
--
- static const struct drm_mode_config_funcs radeon_mode_funcs = {
- .fb_create = radeon_user_framebuffer_create,
-- .output_poll_changed = radeon_output_poll_changed
- };
-
- struct drm_prop_enum_list {
-@@ -1044,8 +1037,6 @@ int radeon_modeset_init(struct radeon_device *rdev)
- radeon_pm_init(rdev);
-
- radeon_fbdev_init(rdev);
-- drm_kms_helper_poll_init(rdev->ddev);
--
- return 0;
- }
-
-@@ -1058,7 +1049,6 @@ void radeon_modeset_fini(struct radeon_device *rdev)
- radeon_pm_fini(rdev);
-
- if (rdev->mode_info.mode_config_initialized) {
-- drm_kms_helper_poll_fini(rdev->ddev);
- radeon_hpd_fini(rdev);
- drm_mode_config_cleanup(rdev->ddev);
- rdev->mode_info.mode_config_initialized = false;
-diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c
-index dc1634b..7dc38f6 100644
---- a/drivers/gpu/drm/radeon/radeon_fb.c
-+++ b/drivers/gpu/drm/radeon/radeon_fb.c
-@@ -316,9 +316,16 @@ int radeon_parse_options(char *options)
- return 0;
- }
-
--void radeon_fb_output_poll_changed(struct radeon_device *rdev)
-+void radeonfb_hotplug(struct drm_device *dev, bool polled)
- {
-- drm_fb_helper_hotplug_event(&rdev->mode_info.rfbdev->helper);
-+ struct radeon_device *rdev = dev->dev_private;
-+
-+ drm_helper_fb_hpd_irq_event(&rdev->mode_info.rfbdev->helper);
-+}
-+
-+static void radeon_fb_output_status_changed(struct drm_fb_helper *fb_helper)
-+{
-+ drm_helper_fb_hotplug_event(fb_helper, true);
- }
-
- static int radeon_fbdev_destroy(struct drm_device *dev, struct radeon_fbdev *rfbdev)
-@@ -357,6 +364,7 @@ static struct drm_fb_helper_funcs radeon_fb_helper_funcs = {
- .gamma_set = radeon_crtc_fb_gamma_set,
- .gamma_get = radeon_crtc_fb_gamma_get,
- .fb_probe = radeon_fb_find_or_create_single,
-+ .fb_output_status_changed = radeon_fb_output_status_changed,
- };
-
- int radeon_fbdev_init(struct radeon_device *rdev)
-@@ -379,7 +387,7 @@ int radeon_fbdev_init(struct radeon_device *rdev)
-
- ret = drm_fb_helper_init(rdev->ddev, &rfbdev->helper,
- rdev->num_crtc,
-- RADEONFB_CONN_LIMIT);
-+ RADEONFB_CONN_LIMIT, true);
- if (ret) {
- kfree(rfbdev);
- return ret;
-@@ -388,6 +396,7 @@ int radeon_fbdev_init(struct radeon_device *rdev)
- drm_fb_helper_single_add_all_connectors(&rfbdev->helper);
- drm_fb_helper_initial_config(&rfbdev->helper, bpp_sel);
- return 0;
-+
- }
-
- void radeon_fbdev_fini(struct radeon_device *rdev)
-diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
-index 059bfa4..b0178de 100644
---- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
-+++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
-@@ -26,7 +26,6 @@
- * Jerome Glisse
- */
- #include "drmP.h"
--#include "drm_crtc_helper.h"
- #include "radeon_drm.h"
- #include "radeon_reg.h"
- #include "radeon.h"
-@@ -56,7 +55,9 @@ static void radeon_hotplug_work_func(struct work_struct *work)
- radeon_connector_hotplug(connector);
- }
- /* Just fire off a uevent and let userspace tell us what to do */
-- drm_helper_hpd_irq_event(dev);
-+ radeonfb_hotplug(dev, false);
-+
-+ drm_sysfs_hotplug_event(dev);
- }
-
- void radeon_driver_irq_preinstall_kms(struct drm_device *dev)
-diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
-index 67358ba..fdd1611 100644
---- a/drivers/gpu/drm/radeon/radeon_mode.h
-+++ b/drivers/gpu/drm/radeon/radeon_mode.h
-@@ -588,6 +588,5 @@ void radeon_fbdev_fini(struct radeon_device *rdev);
- void radeon_fbdev_set_suspend(struct radeon_device *rdev, int state);
- int radeon_fbdev_total_size(struct radeon_device *rdev);
- bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj);
--
--void radeon_fb_output_poll_changed(struct radeon_device *rdev);
-+void radeonfb_hotplug(struct drm_device *dev, bool polled);
- #endif
-diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
-index 93a1a31..a7148d2 100644
---- a/include/drm/drm_crtc.h
-+++ b/include/drm/drm_crtc.h
-@@ -31,7 +31,6 @@
- #include <linux/idr.h>
-
- #include <linux/fb.h>
--#include <linux/slow-work.h>
-
- struct drm_device;
- struct drm_mode_set;
-@@ -461,15 +460,6 @@ enum drm_connector_force {
- DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */
- };
-
--/* should we poll this connector for connects and disconnects */
--/* hot plug detectable */
--#define DRM_CONNECTOR_POLL_HPD (1 << 0)
--/* poll for connections */
--#define DRM_CONNECTOR_POLL_CONNECT (1 << 1)
--/* can cleanly poll for disconnections without flickering the screen */
--/* DACs should rarely do this without a lot of testing */
--#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)
--
- /**
- * drm_connector - central DRM connector control structure
- * @crtc: CRTC this connector is currently connected to, NULL if none
-@@ -514,8 +504,6 @@ struct drm_connector {
- u32 property_ids[DRM_CONNECTOR_MAX_PROPERTY];
- uint64_t property_values[DRM_CONNECTOR_MAX_PROPERTY];
-
-- uint8_t polled; /* DRM_CONNECTOR_POLL_* */
--
- /* requested DPMS state */
- int dpms;
-
-@@ -555,7 +543,6 @@ struct drm_mode_set {
- */
- struct drm_mode_config_funcs {
- struct drm_framebuffer *(*fb_create)(struct drm_device *dev, struct drm_file *file_priv, struct drm_mode_fb_cmd *mode_cmd);
-- void (*output_poll_changed)(struct drm_device *dev);
- };
-
- struct drm_mode_group {
-@@ -593,10 +580,6 @@ struct drm_mode_config {
- struct drm_mode_config_funcs *funcs;
- resource_size_t fb_base;
-
-- /* output poll support */
-- bool poll_enabled;
-- struct delayed_slow_work output_poll_slow_work;
--
- /* pointers to standard properties */
- struct list_head property_blob_list;
- struct drm_property *edid_property;
-diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h
-index 1121f77..b1fa0f8 100644
---- a/include/drm/drm_crtc_helper.h
-+++ b/include/drm/drm_crtc_helper.h
-@@ -127,10 +127,4 @@ static inline void drm_connector_helper_add(struct drm_connector *connector,
- }
-
- extern int drm_helper_resume_force_mode(struct drm_device *dev);
--extern void drm_kms_helper_poll_init(struct drm_device *dev);
--extern void drm_kms_helper_poll_fini(struct drm_device *dev);
--extern void drm_helper_hpd_irq_event(struct drm_device *dev);
--
--extern void drm_kms_helper_poll_disable(struct drm_device *dev);
--extern void drm_kms_helper_poll_enable(struct drm_device *dev);
- #endif
-diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
-index f0a6afc..9b55a94 100644
---- a/include/drm/drm_fb_helper.h
-+++ b/include/drm/drm_fb_helper.h
-@@ -30,6 +30,8 @@
- #ifndef DRM_FB_HELPER_H
- #define DRM_FB_HELPER_H
-
-+#include <linux/slow-work.h>
-+
- struct drm_fb_helper;
-
- struct drm_fb_helper_crtc {
-@@ -69,6 +71,9 @@ struct drm_fb_helper_funcs {
-
- int (*fb_probe)(struct drm_fb_helper *helper,
- struct drm_fb_helper_surface_size *sizes);
-+
-+ void (*fb_output_status_changed)(struct drm_fb_helper *helper);
-+
- };
-
- struct drm_fb_helper_connector {
-@@ -90,6 +95,8 @@ struct drm_fb_helper {
- u32 pseudo_palette[17];
- struct list_head kernel_fb_list;
-
-+ struct delayed_slow_work output_status_change_slow_work;
-+ bool poll_enabled;
- /* we got a hotplug but fbdev wasn't running the console
- delay until next set_par */
- bool delayed_hotplug;
-@@ -100,7 +107,7 @@ int drm_fb_helper_single_fb_probe(struct drm_fb_helper *helper,
-
- int drm_fb_helper_init(struct drm_device *dev,
- struct drm_fb_helper *helper, int crtc_count,
-- int max_conn);
-+ int max_conn, bool polled);
- void drm_fb_helper_fini(struct drm_fb_helper *helper);
- int drm_fb_helper_blank(int blank, struct fb_info *info);
- int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
-@@ -123,8 +130,10 @@ void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
-
- int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info);
-
--bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);
-+bool drm_helper_fb_hotplug_event(struct drm_fb_helper *fb_helper,
-+ bool polled);
- bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel);
- int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper);
-
-+void drm_helper_fb_hpd_irq_event(struct drm_fb_helper *fb_helper);
- #endif
---
-1.7.0.1
-
diff --git a/freed-ora/current/f14/kernel.spec b/freed-ora/current/f14/kernel.spec
index 65bbe0a75..f99810340 100644
--- a/freed-ora/current/f14/kernel.spec
+++ b/freed-ora/current/f14/kernel.spec
@@ -48,7 +48,7 @@ Summary: The Linux kernel
# reset this by hand to 1 (or to 0 and then use rpmdev-bumpspec).
# scripts/rebase.sh should be made to do that for you, actually.
#
-%global baserelease 50
+%global baserelease 51
%global fedora_build %{baserelease}
# base_sublevel is the kernel version we're starting with and patching
@@ -681,8 +681,7 @@ Patch800: linux-2.6-crash-driver.patch
Patch1555: fix_xen_guest_on_old_EC2.patch
# DRM
-Patch1801: drm-revert-drm-fbdev-rework-output-polling-to-be-back-in-core.patch
-Patch1802: revert-drm-kms-toggle-poll-around-switcheroo.patch
+Patch1801: drm-polling-fixes.patch
# drm fixes nouveau depends on
Patch1805: drm-simplify-i2c-config.patch
Patch1806: drm-sil164-module.patch
@@ -694,6 +693,7 @@ Patch1811: drm-nouveau-race-fix.patch
Patch1812: drm-nouveau-nva3-noaccel.patch
Patch1813: drm-nouveau-nv86-bug.patch
Patch1814: drm-nouveau-nv50-crtc-update-delay.patch
+Patch1815: drm-nouveau-connector-fix.patch
Patch1819: drm-intel-big-hammer.patch
# intel drm is all merged upstream
Patch1824: drm-intel-next.patch
@@ -1373,9 +1373,7 @@ ApplyPatch linux-2.6-e1000-ich9-montevina.patch
# Assorted Virt Fixes
ApplyPatch fix_xen_guest_on_old_EC2.patch
-#ApplyPatch drm-revert-drm-fbdev-rework-output-polling-to-be-back-in-core.patch
-#ApplyPatch revert-drm-kms-toggle-poll-around-switcheroo.patch
-
+ApplyPatch drm-polling-fixes.patch
ApplyPatch drm-simplify-i2c-config.patch
ApplyPatch drm-sil164-module.patch
ApplyPatch drm-i2c-ch7006-fix.patch
@@ -1386,6 +1384,7 @@ ApplyPatch drm-nouveau-race-fix.patch
ApplyPatch drm-nouveau-nva3-noaccel.patch
ApplyPatch drm-nouveau-nv86-bug.patch
ApplyPatch drm-nouveau-nv50-crtc-update-delay.patch
+ApplyPatch drm-nouveau-connector-fix.patch
ApplyPatch drm-intel-big-hammer.patch
ApplyOptionalPatch drm-intel-next.patch
@@ -2093,6 +2092,9 @@ fi
# and build.
%changelog
+* Mon Nov 08 2010 Dave Airlie <airlied@redhat.com> - 2.6.35.6-51
+- Backport polling fixes + radeon hang fixes from upstream
+
* Tue Nov 02 2010 Ben Skeggs <bskeggs@redhat.com> 2.6.35.6-50
- nouveau: add potential workaround for NV86 hardware quirk
- fix issue that occurs in certain dual-head configurations (rhbz#641524)
diff --git a/freed-ora/current/f14/revert-drm-kms-toggle-poll-around-switcheroo.patch b/freed-ora/current/f14/revert-drm-kms-toggle-poll-around-switcheroo.patch
deleted file mode 100644
index f83fc2fdf..000000000
--- a/freed-ora/current/f14/revert-drm-kms-toggle-poll-around-switcheroo.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From 69b711c0c5e3d9cb3a5b9f741fb4cdc96b5739cb Mon Sep 17 00:00:00 2001
-From: Kyle McMartin <kyle@dreadnought.i.jkkm.org>
-Subject: Revert "drm/kms: disable/enable poll around switcheroo on/off"
-
-This reverts commit fbf81762e385d3d45acad057b654d56972acf58c, mostly.
----
- drivers/gpu/drm/i915/i915_dma.c | 4 +---
- drivers/gpu/drm/nouveau/nouveau_state.c | 3 ---
- drivers/gpu/drm/radeon/radeon_device.c | 2 --
-
-diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
-index 59a2bf8..2df3286 100644
---- a/drivers/gpu/drm/i915/i915_dma.c
-+++ b/drivers/gpu/drm/i915/i915_dma.c
-@@ -1320,14 +1320,12 @@ static void i915_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_
- struct drm_device *dev = pci_get_drvdata(pdev);
- pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
- if (state == VGA_SWITCHEROO_ON) {
-- printk(KERN_INFO "i915: switched on\n");
-+ printk(KERN_INFO "i915: switched off\n");
- /* i915 resume handler doesn't set to D0 */
- pci_set_power_state(dev->pdev, PCI_D0);
- i915_resume(dev);
-- drm_kms_helper_poll_enable(dev);
- } else {
- printk(KERN_ERR "i915: switched off\n");
-- drm_kms_helper_poll_disable(dev);
- i915_suspend(dev, pmm);
- }
- }
-diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
-index b02a231..0c28266 100644
---- a/drivers/gpu/drm/nouveau/nouveau_state.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
-@@ -376,15 +376,12 @@ out_err:
- static void nouveau_switcheroo_set_state(struct pci_dev *pdev,
- enum vga_switcheroo_state state)
- {
-- struct drm_device *dev = pci_get_drvdata(pdev);
- pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
- if (state == VGA_SWITCHEROO_ON) {
- printk(KERN_ERR "VGA switcheroo: switched nouveau on\n");
- nouveau_pci_resume(pdev);
-- drm_kms_helper_poll_enable(dev);
- } else {
- printk(KERN_ERR "VGA switcheroo: switched nouveau off\n");
-- drm_kms_helper_poll_disable(dev);
- nouveau_pci_suspend(pdev, pmm);
- }
- }
-diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
-index f10faed..225a9f2 100644
---- a/drivers/gpu/drm/radeon/radeon_device.c
-+++ b/drivers/gpu/drm/radeon/radeon_device.c
-@@ -546,10 +546,8 @@ static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero
- /* don't suspend or resume card normally */
- rdev->powered_down = false;
- radeon_resume_kms(dev);
-- drm_kms_helper_poll_enable(dev);
- } else {
- printk(KERN_INFO "radeon: switched off\n");
-- drm_kms_helper_poll_disable(dev);
- radeon_suspend_kms(dev, pmm);
- /* don't suspend or resume card normally */
- rdev->powered_down = true;
OpenPOWER on IntegriCloud