radeon: Firmware is required for DRM and KMS on R600 onward, but not for KMS on earlier chips (Closes: #697229)
svn path=/dists/sid/linux/; revision=19720
This commit is contained in:
parent
833435d74c
commit
a430b5558a
|
@ -64,6 +64,8 @@ linux (3.2.36-1) UNRELEASED; urgency=low
|
|||
hid-a4tech, hid-cypress, hid-ezkey (Closes: #697035), hid-kensington,
|
||||
hid-keytouch, hid-kye, hid-multitouch, hid-ortek, hid-primax,
|
||||
hid-quanta, hid-samsung, hid-speedlink
|
||||
* radeon: Firmware is required for DRM and KMS on R600 onward, but not
|
||||
for KMS on earlier chips (Closes: #697229)
|
||||
|
||||
[ Aurelien Jarno ]
|
||||
* [armhf/vexpress] Add kernel udebs.
|
||||
|
|
95
debian/patches/debian/radeon-firmware-is-required-for-drm-and-kms-on-r600-onward.patch
vendored
Normal file
95
debian/patches/debian/radeon-firmware-is-required-for-drm-and-kms-on-r600-onward.patch
vendored
Normal file
|
@ -0,0 +1,95 @@
|
|||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Subject: radeon: Firmware is required for DRM and KMS on R600 onward
|
||||
Date: Tue, 08 Jan 2013 03:25:52 +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
|
||||
Bug-Debian: http://bugs.debian.org/697229
|
||||
|
||||
radeon requires firmware/microcode for the GPU in 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, but with both KMS
|
||||
and GPU acceleration disabled radeon is not doing anything useful!
|
||||
|
||||
Therefore, perform a basic check for the existence of
|
||||
/lib/firmware/radeon when a device is probed, and abort if it is
|
||||
missing, except for the pre-R600 KMS case.
|
||||
|
||||
---
|
||||
--- 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>
|
||||
|
||||
|
||||
/*
|
||||
@@ -257,6 +259,35 @@ static struct drm_driver driver_old = {
|
||||
|
||||
static struct drm_driver kms_driver;
|
||||
|
||||
+/* 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 __devinit 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 __devinit
|
||||
+radeon_ums_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
+{
|
||||
+ if (!radeon_firmware_installed()) {
|
||||
+ DRM_ERROR("radeon DRM requires firmware-linux-nonfree.\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void radeon_kick_out_firmware_fb(struct pci_dev *pdev)
|
||||
{
|
||||
struct apertures_struct *ap;
|
||||
@@ -276,6 +307,12 @@ static void radeon_kick_out_firmware_fb(
|
||||
static int __devinit
|
||||
radeon_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
+ if ((ent->driver_data & RADEON_FAMILY_MASK) >= CHIP_R600 &&
|
||||
+ !radeon_firmware_installed()) {
|
||||
+ DRM_ERROR("radeon kernel modesetting for R600 or later requires firmware-linux-nonfree.\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
/* Get rid of things like offb */
|
||||
radeon_kick_out_firmware_fb(pdev);
|
||||
|
||||
@@ -367,6 +404,7 @@ static struct pci_driver *pdriver;
|
||||
static struct pci_driver radeon_pci_driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.id_table = pciidlist,
|
||||
+ .probe = radeon_ums_pci_probe,
|
||||
};
|
||||
|
||||
static struct pci_driver radeon_kms_pci_driver = {
|
|
@ -1,83 +0,0 @@
|
|||
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;
|
|
@ -421,7 +421,7 @@ 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
|
||||
debian/radeon-firmware-is-required-for-drm-and-kms-on-r600-onward.patch
|
||||
debian/ALSA-avoid-ABI-change-in-3.2.34.patch
|
||||
debian/rtnetlink-avoid-ABI-change-in-3.2.34.patch
|
||||
debian/mm-avoid-ABI-change-in-3.2.33.patch
|
||||
|
|
Loading…
Reference in New Issue