|
@@ -12,8 +12,6 @@
|
|
|
#include "i915_drv.h"
|
|
|
|
|
|
#define INTEL_DSM_REVISION_ID 1 /* For Calpella anyway... */
|
|
|
-
|
|
|
-#define INTEL_DSM_FN_SUPPORTED_FUNCTIONS 0 /* No args */
|
|
|
#define INTEL_DSM_FN_PLATFORM_MUX_INFO 1 /* No args */
|
|
|
|
|
|
static struct intel_dsm_priv {
|
|
@@ -28,61 +26,6 @@ static const u8 intel_dsm_guid[] = {
|
|
|
0x0f, 0x13, 0x17, 0xb0, 0x1c, 0x2c
|
|
|
};
|
|
|
|
|
|
-static int intel_dsm(acpi_handle handle, int func)
|
|
|
-{
|
|
|
- struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
|
|
|
- struct acpi_object_list input;
|
|
|
- union acpi_object params[4];
|
|
|
- union acpi_object *obj;
|
|
|
- u32 result;
|
|
|
- int ret = 0;
|
|
|
-
|
|
|
- input.count = 4;
|
|
|
- input.pointer = params;
|
|
|
- params[0].type = ACPI_TYPE_BUFFER;
|
|
|
- params[0].buffer.length = sizeof(intel_dsm_guid);
|
|
|
- params[0].buffer.pointer = (char *)intel_dsm_guid;
|
|
|
- params[1].type = ACPI_TYPE_INTEGER;
|
|
|
- params[1].integer.value = INTEL_DSM_REVISION_ID;
|
|
|
- params[2].type = ACPI_TYPE_INTEGER;
|
|
|
- params[2].integer.value = func;
|
|
|
- params[3].type = ACPI_TYPE_PACKAGE;
|
|
|
- params[3].package.count = 0;
|
|
|
- params[3].package.elements = NULL;
|
|
|
-
|
|
|
- ret = acpi_evaluate_object(handle, "_DSM", &input, &output);
|
|
|
- if (ret) {
|
|
|
- DRM_DEBUG_DRIVER("failed to evaluate _DSM: %d\n", ret);
|
|
|
- return ret;
|
|
|
- }
|
|
|
-
|
|
|
- obj = (union acpi_object *)output.pointer;
|
|
|
-
|
|
|
- result = 0;
|
|
|
- switch (obj->type) {
|
|
|
- case ACPI_TYPE_INTEGER:
|
|
|
- result = obj->integer.value;
|
|
|
- break;
|
|
|
-
|
|
|
- case ACPI_TYPE_BUFFER:
|
|
|
- if (obj->buffer.length == 4) {
|
|
|
- result = (obj->buffer.pointer[0] |
|
|
|
- (obj->buffer.pointer[1] << 8) |
|
|
|
- (obj->buffer.pointer[2] << 16) |
|
|
|
- (obj->buffer.pointer[3] << 24));
|
|
|
- break;
|
|
|
- }
|
|
|
- default:
|
|
|
- ret = -EINVAL;
|
|
|
- break;
|
|
|
- }
|
|
|
- if (result == 0x80000002)
|
|
|
- ret = -ENODEV;
|
|
|
-
|
|
|
- kfree(output.pointer);
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
static char *intel_dsm_port_name(u8 id)
|
|
|
{
|
|
|
switch (id) {
|
|
@@ -137,83 +80,56 @@ static char *intel_dsm_mux_type(u8 type)
|
|
|
|
|
|
static void intel_dsm_platform_mux_info(void)
|
|
|
{
|
|
|
- struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
|
|
|
- struct acpi_object_list input;
|
|
|
- union acpi_object params[4];
|
|
|
- union acpi_object *pkg;
|
|
|
- int i, ret;
|
|
|
-
|
|
|
- input.count = 4;
|
|
|
- input.pointer = params;
|
|
|
- params[0].type = ACPI_TYPE_BUFFER;
|
|
|
- params[0].buffer.length = sizeof(intel_dsm_guid);
|
|
|
- params[0].buffer.pointer = (char *)intel_dsm_guid;
|
|
|
- params[1].type = ACPI_TYPE_INTEGER;
|
|
|
- params[1].integer.value = INTEL_DSM_REVISION_ID;
|
|
|
- params[2].type = ACPI_TYPE_INTEGER;
|
|
|
- params[2].integer.value = INTEL_DSM_FN_PLATFORM_MUX_INFO;
|
|
|
- params[3].type = ACPI_TYPE_PACKAGE;
|
|
|
- params[3].package.count = 0;
|
|
|
- params[3].package.elements = NULL;
|
|
|
-
|
|
|
- ret = acpi_evaluate_object(intel_dsm_priv.dhandle, "_DSM", &input,
|
|
|
- &output);
|
|
|
- if (ret) {
|
|
|
- DRM_DEBUG_DRIVER("failed to evaluate _DSM: %d\n", ret);
|
|
|
- goto out;
|
|
|
+ int i;
|
|
|
+ union acpi_object *pkg, *connector_count;
|
|
|
+
|
|
|
+ pkg = acpi_evaluate_dsm_typed(intel_dsm_priv.dhandle, intel_dsm_guid,
|
|
|
+ INTEL_DSM_REVISION_ID, INTEL_DSM_FN_PLATFORM_MUX_INFO,
|
|
|
+ NULL, ACPI_TYPE_PACKAGE);
|
|
|
+ if (!pkg) {
|
|
|
+ DRM_DEBUG_DRIVER("failed to evaluate _DSM\n");
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- pkg = (union acpi_object *)output.pointer;
|
|
|
-
|
|
|
- if (pkg->type == ACPI_TYPE_PACKAGE) {
|
|
|
- union acpi_object *connector_count = &pkg->package.elements[0];
|
|
|
- DRM_DEBUG_DRIVER("MUX info connectors: %lld\n",
|
|
|
- (unsigned long long)connector_count->integer.value);
|
|
|
- for (i = 1; i < pkg->package.count; i++) {
|
|
|
- union acpi_object *obj = &pkg->package.elements[i];
|
|
|
- union acpi_object *connector_id =
|
|
|
- &obj->package.elements[0];
|
|
|
- union acpi_object *info = &obj->package.elements[1];
|
|
|
- DRM_DEBUG_DRIVER("Connector id: 0x%016llx\n",
|
|
|
- (unsigned long long)connector_id->integer.value);
|
|
|
- DRM_DEBUG_DRIVER(" port id: %s\n",
|
|
|
- intel_dsm_port_name(info->buffer.pointer[0]));
|
|
|
- DRM_DEBUG_DRIVER(" display mux info: %s\n",
|
|
|
- intel_dsm_mux_type(info->buffer.pointer[1]));
|
|
|
- DRM_DEBUG_DRIVER(" aux/dc mux info: %s\n",
|
|
|
- intel_dsm_mux_type(info->buffer.pointer[2]));
|
|
|
- DRM_DEBUG_DRIVER(" hpd mux info: %s\n",
|
|
|
- intel_dsm_mux_type(info->buffer.pointer[3]));
|
|
|
- }
|
|
|
+ connector_count = &pkg->package.elements[0];
|
|
|
+ DRM_DEBUG_DRIVER("MUX info connectors: %lld\n",
|
|
|
+ (unsigned long long)connector_count->integer.value);
|
|
|
+ for (i = 1; i < pkg->package.count; i++) {
|
|
|
+ union acpi_object *obj = &pkg->package.elements[i];
|
|
|
+ union acpi_object *connector_id = &obj->package.elements[0];
|
|
|
+ union acpi_object *info = &obj->package.elements[1];
|
|
|
+ DRM_DEBUG_DRIVER("Connector id: 0x%016llx\n",
|
|
|
+ (unsigned long long)connector_id->integer.value);
|
|
|
+ DRM_DEBUG_DRIVER(" port id: %s\n",
|
|
|
+ intel_dsm_port_name(info->buffer.pointer[0]));
|
|
|
+ DRM_DEBUG_DRIVER(" display mux info: %s\n",
|
|
|
+ intel_dsm_mux_type(info->buffer.pointer[1]));
|
|
|
+ DRM_DEBUG_DRIVER(" aux/dc mux info: %s\n",
|
|
|
+ intel_dsm_mux_type(info->buffer.pointer[2]));
|
|
|
+ DRM_DEBUG_DRIVER(" hpd mux info: %s\n",
|
|
|
+ intel_dsm_mux_type(info->buffer.pointer[3]));
|
|
|
}
|
|
|
|
|
|
-out:
|
|
|
- kfree(output.pointer);
|
|
|
+ ACPI_FREE(pkg);
|
|
|
}
|
|
|
|
|
|
static bool intel_dsm_pci_probe(struct pci_dev *pdev)
|
|
|
{
|
|
|
acpi_handle dhandle;
|
|
|
- int ret;
|
|
|
|
|
|
dhandle = ACPI_HANDLE(&pdev->dev);
|
|
|
if (!dhandle)
|
|
|
return false;
|
|
|
|
|
|
- if (!acpi_has_method(dhandle, "_DSM")) {
|
|
|
+ if (!acpi_check_dsm(dhandle, intel_dsm_guid, INTEL_DSM_REVISION_ID,
|
|
|
+ 1 << INTEL_DSM_FN_PLATFORM_MUX_INFO)) {
|
|
|
DRM_DEBUG_KMS("no _DSM method for intel device\n");
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- ret = intel_dsm(dhandle, INTEL_DSM_FN_SUPPORTED_FUNCTIONS);
|
|
|
- if (ret < 0) {
|
|
|
- DRM_DEBUG_KMS("failed to get supported _DSM functions\n");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
intel_dsm_priv.dhandle = dhandle;
|
|
|
-
|
|
|
intel_dsm_platform_mux_info();
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|