diff options
author | Lin Ming <ming.m.lin@intel.com> | 2011-11-16 01:38:13 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2012-01-17 03:36:30 -0500 |
commit | e0fe0a8d4ed5474261d0ee1452f5d9ae77236958 (patch) | |
tree | cec332ccaab7fa0dd03cbc87ea1212f7182c2309 /drivers/acpi/acpica/rscalc.c | |
parent | 2da120b6847f85c406f9afa13853e2755684389e (diff) |
ACPI 5.0: Support for all new resource descriptors
FixedDMA, GPIO descriptors, SerialBus descriptors
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/acpica/rscalc.c')
-rw-r--r-- | drivers/acpi/acpica/rscalc.c | 87 |
1 files changed, 80 insertions, 7 deletions
diff --git a/drivers/acpi/acpica/rscalc.c b/drivers/acpi/acpica/rscalc.c index 3a8a89ec2ca4..3a29b4dd4453 100644 --- a/drivers/acpi/acpica/rscalc.c +++ b/drivers/acpi/acpica/rscalc.c | |||
@@ -313,6 +313,38 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) | |||
313 | resource_source)); | 313 | resource_source)); |
314 | break; | 314 | break; |
315 | 315 | ||
316 | case ACPI_RESOURCE_TYPE_GPIO: | ||
317 | |||
318 | total_size = | ||
319 | (acpi_rs_length) (total_size + | ||
320 | (resource->data.gpio. | ||
321 | pin_table_length * 2) + | ||
322 | resource->data.gpio. | ||
323 | resource_source.string_length + | ||
324 | resource->data.gpio. | ||
325 | vendor_length); | ||
326 | |||
327 | break; | ||
328 | |||
329 | case ACPI_RESOURCE_TYPE_SERIAL_BUS: | ||
330 | |||
331 | total_size = | ||
332 | acpi_gbl_aml_resource_serial_bus_sizes[resource-> | ||
333 | data. | ||
334 | common_serial_bus. | ||
335 | type]; | ||
336 | |||
337 | total_size = (acpi_rs_length) (total_size + | ||
338 | resource->data. | ||
339 | i2c_serial_bus. | ||
340 | resource_source. | ||
341 | string_length + | ||
342 | resource->data. | ||
343 | i2c_serial_bus. | ||
344 | vendor_length); | ||
345 | |||
346 | break; | ||
347 | |||
316 | default: | 348 | default: |
317 | break; | 349 | break; |
318 | } | 350 | } |
@@ -362,10 +394,11 @@ acpi_rs_get_list_length(u8 * aml_buffer, | |||
362 | u32 extra_struct_bytes; | 394 | u32 extra_struct_bytes; |
363 | u8 resource_index; | 395 | u8 resource_index; |
364 | u8 minimum_aml_resource_length; | 396 | u8 minimum_aml_resource_length; |
397 | union aml_resource *aml_resource; | ||
365 | 398 | ||
366 | ACPI_FUNCTION_TRACE(rs_get_list_length); | 399 | ACPI_FUNCTION_TRACE(rs_get_list_length); |
367 | 400 | ||
368 | *size_needed = 0; | 401 | *size_needed = ACPI_RS_SIZE_MIN; /* Minimum size is one end_tag */ |
369 | end_aml = aml_buffer + aml_buffer_length; | 402 | end_aml = aml_buffer + aml_buffer_length; |
370 | 403 | ||
371 | /* Walk the list of AML resource descriptors */ | 404 | /* Walk the list of AML resource descriptors */ |
@@ -376,9 +409,15 @@ acpi_rs_get_list_length(u8 * aml_buffer, | |||
376 | 409 | ||
377 | status = acpi_ut_validate_resource(aml_buffer, &resource_index); | 410 | status = acpi_ut_validate_resource(aml_buffer, &resource_index); |
378 | if (ACPI_FAILURE(status)) { | 411 | if (ACPI_FAILURE(status)) { |
412 | /* | ||
413 | * Exit on failure. Cannot continue because the descriptor length | ||
414 | * may be bogus also. | ||
415 | */ | ||
379 | return_ACPI_STATUS(status); | 416 | return_ACPI_STATUS(status); |
380 | } | 417 | } |
381 | 418 | ||
419 | aml_resource = (void *)aml_buffer; | ||
420 | |||
382 | /* Get the resource length and base (minimum) AML size */ | 421 | /* Get the resource length and base (minimum) AML size */ |
383 | 422 | ||
384 | resource_length = acpi_ut_get_resource_length(aml_buffer); | 423 | resource_length = acpi_ut_get_resource_length(aml_buffer); |
@@ -422,10 +461,8 @@ acpi_rs_get_list_length(u8 * aml_buffer, | |||
422 | 461 | ||
423 | case ACPI_RESOURCE_NAME_END_TAG: | 462 | case ACPI_RESOURCE_NAME_END_TAG: |
424 | /* | 463 | /* |
425 | * End Tag: | 464 | * End Tag: This is the normal exit |
426 | * This is the normal exit, add size of end_tag | ||
427 | */ | 465 | */ |
428 | *size_needed += ACPI_RS_SIZE_MIN; | ||
429 | return_ACPI_STATUS(AE_OK); | 466 | return_ACPI_STATUS(AE_OK); |
430 | 467 | ||
431 | case ACPI_RESOURCE_NAME_ADDRESS32: | 468 | case ACPI_RESOURCE_NAME_ADDRESS32: |
@@ -457,6 +494,33 @@ acpi_rs_get_list_length(u8 * aml_buffer, | |||
457 | minimum_aml_resource_length); | 494 | minimum_aml_resource_length); |
458 | break; | 495 | break; |
459 | 496 | ||
497 | case ACPI_RESOURCE_NAME_GPIO: | ||
498 | |||
499 | /* Vendor data is optional */ | ||
500 | |||
501 | if (aml_resource->gpio.vendor_length) { | ||
502 | extra_struct_bytes += | ||
503 | aml_resource->gpio.vendor_offset - | ||
504 | aml_resource->gpio.pin_table_offset + | ||
505 | aml_resource->gpio.vendor_length; | ||
506 | } else { | ||
507 | extra_struct_bytes += | ||
508 | aml_resource->large_header.resource_length + | ||
509 | sizeof(struct aml_resource_large_header) - | ||
510 | aml_resource->gpio.pin_table_offset; | ||
511 | } | ||
512 | break; | ||
513 | |||
514 | case ACPI_RESOURCE_NAME_SERIAL_BUS: | ||
515 | |||
516 | minimum_aml_resource_length = | ||
517 | acpi_gbl_resource_aml_serial_bus_sizes | ||
518 | [aml_resource->common_serial_bus.type]; | ||
519 | extra_struct_bytes += | ||
520 | aml_resource->common_serial_bus.resource_length - | ||
521 | minimum_aml_resource_length; | ||
522 | break; | ||
523 | |||
460 | default: | 524 | default: |
461 | break; | 525 | break; |
462 | } | 526 | } |
@@ -467,9 +531,18 @@ acpi_rs_get_list_length(u8 * aml_buffer, | |||
467 | * Important: Round the size up for the appropriate alignment. This | 531 | * Important: Round the size up for the appropriate alignment. This |
468 | * is a requirement on IA64. | 532 | * is a requirement on IA64. |
469 | */ | 533 | */ |
470 | buffer_size = acpi_gbl_resource_struct_sizes[resource_index] + | 534 | if (acpi_ut_get_resource_type(aml_buffer) == |
471 | extra_struct_bytes; | 535 | ACPI_RESOURCE_NAME_SERIAL_BUS) { |
472 | buffer_size = (u32) ACPI_ROUND_UP_TO_NATIVE_WORD(buffer_size); | 536 | buffer_size = |
537 | acpi_gbl_resource_struct_serial_bus_sizes | ||
538 | [aml_resource->common_serial_bus.type] + | ||
539 | extra_struct_bytes; | ||
540 | } else { | ||
541 | buffer_size = | ||
542 | acpi_gbl_resource_struct_sizes[resource_index] + | ||
543 | extra_struct_bytes; | ||
544 | } | ||
545 | buffer_size = (u32)ACPI_ROUND_UP_TO_NATIVE_WORD(buffer_size); | ||
473 | 546 | ||
474 | *size_needed += buffer_size; | 547 | *size_needed += buffer_size; |
475 | 548 | ||