[tip:perf/core 1/2] drivers//perf/qcom_l2_pmu.c:598:13: error: invalid storage class for function 'l2_cache_event_start'
From: kbuild test robot
Date: Fri Mar 16 2018 - 13:20:40 EST
tree: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
head: bbb68468641547d56c83012670bcaf77f3dacd64
commit: 7eb709f29593aced51901cb53565477762800722 [1/2] perf: Fix sibling iteration
config: arm64-allyesconfig (attached as .config)
compiler: aarch64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
git checkout 7eb709f29593aced51901cb53565477762800722
# save the attached .config to linux build tree
make.cross ARCH=arm64
All error/warnings (new ones prefixed by >>):
drivers//perf/qcom_l2_pmu.c: In function 'l2_cache_event_init':
>> drivers//perf/qcom_l2_pmu.c:598:13: error: invalid storage class for function 'l2_cache_event_start'
static void l2_cache_event_start(struct perf_event *event, int flags)
^~~~~~~~~~~~~~~~~~~~
>> drivers//perf/qcom_l2_pmu.c:598:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
static void l2_cache_event_start(struct perf_event *event, int flags)
^~~~~~
>> drivers//perf/qcom_l2_pmu.c:629:13: error: invalid storage class for function 'l2_cache_event_stop'
static void l2_cache_event_stop(struct perf_event *event, int flags)
^~~~~~~~~~~~~~~~~~~
>> drivers//perf/qcom_l2_pmu.c:645:12: error: invalid storage class for function 'l2_cache_event_add'
static int l2_cache_event_add(struct perf_event *event, int flags)
^~~~~~~~~~~~~~~~~~
>> drivers//perf/qcom_l2_pmu.c:672:13: error: invalid storage class for function 'l2_cache_event_del'
static void l2_cache_event_del(struct perf_event *event, int flags)
^~~~~~~~~~~~~~~~~~
>> drivers//perf/qcom_l2_pmu.c:687:13: error: invalid storage class for function 'l2_cache_event_read'
static void l2_cache_event_read(struct perf_event *event)
^~~~~~~~~~~~~~~~~~~
>> drivers//perf/qcom_l2_pmu.c:692:16: error: invalid storage class for function 'l2_cache_pmu_cpumask_show'
static ssize_t l2_cache_pmu_cpumask_show(struct device *dev,
^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from include/linux/kobject.h:20:0,
from include/linux/device.h:16,
from include/linux/acpi.h:27,
from drivers//perf/qcom_l2_pmu.c:12:
>> drivers//perf/qcom_l2_pmu.c:702:28: error: initializer element is not constant
__ATTR(cpumask, S_IRUGO, l2_cache_pmu_cpumask_show, NULL);
^
include/linux/sysfs.h:104:10: note: in definition of macro '__ATTR'
.show = _show, \
^~~~~
drivers//perf/qcom_l2_pmu.c:702:28: note: (near initialization for 'l2_cache_pmu_cpumask_attr.show')
__ATTR(cpumask, S_IRUGO, l2_cache_pmu_cpumask_show, NULL);
^
include/linux/sysfs.h:104:10: note: in definition of macro '__ATTR'
.show = _show, \
^~~~~
In file included from drivers//perf/qcom_l2_pmu.c:24:0:
>> drivers//perf/qcom_l2_pmu.c:714:17: error: invalid storage class for function 'l2_code_show'
PMU_FORMAT_ATTR(l2_code, "config:4-11");
^
include/linux/perf_event.h:1377:1: note: in definition of macro 'PMU_FORMAT_ATTR'
_name##_show(struct device *dev, \
^~~~~
In file included from include/linux/kobject.h:20:0,
from include/linux/device.h:16,
from include/linux/acpi.h:27,
from drivers//perf/qcom_l2_pmu.c:12:
drivers//perf/qcom_l2_pmu.c:714:17: error: initializer element is not constant
PMU_FORMAT_ATTR(l2_code, "config:4-11");
^
include/linux/sysfs.h:117:10: note: in definition of macro '__ATTR_RO'
.show = _name##_show, \
^~~~~
>> drivers//perf/qcom_l2_pmu.c:714:1: note: in expansion of macro 'PMU_FORMAT_ATTR'
PMU_FORMAT_ATTR(l2_code, "config:4-11");
^~~~~~~~~~~~~~~
drivers//perf/qcom_l2_pmu.c:714:17: note: (near initialization for 'format_attr_l2_code.show')
PMU_FORMAT_ATTR(l2_code, "config:4-11");
^
include/linux/sysfs.h:117:10: note: in definition of macro '__ATTR_RO'
.show = _name##_show, \
^~~~~
>> drivers//perf/qcom_l2_pmu.c:714:1: note: in expansion of macro 'PMU_FORMAT_ATTR'
PMU_FORMAT_ATTR(l2_code, "config:4-11");
^~~~~~~~~~~~~~~
In file included from drivers//perf/qcom_l2_pmu.c:24:0:
>> drivers//perf/qcom_l2_pmu.c:715:17: error: invalid storage class for function 'l2_group_show'
PMU_FORMAT_ATTR(l2_group, "config:0-3");
^
include/linux/perf_event.h:1377:1: note: in definition of macro 'PMU_FORMAT_ATTR'
_name##_show(struct device *dev, \
^~~~~
In file included from include/linux/kobject.h:20:0,
from include/linux/device.h:16,
from include/linux/acpi.h:27,
from drivers//perf/qcom_l2_pmu.c:12:
drivers//perf/qcom_l2_pmu.c:715:17: error: initializer element is not constant
PMU_FORMAT_ATTR(l2_group, "config:0-3");
^
include/linux/sysfs.h:117:10: note: in definition of macro '__ATTR_RO'
.show = _name##_show, \
^~~~~
drivers//perf/qcom_l2_pmu.c:715:1: note: in expansion of macro 'PMU_FORMAT_ATTR'
PMU_FORMAT_ATTR(l2_group, "config:0-3");
^~~~~~~~~~~~~~~
drivers//perf/qcom_l2_pmu.c:715:17: note: (near initialization for 'format_attr_l2_group.show')
PMU_FORMAT_ATTR(l2_group, "config:0-3");
^
include/linux/sysfs.h:117:10: note: in definition of macro '__ATTR_RO'
.show = _name##_show, \
^~~~~
drivers//perf/qcom_l2_pmu.c:715:1: note: in expansion of macro 'PMU_FORMAT_ATTR'
PMU_FORMAT_ATTR(l2_group, "config:0-3");
^~~~~~~~~~~~~~~
In file included from drivers//perf/qcom_l2_pmu.c:24:0:
>> drivers//perf/qcom_l2_pmu.c:716:17: error: invalid storage class for function 'event_show'
PMU_FORMAT_ATTR(event, "config:0-11");
^
include/linux/perf_event.h:1377:1: note: in definition of macro 'PMU_FORMAT_ATTR'
_name##_show(struct device *dev, \
^~~~~
In file included from include/linux/kobject.h:20:0,
from include/linux/device.h:16,
from include/linux/acpi.h:27,
from drivers//perf/qcom_l2_pmu.c:12:
drivers//perf/qcom_l2_pmu.c:716:17: error: initializer element is not constant
PMU_FORMAT_ATTR(event, "config:0-11");
^
include/linux/sysfs.h:117:10: note: in definition of macro '__ATTR_RO'
.show = _name##_show, \
^~~~~
drivers//perf/qcom_l2_pmu.c:716:1: note: in expansion of macro 'PMU_FORMAT_ATTR'
PMU_FORMAT_ATTR(event, "config:0-11");
^~~~~~~~~~~~~~~
drivers//perf/qcom_l2_pmu.c:716:17: note: (near initialization for 'format_attr_event.show')
PMU_FORMAT_ATTR(event, "config:0-11");
^
include/linux/sysfs.h:117:10: note: in definition of macro '__ATTR_RO'
.show = _name##_show, \
^~~~~
drivers//perf/qcom_l2_pmu.c:716:1: note: in expansion of macro 'PMU_FORMAT_ATTR'
PMU_FORMAT_ATTR(event, "config:0-11");
^~~~~~~~~~~~~~~
>> drivers//perf/qcom_l2_pmu.c:730:16: error: invalid storage class for function 'l2cache_pmu_event_show'
static ssize_t l2cache_pmu_event_show(struct device *dev,
^~~~~~~~~~~~~~~~~~~~~~
drivers//perf/qcom_l2_pmu.c:740:2: error: initializer element is not constant
(&((struct perf_pmu_events_attr[]) { \
^
>> drivers//perf/qcom_l2_pmu.c:746:2: note: in expansion of macro 'L2CACHE_EVENT_ATTR'
L2CACHE_EVENT_ATTR(cycles, L2_EVENT_CYCLES),
^~~~~~~~~~~~~~~~~~
drivers//perf/qcom_l2_pmu.c:740:2: note: (near initialization for 'l2_cache_pmu_events[0]')
(&((struct perf_pmu_events_attr[]) { \
^
>> drivers//perf/qcom_l2_pmu.c:746:2: note: in expansion of macro 'L2CACHE_EVENT_ATTR'
L2CACHE_EVENT_ATTR(cycles, L2_EVENT_CYCLES),
^~~~~~~~~~~~~~~~~~
>> drivers//perf/qcom_l2_pmu.c:781:12: error: invalid storage class for function 'get_num_counters'
static int get_num_counters(void)
^~~~~~~~~~~~~~~~
>> drivers//perf/qcom_l2_pmu.c:794:28: error: invalid storage class for function 'l2_cache_associate_cpu_with_cluster'
static struct cluster_pmu *l2_cache_associate_cpu_with_cluster(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers//perf/qcom_l2_pmu.c:827:12: error: invalid storage class for function 'l2cache_pmu_online_cpu'
static int l2cache_pmu_online_cpu(unsigned int cpu, struct hlist_node *node)
^~~~~~~~~~~~~~~~~~~~~~
>> drivers//perf/qcom_l2_pmu.c:862:12: error: invalid storage class for function 'l2cache_pmu_offline_cpu'
static int l2cache_pmu_offline_cpu(unsigned int cpu, struct hlist_node *node)
^~~~~~~~~~~~~~~~~~~~~~~
vim +/l2_cache_event_start +598 drivers//perf/qcom_l2_pmu.c
21bdbb710 Neil Leeder 2017-02-07 597
21bdbb710 Neil Leeder 2017-02-07 @598 static void l2_cache_event_start(struct perf_event *event, int flags)
21bdbb710 Neil Leeder 2017-02-07 599 {
21bdbb710 Neil Leeder 2017-02-07 600 struct cluster_pmu *cluster;
21bdbb710 Neil Leeder 2017-02-07 601 struct hw_perf_event *hwc = &event->hw;
21bdbb710 Neil Leeder 2017-02-07 602 int idx = hwc->idx;
21bdbb710 Neil Leeder 2017-02-07 603 u32 config;
21bdbb710 Neil Leeder 2017-02-07 604 u32 event_cc, event_group;
21bdbb710 Neil Leeder 2017-02-07 605
21bdbb710 Neil Leeder 2017-02-07 606 hwc->state = 0;
21bdbb710 Neil Leeder 2017-02-07 607
21bdbb710 Neil Leeder 2017-02-07 608 cluster = get_cluster_pmu(to_l2cache_pmu(event->pmu), event->cpu);
21bdbb710 Neil Leeder 2017-02-07 609
21bdbb710 Neil Leeder 2017-02-07 610 l2_cache_cluster_set_period(cluster, hwc);
21bdbb710 Neil Leeder 2017-02-07 611
21bdbb710 Neil Leeder 2017-02-07 612 if (hwc->config_base == L2CYCLE_CTR_RAW_CODE) {
21bdbb710 Neil Leeder 2017-02-07 613 cluster_pmu_set_evccntcr(0);
21bdbb710 Neil Leeder 2017-02-07 614 } else {
21bdbb710 Neil Leeder 2017-02-07 615 config = hwc->config_base;
21bdbb710 Neil Leeder 2017-02-07 616 event_cc = L2_EVT_CODE(config);
21bdbb710 Neil Leeder 2017-02-07 617 event_group = L2_EVT_GROUP(config);
21bdbb710 Neil Leeder 2017-02-07 618
21bdbb710 Neil Leeder 2017-02-07 619 cluster_pmu_set_evcntcr(idx, 0);
21bdbb710 Neil Leeder 2017-02-07 620 cluster_pmu_set_evtyper(idx, event_group);
21bdbb710 Neil Leeder 2017-02-07 621 cluster_pmu_set_resr(cluster, event_group, event_cc);
21bdbb710 Neil Leeder 2017-02-07 622 cluster_pmu_set_evfilter_sys_mode(idx);
21bdbb710 Neil Leeder 2017-02-07 623 }
21bdbb710 Neil Leeder 2017-02-07 624
21bdbb710 Neil Leeder 2017-02-07 625 cluster_pmu_counter_enable_interrupt(idx);
21bdbb710 Neil Leeder 2017-02-07 626 cluster_pmu_counter_enable(idx);
21bdbb710 Neil Leeder 2017-02-07 627 }
21bdbb710 Neil Leeder 2017-02-07 628
21bdbb710 Neil Leeder 2017-02-07 @629 static void l2_cache_event_stop(struct perf_event *event, int flags)
21bdbb710 Neil Leeder 2017-02-07 630 {
21bdbb710 Neil Leeder 2017-02-07 631 struct hw_perf_event *hwc = &event->hw;
21bdbb710 Neil Leeder 2017-02-07 632 int idx = hwc->idx;
21bdbb710 Neil Leeder 2017-02-07 633
21bdbb710 Neil Leeder 2017-02-07 634 if (hwc->state & PERF_HES_STOPPED)
21bdbb710 Neil Leeder 2017-02-07 635 return;
21bdbb710 Neil Leeder 2017-02-07 636
21bdbb710 Neil Leeder 2017-02-07 637 cluster_pmu_counter_disable_interrupt(idx);
21bdbb710 Neil Leeder 2017-02-07 638 cluster_pmu_counter_disable(idx);
21bdbb710 Neil Leeder 2017-02-07 639
21bdbb710 Neil Leeder 2017-02-07 640 if (flags & PERF_EF_UPDATE)
21bdbb710 Neil Leeder 2017-02-07 641 l2_cache_event_update(event);
21bdbb710 Neil Leeder 2017-02-07 642 hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE;
21bdbb710 Neil Leeder 2017-02-07 643 }
21bdbb710 Neil Leeder 2017-02-07 644
21bdbb710 Neil Leeder 2017-02-07 @645 static int l2_cache_event_add(struct perf_event *event, int flags)
21bdbb710 Neil Leeder 2017-02-07 646 {
21bdbb710 Neil Leeder 2017-02-07 647 struct hw_perf_event *hwc = &event->hw;
21bdbb710 Neil Leeder 2017-02-07 648 int idx;
21bdbb710 Neil Leeder 2017-02-07 649 int err = 0;
21bdbb710 Neil Leeder 2017-02-07 650 struct cluster_pmu *cluster;
21bdbb710 Neil Leeder 2017-02-07 651
21bdbb710 Neil Leeder 2017-02-07 652 cluster = get_cluster_pmu(to_l2cache_pmu(event->pmu), event->cpu);
21bdbb710 Neil Leeder 2017-02-07 653
21bdbb710 Neil Leeder 2017-02-07 654 idx = l2_cache_get_event_idx(cluster, event);
21bdbb710 Neil Leeder 2017-02-07 655 if (idx < 0)
21bdbb710 Neil Leeder 2017-02-07 656 return idx;
21bdbb710 Neil Leeder 2017-02-07 657
21bdbb710 Neil Leeder 2017-02-07 658 hwc->idx = idx;
21bdbb710 Neil Leeder 2017-02-07 659 hwc->state = PERF_HES_STOPPED | PERF_HES_UPTODATE;
21bdbb710 Neil Leeder 2017-02-07 660 cluster->events[idx] = event;
21bdbb710 Neil Leeder 2017-02-07 661 local64_set(&hwc->prev_count, 0);
21bdbb710 Neil Leeder 2017-02-07 662
21bdbb710 Neil Leeder 2017-02-07 663 if (flags & PERF_EF_START)
21bdbb710 Neil Leeder 2017-02-07 664 l2_cache_event_start(event, flags);
21bdbb710 Neil Leeder 2017-02-07 665
21bdbb710 Neil Leeder 2017-02-07 666 /* Propagate changes to the userspace mapping. */
21bdbb710 Neil Leeder 2017-02-07 667 perf_event_update_userpage(event);
21bdbb710 Neil Leeder 2017-02-07 668
21bdbb710 Neil Leeder 2017-02-07 669 return err;
21bdbb710 Neil Leeder 2017-02-07 670 }
21bdbb710 Neil Leeder 2017-02-07 671
21bdbb710 Neil Leeder 2017-02-07 @672 static void l2_cache_event_del(struct perf_event *event, int flags)
21bdbb710 Neil Leeder 2017-02-07 673 {
21bdbb710 Neil Leeder 2017-02-07 674 struct hw_perf_event *hwc = &event->hw;
21bdbb710 Neil Leeder 2017-02-07 675 struct cluster_pmu *cluster;
21bdbb710 Neil Leeder 2017-02-07 676 int idx = hwc->idx;
21bdbb710 Neil Leeder 2017-02-07 677
21bdbb710 Neil Leeder 2017-02-07 678 cluster = get_cluster_pmu(to_l2cache_pmu(event->pmu), event->cpu);
21bdbb710 Neil Leeder 2017-02-07 679
21bdbb710 Neil Leeder 2017-02-07 680 l2_cache_event_stop(event, flags | PERF_EF_UPDATE);
21bdbb710 Neil Leeder 2017-02-07 681 cluster->events[idx] = NULL;
21bdbb710 Neil Leeder 2017-02-07 682 l2_cache_clear_event_idx(cluster, event);
21bdbb710 Neil Leeder 2017-02-07 683
21bdbb710 Neil Leeder 2017-02-07 684 perf_event_update_userpage(event);
21bdbb710 Neil Leeder 2017-02-07 685 }
21bdbb710 Neil Leeder 2017-02-07 686
21bdbb710 Neil Leeder 2017-02-07 @687 static void l2_cache_event_read(struct perf_event *event)
21bdbb710 Neil Leeder 2017-02-07 688 {
21bdbb710 Neil Leeder 2017-02-07 689 l2_cache_event_update(event);
21bdbb710 Neil Leeder 2017-02-07 690 }
21bdbb710 Neil Leeder 2017-02-07 691
21bdbb710 Neil Leeder 2017-02-07 @692 static ssize_t l2_cache_pmu_cpumask_show(struct device *dev,
21bdbb710 Neil Leeder 2017-02-07 693 struct device_attribute *attr,
21bdbb710 Neil Leeder 2017-02-07 694 char *buf)
21bdbb710 Neil Leeder 2017-02-07 695 {
21bdbb710 Neil Leeder 2017-02-07 696 struct l2cache_pmu *l2cache_pmu = to_l2cache_pmu(dev_get_drvdata(dev));
21bdbb710 Neil Leeder 2017-02-07 697
21bdbb710 Neil Leeder 2017-02-07 698 return cpumap_print_to_pagebuf(true, buf, &l2cache_pmu->cpumask);
21bdbb710 Neil Leeder 2017-02-07 699 }
21bdbb710 Neil Leeder 2017-02-07 700
21bdbb710 Neil Leeder 2017-02-07 701 static struct device_attribute l2_cache_pmu_cpumask_attr =
21bdbb710 Neil Leeder 2017-02-07 @702 __ATTR(cpumask, S_IRUGO, l2_cache_pmu_cpumask_show, NULL);
21bdbb710 Neil Leeder 2017-02-07 703
21bdbb710 Neil Leeder 2017-02-07 704 static struct attribute *l2_cache_pmu_cpumask_attrs[] = {
21bdbb710 Neil Leeder 2017-02-07 705 &l2_cache_pmu_cpumask_attr.attr,
21bdbb710 Neil Leeder 2017-02-07 706 NULL,
21bdbb710 Neil Leeder 2017-02-07 707 };
21bdbb710 Neil Leeder 2017-02-07 708
21bdbb710 Neil Leeder 2017-02-07 709 static struct attribute_group l2_cache_pmu_cpumask_group = {
21bdbb710 Neil Leeder 2017-02-07 710 .attrs = l2_cache_pmu_cpumask_attrs,
21bdbb710 Neil Leeder 2017-02-07 711 };
21bdbb710 Neil Leeder 2017-02-07 712
21bdbb710 Neil Leeder 2017-02-07 713 /* CCG format for perf RAW codes. */
21bdbb710 Neil Leeder 2017-02-07 @714 PMU_FORMAT_ATTR(l2_code, "config:4-11");
21bdbb710 Neil Leeder 2017-02-07 @715 PMU_FORMAT_ATTR(l2_group, "config:0-3");
b65423ed4 Neil Leeder 2017-09-14 @716 PMU_FORMAT_ATTR(event, "config:0-11");
b65423ed4 Neil Leeder 2017-09-14 717
21bdbb710 Neil Leeder 2017-02-07 718 static struct attribute *l2_cache_pmu_formats[] = {
21bdbb710 Neil Leeder 2017-02-07 719 &format_attr_l2_code.attr,
21bdbb710 Neil Leeder 2017-02-07 720 &format_attr_l2_group.attr,
b65423ed4 Neil Leeder 2017-09-14 721 &format_attr_event.attr,
21bdbb710 Neil Leeder 2017-02-07 722 NULL,
21bdbb710 Neil Leeder 2017-02-07 723 };
21bdbb710 Neil Leeder 2017-02-07 724
21bdbb710 Neil Leeder 2017-02-07 725 static struct attribute_group l2_cache_pmu_format_group = {
21bdbb710 Neil Leeder 2017-02-07 726 .name = "format",
21bdbb710 Neil Leeder 2017-02-07 727 .attrs = l2_cache_pmu_formats,
21bdbb710 Neil Leeder 2017-02-07 728 };
21bdbb710 Neil Leeder 2017-02-07 729
b65423ed4 Neil Leeder 2017-09-14 @730 static ssize_t l2cache_pmu_event_show(struct device *dev,
b65423ed4 Neil Leeder 2017-09-14 731 struct device_attribute *attr, char *page)
b65423ed4 Neil Leeder 2017-09-14 732 {
b65423ed4 Neil Leeder 2017-09-14 733 struct perf_pmu_events_attr *pmu_attr;
b65423ed4 Neil Leeder 2017-09-14 734
b65423ed4 Neil Leeder 2017-09-14 735 pmu_attr = container_of(attr, struct perf_pmu_events_attr, attr);
b65423ed4 Neil Leeder 2017-09-14 736 return sprintf(page, "event=0x%02llx\n", pmu_attr->id);
b65423ed4 Neil Leeder 2017-09-14 737 }
b65423ed4 Neil Leeder 2017-09-14 738
b65423ed4 Neil Leeder 2017-09-14 739 #define L2CACHE_EVENT_ATTR(_name, _id) \
b65423ed4 Neil Leeder 2017-09-14 @740 (&((struct perf_pmu_events_attr[]) { \
b65423ed4 Neil Leeder 2017-09-14 741 { .attr = __ATTR(_name, 0444, l2cache_pmu_event_show, NULL), \
b65423ed4 Neil Leeder 2017-09-14 742 .id = _id, } \
b65423ed4 Neil Leeder 2017-09-14 743 })[0].attr.attr)
b65423ed4 Neil Leeder 2017-09-14 744
b65423ed4 Neil Leeder 2017-09-14 745 static struct attribute *l2_cache_pmu_events[] = {
b65423ed4 Neil Leeder 2017-09-14 @746 L2CACHE_EVENT_ATTR(cycles, L2_EVENT_CYCLES),
b65423ed4 Neil Leeder 2017-09-14 747 L2CACHE_EVENT_ATTR(dcache-ops, L2_EVENT_DCACHE_OPS),
b65423ed4 Neil Leeder 2017-09-14 748 L2CACHE_EVENT_ATTR(icache-ops, L2_EVENT_ICACHE_OPS),
b65423ed4 Neil Leeder 2017-09-14 749 L2CACHE_EVENT_ATTR(tlbi, L2_EVENT_TLBI),
b65423ed4 Neil Leeder 2017-09-14 750 L2CACHE_EVENT_ATTR(barriers, L2_EVENT_BARRIERS),
b65423ed4 Neil Leeder 2017-09-14 751 L2CACHE_EVENT_ATTR(total-reads, L2_EVENT_TOTAL_READS),
b65423ed4 Neil Leeder 2017-09-14 752 L2CACHE_EVENT_ATTR(total-writes, L2_EVENT_TOTAL_WRITES),
b65423ed4 Neil Leeder 2017-09-14 753 L2CACHE_EVENT_ATTR(total-requests, L2_EVENT_TOTAL_REQUESTS),
b65423ed4 Neil Leeder 2017-09-14 754 L2CACHE_EVENT_ATTR(ldrex, L2_EVENT_LDREX),
b65423ed4 Neil Leeder 2017-09-14 755 L2CACHE_EVENT_ATTR(strex, L2_EVENT_STREX),
b65423ed4 Neil Leeder 2017-09-14 756 L2CACHE_EVENT_ATTR(clrex, L2_EVENT_CLREX),
b65423ed4 Neil Leeder 2017-09-14 757 NULL
b65423ed4 Neil Leeder 2017-09-14 758 };
b65423ed4 Neil Leeder 2017-09-14 759
b65423ed4 Neil Leeder 2017-09-14 760 static struct attribute_group l2_cache_pmu_events_group = {
b65423ed4 Neil Leeder 2017-09-14 761 .name = "events",
b65423ed4 Neil Leeder 2017-09-14 762 .attrs = l2_cache_pmu_events,
b65423ed4 Neil Leeder 2017-09-14 763 };
b65423ed4 Neil Leeder 2017-09-14 764
21bdbb710 Neil Leeder 2017-02-07 765 static const struct attribute_group *l2_cache_pmu_attr_grps[] = {
21bdbb710 Neil Leeder 2017-02-07 766 &l2_cache_pmu_format_group,
21bdbb710 Neil Leeder 2017-02-07 767 &l2_cache_pmu_cpumask_group,
b65423ed4 Neil Leeder 2017-09-14 768 &l2_cache_pmu_events_group,
21bdbb710 Neil Leeder 2017-02-07 769 NULL,
21bdbb710 Neil Leeder 2017-02-07 770 };
21bdbb710 Neil Leeder 2017-02-07 771
21bdbb710 Neil Leeder 2017-02-07 772 /*
21bdbb710 Neil Leeder 2017-02-07 773 * Generic device handlers
21bdbb710 Neil Leeder 2017-02-07 774 */
21bdbb710 Neil Leeder 2017-02-07 775
21bdbb710 Neil Leeder 2017-02-07 776 static const struct acpi_device_id l2_cache_pmu_acpi_match[] = {
21bdbb710 Neil Leeder 2017-02-07 777 { "QCOM8130", },
21bdbb710 Neil Leeder 2017-02-07 778 { }
21bdbb710 Neil Leeder 2017-02-07 779 };
21bdbb710 Neil Leeder 2017-02-07 780
21bdbb710 Neil Leeder 2017-02-07 @781 static int get_num_counters(void)
21bdbb710 Neil Leeder 2017-02-07 782 {
21bdbb710 Neil Leeder 2017-02-07 783 int val;
21bdbb710 Neil Leeder 2017-02-07 784
21bdbb710 Neil Leeder 2017-02-07 785 val = get_l2_indirect_reg(L2PMCR);
21bdbb710 Neil Leeder 2017-02-07 786
21bdbb710 Neil Leeder 2017-02-07 787 /*
21bdbb710 Neil Leeder 2017-02-07 788 * Read number of counters from L2PMCR and add 1
21bdbb710 Neil Leeder 2017-02-07 789 * for the cycle counter.
21bdbb710 Neil Leeder 2017-02-07 790 */
21bdbb710 Neil Leeder 2017-02-07 791 return ((val >> L2PMCR_NUM_EV_SHIFT) & L2PMCR_NUM_EV_MASK) + 1;
21bdbb710 Neil Leeder 2017-02-07 792 }
21bdbb710 Neil Leeder 2017-02-07 793
21bdbb710 Neil Leeder 2017-02-07 @794 static struct cluster_pmu *l2_cache_associate_cpu_with_cluster(
21bdbb710 Neil Leeder 2017-02-07 795 struct l2cache_pmu *l2cache_pmu, int cpu)
21bdbb710 Neil Leeder 2017-02-07 796 {
21bdbb710 Neil Leeder 2017-02-07 797 u64 mpidr;
21bdbb710 Neil Leeder 2017-02-07 798 int cpu_cluster_id;
21bdbb710 Neil Leeder 2017-02-07 799 struct cluster_pmu *cluster = NULL;
21bdbb710 Neil Leeder 2017-02-07 800
21bdbb710 Neil Leeder 2017-02-07 801 /*
21bdbb710 Neil Leeder 2017-02-07 802 * This assumes that the cluster_id is in MPIDR[aff1] for
21bdbb710 Neil Leeder 2017-02-07 803 * single-threaded cores, and MPIDR[aff2] for multi-threaded
21bdbb710 Neil Leeder 2017-02-07 804 * cores. This logic will have to be updated if this changes.
21bdbb710 Neil Leeder 2017-02-07 805 */
21bdbb710 Neil Leeder 2017-02-07 806 mpidr = read_cpuid_mpidr();
21bdbb710 Neil Leeder 2017-02-07 807 if (mpidr & MPIDR_MT_BITMASK)
21bdbb710 Neil Leeder 2017-02-07 808 cpu_cluster_id = MPIDR_AFFINITY_LEVEL(mpidr, 2);
21bdbb710 Neil Leeder 2017-02-07 809 else
21bdbb710 Neil Leeder 2017-02-07 810 cpu_cluster_id = MPIDR_AFFINITY_LEVEL(mpidr, 1);
21bdbb710 Neil Leeder 2017-02-07 811
21bdbb710 Neil Leeder 2017-02-07 812 list_for_each_entry(cluster, &l2cache_pmu->clusters, next) {
21bdbb710 Neil Leeder 2017-02-07 813 if (cluster->cluster_id != cpu_cluster_id)
21bdbb710 Neil Leeder 2017-02-07 814 continue;
21bdbb710 Neil Leeder 2017-02-07 815
21bdbb710 Neil Leeder 2017-02-07 816 dev_info(&l2cache_pmu->pdev->dev,
21bdbb710 Neil Leeder 2017-02-07 817 "CPU%d associated with cluster %d\n", cpu,
21bdbb710 Neil Leeder 2017-02-07 818 cluster->cluster_id);
21bdbb710 Neil Leeder 2017-02-07 819 cpumask_set_cpu(cpu, &cluster->cluster_cpus);
21bdbb710 Neil Leeder 2017-02-07 820 *per_cpu_ptr(l2cache_pmu->pmu_cluster, cpu) = cluster;
21bdbb710 Neil Leeder 2017-02-07 821 break;
21bdbb710 Neil Leeder 2017-02-07 822 }
21bdbb710 Neil Leeder 2017-02-07 823
21bdbb710 Neil Leeder 2017-02-07 824 return cluster;
21bdbb710 Neil Leeder 2017-02-07 825 }
21bdbb710 Neil Leeder 2017-02-07 826
:::::: The code at line 598 was first introduced by commit
:::::: 21bdbb7102edeaebb5ec4ef530c8f442f7562c96 perf: add qcom l2 cache perf events driver
:::::: TO: Neil Leeder <nleeder@xxxxxxxxxxxxxx>
:::::: CC: Will Deacon <will.deacon@xxxxxxx>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: application/gzip