mirror of
https://github.com/torvalds/linux.git
synced 2026-10-23 23:51:02 +02:00
drivers/perf: hisi: Consolidate uncore PMU cpuhp states
Every HiSilicon uncore PMU driver allocates its own static cpuhp state even though they all register identical online/offline callbacks. This wastes slots in the cpuhp state enum and needlessly fragments the hotplug state space. Move the cpuhp state setup into the shared hisi_uncore_pmu framework: register a single dynamic state (CPUHP_AP_ONLINE_DYN) at framework module init and export it for all HiSilicon uncore PMU drivers to use. Drop the now-unused static CPUHP_AP_PERF_ARM_HISI_* entries from include/linux/cpuhotplug.h. The L3C PMU driver keeps a private dynamic state because it has its own hotplug callbacks for migrating multiple per-CPU interrupt affinities, but switches from its former static slot to CPUHP_AP_ONLINE_DYN for consistency. No intended functional changes. Signed-off-by: Yushan Wang <wangyushan12@huawei.com> Reviewed-by: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
93f51579e7
commit
4c226fa323
|
|
@ -295,7 +295,7 @@ static int hisi_cpa_pmu_probe(struct platform_device *pdev)
|
|||
|
||||
/* Power Management should be disabled before using CPA PMU. */
|
||||
hisi_cpa_pmu_disable_pm(cpa_pmu);
|
||||
ret = cpuhp_state_add_instance(CPUHP_AP_PERF_ARM_HISI_CPA_ONLINE,
|
||||
ret = cpuhp_state_add_instance(hisi_uncore_pmu_cpuhp_state,
|
||||
&cpa_pmu->node);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Error %d registering hotplug\n", ret);
|
||||
|
|
@ -307,7 +307,7 @@ static int hisi_cpa_pmu_probe(struct platform_device *pdev)
|
|||
if (ret) {
|
||||
dev_err(cpa_pmu->dev, "PMU register failed\n");
|
||||
cpuhp_state_remove_instance_nocalls(
|
||||
CPUHP_AP_PERF_ARM_HISI_CPA_ONLINE, &cpa_pmu->node);
|
||||
hisi_uncore_pmu_cpuhp_state, &cpa_pmu->node);
|
||||
hisi_cpa_pmu_enable_pm(cpa_pmu);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -321,7 +321,7 @@ static void hisi_cpa_pmu_remove(struct platform_device *pdev)
|
|||
struct hisi_pmu *cpa_pmu = platform_get_drvdata(pdev);
|
||||
|
||||
perf_pmu_unregister(&cpa_pmu->pmu);
|
||||
cpuhp_state_remove_instance_nocalls(CPUHP_AP_PERF_ARM_HISI_CPA_ONLINE,
|
||||
cpuhp_state_remove_instance_nocalls(hisi_uncore_pmu_cpuhp_state,
|
||||
&cpa_pmu->node);
|
||||
hisi_cpa_pmu_enable_pm(cpa_pmu);
|
||||
}
|
||||
|
|
@ -336,33 +336,7 @@ static struct platform_driver hisi_cpa_pmu_driver = {
|
|||
.remove = hisi_cpa_pmu_remove,
|
||||
};
|
||||
|
||||
static int __init hisi_cpa_pmu_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cpuhp_setup_state_multi(CPUHP_AP_PERF_ARM_HISI_CPA_ONLINE,
|
||||
"AP_PERF_ARM_HISI_CPA_ONLINE",
|
||||
hisi_uncore_pmu_online_cpu,
|
||||
hisi_uncore_pmu_offline_cpu);
|
||||
if (ret) {
|
||||
pr_err("setup hotplug failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = platform_driver_register(&hisi_cpa_pmu_driver);
|
||||
if (ret)
|
||||
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_HISI_CPA_ONLINE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
module_init(hisi_cpa_pmu_module_init);
|
||||
|
||||
static void __exit hisi_cpa_pmu_module_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&hisi_cpa_pmu_driver);
|
||||
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_HISI_CPA_ONLINE);
|
||||
}
|
||||
module_exit(hisi_cpa_pmu_module_exit);
|
||||
module_platform_driver(hisi_cpa_pmu_driver);
|
||||
|
||||
MODULE_IMPORT_NS("HISI_PMU");
|
||||
MODULE_DESCRIPTION("HiSilicon SoC CPA PMU driver");
|
||||
|
|
|
|||
|
|
@ -401,7 +401,7 @@ static int hisi_ddrc_pmu_probe(struct platform_device *pdev)
|
|||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = cpuhp_state_add_instance(CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE,
|
||||
ret = cpuhp_state_add_instance(hisi_uncore_pmu_cpuhp_state,
|
||||
&ddrc_pmu->node);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Error %d registering hotplug;\n", ret);
|
||||
|
|
@ -414,7 +414,7 @@ static int hisi_ddrc_pmu_probe(struct platform_device *pdev)
|
|||
if (ret) {
|
||||
dev_err(ddrc_pmu->dev, "DDRC PMU register failed!\n");
|
||||
cpuhp_state_remove_instance_nocalls(
|
||||
CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE, &ddrc_pmu->node);
|
||||
hisi_uncore_pmu_cpuhp_state, &ddrc_pmu->node);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
@ -425,7 +425,7 @@ static void hisi_ddrc_pmu_remove(struct platform_device *pdev)
|
|||
struct hisi_pmu *ddrc_pmu = platform_get_drvdata(pdev);
|
||||
|
||||
perf_pmu_unregister(&ddrc_pmu->pmu);
|
||||
cpuhp_state_remove_instance_nocalls(CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE,
|
||||
cpuhp_state_remove_instance_nocalls(hisi_uncore_pmu_cpuhp_state,
|
||||
&ddrc_pmu->node);
|
||||
}
|
||||
|
||||
|
|
@ -501,33 +501,7 @@ static struct platform_driver hisi_ddrc_pmu_driver = {
|
|||
.remove = hisi_ddrc_pmu_remove,
|
||||
};
|
||||
|
||||
static int __init hisi_ddrc_pmu_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cpuhp_setup_state_multi(CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE,
|
||||
"AP_PERF_ARM_HISI_DDRC_ONLINE",
|
||||
hisi_uncore_pmu_online_cpu,
|
||||
hisi_uncore_pmu_offline_cpu);
|
||||
if (ret) {
|
||||
pr_err("DDRC PMU: setup hotplug, ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = platform_driver_register(&hisi_ddrc_pmu_driver);
|
||||
if (ret)
|
||||
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
module_init(hisi_ddrc_pmu_module_init);
|
||||
|
||||
static void __exit hisi_ddrc_pmu_module_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&hisi_ddrc_pmu_driver);
|
||||
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE);
|
||||
}
|
||||
module_exit(hisi_ddrc_pmu_module_exit);
|
||||
module_platform_driver(hisi_ddrc_pmu_driver);
|
||||
|
||||
MODULE_IMPORT_NS("HISI_PMU");
|
||||
MODULE_DESCRIPTION("HiSilicon SoC DDRC uncore PMU driver");
|
||||
|
|
|
|||
|
|
@ -490,7 +490,7 @@ static int hisi_hha_pmu_probe(struct platform_device *pdev)
|
|||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = cpuhp_state_add_instance(CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE,
|
||||
ret = cpuhp_state_add_instance(hisi_uncore_pmu_cpuhp_state,
|
||||
&hha_pmu->node);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Error %d registering hotplug\n", ret);
|
||||
|
|
@ -503,7 +503,7 @@ static int hisi_hha_pmu_probe(struct platform_device *pdev)
|
|||
if (ret) {
|
||||
dev_err(hha_pmu->dev, "HHA PMU register failed!\n");
|
||||
cpuhp_state_remove_instance_nocalls(
|
||||
CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE, &hha_pmu->node);
|
||||
hisi_uncore_pmu_cpuhp_state, &hha_pmu->node);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
@ -514,7 +514,7 @@ static void hisi_hha_pmu_remove(struct platform_device *pdev)
|
|||
struct hisi_pmu *hha_pmu = platform_get_drvdata(pdev);
|
||||
|
||||
perf_pmu_unregister(&hha_pmu->pmu);
|
||||
cpuhp_state_remove_instance_nocalls(CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE,
|
||||
cpuhp_state_remove_instance_nocalls(hisi_uncore_pmu_cpuhp_state,
|
||||
&hha_pmu->node);
|
||||
}
|
||||
|
||||
|
|
@ -528,33 +528,7 @@ static struct platform_driver hisi_hha_pmu_driver = {
|
|||
.remove = hisi_hha_pmu_remove,
|
||||
};
|
||||
|
||||
static int __init hisi_hha_pmu_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cpuhp_setup_state_multi(CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE,
|
||||
"AP_PERF_ARM_HISI_HHA_ONLINE",
|
||||
hisi_uncore_pmu_online_cpu,
|
||||
hisi_uncore_pmu_offline_cpu);
|
||||
if (ret) {
|
||||
pr_err("HHA PMU: Error setup hotplug, ret = %d;\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = platform_driver_register(&hisi_hha_pmu_driver);
|
||||
if (ret)
|
||||
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
module_init(hisi_hha_pmu_module_init);
|
||||
|
||||
static void __exit hisi_hha_pmu_module_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&hisi_hha_pmu_driver);
|
||||
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE);
|
||||
}
|
||||
module_exit(hisi_hha_pmu_module_exit);
|
||||
module_platform_driver(hisi_hha_pmu_driver);
|
||||
|
||||
MODULE_IMPORT_NS("HISI_PMU");
|
||||
MODULE_DESCRIPTION("HiSilicon SoC HHA uncore PMU driver");
|
||||
|
|
|
|||
|
|
@ -93,6 +93,8 @@ struct hisi_l3c_pmu_ext {
|
|||
bool support_ext;
|
||||
};
|
||||
|
||||
static enum cpuhp_state hisi_l3c_pmu_cpuhp_state;
|
||||
|
||||
static bool support_ext(struct hisi_l3c_pmu *pmu)
|
||||
{
|
||||
struct hisi_l3c_pmu_ext *l3c_pmu_ext = pmu->l3c_pmu.dev_info->private;
|
||||
|
|
@ -844,8 +846,7 @@ static int hisi_l3c_pmu_probe(struct platform_device *pdev)
|
|||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = cpuhp_state_add_instance(CPUHP_AP_PERF_ARM_HISI_L3_ONLINE,
|
||||
&l3c_pmu->node);
|
||||
ret = cpuhp_state_add_instance(hisi_l3c_pmu_cpuhp_state, &l3c_pmu->node);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Error %d registering hotplug\n", ret);
|
||||
return ret;
|
||||
|
|
@ -857,7 +858,7 @@ static int hisi_l3c_pmu_probe(struct platform_device *pdev)
|
|||
if (ret) {
|
||||
dev_err(l3c_pmu->dev, "L3C PMU register failed!\n");
|
||||
cpuhp_state_remove_instance_nocalls(
|
||||
CPUHP_AP_PERF_ARM_HISI_L3_ONLINE, &l3c_pmu->node);
|
||||
hisi_l3c_pmu_cpuhp_state, &l3c_pmu->node);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
@ -868,7 +869,7 @@ static void hisi_l3c_pmu_remove(struct platform_device *pdev)
|
|||
struct hisi_pmu *l3c_pmu = platform_get_drvdata(pdev);
|
||||
|
||||
perf_pmu_unregister(&l3c_pmu->pmu);
|
||||
cpuhp_state_remove_instance_nocalls(CPUHP_AP_PERF_ARM_HISI_L3_ONLINE,
|
||||
cpuhp_state_remove_instance_nocalls(hisi_l3c_pmu_cpuhp_state,
|
||||
&l3c_pmu->node);
|
||||
}
|
||||
|
||||
|
|
@ -938,20 +939,20 @@ static int hisi_l3c_pmu_offline_cpu(unsigned int cpu, struct hlist_node *node)
|
|||
|
||||
static int __init hisi_l3c_pmu_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cpuhp_setup_state_multi(CPUHP_AP_PERF_ARM_HISI_L3_ONLINE,
|
||||
int ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN,
|
||||
"AP_PERF_ARM_HISI_L3_ONLINE",
|
||||
hisi_l3c_pmu_online_cpu,
|
||||
hisi_l3c_pmu_offline_cpu);
|
||||
if (ret) {
|
||||
if (ret < 0) {
|
||||
pr_err("L3C PMU: Error setup hotplug, ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
hisi_l3c_pmu_cpuhp_state = ret;
|
||||
|
||||
ret = platform_driver_register(&hisi_l3c_pmu_driver);
|
||||
if (ret)
|
||||
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_HISI_L3_ONLINE);
|
||||
cpuhp_remove_multi_state(hisi_l3c_pmu_cpuhp_state);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -960,7 +961,7 @@ module_init(hisi_l3c_pmu_module_init);
|
|||
static void __exit hisi_l3c_pmu_module_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&hisi_l3c_pmu_driver);
|
||||
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_HISI_L3_ONLINE);
|
||||
cpuhp_remove_multi_state(hisi_l3c_pmu_cpuhp_state);
|
||||
}
|
||||
module_exit(hisi_l3c_pmu_module_exit);
|
||||
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@
|
|||
|
||||
#include "hisi_uncore_pmu.h"
|
||||
|
||||
/* Dynamic CPU hotplug state used by MN PMU */
|
||||
static enum cpuhp_state hisi_mn_pmu_online;
|
||||
|
||||
/* MN register definition */
|
||||
#define HISI_MN_DYNAMIC_CTRL_REG 0x400
|
||||
#define HISI_MN_DYNAMIC_CTRL_EN BIT(0)
|
||||
|
|
@ -291,7 +288,7 @@ static int hisi_mn_pmu_dev_init(struct platform_device *pdev,
|
|||
|
||||
static void hisi_mn_pmu_remove_cpuhp(void *hotplug_node)
|
||||
{
|
||||
cpuhp_state_remove_instance_nocalls(hisi_mn_pmu_online, hotplug_node);
|
||||
cpuhp_state_remove_instance_nocalls(hisi_uncore_pmu_cpuhp_state, hotplug_node);
|
||||
}
|
||||
|
||||
static void hisi_mn_pmu_unregister(void *pmu)
|
||||
|
|
@ -320,7 +317,7 @@ static int hisi_mn_pmu_probe(struct platform_device *pdev)
|
|||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = cpuhp_state_add_instance(hisi_mn_pmu_online, &mn_pmu->node);
|
||||
ret = cpuhp_state_add_instance(hisi_uncore_pmu_cpuhp_state, &mn_pmu->node);
|
||||
if (ret)
|
||||
return dev_err_probe(&pdev->dev, ret, "Failed to register cpu hotplug\n");
|
||||
|
||||
|
|
@ -376,33 +373,7 @@ static struct platform_driver hisi_mn_pmu_driver = {
|
|||
.probe = hisi_mn_pmu_probe,
|
||||
};
|
||||
|
||||
static int __init hisi_mn_pmu_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "perf/hisi/mn:online",
|
||||
hisi_uncore_pmu_online_cpu,
|
||||
hisi_uncore_pmu_offline_cpu);
|
||||
if (ret < 0) {
|
||||
pr_err("hisi_mn_pmu: Failed to setup MN PMU hotplug: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
hisi_mn_pmu_online = ret;
|
||||
|
||||
ret = platform_driver_register(&hisi_mn_pmu_driver);
|
||||
if (ret)
|
||||
cpuhp_remove_multi_state(hisi_mn_pmu_online);
|
||||
|
||||
return ret;
|
||||
}
|
||||
module_init(hisi_mn_pmu_module_init);
|
||||
|
||||
static void __exit hisi_mn_pmu_module_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&hisi_mn_pmu_driver);
|
||||
cpuhp_remove_multi_state(hisi_mn_pmu_online);
|
||||
}
|
||||
module_exit(hisi_mn_pmu_module_exit);
|
||||
module_platform_driver(hisi_mn_pmu_driver);
|
||||
|
||||
MODULE_IMPORT_NS("HISI_PMU");
|
||||
MODULE_DESCRIPTION("HiSilicon SoC MN uncore PMU driver");
|
||||
|
|
|
|||
|
|
@ -41,9 +41,6 @@
|
|||
HISI_PMU_EVENT_ATTR_EXTRACTOR(ch, config1, 2, 0);
|
||||
HISI_PMU_EVENT_ATTR_EXTRACTOR(tt_en, config1, 3, 3);
|
||||
|
||||
/* Dynamic CPU hotplug state used by this PMU driver */
|
||||
static enum cpuhp_state hisi_noc_pmu_cpuhp_state;
|
||||
|
||||
struct hisi_noc_pmu_regs {
|
||||
u32 version;
|
||||
u32 pmu_ctrl;
|
||||
|
|
@ -324,7 +321,7 @@ static int hisi_noc_pmu_dev_init(struct platform_device *pdev, struct hisi_pmu *
|
|||
|
||||
static void hisi_noc_pmu_remove_cpuhp_instance(void *hotplug_node)
|
||||
{
|
||||
cpuhp_state_remove_instance_nocalls(hisi_noc_pmu_cpuhp_state, hotplug_node);
|
||||
cpuhp_state_remove_instance_nocalls(hisi_uncore_pmu_cpuhp_state, hotplug_node);
|
||||
}
|
||||
|
||||
static void hisi_noc_pmu_unregister_pmu(void *pmu)
|
||||
|
|
@ -353,7 +350,7 @@ static int hisi_noc_pmu_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = cpuhp_state_add_instance(hisi_noc_pmu_cpuhp_state, &noc_pmu->node);
|
||||
ret = cpuhp_state_add_instance(hisi_uncore_pmu_cpuhp_state, &noc_pmu->node);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Fail to register cpuhp instance\n");
|
||||
|
||||
|
|
@ -408,33 +405,7 @@ static struct platform_driver hisi_noc_pmu_driver = {
|
|||
.probe = hisi_noc_pmu_probe,
|
||||
};
|
||||
|
||||
static int __init hisi_noc_pmu_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "perf/hisi/noc:online",
|
||||
hisi_uncore_pmu_online_cpu,
|
||||
hisi_uncore_pmu_offline_cpu);
|
||||
if (ret < 0) {
|
||||
pr_err("hisi_noc_pmu: Fail to setup cpuhp callbacks, ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
hisi_noc_pmu_cpuhp_state = ret;
|
||||
|
||||
ret = platform_driver_register(&hisi_noc_pmu_driver);
|
||||
if (ret)
|
||||
cpuhp_remove_multi_state(hisi_noc_pmu_cpuhp_state);
|
||||
|
||||
return ret;
|
||||
}
|
||||
module_init(hisi_noc_pmu_module_init);
|
||||
|
||||
static void __exit hisi_noc_pmu_module_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&hisi_noc_pmu_driver);
|
||||
cpuhp_remove_multi_state(hisi_noc_pmu_cpuhp_state);
|
||||
}
|
||||
module_exit(hisi_noc_pmu_module_exit);
|
||||
module_platform_driver(hisi_noc_pmu_driver);
|
||||
|
||||
MODULE_IMPORT_NS("HISI_PMU");
|
||||
MODULE_DESCRIPTION("HiSilicon SoC Uncore NoC PMU driver");
|
||||
|
|
|
|||
|
|
@ -468,7 +468,7 @@ static int hisi_pa_pmu_probe(struct platform_device *pdev)
|
|||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = cpuhp_state_add_instance(CPUHP_AP_PERF_ARM_HISI_PA_ONLINE,
|
||||
ret = cpuhp_state_add_instance(hisi_uncore_pmu_cpuhp_state,
|
||||
&pa_pmu->node);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Error %d registering hotplug\n", ret);
|
||||
|
|
@ -479,7 +479,7 @@ static int hisi_pa_pmu_probe(struct platform_device *pdev)
|
|||
ret = perf_pmu_register(&pa_pmu->pmu, name, -1);
|
||||
if (ret) {
|
||||
dev_err(pa_pmu->dev, "PMU register failed, ret = %d\n", ret);
|
||||
cpuhp_state_remove_instance_nocalls(CPUHP_AP_PERF_ARM_HISI_PA_ONLINE,
|
||||
cpuhp_state_remove_instance_nocalls(hisi_uncore_pmu_cpuhp_state,
|
||||
&pa_pmu->node);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -493,7 +493,7 @@ static void hisi_pa_pmu_remove(struct platform_device *pdev)
|
|||
struct hisi_pmu *pa_pmu = platform_get_drvdata(pdev);
|
||||
|
||||
perf_pmu_unregister(&pa_pmu->pmu);
|
||||
cpuhp_state_remove_instance_nocalls(CPUHP_AP_PERF_ARM_HISI_PA_ONLINE,
|
||||
cpuhp_state_remove_instance_nocalls(hisi_uncore_pmu_cpuhp_state,
|
||||
&pa_pmu->node);
|
||||
}
|
||||
|
||||
|
|
@ -515,33 +515,7 @@ static struct platform_driver hisi_pa_pmu_driver = {
|
|||
.remove = hisi_pa_pmu_remove,
|
||||
};
|
||||
|
||||
static int __init hisi_pa_pmu_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cpuhp_setup_state_multi(CPUHP_AP_PERF_ARM_HISI_PA_ONLINE,
|
||||
"AP_PERF_ARM_HISI_PA_ONLINE",
|
||||
hisi_uncore_pmu_online_cpu,
|
||||
hisi_uncore_pmu_offline_cpu);
|
||||
if (ret) {
|
||||
pr_err("PA PMU: cpuhp state setup failed, ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = platform_driver_register(&hisi_pa_pmu_driver);
|
||||
if (ret)
|
||||
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_HISI_PA_ONLINE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
module_init(hisi_pa_pmu_module_init);
|
||||
|
||||
static void __exit hisi_pa_pmu_module_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&hisi_pa_pmu_driver);
|
||||
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_HISI_PA_ONLINE);
|
||||
}
|
||||
module_exit(hisi_pa_pmu_module_exit);
|
||||
module_platform_driver(hisi_pa_pmu_driver);
|
||||
|
||||
MODULE_IMPORT_NS("HISI_PMU");
|
||||
MODULE_DESCRIPTION("HiSilicon Protocol Adapter uncore PMU driver");
|
||||
|
|
|
|||
|
|
@ -23,6 +23,9 @@
|
|||
|
||||
#define HISI_MAX_PERIOD(nr) (GENMASK_ULL((nr) - 1, 0))
|
||||
|
||||
enum cpuhp_state hisi_uncore_pmu_cpuhp_state;
|
||||
EXPORT_SYMBOL_NS_GPL(hisi_uncore_pmu_cpuhp_state, "HISI_PMU");
|
||||
|
||||
/*
|
||||
* PMU event attributes
|
||||
*/
|
||||
|
|
@ -618,5 +621,27 @@ void hisi_pmu_init(struct hisi_pmu *hisi_pmu, struct module *module)
|
|||
}
|
||||
EXPORT_SYMBOL_NS_GPL(hisi_pmu_init, "HISI_PMU");
|
||||
|
||||
static int __init hisi_uncore_pmu_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "perf/hisi/uncore:online",
|
||||
hisi_uncore_pmu_online_cpu,
|
||||
hisi_uncore_pmu_offline_cpu);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
hisi_uncore_pmu_cpuhp_state = ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
module_init(hisi_uncore_pmu_init);
|
||||
|
||||
static void __exit hisi_uncore_pmu_exit(void)
|
||||
{
|
||||
cpuhp_remove_multi_state(hisi_uncore_pmu_cpuhp_state);
|
||||
}
|
||||
module_exit(hisi_uncore_pmu_exit);
|
||||
|
||||
MODULE_DESCRIPTION("HiSilicon SoC uncore Performance Monitor driver framework");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
|||
|
|
@ -171,4 +171,6 @@ int hisi_uncore_pmu_init_irq(struct hisi_pmu *hisi_pmu,
|
|||
void hisi_uncore_pmu_init_topology(struct hisi_pmu *hisi_pmu, struct device *dev);
|
||||
|
||||
void hisi_pmu_init(struct hisi_pmu *hisi_pmu, struct module *module);
|
||||
|
||||
extern enum cpuhp_state hisi_uncore_pmu_cpuhp_state;
|
||||
#endif /* __HISI_UNCORE_PMU_H__ */
|
||||
|
|
|
|||
|
|
@ -503,7 +503,7 @@ static int hisi_sllc_pmu_probe(struct platform_device *pdev)
|
|||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = cpuhp_state_add_instance(CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE,
|
||||
ret = cpuhp_state_add_instance(hisi_uncore_pmu_cpuhp_state,
|
||||
&sllc_pmu->node);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Error %d registering hotplug\n", ret);
|
||||
|
|
@ -515,7 +515,7 @@ static int hisi_sllc_pmu_probe(struct platform_device *pdev)
|
|||
ret = perf_pmu_register(&sllc_pmu->pmu, name, -1);
|
||||
if (ret) {
|
||||
dev_err(sllc_pmu->dev, "PMU register failed, ret = %d\n", ret);
|
||||
cpuhp_state_remove_instance_nocalls(CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE,
|
||||
cpuhp_state_remove_instance_nocalls(hisi_uncore_pmu_cpuhp_state,
|
||||
&sllc_pmu->node);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -530,7 +530,7 @@ static void hisi_sllc_pmu_remove(struct platform_device *pdev)
|
|||
struct hisi_pmu *sllc_pmu = platform_get_drvdata(pdev);
|
||||
|
||||
perf_pmu_unregister(&sllc_pmu->pmu);
|
||||
cpuhp_state_remove_instance_nocalls(CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE,
|
||||
cpuhp_state_remove_instance_nocalls(hisi_uncore_pmu_cpuhp_state,
|
||||
&sllc_pmu->node);
|
||||
}
|
||||
|
||||
|
|
@ -551,33 +551,7 @@ static struct platform_driver hisi_sllc_pmu_driver = {
|
|||
.remove = hisi_sllc_pmu_remove,
|
||||
};
|
||||
|
||||
static int __init hisi_sllc_pmu_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cpuhp_setup_state_multi(CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE,
|
||||
"AP_PERF_ARM_HISI_SLLC_ONLINE",
|
||||
hisi_uncore_pmu_online_cpu,
|
||||
hisi_uncore_pmu_offline_cpu);
|
||||
if (ret) {
|
||||
pr_err("SLLC PMU: cpuhp state setup failed, ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = platform_driver_register(&hisi_sllc_pmu_driver);
|
||||
if (ret)
|
||||
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
module_init(hisi_sllc_pmu_module_init);
|
||||
|
||||
static void __exit hisi_sllc_pmu_module_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&hisi_sllc_pmu_driver);
|
||||
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE);
|
||||
}
|
||||
module_exit(hisi_sllc_pmu_module_exit);
|
||||
module_platform_driver(hisi_sllc_pmu_driver);
|
||||
|
||||
MODULE_IMPORT_NS("HISI_PMU");
|
||||
MODULE_DESCRIPTION("HiSilicon SLLC uncore PMU driver");
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@
|
|||
|
||||
#include "hisi_uncore_pmu.h"
|
||||
|
||||
/* Dynamic CPU hotplug state used by UC PMU */
|
||||
static enum cpuhp_state hisi_uc_pmu_online;
|
||||
|
||||
/* UC register definition */
|
||||
#define HISI_UC_INT_MASK_REG 0x0800
|
||||
#define HISI_UC_INT_STS_REG 0x0808
|
||||
|
|
@ -488,7 +485,7 @@ static int hisi_uc_pmu_dev_probe(struct platform_device *pdev,
|
|||
|
||||
static void hisi_uc_pmu_remove_cpuhp_instance(void *hotplug_node)
|
||||
{
|
||||
cpuhp_state_remove_instance_nocalls(hisi_uc_pmu_online, hotplug_node);
|
||||
cpuhp_state_remove_instance_nocalls(hisi_uncore_pmu_cpuhp_state, hotplug_node);
|
||||
}
|
||||
|
||||
static void hisi_uc_pmu_unregister_pmu(void *pmu)
|
||||
|
|
@ -518,7 +515,7 @@ static int hisi_uc_pmu_probe(struct platform_device *pdev)
|
|||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = cpuhp_state_add_instance(hisi_uc_pmu_online, &uc_pmu->node);
|
||||
ret = cpuhp_state_add_instance(hisi_uncore_pmu_cpuhp_state, &uc_pmu->node);
|
||||
if (ret)
|
||||
return dev_err_probe(&pdev->dev, ret, "Error registering hotplug\n");
|
||||
|
||||
|
|
@ -559,34 +556,7 @@ static struct platform_driver hisi_uc_pmu_driver = {
|
|||
.probe = hisi_uc_pmu_probe,
|
||||
};
|
||||
|
||||
static int __init hisi_uc_pmu_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN,
|
||||
"perf/hisi/uc:online",
|
||||
hisi_uncore_pmu_online_cpu,
|
||||
hisi_uncore_pmu_offline_cpu);
|
||||
if (ret < 0) {
|
||||
pr_err("UC PMU: Error setup hotplug, ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
hisi_uc_pmu_online = ret;
|
||||
|
||||
ret = platform_driver_register(&hisi_uc_pmu_driver);
|
||||
if (ret)
|
||||
cpuhp_remove_multi_state(hisi_uc_pmu_online);
|
||||
|
||||
return ret;
|
||||
}
|
||||
module_init(hisi_uc_pmu_module_init);
|
||||
|
||||
static void __exit hisi_uc_pmu_module_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&hisi_uc_pmu_driver);
|
||||
cpuhp_remove_multi_state(hisi_uc_pmu_online);
|
||||
}
|
||||
module_exit(hisi_uc_pmu_module_exit);
|
||||
module_platform_driver(hisi_uc_pmu_driver);
|
||||
|
||||
MODULE_IMPORT_NS("HISI_PMU");
|
||||
MODULE_DESCRIPTION("HiSilicon SoC UC uncore PMU driver");
|
||||
|
|
|
|||
|
|
@ -209,12 +209,6 @@ enum cpuhp_state {
|
|||
CPUHP_AP_PERF_S390_SF_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_CCI_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_CCN_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_HISI_CPA_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_HISI_L3_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_HISI_PA_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_HISI_PCIE_PMU_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_HNS3_PMU_ONLINE,
|
||||
CPUHP_AP_PERF_ARM_L2X0_ONLINE,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user