coresight-cti.h (7584B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * Copyright (c) 2018 Linaro Limited, All rights reserved. 4 * Author: Mike Leach <mike.leach@linaro.org> 5 */ 6 7#ifndef _CORESIGHT_CORESIGHT_CTI_H 8#define _CORESIGHT_CORESIGHT_CTI_H 9 10#include <linux/coresight.h> 11#include <linux/device.h> 12#include <linux/fwnode.h> 13#include <linux/list.h> 14#include <linux/spinlock.h> 15#include <linux/sysfs.h> 16#include <linux/types.h> 17 18#include "coresight-priv.h" 19 20/* 21 * Device registers 22 * 0x000 - 0x144: CTI programming and status 23 * 0xEDC - 0xEF8: CTI integration test. 24 * 0xF00 - 0xFFC: Coresight management registers. 25 */ 26/* CTI programming registers */ 27#define CTICONTROL 0x000 28#define CTIINTACK 0x010 29#define CTIAPPSET 0x014 30#define CTIAPPCLEAR 0x018 31#define CTIAPPPULSE 0x01C 32#define CTIINEN(n) (0x020 + (4 * n)) 33#define CTIOUTEN(n) (0x0A0 + (4 * n)) 34#define CTITRIGINSTATUS 0x130 35#define CTITRIGOUTSTATUS 0x134 36#define CTICHINSTATUS 0x138 37#define CTICHOUTSTATUS 0x13C 38#define CTIGATE 0x140 39#define ASICCTL 0x144 40/* Integration test registers */ 41#define ITCHINACK 0xEDC /* WO CTI CSSoc 400 only*/ 42#define ITTRIGINACK 0xEE0 /* WO CTI CSSoc 400 only*/ 43#define ITCHOUT 0xEE4 /* WO RW-600 */ 44#define ITTRIGOUT 0xEE8 /* WO RW-600 */ 45#define ITCHOUTACK 0xEEC /* RO CTI CSSoc 400 only*/ 46#define ITTRIGOUTACK 0xEF0 /* RO CTI CSSoc 400 only*/ 47#define ITCHIN 0xEF4 /* RO */ 48#define ITTRIGIN 0xEF8 /* RO */ 49/* management registers */ 50#define CTIDEVAFF0 0xFA8 51#define CTIDEVAFF1 0xFAC 52 53/* 54 * CTI CSSoc 600 has a max of 32 trigger signals per direction. 55 * CTI CSSoc 400 has 8 IO triggers - other CTIs can be impl def. 56 * Max of in and out defined in the DEVID register. 57 * - pick up actual number used from .dts parameters if present. 58 */ 59#define CTIINOUTEN_MAX 32 60 61/** 62 * Group of related trigger signals 63 * 64 * @nr_sigs: number of signals in the group. 65 * @used_mask: bitmask representing the signal indexes in the group. 66 * @sig_types: array of types for the signals, length nr_sigs. 67 */ 68struct cti_trig_grp { 69 int nr_sigs; 70 u32 used_mask; 71 int sig_types[]; 72}; 73 74/** 75 * Trigger connection - connection between a CTI and other (coresight) device 76 * lists input and output trigger signals for the device 77 * 78 * @con_in: connected CTIIN signals for the device. 79 * @con_out: connected CTIOUT signals for the device. 80 * @con_dev: coresight device connected to the CTI, NULL if not CS device 81 * @con_dev_name: name of connected device (CS or CPU) 82 * @node: entry node in list of connections. 83 * @con_attrs: Dynamic sysfs attributes specific to this connection. 84 * @attr_group: Dynamic attribute group created for this connection. 85 */ 86struct cti_trig_con { 87 struct cti_trig_grp *con_in; 88 struct cti_trig_grp *con_out; 89 struct coresight_device *con_dev; 90 const char *con_dev_name; 91 struct list_head node; 92 struct attribute **con_attrs; 93 struct attribute_group *attr_group; 94}; 95 96/** 97 * struct cti_device - description of CTI device properties. 98 * 99 * @nt_trig_con: Number of external devices connected to this device. 100 * @ctm_id: which CTM this device is connected to (by default it is 101 * assumed there is a single CTM per SoC, ID 0). 102 * @trig_cons: list of connections to this device. 103 * @cpu: CPU ID if associated with CPU, -1 otherwise. 104 * @con_groups: combined static and dynamic sysfs groups for trigger 105 * connections. 106 */ 107struct cti_device { 108 int nr_trig_con; 109 u32 ctm_id; 110 struct list_head trig_cons; 111 int cpu; 112 const struct attribute_group **con_groups; 113}; 114 115/** 116 * struct cti_config - configuration of the CTI device hardware 117 * 118 * @nr_trig_max: Max number of trigger signals implemented on device. 119 * (max of trig_in or trig_out) - from ID register. 120 * @nr_ctm_channels: number of available CTM channels - from ID register. 121 * @enable_req_count: CTI is enabled alongside >=1 associated devices. 122 * @hw_enabled: true if hw is currently enabled. 123 * @hw_powered: true if associated cpu powered on, or no cpu. 124 * @trig_in_use: bitfield of in triggers registered as in use. 125 * @trig_out_use: bitfield of out triggers registered as in use. 126 * @trig_out_filter: bitfield of out triggers that are blocked if filter 127 * enabled. Typically this would be dbgreq / restart on 128 * a core CTI. 129 * @trig_filter_enable: 1 if filtering enabled. 130 * @xtrig_rchan_sel: channel selection for xtrigger connection show. 131 * @ctiappset: CTI Software application channel set. 132 * @ctiinout_sel: register selector for INEN and OUTEN regs. 133 * @ctiinen: enable input trigger to a channel. 134 * @ctiouten: enable output trigger from a channel. 135 * @ctigate: gate channel output from CTI to CTM. 136 * @asicctl: asic control register. 137 */ 138struct cti_config { 139 /* hardware description */ 140 int nr_ctm_channels; 141 int nr_trig_max; 142 143 /* cti enable control */ 144 atomic_t enable_req_count; 145 bool hw_enabled; 146 bool hw_powered; 147 148 /* registered triggers and filtering */ 149 u32 trig_in_use; 150 u32 trig_out_use; 151 u32 trig_out_filter; 152 bool trig_filter_enable; 153 u8 xtrig_rchan_sel; 154 155 /* cti cross trig programmable regs */ 156 u32 ctiappset; 157 u8 ctiinout_sel; 158 u32 ctiinen[CTIINOUTEN_MAX]; 159 u32 ctiouten[CTIINOUTEN_MAX]; 160 u32 ctigate; 161 u32 asicctl; 162}; 163 164/** 165 * struct cti_drvdata - specifics for the CTI device 166 * @base: Memory mapped base address for this component.. 167 * @csdev: Standard CoreSight device information. 168 * @ctidev: Extra information needed by the CTI/CTM framework. 169 * @spinlock: Control data access to one at a time. 170 * @config: Configuration data for this CTI device. 171 * @node: List entry of this device in the list of CTI devices. 172 * @csdev_release: release function for underlying coresight_device. 173 */ 174struct cti_drvdata { 175 void __iomem *base; 176 struct coresight_device *csdev; 177 struct cti_device ctidev; 178 spinlock_t spinlock; 179 struct cti_config config; 180 struct list_head node; 181 void (*csdev_release)(struct device *dev); 182}; 183 184/* 185 * Channel operation types. 186 */ 187enum cti_chan_op { 188 CTI_CHAN_ATTACH, 189 CTI_CHAN_DETACH, 190}; 191 192enum cti_trig_dir { 193 CTI_TRIG_IN, 194 CTI_TRIG_OUT, 195}; 196 197enum cti_chan_gate_op { 198 CTI_GATE_CHAN_ENABLE, 199 CTI_GATE_CHAN_DISABLE, 200}; 201 202enum cti_chan_set_op { 203 CTI_CHAN_SET, 204 CTI_CHAN_CLR, 205 CTI_CHAN_PULSE, 206}; 207 208/* private cti driver fns & vars */ 209extern const struct attribute_group *coresight_cti_groups[]; 210int cti_add_default_connection(struct device *dev, 211 struct cti_drvdata *drvdata); 212int cti_add_connection_entry(struct device *dev, struct cti_drvdata *drvdata, 213 struct cti_trig_con *tc, 214 struct coresight_device *csdev, 215 const char *assoc_dev_name); 216struct cti_trig_con *cti_allocate_trig_con(struct device *dev, int in_sigs, 217 int out_sigs); 218int cti_enable(struct coresight_device *csdev); 219int cti_disable(struct coresight_device *csdev); 220void cti_write_all_hw_regs(struct cti_drvdata *drvdata); 221void cti_write_intack(struct device *dev, u32 ackval); 222void cti_write_single_reg(struct cti_drvdata *drvdata, int offset, u32 value); 223int cti_channel_trig_op(struct device *dev, enum cti_chan_op op, 224 enum cti_trig_dir direction, u32 channel_idx, 225 u32 trigger_idx); 226int cti_channel_gate_op(struct device *dev, enum cti_chan_gate_op op, 227 u32 channel_idx); 228int cti_channel_setop(struct device *dev, enum cti_chan_set_op op, 229 u32 channel_idx); 230int cti_create_cons_sysfs(struct device *dev, struct cti_drvdata *drvdata); 231struct coresight_platform_data * 232coresight_cti_get_platform_data(struct device *dev); 233const char *cti_plat_get_node_name(struct fwnode_handle *fwnode); 234 235/* cti powered and enabled */ 236static inline bool cti_active(struct cti_config *cfg) 237{ 238 return cfg->hw_powered && cfg->hw_enabled; 239} 240 241#endif /* _CORESIGHT_CORESIGHT_CTI_H */