1 /* 2 * Functions for working with device tree overlays 3 * 4 * Copyright (C) 2012 Pantelis Antoniou <panto@antoniou-consulting.com> 5 * Copyright (C) 2012 Texas Instruments Inc. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * version 2 as published by the Free Software Foundation. 10 */ 11 12 #define pr_fmt(fmt) "OF: overlay: " fmt 13 14 #include <linux/kernel.h> 15 #include <linux/module.h> 16 #include <linux/of.h> 17 #include <linux/of_device.h> 18 #include <linux/string.h> 19 #include <linux/ctype.h> 20 #include <linux/errno.h> 21 #include <linux/slab.h> 22 #include <linux/err.h> 23 #include <linux/idr.h> 24 25 #include "of_private.h" 26 27 /** 28 * struct fragment - info about fragment nodes in overlay expanded device tree 29 * @target: target of the overlay operation 30 * @overlay: pointer to the __overlay__ node 31 */ 32 struct fragment { 33 struct device_node *target; 34 struct device_node *overlay; 35 }; 36 37 /** 38 * struct overlay_changeset 39 * @ovcs_list: list on which we are located 40 * @overlay_tree: expanded device tree that contains the fragment nodes 41 * @count: count of fragment structures 42 * @fragments: fragment nodes in the overlay expanded device tree 43 * @symbols_fragment: last element of @fragments[] is the __symbols__ node 44 * @cset: changeset to apply fragments to live device tree 45 */ 46 struct overlay_changeset { 47 int id; 48 struct list_head ovcs_list; 49 struct device_node *overlay_tree; 50 int count; 51 struct fragment *fragments; 52 bool symbols_fragment; 53 struct of_changeset cset; 54 }; 55 56 /* flags are sticky - once set, do not reset */ 57 static int devicetree_state_flags; 58 #define DTSF_APPLY_FAIL 0x01 59 #define DTSF_REVERT_FAIL 0x02 60 61 /* 62 * If a changeset apply or revert encounters an error, an attempt will 63 * be made to undo partial changes, but may fail. If the undo fails 64 * we do not know the state of the devicetree. 65 */ 66 static int devicetree_corrupt(void) 67 { 68 return devicetree_state_flags & 69 (DTSF_APPLY_FAIL | DTSF_REVERT_FAIL); 70 } 71 72 static int build_changeset_next_level(struct overlay_changeset *ovcs, 73 struct device_node *target_node, 74 const struct device_node *overlay_node); 75 76 /* 77 * of_resolve_phandles() finds the largest phandle in the live tree. 78 * of_overlay_apply() may add a larger phandle to the live tree. 79 * Do not allow race between two overlays being applied simultaneously: 80 * mutex_lock(&of_overlay_phandle_mutex) 81 * of_resolve_phandles() 82 * of_overlay_apply() 83 * mutex_unlock(&of_overlay_phandle_mutex) 84 */ 85 static DEFINE_MUTEX(of_overlay_phandle_mutex); 86 87 void of_overlay_mutex_lock(void) 88 { 89 mutex_lock(&of_overlay_phandle_mutex); 90 } 91 92 void of_overlay_mutex_unlock(void) 93 { 94 mutex_unlock(&of_overlay_phandle_mutex); 95 } 96 97 98 static LIST_HEAD(ovcs_list); 99 static DEFINE_IDR(ovcs_idr); 100 101 static BLOCKING_NOTIFIER_HEAD(overlay_notify_chain); 102 103 int of_overlay_notifier_register(struct notifier_block *nb) 104 { 105 return blocking_notifier_chain_register(&overlay_notify_chain, nb); 106 } 107 EXPORT_SYMBOL_GPL(of_overlay_notifier_register); 108 109 int of_overlay_notifier_unregister(struct notifier_block *nb) 110 { 111 return blocking_notifier_chain_unregister(&overlay_notify_chain, nb); 112 } 113 EXPORT_SYMBOL_GPL(of_overlay_notifier_unregister); 114 115 static char *of_overlay_action_name[] = { 116 "pre-apply", 117 "post-apply", 118 "pre-remove", 119 "post-remove", 120 }; 121 122 static int overlay_notify(struct overlay_changeset *ovcs, 123 enum of_overlay_notify_action action) 124 { 125 struct of_overlay_notify_data nd; 126 int i, ret; 127 128 for (i = 0; i < ovcs->count; i++) { 129 struct fragment *fragment = &ovcs->fragments[i]; 130 131 nd.target = fragment->target; 132 nd.overlay = fragment->overlay; 133 134 ret = blocking_notifier_call_chain(&overlay_notify_chain, 135 action, &nd); 136 if (ret == NOTIFY_OK || ret == NOTIFY_STOP) 137 return 0; 138 if (ret) { 139 ret = notifier_to_errno(ret); 140 pr_err("overlay changeset %s notifier error %d, target: %pOF\n", 141 of_overlay_action_name[action], ret, nd.target); 142 return ret; 143 } 144 } 145 146 return 0; 147 } 148 149 /* 150 * The values of properties in the "/__symbols__" node are paths in 151 * the ovcs->overlay_tree. When duplicating the properties, the paths 152 * need to be adjusted to be the correct path for the live device tree. 153 * 154 * The paths refer to a node in the subtree of a fragment node's "__overlay__" 155 * node, for example "/fragment@0/__overlay__/symbol_path_tail", 156 * where symbol_path_tail can be a single node or it may be a multi-node path. 157 * 158 * The duplicated property value will be modified by replacing the 159 * "/fragment_name/__overlay/" portion of the value with the target 160 * path from the fragment node. 161 */ 162 static struct property *dup_and_fixup_symbol_prop( 163 struct overlay_changeset *ovcs, const struct property *prop) 164 { 165 struct fragment *fragment; 166 struct property *new_prop; 167 struct device_node *fragment_node; 168 struct device_node *overlay_node; 169 const char *path; 170 const char *path_tail; 171 const char *target_path; 172 int k; 173 int overlay_name_len; 174 int path_len; 175 int path_tail_len; 176 int target_path_len; 177 178 if (!prop->value) 179 return NULL; 180 if (strnlen(prop->value, prop->length) >= prop->length) 181 return NULL; 182 path = prop->value; 183 path_len = strlen(path); 184 185 if (path_len < 1) 186 return NULL; 187 fragment_node = __of_find_node_by_path(ovcs->overlay_tree, path + 1); 188 overlay_node = __of_find_node_by_path(fragment_node, "__overlay__/"); 189 of_node_put(fragment_node); 190 of_node_put(overlay_node); 191 192 for (k = 0; k < ovcs->count; k++) { 193 fragment = &ovcs->fragments[k]; 194 if (fragment->overlay == overlay_node) 195 break; 196 } 197 if (k >= ovcs->count) 198 return NULL; 199 200 overlay_name_len = snprintf(NULL, 0, "%pOF", fragment->overlay); 201 202 if (overlay_name_len > path_len) 203 return NULL; 204 path_tail = path + overlay_name_len; 205 path_tail_len = strlen(path_tail); 206 207 target_path = kasprintf(GFP_KERNEL, "%pOF", fragment->target); 208 if (!target_path) 209 return NULL; 210 target_path_len = strlen(target_path); 211 212 new_prop = kzalloc(sizeof(*new_prop), GFP_KERNEL); 213 if (!new_prop) 214 goto err_free_target_path; 215 216 new_prop->name = kstrdup(prop->name, GFP_KERNEL); 217 new_prop->length = target_path_len + path_tail_len + 1; 218 new_prop->value = kzalloc(new_prop->length, GFP_KERNEL); 219 if (!new_prop->name || !new_prop->value) 220 goto err_free_new_prop; 221 222 strcpy(new_prop->value, target_path); 223 strcpy(new_prop->value + target_path_len, path_tail); 224 225 of_property_set_flag(new_prop, OF_DYNAMIC); 226 227 return new_prop; 228 229 err_free_new_prop: 230 kfree(new_prop->name); 231 kfree(new_prop->value); 232 kfree(new_prop); 233 err_free_target_path: 234 kfree(target_path); 235 236 return NULL; 237 } 238 239 /** 240 * add_changeset_property() - add @overlay_prop to overlay changeset 241 * @ovcs: overlay changeset 242 * @target_node: where to place @overlay_prop in live tree 243 * @overlay_prop: property to add or update, from overlay tree 244 * @is_symbols_prop: 1 if @overlay_prop is from node "/__symbols__" 245 * 246 * If @overlay_prop does not already exist in @target_node, add changeset entry 247 * to add @overlay_prop in @target_node, else add changeset entry to update 248 * value of @overlay_prop. 249 * 250 * Some special properties are not updated (no error returned). 251 * 252 * Update of property in symbols node is not allowed. 253 * 254 * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if 255 * invalid @overlay. 256 */ 257 static int add_changeset_property(struct overlay_changeset *ovcs, 258 struct device_node *target_node, 259 struct property *overlay_prop, 260 bool is_symbols_prop) 261 { 262 struct property *new_prop = NULL, *prop; 263 int ret = 0; 264 265 prop = of_find_property(target_node, overlay_prop->name, NULL); 266 267 if (!of_prop_cmp(overlay_prop->name, "name") || 268 !of_prop_cmp(overlay_prop->name, "phandle") || 269 !of_prop_cmp(overlay_prop->name, "linux,phandle")) 270 return 0; 271 272 if (is_symbols_prop) { 273 if (prop) 274 return -EINVAL; 275 new_prop = dup_and_fixup_symbol_prop(ovcs, overlay_prop); 276 } else { 277 new_prop = __of_prop_dup(overlay_prop, GFP_KERNEL); 278 } 279 280 if (!new_prop) 281 return -ENOMEM; 282 283 if (!prop) 284 ret = of_changeset_add_property(&ovcs->cset, target_node, 285 new_prop); 286 else 287 ret = of_changeset_update_property(&ovcs->cset, target_node, 288 new_prop); 289 290 if (ret) { 291 kfree(new_prop->name); 292 kfree(new_prop->value); 293 kfree(new_prop); 294 } 295 return ret; 296 } 297 298 /** 299 * add_changeset_node() - add @node (and children) to overlay changeset 300 * @ovcs: overlay changeset 301 * @target_node: where to place @node in live tree 302 * @node: node from within overlay device tree fragment 303 * 304 * If @node does not already exist in @target_node, add changeset entry 305 * to add @node in @target_node. 306 * 307 * If @node already exists in @target_node, and the existing node has 308 * a phandle, the overlay node is not allowed to have a phandle. 309 * 310 * If @node has child nodes, add the children recursively via 311 * build_changeset_next_level(). 312 * 313 * NOTE: Multiple mods of created nodes not supported. 314 * If more than one fragment contains a node that does not already exist 315 * in the live tree, then for each fragment of_changeset_attach_node() 316 * will add a changeset entry to add the node. When the changeset is 317 * applied, __of_attach_node() will attach the node twice (once for 318 * each fragment). At this point the device tree will be corrupted. 319 * 320 * TODO: add integrity check to ensure that multiple fragments do not 321 * create the same node. 322 * 323 * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if 324 * invalid @overlay. 325 */ 326 static int add_changeset_node(struct overlay_changeset *ovcs, 327 struct device_node *target_node, struct device_node *node) 328 { 329 const char *node_kbasename; 330 struct device_node *tchild; 331 int ret = 0; 332 333 node_kbasename = kbasename(node->full_name); 334 335 for_each_child_of_node(target_node, tchild) 336 if (!of_node_cmp(node_kbasename, kbasename(tchild->full_name))) 337 break; 338 339 if (!tchild) { 340 tchild = __of_node_dup(node, "%pOF/%s", 341 target_node, node_kbasename); 342 if (!tchild) 343 return -ENOMEM; 344 345 tchild->parent = target_node; 346 347 ret = of_changeset_attach_node(&ovcs->cset, tchild); 348 if (ret) 349 return ret; 350 351 return build_changeset_next_level(ovcs, tchild, node); 352 } 353 354 if (node->phandle && tchild->phandle) 355 ret = -EINVAL; 356 else 357 ret = build_changeset_next_level(ovcs, tchild, node); 358 of_node_put(tchild); 359 360 return ret; 361 } 362 363 /** 364 * build_changeset_next_level() - add level of overlay changeset 365 * @ovcs: overlay changeset 366 * @target_node: where to place @overlay_node in live tree 367 * @overlay_node: node from within an overlay device tree fragment 368 * 369 * Add the properties (if any) and nodes (if any) from @overlay_node to the 370 * @ovcs->cset changeset. If an added node has child nodes, they will 371 * be added recursively. 372 * 373 * Do not allow symbols node to have any children. 374 * 375 * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if 376 * invalid @overlay_node. 377 */ 378 static int build_changeset_next_level(struct overlay_changeset *ovcs, 379 struct device_node *target_node, 380 const struct device_node *overlay_node) 381 { 382 struct device_node *child; 383 struct property *prop; 384 int ret; 385 386 for_each_property_of_node(overlay_node, prop) { 387 ret = add_changeset_property(ovcs, target_node, prop, 0); 388 if (ret) { 389 pr_debug("Failed to apply prop @%pOF/%s, err=%d\n", 390 target_node, prop->name, ret); 391 return ret; 392 } 393 } 394 395 for_each_child_of_node(overlay_node, child) { 396 ret = add_changeset_node(ovcs, target_node, child); 397 if (ret) { 398 pr_debug("Failed to apply node @%pOF/%s, err=%d\n", 399 target_node, child->name, ret); 400 of_node_put(child); 401 return ret; 402 } 403 } 404 405 return 0; 406 } 407 408 /* 409 * Add the properties from __overlay__ node to the @ovcs->cset changeset. 410 */ 411 static int build_changeset_symbols_node(struct overlay_changeset *ovcs, 412 struct device_node *target_node, 413 const struct device_node *overlay_symbols_node) 414 { 415 struct property *prop; 416 int ret; 417 418 for_each_property_of_node(overlay_symbols_node, prop) { 419 ret = add_changeset_property(ovcs, target_node, prop, 1); 420 if (ret) { 421 pr_debug("Failed to apply prop @%pOF/%s, err=%d\n", 422 target_node, prop->name, ret); 423 return ret; 424 } 425 } 426 427 return 0; 428 } 429 430 /** 431 * build_changeset() - populate overlay changeset in @ovcs from @ovcs->fragments 432 * @ovcs: Overlay changeset 433 * 434 * Create changeset @ovcs->cset to contain the nodes and properties of the 435 * overlay device tree fragments in @ovcs->fragments[]. If an error occurs, 436 * any portions of the changeset that were successfully created will remain 437 * in @ovcs->cset. 438 * 439 * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if 440 * invalid overlay in @ovcs->fragments[]. 441 */ 442 static int build_changeset(struct overlay_changeset *ovcs) 443 { 444 struct fragment *fragment; 445 int fragments_count, i, ret; 446 447 /* 448 * if there is a symbols fragment in ovcs->fragments[i] it is 449 * the final element in the array 450 */ 451 if (ovcs->symbols_fragment) 452 fragments_count = ovcs->count - 1; 453 else 454 fragments_count = ovcs->count; 455 456 for (i = 0; i < fragments_count; i++) { 457 fragment = &ovcs->fragments[i]; 458 459 ret = build_changeset_next_level(ovcs, fragment->target, 460 fragment->overlay); 461 if (ret) { 462 pr_debug("apply failed '%pOF'\n", fragment->target); 463 return ret; 464 } 465 } 466 467 if (ovcs->symbols_fragment) { 468 fragment = &ovcs->fragments[ovcs->count - 1]; 469 ret = build_changeset_symbols_node(ovcs, fragment->target, 470 fragment->overlay); 471 if (ret) { 472 pr_debug("apply failed '%pOF'\n", fragment->target); 473 return ret; 474 } 475 } 476 477 return 0; 478 } 479 480 /* 481 * Find the target node using a number of different strategies 482 * in order of preference: 483 * 484 * 1) "target" property containing the phandle of the target 485 * 2) "target-path" property containing the path of the target 486 */ 487 static struct device_node *find_target_node(struct device_node *info_node) 488 { 489 const char *path; 490 u32 val; 491 int ret; 492 493 ret = of_property_read_u32(info_node, "target", &val); 494 if (!ret) 495 return of_find_node_by_phandle(val); 496 497 ret = of_property_read_string(info_node, "target-path", &path); 498 if (!ret) 499 return of_find_node_by_path(path); 500 501 pr_err("Failed to find target for node %p (%s)\n", 502 info_node, info_node->name); 503 504 return NULL; 505 } 506 507 /** 508 * init_overlay_changeset() - initialize overlay changeset from overlay tree 509 * @ovcs Overlay changeset to build 510 * @tree: Contains all the overlay fragments and overlay fixup nodes 511 * 512 * Initialize @ovcs. Populate @ovcs->fragments with node information from 513 * the top level of @tree. The relevant top level nodes are the fragment 514 * nodes and the __symbols__ node. Any other top level node will be ignored. 515 * 516 * Returns 0 on success, -ENOMEM if memory allocation failure, -EINVAL if error 517 * detected in @tree, or -ENOSPC if idr_alloc() error. 518 */ 519 static int init_overlay_changeset(struct overlay_changeset *ovcs, 520 struct device_node *tree) 521 { 522 struct device_node *node, *overlay_node; 523 struct fragment *fragment; 524 struct fragment *fragments; 525 int cnt, ret; 526 527 /* 528 * Warn for some issues. Can not return -EINVAL for these until 529 * of_unittest_apply_overlay() is fixed to pass these checks. 530 */ 531 if (!of_node_check_flag(tree, OF_DYNAMIC)) 532 pr_debug("%s() tree is not dynamic\n", __func__); 533 534 if (!of_node_check_flag(tree, OF_DETACHED)) 535 pr_debug("%s() tree is not detached\n", __func__); 536 537 if (!of_node_is_root(tree)) 538 pr_debug("%s() tree is not root\n", __func__); 539 540 ovcs->overlay_tree = tree; 541 542 INIT_LIST_HEAD(&ovcs->ovcs_list); 543 544 of_changeset_init(&ovcs->cset); 545 546 ovcs->id = idr_alloc(&ovcs_idr, ovcs, 1, 0, GFP_KERNEL); 547 if (ovcs->id <= 0) 548 return ovcs->id; 549 550 cnt = 0; 551 552 /* fragment nodes */ 553 for_each_child_of_node(tree, node) { 554 overlay_node = of_get_child_by_name(node, "__overlay__"); 555 if (overlay_node) { 556 cnt++; 557 of_node_put(overlay_node); 558 } 559 } 560 561 node = of_get_child_by_name(tree, "__symbols__"); 562 if (node) { 563 cnt++; 564 of_node_put(node); 565 } 566 567 fragments = kcalloc(cnt, sizeof(*fragments), GFP_KERNEL); 568 if (!fragments) { 569 ret = -ENOMEM; 570 goto err_free_idr; 571 } 572 573 cnt = 0; 574 for_each_child_of_node(tree, node) { 575 fragment = &fragments[cnt]; 576 fragment->overlay = of_get_child_by_name(node, "__overlay__"); 577 if (fragment->overlay) { 578 fragment->target = find_target_node(node); 579 if (!fragment->target) { 580 of_node_put(fragment->overlay); 581 ret = -EINVAL; 582 goto err_free_fragments; 583 } else { 584 cnt++; 585 } 586 } 587 } 588 589 /* 590 * if there is a symbols fragment in ovcs->fragments[i] it is 591 * the final element in the array 592 */ 593 node = of_get_child_by_name(tree, "__symbols__"); 594 if (node) { 595 ovcs->symbols_fragment = 1; 596 fragment = &fragments[cnt]; 597 fragment->overlay = node; 598 fragment->target = of_find_node_by_path("/__symbols__"); 599 600 if (!fragment->target) { 601 pr_err("symbols in overlay, but not in live tree\n"); 602 ret = -EINVAL; 603 goto err_free_fragments; 604 } 605 606 cnt++; 607 } 608 609 if (!cnt) { 610 ret = -EINVAL; 611 goto err_free_fragments; 612 } 613 614 ovcs->count = cnt; 615 ovcs->fragments = fragments; 616 617 return 0; 618 619 err_free_fragments: 620 kfree(fragments); 621 err_free_idr: 622 idr_remove(&ovcs_idr, ovcs->id); 623 624 pr_err("%s() failed, ret = %d\n", __func__, ret); 625 626 return ret; 627 } 628 629 static void free_overlay_changeset(struct overlay_changeset *ovcs) 630 { 631 int i; 632 633 if (!ovcs->cset.entries.next) 634 return; 635 of_changeset_destroy(&ovcs->cset); 636 637 if (ovcs->id) 638 idr_remove(&ovcs_idr, ovcs->id); 639 640 for (i = 0; i < ovcs->count; i++) { 641 of_node_put(ovcs->fragments[i].target); 642 of_node_put(ovcs->fragments[i].overlay); 643 } 644 kfree(ovcs->fragments); 645 646 kfree(ovcs); 647 } 648 649 /** 650 * of_overlay_apply() - Create and apply an overlay changeset 651 * @tree: Expanded overlay device tree 652 * @ovcs_id: Pointer to overlay changeset id 653 * 654 * Creates and applies an overlay changeset. 655 * 656 * If an error occurs in a pre-apply notifier, then no changes are made 657 * to the device tree. 658 * 659 660 * A non-zero return value will not have created the changeset if error is from: 661 * - parameter checks 662 * - building the changeset 663 * - overlay changset pre-apply notifier 664 * 665 * If an error is returned by an overlay changeset pre-apply notifier 666 * then no further overlay changeset pre-apply notifier will be called. 667 * 668 * A non-zero return value will have created the changeset if error is from: 669 * - overlay changeset entry notifier 670 * - overlay changset post-apply notifier 671 * 672 * If an error is returned by an overlay changeset post-apply notifier 673 * then no further overlay changeset post-apply notifier will be called. 674 * 675 * If more than one notifier returns an error, then the last notifier 676 * error to occur is returned. 677 * 678 * If an error occurred while applying the overlay changeset, then an 679 * attempt is made to revert any changes that were made to the 680 * device tree. If there were any errors during the revert attempt 681 * then the state of the device tree can not be determined, and any 682 * following attempt to apply or remove an overlay changeset will be 683 * refused. 684 * 685 * Returns 0 on success, or a negative error number. Overlay changeset 686 * id is returned to *ovcs_id. 687 */ 688 689 int of_overlay_apply(struct device_node *tree, int *ovcs_id) 690 { 691 struct overlay_changeset *ovcs; 692 int ret = 0, ret_revert, ret_tmp; 693 694 *ovcs_id = 0; 695 696 if (devicetree_corrupt()) { 697 pr_err("devicetree state suspect, refuse to apply overlay\n"); 698 ret = -EBUSY; 699 goto out; 700 } 701 702 ovcs = kzalloc(sizeof(*ovcs), GFP_KERNEL); 703 if (!ovcs) { 704 ret = -ENOMEM; 705 goto out; 706 } 707 708 of_overlay_mutex_lock(); 709 710 ret = of_resolve_phandles(tree); 711 if (ret) 712 goto err_overlay_unlock; 713 714 mutex_lock(&of_mutex); 715 716 ret = init_overlay_changeset(ovcs, tree); 717 if (ret) 718 goto err_free_overlay_changeset; 719 720 ret = overlay_notify(ovcs, OF_OVERLAY_PRE_APPLY); 721 if (ret) { 722 pr_err("overlay changeset pre-apply notify error %d\n", ret); 723 goto err_free_overlay_changeset; 724 } 725 726 ret = build_changeset(ovcs); 727 if (ret) 728 goto err_free_overlay_changeset; 729 730 ret_revert = 0; 731 ret = __of_changeset_apply_entries(&ovcs->cset, &ret_revert); 732 if (ret) { 733 if (ret_revert) { 734 pr_debug("overlay changeset revert error %d\n", 735 ret_revert); 736 devicetree_state_flags |= DTSF_APPLY_FAIL; 737 } 738 goto err_free_overlay_changeset; 739 } else { 740 ret = __of_changeset_apply_notify(&ovcs->cset); 741 if (ret) 742 pr_err("overlay changeset entry notify error %d\n", 743 ret); 744 /* fall through */ 745 } 746 747 list_add_tail(&ovcs->ovcs_list, &ovcs_list); 748 *ovcs_id = ovcs->id; 749 750 ret_tmp = overlay_notify(ovcs, OF_OVERLAY_POST_APPLY); 751 if (ret_tmp) { 752 pr_err("overlay changeset post-apply notify error %d\n", 753 ret_tmp); 754 if (!ret) 755 ret = ret_tmp; 756 } 757 758 mutex_unlock(&of_mutex); 759 of_overlay_mutex_unlock(); 760 761 goto out; 762 763 err_overlay_unlock: 764 of_overlay_mutex_unlock(); 765 766 err_free_overlay_changeset: 767 free_overlay_changeset(ovcs); 768 769 mutex_unlock(&of_mutex); 770 771 out: 772 pr_debug("%s() err=%d\n", __func__, ret); 773 774 return ret; 775 } 776 EXPORT_SYMBOL_GPL(of_overlay_apply); 777 778 /* 779 * Find @np in @tree. 780 * 781 * Returns 1 if @np is @tree or is contained in @tree, else 0 782 */ 783 static int find_node(struct device_node *tree, struct device_node *np) 784 { 785 struct device_node *child; 786 787 if (tree == np) 788 return 1; 789 790 for_each_child_of_node(tree, child) { 791 if (find_node(child, np)) { 792 of_node_put(child); 793 return 1; 794 } 795 } 796 797 return 0; 798 } 799 800 /* 801 * Is @remove_ce_node a child of, a parent of, or the same as any 802 * node in an overlay changeset more topmost than @remove_ovcs? 803 * 804 * Returns 1 if found, else 0 805 */ 806 static int node_overlaps_later_cs(struct overlay_changeset *remove_ovcs, 807 struct device_node *remove_ce_node) 808 { 809 struct overlay_changeset *ovcs; 810 struct of_changeset_entry *ce; 811 812 list_for_each_entry_reverse(ovcs, &ovcs_list, ovcs_list) { 813 if (ovcs == remove_ovcs) 814 break; 815 816 list_for_each_entry(ce, &ovcs->cset.entries, node) { 817 if (find_node(ce->np, remove_ce_node)) { 818 pr_err("%s: #%d overlaps with #%d @%pOF\n", 819 __func__, remove_ovcs->id, ovcs->id, 820 remove_ce_node); 821 return 1; 822 } 823 if (find_node(remove_ce_node, ce->np)) { 824 pr_err("%s: #%d overlaps with #%d @%pOF\n", 825 __func__, remove_ovcs->id, ovcs->id, 826 remove_ce_node); 827 return 1; 828 } 829 } 830 } 831 832 return 0; 833 } 834 835 /* 836 * We can safely remove the overlay only if it's the top-most one. 837 * Newly applied overlays are inserted at the tail of the overlay list, 838 * so a top most overlay is the one that is closest to the tail. 839 * 840 * The topmost check is done by exploiting this property. For each 841 * affected device node in the log list we check if this overlay is 842 * the one closest to the tail. If another overlay has affected this 843 * device node and is closest to the tail, then removal is not permited. 844 */ 845 static int overlay_removal_is_ok(struct overlay_changeset *remove_ovcs) 846 { 847 struct of_changeset_entry *remove_ce; 848 849 list_for_each_entry(remove_ce, &remove_ovcs->cset.entries, node) { 850 if (node_overlaps_later_cs(remove_ovcs, remove_ce->np)) { 851 pr_err("overlay #%d is not topmost\n", remove_ovcs->id); 852 return 0; 853 } 854 } 855 856 return 1; 857 } 858 859 /** 860 * of_overlay_remove() - Revert and free an overlay changeset 861 * @ovcs_id: Pointer to overlay changeset id 862 * 863 * Removes an overlay if it is permissible. @ovcs_id was previously returned 864 * by of_overlay_apply(). 865 * 866 * If an error occurred while attempting to revert the overlay changeset, 867 * then an attempt is made to re-apply any changeset entry that was 868 * reverted. If an error occurs on re-apply then the state of the device 869 * tree can not be determined, and any following attempt to apply or remove 870 * an overlay changeset will be refused. 871 * 872 * A non-zero return value will not revert the changeset if error is from: 873 * - parameter checks 874 * - overlay changset pre-remove notifier 875 * - overlay changeset entry revert 876 * 877 * If an error is returned by an overlay changeset pre-remove notifier 878 * then no further overlay changeset pre-remove notifier will be called. 879 * 880 * If more than one notifier returns an error, then the last notifier 881 * error to occur is returned. 882 * 883 * A non-zero return value will revert the changeset if error is from: 884 * - overlay changeset entry notifier 885 * - overlay changset post-remove notifier 886 * 887 * If an error is returned by an overlay changeset post-remove notifier 888 * then no further overlay changeset post-remove notifier will be called. 889 * 890 * Returns 0 on success, or a negative error number. *ovcs_id is set to 891 * zero after reverting the changeset, even if a subsequent error occurs. 892 */ 893 int of_overlay_remove(int *ovcs_id) 894 { 895 struct overlay_changeset *ovcs; 896 int ret, ret_apply, ret_tmp; 897 898 ret = 0; 899 900 if (devicetree_corrupt()) { 901 pr_err("suspect devicetree state, refuse to remove overlay\n"); 902 ret = -EBUSY; 903 goto out; 904 } 905 906 mutex_lock(&of_mutex); 907 908 ovcs = idr_find(&ovcs_idr, *ovcs_id); 909 if (!ovcs) { 910 ret = -ENODEV; 911 pr_err("remove: Could not find overlay #%d\n", *ovcs_id); 912 goto out_unlock; 913 } 914 915 if (!overlay_removal_is_ok(ovcs)) { 916 ret = -EBUSY; 917 goto out_unlock; 918 } 919 920 ret = overlay_notify(ovcs, OF_OVERLAY_PRE_REMOVE); 921 if (ret) { 922 pr_err("overlay changeset pre-remove notify error %d\n", ret); 923 goto out_unlock; 924 } 925 926 list_del(&ovcs->ovcs_list); 927 928 ret_apply = 0; 929 ret = __of_changeset_revert_entries(&ovcs->cset, &ret_apply); 930 if (ret) { 931 if (ret_apply) 932 devicetree_state_flags |= DTSF_REVERT_FAIL; 933 goto out_unlock; 934 } else { 935 ret = __of_changeset_revert_notify(&ovcs->cset); 936 if (ret) { 937 pr_err("overlay changeset entry notify error %d\n", 938 ret); 939 /* fall through - changeset was reverted */ 940 } 941 } 942 943 *ovcs_id = 0; 944 945 ret_tmp = overlay_notify(ovcs, OF_OVERLAY_POST_REMOVE); 946 if (ret_tmp) { 947 pr_err("overlay changeset post-remove notify error %d\n", 948 ret_tmp); 949 if (!ret) 950 ret = ret_tmp; 951 } 952 953 free_overlay_changeset(ovcs); 954 955 out_unlock: 956 mutex_unlock(&of_mutex); 957 958 out: 959 pr_debug("%s() err=%d\n", __func__, ret); 960 961 return ret; 962 } 963 EXPORT_SYMBOL_GPL(of_overlay_remove); 964 965 /** 966 * of_overlay_remove_all() - Reverts and frees all overlay changesets 967 * 968 * Removes all overlays from the system in the correct order. 969 * 970 * Returns 0 on success, or a negative error number 971 */ 972 int of_overlay_remove_all(void) 973 { 974 struct overlay_changeset *ovcs, *ovcs_n; 975 int ret; 976 977 /* the tail of list is guaranteed to be safe to remove */ 978 list_for_each_entry_safe_reverse(ovcs, ovcs_n, &ovcs_list, ovcs_list) { 979 ret = of_overlay_remove(&ovcs->id); 980 if (ret) 981 return ret; 982 } 983 984 return 0; 985 } 986 EXPORT_SYMBOL_GPL(of_overlay_remove_all); 987