dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [RFC Patch v1 11/13] ACPI, i915: replace open-coded _DSM specific code with helper functions
       [not found] <1387349901-3391-1-git-send-email-jiang.liu@linux.intel.com>
@ 2013-12-18  6:58 ` Jiang Liu
  2013-12-18  8:15   ` Daniel Vetter
  2013-12-18  6:58 ` [RFC Patch v1 12/13] nouveau: fix memory leak in ACPI _DSM related code Jiang Liu
  2013-12-18  6:58 ` [RFC Patch v1 13/13] ACPI, nouveau: replace open-coded _DSM specific code with helper functions Jiang Liu
  2 siblings, 1 reply; 4+ messages in thread
From: Jiang Liu @ 2013-12-18  6:58 UTC (permalink / raw)
  To: Rafael J . Wysocki, Bjorn Helgaas, Lv Zheng, Len Brown,
	Leonidas Da Silva Barbosa, Ashley Lai, Peter Huewe, Rajiv Andrade,
	Marcel Selhorst, Sirrix AG, Daniel Vetter, David Airlie,
	Jiri Kosina, intel-gfx, dri-devel, linux-kernel
  Cc: Tony Luck, Jiang Liu

Use helper functions to simplify _DSM related code in i915 driver.

Function intel_dsm() is used to check functions supported by ACPI _DSM
method, but it has strange check for special value 0x80000002. After
digging into nouveau driver, I think the check is copied from nouveau
driver and is useless for i915 driver, so remove it.

Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_acpi.c |  144 ++++++++-----------------------------
 1 file changed, 30 insertions(+), 114 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_acpi.c b/drivers/gpu/drm/i915/intel_acpi.c
index dfff090..1bfac94 100644
--- a/drivers/gpu/drm/i915/intel_acpi.c
+++ b/drivers/gpu/drm/i915/intel_acpi.c
@@ -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;
 }
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [RFC Patch v1 12/13] nouveau: fix memory leak in ACPI _DSM related code
       [not found] <1387349901-3391-1-git-send-email-jiang.liu@linux.intel.com>
  2013-12-18  6:58 ` [RFC Patch v1 11/13] ACPI, i915: replace open-coded _DSM specific code with helper functions Jiang Liu
@ 2013-12-18  6:58 ` Jiang Liu
  2013-12-18  6:58 ` [RFC Patch v1 13/13] ACPI, nouveau: replace open-coded _DSM specific code with helper functions Jiang Liu
  2 siblings, 0 replies; 4+ messages in thread
From: Jiang Liu @ 2013-12-18  6:58 UTC (permalink / raw)
  To: Rafael J . Wysocki, Bjorn Helgaas, Lv Zheng, Len Brown,
	Leonidas Da Silva Barbosa, Ashley Lai, Peter Huewe, Rajiv Andrade,
	Marcel Selhorst, Sirrix AG, Daniel Vetter, David Airlie,
	Jiri Kosina, Jiang Liu, Dave Airlie, Zhang Rui,
	Greg Kroah-Hartman, dri-devel, linux-kernel
  Cc: Tony Luck

Fix memory leak in function nouveau_optimus_dsm() and nouveau_dsm().

Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
---
 drivers/gpu/drm/nouveau/nouveau_acpi.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c
index 95c7404..03d4911 100644
--- a/drivers/gpu/drm/nouveau/nouveau_acpi.c
+++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c
@@ -110,6 +110,7 @@ static int nouveau_optimus_dsm(acpi_handle handle, int func, int arg, uint32_t *
 
 	if (obj->type == ACPI_TYPE_INTEGER)
 		if (obj->integer.value == 0x80000002) {
+			kfree(output.pointer);
 			return -ENODEV;
 		}
 
@@ -156,8 +157,10 @@ static int nouveau_dsm(acpi_handle handle, int func, int arg, uint32_t *result)
 	obj = (union acpi_object *)output.pointer;
 
 	if (obj->type == ACPI_TYPE_INTEGER)
-		if (obj->integer.value == 0x80000002)
+		if (obj->integer.value == 0x80000002) {
+			kfree(output.pointer);
 			return -ENODEV;
+		}
 
 	if (obj->type == ACPI_TYPE_BUFFER) {
 		if (obj->buffer.length == 4 && result) {
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [RFC Patch v1 13/13] ACPI, nouveau: replace open-coded _DSM specific code with helper functions
       [not found] <1387349901-3391-1-git-send-email-jiang.liu@linux.intel.com>
  2013-12-18  6:58 ` [RFC Patch v1 11/13] ACPI, i915: replace open-coded _DSM specific code with helper functions Jiang Liu
  2013-12-18  6:58 ` [RFC Patch v1 12/13] nouveau: fix memory leak in ACPI _DSM related code Jiang Liu
@ 2013-12-18  6:58 ` Jiang Liu
  2 siblings, 0 replies; 4+ messages in thread
From: Jiang Liu @ 2013-12-18  6:58 UTC (permalink / raw)
  To: Rafael J . Wysocki, Bjorn Helgaas, Lv Zheng, Len Brown,
	Leonidas Da Silva Barbosa, Ashley Lai, Peter Huewe, Rajiv Andrade,
	Marcel Selhorst, Sirrix AG, Daniel Vetter, David Airlie,
	Jiri Kosina, Ben Skeggs, Greg Kroah-Hartman, Jiang Liu,
	Dave Airlie, Zhang Rui, dri-devel, linux-kernel
  Cc: Tony Luck

Use helper functions to simplify _DSM related code in nouveau driver.
After analyzing the ACPI _DSM related code, I changed nouveau_optimus_dsm()
to expect a buffer and nouveau_dsm() to expect an integer only.

Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
---
 drivers/gpu/drm/nouveau/core/subdev/mxm/base.c |   48 +++-----
 drivers/gpu/drm/nouveau/nouveau_acpi.c         |  139 +++++++-----------------
 2 files changed, 54 insertions(+), 133 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/core/subdev/mxm/base.c b/drivers/gpu/drm/nouveau/core/subdev/mxm/base.c
index 1291204..13c5af8 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/mxm/base.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/mxm/base.c
@@ -87,55 +87,39 @@ mxm_shadow_dsm(struct nouveau_mxm *mxm, u8 version)
 		0xB8, 0x9C, 0x79, 0xB6, 0x2F, 0xD5, 0x56, 0x65
 	};
 	u32 mxms_args[] = { 0x00000000 };
-	union acpi_object args[4] = {
-		/* _DSM MUID */
-		{ .buffer.type = 3,
-		  .buffer.length = sizeof(muid),
-		  .buffer.pointer = muid,
-		},
-		/* spec says this can be zero to mean "highest revision", but
-		 * of course there's at least one bios out there which fails
-		 * unless you pass in exactly the version it supports..
-		 */
-		{ .integer.type = ACPI_TYPE_INTEGER,
-		  .integer.value = (version & 0xf0) << 4 | (version & 0x0f),
-		},
-		/* MXMS function */
-		{ .integer.type = ACPI_TYPE_INTEGER,
-		  .integer.value = 0x00000010,
-		},
-		/* Pointer to MXMS arguments */
-		{ .buffer.type = ACPI_TYPE_BUFFER,
-		  .buffer.length = sizeof(mxms_args),
-		  .buffer.pointer = (char *)mxms_args,
-		},
+	union acpi_object argv4 = {
+		.buffer.type = ACPI_TYPE_BUFFER,
+		.buffer.length = sizeof(mxms_args),
+		.buffer.pointer = (char *)mxms_args,
 	};
-	struct acpi_object_list list = { ARRAY_SIZE(args), args };
-	struct acpi_buffer retn = { ACPI_ALLOCATE_BUFFER, NULL };
 	union acpi_object *obj;
 	acpi_handle handle;
-	int ret;
+	int rev;
 
 	handle = ACPI_HANDLE(&device->pdev->dev);
 	if (!handle)
 		return false;
 
-	ret = acpi_evaluate_object(handle, "_DSM", &list, &retn);
-	if (ret) {
-		nv_debug(mxm, "DSM MXMS failed: %d\n", ret);
+	/*
+	 * spec says this can be zero to mean "highest revision", but
+	 * of course there's at least one bios out there which fails
+	 * unless you pass in exactly the version it supports..
+	 */
+	rev = (version & 0xf0) << 4 | (version & 0x0f);
+	obj = acpi_evaluate_dsm(handle, muid, rev, 0x00000010, &argv4);
+	if (!obj) {
+		nv_debug(mxm, "DSM MXMS failed\n");
 		return false;
 	}
 
-	obj = retn.pointer;
 	if (obj->type == ACPI_TYPE_BUFFER) {
 		mxm->mxms = kmemdup(obj->buffer.pointer,
 					 obj->buffer.length, GFP_KERNEL);
-	} else
-	if (obj->type == ACPI_TYPE_INTEGER) {
+	} else if (obj->type == ACPI_TYPE_INTEGER) {
 		nv_debug(mxm, "DSM MXMS returned 0x%llx\n", obj->integer.value);
 	}
 
-	kfree(obj);
+	ACPI_FREE(obj);
 	return mxm->mxms != NULL;
 }
 #endif
diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c
index 03d4911..7ac7234 100644
--- a/drivers/gpu/drm/nouveau/nouveau_acpi.c
+++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c
@@ -77,127 +77,66 @@ static const char nouveau_op_dsm_muid[] = {
 
 static int nouveau_optimus_dsm(acpi_handle handle, int func, int arg, uint32_t *result)
 {
-	struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
-	struct acpi_object_list input;
-	union acpi_object params[4];
+	int i;
 	union acpi_object *obj;
-	int i, err;
 	char args_buff[4];
+	union acpi_object argv4 = {
+		.type = ACPI_TYPE_BUFFER,
+		.buffer.length = 4,
+		.buffer.pointer = args_buff
+	};
 
-	input.count = 4;
-	input.pointer = params;
-	params[0].type = ACPI_TYPE_BUFFER;
-	params[0].buffer.length = sizeof(nouveau_op_dsm_muid);
-	params[0].buffer.pointer = (char *)nouveau_op_dsm_muid;
-	params[1].type = ACPI_TYPE_INTEGER;
-	params[1].integer.value = 0x00000100;
-	params[2].type = ACPI_TYPE_INTEGER;
-	params[2].integer.value = func;
-	params[3].type = ACPI_TYPE_BUFFER;
-	params[3].buffer.length = 4;
 	/* ACPI is little endian, AABBCCDD becomes {DD,CC,BB,AA} */
 	for (i = 0; i < 4; i++)
 		args_buff[i] = (arg >> i * 8) & 0xFF;
-	params[3].buffer.pointer = args_buff;
 
-	err = acpi_evaluate_object(handle, "_DSM", &input, &output);
-	if (err) {
-		printk(KERN_INFO "failed to evaluate _DSM: %d\n", err);
-		return err;
-	}
-
-	obj = (union acpi_object *)output.pointer;
-
-	if (obj->type == ACPI_TYPE_INTEGER)
-		if (obj->integer.value == 0x80000002) {
-			kfree(output.pointer);
-			return -ENODEV;
-		}
-
-	if (obj->type == ACPI_TYPE_BUFFER) {
-		if (obj->buffer.length == 4 && result) {
-			*result = 0;
+	*result = 0;
+	obj = acpi_evaluate_dsm_typed(handle, nouveau_op_dsm_muid, 0x00000100,
+				      func, &argv4, ACPI_TYPE_BUFFER);
+	if (!obj) {
+		acpi_handle_info(handle, "failed to evaluate _DSM\n");
+		return AE_ERROR;
+	} else {
+		if (obj->buffer.length == 4) {
 			*result |= obj->buffer.pointer[0];
 			*result |= (obj->buffer.pointer[1] << 8);
 			*result |= (obj->buffer.pointer[2] << 16);
 			*result |= (obj->buffer.pointer[3] << 24);
 		}
+		ACPI_FREE(obj);
 	}
 
-	kfree(output.pointer);
 	return 0;
 }
 
-static int nouveau_dsm(acpi_handle handle, int func, int arg, uint32_t *result)
+static int nouveau_dsm(acpi_handle handle, int func, int arg)
 {
-	struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
-	struct acpi_object_list input;
-	union acpi_object params[4];
+	int ret = 0;
 	union acpi_object *obj;
-	int err;
-
-	input.count = 4;
-	input.pointer = params;
-	params[0].type = ACPI_TYPE_BUFFER;
-	params[0].buffer.length = sizeof(nouveau_dsm_muid);
-	params[0].buffer.pointer = (char *)nouveau_dsm_muid;
-	params[1].type = ACPI_TYPE_INTEGER;
-	params[1].integer.value = 0x00000102;
-	params[2].type = ACPI_TYPE_INTEGER;
-	params[2].integer.value = func;
-	params[3].type = ACPI_TYPE_INTEGER;
-	params[3].integer.value = arg;
-
-	err = acpi_evaluate_object(handle, "_DSM", &input, &output);
-	if (err) {
-		printk(KERN_INFO "failed to evaluate _DSM: %d\n", err);
-		return err;
-	}
-
-	obj = (union acpi_object *)output.pointer;
-
-	if (obj->type == ACPI_TYPE_INTEGER)
-		if (obj->integer.value == 0x80000002) {
-			kfree(output.pointer);
-			return -ENODEV;
-		}
-
-	if (obj->type == ACPI_TYPE_BUFFER) {
-		if (obj->buffer.length == 4 && result) {
-			*result = 0;
-			*result |= obj->buffer.pointer[0];
-			*result |= (obj->buffer.pointer[1] << 8);
-			*result |= (obj->buffer.pointer[2] << 16);
-			*result |= (obj->buffer.pointer[3] << 24);
-		}
+	union acpi_object argv4 = {
+		.type = ACPI_TYPE_INTEGER,
+		.integer.value = arg,
+	};
+
+	obj = acpi_evaluate_dsm_typed(handle, nouveau_dsm_muid, 0x00000102,
+				      func, &argv4, ACPI_TYPE_INTEGER);
+	if (!obj) {
+		acpi_handle_info(handle, "failed to evaluate _DSM\n");
+		return AE_ERROR;
+	} else {
+		if (obj->integer.value == 0x80000002)
+			ret = -ENODEV;
+		ACPI_FREE(obj);
 	}
 
-	kfree(output.pointer);
-	return 0;
-}
-
-/* Returns 1 if a DSM function is usable and 0 otherwise */
-static int nouveau_test_dsm(acpi_handle test_handle,
-	int (*dsm_func)(acpi_handle, int, int, uint32_t *),
-	int sfnc)
-{
-	u32 result = 0;
-
-	/* Function 0 returns a Buffer containing available functions. The args
-	 * parameter is ignored for function 0, so just put 0 in it */
-	if (dsm_func(test_handle, 0, 0, &result))
-		return 0;
-
-	/* ACPI Spec v4 9.14.1: if bit 0 is zero, no function is supported. If
-	 * the n-th bit is enabled, function n is supported */
-	return result & 1 && result & (1 << sfnc);
+	return ret;
 }
 
 static int nouveau_dsm_switch_mux(acpi_handle handle, int mux_id)
 {
 	mxm_wmi_call_mxmx(mux_id == NOUVEAU_DSM_LED_STAMINA ? MXM_MXDS_ADAPTER_IGD : MXM_MXDS_ADAPTER_0);
 	mxm_wmi_call_mxds(mux_id == NOUVEAU_DSM_LED_STAMINA ? MXM_MXDS_ADAPTER_IGD : MXM_MXDS_ADAPTER_0);
-	return nouveau_dsm(handle, NOUVEAU_DSM_LED, mux_id, NULL);
+	return nouveau_dsm(handle, NOUVEAU_DSM_LED, mux_id);
 }
 
 static int nouveau_dsm_set_discrete_state(acpi_handle handle, enum vga_switcheroo_state state)
@@ -207,7 +146,7 @@ static int nouveau_dsm_set_discrete_state(acpi_handle handle, enum vga_switchero
 		arg = NOUVEAU_DSM_POWER_SPEED;
 	else
 		arg = NOUVEAU_DSM_POWER_STAMINA;
-	nouveau_dsm(handle, NOUVEAU_DSM_POWER, arg, NULL);
+	nouveau_dsm(handle, NOUVEAU_DSM_POWER, arg);
 	return 0;
 }
 
@@ -263,14 +202,12 @@ static int nouveau_dsm_pci_probe(struct pci_dev *pdev)
 	if (!dhandle)
 		return false;
 
-	if (!acpi_has_method(dhandle, "_DSM"))
-		return false;
-
-	if (nouveau_test_dsm(dhandle, nouveau_dsm, NOUVEAU_DSM_POWER))
+	if (acpi_check_dsm(dhandle, nouveau_dsm_muid, 0x00000102,
+			   1 << NOUVEAU_DSM_POWER))
 		retval |= NOUVEAU_DSM_HAS_MUX;
 
-	if (nouveau_test_dsm(dhandle, nouveau_optimus_dsm,
-		NOUVEAU_DSM_OPTIMUS_CAPS))
+	if (acpi_check_dsm(dhandle, nouveau_op_dsm_muid, 0x00000100,
+			   1 << NOUVEAU_DSM_OPTIMUS_CAPS))
 		retval |= NOUVEAU_DSM_HAS_OPT;
 
 	if (retval & NOUVEAU_DSM_HAS_OPT) {
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [RFC Patch v1 11/13] ACPI, i915: replace open-coded _DSM specific code with helper functions
  2013-12-18  6:58 ` [RFC Patch v1 11/13] ACPI, i915: replace open-coded _DSM specific code with helper functions Jiang Liu
@ 2013-12-18  8:15   ` Daniel Vetter
  0 siblings, 0 replies; 4+ messages in thread
From: Daniel Vetter @ 2013-12-18  8:15 UTC (permalink / raw)
  To: Jiang Liu
  Cc: Rafael J . Wysocki, Bjorn Helgaas, Lv Zheng, Len Brown,
	Leonidas Da Silva Barbosa, Ashley Lai, Peter Huewe, Rajiv Andrade,
	Marcel Selhorst, Sirrix AG, Daniel Vetter, David Airlie,
	Jiri Kosina, intel-gfx, dri-devel, linux-kernel, Tony Luck,
	Dave Airlie

On Wed, Dec 18, 2013 at 02:58:19PM +0800, Jiang Liu wrote:
> Use helper functions to simplify _DSM related code in i915 driver.
> 
> Function intel_dsm() is used to check functions supported by ACPI _DSM
> method, but it has strange check for special value 0x80000002. After
> digging into nouveau driver, I think the check is copied from nouveau
> driver and is useless for i915 driver, so remove it.
> 
> Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>

Looks like a neat cleanup, so ack from my side. I don't have any clue
about the special case, cc'ing Dave maybe he remembers.
-Daniel

> ---
>  drivers/gpu/drm/i915/intel_acpi.c |  144 ++++++++-----------------------------
>  1 file changed, 30 insertions(+), 114 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_acpi.c b/drivers/gpu/drm/i915/intel_acpi.c
> index dfff090..1bfac94 100644
> --- a/drivers/gpu/drm/i915/intel_acpi.c
> +++ b/drivers/gpu/drm/i915/intel_acpi.c
> @@ -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;
>  }
>  
> -- 
> 1.7.10.4
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-12-18  8:15 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1387349901-3391-1-git-send-email-jiang.liu@linux.intel.com>
2013-12-18  6:58 ` [RFC Patch v1 11/13] ACPI, i915: replace open-coded _DSM specific code with helper functions Jiang Liu
2013-12-18  8:15   ` Daniel Vetter
2013-12-18  6:58 ` [RFC Patch v1 12/13] nouveau: fix memory leak in ACPI _DSM related code Jiang Liu
2013-12-18  6:58 ` [RFC Patch v1 13/13] ACPI, nouveau: replace open-coded _DSM specific code with helper functions Jiang Liu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).