1 /* 2 * file for managing the edac_device subsystem of devices for EDAC 3 * 4 * (C) 2007 SoftwareBitMaker 5 * 6 * This file may be distributed under the terms of the 7 * GNU General Public License. 8 * 9 * Written Doug Thompson <norsk5@xmission.com> 10 * 11 */ 12 13 #include <linux/ctype.h> 14 #include <linux/module.h> 15 #include <linux/slab.h> 16 #include <linux/edac.h> 17 18 #include "edac_device.h" 19 #include "edac_module.h" 20 21 #define EDAC_DEVICE_SYMLINK "device" 22 23 #define to_edacdev(k) container_of(k, struct edac_device_ctl_info, kobj) 24 #define to_edacdev_attr(a) container_of(a, struct edacdev_attribute, attr) 25 26 27 /* 28 * Set of edac_device_ctl_info attribute store/show functions 29 */ 30 31 /* 'log_ue' */ 32 static ssize_t edac_device_ctl_log_ue_show(struct edac_device_ctl_info 33 *ctl_info, char *data) 34 { 35 return sprintf(data, "%u\n", ctl_info->log_ue); 36 } 37 38 static ssize_t edac_device_ctl_log_ue_store(struct edac_device_ctl_info 39 *ctl_info, const char *data, 40 size_t count) 41 { 42 /* if parameter is zero, turn off flag, if non-zero turn on flag */ 43 ctl_info->log_ue = (simple_strtoul(data, NULL, 0) != 0); 44 45 return count; 46 } 47 48 /* 'log_ce' */ 49 static ssize_t edac_device_ctl_log_ce_show(struct edac_device_ctl_info 50 *ctl_info, char *data) 51 { 52 return sprintf(data, "%u\n", ctl_info->log_ce); 53 } 54 55 static ssize_t edac_device_ctl_log_ce_store(struct edac_device_ctl_info 56 *ctl_info, const char *data, 57 size_t count) 58 { 59 /* if parameter is zero, turn off flag, if non-zero turn on flag */ 60 ctl_info->log_ce = (simple_strtoul(data, NULL, 0) != 0); 61 62 return count; 63 } 64 65 /* 'panic_on_ue' */ 66 static ssize_t edac_device_ctl_panic_on_ue_show(struct edac_device_ctl_info 67 *ctl_info, char *data) 68 { 69 return sprintf(data, "%u\n", ctl_info->panic_on_ue); 70 } 71 72 static ssize_t edac_device_ctl_panic_on_ue_store(struct edac_device_ctl_info 73 *ctl_info, const char *data, 74 size_t count) 75 { 76 /* if parameter is zero, turn off flag, if non-zero turn on flag */ 77 ctl_info->panic_on_ue = (simple_strtoul(data, NULL, 0) != 0); 78 79 return count; 80 } 81 82 /* 'poll_msec' show and store functions*/ 83 static ssize_t edac_device_ctl_poll_msec_show(struct edac_device_ctl_info 84 *ctl_info, char *data) 85 { 86 return sprintf(data, "%u\n", ctl_info->poll_msec); 87 } 88 89 static ssize_t edac_device_ctl_poll_msec_store(struct edac_device_ctl_info 90 *ctl_info, const char *data, 91 size_t count) 92 { 93 unsigned long value; 94 95 /* get the value and enforce that it is non-zero, must be at least 96 * one millisecond for the delay period, between scans 97 * Then cancel last outstanding delay for the work request 98 * and set a new one. 99 */ 100 value = simple_strtoul(data, NULL, 0); 101 edac_device_reset_delay_period(ctl_info, value); 102 103 return count; 104 } 105 106 /* edac_device_ctl_info specific attribute structure */ 107 struct ctl_info_attribute { 108 struct attribute attr; 109 ssize_t(*show) (struct edac_device_ctl_info *, char *); 110 ssize_t(*store) (struct edac_device_ctl_info *, const char *, size_t); 111 }; 112 113 #define to_ctl_info(k) container_of(k, struct edac_device_ctl_info, kobj) 114 #define to_ctl_info_attr(a) container_of(a,struct ctl_info_attribute,attr) 115 116 /* Function to 'show' fields from the edac_dev 'ctl_info' structure */ 117 static ssize_t edac_dev_ctl_info_show(struct kobject *kobj, 118 struct attribute *attr, char *buffer) 119 { 120 struct edac_device_ctl_info *edac_dev = to_ctl_info(kobj); 121 struct ctl_info_attribute *ctl_info_attr = to_ctl_info_attr(attr); 122 123 if (ctl_info_attr->show) 124 return ctl_info_attr->show(edac_dev, buffer); 125 return -EIO; 126 } 127 128 /* Function to 'store' fields into the edac_dev 'ctl_info' structure */ 129 static ssize_t edac_dev_ctl_info_store(struct kobject *kobj, 130 struct attribute *attr, 131 const char *buffer, size_t count) 132 { 133 struct edac_device_ctl_info *edac_dev = to_ctl_info(kobj); 134 struct ctl_info_attribute *ctl_info_attr = to_ctl_info_attr(attr); 135 136 if (ctl_info_attr->store) 137 return ctl_info_attr->store(edac_dev, buffer, count); 138 return -EIO; 139 } 140 141 /* edac_dev file operations for an 'ctl_info' */ 142 static const struct sysfs_ops device_ctl_info_ops = { 143 .show = edac_dev_ctl_info_show, 144 .store = edac_dev_ctl_info_store 145 }; 146 147 #define CTL_INFO_ATTR(_name,_mode,_show,_store) \ 148 static struct ctl_info_attribute attr_ctl_info_##_name = { \ 149 .attr = {.name = __stringify(_name), .mode = _mode }, \ 150 .show = _show, \ 151 .store = _store, \ 152 }; 153 154 /* Declare the various ctl_info attributes here and their respective ops */ 155 CTL_INFO_ATTR(log_ue, S_IRUGO | S_IWUSR, 156 edac_device_ctl_log_ue_show, edac_device_ctl_log_ue_store); 157 CTL_INFO_ATTR(log_ce, S_IRUGO | S_IWUSR, 158 edac_device_ctl_log_ce_show, edac_device_ctl_log_ce_store); 159 CTL_INFO_ATTR(panic_on_ue, S_IRUGO | S_IWUSR, 160 edac_device_ctl_panic_on_ue_show, 161 edac_device_ctl_panic_on_ue_store); 162 CTL_INFO_ATTR(poll_msec, S_IRUGO | S_IWUSR, 163 edac_device_ctl_poll_msec_show, edac_device_ctl_poll_msec_store); 164 165 /* Base Attributes of the EDAC_DEVICE ECC object */ 166 static struct attribute *device_ctrl_attrs[] = { 167 &attr_ctl_info_panic_on_ue.attr, 168 &attr_ctl_info_log_ue.attr, 169 &attr_ctl_info_log_ce.attr, 170 &attr_ctl_info_poll_msec.attr, 171 NULL, 172 }; 173 ATTRIBUTE_GROUPS(device_ctrl); 174 175 /* 176 * edac_device_ctrl_master_release 177 * 178 * called when the reference count for the 'main' kobj 179 * for a edac_device control struct reaches zero 180 * 181 * Reference count model: 182 * One 'main' kobject for each control structure allocated. 183 * That main kobj is initially set to one AND 184 * the reference count for the EDAC 'core' module is 185 * bumped by one, thus added 'keep in memory' dependency. 186 * 187 * Each new internal kobj (in instances and blocks) then 188 * bumps the 'main' kobject. 189 * 190 * When they are released their release functions decrement 191 * the 'main' kobj. 192 * 193 * When the main kobj reaches zero (0) then THIS function 194 * is called which then decrements the EDAC 'core' module. 195 * When the module reference count reaches zero then the 196 * module no longer has dependency on keeping the release 197 * function code in memory and module can be unloaded. 198 * 199 * This will support several control objects as well, each 200 * with its own 'main' kobj. 201 */ 202 static void edac_device_ctrl_master_release(struct kobject *kobj) 203 { 204 struct edac_device_ctl_info *edac_dev = to_edacdev(kobj); 205 206 edac_dbg(4, "control index=%d\n", edac_dev->dev_idx); 207 208 /* decrement the EDAC CORE module ref count */ 209 module_put(edac_dev->owner); 210 211 /* free the control struct containing the 'main' kobj 212 * passed in to this routine 213 */ 214 kfree(edac_dev); 215 } 216 217 /* ktype for the main (master) kobject */ 218 static struct kobj_type ktype_device_ctrl = { 219 .release = edac_device_ctrl_master_release, 220 .sysfs_ops = &device_ctl_info_ops, 221 .default_groups = device_ctrl_groups, 222 }; 223 224 /* 225 * edac_device_register_sysfs_main_kobj 226 * 227 * perform the high level setup for the new edac_device instance 228 * 229 * Return: 0 SUCCESS 230 * !0 FAILURE 231 */ 232 int edac_device_register_sysfs_main_kobj(struct edac_device_ctl_info *edac_dev) 233 { 234 struct bus_type *edac_subsys; 235 int err; 236 237 edac_dbg(1, "\n"); 238 239 /* get the /sys/devices/system/edac reference */ 240 edac_subsys = edac_get_sysfs_subsys(); 241 242 /* Point to the 'edac_subsys' this instance 'reports' to */ 243 edac_dev->edac_subsys = edac_subsys; 244 245 /* Init the devices's kobject */ 246 memset(&edac_dev->kobj, 0, sizeof(struct kobject)); 247 248 /* Record which module 'owns' this control structure 249 * and bump the ref count of the module 250 */ 251 edac_dev->owner = THIS_MODULE; 252 253 if (!try_module_get(edac_dev->owner)) { 254 err = -ENODEV; 255 goto err_out; 256 } 257 258 /* register */ 259 err = kobject_init_and_add(&edac_dev->kobj, &ktype_device_ctrl, 260 &edac_subsys->dev_root->kobj, 261 "%s", edac_dev->name); 262 if (err) { 263 edac_dbg(1, "Failed to register '.../edac/%s'\n", 264 edac_dev->name); 265 goto err_kobj_reg; 266 } 267 kobject_uevent(&edac_dev->kobj, KOBJ_ADD); 268 269 /* At this point, to 'free' the control struct, 270 * edac_device_unregister_sysfs_main_kobj() must be used 271 */ 272 273 edac_dbg(4, "Registered '.../edac/%s' kobject\n", edac_dev->name); 274 275 return 0; 276 277 /* Error exit stack */ 278 err_kobj_reg: 279 kobject_put(&edac_dev->kobj); 280 module_put(edac_dev->owner); 281 282 err_out: 283 return err; 284 } 285 286 /* 287 * edac_device_unregister_sysfs_main_kobj: 288 * the '..../edac/<name>' kobject 289 */ 290 void edac_device_unregister_sysfs_main_kobj(struct edac_device_ctl_info *dev) 291 { 292 edac_dbg(0, "\n"); 293 edac_dbg(4, "name of kobject is: %s\n", kobject_name(&dev->kobj)); 294 295 /* 296 * Unregister the edac device's kobject and 297 * allow for reference count to reach 0 at which point 298 * the callback will be called to: 299 * a) module_put() this module 300 * b) 'kfree' the memory 301 */ 302 kobject_put(&dev->kobj); 303 } 304 305 /* edac_dev -> instance information */ 306 307 /* 308 * Set of low-level instance attribute show functions 309 */ 310 static ssize_t instance_ue_count_show(struct edac_device_instance *instance, 311 char *data) 312 { 313 return sprintf(data, "%u\n", instance->counters.ue_count); 314 } 315 316 static ssize_t instance_ce_count_show(struct edac_device_instance *instance, 317 char *data) 318 { 319 return sprintf(data, "%u\n", instance->counters.ce_count); 320 } 321 322 #define to_instance(k) container_of(k, struct edac_device_instance, kobj) 323 #define to_instance_attr(a) container_of(a,struct instance_attribute,attr) 324 325 /* DEVICE instance kobject release() function */ 326 static void edac_device_ctrl_instance_release(struct kobject *kobj) 327 { 328 struct edac_device_instance *instance; 329 330 edac_dbg(1, "\n"); 331 332 /* map from this kobj to the main control struct 333 * and then dec the main kobj count 334 */ 335 instance = to_instance(kobj); 336 kobject_put(&instance->ctl->kobj); 337 } 338 339 /* instance specific attribute structure */ 340 struct instance_attribute { 341 struct attribute attr; 342 ssize_t(*show) (struct edac_device_instance *, char *); 343 ssize_t(*store) (struct edac_device_instance *, const char *, size_t); 344 }; 345 346 /* Function to 'show' fields from the edac_dev 'instance' structure */ 347 static ssize_t edac_dev_instance_show(struct kobject *kobj, 348 struct attribute *attr, char *buffer) 349 { 350 struct edac_device_instance *instance = to_instance(kobj); 351 struct instance_attribute *instance_attr = to_instance_attr(attr); 352 353 if (instance_attr->show) 354 return instance_attr->show(instance, buffer); 355 return -EIO; 356 } 357 358 /* Function to 'store' fields into the edac_dev 'instance' structure */ 359 static ssize_t edac_dev_instance_store(struct kobject *kobj, 360 struct attribute *attr, 361 const char *buffer, size_t count) 362 { 363 struct edac_device_instance *instance = to_instance(kobj); 364 struct instance_attribute *instance_attr = to_instance_attr(attr); 365 366 if (instance_attr->store) 367 return instance_attr->store(instance, buffer, count); 368 return -EIO; 369 } 370 371 /* edac_dev file operations for an 'instance' */ 372 static const struct sysfs_ops device_instance_ops = { 373 .show = edac_dev_instance_show, 374 .store = edac_dev_instance_store 375 }; 376 377 #define INSTANCE_ATTR(_name,_mode,_show,_store) \ 378 static struct instance_attribute attr_instance_##_name = { \ 379 .attr = {.name = __stringify(_name), .mode = _mode }, \ 380 .show = _show, \ 381 .store = _store, \ 382 }; 383 384 /* 385 * Define attributes visible for the edac_device instance object 386 * Each contains a pointer to a show and an optional set 387 * function pointer that does the low level output/input 388 */ 389 INSTANCE_ATTR(ce_count, S_IRUGO, instance_ce_count_show, NULL); 390 INSTANCE_ATTR(ue_count, S_IRUGO, instance_ue_count_show, NULL); 391 392 /* list of edac_dev 'instance' attributes */ 393 static struct attribute *device_instance_attrs[] = { 394 &attr_instance_ce_count.attr, 395 &attr_instance_ue_count.attr, 396 NULL, 397 }; 398 ATTRIBUTE_GROUPS(device_instance); 399 400 /* The 'ktype' for each edac_dev 'instance' */ 401 static struct kobj_type ktype_instance_ctrl = { 402 .release = edac_device_ctrl_instance_release, 403 .sysfs_ops = &device_instance_ops, 404 .default_groups = device_instance_groups, 405 }; 406 407 /* edac_dev -> instance -> block information */ 408 409 #define to_block(k) container_of(k, struct edac_device_block, kobj) 410 #define to_block_attr(a) \ 411 container_of(a, struct edac_dev_sysfs_block_attribute, attr) 412 413 /* 414 * Set of low-level block attribute show functions 415 */ 416 static ssize_t block_ue_count_show(struct kobject *kobj, 417 struct attribute *attr, char *data) 418 { 419 struct edac_device_block *block = to_block(kobj); 420 421 return sprintf(data, "%u\n", block->counters.ue_count); 422 } 423 424 static ssize_t block_ce_count_show(struct kobject *kobj, 425 struct attribute *attr, char *data) 426 { 427 struct edac_device_block *block = to_block(kobj); 428 429 return sprintf(data, "%u\n", block->counters.ce_count); 430 } 431 432 /* DEVICE block kobject release() function */ 433 static void edac_device_ctrl_block_release(struct kobject *kobj) 434 { 435 struct edac_device_block *block; 436 437 edac_dbg(1, "\n"); 438 439 /* get the container of the kobj */ 440 block = to_block(kobj); 441 442 /* map from 'block kobj' to 'block->instance->controller->main_kobj' 443 * now 'release' the block kobject 444 */ 445 kobject_put(&block->instance->ctl->kobj); 446 } 447 448 449 /* Function to 'show' fields from the edac_dev 'block' structure */ 450 static ssize_t edac_dev_block_show(struct kobject *kobj, 451 struct attribute *attr, char *buffer) 452 { 453 struct edac_dev_sysfs_block_attribute *block_attr = 454 to_block_attr(attr); 455 456 if (block_attr->show) 457 return block_attr->show(kobj, attr, buffer); 458 return -EIO; 459 } 460 461 /* Function to 'store' fields into the edac_dev 'block' structure */ 462 static ssize_t edac_dev_block_store(struct kobject *kobj, 463 struct attribute *attr, 464 const char *buffer, size_t count) 465 { 466 struct edac_dev_sysfs_block_attribute *block_attr; 467 468 block_attr = to_block_attr(attr); 469 470 if (block_attr->store) 471 return block_attr->store(kobj, attr, buffer, count); 472 return -EIO; 473 } 474 475 /* edac_dev file operations for a 'block' */ 476 static const struct sysfs_ops device_block_ops = { 477 .show = edac_dev_block_show, 478 .store = edac_dev_block_store 479 }; 480 481 #define BLOCK_ATTR(_name,_mode,_show,_store) \ 482 static struct edac_dev_sysfs_block_attribute attr_block_##_name = { \ 483 .attr = {.name = __stringify(_name), .mode = _mode }, \ 484 .show = _show, \ 485 .store = _store, \ 486 }; 487 488 BLOCK_ATTR(ce_count, S_IRUGO, block_ce_count_show, NULL); 489 BLOCK_ATTR(ue_count, S_IRUGO, block_ue_count_show, NULL); 490 491 /* list of edac_dev 'block' attributes */ 492 static struct attribute *device_block_attrs[] = { 493 &attr_block_ce_count.attr, 494 &attr_block_ue_count.attr, 495 NULL, 496 }; 497 ATTRIBUTE_GROUPS(device_block); 498 499 /* The 'ktype' for each edac_dev 'block' */ 500 static struct kobj_type ktype_block_ctrl = { 501 .release = edac_device_ctrl_block_release, 502 .sysfs_ops = &device_block_ops, 503 .default_groups = device_block_groups, 504 }; 505 506 /* block ctor/dtor code */ 507 508 /* 509 * edac_device_create_block 510 */ 511 static int edac_device_create_block(struct edac_device_ctl_info *edac_dev, 512 struct edac_device_instance *instance, 513 struct edac_device_block *block) 514 { 515 int i; 516 int err; 517 struct edac_dev_sysfs_block_attribute *sysfs_attrib; 518 struct kobject *main_kobj; 519 520 edac_dbg(4, "Instance '%s' inst_p=%p block '%s' block_p=%p\n", 521 instance->name, instance, block->name, block); 522 edac_dbg(4, "block kobj=%p block kobj->parent=%p\n", 523 &block->kobj, &block->kobj.parent); 524 525 /* init this block's kobject */ 526 memset(&block->kobj, 0, sizeof(struct kobject)); 527 528 /* bump the main kobject's reference count for this controller 529 * and this instance is dependent on the main 530 */ 531 main_kobj = kobject_get(&edac_dev->kobj); 532 if (!main_kobj) { 533 err = -ENODEV; 534 goto err_out; 535 } 536 537 /* Add this block's kobject */ 538 err = kobject_init_and_add(&block->kobj, &ktype_block_ctrl, 539 &instance->kobj, 540 "%s", block->name); 541 if (err) { 542 edac_dbg(1, "Failed to register instance '%s'\n", block->name); 543 kobject_put(main_kobj); 544 err = -ENODEV; 545 goto err_out; 546 } 547 548 /* If there are driver level block attributes, then added them 549 * to the block kobject 550 */ 551 sysfs_attrib = block->block_attributes; 552 if (sysfs_attrib && block->nr_attribs) { 553 for (i = 0; i < block->nr_attribs; i++, sysfs_attrib++) { 554 555 edac_dbg(4, "creating block attrib='%s' attrib->%p to kobj=%p\n", 556 sysfs_attrib->attr.name, 557 sysfs_attrib, &block->kobj); 558 559 /* Create each block_attribute file */ 560 err = sysfs_create_file(&block->kobj, 561 &sysfs_attrib->attr); 562 if (err) 563 goto err_on_attrib; 564 } 565 } 566 kobject_uevent(&block->kobj, KOBJ_ADD); 567 568 return 0; 569 570 /* Error unwind stack */ 571 err_on_attrib: 572 kobject_put(&block->kobj); 573 574 err_out: 575 return err; 576 } 577 578 /* 579 * edac_device_delete_block(edac_dev,block); 580 */ 581 static void edac_device_delete_block(struct edac_device_ctl_info *edac_dev, 582 struct edac_device_block *block) 583 { 584 struct edac_dev_sysfs_block_attribute *sysfs_attrib; 585 int i; 586 587 /* if this block has 'attributes' then we need to iterate over the list 588 * and 'remove' the attributes on this block 589 */ 590 sysfs_attrib = block->block_attributes; 591 if (sysfs_attrib && block->nr_attribs) { 592 for (i = 0; i < block->nr_attribs; i++, sysfs_attrib++) { 593 594 /* remove each block_attrib file */ 595 sysfs_remove_file(&block->kobj, 596 (struct attribute *) sysfs_attrib); 597 } 598 } 599 600 /* unregister this block's kobject, SEE: 601 * edac_device_ctrl_block_release() callback operation 602 */ 603 kobject_put(&block->kobj); 604 } 605 606 /* instance ctor/dtor code */ 607 608 /* 609 * edac_device_create_instance 610 * create just one instance of an edac_device 'instance' 611 */ 612 static int edac_device_create_instance(struct edac_device_ctl_info *edac_dev, 613 int idx) 614 { 615 int i, j; 616 int err; 617 struct edac_device_instance *instance; 618 struct kobject *main_kobj; 619 620 instance = &edac_dev->instances[idx]; 621 622 /* Init the instance's kobject */ 623 memset(&instance->kobj, 0, sizeof(struct kobject)); 624 625 instance->ctl = edac_dev; 626 627 /* bump the main kobject's reference count for this controller 628 * and this instance is dependent on the main 629 */ 630 main_kobj = kobject_get(&edac_dev->kobj); 631 if (!main_kobj) { 632 err = -ENODEV; 633 goto err_out; 634 } 635 636 /* Formally register this instance's kobject under the edac_device */ 637 err = kobject_init_and_add(&instance->kobj, &ktype_instance_ctrl, 638 &edac_dev->kobj, "%s", instance->name); 639 if (err != 0) { 640 edac_dbg(2, "Failed to register instance '%s'\n", 641 instance->name); 642 kobject_put(main_kobj); 643 goto err_out; 644 } 645 646 edac_dbg(4, "now register '%d' blocks for instance %d\n", 647 instance->nr_blocks, idx); 648 649 /* register all blocks of this instance */ 650 for (i = 0; i < instance->nr_blocks; i++) { 651 err = edac_device_create_block(edac_dev, instance, 652 &instance->blocks[i]); 653 if (err) { 654 /* If any fail, remove all previous ones */ 655 for (j = 0; j < i; j++) 656 edac_device_delete_block(edac_dev, 657 &instance->blocks[j]); 658 goto err_release_instance_kobj; 659 } 660 } 661 kobject_uevent(&instance->kobj, KOBJ_ADD); 662 663 edac_dbg(4, "Registered instance %d '%s' kobject\n", 664 idx, instance->name); 665 666 return 0; 667 668 /* error unwind stack */ 669 err_release_instance_kobj: 670 kobject_put(&instance->kobj); 671 672 err_out: 673 return err; 674 } 675 676 /* 677 * edac_device_remove_instance 678 * remove an edac_device instance 679 */ 680 static void edac_device_delete_instance(struct edac_device_ctl_info *edac_dev, 681 int idx) 682 { 683 struct edac_device_instance *instance; 684 int i; 685 686 instance = &edac_dev->instances[idx]; 687 688 /* unregister all blocks in this instance */ 689 for (i = 0; i < instance->nr_blocks; i++) 690 edac_device_delete_block(edac_dev, &instance->blocks[i]); 691 692 /* unregister this instance's kobject, SEE: 693 * edac_device_ctrl_instance_release() for callback operation 694 */ 695 kobject_put(&instance->kobj); 696 } 697 698 /* 699 * edac_device_create_instances 700 * create the first level of 'instances' for this device 701 * (ie 'cache' might have 'cache0', 'cache1', 'cache2', etc 702 */ 703 static int edac_device_create_instances(struct edac_device_ctl_info *edac_dev) 704 { 705 int i, j; 706 int err; 707 708 edac_dbg(0, "\n"); 709 710 /* iterate over creation of the instances */ 711 for (i = 0; i < edac_dev->nr_instances; i++) { 712 err = edac_device_create_instance(edac_dev, i); 713 if (err) { 714 /* unwind previous instances on error */ 715 for (j = 0; j < i; j++) 716 edac_device_delete_instance(edac_dev, j); 717 return err; 718 } 719 } 720 721 return 0; 722 } 723 724 /* 725 * edac_device_delete_instances(edac_dev); 726 * unregister all the kobjects of the instances 727 */ 728 static void edac_device_delete_instances(struct edac_device_ctl_info *edac_dev) 729 { 730 int i; 731 732 /* iterate over creation of the instances */ 733 for (i = 0; i < edac_dev->nr_instances; i++) 734 edac_device_delete_instance(edac_dev, i); 735 } 736 737 /* edac_dev sysfs ctor/dtor code */ 738 739 /* 740 * edac_device_add_main_sysfs_attributes 741 * add some attributes to this instance's main kobject 742 */ 743 static int edac_device_add_main_sysfs_attributes( 744 struct edac_device_ctl_info *edac_dev) 745 { 746 struct edac_dev_sysfs_attribute *sysfs_attrib; 747 int err = 0; 748 749 sysfs_attrib = edac_dev->sysfs_attributes; 750 if (sysfs_attrib) { 751 /* iterate over the array and create an attribute for each 752 * entry in the list 753 */ 754 while (sysfs_attrib->attr.name != NULL) { 755 err = sysfs_create_file(&edac_dev->kobj, 756 (struct attribute*) sysfs_attrib); 757 if (err) 758 goto err_out; 759 760 sysfs_attrib++; 761 } 762 } 763 764 err_out: 765 return err; 766 } 767 768 /* 769 * edac_device_remove_main_sysfs_attributes 770 * remove any attributes to this instance's main kobject 771 */ 772 static void edac_device_remove_main_sysfs_attributes( 773 struct edac_device_ctl_info *edac_dev) 774 { 775 struct edac_dev_sysfs_attribute *sysfs_attrib; 776 777 /* if there are main attributes, defined, remove them. First, 778 * point to the start of the array and iterate over it 779 * removing each attribute listed from this device's instance's kobject 780 */ 781 sysfs_attrib = edac_dev->sysfs_attributes; 782 if (sysfs_attrib) { 783 while (sysfs_attrib->attr.name != NULL) { 784 sysfs_remove_file(&edac_dev->kobj, 785 (struct attribute *) sysfs_attrib); 786 sysfs_attrib++; 787 } 788 } 789 } 790 791 /* 792 * edac_device_create_sysfs() Constructor 793 * 794 * accept a created edac_device control structure 795 * and 'export' it to sysfs. The 'main' kobj should already have been 796 * created. 'instance' and 'block' kobjects should be registered 797 * along with any 'block' attributes from the low driver. In addition, 798 * the main attributes (if any) are connected to the main kobject of 799 * the control structure. 800 * 801 * Return: 802 * 0 Success 803 * !0 Failure 804 */ 805 int edac_device_create_sysfs(struct edac_device_ctl_info *edac_dev) 806 { 807 int err; 808 struct kobject *edac_kobj = &edac_dev->kobj; 809 810 edac_dbg(0, "idx=%d\n", edac_dev->dev_idx); 811 812 /* go create any main attributes callers wants */ 813 err = edac_device_add_main_sysfs_attributes(edac_dev); 814 if (err) { 815 edac_dbg(0, "failed to add sysfs attribs\n"); 816 goto err_out; 817 } 818 819 /* create a symlink from the edac device 820 * to the platform 'device' being used for this 821 */ 822 err = sysfs_create_link(edac_kobj, 823 &edac_dev->dev->kobj, EDAC_DEVICE_SYMLINK); 824 if (err) { 825 edac_dbg(0, "sysfs_create_link() returned err= %d\n", err); 826 goto err_remove_main_attribs; 827 } 828 829 /* Create the first level instance directories 830 * In turn, the nested blocks beneath the instances will 831 * be registered as well 832 */ 833 err = edac_device_create_instances(edac_dev); 834 if (err) { 835 edac_dbg(0, "edac_device_create_instances() returned err= %d\n", 836 err); 837 goto err_remove_link; 838 } 839 840 841 edac_dbg(4, "create-instances done, idx=%d\n", edac_dev->dev_idx); 842 843 return 0; 844 845 /* Error unwind stack */ 846 err_remove_link: 847 /* remove the sym link */ 848 sysfs_remove_link(&edac_dev->kobj, EDAC_DEVICE_SYMLINK); 849 850 err_remove_main_attribs: 851 edac_device_remove_main_sysfs_attributes(edac_dev); 852 853 err_out: 854 return err; 855 } 856 857 /* 858 * edac_device_remove_sysfs() destructor 859 * 860 * given an edac_device struct, tear down the kobject resources 861 */ 862 void edac_device_remove_sysfs(struct edac_device_ctl_info *edac_dev) 863 { 864 edac_dbg(0, "\n"); 865 866 /* remove any main attributes for this device */ 867 edac_device_remove_main_sysfs_attributes(edac_dev); 868 869 /* remove the device sym link */ 870 sysfs_remove_link(&edac_dev->kobj, EDAC_DEVICE_SYMLINK); 871 872 /* walk the instance/block kobject tree, deconstructing it */ 873 edac_device_delete_instances(edac_dev); 874 } 875