blob: cfc690e8d3cf4eb6ed8c14bc1d86c169060f0710 [file] [log] [blame]
Pushkar Joshi85688c62012-12-06 10:52:02 -08001/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
Pratik Patelc35426a2012-03-17 12:02:53 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
Pratik Patel6fb38342012-06-03 14:51:38 -070013#ifndef _LINUX_CORESIGHT_H
14#define _LINUX_CORESIGHT_H
Pratik Patel43e47bd2012-05-19 18:10:55 -070015
Pratik Patelb84ef9d2012-05-24 14:01:43 -070016#include <linux/device.h>
17
Pratik Patel43e47bd2012-05-19 18:10:55 -070018/* Peripheral id registers (0xFD0-0xFEC) */
Pratik Patel6fb38342012-06-03 14:51:38 -070019#define CORESIGHT_PERIPHIDR4 (0xFD0)
20#define CORESIGHT_PERIPHIDR5 (0xFD4)
21#define CORESIGHT_PERIPHIDR6 (0xFD8)
22#define CORESIGHT_PERIPHIDR7 (0xFDC)
23#define CORESIGHT_PERIPHIDR0 (0xFE0)
24#define CORESIGHT_PERIPHIDR1 (0xFE4)
25#define CORESIGHT_PERIPHIDR2 (0xFE8)
26#define CORESIGHT_PERIPHIDR3 (0xFEC)
Pratik Patel43e47bd2012-05-19 18:10:55 -070027/* Component id registers (0xFF0-0xFFC) */
Pratik Patel6fb38342012-06-03 14:51:38 -070028#define CORESIGHT_COMPIDR0 (0xFF0)
29#define CORESIGHT_COMPIDR1 (0xFF4)
30#define CORESIGHT_COMPIDR2 (0xFF8)
31#define CORESIGHT_COMPIDR3 (0xFFC)
Pratik Patel43e47bd2012-05-19 18:10:55 -070032
Pushkar Joshi85688c62012-12-06 10:52:02 -080033#define ETM_ARCH_V1_0 (0x00)
34#define ETM_ARCH_V1_2 (0x02)
Pratik Patel43e47bd2012-05-19 18:10:55 -070035#define ETM_ARCH_V3_3 (0x23)
Pushkar Joshi85688c62012-12-06 10:52:02 -080036#define ETM_ARCH_V3_5 (0x25)
37#define PFT_ARCH_MAJOR (0x30)
Pratik Patel43e47bd2012-05-19 18:10:55 -070038#define PFT_ARCH_V1_1 (0x31)
Pratik Patelc35426a2012-03-17 12:02:53 -070039
Pratik Patel6fb38342012-06-03 14:51:38 -070040enum coresight_clk_rate {
41 CORESIGHT_CLK_RATE_OFF,
42 CORESIGHT_CLK_RATE_TRACE,
43 CORESIGHT_CLK_RATE_HSTRACE,
Pratik Patelf17b1472012-05-25 22:23:52 -070044};
45
Pratik Patel6fb38342012-06-03 14:51:38 -070046enum coresight_dev_type {
Pratik Patelb8bb4032012-07-22 23:09:11 -070047 CORESIGHT_DEV_TYPE_NONE,
Pratik Patel6fb38342012-06-03 14:51:38 -070048 CORESIGHT_DEV_TYPE_SINK,
49 CORESIGHT_DEV_TYPE_LINK,
Pratik Patel0a7edd32012-06-08 09:31:55 -070050 CORESIGHT_DEV_TYPE_LINKSINK,
Pratik Patel6fb38342012-06-03 14:51:38 -070051 CORESIGHT_DEV_TYPE_SOURCE,
Pratik Patel0a7edd32012-06-08 09:31:55 -070052};
53
54enum coresight_dev_subtype_sink {
55 CORESIGHT_DEV_SUBTYPE_SINK_NONE,
56 CORESIGHT_DEV_SUBTYPE_SINK_PORT,
57 CORESIGHT_DEV_SUBTYPE_SINK_BUFFER,
58};
59
60enum coresight_dev_subtype_link {
61 CORESIGHT_DEV_SUBTYPE_LINK_NONE,
62 CORESIGHT_DEV_SUBTYPE_LINK_MERG,
63 CORESIGHT_DEV_SUBTYPE_LINK_SPLIT,
64 CORESIGHT_DEV_SUBTYPE_LINK_FIFO,
65};
66
67enum coresight_dev_subtype_source {
68 CORESIGHT_DEV_SUBTYPE_SOURCE_NONE,
69 CORESIGHT_DEV_SUBTYPE_SOURCE_PROC,
70 CORESIGHT_DEV_SUBTYPE_SOURCE_BUS,
71 CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE,
72};
73
74struct coresight_dev_subtype {
75 enum coresight_dev_subtype_sink sink_subtype;
76 enum coresight_dev_subtype_link link_subtype;
77 enum coresight_dev_subtype_source source_subtype;
78};
79
80struct coresight_platform_data {
81 int id;
82 const char *name;
83 int nr_inports;
84 const int *outports;
85 const int *child_ids;
86 const int *child_ports;
87 int nr_outports;
88 bool default_sink;
89};
90
91struct coresight_desc {
92 enum coresight_dev_type type;
93 struct coresight_dev_subtype subtype;
94 const struct coresight_ops *ops;
95 struct coresight_platform_data *pdata;
96 struct device *dev;
97 const struct attribute_group **groups;
98 struct module *owner;
Pratik Patelb84ef9d2012-05-24 14:01:43 -070099};
100
Pratik Patel6fb38342012-06-03 14:51:38 -0700101struct coresight_connection {
Pratik Patel0a7edd32012-06-08 09:31:55 -0700102 int outport;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700103 int child_id;
104 int child_port;
Pratik Patel6fb38342012-06-03 14:51:38 -0700105 struct coresight_device *child_dev;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700106 struct list_head link;
107};
108
Pratik Patel0a7edd32012-06-08 09:31:55 -0700109struct coresight_refcnt {
110 int sink_refcnt;
111 int *link_refcnts;
112 int source_refcnt;
113};
114
Pratik Patel6fb38342012-06-03 14:51:38 -0700115struct coresight_device {
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700116 int id;
Pratik Patel6fb38342012-06-03 14:51:38 -0700117 struct coresight_connection *conns;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700118 int nr_conns;
Pratik Patel0a7edd32012-06-08 09:31:55 -0700119 enum coresight_dev_type type;
120 struct coresight_dev_subtype subtype;
Pratik Patel6fb38342012-06-03 14:51:38 -0700121 const struct coresight_ops *ops;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700122 struct device dev;
Pratik Patel0a7edd32012-06-08 09:31:55 -0700123 struct coresight_refcnt refcnt;
124 struct list_head dev_link;
125 struct list_head path_link;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700126 struct module *owner;
127 bool enable;
128};
129
Pratik Patel6fb38342012-06-03 14:51:38 -0700130#define to_coresight_device(d) container_of(d, struct coresight_device, dev)
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700131
Pratik Patel0a7edd32012-06-08 09:31:55 -0700132struct coresight_ops_sink {
133 int (*enable)(struct coresight_device *csdev);
134 void (*disable)(struct coresight_device *csdev);
Pratik Patelcf7d0452012-07-02 13:57:20 -0700135 void (*abort)(struct coresight_device *csdev);
Pratik Patel0a7edd32012-06-08 09:31:55 -0700136};
137
138struct coresight_ops_link {
139 int (*enable)(struct coresight_device *csdev, int iport, int oport);
140 void (*disable)(struct coresight_device *csdev, int iport, int oport);
141};
142
143struct coresight_ops_source {
144 int (*enable)(struct coresight_device *csdev);
145 void (*disable)(struct coresight_device *csdev);
146};
147
Pratik Patel6fb38342012-06-03 14:51:38 -0700148struct coresight_ops {
Pratik Patel0a7edd32012-06-08 09:31:55 -0700149 const struct coresight_ops_sink *sink_ops;
150 const struct coresight_ops_link *link_ops;
151 const struct coresight_ops_source *source_ops;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700152};
153
Pratik Patel61e91702013-01-27 20:30:42 -0800154#ifdef CONFIG_CORESIGHT
Pratik Patel0a7edd32012-06-08 09:31:55 -0700155extern struct coresight_device *
156coresight_register(struct coresight_desc *desc);
157extern void coresight_unregister(struct coresight_device *csdev);
158extern int coresight_enable(struct coresight_device *csdev);
159extern void coresight_disable(struct coresight_device *csdev);
Pratik Patelcf7d0452012-07-02 13:57:20 -0700160extern void coresight_abort(void);
Pratik Patelbf3e77442012-03-18 18:30:43 -0700161#else
Pratik Patel0a7edd32012-06-08 09:31:55 -0700162static inline struct coresight_device *
163coresight_register(struct coresight_desc *desc) { return NULL; }
164static inline void coresight_unregister(struct coresight_device *csdev) {}
165static inline int
166coresight_enable(struct coresight_device *csdev) { return -ENOSYS; }
167static inline void coresight_disable(struct coresight_device *csdev) {}
Pratik Patelcf7d0452012-07-02 13:57:20 -0700168static inline void coresight_abort(void) {}
Pratik Patelbf3e77442012-03-18 18:30:43 -0700169#endif
170
Pratik Patelc35426a2012-03-17 12:02:53 -0700171#endif