blob: a829f069e7d147d477a2f66b0dc5c01849762efa [file] [log] [blame]
Pratik Patelc35426a2012-03-17 12:02:53 -07001/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
2 *
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 Patel3b0ca882012-06-01 16:54:14 -070018
Pratik Patel43e47bd2012-05-19 18:10:55 -070019/* Peripheral id registers (0xFD0-0xFEC) */
Pratik Patel6fb38342012-06-03 14:51:38 -070020#define CORESIGHT_PERIPHIDR4 (0xFD0)
21#define CORESIGHT_PERIPHIDR5 (0xFD4)
22#define CORESIGHT_PERIPHIDR6 (0xFD8)
23#define CORESIGHT_PERIPHIDR7 (0xFDC)
24#define CORESIGHT_PERIPHIDR0 (0xFE0)
25#define CORESIGHT_PERIPHIDR1 (0xFE4)
26#define CORESIGHT_PERIPHIDR2 (0xFE8)
27#define CORESIGHT_PERIPHIDR3 (0xFEC)
Pratik Patel43e47bd2012-05-19 18:10:55 -070028/* Component id registers (0xFF0-0xFFC) */
Pratik Patel6fb38342012-06-03 14:51:38 -070029#define CORESIGHT_COMPIDR0 (0xFF0)
30#define CORESIGHT_COMPIDR1 (0xFF4)
31#define CORESIGHT_COMPIDR2 (0xFF8)
32#define CORESIGHT_COMPIDR3 (0xFFC)
Pratik Patel43e47bd2012-05-19 18:10:55 -070033
Pratik Patel3b0ca882012-06-01 16:54:14 -070034
Pratik Patel43e47bd2012-05-19 18:10:55 -070035/* DBGv7 with baseline CP14 registers implemented */
36#define ARM_DEBUG_ARCH_V7B (0x3)
37/* DBGv7 with all CP14 registers implemented */
38#define ARM_DEBUG_ARCH_V7 (0x4)
39#define ARM_DEBUG_ARCH_V7_1 (0x5)
40#define ETM_ARCH_V3_3 (0x23)
41#define PFT_ARCH_V1_1 (0x31)
Pratik Patelc35426a2012-03-17 12:02:53 -070042
Pratik Patel6fb38342012-06-03 14:51:38 -070043enum coresight_clk_rate {
44 CORESIGHT_CLK_RATE_OFF,
45 CORESIGHT_CLK_RATE_TRACE,
46 CORESIGHT_CLK_RATE_HSTRACE,
Pratik Patelf17b1472012-05-25 22:23:52 -070047};
48
Pratik Patel6fb38342012-06-03 14:51:38 -070049enum coresight_dev_type {
50 CORESIGHT_DEV_TYPE_SINK,
51 CORESIGHT_DEV_TYPE_LINK,
Pratik Patel0a7edd32012-06-08 09:31:55 -070052 CORESIGHT_DEV_TYPE_LINKSINK,
Pratik Patel6fb38342012-06-03 14:51:38 -070053 CORESIGHT_DEV_TYPE_SOURCE,
Pratik Patel0a7edd32012-06-08 09:31:55 -070054};
55
56enum coresight_dev_subtype_sink {
57 CORESIGHT_DEV_SUBTYPE_SINK_NONE,
58 CORESIGHT_DEV_SUBTYPE_SINK_PORT,
59 CORESIGHT_DEV_SUBTYPE_SINK_BUFFER,
60};
61
62enum coresight_dev_subtype_link {
63 CORESIGHT_DEV_SUBTYPE_LINK_NONE,
64 CORESIGHT_DEV_SUBTYPE_LINK_MERG,
65 CORESIGHT_DEV_SUBTYPE_LINK_SPLIT,
66 CORESIGHT_DEV_SUBTYPE_LINK_FIFO,
67};
68
69enum coresight_dev_subtype_source {
70 CORESIGHT_DEV_SUBTYPE_SOURCE_NONE,
71 CORESIGHT_DEV_SUBTYPE_SOURCE_PROC,
72 CORESIGHT_DEV_SUBTYPE_SOURCE_BUS,
73 CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE,
74};
75
76struct coresight_dev_subtype {
77 enum coresight_dev_subtype_sink sink_subtype;
78 enum coresight_dev_subtype_link link_subtype;
79 enum coresight_dev_subtype_source source_subtype;
80};
81
82struct coresight_platform_data {
83 int id;
84 const char *name;
85 int nr_inports;
86 const int *outports;
87 const int *child_ids;
88 const int *child_ports;
89 int nr_outports;
90 bool default_sink;
91};
92
93struct coresight_desc {
94 enum coresight_dev_type type;
95 struct coresight_dev_subtype subtype;
96 const struct coresight_ops *ops;
97 struct coresight_platform_data *pdata;
98 struct device *dev;
99 const struct attribute_group **groups;
100 struct module *owner;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700101};
102
Pratik Patel6fb38342012-06-03 14:51:38 -0700103struct coresight_connection {
Pratik Patel0a7edd32012-06-08 09:31:55 -0700104 int outport;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700105 int child_id;
106 int child_port;
Pratik Patel6fb38342012-06-03 14:51:38 -0700107 struct coresight_device *child_dev;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700108 struct list_head link;
109};
110
Pratik Patel0a7edd32012-06-08 09:31:55 -0700111struct coresight_refcnt {
112 int sink_refcnt;
113 int *link_refcnts;
114 int source_refcnt;
115};
116
Pratik Patel6fb38342012-06-03 14:51:38 -0700117struct coresight_device {
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700118 int id;
Pratik Patel6fb38342012-06-03 14:51:38 -0700119 struct coresight_connection *conns;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700120 int nr_conns;
Pratik Patel0a7edd32012-06-08 09:31:55 -0700121 enum coresight_dev_type type;
122 struct coresight_dev_subtype subtype;
Pratik Patel6fb38342012-06-03 14:51:38 -0700123 const struct coresight_ops *ops;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700124 struct device dev;
Pratik Patel0a7edd32012-06-08 09:31:55 -0700125 struct coresight_refcnt refcnt;
126 struct list_head dev_link;
127 struct list_head path_link;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700128 struct module *owner;
129 bool enable;
130};
131
Pratik Patel6fb38342012-06-03 14:51:38 -0700132#define to_coresight_device(d) container_of(d, struct coresight_device, dev)
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700133
Pratik Patel0a7edd32012-06-08 09:31:55 -0700134struct coresight_ops_sink {
135 int (*enable)(struct coresight_device *csdev);
136 void (*disable)(struct coresight_device *csdev);
Pratik Patelcf7d0452012-07-02 13:57:20 -0700137 void (*abort)(struct coresight_device *csdev);
Pratik Patel0a7edd32012-06-08 09:31:55 -0700138};
139
140struct coresight_ops_link {
141 int (*enable)(struct coresight_device *csdev, int iport, int oport);
142 void (*disable)(struct coresight_device *csdev, int iport, int oport);
143};
144
145struct coresight_ops_source {
146 int (*enable)(struct coresight_device *csdev);
147 void (*disable)(struct coresight_device *csdev);
148};
149
Pratik Patel6fb38342012-06-03 14:51:38 -0700150struct coresight_ops {
Pratik Patel0a7edd32012-06-08 09:31:55 -0700151 const struct coresight_ops_sink *sink_ops;
152 const struct coresight_ops_link *link_ops;
153 const struct coresight_ops_source *source_ops;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700154};
155
Pratik Patelbf3e77442012-03-18 18:30:43 -0700156#ifdef CONFIG_MSM_QDSS
Pratik Patel0a7edd32012-06-08 09:31:55 -0700157extern struct coresight_device *
158coresight_register(struct coresight_desc *desc);
159extern void coresight_unregister(struct coresight_device *csdev);
160extern int coresight_enable(struct coresight_device *csdev);
161extern void coresight_disable(struct coresight_device *csdev);
Pratik Patelcf7d0452012-07-02 13:57:20 -0700162extern void coresight_abort(void);
Pratik Patelbf3e77442012-03-18 18:30:43 -0700163#else
Pratik Patel0a7edd32012-06-08 09:31:55 -0700164static inline struct coresight_device *
165coresight_register(struct coresight_desc *desc) { return NULL; }
166static inline void coresight_unregister(struct coresight_device *csdev) {}
167static inline int
168coresight_enable(struct coresight_device *csdev) { return -ENOSYS; }
169static inline void coresight_disable(struct coresight_device *csdev) {}
Pratik Patelcf7d0452012-07-02 13:57:20 -0700170static inline void coresight_abort(void) {}
Pratik Patelbf3e77442012-03-18 18:30:43 -0700171#endif
172
Pratik Patelc35426a2012-03-17 12:02:53 -0700173#endif