1 /* 2 * drivers/s390/cio/css.c 3 * driver for channel subsystem 4 * 5 * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, 6 * IBM Corporation 7 * Author(s): Arnd Bergmann (arndb@de.ibm.com) 8 * Cornelia Huck (cornelia.huck@de.ibm.com) 9 */ 10 #include <linux/module.h> 11 #include <linux/init.h> 12 #include <linux/device.h> 13 #include <linux/slab.h> 14 #include <linux/errno.h> 15 #include <linux/list.h> 16 17 #include "css.h" 18 #include "cio.h" 19 #include "cio_debug.h" 20 #include "ioasm.h" 21 #include "chsc.h" 22 #include "device.h" 23 24 int need_rescan = 0; 25 int css_init_done = 0; 26 static int need_reprobe = 0; 27 static int max_ssid = 0; 28 29 struct channel_subsystem *css[__MAX_CSSID + 1]; 30 31 int css_characteristics_avail = 0; 32 33 int 34 for_each_subchannel(int(*fn)(struct subchannel_id, void *), void *data) 35 { 36 struct subchannel_id schid; 37 int ret; 38 39 init_subchannel_id(&schid); 40 ret = -ENODEV; 41 do { 42 do { 43 ret = fn(schid, data); 44 if (ret) 45 break; 46 } while (schid.sch_no++ < __MAX_SUBCHANNEL); 47 schid.sch_no = 0; 48 } while (schid.ssid++ < max_ssid); 49 return ret; 50 } 51 52 static struct subchannel * 53 css_alloc_subchannel(struct subchannel_id schid) 54 { 55 struct subchannel *sch; 56 int ret; 57 58 sch = kmalloc (sizeof (*sch), GFP_KERNEL | GFP_DMA); 59 if (sch == NULL) 60 return ERR_PTR(-ENOMEM); 61 ret = cio_validate_subchannel (sch, schid); 62 if (ret < 0) { 63 kfree(sch); 64 return ERR_PTR(ret); 65 } 66 67 if (sch->st != SUBCHANNEL_TYPE_IO) { 68 /* For now we ignore all non-io subchannels. */ 69 kfree(sch); 70 return ERR_PTR(-EINVAL); 71 } 72 73 /* 74 * Set intparm to subchannel address. 75 * This is fine even on 64bit since the subchannel is always located 76 * under 2G. 77 */ 78 sch->schib.pmcw.intparm = (__u32)(unsigned long)sch; 79 ret = cio_modify(sch); 80 if (ret) { 81 kfree(sch); 82 return ERR_PTR(ret); 83 } 84 return sch; 85 } 86 87 static void 88 css_free_subchannel(struct subchannel *sch) 89 { 90 if (sch) { 91 /* Reset intparm to zeroes. */ 92 sch->schib.pmcw.intparm = 0; 93 cio_modify(sch); 94 kfree(sch->lock); 95 kfree(sch); 96 } 97 } 98 99 static void 100 css_subchannel_release(struct device *dev) 101 { 102 struct subchannel *sch; 103 104 sch = to_subchannel(dev); 105 if (!cio_is_console(sch->schid)) { 106 kfree(sch->lock); 107 kfree(sch); 108 } 109 } 110 111 int css_sch_device_register(struct subchannel *sch) 112 { 113 int ret; 114 115 mutex_lock(&sch->reg_mutex); 116 ret = device_register(&sch->dev); 117 mutex_unlock(&sch->reg_mutex); 118 return ret; 119 } 120 121 void css_sch_device_unregister(struct subchannel *sch) 122 { 123 mutex_lock(&sch->reg_mutex); 124 device_unregister(&sch->dev); 125 mutex_unlock(&sch->reg_mutex); 126 } 127 128 static int 129 css_register_subchannel(struct subchannel *sch) 130 { 131 int ret; 132 133 /* Initialize the subchannel structure */ 134 sch->dev.parent = &css[0]->device; 135 sch->dev.bus = &css_bus_type; 136 sch->dev.release = &css_subchannel_release; 137 sch->dev.groups = subch_attr_groups; 138 139 css_get_ssd_info(sch); 140 141 /* make it known to the system */ 142 ret = css_sch_device_register(sch); 143 if (ret) { 144 printk (KERN_WARNING "%s: could not register %s\n", 145 __func__, sch->dev.bus_id); 146 return ret; 147 } 148 return ret; 149 } 150 151 int 152 css_probe_device(struct subchannel_id schid) 153 { 154 int ret; 155 struct subchannel *sch; 156 157 sch = css_alloc_subchannel(schid); 158 if (IS_ERR(sch)) 159 return PTR_ERR(sch); 160 ret = css_register_subchannel(sch); 161 if (ret) 162 css_free_subchannel(sch); 163 return ret; 164 } 165 166 static int 167 check_subchannel(struct device * dev, void * data) 168 { 169 struct subchannel *sch; 170 struct subchannel_id *schid = data; 171 172 sch = to_subchannel(dev); 173 return schid_equal(&sch->schid, schid); 174 } 175 176 struct subchannel * 177 get_subchannel_by_schid(struct subchannel_id schid) 178 { 179 struct device *dev; 180 181 dev = bus_find_device(&css_bus_type, NULL, 182 &schid, check_subchannel); 183 184 return dev ? to_subchannel(dev) : NULL; 185 } 186 187 static int css_get_subchannel_status(struct subchannel *sch) 188 { 189 struct schib schib; 190 191 if (stsch(sch->schid, &schib) || !schib.pmcw.dnv) 192 return CIO_GONE; 193 if (sch->schib.pmcw.dnv && (schib.pmcw.dev != sch->schib.pmcw.dev)) 194 return CIO_REVALIDATE; 195 if (!sch->lpm) 196 return CIO_NO_PATH; 197 return CIO_OPER; 198 } 199 200 static int css_evaluate_known_subchannel(struct subchannel *sch, int slow) 201 { 202 int event, ret, disc; 203 unsigned long flags; 204 enum { NONE, UNREGISTER, UNREGISTER_PROBE, REPROBE } action; 205 206 spin_lock_irqsave(sch->lock, flags); 207 disc = device_is_disconnected(sch); 208 if (disc && slow) { 209 /* Disconnected devices are evaluated directly only.*/ 210 spin_unlock_irqrestore(sch->lock, flags); 211 return 0; 212 } 213 /* No interrupt after machine check - kill pending timers. */ 214 device_kill_pending_timer(sch); 215 if (!disc && !slow) { 216 /* Non-disconnected devices are evaluated on the slow path. */ 217 spin_unlock_irqrestore(sch->lock, flags); 218 return -EAGAIN; 219 } 220 event = css_get_subchannel_status(sch); 221 CIO_MSG_EVENT(4, "Evaluating schid 0.%x.%04x, event %d, %s, %s path.\n", 222 sch->schid.ssid, sch->schid.sch_no, event, 223 disc ? "disconnected" : "normal", 224 slow ? "slow" : "fast"); 225 /* Analyze subchannel status. */ 226 action = NONE; 227 switch (event) { 228 case CIO_NO_PATH: 229 if (disc) { 230 /* Check if paths have become available. */ 231 action = REPROBE; 232 break; 233 } 234 /* fall through */ 235 case CIO_GONE: 236 /* Prevent unwanted effects when opening lock. */ 237 cio_disable_subchannel(sch); 238 device_set_disconnected(sch); 239 /* Ask driver what to do with device. */ 240 action = UNREGISTER; 241 if (sch->driver && sch->driver->notify) { 242 spin_unlock_irqrestore(sch->lock, flags); 243 ret = sch->driver->notify(&sch->dev, event); 244 spin_lock_irqsave(sch->lock, flags); 245 if (ret) 246 action = NONE; 247 } 248 break; 249 case CIO_REVALIDATE: 250 /* Device will be removed, so no notify necessary. */ 251 if (disc) 252 /* Reprobe because immediate unregister might block. */ 253 action = REPROBE; 254 else 255 action = UNREGISTER_PROBE; 256 break; 257 case CIO_OPER: 258 if (disc) 259 /* Get device operational again. */ 260 action = REPROBE; 261 break; 262 } 263 /* Perform action. */ 264 ret = 0; 265 switch (action) { 266 case UNREGISTER: 267 case UNREGISTER_PROBE: 268 /* Unregister device (will use subchannel lock). */ 269 spin_unlock_irqrestore(sch->lock, flags); 270 css_sch_device_unregister(sch); 271 spin_lock_irqsave(sch->lock, flags); 272 273 /* Reset intparm to zeroes. */ 274 sch->schib.pmcw.intparm = 0; 275 cio_modify(sch); 276 break; 277 case REPROBE: 278 device_trigger_reprobe(sch); 279 break; 280 default: 281 break; 282 } 283 spin_unlock_irqrestore(sch->lock, flags); 284 /* Probe if necessary. */ 285 if (action == UNREGISTER_PROBE) 286 ret = css_probe_device(sch->schid); 287 288 return ret; 289 } 290 291 static int css_evaluate_new_subchannel(struct subchannel_id schid, int slow) 292 { 293 struct schib schib; 294 295 if (!slow) { 296 /* Will be done on the slow path. */ 297 return -EAGAIN; 298 } 299 if (stsch_err(schid, &schib) || !schib.pmcw.dnv) { 300 /* Unusable - ignore. */ 301 return 0; 302 } 303 CIO_MSG_EVENT(4, "Evaluating schid 0.%x.%04x, event %d, unknown, " 304 "slow path.\n", schid.ssid, schid.sch_no, CIO_OPER); 305 306 return css_probe_device(schid); 307 } 308 309 static int css_evaluate_subchannel(struct subchannel_id schid, int slow) 310 { 311 struct subchannel *sch; 312 int ret; 313 314 sch = get_subchannel_by_schid(schid); 315 if (sch) { 316 ret = css_evaluate_known_subchannel(sch, slow); 317 put_device(&sch->dev); 318 } else 319 ret = css_evaluate_new_subchannel(schid, slow); 320 321 return ret; 322 } 323 324 static int 325 css_rescan_devices(struct subchannel_id schid, void *data) 326 { 327 return css_evaluate_subchannel(schid, 1); 328 } 329 330 struct slow_subchannel { 331 struct list_head slow_list; 332 struct subchannel_id schid; 333 }; 334 335 static LIST_HEAD(slow_subchannels_head); 336 static DEFINE_SPINLOCK(slow_subchannel_lock); 337 338 static void 339 css_trigger_slow_path(struct work_struct *unused) 340 { 341 CIO_TRACE_EVENT(4, "slowpath"); 342 343 if (need_rescan) { 344 need_rescan = 0; 345 for_each_subchannel(css_rescan_devices, NULL); 346 return; 347 } 348 349 spin_lock_irq(&slow_subchannel_lock); 350 while (!list_empty(&slow_subchannels_head)) { 351 struct slow_subchannel *slow_sch = 352 list_entry(slow_subchannels_head.next, 353 struct slow_subchannel, slow_list); 354 355 list_del_init(slow_subchannels_head.next); 356 spin_unlock_irq(&slow_subchannel_lock); 357 css_evaluate_subchannel(slow_sch->schid, 1); 358 spin_lock_irq(&slow_subchannel_lock); 359 kfree(slow_sch); 360 } 361 spin_unlock_irq(&slow_subchannel_lock); 362 } 363 364 DECLARE_WORK(slow_path_work, css_trigger_slow_path); 365 struct workqueue_struct *slow_path_wq; 366 367 /* Reprobe subchannel if unregistered. */ 368 static int reprobe_subchannel(struct subchannel_id schid, void *data) 369 { 370 struct subchannel *sch; 371 int ret; 372 373 CIO_DEBUG(KERN_INFO, 6, "cio: reprobe 0.%x.%04x\n", 374 schid.ssid, schid.sch_no); 375 if (need_reprobe) 376 return -EAGAIN; 377 378 sch = get_subchannel_by_schid(schid); 379 if (sch) { 380 /* Already known. */ 381 put_device(&sch->dev); 382 return 0; 383 } 384 385 ret = css_probe_device(schid); 386 switch (ret) { 387 case 0: 388 break; 389 case -ENXIO: 390 case -ENOMEM: 391 /* These should abort looping */ 392 break; 393 default: 394 ret = 0; 395 } 396 397 return ret; 398 } 399 400 /* Work function used to reprobe all unregistered subchannels. */ 401 static void reprobe_all(struct work_struct *unused) 402 { 403 int ret; 404 405 CIO_MSG_EVENT(2, "reprobe start\n"); 406 407 need_reprobe = 0; 408 /* Make sure initial subchannel scan is done. */ 409 wait_event(ccw_device_init_wq, 410 atomic_read(&ccw_device_init_count) == 0); 411 ret = for_each_subchannel(reprobe_subchannel, NULL); 412 413 CIO_MSG_EVENT(2, "reprobe done (rc=%d, need_reprobe=%d)\n", ret, 414 need_reprobe); 415 } 416 417 static DECLARE_WORK(css_reprobe_work, reprobe_all); 418 419 /* Schedule reprobing of all unregistered subchannels. */ 420 void css_schedule_reprobe(void) 421 { 422 need_reprobe = 1; 423 queue_work(ccw_device_work, &css_reprobe_work); 424 } 425 426 EXPORT_SYMBOL_GPL(css_schedule_reprobe); 427 428 /* 429 * Rescan for new devices. FIXME: This is slow. 430 * This function is called when we have lost CRWs due to overflows and we have 431 * to do subchannel housekeeping. 432 */ 433 void 434 css_reiterate_subchannels(void) 435 { 436 css_clear_subchannel_slow_list(); 437 need_rescan = 1; 438 } 439 440 /* 441 * Called from the machine check handler for subchannel report words. 442 */ 443 int 444 css_process_crw(int rsid1, int rsid2) 445 { 446 int ret; 447 struct subchannel_id mchk_schid; 448 449 CIO_CRW_EVENT(2, "source is subchannel %04X, subsystem id %x\n", 450 rsid1, rsid2); 451 452 if (need_rescan) 453 /* We need to iterate all subchannels anyway. */ 454 return -EAGAIN; 455 456 init_subchannel_id(&mchk_schid); 457 mchk_schid.sch_no = rsid1; 458 if (rsid2 != 0) 459 mchk_schid.ssid = (rsid2 >> 8) & 3; 460 461 /* 462 * Since we are always presented with IPI in the CRW, we have to 463 * use stsch() to find out if the subchannel in question has come 464 * or gone. 465 */ 466 ret = css_evaluate_subchannel(mchk_schid, 0); 467 if (ret == -EAGAIN) { 468 if (css_enqueue_subchannel_slow(mchk_schid)) { 469 css_clear_subchannel_slow_list(); 470 need_rescan = 1; 471 } 472 } 473 return ret; 474 } 475 476 static int __init 477 __init_channel_subsystem(struct subchannel_id schid, void *data) 478 { 479 struct subchannel *sch; 480 int ret; 481 482 if (cio_is_console(schid)) 483 sch = cio_get_console_subchannel(); 484 else { 485 sch = css_alloc_subchannel(schid); 486 if (IS_ERR(sch)) 487 ret = PTR_ERR(sch); 488 else 489 ret = 0; 490 switch (ret) { 491 case 0: 492 break; 493 case -ENOMEM: 494 panic("Out of memory in init_channel_subsystem\n"); 495 /* -ENXIO: no more subchannels. */ 496 case -ENXIO: 497 return ret; 498 /* -EIO: this subchannel set not supported. */ 499 case -EIO: 500 return ret; 501 default: 502 return 0; 503 } 504 } 505 /* 506 * We register ALL valid subchannels in ioinfo, even those 507 * that have been present before init_channel_subsystem. 508 * These subchannels can't have been registered yet (kmalloc 509 * not working) so we do it now. This is true e.g. for the 510 * console subchannel. 511 */ 512 css_register_subchannel(sch); 513 return 0; 514 } 515 516 static void __init 517 css_generate_pgid(struct channel_subsystem *css, u32 tod_high) 518 { 519 if (css_characteristics_avail && css_general_characteristics.mcss) { 520 css->global_pgid.pgid_high.ext_cssid.version = 0x80; 521 css->global_pgid.pgid_high.ext_cssid.cssid = css->cssid; 522 } else { 523 #ifdef CONFIG_SMP 524 css->global_pgid.pgid_high.cpu_addr = hard_smp_processor_id(); 525 #else 526 css->global_pgid.pgid_high.cpu_addr = 0; 527 #endif 528 } 529 css->global_pgid.cpu_id = ((cpuid_t *) __LC_CPUID)->ident; 530 css->global_pgid.cpu_model = ((cpuid_t *) __LC_CPUID)->machine; 531 css->global_pgid.tod_high = tod_high; 532 533 } 534 535 static void 536 channel_subsystem_release(struct device *dev) 537 { 538 struct channel_subsystem *css; 539 540 css = to_css(dev); 541 mutex_destroy(&css->mutex); 542 kfree(css); 543 } 544 545 static ssize_t 546 css_cm_enable_show(struct device *dev, struct device_attribute *attr, 547 char *buf) 548 { 549 struct channel_subsystem *css = to_css(dev); 550 551 if (!css) 552 return 0; 553 return sprintf(buf, "%x\n", css->cm_enabled); 554 } 555 556 static ssize_t 557 css_cm_enable_store(struct device *dev, struct device_attribute *attr, 558 const char *buf, size_t count) 559 { 560 struct channel_subsystem *css = to_css(dev); 561 int ret; 562 563 switch (buf[0]) { 564 case '0': 565 ret = css->cm_enabled ? chsc_secm(css, 0) : 0; 566 break; 567 case '1': 568 ret = css->cm_enabled ? 0 : chsc_secm(css, 1); 569 break; 570 default: 571 ret = -EINVAL; 572 } 573 return ret < 0 ? ret : count; 574 } 575 576 static DEVICE_ATTR(cm_enable, 0644, css_cm_enable_show, css_cm_enable_store); 577 578 static int __init setup_css(int nr) 579 { 580 u32 tod_high; 581 int ret; 582 583 memset(css[nr], 0, sizeof(struct channel_subsystem)); 584 css[nr]->pseudo_subchannel = 585 kzalloc(sizeof(*css[nr]->pseudo_subchannel), GFP_KERNEL); 586 if (!css[nr]->pseudo_subchannel) 587 return -ENOMEM; 588 css[nr]->pseudo_subchannel->dev.parent = &css[nr]->device; 589 css[nr]->pseudo_subchannel->dev.release = css_subchannel_release; 590 sprintf(css[nr]->pseudo_subchannel->dev.bus_id, "defunct"); 591 ret = cio_create_sch_lock(css[nr]->pseudo_subchannel); 592 if (ret) { 593 kfree(css[nr]->pseudo_subchannel); 594 return ret; 595 } 596 mutex_init(&css[nr]->mutex); 597 css[nr]->valid = 1; 598 css[nr]->cssid = nr; 599 sprintf(css[nr]->device.bus_id, "css%x", nr); 600 css[nr]->device.release = channel_subsystem_release; 601 tod_high = (u32) (get_clock() >> 32); 602 css_generate_pgid(css[nr], tod_high); 603 return 0; 604 } 605 606 /* 607 * Now that the driver core is running, we can setup our channel subsystem. 608 * The struct subchannel's are created during probing (except for the 609 * static console subchannel). 610 */ 611 static int __init 612 init_channel_subsystem (void) 613 { 614 int ret, i; 615 616 if (chsc_determine_css_characteristics() == 0) 617 css_characteristics_avail = 1; 618 619 if ((ret = bus_register(&css_bus_type))) 620 goto out; 621 622 /* Try to enable MSS. */ 623 ret = chsc_enable_facility(CHSC_SDA_OC_MSS); 624 switch (ret) { 625 case 0: /* Success. */ 626 max_ssid = __MAX_SSID; 627 break; 628 case -ENOMEM: 629 goto out_bus; 630 default: 631 max_ssid = 0; 632 } 633 /* Setup css structure. */ 634 for (i = 0; i <= __MAX_CSSID; i++) { 635 css[i] = kmalloc(sizeof(struct channel_subsystem), GFP_KERNEL); 636 if (!css[i]) { 637 ret = -ENOMEM; 638 goto out_unregister; 639 } 640 ret = setup_css(i); 641 if (ret) 642 goto out_free; 643 ret = device_register(&css[i]->device); 644 if (ret) 645 goto out_free_all; 646 if (css_characteristics_avail && 647 css_chsc_characteristics.secm) { 648 ret = device_create_file(&css[i]->device, 649 &dev_attr_cm_enable); 650 if (ret) 651 goto out_device; 652 } 653 ret = device_register(&css[i]->pseudo_subchannel->dev); 654 if (ret) 655 goto out_file; 656 } 657 css_init_done = 1; 658 659 ctl_set_bit(6, 28); 660 661 for_each_subchannel(__init_channel_subsystem, NULL); 662 return 0; 663 out_file: 664 device_remove_file(&css[i]->device, &dev_attr_cm_enable); 665 out_device: 666 device_unregister(&css[i]->device); 667 out_free_all: 668 kfree(css[i]->pseudo_subchannel->lock); 669 kfree(css[i]->pseudo_subchannel); 670 out_free: 671 kfree(css[i]); 672 out_unregister: 673 while (i > 0) { 674 i--; 675 device_unregister(&css[i]->pseudo_subchannel->dev); 676 if (css_characteristics_avail && css_chsc_characteristics.secm) 677 device_remove_file(&css[i]->device, 678 &dev_attr_cm_enable); 679 device_unregister(&css[i]->device); 680 } 681 out_bus: 682 bus_unregister(&css_bus_type); 683 out: 684 return ret; 685 } 686 687 int sch_is_pseudo_sch(struct subchannel *sch) 688 { 689 return sch == to_css(sch->dev.parent)->pseudo_subchannel; 690 } 691 692 /* 693 * find a driver for a subchannel. They identify by the subchannel 694 * type with the exception that the console subchannel driver has its own 695 * subchannel type although the device is an i/o subchannel 696 */ 697 static int 698 css_bus_match (struct device *dev, struct device_driver *drv) 699 { 700 struct subchannel *sch = container_of (dev, struct subchannel, dev); 701 struct css_driver *driver = container_of (drv, struct css_driver, drv); 702 703 if (sch->st == driver->subchannel_type) 704 return 1; 705 706 return 0; 707 } 708 709 static int 710 css_probe (struct device *dev) 711 { 712 struct subchannel *sch; 713 714 sch = to_subchannel(dev); 715 sch->driver = container_of (dev->driver, struct css_driver, drv); 716 return (sch->driver->probe ? sch->driver->probe(sch) : 0); 717 } 718 719 static int 720 css_remove (struct device *dev) 721 { 722 struct subchannel *sch; 723 724 sch = to_subchannel(dev); 725 return (sch->driver->remove ? sch->driver->remove(sch) : 0); 726 } 727 728 static void 729 css_shutdown (struct device *dev) 730 { 731 struct subchannel *sch; 732 733 sch = to_subchannel(dev); 734 if (sch->driver->shutdown) 735 sch->driver->shutdown(sch); 736 } 737 738 struct bus_type css_bus_type = { 739 .name = "css", 740 .match = css_bus_match, 741 .probe = css_probe, 742 .remove = css_remove, 743 .shutdown = css_shutdown, 744 }; 745 746 subsys_initcall(init_channel_subsystem); 747 748 int 749 css_enqueue_subchannel_slow(struct subchannel_id schid) 750 { 751 struct slow_subchannel *new_slow_sch; 752 unsigned long flags; 753 754 new_slow_sch = kzalloc(sizeof(struct slow_subchannel), GFP_ATOMIC); 755 if (!new_slow_sch) 756 return -ENOMEM; 757 new_slow_sch->schid = schid; 758 spin_lock_irqsave(&slow_subchannel_lock, flags); 759 list_add_tail(&new_slow_sch->slow_list, &slow_subchannels_head); 760 spin_unlock_irqrestore(&slow_subchannel_lock, flags); 761 return 0; 762 } 763 764 void 765 css_clear_subchannel_slow_list(void) 766 { 767 unsigned long flags; 768 769 spin_lock_irqsave(&slow_subchannel_lock, flags); 770 while (!list_empty(&slow_subchannels_head)) { 771 struct slow_subchannel *slow_sch = 772 list_entry(slow_subchannels_head.next, 773 struct slow_subchannel, slow_list); 774 775 list_del_init(slow_subchannels_head.next); 776 kfree(slow_sch); 777 } 778 spin_unlock_irqrestore(&slow_subchannel_lock, flags); 779 } 780 781 782 783 int 784 css_slow_subchannels_exist(void) 785 { 786 return (!list_empty(&slow_subchannels_head)); 787 } 788 789 MODULE_LICENSE("GPL"); 790 EXPORT_SYMBOL(css_bus_type); 791 EXPORT_SYMBOL_GPL(css_characteristics_avail); 792