From dd9f67712257225a1e2b6ceea4d6ab98a691d08f Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Sat, 17 Nov 2012 07:03:39 +0000 Subject: [PATCH] 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 --- debian/changelog | 5 +- debian/config/kernelarch-x86/config | 5 ++ .../radeon-no-modeset-without-firmware.patch | 83 +++++++++++++++++++ debian/patches/series | 1 + 4 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 debian/patches/debian/radeon-no-modeset-without-firmware.patch diff --git a/debian/changelog b/debian/changelog index 639191432..8f974d824 100644 --- a/debian/changelog +++ b/debian/changelog @@ -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) diff --git a/debian/config/kernelarch-x86/config b/debian/config/kernelarch-x86/config index c8faeecb2..9ba707bc2 100644 --- a/debian/config/kernelarch-x86/config +++ b/debian/config/kernelarch-x86/config @@ -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 ## diff --git a/debian/patches/debian/radeon-no-modeset-without-firmware.patch b/debian/patches/debian/radeon-no-modeset-without-firmware.patch new file mode 100644 index 000000000..fde0a05b8 --- /dev/null +++ b/debian/patches/debian/radeon-no-modeset-without-firmware.patch @@ -0,0 +1,83 @@ +From: Ben Hutchings +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 + #include ++#include ++#include + + + /* +@@ -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; diff --git a/debian/patches/series b/debian/patches/series index db9262141..6b4ddf061 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -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