1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2004 IBM Corporation
5 * Leendert van Doorn <leendert@watson.ibm.com>
6 * Dave Safford <safford@watson.ibm.com>
7 * Reiner Sailer <sailer@watson.ibm.com>
8 * Kylene Hall <kjhall@us.ibm.com>
10 * Copyright (C) 2013 Obsidian Research Corp
11 * Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
13 * Device file system interface to the TPM
15 #include <linux/poll.h>
16 #include <linux/slab.h>
17 #include <linux/uaccess.h>
18 #include <linux/workqueue.h>
22 static struct workqueue_struct
*tpm_dev_wq
;
24 static ssize_t
tpm_dev_transmit(struct tpm_chip
*chip
, struct tpm_space
*space
,
25 u8
*buf
, size_t bufsiz
)
27 struct tpm_header
*header
= (void *)buf
;
30 if (chip
->flags
& TPM_CHIP_FLAG_TPM2
)
31 tpm2_end_auth_session(chip
);
33 ret
= tpm2_prepare_space(chip
, space
, buf
, bufsiz
);
34 /* If the command is not implemented by the TPM, synthesize a
35 * response with a TPM2_RC_COMMAND_CODE return for user-space.
37 if (ret
== -EOPNOTSUPP
) {
38 header
->length
= cpu_to_be32(sizeof(*header
));
39 header
->tag
= cpu_to_be16(TPM2_ST_NO_SESSIONS
);
40 header
->return_code
= cpu_to_be32(TPM2_RC_COMMAND_CODE
|
41 TSS2_RESMGR_TPM_RC_LAYER
);
42 ret
= sizeof(*header
);
47 len
= tpm_transmit(chip
, buf
, bufsiz
);
52 ret
= tpm2_commit_space(chip
, space
, buf
, &len
);
54 tpm2_flush_space(chip
);
57 return ret
? ret
: len
;
60 static void tpm_dev_async_work(struct work_struct
*work
)
62 struct file_priv
*priv
=
63 container_of(work
, struct file_priv
, async_work
);
66 mutex_lock(&priv
->buffer_mutex
);
67 priv
->command_enqueued
= false;
68 ret
= tpm_try_get_ops(priv
->chip
);
70 priv
->response_length
= ret
;
74 ret
= tpm_dev_transmit(priv
->chip
, priv
->space
, priv
->data_buffer
,
75 sizeof(priv
->data_buffer
));
76 tpm_put_ops(priv
->chip
);
79 * If ret is > 0 then tpm_dev_transmit returned the size of the
80 * response. If ret is < 0 then tpm_dev_transmit failed and
81 * returned an error code.
84 priv
->response_length
= ret
;
85 mod_timer(&priv
->user_read_timer
, jiffies
+ (120 * HZ
));
88 mutex_unlock(&priv
->buffer_mutex
);
89 wake_up_interruptible(&priv
->async_wait
);
92 static void user_reader_timeout(struct timer_list
*t
)
94 struct file_priv
*priv
= from_timer(priv
, t
, user_read_timer
);
96 pr_warn("TPM user space timeout is deprecated (pid=%d)\n",
97 task_tgid_nr(current
));
99 schedule_work(&priv
->timeout_work
);
102 static void tpm_timeout_work(struct work_struct
*work
)
104 struct file_priv
*priv
= container_of(work
, struct file_priv
,
107 mutex_lock(&priv
->buffer_mutex
);
108 priv
->response_read
= true;
109 priv
->response_length
= 0;
110 memset(priv
->data_buffer
, 0, sizeof(priv
->data_buffer
));
111 mutex_unlock(&priv
->buffer_mutex
);
112 wake_up_interruptible(&priv
->async_wait
);
115 void tpm_common_open(struct file
*file
, struct tpm_chip
*chip
,
116 struct file_priv
*priv
, struct tpm_space
*space
)
120 priv
->response_read
= true;
122 mutex_init(&priv
->buffer_mutex
);
123 timer_setup(&priv
->user_read_timer
, user_reader_timeout
, 0);
124 INIT_WORK(&priv
->timeout_work
, tpm_timeout_work
);
125 INIT_WORK(&priv
->async_work
, tpm_dev_async_work
);
126 init_waitqueue_head(&priv
->async_wait
);
127 file
->private_data
= priv
;
130 ssize_t
tpm_common_read(struct file
*file
, char __user
*buf
,
131 size_t size
, loff_t
*off
)
133 struct file_priv
*priv
= file
->private_data
;
134 ssize_t ret_size
= 0;
137 mutex_lock(&priv
->buffer_mutex
);
139 if (priv
->response_length
) {
140 priv
->response_read
= true;
142 ret_size
= min_t(ssize_t
, size
, priv
->response_length
);
144 priv
->response_length
= 0;
148 rc
= copy_to_user(buf
, priv
->data_buffer
+ *off
, ret_size
);
150 memset(priv
->data_buffer
, 0, TPM_BUFSIZE
);
151 priv
->response_length
= 0;
154 memset(priv
->data_buffer
+ *off
, 0, ret_size
);
155 priv
->response_length
-= ret_size
;
161 if (!priv
->response_length
) {
163 del_timer_sync(&priv
->user_read_timer
);
164 flush_work(&priv
->timeout_work
);
166 mutex_unlock(&priv
->buffer_mutex
);
170 ssize_t
tpm_common_write(struct file
*file
, const char __user
*buf
,
171 size_t size
, loff_t
*off
)
173 struct file_priv
*priv
= file
->private_data
;
176 if (size
> TPM_BUFSIZE
)
179 mutex_lock(&priv
->buffer_mutex
);
181 /* Cannot perform a write until the read has cleared either via
182 * tpm_read or a user_read_timer timeout. This also prevents split
183 * buffered writes from blocking here.
185 if ((!priv
->response_read
&& priv
->response_length
) ||
186 priv
->command_enqueued
) {
191 if (copy_from_user(priv
->data_buffer
, buf
, size
)) {
197 size
< be32_to_cpu(*((__be32
*)(priv
->data_buffer
+ 2)))) {
202 priv
->response_length
= 0;
203 priv
->response_read
= false;
207 * If in nonblocking mode schedule an async job to send
208 * the command return the size.
209 * In case of error the err code will be returned in
210 * the subsequent read call.
212 if (file
->f_flags
& O_NONBLOCK
) {
213 priv
->command_enqueued
= true;
214 queue_work(tpm_dev_wq
, &priv
->async_work
);
215 mutex_unlock(&priv
->buffer_mutex
);
219 /* atomic tpm command send and result receive. We only hold the ops
220 * lock during this period so that the tpm can be unregistered even if
221 * the char dev is held open.
223 if (tpm_try_get_ops(priv
->chip
)) {
228 ret
= tpm_dev_transmit(priv
->chip
, priv
->space
, priv
->data_buffer
,
229 sizeof(priv
->data_buffer
));
230 tpm_put_ops(priv
->chip
);
233 priv
->response_length
= ret
;
234 mod_timer(&priv
->user_read_timer
, jiffies
+ (120 * HZ
));
238 mutex_unlock(&priv
->buffer_mutex
);
242 __poll_t
tpm_common_poll(struct file
*file
, poll_table
*wait
)
244 struct file_priv
*priv
= file
->private_data
;
247 poll_wait(file
, &priv
->async_wait
, wait
);
248 mutex_lock(&priv
->buffer_mutex
);
251 * The response_length indicates if there is still response
252 * (or part of it) to be consumed. Partial reads decrease it
253 * by the number of bytes read, and write resets it the zero.
255 if (priv
->response_length
)
256 mask
= EPOLLIN
| EPOLLRDNORM
;
258 mask
= EPOLLOUT
| EPOLLWRNORM
;
260 mutex_unlock(&priv
->buffer_mutex
);
265 * Called on file close
267 void tpm_common_release(struct file
*file
, struct file_priv
*priv
)
269 flush_work(&priv
->async_work
);
270 del_timer_sync(&priv
->user_read_timer
);
271 flush_work(&priv
->timeout_work
);
272 file
->private_data
= NULL
;
273 priv
->response_length
= 0;
276 int __init
tpm_dev_common_init(void)
278 tpm_dev_wq
= alloc_workqueue("tpm_dev_wq", WQ_MEM_RECLAIM
, 0);
280 return !tpm_dev_wq
? -ENOMEM
: 0;
283 void __exit
tpm_dev_common_exit(void)
286 destroy_workqueue(tpm_dev_wq
);