1 /* 2 * ACPI device specific properties support. 3 * 4 * Copyright (C) 2014, Intel Corporation 5 * All rights reserved. 6 * 7 * Authors: Mika Westerberg <mika.westerberg@linux.intel.com> 8 * Darren Hart <dvhart@linux.intel.com> 9 * Rafael J. Wysocki <rafael.j.wysocki@intel.com> 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License version 2 as 13 * published by the Free Software Foundation. 14 */ 15 16 #include <linux/acpi.h> 17 #include <linux/device.h> 18 #include <linux/export.h> 19 20 #include "internal.h" 21 22 static int acpi_data_get_property_array(const struct acpi_device_data *data, 23 const char *name, 24 acpi_object_type type, 25 const union acpi_object **obj); 26 27 /* ACPI _DSD device properties GUID: daffd814-6eba-4d8c-8a91-bc9bbf4aa301 */ 28 static const guid_t prp_guid = 29 GUID_INIT(0xdaffd814, 0x6eba, 0x4d8c, 30 0x8a, 0x91, 0xbc, 0x9b, 0xbf, 0x4a, 0xa3, 0x01); 31 /* ACPI _DSD data subnodes GUID: dbb8e3e6-5886-4ba6-8795-1319f52a966b */ 32 static const guid_t ads_guid = 33 GUID_INIT(0xdbb8e3e6, 0x5886, 0x4ba6, 34 0x87, 0x95, 0x13, 0x19, 0xf5, 0x2a, 0x96, 0x6b); 35 36 static bool acpi_enumerate_nondev_subnodes(acpi_handle scope, 37 const union acpi_object *desc, 38 struct acpi_device_data *data, 39 struct fwnode_handle *parent); 40 static bool acpi_extract_properties(const union acpi_object *desc, 41 struct acpi_device_data *data); 42 43 static bool acpi_nondev_subnode_extract(const union acpi_object *desc, 44 acpi_handle handle, 45 const union acpi_object *link, 46 struct list_head *list, 47 struct fwnode_handle *parent) 48 { 49 struct acpi_data_node *dn; 50 bool result; 51 52 dn = kzalloc(sizeof(*dn), GFP_KERNEL); 53 if (!dn) 54 return false; 55 56 dn->name = link->package.elements[0].string.pointer; 57 dn->fwnode.ops = &acpi_data_fwnode_ops; 58 dn->parent = parent; 59 INIT_LIST_HEAD(&dn->data.subnodes); 60 61 result = acpi_extract_properties(desc, &dn->data); 62 63 if (handle) { 64 acpi_handle scope; 65 acpi_status status; 66 67 /* 68 * The scope for the subnode object lookup is the one of the 69 * namespace node (device) containing the object that has 70 * returned the package. That is, it's the scope of that 71 * object's parent. 72 */ 73 status = acpi_get_parent(handle, &scope); 74 if (ACPI_SUCCESS(status) 75 && acpi_enumerate_nondev_subnodes(scope, desc, &dn->data, 76 &dn->fwnode)) 77 result = true; 78 } else if (acpi_enumerate_nondev_subnodes(NULL, desc, &dn->data, 79 &dn->fwnode)) { 80 result = true; 81 } 82 83 if (result) { 84 dn->handle = handle; 85 dn->data.pointer = desc; 86 list_add_tail(&dn->sibling, list); 87 return true; 88 } 89 90 kfree(dn); 91 acpi_handle_debug(handle, "Invalid properties/subnodes data, skipping\n"); 92 return false; 93 } 94 95 static bool acpi_nondev_subnode_data_ok(acpi_handle handle, 96 const union acpi_object *link, 97 struct list_head *list, 98 struct fwnode_handle *parent) 99 { 100 struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER }; 101 acpi_status status; 102 103 status = acpi_evaluate_object_typed(handle, NULL, NULL, &buf, 104 ACPI_TYPE_PACKAGE); 105 if (ACPI_FAILURE(status)) 106 return false; 107 108 if (acpi_nondev_subnode_extract(buf.pointer, handle, link, list, 109 parent)) 110 return true; 111 112 ACPI_FREE(buf.pointer); 113 return false; 114 } 115 116 static bool acpi_nondev_subnode_ok(acpi_handle scope, 117 const union acpi_object *link, 118 struct list_head *list, 119 struct fwnode_handle *parent) 120 { 121 acpi_handle handle; 122 acpi_status status; 123 124 if (!scope) 125 return false; 126 127 status = acpi_get_handle(scope, link->package.elements[1].string.pointer, 128 &handle); 129 if (ACPI_FAILURE(status)) 130 return false; 131 132 return acpi_nondev_subnode_data_ok(handle, link, list, parent); 133 } 134 135 static int acpi_add_nondev_subnodes(acpi_handle scope, 136 const union acpi_object *links, 137 struct list_head *list, 138 struct fwnode_handle *parent) 139 { 140 bool ret = false; 141 int i; 142 143 for (i = 0; i < links->package.count; i++) { 144 const union acpi_object *link, *desc; 145 acpi_handle handle; 146 bool result; 147 148 link = &links->package.elements[i]; 149 /* Only two elements allowed. */ 150 if (link->package.count != 2) 151 continue; 152 153 /* The first one must be a string. */ 154 if (link->package.elements[0].type != ACPI_TYPE_STRING) 155 continue; 156 157 /* The second one may be a string, a reference or a package. */ 158 switch (link->package.elements[1].type) { 159 case ACPI_TYPE_STRING: 160 result = acpi_nondev_subnode_ok(scope, link, list, 161 parent); 162 break; 163 case ACPI_TYPE_LOCAL_REFERENCE: 164 handle = link->package.elements[1].reference.handle; 165 result = acpi_nondev_subnode_data_ok(handle, link, list, 166 parent); 167 break; 168 case ACPI_TYPE_PACKAGE: 169 desc = &link->package.elements[1]; 170 result = acpi_nondev_subnode_extract(desc, NULL, link, 171 list, parent); 172 break; 173 default: 174 result = false; 175 break; 176 } 177 ret = ret || result; 178 } 179 180 return ret; 181 } 182 183 static bool acpi_enumerate_nondev_subnodes(acpi_handle scope, 184 const union acpi_object *desc, 185 struct acpi_device_data *data, 186 struct fwnode_handle *parent) 187 { 188 int i; 189 190 /* Look for the ACPI data subnodes GUID. */ 191 for (i = 0; i < desc->package.count; i += 2) { 192 const union acpi_object *guid, *links; 193 194 guid = &desc->package.elements[i]; 195 links = &desc->package.elements[i + 1]; 196 197 /* 198 * The first element must be a GUID and the second one must be 199 * a package. 200 */ 201 if (guid->type != ACPI_TYPE_BUFFER || 202 guid->buffer.length != 16 || 203 links->type != ACPI_TYPE_PACKAGE) 204 break; 205 206 if (!guid_equal((guid_t *)guid->buffer.pointer, &ads_guid)) 207 continue; 208 209 return acpi_add_nondev_subnodes(scope, links, &data->subnodes, 210 parent); 211 } 212 213 return false; 214 } 215 216 static bool acpi_property_value_ok(const union acpi_object *value) 217 { 218 int j; 219 220 /* 221 * The value must be an integer, a string, a reference, or a package 222 * whose every element must be an integer, a string, or a reference. 223 */ 224 switch (value->type) { 225 case ACPI_TYPE_INTEGER: 226 case ACPI_TYPE_STRING: 227 case ACPI_TYPE_LOCAL_REFERENCE: 228 return true; 229 230 case ACPI_TYPE_PACKAGE: 231 for (j = 0; j < value->package.count; j++) 232 switch (value->package.elements[j].type) { 233 case ACPI_TYPE_INTEGER: 234 case ACPI_TYPE_STRING: 235 case ACPI_TYPE_LOCAL_REFERENCE: 236 continue; 237 238 default: 239 return false; 240 } 241 242 return true; 243 } 244 return false; 245 } 246 247 static bool acpi_properties_format_valid(const union acpi_object *properties) 248 { 249 int i; 250 251 for (i = 0; i < properties->package.count; i++) { 252 const union acpi_object *property; 253 254 property = &properties->package.elements[i]; 255 /* 256 * Only two elements allowed, the first one must be a string and 257 * the second one has to satisfy certain conditions. 258 */ 259 if (property->package.count != 2 260 || property->package.elements[0].type != ACPI_TYPE_STRING 261 || !acpi_property_value_ok(&property->package.elements[1])) 262 return false; 263 } 264 return true; 265 } 266 267 static void acpi_init_of_compatible(struct acpi_device *adev) 268 { 269 const union acpi_object *of_compatible; 270 int ret; 271 272 ret = acpi_data_get_property_array(&adev->data, "compatible", 273 ACPI_TYPE_STRING, &of_compatible); 274 if (ret) { 275 ret = acpi_dev_get_property(adev, "compatible", 276 ACPI_TYPE_STRING, &of_compatible); 277 if (ret) { 278 if (adev->parent 279 && adev->parent->flags.of_compatible_ok) 280 goto out; 281 282 return; 283 } 284 } 285 adev->data.of_compatible = of_compatible; 286 287 out: 288 adev->flags.of_compatible_ok = 1; 289 } 290 291 static bool acpi_extract_properties(const union acpi_object *desc, 292 struct acpi_device_data *data) 293 { 294 int i; 295 296 if (desc->package.count % 2) 297 return false; 298 299 /* Look for the device properties GUID. */ 300 for (i = 0; i < desc->package.count; i += 2) { 301 const union acpi_object *guid, *properties; 302 303 guid = &desc->package.elements[i]; 304 properties = &desc->package.elements[i + 1]; 305 306 /* 307 * The first element must be a GUID and the second one must be 308 * a package. 309 */ 310 if (guid->type != ACPI_TYPE_BUFFER || 311 guid->buffer.length != 16 || 312 properties->type != ACPI_TYPE_PACKAGE) 313 break; 314 315 if (!guid_equal((guid_t *)guid->buffer.pointer, &prp_guid)) 316 continue; 317 318 /* 319 * We found the matching GUID. Now validate the format of the 320 * package immediately following it. 321 */ 322 if (!acpi_properties_format_valid(properties)) 323 break; 324 325 data->properties = properties; 326 return true; 327 } 328 329 return false; 330 } 331 332 void acpi_init_properties(struct acpi_device *adev) 333 { 334 struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER }; 335 struct acpi_hardware_id *hwid; 336 acpi_status status; 337 bool acpi_of = false; 338 339 INIT_LIST_HEAD(&adev->data.subnodes); 340 341 if (!adev->handle) 342 return; 343 344 /* 345 * Check if ACPI_DT_NAMESPACE_HID is present and inthat case we fill in 346 * Device Tree compatible properties for this device. 347 */ 348 list_for_each_entry(hwid, &adev->pnp.ids, list) { 349 if (!strcmp(hwid->id, ACPI_DT_NAMESPACE_HID)) { 350 acpi_of = true; 351 break; 352 } 353 } 354 355 status = acpi_evaluate_object_typed(adev->handle, "_DSD", NULL, &buf, 356 ACPI_TYPE_PACKAGE); 357 if (ACPI_FAILURE(status)) 358 goto out; 359 360 if (acpi_extract_properties(buf.pointer, &adev->data)) { 361 adev->data.pointer = buf.pointer; 362 if (acpi_of) 363 acpi_init_of_compatible(adev); 364 } 365 if (acpi_enumerate_nondev_subnodes(adev->handle, buf.pointer, 366 &adev->data, acpi_fwnode_handle(adev))) 367 adev->data.pointer = buf.pointer; 368 369 if (!adev->data.pointer) { 370 acpi_handle_debug(adev->handle, "Invalid _DSD data, skipping\n"); 371 ACPI_FREE(buf.pointer); 372 } 373 374 out: 375 if (acpi_of && !adev->flags.of_compatible_ok) 376 acpi_handle_info(adev->handle, 377 ACPI_DT_NAMESPACE_HID " requires 'compatible' property\n"); 378 379 if (!adev->data.pointer) 380 acpi_extract_apple_properties(adev); 381 } 382 383 static void acpi_destroy_nondev_subnodes(struct list_head *list) 384 { 385 struct acpi_data_node *dn, *next; 386 387 if (list_empty(list)) 388 return; 389 390 list_for_each_entry_safe_reverse(dn, next, list, sibling) { 391 acpi_destroy_nondev_subnodes(&dn->data.subnodes); 392 wait_for_completion(&dn->kobj_done); 393 list_del(&dn->sibling); 394 ACPI_FREE((void *)dn->data.pointer); 395 kfree(dn); 396 } 397 } 398 399 void acpi_free_properties(struct acpi_device *adev) 400 { 401 acpi_destroy_nondev_subnodes(&adev->data.subnodes); 402 ACPI_FREE((void *)adev->data.pointer); 403 adev->data.of_compatible = NULL; 404 adev->data.pointer = NULL; 405 adev->data.properties = NULL; 406 } 407 408 /** 409 * acpi_data_get_property - return an ACPI property with given name 410 * @data: ACPI device deta object to get the property from 411 * @name: Name of the property 412 * @type: Expected property type 413 * @obj: Location to store the property value (if not %NULL) 414 * 415 * Look up a property with @name and store a pointer to the resulting ACPI 416 * object at the location pointed to by @obj if found. 417 * 418 * Callers must not attempt to free the returned objects. These objects will be 419 * freed by the ACPI core automatically during the removal of @data. 420 * 421 * Return: %0 if property with @name has been found (success), 422 * %-EINVAL if the arguments are invalid, 423 * %-EINVAL if the property doesn't exist, 424 * %-EPROTO if the property value type doesn't match @type. 425 */ 426 static int acpi_data_get_property(const struct acpi_device_data *data, 427 const char *name, acpi_object_type type, 428 const union acpi_object **obj) 429 { 430 const union acpi_object *properties; 431 int i; 432 433 if (!data || !name) 434 return -EINVAL; 435 436 if (!data->pointer || !data->properties) 437 return -EINVAL; 438 439 properties = data->properties; 440 for (i = 0; i < properties->package.count; i++) { 441 const union acpi_object *propname, *propvalue; 442 const union acpi_object *property; 443 444 property = &properties->package.elements[i]; 445 446 propname = &property->package.elements[0]; 447 propvalue = &property->package.elements[1]; 448 449 if (!strcmp(name, propname->string.pointer)) { 450 if (type != ACPI_TYPE_ANY && propvalue->type != type) 451 return -EPROTO; 452 if (obj) 453 *obj = propvalue; 454 455 return 0; 456 } 457 } 458 return -EINVAL; 459 } 460 461 /** 462 * acpi_dev_get_property - return an ACPI property with given name. 463 * @adev: ACPI device to get the property from. 464 * @name: Name of the property. 465 * @type: Expected property type. 466 * @obj: Location to store the property value (if not %NULL). 467 */ 468 int acpi_dev_get_property(const struct acpi_device *adev, const char *name, 469 acpi_object_type type, const union acpi_object **obj) 470 { 471 return adev ? acpi_data_get_property(&adev->data, name, type, obj) : -EINVAL; 472 } 473 EXPORT_SYMBOL_GPL(acpi_dev_get_property); 474 475 static const struct acpi_device_data * 476 acpi_device_data_of_node(const struct fwnode_handle *fwnode) 477 { 478 if (is_acpi_device_node(fwnode)) { 479 const struct acpi_device *adev = to_acpi_device_node(fwnode); 480 return &adev->data; 481 } else if (is_acpi_data_node(fwnode)) { 482 const struct acpi_data_node *dn = to_acpi_data_node(fwnode); 483 return &dn->data; 484 } 485 return NULL; 486 } 487 488 /** 489 * acpi_node_prop_get - return an ACPI property with given name. 490 * @fwnode: Firmware node to get the property from. 491 * @propname: Name of the property. 492 * @valptr: Location to store a pointer to the property value (if not %NULL). 493 */ 494 int acpi_node_prop_get(const struct fwnode_handle *fwnode, 495 const char *propname, void **valptr) 496 { 497 return acpi_data_get_property(acpi_device_data_of_node(fwnode), 498 propname, ACPI_TYPE_ANY, 499 (const union acpi_object **)valptr); 500 } 501 502 /** 503 * acpi_data_get_property_array - return an ACPI array property with given name 504 * @adev: ACPI data object to get the property from 505 * @name: Name of the property 506 * @type: Expected type of array elements 507 * @obj: Location to store a pointer to the property value (if not NULL) 508 * 509 * Look up an array property with @name and store a pointer to the resulting 510 * ACPI object at the location pointed to by @obj if found. 511 * 512 * Callers must not attempt to free the returned objects. Those objects will be 513 * freed by the ACPI core automatically during the removal of @data. 514 * 515 * Return: %0 if array property (package) with @name has been found (success), 516 * %-EINVAL if the arguments are invalid, 517 * %-EINVAL if the property doesn't exist, 518 * %-EPROTO if the property is not a package or the type of its elements 519 * doesn't match @type. 520 */ 521 static int acpi_data_get_property_array(const struct acpi_device_data *data, 522 const char *name, 523 acpi_object_type type, 524 const union acpi_object **obj) 525 { 526 const union acpi_object *prop; 527 int ret, i; 528 529 ret = acpi_data_get_property(data, name, ACPI_TYPE_PACKAGE, &prop); 530 if (ret) 531 return ret; 532 533 if (type != ACPI_TYPE_ANY) { 534 /* Check that all elements are of correct type. */ 535 for (i = 0; i < prop->package.count; i++) 536 if (prop->package.elements[i].type != type) 537 return -EPROTO; 538 } 539 if (obj) 540 *obj = prop; 541 542 return 0; 543 } 544 545 /** 546 * __acpi_node_get_property_reference - returns handle to the referenced object 547 * @fwnode: Firmware node to get the property from 548 * @propname: Name of the property 549 * @index: Index of the reference to return 550 * @num_args: Maximum number of arguments after each reference 551 * @args: Location to store the returned reference with optional arguments 552 * 553 * Find property with @name, verifify that it is a package containing at least 554 * one object reference and if so, store the ACPI device object pointer to the 555 * target object in @args->adev. If the reference includes arguments, store 556 * them in the @args->args[] array. 557 * 558 * If there's more than one reference in the property value package, @index is 559 * used to select the one to return. 560 * 561 * It is possible to leave holes in the property value set like in the 562 * example below: 563 * 564 * Package () { 565 * "cs-gpios", 566 * Package () { 567 * ^GPIO, 19, 0, 0, 568 * ^GPIO, 20, 0, 0, 569 * 0, 570 * ^GPIO, 21, 0, 0, 571 * } 572 * } 573 * 574 * Calling this function with index %2 return %-ENOENT and with index %3 575 * returns the last entry. If the property does not contain any more values 576 * %-ENODATA is returned. The NULL entry must be single integer and 577 * preferably contain value %0. 578 * 579 * Return: %0 on success, negative error code on failure. 580 */ 581 int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode, 582 const char *propname, size_t index, size_t num_args, 583 struct acpi_reference_args *args) 584 { 585 const union acpi_object *element, *end; 586 const union acpi_object *obj; 587 const struct acpi_device_data *data; 588 struct acpi_device *device; 589 int ret, idx = 0; 590 591 data = acpi_device_data_of_node(fwnode); 592 if (!data) 593 return -EINVAL; 594 595 ret = acpi_data_get_property(data, propname, ACPI_TYPE_ANY, &obj); 596 if (ret) 597 return ret; 598 599 /* 600 * The simplest case is when the value is a single reference. Just 601 * return that reference then. 602 */ 603 if (obj->type == ACPI_TYPE_LOCAL_REFERENCE) { 604 if (index) 605 return -EINVAL; 606 607 ret = acpi_bus_get_device(obj->reference.handle, &device); 608 if (ret) 609 return ret; 610 611 args->adev = device; 612 args->nargs = 0; 613 return 0; 614 } 615 616 /* 617 * If it is not a single reference, then it is a package of 618 * references followed by number of ints as follows: 619 * 620 * Package () { REF, INT, REF, INT, INT } 621 * 622 * The index argument is then used to determine which reference 623 * the caller wants (along with the arguments). 624 */ 625 if (obj->type != ACPI_TYPE_PACKAGE || index >= obj->package.count) 626 return -EPROTO; 627 628 element = obj->package.elements; 629 end = element + obj->package.count; 630 631 while (element < end) { 632 u32 nargs, i; 633 634 if (element->type == ACPI_TYPE_LOCAL_REFERENCE) { 635 ret = acpi_bus_get_device(element->reference.handle, 636 &device); 637 if (ret) 638 return -ENODEV; 639 640 nargs = 0; 641 element++; 642 643 /* assume following integer elements are all args */ 644 for (i = 0; element + i < end && i < num_args; i++) { 645 int type = element[i].type; 646 647 if (type == ACPI_TYPE_INTEGER) 648 nargs++; 649 else if (type == ACPI_TYPE_LOCAL_REFERENCE) 650 break; 651 else 652 return -EPROTO; 653 } 654 655 if (nargs > MAX_ACPI_REFERENCE_ARGS) 656 return -EPROTO; 657 658 if (idx == index) { 659 args->adev = device; 660 args->nargs = nargs; 661 for (i = 0; i < nargs; i++) 662 args->args[i] = element[i].integer.value; 663 664 return 0; 665 } 666 667 element += nargs; 668 } else if (element->type == ACPI_TYPE_INTEGER) { 669 if (idx == index) 670 return -ENOENT; 671 element++; 672 } else { 673 return -EPROTO; 674 } 675 676 idx++; 677 } 678 679 return -ENODATA; 680 } 681 EXPORT_SYMBOL_GPL(__acpi_node_get_property_reference); 682 683 static int acpi_data_prop_read_single(const struct acpi_device_data *data, 684 const char *propname, 685 enum dev_prop_type proptype, void *val) 686 { 687 const union acpi_object *obj; 688 int ret; 689 690 if (!val) 691 return -EINVAL; 692 693 if (proptype >= DEV_PROP_U8 && proptype <= DEV_PROP_U64) { 694 ret = acpi_data_get_property(data, propname, ACPI_TYPE_INTEGER, &obj); 695 if (ret) 696 return ret; 697 698 switch (proptype) { 699 case DEV_PROP_U8: 700 if (obj->integer.value > U8_MAX) 701 return -EOVERFLOW; 702 *(u8 *)val = obj->integer.value; 703 break; 704 case DEV_PROP_U16: 705 if (obj->integer.value > U16_MAX) 706 return -EOVERFLOW; 707 *(u16 *)val = obj->integer.value; 708 break; 709 case DEV_PROP_U32: 710 if (obj->integer.value > U32_MAX) 711 return -EOVERFLOW; 712 *(u32 *)val = obj->integer.value; 713 break; 714 default: 715 *(u64 *)val = obj->integer.value; 716 break; 717 } 718 } else if (proptype == DEV_PROP_STRING) { 719 ret = acpi_data_get_property(data, propname, ACPI_TYPE_STRING, &obj); 720 if (ret) 721 return ret; 722 723 *(char **)val = obj->string.pointer; 724 725 return 1; 726 } else { 727 ret = -EINVAL; 728 } 729 return ret; 730 } 731 732 int acpi_dev_prop_read_single(struct acpi_device *adev, const char *propname, 733 enum dev_prop_type proptype, void *val) 734 { 735 int ret; 736 737 if (!adev) 738 return -EINVAL; 739 740 ret = acpi_data_prop_read_single(&adev->data, propname, proptype, val); 741 if (ret < 0 || proptype != ACPI_TYPE_STRING) 742 return ret; 743 return 0; 744 } 745 746 static int acpi_copy_property_array_u8(const union acpi_object *items, u8 *val, 747 size_t nval) 748 { 749 int i; 750 751 for (i = 0; i < nval; i++) { 752 if (items[i].type != ACPI_TYPE_INTEGER) 753 return -EPROTO; 754 if (items[i].integer.value > U8_MAX) 755 return -EOVERFLOW; 756 757 val[i] = items[i].integer.value; 758 } 759 return 0; 760 } 761 762 static int acpi_copy_property_array_u16(const union acpi_object *items, 763 u16 *val, size_t nval) 764 { 765 int i; 766 767 for (i = 0; i < nval; i++) { 768 if (items[i].type != ACPI_TYPE_INTEGER) 769 return -EPROTO; 770 if (items[i].integer.value > U16_MAX) 771 return -EOVERFLOW; 772 773 val[i] = items[i].integer.value; 774 } 775 return 0; 776 } 777 778 static int acpi_copy_property_array_u32(const union acpi_object *items, 779 u32 *val, size_t nval) 780 { 781 int i; 782 783 for (i = 0; i < nval; i++) { 784 if (items[i].type != ACPI_TYPE_INTEGER) 785 return -EPROTO; 786 if (items[i].integer.value > U32_MAX) 787 return -EOVERFLOW; 788 789 val[i] = items[i].integer.value; 790 } 791 return 0; 792 } 793 794 static int acpi_copy_property_array_u64(const union acpi_object *items, 795 u64 *val, size_t nval) 796 { 797 int i; 798 799 for (i = 0; i < nval; i++) { 800 if (items[i].type != ACPI_TYPE_INTEGER) 801 return -EPROTO; 802 803 val[i] = items[i].integer.value; 804 } 805 return 0; 806 } 807 808 static int acpi_copy_property_array_string(const union acpi_object *items, 809 char **val, size_t nval) 810 { 811 int i; 812 813 for (i = 0; i < nval; i++) { 814 if (items[i].type != ACPI_TYPE_STRING) 815 return -EPROTO; 816 817 val[i] = items[i].string.pointer; 818 } 819 return nval; 820 } 821 822 static int acpi_data_prop_read(const struct acpi_device_data *data, 823 const char *propname, 824 enum dev_prop_type proptype, 825 void *val, size_t nval) 826 { 827 const union acpi_object *obj; 828 const union acpi_object *items; 829 int ret; 830 831 if (val && nval == 1) { 832 ret = acpi_data_prop_read_single(data, propname, proptype, val); 833 if (ret >= 0) 834 return ret; 835 } 836 837 ret = acpi_data_get_property_array(data, propname, ACPI_TYPE_ANY, &obj); 838 if (ret) 839 return ret; 840 841 if (!val) 842 return obj->package.count; 843 844 if (proptype != DEV_PROP_STRING && nval > obj->package.count) 845 return -EOVERFLOW; 846 else if (nval <= 0) 847 return -EINVAL; 848 849 items = obj->package.elements; 850 851 switch (proptype) { 852 case DEV_PROP_U8: 853 ret = acpi_copy_property_array_u8(items, (u8 *)val, nval); 854 break; 855 case DEV_PROP_U16: 856 ret = acpi_copy_property_array_u16(items, (u16 *)val, nval); 857 break; 858 case DEV_PROP_U32: 859 ret = acpi_copy_property_array_u32(items, (u32 *)val, nval); 860 break; 861 case DEV_PROP_U64: 862 ret = acpi_copy_property_array_u64(items, (u64 *)val, nval); 863 break; 864 case DEV_PROP_STRING: 865 ret = acpi_copy_property_array_string( 866 items, (char **)val, 867 min_t(u32, nval, obj->package.count)); 868 break; 869 default: 870 ret = -EINVAL; 871 break; 872 } 873 return ret; 874 } 875 876 int acpi_dev_prop_read(const struct acpi_device *adev, const char *propname, 877 enum dev_prop_type proptype, void *val, size_t nval) 878 { 879 return adev ? acpi_data_prop_read(&adev->data, propname, proptype, val, nval) : -EINVAL; 880 } 881 882 /** 883 * acpi_node_prop_read - retrieve the value of an ACPI property with given name. 884 * @fwnode: Firmware node to get the property from. 885 * @propname: Name of the property. 886 * @proptype: Expected property type. 887 * @val: Location to store the property value (if not %NULL). 888 * @nval: Size of the array pointed to by @val. 889 * 890 * If @val is %NULL, return the number of array elements comprising the value 891 * of the property. Otherwise, read at most @nval values to the array at the 892 * location pointed to by @val. 893 */ 894 int acpi_node_prop_read(const struct fwnode_handle *fwnode, 895 const char *propname, enum dev_prop_type proptype, 896 void *val, size_t nval) 897 { 898 return acpi_data_prop_read(acpi_device_data_of_node(fwnode), 899 propname, proptype, val, nval); 900 } 901 902 /** 903 * acpi_get_next_subnode - Return the next child node handle for a fwnode 904 * @fwnode: Firmware node to find the next child node for. 905 * @child: Handle to one of the device's child nodes or a null handle. 906 */ 907 struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode, 908 struct fwnode_handle *child) 909 { 910 const struct acpi_device *adev = to_acpi_device_node(fwnode); 911 const struct list_head *head; 912 struct list_head *next; 913 914 if (!child || is_acpi_device_node(child)) { 915 struct acpi_device *child_adev; 916 917 if (adev) 918 head = &adev->children; 919 else 920 goto nondev; 921 922 if (list_empty(head)) 923 goto nondev; 924 925 if (child) { 926 adev = to_acpi_device_node(child); 927 next = adev->node.next; 928 if (next == head) { 929 child = NULL; 930 goto nondev; 931 } 932 child_adev = list_entry(next, struct acpi_device, node); 933 } else { 934 child_adev = list_first_entry(head, struct acpi_device, 935 node); 936 } 937 return acpi_fwnode_handle(child_adev); 938 } 939 940 nondev: 941 if (!child || is_acpi_data_node(child)) { 942 const struct acpi_data_node *data = to_acpi_data_node(fwnode); 943 struct acpi_data_node *dn; 944 945 if (adev) 946 head = &adev->data.subnodes; 947 else if (data) 948 head = &data->data.subnodes; 949 else 950 return NULL; 951 952 if (list_empty(head)) 953 return NULL; 954 955 if (child) { 956 dn = to_acpi_data_node(child); 957 next = dn->sibling.next; 958 if (next == head) 959 return NULL; 960 961 dn = list_entry(next, struct acpi_data_node, sibling); 962 } else { 963 dn = list_first_entry(head, struct acpi_data_node, sibling); 964 } 965 return &dn->fwnode; 966 } 967 return NULL; 968 } 969 970 /** 971 * acpi_node_get_parent - Return parent fwnode of this fwnode 972 * @fwnode: Firmware node whose parent to get 973 * 974 * Returns parent node of an ACPI device or data firmware node or %NULL if 975 * not available. 976 */ 977 struct fwnode_handle *acpi_node_get_parent(const struct fwnode_handle *fwnode) 978 { 979 if (is_acpi_data_node(fwnode)) { 980 /* All data nodes have parent pointer so just return that */ 981 return to_acpi_data_node(fwnode)->parent; 982 } else if (is_acpi_device_node(fwnode)) { 983 acpi_handle handle, parent_handle; 984 985 handle = to_acpi_device_node(fwnode)->handle; 986 if (ACPI_SUCCESS(acpi_get_parent(handle, &parent_handle))) { 987 struct acpi_device *adev; 988 989 if (!acpi_bus_get_device(parent_handle, &adev)) 990 return acpi_fwnode_handle(adev); 991 } 992 } 993 994 return NULL; 995 } 996 997 /** 998 * acpi_graph_get_next_endpoint - Get next endpoint ACPI firmware node 999 * @fwnode: Pointer to the parent firmware node 1000 * @prev: Previous endpoint node or %NULL to get the first 1001 * 1002 * Looks up next endpoint ACPI firmware node below a given @fwnode. Returns 1003 * %NULL if there is no next endpoint, ERR_PTR() in case of error. In case 1004 * of success the next endpoint is returned. 1005 */ 1006 struct fwnode_handle *acpi_graph_get_next_endpoint( 1007 const struct fwnode_handle *fwnode, struct fwnode_handle *prev) 1008 { 1009 struct fwnode_handle *port = NULL; 1010 struct fwnode_handle *endpoint; 1011 1012 if (!prev) { 1013 do { 1014 port = fwnode_get_next_child_node(fwnode, port); 1015 /* Ports must have port property */ 1016 if (fwnode_property_present(port, "port")) 1017 break; 1018 } while (port); 1019 } else { 1020 port = fwnode_get_parent(prev); 1021 } 1022 1023 if (!port) 1024 return NULL; 1025 1026 endpoint = fwnode_get_next_child_node(port, prev); 1027 while (!endpoint) { 1028 port = fwnode_get_next_child_node(fwnode, port); 1029 if (!port) 1030 break; 1031 if (fwnode_property_present(port, "port")) 1032 endpoint = fwnode_get_next_child_node(port, NULL); 1033 } 1034 1035 if (endpoint) { 1036 /* Endpoints must have "endpoint" property */ 1037 if (!fwnode_property_present(endpoint, "endpoint")) 1038 return ERR_PTR(-EPROTO); 1039 } 1040 1041 return endpoint; 1042 } 1043 1044 /** 1045 * acpi_graph_get_child_prop_value - Return a child with a given property value 1046 * @fwnode: device fwnode 1047 * @prop_name: The name of the property to look for 1048 * @val: the desired property value 1049 * 1050 * Return the port node corresponding to a given port number. Returns 1051 * the child node on success, NULL otherwise. 1052 */ 1053 static struct fwnode_handle *acpi_graph_get_child_prop_value( 1054 const struct fwnode_handle *fwnode, const char *prop_name, 1055 unsigned int val) 1056 { 1057 struct fwnode_handle *child; 1058 1059 fwnode_for_each_child_node(fwnode, child) { 1060 u32 nr; 1061 1062 if (fwnode_property_read_u32(child, prop_name, &nr)) 1063 continue; 1064 1065 if (val == nr) 1066 return child; 1067 } 1068 1069 return NULL; 1070 } 1071 1072 1073 /** 1074 * acpi_graph_get_remote_enpoint - Parses and returns remote end of an endpoint 1075 * @fwnode: Endpoint firmware node pointing to a remote device 1076 * @parent: Firmware node of remote port parent is filled here if not %NULL 1077 * @port: Firmware node of remote port is filled here if not %NULL 1078 * @endpoint: Firmware node of remote endpoint is filled here if not %NULL 1079 * 1080 * Function parses remote end of ACPI firmware remote endpoint and fills in 1081 * fields requested by the caller. Returns %0 in case of success and 1082 * negative errno otherwise. 1083 */ 1084 int acpi_graph_get_remote_endpoint(const struct fwnode_handle *__fwnode, 1085 struct fwnode_handle **parent, 1086 struct fwnode_handle **port, 1087 struct fwnode_handle **endpoint) 1088 { 1089 struct fwnode_handle *fwnode; 1090 unsigned int port_nr, endpoint_nr; 1091 struct acpi_reference_args args; 1092 int ret; 1093 1094 memset(&args, 0, sizeof(args)); 1095 ret = acpi_node_get_property_reference(__fwnode, "remote-endpoint", 0, 1096 &args); 1097 if (ret) 1098 return ret; 1099 1100 /* 1101 * Always require two arguments with the reference: port and 1102 * endpoint indices. 1103 */ 1104 if (args.nargs != 2) 1105 return -EPROTO; 1106 1107 fwnode = acpi_fwnode_handle(args.adev); 1108 port_nr = args.args[0]; 1109 endpoint_nr = args.args[1]; 1110 1111 if (parent) 1112 *parent = fwnode; 1113 1114 if (!port && !endpoint) 1115 return 0; 1116 1117 fwnode = acpi_graph_get_child_prop_value(fwnode, "port", port_nr); 1118 if (!fwnode) 1119 return -EPROTO; 1120 1121 if (port) 1122 *port = fwnode; 1123 1124 if (!endpoint) 1125 return 0; 1126 1127 fwnode = acpi_graph_get_child_prop_value(fwnode, "endpoint", 1128 endpoint_nr); 1129 if (!fwnode) 1130 return -EPROTO; 1131 1132 *endpoint = fwnode; 1133 1134 return 0; 1135 } 1136 1137 static bool acpi_fwnode_device_is_available(const struct fwnode_handle *fwnode) 1138 { 1139 if (!is_acpi_device_node(fwnode)) 1140 return false; 1141 1142 return acpi_device_is_present(to_acpi_device_node(fwnode)); 1143 } 1144 1145 static bool acpi_fwnode_property_present(const struct fwnode_handle *fwnode, 1146 const char *propname) 1147 { 1148 return !acpi_node_prop_get(fwnode, propname, NULL); 1149 } 1150 1151 static int 1152 acpi_fwnode_property_read_int_array(const struct fwnode_handle *fwnode, 1153 const char *propname, 1154 unsigned int elem_size, void *val, 1155 size_t nval) 1156 { 1157 enum dev_prop_type type; 1158 1159 switch (elem_size) { 1160 case sizeof(u8): 1161 type = DEV_PROP_U8; 1162 break; 1163 case sizeof(u16): 1164 type = DEV_PROP_U16; 1165 break; 1166 case sizeof(u32): 1167 type = DEV_PROP_U32; 1168 break; 1169 case sizeof(u64): 1170 type = DEV_PROP_U64; 1171 break; 1172 default: 1173 return -ENXIO; 1174 } 1175 1176 return acpi_node_prop_read(fwnode, propname, type, val, nval); 1177 } 1178 1179 static int 1180 acpi_fwnode_property_read_string_array(const struct fwnode_handle *fwnode, 1181 const char *propname, const char **val, 1182 size_t nval) 1183 { 1184 return acpi_node_prop_read(fwnode, propname, DEV_PROP_STRING, 1185 val, nval); 1186 } 1187 1188 static struct fwnode_handle * 1189 acpi_fwnode_get_named_child_node(const struct fwnode_handle *fwnode, 1190 const char *childname) 1191 { 1192 struct fwnode_handle *child; 1193 1194 /* 1195 * Find first matching named child node of this fwnode. 1196 * For ACPI this will be a data only sub-node. 1197 */ 1198 fwnode_for_each_child_node(fwnode, child) 1199 if (acpi_data_node_match(child, childname)) 1200 return child; 1201 1202 return NULL; 1203 } 1204 1205 static int 1206 acpi_fwnode_get_reference_args(const struct fwnode_handle *fwnode, 1207 const char *prop, const char *nargs_prop, 1208 unsigned int args_count, unsigned int index, 1209 struct fwnode_reference_args *args) 1210 { 1211 struct acpi_reference_args acpi_args; 1212 unsigned int i; 1213 int ret; 1214 1215 ret = __acpi_node_get_property_reference(fwnode, prop, index, 1216 args_count, &acpi_args); 1217 if (ret < 0) 1218 return ret; 1219 if (!args) 1220 return 0; 1221 1222 args->nargs = acpi_args.nargs; 1223 args->fwnode = acpi_fwnode_handle(acpi_args.adev); 1224 1225 for (i = 0; i < NR_FWNODE_REFERENCE_ARGS; i++) 1226 args->args[i] = i < acpi_args.nargs ? acpi_args.args[i] : 0; 1227 1228 return 0; 1229 } 1230 1231 static struct fwnode_handle * 1232 acpi_fwnode_graph_get_next_endpoint(const struct fwnode_handle *fwnode, 1233 struct fwnode_handle *prev) 1234 { 1235 struct fwnode_handle *endpoint; 1236 1237 endpoint = acpi_graph_get_next_endpoint(fwnode, prev); 1238 if (IS_ERR(endpoint)) 1239 return NULL; 1240 1241 return endpoint; 1242 } 1243 1244 static struct fwnode_handle * 1245 acpi_fwnode_graph_get_remote_endpoint(const struct fwnode_handle *fwnode) 1246 { 1247 struct fwnode_handle *endpoint = NULL; 1248 1249 acpi_graph_get_remote_endpoint(fwnode, NULL, NULL, &endpoint); 1250 1251 return endpoint; 1252 } 1253 1254 static struct fwnode_handle * 1255 acpi_fwnode_get_parent(struct fwnode_handle *fwnode) 1256 { 1257 return acpi_node_get_parent(fwnode); 1258 } 1259 1260 static int acpi_fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode, 1261 struct fwnode_endpoint *endpoint) 1262 { 1263 struct fwnode_handle *port_fwnode = fwnode_get_parent(fwnode); 1264 1265 endpoint->local_fwnode = fwnode; 1266 1267 fwnode_property_read_u32(port_fwnode, "port", &endpoint->port); 1268 fwnode_property_read_u32(fwnode, "endpoint", &endpoint->id); 1269 1270 return 0; 1271 } 1272 1273 #define DECLARE_ACPI_FWNODE_OPS(ops) \ 1274 const struct fwnode_operations ops = { \ 1275 .device_is_available = acpi_fwnode_device_is_available, \ 1276 .property_present = acpi_fwnode_property_present, \ 1277 .property_read_int_array = \ 1278 acpi_fwnode_property_read_int_array, \ 1279 .property_read_string_array = \ 1280 acpi_fwnode_property_read_string_array, \ 1281 .get_parent = acpi_node_get_parent, \ 1282 .get_next_child_node = acpi_get_next_subnode, \ 1283 .get_named_child_node = acpi_fwnode_get_named_child_node, \ 1284 .get_reference_args = acpi_fwnode_get_reference_args, \ 1285 .graph_get_next_endpoint = \ 1286 acpi_fwnode_graph_get_next_endpoint, \ 1287 .graph_get_remote_endpoint = \ 1288 acpi_fwnode_graph_get_remote_endpoint, \ 1289 .graph_get_port_parent = acpi_fwnode_get_parent, \ 1290 .graph_parse_endpoint = acpi_fwnode_graph_parse_endpoint, \ 1291 }; \ 1292 EXPORT_SYMBOL_GPL(ops) 1293 1294 DECLARE_ACPI_FWNODE_OPS(acpi_device_fwnode_ops); 1295 DECLARE_ACPI_FWNODE_OPS(acpi_data_fwnode_ops); 1296 const struct fwnode_operations acpi_static_fwnode_ops; 1297 1298 bool is_acpi_device_node(const struct fwnode_handle *fwnode) 1299 { 1300 return !IS_ERR_OR_NULL(fwnode) && 1301 fwnode->ops == &acpi_device_fwnode_ops; 1302 } 1303 EXPORT_SYMBOL(is_acpi_device_node); 1304 1305 bool is_acpi_data_node(const struct fwnode_handle *fwnode) 1306 { 1307 return !IS_ERR_OR_NULL(fwnode) && fwnode->ops == &acpi_data_fwnode_ops; 1308 } 1309 EXPORT_SYMBOL(is_acpi_data_node); 1310