提交 d5cbb22f 编写于 作者: J Jani Nikula 提交者: Daniel Vetter

drm/i915/opregion: abstract didl and did2 getter and setter

Make it easier to handle the extended didl. No functional changes.
Signed-off-by: NJani Nikula <jani.nikula@intel.com>
Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
上级 b4fe8156
...@@ -628,6 +628,38 @@ static struct notifier_block intel_opregion_notifier = { ...@@ -628,6 +628,38 @@ static struct notifier_block intel_opregion_notifier = {
* (version 3) * (version 3)
*/ */
static u32 get_did(struct intel_opregion *opregion, int i)
{
u32 did;
if (i < ARRAY_SIZE(opregion->acpi->didl)) {
did = ioread32(&opregion->acpi->didl[i]);
} else {
i -= ARRAY_SIZE(opregion->acpi->didl);
if (WARN_ON(i >= ARRAY_SIZE(opregion->acpi->did2)))
return 0;
did = ioread32(&opregion->acpi->did2[i]);
}
return did;
}
static void set_did(struct intel_opregion *opregion, int i, u32 val)
{
if (i < ARRAY_SIZE(opregion->acpi->didl)) {
iowrite32(val, &opregion->acpi->didl[i]);
} else {
i -= ARRAY_SIZE(opregion->acpi->didl);
if (WARN_ON(i >= ARRAY_SIZE(opregion->acpi->did2)))
return;
iowrite32(val, &opregion->acpi->did2[i]);
}
}
static void intel_didl_outputs(struct drm_device *dev) static void intel_didl_outputs(struct drm_device *dev)
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
...@@ -665,22 +697,19 @@ static void intel_didl_outputs(struct drm_device *dev) ...@@ -665,22 +697,19 @@ static void intel_didl_outputs(struct drm_device *dev)
DRM_DEBUG_KMS("More than 8 outputs detected via ACPI\n"); DRM_DEBUG_KMS("More than 8 outputs detected via ACPI\n");
return; return;
} }
status = status = acpi_evaluate_integer(acpi_cdev->handle, "_ADR",
acpi_evaluate_integer(acpi_cdev->handle, "_ADR", NULL, &device_id);
NULL, &device_id);
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
if (!device_id) if (!device_id)
goto blind_set; goto blind_set;
iowrite32((u32)(device_id & 0x0f0f), set_did(opregion, i++, (u32)(device_id & 0x0f0f));
&opregion->acpi->didl[i]);
i++;
} }
} }
end: end:
/* If fewer than 8 outputs, the list must be null terminated */ /* If fewer than 8 outputs, the list must be null terminated */
if (i < 8) if (i < 8)
iowrite32(0, &opregion->acpi->didl[i]); set_did(opregion, i, 0);
return; return;
blind_set: blind_set:
...@@ -713,9 +742,8 @@ static void intel_didl_outputs(struct drm_device *dev) ...@@ -713,9 +742,8 @@ static void intel_didl_outputs(struct drm_device *dev)
output_type = ACPI_LVDS_OUTPUT; output_type = ACPI_LVDS_OUTPUT;
break; break;
} }
temp = ioread32(&opregion->acpi->didl[i]); temp = get_did(opregion, i);
iowrite32(temp | (1<<31) | output_type | i, set_did(opregion, i, temp | (1 << 31) | output_type | i);
&opregion->acpi->didl[i]);
i++; i++;
} }
goto end; goto end;
...@@ -735,7 +763,7 @@ static void intel_setup_cadls(struct drm_device *dev) ...@@ -735,7 +763,7 @@ static void intel_setup_cadls(struct drm_device *dev)
* display switching hotkeys. Just like DIDL, CADL is NULL-terminated if * display switching hotkeys. Just like DIDL, CADL is NULL-terminated if
* there are less than eight devices. */ * there are less than eight devices. */
do { do {
disp_id = ioread32(&opregion->acpi->didl[i]); disp_id = get_did(opregion, i);
iowrite32(disp_id, &opregion->acpi->cadl[i]); iowrite32(disp_id, &opregion->acpi->cadl[i]);
} while (++i < 8 && disp_id != 0); } while (++i < 8 && disp_id != 0);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册