[Intel-gfx] [RFC PATCH] set DIDL using the ACPI video output device _ADR method return value
Zhang Rui
rui.zhang at intel.com
Tue Apr 6 03:32:58 CEST 2010
No one interest in this patch?
Matthew, any comments? :)
thanks,
rui
On Mon, 2010-03-29 at 15:12 +0800, Zhang, Rui wrote:
> we used to set the DIDL in the output device detected order.
> But some BIOSes requires it to be initialized in the ACPI device order.
> e.g. the value of the first field in DIDL stands for the first
> ACPI video output device in ACPI namespace.
>
> Now we initialize the DIDL using the device id, i.e. _ADR return value,
> of each ACPI video device, if it is not 0.
> https://bugzilla.kernel.org/show_bug.cgi?id=15054
>
> Signed-off-by: Zhang Rui <rui.zhang at intel.com>
> ---
> drivers/gpu/drm/i915/i915_opregion.c | 54 ++++++++++++++++++++++++++++++++---
> 1 file changed, 50 insertions(+), 4 deletions(-)
>
> Index: linux-2.6/drivers/gpu/drm/i915/i915_opregion.c
> ===================================================================
> --- linux-2.6.orig/drivers/gpu/drm/i915/i915_opregion.c
> +++ linux-2.6/drivers/gpu/drm/i915/i915_opregion.c
> @@ -382,8 +382,57 @@ static void intel_didl_outputs(struct dr
> struct drm_i915_private *dev_priv = dev->dev_private;
> struct intel_opregion *opregion = &dev_priv->opregion;
> struct drm_connector *connector;
> + acpi_handle handle;
> + struct acpi_device *acpi_dev, *acpi_cdev, *acpi_video_bus = NULL;
> + unsigned long long device_id;
> + acpi_status status;
> int i = 0;
>
> + handle = DEVICE_ACPI_HANDLE(&dev->pdev->dev);
> + if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &acpi_dev)))
> + return;
> +
> + if (acpi_is_video_device(acpi_dev))
> + acpi_video_bus = acpi_dev;
> + else {
> + list_for_each_entry(acpi_cdev, &acpi_dev->children, node) {
> + if (acpi_is_video_device(acpi_cdev)) {
> + acpi_video_bus = acpi_cdev;
> + break;
> + }
> + }
> + }
> +
> + if (!acpi_video_bus) {
> + printk(KERN_WARNING "No ACPI video bus found\n");
> + return;
> + }
> +
> + list_for_each_entry(acpi_cdev, &acpi_video_bus->children, node) {
> + if (i >= 8) {
> + dev_printk (KERN_ERR, &dev->pdev->dev,
> + "More than 8 outputs detected\n");
> + return;
> + }
> + status =
> + acpi_evaluate_integer(acpi_cdev->handle, "_ADR",
> + NULL, &device_id);
> + if (ACPI_SUCCESS(status)) {
> + if (!device_id)
> + goto blind_set;
> + opregion->acpi->didl[i] = (u32)(device_id & 0x0f0f);
> + i++;
> + }
> + }
> +
> +end:
> + /* If fewer than 8 outputs, the list must be null terminated */
> + if (i < 8)
> + opregion->acpi->didl[i] = 0;
> + return;
> +
> +blind_set:
> + i = 0;
> list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> int output_type = ACPI_OTHER_OUTPUT;
> if (i >= 8) {
> @@ -416,10 +465,7 @@ static void intel_didl_outputs(struct dr
> 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;
> + goto end;
> }
>
> int intel_opregion_init(struct drm_device *dev, int resume)
>
>
More information about the Intel-gfx
mailing list