OSDN Git Service

Merge drm/drm-fixes into drm-misc-fixes
[tomoyo/tomoyo-test1.git] / drivers / hwtracing / coresight / coresight-cti-sysfs.c
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 };