1 /* 2 * System Trace Module (STM) infrastructure 3 * Copyright (c) 2014, Intel Corporation. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms and conditions of the GNU General Public License, 7 * version 2, as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 * STM class implements generic infrastructure for System Trace Module devices 15 * as defined in MIPI STPv2 specification. 16 */ 17 18 #include <linux/pm_runtime.h> 19 #include <linux/uaccess.h> 20 #include <linux/kernel.h> 21 #include <linux/module.h> 22 #include <linux/device.h> 23 #include <linux/compat.h> 24 #include <linux/kdev_t.h> 25 #include <linux/srcu.h> 26 #include <linux/slab.h> 27 #include <linux/stm.h> 28 #include <linux/fs.h> 29 #include <linux/mm.h> 30 #include "stm.h" 31 32 #include <uapi/linux/stm.h> 33 34 static unsigned int stm_core_up; 35 36 /* 37 * The SRCU here makes sure that STM device doesn't disappear from under a 38 * stm_source_write() caller, which may want to have as little overhead as 39 * possible. 40 */ 41 static struct srcu_struct stm_source_srcu; 42 43 static ssize_t masters_show(struct device *dev, 44 struct device_attribute *attr, 45 char *buf) 46 { 47 struct stm_device *stm = to_stm_device(dev); 48 int ret; 49 50 ret = sprintf(buf, "%u %u\n", stm->data->sw_start, stm->data->sw_end); 51 52 return ret; 53 } 54 55 static DEVICE_ATTR_RO(masters); 56 57 static ssize_t channels_show(struct device *dev, 58 struct device_attribute *attr, 59 char *buf) 60 { 61 struct stm_device *stm = to_stm_device(dev); 62 int ret; 63 64 ret = sprintf(buf, "%u\n", stm->data->sw_nchannels); 65 66 return ret; 67 } 68 69 static DEVICE_ATTR_RO(channels); 70 71 static ssize_t hw_override_show(struct device *dev, 72 struct device_attribute *attr, 73 char *buf) 74 { 75 struct stm_device *stm = to_stm_device(dev); 76 int ret; 77 78 ret = sprintf(buf, "%u\n", stm->data->hw_override); 79 80 return ret; 81 } 82 83 static DEVICE_ATTR_RO(hw_override); 84 85 static struct attribute *stm_attrs[] = { 86 &dev_attr_masters.attr, 87 &dev_attr_channels.attr, 88 &dev_attr_hw_override.attr, 89 NULL, 90 }; 91 92 ATTRIBUTE_GROUPS(stm); 93 94 static struct class stm_class = { 95 .name = "stm", 96 .dev_groups = stm_groups, 97 }; 98 99 static int stm_dev_match(struct device *dev, const void *data) 100 { 101 const char *name = data; 102 103 return sysfs_streq(name, dev_name(dev)); 104 } 105 106 /** 107 * stm_find_device() - find stm device by name 108 * @buf: character buffer containing the name 109 * 110 * This is called when either policy gets assigned to an stm device or an 111 * stm_source device gets linked to an stm device. 112 * 113 * This grabs device's reference (get_device()) and module reference, both 114 * of which the calling path needs to make sure to drop with stm_put_device(). 115 * 116 * Return: stm device pointer or null if lookup failed. 117 */ 118 struct stm_device *stm_find_device(const char *buf) 119 { 120 struct stm_device *stm; 121 struct device *dev; 122 123 if (!stm_core_up) 124 return NULL; 125 126 dev = class_find_device(&stm_class, NULL, buf, stm_dev_match); 127 if (!dev) 128 return NULL; 129 130 stm = to_stm_device(dev); 131 if (!try_module_get(stm->owner)) { 132 /* matches class_find_device() above */ 133 put_device(dev); 134 return NULL; 135 } 136 137 return stm; 138 } 139 140 /** 141 * stm_put_device() - drop references on the stm device 142 * @stm: stm device, previously acquired by stm_find_device() 143 * 144 * This drops the module reference and device reference taken by 145 * stm_find_device() or stm_char_open(). 146 */ 147 void stm_put_device(struct stm_device *stm) 148 { 149 module_put(stm->owner); 150 put_device(&stm->dev); 151 } 152 153 /* 154 * Internally we only care about software-writable masters here, that is the 155 * ones in the range [stm_data->sw_start..stm_data..sw_end], however we need 156 * original master numbers to be visible externally, since they are the ones 157 * that will appear in the STP stream. Thus, the internal bookkeeping uses 158 * $master - stm_data->sw_start to reference master descriptors and such. 159 */ 160 161 #define __stm_master(_s, _m) \ 162 ((_s)->masters[(_m) - (_s)->data->sw_start]) 163 164 static inline struct stp_master * 165 stm_master(struct stm_device *stm, unsigned int idx) 166 { 167 if (idx < stm->data->sw_start || idx > stm->data->sw_end) 168 return NULL; 169 170 return __stm_master(stm, idx); 171 } 172 173 static int stp_master_alloc(struct stm_device *stm, unsigned int idx) 174 { 175 struct stp_master *master; 176 size_t size; 177 178 size = ALIGN(stm->data->sw_nchannels, 8) / 8; 179 size += sizeof(struct stp_master); 180 master = kzalloc(size, GFP_ATOMIC); 181 if (!master) 182 return -ENOMEM; 183 184 master->nr_free = stm->data->sw_nchannels; 185 __stm_master(stm, idx) = master; 186 187 return 0; 188 } 189 190 static void stp_master_free(struct stm_device *stm, unsigned int idx) 191 { 192 struct stp_master *master = stm_master(stm, idx); 193 194 if (!master) 195 return; 196 197 __stm_master(stm, idx) = NULL; 198 kfree(master); 199 } 200 201 static void stm_output_claim(struct stm_device *stm, struct stm_output *output) 202 { 203 struct stp_master *master = stm_master(stm, output->master); 204 205 lockdep_assert_held(&stm->mc_lock); 206 lockdep_assert_held(&output->lock); 207 208 if (WARN_ON_ONCE(master->nr_free < output->nr_chans)) 209 return; 210 211 bitmap_allocate_region(&master->chan_map[0], output->channel, 212 ilog2(output->nr_chans)); 213 214 master->nr_free -= output->nr_chans; 215 } 216 217 static void 218 stm_output_disclaim(struct stm_device *stm, struct stm_output *output) 219 { 220 struct stp_master *master = stm_master(stm, output->master); 221 222 lockdep_assert_held(&stm->mc_lock); 223 lockdep_assert_held(&output->lock); 224 225 bitmap_release_region(&master->chan_map[0], output->channel, 226 ilog2(output->nr_chans)); 227 228 output->nr_chans = 0; 229 master->nr_free += output->nr_chans; 230 } 231 232 /* 233 * This is like bitmap_find_free_region(), except it can ignore @start bits 234 * at the beginning. 235 */ 236 static int find_free_channels(unsigned long *bitmap, unsigned int start, 237 unsigned int end, unsigned int width) 238 { 239 unsigned int pos; 240 int i; 241 242 for (pos = start; pos < end + 1; pos = ALIGN(pos, width)) { 243 pos = find_next_zero_bit(bitmap, end + 1, pos); 244 if (pos + width > end + 1) 245 break; 246 247 if (pos & (width - 1)) 248 continue; 249 250 for (i = 1; i < width && !test_bit(pos + i, bitmap); i++) 251 ; 252 if (i == width) 253 return pos; 254 } 255 256 return -1; 257 } 258 259 static int 260 stm_find_master_chan(struct stm_device *stm, unsigned int width, 261 unsigned int *mstart, unsigned int mend, 262 unsigned int *cstart, unsigned int cend) 263 { 264 struct stp_master *master; 265 unsigned int midx; 266 int pos, err; 267 268 for (midx = *mstart; midx <= mend; midx++) { 269 if (!stm_master(stm, midx)) { 270 err = stp_master_alloc(stm, midx); 271 if (err) 272 return err; 273 } 274 275 master = stm_master(stm, midx); 276 277 if (!master->nr_free) 278 continue; 279 280 pos = find_free_channels(master->chan_map, *cstart, cend, 281 width); 282 if (pos < 0) 283 continue; 284 285 *mstart = midx; 286 *cstart = pos; 287 return 0; 288 } 289 290 return -ENOSPC; 291 } 292 293 static int stm_output_assign(struct stm_device *stm, unsigned int width, 294 struct stp_policy_node *policy_node, 295 struct stm_output *output) 296 { 297 unsigned int midx, cidx, mend, cend; 298 int ret = -EINVAL; 299 300 if (width > stm->data->sw_nchannels) 301 return -EINVAL; 302 303 if (policy_node) { 304 stp_policy_node_get_ranges(policy_node, 305 &midx, &mend, &cidx, &cend); 306 } else { 307 midx = stm->data->sw_start; 308 cidx = 0; 309 mend = stm->data->sw_end; 310 cend = stm->data->sw_nchannels - 1; 311 } 312 313 spin_lock(&stm->mc_lock); 314 spin_lock(&output->lock); 315 /* output is already assigned -- shouldn't happen */ 316 if (WARN_ON_ONCE(output->nr_chans)) 317 goto unlock; 318 319 ret = stm_find_master_chan(stm, width, &midx, mend, &cidx, cend); 320 if (ret < 0) 321 goto unlock; 322 323 output->master = midx; 324 output->channel = cidx; 325 output->nr_chans = width; 326 stm_output_claim(stm, output); 327 dev_dbg(&stm->dev, "assigned %u:%u (+%u)\n", midx, cidx, width); 328 329 ret = 0; 330 unlock: 331 spin_unlock(&output->lock); 332 spin_unlock(&stm->mc_lock); 333 334 return ret; 335 } 336 337 static void stm_output_free(struct stm_device *stm, struct stm_output *output) 338 { 339 spin_lock(&stm->mc_lock); 340 spin_lock(&output->lock); 341 if (output->nr_chans) 342 stm_output_disclaim(stm, output); 343 spin_unlock(&output->lock); 344 spin_unlock(&stm->mc_lock); 345 } 346 347 static void stm_output_init(struct stm_output *output) 348 { 349 spin_lock_init(&output->lock); 350 } 351 352 static int major_match(struct device *dev, const void *data) 353 { 354 unsigned int major = *(unsigned int *)data; 355 356 return MAJOR(dev->devt) == major; 357 } 358 359 static int stm_char_open(struct inode *inode, struct file *file) 360 { 361 struct stm_file *stmf; 362 struct device *dev; 363 unsigned int major = imajor(inode); 364 int err = -ENODEV; 365 366 dev = class_find_device(&stm_class, NULL, &major, major_match); 367 if (!dev) 368 return -ENODEV; 369 370 stmf = kzalloc(sizeof(*stmf), GFP_KERNEL); 371 if (!stmf) 372 return -ENOMEM; 373 374 stm_output_init(&stmf->output); 375 stmf->stm = to_stm_device(dev); 376 377 if (!try_module_get(stmf->stm->owner)) 378 goto err_free; 379 380 file->private_data = stmf; 381 382 return nonseekable_open(inode, file); 383 384 err_free: 385 /* matches class_find_device() above */ 386 put_device(dev); 387 kfree(stmf); 388 389 return err; 390 } 391 392 static int stm_char_release(struct inode *inode, struct file *file) 393 { 394 struct stm_file *stmf = file->private_data; 395 struct stm_device *stm = stmf->stm; 396 397 if (stm->data->unlink) 398 stm->data->unlink(stm->data, stmf->output.master, 399 stmf->output.channel); 400 401 stm_output_free(stm, &stmf->output); 402 403 /* 404 * matches the stm_char_open()'s 405 * class_find_device() + try_module_get() 406 */ 407 stm_put_device(stm); 408 kfree(stmf); 409 410 return 0; 411 } 412 413 static int stm_file_assign(struct stm_file *stmf, char *id, unsigned int width) 414 { 415 struct stm_device *stm = stmf->stm; 416 int ret; 417 418 stmf->policy_node = stp_policy_node_lookup(stm, id); 419 420 ret = stm_output_assign(stm, width, stmf->policy_node, &stmf->output); 421 422 if (stmf->policy_node) 423 stp_policy_node_put(stmf->policy_node); 424 425 return ret; 426 } 427 428 static ssize_t stm_write(struct stm_data *data, unsigned int master, 429 unsigned int channel, const char *buf, size_t count) 430 { 431 unsigned int flags = STP_PACKET_TIMESTAMPED; 432 const unsigned char *p = buf, nil = 0; 433 size_t pos; 434 ssize_t sz; 435 436 for (pos = 0, p = buf; count > pos; pos += sz, p += sz) { 437 sz = min_t(unsigned int, count - pos, 8); 438 sz = data->packet(data, master, channel, STP_PACKET_DATA, flags, 439 sz, p); 440 flags = 0; 441 442 if (sz < 0) 443 break; 444 } 445 446 data->packet(data, master, channel, STP_PACKET_FLAG, 0, 0, &nil); 447 448 return pos; 449 } 450 451 static ssize_t stm_char_write(struct file *file, const char __user *buf, 452 size_t count, loff_t *ppos) 453 { 454 struct stm_file *stmf = file->private_data; 455 struct stm_device *stm = stmf->stm; 456 char *kbuf; 457 int err; 458 459 if (count + 1 > PAGE_SIZE) 460 count = PAGE_SIZE - 1; 461 462 /* 463 * if no m/c have been assigned to this writer up to this 464 * point, use "default" policy entry 465 */ 466 if (!stmf->output.nr_chans) { 467 err = stm_file_assign(stmf, "default", 1); 468 /* 469 * EBUSY means that somebody else just assigned this 470 * output, which is just fine for write() 471 */ 472 if (err && err != -EBUSY) 473 return err; 474 } 475 476 kbuf = kmalloc(count + 1, GFP_KERNEL); 477 if (!kbuf) 478 return -ENOMEM; 479 480 err = copy_from_user(kbuf, buf, count); 481 if (err) { 482 kfree(kbuf); 483 return -EFAULT; 484 } 485 486 pm_runtime_get_sync(&stm->dev); 487 488 count = stm_write(stm->data, stmf->output.master, stmf->output.channel, 489 kbuf, count); 490 491 pm_runtime_mark_last_busy(&stm->dev); 492 pm_runtime_put_autosuspend(&stm->dev); 493 kfree(kbuf); 494 495 return count; 496 } 497 498 static void stm_mmap_open(struct vm_area_struct *vma) 499 { 500 struct stm_file *stmf = vma->vm_file->private_data; 501 struct stm_device *stm = stmf->stm; 502 503 pm_runtime_get(&stm->dev); 504 } 505 506 static void stm_mmap_close(struct vm_area_struct *vma) 507 { 508 struct stm_file *stmf = vma->vm_file->private_data; 509 struct stm_device *stm = stmf->stm; 510 511 pm_runtime_mark_last_busy(&stm->dev); 512 pm_runtime_put_autosuspend(&stm->dev); 513 } 514 515 static const struct vm_operations_struct stm_mmap_vmops = { 516 .open = stm_mmap_open, 517 .close = stm_mmap_close, 518 }; 519 520 static int stm_char_mmap(struct file *file, struct vm_area_struct *vma) 521 { 522 struct stm_file *stmf = file->private_data; 523 struct stm_device *stm = stmf->stm; 524 unsigned long size, phys; 525 526 if (!stm->data->mmio_addr) 527 return -EOPNOTSUPP; 528 529 if (vma->vm_pgoff) 530 return -EINVAL; 531 532 size = vma->vm_end - vma->vm_start; 533 534 if (stmf->output.nr_chans * stm->data->sw_mmiosz != size) 535 return -EINVAL; 536 537 phys = stm->data->mmio_addr(stm->data, stmf->output.master, 538 stmf->output.channel, 539 stmf->output.nr_chans); 540 541 if (!phys) 542 return -EINVAL; 543 544 pm_runtime_get_sync(&stm->dev); 545 546 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 547 vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP; 548 vma->vm_ops = &stm_mmap_vmops; 549 vm_iomap_memory(vma, phys, size); 550 551 return 0; 552 } 553 554 static int stm_char_policy_set_ioctl(struct stm_file *stmf, void __user *arg) 555 { 556 struct stm_device *stm = stmf->stm; 557 struct stp_policy_id *id; 558 int ret = -EINVAL; 559 u32 size; 560 561 if (stmf->output.nr_chans) 562 return -EBUSY; 563 564 if (copy_from_user(&size, arg, sizeof(size))) 565 return -EFAULT; 566 567 if (size >= PATH_MAX + sizeof(*id)) 568 return -EINVAL; 569 570 /* 571 * size + 1 to make sure the .id string at the bottom is terminated, 572 * which is also why memdup_user() is not useful here 573 */ 574 id = kzalloc(size + 1, GFP_KERNEL); 575 if (!id) 576 return -ENOMEM; 577 578 if (copy_from_user(id, arg, size)) { 579 ret = -EFAULT; 580 goto err_free; 581 } 582 583 if (id->__reserved_0 || id->__reserved_1) 584 goto err_free; 585 586 if (id->width < 1 || 587 id->width > PAGE_SIZE / stm->data->sw_mmiosz) 588 goto err_free; 589 590 ret = stm_file_assign(stmf, id->id, id->width); 591 if (ret) 592 goto err_free; 593 594 if (stm->data->link) 595 ret = stm->data->link(stm->data, stmf->output.master, 596 stmf->output.channel); 597 598 if (ret) 599 stm_output_free(stmf->stm, &stmf->output); 600 601 err_free: 602 kfree(id); 603 604 return ret; 605 } 606 607 static int stm_char_policy_get_ioctl(struct stm_file *stmf, void __user *arg) 608 { 609 struct stp_policy_id id = { 610 .size = sizeof(id), 611 .master = stmf->output.master, 612 .channel = stmf->output.channel, 613 .width = stmf->output.nr_chans, 614 .__reserved_0 = 0, 615 .__reserved_1 = 0, 616 }; 617 618 return copy_to_user(arg, &id, id.size) ? -EFAULT : 0; 619 } 620 621 static long 622 stm_char_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 623 { 624 struct stm_file *stmf = file->private_data; 625 struct stm_data *stm_data = stmf->stm->data; 626 int err = -ENOTTY; 627 u64 options; 628 629 switch (cmd) { 630 case STP_POLICY_ID_SET: 631 err = stm_char_policy_set_ioctl(stmf, (void __user *)arg); 632 if (err) 633 return err; 634 635 return stm_char_policy_get_ioctl(stmf, (void __user *)arg); 636 637 case STP_POLICY_ID_GET: 638 return stm_char_policy_get_ioctl(stmf, (void __user *)arg); 639 640 case STP_SET_OPTIONS: 641 if (copy_from_user(&options, (u64 __user *)arg, sizeof(u64))) 642 return -EFAULT; 643 644 if (stm_data->set_options) 645 err = stm_data->set_options(stm_data, 646 stmf->output.master, 647 stmf->output.channel, 648 stmf->output.nr_chans, 649 options); 650 651 break; 652 default: 653 break; 654 } 655 656 return err; 657 } 658 659 #ifdef CONFIG_COMPAT 660 static long 661 stm_char_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 662 { 663 return stm_char_ioctl(file, cmd, (unsigned long)compat_ptr(arg)); 664 } 665 #else 666 #define stm_char_compat_ioctl NULL 667 #endif 668 669 static const struct file_operations stm_fops = { 670 .open = stm_char_open, 671 .release = stm_char_release, 672 .write = stm_char_write, 673 .mmap = stm_char_mmap, 674 .unlocked_ioctl = stm_char_ioctl, 675 .compat_ioctl = stm_char_compat_ioctl, 676 .llseek = no_llseek, 677 }; 678 679 static void stm_device_release(struct device *dev) 680 { 681 struct stm_device *stm = to_stm_device(dev); 682 683 kfree(stm); 684 } 685 686 int stm_register_device(struct device *parent, struct stm_data *stm_data, 687 struct module *owner) 688 { 689 struct stm_device *stm; 690 unsigned int nmasters; 691 int err = -ENOMEM; 692 693 if (!stm_core_up) 694 return -EPROBE_DEFER; 695 696 if (!stm_data->packet || !stm_data->sw_nchannels) 697 return -EINVAL; 698 699 nmasters = stm_data->sw_end - stm_data->sw_start + 1; 700 stm = kzalloc(sizeof(*stm) + nmasters * sizeof(void *), GFP_KERNEL); 701 if (!stm) 702 return -ENOMEM; 703 704 stm->major = register_chrdev(0, stm_data->name, &stm_fops); 705 if (stm->major < 0) 706 goto err_free; 707 708 device_initialize(&stm->dev); 709 stm->dev.devt = MKDEV(stm->major, 0); 710 stm->dev.class = &stm_class; 711 stm->dev.parent = parent; 712 stm->dev.release = stm_device_release; 713 714 mutex_init(&stm->link_mutex); 715 spin_lock_init(&stm->link_lock); 716 INIT_LIST_HEAD(&stm->link_list); 717 718 /* initialize the object before it is accessible via sysfs */ 719 spin_lock_init(&stm->mc_lock); 720 mutex_init(&stm->policy_mutex); 721 stm->sw_nmasters = nmasters; 722 stm->owner = owner; 723 stm->data = stm_data; 724 stm_data->stm = stm; 725 726 err = kobject_set_name(&stm->dev.kobj, "%s", stm_data->name); 727 if (err) 728 goto err_device; 729 730 err = device_add(&stm->dev); 731 if (err) 732 goto err_device; 733 734 /* 735 * Use delayed autosuspend to avoid bouncing back and forth 736 * on recurring character device writes, with the initial 737 * delay time of 2 seconds. 738 */ 739 pm_runtime_no_callbacks(&stm->dev); 740 pm_runtime_use_autosuspend(&stm->dev); 741 pm_runtime_set_autosuspend_delay(&stm->dev, 2000); 742 pm_runtime_set_suspended(&stm->dev); 743 pm_runtime_enable(&stm->dev); 744 745 return 0; 746 747 err_device: 748 unregister_chrdev(stm->major, stm_data->name); 749 750 /* matches device_initialize() above */ 751 put_device(&stm->dev); 752 err_free: 753 kfree(stm); 754 755 return err; 756 } 757 EXPORT_SYMBOL_GPL(stm_register_device); 758 759 static int __stm_source_link_drop(struct stm_source_device *src, 760 struct stm_device *stm); 761 762 void stm_unregister_device(struct stm_data *stm_data) 763 { 764 struct stm_device *stm = stm_data->stm; 765 struct stm_source_device *src, *iter; 766 int i, ret; 767 768 pm_runtime_dont_use_autosuspend(&stm->dev); 769 pm_runtime_disable(&stm->dev); 770 771 mutex_lock(&stm->link_mutex); 772 list_for_each_entry_safe(src, iter, &stm->link_list, link_entry) { 773 ret = __stm_source_link_drop(src, stm); 774 /* 775 * src <-> stm link must not change under the same 776 * stm::link_mutex, so complain loudly if it has; 777 * also in this situation ret!=0 means this src is 778 * not connected to this stm and it should be otherwise 779 * safe to proceed with the tear-down of stm. 780 */ 781 WARN_ON_ONCE(ret); 782 } 783 mutex_unlock(&stm->link_mutex); 784 785 synchronize_srcu(&stm_source_srcu); 786 787 unregister_chrdev(stm->major, stm_data->name); 788 789 mutex_lock(&stm->policy_mutex); 790 if (stm->policy) 791 stp_policy_unbind(stm->policy); 792 mutex_unlock(&stm->policy_mutex); 793 794 for (i = stm->data->sw_start; i <= stm->data->sw_end; i++) 795 stp_master_free(stm, i); 796 797 device_unregister(&stm->dev); 798 stm_data->stm = NULL; 799 } 800 EXPORT_SYMBOL_GPL(stm_unregister_device); 801 802 /* 803 * stm::link_list access serialization uses a spinlock and a mutex; holding 804 * either of them guarantees that the list is stable; modification requires 805 * holding both of them. 806 * 807 * Lock ordering is as follows: 808 * stm::link_mutex 809 * stm::link_lock 810 * src::link_lock 811 */ 812 813 /** 814 * stm_source_link_add() - connect an stm_source device to an stm device 815 * @src: stm_source device 816 * @stm: stm device 817 * 818 * This function establishes a link from stm_source to an stm device so that 819 * the former can send out trace data to the latter. 820 * 821 * Return: 0 on success, -errno otherwise. 822 */ 823 static int stm_source_link_add(struct stm_source_device *src, 824 struct stm_device *stm) 825 { 826 char *id; 827 int err; 828 829 mutex_lock(&stm->link_mutex); 830 spin_lock(&stm->link_lock); 831 spin_lock(&src->link_lock); 832 833 /* src->link is dereferenced under stm_source_srcu but not the list */ 834 rcu_assign_pointer(src->link, stm); 835 list_add_tail(&src->link_entry, &stm->link_list); 836 837 spin_unlock(&src->link_lock); 838 spin_unlock(&stm->link_lock); 839 mutex_unlock(&stm->link_mutex); 840 841 id = kstrdup(src->data->name, GFP_KERNEL); 842 if (id) { 843 src->policy_node = 844 stp_policy_node_lookup(stm, id); 845 846 kfree(id); 847 } 848 849 err = stm_output_assign(stm, src->data->nr_chans, 850 src->policy_node, &src->output); 851 852 if (src->policy_node) 853 stp_policy_node_put(src->policy_node); 854 855 if (err) 856 goto fail_detach; 857 858 /* this is to notify the STM device that a new link has been made */ 859 if (stm->data->link) 860 err = stm->data->link(stm->data, src->output.master, 861 src->output.channel); 862 863 if (err) 864 goto fail_free_output; 865 866 /* this is to let the source carry out all necessary preparations */ 867 if (src->data->link) 868 src->data->link(src->data); 869 870 return 0; 871 872 fail_free_output: 873 stm_output_free(stm, &src->output); 874 875 fail_detach: 876 mutex_lock(&stm->link_mutex); 877 spin_lock(&stm->link_lock); 878 spin_lock(&src->link_lock); 879 880 rcu_assign_pointer(src->link, NULL); 881 list_del_init(&src->link_entry); 882 883 spin_unlock(&src->link_lock); 884 spin_unlock(&stm->link_lock); 885 mutex_unlock(&stm->link_mutex); 886 887 return err; 888 } 889 890 /** 891 * __stm_source_link_drop() - detach stm_source from an stm device 892 * @src: stm_source device 893 * @stm: stm device 894 * 895 * If @stm is @src::link, disconnect them from one another and put the 896 * reference on the @stm device. 897 * 898 * Caller must hold stm::link_mutex. 899 */ 900 static int __stm_source_link_drop(struct stm_source_device *src, 901 struct stm_device *stm) 902 { 903 struct stm_device *link; 904 int ret = 0; 905 906 lockdep_assert_held(&stm->link_mutex); 907 908 /* for stm::link_list modification, we hold both mutex and spinlock */ 909 spin_lock(&stm->link_lock); 910 spin_lock(&src->link_lock); 911 link = srcu_dereference_check(src->link, &stm_source_srcu, 1); 912 913 /* 914 * The linked device may have changed since we last looked, because 915 * we weren't holding the src::link_lock back then; if this is the 916 * case, tell the caller to retry. 917 */ 918 if (link != stm) { 919 ret = -EAGAIN; 920 goto unlock; 921 } 922 923 stm_output_free(link, &src->output); 924 list_del_init(&src->link_entry); 925 pm_runtime_mark_last_busy(&link->dev); 926 pm_runtime_put_autosuspend(&link->dev); 927 /* matches stm_find_device() from stm_source_link_store() */ 928 stm_put_device(link); 929 rcu_assign_pointer(src->link, NULL); 930 931 unlock: 932 spin_unlock(&src->link_lock); 933 spin_unlock(&stm->link_lock); 934 935 /* 936 * Call the unlink callbacks for both source and stm, when we know 937 * that we have actually performed the unlinking. 938 */ 939 if (!ret) { 940 if (src->data->unlink) 941 src->data->unlink(src->data); 942 943 if (stm->data->unlink) 944 stm->data->unlink(stm->data, src->output.master, 945 src->output.channel); 946 } 947 948 return ret; 949 } 950 951 /** 952 * stm_source_link_drop() - detach stm_source from its stm device 953 * @src: stm_source device 954 * 955 * Unlinking means disconnecting from source's STM device; after this 956 * writes will be unsuccessful until it is linked to a new STM device. 957 * 958 * This will happen on "stm_source_link" sysfs attribute write to undo 959 * the existing link (if any), or on linked STM device's de-registration. 960 */ 961 static void stm_source_link_drop(struct stm_source_device *src) 962 { 963 struct stm_device *stm; 964 int idx, ret; 965 966 retry: 967 idx = srcu_read_lock(&stm_source_srcu); 968 /* 969 * The stm device will be valid for the duration of this 970 * read section, but the link may change before we grab 971 * the src::link_lock in __stm_source_link_drop(). 972 */ 973 stm = srcu_dereference(src->link, &stm_source_srcu); 974 975 ret = 0; 976 if (stm) { 977 mutex_lock(&stm->link_mutex); 978 ret = __stm_source_link_drop(src, stm); 979 mutex_unlock(&stm->link_mutex); 980 } 981 982 srcu_read_unlock(&stm_source_srcu, idx); 983 984 /* if it did change, retry */ 985 if (ret == -EAGAIN) 986 goto retry; 987 } 988 989 static ssize_t stm_source_link_show(struct device *dev, 990 struct device_attribute *attr, 991 char *buf) 992 { 993 struct stm_source_device *src = to_stm_source_device(dev); 994 struct stm_device *stm; 995 int idx, ret; 996 997 idx = srcu_read_lock(&stm_source_srcu); 998 stm = srcu_dereference(src->link, &stm_source_srcu); 999 ret = sprintf(buf, "%s\n", 1000 stm ? dev_name(&stm->dev) : "<none>"); 1001 srcu_read_unlock(&stm_source_srcu, idx); 1002 1003 return ret; 1004 } 1005 1006 static ssize_t stm_source_link_store(struct device *dev, 1007 struct device_attribute *attr, 1008 const char *buf, size_t count) 1009 { 1010 struct stm_source_device *src = to_stm_source_device(dev); 1011 struct stm_device *link; 1012 int err; 1013 1014 stm_source_link_drop(src); 1015 1016 link = stm_find_device(buf); 1017 if (!link) 1018 return -EINVAL; 1019 1020 pm_runtime_get(&link->dev); 1021 1022 err = stm_source_link_add(src, link); 1023 if (err) { 1024 pm_runtime_put_autosuspend(&link->dev); 1025 /* matches the stm_find_device() above */ 1026 stm_put_device(link); 1027 } 1028 1029 return err ? : count; 1030 } 1031 1032 static DEVICE_ATTR_RW(stm_source_link); 1033 1034 static struct attribute *stm_source_attrs[] = { 1035 &dev_attr_stm_source_link.attr, 1036 NULL, 1037 }; 1038 1039 ATTRIBUTE_GROUPS(stm_source); 1040 1041 static struct class stm_source_class = { 1042 .name = "stm_source", 1043 .dev_groups = stm_source_groups, 1044 }; 1045 1046 static void stm_source_device_release(struct device *dev) 1047 { 1048 struct stm_source_device *src = to_stm_source_device(dev); 1049 1050 kfree(src); 1051 } 1052 1053 /** 1054 * stm_source_register_device() - register an stm_source device 1055 * @parent: parent device 1056 * @data: device description structure 1057 * 1058 * This will create a device of stm_source class that can write 1059 * data to an stm device once linked. 1060 * 1061 * Return: 0 on success, -errno otherwise. 1062 */ 1063 int stm_source_register_device(struct device *parent, 1064 struct stm_source_data *data) 1065 { 1066 struct stm_source_device *src; 1067 int err; 1068 1069 if (!stm_core_up) 1070 return -EPROBE_DEFER; 1071 1072 src = kzalloc(sizeof(*src), GFP_KERNEL); 1073 if (!src) 1074 return -ENOMEM; 1075 1076 device_initialize(&src->dev); 1077 src->dev.class = &stm_source_class; 1078 src->dev.parent = parent; 1079 src->dev.release = stm_source_device_release; 1080 1081 err = kobject_set_name(&src->dev.kobj, "%s", data->name); 1082 if (err) 1083 goto err; 1084 1085 pm_runtime_no_callbacks(&src->dev); 1086 pm_runtime_forbid(&src->dev); 1087 1088 err = device_add(&src->dev); 1089 if (err) 1090 goto err; 1091 1092 stm_output_init(&src->output); 1093 spin_lock_init(&src->link_lock); 1094 INIT_LIST_HEAD(&src->link_entry); 1095 src->data = data; 1096 data->src = src; 1097 1098 return 0; 1099 1100 err: 1101 put_device(&src->dev); 1102 kfree(src); 1103 1104 return err; 1105 } 1106 EXPORT_SYMBOL_GPL(stm_source_register_device); 1107 1108 /** 1109 * stm_source_unregister_device() - unregister an stm_source device 1110 * @data: device description that was used to register the device 1111 * 1112 * This will remove a previously created stm_source device from the system. 1113 */ 1114 void stm_source_unregister_device(struct stm_source_data *data) 1115 { 1116 struct stm_source_device *src = data->src; 1117 1118 stm_source_link_drop(src); 1119 1120 device_destroy(&stm_source_class, src->dev.devt); 1121 } 1122 EXPORT_SYMBOL_GPL(stm_source_unregister_device); 1123 1124 int stm_source_write(struct stm_source_data *data, unsigned int chan, 1125 const char *buf, size_t count) 1126 { 1127 struct stm_source_device *src = data->src; 1128 struct stm_device *stm; 1129 int idx; 1130 1131 if (!src->output.nr_chans) 1132 return -ENODEV; 1133 1134 if (chan >= src->output.nr_chans) 1135 return -EINVAL; 1136 1137 idx = srcu_read_lock(&stm_source_srcu); 1138 1139 stm = srcu_dereference(src->link, &stm_source_srcu); 1140 if (stm) 1141 count = stm_write(stm->data, src->output.master, 1142 src->output.channel + chan, 1143 buf, count); 1144 else 1145 count = -ENODEV; 1146 1147 srcu_read_unlock(&stm_source_srcu, idx); 1148 1149 return count; 1150 } 1151 EXPORT_SYMBOL_GPL(stm_source_write); 1152 1153 static int __init stm_core_init(void) 1154 { 1155 int err; 1156 1157 err = class_register(&stm_class); 1158 if (err) 1159 return err; 1160 1161 err = class_register(&stm_source_class); 1162 if (err) 1163 goto err_stm; 1164 1165 err = stp_configfs_init(); 1166 if (err) 1167 goto err_src; 1168 1169 init_srcu_struct(&stm_source_srcu); 1170 1171 stm_core_up++; 1172 1173 return 0; 1174 1175 err_src: 1176 class_unregister(&stm_source_class); 1177 err_stm: 1178 class_unregister(&stm_class); 1179 1180 return err; 1181 } 1182 1183 module_init(stm_core_init); 1184 1185 static void __exit stm_core_exit(void) 1186 { 1187 cleanup_srcu_struct(&stm_source_srcu); 1188 class_unregister(&stm_source_class); 1189 class_unregister(&stm_class); 1190 stp_configfs_exit(); 1191 } 1192 1193 module_exit(stm_core_exit); 1194 1195 MODULE_LICENSE("GPL v2"); 1196 MODULE_DESCRIPTION("System Trace Module device class"); 1197 MODULE_AUTHOR("Alexander Shishkin <alexander.shishkin@linux.intel.com>"); 1198