2015-05-13 19:34:09 +03:00
/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 and
* only 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 .
*/
# ifndef _CORESIGHT_CORESIGHT_ETM_H
# define _CORESIGHT_CORESIGHT_ETM_H
# include <linux/spinlock.h>
# include "coresight-priv.h"
/*
* Device registers :
* 0x000 - 0x2FC : Trace registers
* 0x300 - 0x314 : Management registers
* 0x318 - 0xEFC : Trace registers
* 0xF00 : Management registers
* 0xFA0 - 0xFA4 : Trace registers
* 0xFA8 - 0xFFC : Management registers
*/
/* Trace registers (0x000-0x2FC) */
/* Main control and configuration registers */
# define TRCPRGCTLR 0x004
# define TRCPROCSELR 0x008
# define TRCSTATR 0x00C
# define TRCCONFIGR 0x010
# define TRCAUXCTLR 0x018
# define TRCEVENTCTL0R 0x020
# define TRCEVENTCTL1R 0x024
# define TRCSTALLCTLR 0x02C
# define TRCTSCTLR 0x030
# define TRCSYNCPR 0x034
# define TRCCCCTLR 0x038
# define TRCBBCTLR 0x03C
# define TRCTRACEIDR 0x040
# define TRCQCTLR 0x044
/* Filtering control registers */
# define TRCVICTLR 0x080
# define TRCVIIECTLR 0x084
# define TRCVISSCTLR 0x088
# define TRCVIPCSSCTLR 0x08C
# define TRCVDCTLR 0x0A0
# define TRCVDSACCTLR 0x0A4
# define TRCVDARCCTLR 0x0A8
/* Derived resources registers */
# define TRCSEQEVRn(n) (0x100 + (n * 4))
# define TRCSEQRSTEVR 0x118
# define TRCSEQSTR 0x11C
# define TRCEXTINSELR 0x120
# define TRCCNTRLDVRn(n) (0x140 + (n * 4))
# define TRCCNTCTLRn(n) (0x150 + (n * 4))
# define TRCCNTVRn(n) (0x160 + (n * 4))
/* ID registers */
# define TRCIDR8 0x180
# define TRCIDR9 0x184
# define TRCIDR10 0x188
# define TRCIDR11 0x18C
# define TRCIDR12 0x190
# define TRCIDR13 0x194
# define TRCIMSPEC0 0x1C0
# define TRCIMSPECn(n) (0x1C0 + (n * 4))
# define TRCIDR0 0x1E0
# define TRCIDR1 0x1E4
# define TRCIDR2 0x1E8
# define TRCIDR3 0x1EC
# define TRCIDR4 0x1F0
# define TRCIDR5 0x1F4
# define TRCIDR6 0x1F8
# define TRCIDR7 0x1FC
/* Resource selection registers */
# define TRCRSCTLRn(n) (0x200 + (n * 4))
/* Single-shot comparator registers */
# define TRCSSCCRn(n) (0x280 + (n * 4))
# define TRCSSCSRn(n) (0x2A0 + (n * 4))
# define TRCSSPCICRn(n) (0x2C0 + (n * 4))
/* Management registers (0x300-0x314) */
# define TRCOSLAR 0x300
# define TRCOSLSR 0x304
# define TRCPDCR 0x310
# define TRCPDSR 0x314
/* Trace registers (0x318-0xEFC) */
/* Comparator registers */
# define TRCACVRn(n) (0x400 + (n * 8))
# define TRCACATRn(n) (0x480 + (n * 8))
# define TRCDVCVRn(n) (0x500 + (n * 16))
# define TRCDVCMRn(n) (0x580 + (n * 16))
# define TRCCIDCVRn(n) (0x600 + (n * 8))
# define TRCVMIDCVRn(n) (0x640 + (n * 8))
# define TRCCIDCCTLR0 0x680
# define TRCCIDCCTLR1 0x684
# define TRCVMIDCCTLR0 0x688
# define TRCVMIDCCTLR1 0x68C
/* Management register (0xF00) */
/* Integration control registers */
# define TRCITCTRL 0xF00
/* Trace registers (0xFA0-0xFA4) */
/* Claim tag registers */
# define TRCCLAIMSET 0xFA0
# define TRCCLAIMCLR 0xFA4
/* Management registers (0xFA8-0xFFC) */
# define TRCDEVAFF0 0xFA8
# define TRCDEVAFF1 0xFAC
# define TRCLAR 0xFB0
# define TRCLSR 0xFB4
# define TRCAUTHSTATUS 0xFB8
# define TRCDEVARCH 0xFBC
# define TRCDEVID 0xFC8
# define TRCDEVTYPE 0xFCC
# define TRCPIDR4 0xFD0
# define TRCPIDR5 0xFD4
# define TRCPIDR6 0xFD8
# define TRCPIDR7 0xFDC
# define TRCPIDR0 0xFE0
# define TRCPIDR1 0xFE4
# define TRCPIDR2 0xFE8
# define TRCPIDR3 0xFEC
# define TRCCIDR0 0xFF0
# define TRCCIDR1 0xFF4
# define TRCCIDR2 0xFF8
# define TRCCIDR3 0xFFC
/* ETMv4 resources */
# define ETM_MAX_NR_PE 8
# define ETMv4_MAX_CNTR 4
# define ETM_MAX_SEQ_STATES 4
# define ETM_MAX_EXT_INP_SEL 4
# define ETM_MAX_EXT_INP 256
# define ETM_MAX_EXT_OUT 4
# define ETM_MAX_SINGLE_ADDR_CMP 16
# define ETM_MAX_ADDR_RANGE_CMP (ETM_MAX_SINGLE_ADDR_CMP / 2)
# define ETM_MAX_DATA_VAL_CMP 8
# define ETMv4_MAX_CTXID_CMP 8
# define ETM_MAX_VMID_CMP 8
# define ETM_MAX_PE_CMP 8
# define ETM_MAX_RES_SEL 16
# define ETM_MAX_SS_CMP 8
# define ETM_ARCH_V4 0x40
# define ETMv4_SYNC_MASK 0x1F
# define ETM_CYC_THRESHOLD_MASK 0xFFF
# define ETMv4_EVENT_MASK 0xFF
# define ETM_CNTR_MAX_VAL 0xFFFF
# define ETM_TRACEID_MASK 0x3f
/* ETMv4 programming modes */
# define ETM_MODE_EXCLUDE BIT(0)
# define ETM_MODE_LOAD BIT(1)
# define ETM_MODE_STORE BIT(2)
# define ETM_MODE_LOAD_STORE BIT(3)
# define ETM_MODE_BB BIT(4)
# define ETMv4_MODE_CYCACC BIT(5)
# define ETMv4_MODE_CTXID BIT(6)
# define ETM_MODE_VMID BIT(7)
# define ETM_MODE_COND(val) BMVAL(val, 8, 10)
# define ETMv4_MODE_TIMESTAMP BIT(11)
# define ETM_MODE_RETURNSTACK BIT(12)
# define ETM_MODE_QELEM(val) BMVAL(val, 13, 14)
# define ETM_MODE_DATA_TRACE_ADDR BIT(15)
# define ETM_MODE_DATA_TRACE_VAL BIT(16)
# define ETM_MODE_ISTALL BIT(17)
# define ETM_MODE_DSTALL BIT(18)
# define ETM_MODE_ATB_TRIGGER BIT(19)
# define ETM_MODE_LPOVERRIDE BIT(20)
# define ETM_MODE_ISTALL_EN BIT(21)
# define ETM_MODE_DSTALL_EN BIT(22)
# define ETM_MODE_INSTPRIO BIT(23)
# define ETM_MODE_NOOVERFLOW BIT(24)
# define ETM_MODE_TRACE_RESET BIT(25)
# define ETM_MODE_TRACE_ERR BIT(26)
# define ETM_MODE_VIEWINST_STARTSTOP BIT(27)
# define ETMv4_MODE_ALL 0xFFFFFFF
# define TRCSTATR_IDLE_BIT 0
/**
* struct etm4_drvdata - specifics associated to an ETM component
* @ base : Memory mapped base address for this component .
* @ dev : The device entity associated to this component .
* @ csdev : Component vitals needed by the framework .
* @ spinlock : Only one at a time pls .
* @ cpu : The cpu this component is affined to .
* @ arch : ETM version number .
* @ enable : Is this ETM currently tracing .
* @ sticky_enable : true if ETM base configuration has been done .
* @ boot_enable : True if we should start tracing at boot time .
* @ os_unlock : True if access to management registers is allowed .
* @ nr_pe : The number of processing entity available for tracing .
* @ nr_pe_cmp : The number of processing entity comparator inputs that are
* available for tracing .
* @ nr_addr_cmp : Number of pairs of address comparators available
* as found in ETMIDR4 0 - 3.
* @ nr_cntr : Number of counters as found in ETMIDR5 bit 28 - 30.
* @ nr_ext_inp : Number of external input .
* @ numcidc : Number of contextID comparators .
* @ numvmidc : Number of VMID comparators .
* @ nrseqstate : The number of sequencer states that are implemented .
* @ nr_event : Indicates how many events the trace unit support .
* @ nr_resource : The number of resource selection pairs available for tracing .
* @ nr_ss_cmp : Number of single - shot comparator controls that are available .
* @ mode : Controls various modes supported by this ETM .
* @ trcid : value of the current ID for this component .
* @ trcid_size : Indicates the trace ID width .
* @ instrp0 : Tracing of load and store instructions
* as P0 elements is supported .
* @ trccond : If the trace unit supports conditional
* instruction tracing .
* @ retstack : Indicates if the implementation supports a return stack .
* @ trc_error : Whether a trace unit can trace a system
* error exception .
* @ atbtrig : If the implementation can support ATB triggers
* @ lpoverride : If the implementation can support low - power state over .
* @ pe_sel : Controls which PE to trace .
* @ cfg : Controls the tracing options .
* @ eventctrl0 : Controls the tracing of arbitrary events .
* @ eventctrl1 : Controls the behavior of the events that @ event_ctrl0 selects .
* @ stallctl : If functionality that prevents trace unit buffer overflows
* is available .
* @ sysstall : Does the system support stall control of the PE ?
* @ nooverflow : Indicate if overflow prevention is supported .
* @ stall_ctrl : Enables trace unit functionality that prevents trace
* unit buffer overflows .
* @ ts_size : Global timestamp size field .
* @ ts_ctrl : Controls the insertion of global timestamps in the
* trace streams .
* @ syncpr : Indicates if an implementation has a fixed
* synchronization period .
* @ syncfreq : Controls how often trace synchronization requests occur .
* @ trccci : Indicates if the trace unit supports cycle counting
* for instruction .
* @ ccsize : Indicates the size of the cycle counter in bits .
* @ ccitmin : minimum value that can be programmed in
* the TRCCCCTLR register .
* @ ccctlr : Sets the threshold value for cycle counting .
* @ trcbb : Indicates if the trace unit supports branch broadcast tracing .
* @ q_support : Q element support characteristics .
* @ vinst_ctrl : Controls instruction trace filtering .
* @ viiectlr : Set or read , the address range comparators .
* @ vissctlr : Set , or read , the single address comparators that control the
* ViewInst start - stop logic .
* @ vipcssctlr : Set , or read , which PE comparator inputs can control the
* ViewInst start - stop logic .
* @ seq_idx : Sequencor index selector .
* @ seq_ctrl : Control for the sequencer state transition control register .
* @ seq_rst : Moves the sequencer to state 0 when a programmed event occurs .
* @ seq_state : Set , or read the sequencer state .
* @ cntr_idx : Counter index seletor .
* @ cntrldvr : Sets or returns the reload count value for a counter .
* @ cntr_ctrl : Controls the operation of a counter .
* @ cntr_val : Sets or returns the value for a counter .
* @ res_idx : Resource index selector .
* @ res_ctrl : Controls the selection of the resources in the trace unit .
* @ ss_ctrl : Controls the corresponding single - shot comparator resource .
* @ ss_status : The status of the corresponding single - shot comparator .
* @ ss_pe_cmp : Selects the PE comparator inputs for Single - shot control .
* @ addr_idx : Address comparator index selector .
* @ addr_val : Value for address comparator .
* @ addr_acc : Address comparator access type .
* @ addr_type : Current status of the comparator register .
* @ ctxid_idx : Context ID index selector .
* @ ctxid_size : Size of the context ID field to consider .
2015-07-31 18:37:25 +03:00
* @ ctxid_pid : Value of the context ID comparator .
2015-07-31 18:37:28 +03:00
* @ ctxid_vpid : Virtual PID seen by users if PID namespace is enabled , otherwise
* the same value of ctxid_pid .
2015-05-13 19:34:09 +03:00
* @ ctxid_mask0 : Context ID comparator mask for comparator 0 - 3.
* @ ctxid_mask1 : Context ID comparator mask for comparator 4 - 7.
* @ vmid_idx : VM ID index selector .
* @ vmid_size : Size of the VM ID comparator to consider .
* @ vmid_val : Value of the VM ID comparator .
* @ vmid_mask0 : VM ID comparator mask for comparator 0 - 3.
* @ vmid_mask1 : VM ID comparator mask for comparator 4 - 7.
* @ s_ex_level : In secure state , indicates whether instruction tracing is
* supported for the corresponding Exception level .
* @ ns_ex_level : In non - secure state , indicates whether instruction tracing is
* supported for the corresponding Exception level .
* @ ext_inp : External input selection .
*/
struct etmv4_drvdata {
void __iomem * base ;
struct device * dev ;
struct coresight_device * csdev ;
spinlock_t spinlock ;
int cpu ;
u8 arch ;
bool enable ;
bool sticky_enable ;
bool boot_enable ;
bool os_unlock ;
u8 nr_pe ;
u8 nr_pe_cmp ;
u8 nr_addr_cmp ;
u8 nr_cntr ;
u8 nr_ext_inp ;
u8 numcidc ;
u8 numvmidc ;
u8 nrseqstate ;
u8 nr_event ;
u8 nr_resource ;
u8 nr_ss_cmp ;
u32 mode ;
u8 trcid ;
u8 trcid_size ;
bool instrp0 ;
bool trccond ;
bool retstack ;
bool trc_error ;
bool atbtrig ;
bool lpoverride ;
u32 pe_sel ;
u32 cfg ;
u32 eventctrl0 ;
u32 eventctrl1 ;
bool stallctl ;
bool sysstall ;
bool nooverflow ;
u32 stall_ctrl ;
u8 ts_size ;
u32 ts_ctrl ;
bool syncpr ;
u32 syncfreq ;
bool trccci ;
u8 ccsize ;
u8 ccitmin ;
u32 ccctlr ;
bool trcbb ;
u32 bb_ctrl ;
bool q_support ;
u32 vinst_ctrl ;
u32 viiectlr ;
u32 vissctlr ;
u32 vipcssctlr ;
u8 seq_idx ;
u32 seq_ctrl [ ETM_MAX_SEQ_STATES ] ;
u32 seq_rst ;
u32 seq_state ;
u8 cntr_idx ;
u32 cntrldvr [ ETMv4_MAX_CNTR ] ;
u32 cntr_ctrl [ ETMv4_MAX_CNTR ] ;
u32 cntr_val [ ETMv4_MAX_CNTR ] ;
u8 res_idx ;
u32 res_ctrl [ ETM_MAX_RES_SEL ] ;
u32 ss_ctrl [ ETM_MAX_SS_CMP ] ;
u32 ss_status [ ETM_MAX_SS_CMP ] ;
u32 ss_pe_cmp [ ETM_MAX_SS_CMP ] ;
u8 addr_idx ;
u64 addr_val [ ETM_MAX_SINGLE_ADDR_CMP ] ;
u64 addr_acc [ ETM_MAX_SINGLE_ADDR_CMP ] ;
u8 addr_type [ ETM_MAX_SINGLE_ADDR_CMP ] ;
u8 ctxid_idx ;
u8 ctxid_size ;
2015-07-31 18:37:25 +03:00
u64 ctxid_pid [ ETMv4_MAX_CTXID_CMP ] ;
2015-07-31 18:37:28 +03:00
u64 ctxid_vpid [ ETMv4_MAX_CTXID_CMP ] ;
2015-05-13 19:34:09 +03:00
u32 ctxid_mask0 ;
u32 ctxid_mask1 ;
u8 vmid_idx ;
u8 vmid_size ;
u64 vmid_val [ ETM_MAX_VMID_CMP ] ;
u32 vmid_mask0 ;
u32 vmid_mask1 ;
u8 s_ex_level ;
u8 ns_ex_level ;
u32 ext_inp ;
} ;
/* Address comparator access types */
enum etm_addr_acctype {
ETM_INSTR_ADDR ,
ETM_DATA_LOAD_ADDR ,
ETM_DATA_STORE_ADDR ,
ETM_DATA_LOAD_STORE_ADDR ,
} ;
/* Address comparator context types */
enum etm_addr_ctxtype {
ETM_CTX_NONE ,
ETM_CTX_CTXID ,
ETM_CTX_VMID ,
ETM_CTX_CTXID_VMID ,
} ;
enum etm_addr_type {
ETM_ADDR_TYPE_NONE ,
ETM_ADDR_TYPE_SINGLE ,
ETM_ADDR_TYPE_RANGE ,
ETM_ADDR_TYPE_START ,
ETM_ADDR_TYPE_STOP ,
} ;
# endif