diff options
author | Alexandre Oliva <lxoliva@fsfla.org> | 2010-11-10 10:12:31 +0000 |
---|---|---|
committer | Alexandre Oliva <lxoliva@fsfla.org> | 2010-11-10 10:12:31 +0000 |
commit | 37dd368ae79d59bac84c4b89df7d9e484c8fe950 (patch) | |
tree | 62d0e299cec25a495785cd30a894aaeab44d12e2 /freed-ora/current/f14 | |
parent | 617b487868b10be50a2a2d843c9d66b343e572fa (diff) | |
download | linux-libre-raptor-37dd368ae79d59bac84c4b89df7d9e484c8fe950.tar.gz linux-libre-raptor-37dd368ae79d59bac84c4b89df7d9e484c8fe950.zip |
2.6.35.6-51.fc14
Diffstat (limited to 'freed-ora/current/f14')
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; |