2012-11-12 18:33:44 +04:00
/*
* Copyright ( C ) 2012 ARM Ltd .
*
* 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 .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# ifndef __CLKSOURCE_ARM_ARCH_TIMER_H
# define __CLKSOURCE_ARM_ARCH_TIMER_H
2017-01-18 16:25:28 +03:00
# include <linux/bitops.h>
2014-12-21 21:46:56 +03:00
# include <linux/timecounter.h>
2012-11-12 18:33:44 +04:00
# include <linux/types.h>
2017-01-18 16:25:28 +03:00
# define ARCH_TIMER_TYPE_CP15 BIT(0)
# define ARCH_TIMER_TYPE_MEM BIT(1)
2012-11-12 18:33:44 +04:00
# define ARCH_TIMER_CTRL_ENABLE (1 << 0)
# define ARCH_TIMER_CTRL_IT_MASK (1 << 1)
# define ARCH_TIMER_CTRL_IT_STAT (1 << 2)
2015-10-19 18:32:20 +03:00
# define CNTHCTL_EL1PCTEN (1 << 0)
# define CNTHCTL_EL1PCEN (1 << 1)
# define CNTHCTL_EVNTEN (1 << 2)
# define CNTHCTL_EVNTDIR (1 << 3)
# define CNTHCTL_EVNTI (0xF << 4)
2013-07-19 03:59:28 +04:00
enum arch_timer_reg {
ARCH_TIMER_REG_CTRL ,
ARCH_TIMER_REG_TVAL ,
} ;
2012-11-12 18:33:44 +04:00
2017-01-18 16:25:28 +03:00
enum arch_timer_ppi_nr {
ARCH_TIMER_PHYS_SECURE_PPI ,
ARCH_TIMER_PHYS_NONSECURE_PPI ,
ARCH_TIMER_VIRT_PPI ,
ARCH_TIMER_HYP_PPI ,
ARCH_TIMER_MAX_TIMER_PPI
} ;
2017-01-18 16:25:29 +03:00
enum arch_timer_spi_nr {
ARCH_TIMER_PHYS_SPI ,
ARCH_TIMER_VIRT_SPI ,
ARCH_TIMER_MAX_TIMER_SPI
} ;
2012-11-12 18:33:44 +04:00
# define ARCH_TIMER_PHYS_ACCESS 0
# define ARCH_TIMER_VIRT_ACCESS 1
2013-07-19 03:59:32 +04:00
# define ARCH_TIMER_MEM_PHYS_ACCESS 2
# define ARCH_TIMER_MEM_VIRT_ACCESS 3
2012-11-12 18:33:44 +04:00
2013-08-13 16:43:26 +04:00
# define ARCH_TIMER_USR_PCT_ACCESS_EN (1 << 0) /* physical counter */
# define ARCH_TIMER_USR_VCT_ACCESS_EN (1 << 1) /* virtual counter */
# define ARCH_TIMER_VIRT_EVT_EN (1 << 2)
# define ARCH_TIMER_EVT_TRIGGER_SHIFT (4)
# define ARCH_TIMER_EVT_TRIGGER_MASK (0xF << ARCH_TIMER_EVT_TRIGGER_SHIFT)
# define ARCH_TIMER_USR_VT_ACCESS_EN (1 << 8) /* virtual timer registers */
# define ARCH_TIMER_USR_PT_ACCESS_EN (1 << 9) /* physical timer registers */
2013-08-23 18:32:29 +04:00
# define ARCH_TIMER_EVT_STREAM_FREQ 10000 /* 100us */
2016-04-11 18:32:51 +03:00
struct arch_timer_kvm_info {
struct timecounter timecounter ;
2016-04-11 18:32:52 +03:00
int virtual_irq ;
2016-04-11 18:32:51 +03:00
} ;
2012-11-12 18:33:44 +04:00
# ifdef CONFIG_ARM_ARCH_TIMER
extern u32 arch_timer_get_rate ( void ) ;
2013-07-19 03:59:32 +04:00
extern u64 ( * arch_timer_read_counter ) ( void ) ;
2016-04-11 18:32:51 +03:00
extern struct arch_timer_kvm_info * arch_timer_get_kvm_info ( void ) ;
2012-11-12 18:33:44 +04:00
# else
static inline u32 arch_timer_get_rate ( void )
{
return 0 ;
}
static inline u64 arch_timer_read_counter ( void )
{
return 0 ;
}
# endif
# endif