diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_acpi.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_acpi.c | 152 | 
1 files changed, 32 insertions, 120 deletions
diff --git a/drivers/gpu/drm/i915/intel_acpi.c b/drivers/gpu/drm/i915/intel_acpi.c index 57fe1ae32a0..d96eee1ae9c 100644 --- a/drivers/gpu/drm/i915/intel_acpi.c +++ b/drivers/gpu/drm/i915/intel_acpi.c @@ -6,14 +6,10 @@  #include <linux/pci.h>  #include <linux/acpi.h>  #include <linux/vga_switcheroo.h> -#include <acpi/acpi_drivers.h> -  #include <drm/drmP.h>  #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 +24,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,85 +78,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, intel_handle; -	acpi_status status; -	int ret; +	acpi_handle dhandle; -	dhandle = DEVICE_ACPI_HANDLE(&pdev->dev); +	dhandle = ACPI_HANDLE(&pdev->dev);  	if (!dhandle)  		return false; -	status = acpi_get_handle(dhandle, "_DSM", &intel_handle); -	if (ACPI_FAILURE(status)) { +	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;  }  | 
