1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2019 Linaro Limited, All rights reserved. 4 * Author: Mike Leach <mike.leach@linaro.org> 5 */ 6 7 #include <linux/atomic.h> 8 #include <linux/coresight.h> 9 #include <linux/device.h> 10 #include <linux/io.h> 11 #include <linux/kernel.h> 12 #include <linux/spinlock.h> 13 #include <linux/sysfs.h> 14 15 #include "coresight-cti.h" 16 17 /* 18 * Declare the number of static declared attribute groups 19 * Value includes groups + NULL value at end of table. 20 */ 21 #define CORESIGHT_CTI_STATIC_GROUPS_MAX 5 22 23 /* 24 * List of trigger signal type names. Match the constants declared in 25 * include\dt-bindings\arm\coresight-cti-dt.h 26 */ 27 static const char * const sig_type_names[] = { 28 "genio", /* GEN_IO */ 29 "intreq", /* GEN_INTREQ */ 30 "intack", /* GEN_INTACK */ 31 "haltreq", /* GEN_HALTREQ */ 32 "restartreq", /* GEN_RESTARTREQ */ 33 "pe_edbgreq", /* PE_EDBGREQ */ 34 "pe_dbgrestart",/* PE_DBGRESTART */ 35 "pe_ctiirq", /* PE_CTIIRQ */ 36 "pe_pmuirq", /* PE_PMUIRQ */ 37 "pe_dbgtrigger",/* PE_DBGTRIGGER */ 38 "etm_extout", /* ETM_EXTOUT */ 39 "etm_extin", /* ETM_EXTIN */ 40 "snk_full", /* SNK_FULL */ 41 "snk_acqcomp", /* SNK_ACQCOMP */ 42 "snk_flushcomp",/* SNK_FLUSHCOMP */ 43 "snk_flushin", /* SNK_FLUSHIN */ 44 "snk_trigin", /* SNK_TRIGIN */ 45 "stm_asyncout", /* STM_ASYNCOUT */ 46 "stm_tout_spte",/* STM_TOUT_SPTE */ 47 "stm_tout_sw", /* STM_TOUT_SW */ 48 "stm_tout_hete",/* STM_TOUT_HETE */ 49 "stm_hwevent", /* STM_HWEVENT */ 50 "ela_tstart", /* ELA_TSTART */ 51 "ela_tstop", /* ELA_TSTOP */ 52 "ela_dbgreq", /* ELA_DBGREQ */ 53 }; 54 55 /* Show function pointer used in the connections dynamic declared attributes*/ 56 typedef ssize_t (*p_show_fn)(struct device *dev, struct device_attribute *attr, 57 char *buf); 58 59 /* Connection attribute types */ 60 enum cti_conn_attr_type { 61 CTI_CON_ATTR_NAME, 62 CTI_CON_ATTR_TRIGIN_SIG, 63 CTI_CON_ATTR_TRIGOUT_SIG, 64 CTI_CON_ATTR_TRIGIN_TYPES, 65 CTI_CON_ATTR_TRIGOUT_TYPES, 66 CTI_CON_ATTR_MAX, 67 }; 68 69 /* Names for the connection attributes */ 70 static const char * const con_attr_names[CTI_CON_ATTR_MAX] = { 71 "name", 72 "in_signals", 73 "out_signals", 74 "in_types", 75 "out_types", 76 }; 77 78 /* basic attributes */ 79 static ssize_t enable_show(struct device *dev, 80 struct device_attribute *attr, 81 char *buf) 82 { 83 int enable_req; 84 bool enabled, powered; 85 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 86 87 enable_req = atomic_read(&drvdata->config.enable_req_count); 88 spin_lock(&drvdata->spinlock); 89 powered = drvdata->config.hw_powered; 90 enabled = drvdata->config.hw_enabled; 91 spin_unlock(&drvdata->spinlock); 92 93 if (powered) 94 return sprintf(buf, "%d\n", enabled); 95 else 96 return sprintf(buf, "%d\n", !!enable_req); 97 } 98 99 static ssize_t enable_store(struct device *dev, 100 struct device_attribute *attr, 101 const char *buf, size_t size) 102 { 103 int ret = 0; 104 unsigned long val; 105 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 106 107 ret = kstrtoul(buf, 0, &val); 108 if (ret) 109 return ret; 110 111 if (val) 112 ret = cti_enable(drvdata->csdev); 113 else 114 ret = cti_disable(drvdata->csdev); 115 if (ret) 116 return ret; 117 return size; 118 } 119 static DEVICE_ATTR_RW(enable); 120 121 static ssize_t powered_show(struct device *dev, 122 struct device_attribute *attr, 123 char *buf) 124 { 125 bool powered; 126 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 127 128 spin_lock(&drvdata->spinlock); 129 powered = drvdata->config.hw_powered; 130 spin_unlock(&drvdata->spinlock); 131 132 return sprintf(buf, "%d\n", powered); 133 } 134 static DEVICE_ATTR_RO(powered); 135 136 static ssize_t ctmid_show(struct device *dev, 137 struct device_attribute *attr, char *buf) 138 { 139 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 140 141 return sprintf(buf, "%d\n", drvdata->ctidev.ctm_id); 142 } 143 static DEVICE_ATTR_RO(ctmid); 144 145 static ssize_t nr_trigger_cons_show(struct device *dev, 146 struct device_attribute *attr, 147 char *buf) 148 { 149 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 150 151 return sprintf(buf, "%d\n", drvdata->ctidev.nr_trig_con); 152 } 153 static DEVICE_ATTR_RO(nr_trigger_cons); 154 155 /* attribute and group sysfs tables. */ 156 static struct attribute *coresight_cti_attrs[] = { 157 &dev_attr_enable.attr, 158 &dev_attr_powered.attr, 159 &dev_attr_ctmid.attr, 160 &dev_attr_nr_trigger_cons.attr, 161 NULL, 162 }; 163 164 /* register based attributes */ 165 166 /* Read registers with power check only (no enable check). */ 167 static ssize_t coresight_cti_reg_show(struct device *dev, 168 struct device_attribute *attr, char *buf) 169 { 170 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 171 struct cs_off_attribute *cti_attr = container_of(attr, struct cs_off_attribute, attr); 172 u32 val = 0; 173 174 pm_runtime_get_sync(dev->parent); 175 spin_lock(&drvdata->spinlock); 176 if (drvdata->config.hw_powered) 177 val = readl_relaxed(drvdata->base + cti_attr->off); 178 spin_unlock(&drvdata->spinlock); 179 pm_runtime_put_sync(dev->parent); 180 return sysfs_emit(buf, "0x%x\n", val); 181 } 182 183 /* Write registers with power check only (no enable check). */ 184 static __maybe_unused ssize_t coresight_cti_reg_store(struct device *dev, 185 struct device_attribute *attr, 186 const char *buf, size_t size) 187 { 188 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 189 struct cs_off_attribute *cti_attr = container_of(attr, struct cs_off_attribute, attr); 190 unsigned long val = 0; 191 192 if (kstrtoul(buf, 0, &val)) 193 return -EINVAL; 194 195 pm_runtime_get_sync(dev->parent); 196 spin_lock(&drvdata->spinlock); 197 if (drvdata->config.hw_powered) 198 cti_write_single_reg(drvdata, cti_attr->off, val); 199 spin_unlock(&drvdata->spinlock); 200 pm_runtime_put_sync(dev->parent); 201 return size; 202 } 203 204 #define coresight_cti_reg(name, offset) \ 205 (&((struct cs_off_attribute[]) { \ 206 { \ 207 __ATTR(name, 0444, coresight_cti_reg_show, NULL), \ 208 offset \ 209 } \ 210 })[0].attr.attr) 211 212 #define coresight_cti_reg_rw(name, offset) \ 213 (&((struct cs_off_attribute[]) { \ 214 { \ 215 __ATTR(name, 0644, coresight_cti_reg_show, \ 216 coresight_cti_reg_store), \ 217 offset \ 218 } \ 219 })[0].attr.attr) 220 221 #define coresight_cti_reg_wo(name, offset) \ 222 (&((struct cs_off_attribute[]) { \ 223 { \ 224 __ATTR(name, 0200, NULL, coresight_cti_reg_store), \ 225 offset \ 226 } \ 227 })[0].attr.attr) 228 229 /* coresight management registers */ 230 static struct attribute *coresight_cti_mgmt_attrs[] = { 231 coresight_cti_reg(devaff0, CTIDEVAFF0), 232 coresight_cti_reg(devaff1, CTIDEVAFF1), 233 coresight_cti_reg(authstatus, CORESIGHT_AUTHSTATUS), 234 coresight_cti_reg(devarch, CORESIGHT_DEVARCH), 235 coresight_cti_reg(devid, CORESIGHT_DEVID), 236 coresight_cti_reg(devtype, CORESIGHT_DEVTYPE), 237 coresight_cti_reg(pidr0, CORESIGHT_PERIPHIDR0), 238 coresight_cti_reg(pidr1, CORESIGHT_PERIPHIDR1), 239 coresight_cti_reg(pidr2, CORESIGHT_PERIPHIDR2), 240 coresight_cti_reg(pidr3, CORESIGHT_PERIPHIDR3), 241 coresight_cti_reg(pidr4, CORESIGHT_PERIPHIDR4), 242 NULL, 243 }; 244 245 /* CTI low level programming registers */ 246 247 /* 248 * Show a simple 32 bit value if enabled and powered. 249 * If inaccessible & pcached_val not NULL then show cached value. 250 */ 251 static ssize_t cti_reg32_show(struct device *dev, char *buf, 252 u32 *pcached_val, int reg_offset) 253 { 254 u32 val = 0; 255 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 256 struct cti_config *config = &drvdata->config; 257 258 spin_lock(&drvdata->spinlock); 259 if ((reg_offset >= 0) && cti_active(config)) { 260 CS_UNLOCK(drvdata->base); 261 val = readl_relaxed(drvdata->base + reg_offset); 262 if (pcached_val) 263 *pcached_val = val; 264 CS_LOCK(drvdata->base); 265 } else if (pcached_val) { 266 val = *pcached_val; 267 } 268 spin_unlock(&drvdata->spinlock); 269 return sprintf(buf, "%#x\n", val); 270 } 271 272 /* 273 * Store a simple 32 bit value. 274 * If pcached_val not NULL, then copy to here too, 275 * if reg_offset >= 0 then write through if enabled. 276 */ 277 static ssize_t cti_reg32_store(struct device *dev, const char *buf, 278 size_t size, u32 *pcached_val, int reg_offset) 279 { 280 unsigned long val; 281 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 282 struct cti_config *config = &drvdata->config; 283 284 if (kstrtoul(buf, 0, &val)) 285 return -EINVAL; 286 287 spin_lock(&drvdata->spinlock); 288 /* local store */ 289 if (pcached_val) 290 *pcached_val = (u32)val; 291 292 /* write through if offset and enabled */ 293 if ((reg_offset >= 0) && cti_active(config)) 294 cti_write_single_reg(drvdata, reg_offset, val); 295 spin_unlock(&drvdata->spinlock); 296 return size; 297 } 298 299 /* Standard macro for simple rw cti config registers */ 300 #define cti_config_reg32_rw(name, cfgname, offset) \ 301 static ssize_t name##_show(struct device *dev, \ 302 struct device_attribute *attr, \ 303 char *buf) \ 304 { \ 305 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); \ 306 return cti_reg32_show(dev, buf, \ 307 &drvdata->config.cfgname, offset); \ 308 } \ 309 \ 310 static ssize_t name##_store(struct device *dev, \ 311 struct device_attribute *attr, \ 312 const char *buf, size_t size) \ 313 { \ 314 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); \ 315 return cti_reg32_store(dev, buf, size, \ 316 &drvdata->config.cfgname, offset); \ 317 } \ 318 static DEVICE_ATTR_RW(name) 319 320 static ssize_t inout_sel_show(struct device *dev, 321 struct device_attribute *attr, 322 char *buf) 323 { 324 u32 val; 325 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 326 327 val = (u32)drvdata->config.ctiinout_sel; 328 return sprintf(buf, "%d\n", val); 329 } 330 331 static ssize_t inout_sel_store(struct device *dev, 332 struct device_attribute *attr, 333 const char *buf, size_t size) 334 { 335 unsigned long val; 336 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 337 338 if (kstrtoul(buf, 0, &val)) 339 return -EINVAL; 340 if (val > (CTIINOUTEN_MAX - 1)) 341 return -EINVAL; 342 343 spin_lock(&drvdata->spinlock); 344 drvdata->config.ctiinout_sel = val; 345 spin_unlock(&drvdata->spinlock); 346 return size; 347 } 348 static DEVICE_ATTR_RW(inout_sel); 349 350 static ssize_t inen_show(struct device *dev, 351 struct device_attribute *attr, 352 char *buf) 353 { 354 unsigned long val; 355 int index; 356 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 357 358 spin_lock(&drvdata->spinlock); 359 index = drvdata->config.ctiinout_sel; 360 val = drvdata->config.ctiinen[index]; 361 spin_unlock(&drvdata->spinlock); 362 return sprintf(buf, "%#lx\n", val); 363 } 364 365 static ssize_t inen_store(struct device *dev, 366 struct device_attribute *attr, 367 const char *buf, size_t size) 368 { 369 unsigned long val; 370 int index; 371 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 372 struct cti_config *config = &drvdata->config; 373 374 if (kstrtoul(buf, 0, &val)) 375 return -EINVAL; 376 377 spin_lock(&drvdata->spinlock); 378 index = config->ctiinout_sel; 379 config->ctiinen[index] = val; 380 381 /* write through if enabled */ 382 if (cti_active(config)) 383 cti_write_single_reg(drvdata, CTIINEN(index), val); 384 spin_unlock(&drvdata->spinlock); 385 return size; 386 } 387 static DEVICE_ATTR_RW(inen); 388 389 static ssize_t outen_show(struct device *dev, 390 struct device_attribute *attr, 391 char *buf) 392 { 393 unsigned long val; 394 int index; 395 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 396 397 spin_lock(&drvdata->spinlock); 398 index = drvdata->config.ctiinout_sel; 399 val = drvdata->config.ctiouten[index]; 400 spin_unlock(&drvdata->spinlock); 401 return sprintf(buf, "%#lx\n", val); 402 } 403 404 static ssize_t outen_store(struct device *dev, 405 struct device_attribute *attr, 406 const char *buf, size_t size) 407 { 408 unsigned long val; 409 int index; 410 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 411 struct cti_config *config = &drvdata->config; 412 413 if (kstrtoul(buf, 0, &val)) 414 return -EINVAL; 415 416 spin_lock(&drvdata->spinlock); 417 index = config->ctiinout_sel; 418 config->ctiouten[index] = val; 419 420 /* write through if enabled */ 421 if (cti_active(config)) 422 cti_write_single_reg(drvdata, CTIOUTEN(index), val); 423 spin_unlock(&drvdata->spinlock); 424 return size; 425 } 426 static DEVICE_ATTR_RW(outen); 427 428 static ssize_t intack_store(struct device *dev, 429 struct device_attribute *attr, 430 const char *buf, size_t size) 431 { 432 unsigned long val; 433 434 if (kstrtoul(buf, 0, &val)) 435 return -EINVAL; 436 437 cti_write_intack(dev, val); 438 return size; 439 } 440 static DEVICE_ATTR_WO(intack); 441 442 cti_config_reg32_rw(gate, ctigate, CTIGATE); 443 cti_config_reg32_rw(asicctl, asicctl, ASICCTL); 444 cti_config_reg32_rw(appset, ctiappset, CTIAPPSET); 445 446 static ssize_t appclear_store(struct device *dev, 447 struct device_attribute *attr, 448 const char *buf, size_t size) 449 { 450 unsigned long val; 451 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 452 struct cti_config *config = &drvdata->config; 453 454 if (kstrtoul(buf, 0, &val)) 455 return -EINVAL; 456 457 spin_lock(&drvdata->spinlock); 458 459 /* a 1'b1 in appclr clears down the same bit in appset*/ 460 config->ctiappset &= ~val; 461 462 /* write through if enabled */ 463 if (cti_active(config)) 464 cti_write_single_reg(drvdata, CTIAPPCLEAR, val); 465 spin_unlock(&drvdata->spinlock); 466 return size; 467 } 468 static DEVICE_ATTR_WO(appclear); 469 470 static ssize_t apppulse_store(struct device *dev, 471 struct device_attribute *attr, 472 const char *buf, size_t size) 473 { 474 unsigned long val; 475 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 476 struct cti_config *config = &drvdata->config; 477 478 if (kstrtoul(buf, 0, &val)) 479 return -EINVAL; 480 481 spin_lock(&drvdata->spinlock); 482 483 /* write through if enabled */ 484 if (cti_active(config)) 485 cti_write_single_reg(drvdata, CTIAPPPULSE, val); 486 spin_unlock(&drvdata->spinlock); 487 return size; 488 } 489 static DEVICE_ATTR_WO(apppulse); 490 491 /* 492 * Define CONFIG_CORESIGHT_CTI_INTEGRATION_REGS to enable the access to the 493 * integration control registers. Normally only used to investigate connection 494 * data. 495 */ 496 static struct attribute *coresight_cti_regs_attrs[] = { 497 &dev_attr_inout_sel.attr, 498 &dev_attr_inen.attr, 499 &dev_attr_outen.attr, 500 &dev_attr_gate.attr, 501 &dev_attr_asicctl.attr, 502 &dev_attr_intack.attr, 503 &dev_attr_appset.attr, 504 &dev_attr_appclear.attr, 505 &dev_attr_apppulse.attr, 506 coresight_cti_reg(triginstatus, CTITRIGINSTATUS), 507 coresight_cti_reg(trigoutstatus, CTITRIGOUTSTATUS), 508 coresight_cti_reg(chinstatus, CTICHINSTATUS), 509 coresight_cti_reg(choutstatus, CTICHOUTSTATUS), 510 #ifdef CONFIG_CORESIGHT_CTI_INTEGRATION_REGS 511 coresight_cti_reg_rw(itctrl, CORESIGHT_ITCTRL), 512 coresight_cti_reg(ittrigin, ITTRIGIN), 513 coresight_cti_reg(itchin, ITCHIN), 514 coresight_cti_reg_rw(ittrigout, ITTRIGOUT), 515 coresight_cti_reg_rw(itchout, ITCHOUT), 516 coresight_cti_reg(itchoutack, ITCHOUTACK), 517 coresight_cti_reg(ittrigoutack, ITTRIGOUTACK), 518 coresight_cti_reg_wo(ittriginack, ITTRIGINACK), 519 coresight_cti_reg_wo(itchinack, ITCHINACK), 520 #endif 521 NULL, 522 }; 523 524 /* CTI channel x-trigger programming */ 525 static int 526 cti_trig_op_parse(struct device *dev, enum cti_chan_op op, 527 enum cti_trig_dir dir, const char *buf, size_t size) 528 { 529 u32 chan_idx; 530 u32 trig_idx; 531 int items, err = -EINVAL; 532 533 /* extract chan idx and trigger idx */ 534 items = sscanf(buf, "%d %d", &chan_idx, &trig_idx); 535 if (items == 2) { 536 err = cti_channel_trig_op(dev, op, dir, chan_idx, trig_idx); 537 if (!err) 538 err = size; 539 } 540 return err; 541 } 542 543 static ssize_t trigin_attach_store(struct device *dev, 544 struct device_attribute *attr, 545 const char *buf, size_t size) 546 { 547 return cti_trig_op_parse(dev, CTI_CHAN_ATTACH, CTI_TRIG_IN, 548 buf, size); 549 } 550 static DEVICE_ATTR_WO(trigin_attach); 551 552 static ssize_t trigin_detach_store(struct device *dev, 553 struct device_attribute *attr, 554 const char *buf, size_t size) 555 { 556 return cti_trig_op_parse(dev, CTI_CHAN_DETACH, CTI_TRIG_IN, 557 buf, size); 558 } 559 static DEVICE_ATTR_WO(trigin_detach); 560 561 static ssize_t trigout_attach_store(struct device *dev, 562 struct device_attribute *attr, 563 const char *buf, size_t size) 564 { 565 return cti_trig_op_parse(dev, CTI_CHAN_ATTACH, CTI_TRIG_OUT, 566 buf, size); 567 } 568 static DEVICE_ATTR_WO(trigout_attach); 569 570 static ssize_t trigout_detach_store(struct device *dev, 571 struct device_attribute *attr, 572 const char *buf, size_t size) 573 { 574 return cti_trig_op_parse(dev, CTI_CHAN_DETACH, CTI_TRIG_OUT, 575 buf, size); 576 } 577 static DEVICE_ATTR_WO(trigout_detach); 578 579 580 static ssize_t chan_gate_enable_store(struct device *dev, 581 struct device_attribute *attr, 582 const char *buf, size_t size) 583 { 584 int err = 0, channel = 0; 585 586 if (kstrtoint(buf, 0, &channel)) 587 return -EINVAL; 588 589 err = cti_channel_gate_op(dev, CTI_GATE_CHAN_ENABLE, channel); 590 return err ? err : size; 591 } 592 593 static ssize_t chan_gate_enable_show(struct device *dev, 594 struct device_attribute *attr, 595 char *buf) 596 { 597 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 598 struct cti_config *cfg = &drvdata->config; 599 unsigned long ctigate_bitmask = cfg->ctigate; 600 int size = 0; 601 602 if (cfg->ctigate == 0) 603 size = sprintf(buf, "\n"); 604 else 605 size = bitmap_print_to_pagebuf(true, buf, &ctigate_bitmask, 606 cfg->nr_ctm_channels); 607 return size; 608 } 609 static DEVICE_ATTR_RW(chan_gate_enable); 610 611 static ssize_t chan_gate_disable_store(struct device *dev, 612 struct device_attribute *attr, 613 const char *buf, size_t size) 614 { 615 int err = 0, channel = 0; 616 617 if (kstrtoint(buf, 0, &channel)) 618 return -EINVAL; 619 620 err = cti_channel_gate_op(dev, CTI_GATE_CHAN_DISABLE, channel); 621 return err ? err : size; 622 } 623 static DEVICE_ATTR_WO(chan_gate_disable); 624 625 static int 626 chan_op_parse(struct device *dev, enum cti_chan_set_op op, const char *buf) 627 { 628 int err = 0, channel = 0; 629 630 if (kstrtoint(buf, 0, &channel)) 631 return -EINVAL; 632 633 err = cti_channel_setop(dev, op, channel); 634 return err; 635 636 } 637 638 static ssize_t chan_set_store(struct device *dev, 639 struct device_attribute *attr, 640 const char *buf, size_t size) 641 { 642 int err = chan_op_parse(dev, CTI_CHAN_SET, buf); 643 644 return err ? err : size; 645 } 646 static DEVICE_ATTR_WO(chan_set); 647 648 static ssize_t chan_clear_store(struct device *dev, 649 struct device_attribute *attr, 650 const char *buf, size_t size) 651 { 652 int err = chan_op_parse(dev, CTI_CHAN_CLR, buf); 653 654 return err ? err : size; 655 } 656 static DEVICE_ATTR_WO(chan_clear); 657 658 static ssize_t chan_pulse_store(struct device *dev, 659 struct device_attribute *attr, 660 const char *buf, size_t size) 661 { 662 int err = chan_op_parse(dev, CTI_CHAN_PULSE, buf); 663 664 return err ? err : size; 665 } 666 static DEVICE_ATTR_WO(chan_pulse); 667 668 static ssize_t trig_filter_enable_show(struct device *dev, 669 struct device_attribute *attr, 670 char *buf) 671 { 672 u32 val; 673 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 674 675 spin_lock(&drvdata->spinlock); 676 val = drvdata->config.trig_filter_enable; 677 spin_unlock(&drvdata->spinlock); 678 return sprintf(buf, "%d\n", val); 679 } 680 681 static ssize_t trig_filter_enable_store(struct device *dev, 682 struct device_attribute *attr, 683 const char *buf, size_t size) 684 { 685 unsigned long val; 686 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 687 688 if (kstrtoul(buf, 0, &val)) 689 return -EINVAL; 690 691 spin_lock(&drvdata->spinlock); 692 drvdata->config.trig_filter_enable = !!val; 693 spin_unlock(&drvdata->spinlock); 694 return size; 695 } 696 static DEVICE_ATTR_RW(trig_filter_enable); 697 698 static ssize_t trigout_filtered_show(struct device *dev, 699 struct device_attribute *attr, 700 char *buf) 701 { 702 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 703 struct cti_config *cfg = &drvdata->config; 704 int size = 0, nr_trig_max = cfg->nr_trig_max; 705 unsigned long mask = cfg->trig_out_filter; 706 707 if (mask) 708 size = bitmap_print_to_pagebuf(true, buf, &mask, nr_trig_max); 709 return size; 710 } 711 static DEVICE_ATTR_RO(trigout_filtered); 712 713 /* clear all xtrigger / channel programming */ 714 static ssize_t chan_xtrigs_reset_store(struct device *dev, 715 struct device_attribute *attr, 716 const char *buf, size_t size) 717 { 718 int i; 719 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 720 struct cti_config *config = &drvdata->config; 721 722 spin_lock(&drvdata->spinlock); 723 724 /* clear the CTI trigger / channel programming registers */ 725 for (i = 0; i < config->nr_trig_max; i++) { 726 config->ctiinen[i] = 0; 727 config->ctiouten[i] = 0; 728 } 729 730 /* clear the other regs */ 731 config->ctigate = GENMASK(config->nr_ctm_channels - 1, 0); 732 config->asicctl = 0; 733 config->ctiappset = 0; 734 config->ctiinout_sel = 0; 735 config->xtrig_rchan_sel = 0; 736 737 /* if enabled then write through */ 738 if (cti_active(config)) 739 cti_write_all_hw_regs(drvdata); 740 741 spin_unlock(&drvdata->spinlock); 742 return size; 743 } 744 static DEVICE_ATTR_WO(chan_xtrigs_reset); 745 746 /* 747 * Write to select a channel to view, read to display the 748 * cross triggers for the selected channel. 749 */ 750 static ssize_t chan_xtrigs_sel_store(struct device *dev, 751 struct device_attribute *attr, 752 const char *buf, size_t size) 753 { 754 unsigned long val; 755 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 756 757 if (kstrtoul(buf, 0, &val)) 758 return -EINVAL; 759 if (val > (drvdata->config.nr_ctm_channels - 1)) 760 return -EINVAL; 761 762 spin_lock(&drvdata->spinlock); 763 drvdata->config.xtrig_rchan_sel = val; 764 spin_unlock(&drvdata->spinlock); 765 return size; 766 } 767 768 static ssize_t chan_xtrigs_sel_show(struct device *dev, 769 struct device_attribute *attr, 770 char *buf) 771 { 772 unsigned long val; 773 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 774 775 spin_lock(&drvdata->spinlock); 776 val = drvdata->config.xtrig_rchan_sel; 777 spin_unlock(&drvdata->spinlock); 778 779 return sprintf(buf, "%ld\n", val); 780 } 781 static DEVICE_ATTR_RW(chan_xtrigs_sel); 782 783 static ssize_t chan_xtrigs_in_show(struct device *dev, 784 struct device_attribute *attr, 785 char *buf) 786 { 787 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 788 struct cti_config *cfg = &drvdata->config; 789 int used = 0, reg_idx; 790 int nr_trig_max = drvdata->config.nr_trig_max; 791 u32 chan_mask = BIT(cfg->xtrig_rchan_sel); 792 793 for (reg_idx = 0; reg_idx < nr_trig_max; reg_idx++) { 794 if (chan_mask & cfg->ctiinen[reg_idx]) 795 used += sprintf(buf + used, "%d ", reg_idx); 796 } 797 798 used += sprintf(buf + used, "\n"); 799 return used; 800 } 801 static DEVICE_ATTR_RO(chan_xtrigs_in); 802 803 static ssize_t chan_xtrigs_out_show(struct device *dev, 804 struct device_attribute *attr, 805 char *buf) 806 { 807 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 808 struct cti_config *cfg = &drvdata->config; 809 int used = 0, reg_idx; 810 int nr_trig_max = drvdata->config.nr_trig_max; 811 u32 chan_mask = BIT(cfg->xtrig_rchan_sel); 812 813 for (reg_idx = 0; reg_idx < nr_trig_max; reg_idx++) { 814 if (chan_mask & cfg->ctiouten[reg_idx]) 815 used += sprintf(buf + used, "%d ", reg_idx); 816 } 817 818 used += sprintf(buf + used, "\n"); 819 return used; 820 } 821 static DEVICE_ATTR_RO(chan_xtrigs_out); 822 823 static ssize_t print_chan_list(struct device *dev, 824 char *buf, bool inuse) 825 { 826 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 827 struct cti_config *config = &drvdata->config; 828 int size, i; 829 unsigned long inuse_bits = 0, chan_mask; 830 831 /* scan regs to get bitmap of channels in use. */ 832 spin_lock(&drvdata->spinlock); 833 for (i = 0; i < config->nr_trig_max; i++) { 834 inuse_bits |= config->ctiinen[i]; 835 inuse_bits |= config->ctiouten[i]; 836 } 837 spin_unlock(&drvdata->spinlock); 838 839 /* inverse bits if printing free channels */ 840 if (!inuse) 841 inuse_bits = ~inuse_bits; 842 843 /* list of channels, or 'none' */ 844 chan_mask = GENMASK(config->nr_ctm_channels - 1, 0); 845 if (inuse_bits & chan_mask) 846 size = bitmap_print_to_pagebuf(true, buf, &inuse_bits, 847 config->nr_ctm_channels); 848 else 849 size = sprintf(buf, "\n"); 850 return size; 851 } 852 853 static ssize_t chan_inuse_show(struct device *dev, 854 struct device_attribute *attr, 855 char *buf) 856 { 857 return print_chan_list(dev, buf, true); 858 } 859 static DEVICE_ATTR_RO(chan_inuse); 860 861 static ssize_t chan_free_show(struct device *dev, 862 struct device_attribute *attr, 863 char *buf) 864 { 865 return print_chan_list(dev, buf, false); 866 } 867 static DEVICE_ATTR_RO(chan_free); 868 869 static struct attribute *coresight_cti_channel_attrs[] = { 870 &dev_attr_trigin_attach.attr, 871 &dev_attr_trigin_detach.attr, 872 &dev_attr_trigout_attach.attr, 873 &dev_attr_trigout_detach.attr, 874 &dev_attr_trig_filter_enable.attr, 875 &dev_attr_trigout_filtered.attr, 876 &dev_attr_chan_gate_enable.attr, 877 &dev_attr_chan_gate_disable.attr, 878 &dev_attr_chan_set.attr, 879 &dev_attr_chan_clear.attr, 880 &dev_attr_chan_pulse.attr, 881 &dev_attr_chan_inuse.attr, 882 &dev_attr_chan_free.attr, 883 &dev_attr_chan_xtrigs_sel.attr, 884 &dev_attr_chan_xtrigs_in.attr, 885 &dev_attr_chan_xtrigs_out.attr, 886 &dev_attr_chan_xtrigs_reset.attr, 887 NULL, 888 }; 889 890 /* Create the connections trigger groups and attrs dynamically */ 891 /* 892 * Each connection has dynamic group triggers<N> + name, trigin/out sigs/types 893 * attributes, + each device has static nr_trigger_cons giving the number 894 * of groups. e.g. in sysfs:- 895 * /cti_<name>/triggers0 896 * /cti_<name>/triggers1 897 * /cti_<name>/nr_trigger_cons 898 * where nr_trigger_cons = 2 899 */ 900 static ssize_t con_name_show(struct device *dev, 901 struct device_attribute *attr, 902 char *buf) 903 { 904 struct dev_ext_attribute *ext_attr = 905 container_of(attr, struct dev_ext_attribute, attr); 906 struct cti_trig_con *con = (struct cti_trig_con *)ext_attr->var; 907 908 return sprintf(buf, "%s\n", con->con_dev_name); 909 } 910 911 static ssize_t trigin_sig_show(struct device *dev, 912 struct device_attribute *attr, 913 char *buf) 914 { 915 struct dev_ext_attribute *ext_attr = 916 container_of(attr, struct dev_ext_attribute, attr); 917 struct cti_trig_con *con = (struct cti_trig_con *)ext_attr->var; 918 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 919 struct cti_config *cfg = &drvdata->config; 920 unsigned long mask = con->con_in->used_mask; 921 922 return bitmap_print_to_pagebuf(true, buf, &mask, cfg->nr_trig_max); 923 } 924 925 static ssize_t trigout_sig_show(struct device *dev, 926 struct device_attribute *attr, 927 char *buf) 928 { 929 struct dev_ext_attribute *ext_attr = 930 container_of(attr, struct dev_ext_attribute, attr); 931 struct cti_trig_con *con = (struct cti_trig_con *)ext_attr->var; 932 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); 933 struct cti_config *cfg = &drvdata->config; 934 unsigned long mask = con->con_out->used_mask; 935 936 return bitmap_print_to_pagebuf(true, buf, &mask, cfg->nr_trig_max); 937 } 938 939 /* convert a sig type id to a name */ 940 static const char * 941 cti_sig_type_name(struct cti_trig_con *con, int used_count, bool in) 942 { 943 int idx = 0; 944 struct cti_trig_grp *grp = in ? con->con_in : con->con_out; 945 946 if (used_count < grp->nr_sigs) 947 idx = grp->sig_types[used_count]; 948 return sig_type_names[idx]; 949 } 950 951 static ssize_t trigin_type_show(struct device *dev, 952 struct device_attribute *attr, 953 char *buf) 954 { 955 struct dev_ext_attribute *ext_attr = 956 container_of(attr, struct dev_ext_attribute, attr); 957 struct cti_trig_con *con = (struct cti_trig_con *)ext_attr->var; 958 int sig_idx, used = 0; 959 const char *name; 960 961 for (sig_idx = 0; sig_idx < con->con_in->nr_sigs; sig_idx++) { 962 name = cti_sig_type_name(con, sig_idx, true); 963 used += sprintf(buf + used, "%s ", name); 964 } 965 used += sprintf(buf + used, "\n"); 966 return used; 967 } 968 969 static ssize_t trigout_type_show(struct device *dev, 970 struct device_attribute *attr, 971 char *buf) 972 { 973 struct dev_ext_attribute *ext_attr = 974 container_of(attr, struct dev_ext_attribute, attr); 975 struct cti_trig_con *con = (struct cti_trig_con *)ext_attr->var; 976 int sig_idx, used = 0; 977 const char *name; 978 979 for (sig_idx = 0; sig_idx < con->con_out->nr_sigs; sig_idx++) { 980 name = cti_sig_type_name(con, sig_idx, false); 981 used += sprintf(buf + used, "%s ", name); 982 } 983 used += sprintf(buf + used, "\n"); 984 return used; 985 } 986 987 /* 988 * Array of show function names declared above to allow selection 989 * for the connection attributes 990 */ 991 static p_show_fn show_fns[CTI_CON_ATTR_MAX] = { 992 con_name_show, 993 trigin_sig_show, 994 trigout_sig_show, 995 trigin_type_show, 996 trigout_type_show, 997 }; 998 999 static int cti_create_con_sysfs_attr(struct device *dev, 1000 struct cti_trig_con *con, 1001 enum cti_conn_attr_type attr_type, 1002 int attr_idx) 1003 { 1004 struct dev_ext_attribute *eattr; 1005 char *name; 1006 1007 eattr = devm_kzalloc(dev, sizeof(struct dev_ext_attribute), 1008 GFP_KERNEL); 1009 if (eattr) { 1010 name = devm_kstrdup(dev, con_attr_names[attr_type], 1011 GFP_KERNEL); 1012 if (name) { 1013 /* fill out the underlying attribute struct */ 1014 eattr->attr.attr.name = name; 1015 eattr->attr.attr.mode = 0444; 1016 1017 /* now the device_attribute struct */ 1018 eattr->attr.show = show_fns[attr_type]; 1019 } else { 1020 return -ENOMEM; 1021 } 1022 } else { 1023 return -ENOMEM; 1024 } 1025 eattr->var = con; 1026 con->con_attrs[attr_idx] = &eattr->attr.attr; 1027 /* 1028 * Initialize the dynamically allocated attribute 1029 * to avoid LOCKDEP splat. See include/linux/sysfs.h 1030 * for more details. 1031 */ 1032 sysfs_attr_init(con->con_attrs[attr_idx]); 1033 1034 return 0; 1035 } 1036 1037 static struct attribute_group * 1038 cti_create_con_sysfs_group(struct device *dev, struct cti_device *ctidev, 1039 int con_idx, struct cti_trig_con *tc) 1040 { 1041 struct attribute_group *group = NULL; 1042 int grp_idx; 1043 1044 group = devm_kzalloc(dev, sizeof(struct attribute_group), GFP_KERNEL); 1045 if (!group) 1046 return NULL; 1047 1048 group->name = devm_kasprintf(dev, GFP_KERNEL, "triggers%d", con_idx); 1049 if (!group->name) 1050 return NULL; 1051 1052 grp_idx = con_idx + CORESIGHT_CTI_STATIC_GROUPS_MAX - 1; 1053 ctidev->con_groups[grp_idx] = group; 1054 tc->attr_group = group; 1055 return group; 1056 } 1057 1058 /* create a triggers connection group and the attributes for that group */ 1059 static int cti_create_con_attr_set(struct device *dev, int con_idx, 1060 struct cti_device *ctidev, 1061 struct cti_trig_con *tc) 1062 { 1063 struct attribute_group *attr_group = NULL; 1064 int attr_idx = 0; 1065 int err = -ENOMEM; 1066 1067 attr_group = cti_create_con_sysfs_group(dev, ctidev, con_idx, tc); 1068 if (!attr_group) 1069 return -ENOMEM; 1070 1071 /* allocate NULL terminated array of attributes */ 1072 tc->con_attrs = devm_kcalloc(dev, CTI_CON_ATTR_MAX + 1, 1073 sizeof(struct attribute *), GFP_KERNEL); 1074 if (!tc->con_attrs) 1075 return -ENOMEM; 1076 1077 err = cti_create_con_sysfs_attr(dev, tc, CTI_CON_ATTR_NAME, 1078 attr_idx++); 1079 if (err) 1080 return err; 1081 1082 if (tc->con_in->nr_sigs > 0) { 1083 err = cti_create_con_sysfs_attr(dev, tc, 1084 CTI_CON_ATTR_TRIGIN_SIG, 1085 attr_idx++); 1086 if (err) 1087 return err; 1088 1089 err = cti_create_con_sysfs_attr(dev, tc, 1090 CTI_CON_ATTR_TRIGIN_TYPES, 1091 attr_idx++); 1092 if (err) 1093 return err; 1094 } 1095 1096 if (tc->con_out->nr_sigs > 0) { 1097 err = cti_create_con_sysfs_attr(dev, tc, 1098 CTI_CON_ATTR_TRIGOUT_SIG, 1099 attr_idx++); 1100 if (err) 1101 return err; 1102 1103 err = cti_create_con_sysfs_attr(dev, tc, 1104 CTI_CON_ATTR_TRIGOUT_TYPES, 1105 attr_idx++); 1106 if (err) 1107 return err; 1108 } 1109 attr_group->attrs = tc->con_attrs; 1110 return 0; 1111 } 1112 1113 /* create the array of group pointers for the CTI sysfs groups */ 1114 static int cti_create_cons_groups(struct device *dev, struct cti_device *ctidev) 1115 { 1116 int nr_groups; 1117 1118 /* nr groups = dynamic + static + NULL terminator */ 1119 nr_groups = ctidev->nr_trig_con + CORESIGHT_CTI_STATIC_GROUPS_MAX; 1120 ctidev->con_groups = devm_kcalloc(dev, nr_groups, 1121 sizeof(struct attribute_group *), 1122 GFP_KERNEL); 1123 if (!ctidev->con_groups) 1124 return -ENOMEM; 1125 return 0; 1126 } 1127 1128 int cti_create_cons_sysfs(struct device *dev, struct cti_drvdata *drvdata) 1129 { 1130 struct cti_device *ctidev = &drvdata->ctidev; 1131 int err, con_idx = 0, i; 1132 struct cti_trig_con *tc; 1133 1134 err = cti_create_cons_groups(dev, ctidev); 1135 if (err) 1136 return err; 1137 1138 /* populate first locations with the static set of groups */ 1139 for (i = 0; i < (CORESIGHT_CTI_STATIC_GROUPS_MAX - 1); i++) 1140 ctidev->con_groups[i] = coresight_cti_groups[i]; 1141 1142 /* add dynamic set for each connection */ 1143 list_for_each_entry(tc, &ctidev->trig_cons, node) { 1144 err = cti_create_con_attr_set(dev, con_idx++, ctidev, tc); 1145 if (err) 1146 break; 1147 } 1148 return err; 1149 } 1150 1151 /* attribute and group sysfs tables. */ 1152 static const struct attribute_group coresight_cti_group = { 1153 .attrs = coresight_cti_attrs, 1154 }; 1155 1156 static const struct attribute_group coresight_cti_mgmt_group = { 1157 .attrs = coresight_cti_mgmt_attrs, 1158 .name = "mgmt", 1159 }; 1160 1161 static const struct attribute_group coresight_cti_regs_group = { 1162 .attrs = coresight_cti_regs_attrs, 1163 .name = "regs", 1164 }; 1165 1166 static const struct attribute_group coresight_cti_channels_group = { 1167 .attrs = coresight_cti_channel_attrs, 1168 .name = "channels", 1169 }; 1170 1171 const struct attribute_group * 1172 coresight_cti_groups[CORESIGHT_CTI_STATIC_GROUPS_MAX] = { 1173 &coresight_cti_group, 1174 &coresight_cti_mgmt_group, 1175 &coresight_cti_regs_group, 1176 &coresight_cti_channels_group, 1177 NULL, 1178 }; 1179