blob: 0bdacffa4259ad66d93c0058c9727f045b5fcb8e [file] [log] [blame]
Pratik Patelb8bb4032012-07-22 23:09:11 -07001/* Copyright (c) 2012, 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
Pratik Patel43e47bd2012-05-19 18:10:55 -070033#define ETM_ARCH_V3_3 (0x23)
34#define PFT_ARCH_V1_1 (0x31)
Pratik Patelc35426a2012-03-17 12:02:53 -070035
Pratik Patel6fb38342012-06-03 14:51:38 -070036enum coresight_clk_rate {
37 CORESIGHT_CLK_RATE_OFF,
38 CORESIGHT_CLK_RATE_TRACE,
39 CORESIGHT_CLK_RATE_HSTRACE,
Pratik Patelf17b1472012-05-25 22:23:52 -070040};
41
Pratik Patel6fb38342012-06-03 14:51:38 -070042enum coresight_dev_type {
Pratik Patelb8bb4032012-07-22 23:09:11 -070043 CORESIGHT_DEV_TYPE_NONE,
Pratik Patel6fb38342012-06-03 14:51:38 -070044 CORESIGHT_DEV_TYPE_SINK,
45 CORESIGHT_DEV_TYPE_LINK,
Pratik Patel0a7edd32012-06-08 09:31:55 -070046 CORESIGHT_DEV_TYPE_LINKSINK,
Pratik Patel6fb38342012-06-03 14:51:38 -070047 CORESIGHT_DEV_TYPE_SOURCE,
Pratik Patel0a7edd32012-06-08 09:31:55 -070048};
49
50enum coresight_dev_subtype_sink {
51 CORESIGHT_DEV_SUBTYPE_SINK_NONE,
52 CORESIGHT_DEV_SUBTYPE_SINK_PORT,
53 CORESIGHT_DEV_SUBTYPE_SINK_BUFFER,
54};
55
56enum coresight_dev_subtype_link {
57 CORESIGHT_DEV_SUBTYPE_LINK_NONE,
58 CORESIGHT_DEV_SUBTYPE_LINK_MERG,
59 CORESIGHT_DEV_SUBTYPE_LINK_SPLIT,
60 CORESIGHT_DEV_SUBTYPE_LINK_FIFO,
61};
62
63enum coresight_dev_subtype_source {
64 CORESIGHT_DEV_SUBTYPE_SOURCE_NONE,
65 CORESIGHT_DEV_SUBTYPE_SOURCE_PROC,
66 CORESIGHT_DEV_SUBTYPE_SOURCE_BUS,
67 CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE,
68};
69
70struct coresight_dev_subtype {
71 enum coresight_dev_subtype_sink sink_subtype;
72 enum coresight_dev_subtype_link link_subtype;
73 enum coresight_dev_subtype_source source_subtype;
74};
75
76struct coresight_platform_data {
77 int id;
78 const char *name;
79 int nr_inports;
80 const int *outports;
81 const int *child_ids;
82 const int *child_ports;
83 int nr_outports;
84 bool default_sink;
85};
86
87struct coresight_desc {
88 enum coresight_dev_type type;
89 struct coresight_dev_subtype subtype;
90 const struct coresight_ops *ops;
91 struct coresight_platform_data *pdata;
92 struct device *dev;
93 const struct attribute_group **groups;
94 struct module *owner;
Pratik Patelb84ef9d2012-05-24 14:01:43 -070095};
96
Pratik Patel6fb38342012-06-03 14:51:38 -070097struct coresight_connection {
Pratik Patel0a7edd32012-06-08 09:31:55 -070098 int outport;
Pratik Patelb84ef9d2012-05-24 14:01:43 -070099 int child_id;
100 int child_port;
Pratik Patel6fb38342012-06-03 14:51:38 -0700101 struct coresight_device *child_dev;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700102 struct list_head link;
103};
104
Pratik Patel0a7edd32012-06-08 09:31:55 -0700105struct coresight_refcnt {
106 int sink_refcnt;
107 int *link_refcnts;
108 int source_refcnt;
109};
110
Pratik Patel6fb38342012-06-03 14:51:38 -0700111struct coresight_device {
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700112 int id;
Pratik Patel6fb38342012-06-03 14:51:38 -0700113 struct coresight_connection *conns;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700114 int nr_conns;
Pratik Patel0a7edd32012-06-08 09:31:55 -0700115 enum coresight_dev_type type;
116 struct coresight_dev_subtype subtype;
Pratik Patel6fb38342012-06-03 14:51:38 -0700117 const struct coresight_ops *ops;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700118 struct device dev;
Pratik Patel0a7edd32012-06-08 09:31:55 -0700119 struct coresight_refcnt refcnt;
120 struct list_head dev_link;
121 struct list_head path_link;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700122 struct module *owner;
123 bool enable;
124};
125
Pratik Patel6fb38342012-06-03 14:51:38 -0700126#define to_coresight_device(d) container_of(d, struct coresight_device, dev)
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700127
Pratik Patel0a7edd32012-06-08 09:31:55 -0700128struct coresight_ops_sink {
129 int (*enable)(struct coresight_device *csdev);
130 void (*disable)(struct coresight_device *csdev);
Pratik Patelcf7d0452012-07-02 13:57:20 -0700131 void (*abort)(struct coresight_device *csdev);
Pratik Patel0a7edd32012-06-08 09:31:55 -0700132};
133
134struct coresight_ops_link {
135 int (*enable)(struct coresight_device *csdev, int iport, int oport);
136 void (*disable)(struct coresight_device *csdev, int iport, int oport);
137};
138
139struct coresight_ops_source {
140 int (*enable)(struct coresight_device *csdev);
141 void (*disable)(struct coresight_device *csdev);
142};
143
Pratik Patel6fb38342012-06-03 14:51:38 -0700144struct coresight_ops {
Pratik Patel0a7edd32012-06-08 09:31:55 -0700145 const struct coresight_ops_sink *sink_ops;
146 const struct coresight_ops_link *link_ops;
147 const struct coresight_ops_source *source_ops;
Pratik Patelb84ef9d2012-05-24 14:01:43 -0700148};
149
Pratik Patelbf3e77442012-03-18 18:30:43 -0700150#ifdef CONFIG_MSM_QDSS
Pratik Patel0a7edd32012-06-08 09:31:55 -0700151extern struct coresight_device *
152coresight_register(struct coresight_desc *desc);
153extern void coresight_unregister(struct coresight_device *csdev);
154extern int coresight_enable(struct coresight_device *csdev);
155extern void coresight_disable(struct coresight_device *csdev);
Pratik Patelcf7d0452012-07-02 13:57:20 -0700156extern void coresight_abort(void);
Pratik Patelbf3e77442012-03-18 18:30:43 -0700157#else
Pratik Patel0a7edd32012-06-08 09:31:55 -0700158static inline struct coresight_device *
159coresight_register(struct coresight_desc *desc) { return NULL; }
160static inline void coresight_unregister(struct coresight_device *csdev) {}
161static inline int
162coresight_enable(struct coresight_device *csdev) { return -ENOSYS; }
163static inline void coresight_disable(struct coresight_device *csdev) {}
Pratik Patelcf7d0452012-07-02 13:57:20 -0700164static inline void coresight_abort(void) {}
Pratik Patelbf3e77442012-03-18 18:30:43 -0700165#endif
166
Pratik Patelc35426a2012-03-17 12:02:53 -0700167#endif