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