mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	perf/arm-cci: Allow building as a module
Fill in the few extra bits and annotations needed to make the driver work properly as a module, and jiggle the Kconfig to expose the driver-level ARM_CCI_PMU option. Signed-off-by: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
		
							parent
							
								
									28c01dc9d8
								
							
						
					
					
						commit
						8b0c93c20e
					
				
					 2 changed files with 34 additions and 17 deletions
				
			
		| 
						 | 
				
			
			@ -6,30 +6,32 @@ menu "Performance monitor support"
 | 
			
		|||
	depends on PERF_EVENTS
 | 
			
		||||
 | 
			
		||||
config ARM_CCI_PMU
 | 
			
		||||
	bool
 | 
			
		||||
	tristate "ARM CCI PMU driver"
 | 
			
		||||
	depends on (ARM && CPU_V7) || ARM64
 | 
			
		||||
	select ARM_CCI
 | 
			
		||||
	help
 | 
			
		||||
	  Support for PMU events monitoring on the ARM CCI (Cache Coherent
 | 
			
		||||
	  Interconnect) family of products.
 | 
			
		||||
 | 
			
		||||
	  If compiled as a module, it will be called arm-cci.
 | 
			
		||||
 | 
			
		||||
config ARM_CCI400_PMU
 | 
			
		||||
	bool "ARM CCI400 PMU support"
 | 
			
		||||
	depends on (ARM && CPU_V7) || ARM64
 | 
			
		||||
	bool "support CCI-400"
 | 
			
		||||
	default y
 | 
			
		||||
	depends on ARM_CCI_PMU
 | 
			
		||||
	select ARM_CCI400_COMMON
 | 
			
		||||
	select ARM_CCI_PMU
 | 
			
		||||
	help
 | 
			
		||||
	  Support for PMU events monitoring on the ARM CCI-400 (cache coherent
 | 
			
		||||
	  interconnect). CCI-400 supports counting events related to the
 | 
			
		||||
	  connected slave/master interfaces.
 | 
			
		||||
	  CCI-400 provides 4 independent event counters counting events related
 | 
			
		||||
	  to the connected slave/master interfaces, plus a cycle counter.
 | 
			
		||||
 | 
			
		||||
config ARM_CCI5xx_PMU
 | 
			
		||||
	bool "ARM CCI-500/CCI-550 PMU support"
 | 
			
		||||
	depends on (ARM && CPU_V7) || ARM64
 | 
			
		||||
	select ARM_CCI_PMU
 | 
			
		||||
	bool "support CCI-500/CCI-550"
 | 
			
		||||
	default y
 | 
			
		||||
	depends on ARM_CCI_PMU
 | 
			
		||||
	help
 | 
			
		||||
	  Support for PMU events monitoring on the ARM CCI-500/CCI-550 cache
 | 
			
		||||
	  coherent interconnects. Both of them provide 8 independent event counters,
 | 
			
		||||
	  which can count events pertaining to the slave/master interfaces as well
 | 
			
		||||
	  as the internal events to the CCI.
 | 
			
		||||
 | 
			
		||||
	  If unsure, say Y
 | 
			
		||||
	  CCI-500/CCI-550 both provide 8 independent event counters, which can
 | 
			
		||||
	  count events pertaining to the slave/master interfaces as well as the
 | 
			
		||||
	  internal events to the CCI.
 | 
			
		||||
 | 
			
		||||
config ARM_CCN
 | 
			
		||||
	tristate "ARM CCN driver support"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1407,6 +1407,7 @@ static int cci_pmu_init(struct cci_pmu *cci_pmu, struct platform_device *pdev)
 | 
			
		|||
	pmu_format_attr_group.attrs = model->format_attrs;
 | 
			
		||||
 | 
			
		||||
	cci_pmu->pmu = (struct pmu) {
 | 
			
		||||
		.module		= THIS_MODULE,
 | 
			
		||||
		.name		= cci_pmu->model->name,
 | 
			
		||||
		.task_ctx_nr	= perf_invalid_context,
 | 
			
		||||
		.pmu_enable	= cci_pmu_enable,
 | 
			
		||||
| 
						 | 
				
			
			@ -1572,6 +1573,7 @@ static const struct of_device_id arm_cci_pmu_matches[] = {
 | 
			
		|||
#endif
 | 
			
		||||
	{},
 | 
			
		||||
};
 | 
			
		||||
MODULE_DEVICE_TABLE(of, arm_cci_pmu_matches);
 | 
			
		||||
 | 
			
		||||
static bool is_duplicate_irq(int irq, int *irqs, int nr_irqs)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -1693,14 +1695,27 @@ static int cci_pmu_probe(struct platform_device *pdev)
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int cci_pmu_remove(struct platform_device *pdev)
 | 
			
		||||
{
 | 
			
		||||
	if (!g_cci_pmu)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	cpuhp_remove_state(CPUHP_AP_PERF_ARM_CCI_ONLINE);
 | 
			
		||||
	perf_pmu_unregister(&g_cci_pmu->pmu);
 | 
			
		||||
	g_cci_pmu = NULL;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct platform_driver cci_pmu_driver = {
 | 
			
		||||
	.driver = {
 | 
			
		||||
		   .name = DRIVER_NAME,
 | 
			
		||||
		   .of_match_table = arm_cci_pmu_matches,
 | 
			
		||||
		  },
 | 
			
		||||
	.probe = cci_pmu_probe,
 | 
			
		||||
	.remove = cci_pmu_remove,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
builtin_platform_driver(cci_pmu_driver);
 | 
			
		||||
module_platform_driver(cci_pmu_driver);
 | 
			
		||||
MODULE_LICENSE("GPL v2");
 | 
			
		||||
MODULE_DESCRIPTION("ARM CCI PMU support");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue