coresight-etm3x-sysfs.c (32818B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright(C) 2015 Linaro Limited. All rights reserved. 4 * Author: Mathieu Poirier <mathieu.poirier@linaro.org> 5 */ 6 7#include <linux/pid_namespace.h> 8#include <linux/pm_runtime.h> 9#include <linux/sysfs.h> 10#include "coresight-etm.h" 11#include "coresight-priv.h" 12 13static ssize_t nr_addr_cmp_show(struct device *dev, 14 struct device_attribute *attr, char *buf) 15{ 16 unsigned long val; 17 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 18 19 val = drvdata->nr_addr_cmp; 20 return sprintf(buf, "%#lx\n", val); 21} 22static DEVICE_ATTR_RO(nr_addr_cmp); 23 24static ssize_t nr_cntr_show(struct device *dev, 25 struct device_attribute *attr, char *buf) 26{ unsigned long val; 27 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 28 29 val = drvdata->nr_cntr; 30 return sprintf(buf, "%#lx\n", val); 31} 32static DEVICE_ATTR_RO(nr_cntr); 33 34static ssize_t nr_ctxid_cmp_show(struct device *dev, 35 struct device_attribute *attr, char *buf) 36{ 37 unsigned long val; 38 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 39 40 val = drvdata->nr_ctxid_cmp; 41 return sprintf(buf, "%#lx\n", val); 42} 43static DEVICE_ATTR_RO(nr_ctxid_cmp); 44 45static ssize_t etmsr_show(struct device *dev, 46 struct device_attribute *attr, char *buf) 47{ 48 unsigned long flags, val; 49 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 50 51 pm_runtime_get_sync(dev->parent); 52 spin_lock_irqsave(&drvdata->spinlock, flags); 53 CS_UNLOCK(drvdata->base); 54 55 val = etm_readl(drvdata, ETMSR); 56 57 CS_LOCK(drvdata->base); 58 spin_unlock_irqrestore(&drvdata->spinlock, flags); 59 pm_runtime_put(dev->parent); 60 61 return sprintf(buf, "%#lx\n", val); 62} 63static DEVICE_ATTR_RO(etmsr); 64 65static ssize_t reset_store(struct device *dev, 66 struct device_attribute *attr, 67 const char *buf, size_t size) 68{ 69 int i, ret; 70 unsigned long val; 71 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 72 struct etm_config *config = &drvdata->config; 73 74 ret = kstrtoul(buf, 16, &val); 75 if (ret) 76 return ret; 77 78 if (val) { 79 spin_lock(&drvdata->spinlock); 80 memset(config, 0, sizeof(struct etm_config)); 81 config->mode = ETM_MODE_EXCLUDE; 82 config->trigger_event = ETM_DEFAULT_EVENT_VAL; 83 for (i = 0; i < drvdata->nr_addr_cmp; i++) { 84 config->addr_type[i] = ETM_ADDR_TYPE_NONE; 85 } 86 87 etm_set_default(config); 88 spin_unlock(&drvdata->spinlock); 89 } 90 91 return size; 92} 93static DEVICE_ATTR_WO(reset); 94 95static ssize_t mode_show(struct device *dev, 96 struct device_attribute *attr, char *buf) 97{ 98 unsigned long val; 99 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 100 struct etm_config *config = &drvdata->config; 101 102 val = config->mode; 103 return sprintf(buf, "%#lx\n", val); 104} 105 106static ssize_t mode_store(struct device *dev, 107 struct device_attribute *attr, 108 const char *buf, size_t size) 109{ 110 int ret; 111 unsigned long val; 112 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 113 struct etm_config *config = &drvdata->config; 114 115 ret = kstrtoul(buf, 16, &val); 116 if (ret) 117 return ret; 118 119 spin_lock(&drvdata->spinlock); 120 config->mode = val & ETM_MODE_ALL; 121 122 if (config->mode & ETM_MODE_EXCLUDE) 123 config->enable_ctrl1 |= ETMTECR1_INC_EXC; 124 else 125 config->enable_ctrl1 &= ~ETMTECR1_INC_EXC; 126 127 if (config->mode & ETM_MODE_CYCACC) 128 config->ctrl |= ETMCR_CYC_ACC; 129 else 130 config->ctrl &= ~ETMCR_CYC_ACC; 131 132 if (config->mode & ETM_MODE_STALL) { 133 if (!(drvdata->etmccr & ETMCCR_FIFOFULL)) { 134 dev_warn(dev, "stall mode not supported\n"); 135 ret = -EINVAL; 136 goto err_unlock; 137 } 138 config->ctrl |= ETMCR_STALL_MODE; 139 } else 140 config->ctrl &= ~ETMCR_STALL_MODE; 141 142 if (config->mode & ETM_MODE_TIMESTAMP) { 143 if (!(drvdata->etmccer & ETMCCER_TIMESTAMP)) { 144 dev_warn(dev, "timestamp not supported\n"); 145 ret = -EINVAL; 146 goto err_unlock; 147 } 148 config->ctrl |= ETMCR_TIMESTAMP_EN; 149 } else 150 config->ctrl &= ~ETMCR_TIMESTAMP_EN; 151 152 if (config->mode & ETM_MODE_CTXID) 153 config->ctrl |= ETMCR_CTXID_SIZE; 154 else 155 config->ctrl &= ~ETMCR_CTXID_SIZE; 156 157 if (config->mode & ETM_MODE_BBROAD) 158 config->ctrl |= ETMCR_BRANCH_BROADCAST; 159 else 160 config->ctrl &= ~ETMCR_BRANCH_BROADCAST; 161 162 if (config->mode & ETM_MODE_RET_STACK) 163 config->ctrl |= ETMCR_RETURN_STACK; 164 else 165 config->ctrl &= ~ETMCR_RETURN_STACK; 166 167 if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER)) 168 etm_config_trace_mode(config); 169 170 spin_unlock(&drvdata->spinlock); 171 172 return size; 173 174err_unlock: 175 spin_unlock(&drvdata->spinlock); 176 return ret; 177} 178static DEVICE_ATTR_RW(mode); 179 180static ssize_t trigger_event_show(struct device *dev, 181 struct device_attribute *attr, char *buf) 182{ 183 unsigned long val; 184 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 185 struct etm_config *config = &drvdata->config; 186 187 val = config->trigger_event; 188 return sprintf(buf, "%#lx\n", val); 189} 190 191static ssize_t trigger_event_store(struct device *dev, 192 struct device_attribute *attr, 193 const char *buf, size_t size) 194{ 195 int ret; 196 unsigned long val; 197 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 198 struct etm_config *config = &drvdata->config; 199 200 ret = kstrtoul(buf, 16, &val); 201 if (ret) 202 return ret; 203 204 config->trigger_event = val & ETM_EVENT_MASK; 205 206 return size; 207} 208static DEVICE_ATTR_RW(trigger_event); 209 210static ssize_t enable_event_show(struct device *dev, 211 struct device_attribute *attr, char *buf) 212{ 213 unsigned long val; 214 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 215 struct etm_config *config = &drvdata->config; 216 217 val = config->enable_event; 218 return sprintf(buf, "%#lx\n", val); 219} 220 221static ssize_t enable_event_store(struct device *dev, 222 struct device_attribute *attr, 223 const char *buf, size_t size) 224{ 225 int ret; 226 unsigned long val; 227 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 228 struct etm_config *config = &drvdata->config; 229 230 ret = kstrtoul(buf, 16, &val); 231 if (ret) 232 return ret; 233 234 config->enable_event = val & ETM_EVENT_MASK; 235 236 return size; 237} 238static DEVICE_ATTR_RW(enable_event); 239 240static ssize_t fifofull_level_show(struct device *dev, 241 struct device_attribute *attr, char *buf) 242{ 243 unsigned long val; 244 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 245 struct etm_config *config = &drvdata->config; 246 247 val = config->fifofull_level; 248 return sprintf(buf, "%#lx\n", val); 249} 250 251static ssize_t fifofull_level_store(struct device *dev, 252 struct device_attribute *attr, 253 const char *buf, size_t size) 254{ 255 int ret; 256 unsigned long val; 257 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 258 struct etm_config *config = &drvdata->config; 259 260 ret = kstrtoul(buf, 16, &val); 261 if (ret) 262 return ret; 263 264 config->fifofull_level = val; 265 266 return size; 267} 268static DEVICE_ATTR_RW(fifofull_level); 269 270static ssize_t addr_idx_show(struct device *dev, 271 struct device_attribute *attr, char *buf) 272{ 273 unsigned long val; 274 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 275 struct etm_config *config = &drvdata->config; 276 277 val = config->addr_idx; 278 return sprintf(buf, "%#lx\n", val); 279} 280 281static ssize_t addr_idx_store(struct device *dev, 282 struct device_attribute *attr, 283 const char *buf, size_t size) 284{ 285 int ret; 286 unsigned long val; 287 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 288 struct etm_config *config = &drvdata->config; 289 290 ret = kstrtoul(buf, 16, &val); 291 if (ret) 292 return ret; 293 294 if (val >= drvdata->nr_addr_cmp) 295 return -EINVAL; 296 297 /* 298 * Use spinlock to ensure index doesn't change while it gets 299 * dereferenced multiple times within a spinlock block elsewhere. 300 */ 301 spin_lock(&drvdata->spinlock); 302 config->addr_idx = val; 303 spin_unlock(&drvdata->spinlock); 304 305 return size; 306} 307static DEVICE_ATTR_RW(addr_idx); 308 309static ssize_t addr_single_show(struct device *dev, 310 struct device_attribute *attr, char *buf) 311{ 312 u8 idx; 313 unsigned long val; 314 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 315 struct etm_config *config = &drvdata->config; 316 317 spin_lock(&drvdata->spinlock); 318 idx = config->addr_idx; 319 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE || 320 config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) { 321 spin_unlock(&drvdata->spinlock); 322 return -EINVAL; 323 } 324 325 val = config->addr_val[idx]; 326 spin_unlock(&drvdata->spinlock); 327 328 return sprintf(buf, "%#lx\n", val); 329} 330 331static ssize_t addr_single_store(struct device *dev, 332 struct device_attribute *attr, 333 const char *buf, size_t size) 334{ 335 u8 idx; 336 int ret; 337 unsigned long val; 338 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 339 struct etm_config *config = &drvdata->config; 340 341 ret = kstrtoul(buf, 16, &val); 342 if (ret) 343 return ret; 344 345 spin_lock(&drvdata->spinlock); 346 idx = config->addr_idx; 347 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE || 348 config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) { 349 spin_unlock(&drvdata->spinlock); 350 return -EINVAL; 351 } 352 353 config->addr_val[idx] = val; 354 config->addr_type[idx] = ETM_ADDR_TYPE_SINGLE; 355 spin_unlock(&drvdata->spinlock); 356 357 return size; 358} 359static DEVICE_ATTR_RW(addr_single); 360 361static ssize_t addr_range_show(struct device *dev, 362 struct device_attribute *attr, char *buf) 363{ 364 u8 idx; 365 unsigned long val1, val2; 366 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 367 struct etm_config *config = &drvdata->config; 368 369 spin_lock(&drvdata->spinlock); 370 idx = config->addr_idx; 371 if (idx % 2 != 0) { 372 spin_unlock(&drvdata->spinlock); 373 return -EPERM; 374 } 375 if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE && 376 config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) || 377 (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE && 378 config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) { 379 spin_unlock(&drvdata->spinlock); 380 return -EPERM; 381 } 382 383 val1 = config->addr_val[idx]; 384 val2 = config->addr_val[idx + 1]; 385 spin_unlock(&drvdata->spinlock); 386 387 return sprintf(buf, "%#lx %#lx\n", val1, val2); 388} 389 390static ssize_t addr_range_store(struct device *dev, 391 struct device_attribute *attr, 392 const char *buf, size_t size) 393{ 394 u8 idx; 395 unsigned long val1, val2; 396 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 397 struct etm_config *config = &drvdata->config; 398 399 if (sscanf(buf, "%lx %lx", &val1, &val2) != 2) 400 return -EINVAL; 401 /* Lower address comparator cannot have a higher address value */ 402 if (val1 > val2) 403 return -EINVAL; 404 405 spin_lock(&drvdata->spinlock); 406 idx = config->addr_idx; 407 if (idx % 2 != 0) { 408 spin_unlock(&drvdata->spinlock); 409 return -EPERM; 410 } 411 if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE && 412 config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) || 413 (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE && 414 config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) { 415 spin_unlock(&drvdata->spinlock); 416 return -EPERM; 417 } 418 419 config->addr_val[idx] = val1; 420 config->addr_type[idx] = ETM_ADDR_TYPE_RANGE; 421 config->addr_val[idx + 1] = val2; 422 config->addr_type[idx + 1] = ETM_ADDR_TYPE_RANGE; 423 config->enable_ctrl1 |= (1 << (idx/2)); 424 spin_unlock(&drvdata->spinlock); 425 426 return size; 427} 428static DEVICE_ATTR_RW(addr_range); 429 430static ssize_t addr_start_show(struct device *dev, 431 struct device_attribute *attr, char *buf) 432{ 433 u8 idx; 434 unsigned long val; 435 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 436 struct etm_config *config = &drvdata->config; 437 438 spin_lock(&drvdata->spinlock); 439 idx = config->addr_idx; 440 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE || 441 config->addr_type[idx] == ETM_ADDR_TYPE_START)) { 442 spin_unlock(&drvdata->spinlock); 443 return -EPERM; 444 } 445 446 val = config->addr_val[idx]; 447 spin_unlock(&drvdata->spinlock); 448 449 return sprintf(buf, "%#lx\n", val); 450} 451 452static ssize_t addr_start_store(struct device *dev, 453 struct device_attribute *attr, 454 const char *buf, size_t size) 455{ 456 u8 idx; 457 int ret; 458 unsigned long val; 459 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 460 struct etm_config *config = &drvdata->config; 461 462 ret = kstrtoul(buf, 16, &val); 463 if (ret) 464 return ret; 465 466 spin_lock(&drvdata->spinlock); 467 idx = config->addr_idx; 468 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE || 469 config->addr_type[idx] == ETM_ADDR_TYPE_START)) { 470 spin_unlock(&drvdata->spinlock); 471 return -EPERM; 472 } 473 474 config->addr_val[idx] = val; 475 config->addr_type[idx] = ETM_ADDR_TYPE_START; 476 config->startstop_ctrl |= (1 << idx); 477 config->enable_ctrl1 |= ETMTECR1_START_STOP; 478 spin_unlock(&drvdata->spinlock); 479 480 return size; 481} 482static DEVICE_ATTR_RW(addr_start); 483 484static ssize_t addr_stop_show(struct device *dev, 485 struct device_attribute *attr, char *buf) 486{ 487 u8 idx; 488 unsigned long val; 489 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 490 struct etm_config *config = &drvdata->config; 491 492 spin_lock(&drvdata->spinlock); 493 idx = config->addr_idx; 494 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE || 495 config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) { 496 spin_unlock(&drvdata->spinlock); 497 return -EPERM; 498 } 499 500 val = config->addr_val[idx]; 501 spin_unlock(&drvdata->spinlock); 502 503 return sprintf(buf, "%#lx\n", val); 504} 505 506static ssize_t addr_stop_store(struct device *dev, 507 struct device_attribute *attr, 508 const char *buf, size_t size) 509{ 510 u8 idx; 511 int ret; 512 unsigned long val; 513 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 514 struct etm_config *config = &drvdata->config; 515 516 ret = kstrtoul(buf, 16, &val); 517 if (ret) 518 return ret; 519 520 spin_lock(&drvdata->spinlock); 521 idx = config->addr_idx; 522 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE || 523 config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) { 524 spin_unlock(&drvdata->spinlock); 525 return -EPERM; 526 } 527 528 config->addr_val[idx] = val; 529 config->addr_type[idx] = ETM_ADDR_TYPE_STOP; 530 config->startstop_ctrl |= (1 << (idx + 16)); 531 config->enable_ctrl1 |= ETMTECR1_START_STOP; 532 spin_unlock(&drvdata->spinlock); 533 534 return size; 535} 536static DEVICE_ATTR_RW(addr_stop); 537 538static ssize_t addr_acctype_show(struct device *dev, 539 struct device_attribute *attr, char *buf) 540{ 541 unsigned long val; 542 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 543 struct etm_config *config = &drvdata->config; 544 545 spin_lock(&drvdata->spinlock); 546 val = config->addr_acctype[config->addr_idx]; 547 spin_unlock(&drvdata->spinlock); 548 549 return sprintf(buf, "%#lx\n", val); 550} 551 552static ssize_t addr_acctype_store(struct device *dev, 553 struct device_attribute *attr, 554 const char *buf, size_t size) 555{ 556 int ret; 557 unsigned long val; 558 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 559 struct etm_config *config = &drvdata->config; 560 561 ret = kstrtoul(buf, 16, &val); 562 if (ret) 563 return ret; 564 565 spin_lock(&drvdata->spinlock); 566 config->addr_acctype[config->addr_idx] = val; 567 spin_unlock(&drvdata->spinlock); 568 569 return size; 570} 571static DEVICE_ATTR_RW(addr_acctype); 572 573static ssize_t cntr_idx_show(struct device *dev, 574 struct device_attribute *attr, char *buf) 575{ 576 unsigned long val; 577 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 578 struct etm_config *config = &drvdata->config; 579 580 val = config->cntr_idx; 581 return sprintf(buf, "%#lx\n", val); 582} 583 584static ssize_t cntr_idx_store(struct device *dev, 585 struct device_attribute *attr, 586 const char *buf, size_t size) 587{ 588 int ret; 589 unsigned long val; 590 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 591 struct etm_config *config = &drvdata->config; 592 593 ret = kstrtoul(buf, 16, &val); 594 if (ret) 595 return ret; 596 597 if (val >= drvdata->nr_cntr) 598 return -EINVAL; 599 /* 600 * Use spinlock to ensure index doesn't change while it gets 601 * dereferenced multiple times within a spinlock block elsewhere. 602 */ 603 spin_lock(&drvdata->spinlock); 604 config->cntr_idx = val; 605 spin_unlock(&drvdata->spinlock); 606 607 return size; 608} 609static DEVICE_ATTR_RW(cntr_idx); 610 611static ssize_t cntr_rld_val_show(struct device *dev, 612 struct device_attribute *attr, char *buf) 613{ 614 unsigned long val; 615 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 616 struct etm_config *config = &drvdata->config; 617 618 spin_lock(&drvdata->spinlock); 619 val = config->cntr_rld_val[config->cntr_idx]; 620 spin_unlock(&drvdata->spinlock); 621 622 return sprintf(buf, "%#lx\n", val); 623} 624 625static ssize_t cntr_rld_val_store(struct device *dev, 626 struct device_attribute *attr, 627 const char *buf, size_t size) 628{ 629 int ret; 630 unsigned long val; 631 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 632 struct etm_config *config = &drvdata->config; 633 634 ret = kstrtoul(buf, 16, &val); 635 if (ret) 636 return ret; 637 638 spin_lock(&drvdata->spinlock); 639 config->cntr_rld_val[config->cntr_idx] = val; 640 spin_unlock(&drvdata->spinlock); 641 642 return size; 643} 644static DEVICE_ATTR_RW(cntr_rld_val); 645 646static ssize_t cntr_event_show(struct device *dev, 647 struct device_attribute *attr, char *buf) 648{ 649 unsigned long val; 650 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 651 struct etm_config *config = &drvdata->config; 652 653 spin_lock(&drvdata->spinlock); 654 val = config->cntr_event[config->cntr_idx]; 655 spin_unlock(&drvdata->spinlock); 656 657 return sprintf(buf, "%#lx\n", val); 658} 659 660static ssize_t cntr_event_store(struct device *dev, 661 struct device_attribute *attr, 662 const char *buf, size_t size) 663{ 664 int ret; 665 unsigned long val; 666 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 667 struct etm_config *config = &drvdata->config; 668 669 ret = kstrtoul(buf, 16, &val); 670 if (ret) 671 return ret; 672 673 spin_lock(&drvdata->spinlock); 674 config->cntr_event[config->cntr_idx] = val & ETM_EVENT_MASK; 675 spin_unlock(&drvdata->spinlock); 676 677 return size; 678} 679static DEVICE_ATTR_RW(cntr_event); 680 681static ssize_t cntr_rld_event_show(struct device *dev, 682 struct device_attribute *attr, char *buf) 683{ 684 unsigned long val; 685 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 686 struct etm_config *config = &drvdata->config; 687 688 spin_lock(&drvdata->spinlock); 689 val = config->cntr_rld_event[config->cntr_idx]; 690 spin_unlock(&drvdata->spinlock); 691 692 return sprintf(buf, "%#lx\n", val); 693} 694 695static ssize_t cntr_rld_event_store(struct device *dev, 696 struct device_attribute *attr, 697 const char *buf, size_t size) 698{ 699 int ret; 700 unsigned long val; 701 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 702 struct etm_config *config = &drvdata->config; 703 704 ret = kstrtoul(buf, 16, &val); 705 if (ret) 706 return ret; 707 708 spin_lock(&drvdata->spinlock); 709 config->cntr_rld_event[config->cntr_idx] = val & ETM_EVENT_MASK; 710 spin_unlock(&drvdata->spinlock); 711 712 return size; 713} 714static DEVICE_ATTR_RW(cntr_rld_event); 715 716static ssize_t cntr_val_show(struct device *dev, 717 struct device_attribute *attr, char *buf) 718{ 719 int i, ret = 0; 720 u32 val; 721 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 722 struct etm_config *config = &drvdata->config; 723 724 if (!local_read(&drvdata->mode)) { 725 spin_lock(&drvdata->spinlock); 726 for (i = 0; i < drvdata->nr_cntr; i++) 727 ret += sprintf(buf, "counter %d: %x\n", 728 i, config->cntr_val[i]); 729 spin_unlock(&drvdata->spinlock); 730 return ret; 731 } 732 733 for (i = 0; i < drvdata->nr_cntr; i++) { 734 val = etm_readl(drvdata, ETMCNTVRn(i)); 735 ret += sprintf(buf, "counter %d: %x\n", i, val); 736 } 737 738 return ret; 739} 740 741static ssize_t cntr_val_store(struct device *dev, 742 struct device_attribute *attr, 743 const char *buf, size_t size) 744{ 745 int ret; 746 unsigned long val; 747 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 748 struct etm_config *config = &drvdata->config; 749 750 ret = kstrtoul(buf, 16, &val); 751 if (ret) 752 return ret; 753 754 spin_lock(&drvdata->spinlock); 755 config->cntr_val[config->cntr_idx] = val; 756 spin_unlock(&drvdata->spinlock); 757 758 return size; 759} 760static DEVICE_ATTR_RW(cntr_val); 761 762static ssize_t seq_12_event_show(struct device *dev, 763 struct device_attribute *attr, char *buf) 764{ 765 unsigned long val; 766 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 767 struct etm_config *config = &drvdata->config; 768 769 val = config->seq_12_event; 770 return sprintf(buf, "%#lx\n", val); 771} 772 773static ssize_t seq_12_event_store(struct device *dev, 774 struct device_attribute *attr, 775 const char *buf, size_t size) 776{ 777 int ret; 778 unsigned long val; 779 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 780 struct etm_config *config = &drvdata->config; 781 782 ret = kstrtoul(buf, 16, &val); 783 if (ret) 784 return ret; 785 786 config->seq_12_event = val & ETM_EVENT_MASK; 787 return size; 788} 789static DEVICE_ATTR_RW(seq_12_event); 790 791static ssize_t seq_21_event_show(struct device *dev, 792 struct device_attribute *attr, char *buf) 793{ 794 unsigned long val; 795 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 796 struct etm_config *config = &drvdata->config; 797 798 val = config->seq_21_event; 799 return sprintf(buf, "%#lx\n", val); 800} 801 802static ssize_t seq_21_event_store(struct device *dev, 803 struct device_attribute *attr, 804 const char *buf, size_t size) 805{ 806 int ret; 807 unsigned long val; 808 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 809 struct etm_config *config = &drvdata->config; 810 811 ret = kstrtoul(buf, 16, &val); 812 if (ret) 813 return ret; 814 815 config->seq_21_event = val & ETM_EVENT_MASK; 816 return size; 817} 818static DEVICE_ATTR_RW(seq_21_event); 819 820static ssize_t seq_23_event_show(struct device *dev, 821 struct device_attribute *attr, char *buf) 822{ 823 unsigned long val; 824 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 825 struct etm_config *config = &drvdata->config; 826 827 val = config->seq_23_event; 828 return sprintf(buf, "%#lx\n", val); 829} 830 831static ssize_t seq_23_event_store(struct device *dev, 832 struct device_attribute *attr, 833 const char *buf, size_t size) 834{ 835 int ret; 836 unsigned long val; 837 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 838 struct etm_config *config = &drvdata->config; 839 840 ret = kstrtoul(buf, 16, &val); 841 if (ret) 842 return ret; 843 844 config->seq_23_event = val & ETM_EVENT_MASK; 845 return size; 846} 847static DEVICE_ATTR_RW(seq_23_event); 848 849static ssize_t seq_31_event_show(struct device *dev, 850 struct device_attribute *attr, char *buf) 851{ 852 unsigned long val; 853 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 854 struct etm_config *config = &drvdata->config; 855 856 val = config->seq_31_event; 857 return sprintf(buf, "%#lx\n", val); 858} 859 860static ssize_t seq_31_event_store(struct device *dev, 861 struct device_attribute *attr, 862 const char *buf, size_t size) 863{ 864 int ret; 865 unsigned long val; 866 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 867 struct etm_config *config = &drvdata->config; 868 869 ret = kstrtoul(buf, 16, &val); 870 if (ret) 871 return ret; 872 873 config->seq_31_event = val & ETM_EVENT_MASK; 874 return size; 875} 876static DEVICE_ATTR_RW(seq_31_event); 877 878static ssize_t seq_32_event_show(struct device *dev, 879 struct device_attribute *attr, char *buf) 880{ 881 unsigned long val; 882 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 883 struct etm_config *config = &drvdata->config; 884 885 val = config->seq_32_event; 886 return sprintf(buf, "%#lx\n", val); 887} 888 889static ssize_t seq_32_event_store(struct device *dev, 890 struct device_attribute *attr, 891 const char *buf, size_t size) 892{ 893 int ret; 894 unsigned long val; 895 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 896 struct etm_config *config = &drvdata->config; 897 898 ret = kstrtoul(buf, 16, &val); 899 if (ret) 900 return ret; 901 902 config->seq_32_event = val & ETM_EVENT_MASK; 903 return size; 904} 905static DEVICE_ATTR_RW(seq_32_event); 906 907static ssize_t seq_13_event_show(struct device *dev, 908 struct device_attribute *attr, char *buf) 909{ 910 unsigned long val; 911 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 912 struct etm_config *config = &drvdata->config; 913 914 val = config->seq_13_event; 915 return sprintf(buf, "%#lx\n", val); 916} 917 918static ssize_t seq_13_event_store(struct device *dev, 919 struct device_attribute *attr, 920 const char *buf, size_t size) 921{ 922 int ret; 923 unsigned long val; 924 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 925 struct etm_config *config = &drvdata->config; 926 927 ret = kstrtoul(buf, 16, &val); 928 if (ret) 929 return ret; 930 931 config->seq_13_event = val & ETM_EVENT_MASK; 932 return size; 933} 934static DEVICE_ATTR_RW(seq_13_event); 935 936static ssize_t seq_curr_state_show(struct device *dev, 937 struct device_attribute *attr, char *buf) 938{ 939 unsigned long val, flags; 940 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 941 struct etm_config *config = &drvdata->config; 942 943 if (!local_read(&drvdata->mode)) { 944 val = config->seq_curr_state; 945 goto out; 946 } 947 948 pm_runtime_get_sync(dev->parent); 949 spin_lock_irqsave(&drvdata->spinlock, flags); 950 951 CS_UNLOCK(drvdata->base); 952 val = (etm_readl(drvdata, ETMSQR) & ETM_SQR_MASK); 953 CS_LOCK(drvdata->base); 954 955 spin_unlock_irqrestore(&drvdata->spinlock, flags); 956 pm_runtime_put(dev->parent); 957out: 958 return sprintf(buf, "%#lx\n", val); 959} 960 961static ssize_t seq_curr_state_store(struct device *dev, 962 struct device_attribute *attr, 963 const char *buf, size_t size) 964{ 965 int ret; 966 unsigned long val; 967 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 968 struct etm_config *config = &drvdata->config; 969 970 ret = kstrtoul(buf, 16, &val); 971 if (ret) 972 return ret; 973 974 if (val > ETM_SEQ_STATE_MAX_VAL) 975 return -EINVAL; 976 977 config->seq_curr_state = val; 978 979 return size; 980} 981static DEVICE_ATTR_RW(seq_curr_state); 982 983static ssize_t ctxid_idx_show(struct device *dev, 984 struct device_attribute *attr, char *buf) 985{ 986 unsigned long val; 987 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 988 struct etm_config *config = &drvdata->config; 989 990 val = config->ctxid_idx; 991 return sprintf(buf, "%#lx\n", val); 992} 993 994static ssize_t ctxid_idx_store(struct device *dev, 995 struct device_attribute *attr, 996 const char *buf, size_t size) 997{ 998 int ret; 999 unsigned long val; 1000 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 1001 struct etm_config *config = &drvdata->config; 1002 1003 ret = kstrtoul(buf, 16, &val); 1004 if (ret) 1005 return ret; 1006 1007 if (val >= drvdata->nr_ctxid_cmp) 1008 return -EINVAL; 1009 1010 /* 1011 * Use spinlock to ensure index doesn't change while it gets 1012 * dereferenced multiple times within a spinlock block elsewhere. 1013 */ 1014 spin_lock(&drvdata->spinlock); 1015 config->ctxid_idx = val; 1016 spin_unlock(&drvdata->spinlock); 1017 1018 return size; 1019} 1020static DEVICE_ATTR_RW(ctxid_idx); 1021 1022static ssize_t ctxid_pid_show(struct device *dev, 1023 struct device_attribute *attr, char *buf) 1024{ 1025 unsigned long val; 1026 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 1027 struct etm_config *config = &drvdata->config; 1028 1029 /* 1030 * Don't use contextID tracing if coming from a PID namespace. See 1031 * comment in ctxid_pid_store(). 1032 */ 1033 if (task_active_pid_ns(current) != &init_pid_ns) 1034 return -EINVAL; 1035 1036 spin_lock(&drvdata->spinlock); 1037 val = config->ctxid_pid[config->ctxid_idx]; 1038 spin_unlock(&drvdata->spinlock); 1039 1040 return sprintf(buf, "%#lx\n", val); 1041} 1042 1043static ssize_t ctxid_pid_store(struct device *dev, 1044 struct device_attribute *attr, 1045 const char *buf, size_t size) 1046{ 1047 int ret; 1048 unsigned long pid; 1049 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 1050 struct etm_config *config = &drvdata->config; 1051 1052 /* 1053 * When contextID tracing is enabled the tracers will insert the 1054 * value found in the contextID register in the trace stream. But if 1055 * a process is in a namespace the PID of that process as seen from the 1056 * namespace won't be what the kernel sees, something that makes the 1057 * feature confusing and can potentially leak kernel only information. 1058 * As such refuse to use the feature if @current is not in the initial 1059 * PID namespace. 1060 */ 1061 if (task_active_pid_ns(current) != &init_pid_ns) 1062 return -EINVAL; 1063 1064 ret = kstrtoul(buf, 16, &pid); 1065 if (ret) 1066 return ret; 1067 1068 spin_lock(&drvdata->spinlock); 1069 config->ctxid_pid[config->ctxid_idx] = pid; 1070 spin_unlock(&drvdata->spinlock); 1071 1072 return size; 1073} 1074static DEVICE_ATTR_RW(ctxid_pid); 1075 1076static ssize_t ctxid_mask_show(struct device *dev, 1077 struct device_attribute *attr, char *buf) 1078{ 1079 unsigned long val; 1080 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 1081 struct etm_config *config = &drvdata->config; 1082 1083 /* 1084 * Don't use contextID tracing if coming from a PID namespace. See 1085 * comment in ctxid_pid_store(). 1086 */ 1087 if (task_active_pid_ns(current) != &init_pid_ns) 1088 return -EINVAL; 1089 1090 val = config->ctxid_mask; 1091 return sprintf(buf, "%#lx\n", val); 1092} 1093 1094static ssize_t ctxid_mask_store(struct device *dev, 1095 struct device_attribute *attr, 1096 const char *buf, size_t size) 1097{ 1098 int ret; 1099 unsigned long val; 1100 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 1101 struct etm_config *config = &drvdata->config; 1102 1103 /* 1104 * Don't use contextID tracing if coming from a PID namespace. See 1105 * comment in ctxid_pid_store(). 1106 */ 1107 if (task_active_pid_ns(current) != &init_pid_ns) 1108 return -EINVAL; 1109 1110 ret = kstrtoul(buf, 16, &val); 1111 if (ret) 1112 return ret; 1113 1114 config->ctxid_mask = val; 1115 return size; 1116} 1117static DEVICE_ATTR_RW(ctxid_mask); 1118 1119static ssize_t sync_freq_show(struct device *dev, 1120 struct device_attribute *attr, char *buf) 1121{ 1122 unsigned long val; 1123 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 1124 struct etm_config *config = &drvdata->config; 1125 1126 val = config->sync_freq; 1127 return sprintf(buf, "%#lx\n", val); 1128} 1129 1130static ssize_t sync_freq_store(struct device *dev, 1131 struct device_attribute *attr, 1132 const char *buf, size_t size) 1133{ 1134 int ret; 1135 unsigned long val; 1136 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 1137 struct etm_config *config = &drvdata->config; 1138 1139 ret = kstrtoul(buf, 16, &val); 1140 if (ret) 1141 return ret; 1142 1143 config->sync_freq = val & ETM_SYNC_MASK; 1144 return size; 1145} 1146static DEVICE_ATTR_RW(sync_freq); 1147 1148static ssize_t timestamp_event_show(struct device *dev, 1149 struct device_attribute *attr, char *buf) 1150{ 1151 unsigned long val; 1152 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 1153 struct etm_config *config = &drvdata->config; 1154 1155 val = config->timestamp_event; 1156 return sprintf(buf, "%#lx\n", val); 1157} 1158 1159static ssize_t timestamp_event_store(struct device *dev, 1160 struct device_attribute *attr, 1161 const char *buf, size_t size) 1162{ 1163 int ret; 1164 unsigned long val; 1165 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 1166 struct etm_config *config = &drvdata->config; 1167 1168 ret = kstrtoul(buf, 16, &val); 1169 if (ret) 1170 return ret; 1171 1172 config->timestamp_event = val & ETM_EVENT_MASK; 1173 return size; 1174} 1175static DEVICE_ATTR_RW(timestamp_event); 1176 1177static ssize_t cpu_show(struct device *dev, 1178 struct device_attribute *attr, char *buf) 1179{ 1180 int val; 1181 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 1182 1183 val = drvdata->cpu; 1184 return scnprintf(buf, PAGE_SIZE, "%d\n", val); 1185 1186} 1187static DEVICE_ATTR_RO(cpu); 1188 1189static ssize_t traceid_show(struct device *dev, 1190 struct device_attribute *attr, char *buf) 1191{ 1192 unsigned long val; 1193 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 1194 1195 val = etm_get_trace_id(drvdata); 1196 1197 return sprintf(buf, "%#lx\n", val); 1198} 1199 1200static ssize_t traceid_store(struct device *dev, 1201 struct device_attribute *attr, 1202 const char *buf, size_t size) 1203{ 1204 int ret; 1205 unsigned long val; 1206 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); 1207 1208 ret = kstrtoul(buf, 16, &val); 1209 if (ret) 1210 return ret; 1211 1212 drvdata->traceid = val & ETM_TRACEID_MASK; 1213 return size; 1214} 1215static DEVICE_ATTR_RW(traceid); 1216 1217static struct attribute *coresight_etm_attrs[] = { 1218 &dev_attr_nr_addr_cmp.attr, 1219 &dev_attr_nr_cntr.attr, 1220 &dev_attr_nr_ctxid_cmp.attr, 1221 &dev_attr_etmsr.attr, 1222 &dev_attr_reset.attr, 1223 &dev_attr_mode.attr, 1224 &dev_attr_trigger_event.attr, 1225 &dev_attr_enable_event.attr, 1226 &dev_attr_fifofull_level.attr, 1227 &dev_attr_addr_idx.attr, 1228 &dev_attr_addr_single.attr, 1229 &dev_attr_addr_range.attr, 1230 &dev_attr_addr_start.attr, 1231 &dev_attr_addr_stop.attr, 1232 &dev_attr_addr_acctype.attr, 1233 &dev_attr_cntr_idx.attr, 1234 &dev_attr_cntr_rld_val.attr, 1235 &dev_attr_cntr_event.attr, 1236 &dev_attr_cntr_rld_event.attr, 1237 &dev_attr_cntr_val.attr, 1238 &dev_attr_seq_12_event.attr, 1239 &dev_attr_seq_21_event.attr, 1240 &dev_attr_seq_23_event.attr, 1241 &dev_attr_seq_31_event.attr, 1242 &dev_attr_seq_32_event.attr, 1243 &dev_attr_seq_13_event.attr, 1244 &dev_attr_seq_curr_state.attr, 1245 &dev_attr_ctxid_idx.attr, 1246 &dev_attr_ctxid_pid.attr, 1247 &dev_attr_ctxid_mask.attr, 1248 &dev_attr_sync_freq.attr, 1249 &dev_attr_timestamp_event.attr, 1250 &dev_attr_traceid.attr, 1251 &dev_attr_cpu.attr, 1252 NULL, 1253}; 1254 1255#define coresight_etm3x_reg(name, offset) \ 1256 coresight_simple_reg32(struct etm_drvdata, name, offset) 1257 1258coresight_etm3x_reg(etmccr, ETMCCR); 1259coresight_etm3x_reg(etmccer, ETMCCER); 1260coresight_etm3x_reg(etmscr, ETMSCR); 1261coresight_etm3x_reg(etmidr, ETMIDR); 1262coresight_etm3x_reg(etmcr, ETMCR); 1263coresight_etm3x_reg(etmtraceidr, ETMTRACEIDR); 1264coresight_etm3x_reg(etmteevr, ETMTEEVR); 1265coresight_etm3x_reg(etmtssvr, ETMTSSCR); 1266coresight_etm3x_reg(etmtecr1, ETMTECR1); 1267coresight_etm3x_reg(etmtecr2, ETMTECR2); 1268 1269static struct attribute *coresight_etm_mgmt_attrs[] = { 1270 &dev_attr_etmccr.attr, 1271 &dev_attr_etmccer.attr, 1272 &dev_attr_etmscr.attr, 1273 &dev_attr_etmidr.attr, 1274 &dev_attr_etmcr.attr, 1275 &dev_attr_etmtraceidr.attr, 1276 &dev_attr_etmteevr.attr, 1277 &dev_attr_etmtssvr.attr, 1278 &dev_attr_etmtecr1.attr, 1279 &dev_attr_etmtecr2.attr, 1280 NULL, 1281}; 1282 1283static const struct attribute_group coresight_etm_group = { 1284 .attrs = coresight_etm_attrs, 1285}; 1286 1287static const struct attribute_group coresight_etm_mgmt_group = { 1288 .attrs = coresight_etm_mgmt_attrs, 1289 .name = "mgmt", 1290}; 1291 1292const struct attribute_group *coresight_etm_groups[] = { 1293 &coresight_etm_group, 1294 &coresight_etm_mgmt_group, 1295 NULL, 1296};