diff mbox

[4/8] acpi: Allow evaluate_optimus_dsm to take NULL results

Message ID 1432592573-13743-4-git-send-email-pierre.morrow@free.fr (mailing list archive)
State New, archived
Headers show

Commit Message

Pierre Moreau May 25, 2015, 10:22 p.m. UTC
Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
---
 drm/nouveau/nouveau_acpi.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

Comments

Samuel Pitoiset May 26, 2015, 8:02 a.m. UTC | #1
On 05/26/2015 12:22 AM, Pierre Moreau wrote:
> Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
> ---
>   drm/nouveau/nouveau_acpi.c | 10 ++++------
>   1 file changed, 4 insertions(+), 6 deletions(-)
>
> diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
> index 36f4a40..073f7d7 100644
> --- a/drm/nouveau/nouveau_acpi.c
> +++ b/drm/nouveau/nouveau_acpi.c
> @@ -88,15 +88,14 @@ static int nouveau_evaluate_optimus_dsm(acpi_handle handle, int func, int arg, u
>   	for (i = 0; i < 4; i++)
>   		args_buff[i] = (arg >> i * 8) & 0xFF;
>   
> -	*result = 0;
>   	obj = acpi_evaluate_dsm_typed(handle, nouveau_op_dsm_muid, nouveau_op_dsm_rid,
>   				      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];
> +		if (!result && obj->buffer.length == 4) {
> +			*result  = obj->buffer.pointer[0];

segfault here if result is NULL! ;)

>   			*result |= (obj->buffer.pointer[1] << 8);
>   			*result |= (obj->buffer.pointer[2] << 16);
>   			*result |= (obj->buffer.pointer[3] << 24);
> @@ -322,18 +321,17 @@ void nouveau_register_dsm_handler(void)
>   /* Must be called for Optimus models before the card can be turned off */
>   void nouveau_switcheroo_optimus_dsm(void)
>   {
> -	u32 result = 0;
>   	if (!nouveau_dsm_priv.optimus_detected)
>   		return;
>   
>   	nouveau_evaluate_optimus_dsm(nouveau_dsm_priv.dhandle,
>   			             NOUVEAU_DSM_OPTIMUS_FLAGS,
> -			             0x3, &result);
> +			             0x3, NULL);
>   
>   	nouveau_evaluate_optimus_dsm(nouveau_dsm_priv.dhandle,
>   			             NOUVEAU_DSM_OPTIMUS_CAPS,
>   			             NOUVEAU_DSM_OPTIMUS_SET_POWERDOWN,
> -			             &result);
> +			             NULL);
>   
>   }
>
Pierre Moreau May 26, 2015, 8:27 a.m. UTC | #2
> On 26 May 2015, at 10:02, Samuel Pitoiset <samuel.pitoiset@gmail.com> wrote:
> 
> 
> 
> On 05/26/2015 12:22 AM, Pierre Moreau wrote:
>> Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
>> ---
>>  drm/nouveau/nouveau_acpi.c | 10 ++++------
>>  1 file changed, 4 insertions(+), 6 deletions(-)
>> 
>> diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
>> index 36f4a40..073f7d7 100644
>> --- a/drm/nouveau/nouveau_acpi.c
>> +++ b/drm/nouveau/nouveau_acpi.c
>> @@ -88,15 +88,14 @@ static int nouveau_evaluate_optimus_dsm(acpi_handle handle, int func, int arg, u
>>  	for (i = 0; i < 4; i++)
>>  		args_buff[i] = (arg >> i * 8) & 0xFF;
>>  -	*result = 0;
>>  	obj = acpi_evaluate_dsm_typed(handle, nouveau_op_dsm_muid, nouveau_op_dsm_rid,
>>  				      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];
>> +		if (!result && obj->buffer.length == 4) {
>> +			*result  = obj->buffer.pointer[0];
> 
> segfault here if result is NULL! ;)

Good catch!

> 
>>  			*result |= (obj->buffer.pointer[1] << 8);
>>  			*result |= (obj->buffer.pointer[2] << 16);
>>  			*result |= (obj->buffer.pointer[3] << 24);
>> @@ -322,18 +321,17 @@ void nouveau_register_dsm_handler(void)
>>  /* Must be called for Optimus models before the card can be turned off */
>>  void nouveau_switcheroo_optimus_dsm(void)
>>  {
>> -	u32 result = 0;
>>  	if (!nouveau_dsm_priv.optimus_detected)
>>  		return;
>>    	nouveau_evaluate_optimus_dsm(nouveau_dsm_priv.dhandle,
>>  			             NOUVEAU_DSM_OPTIMUS_FLAGS,
>> -			             0x3, &result);
>> +			             0x3, NULL);
>>    	nouveau_evaluate_optimus_dsm(nouveau_dsm_priv.dhandle,
>>  			             NOUVEAU_DSM_OPTIMUS_CAPS,
>>  			             NOUVEAU_DSM_OPTIMUS_SET_POWERDOWN,
>> -			             &result);
>> +			             NULL);
>>    }
diff mbox

Patch

diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
index 36f4a40..073f7d7 100644
--- a/drm/nouveau/nouveau_acpi.c
+++ b/drm/nouveau/nouveau_acpi.c
@@ -88,15 +88,14 @@  static int nouveau_evaluate_optimus_dsm(acpi_handle handle, int func, int arg, u
 	for (i = 0; i < 4; i++)
 		args_buff[i] = (arg >> i * 8) & 0xFF;
 
-	*result = 0;
 	obj = acpi_evaluate_dsm_typed(handle, nouveau_op_dsm_muid, nouveau_op_dsm_rid,
 				      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];
+		if (!result && 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);
@@ -322,18 +321,17 @@  void nouveau_register_dsm_handler(void)
 /* Must be called for Optimus models before the card can be turned off */
 void nouveau_switcheroo_optimus_dsm(void)
 {
-	u32 result = 0;
 	if (!nouveau_dsm_priv.optimus_detected)
 		return;
 
 	nouveau_evaluate_optimus_dsm(nouveau_dsm_priv.dhandle,
 			             NOUVEAU_DSM_OPTIMUS_FLAGS,
-			             0x3, &result);
+			             0x3, NULL);
 
 	nouveau_evaluate_optimus_dsm(nouveau_dsm_priv.dhandle,
 			             NOUVEAU_DSM_OPTIMUS_CAPS,
 			             NOUVEAU_DSM_OPTIMUS_SET_POWERDOWN,
-			             &result);
+			             NULL);
 
 }