radeon: Re-enable KMS by default on x86; add a load-time check for firmware
KMS is still generally broken on !x86 and particularly PowerPC (#628972), so I have no idea why it was enabled by default for all architectures. The load-time check is a gross hack, but I cannot see any more reliable solution that doesn't involve major changes to both DRM and radeon. svn path=/dists/sid/linux/; revision=19506
This commit is contained in:
parent
b48935ba3c
commit
dd9f677122
|
@ -43,8 +43,9 @@ linux (3.2.33-1) UNRELEASED; urgency=low
|
|||
* [x86] asus-laptop: Do not call HWRS on init (Closes: #692436)
|
||||
* [x86] drm/i915: Only kick out vesafb if we takeover the fbcon with KMS
|
||||
(Closes: #686284)
|
||||
* radeon: Disable DRM_RADEON_KMS, as this does not work on most chips
|
||||
without firmware (Closes: #607194)
|
||||
* [!x86] radeon: Disable DRM_RADEON_KMS, as this is still not expected to
|
||||
work
|
||||
* radeon: Disable KMS earlier if firmware is not installed (Closes: #607194)
|
||||
|
||||
[ Ian Campbell ]
|
||||
* [xen] add support for microcode updating. (Closes: #693053)
|
||||
|
|
|
@ -423,6 +423,11 @@ CONFIG_DRM_NOUVEAU_BACKLIGHT=y
|
|||
CONFIG_DRM_I2C_CH7006=m
|
||||
CONFIG_DRM_I2C_SIL164=m
|
||||
|
||||
##
|
||||
## file: drivers/gpu/drm/radeon/Kconfig
|
||||
##
|
||||
CONFIG_DRM_RADEON_KMS=y
|
||||
|
||||
##
|
||||
## file: drivers/gpu/stub/Kconfig
|
||||
##
|
||||
|
|
|
@ -0,0 +1,83 @@
|
|||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Subject: radeon: No MODESET without firmware
|
||||
Date: Sat, 17 Nov 2012 05:28:53 +0000
|
||||
Bug-Debian: http://bugs.debian.org/607194
|
||||
Bug-Debian: http://bugs.debian.org/607471
|
||||
Bug-Debian: http://bugs.debian.org/610851
|
||||
Bug-Debian: http://bugs.debian.org/627497
|
||||
Bug-Debian: http://bugs.debian.org/632212
|
||||
Bug-Debian: http://bugs.debian.org/637943
|
||||
Bug-Debian: http://bugs.debian.org/649448
|
||||
|
||||
radeon requires firmware/microcode for the GPU all chips, but for
|
||||
newer chips (apparently R600 'Evergreen' onward) it also expects
|
||||
firmware for the memory controller and other sub-blocks.
|
||||
|
||||
radeon attempts to gracefully fall back and disable some features if
|
||||
the firmware is not available, but becomes unstable - the framebuffer
|
||||
and/or system memory may be corrupted, or the display may stay black.
|
||||
This does not seem to happen if KMS is disabled.
|
||||
|
||||
Unfortunately, it is not possible to properly disable KMS once the
|
||||
missing firmware is discovered. Each driver registers with the DRM
|
||||
core as having certain capabilities such as DRIVER_MODESET (KMS) and
|
||||
the DRM does not allow for individual devices to have different
|
||||
capabilities!
|
||||
|
||||
Therefore, perform a basic check for the existence of
|
||||
/lib/firmware/radeon when the driver is loaded, and disable KMS
|
||||
if it is missing. I apologise for this gross hack, but I cannot
|
||||
see any more reliable solution that doesn't involve major changes
|
||||
to both DRM and radeon.
|
||||
|
||||
---
|
||||
--- a/drivers/gpu/drm/radeon/radeon_drv.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
|
||||
@@ -37,6 +37,8 @@
|
||||
#include "drm_pciids.h"
|
||||
#include <linux/console.h>
|
||||
#include <linux/module.h>
|
||||
+#include <linux/namei.h>
|
||||
+#include <linux/path.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -378,6 +380,24 @@ static struct pci_driver radeon_kms_pci_
|
||||
.resume = radeon_pci_resume,
|
||||
};
|
||||
|
||||
+/* Test that /lib/firmware/radeon is a directory (or symlink to a
|
||||
+ * directory). We could try to match the udev search path, but let's
|
||||
+ * assume people take the easy route and install
|
||||
+ * firmware-linux-nonfree.
|
||||
+ */
|
||||
+static bool __init radeon_firmware_installed(void)
|
||||
+{
|
||||
+ struct path path;
|
||||
+
|
||||
+ if (kern_path("/lib/firmware/radeon", LOOKUP_DIRECTORY | LOOKUP_FOLLOW,
|
||||
+ &path) == 0) {
|
||||
+ path_put(&path);
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
static int __init radeon_init(void)
|
||||
{
|
||||
driver = &driver_old;
|
||||
@@ -402,6 +422,13 @@ static int __init radeon_init(void)
|
||||
radeon_modeset = 0;
|
||||
#endif
|
||||
}
|
||||
+ /* We have to commit to KMS before we've seen any devices, so
|
||||
+ * make a basic check to reduce the risk of failure later.
|
||||
+ */
|
||||
+ if (radeon_modeset == 1 && !radeon_firmware_installed()) {
|
||||
+ DRM_INFO("radeon kernel modesetting disabled; it requires firmware-linux-nonfree.\n");
|
||||
+ radeon_modeset = 0;
|
||||
+ }
|
||||
if (radeon_modeset == 1) {
|
||||
DRM_INFO("radeon kernel modesetting enabled.\n");
|
||||
driver = &kms_driver;
|
|
@ -408,3 +408,4 @@ bugfix/x86/asus-laptop-Do-not-call-HWRS-on-init.patch
|
|||
bugfix/x86/drm-i915-Only-kick-out-vesafb-if-we-takeover-the-fbc.patch
|
||||
|
||||
features/all/xen/microcode.patch
|
||||
debian/radeon-no-modeset-without-firmware.patch
|
||||
|
|
Loading…
Reference in New Issue