aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/tpm/tpm_ibmvtpm.h
blob: 91dfe766d08007e9dfa5fa91e7d5a132a8b85830 (plain) (blame)
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
/*
 * Copyright (C) 2012 IBM Corporation
 *
 * Author: Ashley Lai <ashleydlai@gmail.com>
 *
 * Maintained by: <tpmdd-devel@lists.sourceforge.net>
 *
 * Device driver for TCG/TCPA TPM (trusted platform module).
 * Specifications at www.trustedcomputinggroup.org
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, version 2 of the
 * License.
 *
 */

#ifndef __TPM_IBMVTPM_H__
#define __TPM_IBMVTPM_H__

/* vTPM Message Format 1 */
struct ibmvtpm_crq {
	u8 valid;
	u8 msg;
	__be16 len;
	__be32 data;
	__be64 reserved;
} __attribute__((packed, aligned(8)));

struct ibmvtpm_crq_queue {
	struct ibmvtpm_crq *crq_addr;
	u32 index;
	u32 num_entry;
};

struct ibmvtpm_dev {
	struct device *dev;
	struct vio_dev *vdev;
	struct ibmvtpm_crq_queue crq_queue;
	dma_addr_t crq_dma_handle;
	u32 rtce_size;
	void __iomem *rtce_buf;
	dma_addr_t rtce_dma_handle;
	spinlock_t rtce_lock;
	wait_queue_head_t wq;
	u16 res_len;
	u32 vtpm_version;
	bool tpm_processing_cmd;
};

#define CRQ_RES_BUF_SIZE	PAGE_SIZE

/* Initialize CRQ */
#define INIT_CRQ_CMD		0xC001000000000000LL /* Init cmd */
#define INIT_CRQ_COMP_CMD	0xC002000000000000LL /* Init complete cmd */
#define INIT_CRQ_RES		0x01	/* Init respond */
#define INIT_CRQ_COMP_RES	0x02	/* Init complete respond */
#define VALID_INIT_CRQ		0xC0	/* Valid command for init crq */

/* vTPM CRQ response is the message type | 0x80 */
#define VTPM_MSG_RES		0x80
#define IBMVTPM_VALID_CMD	0x80

/* vTPM CRQ message types */
#define VTPM_GET_VERSION			0x01
#define VTPM_GET_VERSION_RES			(0x01 | VTPM_MSG_RES)

#define VTPM_TPM_COMMAND			0x02
#define VTPM_TPM_COMMAND_RES			(0x02 | VTPM_MSG_RES)

#define VTPM_GET_RTCE_BUFFER_SIZE		0x03
#define VTPM_GET_RTCE_BUFFER_SIZE_RES		(0x03 | VTPM_MSG_RES)

#define VTPM_PREPARE_TO_SUSPEND			0x04
#define VTPM_PREPARE_TO_SUSPEND_RES		(0x04 | VTPM_MSG_RES)

#endif
;yoshfuji@linux-ipv6.org> 2007-02-09 09:25:27 -0500 committer David S. Miller <davem@sunset.davemloft.net> 2007-02-11 02:20:22 -0500 [NET] X25: Fix whitespace errors.' href='/cgit/cgit.cgi/litmus-rt-imx6.git/commit/net/x25/x25_out.c?id=f8e1d20183bf56f889d60edadd48f54912b9277f'>f8e1d20183bf
1da177e4c3f4














b7792e34cba6


1da177e4c3f4










































































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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231




                                                                           
                                     

















                                                                             
                       






































                                                                        
                                                                   




                                             




                                                                          








                                                                           
 




                                                                      
                                                                                



                                                   
                                                                          










                                                                       
 







                                                         
  



















                                                                             
                                               














                                          


                                                                     










































































                                                                          
/*
 *	X.25 Packet Layer release 002
 *
 *	This is ALPHA test software. This code may break your machine,
 *	randomly fail to work with new releases, misbehave and/or generally
 *	screw up. It might even work.
 *
 *	This code REQUIRES 2.1.15 or higher
 *
 *	This module:
 *		This module is free software; you can redistribute it and/or
 *		modify it under the terms of the GNU General Public License
 *		as published by the Free Software Foundation; either version
 *		2 of the License, or (at your option) any later version.
 *
 *	History
 *	X.25 001	Jonathan Naylor	Started coding.
 *	X.25 002	Jonathan Naylor	New timer architecture.
 *	2000-09-04	Henner Eisen	Prevented x25_output() skb leakage.
 *	2000-10-27	Henner Eisen	MSG_DONTWAIT for fragment allocation.
 *	2000-11-10	Henner Eisen	x25_send_iframe(): re-queued frames
 *					needed cleaned seq-number fields.
 */

#include <linux/slab.h>
#include <linux/socket.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/skbuff.h>
#include <net/sock.h>
#include <net/x25.h>

static int x25_pacsize_to_bytes(unsigned int pacsize)
{
	int bytes = 1;

	if (!pacsize)
		return 128;

	while (pacsize-- > 0)
		bytes *= 2;

	return bytes;
}

/*
 *	This is where all X.25 information frames pass.
 *
 *      Returns the amount of user data bytes sent on success
 *      or a negative error code on failure.
 */
int x25_output(struct sock *sk, struct sk_buff *skb)
{
	struct sk_buff *skbn;
	unsigned char header[X25_EXT_MIN_LEN];
	int err, frontlen, len;
	int sent=0, noblock = X25_SKB_CB(skb)->flags & MSG_DONTWAIT;
	struct x25_sock *x25 = x25_sk(sk);
	int header_len = x25->neighbour->extended ? X25_EXT_MIN_LEN :
						    X25_STD_MIN_LEN;
	int max_len = x25_pacsize_to_bytes(x25->facilities.pacsize_out);

	if (skb->len - header_len > max_len) {
		/* Save a copy of the Header */
		skb_copy_from_linear_data(skb, header, header_len);
		skb_pull(skb, header_len);

		frontlen = skb_headroom(skb);

		while (skb->len > 0) {
			release_sock(sk);
			skbn = sock_alloc_send_skb(sk, frontlen + max_len,
						   noblock, &err);
			lock_sock(sk);
			if (!skbn) {
				if (err == -EWOULDBLOCK && noblock){
					kfree_skb(skb);
					return sent;
				}
				SOCK_DEBUG(sk, "x25_output: fragment alloc"
					       " failed, err=%d, %d bytes "
					       "sent\n", err, sent);
				return err;
			}

			skb_reserve(skbn, frontlen);

			len = max_len > skb->len ? skb->len : max_len;

			/* Copy the user data */
			skb_copy_from_linear_data(skb, skb_put(skbn, len), len);
			skb_pull(skb, len);

			/* Duplicate the Header */
			skb_push(skbn, header_len);
			skb_copy_to_linear_data(skbn, header, header_len);

			if (skb->len > 0) {
				if (x25->neighbour->extended)
					skbn->data[3] |= X25_EXT_M_BIT;
				else
					skbn->data[2] |= X25_STD_M_BIT;
			}

			skb_queue_tail(&sk->sk_write_queue, skbn);
			sent += len;
		}

		kfree_skb(skb);
	} else {
		skb_queue_tail(&sk->sk_write_queue, skb);
		sent = skb->len - header_len;
	}
	return sent;
}

/*