1 1.29 riastrad /* $NetBSD: tpm.c,v 1.29 2024/05/14 13:41:15 riastradh Exp $ */ 2 1.13 maxv 3 1.13 maxv /* 4 1.13 maxv * Copyright (c) 2019 The NetBSD Foundation, Inc. 5 1.13 maxv * All rights reserved. 6 1.13 maxv * 7 1.13 maxv * This code is derived from software contributed to The NetBSD Foundation 8 1.13 maxv * by Maxime Villard. 9 1.13 maxv * 10 1.13 maxv * Redistribution and use in source and binary forms, with or without 11 1.13 maxv * modification, are permitted provided that the following conditions 12 1.13 maxv * are met: 13 1.13 maxv * 1. Redistributions of source code must retain the above copyright 14 1.13 maxv * notice, this list of conditions and the following disclaimer. 15 1.13 maxv * 2. Redistributions in binary form must reproduce the above copyright 16 1.13 maxv * notice, this list of conditions and the following disclaimer in the 17 1.13 maxv * documentation and/or other materials provided with the distribution. 18 1.13 maxv * 19 1.13 maxv * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.13 maxv * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.13 maxv * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.13 maxv * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.13 maxv * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.13 maxv * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.13 maxv * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.13 maxv * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.13 maxv * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.13 maxv * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.13 maxv * POSSIBILITY OF SUCH DAMAGE. 30 1.13 maxv */ 31 1.13 maxv 32 1.1 christos /* 33 1.1 christos * Copyright (c) 2008, 2009 Michael Shalayeff 34 1.13 maxv * Copyright (c) 2009, 2010 Hans-Joerg Hoexer 35 1.1 christos * All rights reserved. 36 1.1 christos * 37 1.1 christos * Permission to use, copy, modify, and distribute this software for any 38 1.1 christos * purpose with or without fee is hereby granted, provided that the above 39 1.1 christos * copyright notice and this permission notice appear in all copies. 40 1.1 christos * 41 1.1 christos * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 42 1.1 christos * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 43 1.1 christos * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 44 1.1 christos * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 45 1.1 christos * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN 46 1.1 christos * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 47 1.1 christos * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 48 1.1 christos */ 49 1.1 christos 50 1.1 christos #include <sys/cdefs.h> 51 1.29 riastrad __KERNEL_RCSID(0, "$NetBSD: tpm.c,v 1.29 2024/05/14 13:41:15 riastradh Exp $"); 52 1.1 christos 53 1.1 christos #include <sys/param.h> 54 1.17 riastrad #include <sys/types.h> 55 1.17 riastrad 56 1.19 riastrad #include <sys/atomic.h> 57 1.17 riastrad #include <sys/bus.h> 58 1.17 riastrad #include <sys/conf.h> 59 1.17 riastrad #include <sys/device.h> 60 1.1 christos #include <sys/kernel.h> 61 1.17 riastrad #include <sys/pmf.h> 62 1.1 christos #include <sys/proc.h> 63 1.17 riastrad #include <sys/systm.h> 64 1.19 riastrad #include <sys/workqueue.h> 65 1.1 christos 66 1.1 christos #include <dev/ic/tpmreg.h> 67 1.1 christos #include <dev/ic/tpmvar.h> 68 1.1 christos 69 1.12 riastrad #include "ioconf.h" 70 1.12 riastrad 71 1.15 maxv CTASSERT(sizeof(struct tpm_header) == 10); 72 1.15 maxv 73 1.13 maxv #define TPM_BUFSIZ 1024 74 1.14 maxv 75 1.13 maxv #define TPM_PARAM_SIZE 0x0001 /* that's a flag */ 76 1.13 maxv 77 1.13 maxv /* Timeouts. */ 78 1.13 maxv #define TPM_ACCESS_TMO 2000 /* 2sec */ 79 1.13 maxv #define TPM_READY_TMO 2000 /* 2sec */ 80 1.13 maxv #define TPM_READ_TMO 2000 /* 2sec */ 81 1.13 maxv #define TPM_BURST_TMO 2000 /* 2sec */ 82 1.13 maxv 83 1.13 maxv #define TPM_CAPS_REQUIRED \ 84 1.13 maxv (TPM_INTF_DATA_AVAIL_INT|TPM_INTF_LOCALITY_CHANGE_INT| \ 85 1.13 maxv TPM_INTF_INT_LEVEL_LOW) 86 1.1 christos 87 1.13 maxv static inline int 88 1.13 maxv tpm_tmotohz(int tmo) 89 1.1 christos { 90 1.13 maxv struct timeval tv; 91 1.1 christos 92 1.13 maxv tv.tv_sec = tmo / 1000; 93 1.13 maxv tv.tv_usec = 1000 * (tmo % 1000); 94 1.1 christos 95 1.13 maxv return tvtohz(&tv); 96 1.1 christos } 97 1.1 christos 98 1.13 maxv static int 99 1.1 christos tpm_getburst(struct tpm_softc *sc) 100 1.1 christos { 101 1.1 christos int burst, to, rv; 102 1.1 christos 103 1.1 christos to = tpm_tmotohz(TPM_BURST_TMO); 104 1.1 christos 105 1.13 maxv while (to--) { 106 1.1 christos /* 107 1.13 maxv * Burst count is in bits 23:8, so read the two higher bytes. 108 1.1 christos */ 109 1.1 christos burst = bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_STS + 1); 110 1.1 christos burst |= bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_STS + 2) 111 1.1 christos << 8; 112 1.13 maxv 113 1.1 christos if (burst) 114 1.1 christos return burst; 115 1.1 christos 116 1.28 riastrad rv = kpause("tpm_getburst", /*intr*/true, /*timo*/1, 117 1.28 riastrad /*lock*/NULL); 118 1.1 christos if (rv && rv != EWOULDBLOCK) { 119 1.1 christos return 0; 120 1.1 christos } 121 1.1 christos } 122 1.1 christos 123 1.1 christos return 0; 124 1.1 christos } 125 1.1 christos 126 1.13 maxv static inline uint8_t 127 1.1 christos tpm_status(struct tpm_softc *sc) 128 1.1 christos { 129 1.13 maxv return bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_STS) & 130 1.13 maxv TPM_STS_STATUS_BITS; 131 1.1 christos } 132 1.1 christos 133 1.13 maxv /* -------------------------------------------------------------------------- */ 134 1.1 christos 135 1.15 maxv static bool 136 1.15 maxv tpm12_suspend(struct tpm_softc *sc) 137 1.15 maxv { 138 1.15 maxv static const uint8_t command[10] = { 139 1.15 maxv 0x00, 0xC1, /* TPM_TAG_RQU_COMMAND */ 140 1.15 maxv 0x00, 0x00, 0x00, 10, /* Length in bytes */ 141 1.15 maxv 0x00, 0x00, 0x00, 0x98 /* TPM_ORD_SaveState */ 142 1.15 maxv }; 143 1.15 maxv struct tpm_header response; 144 1.24 riastrad size_t nread; 145 1.24 riastrad bool endwrite = false, endread = false; 146 1.24 riastrad int error; 147 1.24 riastrad 148 1.24 riastrad /* 149 1.24 riastrad * Write the command. 150 1.24 riastrad */ 151 1.24 riastrad error = (*sc->sc_intf->start)(sc, UIO_WRITE); 152 1.24 riastrad if (error) { 153 1.29 riastrad device_printf(sc->sc_dev, "start write failed: %d\n", error); 154 1.24 riastrad goto out; 155 1.24 riastrad } 156 1.24 riastrad 157 1.24 riastrad endwrite = true; 158 1.24 riastrad 159 1.24 riastrad error = (*sc->sc_intf->write)(sc, &command, sizeof(command)); 160 1.24 riastrad if (error) { 161 1.29 riastrad device_printf(sc->sc_dev, "write TPM_ORD_SaveState failed:" 162 1.29 riastrad " %d\n", error); 163 1.24 riastrad goto out; 164 1.24 riastrad } 165 1.24 riastrad 166 1.24 riastrad endwrite = false; 167 1.24 riastrad 168 1.24 riastrad error = (*sc->sc_intf->end)(sc, UIO_WRITE, 0); 169 1.24 riastrad if (error) { 170 1.29 riastrad device_printf(sc->sc_dev, "end write failed: %d\n", error); 171 1.24 riastrad goto out; 172 1.24 riastrad } 173 1.24 riastrad 174 1.24 riastrad /* 175 1.24 riastrad * Read the response -- just the header; we don't expect a 176 1.24 riastrad * payload. 177 1.24 riastrad */ 178 1.24 riastrad error = (*sc->sc_intf->start)(sc, UIO_READ); 179 1.24 riastrad if (error) { 180 1.29 riastrad device_printf(sc->sc_dev, "start read failed: %d\n", error); 181 1.24 riastrad goto out; 182 1.24 riastrad } 183 1.24 riastrad 184 1.24 riastrad endread = true; 185 1.24 riastrad 186 1.24 riastrad error = (*sc->sc_intf->read)(sc, &response, sizeof(response), &nread, 187 1.24 riastrad 0); 188 1.24 riastrad if (error) { 189 1.29 riastrad device_printf(sc->sc_dev, "read failed: %d\n", error); 190 1.24 riastrad goto out; 191 1.24 riastrad } 192 1.24 riastrad if (nread != sizeof(response)) { 193 1.29 riastrad device_printf(sc->sc_dev, "short header read: %zu\n", nread); 194 1.24 riastrad goto out; 195 1.24 riastrad } 196 1.24 riastrad 197 1.24 riastrad endread = false; 198 1.24 riastrad 199 1.24 riastrad error = (*sc->sc_intf->end)(sc, UIO_READ, 0); 200 1.24 riastrad if (error) { 201 1.29 riastrad device_printf(sc->sc_dev, "end read failed: %d\n", error); 202 1.24 riastrad goto out; 203 1.24 riastrad } 204 1.24 riastrad 205 1.24 riastrad /* 206 1.24 riastrad * Verify the response looks reasonable. 207 1.24 riastrad */ 208 1.25 riastrad if (be16toh(response.tag) != TPM_TAG_RSP_COMMAND || 209 1.25 riastrad be32toh(response.length) != sizeof(response) || 210 1.25 riastrad be32toh(response.code) != 0) { 211 1.24 riastrad device_printf(sc->sc_dev, 212 1.29 riastrad "TPM_ORD_SaveState failed:" 213 1.29 riastrad " tag=0x%x length=0x%x code=0x%x\n", 214 1.25 riastrad be16toh(response.tag), 215 1.25 riastrad be32toh(response.length), 216 1.25 riastrad be32toh(response.code)); 217 1.24 riastrad error = EIO; 218 1.24 riastrad goto out; 219 1.24 riastrad } 220 1.24 riastrad 221 1.24 riastrad /* Success! */ 222 1.24 riastrad error = 0; 223 1.15 maxv 224 1.24 riastrad out: if (endwrite) 225 1.24 riastrad error = (*sc->sc_intf->end)(sc, UIO_WRITE, error); 226 1.24 riastrad if (endread) 227 1.24 riastrad error = (*sc->sc_intf->end)(sc, UIO_READ, error); 228 1.24 riastrad if (error) 229 1.15 maxv return false; 230 1.15 maxv return true; 231 1.15 maxv } 232 1.1 christos 233 1.15 maxv static bool 234 1.15 maxv tpm20_suspend(struct tpm_softc *sc) 235 1.1 christos { 236 1.15 maxv static const uint8_t command[12] = { 237 1.15 maxv 0x80, 0x01, /* TPM_ST_NO_SESSIONS */ 238 1.15 maxv 0x00, 0x00, 0x00, 12, /* Length in bytes */ 239 1.15 maxv 0x00, 0x00, 0x01, 0x45, /* TPM_CC_Shutdown */ 240 1.15 maxv 0x00, 0x01 /* TPM_SU_STATE */ 241 1.1 christos }; 242 1.15 maxv struct tpm_header response; 243 1.24 riastrad size_t nread; 244 1.24 riastrad bool endwrite = false, endread = false; 245 1.24 riastrad int error; 246 1.24 riastrad 247 1.24 riastrad /* 248 1.24 riastrad * Write the command. 249 1.24 riastrad */ 250 1.24 riastrad error = (*sc->sc_intf->start)(sc, UIO_WRITE); 251 1.24 riastrad if (error) { 252 1.29 riastrad device_printf(sc->sc_dev, "start write failed: %d\n", error); 253 1.24 riastrad goto out; 254 1.24 riastrad } 255 1.24 riastrad 256 1.24 riastrad endwrite = true; 257 1.24 riastrad 258 1.24 riastrad error = (*sc->sc_intf->write)(sc, &command, sizeof(command)); 259 1.24 riastrad if (error) { 260 1.29 riastrad device_printf(sc->sc_dev, "write TPM_ORD_SaveState failed:" 261 1.29 riastrad " %d\n", error); 262 1.24 riastrad goto out; 263 1.24 riastrad } 264 1.1 christos 265 1.24 riastrad endwrite = false; 266 1.24 riastrad 267 1.24 riastrad error = (*sc->sc_intf->end)(sc, UIO_WRITE, 0); 268 1.24 riastrad if (error) { 269 1.29 riastrad device_printf(sc->sc_dev, "end write failed: %d\n", error); 270 1.24 riastrad goto out; 271 1.24 riastrad } 272 1.24 riastrad 273 1.24 riastrad /* 274 1.24 riastrad * Read the response -- just the header; we don't expect a 275 1.24 riastrad * payload. 276 1.24 riastrad */ 277 1.24 riastrad error = (*sc->sc_intf->start)(sc, UIO_READ); 278 1.24 riastrad if (error) { 279 1.29 riastrad device_printf(sc->sc_dev, "start read failed: %d\n", error); 280 1.24 riastrad goto out; 281 1.24 riastrad } 282 1.24 riastrad 283 1.24 riastrad endread = true; 284 1.24 riastrad 285 1.24 riastrad error = (*sc->sc_intf->read)(sc, &response, sizeof(response), &nread, 286 1.24 riastrad 0); 287 1.24 riastrad if (error) { 288 1.29 riastrad device_printf(sc->sc_dev, "read failed: %d\n", error); 289 1.24 riastrad goto out; 290 1.24 riastrad } 291 1.24 riastrad if (nread != sizeof(response)) { 292 1.29 riastrad device_printf(sc->sc_dev, "short header read: %zu\n", nread); 293 1.24 riastrad goto out; 294 1.24 riastrad } 295 1.24 riastrad 296 1.24 riastrad endread = false; 297 1.24 riastrad 298 1.24 riastrad error = (*sc->sc_intf->end)(sc, UIO_READ, 0); 299 1.24 riastrad if (error) { 300 1.29 riastrad device_printf(sc->sc_dev, "end read failed: %d\n", error); 301 1.24 riastrad goto out; 302 1.24 riastrad } 303 1.24 riastrad 304 1.24 riastrad /* 305 1.24 riastrad * Verify the response looks reasonable. 306 1.24 riastrad */ 307 1.25 riastrad if (be16toh(response.tag) != TPM2_ST_NO_SESSIONS || 308 1.25 riastrad be32toh(response.length) != sizeof(response) || 309 1.25 riastrad be32toh(response.code) != TPM2_RC_SUCCESS) { 310 1.24 riastrad device_printf(sc->sc_dev, 311 1.29 riastrad "TPM_CC_Shutdown failed: tag=0x%x length=0x%x code=0x%x\n", 312 1.25 riastrad be16toh(response.tag), 313 1.25 riastrad be32toh(response.length), 314 1.25 riastrad be32toh(response.code)); 315 1.24 riastrad error = EIO; 316 1.24 riastrad goto out; 317 1.24 riastrad } 318 1.24 riastrad 319 1.24 riastrad /* Success! */ 320 1.24 riastrad error = 0; 321 1.24 riastrad 322 1.24 riastrad out: if (endwrite) 323 1.24 riastrad error = (*sc->sc_intf->end)(sc, UIO_WRITE, error); 324 1.24 riastrad if (endread) 325 1.24 riastrad error = (*sc->sc_intf->end)(sc, UIO_READ, error); 326 1.24 riastrad if (error) 327 1.15 maxv return false; 328 1.7 christos return true; 329 1.1 christos } 330 1.1 christos 331 1.1 christos bool 332 1.15 maxv tpm_suspend(device_t dev, const pmf_qual_t *qual) 333 1.1 christos { 334 1.15 maxv struct tpm_softc *sc = device_private(dev); 335 1.15 maxv 336 1.15 maxv switch (sc->sc_ver) { 337 1.15 maxv case TPM_1_2: 338 1.15 maxv return tpm12_suspend(sc); 339 1.15 maxv case TPM_2_0: 340 1.15 maxv return tpm20_suspend(sc); 341 1.15 maxv default: 342 1.15 maxv panic("%s: impossible", __func__); 343 1.15 maxv } 344 1.15 maxv } 345 1.15 maxv 346 1.15 maxv bool 347 1.15 maxv tpm_resume(device_t dev, const pmf_qual_t *qual) 348 1.15 maxv { 349 1.15 maxv /* 350 1.15 maxv * Don't do anything, the BIOS is supposed to restore the previously 351 1.15 maxv * saved state. 352 1.15 maxv */ 353 1.7 christos return true; 354 1.1 christos } 355 1.1 christos 356 1.13 maxv /* -------------------------------------------------------------------------- */ 357 1.13 maxv 358 1.13 maxv static int 359 1.14 maxv tpm_poll(struct tpm_softc *sc, uint8_t mask, int to, wchan_t chan) 360 1.1 christos { 361 1.1 christos int rv; 362 1.1 christos 363 1.13 maxv while (((sc->sc_status = tpm_status(sc)) & mask) != mask && to--) { 364 1.28 riastrad rv = kpause("tpm_poll", /*intr*/true, /*timo*/1, /*lock*/NULL); 365 1.1 christos if (rv && rv != EWOULDBLOCK) { 366 1.1 christos return rv; 367 1.1 christos } 368 1.1 christos } 369 1.1 christos 370 1.1 christos return 0; 371 1.1 christos } 372 1.1 christos 373 1.13 maxv static int 374 1.13 maxv tpm_waitfor(struct tpm_softc *sc, uint8_t bits, int tmo, wchan_t chan) 375 1.1 christos { 376 1.13 maxv int retry, to, rv; 377 1.13 maxv uint8_t todo; 378 1.1 christos 379 1.14 maxv to = tpm_tmotohz(tmo); 380 1.13 maxv retry = 3; 381 1.13 maxv 382 1.1 christos restart: 383 1.14 maxv todo = bits; 384 1.14 maxv 385 1.1 christos /* 386 1.14 maxv * TPM_STS_VALID has priority over the others. 387 1.1 christos */ 388 1.14 maxv if (todo & TPM_STS_VALID) { 389 1.14 maxv if ((rv = tpm_poll(sc, TPM_STS_VALID, to+1, chan)) != 0) 390 1.14 maxv return rv; 391 1.14 maxv todo &= ~TPM_STS_VALID; 392 1.14 maxv } 393 1.14 maxv 394 1.14 maxv if ((rv = tpm_poll(sc, todo, to, chan)) != 0) 395 1.1 christos return rv; 396 1.1 christos 397 1.13 maxv if ((todo & sc->sc_status) != todo) { 398 1.14 maxv if ((retry-- > 0) && (bits & TPM_STS_VALID)) { 399 1.1 christos bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_STS, 400 1.1 christos TPM_STS_RESP_RETRY); 401 1.1 christos goto restart; 402 1.1 christos } 403 1.1 christos return EIO; 404 1.1 christos } 405 1.1 christos 406 1.1 christos return 0; 407 1.1 christos } 408 1.1 christos 409 1.13 maxv /* -------------------------------------------------------------------------- */ 410 1.13 maxv 411 1.13 maxv /* 412 1.16 maxv * TPM using the TIS 1.2 interface. 413 1.13 maxv */ 414 1.13 maxv 415 1.16 maxv static int 416 1.16 maxv tpm12_request_locality(struct tpm_softc *sc, int l) 417 1.16 maxv { 418 1.16 maxv uint32_t r; 419 1.16 maxv int to, rv; 420 1.16 maxv 421 1.16 maxv if (l != 0) 422 1.16 maxv return EINVAL; 423 1.16 maxv 424 1.16 maxv if ((bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_ACCESS) & 425 1.16 maxv (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY)) == 426 1.16 maxv (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY)) 427 1.16 maxv return 0; 428 1.16 maxv 429 1.16 maxv bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_ACCESS, 430 1.16 maxv TPM_ACCESS_REQUEST_USE); 431 1.16 maxv 432 1.16 maxv to = tpm_tmotohz(TPM_ACCESS_TMO); 433 1.16 maxv 434 1.16 maxv while ((r = bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_ACCESS) & 435 1.16 maxv (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY)) != 436 1.16 maxv (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY) && to--) { 437 1.28 riastrad rv = kpause("tpm_locality", /*intr*/true, /*timo*/1, 438 1.28 riastrad /*lock*/NULL); 439 1.16 maxv if (rv && rv != EWOULDBLOCK) { 440 1.16 maxv return rv; 441 1.16 maxv } 442 1.16 maxv } 443 1.16 maxv 444 1.16 maxv if ((r & (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY)) != 445 1.16 maxv (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY)) { 446 1.16 maxv return EBUSY; 447 1.16 maxv } 448 1.16 maxv 449 1.16 maxv return 0; 450 1.16 maxv } 451 1.16 maxv 452 1.16 maxv static int 453 1.13 maxv tpm_tis12_probe(bus_space_tag_t bt, bus_space_handle_t bh) 454 1.13 maxv { 455 1.13 maxv uint32_t cap; 456 1.13 maxv uint8_t reg; 457 1.13 maxv int tmo; 458 1.13 maxv 459 1.13 maxv cap = bus_space_read_4(bt, bh, TPM_INTF_CAPABILITY); 460 1.13 maxv if (cap == 0xffffffff) 461 1.16 maxv return EINVAL; 462 1.13 maxv if ((cap & TPM_CAPS_REQUIRED) != TPM_CAPS_REQUIRED) 463 1.16 maxv return ENOTSUP; 464 1.13 maxv 465 1.13 maxv /* Request locality 0. */ 466 1.13 maxv bus_space_write_1(bt, bh, TPM_ACCESS, TPM_ACCESS_REQUEST_USE); 467 1.13 maxv 468 1.13 maxv /* Wait for it to become active. */ 469 1.13 maxv tmo = TPM_ACCESS_TMO; /* Milliseconds. */ 470 1.13 maxv while ((reg = bus_space_read_1(bt, bh, TPM_ACCESS) & 471 1.13 maxv (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY)) != 472 1.13 maxv (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY) && tmo--) { 473 1.13 maxv DELAY(1000); /* 1 millisecond. */ 474 1.13 maxv } 475 1.13 maxv if ((reg & (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY)) != 476 1.13 maxv (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY)) { 477 1.16 maxv return ETIMEDOUT; 478 1.13 maxv } 479 1.13 maxv 480 1.13 maxv if (bus_space_read_4(bt, bh, TPM_ID) == 0xffffffff) 481 1.16 maxv return EINVAL; 482 1.13 maxv 483 1.16 maxv return 0; 484 1.13 maxv } 485 1.13 maxv 486 1.21 riastrad static int 487 1.21 riastrad tpm12_rng(struct tpm_softc *sc, unsigned *entropybitsp) 488 1.19 riastrad { 489 1.19 riastrad /* 490 1.19 riastrad * TPM Specification Version 1.2, Main Part 3: Commands, 491 1.19 riastrad * Sec. 13.6 TPM_GetRandom 492 1.19 riastrad */ 493 1.19 riastrad struct { 494 1.19 riastrad struct tpm_header hdr; 495 1.19 riastrad uint32_t bytesRequested; 496 1.19 riastrad } __packed command; 497 1.19 riastrad struct response { 498 1.19 riastrad struct tpm_header hdr; 499 1.19 riastrad uint32_t randomBytesSize; 500 1.19 riastrad uint8_t bytes[64]; 501 1.19 riastrad } __packed response; 502 1.21 riastrad bool endwrite = false, endread = false; 503 1.19 riastrad size_t nread; 504 1.19 riastrad uint16_t tag; 505 1.21 riastrad uint32_t pktlen, code, nbytes, entropybits = 0; 506 1.19 riastrad int rv; 507 1.19 riastrad 508 1.19 riastrad /* Encode the command. */ 509 1.19 riastrad memset(&command, 0, sizeof(command)); 510 1.19 riastrad command.hdr.tag = htobe16(TPM_TAG_RQU_COMMAND); 511 1.19 riastrad command.hdr.length = htobe32(sizeof(command)); 512 1.19 riastrad command.hdr.code = htobe32(TPM_ORD_GetRandom); 513 1.19 riastrad command.bytesRequested = htobe32(sizeof(response.bytes)); 514 1.19 riastrad 515 1.19 riastrad /* Write the command. */ 516 1.19 riastrad if ((rv = (*sc->sc_intf->start)(sc, UIO_WRITE)) != 0) { 517 1.19 riastrad device_printf(sc->sc_dev, "start write failed, error=%d\n", 518 1.19 riastrad rv); 519 1.19 riastrad goto out; 520 1.19 riastrad } 521 1.19 riastrad endwrite = true; 522 1.19 riastrad if ((rv = (*sc->sc_intf->write)(sc, &command, sizeof(command))) != 0) { 523 1.19 riastrad device_printf(sc->sc_dev, "write failed, error=%d\n", rv); 524 1.19 riastrad goto out; 525 1.19 riastrad } 526 1.19 riastrad rv = (*sc->sc_intf->end)(sc, UIO_WRITE, 0); 527 1.19 riastrad endwrite = false; 528 1.19 riastrad if (rv) { 529 1.19 riastrad device_printf(sc->sc_dev, "end write failed, error=%d\n", rv); 530 1.19 riastrad goto out; 531 1.19 riastrad } 532 1.19 riastrad 533 1.19 riastrad /* Read the response header. */ 534 1.19 riastrad if ((rv = (*sc->sc_intf->start)(sc, UIO_READ)) != 0) { 535 1.19 riastrad device_printf(sc->sc_dev, "start write failed, error=%d\n", 536 1.19 riastrad rv); 537 1.19 riastrad goto out; 538 1.19 riastrad } 539 1.19 riastrad endread = true; 540 1.19 riastrad if ((rv = (*sc->sc_intf->read)(sc, &response.hdr, sizeof(response.hdr), 541 1.19 riastrad &nread, 0)) != 0) { 542 1.19 riastrad device_printf(sc->sc_dev, "read failed, error=%d\n", rv); 543 1.19 riastrad goto out; 544 1.19 riastrad } 545 1.19 riastrad 546 1.19 riastrad /* Verify the response header looks sensible. */ 547 1.19 riastrad if (nread != sizeof(response.hdr)) { 548 1.26 khorben device_printf(sc->sc_dev, "read %zu bytes, expected %zu\n", 549 1.19 riastrad nread, sizeof(response.hdr)); 550 1.19 riastrad goto out; 551 1.19 riastrad } 552 1.19 riastrad tag = be16toh(response.hdr.tag); 553 1.19 riastrad pktlen = be32toh(response.hdr.length); 554 1.19 riastrad code = be32toh(response.hdr.code); 555 1.19 riastrad if (tag != TPM_TAG_RSP_COMMAND || 556 1.19 riastrad pktlen < offsetof(struct response, bytes) || 557 1.19 riastrad pktlen > sizeof(response) || 558 1.19 riastrad code != 0) { 559 1.19 riastrad /* 560 1.19 riastrad * If the tpm itself is busy (e.g., it has yet to run a 561 1.19 riastrad * self-test, or it's in a timeout period to defend 562 1.19 riastrad * against brute force attacks), then we can try again 563 1.19 riastrad * later. Otherwise, give up. 564 1.19 riastrad */ 565 1.19 riastrad if (code & TPM_NON_FATAL) { 566 1.19 riastrad aprint_debug_dev(sc->sc_dev, "%s: tpm busy, code=%u\n", 567 1.19 riastrad __func__, code & ~TPM_NON_FATAL); 568 1.19 riastrad rv = 0; 569 1.19 riastrad } else if (code == TPM_DEACTIVATED) { 570 1.19 riastrad device_printf(sc->sc_dev, "tpm is deactivated\n"); 571 1.19 riastrad rv = ENXIO; 572 1.19 riastrad } else { 573 1.19 riastrad device_printf(sc->sc_dev, "bad tpm response:" 574 1.19 riastrad " tag=%u len=%u code=%u\n", tag, pktlen, code); 575 1.19 riastrad hexdump(aprint_debug, "tpm response header", 576 1.19 riastrad (const void *)&response.hdr, 577 1.19 riastrad sizeof(response.hdr)); 578 1.19 riastrad rv = EIO; 579 1.19 riastrad } 580 1.19 riastrad goto out; 581 1.19 riastrad } 582 1.19 riastrad 583 1.19 riastrad /* Read the response payload. */ 584 1.19 riastrad if ((rv = (*sc->sc_intf->read)(sc, 585 1.19 riastrad (char *)&response + nread, pktlen - nread, 586 1.19 riastrad NULL, TPM_PARAM_SIZE)) != 0) { 587 1.19 riastrad device_printf(sc->sc_dev, "read failed, error=%d\n", rv); 588 1.19 riastrad goto out; 589 1.19 riastrad } 590 1.19 riastrad endread = false; 591 1.19 riastrad if ((rv = (*sc->sc_intf->end)(sc, UIO_READ, 0)) != 0) { 592 1.19 riastrad device_printf(sc->sc_dev, "end read failed, error=%d\n", rv); 593 1.19 riastrad goto out; 594 1.19 riastrad } 595 1.19 riastrad 596 1.19 riastrad /* Verify the number of bytes read looks sensible. */ 597 1.19 riastrad nbytes = be32toh(response.randomBytesSize); 598 1.19 riastrad if (nbytes > pktlen - offsetof(struct response, bytes)) { 599 1.19 riastrad device_printf(sc->sc_dev, "overlong GetRandom length:" 600 1.19 riastrad " %u, max %zu\n", 601 1.19 riastrad nbytes, pktlen - offsetof(struct response, bytes)); 602 1.19 riastrad nbytes = pktlen - offsetof(struct response, bytes); 603 1.19 riastrad } 604 1.19 riastrad 605 1.19 riastrad /* 606 1.19 riastrad * Enter the data into the entropy pool. Conservatively (or, 607 1.19 riastrad * perhaps, cargocultily) estimate half a bit of entropy per 608 1.19 riastrad * bit of data. 609 1.19 riastrad */ 610 1.21 riastrad CTASSERT(sizeof(response.bytes) <= UINT_MAX/(NBBY/2)); 611 1.21 riastrad entropybits = (NBBY/2)*nbytes; 612 1.21 riastrad rnd_add_data(&sc->sc_rnd, response.bytes, nbytes, entropybits); 613 1.21 riastrad 614 1.21 riastrad out: /* End the read or write if still ongoing. */ 615 1.21 riastrad if (endread) 616 1.21 riastrad rv = (*sc->sc_intf->end)(sc, UIO_READ, rv); 617 1.21 riastrad if (endwrite) 618 1.21 riastrad rv = (*sc->sc_intf->end)(sc, UIO_WRITE, rv); 619 1.21 riastrad 620 1.21 riastrad *entropybitsp = entropybits; 621 1.21 riastrad return rv; 622 1.21 riastrad } 623 1.21 riastrad 624 1.21 riastrad static int 625 1.21 riastrad tpm20_rng(struct tpm_softc *sc, unsigned *entropybitsp) 626 1.21 riastrad { 627 1.21 riastrad /* 628 1.21 riastrad * Trusted Platform Module Library, Family "2.0", Level 00 629 1.21 riastrad * Revision 01.38, Part 3: Commands, Sec. 16.1 `TPM2_GetRandom' 630 1.21 riastrad * 631 1.21 riastrad * https://trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-3-Commands-01.38.pdf#page=133 632 1.21 riastrad */ 633 1.21 riastrad struct { 634 1.21 riastrad struct tpm_header hdr; 635 1.21 riastrad uint16_t bytesRequested; 636 1.21 riastrad } __packed command; 637 1.21 riastrad struct response { 638 1.21 riastrad struct tpm_header hdr; 639 1.21 riastrad uint16_t randomBytesSize; 640 1.21 riastrad uint8_t bytes[64]; 641 1.21 riastrad } __packed response; 642 1.21 riastrad bool endwrite = false, endread = false; 643 1.21 riastrad size_t nread; 644 1.21 riastrad uint16_t tag; 645 1.21 riastrad uint32_t pktlen, code, nbytes, entropybits = 0; 646 1.21 riastrad int rv; 647 1.21 riastrad 648 1.21 riastrad /* Encode the command. */ 649 1.21 riastrad memset(&command, 0, sizeof(command)); 650 1.21 riastrad command.hdr.tag = htobe16(TPM2_ST_NO_SESSIONS); 651 1.21 riastrad command.hdr.length = htobe32(sizeof(command)); 652 1.21 riastrad command.hdr.code = htobe32(TPM2_CC_GetRandom); 653 1.21 riastrad command.bytesRequested = htobe16(sizeof(response.bytes)); 654 1.21 riastrad 655 1.21 riastrad /* Write the command. */ 656 1.21 riastrad if ((rv = (*sc->sc_intf->start)(sc, UIO_WRITE)) != 0) { 657 1.21 riastrad device_printf(sc->sc_dev, "start write failed, error=%d\n", 658 1.21 riastrad rv); 659 1.21 riastrad goto out; 660 1.21 riastrad } 661 1.21 riastrad endwrite = true; 662 1.21 riastrad if ((rv = (*sc->sc_intf->write)(sc, &command, sizeof(command))) != 0) { 663 1.21 riastrad device_printf(sc->sc_dev, "write failed, error=%d\n", rv); 664 1.21 riastrad goto out; 665 1.21 riastrad } 666 1.21 riastrad rv = (*sc->sc_intf->end)(sc, UIO_WRITE, 0); 667 1.21 riastrad endwrite = false; 668 1.21 riastrad if (rv) { 669 1.21 riastrad device_printf(sc->sc_dev, "end write failed, error=%d\n", rv); 670 1.21 riastrad goto out; 671 1.21 riastrad } 672 1.21 riastrad 673 1.21 riastrad /* Read the response header. */ 674 1.21 riastrad if ((rv = (*sc->sc_intf->start)(sc, UIO_READ)) != 0) { 675 1.21 riastrad device_printf(sc->sc_dev, "start write failed, error=%d\n", 676 1.21 riastrad rv); 677 1.21 riastrad goto out; 678 1.21 riastrad } 679 1.21 riastrad endread = true; 680 1.21 riastrad if ((rv = (*sc->sc_intf->read)(sc, &response.hdr, sizeof(response.hdr), 681 1.21 riastrad &nread, 0)) != 0) { 682 1.21 riastrad device_printf(sc->sc_dev, "read failed, error=%d\n", rv); 683 1.21 riastrad goto out; 684 1.21 riastrad } 685 1.21 riastrad 686 1.21 riastrad /* Verify the response header looks sensible. */ 687 1.21 riastrad if (nread != sizeof(response.hdr)) { 688 1.29 riastrad device_printf(sc->sc_dev, "read %zu bytes, expected %zu\n", 689 1.21 riastrad nread, sizeof(response.hdr)); 690 1.21 riastrad goto out; 691 1.21 riastrad } 692 1.21 riastrad tag = be16toh(response.hdr.tag); 693 1.21 riastrad pktlen = be32toh(response.hdr.length); 694 1.21 riastrad code = be32toh(response.hdr.code); 695 1.21 riastrad if (tag != TPM2_ST_NO_SESSIONS || 696 1.21 riastrad pktlen < offsetof(struct response, bytes) || 697 1.21 riastrad pktlen > sizeof(response) || 698 1.21 riastrad code != 0) { 699 1.21 riastrad /* 700 1.21 riastrad * If the tpm itself is busy (e.g., it has yet to run a 701 1.21 riastrad * self-test, or it's in a timeout period to defend 702 1.21 riastrad * against brute force attacks), then we can try again 703 1.21 riastrad * later. Otherwise, give up. 704 1.21 riastrad */ 705 1.21 riastrad if (code & TPM2_RC_WARN) { 706 1.21 riastrad aprint_debug_dev(sc->sc_dev, "%s: tpm busy," 707 1.21 riastrad " code=TPM_RC_WARN+0x%x\n", 708 1.21 riastrad __func__, code & ~TPM2_RC_WARN); 709 1.21 riastrad rv = 0; 710 1.21 riastrad } else { 711 1.21 riastrad device_printf(sc->sc_dev, "bad tpm response:" 712 1.21 riastrad " tag=%u len=%u code=0x%x\n", tag, pktlen, code); 713 1.21 riastrad hexdump(aprint_debug, "tpm response header", 714 1.21 riastrad (const void *)&response.hdr, 715 1.21 riastrad sizeof(response.hdr)); 716 1.21 riastrad rv = EIO; 717 1.21 riastrad } 718 1.21 riastrad goto out; 719 1.21 riastrad } 720 1.21 riastrad 721 1.21 riastrad /* Read the response payload. */ 722 1.21 riastrad if ((rv = (*sc->sc_intf->read)(sc, 723 1.21 riastrad (char *)&response + nread, pktlen - nread, 724 1.21 riastrad NULL, TPM_PARAM_SIZE)) != 0) { 725 1.21 riastrad device_printf(sc->sc_dev, "read failed, error=%d\n", rv); 726 1.21 riastrad goto out; 727 1.21 riastrad } 728 1.21 riastrad endread = false; 729 1.21 riastrad if ((rv = (*sc->sc_intf->end)(sc, UIO_READ, 0)) != 0) { 730 1.21 riastrad device_printf(sc->sc_dev, "end read failed, error=%d\n", rv); 731 1.21 riastrad goto out; 732 1.21 riastrad } 733 1.21 riastrad 734 1.21 riastrad /* Verify the number of bytes read looks sensible. */ 735 1.21 riastrad nbytes = be16toh(response.randomBytesSize); 736 1.21 riastrad if (nbytes > pktlen - offsetof(struct response, bytes)) { 737 1.21 riastrad device_printf(sc->sc_dev, "overlong GetRandom length:" 738 1.21 riastrad " %u, max %zu\n", 739 1.21 riastrad nbytes, pktlen - offsetof(struct response, bytes)); 740 1.21 riastrad nbytes = pktlen - offsetof(struct response, bytes); 741 1.21 riastrad } 742 1.21 riastrad 743 1.21 riastrad /* 744 1.21 riastrad * Enter the data into the entropy pool. Conservatively (or, 745 1.21 riastrad * perhaps, cargocultily) estimate half a bit of entropy per 746 1.21 riastrad * bit of data. 747 1.21 riastrad */ 748 1.21 riastrad CTASSERT(sizeof(response.bytes) <= UINT_MAX/(NBBY/2)); 749 1.21 riastrad entropybits = (NBBY/2)*nbytes; 750 1.21 riastrad rnd_add_data(&sc->sc_rnd, response.bytes, nbytes, entropybits); 751 1.21 riastrad 752 1.21 riastrad out: /* End the read or write if still ongoing. */ 753 1.21 riastrad if (endread) 754 1.21 riastrad rv = (*sc->sc_intf->end)(sc, UIO_READ, rv); 755 1.21 riastrad if (endwrite) 756 1.21 riastrad rv = (*sc->sc_intf->end)(sc, UIO_WRITE, rv); 757 1.21 riastrad 758 1.21 riastrad *entropybitsp = entropybits; 759 1.21 riastrad return rv; 760 1.21 riastrad } 761 1.21 riastrad 762 1.21 riastrad static void 763 1.21 riastrad tpm_rng_work(struct work *wk, void *cookie) 764 1.21 riastrad { 765 1.21 riastrad struct tpm_softc *sc = cookie; 766 1.21 riastrad unsigned nbytes, entropybits; 767 1.21 riastrad int rv; 768 1.21 riastrad 769 1.21 riastrad /* Acknowledge the request. */ 770 1.21 riastrad nbytes = atomic_swap_uint(&sc->sc_rndpending, 0); 771 1.21 riastrad 772 1.24 riastrad /* Lock the tpm while we do I/O transactions with it. */ 773 1.21 riastrad mutex_enter(&sc->sc_lock); 774 1.21 riastrad 775 1.21 riastrad /* 776 1.21 riastrad * Issue as many commands as needed to fulfill the request, but 777 1.21 riastrad * stop if anything fails. 778 1.21 riastrad */ 779 1.21 riastrad for (; nbytes; nbytes -= MIN(nbytes, MAX(1, entropybits/NBBY))) { 780 1.21 riastrad switch (sc->sc_ver) { 781 1.21 riastrad case TPM_1_2: 782 1.21 riastrad rv = tpm12_rng(sc, &entropybits); 783 1.21 riastrad break; 784 1.21 riastrad case TPM_2_0: 785 1.21 riastrad rv = tpm20_rng(sc, &entropybits); 786 1.21 riastrad break; 787 1.21 riastrad default: 788 1.21 riastrad panic("bad tpm version: %d", sc->sc_ver); 789 1.21 riastrad } 790 1.21 riastrad if (rv) 791 1.21 riastrad break; 792 1.21 riastrad } 793 1.19 riastrad 794 1.21 riastrad /* 795 1.19 riastrad * If the tpm is busted, no sense in trying again -- most 796 1.19 riastrad * likely, it is deactivated, and by the spec it cannot be 797 1.19 riastrad * reactivated until after a reboot. 798 1.19 riastrad */ 799 1.19 riastrad if (rv) { 800 1.19 riastrad device_printf(sc->sc_dev, "deactivating entropy source\n"); 801 1.23 riastrad atomic_store_relaxed(&sc->sc_rnddisabled, true); 802 1.19 riastrad /* XXX worker thread can't workqueue_destroy its own queue */ 803 1.19 riastrad } 804 1.19 riastrad 805 1.24 riastrad /* Relinquish the tpm. */ 806 1.19 riastrad mutex_exit(&sc->sc_lock); 807 1.19 riastrad } 808 1.19 riastrad 809 1.19 riastrad static void 810 1.21 riastrad tpm_rng_get(size_t nbytes, void *cookie) 811 1.19 riastrad { 812 1.19 riastrad struct tpm_softc *sc = cookie; 813 1.19 riastrad 814 1.23 riastrad if (atomic_load_relaxed(&sc->sc_rnddisabled)) 815 1.23 riastrad return; /* tough */ 816 1.21 riastrad if (atomic_swap_uint(&sc->sc_rndpending, MIN(nbytes, UINT_MAX/NBBY)) 817 1.21 riastrad == 0) 818 1.19 riastrad workqueue_enqueue(sc->sc_rndwq, &sc->sc_rndwk, NULL); 819 1.19 riastrad } 820 1.19 riastrad 821 1.16 maxv static int 822 1.14 maxv tpm_tis12_init(struct tpm_softc *sc) 823 1.13 maxv { 824 1.16 maxv int rv; 825 1.16 maxv 826 1.14 maxv sc->sc_caps = bus_space_read_4(sc->sc_bt, sc->sc_bh, 827 1.13 maxv TPM_INTF_CAPABILITY); 828 1.13 maxv sc->sc_devid = bus_space_read_4(sc->sc_bt, sc->sc_bh, TPM_ID); 829 1.13 maxv sc->sc_rev = bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_REV); 830 1.13 maxv 831 1.14 maxv aprint_normal_dev(sc->sc_dev, "device 0x%08x rev 0x%x\n", 832 1.14 maxv sc->sc_devid, sc->sc_rev); 833 1.13 maxv 834 1.16 maxv if ((rv = tpm12_request_locality(sc, 0)) != 0) 835 1.16 maxv return rv; 836 1.13 maxv 837 1.13 maxv /* Abort whatever it thought it was doing. */ 838 1.13 maxv bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_STS, TPM_STS_CMD_READY); 839 1.13 maxv 840 1.19 riastrad /* XXX Run this at higher priority? */ 841 1.19 riastrad if ((rv = workqueue_create(&sc->sc_rndwq, device_xname(sc->sc_dev), 842 1.21 riastrad tpm_rng_work, sc, PRI_NONE, IPL_VM, WQ_MPSAFE)) != 0) 843 1.19 riastrad return rv; 844 1.21 riastrad rndsource_setcb(&sc->sc_rnd, tpm_rng_get, sc); 845 1.19 riastrad rnd_attach_source(&sc->sc_rnd, device_xname(sc->sc_dev), 846 1.19 riastrad RND_TYPE_RNG, 847 1.19 riastrad RND_FLAG_COLLECT_VALUE|RND_FLAG_ESTIMATE_VALUE|RND_FLAG_HASCB); 848 1.19 riastrad 849 1.13 maxv return 0; 850 1.13 maxv } 851 1.13 maxv 852 1.16 maxv static int 853 1.14 maxv tpm_tis12_start(struct tpm_softc *sc, int rw) 854 1.1 christos { 855 1.1 christos int rv; 856 1.1 christos 857 1.14 maxv if (rw == UIO_READ) { 858 1.1 christos rv = tpm_waitfor(sc, TPM_STS_DATA_AVAIL | TPM_STS_VALID, 859 1.16 maxv TPM_READ_TMO, sc->sc_intf->read); 860 1.1 christos return rv; 861 1.1 christos } 862 1.1 christos 863 1.13 maxv /* Request the 0th locality. */ 864 1.16 maxv if ((rv = tpm12_request_locality(sc, 0)) != 0) 865 1.1 christos return rv; 866 1.1 christos 867 1.13 maxv sc->sc_status = tpm_status(sc); 868 1.13 maxv if (sc->sc_status & TPM_STS_CMD_READY) 869 1.1 christos return 0; 870 1.1 christos 871 1.1 christos /* Abort previous and restart. */ 872 1.1 christos bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_STS, TPM_STS_CMD_READY); 873 1.16 maxv rv = tpm_waitfor(sc, TPM_STS_CMD_READY, TPM_READY_TMO, sc->sc_intf->write); 874 1.13 maxv if (rv) 875 1.1 christos return rv; 876 1.1 christos 877 1.1 christos return 0; 878 1.1 christos } 879 1.1 christos 880 1.16 maxv static int 881 1.3 christos tpm_tis12_read(struct tpm_softc *sc, void *buf, size_t len, size_t *count, 882 1.1 christos int flags) 883 1.1 christos { 884 1.1 christos uint8_t *p = buf; 885 1.1 christos size_t cnt; 886 1.14 maxv int rv, n; 887 1.1 christos 888 1.1 christos cnt = 0; 889 1.1 christos while (len > 0) { 890 1.13 maxv rv = tpm_waitfor(sc, TPM_STS_DATA_AVAIL | TPM_STS_VALID, 891 1.16 maxv TPM_READ_TMO, sc->sc_intf->read); 892 1.13 maxv if (rv) 893 1.1 christos return rv; 894 1.1 christos 895 1.14 maxv n = MIN(len, tpm_getburst(sc)); 896 1.14 maxv while (n > 0) { 897 1.1 christos *p++ = bus_space_read_1(sc->sc_bt, sc->sc_bh, TPM_DATA); 898 1.1 christos cnt++; 899 1.14 maxv len--; 900 1.14 maxv n--; 901 1.1 christos } 902 1.1 christos 903 1.1 christos if ((flags & TPM_PARAM_SIZE) == 0 && cnt >= 6) 904 1.1 christos break; 905 1.1 christos } 906 1.1 christos 907 1.1 christos if (count) 908 1.1 christos *count = cnt; 909 1.1 christos 910 1.1 christos return 0; 911 1.1 christos } 912 1.1 christos 913 1.16 maxv static int 914 1.3 christos tpm_tis12_write(struct tpm_softc *sc, const void *buf, size_t len) 915 1.1 christos { 916 1.3 christos const uint8_t *p = buf; 917 1.1 christos size_t cnt; 918 1.1 christos int rv, r; 919 1.1 christos 920 1.3 christos if (len == 0) 921 1.3 christos return 0; 922 1.16 maxv if ((rv = tpm12_request_locality(sc, 0)) != 0) 923 1.1 christos return rv; 924 1.1 christos 925 1.1 christos cnt = 0; 926 1.1 christos while (cnt < len - 1) { 927 1.1 christos for (r = tpm_getburst(sc); r > 0 && cnt < len - 1; r--) { 928 1.1 christos bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_DATA, *p++); 929 1.1 christos cnt++; 930 1.1 christos } 931 1.1 christos if ((rv = tpm_waitfor(sc, TPM_STS_VALID, TPM_READ_TMO, sc))) { 932 1.1 christos return rv; 933 1.1 christos } 934 1.13 maxv sc->sc_status = tpm_status(sc); 935 1.13 maxv if (!(sc->sc_status & TPM_STS_DATA_EXPECT)) { 936 1.1 christos return EIO; 937 1.1 christos } 938 1.1 christos } 939 1.1 christos 940 1.1 christos bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_DATA, *p++); 941 1.1 christos cnt++; 942 1.1 christos 943 1.1 christos if ((rv = tpm_waitfor(sc, TPM_STS_VALID, TPM_READ_TMO, sc))) { 944 1.1 christos return rv; 945 1.1 christos } 946 1.13 maxv if ((sc->sc_status & TPM_STS_DATA_EXPECT) != 0) { 947 1.1 christos return EIO; 948 1.1 christos } 949 1.1 christos 950 1.1 christos return 0; 951 1.1 christos } 952 1.1 christos 953 1.16 maxv static int 954 1.14 maxv tpm_tis12_end(struct tpm_softc *sc, int rw, int err) 955 1.1 christos { 956 1.1 christos int rv = 0; 957 1.1 christos 958 1.14 maxv if (rw == UIO_READ) { 959 1.16 maxv rv = tpm_waitfor(sc, TPM_STS_VALID, TPM_READ_TMO, sc->sc_intf->read); 960 1.13 maxv if (rv) 961 1.22 riastrad goto out; 962 1.1 christos 963 1.1 christos /* Still more data? */ 964 1.13 maxv sc->sc_status = tpm_status(sc); 965 1.14 maxv if (!err && (sc->sc_status & TPM_STS_DATA_AVAIL)) { 966 1.1 christos rv = EIO; 967 1.1 christos } 968 1.1 christos 969 1.1 christos bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_STS, 970 1.1 christos TPM_STS_CMD_READY); 971 1.1 christos 972 1.13 maxv /* Release the 0th locality. */ 973 1.13 maxv bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_ACCESS, 974 1.1 christos TPM_ACCESS_ACTIVE_LOCALITY); 975 1.1 christos } else { 976 1.1 christos /* Hungry for more? */ 977 1.13 maxv sc->sc_status = tpm_status(sc); 978 1.13 maxv if (!err && (sc->sc_status & TPM_STS_DATA_EXPECT)) { 979 1.1 christos rv = EIO; 980 1.1 christos } 981 1.1 christos 982 1.1 christos bus_space_write_1(sc->sc_bt, sc->sc_bh, TPM_STS, 983 1.1 christos err ? TPM_STS_CMD_READY : TPM_STS_GO); 984 1.1 christos } 985 1.1 christos 986 1.22 riastrad out: return err ? err : rv; 987 1.1 christos } 988 1.1 christos 989 1.16 maxv const struct tpm_intf tpm_intf_tis12 = { 990 1.16 maxv .version = TIS_1_2, 991 1.16 maxv .probe = tpm_tis12_probe, 992 1.16 maxv .init = tpm_tis12_init, 993 1.16 maxv .start = tpm_tis12_start, 994 1.16 maxv .read = tpm_tis12_read, 995 1.16 maxv .write = tpm_tis12_write, 996 1.16 maxv .end = tpm_tis12_end 997 1.16 maxv }; 998 1.16 maxv 999 1.13 maxv /* -------------------------------------------------------------------------- */ 1000 1.1 christos 1001 1.13 maxv static dev_type_open(tpmopen); 1002 1.13 maxv static dev_type_close(tpmclose); 1003 1.13 maxv static dev_type_read(tpmread); 1004 1.13 maxv static dev_type_write(tpmwrite); 1005 1.13 maxv static dev_type_ioctl(tpmioctl); 1006 1.1 christos 1007 1.13 maxv const struct cdevsw tpm_cdevsw = { 1008 1.13 maxv .d_open = tpmopen, 1009 1.13 maxv .d_close = tpmclose, 1010 1.13 maxv .d_read = tpmread, 1011 1.13 maxv .d_write = tpmwrite, 1012 1.13 maxv .d_ioctl = tpmioctl, 1013 1.13 maxv .d_stop = nostop, 1014 1.13 maxv .d_tty = notty, 1015 1.13 maxv .d_poll = nopoll, 1016 1.13 maxv .d_mmap = nommap, 1017 1.13 maxv .d_kqfilter = nokqfilter, 1018 1.13 maxv .d_discard = nodiscard, 1019 1.14 maxv .d_flag = D_OTHER | D_MPSAFE, 1020 1.13 maxv }; 1021 1.1 christos 1022 1.13 maxv static int 1023 1.1 christos tpmopen(dev_t dev, int flag, int mode, struct lwp *l) 1024 1.1 christos { 1025 1.14 maxv struct tpm_softc *sc = device_lookup_private(&tpm_cd, minor(dev)); 1026 1.14 maxv int ret = 0; 1027 1.1 christos 1028 1.13 maxv if (sc == NULL) 1029 1.1 christos return ENXIO; 1030 1.1 christos 1031 1.14 maxv mutex_enter(&sc->sc_lock); 1032 1.14 maxv if (sc->sc_busy) { 1033 1.14 maxv ret = EBUSY; 1034 1.14 maxv } else { 1035 1.14 maxv sc->sc_busy = true; 1036 1.14 maxv } 1037 1.14 maxv mutex_exit(&sc->sc_lock); 1038 1.1 christos 1039 1.14 maxv return ret; 1040 1.1 christos } 1041 1.1 christos 1042 1.13 maxv static int 1043 1.1 christos tpmclose(dev_t dev, int flag, int mode, struct lwp *l) 1044 1.1 christos { 1045 1.14 maxv struct tpm_softc *sc = device_lookup_private(&tpm_cd, minor(dev)); 1046 1.14 maxv int ret = 0; 1047 1.1 christos 1048 1.13 maxv if (sc == NULL) 1049 1.1 christos return ENXIO; 1050 1.1 christos 1051 1.14 maxv mutex_enter(&sc->sc_lock); 1052 1.14 maxv if (!sc->sc_busy) { 1053 1.14 maxv ret = EINVAL; 1054 1.14 maxv } else { 1055 1.14 maxv sc->sc_busy = false; 1056 1.14 maxv } 1057 1.14 maxv mutex_exit(&sc->sc_lock); 1058 1.1 christos 1059 1.14 maxv return ret; 1060 1.1 christos } 1061 1.1 christos 1062 1.13 maxv static int 1063 1.1 christos tpmread(dev_t dev, struct uio *uio, int flags) 1064 1.1 christos { 1065 1.14 maxv struct tpm_softc *sc = device_lookup_private(&tpm_cd, minor(dev)); 1066 1.15 maxv struct tpm_header hdr; 1067 1.14 maxv uint8_t buf[TPM_BUFSIZ]; 1068 1.24 riastrad size_t cnt, len = 0/*XXXGCC*/; 1069 1.24 riastrad bool end = false; 1070 1.14 maxv int rv; 1071 1.1 christos 1072 1.13 maxv if (sc == NULL) 1073 1.1 christos return ENXIO; 1074 1.1 christos 1075 1.24 riastrad mutex_enter(&sc->sc_lock); 1076 1.24 riastrad 1077 1.16 maxv if ((rv = (*sc->sc_intf->start)(sc, UIO_READ))) 1078 1.24 riastrad goto out; 1079 1.24 riastrad end = true; 1080 1.1 christos 1081 1.14 maxv /* Get the header. */ 1082 1.16 maxv if ((rv = (*sc->sc_intf->read)(sc, &hdr, sizeof(hdr), &cnt, 0))) { 1083 1.3 christos goto out; 1084 1.1 christos } 1085 1.24 riastrad if (cnt != sizeof(hdr)) { 1086 1.24 riastrad rv = EIO; 1087 1.24 riastrad goto out; 1088 1.24 riastrad } 1089 1.25 riastrad len = be32toh(hdr.length); 1090 1.24 riastrad if (len > MIN(sizeof(buf), uio->uio_resid) || len < sizeof(hdr)) { 1091 1.1 christos rv = EIO; 1092 1.3 christos goto out; 1093 1.1 christos } 1094 1.1 christos 1095 1.24 riastrad /* Get the payload. */ 1096 1.24 riastrad len -= sizeof(hdr); 1097 1.24 riastrad if ((rv = (*sc->sc_intf->read)(sc, buf, len, NULL, TPM_PARAM_SIZE))) { 1098 1.24 riastrad goto out; 1099 1.24 riastrad } 1100 1.24 riastrad 1101 1.24 riastrad out: if (end) 1102 1.24 riastrad rv = (*sc->sc_intf->end)(sc, UIO_READ, rv); 1103 1.24 riastrad 1104 1.24 riastrad mutex_exit(&sc->sc_lock); 1105 1.24 riastrad 1106 1.24 riastrad /* If anything went wrong, stop here -- nothing to copy out. */ 1107 1.24 riastrad if (rv) 1108 1.24 riastrad return rv; 1109 1.24 riastrad 1110 1.14 maxv /* Copy out the header. */ 1111 1.24 riastrad if ((rv = uiomove(&hdr, sizeof(hdr), uio))) { 1112 1.24 riastrad return rv; 1113 1.1 christos } 1114 1.1 christos 1115 1.24 riastrad /* Copy out the payload. */ 1116 1.24 riastrad if ((rv = uiomove(buf, len, uio))) { 1117 1.24 riastrad return rv; 1118 1.1 christos } 1119 1.1 christos 1120 1.24 riastrad /* Success! */ 1121 1.24 riastrad return 0; 1122 1.1 christos } 1123 1.1 christos 1124 1.13 maxv static int 1125 1.1 christos tpmwrite(dev_t dev, struct uio *uio, int flags) 1126 1.1 christos { 1127 1.14 maxv struct tpm_softc *sc = device_lookup_private(&tpm_cd, minor(dev)); 1128 1.1 christos uint8_t buf[TPM_BUFSIZ]; 1129 1.24 riastrad bool end = false; 1130 1.14 maxv int n, rv; 1131 1.1 christos 1132 1.13 maxv if (sc == NULL) 1133 1.1 christos return ENXIO; 1134 1.1 christos 1135 1.1 christos n = MIN(sizeof(buf), uio->uio_resid); 1136 1.1 christos if ((rv = uiomove(buf, n, uio))) { 1137 1.24 riastrad return rv; 1138 1.1 christos } 1139 1.24 riastrad 1140 1.24 riastrad mutex_enter(&sc->sc_lock); 1141 1.24 riastrad 1142 1.16 maxv if ((rv = (*sc->sc_intf->start)(sc, UIO_WRITE))) { 1143 1.13 maxv goto out; 1144 1.1 christos } 1145 1.24 riastrad end = true; 1146 1.24 riastrad 1147 1.16 maxv if ((rv = (*sc->sc_intf->write)(sc, buf, n))) { 1148 1.13 maxv goto out; 1149 1.1 christos } 1150 1.1 christos 1151 1.24 riastrad out: if (end) 1152 1.24 riastrad rv = (*sc->sc_intf->end)(sc, UIO_WRITE, rv); 1153 1.24 riastrad 1154 1.24 riastrad mutex_exit(&sc->sc_lock); 1155 1.1 christos return rv; 1156 1.1 christos } 1157 1.1 christos 1158 1.13 maxv static int 1159 1.13 maxv tpmioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l) 1160 1.1 christos { 1161 1.14 maxv struct tpm_softc *sc = device_lookup_private(&tpm_cd, minor(dev)); 1162 1.13 maxv struct tpm_ioc_getinfo *info; 1163 1.13 maxv 1164 1.13 maxv if (sc == NULL) 1165 1.13 maxv return ENXIO; 1166 1.13 maxv 1167 1.13 maxv switch (cmd) { 1168 1.13 maxv case TPM_IOC_GETINFO: 1169 1.13 maxv info = addr; 1170 1.13 maxv info->api_version = TPM_API_VERSION; 1171 1.13 maxv info->tpm_version = sc->sc_ver; 1172 1.16 maxv info->itf_version = sc->sc_intf->version; 1173 1.13 maxv info->device_id = sc->sc_devid; 1174 1.13 maxv info->device_rev = sc->sc_rev; 1175 1.14 maxv info->device_caps = sc->sc_caps; 1176 1.13 maxv return 0; 1177 1.13 maxv default: 1178 1.13 maxv break; 1179 1.13 maxv } 1180 1.13 maxv 1181 1.1 christos return ENOTTY; 1182 1.1 christos } 1183