2019-06-03 08:44:50 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2012-11-12 18:33:44 +04:00
/*
* Copyright ( C ) 2012 ARM Ltd .
*/
# 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
2017-03-31 20:50:59 +03:00
# define ARCH_TIMER_MEM_MAX_FRAMES 8
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 */
2017-10-13 16:32:56 +03:00
# define ARCH_TIMER_EVT_STREAM_PERIOD_US 100
# define ARCH_TIMER_EVT_STREAM_FREQ \
( USEC_PER_SEC / ARCH_TIMER_EVT_STREAM_PERIOD_US )
2013-08-23 18:32:29 +04:00
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 ;
2018-07-06 11:11:50 +03:00
int physical_irq ;
2016-04-11 18:32:51 +03:00
} ;
2017-03-31 20:50:59 +03:00
struct arch_timer_mem_frame {
bool valid ;
phys_addr_t cntbase ;
size_t size ;
int phys_irq ;
int virt_irq ;
} ;
struct arch_timer_mem {
phys_addr_t cntctlbase ;
size_t size ;
struct arch_timer_mem_frame frame [ ARCH_TIMER_MEM_MAX_FRAMES ] ;
} ;
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 ) ;
2017-10-13 16:32:55 +03:00
extern bool arch_timer_evtstrm_available ( 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 ;
}
2017-10-13 16:32:55 +03:00
static inline bool arch_timer_evtstrm_available ( void )
{
return false ;
}
2012-11-12 18:33:44 +04:00
# endif
# endif