These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / hwtracing / coresight / coresight-etm4x.h
diff --git a/kernel/drivers/hwtracing/coresight/coresight-etm4x.h b/kernel/drivers/hwtracing/coresight/coresight-etm4x.h
new file mode 100644 (file)
index 0000000..c341002
--- /dev/null
@@ -0,0 +1,394 @@
+/* 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.
+ * @ctxid_pid: Value of the context ID comparator.
+ * @ctxid_vpid:        Virtual PID seen by users if PID namespace is enabled, otherwise
+ *             the same value of ctxid_pid.
+ * @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;
+       u64                             ctxid_pid[ETMv4_MAX_CTXID_CMP];
+       u64                             ctxid_vpid[ETMv4_MAX_CTXID_CMP];
+       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