at v3.17-rc3 660 lines 16 kB view raw
1/* 2 * Support for dynamic device trees. 3 * 4 * On some platforms, the device tree can be manipulated at runtime. 5 * The routines in this section support adding, removing and changing 6 * device tree nodes. 7 */ 8 9#include <linux/of.h> 10#include <linux/spinlock.h> 11#include <linux/slab.h> 12#include <linux/string.h> 13#include <linux/proc_fs.h> 14 15#include "of_private.h" 16 17/** 18 * of_node_get() - Increment refcount of a node 19 * @node: Node to inc refcount, NULL is supported to simplify writing of 20 * callers 21 * 22 * Returns node. 23 */ 24struct device_node *of_node_get(struct device_node *node) 25{ 26 if (node) 27 kobject_get(&node->kobj); 28 return node; 29} 30EXPORT_SYMBOL(of_node_get); 31 32/** 33 * of_node_put() - Decrement refcount of a node 34 * @node: Node to dec refcount, NULL is supported to simplify writing of 35 * callers 36 */ 37void of_node_put(struct device_node *node) 38{ 39 if (node) 40 kobject_put(&node->kobj); 41} 42EXPORT_SYMBOL(of_node_put); 43 44void __of_detach_node_sysfs(struct device_node *np) 45{ 46 struct property *pp; 47 48 BUG_ON(!of_node_is_initialized(np)); 49 if (!of_kset) 50 return; 51 52 /* only remove properties if on sysfs */ 53 if (of_node_is_attached(np)) { 54 for_each_property_of_node(np, pp) 55 sysfs_remove_bin_file(&np->kobj, &pp->attr); 56 kobject_del(&np->kobj); 57 } 58 59 /* finally remove the kobj_init ref */ 60 of_node_put(np); 61} 62 63static BLOCKING_NOTIFIER_HEAD(of_reconfig_chain); 64 65int of_reconfig_notifier_register(struct notifier_block *nb) 66{ 67 return blocking_notifier_chain_register(&of_reconfig_chain, nb); 68} 69EXPORT_SYMBOL_GPL(of_reconfig_notifier_register); 70 71int of_reconfig_notifier_unregister(struct notifier_block *nb) 72{ 73 return blocking_notifier_chain_unregister(&of_reconfig_chain, nb); 74} 75EXPORT_SYMBOL_GPL(of_reconfig_notifier_unregister); 76 77int of_reconfig_notify(unsigned long action, void *p) 78{ 79 int rc; 80 81 rc = blocking_notifier_call_chain(&of_reconfig_chain, action, p); 82 return notifier_to_errno(rc); 83} 84 85int of_property_notify(int action, struct device_node *np, 86 struct property *prop, struct property *oldprop) 87{ 88 struct of_prop_reconfig pr; 89 90 /* only call notifiers if the node is attached */ 91 if (!of_node_is_attached(np)) 92 return 0; 93 94 pr.dn = np; 95 pr.prop = prop; 96 pr.old_prop = oldprop; 97 return of_reconfig_notify(action, &pr); 98} 99 100void __of_attach_node(struct device_node *np) 101{ 102 const __be32 *phandle; 103 int sz; 104 105 np->name = __of_get_property(np, "name", NULL) ? : "<NULL>"; 106 np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>"; 107 108 phandle = __of_get_property(np, "phandle", &sz); 109 if (!phandle) 110 phandle = __of_get_property(np, "linux,phandle", &sz); 111 if (IS_ENABLED(PPC_PSERIES) && !phandle) 112 phandle = __of_get_property(np, "ibm,phandle", &sz); 113 np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0; 114 115 np->child = NULL; 116 np->sibling = np->parent->child; 117 np->allnext = np->parent->allnext; 118 np->parent->allnext = np; 119 np->parent->child = np; 120 of_node_clear_flag(np, OF_DETACHED); 121} 122 123/** 124 * of_attach_node() - Plug a device node into the tree and global list. 125 */ 126int of_attach_node(struct device_node *np) 127{ 128 unsigned long flags; 129 130 mutex_lock(&of_mutex); 131 raw_spin_lock_irqsave(&devtree_lock, flags); 132 __of_attach_node(np); 133 raw_spin_unlock_irqrestore(&devtree_lock, flags); 134 135 __of_attach_node_sysfs(np); 136 mutex_unlock(&of_mutex); 137 138 of_reconfig_notify(OF_RECONFIG_ATTACH_NODE, np); 139 140 return 0; 141} 142 143void __of_detach_node(struct device_node *np) 144{ 145 struct device_node *parent; 146 147 if (WARN_ON(of_node_check_flag(np, OF_DETACHED))) 148 return; 149 150 parent = np->parent; 151 if (WARN_ON(!parent)) 152 return; 153 154 if (of_allnodes == np) 155 of_allnodes = np->allnext; 156 else { 157 struct device_node *prev; 158 for (prev = of_allnodes; 159 prev->allnext != np; 160 prev = prev->allnext) 161 ; 162 prev->allnext = np->allnext; 163 } 164 165 if (parent->child == np) 166 parent->child = np->sibling; 167 else { 168 struct device_node *prevsib; 169 for (prevsib = np->parent->child; 170 prevsib->sibling != np; 171 prevsib = prevsib->sibling) 172 ; 173 prevsib->sibling = np->sibling; 174 } 175 176 of_node_set_flag(np, OF_DETACHED); 177} 178 179/** 180 * of_detach_node() - "Unplug" a node from the device tree. 181 * 182 * The caller must hold a reference to the node. The memory associated with 183 * the node is not freed until its refcount goes to zero. 184 */ 185int of_detach_node(struct device_node *np) 186{ 187 unsigned long flags; 188 int rc = 0; 189 190 mutex_lock(&of_mutex); 191 raw_spin_lock_irqsave(&devtree_lock, flags); 192 __of_detach_node(np); 193 raw_spin_unlock_irqrestore(&devtree_lock, flags); 194 195 __of_detach_node_sysfs(np); 196 mutex_unlock(&of_mutex); 197 198 of_reconfig_notify(OF_RECONFIG_DETACH_NODE, np); 199 200 return rc; 201} 202 203/** 204 * of_node_release() - release a dynamically allocated node 205 * @kref: kref element of the node to be released 206 * 207 * In of_node_put() this function is passed to kref_put() as the destructor. 208 */ 209void of_node_release(struct kobject *kobj) 210{ 211 struct device_node *node = kobj_to_device_node(kobj); 212 struct property *prop = node->properties; 213 214 /* We should never be releasing nodes that haven't been detached. */ 215 if (!of_node_check_flag(node, OF_DETACHED)) { 216 pr_err("ERROR: Bad of_node_put() on %s\n", node->full_name); 217 dump_stack(); 218 return; 219 } 220 221 if (!of_node_check_flag(node, OF_DYNAMIC)) 222 return; 223 224 while (prop) { 225 struct property *next = prop->next; 226 kfree(prop->name); 227 kfree(prop->value); 228 kfree(prop); 229 prop = next; 230 231 if (!prop) { 232 prop = node->deadprops; 233 node->deadprops = NULL; 234 } 235 } 236 kfree(node->full_name); 237 kfree(node->data); 238 kfree(node); 239} 240 241/** 242 * __of_prop_dup - Copy a property dynamically. 243 * @prop: Property to copy 244 * @allocflags: Allocation flags (typically pass GFP_KERNEL) 245 * 246 * Copy a property by dynamically allocating the memory of both the 247 * property stucture and the property name & contents. The property's 248 * flags have the OF_DYNAMIC bit set so that we can differentiate between 249 * dynamically allocated properties and not. 250 * Returns the newly allocated property or NULL on out of memory error. 251 */ 252struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags) 253{ 254 struct property *new; 255 256 new = kzalloc(sizeof(*new), allocflags); 257 if (!new) 258 return NULL; 259 260 /* 261 * NOTE: There is no check for zero length value. 262 * In case of a boolean property, this will allocate a value 263 * of zero bytes. We do this to work around the use 264 * of of_get_property() calls on boolean values. 265 */ 266 new->name = kstrdup(prop->name, allocflags); 267 new->value = kmemdup(prop->value, prop->length, allocflags); 268 new->length = prop->length; 269 if (!new->name || !new->value) 270 goto err_free; 271 272 /* mark the property as dynamic */ 273 of_property_set_flag(new, OF_DYNAMIC); 274 275 return new; 276 277 err_free: 278 kfree(new->name); 279 kfree(new->value); 280 kfree(new); 281 return NULL; 282} 283 284/** 285 * __of_node_alloc() - Create an empty device node dynamically. 286 * @full_name: Full name of the new device node 287 * @allocflags: Allocation flags (typically pass GFP_KERNEL) 288 * 289 * Create an empty device tree node, suitable for further modification. 290 * The node data are dynamically allocated and all the node flags 291 * have the OF_DYNAMIC & OF_DETACHED bits set. 292 * Returns the newly allocated node or NULL on out of memory error. 293 */ 294struct device_node *__of_node_alloc(const char *full_name, gfp_t allocflags) 295{ 296 struct device_node *node; 297 298 node = kzalloc(sizeof(*node), allocflags); 299 if (!node) 300 return NULL; 301 302 node->full_name = kstrdup(full_name, allocflags); 303 of_node_set_flag(node, OF_DYNAMIC); 304 of_node_set_flag(node, OF_DETACHED); 305 if (!node->full_name) 306 goto err_free; 307 308 of_node_init(node); 309 310 return node; 311 312 err_free: 313 kfree(node->full_name); 314 kfree(node); 315 return NULL; 316} 317 318static void __of_changeset_entry_destroy(struct of_changeset_entry *ce) 319{ 320 of_node_put(ce->np); 321 list_del(&ce->node); 322 kfree(ce); 323} 324 325#ifdef DEBUG 326static void __of_changeset_entry_dump(struct of_changeset_entry *ce) 327{ 328 switch (ce->action) { 329 case OF_RECONFIG_ADD_PROPERTY: 330 pr_debug("%p: %s %s/%s\n", 331 ce, "ADD_PROPERTY ", ce->np->full_name, 332 ce->prop->name); 333 break; 334 case OF_RECONFIG_REMOVE_PROPERTY: 335 pr_debug("%p: %s %s/%s\n", 336 ce, "REMOVE_PROPERTY", ce->np->full_name, 337 ce->prop->name); 338 break; 339 case OF_RECONFIG_UPDATE_PROPERTY: 340 pr_debug("%p: %s %s/%s\n", 341 ce, "UPDATE_PROPERTY", ce->np->full_name, 342 ce->prop->name); 343 break; 344 case OF_RECONFIG_ATTACH_NODE: 345 pr_debug("%p: %s %s\n", 346 ce, "ATTACH_NODE ", ce->np->full_name); 347 break; 348 case OF_RECONFIG_DETACH_NODE: 349 pr_debug("%p: %s %s\n", 350 ce, "DETACH_NODE ", ce->np->full_name); 351 break; 352 } 353} 354#else 355static inline void __of_changeset_entry_dump(struct of_changeset_entry *ce) 356{ 357 /* empty */ 358} 359#endif 360 361static void __of_changeset_entry_invert(struct of_changeset_entry *ce, 362 struct of_changeset_entry *rce) 363{ 364 memcpy(rce, ce, sizeof(*rce)); 365 366 switch (ce->action) { 367 case OF_RECONFIG_ATTACH_NODE: 368 rce->action = OF_RECONFIG_DETACH_NODE; 369 break; 370 case OF_RECONFIG_DETACH_NODE: 371 rce->action = OF_RECONFIG_ATTACH_NODE; 372 break; 373 case OF_RECONFIG_ADD_PROPERTY: 374 rce->action = OF_RECONFIG_REMOVE_PROPERTY; 375 break; 376 case OF_RECONFIG_REMOVE_PROPERTY: 377 rce->action = OF_RECONFIG_ADD_PROPERTY; 378 break; 379 case OF_RECONFIG_UPDATE_PROPERTY: 380 rce->old_prop = ce->prop; 381 rce->prop = ce->old_prop; 382 break; 383 } 384} 385 386static void __of_changeset_entry_notify(struct of_changeset_entry *ce, bool revert) 387{ 388 struct of_changeset_entry ce_inverted; 389 int ret; 390 391 if (revert) { 392 __of_changeset_entry_invert(ce, &ce_inverted); 393 ce = &ce_inverted; 394 } 395 396 switch (ce->action) { 397 case OF_RECONFIG_ATTACH_NODE: 398 case OF_RECONFIG_DETACH_NODE: 399 ret = of_reconfig_notify(ce->action, ce->np); 400 break; 401 case OF_RECONFIG_ADD_PROPERTY: 402 case OF_RECONFIG_REMOVE_PROPERTY: 403 case OF_RECONFIG_UPDATE_PROPERTY: 404 ret = of_property_notify(ce->action, ce->np, ce->prop, ce->old_prop); 405 break; 406 default: 407 pr_err("%s: invalid devicetree changeset action: %i\n", __func__, 408 (int)ce->action); 409 return; 410 } 411 412 if (ret) 413 pr_err("%s: notifier error @%s\n", __func__, ce->np->full_name); 414} 415 416static int __of_changeset_entry_apply(struct of_changeset_entry *ce) 417{ 418 struct property *old_prop, **propp; 419 unsigned long flags; 420 int ret = 0; 421 422 __of_changeset_entry_dump(ce); 423 424 raw_spin_lock_irqsave(&devtree_lock, flags); 425 switch (ce->action) { 426 case OF_RECONFIG_ATTACH_NODE: 427 __of_attach_node(ce->np); 428 break; 429 case OF_RECONFIG_DETACH_NODE: 430 __of_detach_node(ce->np); 431 break; 432 case OF_RECONFIG_ADD_PROPERTY: 433 /* If the property is in deadprops then it must be removed */ 434 for (propp = &ce->np->deadprops; *propp; propp = &(*propp)->next) { 435 if (*propp == ce->prop) { 436 *propp = ce->prop->next; 437 ce->prop->next = NULL; 438 break; 439 } 440 } 441 442 ret = __of_add_property(ce->np, ce->prop); 443 if (ret) { 444 pr_err("%s: add_property failed @%s/%s\n", 445 __func__, ce->np->full_name, 446 ce->prop->name); 447 break; 448 } 449 break; 450 case OF_RECONFIG_REMOVE_PROPERTY: 451 ret = __of_remove_property(ce->np, ce->prop); 452 if (ret) { 453 pr_err("%s: remove_property failed @%s/%s\n", 454 __func__, ce->np->full_name, 455 ce->prop->name); 456 break; 457 } 458 break; 459 460 case OF_RECONFIG_UPDATE_PROPERTY: 461 /* If the property is in deadprops then it must be removed */ 462 for (propp = &ce->np->deadprops; *propp; propp = &(*propp)->next) { 463 if (*propp == ce->prop) { 464 *propp = ce->prop->next; 465 ce->prop->next = NULL; 466 break; 467 } 468 } 469 470 ret = __of_update_property(ce->np, ce->prop, &old_prop); 471 if (ret) { 472 pr_err("%s: update_property failed @%s/%s\n", 473 __func__, ce->np->full_name, 474 ce->prop->name); 475 break; 476 } 477 break; 478 default: 479 ret = -EINVAL; 480 } 481 raw_spin_unlock_irqrestore(&devtree_lock, flags); 482 483 if (ret) 484 return ret; 485 486 switch (ce->action) { 487 case OF_RECONFIG_ATTACH_NODE: 488 __of_attach_node_sysfs(ce->np); 489 break; 490 case OF_RECONFIG_DETACH_NODE: 491 __of_detach_node_sysfs(ce->np); 492 break; 493 case OF_RECONFIG_ADD_PROPERTY: 494 /* ignore duplicate names */ 495 __of_add_property_sysfs(ce->np, ce->prop); 496 break; 497 case OF_RECONFIG_REMOVE_PROPERTY: 498 __of_remove_property_sysfs(ce->np, ce->prop); 499 break; 500 case OF_RECONFIG_UPDATE_PROPERTY: 501 __of_update_property_sysfs(ce->np, ce->prop, ce->old_prop); 502 break; 503 } 504 505 return 0; 506} 507 508static inline int __of_changeset_entry_revert(struct of_changeset_entry *ce) 509{ 510 struct of_changeset_entry ce_inverted; 511 512 __of_changeset_entry_invert(ce, &ce_inverted); 513 return __of_changeset_entry_apply(&ce_inverted); 514} 515 516/** 517 * of_changeset_init - Initialize a changeset for use 518 * 519 * @ocs: changeset pointer 520 * 521 * Initialize a changeset structure 522 */ 523void of_changeset_init(struct of_changeset *ocs) 524{ 525 memset(ocs, 0, sizeof(*ocs)); 526 INIT_LIST_HEAD(&ocs->entries); 527} 528 529/** 530 * of_changeset_destroy - Destroy a changeset 531 * 532 * @ocs: changeset pointer 533 * 534 * Destroys a changeset. Note that if a changeset is applied, 535 * its changes to the tree cannot be reverted. 536 */ 537void of_changeset_destroy(struct of_changeset *ocs) 538{ 539 struct of_changeset_entry *ce, *cen; 540 541 list_for_each_entry_safe_reverse(ce, cen, &ocs->entries, node) 542 __of_changeset_entry_destroy(ce); 543} 544 545/** 546 * of_changeset_apply - Applies a changeset 547 * 548 * @ocs: changeset pointer 549 * 550 * Applies a changeset to the live tree. 551 * Any side-effects of live tree state changes are applied here on 552 * sucess, like creation/destruction of devices and side-effects 553 * like creation of sysfs properties and directories. 554 * Returns 0 on success, a negative error value in case of an error. 555 * On error the partially applied effects are reverted. 556 */ 557int of_changeset_apply(struct of_changeset *ocs) 558{ 559 struct of_changeset_entry *ce; 560 int ret; 561 562 /* perform the rest of the work */ 563 pr_debug("of_changeset: applying...\n"); 564 list_for_each_entry(ce, &ocs->entries, node) { 565 ret = __of_changeset_entry_apply(ce); 566 if (ret) { 567 pr_err("%s: Error applying changeset (%d)\n", __func__, ret); 568 list_for_each_entry_continue_reverse(ce, &ocs->entries, node) 569 __of_changeset_entry_revert(ce); 570 return ret; 571 } 572 } 573 pr_debug("of_changeset: applied, emitting notifiers.\n"); 574 575 /* drop the global lock while emitting notifiers */ 576 mutex_unlock(&of_mutex); 577 list_for_each_entry(ce, &ocs->entries, node) 578 __of_changeset_entry_notify(ce, 0); 579 mutex_lock(&of_mutex); 580 pr_debug("of_changeset: notifiers sent.\n"); 581 582 return 0; 583} 584 585/** 586 * of_changeset_revert - Reverts an applied changeset 587 * 588 * @ocs: changeset pointer 589 * 590 * Reverts a changeset returning the state of the tree to what it 591 * was before the application. 592 * Any side-effects like creation/destruction of devices and 593 * removal of sysfs properties and directories are applied. 594 * Returns 0 on success, a negative error value in case of an error. 595 */ 596int of_changeset_revert(struct of_changeset *ocs) 597{ 598 struct of_changeset_entry *ce; 599 int ret; 600 601 pr_debug("of_changeset: reverting...\n"); 602 list_for_each_entry_reverse(ce, &ocs->entries, node) { 603 ret = __of_changeset_entry_revert(ce); 604 if (ret) { 605 pr_err("%s: Error reverting changeset (%d)\n", __func__, ret); 606 list_for_each_entry_continue(ce, &ocs->entries, node) 607 __of_changeset_entry_apply(ce); 608 return ret; 609 } 610 } 611 pr_debug("of_changeset: reverted, emitting notifiers.\n"); 612 613 /* drop the global lock while emitting notifiers */ 614 mutex_unlock(&of_mutex); 615 list_for_each_entry_reverse(ce, &ocs->entries, node) 616 __of_changeset_entry_notify(ce, 1); 617 mutex_lock(&of_mutex); 618 pr_debug("of_changeset: notifiers sent.\n"); 619 620 return 0; 621} 622 623/** 624 * of_changeset_action - Perform a changeset action 625 * 626 * @ocs: changeset pointer 627 * @action: action to perform 628 * @np: Pointer to device node 629 * @prop: Pointer to property 630 * 631 * On action being one of: 632 * + OF_RECONFIG_ATTACH_NODE 633 * + OF_RECONFIG_DETACH_NODE, 634 * + OF_RECONFIG_ADD_PROPERTY 635 * + OF_RECONFIG_REMOVE_PROPERTY, 636 * + OF_RECONFIG_UPDATE_PROPERTY 637 * Returns 0 on success, a negative error value in case of an error. 638 */ 639int of_changeset_action(struct of_changeset *ocs, unsigned long action, 640 struct device_node *np, struct property *prop) 641{ 642 struct of_changeset_entry *ce; 643 644 ce = kzalloc(sizeof(*ce), GFP_KERNEL); 645 if (!ce) { 646 pr_err("%s: Failed to allocate\n", __func__); 647 return -ENOMEM; 648 } 649 /* get a reference to the node */ 650 ce->action = action; 651 ce->np = of_node_get(np); 652 ce->prop = prop; 653 654 if (action == OF_RECONFIG_UPDATE_PROPERTY && prop) 655 ce->old_prop = of_find_property(np, prop->name, NULL); 656 657 /* add it to the list */ 658 list_add_tail(&ce->node, &ocs->entries); 659 return 0; 660}