xref: /netbsd-src/sys/dev/ic/tpm.c (revision fdd524d4ccd2bb0c6f67401e938dabf773eb0372)
1 /*	$NetBSD: tpm.c,v 1.11 2014/07/25 08:10:37 dholland Exp $	*/
2 /*
3  * Copyright (c) 2008, 2009 Michael Shalayeff
4  * Copyright (c) 2009, 2010 Hans-J�rg H�xer
5  * All rights reserved.
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
16  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
17  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #include <sys/cdefs.h>
21 __KERNEL_RCSID(0, "$NetBSD: tpm.c,v 1.11 2014/07/25 08:10:37 dholland Exp $");
22 
23 #if 0
24 #define	TPM_DEBUG
25 #define aprint_debug_dev aprint_error_dev
26 #endif
27 
28 #include <sys/param.h>
29 #include <sys/systm.h>
30 #include <sys/kernel.h>
31 #include <sys/malloc.h>
32 #include <sys/proc.h>
33 #include <sys/device.h>
34 #include <sys/conf.h>
35 #include <sys/bus.h>
36 #include <sys/pmf.h>
37 
38 #include <dev/ic/tpmreg.h>
39 #include <dev/ic/tpmvar.h>
40 
41 /* Set when enabling legacy interface in host bridge. */
42 int tpm_enabled;
43 
44 const struct {
45 	uint32_t devid;
46 	char name[32];
47 	int flags;
48 #define TPM_DEV_NOINTS	0x0001
49 } tpm_devs[] = {
50 	{ 0x000615d1, "IFX SLD 9630 TT 1.1", 0 },
51 	{ 0x000b15d1, "IFX SLB 9635 TT 1.2", 0 },
52 	{ 0x100214e4, "Broadcom BCM0102", TPM_DEV_NOINTS },
53 	{ 0x00fe1050, "WEC WPCT200", 0 },
54 	{ 0x687119fa, "SNS SSX35", 0 },
55 	{ 0x2e4d5453, "STM ST19WP18", 0 },
56 	{ 0x32021114, "ATML 97SC3203", TPM_DEV_NOINTS },
57 	{ 0x10408086, "INTEL INTC0102", 0 },
58 	{ 0, "", TPM_DEV_NOINTS },
59 };
60 
61 int tpm_tis12_irqinit(struct tpm_softc *, int, int);
62 
63 int tpm_waitfor_poll(struct tpm_softc *, uint8_t, int, void *);
64 int tpm_waitfor_int(struct tpm_softc *, uint8_t, int, void *, int);
65 int tpm_waitfor(struct tpm_softc *, uint8_t, int, void *);
66 int tpm_request_locality(struct tpm_softc *, int);
67 int tpm_getburst(struct tpm_softc *);
68 uint8_t tpm_status(struct tpm_softc *);
69 int tpm_tmotohz(int);
70 
71 static dev_type_open(tpmopen);
72 static dev_type_close(tpmclose);
73 static dev_type_read(tpmread);
74 static dev_type_read(tpmwrite);
75 static dev_type_ioctl(tpmioctl);
76 
77 extern struct cfdriver	tpm_cd;
78 #define TPMUNIT(a)	minor(a)
79 
80 const struct cdevsw tpm_cdevsw = {
81 	.d_open = tpmopen,
82 	.d_close = tpmclose,
83 	.d_read = tpmread,
84 	.d_write = tpmwrite,
85 	.d_ioctl = tpmioctl,
86 	.d_stop = nostop,
87 	.d_tty = notty,
88 	.d_poll = nopoll,
89 	.d_mmap = nommap,
90 	.d_kqfilter = nokqfilter,
91 	.d_discard = nodiscard,
92 	.d_flag = D_OTHER,
93 };
94 
95 /* Probe TPM using TIS 1.2 interface. */
96 int
97 tpm_tis12_probe(bus_space_tag_t bt, bus_space_handle_t bh)
98 {
99 	uint32_t r;
100 	uint8_t save, reg;
101 
102 	r = bus_space_read_4(bt, bh, TPM_INTF_CAPABILITIES);
103 	if (r == 0xffffffff)
104 		return 0;
105 
106 #ifdef TPM_DEBUG
107 	char buf[128];
108 	snprintb(buf, sizeof(buf), TPM_CAPBITS, r);
109 	printf("%s: caps=%s\n", __func__, buf);
110 #endif
111 	if ((r & TPM_CAPSREQ) != TPM_CAPSREQ ||
112 	    !(r & (TPM_INTF_INT_EDGE_RISING | TPM_INTF_INT_LEVEL_LOW))) {
113 #ifdef TPM_DEBUG
114 		printf("%s: caps too low (caps=%s)\n", __func__, buf);
115 #endif
116 		return 0;
117 	}
118 
119 	save = bus_space_read_1(bt, bh, TPM_ACCESS);
120 	bus_space_write_1(bt, bh, TPM_ACCESS, TPM_ACCESS_REQUEST_USE);
121 	reg = bus_space_read_1(bt, bh, TPM_ACCESS);
122 	if ((reg & TPM_ACCESS_VALID) && (reg & TPM_ACCESS_ACTIVE_LOCALITY) &&
123 	    bus_space_read_4(bt, bh, TPM_ID) != 0xffffffff)
124 		return 1;
125 
126 	bus_space_write_1(bt, bh, TPM_ACCESS, save);
127 	return 0;
128 }
129 
130 /*
131  * Setup interrupt vector if one is provided and interrupts are know to
132  * work on that particular chip.
133  */
134 int
135 tpm_tis12_irqinit(struct tpm_softc *sc, int irq, int idx)
136 {
137 	uint32_t r;
138 
139 	if ((irq == -1) || (tpm_devs[idx].flags & TPM_DEV_NOINTS)) {
140 		sc->sc_vector = -1;
141 		return 0;
142 	}
143 
144 	/* Ack and disable all interrupts. */
145 	r = bus_space_read_4(sc->sc_bt, sc->sc_bh, TPM_INTERRUPT_ENABLE);
146 	bus_space_write_4(sc->sc_bt, sc->sc_bh, TPM_INTERRUPT_ENABLE,
147 	    r & ~TPM_GLOBAL_INT_ENABLE);
148 	bus_space_write_4(sc->sc_bt, sc->sc_bh, TPM_INT_STATUS,
149 	    bus_space_read_4(sc->sc_bt, sc->sc_bh, TPM_INT_STATUS));
150 #ifdef TPM_DEBUG
151 	char buf[128];
152 	snprintb(buf, sizeof(buf), TPM_INTERRUPT_ENABLE_BITS, r);
153 	aprint_debug_dev(sc->sc_dev, "%s: before ien %s\n", __func__, buf);
154 #endif
155 
156 	/* Program interrupt vector. */
157 	bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_INT_VECTOR, irq);
158 	sc->sc_vector = irq;
159 
160 	/* Program interrupt type. */
161 	r &= ~(TPM_INT_EDGE_RISING|TPM_INT_EDGE_FALLING|TPM_INT_LEVEL_HIGH|
162 	    TPM_INT_LEVEL_LOW);
163 	r |= TPM_GLOBAL_INT_ENABLE|TPM_CMD_READY_INT|TPM_LOCALITY_CHANGE_INT|
164 	    TPM_STS_VALID_INT|TPM_DATA_AVAIL_INT;
165 	if (sc->sc_capabilities & TPM_INTF_INT_EDGE_RISING)
166 		r |= TPM_INT_EDGE_RISING;
167 	else if (sc->sc_capabilities & TPM_INTF_INT_EDGE_FALLING)
168 		r |= TPM_INT_EDGE_FALLING;
169 	else if (sc->sc_capabilities & TPM_INTF_INT_LEVEL_HIGH)
170 		r |= TPM_INT_LEVEL_HIGH;
171 	else
172 		r |= TPM_INT_LEVEL_LOW;
173 
174 	bus_space_write_4(sc->sc_bt, sc->sc_bh, TPM_INTERRUPT_ENABLE, r);
175 #ifdef TPM_DEBUG
176 	snprintb(buf, sizeof(buf), TPM_INTERRUPT_ENABLE_BITS, r);
177 	aprint_debug_dev(sc->sc_dev, "%s: after ien %s\n", __func__, buf);
178 #endif
179 
180 	return 0;
181 }
182 
183 /* Setup TPM using TIS 1.2 interface. */
184 int
185 tpm_tis12_init(struct tpm_softc *sc, int irq, const char *name)
186 {
187 	uint32_t r;
188 	int i;
189 
190 	r = bus_space_read_4(sc->sc_bt, sc->sc_bh, TPM_INTF_CAPABILITIES);
191 #ifdef TPM_DEBUG
192 	char cbuf[128];
193 	snprintb(cbuf, sizeof(cbuf), TPM_CAPBITS, r);
194 	aprint_debug_dev(sc->sc_dev, "%s: caps=%s ", __func__, cbuf);
195 #endif
196 	if ((r & TPM_CAPSREQ) != TPM_CAPSREQ ||
197 	    !(r & (TPM_INTF_INT_EDGE_RISING | TPM_INTF_INT_LEVEL_LOW))) {
198 		char buf[128];
199 		snprintb(buf, sizeof(buf), TPM_CAPBITS, r);
200 		aprint_error_dev(sc->sc_dev, "capabilities too low (caps=%s)\n",
201 		    buf);
202 		return 1;
203 	}
204 	sc->sc_capabilities = r;
205 
206 	sc->sc_devid = bus_space_read_4(sc->sc_bt, sc->sc_bh, TPM_ID);
207 	sc->sc_rev = bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_REV);
208 
209 	for (i = 0; tpm_devs[i].devid; i++)
210 		if (tpm_devs[i].devid == sc->sc_devid)
211 			break;
212 
213 	if (tpm_devs[i].devid)
214 		aprint_normal(": %s rev 0x%x\n",
215 		    tpm_devs[i].name, sc->sc_rev);
216 	else
217 		aprint_normal(": device 0x%08x rev 0x%x\n",
218 		    sc->sc_devid, sc->sc_rev);
219 
220 	if (tpm_tis12_irqinit(sc, irq, i))
221 		return 1;
222 
223 	if (tpm_request_locality(sc, 0))
224 		return 1;
225 
226 	/* Abort whatever it thought it was doing. */
227 	bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_STS, TPM_STS_CMD_READY);
228 
229 	return 0;
230 }
231 
232 int
233 tpm_request_locality(struct tpm_softc *sc, int l)
234 {
235 	uint32_t r;
236 	int to, rv;
237 
238 	if (l != 0)
239 		return EINVAL;
240 
241 	if ((bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_ACCESS) &
242 	    (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY)) ==
243 	    (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY))
244 		return 0;
245 
246 	bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_ACCESS,
247 	    TPM_ACCESS_REQUEST_USE);
248 
249 	to = tpm_tmotohz(TPM_ACCESS_TMO);
250 
251 	while ((r = bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_ACCESS) &
252 	    (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY)) !=
253 	    (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY) && to--) {
254 		rv = tsleep(sc->sc_init, PRIBIO | PCATCH, "tpm_locality", 1);
255 		if (rv &&  rv != EWOULDBLOCK) {
256 #ifdef TPM_DEBUG
257 			aprint_debug_dev(sc->sc_dev, "%s: interrupted %d\n",
258 			    __func__, rv);
259 #endif
260 			return rv;
261 		}
262 	}
263 
264 	if ((r & (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY)) !=
265 	    (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY)) {
266 #ifdef TPM_DEBUG
267 		char buf[128];
268 		snprintb(buf, sizeof(buf), TPM_ACCESS_BITS, r);
269 		aprint_debug_dev(sc->sc_dev, "%s: access %s\n", __func__, buf);
270 #endif
271 		return EBUSY;
272 	}
273 
274 	return 0;
275 }
276 
277 int
278 tpm_getburst(struct tpm_softc *sc)
279 {
280 	int burst, to, rv;
281 
282 	to = tpm_tmotohz(TPM_BURST_TMO);
283 
284 	burst = 0;
285 	while (burst == 0 && to--) {
286 		/*
287 		 * Burst count has to be read from bits 8 to 23 without
288 		 * touching any other bits, eg. the actual status bits 0
289 		 * to 7.
290 		 */
291 		burst = bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_STS + 1);
292 		burst |= bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_STS + 2)
293 		    << 8;
294 #ifdef TPM_DEBUG
295 		aprint_debug_dev(sc->sc_dev, "%s: read %d\n", __func__, burst);
296 #endif
297 		if (burst)
298 			return burst;
299 
300 		rv = tsleep(sc, PRIBIO | PCATCH, "tpm_getburst", 1);
301 		if (rv && rv != EWOULDBLOCK) {
302 			return 0;
303 		}
304 	}
305 
306 	return 0;
307 }
308 
309 uint8_t
310 tpm_status(struct tpm_softc *sc)
311 {
312 	return bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_STS) & TPM_STS_MASK;
313 }
314 
315 int
316 tpm_tmotohz(int tmo)
317 {
318 	struct timeval tv;
319 
320 	tv.tv_sec = tmo / 1000;
321 	tv.tv_usec = 1000 * (tmo % 1000);
322 
323 	return tvtohz(&tv);
324 }
325 
326 /* Save TPM state on suspend. */
327 bool
328 tpm_suspend(device_t dev, const pmf_qual_t *qual)
329 {
330 	struct tpm_softc *sc = device_private(dev);
331 	static const uint8_t command[] = {
332 	    0, 193,		/* TPM_TAG_RQU_COMMAND */
333 	    0, 0, 0, 10,	/* Length in bytes */
334 	    0, 0, 0, 156	/* TPM_ORD_SaveStates */
335 	};
336 	uint8_t scratch[sizeof(command)];
337 
338 	/*
339 	 * Power down:  We have to issue the SaveStates command.
340 	 */
341 	(*sc->sc_write)(sc, &command, sizeof(command));
342 	(*sc->sc_read)(sc, &scratch, sizeof(scratch), NULL, TPM_HDRSIZE);
343 #ifdef TPM_DEBUG
344 	aprint_debug_dev(sc->sc_dev, "%s: power down\n", __func__);
345 #endif
346 	return true;
347 }
348 
349 /*
350  * Handle resume event.  Actually nothing to do as the BIOS is supposed
351  * to restore the previously saved state.
352  */
353 bool
354 tpm_resume(device_t dev, const pmf_qual_t *qual)
355 {
356 #ifdef TPM_DEBUG
357 	struct tpm_softc *sc = device_private(dev);
358 	aprint_debug_dev(sc->sc_dev, "%s: resume\n", __func__);
359 #endif
360 	return true;
361 }
362 
363 /* Wait for given status bits using polling. */
364 int
365 tpm_waitfor_poll(struct tpm_softc *sc, uint8_t mask, int tmo, void *c)
366 {
367 	int rv;
368 
369 	/*
370 	 * Poll until either the requested condition or a time out is
371 	 * met.
372 	 */
373 	while (((sc->sc_stat = tpm_status(sc)) & mask) != mask && tmo--) {
374 		rv = tsleep(c, PRIBIO | PCATCH, "tpm_poll", 1);
375 		if (rv && rv != EWOULDBLOCK) {
376 #ifdef TPM_DEBUG
377 			aprint_debug_dev(sc->sc_dev,
378 			    "%s: interrupted %d\n", __func__, rv);
379 #endif
380 			return rv;
381 		}
382 	}
383 
384 	return 0;
385 }
386 
387 /* Wait for given status bits using interrupts. */
388 int
389 tpm_waitfor_int(struct tpm_softc *sc, uint8_t mask, int tmo, void *c,
390     int inttype)
391 {
392 	int rv, to;
393 
394 	/* Poll and return when condition is already met. */
395 	sc->sc_stat = tpm_status(sc);
396 	if ((sc->sc_stat & mask) == mask)
397 		return 0;
398 
399 	/*
400 	 * Enable interrupt on tpm chip.  Note that interrupts on our
401 	 * level (SPL_TTY) are disabled (see tpm{read,write} et al) and
402 	 * will not be delivered to the cpu until we call tsleep(9) below.
403 	 */
404 	bus_space_write_4(sc->sc_bt, sc->sc_bh, TPM_INTERRUPT_ENABLE,
405 	    bus_space_read_4(sc->sc_bt, sc->sc_bh, TPM_INTERRUPT_ENABLE) |
406 	    inttype);
407 	bus_space_write_4(sc->sc_bt, sc->sc_bh, TPM_INTERRUPT_ENABLE,
408 	    bus_space_read_4(sc->sc_bt, sc->sc_bh, TPM_INTERRUPT_ENABLE) |
409 	    TPM_GLOBAL_INT_ENABLE);
410 
411 	/*
412 	 * Poll once more to remedy the race between previous polling
413 	 * and enabling interrupts on the tpm chip.
414 	 */
415 	sc->sc_stat = tpm_status(sc);
416 	if ((sc->sc_stat & mask) == mask) {
417 		rv = 0;
418 		goto out;
419 	}
420 
421 	to = tpm_tmotohz(tmo);
422 #ifdef TPM_DEBUG
423 	aprint_debug_dev(sc->sc_dev,
424 	    "%s: sleeping for %d ticks on %p\n", __func__, to, c);
425 #endif
426 	/*
427 	 * tsleep(9) enables interrupts on the cpu and returns after
428 	 * wake up with interrupts disabled again.  Note that interrupts
429 	 * generated by the tpm chip while being at SPL_TTY are not lost
430 	 * but held and delivered as soon as the cpu goes below SPL_TTY.
431 	 */
432 	rv = tsleep(c, PRIBIO | PCATCH, "tpm_wait", to);
433 
434 	sc->sc_stat = tpm_status(sc);
435 #ifdef TPM_DEBUG
436 	char buf[128];
437 	snprintb(buf, sizeof(buf), TPM_STS_BITS, sc->sc_stat);
438 	aprint_debug_dev(sc->sc_dev,
439 	    "%s: woke up with rv %d stat %s\n", __func__, rv, buf);
440 #endif
441 	if ((sc->sc_stat & mask) == mask)
442 		rv = 0;
443 
444 	/* Disable interrupts on tpm chip again. */
445 out:	bus_space_write_4(sc->sc_bt, sc->sc_bh, TPM_INTERRUPT_ENABLE,
446 	    bus_space_read_4(sc->sc_bt, sc->sc_bh, TPM_INTERRUPT_ENABLE) &
447 	    ~TPM_GLOBAL_INT_ENABLE);
448 	bus_space_write_4(sc->sc_bt, sc->sc_bh, TPM_INTERRUPT_ENABLE,
449 	    bus_space_read_4(sc->sc_bt, sc->sc_bh, TPM_INTERRUPT_ENABLE) &
450 	    ~inttype);
451 
452 	return rv;
453 }
454 
455 /*
456  * Wait on given status bits, uses interrupts where possible, otherwise polls.
457  */
458 int
459 tpm_waitfor(struct tpm_softc *sc, uint8_t b0, int tmo, void *c)
460 {
461 	uint8_t b;
462 	int re, to, rv;
463 
464 #ifdef TPM_DEBUG
465 	char buf[128];
466 	snprintb(buf, sizeof(buf), TPM_STS_BITS, sc->sc_stat);
467 	aprint_debug_dev(sc->sc_dev, "%s: b0 %s\n", __func__, buf);
468 #endif
469 
470 	/*
471 	 * If possible, use interrupts, otherwise poll.
472 	 *
473 	 * We use interrupts for TPM_STS_VALID and TPM_STS_DATA_AVAIL (if
474 	 * the tpm chips supports them) as waiting for those can take
475 	 * really long.  The other TPM_STS* are not needed very often
476 	 * so we do not support them.
477 	 */
478 	if (sc->sc_vector != -1) {
479 		b = b0;
480 
481 		/*
482 		 * Wait for data ready.  This interrupt only occures
483 		 * when both TPM_STS_VALID and TPM_STS_DATA_AVAIL are asserted.
484 		 * Thus we don't have to bother with TPM_STS_VALID
485 		 * separately and can just return.
486 		 *
487 		 * This only holds for interrupts!  When using polling
488 		 * both flags have to be waited for, see below.
489 		 */
490 		if ((b & TPM_STS_DATA_AVAIL) && (sc->sc_capabilities &
491 		    TPM_INTF_DATA_AVAIL_INT))
492 			return tpm_waitfor_int(sc, b, tmo, c,
493 			    TPM_DATA_AVAIL_INT);
494 
495 		/* Wait for status valid bit. */
496 		if ((b & TPM_STS_VALID) && (sc->sc_capabilities &
497 		    TPM_INTF_STS_VALID_INT)) {
498 			rv = tpm_waitfor_int(sc, b, tmo, c, TPM_STS_VALID_INT);
499 			if (rv != 0)
500 				return rv;
501 			else
502 				b = b0 & ~TPM_STS_VALID;
503 		}
504 
505 		/*
506 		 * When all flags are taken care of, return.  Otherwise
507 		 * use polling for eg. TPM_STS_CMD_READY.
508 		 */
509 		if (b == 0)
510 			return 0;
511 	}
512 
513 	re = 3;
514 restart:
515 	/*
516 	 * If requested wait for TPM_STS_VALID before dealing with
517 	 * any other flag.  Eg. when both TPM_STS_DATA_AVAIL and TPM_STS_VALID
518 	 * are requested, wait for the latter first.
519 	 */
520 	b = b0;
521 	if (b0 & TPM_STS_VALID)
522 		b = TPM_STS_VALID;
523 
524 	to = tpm_tmotohz(tmo);
525 again:
526 	if ((rv = tpm_waitfor_poll(sc, b, to, c)) != 0)
527 		return rv;
528 
529 	if ((b & sc->sc_stat) == TPM_STS_VALID) {
530 		/* Now wait for other flags. */
531 		b = b0 & ~TPM_STS_VALID;
532 		to++;
533 		goto again;
534 	}
535 
536 	if ((sc->sc_stat & b) != b) {
537 #ifdef TPM_DEBUG
538 		char bbuf[128], cbuf[128];
539 		snprintb(bbuf, sizeof(bbuf), TPM_STS_BITS, b);
540 		snprintb(cbuf, sizeof(cbuf), TPM_STS_BITS, sc->sc_stat);
541 		aprint_debug_dev(sc->sc_dev,
542 		    "%s: timeout: stat=%s b=%s\n", __func__, cbuf, bbuf);
543 #endif
544 		if (re-- && (b0 & TPM_STS_VALID)) {
545 			bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_STS,
546 			    TPM_STS_RESP_RETRY);
547 			goto restart;
548 		}
549 		return EIO;
550 	}
551 
552 	return 0;
553 }
554 
555 /* Start transaction. */
556 int
557 tpm_tis12_start(struct tpm_softc *sc, int flag)
558 {
559 	int rv;
560 
561 	if (flag == UIO_READ) {
562 		rv = tpm_waitfor(sc, TPM_STS_DATA_AVAIL | TPM_STS_VALID,
563 		    TPM_READ_TMO, sc->sc_read);
564 		return rv;
565 	}
566 
567 	/* Own our (0th) locality. */
568 	if ((rv = tpm_request_locality(sc, 0)) != 0)
569 		return rv;
570 
571 	sc->sc_stat = tpm_status(sc);
572 	if (sc->sc_stat & TPM_STS_CMD_READY) {
573 #ifdef TPM_DEBUG
574 		char buf[128];
575 		snprintb(buf, sizeof(buf), TPM_STS_BITS, sc->sc_stat);
576 		aprint_debug_dev(sc->sc_dev, "%s: UIO_WRITE status %s\n",
577 		    __func__, buf);
578 #endif
579 		return 0;
580 	}
581 
582 #ifdef TPM_DEBUG
583 	aprint_debug_dev(sc->sc_dev,
584 	    "%s: UIO_WRITE readying chip\n", __func__);
585 #endif
586 
587 	/* Abort previous and restart. */
588 	bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_STS, TPM_STS_CMD_READY);
589 	if ((rv = tpm_waitfor(sc, TPM_STS_CMD_READY, TPM_READY_TMO,
590 	    sc->sc_write))) {
591 #ifdef TPM_DEBUG
592 		aprint_debug_dev(sc->sc_dev,
593 		    "%s: UIO_WRITE readying failed %d\n", __func__, rv);
594 #endif
595 		return rv;
596 	}
597 
598 #ifdef TPM_DEBUG
599 	aprint_debug_dev(sc->sc_dev,
600 	    "%s: UIO_WRITE readying done\n", __func__);
601 #endif
602 
603 	return 0;
604 }
605 
606 int
607 tpm_tis12_read(struct tpm_softc *sc, void *buf, size_t len, size_t *count,
608     int flags)
609 {
610 	uint8_t *p = buf;
611 	size_t cnt;
612 	int rv, n, bcnt;
613 
614 #ifdef TPM_DEBUG
615 	aprint_debug_dev(sc->sc_dev, "%s: len %zu\n", __func__, len);
616 #endif
617 	cnt = 0;
618 	while (len > 0) {
619 		if ((rv = tpm_waitfor(sc, TPM_STS_DATA_AVAIL | TPM_STS_VALID,
620 		    TPM_READ_TMO, sc->sc_read)))
621 			return rv;
622 
623 		bcnt = tpm_getburst(sc);
624 		n = MIN(len, bcnt);
625 #ifdef TPM_DEBUG
626 		aprint_debug_dev(sc->sc_dev,
627 		    "%s: fetching %d, burst is %d\n", __func__, n, bcnt);
628 #endif
629 		for (; n--; len--) {
630 			*p++ = bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_DATA);
631 			cnt++;
632 		}
633 
634 		if ((flags & TPM_PARAM_SIZE) == 0 && cnt >= 6)
635 			break;
636 	}
637 #ifdef TPM_DEBUG
638 	aprint_debug_dev(sc->sc_dev,
639 	    "%s: read %zu bytes, len %zu\n", __func__, cnt, len);
640 #endif
641 
642 	if (count)
643 		*count = cnt;
644 
645 	return 0;
646 }
647 
648 int
649 tpm_tis12_write(struct tpm_softc *sc, const void *buf, size_t len)
650 {
651 	const uint8_t *p = buf;
652 	size_t cnt;
653 	int rv, r;
654 
655 #ifdef TPM_DEBUG
656 	aprint_debug_dev(sc->sc_dev,
657 	    "%s: sc %p buf %p len %zu\n", __func__, sc, buf, len);
658 #endif
659 	if (len == 0)
660 		return 0;
661 
662 	if ((rv = tpm_request_locality(sc, 0)) != 0)
663 		return rv;
664 
665 	cnt = 0;
666 	while (cnt < len - 1) {
667 		for (r = tpm_getburst(sc); r > 0 && cnt < len - 1; r--) {
668 			bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_DATA, *p++);
669 			cnt++;
670 		}
671 		if ((rv = tpm_waitfor(sc, TPM_STS_VALID, TPM_READ_TMO, sc))) {
672 #ifdef TPM_DEBUG
673 			aprint_debug_dev(sc->sc_dev,
674 			    "%s: failed burst rv %d\n", __func__, rv);
675 #endif
676 			return rv;
677 		}
678 		sc->sc_stat = tpm_status(sc);
679 		if (!(sc->sc_stat & TPM_STS_DATA_EXPECT)) {
680 #ifdef TPM_DEBUG
681 			char sbuf[128];
682 			snprintb(sbuf, sizeof(sbuf), TPM_STS_BITS, sc->sc_stat);
683 			aprint_debug_dev(sc->sc_dev,
684 			    "%s: failed rv %d stat=%s\n", __func__, rv, sbuf);
685 #endif
686 			return EIO;
687 		}
688 	}
689 
690 	bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_DATA, *p++);
691 	cnt++;
692 
693 	if ((rv = tpm_waitfor(sc, TPM_STS_VALID, TPM_READ_TMO, sc))) {
694 #ifdef TPM_DEBUG
695 		aprint_debug_dev(sc->sc_dev, "%s: failed last byte rv %d\n",
696 		    __func__, rv);
697 #endif
698 		return rv;
699 	}
700 	if ((sc->sc_stat & TPM_STS_DATA_EXPECT) != 0) {
701 #ifdef TPM_DEBUG
702 		char sbuf[128];
703 		snprintb(sbuf, sizeof(sbuf), TPM_STS_BITS, sc->sc_stat);
704 		aprint_debug_dev(sc->sc_dev,
705 		    "%s: failed rv %d stat=%s\n", __func__, rv, sbuf);
706 #endif
707 		return EIO;
708 	}
709 
710 #ifdef TPM_DEBUG
711 	aprint_debug_dev(sc->sc_dev, "%s: wrote %zu byte\n", __func__, cnt);
712 #endif
713 
714 	return 0;
715 }
716 
717 /* Finish transaction. */
718 int
719 tpm_tis12_end(struct tpm_softc *sc, int flag, int err)
720 {
721 	int rv = 0;
722 
723 	if (flag == UIO_READ) {
724 		if ((rv = tpm_waitfor(sc, TPM_STS_VALID, TPM_READ_TMO,
725 		    sc->sc_read)))
726 			return rv;
727 
728 		/* Still more data? */
729 		sc->sc_stat = tpm_status(sc);
730 		if (!err && ((sc->sc_stat & TPM_STS_DATA_AVAIL)
731 		    == TPM_STS_DATA_AVAIL)) {
732 #ifdef TPM_DEBUG
733 			char buf[128];
734 			snprintb(buf, sizeof(buf), TPM_STS_BITS, sc->sc_stat);
735 			aprint_debug_dev(sc->sc_dev,
736 			    "%s: read failed stat=%s\n", __func__, buf);
737 #endif
738 			rv = EIO;
739 		}
740 
741 		bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_STS,
742 		    TPM_STS_CMD_READY);
743 
744 		/* Release our (0th) locality. */
745 		bus_space_write_1(sc->sc_bt, sc->sc_bh,TPM_ACCESS,
746 		    TPM_ACCESS_ACTIVE_LOCALITY);
747 	} else {
748 		/* Hungry for more? */
749 		sc->sc_stat = tpm_status(sc);
750 		if (!err && (sc->sc_stat & TPM_STS_DATA_EXPECT)) {
751 #ifdef TPM_DEBUG
752 			char buf[128];
753 			snprintb(buf, sizeof(buf), TPM_STS_BITS, sc->sc_stat);
754 			aprint_debug_dev(sc->sc_dev,
755 			    "%s: write failed stat=%s\n", __func__, buf);
756 #endif
757 			rv = EIO;
758 		}
759 
760 		bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_STS,
761 		    err ? TPM_STS_CMD_READY : TPM_STS_GO);
762 	}
763 
764 	return rv;
765 }
766 
767 int
768 tpm_intr(void *v)
769 {
770 	struct tpm_softc *sc = v;
771 	uint32_t r;
772 #ifdef TPM_DEBUG
773 	static int cnt = 0;
774 #endif
775 
776 	r = bus_space_read_4(sc->sc_bt, sc->sc_bh, TPM_INT_STATUS);
777 #ifdef TPM_DEBUG
778 	if (r != 0) {
779 		char buf[128];
780 		snprintb(buf, sizeof(buf), TPM_INTERRUPT_ENABLE_BITS, r);
781 		aprint_debug_dev(sc->sc_dev, "%s: int=%s (%d)\n", __func__,
782 		    buf, cnt);
783 	} else
784 		cnt++;
785 #endif
786 	if (!(r & (TPM_CMD_READY_INT | TPM_LOCALITY_CHANGE_INT |
787 	    TPM_STS_VALID_INT | TPM_DATA_AVAIL_INT)))
788 #ifdef __FreeBSD__
789 		return;
790 #else
791 		return 0;
792 #endif
793 	if (r & TPM_STS_VALID_INT)
794 		wakeup(sc);
795 
796 	if (r & TPM_CMD_READY_INT)
797 		wakeup(sc->sc_write);
798 
799 	if (r & TPM_DATA_AVAIL_INT)
800 		wakeup(sc->sc_read);
801 
802 	if (r & TPM_LOCALITY_CHANGE_INT)
803 		wakeup(sc->sc_init);
804 
805 	bus_space_write_4(sc->sc_bt, sc->sc_bh, TPM_INT_STATUS, r);
806 
807 	return 1;
808 }
809 
810 /* Read single byte using legacy interface. */
811 static inline uint8_t
812 tpm_legacy_in(bus_space_tag_t iot, bus_space_handle_t ioh, int reg)
813 {
814 	bus_space_write_1(iot, ioh, 0, reg);
815 	return bus_space_read_1(iot, ioh, 1);
816 }
817 
818 /* Probe for TPM using legacy interface. */
819 int
820 tpm_legacy_probe(bus_space_tag_t iot, bus_addr_t iobase)
821 {
822 	bus_space_handle_t ioh;
823 	uint8_t r, v;
824 	int i, rv = 0;
825 	char id[8];
826 
827 	if (!tpm_enabled || iobase == -1)
828 		return 0;
829 
830 	if (bus_space_map(iot, iobase, 2, 0, &ioh))
831 		return 0;
832 
833 	v = bus_space_read_1(iot, ioh, 0);
834 	if (v == 0xff) {
835 		bus_space_unmap(iot, ioh, 2);
836 		return 0;
837 	}
838 	r = bus_space_read_1(iot, ioh, 1);
839 
840 	for (i = sizeof(id); i--; )
841 		id[i] = tpm_legacy_in(iot, ioh, TPM_ID + i);
842 
843 #ifdef TPM_DEBUG
844 	printf("tpm_legacy_probe %.4s %d.%d.%d.%d\n",
845 	    &id[4], id[0], id[1], id[2], id[3]);
846 #endif
847 	/*
848 	 * The only chips using the legacy interface we are aware of are
849 	 * by Atmel.  For other chips more signature would have to be added.
850 	 */
851 	if (!bcmp(&id[4], "ATML", 4))
852 		rv = 1;
853 
854 	if (!rv) {
855 		bus_space_write_1(iot, ioh, r, 1);
856 		bus_space_write_1(iot, ioh, v, 0);
857 	}
858 	bus_space_unmap(iot, ioh, 2);
859 
860 	return rv;
861 }
862 
863 /* Setup TPM using legacy interface. */
864 int
865 tpm_legacy_init(struct tpm_softc *sc, int irq, const char *name)
866 {
867 	char id[8];
868 	int i;
869 
870 	if ((i = bus_space_map(sc->sc_batm, tpm_enabled, 2, 0, &sc->sc_bahm))) {
871 		aprint_debug_dev(sc->sc_dev, "cannot map tpm registers (%d)\n",
872 		    i);
873 		tpm_enabled = 0;
874 		return 1;
875 	}
876 
877 	for (i = sizeof(id); i--; )
878 		id[i] = tpm_legacy_in(sc->sc_bt, sc->sc_bh, TPM_ID + i);
879 
880 	aprint_debug_dev(sc->sc_dev, "%.4s %d.%d @0x%x\n", &id[4], id[0],
881 	    id[1], tpm_enabled);
882 	tpm_enabled = 0;
883 
884 	return 0;
885 }
886 
887 /* Start transaction. */
888 int
889 tpm_legacy_start(struct tpm_softc *sc, int flag)
890 {
891 	struct timeval tv;
892 	uint8_t bits, r;
893 	int to, rv;
894 
895 	bits = flag == UIO_READ ? TPM_LEGACY_DA : 0;
896 	tv.tv_sec = TPM_LEGACY_TMO;
897 	tv.tv_usec = 0;
898 	to = tvtohz(&tv) / TPM_LEGACY_SLEEP;
899 	while (((r = bus_space_read_1(sc->sc_batm, sc->sc_bahm, 1)) &
900 	    (TPM_LEGACY_BUSY|bits)) != bits && to--) {
901 		rv = tsleep(sc, PRIBIO | PCATCH, "legacy_tpm_start",
902 		    TPM_LEGACY_SLEEP);
903 		if (rv && rv != EWOULDBLOCK)
904 			return rv;
905 	}
906 
907 #if defined(TPM_DEBUG) && !defined(__FreeBSD__)
908 	char buf[128];
909 	snprintb(buf, sizeof(buf), TPM_LEGACY_BITS, r);
910 	aprint_debug_dev(sc->sc_dev, "%s: bits %s\n", device_xname(sc->sc_dev),
911 	    buf);
912 #endif
913 	if ((r & (TPM_LEGACY_BUSY|bits)) != bits)
914 		return EIO;
915 
916 	return 0;
917 }
918 
919 int
920 tpm_legacy_read(struct tpm_softc *sc, void *buf, size_t len, size_t *count,
921     int flags)
922 {
923 	uint8_t *p;
924 	size_t cnt;
925 	int to, rv;
926 
927 	cnt = rv = 0;
928 	for (p = buf; !rv && len > 0; len--) {
929 		for (to = 1000;
930 		    !(bus_space_read_1(sc->sc_batm, sc->sc_bahm, 1) &
931 		    TPM_LEGACY_DA); DELAY(1))
932 			if (!to--)
933 				return EIO;
934 
935 		DELAY(TPM_LEGACY_DELAY);
936 		*p++ = bus_space_read_1(sc->sc_batm, sc->sc_bahm, 0);
937 		cnt++;
938 	}
939 
940 	*count = cnt;
941 	return 0;
942 }
943 
944 int
945 tpm_legacy_write(struct tpm_softc *sc, const void *buf, size_t len)
946 {
947 	const uint8_t *p;
948 	size_t n;
949 
950 	for (p = buf, n = len; n--; DELAY(TPM_LEGACY_DELAY)) {
951 		if (!n && len != TPM_BUFSIZ) {
952 			bus_space_write_1(sc->sc_batm, sc->sc_bahm, 1,
953 			    TPM_LEGACY_LAST);
954 			DELAY(TPM_LEGACY_DELAY);
955 		}
956 		bus_space_write_1(sc->sc_batm, sc->sc_bahm, 0, *p++);
957 	}
958 
959 	return 0;
960 }
961 
962 /* Finish transaction. */
963 int
964 tpm_legacy_end(struct tpm_softc *sc, int flag, int rv)
965 {
966 	struct timeval tv;
967 	uint8_t r;
968 	int to;
969 
970 	if (rv || flag == UIO_READ)
971 		bus_space_write_1(sc->sc_batm, sc->sc_bahm, 1, TPM_LEGACY_ABRT);
972 	else {
973 		tv.tv_sec = TPM_LEGACY_TMO;
974 		tv.tv_usec = 0;
975 		to = tvtohz(&tv) / TPM_LEGACY_SLEEP;
976 		while(((r = bus_space_read_1(sc->sc_batm, sc->sc_bahm, 1)) &
977 		    TPM_LEGACY_BUSY) && to--) {
978 			rv = tsleep(sc, PRIBIO | PCATCH, "legacy_tpm_end",
979 			    TPM_LEGACY_SLEEP);
980 			if (rv && rv != EWOULDBLOCK)
981 				return rv;
982 		}
983 
984 #if defined(TPM_DEBUG) && !defined(__FreeBSD__)
985 		char buf[128];
986 		snprintb(buf, sizeof(buf), TPM_LEGACY_BITS, r);
987 		aprint_debug_dev(sc->sc_dev, "%s: bits %s\n",
988 		    device_xname(sc->sc_dev), buf);
989 #endif
990 		if (r & TPM_LEGACY_BUSY)
991 			return EIO;
992 
993 		if (r & TPM_LEGACY_RE)
994 			return EIO;	/* XXX Retry the loop? */
995 	}
996 
997 	return rv;
998 }
999 
1000 int
1001 tpmopen(dev_t dev, int flag, int mode, struct lwp *l)
1002 {
1003 	struct tpm_softc *sc = device_lookup_private(&tpm_cd, TPMUNIT(dev));
1004 
1005 	if (!sc)
1006 		return ENXIO;
1007 
1008 	if (sc->sc_flags & TPM_OPEN)
1009 		return EBUSY;
1010 
1011 	sc->sc_flags |= TPM_OPEN;
1012 
1013 	return 0;
1014 }
1015 
1016 int
1017 tpmclose(dev_t dev, int flag, int mode, struct lwp *l)
1018 {
1019 	struct tpm_softc *sc = device_lookup_private(&tpm_cd, TPMUNIT(dev));
1020 
1021 	if (!sc)
1022 		return ENXIO;
1023 
1024 	if (!(sc->sc_flags & TPM_OPEN))
1025 		return EINVAL;
1026 
1027 	sc->sc_flags &= ~TPM_OPEN;
1028 
1029 	return 0;
1030 }
1031 
1032 int
1033 tpmread(dev_t dev, struct uio *uio, int flags)
1034 {
1035 	struct tpm_softc *sc = device_lookup_private(&tpm_cd, TPMUNIT(dev));
1036 	uint8_t buf[TPM_BUFSIZ], *p;
1037 	size_t cnt, len, n;
1038 	int  rv, s;
1039 
1040 	if (!sc)
1041 		return ENXIO;
1042 
1043 	s = spltty();
1044 	if ((rv = (*sc->sc_start)(sc, UIO_READ)))
1045 		goto out;
1046 
1047 #ifdef TPM_DEBUG
1048 	aprint_debug_dev(sc->sc_dev, "%s: getting header\n", __func__);
1049 #endif
1050 	if ((rv = (*sc->sc_read)(sc, buf, TPM_HDRSIZE, &cnt, 0))) {
1051 		(*sc->sc_end)(sc, UIO_READ, rv);
1052 		goto out;
1053 	}
1054 
1055 	len = (buf[2] << 24) | (buf[3] << 16) | (buf[4] << 8) | buf[5];
1056 #ifdef TPM_DEBUG
1057 	aprint_debug_dev(sc->sc_dev, "%s: len %zu, io count %zu\n", __func__,
1058 	    len, uio->uio_resid);
1059 #endif
1060 	if (len > uio->uio_resid) {
1061 		rv = EIO;
1062 		(*sc->sc_end)(sc, UIO_READ, rv);
1063 #ifdef TPM_DEBUG
1064 		aprint_debug_dev(sc->sc_dev,
1065 		    "%s: bad residual io count 0x%zx\n", __func__,
1066 		    uio->uio_resid);
1067 #endif
1068 		goto out;
1069 	}
1070 
1071 	/* Copy out header. */
1072 	if ((rv = uiomove(buf, cnt, uio))) {
1073 #ifdef TPM_DEBUG
1074 		aprint_debug_dev(sc->sc_dev,
1075 		    "%s: uiomove failed %d\n", __func__, rv);
1076 #endif
1077 		(*sc->sc_end)(sc, UIO_READ, rv);
1078 		goto out;
1079 	}
1080 
1081 	/* Get remaining part of the answer (if anything is left). */
1082 	for (len -= cnt, p = buf, n = sizeof(buf); len > 0; p = buf, len -= n,
1083 	    n = sizeof(buf)) {
1084 		n = MIN(n, len);
1085 #ifdef TPM_DEBUG
1086 		aprint_debug_dev(sc->sc_dev, "%s: n %zu len %zu\n", __func__,
1087 		    n, len);
1088 #endif
1089 		if ((rv = (*sc->sc_read)(sc, p, n, NULL, TPM_PARAM_SIZE))) {
1090 			(*sc->sc_end)(sc, UIO_READ, rv);
1091 			goto out;
1092 		}
1093 		p += n;
1094 		if ((rv = uiomove(buf, p - buf, uio))) {
1095 #ifdef TPM_DEBUG
1096 			aprint_debug_dev(sc->sc_dev,
1097 			    "%s: uiomove failed %d\n", __func__, rv);
1098 #endif
1099 			(*sc->sc_end)(sc, UIO_READ, rv);
1100 			goto out;
1101 		}
1102 	}
1103 
1104 	rv = (*sc->sc_end)(sc, UIO_READ, rv);
1105 out:
1106 	splx(s);
1107 	return rv;
1108 }
1109 
1110 int
1111 tpmwrite(dev_t dev, struct uio *uio, int flags)
1112 {
1113 	struct tpm_softc *sc = device_lookup_private(&tpm_cd, TPMUNIT(dev));
1114 	uint8_t buf[TPM_BUFSIZ];
1115 	int n, rv, s;
1116 
1117 	if (!sc)
1118 		return ENXIO;
1119 
1120 	s = spltty();
1121 
1122 #ifdef TPM_DEBUG
1123 	aprint_debug_dev(sc->sc_dev, "%s: io count %zu\n", __func__,
1124 	    uio->uio_resid);
1125 #endif
1126 
1127 	n = MIN(sizeof(buf), uio->uio_resid);
1128 	if ((rv = uiomove(buf, n, uio))) {
1129 #ifdef TPM_DEBUG
1130 		aprint_debug_dev(sc->sc_dev,
1131 		    "%s: uiomove failed %d\n", __func__, rv);
1132 #endif
1133 		splx(s);
1134 		return rv;
1135 	}
1136 
1137 	if ((rv = (*sc->sc_start)(sc, UIO_WRITE))) {
1138 		splx(s);
1139 		return rv;
1140 	}
1141 
1142 	if ((rv = (*sc->sc_write)(sc, buf, n))) {
1143 		splx(s);
1144 		return rv;
1145 	}
1146 
1147 	rv = (*sc->sc_end)(sc, UIO_WRITE, rv);
1148 	splx(s);
1149 	return rv;
1150 }
1151 
1152 int
1153 tpmioctl(dev_t dev, u_long cmd, void *data, int flags, struct lwp *l)
1154 {
1155 	return ENOTTY;
1156 }
1157