79 lines
		
	
	
	
		
			2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			79 lines
		
	
	
	
		
			2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
							 | 
						||
| 
								 | 
							
								 *		http://www.samsung.com/
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * EXYNOS PPMU header
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This program is free software; you can redistribute it and/or modify
							 | 
						||
| 
								 | 
							
								 * it under the terms of the GNU General Public License version 2 as
							 | 
						||
| 
								 | 
							
								 * published by the Free Software Foundation.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef __DEVFREQ_EXYNOS_PPMU_H
							 | 
						||
| 
								 | 
							
								#define __DEVFREQ_EXYNOS_PPMU_H __FILE__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <linux/ktime.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* For PPMU Control */
							 | 
						||
| 
								 | 
							
								#define PPMU_ENABLE             BIT(0)
							 | 
						||
| 
								 | 
							
								#define PPMU_DISABLE            0x0
							 | 
						||
| 
								 | 
							
								#define PPMU_CYCLE_RESET        BIT(1)
							 | 
						||
| 
								 | 
							
								#define PPMU_COUNTER_RESET      BIT(2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define PPMU_ENABLE_COUNT0      BIT(0)
							 | 
						||
| 
								 | 
							
								#define PPMU_ENABLE_COUNT1      BIT(1)
							 | 
						||
| 
								 | 
							
								#define PPMU_ENABLE_COUNT2      BIT(2)
							 | 
						||
| 
								 | 
							
								#define PPMU_ENABLE_COUNT3      BIT(3)
							 | 
						||
| 
								 | 
							
								#define PPMU_ENABLE_CYCLE       BIT(31)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define PPMU_CNTENS		0x10
							 | 
						||
| 
								 | 
							
								#define PPMU_FLAG		0x50
							 | 
						||
| 
								 | 
							
								#define PPMU_CCNT_OVERFLOW	BIT(31)
							 | 
						||
| 
								 | 
							
								#define PPMU_CCNT		0x100
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define PPMU_PMCNT0		0x110
							 | 
						||
| 
								 | 
							
								#define PPMU_PMCNT_OFFSET	0x10
							 | 
						||
| 
								 | 
							
								#define PMCNT_OFFSET(x)		(PPMU_PMCNT0 + (PPMU_PMCNT_OFFSET * x))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define PPMU_BEVT0SEL		0x1000
							 | 
						||
| 
								 | 
							
								#define PPMU_BEVTSEL_OFFSET	0x100
							 | 
						||
| 
								 | 
							
								#define PPMU_BEVTSEL(x)		(PPMU_BEVT0SEL + (ch * PPMU_BEVTSEL_OFFSET))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* For Event Selection */
							 | 
						||
| 
								 | 
							
								#define RD_DATA_COUNT		0x5
							 | 
						||
| 
								 | 
							
								#define WR_DATA_COUNT		0x6
							 | 
						||
| 
								 | 
							
								#define RDWR_DATA_COUNT		0x7
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								enum ppmu_counter {
							 | 
						||
| 
								 | 
							
									PPMU_PMNCNT0,
							 | 
						||
| 
								 | 
							
									PPMU_PMCCNT1,
							 | 
						||
| 
								 | 
							
									PPMU_PMNCNT2,
							 | 
						||
| 
								 | 
							
									PPMU_PMNCNT3,
							 | 
						||
| 
								 | 
							
									PPMU_PMNCNT_MAX,
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct bus_opp_table {
							 | 
						||
| 
								 | 
							
									unsigned int idx;
							 | 
						||
| 
								 | 
							
									unsigned long clk;
							 | 
						||
| 
								 | 
							
									unsigned long volt;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct exynos_ppmu {
							 | 
						||
| 
								 | 
							
									void __iomem *hw_base;
							 | 
						||
| 
								 | 
							
									unsigned int ccnt;
							 | 
						||
| 
								 | 
							
									unsigned int event[PPMU_PMNCNT_MAX];
							 | 
						||
| 
								 | 
							
									unsigned int count[PPMU_PMNCNT_MAX];
							 | 
						||
| 
								 | 
							
									unsigned long long ns;
							 | 
						||
| 
								 | 
							
									ktime_t reset_time;
							 | 
						||
| 
								 | 
							
									bool ccnt_overflow;
							 | 
						||
| 
								 | 
							
									bool count_overflow[PPMU_PMNCNT_MAX];
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void exynos_ppmu_reset(void __iomem *ppmu_base);
							 | 
						||
| 
								 | 
							
								void exynos_ppmu_setevent(void __iomem *ppmu_base, unsigned int ch,
							 | 
						||
| 
								 | 
							
											unsigned int evt);
							 | 
						||
| 
								 | 
							
								void exynos_ppmu_start(void __iomem *ppmu_base);
							 | 
						||
| 
								 | 
							
								void exynos_ppmu_stop(void __iomem *ppmu_base);
							 | 
						||
| 
								 | 
							
								unsigned int exynos_ppmu_read(void __iomem *ppmu_base, unsigned int ch);
							 | 
						||
| 
								 | 
							
								#endif /* __DEVFREQ_EXYNOS_PPMU_H */
							 |