mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-17 19:39:20 -04:00
Merge branch 'for-next/perf' into for-next/core
* for-next/perf: perf/arm-cmn: Add CMN S3 ACPI binding perf/arm-cmn: Initialise cmn->cpu earlier perf/amlogic: Replace smp_processor_id() with raw_smp_processor_id() in meson_ddr_pmu_create() perf/arm-cmn: Fix REQ2/SNP2 mixup perf: Do not enable by default during compile testing perf: arm-ni: Fix missing platform_set_drvdata() perf: arm-ni: Unregister PMUs on probe failure perf/arm-cmn: Remove CMN-600 DTC domain special case
This commit is contained in:
@@ -202,7 +202,7 @@ config THUNDERX2_PMU
|
||||
tristate "Cavium ThunderX2 SoC PMU UNCORE"
|
||||
depends on ARCH_THUNDER2 || COMPILE_TEST
|
||||
depends on NUMA && ACPI
|
||||
default m
|
||||
default m if ARCH_THUNDER2
|
||||
help
|
||||
Provides support for ThunderX2 UNCORE events.
|
||||
The SoC has PMU support in its L3 cache controller (L3C) and
|
||||
|
||||
@@ -511,7 +511,7 @@ int meson_ddr_pmu_create(struct platform_device *pdev)
|
||||
|
||||
fmt_attr_fill(pmu->info.hw_info->fmt_attr);
|
||||
|
||||
pmu->cpu = smp_processor_id();
|
||||
pmu->cpu = raw_smp_processor_id();
|
||||
|
||||
name = devm_kasprintf(&pdev->dev, GFP_KERNEL, DDR_PERF_DEV_NAME);
|
||||
if (!name)
|
||||
|
||||
@@ -727,8 +727,8 @@ static umode_t arm_cmn_event_attr_is_visible(struct kobject *kobj,
|
||||
|
||||
if ((chan == 5 && cmn->rsp_vc_num < 2) ||
|
||||
(chan == 6 && cmn->dat_vc_num < 2) ||
|
||||
(chan == 7 && cmn->snp_vc_num < 2) ||
|
||||
(chan == 8 && cmn->req_vc_num < 2))
|
||||
(chan == 7 && cmn->req_vc_num < 2) ||
|
||||
(chan == 8 && cmn->snp_vc_num < 2))
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -882,8 +882,8 @@ static umode_t arm_cmn_event_attr_is_visible(struct kobject *kobj,
|
||||
_CMN_EVENT_XP(pub_##_name, (_event) | (4 << 5)), \
|
||||
_CMN_EVENT_XP(rsp2_##_name, (_event) | (5 << 5)), \
|
||||
_CMN_EVENT_XP(dat2_##_name, (_event) | (6 << 5)), \
|
||||
_CMN_EVENT_XP(snp2_##_name, (_event) | (7 << 5)), \
|
||||
_CMN_EVENT_XP(req2_##_name, (_event) | (8 << 5))
|
||||
_CMN_EVENT_XP(req2_##_name, (_event) | (7 << 5)), \
|
||||
_CMN_EVENT_XP(snp2_##_name, (_event) | (8 << 5))
|
||||
|
||||
#define CMN_EVENT_XP_DAT(_name, _event) \
|
||||
_CMN_EVENT_XP_PORT(dat_##_name, (_event) | (3 << 5)), \
|
||||
@@ -2167,13 +2167,6 @@ static int arm_cmn_init_dtcs(struct arm_cmn *cmn)
|
||||
|
||||
cmn->xps = arm_cmn_node(cmn, CMN_TYPE_XP);
|
||||
|
||||
if (cmn->part == PART_CMN600 && cmn->num_dtcs > 1) {
|
||||
/* We do at least know that a DTC's XP must be in that DTC's domain */
|
||||
dn = arm_cmn_node(cmn, CMN_TYPE_DTC);
|
||||
for (int i = 0; i < cmn->num_dtcs; i++)
|
||||
arm_cmn_node_to_xp(cmn, dn + i)->dtc = i;
|
||||
}
|
||||
|
||||
for (dn = cmn->dns; dn->type; dn++) {
|
||||
if (dn->type == CMN_TYPE_XP)
|
||||
continue;
|
||||
@@ -2558,6 +2551,7 @@ static int arm_cmn_probe(struct platform_device *pdev)
|
||||
|
||||
cmn->dev = &pdev->dev;
|
||||
cmn->part = (unsigned long)device_get_match_data(cmn->dev);
|
||||
cmn->cpu = cpumask_local_spread(0, dev_to_node(cmn->dev));
|
||||
platform_set_drvdata(pdev, cmn);
|
||||
|
||||
if (cmn->part == PART_CMN600 && has_acpi_companion(cmn->dev)) {
|
||||
@@ -2585,7 +2579,6 @@ static int arm_cmn_probe(struct platform_device *pdev)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
cmn->cpu = cpumask_local_spread(0, dev_to_node(cmn->dev));
|
||||
cmn->pmu = (struct pmu) {
|
||||
.module = THIS_MODULE,
|
||||
.parent = cmn->dev,
|
||||
@@ -2651,6 +2644,7 @@ static const struct acpi_device_id arm_cmn_acpi_match[] = {
|
||||
{ "ARMHC600", PART_CMN600 },
|
||||
{ "ARMHC650" },
|
||||
{ "ARMHC700" },
|
||||
{ "ARMHC003" },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, arm_cmn_acpi_match);
|
||||
|
||||
@@ -575,6 +575,23 @@ static int arm_ni_init_cd(struct arm_ni *ni, struct arm_ni_node *node, u64 res_s
|
||||
return err;
|
||||
}
|
||||
|
||||
static void arm_ni_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct arm_ni *ni = platform_get_drvdata(pdev);
|
||||
|
||||
for (int i = 0; i < ni->num_cds; i++) {
|
||||
struct arm_ni_cd *cd = ni->cds + i;
|
||||
|
||||
if (!cd->pmu_base)
|
||||
continue;
|
||||
|
||||
writel_relaxed(0, cd->pmu_base + NI_PMCR);
|
||||
writel_relaxed(U32_MAX, cd->pmu_base + NI_PMINTENCLR);
|
||||
perf_pmu_unregister(&cd->pmu);
|
||||
cpuhp_state_remove_instance_nocalls(arm_ni_hp_state, &cd->cpuhp_node);
|
||||
}
|
||||
}
|
||||
|
||||
static void arm_ni_probe_domain(void __iomem *base, struct arm_ni_node *node)
|
||||
{
|
||||
u32 reg = readl_relaxed(base + NI_NODE_TYPE);
|
||||
@@ -643,6 +660,7 @@ static int arm_ni_probe(struct platform_device *pdev)
|
||||
ni->num_cds = num_cds;
|
||||
ni->part = part;
|
||||
ni->id = atomic_fetch_inc(&id);
|
||||
platform_set_drvdata(pdev, ni);
|
||||
|
||||
for (int v = 0; v < cfg.num_components; v++) {
|
||||
reg = readl_relaxed(cfg.base + NI_CHILD_PTR(v));
|
||||
@@ -656,8 +674,11 @@ static int arm_ni_probe(struct platform_device *pdev)
|
||||
reg = readl_relaxed(pd.base + NI_CHILD_PTR(c));
|
||||
arm_ni_probe_domain(base + reg, &cd);
|
||||
ret = arm_ni_init_cd(ni, &cd, res->start);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
ni->cds[cd.id].pmu_base = NULL;
|
||||
arm_ni_remove(pdev);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -665,23 +686,6 @@ static int arm_ni_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void arm_ni_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct arm_ni *ni = platform_get_drvdata(pdev);
|
||||
|
||||
for (int i = 0; i < ni->num_cds; i++) {
|
||||
struct arm_ni_cd *cd = ni->cds + i;
|
||||
|
||||
if (!cd->pmu_base)
|
||||
continue;
|
||||
|
||||
writel_relaxed(0, cd->pmu_base + NI_PMCR);
|
||||
writel_relaxed(U32_MAX, cd->pmu_base + NI_PMINTENCLR);
|
||||
perf_pmu_unregister(&cd->pmu);
|
||||
cpuhp_state_remove_instance_nocalls(arm_ni_hp_state, &cd->cpuhp_node);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id arm_ni_of_match[] = {
|
||||
{ .compatible = "arm,ni-700" },
|
||||
|
||||
Reference in New Issue
Block a user