rpms/kernel/devel linux-2.6-acpi-video-didl-intel-outputs.patch, NONE, 1.1 kernel.spec, 1.1417, 1.1418 linux-2.6-acpi-video-dos.patch, 1.2, 1.3
Matthew Garrett
mjg59 at fedoraproject.org
Wed Mar 11 23:10:02 UTC 2009
- Previous message (by thread): rpms/hunspell-ca/devel .cvsignore, 1.12, 1.13 hunspell-ca.spec, 1.15, 1.16 sources, 1.12, 1.13
- Next message (by thread): rpms/kernel/devel patch-2.6.29-rc7-git5.bz2.sign, NONE, 1.1 .cvsignore, 1.1031, 1.1032 kernel.spec, 1.1418, 1.1419 sources, 1.993, 1.994 upstream, 1.904, 1.905 ingo-fix-atom-failures.patch, 1.1, NONE patch-2.6.29-rc7-git2.bz2.sign, 1.1, NONE patch-2.6.29-rc7-git4.bz2.sign, 1.1, NONE
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Author: mjg59
Update of /cvs/pkgs/rpms/kernel/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv311
Modified Files:
kernel.spec linux-2.6-acpi-video-dos.patch
Added Files:
linux-2.6-acpi-video-didl-intel-outputs.patch
Log Message:
* Wed Mar 11 2009 Matthew Garrett <mjg at redhat.com>
- linux-2.6-acpi-video-didl-intel-outputs.patch
Initialise the DIDL field in Intel opregion before bringing up ACPI video
- linux-2.6-acpi-video-dos.patch
Reenable display switch support now that above patch is included
linux-2.6-acpi-video-didl-intel-outputs.patch:
--- NEW FILE linux-2.6-acpi-video-didl-intel-outputs.patch ---
commit a0fdbca7264432e073f5cdde8bebbcba96165337
Author: Matthew Garrett <mjg at redhat.com>
Date: Wed Mar 11 16:39:36 2009 +0000
[ACPI] Populate DIDL before registering ACPI video device on Intel
Intel graphics hardware that implements the ACPI IGD OpRegion spec requires
that the list of display devices be populated before any ACPI video methods
are called. Detect when this is the case and defer registration until the
opregion code calls it. Fixes crashes on HP laptops as seen in kernel
bugzilla #11259.
Signed-off-by: Matthew Garrett <mjg at redhat.com>
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
index bb5ed05..64e987c 100644
--- a/drivers/acpi/video.c
+++ b/drivers/acpi/video.c
@@ -37,6 +37,8 @@
#include <linux/thermal.h>
#include <linux/video_output.h>
#include <linux/sort.h>
+#include <linux/pci.h>
+#include <linux/pci_ids.h>
#include <asm/uaccess.h>
#include <acpi/acpi_bus.h>
@@ -2124,7 +2126,27 @@ static int acpi_video_bus_remove(struct acpi_device *device, int type)
return 0;
}
-static int __init acpi_video_init(void)
+static int __init intel_opregion_present(void)
+{
+#if defined(CONFIG_DRM_I915) || defined(CONFIG_DRM_I915_MODULE)
+ struct pci_dev *dev = NULL;
+ u32 address;
+
+ for_each_pci_dev(dev) {
+ if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
+ continue;
+ if (dev->vendor != PCI_VENDOR_ID_INTEL)
+ continue;
+ pci_read_config_dword(dev, 0xfc, &address);
+ if (!address)
+ continue;
+ return 1;
+ }
+#endif
+ return 0;
+}
+
+int acpi_video_register(void)
{
int result = 0;
@@ -2141,6 +2163,22 @@ static int __init acpi_video_init(void)
return 0;
}
+EXPORT_SYMBOL(acpi_video_register);
+
+/*
+ * This is kind of nasty. Hardware using Intel chipsets may require
+ * the video opregion code to be run first in order to initialise
+ * state before any ACPI video calls are made. To handle this we defer
+ * registration of the video class until the opregion code has run.
+ */
+
+static int __init acpi_video_init(void)
+{
+ if (intel_opregion_present())
+ return 0;
+
+ return acpi_video_register();
+}
static void __exit acpi_video_exit(void)
{
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 6dab63b..70a9904 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1144,8 +1144,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
if (!IS_I945G(dev) && !IS_I945GM(dev))
pci_enable_msi(dev->pdev);
- intel_opregion_init(dev);
-
spin_lock_init(&dev_priv->user_irq_lock);
dev_priv->user_irq_refcount = 0;
@@ -1164,6 +1162,9 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
}
}
+ /* Must be done after probing outputs */
+ intel_opregion_init(dev);
+
return 0;
out_iomapfree:
diff --git a/drivers/gpu/drm/i915/i915_opregion.c b/drivers/gpu/drm/i915/i915_opregion.c
index ff01283..60b746f 100644
--- a/drivers/gpu/drm/i915/i915_opregion.c
+++ b/drivers/gpu/drm/i915/i915_opregion.c
@@ -26,6 +26,7 @@
*/
#include <linux/acpi.h>
+#include <acpi/video.h>
#include "drmP.h"
#include "i915_drm.h"
@@ -136,6 +137,12 @@ struct opregion_asle {
#define ASLE_CBLV_VALID (1<<31)
+#define ACPI_OTHER_OUTPUT (0<<8)
+#define ACPI_VGA_OUTPUT (1<<8)
+#define ACPI_TV_OUTPUT (2<<8)
+#define ACPI_DIGITAL_OUTPUT (3<<8)
+#define ACPI_LVDS_OUTPUT (4<<8)
+
static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
{
struct drm_i915_private *dev_priv = dev->dev_private;
@@ -282,6 +289,57 @@ static struct notifier_block intel_opregion_notifier = {
.notifier_call = intel_opregion_video_event,
};
+/*
+ * Initialise the DIDL field in opregion. This passes a list of devices to
+ * the firmware. Values are defined by section B.4.2 of the ACPI specification
+ * (version 3)
+ */
+
+static void intel_didl_outputs(struct drm_device *dev)
+{
+ struct drm_i915_private *dev_priv = dev->dev_private;
+ struct intel_opregion *opregion = &dev_priv->opregion;
+ struct drm_connector *connector;
+ int i = 0;
+
+ list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+ int output_type = ACPI_OTHER_OUTPUT;
+ if (i >= 8) {
+ dev_printk (KERN_ERR, &dev->pdev->dev,
+ "More than 8 outputs detected\n");
+ return;
+ }
+ switch (connector->connector_type) {
+ case DRM_MODE_CONNECTOR_VGA:
+ case DRM_MODE_CONNECTOR_DVIA:
+ output_type = ACPI_VGA_OUTPUT;
+ break;
+ case DRM_MODE_CONNECTOR_Composite:
+ case DRM_MODE_CONNECTOR_SVIDEO:
+ case DRM_MODE_CONNECTOR_Component:
+ case DRM_MODE_CONNECTOR_9PinDIN:
+ output_type = ACPI_TV_OUTPUT;
+ break;
+ case DRM_MODE_CONNECTOR_DVII:
+ case DRM_MODE_CONNECTOR_DVID:
+ case DRM_MODE_CONNECTOR_DisplayPort:
+ case DRM_MODE_CONNECTOR_HDMIA:
+ case DRM_MODE_CONNECTOR_HDMIB:
+ output_type = ACPI_DIGITAL_OUTPUT;
+ break;
+ case DRM_MODE_CONNECTOR_LVDS:
+ output_type = ACPI_LVDS_OUTPUT;
+ break;
+ }
+ opregion->acpi->didl[i] |= (1<<31) | output_type | i;
+ i++;
+ }
+
+ /* If fewer than 8 outputs, the list must be null terminated */
+ if (i < 8)
+ opregion->acpi->didl[i] = 0;
+}
+
int intel_opregion_init(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
@@ -312,6 +370,10 @@ int intel_opregion_init(struct drm_device *dev)
if (mboxes & MBOX_ACPI) {
DRM_DEBUG("Public ACPI methods supported\n");
opregion->acpi = base + OPREGION_ACPI_OFFSET;
+ if (drm_core_check_feature(dev, DRIVER_MODESET)) {
+ intel_didl_outputs(dev);
+ acpi_video_register();
+ }
} else {
DRM_DEBUG("Public ACPI methods not supported\n");
err = -ENOTSUPP;
diff --git a/include/acpi/video.h b/include/acpi/video.h
new file mode 100644
index 0000000..f0275bb
--- /dev/null
+++ b/include/acpi/video.h
@@ -0,0 +1,11 @@
+#ifndef __ACPI_VIDEO_H
+#define __ACPI_VIDEO_H
+
+#if (defined CONFIG_ACPI_VIDEO || defined CONFIG_ACPI_VIDEO_MODULE)
+extern int acpi_video_register(void);
+#else
+static inline int acpi_video_register(void) { return 0; }
+#endif
+
+#endif
+
Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.1417
retrieving revision 1.1418
diff -u -r1.1417 -r1.1418
--- kernel.spec 11 Mar 2009 22:45:01 -0000 1.1417
+++ kernel.spec 11 Mar 2009 23:09:31 -0000 1.1418
@@ -624,6 +624,7 @@
Patch391: linux-2.6-acpi-video-dos.patch
Patch392: linux-2.6-acpi-strict-resources.patch
Patch393: linux-2.6-hwmon-atk0110.patch
+Patch394: linux-2.6-acpi-video-didl-intel-outputs.patch
Patch400: linux-2.6-scsi-cpqarray-set-master.patch
Patch450: linux-2.6-input-kill-stupid-messages.patch
Patch451: linux-2.6-input-fix-toshiba-hotkeys.patch
@@ -1121,6 +1122,7 @@
ApplyPatch linux-2.6-acpi-video-dos.patch
ApplyPatch linux-2.6-acpi-strict-resources.patch
ApplyPatch linux-2.6-hwmon-atk0110.patch
+ApplyPatch linux-2.6-acpi-video-didl-intel-outputs.patch
# Various low-impact patches to aid debugging.
ApplyPatch linux-2.6-debug-sizeof-structs.patch
@@ -1824,6 +1826,12 @@
# and build.
%changelog
+* Wed Mar 11 2009 Matthew Garrett <mjg at redhat.com>
+- linux-2.6-acpi-video-didl-intel-outputs.patch
+ Initialise the DIDL field in Intel opregion before bringing up ACPI video
+- linux-2.6-acpi-video-dos.patch
+ Reenable display switch support now that above patch is included
+
* Wed Mar 11 2009 Kristian Høgsberg <krh at redhat.com>
- Add patch to issue a wbinvd in the GEM execbuffer patch to work
around insufficient flushing on i855 and i865 chipsets.
linux-2.6-acpi-video-dos.patch:
Index: linux-2.6-acpi-video-dos.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/linux-2.6-acpi-video-dos.patch,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- linux-2.6-acpi-video-dos.patch 25 Sep 2008 18:30:12 -0000 1.2
+++ linux-2.6-acpi-video-dos.patch 11 Mar 2009 23:09:31 -0000 1.3
@@ -1,4 +1,4 @@
-Disable ACPI video display switching by default
+Disable firmware video brightness change on AC/Battery switch by default
-- mjg59
@@ -11,7 +11,7 @@
static int acpi_video_bus_start_devices(struct acpi_video_bus *video)
{
- return acpi_video_bus_DOS(video, 0, 0);
-+ return acpi_video_bus_DOS(video, 3, 1);
++ return acpi_video_bus_DOS(video, 0, 1);
}
static int acpi_video_bus_stop_devices(struct acpi_video_bus *video)
- Previous message (by thread): rpms/hunspell-ca/devel .cvsignore, 1.12, 1.13 hunspell-ca.spec, 1.15, 1.16 sources, 1.12, 1.13
- Next message (by thread): rpms/kernel/devel patch-2.6.29-rc7-git5.bz2.sign, NONE, 1.1 .cvsignore, 1.1031, 1.1032 kernel.spec, 1.1418, 1.1419 sources, 1.993, 1.994 upstream, 1.904, 1.905 ingo-fix-atom-failures.patch, 1.1, NONE patch-2.6.29-rc7-git2.bz2.sign, 1.1, NONE patch-2.6.29-rc7-git4.bz2.sign, 1.1, NONE
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the fedora-extras-commits
mailing list