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 23 int need_rescan = 0; 24 int css_init_done = 0; 25 static int max_ssid = 0; 26 27 struct channel_subsystem *css[__MAX_CSSID + 1]; 28 29 int css_characteristics_avail = 0; 30 31 inline int 32 for_each_subchannel(int(*fn)(struct subchannel_id, void *), void *data) 33 { 34 struct subchannel_id schid; 35 int ret; 36 37 init_subchannel_id(&schid); 38 ret = -ENODEV; 39 do { 40 do { 41 ret = fn(schid, data); 42 if (ret) 43 break; 44 } while (schid.sch_no++ < __MAX_SUBCHANNEL); 45 schid.sch_no = 0; 46 } while (schid.ssid++ < max_ssid); 47 return ret; 48 } 49 50 static struct subchannel * 51 css_alloc_subchannel(struct subchannel_id schid) 52 { 53 struct subchannel *sch; 54 int ret; 55 56 sch = kmalloc (sizeof (*sch), GFP_KERNEL | GFP_DMA); 57 if (sch == NULL) 58 return ERR_PTR(-ENOMEM); 59 ret = cio_validate_subchannel (sch, schid); 60 if (ret < 0) { 61 kfree(sch); 62 return ERR_PTR(ret); 63 } 64 65 if (sch->st != SUBCHANNEL_TYPE_IO) { 66 /* For now we ignore all non-io subchannels. */ 67 kfree(sch); 68 return ERR_PTR(-EINVAL); 69 } 70 71 /* 72 * Set intparm to subchannel address. 73 * This is fine even on 64bit since the subchannel is always located 74 * under 2G. 75 */ 76 sch->schib.pmcw.intparm = (__u32)(unsigned long)sch; 77 ret = cio_modify(sch); 78 if (ret) { 79 kfree(sch); 80 return ERR_PTR(ret); 81 } 82 return sch; 83 } 84 85 static void 86 css_free_subchannel(struct subchannel *sch) 87 { 88 if (sch) { 89 /* Reset intparm to zeroes. */ 90 sch->schib.pmcw.intparm = 0; 91 cio_modify(sch); 92 kfree(sch); 93 } 94 95 } 96 97 static void 98 css_subchannel_release(struct device *dev) 99 { 100 struct subchannel *sch; 101 102 sch = to_subchannel(dev); 103 if (!cio_is_console(sch->schid)) 104 kfree(sch); 105 } 106 107 extern int css_get_ssd_info(struct subchannel *sch); 108 109 static int 110 css_register_subchannel(struct subchannel *sch) 111 { 112 int ret; 113 114 /* Initialize the subchannel structure */ 115 sch->dev.parent = &css[0]->device; 116 sch->dev.bus = &css_bus_type; 117 sch->dev.release = &css_subchannel_release; 118 119 /* make it known to the system */ 120 ret = device_register(&sch->dev); 121 if (ret) 122 printk (KERN_WARNING "%s: could not register %s\n", 123 __func__, sch->dev.bus_id); 124 else 125 css_get_ssd_info(sch); 126 return ret; 127 } 128 129 int 130 css_probe_device(struct subchannel_id schid) 131 { 132 int ret; 133 struct subchannel *sch; 134 135 sch = css_alloc_subchannel(schid); 136 if (IS_ERR(sch)) 137 return PTR_ERR(sch); 138 ret = css_register_subchannel(sch); 139 if (ret) 140 css_free_subchannel(sch); 141 return ret; 142 } 143 144 static int 145 check_subchannel(struct device * dev, void * data) 146 { 147 struct subchannel *sch; 148 struct subchannel_id *schid = data; 149 150 sch = to_subchannel(dev); 151 return schid_equal(&sch->schid, schid); 152 } 153 154 struct subchannel * 155 get_subchannel_by_schid(struct subchannel_id schid) 156 { 157 struct device *dev; 158 159 dev = bus_find_device(&css_bus_type, NULL, 160 (void *)&schid, check_subchannel); 161 162 return dev ? to_subchannel(dev) : NULL; 163 } 164 165 166 static inline int 167 css_get_subchannel_status(struct subchannel *sch, struct subchannel_id schid) 168 { 169 struct schib schib; 170 int cc; 171 172 cc = stsch(schid, &schib); 173 if (cc) 174 return CIO_GONE; 175 if (!schib.pmcw.dnv) 176 return CIO_GONE; 177 if (sch && sch->schib.pmcw.dnv && 178 (schib.pmcw.dev != sch->schib.pmcw.dev)) 179 return CIO_REVALIDATE; 180 if (sch && !sch->lpm) 181 return CIO_NO_PATH; 182 return CIO_OPER; 183 } 184 185 static int 186 css_evaluate_subchannel(struct subchannel_id schid, int slow) 187 { 188 int event, ret, disc; 189 struct subchannel *sch; 190 unsigned long flags; 191 192 sch = get_subchannel_by_schid(schid); 193 disc = sch ? device_is_disconnected(sch) : 0; 194 if (disc && slow) { 195 if (sch) 196 put_device(&sch->dev); 197 return 0; /* Already processed. */ 198 } 199 /* 200 * We've got a machine check, so running I/O won't get an interrupt. 201 * Kill any pending timers. 202 */ 203 if (sch) 204 device_kill_pending_timer(sch); 205 if (!disc && !slow) { 206 if (sch) 207 put_device(&sch->dev); 208 return -EAGAIN; /* Will be done on the slow path. */ 209 } 210 event = css_get_subchannel_status(sch, schid); 211 CIO_MSG_EVENT(4, "Evaluating schid 0.%x.%04x, event %d, %s, %s path.\n", 212 schid.ssid, schid.sch_no, event, 213 sch?(disc?"disconnected":"normal"):"unknown", 214 slow?"slow":"fast"); 215 switch (event) { 216 case CIO_NO_PATH: 217 case CIO_GONE: 218 if (!sch) { 219 /* Never used this subchannel. Ignore. */ 220 ret = 0; 221 break; 222 } 223 if (disc && (event == CIO_NO_PATH)) { 224 /* 225 * Uargh, hack again. Because we don't get a machine 226 * check on configure on, our path bookkeeping can 227 * be out of date here (it's fine while we only do 228 * logical varying or get chsc machine checks). We 229 * need to force reprobing or we might miss devices 230 * coming operational again. It won't do harm in real 231 * no path situations. 232 */ 233 spin_lock_irqsave(&sch->lock, flags); 234 device_trigger_reprobe(sch); 235 spin_unlock_irqrestore(&sch->lock, flags); 236 ret = 0; 237 break; 238 } 239 if (sch->driver && sch->driver->notify && 240 sch->driver->notify(&sch->dev, event)) { 241 cio_disable_subchannel(sch); 242 device_set_disconnected(sch); 243 ret = 0; 244 break; 245 } 246 /* 247 * Unregister subchannel. 248 * The device will be killed automatically. 249 */ 250 cio_disable_subchannel(sch); 251 device_unregister(&sch->dev); 252 /* Reset intparm to zeroes. */ 253 sch->schib.pmcw.intparm = 0; 254 cio_modify(sch); 255 put_device(&sch->dev); 256 ret = 0; 257 break; 258 case CIO_REVALIDATE: 259 /* 260 * Revalidation machine check. Sick. 261 * We don't notify the driver since we have to throw the device 262 * away in any case. 263 */ 264 if (!disc) { 265 device_unregister(&sch->dev); 266 /* Reset intparm to zeroes. */ 267 sch->schib.pmcw.intparm = 0; 268 cio_modify(sch); 269 put_device(&sch->dev); 270 ret = css_probe_device(schid); 271 } else { 272 /* 273 * We can't immediately deregister the disconnected 274 * device since it might block. 275 */ 276 spin_lock_irqsave(&sch->lock, flags); 277 device_trigger_reprobe(sch); 278 spin_unlock_irqrestore(&sch->lock, flags); 279 ret = 0; 280 } 281 break; 282 case CIO_OPER: 283 if (disc) { 284 spin_lock_irqsave(&sch->lock, flags); 285 /* Get device operational again. */ 286 device_trigger_reprobe(sch); 287 spin_unlock_irqrestore(&sch->lock, flags); 288 } 289 ret = sch ? 0 : css_probe_device(schid); 290 break; 291 default: 292 BUG(); 293 ret = 0; 294 } 295 return ret; 296 } 297 298 static int 299 css_rescan_devices(struct subchannel_id schid, void *data) 300 { 301 return css_evaluate_subchannel(schid, 1); 302 } 303 304 struct slow_subchannel { 305 struct list_head slow_list; 306 struct subchannel_id schid; 307 }; 308 309 static LIST_HEAD(slow_subchannels_head); 310 static DEFINE_SPINLOCK(slow_subchannel_lock); 311 312 static void 313 css_trigger_slow_path(void) 314 { 315 CIO_TRACE_EVENT(4, "slowpath"); 316 317 if (need_rescan) { 318 need_rescan = 0; 319 for_each_subchannel(css_rescan_devices, NULL); 320 return; 321 } 322 323 spin_lock_irq(&slow_subchannel_lock); 324 while (!list_empty(&slow_subchannels_head)) { 325 struct slow_subchannel *slow_sch = 326 list_entry(slow_subchannels_head.next, 327 struct slow_subchannel, slow_list); 328 329 list_del_init(slow_subchannels_head.next); 330 spin_unlock_irq(&slow_subchannel_lock); 331 css_evaluate_subchannel(slow_sch->schid, 1); 332 spin_lock_irq(&slow_subchannel_lock); 333 kfree(slow_sch); 334 } 335 spin_unlock_irq(&slow_subchannel_lock); 336 } 337 338 typedef void (*workfunc)(void *); 339 DECLARE_WORK(slow_path_work, (workfunc)css_trigger_slow_path, NULL); 340 struct workqueue_struct *slow_path_wq; 341 342 /* 343 * Rescan for new devices. FIXME: This is slow. 344 * This function is called when we have lost CRWs due to overflows and we have 345 * to do subchannel housekeeping. 346 */ 347 void 348 css_reiterate_subchannels(void) 349 { 350 css_clear_subchannel_slow_list(); 351 need_rescan = 1; 352 } 353 354 /* 355 * Called from the machine check handler for subchannel report words. 356 */ 357 int 358 css_process_crw(int rsid1, int rsid2) 359 { 360 int ret; 361 struct subchannel_id mchk_schid; 362 363 CIO_CRW_EVENT(2, "source is subchannel %04X, subsystem id %x\n", 364 rsid1, rsid2); 365 366 if (need_rescan) 367 /* We need to iterate all subchannels anyway. */ 368 return -EAGAIN; 369 370 init_subchannel_id(&mchk_schid); 371 mchk_schid.sch_no = rsid1; 372 if (rsid2 != 0) 373 mchk_schid.ssid = (rsid2 >> 8) & 3; 374 375 /* 376 * Since we are always presented with IPI in the CRW, we have to 377 * use stsch() to find out if the subchannel in question has come 378 * or gone. 379 */ 380 ret = css_evaluate_subchannel(mchk_schid, 0); 381 if (ret == -EAGAIN) { 382 if (css_enqueue_subchannel_slow(mchk_schid)) { 383 css_clear_subchannel_slow_list(); 384 need_rescan = 1; 385 } 386 } 387 return ret; 388 } 389 390 static int __init 391 __init_channel_subsystem(struct subchannel_id schid, void *data) 392 { 393 struct subchannel *sch; 394 int ret; 395 396 if (cio_is_console(schid)) 397 sch = cio_get_console_subchannel(); 398 else { 399 sch = css_alloc_subchannel(schid); 400 if (IS_ERR(sch)) 401 ret = PTR_ERR(sch); 402 else 403 ret = 0; 404 switch (ret) { 405 case 0: 406 break; 407 case -ENOMEM: 408 panic("Out of memory in init_channel_subsystem\n"); 409 /* -ENXIO: no more subchannels. */ 410 case -ENXIO: 411 return ret; 412 /* -EIO: this subchannel set not supported. */ 413 case -EIO: 414 return ret; 415 default: 416 return 0; 417 } 418 } 419 /* 420 * We register ALL valid subchannels in ioinfo, even those 421 * that have been present before init_channel_subsystem. 422 * These subchannels can't have been registered yet (kmalloc 423 * not working) so we do it now. This is true e.g. for the 424 * console subchannel. 425 */ 426 css_register_subchannel(sch); 427 return 0; 428 } 429 430 static void __init 431 css_generate_pgid(struct channel_subsystem *css, u32 tod_high) 432 { 433 if (css_characteristics_avail && css_general_characteristics.mcss) { 434 css->global_pgid.pgid_high.ext_cssid.version = 0x80; 435 css->global_pgid.pgid_high.ext_cssid.cssid = css->cssid; 436 } else { 437 #ifdef CONFIG_SMP 438 css->global_pgid.pgid_high.cpu_addr = hard_smp_processor_id(); 439 #else 440 css->global_pgid.pgid_high.cpu_addr = 0; 441 #endif 442 } 443 css->global_pgid.cpu_id = ((cpuid_t *) __LC_CPUID)->ident; 444 css->global_pgid.cpu_model = ((cpuid_t *) __LC_CPUID)->machine; 445 css->global_pgid.tod_high = tod_high; 446 447 } 448 449 static void 450 channel_subsystem_release(struct device *dev) 451 { 452 struct channel_subsystem *css; 453 454 css = to_css(dev); 455 mutex_destroy(&css->mutex); 456 kfree(css); 457 } 458 459 static ssize_t 460 css_cm_enable_show(struct device *dev, struct device_attribute *attr, 461 char *buf) 462 { 463 struct channel_subsystem *css = to_css(dev); 464 465 if (!css) 466 return 0; 467 return sprintf(buf, "%x\n", css->cm_enabled); 468 } 469 470 static ssize_t 471 css_cm_enable_store(struct device *dev, struct device_attribute *attr, 472 const char *buf, size_t count) 473 { 474 struct channel_subsystem *css = to_css(dev); 475 int ret; 476 477 switch (buf[0]) { 478 case '0': 479 ret = css->cm_enabled ? chsc_secm(css, 0) : 0; 480 break; 481 case '1': 482 ret = css->cm_enabled ? 0 : chsc_secm(css, 1); 483 break; 484 default: 485 ret = -EINVAL; 486 } 487 return ret < 0 ? ret : count; 488 } 489 490 static DEVICE_ATTR(cm_enable, 0644, css_cm_enable_show, css_cm_enable_store); 491 492 static inline void __init 493 setup_css(int nr) 494 { 495 u32 tod_high; 496 497 memset(css[nr], 0, sizeof(struct channel_subsystem)); 498 mutex_init(&css[nr]->mutex); 499 css[nr]->valid = 1; 500 css[nr]->cssid = nr; 501 sprintf(css[nr]->device.bus_id, "css%x", nr); 502 css[nr]->device.release = channel_subsystem_release; 503 tod_high = (u32) (get_clock() >> 32); 504 css_generate_pgid(css[nr], tod_high); 505 } 506 507 /* 508 * Now that the driver core is running, we can setup our channel subsystem. 509 * The struct subchannel's are created during probing (except for the 510 * static console subchannel). 511 */ 512 static int __init 513 init_channel_subsystem (void) 514 { 515 int ret, i; 516 517 if (chsc_determine_css_characteristics() == 0) 518 css_characteristics_avail = 1; 519 520 if ((ret = bus_register(&css_bus_type))) 521 goto out; 522 523 /* Try to enable MSS. */ 524 ret = chsc_enable_facility(CHSC_SDA_OC_MSS); 525 switch (ret) { 526 case 0: /* Success. */ 527 max_ssid = __MAX_SSID; 528 break; 529 case -ENOMEM: 530 goto out_bus; 531 default: 532 max_ssid = 0; 533 } 534 /* Setup css structure. */ 535 for (i = 0; i <= __MAX_CSSID; i++) { 536 css[i] = kmalloc(sizeof(struct channel_subsystem), GFP_KERNEL); 537 if (!css[i]) { 538 ret = -ENOMEM; 539 goto out_unregister; 540 } 541 setup_css(i); 542 ret = device_register(&css[i]->device); 543 if (ret) 544 goto out_free; 545 if (css_characteristics_avail && css_chsc_characteristics.secm) 546 device_create_file(&css[i]->device, 547 &dev_attr_cm_enable); 548 } 549 css_init_done = 1; 550 551 ctl_set_bit(6, 28); 552 553 for_each_subchannel(__init_channel_subsystem, NULL); 554 return 0; 555 out_free: 556 kfree(css[i]); 557 out_unregister: 558 while (i > 0) { 559 i--; 560 if (css_characteristics_avail && css_chsc_characteristics.secm) 561 device_remove_file(&css[i]->device, 562 &dev_attr_cm_enable); 563 device_unregister(&css[i]->device); 564 } 565 out_bus: 566 bus_unregister(&css_bus_type); 567 out: 568 return ret; 569 } 570 571 /* 572 * find a driver for a subchannel. They identify by the subchannel 573 * type with the exception that the console subchannel driver has its own 574 * subchannel type although the device is an i/o subchannel 575 */ 576 static int 577 css_bus_match (struct device *dev, struct device_driver *drv) 578 { 579 struct subchannel *sch = container_of (dev, struct subchannel, dev); 580 struct css_driver *driver = container_of (drv, struct css_driver, drv); 581 582 if (sch->st == driver->subchannel_type) 583 return 1; 584 585 return 0; 586 } 587 588 static int 589 css_probe (struct device *dev) 590 { 591 struct subchannel *sch; 592 593 sch = to_subchannel(dev); 594 sch->driver = container_of (dev->driver, struct css_driver, drv); 595 return (sch->driver->probe ? sch->driver->probe(sch) : 0); 596 } 597 598 static int 599 css_remove (struct device *dev) 600 { 601 struct subchannel *sch; 602 603 sch = to_subchannel(dev); 604 return (sch->driver->remove ? sch->driver->remove(sch) : 0); 605 } 606 607 static void 608 css_shutdown (struct device *dev) 609 { 610 struct subchannel *sch; 611 612 sch = to_subchannel(dev); 613 if (sch->driver->shutdown) 614 sch->driver->shutdown(sch); 615 } 616 617 struct bus_type css_bus_type = { 618 .name = "css", 619 .match = css_bus_match, 620 .probe = css_probe, 621 .remove = css_remove, 622 .shutdown = css_shutdown, 623 }; 624 625 subsys_initcall(init_channel_subsystem); 626 627 int 628 css_enqueue_subchannel_slow(struct subchannel_id schid) 629 { 630 struct slow_subchannel *new_slow_sch; 631 unsigned long flags; 632 633 new_slow_sch = kzalloc(sizeof(struct slow_subchannel), GFP_ATOMIC); 634 if (!new_slow_sch) 635 return -ENOMEM; 636 new_slow_sch->schid = schid; 637 spin_lock_irqsave(&slow_subchannel_lock, flags); 638 list_add_tail(&new_slow_sch->slow_list, &slow_subchannels_head); 639 spin_unlock_irqrestore(&slow_subchannel_lock, flags); 640 return 0; 641 } 642 643 void 644 css_clear_subchannel_slow_list(void) 645 { 646 unsigned long flags; 647 648 spin_lock_irqsave(&slow_subchannel_lock, flags); 649 while (!list_empty(&slow_subchannels_head)) { 650 struct slow_subchannel *slow_sch = 651 list_entry(slow_subchannels_head.next, 652 struct slow_subchannel, slow_list); 653 654 list_del_init(slow_subchannels_head.next); 655 kfree(slow_sch); 656 } 657 spin_unlock_irqrestore(&slow_subchannel_lock, flags); 658 } 659 660 661 662 int 663 css_slow_subchannels_exist(void) 664 { 665 return (!list_empty(&slow_subchannels_head)); 666 } 667 668 MODULE_LICENSE("GPL"); 669 EXPORT_SYMBOL(css_bus_type); 670 EXPORT_SYMBOL_GPL(css_characteristics_avail); 671