aboutsummaryrefslogtreecommitdiff
path: root/drivers/misc/stm.h
blob: 1fb2d2e544fe018a39c097be519b5294b188b4ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
 * stm.h
 *
 *  Copyright (C) Intel 2011
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License 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.
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 * The STM (Sytem Trace Macro) Unit driver configure trace output
 * to the Intel Tangier PTI port and DWC3 USB xHCI controller
 * out of the mobile device for analysis with a debugging tool
 * (Lauterbach, Fido). This is part of a solution for the MIPI P1149.7,
 * compact JTAG, standard and USB Debug-Class
 *
 * This header file will allow other parts of the OS to use the
 * interface to write out it's contents for debugging a mobile system.
 */

#ifndef _STM_H
#define _STM_H

#include <linux/pci.h>

/* STM_CTRL register bitmap */
/**
 * struct stm_ctrl - STM control block
 * @usb_debug_en : STM needs to redirece the trace packet to the USB3
 * @pti_io_idle_threshold : threshold for disabling the IO clock.
 * @pkt_transfer_size : asserts the *buff_avail signal after it has
 * 1 or 2 KB of data in buffer
 * @dis_dcu7_use : disables the useage of DCU7 instead of PTI_Disable
 * @en_sw_ms : enables software master usage
 * @mst_id_en : enables the PTI unit to suppress sending the Master Command
 * @d64_cmd_en : PTI unit to use the D64 commands
 * @pti_out_mode_sel
 *	0 = PTI 4-bits legacy end user
 *	1 = PTI 4-bits NiDnT
 *	2 = PTI 16-bits
 *	3 = PTI 12-bits
 *	4 = PTI 8-bits
 * @pti_out_en : PTI output enable muxselects that propagate
 * to the FLIS to be enabled
 * @lossy_mode_enable : Output Agent will continue to accept writes,
 * even if the queuese are full. The data will be dropped and the
 * dropped packet indicator will be incremented
 * @time_stamp_enable : Enable time stamping the final packet in trace record.
 */
struct stm_ctrl {
	union {
		struct {
			u32             time_stamp_enable:1;
			u32             lossy_mode_enable:1;
			u32             pti_out_en:1;
			u32             reserved:1;
			u32             pti_out_mode_sel:4;
			u32             d64_cmd_en:1;
			u32             mst_id_en:1;
			u32             en_sw_ms:1;
			u32             dis_dcu7_use:1;
			u32             pkt_transfer_size:1;
			u32             pti_io_idle_threshold:5;
			u32             usb_debug_en:1;
			u32             reserved31_19:13;
		};
		u32 reg_word;
	};
} __packed;

/**
 * struct stm_usb3_ctrl - STM buffer USB3 hardware EBC
 * @region_closure_threshold : This is the threshold for closing
 * the 1KB region in the debug trace buffer. STM will wait for the
 * configured time as specified in this field and then closes the region.
 * The unit of this field is in 64 us. Eg when this field value is set
 * to 0xffff, then it indicates 2 ms
 * @empty_packets_threshold : When STM does not have data to send,
 * it can send empty packets to keep the USB3 alive. This is useful
 * in case of ISOC traffic, because in this mode the wake up latency
 * is high. STM will send the configured number of empty packets as
 * specified in this field.
 */
struct stm_usb3_ctrl {
	union {
		struct {
			u32             region_closure_threshold:15;
			u32             empty_packets_threshold:6;
			u32             reserved31_21:11;
		};
		u32 reg_word;
	};
} __packed;

struct stm_dev {
	unsigned long stm_addr;
	unsigned long stm_reg_base;
	unsigned long stm_trb_base;
	void __iomem *stm_ioaddr;
	void __iomem *trb_ioaddr;
	struct stm_ctrl stm_ctrl_hwreg;
	struct stm_usb3_ctrl stm_usb3_hwreg;
};

int stm_dev_init(struct pci_dev *pdev, struct stm_dev *dev_stm);
void stm_dev_clean(struct pci_dev *pdev, struct stm_dev *dev_stm);

#endif /* _STM_H */