@@ -196,52 +196,67 @@ static void acpi_dump_osc_data(acpi_handle handle, const guid_t *guid, int rev,
196196 OSC_INVALID_REVISION_ERROR | \
197197 OSC_CAPABILITIES_MASK_ERROR)
198198
199- acpi_status acpi_run_osc (acpi_handle handle , struct acpi_osc_context * context )
199+ static int acpi_eval_osc (acpi_handle handle , guid_t * guid , int rev ,
200+ struct acpi_buffer * cap ,
201+ union acpi_object in_params [at_least 4 ],
202+ struct acpi_buffer * output )
200203{
201- u32 errors , * capbuf = context -> cap .pointer ;
202- acpi_status status ;
203204 struct acpi_object_list input ;
204- union acpi_object in_params [4 ];
205205 union acpi_object * out_obj ;
206- guid_t guid ;
207- struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER , NULL };
208-
209- if (!context )
210- return AE_ERROR ;
211- if (guid_parse (context -> uuid_str , & guid ))
212- return AE_ERROR ;
213- context -> ret .length = ACPI_ALLOCATE_BUFFER ;
214- context -> ret .pointer = NULL ;
206+ acpi_status status ;
215207
216- /* Setting up input parameters */
217- input .count = 4 ;
208+ in_params [0 ].type = ACPI_TYPE_BUFFER ;
209+ in_params [0 ].buffer .length = sizeof (* guid );
210+ in_params [0 ].buffer .pointer = (u8 * )guid ;
211+ in_params [1 ].type = ACPI_TYPE_INTEGER ;
212+ in_params [1 ].integer .value = rev ;
213+ in_params [2 ].type = ACPI_TYPE_INTEGER ;
214+ in_params [2 ].integer .value = cap -> length / sizeof (u32 );
215+ in_params [3 ].type = ACPI_TYPE_BUFFER ;
216+ in_params [3 ].buffer .length = cap -> length ;
217+ in_params [3 ].buffer .pointer = cap -> pointer ;
218218 input .pointer = in_params ;
219- in_params [0 ].type = ACPI_TYPE_BUFFER ;
220- in_params [0 ].buffer .length = 16 ;
221- in_params [0 ].buffer .pointer = (u8 * )& guid ;
222- in_params [1 ].type = ACPI_TYPE_INTEGER ;
223- in_params [1 ].integer .value = context -> rev ;
224- in_params [2 ].type = ACPI_TYPE_INTEGER ;
225- in_params [2 ].integer .value = context -> cap .length /sizeof (u32 );
226- in_params [3 ].type = ACPI_TYPE_BUFFER ;
227- in_params [3 ].buffer .length = context -> cap .length ;
228- in_params [3 ].buffer .pointer = context -> cap .pointer ;
229-
230- status = acpi_evaluate_object (handle , "_OSC" , & input , & output );
231- if (ACPI_FAILURE (status ))
232- return status ;
219+ input .count = 4 ;
233220
234- if (! output . length )
235- return AE_NULL_OBJECT ;
221+ output -> length = ACPI_ALLOCATE_BUFFER ;
222+ output -> pointer = NULL ;
236223
237- out_obj = output .pointer ;
238- if (out_obj -> type != ACPI_TYPE_BUFFER
239- || out_obj -> buffer .length != context -> cap .length ) {
240- acpi_dump_osc_data (handle , & guid , context -> rev , & context -> cap );
241- acpi_handle_debug (handle , "_OSC: evaluation returned wrong type" );
242- status = AE_TYPE ;
243- goto out_kfree ;
224+ status = acpi_evaluate_object (handle , "_OSC" , & input , output );
225+ if (ACPI_FAILURE (status ) || !output -> length )
226+ return - ENODATA ;
227+
228+ out_obj = output -> pointer ;
229+ if (out_obj -> type != ACPI_TYPE_BUFFER ||
230+ out_obj -> buffer .length != cap -> length ) {
231+ acpi_handle_debug (handle , "Invalid _OSC return buffer\n" );
232+ acpi_dump_osc_data (handle , guid , rev , cap );
233+ ACPI_FREE (out_obj );
234+ return - ENODATA ;
244235 }
236+
237+ return 0 ;
238+ }
239+
240+ acpi_status acpi_run_osc (acpi_handle handle , struct acpi_osc_context * context )
241+ {
242+ u32 errors , * capbuf = context -> cap .pointer ;
243+ union acpi_object in_params [4 ], * out_obj ;
244+ struct acpi_buffer output ;
245+ acpi_status status = AE_OK ;
246+ guid_t guid ;
247+ int ret ;
248+
249+ if (!context || !context -> cap .pointer ||
250+ context -> cap .length < 2 * sizeof (32 ) ||
251+ guid_parse (context -> uuid_str , & guid ))
252+ return AE_BAD_PARAMETER ;
253+
254+ ret = acpi_eval_osc (handle , & guid , context -> rev , & context -> cap ,
255+ in_params , & output );
256+ if (ret )
257+ return AE_ERROR ;
258+
259+ out_obj = output .pointer ;
245260 /* Only take defined error bits into account. */
246261 errors = * ((u32 * )out_obj -> buffer .pointer ) & OSC_ERROR_MASK ;
247262 /*
0 commit comments