linux/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c
<<
>>
Prefs
   1/*
   2 * Copyright(C) 2015 Linaro Limited. All rights reserved.
   3 * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of the GNU General Public License version 2 as published by
   7 * the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that 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 * You should have received a copy of the GNU General Public License along with
  15 * this program.  If not, see <http://www.gnu.org/licenses/>.
  16 */
  17
  18#include <linux/pm_runtime.h>
  19#include <linux/sysfs.h>
  20#include "coresight-etm4x.h"
  21#include "coresight-priv.h"
  22
  23static int etm4_set_mode_exclude(struct etmv4_drvdata *drvdata, bool exclude)
  24{
  25        u8 idx;
  26        struct etmv4_config *config = &drvdata->config;
  27
  28        idx = config->addr_idx;
  29
  30        /*
  31         * TRCACATRn.TYPE bit[1:0]: type of comparison
  32         * the trace unit performs
  33         */
  34        if (BMVAL(config->addr_acc[idx], 0, 1) == ETM_INSTR_ADDR) {
  35                if (idx % 2 != 0)
  36                        return -EINVAL;
  37
  38                /*
  39                 * We are performing instruction address comparison. Set the
  40                 * relevant bit of ViewInst Include/Exclude Control register
  41                 * for corresponding address comparator pair.
  42                 */
  43                if (config->addr_type[idx] != ETM_ADDR_TYPE_RANGE ||
  44                    config->addr_type[idx + 1] != ETM_ADDR_TYPE_RANGE)
  45                        return -EINVAL;
  46
  47                if (exclude == true) {
  48                        /*
  49                         * Set exclude bit and unset the include bit
  50                         * corresponding to comparator pair
  51                         */
  52                        config->viiectlr |= BIT(idx / 2 + 16);
  53                        config->viiectlr &= ~BIT(idx / 2);
  54                } else {
  55                        /*
  56                         * Set include bit and unset exclude bit
  57                         * corresponding to comparator pair
  58                         */
  59                        config->viiectlr |= BIT(idx / 2);
  60                        config->viiectlr &= ~BIT(idx / 2 + 16);
  61                }
  62        }
  63        return 0;
  64}
  65
  66static ssize_t nr_pe_cmp_show(struct device *dev,
  67                              struct device_attribute *attr,
  68                              char *buf)
  69{
  70        unsigned long val;
  71        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
  72
  73        val = drvdata->nr_pe_cmp;
  74        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
  75}
  76static DEVICE_ATTR_RO(nr_pe_cmp);
  77
  78static ssize_t nr_addr_cmp_show(struct device *dev,
  79                                struct device_attribute *attr,
  80                                char *buf)
  81{
  82        unsigned long val;
  83        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
  84
  85        val = drvdata->nr_addr_cmp;
  86        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
  87}
  88static DEVICE_ATTR_RO(nr_addr_cmp);
  89
  90static ssize_t nr_cntr_show(struct device *dev,
  91                            struct device_attribute *attr,
  92                            char *buf)
  93{
  94        unsigned long val;
  95        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
  96
  97        val = drvdata->nr_cntr;
  98        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
  99}
 100static DEVICE_ATTR_RO(nr_cntr);
 101
 102static ssize_t nr_ext_inp_show(struct device *dev,
 103                               struct device_attribute *attr,
 104                               char *buf)
 105{
 106        unsigned long val;
 107        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 108
 109        val = drvdata->nr_ext_inp;
 110        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 111}
 112static DEVICE_ATTR_RO(nr_ext_inp);
 113
 114static ssize_t numcidc_show(struct device *dev,
 115                            struct device_attribute *attr,
 116                            char *buf)
 117{
 118        unsigned long val;
 119        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 120
 121        val = drvdata->numcidc;
 122        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 123}
 124static DEVICE_ATTR_RO(numcidc);
 125
 126static ssize_t numvmidc_show(struct device *dev,
 127                             struct device_attribute *attr,
 128                             char *buf)
 129{
 130        unsigned long val;
 131        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 132
 133        val = drvdata->numvmidc;
 134        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 135}
 136static DEVICE_ATTR_RO(numvmidc);
 137
 138static ssize_t nrseqstate_show(struct device *dev,
 139                               struct device_attribute *attr,
 140                               char *buf)
 141{
 142        unsigned long val;
 143        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 144
 145        val = drvdata->nrseqstate;
 146        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 147}
 148static DEVICE_ATTR_RO(nrseqstate);
 149
 150static ssize_t nr_resource_show(struct device *dev,
 151                                struct device_attribute *attr,
 152                                char *buf)
 153{
 154        unsigned long val;
 155        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 156
 157        val = drvdata->nr_resource;
 158        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 159}
 160static DEVICE_ATTR_RO(nr_resource);
 161
 162static ssize_t nr_ss_cmp_show(struct device *dev,
 163                              struct device_attribute *attr,
 164                              char *buf)
 165{
 166        unsigned long val;
 167        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 168
 169        val = drvdata->nr_ss_cmp;
 170        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 171}
 172static DEVICE_ATTR_RO(nr_ss_cmp);
 173
 174static ssize_t reset_store(struct device *dev,
 175                           struct device_attribute *attr,
 176                           const char *buf, size_t size)
 177{
 178        int i;
 179        unsigned long val;
 180        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 181        struct etmv4_config *config = &drvdata->config;
 182
 183        if (kstrtoul(buf, 16, &val))
 184                return -EINVAL;
 185
 186        spin_lock(&drvdata->spinlock);
 187        if (val)
 188                config->mode = 0x0;
 189
 190        /* Disable data tracing: do not trace load and store data transfers */
 191        config->mode &= ~(ETM_MODE_LOAD | ETM_MODE_STORE);
 192        config->cfg &= ~(BIT(1) | BIT(2));
 193
 194        /* Disable data value and data address tracing */
 195        config->mode &= ~(ETM_MODE_DATA_TRACE_ADDR |
 196                           ETM_MODE_DATA_TRACE_VAL);
 197        config->cfg &= ~(BIT(16) | BIT(17));
 198
 199        /* Disable all events tracing */
 200        config->eventctrl0 = 0x0;
 201        config->eventctrl1 = 0x0;
 202
 203        /* Disable timestamp event */
 204        config->ts_ctrl = 0x0;
 205
 206        /* Disable stalling */
 207        config->stall_ctrl = 0x0;
 208
 209        /* Reset trace synchronization period  to 2^8 = 256 bytes*/
 210        if (drvdata->syncpr == false)
 211                config->syncfreq = 0x8;
 212
 213        /*
 214         * Enable ViewInst to trace everything with start-stop logic in
 215         * started state. ARM recommends start-stop logic is set before
 216         * each trace run.
 217         */
 218        config->vinst_ctrl |= BIT(0);
 219        if (drvdata->nr_addr_cmp == true) {
 220                config->mode |= ETM_MODE_VIEWINST_STARTSTOP;
 221                /* SSSTATUS, bit[9] */
 222                config->vinst_ctrl |= BIT(9);
 223        }
 224
 225        /* No address range filtering for ViewInst */
 226        config->viiectlr = 0x0;
 227
 228        /* No start-stop filtering for ViewInst */
 229        config->vissctlr = 0x0;
 230
 231        /* Disable seq events */
 232        for (i = 0; i < drvdata->nrseqstate-1; i++)
 233                config->seq_ctrl[i] = 0x0;
 234        config->seq_rst = 0x0;
 235        config->seq_state = 0x0;
 236
 237        /* Disable external input events */
 238        config->ext_inp = 0x0;
 239
 240        config->cntr_idx = 0x0;
 241        for (i = 0; i < drvdata->nr_cntr; i++) {
 242                config->cntrldvr[i] = 0x0;
 243                config->cntr_ctrl[i] = 0x0;
 244                config->cntr_val[i] = 0x0;
 245        }
 246
 247        config->res_idx = 0x0;
 248        for (i = 0; i < drvdata->nr_resource; i++)
 249                config->res_ctrl[i] = 0x0;
 250
 251        for (i = 0; i < drvdata->nr_ss_cmp; i++) {
 252                config->ss_ctrl[i] = 0x0;
 253                config->ss_pe_cmp[i] = 0x0;
 254        }
 255
 256        config->addr_idx = 0x0;
 257        for (i = 0; i < drvdata->nr_addr_cmp * 2; i++) {
 258                config->addr_val[i] = 0x0;
 259                config->addr_acc[i] = 0x0;
 260                config->addr_type[i] = ETM_ADDR_TYPE_NONE;
 261        }
 262
 263        config->ctxid_idx = 0x0;
 264        for (i = 0; i < drvdata->numcidc; i++) {
 265                config->ctxid_pid[i] = 0x0;
 266                config->ctxid_vpid[i] = 0x0;
 267        }
 268
 269        config->ctxid_mask0 = 0x0;
 270        config->ctxid_mask1 = 0x0;
 271
 272        config->vmid_idx = 0x0;
 273        for (i = 0; i < drvdata->numvmidc; i++)
 274                config->vmid_val[i] = 0x0;
 275        config->vmid_mask0 = 0x0;
 276        config->vmid_mask1 = 0x0;
 277
 278        drvdata->trcid = drvdata->cpu + 1;
 279
 280        spin_unlock(&drvdata->spinlock);
 281
 282        return size;
 283}
 284static DEVICE_ATTR_WO(reset);
 285
 286static ssize_t mode_show(struct device *dev,
 287                         struct device_attribute *attr,
 288                         char *buf)
 289{
 290        unsigned long val;
 291        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 292        struct etmv4_config *config = &drvdata->config;
 293
 294        val = config->mode;
 295        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 296}
 297
 298static ssize_t mode_store(struct device *dev,
 299                          struct device_attribute *attr,
 300                          const char *buf, size_t size)
 301{
 302        unsigned long val, mode;
 303        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 304        struct etmv4_config *config = &drvdata->config;
 305
 306        if (kstrtoul(buf, 16, &val))
 307                return -EINVAL;
 308
 309        spin_lock(&drvdata->spinlock);
 310        config->mode = val & ETMv4_MODE_ALL;
 311
 312        if (config->mode & ETM_MODE_EXCLUDE)
 313                etm4_set_mode_exclude(drvdata, true);
 314        else
 315                etm4_set_mode_exclude(drvdata, false);
 316
 317        if (drvdata->instrp0 == true) {
 318                /* start by clearing instruction P0 field */
 319                config->cfg  &= ~(BIT(1) | BIT(2));
 320                if (config->mode & ETM_MODE_LOAD)
 321                        /* 0b01 Trace load instructions as P0 instructions */
 322                        config->cfg  |= BIT(1);
 323                if (config->mode & ETM_MODE_STORE)
 324                        /* 0b10 Trace store instructions as P0 instructions */
 325                        config->cfg  |= BIT(2);
 326                if (config->mode & ETM_MODE_LOAD_STORE)
 327                        /*
 328                         * 0b11 Trace load and store instructions
 329                         * as P0 instructions
 330                         */
 331                        config->cfg  |= BIT(1) | BIT(2);
 332        }
 333
 334        /* bit[3], Branch broadcast mode */
 335        if ((config->mode & ETM_MODE_BB) && (drvdata->trcbb == true))
 336                config->cfg |= BIT(3);
 337        else
 338                config->cfg &= ~BIT(3);
 339
 340        /* bit[4], Cycle counting instruction trace bit */
 341        if ((config->mode & ETMv4_MODE_CYCACC) &&
 342                (drvdata->trccci == true))
 343                config->cfg |= BIT(4);
 344        else
 345                config->cfg &= ~BIT(4);
 346
 347        /* bit[6], Context ID tracing bit */
 348        if ((config->mode & ETMv4_MODE_CTXID) && (drvdata->ctxid_size))
 349                config->cfg |= BIT(6);
 350        else
 351                config->cfg &= ~BIT(6);
 352
 353        if ((config->mode & ETM_MODE_VMID) && (drvdata->vmid_size))
 354                config->cfg |= BIT(7);
 355        else
 356                config->cfg &= ~BIT(7);
 357
 358        /* bits[10:8], Conditional instruction tracing bit */
 359        mode = ETM_MODE_COND(config->mode);
 360        if (drvdata->trccond == true) {
 361                config->cfg &= ~(BIT(8) | BIT(9) | BIT(10));
 362                config->cfg |= mode << 8;
 363        }
 364
 365        /* bit[11], Global timestamp tracing bit */
 366        if ((config->mode & ETMv4_MODE_TIMESTAMP) && (drvdata->ts_size))
 367                config->cfg |= BIT(11);
 368        else
 369                config->cfg &= ~BIT(11);
 370
 371        /* bit[12], Return stack enable bit */
 372        if ((config->mode & ETM_MODE_RETURNSTACK) &&
 373                                        (drvdata->retstack == true))
 374                config->cfg |= BIT(12);
 375        else
 376                config->cfg &= ~BIT(12);
 377
 378        /* bits[14:13], Q element enable field */
 379        mode = ETM_MODE_QELEM(config->mode);
 380        /* start by clearing QE bits */
 381        config->cfg &= ~(BIT(13) | BIT(14));
 382        /* if supported, Q elements with instruction counts are enabled */
 383        if ((mode & BIT(0)) && (drvdata->q_support & BIT(0)))
 384                config->cfg |= BIT(13);
 385        /*
 386         * if supported, Q elements with and without instruction
 387         * counts are enabled
 388         */
 389        if ((mode & BIT(1)) && (drvdata->q_support & BIT(1)))
 390                config->cfg |= BIT(14);
 391
 392        /* bit[11], AMBA Trace Bus (ATB) trigger enable bit */
 393        if ((config->mode & ETM_MODE_ATB_TRIGGER) &&
 394            (drvdata->atbtrig == true))
 395                config->eventctrl1 |= BIT(11);
 396        else
 397                config->eventctrl1 &= ~BIT(11);
 398
 399        /* bit[12], Low-power state behavior override bit */
 400        if ((config->mode & ETM_MODE_LPOVERRIDE) &&
 401            (drvdata->lpoverride == true))
 402                config->eventctrl1 |= BIT(12);
 403        else
 404                config->eventctrl1 &= ~BIT(12);
 405
 406        /* bit[8], Instruction stall bit */
 407        if (config->mode & ETM_MODE_ISTALL_EN)
 408                config->stall_ctrl |= BIT(8);
 409        else
 410                config->stall_ctrl &= ~BIT(8);
 411
 412        /* bit[10], Prioritize instruction trace bit */
 413        if (config->mode & ETM_MODE_INSTPRIO)
 414                config->stall_ctrl |= BIT(10);
 415        else
 416                config->stall_ctrl &= ~BIT(10);
 417
 418        /* bit[13], Trace overflow prevention bit */
 419        if ((config->mode & ETM_MODE_NOOVERFLOW) &&
 420                (drvdata->nooverflow == true))
 421                config->stall_ctrl |= BIT(13);
 422        else
 423                config->stall_ctrl &= ~BIT(13);
 424
 425        /* bit[9] Start/stop logic control bit */
 426        if (config->mode & ETM_MODE_VIEWINST_STARTSTOP)
 427                config->vinst_ctrl |= BIT(9);
 428        else
 429                config->vinst_ctrl &= ~BIT(9);
 430
 431        /* bit[10], Whether a trace unit must trace a Reset exception */
 432        if (config->mode & ETM_MODE_TRACE_RESET)
 433                config->vinst_ctrl |= BIT(10);
 434        else
 435                config->vinst_ctrl &= ~BIT(10);
 436
 437        /* bit[11], Whether a trace unit must trace a system error exception */
 438        if ((config->mode & ETM_MODE_TRACE_ERR) &&
 439                (drvdata->trc_error == true))
 440                config->vinst_ctrl |= BIT(11);
 441        else
 442                config->vinst_ctrl &= ~BIT(11);
 443
 444        if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER))
 445                etm4_config_trace_mode(config);
 446
 447        spin_unlock(&drvdata->spinlock);
 448
 449        return size;
 450}
 451static DEVICE_ATTR_RW(mode);
 452
 453static ssize_t pe_show(struct device *dev,
 454                       struct device_attribute *attr,
 455                       char *buf)
 456{
 457        unsigned long val;
 458        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 459        struct etmv4_config *config = &drvdata->config;
 460
 461        val = config->pe_sel;
 462        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 463}
 464
 465static ssize_t pe_store(struct device *dev,
 466                        struct device_attribute *attr,
 467                        const char *buf, size_t size)
 468{
 469        unsigned long val;
 470        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 471        struct etmv4_config *config = &drvdata->config;
 472
 473        if (kstrtoul(buf, 16, &val))
 474                return -EINVAL;
 475
 476        spin_lock(&drvdata->spinlock);
 477        if (val > drvdata->nr_pe) {
 478                spin_unlock(&drvdata->spinlock);
 479                return -EINVAL;
 480        }
 481
 482        config->pe_sel = val;
 483        spin_unlock(&drvdata->spinlock);
 484        return size;
 485}
 486static DEVICE_ATTR_RW(pe);
 487
 488static ssize_t event_show(struct device *dev,
 489                          struct device_attribute *attr,
 490                          char *buf)
 491{
 492        unsigned long val;
 493        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 494        struct etmv4_config *config = &drvdata->config;
 495
 496        val = config->eventctrl0;
 497        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 498}
 499
 500static ssize_t event_store(struct device *dev,
 501                           struct device_attribute *attr,
 502                           const char *buf, size_t size)
 503{
 504        unsigned long val;
 505        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 506        struct etmv4_config *config = &drvdata->config;
 507
 508        if (kstrtoul(buf, 16, &val))
 509                return -EINVAL;
 510
 511        spin_lock(&drvdata->spinlock);
 512        switch (drvdata->nr_event) {
 513        case 0x0:
 514                /* EVENT0, bits[7:0] */
 515                config->eventctrl0 = val & 0xFF;
 516                break;
 517        case 0x1:
 518                 /* EVENT1, bits[15:8] */
 519                config->eventctrl0 = val & 0xFFFF;
 520                break;
 521        case 0x2:
 522                /* EVENT2, bits[23:16] */
 523                config->eventctrl0 = val & 0xFFFFFF;
 524                break;
 525        case 0x3:
 526                /* EVENT3, bits[31:24] */
 527                config->eventctrl0 = val;
 528                break;
 529        default:
 530                break;
 531        }
 532        spin_unlock(&drvdata->spinlock);
 533        return size;
 534}
 535static DEVICE_ATTR_RW(event);
 536
 537static ssize_t event_instren_show(struct device *dev,
 538                                  struct device_attribute *attr,
 539                                  char *buf)
 540{
 541        unsigned long val;
 542        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 543        struct etmv4_config *config = &drvdata->config;
 544
 545        val = BMVAL(config->eventctrl1, 0, 3);
 546        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 547}
 548
 549static ssize_t event_instren_store(struct device *dev,
 550                                   struct device_attribute *attr,
 551                                   const char *buf, size_t size)
 552{
 553        unsigned long val;
 554        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 555        struct etmv4_config *config = &drvdata->config;
 556
 557        if (kstrtoul(buf, 16, &val))
 558                return -EINVAL;
 559
 560        spin_lock(&drvdata->spinlock);
 561        /* start by clearing all instruction event enable bits */
 562        config->eventctrl1 &= ~(BIT(0) | BIT(1) | BIT(2) | BIT(3));
 563        switch (drvdata->nr_event) {
 564        case 0x0:
 565                /* generate Event element for event 1 */
 566                config->eventctrl1 |= val & BIT(1);
 567                break;
 568        case 0x1:
 569                /* generate Event element for event 1 and 2 */
 570                config->eventctrl1 |= val & (BIT(0) | BIT(1));
 571                break;
 572        case 0x2:
 573                /* generate Event element for event 1, 2 and 3 */
 574                config->eventctrl1 |= val & (BIT(0) | BIT(1) | BIT(2));
 575                break;
 576        case 0x3:
 577                /* generate Event element for all 4 events */
 578                config->eventctrl1 |= val & 0xF;
 579                break;
 580        default:
 581                break;
 582        }
 583        spin_unlock(&drvdata->spinlock);
 584        return size;
 585}
 586static DEVICE_ATTR_RW(event_instren);
 587
 588static ssize_t event_ts_show(struct device *dev,
 589                             struct device_attribute *attr,
 590                             char *buf)
 591{
 592        unsigned long val;
 593        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 594        struct etmv4_config *config = &drvdata->config;
 595
 596        val = config->ts_ctrl;
 597        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 598}
 599
 600static ssize_t event_ts_store(struct device *dev,
 601                              struct device_attribute *attr,
 602                              const char *buf, size_t size)
 603{
 604        unsigned long val;
 605        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 606        struct etmv4_config *config = &drvdata->config;
 607
 608        if (kstrtoul(buf, 16, &val))
 609                return -EINVAL;
 610        if (!drvdata->ts_size)
 611                return -EINVAL;
 612
 613        config->ts_ctrl = val & ETMv4_EVENT_MASK;
 614        return size;
 615}
 616static DEVICE_ATTR_RW(event_ts);
 617
 618static ssize_t syncfreq_show(struct device *dev,
 619                             struct device_attribute *attr,
 620                             char *buf)
 621{
 622        unsigned long val;
 623        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 624        struct etmv4_config *config = &drvdata->config;
 625
 626        val = config->syncfreq;
 627        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 628}
 629
 630static ssize_t syncfreq_store(struct device *dev,
 631                              struct device_attribute *attr,
 632                              const char *buf, size_t size)
 633{
 634        unsigned long val;
 635        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 636        struct etmv4_config *config = &drvdata->config;
 637
 638        if (kstrtoul(buf, 16, &val))
 639                return -EINVAL;
 640        if (drvdata->syncpr == true)
 641                return -EINVAL;
 642
 643        config->syncfreq = val & ETMv4_SYNC_MASK;
 644        return size;
 645}
 646static DEVICE_ATTR_RW(syncfreq);
 647
 648static ssize_t cyc_threshold_show(struct device *dev,
 649                                  struct device_attribute *attr,
 650                                  char *buf)
 651{
 652        unsigned long val;
 653        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 654        struct etmv4_config *config = &drvdata->config;
 655
 656        val = config->ccctlr;
 657        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 658}
 659
 660static ssize_t cyc_threshold_store(struct device *dev,
 661                                   struct device_attribute *attr,
 662                                   const char *buf, size_t size)
 663{
 664        unsigned long val;
 665        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 666        struct etmv4_config *config = &drvdata->config;
 667
 668        if (kstrtoul(buf, 16, &val))
 669                return -EINVAL;
 670        if (val < drvdata->ccitmin)
 671                return -EINVAL;
 672
 673        config->ccctlr = val & ETM_CYC_THRESHOLD_MASK;
 674        return size;
 675}
 676static DEVICE_ATTR_RW(cyc_threshold);
 677
 678static ssize_t bb_ctrl_show(struct device *dev,
 679                            struct device_attribute *attr,
 680                            char *buf)
 681{
 682        unsigned long val;
 683        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 684        struct etmv4_config *config = &drvdata->config;
 685
 686        val = config->bb_ctrl;
 687        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 688}
 689
 690static ssize_t bb_ctrl_store(struct device *dev,
 691                             struct device_attribute *attr,
 692                             const char *buf, size_t size)
 693{
 694        unsigned long val;
 695        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 696        struct etmv4_config *config = &drvdata->config;
 697
 698        if (kstrtoul(buf, 16, &val))
 699                return -EINVAL;
 700        if (drvdata->trcbb == false)
 701                return -EINVAL;
 702        if (!drvdata->nr_addr_cmp)
 703                return -EINVAL;
 704        /*
 705         * Bit[7:0] selects which address range comparator is used for
 706         * branch broadcast control.
 707         */
 708        if (BMVAL(val, 0, 7) > drvdata->nr_addr_cmp)
 709                return -EINVAL;
 710
 711        config->bb_ctrl = val;
 712        return size;
 713}
 714static DEVICE_ATTR_RW(bb_ctrl);
 715
 716static ssize_t event_vinst_show(struct device *dev,
 717                                struct device_attribute *attr,
 718                                char *buf)
 719{
 720        unsigned long val;
 721        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 722        struct etmv4_config *config = &drvdata->config;
 723
 724        val = config->vinst_ctrl & ETMv4_EVENT_MASK;
 725        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 726}
 727
 728static ssize_t event_vinst_store(struct device *dev,
 729                                 struct device_attribute *attr,
 730                                 const char *buf, size_t size)
 731{
 732        unsigned long val;
 733        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 734        struct etmv4_config *config = &drvdata->config;
 735
 736        if (kstrtoul(buf, 16, &val))
 737                return -EINVAL;
 738
 739        spin_lock(&drvdata->spinlock);
 740        val &= ETMv4_EVENT_MASK;
 741        config->vinst_ctrl &= ~ETMv4_EVENT_MASK;
 742        config->vinst_ctrl |= val;
 743        spin_unlock(&drvdata->spinlock);
 744        return size;
 745}
 746static DEVICE_ATTR_RW(event_vinst);
 747
 748static ssize_t s_exlevel_vinst_show(struct device *dev,
 749                                    struct device_attribute *attr,
 750                                    char *buf)
 751{
 752        unsigned long val;
 753        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 754        struct etmv4_config *config = &drvdata->config;
 755
 756        val = BMVAL(config->vinst_ctrl, 16, 19);
 757        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 758}
 759
 760static ssize_t s_exlevel_vinst_store(struct device *dev,
 761                                     struct device_attribute *attr,
 762                                     const char *buf, size_t size)
 763{
 764        unsigned long val;
 765        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 766        struct etmv4_config *config = &drvdata->config;
 767
 768        if (kstrtoul(buf, 16, &val))
 769                return -EINVAL;
 770
 771        spin_lock(&drvdata->spinlock);
 772        /* clear all EXLEVEL_S bits (bit[18] is never implemented) */
 773        config->vinst_ctrl &= ~(BIT(16) | BIT(17) | BIT(19));
 774        /* enable instruction tracing for corresponding exception level */
 775        val &= drvdata->s_ex_level;
 776        config->vinst_ctrl |= (val << 16);
 777        spin_unlock(&drvdata->spinlock);
 778        return size;
 779}
 780static DEVICE_ATTR_RW(s_exlevel_vinst);
 781
 782static ssize_t ns_exlevel_vinst_show(struct device *dev,
 783                                     struct device_attribute *attr,
 784                                     char *buf)
 785{
 786        unsigned long val;
 787        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 788        struct etmv4_config *config = &drvdata->config;
 789
 790        /* EXLEVEL_NS, bits[23:20] */
 791        val = BMVAL(config->vinst_ctrl, 20, 23);
 792        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 793}
 794
 795static ssize_t ns_exlevel_vinst_store(struct device *dev,
 796                                      struct device_attribute *attr,
 797                                      const char *buf, size_t size)
 798{
 799        unsigned long val;
 800        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 801        struct etmv4_config *config = &drvdata->config;
 802
 803        if (kstrtoul(buf, 16, &val))
 804                return -EINVAL;
 805
 806        spin_lock(&drvdata->spinlock);
 807        /* clear EXLEVEL_NS bits (bit[23] is never implemented */
 808        config->vinst_ctrl &= ~(BIT(20) | BIT(21) | BIT(22));
 809        /* enable instruction tracing for corresponding exception level */
 810        val &= drvdata->ns_ex_level;
 811        config->vinst_ctrl |= (val << 20);
 812        spin_unlock(&drvdata->spinlock);
 813        return size;
 814}
 815static DEVICE_ATTR_RW(ns_exlevel_vinst);
 816
 817static ssize_t addr_idx_show(struct device *dev,
 818                             struct device_attribute *attr,
 819                             char *buf)
 820{
 821        unsigned long val;
 822        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 823        struct etmv4_config *config = &drvdata->config;
 824
 825        val = config->addr_idx;
 826        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 827}
 828
 829static ssize_t addr_idx_store(struct device *dev,
 830                              struct device_attribute *attr,
 831                              const char *buf, size_t size)
 832{
 833        unsigned long val;
 834        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 835        struct etmv4_config *config = &drvdata->config;
 836
 837        if (kstrtoul(buf, 16, &val))
 838                return -EINVAL;
 839        if (val >= drvdata->nr_addr_cmp * 2)
 840                return -EINVAL;
 841
 842        /*
 843         * Use spinlock to ensure index doesn't change while it gets
 844         * dereferenced multiple times within a spinlock block elsewhere.
 845         */
 846        spin_lock(&drvdata->spinlock);
 847        config->addr_idx = val;
 848        spin_unlock(&drvdata->spinlock);
 849        return size;
 850}
 851static DEVICE_ATTR_RW(addr_idx);
 852
 853static ssize_t addr_instdatatype_show(struct device *dev,
 854                                      struct device_attribute *attr,
 855                                      char *buf)
 856{
 857        ssize_t len;
 858        u8 val, idx;
 859        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 860        struct etmv4_config *config = &drvdata->config;
 861
 862        spin_lock(&drvdata->spinlock);
 863        idx = config->addr_idx;
 864        val = BMVAL(config->addr_acc[idx], 0, 1);
 865        len = scnprintf(buf, PAGE_SIZE, "%s\n",
 866                        val == ETM_INSTR_ADDR ? "instr" :
 867                        (val == ETM_DATA_LOAD_ADDR ? "data_load" :
 868                        (val == ETM_DATA_STORE_ADDR ? "data_store" :
 869                        "data_load_store")));
 870        spin_unlock(&drvdata->spinlock);
 871        return len;
 872}
 873
 874static ssize_t addr_instdatatype_store(struct device *dev,
 875                                       struct device_attribute *attr,
 876                                       const char *buf, size_t size)
 877{
 878        u8 idx;
 879        char str[20] = "";
 880        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 881        struct etmv4_config *config = &drvdata->config;
 882
 883        if (strlen(buf) >= 20)
 884                return -EINVAL;
 885        if (sscanf(buf, "%s", str) != 1)
 886                return -EINVAL;
 887
 888        spin_lock(&drvdata->spinlock);
 889        idx = config->addr_idx;
 890        if (!strcmp(str, "instr"))
 891                /* TYPE, bits[1:0] */
 892                config->addr_acc[idx] &= ~(BIT(0) | BIT(1));
 893
 894        spin_unlock(&drvdata->spinlock);
 895        return size;
 896}
 897static DEVICE_ATTR_RW(addr_instdatatype);
 898
 899static ssize_t addr_single_show(struct device *dev,
 900                                struct device_attribute *attr,
 901                                char *buf)
 902{
 903        u8 idx;
 904        unsigned long val;
 905        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 906        struct etmv4_config *config = &drvdata->config;
 907
 908        idx = config->addr_idx;
 909        spin_lock(&drvdata->spinlock);
 910        if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
 911              config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
 912                spin_unlock(&drvdata->spinlock);
 913                return -EPERM;
 914        }
 915        val = (unsigned long)config->addr_val[idx];
 916        spin_unlock(&drvdata->spinlock);
 917        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
 918}
 919
 920static ssize_t addr_single_store(struct device *dev,
 921                                 struct device_attribute *attr,
 922                                 const char *buf, size_t size)
 923{
 924        u8 idx;
 925        unsigned long val;
 926        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 927        struct etmv4_config *config = &drvdata->config;
 928
 929        if (kstrtoul(buf, 16, &val))
 930                return -EINVAL;
 931
 932        spin_lock(&drvdata->spinlock);
 933        idx = config->addr_idx;
 934        if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
 935              config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
 936                spin_unlock(&drvdata->spinlock);
 937                return -EPERM;
 938        }
 939
 940        config->addr_val[idx] = (u64)val;
 941        config->addr_type[idx] = ETM_ADDR_TYPE_SINGLE;
 942        spin_unlock(&drvdata->spinlock);
 943        return size;
 944}
 945static DEVICE_ATTR_RW(addr_single);
 946
 947static ssize_t addr_range_show(struct device *dev,
 948                               struct device_attribute *attr,
 949                               char *buf)
 950{
 951        u8 idx;
 952        unsigned long val1, val2;
 953        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 954        struct etmv4_config *config = &drvdata->config;
 955
 956        spin_lock(&drvdata->spinlock);
 957        idx = config->addr_idx;
 958        if (idx % 2 != 0) {
 959                spin_unlock(&drvdata->spinlock);
 960                return -EPERM;
 961        }
 962        if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
 963               config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
 964              (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
 965               config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
 966                spin_unlock(&drvdata->spinlock);
 967                return -EPERM;
 968        }
 969
 970        val1 = (unsigned long)config->addr_val[idx];
 971        val2 = (unsigned long)config->addr_val[idx + 1];
 972        spin_unlock(&drvdata->spinlock);
 973        return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
 974}
 975
 976static ssize_t addr_range_store(struct device *dev,
 977                                struct device_attribute *attr,
 978                                const char *buf, size_t size)
 979{
 980        u8 idx;
 981        unsigned long val1, val2;
 982        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
 983        struct etmv4_config *config = &drvdata->config;
 984
 985        if (sscanf(buf, "%lx %lx", &val1, &val2) != 2)
 986                return -EINVAL;
 987        /* lower address comparator cannot have a higher address value */
 988        if (val1 > val2)
 989                return -EINVAL;
 990
 991        spin_lock(&drvdata->spinlock);
 992        idx = config->addr_idx;
 993        if (idx % 2 != 0) {
 994                spin_unlock(&drvdata->spinlock);
 995                return -EPERM;
 996        }
 997
 998        if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
 999               config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
1000              (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
1001               config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
1002                spin_unlock(&drvdata->spinlock);
1003                return -EPERM;
1004        }
1005
1006        config->addr_val[idx] = (u64)val1;
1007        config->addr_type[idx] = ETM_ADDR_TYPE_RANGE;
1008        config->addr_val[idx + 1] = (u64)val2;
1009        config->addr_type[idx + 1] = ETM_ADDR_TYPE_RANGE;
1010        /*
1011         * Program include or exclude control bits for vinst or vdata
1012         * whenever we change addr comparators to ETM_ADDR_TYPE_RANGE
1013         */
1014        if (config->mode & ETM_MODE_EXCLUDE)
1015                etm4_set_mode_exclude(drvdata, true);
1016        else
1017                etm4_set_mode_exclude(drvdata, false);
1018
1019        spin_unlock(&drvdata->spinlock);
1020        return size;
1021}
1022static DEVICE_ATTR_RW(addr_range);
1023
1024static ssize_t addr_start_show(struct device *dev,
1025                               struct device_attribute *attr,
1026                               char *buf)
1027{
1028        u8 idx;
1029        unsigned long val;
1030        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1031        struct etmv4_config *config = &drvdata->config;
1032
1033        spin_lock(&drvdata->spinlock);
1034        idx = config->addr_idx;
1035
1036        if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
1037              config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
1038                spin_unlock(&drvdata->spinlock);
1039                return -EPERM;
1040        }
1041
1042        val = (unsigned long)config->addr_val[idx];
1043        spin_unlock(&drvdata->spinlock);
1044        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1045}
1046
1047static ssize_t addr_start_store(struct device *dev,
1048                                struct device_attribute *attr,
1049                                const char *buf, size_t size)
1050{
1051        u8 idx;
1052        unsigned long val;
1053        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1054        struct etmv4_config *config = &drvdata->config;
1055
1056        if (kstrtoul(buf, 16, &val))
1057                return -EINVAL;
1058
1059        spin_lock(&drvdata->spinlock);
1060        idx = config->addr_idx;
1061        if (!drvdata->nr_addr_cmp) {
1062                spin_unlock(&drvdata->spinlock);
1063                return -EINVAL;
1064        }
1065        if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
1066              config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
1067                spin_unlock(&drvdata->spinlock);
1068                return -EPERM;
1069        }
1070
1071        config->addr_val[idx] = (u64)val;
1072        config->addr_type[idx] = ETM_ADDR_TYPE_START;
1073        config->vissctlr |= BIT(idx);
1074        /* SSSTATUS, bit[9] - turn on start/stop logic */
1075        config->vinst_ctrl |= BIT(9);
1076        spin_unlock(&drvdata->spinlock);
1077        return size;
1078}
1079static DEVICE_ATTR_RW(addr_start);
1080
1081static ssize_t addr_stop_show(struct device *dev,
1082                              struct device_attribute *attr,
1083                              char *buf)
1084{
1085        u8 idx;
1086        unsigned long val;
1087        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1088        struct etmv4_config *config = &drvdata->config;
1089
1090        spin_lock(&drvdata->spinlock);
1091        idx = config->addr_idx;
1092
1093        if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
1094              config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
1095                spin_unlock(&drvdata->spinlock);
1096                return -EPERM;
1097        }
1098
1099        val = (unsigned long)config->addr_val[idx];
1100        spin_unlock(&drvdata->spinlock);
1101        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1102}
1103
1104static ssize_t addr_stop_store(struct device *dev,
1105                               struct device_attribute *attr,
1106                               const char *buf, size_t size)
1107{
1108        u8 idx;
1109        unsigned long val;
1110        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1111        struct etmv4_config *config = &drvdata->config;
1112
1113        if (kstrtoul(buf, 16, &val))
1114                return -EINVAL;
1115
1116        spin_lock(&drvdata->spinlock);
1117        idx = config->addr_idx;
1118        if (!drvdata->nr_addr_cmp) {
1119                spin_unlock(&drvdata->spinlock);
1120                return -EINVAL;
1121        }
1122        if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
1123               config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
1124                spin_unlock(&drvdata->spinlock);
1125                return -EPERM;
1126        }
1127
1128        config->addr_val[idx] = (u64)val;
1129        config->addr_type[idx] = ETM_ADDR_TYPE_STOP;
1130        config->vissctlr |= BIT(idx + 16);
1131        /* SSSTATUS, bit[9] - turn on start/stop logic */
1132        config->vinst_ctrl |= BIT(9);
1133        spin_unlock(&drvdata->spinlock);
1134        return size;
1135}
1136static DEVICE_ATTR_RW(addr_stop);
1137
1138static ssize_t addr_ctxtype_show(struct device *dev,
1139                                 struct device_attribute *attr,
1140                                 char *buf)
1141{
1142        ssize_t len;
1143        u8 idx, val;
1144        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1145        struct etmv4_config *config = &drvdata->config;
1146
1147        spin_lock(&drvdata->spinlock);
1148        idx = config->addr_idx;
1149        /* CONTEXTTYPE, bits[3:2] */
1150        val = BMVAL(config->addr_acc[idx], 2, 3);
1151        len = scnprintf(buf, PAGE_SIZE, "%s\n", val == ETM_CTX_NONE ? "none" :
1152                        (val == ETM_CTX_CTXID ? "ctxid" :
1153                        (val == ETM_CTX_VMID ? "vmid" : "all")));
1154        spin_unlock(&drvdata->spinlock);
1155        return len;
1156}
1157
1158static ssize_t addr_ctxtype_store(struct device *dev,
1159                                  struct device_attribute *attr,
1160                                  const char *buf, size_t size)
1161{
1162        u8 idx;
1163        char str[10] = "";
1164        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1165        struct etmv4_config *config = &drvdata->config;
1166
1167        if (strlen(buf) >= 10)
1168                return -EINVAL;
1169        if (sscanf(buf, "%s", str) != 1)
1170                return -EINVAL;
1171
1172        spin_lock(&drvdata->spinlock);
1173        idx = config->addr_idx;
1174        if (!strcmp(str, "none"))
1175                /* start by clearing context type bits */
1176                config->addr_acc[idx] &= ~(BIT(2) | BIT(3));
1177        else if (!strcmp(str, "ctxid")) {
1178                /* 0b01 The trace unit performs a Context ID */
1179                if (drvdata->numcidc) {
1180                        config->addr_acc[idx] |= BIT(2);
1181                        config->addr_acc[idx] &= ~BIT(3);
1182                }
1183        } else if (!strcmp(str, "vmid")) {
1184                /* 0b10 The trace unit performs a VMID */
1185                if (drvdata->numvmidc) {
1186                        config->addr_acc[idx] &= ~BIT(2);
1187                        config->addr_acc[idx] |= BIT(3);
1188                }
1189        } else if (!strcmp(str, "all")) {
1190                /*
1191                 * 0b11 The trace unit performs a Context ID
1192                 * comparison and a VMID
1193                 */
1194                if (drvdata->numcidc)
1195                        config->addr_acc[idx] |= BIT(2);
1196                if (drvdata->numvmidc)
1197                        config->addr_acc[idx] |= BIT(3);
1198        }
1199        spin_unlock(&drvdata->spinlock);
1200        return size;
1201}
1202static DEVICE_ATTR_RW(addr_ctxtype);
1203
1204static ssize_t addr_context_show(struct device *dev,
1205                                 struct device_attribute *attr,
1206                                 char *buf)
1207{
1208        u8 idx;
1209        unsigned long val;
1210        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1211        struct etmv4_config *config = &drvdata->config;
1212
1213        spin_lock(&drvdata->spinlock);
1214        idx = config->addr_idx;
1215        /* context ID comparator bits[6:4] */
1216        val = BMVAL(config->addr_acc[idx], 4, 6);
1217        spin_unlock(&drvdata->spinlock);
1218        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1219}
1220
1221static ssize_t addr_context_store(struct device *dev,
1222                                  struct device_attribute *attr,
1223                                  const char *buf, size_t size)
1224{
1225        u8 idx;
1226        unsigned long val;
1227        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1228        struct etmv4_config *config = &drvdata->config;
1229
1230        if (kstrtoul(buf, 16, &val))
1231                return -EINVAL;
1232        if ((drvdata->numcidc <= 1) && (drvdata->numvmidc <= 1))
1233                return -EINVAL;
1234        if (val >=  (drvdata->numcidc >= drvdata->numvmidc ?
1235                     drvdata->numcidc : drvdata->numvmidc))
1236                return -EINVAL;
1237
1238        spin_lock(&drvdata->spinlock);
1239        idx = config->addr_idx;
1240        /* clear context ID comparator bits[6:4] */
1241        config->addr_acc[idx] &= ~(BIT(4) | BIT(5) | BIT(6));
1242        config->addr_acc[idx] |= (val << 4);
1243        spin_unlock(&drvdata->spinlock);
1244        return size;
1245}
1246static DEVICE_ATTR_RW(addr_context);
1247
1248static ssize_t seq_idx_show(struct device *dev,
1249                            struct device_attribute *attr,
1250                            char *buf)
1251{
1252        unsigned long val;
1253        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1254        struct etmv4_config *config = &drvdata->config;
1255
1256        val = config->seq_idx;
1257        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1258}
1259
1260static ssize_t seq_idx_store(struct device *dev,
1261                             struct device_attribute *attr,
1262                             const char *buf, size_t size)
1263{
1264        unsigned long val;
1265        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1266        struct etmv4_config *config = &drvdata->config;
1267
1268        if (kstrtoul(buf, 16, &val))
1269                return -EINVAL;
1270        if (val >= drvdata->nrseqstate - 1)
1271                return -EINVAL;
1272
1273        /*
1274         * Use spinlock to ensure index doesn't change while it gets
1275         * dereferenced multiple times within a spinlock block elsewhere.
1276         */
1277        spin_lock(&drvdata->spinlock);
1278        config->seq_idx = val;
1279        spin_unlock(&drvdata->spinlock);
1280        return size;
1281}
1282static DEVICE_ATTR_RW(seq_idx);
1283
1284static ssize_t seq_state_show(struct device *dev,
1285                              struct device_attribute *attr,
1286                              char *buf)
1287{
1288        unsigned long val;
1289        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1290        struct etmv4_config *config = &drvdata->config;
1291
1292        val = config->seq_state;
1293        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1294}
1295
1296static ssize_t seq_state_store(struct device *dev,
1297                               struct device_attribute *attr,
1298                               const char *buf, size_t size)
1299{
1300        unsigned long val;
1301        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1302        struct etmv4_config *config = &drvdata->config;
1303
1304        if (kstrtoul(buf, 16, &val))
1305                return -EINVAL;
1306        if (val >= drvdata->nrseqstate)
1307                return -EINVAL;
1308
1309        config->seq_state = val;
1310        return size;
1311}
1312static DEVICE_ATTR_RW(seq_state);
1313
1314static ssize_t seq_event_show(struct device *dev,
1315                              struct device_attribute *attr,
1316                              char *buf)
1317{
1318        u8 idx;
1319        unsigned long val;
1320        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1321        struct etmv4_config *config = &drvdata->config;
1322
1323        spin_lock(&drvdata->spinlock);
1324        idx = config->seq_idx;
1325        val = config->seq_ctrl[idx];
1326        spin_unlock(&drvdata->spinlock);
1327        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1328}
1329
1330static ssize_t seq_event_store(struct device *dev,
1331                               struct device_attribute *attr,
1332                               const char *buf, size_t size)
1333{
1334        u8 idx;
1335        unsigned long val;
1336        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1337        struct etmv4_config *config = &drvdata->config;
1338
1339        if (kstrtoul(buf, 16, &val))
1340                return -EINVAL;
1341
1342        spin_lock(&drvdata->spinlock);
1343        idx = config->seq_idx;
1344        /* RST, bits[7:0] */
1345        config->seq_ctrl[idx] = val & 0xFF;
1346        spin_unlock(&drvdata->spinlock);
1347        return size;
1348}
1349static DEVICE_ATTR_RW(seq_event);
1350
1351static ssize_t seq_reset_event_show(struct device *dev,
1352                                    struct device_attribute *attr,
1353                                    char *buf)
1354{
1355        unsigned long val;
1356        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1357        struct etmv4_config *config = &drvdata->config;
1358
1359        val = config->seq_rst;
1360        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1361}
1362
1363static ssize_t seq_reset_event_store(struct device *dev,
1364                                     struct device_attribute *attr,
1365                                     const char *buf, size_t size)
1366{
1367        unsigned long val;
1368        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1369        struct etmv4_config *config = &drvdata->config;
1370
1371        if (kstrtoul(buf, 16, &val))
1372                return -EINVAL;
1373        if (!(drvdata->nrseqstate))
1374                return -EINVAL;
1375
1376        config->seq_rst = val & ETMv4_EVENT_MASK;
1377        return size;
1378}
1379static DEVICE_ATTR_RW(seq_reset_event);
1380
1381static ssize_t cntr_idx_show(struct device *dev,
1382                             struct device_attribute *attr,
1383                             char *buf)
1384{
1385        unsigned long val;
1386        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1387        struct etmv4_config *config = &drvdata->config;
1388
1389        val = config->cntr_idx;
1390        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1391}
1392
1393static ssize_t cntr_idx_store(struct device *dev,
1394                              struct device_attribute *attr,
1395                              const char *buf, size_t size)
1396{
1397        unsigned long val;
1398        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1399        struct etmv4_config *config = &drvdata->config;
1400
1401        if (kstrtoul(buf, 16, &val))
1402                return -EINVAL;
1403        if (val >= drvdata->nr_cntr)
1404                return -EINVAL;
1405
1406        /*
1407         * Use spinlock to ensure index doesn't change while it gets
1408         * dereferenced multiple times within a spinlock block elsewhere.
1409         */
1410        spin_lock(&drvdata->spinlock);
1411        config->cntr_idx = val;
1412        spin_unlock(&drvdata->spinlock);
1413        return size;
1414}
1415static DEVICE_ATTR_RW(cntr_idx);
1416
1417static ssize_t cntrldvr_show(struct device *dev,
1418                             struct device_attribute *attr,
1419                             char *buf)
1420{
1421        u8 idx;
1422        unsigned long val;
1423        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1424        struct etmv4_config *config = &drvdata->config;
1425
1426        spin_lock(&drvdata->spinlock);
1427        idx = config->cntr_idx;
1428        val = config->cntrldvr[idx];
1429        spin_unlock(&drvdata->spinlock);
1430        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1431}
1432
1433static ssize_t cntrldvr_store(struct device *dev,
1434                              struct device_attribute *attr,
1435                              const char *buf, size_t size)
1436{
1437        u8 idx;
1438        unsigned long val;
1439        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1440        struct etmv4_config *config = &drvdata->config;
1441
1442        if (kstrtoul(buf, 16, &val))
1443                return -EINVAL;
1444        if (val > ETM_CNTR_MAX_VAL)
1445                return -EINVAL;
1446
1447        spin_lock(&drvdata->spinlock);
1448        idx = config->cntr_idx;
1449        config->cntrldvr[idx] = val;
1450        spin_unlock(&drvdata->spinlock);
1451        return size;
1452}
1453static DEVICE_ATTR_RW(cntrldvr);
1454
1455static ssize_t cntr_val_show(struct device *dev,
1456                             struct device_attribute *attr,
1457                             char *buf)
1458{
1459        u8 idx;
1460        unsigned long val;
1461        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1462        struct etmv4_config *config = &drvdata->config;
1463
1464        spin_lock(&drvdata->spinlock);
1465        idx = config->cntr_idx;
1466        val = config->cntr_val[idx];
1467        spin_unlock(&drvdata->spinlock);
1468        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1469}
1470
1471static ssize_t cntr_val_store(struct device *dev,
1472                              struct device_attribute *attr,
1473                              const char *buf, size_t size)
1474{
1475        u8 idx;
1476        unsigned long val;
1477        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1478        struct etmv4_config *config = &drvdata->config;
1479
1480        if (kstrtoul(buf, 16, &val))
1481                return -EINVAL;
1482        if (val > ETM_CNTR_MAX_VAL)
1483                return -EINVAL;
1484
1485        spin_lock(&drvdata->spinlock);
1486        idx = config->cntr_idx;
1487        config->cntr_val[idx] = val;
1488        spin_unlock(&drvdata->spinlock);
1489        return size;
1490}
1491static DEVICE_ATTR_RW(cntr_val);
1492
1493static ssize_t cntr_ctrl_show(struct device *dev,
1494                              struct device_attribute *attr,
1495                              char *buf)
1496{
1497        u8 idx;
1498        unsigned long val;
1499        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1500        struct etmv4_config *config = &drvdata->config;
1501
1502        spin_lock(&drvdata->spinlock);
1503        idx = config->cntr_idx;
1504        val = config->cntr_ctrl[idx];
1505        spin_unlock(&drvdata->spinlock);
1506        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1507}
1508
1509static ssize_t cntr_ctrl_store(struct device *dev,
1510                               struct device_attribute *attr,
1511                               const char *buf, size_t size)
1512{
1513        u8 idx;
1514        unsigned long val;
1515        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1516        struct etmv4_config *config = &drvdata->config;
1517
1518        if (kstrtoul(buf, 16, &val))
1519                return -EINVAL;
1520
1521        spin_lock(&drvdata->spinlock);
1522        idx = config->cntr_idx;
1523        config->cntr_ctrl[idx] = val;
1524        spin_unlock(&drvdata->spinlock);
1525        return size;
1526}
1527static DEVICE_ATTR_RW(cntr_ctrl);
1528
1529static ssize_t res_idx_show(struct device *dev,
1530                            struct device_attribute *attr,
1531                            char *buf)
1532{
1533        unsigned long val;
1534        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1535        struct etmv4_config *config = &drvdata->config;
1536
1537        val = config->res_idx;
1538        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1539}
1540
1541static ssize_t res_idx_store(struct device *dev,
1542                             struct device_attribute *attr,
1543                             const char *buf, size_t size)
1544{
1545        unsigned long val;
1546        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1547        struct etmv4_config *config = &drvdata->config;
1548
1549        if (kstrtoul(buf, 16, &val))
1550                return -EINVAL;
1551        /* Resource selector pair 0 is always implemented and reserved */
1552        if ((val == 0) || (val >= drvdata->nr_resource))
1553                return -EINVAL;
1554
1555        /*
1556         * Use spinlock to ensure index doesn't change while it gets
1557         * dereferenced multiple times within a spinlock block elsewhere.
1558         */
1559        spin_lock(&drvdata->spinlock);
1560        config->res_idx = val;
1561        spin_unlock(&drvdata->spinlock);
1562        return size;
1563}
1564static DEVICE_ATTR_RW(res_idx);
1565
1566static ssize_t res_ctrl_show(struct device *dev,
1567                             struct device_attribute *attr,
1568                             char *buf)
1569{
1570        u8 idx;
1571        unsigned long val;
1572        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1573        struct etmv4_config *config = &drvdata->config;
1574
1575        spin_lock(&drvdata->spinlock);
1576        idx = config->res_idx;
1577        val = config->res_ctrl[idx];
1578        spin_unlock(&drvdata->spinlock);
1579        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1580}
1581
1582static ssize_t res_ctrl_store(struct device *dev,
1583                              struct device_attribute *attr,
1584                              const char *buf, size_t size)
1585{
1586        u8 idx;
1587        unsigned long val;
1588        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1589        struct etmv4_config *config = &drvdata->config;
1590
1591        if (kstrtoul(buf, 16, &val))
1592                return -EINVAL;
1593
1594        spin_lock(&drvdata->spinlock);
1595        idx = config->res_idx;
1596        /* For odd idx pair inversal bit is RES0 */
1597        if (idx % 2 != 0)
1598                /* PAIRINV, bit[21] */
1599                val &= ~BIT(21);
1600        config->res_ctrl[idx] = val;
1601        spin_unlock(&drvdata->spinlock);
1602        return size;
1603}
1604static DEVICE_ATTR_RW(res_ctrl);
1605
1606static ssize_t ctxid_idx_show(struct device *dev,
1607                              struct device_attribute *attr,
1608                              char *buf)
1609{
1610        unsigned long val;
1611        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1612        struct etmv4_config *config = &drvdata->config;
1613
1614        val = config->ctxid_idx;
1615        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1616}
1617
1618static ssize_t ctxid_idx_store(struct device *dev,
1619                               struct device_attribute *attr,
1620                               const char *buf, size_t size)
1621{
1622        unsigned long val;
1623        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1624        struct etmv4_config *config = &drvdata->config;
1625
1626        if (kstrtoul(buf, 16, &val))
1627                return -EINVAL;
1628        if (val >= drvdata->numcidc)
1629                return -EINVAL;
1630
1631        /*
1632         * Use spinlock to ensure index doesn't change while it gets
1633         * dereferenced multiple times within a spinlock block elsewhere.
1634         */
1635        spin_lock(&drvdata->spinlock);
1636        config->ctxid_idx = val;
1637        spin_unlock(&drvdata->spinlock);
1638        return size;
1639}
1640static DEVICE_ATTR_RW(ctxid_idx);
1641
1642static ssize_t ctxid_pid_show(struct device *dev,
1643                              struct device_attribute *attr,
1644                              char *buf)
1645{
1646        u8 idx;
1647        unsigned long val;
1648        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1649        struct etmv4_config *config = &drvdata->config;
1650
1651        spin_lock(&drvdata->spinlock);
1652        idx = config->ctxid_idx;
1653        val = (unsigned long)config->ctxid_vpid[idx];
1654        spin_unlock(&drvdata->spinlock);
1655        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1656}
1657
1658static ssize_t ctxid_pid_store(struct device *dev,
1659                               struct device_attribute *attr,
1660                               const char *buf, size_t size)
1661{
1662        u8 idx;
1663        unsigned long vpid, pid;
1664        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1665        struct etmv4_config *config = &drvdata->config;
1666
1667        /*
1668         * only implemented when ctxid tracing is enabled, i.e. at least one
1669         * ctxid comparator is implemented and ctxid is greater than 0 bits
1670         * in length
1671         */
1672        if (!drvdata->ctxid_size || !drvdata->numcidc)
1673                return -EINVAL;
1674        if (kstrtoul(buf, 16, &vpid))
1675                return -EINVAL;
1676
1677        pid = coresight_vpid_to_pid(vpid);
1678
1679        spin_lock(&drvdata->spinlock);
1680        idx = config->ctxid_idx;
1681        config->ctxid_pid[idx] = (u64)pid;
1682        config->ctxid_vpid[idx] = (u64)vpid;
1683        spin_unlock(&drvdata->spinlock);
1684        return size;
1685}
1686static DEVICE_ATTR_RW(ctxid_pid);
1687
1688static ssize_t ctxid_masks_show(struct device *dev,
1689                                struct device_attribute *attr,
1690                                char *buf)
1691{
1692        unsigned long val1, val2;
1693        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1694        struct etmv4_config *config = &drvdata->config;
1695
1696        spin_lock(&drvdata->spinlock);
1697        val1 = config->ctxid_mask0;
1698        val2 = config->ctxid_mask1;
1699        spin_unlock(&drvdata->spinlock);
1700        return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
1701}
1702
1703static ssize_t ctxid_masks_store(struct device *dev,
1704                                struct device_attribute *attr,
1705                                const char *buf, size_t size)
1706{
1707        u8 i, j, maskbyte;
1708        unsigned long val1, val2, mask;
1709        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1710        struct etmv4_config *config = &drvdata->config;
1711
1712        /*
1713         * only implemented when ctxid tracing is enabled, i.e. at least one
1714         * ctxid comparator is implemented and ctxid is greater than 0 bits
1715         * in length
1716         */
1717        if (!drvdata->ctxid_size || !drvdata->numcidc)
1718                return -EINVAL;
1719        if (sscanf(buf, "%lx %lx", &val1, &val2) != 2)
1720                return -EINVAL;
1721
1722        spin_lock(&drvdata->spinlock);
1723        /*
1724         * each byte[0..3] controls mask value applied to ctxid
1725         * comparator[0..3]
1726         */
1727        switch (drvdata->numcidc) {
1728        case 0x1:
1729                /* COMP0, bits[7:0] */
1730                config->ctxid_mask0 = val1 & 0xFF;
1731                break;
1732        case 0x2:
1733                /* COMP1, bits[15:8] */
1734                config->ctxid_mask0 = val1 & 0xFFFF;
1735                break;
1736        case 0x3:
1737                /* COMP2, bits[23:16] */
1738                config->ctxid_mask0 = val1 & 0xFFFFFF;
1739                break;
1740        case 0x4:
1741                 /* COMP3, bits[31:24] */
1742                config->ctxid_mask0 = val1;
1743                break;
1744        case 0x5:
1745                /* COMP4, bits[7:0] */
1746                config->ctxid_mask0 = val1;
1747                config->ctxid_mask1 = val2 & 0xFF;
1748                break;
1749        case 0x6:
1750                /* COMP5, bits[15:8] */
1751                config->ctxid_mask0 = val1;
1752                config->ctxid_mask1 = val2 & 0xFFFF;
1753                break;
1754        case 0x7:
1755                /* COMP6, bits[23:16] */
1756                config->ctxid_mask0 = val1;
1757                config->ctxid_mask1 = val2 & 0xFFFFFF;
1758                break;
1759        case 0x8:
1760                /* COMP7, bits[31:24] */
1761                config->ctxid_mask0 = val1;
1762                config->ctxid_mask1 = val2;
1763                break;
1764        default:
1765                break;
1766        }
1767        /*
1768         * If software sets a mask bit to 1, it must program relevant byte
1769         * of ctxid comparator value 0x0, otherwise behavior is unpredictable.
1770         * For example, if bit[3] of ctxid_mask0 is 1, we must clear bits[31:24]
1771         * of ctxid comparator0 value (corresponding to byte 0) register.
1772         */
1773        mask = config->ctxid_mask0;
1774        for (i = 0; i < drvdata->numcidc; i++) {
1775                /* mask value of corresponding ctxid comparator */
1776                maskbyte = mask & ETMv4_EVENT_MASK;
1777                /*
1778                 * each bit corresponds to a byte of respective ctxid comparator
1779                 * value register
1780                 */
1781                for (j = 0; j < 8; j++) {
1782                        if (maskbyte & 1)
1783                                config->ctxid_pid[i] &= ~(0xFF << (j * 8));
1784                        maskbyte >>= 1;
1785                }
1786                /* Select the next ctxid comparator mask value */
1787                if (i == 3)
1788                        /* ctxid comparators[4-7] */
1789                        mask = config->ctxid_mask1;
1790                else
1791                        mask >>= 0x8;
1792        }
1793
1794        spin_unlock(&drvdata->spinlock);
1795        return size;
1796}
1797static DEVICE_ATTR_RW(ctxid_masks);
1798
1799static ssize_t vmid_idx_show(struct device *dev,
1800                             struct device_attribute *attr,
1801                             char *buf)
1802{
1803        unsigned long val;
1804        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1805        struct etmv4_config *config = &drvdata->config;
1806
1807        val = config->vmid_idx;
1808        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1809}
1810
1811static ssize_t vmid_idx_store(struct device *dev,
1812                              struct device_attribute *attr,
1813                              const char *buf, size_t size)
1814{
1815        unsigned long val;
1816        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1817        struct etmv4_config *config = &drvdata->config;
1818
1819        if (kstrtoul(buf, 16, &val))
1820                return -EINVAL;
1821        if (val >= drvdata->numvmidc)
1822                return -EINVAL;
1823
1824        /*
1825         * Use spinlock to ensure index doesn't change while it gets
1826         * dereferenced multiple times within a spinlock block elsewhere.
1827         */
1828        spin_lock(&drvdata->spinlock);
1829        config->vmid_idx = val;
1830        spin_unlock(&drvdata->spinlock);
1831        return size;
1832}
1833static DEVICE_ATTR_RW(vmid_idx);
1834
1835static ssize_t vmid_val_show(struct device *dev,
1836                             struct device_attribute *attr,
1837                             char *buf)
1838{
1839        unsigned long val;
1840        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1841        struct etmv4_config *config = &drvdata->config;
1842
1843        val = (unsigned long)config->vmid_val[config->vmid_idx];
1844        return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1845}
1846
1847static ssize_t vmid_val_store(struct device *dev,
1848                              struct device_attribute *attr,
1849                              const char *buf, size_t size)
1850{
1851        unsigned long val;
1852        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1853        struct etmv4_config *config = &drvdata->config;
1854
1855        /*
1856         * only implemented when vmid tracing is enabled, i.e. at least one
1857         * vmid comparator is implemented and at least 8 bit vmid size
1858         */
1859        if (!drvdata->vmid_size || !drvdata->numvmidc)
1860                return -EINVAL;
1861        if (kstrtoul(buf, 16, &val))
1862                return -EINVAL;
1863
1864        spin_lock(&drvdata->spinlock);
1865        config->vmid_val[config->vmid_idx] = (u64)val;
1866        spin_unlock(&drvdata->spinlock);
1867        return size;
1868}
1869static DEVICE_ATTR_RW(vmid_val);
1870
1871static ssize_t vmid_masks_show(struct device *dev,
1872                               struct device_attribute *attr, char *buf)
1873{
1874        unsigned long val1, val2;
1875        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1876        struct etmv4_config *config = &drvdata->config;
1877
1878        spin_lock(&drvdata->spinlock);
1879        val1 = config->vmid_mask0;
1880        val2 = config->vmid_mask1;
1881        spin_unlock(&drvdata->spinlock);
1882        return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
1883}
1884
1885static ssize_t vmid_masks_store(struct device *dev,
1886                                struct device_attribute *attr,
1887                                const char *buf, size_t size)
1888{
1889        u8 i, j, maskbyte;
1890        unsigned long val1, val2, mask;
1891        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1892        struct etmv4_config *config = &drvdata->config;
1893
1894        /*
1895         * only implemented when vmid tracing is enabled, i.e. at least one
1896         * vmid comparator is implemented and at least 8 bit vmid size
1897         */
1898        if (!drvdata->vmid_size || !drvdata->numvmidc)
1899                return -EINVAL;
1900        if (sscanf(buf, "%lx %lx", &val1, &val2) != 2)
1901                return -EINVAL;
1902
1903        spin_lock(&drvdata->spinlock);
1904
1905        /*
1906         * each byte[0..3] controls mask value applied to vmid
1907         * comparator[0..3]
1908         */
1909        switch (drvdata->numvmidc) {
1910        case 0x1:
1911                /* COMP0, bits[7:0] */
1912                config->vmid_mask0 = val1 & 0xFF;
1913                break;
1914        case 0x2:
1915                /* COMP1, bits[15:8] */
1916                config->vmid_mask0 = val1 & 0xFFFF;
1917                break;
1918        case 0x3:
1919                /* COMP2, bits[23:16] */
1920                config->vmid_mask0 = val1 & 0xFFFFFF;
1921                break;
1922        case 0x4:
1923                /* COMP3, bits[31:24] */
1924                config->vmid_mask0 = val1;
1925                break;
1926        case 0x5:
1927                /* COMP4, bits[7:0] */
1928                config->vmid_mask0 = val1;
1929                config->vmid_mask1 = val2 & 0xFF;
1930                break;
1931        case 0x6:
1932                /* COMP5, bits[15:8] */
1933                config->vmid_mask0 = val1;
1934                config->vmid_mask1 = val2 & 0xFFFF;
1935                break;
1936        case 0x7:
1937                /* COMP6, bits[23:16] */
1938                config->vmid_mask0 = val1;
1939                config->vmid_mask1 = val2 & 0xFFFFFF;
1940                break;
1941        case 0x8:
1942                /* COMP7, bits[31:24] */
1943                config->vmid_mask0 = val1;
1944                config->vmid_mask1 = val2;
1945                break;
1946        default:
1947                break;
1948        }
1949
1950        /*
1951         * If software sets a mask bit to 1, it must program relevant byte
1952         * of vmid comparator value 0x0, otherwise behavior is unpredictable.
1953         * For example, if bit[3] of vmid_mask0 is 1, we must clear bits[31:24]
1954         * of vmid comparator0 value (corresponding to byte 0) register.
1955         */
1956        mask = config->vmid_mask0;
1957        for (i = 0; i < drvdata->numvmidc; i++) {
1958                /* mask value of corresponding vmid comparator */
1959                maskbyte = mask & ETMv4_EVENT_MASK;
1960                /*
1961                 * each bit corresponds to a byte of respective vmid comparator
1962                 * value register
1963                 */
1964                for (j = 0; j < 8; j++) {
1965                        if (maskbyte & 1)
1966                                config->vmid_val[i] &= ~(0xFF << (j * 8));
1967                        maskbyte >>= 1;
1968                }
1969                /* Select the next vmid comparator mask value */
1970                if (i == 3)
1971                        /* vmid comparators[4-7] */
1972                        mask = config->vmid_mask1;
1973                else
1974                        mask >>= 0x8;
1975        }
1976        spin_unlock(&drvdata->spinlock);
1977        return size;
1978}
1979static DEVICE_ATTR_RW(vmid_masks);
1980
1981static ssize_t cpu_show(struct device *dev,
1982                        struct device_attribute *attr, char *buf)
1983{
1984        int val;
1985        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1986
1987        val = drvdata->cpu;
1988        return scnprintf(buf, PAGE_SIZE, "%d\n", val);
1989
1990}
1991static DEVICE_ATTR_RO(cpu);
1992
1993static struct attribute *coresight_etmv4_attrs[] = {
1994        &dev_attr_nr_pe_cmp.attr,
1995        &dev_attr_nr_addr_cmp.attr,
1996        &dev_attr_nr_cntr.attr,
1997        &dev_attr_nr_ext_inp.attr,
1998        &dev_attr_numcidc.attr,
1999        &dev_attr_numvmidc.attr,
2000        &dev_attr_nrseqstate.attr,
2001        &dev_attr_nr_resource.attr,
2002        &dev_attr_nr_ss_cmp.attr,
2003        &dev_attr_reset.attr,
2004        &dev_attr_mode.attr,
2005        &dev_attr_pe.attr,
2006        &dev_attr_event.attr,
2007        &dev_attr_event_instren.attr,
2008        &dev_attr_event_ts.attr,
2009        &dev_attr_syncfreq.attr,
2010        &dev_attr_cyc_threshold.attr,
2011        &dev_attr_bb_ctrl.attr,
2012        &dev_attr_event_vinst.attr,
2013        &dev_attr_s_exlevel_vinst.attr,
2014        &dev_attr_ns_exlevel_vinst.attr,
2015        &dev_attr_addr_idx.attr,
2016        &dev_attr_addr_instdatatype.attr,
2017        &dev_attr_addr_single.attr,
2018        &dev_attr_addr_range.attr,
2019        &dev_attr_addr_start.attr,
2020        &dev_attr_addr_stop.attr,
2021        &dev_attr_addr_ctxtype.attr,
2022        &dev_attr_addr_context.attr,
2023        &dev_attr_seq_idx.attr,
2024        &dev_attr_seq_state.attr,
2025        &dev_attr_seq_event.attr,
2026        &dev_attr_seq_reset_event.attr,
2027        &dev_attr_cntr_idx.attr,
2028        &dev_attr_cntrldvr.attr,
2029        &dev_attr_cntr_val.attr,
2030        &dev_attr_cntr_ctrl.attr,
2031        &dev_attr_res_idx.attr,
2032        &dev_attr_res_ctrl.attr,
2033        &dev_attr_ctxid_idx.attr,
2034        &dev_attr_ctxid_pid.attr,
2035        &dev_attr_ctxid_masks.attr,
2036        &dev_attr_vmid_idx.attr,
2037        &dev_attr_vmid_val.attr,
2038        &dev_attr_vmid_masks.attr,
2039        &dev_attr_cpu.attr,
2040        NULL,
2041};
2042
2043struct etmv4_reg {
2044        void __iomem *addr;
2045        u32 data;
2046};
2047
2048static void do_smp_cross_read(void *data)
2049{
2050        struct etmv4_reg *reg = data;
2051
2052        reg->data = readl_relaxed(reg->addr);
2053}
2054
2055static u32 etmv4_cross_read(const struct device *dev, u32 offset)
2056{
2057        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev);
2058        struct etmv4_reg reg;
2059
2060        reg.addr = drvdata->base + offset;
2061        /*
2062         * smp cross call ensures the CPU will be powered up before
2063         * accessing the ETMv4 trace core registers
2064         */
2065        smp_call_function_single(drvdata->cpu, do_smp_cross_read, &reg, 1);
2066        return reg.data;
2067}
2068
2069#define coresight_etm4x_simple_func(name, offset)                       \
2070        coresight_simple_func(struct etmv4_drvdata, NULL, name, offset)
2071
2072#define coresight_etm4x_cross_read(name, offset)                        \
2073        coresight_simple_func(struct etmv4_drvdata, etmv4_cross_read,   \
2074                              name, offset)
2075
2076coresight_etm4x_simple_func(trcpdcr, TRCPDCR);
2077coresight_etm4x_simple_func(trcpdsr, TRCPDSR);
2078coresight_etm4x_simple_func(trclsr, TRCLSR);
2079coresight_etm4x_simple_func(trcauthstatus, TRCAUTHSTATUS);
2080coresight_etm4x_simple_func(trcdevid, TRCDEVID);
2081coresight_etm4x_simple_func(trcdevtype, TRCDEVTYPE);
2082coresight_etm4x_simple_func(trcpidr0, TRCPIDR0);
2083coresight_etm4x_simple_func(trcpidr1, TRCPIDR1);
2084coresight_etm4x_simple_func(trcpidr2, TRCPIDR2);
2085coresight_etm4x_simple_func(trcpidr3, TRCPIDR3);
2086coresight_etm4x_cross_read(trcoslsr, TRCOSLSR);
2087coresight_etm4x_cross_read(trcconfig, TRCCONFIGR);
2088coresight_etm4x_cross_read(trctraceid, TRCTRACEIDR);
2089
2090static struct attribute *coresight_etmv4_mgmt_attrs[] = {
2091        &dev_attr_trcoslsr.attr,
2092        &dev_attr_trcpdcr.attr,
2093        &dev_attr_trcpdsr.attr,
2094        &dev_attr_trclsr.attr,
2095        &dev_attr_trcconfig.attr,
2096        &dev_attr_trctraceid.attr,
2097        &dev_attr_trcauthstatus.attr,
2098        &dev_attr_trcdevid.attr,
2099        &dev_attr_trcdevtype.attr,
2100        &dev_attr_trcpidr0.attr,
2101        &dev_attr_trcpidr1.attr,
2102        &dev_attr_trcpidr2.attr,
2103        &dev_attr_trcpidr3.attr,
2104        NULL,
2105};
2106
2107coresight_etm4x_cross_read(trcidr0, TRCIDR0);
2108coresight_etm4x_cross_read(trcidr1, TRCIDR1);
2109coresight_etm4x_cross_read(trcidr2, TRCIDR2);
2110coresight_etm4x_cross_read(trcidr3, TRCIDR3);
2111coresight_etm4x_cross_read(trcidr4, TRCIDR4);
2112coresight_etm4x_cross_read(trcidr5, TRCIDR5);
2113/* trcidr[6,7] are reserved */
2114coresight_etm4x_cross_read(trcidr8, TRCIDR8);
2115coresight_etm4x_cross_read(trcidr9, TRCIDR9);
2116coresight_etm4x_cross_read(trcidr10, TRCIDR10);
2117coresight_etm4x_cross_read(trcidr11, TRCIDR11);
2118coresight_etm4x_cross_read(trcidr12, TRCIDR12);
2119coresight_etm4x_cross_read(trcidr13, TRCIDR13);
2120
2121static struct attribute *coresight_etmv4_trcidr_attrs[] = {
2122        &dev_attr_trcidr0.attr,
2123        &dev_attr_trcidr1.attr,
2124        &dev_attr_trcidr2.attr,
2125        &dev_attr_trcidr3.attr,
2126        &dev_attr_trcidr4.attr,
2127        &dev_attr_trcidr5.attr,
2128        /* trcidr[6,7] are reserved */
2129        &dev_attr_trcidr8.attr,
2130        &dev_attr_trcidr9.attr,
2131        &dev_attr_trcidr10.attr,
2132        &dev_attr_trcidr11.attr,
2133        &dev_attr_trcidr12.attr,
2134        &dev_attr_trcidr13.attr,
2135        NULL,
2136};
2137
2138static const struct attribute_group coresight_etmv4_group = {
2139        .attrs = coresight_etmv4_attrs,
2140};
2141
2142static const struct attribute_group coresight_etmv4_mgmt_group = {
2143        .attrs = coresight_etmv4_mgmt_attrs,
2144        .name = "mgmt",
2145};
2146
2147static const struct attribute_group coresight_etmv4_trcidr_group = {
2148        .attrs = coresight_etmv4_trcidr_attrs,
2149        .name = "trcidr",
2150};
2151
2152const struct attribute_group *coresight_etmv4_groups[] = {
2153        &coresight_etmv4_group,
2154        &coresight_etmv4_mgmt_group,
2155        &coresight_etmv4_trcidr_group,
2156        NULL,
2157};
2158