2 * Implementation of the Xen vTPM device frontend
4 * Author: Daniel De Graaf <dgdegra@tycho.nsa.gov>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2,
8 * as published by the Free Software Foundation.
10 #include <linux/errno.h>
11 #include <linux/err.h>
12 #include <linux/interrupt.h>
13 #include <xen/events.h>
14 #include <xen/interface/io/tpmif.h>
15 #include <xen/grant_table.h>
16 #include <xen/xenbus.h>
21 struct tpm_chip
*chip
;
22 struct xenbus_device
*dev
;
24 struct vtpm_shared_page
*shr
;
32 VTPM_STATUS_RUNNING
= 0x1,
33 VTPM_STATUS_IDLE
= 0x2,
34 VTPM_STATUS_RESULT
= 0x4,
35 VTPM_STATUS_CANCELED
= 0x8,
38 static u8
vtpm_status(struct tpm_chip
*chip
)
40 struct tpm_private
*priv
= TPM_VPRIV(chip
);
41 switch (priv
->shr
->state
) {
43 return VTPM_STATUS_IDLE
| VTPM_STATUS_CANCELED
;
44 case VTPM_STATE_FINISH
:
45 return VTPM_STATUS_IDLE
| VTPM_STATUS_RESULT
;
46 case VTPM_STATE_SUBMIT
:
47 case VTPM_STATE_CANCEL
: /* cancel requested, not yet canceled */
48 return VTPM_STATUS_RUNNING
;
54 static bool vtpm_req_canceled(struct tpm_chip
*chip
, u8 status
)
56 return status
& VTPM_STATUS_CANCELED
;
59 static void vtpm_cancel(struct tpm_chip
*chip
)
61 struct tpm_private
*priv
= TPM_VPRIV(chip
);
62 priv
->shr
->state
= VTPM_STATE_CANCEL
;
64 notify_remote_via_evtchn(priv
->evtchn
);
67 static unsigned int shr_data_offset(struct vtpm_shared_page
*shr
)
69 return sizeof(*shr
) + sizeof(u32
) * shr
->nr_extra_pages
;
72 static int vtpm_send(struct tpm_chip
*chip
, u8
*buf
, size_t count
)
74 struct tpm_private
*priv
= TPM_VPRIV(chip
);
75 struct vtpm_shared_page
*shr
= priv
->shr
;
76 unsigned int offset
= shr_data_offset(shr
);
79 unsigned long duration
;
81 if (offset
> PAGE_SIZE
)
84 if (offset
+ count
> PAGE_SIZE
)
87 /* Wait for completion of any existing command or cancellation */
88 if (wait_for_tpm_stat(chip
, VTPM_STATUS_IDLE
, chip
->vendor
.timeout_c
,
89 &chip
->vendor
.read_queue
, true) < 0) {
94 memcpy(offset
+ (u8
*)shr
, buf
, count
);
97 shr
->state
= VTPM_STATE_SUBMIT
;
99 notify_remote_via_evtchn(priv
->evtchn
);
101 ordinal
= be32_to_cpu(((struct tpm_input_header
*)buf
)->ordinal
);
102 duration
= tpm_calc_ordinal_duration(chip
, ordinal
);
104 if (wait_for_tpm_stat(chip
, VTPM_STATUS_IDLE
, duration
,
105 &chip
->vendor
.read_queue
, true) < 0) {
106 /* got a signal or timeout, try to cancel */
114 static int vtpm_recv(struct tpm_chip
*chip
, u8
*buf
, size_t count
)
116 struct tpm_private
*priv
= TPM_VPRIV(chip
);
117 struct vtpm_shared_page
*shr
= priv
->shr
;
118 unsigned int offset
= shr_data_offset(shr
);
119 size_t length
= shr
->length
;
121 if (shr
->state
== VTPM_STATE_IDLE
)
124 /* In theory the wait at the end of _send makes this one unnecessary */
125 if (wait_for_tpm_stat(chip
, VTPM_STATUS_RESULT
, chip
->vendor
.timeout_c
,
126 &chip
->vendor
.read_queue
, true) < 0) {
131 if (offset
> PAGE_SIZE
)
134 if (offset
+ length
> PAGE_SIZE
)
135 length
= PAGE_SIZE
- offset
;
140 memcpy(buf
, offset
+ (u8
*)shr
, length
);
145 ssize_t
tpm_show_locality(struct device
*dev
, struct device_attribute
*attr
,
148 struct tpm_chip
*chip
= dev_get_drvdata(dev
);
149 struct tpm_private
*priv
= TPM_VPRIV(chip
);
150 u8 locality
= priv
->shr
->locality
;
152 return sprintf(buf
, "%d\n", locality
);
155 ssize_t
tpm_store_locality(struct device
*dev
, struct device_attribute
*attr
,
156 const char *buf
, size_t len
)
158 struct tpm_chip
*chip
= dev_get_drvdata(dev
);
159 struct tpm_private
*priv
= TPM_VPRIV(chip
);
162 int rv
= kstrtou8(buf
, 0, &val
);
166 priv
->shr
->locality
= val
;
171 static const struct file_operations vtpm_ops
= {
172 .owner
= THIS_MODULE
,
177 .release
= tpm_release
,
180 static DEVICE_ATTR(pubek
, S_IRUGO
, tpm_show_pubek
, NULL
);
181 static DEVICE_ATTR(pcrs
, S_IRUGO
, tpm_show_pcrs
, NULL
);
182 static DEVICE_ATTR(enabled
, S_IRUGO
, tpm_show_enabled
, NULL
);
183 static DEVICE_ATTR(active
, S_IRUGO
, tpm_show_active
, NULL
);
184 static DEVICE_ATTR(owned
, S_IRUGO
, tpm_show_owned
, NULL
);
185 static DEVICE_ATTR(temp_deactivated
, S_IRUGO
, tpm_show_temp_deactivated
,
187 static DEVICE_ATTR(caps
, S_IRUGO
, tpm_show_caps
, NULL
);
188 static DEVICE_ATTR(cancel
, S_IWUSR
| S_IWGRP
, NULL
, tpm_store_cancel
);
189 static DEVICE_ATTR(durations
, S_IRUGO
, tpm_show_durations
, NULL
);
190 static DEVICE_ATTR(timeouts
, S_IRUGO
, tpm_show_timeouts
, NULL
);
191 static DEVICE_ATTR(locality
, S_IRUGO
| S_IWUSR
, tpm_show_locality
,
194 static struct attribute
*vtpm_attrs
[] = {
195 &dev_attr_pubek
.attr
,
197 &dev_attr_enabled
.attr
,
198 &dev_attr_active
.attr
,
199 &dev_attr_owned
.attr
,
200 &dev_attr_temp_deactivated
.attr
,
202 &dev_attr_cancel
.attr
,
203 &dev_attr_durations
.attr
,
204 &dev_attr_timeouts
.attr
,
205 &dev_attr_locality
.attr
,
209 static struct attribute_group vtpm_attr_grp
= {
213 #define TPM_LONG_TIMEOUT (10 * 60 * HZ)
215 static const struct tpm_vendor_specific tpm_vtpm
= {
216 .status
= vtpm_status
,
219 .cancel
= vtpm_cancel
,
220 .req_complete_mask
= VTPM_STATUS_IDLE
| VTPM_STATUS_RESULT
,
221 .req_complete_val
= VTPM_STATUS_IDLE
| VTPM_STATUS_RESULT
,
222 .req_canceled
= vtpm_req_canceled
,
223 .attr_group
= &vtpm_attr_grp
,
234 static irqreturn_t
tpmif_interrupt(int dummy
, void *dev_id
)
236 struct tpm_private
*priv
= dev_id
;
238 switch (priv
->shr
->state
) {
239 case VTPM_STATE_IDLE
:
240 case VTPM_STATE_FINISH
:
241 wake_up_interruptible(&priv
->chip
->vendor
.read_queue
);
243 case VTPM_STATE_SUBMIT
:
244 case VTPM_STATE_CANCEL
:
251 static int setup_chip(struct device
*dev
, struct tpm_private
*priv
)
253 struct tpm_chip
*chip
;
255 chip
= tpm_register_hardware(dev
, &tpm_vtpm
);
259 init_waitqueue_head(&chip
->vendor
.read_queue
);
262 TPM_VPRIV(chip
) = priv
;
267 /* caller must clean up in case of errors */
268 static int setup_ring(struct xenbus_device
*dev
, struct tpm_private
*priv
)
270 struct xenbus_transaction xbt
;
271 const char *message
= NULL
;
274 priv
->shr
= (void *)__get_free_page(GFP_KERNEL
|__GFP_ZERO
);
276 xenbus_dev_fatal(dev
, -ENOMEM
, "allocating shared ring");
280 rv
= xenbus_grant_ring(dev
, virt_to_mfn(priv
->shr
));
286 rv
= xenbus_alloc_evtchn(dev
, &priv
->evtchn
);
290 rv
= bind_evtchn_to_irqhandler(priv
->evtchn
, tpmif_interrupt
, 0,
293 xenbus_dev_fatal(dev
, rv
, "allocating TPM irq");
296 priv
->chip
->vendor
.irq
= rv
;
299 rv
= xenbus_transaction_start(&xbt
);
301 xenbus_dev_fatal(dev
, rv
, "starting transaction");
305 rv
= xenbus_printf(xbt
, dev
->nodename
,
306 "ring-ref", "%u", priv
->ring_ref
);
308 message
= "writing ring-ref";
309 goto abort_transaction
;
312 rv
= xenbus_printf(xbt
, dev
->nodename
, "event-channel", "%u",
315 message
= "writing event-channel";
316 goto abort_transaction
;
319 rv
= xenbus_printf(xbt
, dev
->nodename
, "feature-protocol-v2", "1");
321 message
= "writing feature-protocol-v2";
322 goto abort_transaction
;
325 rv
= xenbus_transaction_end(xbt
, 0);
329 xenbus_dev_fatal(dev
, rv
, "completing transaction");
333 xenbus_switch_state(dev
, XenbusStateInitialised
);
338 xenbus_transaction_end(xbt
, 1);
340 xenbus_dev_error(dev
, rv
, "%s", message
);
345 static void ring_free(struct tpm_private
*priv
)
351 gnttab_end_foreign_access(priv
->ring_ref
, 0,
352 (unsigned long)priv
->shr
);
354 free_page((unsigned long)priv
->shr
);
356 if (priv
->chip
&& priv
->chip
->vendor
.irq
)
357 unbind_from_irqhandler(priv
->chip
->vendor
.irq
, priv
);
362 static int tpmfront_probe(struct xenbus_device
*dev
,
363 const struct xenbus_device_id
*id
)
365 struct tpm_private
*priv
;
368 priv
= kzalloc(sizeof(*priv
), GFP_KERNEL
);
370 xenbus_dev_fatal(dev
, -ENOMEM
, "allocating priv structure");
374 rv
= setup_chip(&dev
->dev
, priv
);
380 rv
= setup_ring(dev
, priv
);
382 tpm_remove_hardware(&dev
->dev
);
387 tpm_get_timeouts(priv
->chip
);
389 dev_set_drvdata(&dev
->dev
, priv
->chip
);
394 static int tpmfront_remove(struct xenbus_device
*dev
)
396 struct tpm_chip
*chip
= dev_get_drvdata(&dev
->dev
);
397 struct tpm_private
*priv
= TPM_VPRIV(chip
);
398 tpm_remove_hardware(&dev
->dev
);
400 TPM_VPRIV(chip
) = NULL
;
404 static int tpmfront_resume(struct xenbus_device
*dev
)
406 /* A suspend/resume/migrate will interrupt a vTPM anyway */
407 tpmfront_remove(dev
);
408 return tpmfront_probe(dev
, NULL
);
411 static void backend_changed(struct xenbus_device
*dev
,
412 enum xenbus_state backend_state
)
416 switch (backend_state
) {
417 case XenbusStateInitialised
:
418 case XenbusStateConnected
:
419 if (dev
->state
== XenbusStateConnected
)
422 if (xenbus_scanf(XBT_NIL
, dev
->otherend
,
423 "feature-protocol-v2", "%d", &val
) < 0)
426 xenbus_dev_fatal(dev
, -EINVAL
,
427 "vTPM protocol 2 required");
430 xenbus_switch_state(dev
, XenbusStateConnected
);
433 case XenbusStateClosing
:
434 case XenbusStateClosed
:
435 device_unregister(&dev
->dev
);
436 xenbus_frontend_closed(dev
);
443 static const struct xenbus_device_id tpmfront_ids
[] = {
447 MODULE_ALIAS("xen:vtpm");
449 static DEFINE_XENBUS_DRIVER(tpmfront
, ,
450 .probe
= tpmfront_probe
,
451 .remove
= tpmfront_remove
,
452 .resume
= tpmfront_resume
,
453 .otherend_changed
= backend_changed
,
456 static int __init
xen_tpmfront_init(void)
461 return xenbus_register_frontend(&tpmfront_driver
);
463 module_init(xen_tpmfront_init
);
465 static void __exit
xen_tpmfront_exit(void)
467 xenbus_unregister_driver(&tpmfront_driver
);
469 module_exit(xen_tpmfront_exit
);
471 MODULE_AUTHOR("Daniel De Graaf <dgdegra@tycho.nsa.gov>");
472 MODULE_DESCRIPTION("Xen vTPM Driver");
473 MODULE_LICENSE("GPL");