arm64: dts: qcom: sm8550: add TRNG node
[linux-modified.git] / arch / powerpc / perf / hv-24x7.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Hypervisor supplied "24x7" performance counter support
4  *
5  * Author: Cody P Schafer <cody@linux.vnet.ibm.com>
6  * Copyright 2014 IBM Corporation.
7  */
8
9 #define pr_fmt(fmt) "hv-24x7: " fmt
10
11 #include <linux/perf_event.h>
12 #include <linux/rbtree.h>
13 #include <linux/module.h>
14 #include <linux/slab.h>
15 #include <linux/vmalloc.h>
16
17 #include <asm/cputhreads.h>
18 #include <asm/firmware.h>
19 #include <asm/hvcall.h>
20 #include <asm/io.h>
21 #include <asm/papr-sysparm.h>
22 #include <linux/byteorder/generic.h>
23
24 #include <asm/rtas.h>
25 #include "hv-24x7.h"
26 #include "hv-24x7-catalog.h"
27 #include "hv-common.h"
28
29 /* Version of the 24x7 hypervisor API that we should use in this machine. */
30 static int interface_version;
31
32 /* Whether we have to aggregate result data for some domains. */
33 static bool aggregate_result_elements;
34
35 static cpumask_t hv_24x7_cpumask;
36
37 static bool domain_is_valid(unsigned int domain)
38 {
39         switch (domain) {
40 #define DOMAIN(n, v, x, c)              \
41         case HV_PERF_DOMAIN_##n:        \
42                 /* fall through */
43 #include "hv-24x7-domains.h"
44 #undef DOMAIN
45                 return true;
46         default:
47                 return false;
48         }
49 }
50
51 static bool is_physical_domain(unsigned int domain)
52 {
53         switch (domain) {
54 #define DOMAIN(n, v, x, c)              \
55         case HV_PERF_DOMAIN_##n:        \
56                 return c;
57 #include "hv-24x7-domains.h"
58 #undef DOMAIN
59         default:
60                 return false;
61         }
62 }
63
64 /*
65  * The Processor Module Information system parameter allows transferring
66  * of certain processor module information from the platform to the OS.
67  * Refer PAPR+ document to get parameter token value as '43'.
68  */
69
70 static u32 phys_sockets;        /* Physical sockets */
71 static u32 phys_chipspersocket; /* Physical chips per socket*/
72 static u32 phys_coresperchip; /* Physical cores per chip */
73
74 /*
75  * read_24x7_sys_info()
76  * Retrieve the number of sockets and chips per socket and cores per
77  * chip details through the get-system-parameter rtas call.
78  */
79 void read_24x7_sys_info(void)
80 {
81         struct papr_sysparm_buf *buf;
82
83         /*
84          * Making system parameter: chips and sockets and cores per chip
85          * default to 1.
86          */
87         phys_sockets = 1;
88         phys_chipspersocket = 1;
89         phys_coresperchip = 1;
90
91         buf = papr_sysparm_buf_alloc();
92         if (!buf)
93                 return;
94
95         if (!papr_sysparm_get(PAPR_SYSPARM_PROC_MODULE_INFO, buf)) {
96                 int ntypes = be16_to_cpup((__be16 *)&buf->val[0]);
97                 int len = be16_to_cpu(buf->len);
98
99                 if (len >= 8 && ntypes != 0) {
100                         phys_sockets = be16_to_cpup((__be16 *)&buf->val[2]);
101                         phys_chipspersocket = be16_to_cpup((__be16 *)&buf->val[4]);
102                         phys_coresperchip = be16_to_cpup((__be16 *)&buf->val[6]);
103                 }
104         }
105
106         papr_sysparm_buf_free(buf);
107 }
108
109 /* Domains for which more than one result element are returned for each event. */
110 static bool domain_needs_aggregation(unsigned int domain)
111 {
112         return aggregate_result_elements &&
113                         (domain == HV_PERF_DOMAIN_PHYS_CORE ||
114                          (domain >= HV_PERF_DOMAIN_VCPU_HOME_CORE &&
115                           domain <= HV_PERF_DOMAIN_VCPU_REMOTE_NODE));
116 }
117
118 static const char *domain_name(unsigned int domain)
119 {
120         if (!domain_is_valid(domain))
121                 return NULL;
122
123         switch (domain) {
124         case HV_PERF_DOMAIN_PHYS_CHIP:          return "Physical Chip";
125         case HV_PERF_DOMAIN_PHYS_CORE:          return "Physical Core";
126         case HV_PERF_DOMAIN_VCPU_HOME_CORE:     return "VCPU Home Core";
127         case HV_PERF_DOMAIN_VCPU_HOME_CHIP:     return "VCPU Home Chip";
128         case HV_PERF_DOMAIN_VCPU_HOME_NODE:     return "VCPU Home Node";
129         case HV_PERF_DOMAIN_VCPU_REMOTE_NODE:   return "VCPU Remote Node";
130         }
131
132         WARN_ON_ONCE(domain);
133         return NULL;
134 }
135
136 static bool catalog_entry_domain_is_valid(unsigned int domain)
137 {
138         /* POWER8 doesn't support virtual domains. */
139         if (interface_version == 1)
140                 return is_physical_domain(domain);
141         else
142                 return domain_is_valid(domain);
143 }
144
145 /*
146  * TODO: Merging events:
147  * - Think of the hcall as an interface to a 4d array of counters:
148  *   - x = domains
149  *   - y = indexes in the domain (core, chip, vcpu, node, etc)
150  *   - z = offset into the counter space
151  *   - w = lpars (guest vms, "logical partitions")
152  * - A single request is: x,y,y_last,z,z_last,w,w_last
153  *   - this means we can retrieve a rectangle of counters in y,z for a single x.
154  *
155  * - Things to consider (ignoring w):
156  *   - input  cost_per_request = 16
157  *   - output cost_per_result(ys,zs)  = 8 + 8 * ys + ys * zs
158  *   - limited number of requests per hcall (must fit into 4K bytes)
159  *     - 4k = 16 [buffer header] - 16 [request size] * request_count
160  *     - 255 requests per hcall
161  *   - sometimes it will be more efficient to read extra data and discard
162  */
163
164 /*
165  * Example usage:
166  *  perf stat -e 'hv_24x7/domain=2,offset=8,vcpu=0,lpar=0xffffffff/'
167  */
168
169 /* u3 0-6, one of HV_24X7_PERF_DOMAIN */
170 EVENT_DEFINE_RANGE_FORMAT(domain, config, 0, 3);
171 /* u16 */
172 EVENT_DEFINE_RANGE_FORMAT(core, config, 16, 31);
173 EVENT_DEFINE_RANGE_FORMAT(chip, config, 16, 31);
174 EVENT_DEFINE_RANGE_FORMAT(vcpu, config, 16, 31);
175 /* u32, see "data_offset" */
176 EVENT_DEFINE_RANGE_FORMAT(offset, config, 32, 63);
177 /* u16 */
178 EVENT_DEFINE_RANGE_FORMAT(lpar, config1, 0, 15);
179
180 EVENT_DEFINE_RANGE(reserved1, config,   4, 15);
181 EVENT_DEFINE_RANGE(reserved2, config1, 16, 63);
182 EVENT_DEFINE_RANGE(reserved3, config2,  0, 63);
183
184 static struct attribute *format_attrs[] = {
185         &format_attr_domain.attr,
186         &format_attr_offset.attr,
187         &format_attr_core.attr,
188         &format_attr_chip.attr,
189         &format_attr_vcpu.attr,
190         &format_attr_lpar.attr,
191         NULL,
192 };
193
194 static const struct attribute_group format_group = {
195         .name = "format",
196         .attrs = format_attrs,
197 };
198
199 static struct attribute_group event_group = {
200         .name = "events",
201         /* .attrs is set in init */
202 };
203
204 static struct attribute_group event_desc_group = {
205         .name = "event_descs",
206         /* .attrs is set in init */
207 };
208
209 static struct attribute_group event_long_desc_group = {
210         .name = "event_long_descs",
211         /* .attrs is set in init */
212 };
213
214 static struct kmem_cache *hv_page_cache;
215
216 static DEFINE_PER_CPU(int, hv_24x7_txn_flags);
217 static DEFINE_PER_CPU(int, hv_24x7_txn_err);
218
219 struct hv_24x7_hw {
220         struct perf_event *events[255];
221 };
222
223 static DEFINE_PER_CPU(struct hv_24x7_hw, hv_24x7_hw);
224
225 /*
226  * request_buffer and result_buffer are not required to be 4k aligned,
227  * but are not allowed to cross any 4k boundary. Aligning them to 4k is
228  * the simplest way to ensure that.
229  */
230 #define H24x7_DATA_BUFFER_SIZE  4096
231 static DEFINE_PER_CPU(char, hv_24x7_reqb[H24x7_DATA_BUFFER_SIZE]) __aligned(4096);
232 static DEFINE_PER_CPU(char, hv_24x7_resb[H24x7_DATA_BUFFER_SIZE]) __aligned(4096);
233
234 static unsigned int max_num_requests(int interface_version)
235 {
236         return (H24x7_DATA_BUFFER_SIZE - sizeof(struct hv_24x7_request_buffer))
237                 / H24x7_REQUEST_SIZE(interface_version);
238 }
239
240 static char *event_name(struct hv_24x7_event_data *ev, int *len)
241 {
242         *len = be16_to_cpu(ev->event_name_len) - 2;
243         return (char *)ev->remainder;
244 }
245
246 static char *event_desc(struct hv_24x7_event_data *ev, int *len)
247 {
248         unsigned int nl = be16_to_cpu(ev->event_name_len);
249         __be16 *desc_len = (__be16 *)(ev->remainder + nl - 2);
250
251         *len = be16_to_cpu(*desc_len) - 2;
252         return (char *)ev->remainder + nl;
253 }
254
255 static char *event_long_desc(struct hv_24x7_event_data *ev, int *len)
256 {
257         unsigned int nl = be16_to_cpu(ev->event_name_len);
258         __be16 *desc_len_ = (__be16 *)(ev->remainder + nl - 2);
259         unsigned int desc_len = be16_to_cpu(*desc_len_);
260         __be16 *long_desc_len = (__be16 *)(ev->remainder + nl + desc_len - 2);
261
262         *len = be16_to_cpu(*long_desc_len) - 2;
263         return (char *)ev->remainder + nl + desc_len;
264 }
265
266 static bool event_fixed_portion_is_within(struct hv_24x7_event_data *ev,
267                                           void *end)
268 {
269         void *start = ev;
270
271         return (start + offsetof(struct hv_24x7_event_data, remainder)) < end;
272 }
273
274 /*
275  * Things we don't check:
276  *  - padding for desc, name, and long/detailed desc is required to be '\0'
277  *    bytes.
278  *
279  *  Return NULL if we pass end,
280  *  Otherwise return the address of the byte just following the event.
281  */
282 static void *event_end(struct hv_24x7_event_data *ev, void *end)
283 {
284         void *start = ev;
285         __be16 *dl_, *ldl_;
286         unsigned int dl, ldl;
287         unsigned int nl = be16_to_cpu(ev->event_name_len);
288
289         if (nl < 2) {
290                 pr_debug("%s: name length too short: %d", __func__, nl);
291                 return NULL;
292         }
293
294         if (start + nl > end) {
295                 pr_debug("%s: start=%p + nl=%u > end=%p",
296                                 __func__, start, nl, end);
297                 return NULL;
298         }
299
300         dl_ = (__be16 *)(ev->remainder + nl - 2);
301         if (!IS_ALIGNED((uintptr_t)dl_, 2))
302                 pr_warn("desc len not aligned %p", dl_);
303         dl = be16_to_cpu(*dl_);
304         if (dl < 2) {
305                 pr_debug("%s: desc len too short: %d", __func__, dl);
306                 return NULL;
307         }
308
309         if (start + nl + dl > end) {
310                 pr_debug("%s: (start=%p + nl=%u + dl=%u)=%p > end=%p",
311                                 __func__, start, nl, dl, start + nl + dl, end);
312                 return NULL;
313         }
314
315         ldl_ = (__be16 *)(ev->remainder + nl + dl - 2);
316         if (!IS_ALIGNED((uintptr_t)ldl_, 2))
317                 pr_warn("long desc len not aligned %p", ldl_);
318         ldl = be16_to_cpu(*ldl_);
319         if (ldl < 2) {
320                 pr_debug("%s: long desc len too short (ldl=%u)",
321                                 __func__, ldl);
322                 return NULL;
323         }
324
325         if (start + nl + dl + ldl > end) {
326                 pr_debug("%s: start=%p + nl=%u + dl=%u + ldl=%u > end=%p",
327                                 __func__, start, nl, dl, ldl, end);
328                 return NULL;
329         }
330
331         return start + nl + dl + ldl;
332 }
333
334 static long h_get_24x7_catalog_page_(unsigned long phys_4096,
335                                      unsigned long version, unsigned long index)
336 {
337         pr_devel("h_get_24x7_catalog_page(0x%lx, %lu, %lu)",
338                         phys_4096, version, index);
339
340         WARN_ON(!IS_ALIGNED(phys_4096, 4096));
341
342         return plpar_hcall_norets(H_GET_24X7_CATALOG_PAGE,
343                         phys_4096, version, index);
344 }
345
346 static long h_get_24x7_catalog_page(char page[], u64 version, u32 index)
347 {
348         return h_get_24x7_catalog_page_(virt_to_phys(page),
349                                         version, index);
350 }
351
352 /*
353  * Each event we find in the catalog, will have a sysfs entry. Format the
354  * data for this sysfs entry based on the event's domain.
355  *
356  * Events belonging to the Chip domain can only be monitored in that domain.
357  * i.e the domain for these events is a fixed/knwon value.
358  *
359  * Events belonging to the Core domain can be monitored either in the physical
360  * core or in one of the virtual CPU domains. So the domain value for these
361  * events must be specified by the user (i.e is a required parameter). Format
362  * the Core events with 'domain=?' so the perf-tool can error check required
363  * parameters.
364  *
365  * NOTE: For the Core domain events, rather than making domain a required
366  *       parameter we could default it to PHYS_CORE and allowe users to
367  *       override the domain to one of the VCPU domains.
368  *
369  *       However, this can make the interface a little inconsistent.
370  *
371  *       If we set domain=2 (PHYS_CHIP) and allow user to override this field
372  *       the user may be tempted to also modify the "offset=x" field in which
373  *       can lead to confusing usage. Consider the HPM_PCYC (offset=0x18) and
374  *       HPM_INST (offset=0x20) events. With:
375  *
376  *              perf stat -e hv_24x7/HPM_PCYC,offset=0x20/
377  *
378  *      we end up monitoring HPM_INST, while the command line has HPM_PCYC.
379  *
380  *      By not assigning a default value to the domain for the Core events,
381  *      we can have simple guidelines:
382  *
383  *              - Specifying values for parameters with "=?" is required.
384  *
385  *              - Specifying (i.e overriding) values for other parameters
386  *                is undefined.
387  */
388 static char *event_fmt(struct hv_24x7_event_data *event, unsigned int domain)
389 {
390         const char *sindex;
391         const char *lpar;
392         const char *domain_str;
393         char buf[8];
394
395         switch (domain) {
396         case HV_PERF_DOMAIN_PHYS_CHIP:
397                 snprintf(buf, sizeof(buf), "%d", domain);
398                 domain_str = buf;
399                 lpar = "0x0";
400                 sindex = "chip";
401                 break;
402         case HV_PERF_DOMAIN_PHYS_CORE:
403                 domain_str = "?";
404                 lpar = "0x0";
405                 sindex = "core";
406                 break;
407         default:
408                 domain_str = "?";
409                 lpar = "?";
410                 sindex = "vcpu";
411         }
412
413         return kasprintf(GFP_KERNEL,
414                         "domain=%s,offset=0x%x,%s=?,lpar=%s",
415                         domain_str,
416                         be16_to_cpu(event->event_counter_offs) +
417                                 be16_to_cpu(event->event_group_record_offs),
418                         sindex,
419                         lpar);
420 }
421
422 /* Avoid trusting fw to NUL terminate strings */
423 static char *memdup_to_str(char *maybe_str, int max_len, gfp_t gfp)
424 {
425         return kasprintf(gfp, "%.*s", max_len, maybe_str);
426 }
427
428 static ssize_t device_show_string(struct device *dev,
429                 struct device_attribute *attr, char *buf)
430 {
431         struct dev_ext_attribute *d;
432
433         d = container_of(attr, struct dev_ext_attribute, attr);
434
435         return sprintf(buf, "%s\n", (char *)d->var);
436 }
437
438 static ssize_t cpumask_show(struct device *dev,
439                             struct device_attribute *attr, char *buf)
440 {
441         return cpumap_print_to_pagebuf(true, buf, &hv_24x7_cpumask);
442 }
443
444 static ssize_t sockets_show(struct device *dev,
445                             struct device_attribute *attr, char *buf)
446 {
447         return sprintf(buf, "%d\n", phys_sockets);
448 }
449
450 static ssize_t chipspersocket_show(struct device *dev,
451                                    struct device_attribute *attr, char *buf)
452 {
453         return sprintf(buf, "%d\n", phys_chipspersocket);
454 }
455
456 static ssize_t coresperchip_show(struct device *dev,
457                                  struct device_attribute *attr, char *buf)
458 {
459         return sprintf(buf, "%d\n", phys_coresperchip);
460 }
461
462 static struct attribute *device_str_attr_create_(char *name, char *str)
463 {
464         struct dev_ext_attribute *attr = kzalloc(sizeof(*attr), GFP_KERNEL);
465
466         if (!attr)
467                 return NULL;
468
469         sysfs_attr_init(&attr->attr.attr);
470
471         attr->var = str;
472         attr->attr.attr.name = name;
473         attr->attr.attr.mode = 0444;
474         attr->attr.show = device_show_string;
475
476         return &attr->attr.attr;
477 }
478
479 /*
480  * Allocate and initialize strings representing event attributes.
481  *
482  * NOTE: The strings allocated here are never destroyed and continue to
483  *       exist till shutdown. This is to allow us to create as many events
484  *       from the catalog as possible, even if we encounter errors with some.
485  *       In case of changes to error paths in future, these may need to be
486  *       freed by the caller.
487  */
488 static struct attribute *device_str_attr_create(char *name, int name_max,
489                                                 int name_nonce,
490                                                 char *str, size_t str_max)
491 {
492         char *n;
493         char *s = memdup_to_str(str, str_max, GFP_KERNEL);
494         struct attribute *a;
495
496         if (!s)
497                 return NULL;
498
499         if (!name_nonce)
500                 n = kasprintf(GFP_KERNEL, "%.*s", name_max, name);
501         else
502                 n = kasprintf(GFP_KERNEL, "%.*s__%d", name_max, name,
503                                         name_nonce);
504         if (!n)
505                 goto out_s;
506
507         a = device_str_attr_create_(n, s);
508         if (!a)
509                 goto out_n;
510
511         return a;
512 out_n:
513         kfree(n);
514 out_s:
515         kfree(s);
516         return NULL;
517 }
518
519 static struct attribute *event_to_attr(unsigned int ix,
520                                        struct hv_24x7_event_data *event,
521                                        unsigned int domain,
522                                        int nonce)
523 {
524         int event_name_len;
525         char *ev_name, *a_ev_name, *val;
526         struct attribute *attr;
527
528         if (!domain_is_valid(domain)) {
529                 pr_warn("catalog event %u has invalid domain %u\n",
530                                 ix, domain);
531                 return NULL;
532         }
533
534         val = event_fmt(event, domain);
535         if (!val)
536                 return NULL;
537
538         ev_name = event_name(event, &event_name_len);
539         if (!nonce)
540                 a_ev_name = kasprintf(GFP_KERNEL, "%.*s",
541                                 (int)event_name_len, ev_name);
542         else
543                 a_ev_name = kasprintf(GFP_KERNEL, "%.*s__%d",
544                                 (int)event_name_len, ev_name, nonce);
545
546         if (!a_ev_name)
547                 goto out_val;
548
549         attr = device_str_attr_create_(a_ev_name, val);
550         if (!attr)
551                 goto out_name;
552
553         return attr;
554 out_name:
555         kfree(a_ev_name);
556 out_val:
557         kfree(val);
558         return NULL;
559 }
560
561 static struct attribute *event_to_desc_attr(struct hv_24x7_event_data *event,
562                                             int nonce)
563 {
564         int nl, dl;
565         char *name = event_name(event, &nl);
566         char *desc = event_desc(event, &dl);
567
568         /* If there isn't a description, don't create the sysfs file */
569         if (!dl)
570                 return NULL;
571
572         return device_str_attr_create(name, nl, nonce, desc, dl);
573 }
574
575 static struct attribute *
576 event_to_long_desc_attr(struct hv_24x7_event_data *event, int nonce)
577 {
578         int nl, dl;
579         char *name = event_name(event, &nl);
580         char *desc = event_long_desc(event, &dl);
581
582         /* If there isn't a description, don't create the sysfs file */
583         if (!dl)
584                 return NULL;
585
586         return device_str_attr_create(name, nl, nonce, desc, dl);
587 }
588
589 static int event_data_to_attrs(unsigned int ix, struct attribute **attrs,
590                                struct hv_24x7_event_data *event, int nonce)
591 {
592         *attrs = event_to_attr(ix, event, event->domain, nonce);
593         if (!*attrs)
594                 return -1;
595
596         return 0;
597 }
598
599 /* */
600 struct event_uniq {
601         struct rb_node node;
602         const char *name;
603         int nl;
604         unsigned int ct;
605         unsigned int domain;
606 };
607
608 static int memord(const void *d1, size_t s1, const void *d2, size_t s2)
609 {
610         if (s1 < s2)
611                 return 1;
612         if (s1 > s2)
613                 return -1;
614
615         return memcmp(d1, d2, s1);
616 }
617
618 static int ev_uniq_ord(const void *v1, size_t s1, unsigned int d1,
619                        const void *v2, size_t s2, unsigned int d2)
620 {
621         int r = memord(v1, s1, v2, s2);
622
623         if (r)
624                 return r;
625         if (d1 > d2)
626                 return 1;
627         if (d2 > d1)
628                 return -1;
629         return 0;
630 }
631
632 static int event_uniq_add(struct rb_root *root, const char *name, int nl,
633                           unsigned int domain)
634 {
635         struct rb_node **new = &(root->rb_node), *parent = NULL;
636         struct event_uniq *data;
637
638         /* Figure out where to put new node */
639         while (*new) {
640                 struct event_uniq *it;
641                 int result;
642
643                 it = rb_entry(*new, struct event_uniq, node);
644                 result = ev_uniq_ord(name, nl, domain, it->name, it->nl,
645                                         it->domain);
646
647                 parent = *new;
648                 if (result < 0)
649                         new = &((*new)->rb_left);
650                 else if (result > 0)
651                         new = &((*new)->rb_right);
652                 else {
653                         it->ct++;
654                         pr_info("found a duplicate event %.*s, ct=%u\n", nl,
655                                                 name, it->ct);
656                         return it->ct;
657                 }
658         }
659
660         data = kmalloc(sizeof(*data), GFP_KERNEL);
661         if (!data)
662                 return -ENOMEM;
663
664         *data = (struct event_uniq) {
665                 .name = name,
666                 .nl = nl,
667                 .ct = 0,
668                 .domain = domain,
669         };
670
671         /* Add new node and rebalance tree. */
672         rb_link_node(&data->node, parent, new);
673         rb_insert_color(&data->node, root);
674
675         /* data->ct */
676         return 0;
677 }
678
679 static void event_uniq_destroy(struct rb_root *root)
680 {
681         /*
682          * the strings we point to are in the giant block of memory filled by
683          * the catalog, and are freed separately.
684          */
685         struct event_uniq *pos, *n;
686
687         rbtree_postorder_for_each_entry_safe(pos, n, root, node)
688                 kfree(pos);
689 }
690
691
692 /*
693  * ensure the event structure's sizes are self consistent and don't cause us to
694  * read outside of the event
695  *
696  * On success, return the event length in bytes.
697  * Otherwise, return -1 (and print as appropriate).
698  */
699 static ssize_t catalog_event_len_validate(struct hv_24x7_event_data *event,
700                                           size_t event_idx,
701                                           size_t event_data_bytes,
702                                           size_t event_entry_count,
703                                           size_t offset, void *end)
704 {
705         ssize_t ev_len;
706         void *ev_end, *calc_ev_end;
707
708         if (offset >= event_data_bytes)
709                 return -1;
710
711         if (event_idx >= event_entry_count) {
712                 pr_devel("catalog event data has %zu bytes of padding after last event\n",
713                                 event_data_bytes - offset);
714                 return -1;
715         }
716
717         if (!event_fixed_portion_is_within(event, end)) {
718                 pr_warn("event %zu fixed portion is not within range\n",
719                                 event_idx);
720                 return -1;
721         }
722
723         ev_len = be16_to_cpu(event->length);
724
725         if (ev_len % 16)
726                 pr_info("event %zu has length %zu not divisible by 16: event=%pK\n",
727                                 event_idx, ev_len, event);
728
729         ev_end = (__u8 *)event + ev_len;
730         if (ev_end > end) {
731                 pr_warn("event %zu has .length=%zu, ends after buffer end: ev_end=%pK > end=%pK, offset=%zu\n",
732                                 event_idx, ev_len, ev_end, end,
733                                 offset);
734                 return -1;
735         }
736
737         calc_ev_end = event_end(event, end);
738         if (!calc_ev_end) {
739                 pr_warn("event %zu has a calculated length which exceeds buffer length %zu: event=%pK end=%pK, offset=%zu\n",
740                         event_idx, event_data_bytes, event, end,
741                         offset);
742                 return -1;
743         }
744
745         if (calc_ev_end > ev_end) {
746                 pr_warn("event %zu exceeds its own length: event=%pK, end=%pK, offset=%zu, calc_ev_end=%pK\n",
747                         event_idx, event, ev_end, offset, calc_ev_end);
748                 return -1;
749         }
750
751         return ev_len;
752 }
753
754 /*
755  * Return true incase of invalid or dummy events with names like RESERVED*
756  */
757 static bool ignore_event(const char *name)
758 {
759         return strncmp(name, "RESERVED", 8) == 0;
760 }
761
762 #define MAX_4K (SIZE_MAX / 4096)
763
764 static int create_events_from_catalog(struct attribute ***events_,
765                                       struct attribute ***event_descs_,
766                                       struct attribute ***event_long_descs_)
767 {
768         long hret;
769         size_t catalog_len, catalog_page_len, event_entry_count,
770                event_data_len, event_data_offs,
771                event_data_bytes, junk_events, event_idx, event_attr_ct, i,
772                attr_max, event_idx_last, desc_ct, long_desc_ct;
773         ssize_t ct, ev_len;
774         uint64_t catalog_version_num;
775         struct attribute **events, **event_descs, **event_long_descs;
776         struct hv_24x7_catalog_page_0 *page_0 =
777                 kmem_cache_alloc(hv_page_cache, GFP_KERNEL);
778         void *page = page_0;
779         void *event_data, *end;
780         struct hv_24x7_event_data *event;
781         struct rb_root ev_uniq = RB_ROOT;
782         int ret = 0;
783
784         if (!page) {
785                 ret = -ENOMEM;
786                 goto e_out;
787         }
788
789         hret = h_get_24x7_catalog_page(page, 0, 0);
790         if (hret) {
791                 ret = -EIO;
792                 goto e_free;
793         }
794
795         catalog_version_num = be64_to_cpu(page_0->version);
796         catalog_page_len = be32_to_cpu(page_0->length);
797
798         if (MAX_4K < catalog_page_len) {
799                 pr_err("invalid page count: %zu\n", catalog_page_len);
800                 ret = -EIO;
801                 goto e_free;
802         }
803
804         catalog_len = catalog_page_len * 4096;
805
806         event_entry_count = be16_to_cpu(page_0->event_entry_count);
807         event_data_offs   = be16_to_cpu(page_0->event_data_offs);
808         event_data_len    = be16_to_cpu(page_0->event_data_len);
809
810         pr_devel("cv %llu cl %zu eec %zu edo %zu edl %zu\n",
811                         catalog_version_num, catalog_len,
812                         event_entry_count, event_data_offs, event_data_len);
813
814         if ((MAX_4K < event_data_len)
815                         || (MAX_4K < event_data_offs)
816                         || (MAX_4K - event_data_offs < event_data_len)) {
817                 pr_err("invalid event data offs %zu and/or len %zu\n",
818                                 event_data_offs, event_data_len);
819                 ret = -EIO;
820                 goto e_free;
821         }
822
823         if ((event_data_offs + event_data_len) > catalog_page_len) {
824                 pr_err("event data %zu-%zu does not fit inside catalog 0-%zu\n",
825                                 event_data_offs,
826                                 event_data_offs + event_data_len,
827                                 catalog_page_len);
828                 ret = -EIO;
829                 goto e_free;
830         }
831
832         if (SIZE_MAX - 1 < event_entry_count) {
833                 pr_err("event_entry_count %zu is invalid\n", event_entry_count);
834                 ret = -EIO;
835                 goto e_free;
836         }
837
838         event_data_bytes = event_data_len * 4096;
839
840         /*
841          * event data can span several pages, events can cross between these
842          * pages. Use vmalloc to make this easier.
843          */
844         event_data = vmalloc(event_data_bytes);
845         if (!event_data) {
846                 pr_err("could not allocate event data\n");
847                 ret = -ENOMEM;
848                 goto e_free;
849         }
850
851         end = event_data + event_data_bytes;
852
853         /*
854          * using vmalloc_to_phys() like this only works if PAGE_SIZE is
855          * divisible by 4096
856          */
857         BUILD_BUG_ON(PAGE_SIZE % 4096);
858
859         for (i = 0; i < event_data_len; i++) {
860                 hret = h_get_24x7_catalog_page_(
861                                 vmalloc_to_phys(event_data + i * 4096),
862                                 catalog_version_num,
863                                 i + event_data_offs);
864                 if (hret) {
865                         pr_err("Failed to get event data in page %zu: rc=%ld\n",
866                                i + event_data_offs, hret);
867                         ret = -EIO;
868                         goto e_event_data;
869                 }
870         }
871
872         /*
873          * scan the catalog to determine the number of attributes we need, and
874          * verify it at the same time.
875          */
876         for (junk_events = 0, event = event_data, event_idx = 0, attr_max = 0;
877              ;
878              event_idx++, event = (void *)event + ev_len) {
879                 size_t offset = (void *)event - (void *)event_data;
880                 char *name;
881                 int nl;
882
883                 ev_len = catalog_event_len_validate(event, event_idx,
884                                                     event_data_bytes,
885                                                     event_entry_count,
886                                                     offset, end);
887                 if (ev_len < 0)
888                         break;
889
890                 name = event_name(event, &nl);
891
892                 if (ignore_event(name)) {
893                         junk_events++;
894                         continue;
895                 }
896                 if (event->event_group_record_len == 0) {
897                         pr_devel("invalid event %zu (%.*s): group_record_len == 0, skipping\n",
898                                         event_idx, nl, name);
899                         junk_events++;
900                         continue;
901                 }
902
903                 if (!catalog_entry_domain_is_valid(event->domain)) {
904                         pr_info("event %zu (%.*s) has invalid domain %d\n",
905                                         event_idx, nl, name, event->domain);
906                         junk_events++;
907                         continue;
908                 }
909
910                 attr_max++;
911         }
912
913         event_idx_last = event_idx;
914         if (event_idx_last != event_entry_count)
915                 pr_warn("event buffer ended before listed # of events were parsed (got %zu, wanted %zu, junk %zu)\n",
916                                 event_idx_last, event_entry_count, junk_events);
917
918         events = kmalloc_array(attr_max + 1, sizeof(*events), GFP_KERNEL);
919         if (!events) {
920                 ret = -ENOMEM;
921                 goto e_event_data;
922         }
923
924         event_descs = kmalloc_array(event_idx + 1, sizeof(*event_descs),
925                                 GFP_KERNEL);
926         if (!event_descs) {
927                 ret = -ENOMEM;
928                 goto e_event_attrs;
929         }
930
931         event_long_descs = kmalloc_array(event_idx + 1,
932                         sizeof(*event_long_descs), GFP_KERNEL);
933         if (!event_long_descs) {
934                 ret = -ENOMEM;
935                 goto e_event_descs;
936         }
937
938         /* Iterate over the catalog filling in the attribute vector */
939         for (junk_events = 0, event_attr_ct = 0, desc_ct = 0, long_desc_ct = 0,
940                                 event = event_data, event_idx = 0;
941                         event_idx < event_idx_last;
942                         event_idx++, ev_len = be16_to_cpu(event->length),
943                                 event = (void *)event + ev_len) {
944                 char *name;
945                 int nl;
946                 int nonce;
947                 /*
948                  * these are the only "bad" events that are intermixed and that
949                  * we can ignore without issue. make sure to skip them here
950                  */
951                 if (event->event_group_record_len == 0)
952                         continue;
953                 if (!catalog_entry_domain_is_valid(event->domain))
954                         continue;
955
956                 name  = event_name(event, &nl);
957                 if (ignore_event(name))
958                         continue;
959
960                 nonce = event_uniq_add(&ev_uniq, name, nl, event->domain);
961                 ct    = event_data_to_attrs(event_idx, events + event_attr_ct,
962                                             event, nonce);
963                 if (ct < 0) {
964                         pr_warn("event %zu (%.*s) creation failure, skipping\n",
965                                 event_idx, nl, name);
966                         junk_events++;
967                 } else {
968                         event_attr_ct++;
969                         event_descs[desc_ct] = event_to_desc_attr(event, nonce);
970                         if (event_descs[desc_ct])
971                                 desc_ct++;
972                         event_long_descs[long_desc_ct] =
973                                         event_to_long_desc_attr(event, nonce);
974                         if (event_long_descs[long_desc_ct])
975                                 long_desc_ct++;
976                 }
977         }
978
979         pr_info("read %zu catalog entries, created %zu event attrs (%zu failures), %zu descs\n",
980                         event_idx, event_attr_ct, junk_events, desc_ct);
981
982         events[event_attr_ct] = NULL;
983         event_descs[desc_ct] = NULL;
984         event_long_descs[long_desc_ct] = NULL;
985
986         event_uniq_destroy(&ev_uniq);
987         vfree(event_data);
988         kmem_cache_free(hv_page_cache, page);
989
990         *events_ = events;
991         *event_descs_ = event_descs;
992         *event_long_descs_ = event_long_descs;
993         return 0;
994
995 e_event_descs:
996         kfree(event_descs);
997 e_event_attrs:
998         kfree(events);
999 e_event_data:
1000         vfree(event_data);
1001 e_free:
1002         kmem_cache_free(hv_page_cache, page);
1003 e_out:
1004         *events_ = NULL;
1005         *event_descs_ = NULL;
1006         *event_long_descs_ = NULL;
1007         return ret;
1008 }
1009
1010 static ssize_t catalog_read(struct file *filp, struct kobject *kobj,
1011                             struct bin_attribute *bin_attr, char *buf,
1012                             loff_t offset, size_t count)
1013 {
1014         long hret;
1015         ssize_t ret = 0;
1016         size_t catalog_len = 0, catalog_page_len = 0;
1017         loff_t page_offset = 0;
1018         loff_t offset_in_page;
1019         size_t copy_len;
1020         uint64_t catalog_version_num = 0;
1021         void *page = kmem_cache_alloc(hv_page_cache, GFP_USER);
1022         struct hv_24x7_catalog_page_0 *page_0 = page;
1023
1024         if (!page)
1025                 return -ENOMEM;
1026
1027         hret = h_get_24x7_catalog_page(page, 0, 0);
1028         if (hret) {
1029                 ret = -EIO;
1030                 goto e_free;
1031         }
1032
1033         catalog_version_num = be64_to_cpu(page_0->version);
1034         catalog_page_len = be32_to_cpu(page_0->length);
1035         catalog_len = catalog_page_len * 4096;
1036
1037         page_offset = offset / 4096;
1038         offset_in_page = offset % 4096;
1039
1040         if (page_offset >= catalog_page_len)
1041                 goto e_free;
1042
1043         if (page_offset != 0) {
1044                 hret = h_get_24x7_catalog_page(page, catalog_version_num,
1045                                                page_offset);
1046                 if (hret) {
1047                         ret = -EIO;
1048                         goto e_free;
1049                 }
1050         }
1051
1052         copy_len = 4096 - offset_in_page;
1053         if (copy_len > count)
1054                 copy_len = count;
1055
1056         memcpy(buf, page+offset_in_page, copy_len);
1057         ret = copy_len;
1058
1059 e_free:
1060         if (hret)
1061                 pr_err("h_get_24x7_catalog_page(ver=%lld, page=%lld) failed:"
1062                        " rc=%ld\n",
1063                        catalog_version_num, page_offset, hret);
1064         kmem_cache_free(hv_page_cache, page);
1065
1066         pr_devel("catalog_read: offset=%lld(%lld) count=%zu "
1067                         "catalog_len=%zu(%zu) => %zd\n", offset, page_offset,
1068                         count, catalog_len, catalog_page_len, ret);
1069
1070         return ret;
1071 }
1072
1073 static ssize_t domains_show(struct device *dev, struct device_attribute *attr,
1074                             char *page)
1075 {
1076         int d, n, count = 0;
1077         const char *str;
1078
1079         for (d = 0; d < HV_PERF_DOMAIN_MAX; d++) {
1080                 str = domain_name(d);
1081                 if (!str)
1082                         continue;
1083
1084                 n = sprintf(page, "%d: %s\n", d, str);
1085                 if (n < 0)
1086                         break;
1087
1088                 count += n;
1089                 page += n;
1090         }
1091         return count;
1092 }
1093
1094 #define PAGE_0_ATTR(_name, _fmt, _expr)                         \
1095 static ssize_t _name##_show(struct device *dev,                 \
1096                             struct device_attribute *dev_attr,  \
1097                             char *buf)                          \
1098 {                                                               \
1099         long hret;                                              \
1100         ssize_t ret = 0;                                        \
1101         void *page = kmem_cache_alloc(hv_page_cache, GFP_USER); \
1102         struct hv_24x7_catalog_page_0 *page_0 = page;           \
1103         if (!page)                                              \
1104                 return -ENOMEM;                                 \
1105         hret = h_get_24x7_catalog_page(page, 0, 0);             \
1106         if (hret) {                                             \
1107                 ret = -EIO;                                     \
1108                 goto e_free;                                    \
1109         }                                                       \
1110         ret = sprintf(buf, _fmt, _expr);                        \
1111 e_free:                                                         \
1112         kmem_cache_free(hv_page_cache, page);                   \
1113         return ret;                                             \
1114 }                                                               \
1115 static DEVICE_ATTR_RO(_name)
1116
1117 PAGE_0_ATTR(catalog_version, "%lld\n",
1118                 (unsigned long long)be64_to_cpu(page_0->version));
1119 PAGE_0_ATTR(catalog_len, "%lld\n",
1120                 (unsigned long long)be32_to_cpu(page_0->length) * 4096);
1121 static BIN_ATTR_RO(catalog, 0/* real length varies */);
1122 static DEVICE_ATTR_RO(domains);
1123 static DEVICE_ATTR_RO(sockets);
1124 static DEVICE_ATTR_RO(chipspersocket);
1125 static DEVICE_ATTR_RO(coresperchip);
1126 static DEVICE_ATTR_RO(cpumask);
1127
1128 static struct bin_attribute *if_bin_attrs[] = {
1129         &bin_attr_catalog,
1130         NULL,
1131 };
1132
1133 static struct attribute *cpumask_attrs[] = {
1134         &dev_attr_cpumask.attr,
1135         NULL,
1136 };
1137
1138 static const struct attribute_group cpumask_attr_group = {
1139         .attrs = cpumask_attrs,
1140 };
1141
1142 static struct attribute *if_attrs[] = {
1143         &dev_attr_catalog_len.attr,
1144         &dev_attr_catalog_version.attr,
1145         &dev_attr_domains.attr,
1146         &dev_attr_sockets.attr,
1147         &dev_attr_chipspersocket.attr,
1148         &dev_attr_coresperchip.attr,
1149         NULL,
1150 };
1151
1152 static const struct attribute_group if_group = {
1153         .name = "interface",
1154         .bin_attrs = if_bin_attrs,
1155         .attrs = if_attrs,
1156 };
1157
1158 static const struct attribute_group *attr_groups[] = {
1159         &format_group,
1160         &event_group,
1161         &event_desc_group,
1162         &event_long_desc_group,
1163         &if_group,
1164         &cpumask_attr_group,
1165         NULL,
1166 };
1167
1168 /*
1169  * Start the process for a new H_GET_24x7_DATA hcall.
1170  */
1171 static void init_24x7_request(struct hv_24x7_request_buffer *request_buffer,
1172                               struct hv_24x7_data_result_buffer *result_buffer)
1173 {
1174
1175         memset(request_buffer, 0, H24x7_DATA_BUFFER_SIZE);
1176         memset(result_buffer, 0, H24x7_DATA_BUFFER_SIZE);
1177
1178         request_buffer->interface_version = interface_version;
1179         /* memset above set request_buffer->num_requests to 0 */
1180 }
1181
1182 /*
1183  * Commit (i.e perform) the H_GET_24x7_DATA hcall using the data collected
1184  * by 'init_24x7_request()' and 'add_event_to_24x7_request()'.
1185  */
1186 static int make_24x7_request(struct hv_24x7_request_buffer *request_buffer,
1187                              struct hv_24x7_data_result_buffer *result_buffer)
1188 {
1189         long ret;
1190
1191         /*
1192          * NOTE: Due to variable number of array elements in request and
1193          *       result buffer(s), sizeof() is not reliable. Use the actual
1194          *       allocated buffer size, H24x7_DATA_BUFFER_SIZE.
1195          */
1196         ret = plpar_hcall_norets(H_GET_24X7_DATA,
1197                         virt_to_phys(request_buffer), H24x7_DATA_BUFFER_SIZE,
1198                         virt_to_phys(result_buffer),  H24x7_DATA_BUFFER_SIZE);
1199
1200         if (ret) {
1201                 struct hv_24x7_request *req;
1202
1203                 req = request_buffer->requests;
1204                 pr_notice_ratelimited("hcall failed: [%d %#x %#x %d] => ret 0x%lx (%ld) detail=0x%x failing ix=%x\n",
1205                                       req->performance_domain, req->data_offset,
1206                                       req->starting_ix, req->starting_lpar_ix,
1207                                       ret, ret, result_buffer->detailed_rc,
1208                                       result_buffer->failing_request_ix);
1209                 return -EIO;
1210         }
1211
1212         return 0;
1213 }
1214
1215 /*
1216  * Add the given @event to the next slot in the 24x7 request_buffer.
1217  *
1218  * Note that H_GET_24X7_DATA hcall allows reading several counters'
1219  * values in a single HCALL. We expect the caller to add events to the
1220  * request buffer one by one, make the HCALL and process the results.
1221  */
1222 static int add_event_to_24x7_request(struct perf_event *event,
1223                                 struct hv_24x7_request_buffer *request_buffer)
1224 {
1225         u16 idx;
1226         int i;
1227         size_t req_size;
1228         struct hv_24x7_request *req;
1229
1230         if (request_buffer->num_requests >=
1231             max_num_requests(request_buffer->interface_version)) {
1232                 pr_devel("Too many requests for 24x7 HCALL %d\n",
1233                                 request_buffer->num_requests);
1234                 return -EINVAL;
1235         }
1236
1237         switch (event_get_domain(event)) {
1238         case HV_PERF_DOMAIN_PHYS_CHIP:
1239                 idx = event_get_chip(event);
1240                 break;
1241         case HV_PERF_DOMAIN_PHYS_CORE:
1242                 idx = event_get_core(event);
1243                 break;
1244         default:
1245                 idx = event_get_vcpu(event);
1246         }
1247
1248         req_size = H24x7_REQUEST_SIZE(request_buffer->interface_version);
1249
1250         i = request_buffer->num_requests++;
1251         req = (void *) request_buffer->requests + i * req_size;
1252
1253         req->performance_domain = event_get_domain(event);
1254         req->data_size = cpu_to_be16(8);
1255         req->data_offset = cpu_to_be32(event_get_offset(event));
1256         req->starting_lpar_ix = cpu_to_be16(event_get_lpar(event));
1257         req->max_num_lpars = cpu_to_be16(1);
1258         req->starting_ix = cpu_to_be16(idx);
1259         req->max_ix = cpu_to_be16(1);
1260
1261         if (request_buffer->interface_version > 1) {
1262                 if (domain_needs_aggregation(req->performance_domain))
1263                         req->max_num_thread_groups = -1;
1264                 else if (req->performance_domain != HV_PERF_DOMAIN_PHYS_CHIP) {
1265                         req->starting_thread_group_ix = idx % 2;
1266                         req->max_num_thread_groups = 1;
1267                 }
1268         }
1269
1270         return 0;
1271 }
1272
1273 /**
1274  * get_count_from_result - get event count from all result elements in result
1275  *
1276  * If the event corresponding to this result needs aggregation of the result
1277  * element values, then this function does that.
1278  *
1279  * @event:      Event associated with @res.
1280  * @resb:       Result buffer containing @res.
1281  * @res:        Result to work on.
1282  * @countp:     Output variable containing the event count.
1283  * @next:       Optional output variable pointing to the next result in @resb.
1284  */
1285 static int get_count_from_result(struct perf_event *event,
1286                                  struct hv_24x7_data_result_buffer *resb,
1287                                  struct hv_24x7_result *res, u64 *countp,
1288                                  struct hv_24x7_result **next)
1289 {
1290         u16 num_elements = be16_to_cpu(res->num_elements_returned);
1291         u16 data_size = be16_to_cpu(res->result_element_data_size);
1292         unsigned int data_offset;
1293         void *element_data;
1294         int i;
1295         u64 count;
1296
1297         /*
1298          * We can bail out early if the result is empty.
1299          */
1300         if (!num_elements) {
1301                 pr_debug("Result of request %hhu is empty, nothing to do\n",
1302                          res->result_ix);
1303
1304                 if (next)
1305                         *next = (struct hv_24x7_result *) res->elements;
1306
1307                 return -ENODATA;
1308         }
1309
1310         /*
1311          * Since we always specify 1 as the maximum for the smallest resource
1312          * we're requesting, there should to be only one element per result.
1313          * Except when an event needs aggregation, in which case there are more.
1314          */
1315         if (num_elements != 1 &&
1316             !domain_needs_aggregation(event_get_domain(event))) {
1317                 pr_err("Error: result of request %hhu has %hu elements\n",
1318                        res->result_ix, num_elements);
1319
1320                 return -EIO;
1321         }
1322
1323         if (data_size != sizeof(u64)) {
1324                 pr_debug("Error: result of request %hhu has data of %hu bytes\n",
1325                          res->result_ix, data_size);
1326
1327                 return -ENOTSUPP;
1328         }
1329
1330         if (resb->interface_version == 1)
1331                 data_offset = offsetof(struct hv_24x7_result_element_v1,
1332                                        element_data);
1333         else
1334                 data_offset = offsetof(struct hv_24x7_result_element_v2,
1335                                        element_data);
1336
1337         /* Go through the result elements in the result. */
1338         for (i = count = 0, element_data = res->elements + data_offset;
1339              i < num_elements;
1340              i++, element_data += data_size + data_offset)
1341                 count += be64_to_cpu(*((__be64 *)element_data));
1342
1343         *countp = count;
1344
1345         /* The next result is after the last result element. */
1346         if (next)
1347                 *next = element_data - data_offset;
1348
1349         return 0;
1350 }
1351
1352 static int single_24x7_request(struct perf_event *event, u64 *count)
1353 {
1354         int ret;
1355         struct hv_24x7_request_buffer *request_buffer;
1356         struct hv_24x7_data_result_buffer *result_buffer;
1357
1358         BUILD_BUG_ON(sizeof(*request_buffer) > 4096);
1359         BUILD_BUG_ON(sizeof(*result_buffer) > 4096);
1360
1361         request_buffer = (void *)get_cpu_var(hv_24x7_reqb);
1362         result_buffer = (void *)get_cpu_var(hv_24x7_resb);
1363
1364         init_24x7_request(request_buffer, result_buffer);
1365
1366         ret = add_event_to_24x7_request(event, request_buffer);
1367         if (ret)
1368                 goto out;
1369
1370         ret = make_24x7_request(request_buffer, result_buffer);
1371         if (ret)
1372                 goto out;
1373
1374         /* process result from hcall */
1375         ret = get_count_from_result(event, result_buffer,
1376                                     result_buffer->results, count, NULL);
1377
1378 out:
1379         put_cpu_var(hv_24x7_reqb);
1380         put_cpu_var(hv_24x7_resb);
1381         return ret;
1382 }
1383
1384
1385 static int h_24x7_event_init(struct perf_event *event)
1386 {
1387         struct hv_perf_caps caps;
1388         unsigned int domain;
1389         unsigned long hret;
1390         u64 ct;
1391
1392         /* Not our event */
1393         if (event->attr.type != event->pmu->type)
1394                 return -ENOENT;
1395
1396         /* Unused areas must be 0 */
1397         if (event_get_reserved1(event) ||
1398             event_get_reserved2(event) ||
1399             event_get_reserved3(event)) {
1400                 pr_devel("reserved set when forbidden 0x%llx(0x%llx) 0x%llx(0x%llx) 0x%llx(0x%llx)\n",
1401                                 event->attr.config,
1402                                 event_get_reserved1(event),
1403                                 event->attr.config1,
1404                                 event_get_reserved2(event),
1405                                 event->attr.config2,
1406                                 event_get_reserved3(event));
1407                 return -EINVAL;
1408         }
1409
1410         /* no branch sampling */
1411         if (has_branch_stack(event))
1412                 return -EOPNOTSUPP;
1413
1414         /* offset must be 8 byte aligned */
1415         if (event_get_offset(event) % 8) {
1416                 pr_devel("bad alignment\n");
1417                 return -EINVAL;
1418         }
1419
1420         domain = event_get_domain(event);
1421         if (domain  == 0 || domain >= HV_PERF_DOMAIN_MAX) {
1422                 pr_devel("invalid domain %d\n", domain);
1423                 return -EINVAL;
1424         }
1425
1426         hret = hv_perf_caps_get(&caps);
1427         if (hret) {
1428                 pr_devel("could not get capabilities: rc=%ld\n", hret);
1429                 return -EIO;
1430         }
1431
1432         /* Physical domains & other lpars require extra capabilities */
1433         if (!caps.collect_privileged && (is_physical_domain(domain) ||
1434                 (event_get_lpar(event) != event_get_lpar_max()))) {
1435                 pr_devel("hv permissions disallow: is_physical_domain:%d, lpar=0x%llx\n",
1436                                 is_physical_domain(domain),
1437                                 event_get_lpar(event));
1438                 return -EACCES;
1439         }
1440
1441         /* Get the initial value of the counter for this event */
1442         if (single_24x7_request(event, &ct)) {
1443                 pr_devel("test hcall failed\n");
1444                 return -EIO;
1445         }
1446         (void)local64_xchg(&event->hw.prev_count, ct);
1447
1448         return 0;
1449 }
1450
1451 static u64 h_24x7_get_value(struct perf_event *event)
1452 {
1453         u64 ct;
1454
1455         if (single_24x7_request(event, &ct))
1456                 /* We checked this in event init, shouldn't fail here... */
1457                 return 0;
1458
1459         return ct;
1460 }
1461
1462 static void update_event_count(struct perf_event *event, u64 now)
1463 {
1464         s64 prev;
1465
1466         prev = local64_xchg(&event->hw.prev_count, now);
1467         local64_add(now - prev, &event->count);
1468 }
1469
1470 static void h_24x7_event_read(struct perf_event *event)
1471 {
1472         u64 now;
1473         struct hv_24x7_request_buffer *request_buffer;
1474         struct hv_24x7_hw *h24x7hw;
1475         int txn_flags;
1476
1477         txn_flags = __this_cpu_read(hv_24x7_txn_flags);
1478
1479         /*
1480          * If in a READ transaction, add this counter to the list of
1481          * counters to read during the next HCALL (i.e commit_txn()).
1482          * If not in a READ transaction, go ahead and make the HCALL
1483          * to read this counter by itself.
1484          */
1485
1486         if (txn_flags & PERF_PMU_TXN_READ) {
1487                 int i;
1488                 int ret;
1489
1490                 if (__this_cpu_read(hv_24x7_txn_err))
1491                         return;
1492
1493                 request_buffer = (void *)get_cpu_var(hv_24x7_reqb);
1494
1495                 ret = add_event_to_24x7_request(event, request_buffer);
1496                 if (ret) {
1497                         __this_cpu_write(hv_24x7_txn_err, ret);
1498                 } else {
1499                         /*
1500                          * Associate the event with the HCALL request index,
1501                          * so ->commit_txn() can quickly find/update count.
1502                          */
1503                         i = request_buffer->num_requests - 1;
1504
1505                         h24x7hw = &get_cpu_var(hv_24x7_hw);
1506                         h24x7hw->events[i] = event;
1507                         put_cpu_var(h24x7hw);
1508                 }
1509
1510                 put_cpu_var(hv_24x7_reqb);
1511         } else {
1512                 now = h_24x7_get_value(event);
1513                 update_event_count(event, now);
1514         }
1515 }
1516
1517 static void h_24x7_event_start(struct perf_event *event, int flags)
1518 {
1519         if (flags & PERF_EF_RELOAD)
1520                 local64_set(&event->hw.prev_count, h_24x7_get_value(event));
1521 }
1522
1523 static void h_24x7_event_stop(struct perf_event *event, int flags)
1524 {
1525         h_24x7_event_read(event);
1526 }
1527
1528 static int h_24x7_event_add(struct perf_event *event, int flags)
1529 {
1530         if (flags & PERF_EF_START)
1531                 h_24x7_event_start(event, flags);
1532
1533         return 0;
1534 }
1535
1536 /*
1537  * 24x7 counters only support READ transactions. They are
1538  * always counting and dont need/support ADD transactions.
1539  * Cache the flags, but otherwise ignore transactions that
1540  * are not PERF_PMU_TXN_READ.
1541  */
1542 static void h_24x7_event_start_txn(struct pmu *pmu, unsigned int flags)
1543 {
1544         struct hv_24x7_request_buffer *request_buffer;
1545         struct hv_24x7_data_result_buffer *result_buffer;
1546
1547         /* We should not be called if we are already in a txn */
1548         WARN_ON_ONCE(__this_cpu_read(hv_24x7_txn_flags));
1549
1550         __this_cpu_write(hv_24x7_txn_flags, flags);
1551         if (flags & ~PERF_PMU_TXN_READ)
1552                 return;
1553
1554         request_buffer = (void *)get_cpu_var(hv_24x7_reqb);
1555         result_buffer = (void *)get_cpu_var(hv_24x7_resb);
1556
1557         init_24x7_request(request_buffer, result_buffer);
1558
1559         put_cpu_var(hv_24x7_resb);
1560         put_cpu_var(hv_24x7_reqb);
1561 }
1562
1563 /*
1564  * Clean up transaction state.
1565  *
1566  * NOTE: Ignore state of request and result buffers for now.
1567  *       We will initialize them during the next read/txn.
1568  */
1569 static void reset_txn(void)
1570 {
1571         __this_cpu_write(hv_24x7_txn_flags, 0);
1572         __this_cpu_write(hv_24x7_txn_err, 0);
1573 }
1574
1575 /*
1576  * 24x7 counters only support READ transactions. They are always counting
1577  * and dont need/support ADD transactions. Clear ->txn_flags but otherwise
1578  * ignore transactions that are not of type PERF_PMU_TXN_READ.
1579  *
1580  * For READ transactions, submit all pending 24x7 requests (i.e requests
1581  * that were queued by h_24x7_event_read()), to the hypervisor and update
1582  * the event counts.
1583  */
1584 static int h_24x7_event_commit_txn(struct pmu *pmu)
1585 {
1586         struct hv_24x7_request_buffer *request_buffer;
1587         struct hv_24x7_data_result_buffer *result_buffer;
1588         struct hv_24x7_result *res, *next_res;
1589         u64 count;
1590         int i, ret, txn_flags;
1591         struct hv_24x7_hw *h24x7hw;
1592
1593         txn_flags = __this_cpu_read(hv_24x7_txn_flags);
1594         WARN_ON_ONCE(!txn_flags);
1595
1596         ret = 0;
1597         if (txn_flags & ~PERF_PMU_TXN_READ)
1598                 goto out;
1599
1600         ret = __this_cpu_read(hv_24x7_txn_err);
1601         if (ret)
1602                 goto out;
1603
1604         request_buffer = (void *)get_cpu_var(hv_24x7_reqb);
1605         result_buffer = (void *)get_cpu_var(hv_24x7_resb);
1606
1607         ret = make_24x7_request(request_buffer, result_buffer);
1608         if (ret)
1609                 goto put_reqb;
1610
1611         h24x7hw = &get_cpu_var(hv_24x7_hw);
1612
1613         /* Go through results in the result buffer to update event counts. */
1614         for (i = 0, res = result_buffer->results;
1615              i < result_buffer->num_results; i++, res = next_res) {
1616                 struct perf_event *event = h24x7hw->events[res->result_ix];
1617
1618                 ret = get_count_from_result(event, result_buffer, res, &count,
1619                                             &next_res);
1620                 if (ret)
1621                         break;
1622
1623                 update_event_count(event, count);
1624         }
1625
1626         put_cpu_var(hv_24x7_hw);
1627
1628 put_reqb:
1629         put_cpu_var(hv_24x7_resb);
1630         put_cpu_var(hv_24x7_reqb);
1631 out:
1632         reset_txn();
1633         return ret;
1634 }
1635
1636 /*
1637  * 24x7 counters only support READ transactions. They are always counting
1638  * and dont need/support ADD transactions. However, regardless of type
1639  * of transaction, all we need to do is cleanup, so we don't have to check
1640  * the type of transaction.
1641  */
1642 static void h_24x7_event_cancel_txn(struct pmu *pmu)
1643 {
1644         WARN_ON_ONCE(!__this_cpu_read(hv_24x7_txn_flags));
1645         reset_txn();
1646 }
1647
1648 static struct pmu h_24x7_pmu = {
1649         .task_ctx_nr = perf_invalid_context,
1650
1651         .name = "hv_24x7",
1652         .attr_groups = attr_groups,
1653         .event_init  = h_24x7_event_init,
1654         .add         = h_24x7_event_add,
1655         .del         = h_24x7_event_stop,
1656         .start       = h_24x7_event_start,
1657         .stop        = h_24x7_event_stop,
1658         .read        = h_24x7_event_read,
1659         .start_txn   = h_24x7_event_start_txn,
1660         .commit_txn  = h_24x7_event_commit_txn,
1661         .cancel_txn  = h_24x7_event_cancel_txn,
1662         .capabilities = PERF_PMU_CAP_NO_EXCLUDE,
1663 };
1664
1665 static int ppc_hv_24x7_cpu_online(unsigned int cpu)
1666 {
1667         if (cpumask_empty(&hv_24x7_cpumask))
1668                 cpumask_set_cpu(cpu, &hv_24x7_cpumask);
1669
1670         return 0;
1671 }
1672
1673 static int ppc_hv_24x7_cpu_offline(unsigned int cpu)
1674 {
1675         int target;
1676
1677         /* Check if exiting cpu is used for collecting 24x7 events */
1678         if (!cpumask_test_and_clear_cpu(cpu, &hv_24x7_cpumask))
1679                 return 0;
1680
1681         /* Find a new cpu to collect 24x7 events */
1682         target = cpumask_last(cpu_active_mask);
1683
1684         if (target < 0 || target >= nr_cpu_ids) {
1685                 pr_err("hv_24x7: CPU hotplug init failed\n");
1686                 return -1;
1687         }
1688
1689         /* Migrate 24x7 events to the new target */
1690         cpumask_set_cpu(target, &hv_24x7_cpumask);
1691         perf_pmu_migrate_context(&h_24x7_pmu, cpu, target);
1692
1693         return 0;
1694 }
1695
1696 static int hv_24x7_cpu_hotplug_init(void)
1697 {
1698         return cpuhp_setup_state(CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE,
1699                           "perf/powerpc/hv_24x7:online",
1700                           ppc_hv_24x7_cpu_online,
1701                           ppc_hv_24x7_cpu_offline);
1702 }
1703
1704 static int hv_24x7_init(void)
1705 {
1706         int r;
1707         unsigned long hret;
1708         unsigned int pvr = mfspr(SPRN_PVR);
1709         struct hv_perf_caps caps;
1710
1711         if (!firmware_has_feature(FW_FEATURE_LPAR)) {
1712                 pr_debug("not a virtualized system, not enabling\n");
1713                 return -ENODEV;
1714         }
1715
1716         /* POWER8 only supports v1, while POWER9 only supports v2. */
1717         if (PVR_VER(pvr) == PVR_POWER8 || PVR_VER(pvr) == PVR_POWER8E ||
1718             PVR_VER(pvr) == PVR_POWER8NVL)
1719                 interface_version = 1;
1720         else {
1721                 interface_version = 2;
1722
1723                 /* SMT8 in POWER9 needs to aggregate result elements. */
1724                 if (threads_per_core == 8)
1725                         aggregate_result_elements = true;
1726         }
1727
1728         hret = hv_perf_caps_get(&caps);
1729         if (hret) {
1730                 pr_debug("could not obtain capabilities, not enabling, rc=%ld\n",
1731                                 hret);
1732                 return -ENODEV;
1733         }
1734
1735         hv_page_cache = kmem_cache_create("hv-page-4096", 4096, 4096, 0, NULL);
1736         if (!hv_page_cache)
1737                 return -ENOMEM;
1738
1739         /* sampling not supported */
1740         h_24x7_pmu.capabilities |= PERF_PMU_CAP_NO_INTERRUPT;
1741
1742         r = create_events_from_catalog(&event_group.attrs,
1743                                    &event_desc_group.attrs,
1744                                    &event_long_desc_group.attrs);
1745
1746         if (r)
1747                 return r;
1748
1749         /* init cpuhotplug */
1750         r = hv_24x7_cpu_hotplug_init();
1751         if (r)
1752                 return r;
1753
1754         r = perf_pmu_register(&h_24x7_pmu, h_24x7_pmu.name, -1);
1755         if (r)
1756                 return r;
1757
1758         read_24x7_sys_info();
1759
1760         return 0;
1761 }
1762
1763 device_initcall(hv_24x7_init);