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:
Ben Hutchings 2012-11-17 07:03:39 +00:00
parent b48935ba3c
commit dd9f677122
4 changed files with 92 additions and 2 deletions

5
debian/changelog vendored
View File

@ -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)

View File

@ -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
##

View File

@ -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;

View File

@ -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