tpm-chip.c 14.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/*
 * Copyright (C) 2004 IBM Corporation
 * Copyright (C) 2014 Intel Corporation
 *
 * Authors:
 * Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
 * Leendert van Doorn <leendert@watson.ibm.com>
 * Dave Safford <safford@watson.ibm.com>
 * Reiner Sailer <sailer@watson.ibm.com>
 * Kylene Hall <kjhall@us.ibm.com>
 *
 * Maintained by: <tpmdd-devel@lists.sourceforge.net>
 *
 * TPM chip management routines.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, version 2 of the
 * License.
 *
 */

#include <linux/poll.h>
#include <linux/slab.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>
#include <linux/freezer.h>
J
Jarkko Sakkinen 已提交
28
#include <linux/major.h>
29
#include <linux/tpm_eventlog.h>
30
#include <linux/hw_random.h>
31 32
#include "tpm.h"

33 34
DEFINE_IDR(dev_nums_idr);
static DEFINE_MUTEX(idr_lock);
35

J
Jarkko Sakkinen 已提交
36
struct class *tpm_class;
37
struct class *tpmrm_class;
J
Jarkko Sakkinen 已提交
38 39
dev_t tpm_devt;

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
static int tpm_request_locality(struct tpm_chip *chip, unsigned int flags)
{
	int rc;

	if (flags & TPM_TRANSMIT_NESTED)
		return 0;

	if (!chip->ops->request_locality)
		return 0;

	rc = chip->ops->request_locality(chip, 0);
	if (rc < 0)
		return rc;

	chip->locality = rc;
	return 0;
}

static void tpm_relinquish_locality(struct tpm_chip *chip, unsigned int flags)
{
	int rc;

	if (flags & TPM_TRANSMIT_NESTED)
		return;

	if (!chip->ops->relinquish_locality)
		return;

	rc = chip->ops->relinquish_locality(chip, chip->locality);
	if (rc)
		dev_err(&chip->dev, "%s: : error %d\n", __func__, rc);

	chip->locality = -1;
}

static int tpm_cmd_ready(struct tpm_chip *chip, unsigned int flags)
{
	if (flags & TPM_TRANSMIT_NESTED)
		return 0;

	if (!chip->ops->cmd_ready)
		return 0;

	return chip->ops->cmd_ready(chip);
}

static int tpm_go_idle(struct tpm_chip *chip, unsigned int flags)
{
	if (flags & TPM_TRANSMIT_NESTED)
		return 0;

	if (!chip->ops->go_idle)
		return 0;

	return chip->ops->go_idle(chip);
}

/**
 * tpm_chip_start() - power on the TPM
 * @chip:	a TPM chip to use
 * @flags:	TPM transmit flags
 *
 * Return:
 * * The response length	- OK
 * * -errno			- A system error
 */
int tpm_chip_start(struct tpm_chip *chip, unsigned int flags)
{
	int ret;

	if (chip->ops->clk_enable)
		chip->ops->clk_enable(chip, true);

	if (chip->locality == -1) {
		ret = tpm_request_locality(chip, flags);
		if (ret) {
			chip->ops->clk_enable(chip, false);
			return ret;
		}
	}

	ret = tpm_cmd_ready(chip, flags);
	if (ret) {
		tpm_relinquish_locality(chip, flags);
		if (chip->ops->clk_enable)
			chip->ops->clk_enable(chip, false);
		return ret;
	}

	return 0;
}
EXPORT_SYMBOL_GPL(tpm_chip_start);

/**
 * tpm_chip_stop() - power off the TPM
 * @chip:	a TPM chip to use
 * @flags:	TPM transmit flags
 *
 * Return:
 * * The response length	- OK
 * * -errno			- A system error
 */
void tpm_chip_stop(struct tpm_chip *chip, unsigned int flags)
{
	tpm_go_idle(chip, flags);
	tpm_relinquish_locality(chip, flags);
	if (chip->ops->clk_enable)
		chip->ops->clk_enable(chip, false);
}
EXPORT_SYMBOL_GPL(tpm_chip_stop);

151 152 153 154 155 156 157 158 159 160
/**
 * tpm_try_get_ops() - Get a ref to the tpm_chip
 * @chip: Chip to ref
 *
 * The caller must already have some kind of locking to ensure that chip is
 * valid. This function will lock the chip so that the ops member can be
 * accessed safely. The locking prevents tpm_chip_unregister from
 * completing, so it should not be held for long periods.
 *
 * Returns -ERRNO if the chip could not be got.
161
 */
162 163 164 165 166 167 168 169 170 171
int tpm_try_get_ops(struct tpm_chip *chip)
{
	int rc = -EIO;

	get_device(&chip->dev);

	down_read(&chip->ops_sem);
	if (!chip->ops)
		goto out_lock;

172
	mutex_lock(&chip->tpm_mutex);
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
	return 0;
out_lock:
	up_read(&chip->ops_sem);
	put_device(&chip->dev);
	return rc;
}
EXPORT_SYMBOL_GPL(tpm_try_get_ops);

/**
 * tpm_put_ops() - Release a ref to the tpm_chip
 * @chip: Chip to put
 *
 * This is the opposite pair to tpm_try_get_ops(). After this returns chip may
 * be kfree'd.
 */
void tpm_put_ops(struct tpm_chip *chip)
{
190
	mutex_unlock(&chip->tpm_mutex);
191 192 193 194 195
	up_read(&chip->ops_sem);
	put_device(&chip->dev);
}
EXPORT_SYMBOL_GPL(tpm_put_ops);

196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
/**
 * tpm_default_chip() - find a TPM chip and get a reference to it
 */
struct tpm_chip *tpm_default_chip(void)
{
	struct tpm_chip *chip, *res = NULL;
	int chip_num = 0;
	int chip_prev;

	mutex_lock(&idr_lock);

	do {
		chip_prev = chip_num;
		chip = idr_get_next(&dev_nums_idr, &chip_num);
		if (chip) {
			get_device(&chip->dev);
			res = chip;
			break;
		}
	} while (chip_prev != chip_num);

	mutex_unlock(&idr_lock);

	return res;
}
EXPORT_SYMBOL_GPL(tpm_default_chip);

223
/**
224
 * tpm_find_get_ops() - find and reserve a TPM chip
225
 * @chip:	a &struct tpm_chip instance, %NULL for the default chip
226
 *
227
 * Finds a TPM chip and reserves its class device and operations. The chip must
228 229 230 231
 * be released with tpm_put_ops() after use.
 * This function is for internal use only. It supports existing TPM callers
 * by accepting NULL, but those callers should be converted to pass in a chip
 * directly.
232 233 234 235 236
 *
 * Return:
 * A reserved &struct tpm_chip instance.
 * %NULL if a chip is not found.
 * %NULL if the chip is not available.
237
 */
238
struct tpm_chip *tpm_find_get_ops(struct tpm_chip *chip)
239
{
240
	int rc;
241

242
	if (chip) {
243
		if (!tpm_try_get_ops(chip))
244 245
			return chip;
		return NULL;
246
	}
247

248 249 250 251 252 253 254 255 256
	chip = tpm_default_chip();
	if (!chip)
		return NULL;
	rc = tpm_try_get_ops(chip);
	/* release additional reference we got from tpm_default_chip() */
	put_device(&chip->dev);
	if (rc)
		return NULL;
	return chip;
257 258 259
}

/**
J
Jarkko Sakkinen 已提交
260 261
 * tpm_dev_release() - free chip memory and the device number
 * @dev: the character device for the TPM chip
262
 *
J
Jarkko Sakkinen 已提交
263
 * This is used as the release function for the character device.
264
 */
J
Jarkko Sakkinen 已提交
265
static void tpm_dev_release(struct device *dev)
266
{
J
Jarkko Sakkinen 已提交
267
	struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev);
268

269 270 271 272
	mutex_lock(&idr_lock);
	idr_remove(&dev_nums_idr, chip->dev_num);
	mutex_unlock(&idr_lock);

N
Nayna Jain 已提交
273
	kfree(chip->log.bios_event_log);
274
	kfree(chip->work_space.context_buf);
275
	kfree(chip->work_space.session_buf);
276 277 278
	kfree(chip);
}

279 280 281 282 283 284 285 286
static void tpm_devs_release(struct device *dev)
{
	struct tpm_chip *chip = container_of(dev, struct tpm_chip, devs);

	/* release the master device reference */
	put_device(&chip->dev);
}

287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
/**
 * tpm_class_shutdown() - prepare the TPM device for loss of power.
 * @dev: device to which the chip is associated.
 *
 * Issues a TPM2_Shutdown command prior to loss of power, as required by the
 * TPM 2.0 spec.
 * Then, calls bus- and device- specific shutdown code.
 *
 * XXX: This codepath relies on the fact that sysfs is not enabled for
 * TPM2: sysfs uses an implicit lock on chip->ops, so this could race if TPM2
 * has sysfs support enabled before TPM sysfs's implicit locking is fixed.
 */
static int tpm_class_shutdown(struct device *dev)
{
	struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev);

	if (chip->flags & TPM_CHIP_FLAG_TPM2) {
		down_write(&chip->ops_sem);
		tpm2_shutdown(chip, TPM2_SU_CLEAR);
		chip->ops = NULL;
		up_write(&chip->ops_sem);
	}
309

310 311 312
	return 0;
}

313
/**
314 315 316 317
 * tpm_chip_alloc() - allocate a new struct tpm_chip instance
 * @pdev: device to which the chip is associated
 *        At this point pdev mst be initialized, but does not have to
 *        be registered
318 319 320
 * @ops: struct tpm_class_ops instance
 *
 * Allocates a new struct tpm_chip instance and assigns a free
321
 * device number for it. Must be paired with put_device(&chip->dev).
322
 */
323
struct tpm_chip *tpm_chip_alloc(struct device *pdev,
324
				const struct tpm_class_ops *ops)
325 326
{
	struct tpm_chip *chip;
327
	int rc;
328 329 330 331 332 333

	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
	if (chip == NULL)
		return ERR_PTR(-ENOMEM);

	mutex_init(&chip->tpm_mutex);
334
	init_rwsem(&chip->ops_sem);
335 336 337

	chip->ops = ops;

338 339 340 341
	mutex_lock(&idr_lock);
	rc = idr_alloc(&dev_nums_idr, NULL, 0, TPM_NUM_DEVICES, GFP_KERNEL);
	mutex_unlock(&idr_lock);
	if (rc < 0) {
342
		dev_err(pdev, "No available tpm device numbers\n");
343
		kfree(chip);
344
		return ERR_PTR(rc);
345
	}
346
	chip->dev_num = rc;
347

J
Jason Gunthorpe 已提交
348
	device_initialize(&chip->dev);
349
	device_initialize(&chip->devs);
350

J
Jarkko Sakkinen 已提交
351
	chip->dev.class = tpm_class;
352
	chip->dev.class->shutdown_pre = tpm_class_shutdown;
J
Jarkko Sakkinen 已提交
353
	chip->dev.release = tpm_dev_release;
354
	chip->dev.parent = pdev;
355
	chip->dev.groups = chip->groups;
J
Jarkko Sakkinen 已提交
356

357 358 359 360 361 362
	chip->devs.parent = pdev;
	chip->devs.class = tpmrm_class;
	chip->devs.release = tpm_devs_release;
	/* get extra reference on main device to hold on
	 * behalf of devs.  This holds the chip structure
	 * while cdevs is in use.  The corresponding put
363
	 * is in the tpm_devs_release (TPM2 only)
364
	 */
365 366
	if (chip->flags & TPM_CHIP_FLAG_TPM2)
		get_device(&chip->dev);
367

J
Jarkko Sakkinen 已提交
368 369 370 371 372
	if (chip->dev_num == 0)
		chip->dev.devt = MKDEV(MISC_MAJOR, TPM_MINOR);
	else
		chip->dev.devt = MKDEV(MAJOR(tpm_devt), chip->dev_num);

373 374 375
	chip->devs.devt =
		MKDEV(MAJOR(tpm_devt), chip->dev_num + TPM_NUM_DEVICES);

J
Jason Gunthorpe 已提交
376
	rc = dev_set_name(&chip->dev, "tpm%d", chip->dev_num);
377 378 379
	if (rc)
		goto out;
	rc = dev_set_name(&chip->devs, "tpmrm%d", chip->dev_num);
J
Jason Gunthorpe 已提交
380 381
	if (rc)
		goto out;
J
Jarkko Sakkinen 已提交
382

383
	if (!pdev)
384 385
		chip->flags |= TPM_CHIP_FLAG_VIRTUAL;

J
Jarkko Sakkinen 已提交
386
	cdev_init(&chip->cdev, &tpm_fops);
387
	cdev_init(&chip->cdevs, &tpmrm_fops);
S
Stefan Berger 已提交
388
	chip->cdev.owner = THIS_MODULE;
389
	chip->cdevs.owner = THIS_MODULE;
J
Jarkko Sakkinen 已提交
390

391 392 393 394 395
	chip->work_space.context_buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
	if (!chip->work_space.context_buf) {
		rc = -ENOMEM;
		goto out;
	}
396 397 398 399 400
	chip->work_space.session_buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
	if (!chip->work_space.session_buf) {
		rc = -ENOMEM;
		goto out;
	}
401

402
	chip->locality = -1;
403 404 405
	return chip;

out:
406
	put_device(&chip->devs);
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428
	put_device(&chip->dev);
	return ERR_PTR(rc);
}
EXPORT_SYMBOL_GPL(tpm_chip_alloc);

/**
 * tpmm_chip_alloc() - allocate a new struct tpm_chip instance
 * @pdev: parent device to which the chip is associated
 * @ops: struct tpm_class_ops instance
 *
 * Same as tpm_chip_alloc except devm is used to do the put_device
 */
struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
				 const struct tpm_class_ops *ops)
{
	struct tpm_chip *chip;
	int rc;

	chip = tpm_chip_alloc(pdev, ops);
	if (IS_ERR(chip))
		return chip;

429 430 431 432
	rc = devm_add_action_or_reset(pdev,
				      (void (*)(void *)) put_device,
				      &chip->dev);
	if (rc)
433
		return ERR_PTR(rc);
434

435
	dev_set_drvdata(pdev, chip);
J
Jason Gunthorpe 已提交
436

437
	return chip;
438 439 440
}
EXPORT_SYMBOL_GPL(tpmm_chip_alloc);

441
static int tpm_add_char_device(struct tpm_chip *chip)
J
Jarkko Sakkinen 已提交
442 443 444
{
	int rc;

445
	rc = cdev_device_add(&chip->cdev, &chip->dev);
J
Jarkko Sakkinen 已提交
446 447
	if (rc) {
		dev_err(&chip->dev,
448
			"unable to cdev_device_add() %s, major %d, minor %d, err=%d\n",
J
Jason Gunthorpe 已提交
449
			dev_name(&chip->dev), MAJOR(chip->dev.devt),
J
Jarkko Sakkinen 已提交
450 451 452 453
			MINOR(chip->dev.devt), rc);
		return rc;
	}

454 455 456 457 458 459 460 461 462
	if (chip->flags & TPM_CHIP_FLAG_TPM2) {
		rc = cdev_device_add(&chip->cdevs, &chip->devs);
		if (rc) {
			dev_err(&chip->devs,
				"unable to cdev_device_add() %s, major %d, minor %d, err=%d\n",
				dev_name(&chip->devs), MAJOR(chip->devs.devt),
				MINOR(chip->devs.devt), rc);
			return rc;
		}
463 464
	}

465 466 467 468 469
	/* Make the chip available. */
	mutex_lock(&idr_lock);
	idr_replace(&dev_nums_idr, chip, chip->dev_num);
	mutex_unlock(&idr_lock);

J
Jarkko Sakkinen 已提交
470 471 472
	return rc;
}

473
static void tpm_del_char_device(struct tpm_chip *chip)
J
Jarkko Sakkinen 已提交
474
{
475
	cdev_device_del(&chip->cdev, &chip->dev);
476 477 478 479 480

	/* Make the chip unavailable. */
	mutex_lock(&idr_lock);
	idr_replace(&dev_nums_idr, NULL, chip->dev_num);
	mutex_unlock(&idr_lock);
481 482 483

	/* Make the driver uncallable. */
	down_write(&chip->ops_sem);
484 485
	if (chip->flags & TPM_CHIP_FLAG_TPM2)
		tpm2_shutdown(chip, TPM2_SU_CLEAR);
486 487
	chip->ops = NULL;
	up_write(&chip->ops_sem);
J
Jarkko Sakkinen 已提交
488 489
}

490 491 492 493
static void tpm_del_legacy_sysfs(struct tpm_chip *chip)
{
	struct attribute **i;

494
	if (chip->flags & (TPM_CHIP_FLAG_TPM2 | TPM_CHIP_FLAG_VIRTUAL))
495
		return;
496

497 498 499 500
	sysfs_remove_link(&chip->dev.parent->kobj, "ppi");

	for (i = chip->groups[0]->attrs; *i != NULL; ++i)
		sysfs_remove_link(&chip->dev.parent->kobj, (*i)->name);
501 502
}

503 504 505 506 507 508 509 510 511
/* For compatibility with legacy sysfs paths we provide symlinks from the
 * parent dev directory to selected names within the tpm chip directory. Old
 * kernel versions created these files directly under the parent.
 */
static int tpm_add_legacy_sysfs(struct tpm_chip *chip)
{
	struct attribute **i;
	int rc;

512
	if (chip->flags & (TPM_CHIP_FLAG_TPM2 | TPM_CHIP_FLAG_VIRTUAL))
513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531
		return 0;

	rc = __compat_only_sysfs_link_entry_to_kobj(
		    &chip->dev.parent->kobj, &chip->dev.kobj, "ppi");
	if (rc && rc != -ENOENT)
		return rc;

	/* All the names from tpm-sysfs */
	for (i = chip->groups[0]->attrs; *i != NULL; ++i) {
		rc = __compat_only_sysfs_link_entry_to_kobj(
		    &chip->dev.parent->kobj, &chip->dev.kobj, (*i)->name);
		if (rc) {
			tpm_del_legacy_sysfs(chip);
			return rc;
		}
	}

	return 0;
}
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551

static int tpm_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait)
{
	struct tpm_chip *chip = container_of(rng, struct tpm_chip, hwrng);

	return tpm_get_random(chip, data, max);
}

static int tpm_add_hwrng(struct tpm_chip *chip)
{
	if (!IS_ENABLED(CONFIG_HW_RANDOM_TPM))
		return 0;

	snprintf(chip->hwrng_name, sizeof(chip->hwrng_name),
		 "tpm-rng-%d", chip->dev_num);
	chip->hwrng.name = chip->hwrng_name;
	chip->hwrng.read = tpm_hwrng_read;
	return hwrng_register(&chip->hwrng);
}

552
/*
J
Jarkko Sakkinen 已提交
553
 * tpm_chip_register() - create a character device for the TPM chip
554 555
 * @chip: TPM chip to use.
 *
556 557 558
 * Creates a character device for the TPM chip and adds sysfs attributes for
 * the device. As the last step this function adds the chip to the list of TPM
 * chips available for in-kernel use.
559
 *
560 561
 * This function should be only called after the chip initialization is
 * complete.
562 563 564 565 566
 */
int tpm_chip_register(struct tpm_chip *chip)
{
	int rc;

567 568 569
	rc = tpm_auto_startup(chip);
	if (rc)
		return rc;
570

571 572 573
	tpm_sysfs_add_device(chip);

	rc = tpm_bios_log_setup(chip);
574
	if (rc != 0 && rc != -ENODEV)
575
		return rc;
576

577 578
	tpm_add_ppi(chip);

579 580 581 582
	rc = tpm_add_hwrng(chip);
	if (rc)
		goto out_ppi;

583
	rc = tpm_add_char_device(chip);
584 585
	if (rc)
		goto out_hwrng;
586

587 588 589 590
	rc = tpm_add_legacy_sysfs(chip);
	if (rc) {
		tpm_chip_unregister(chip);
		return rc;
591 592
	}

593
	return 0;
594 595 596 597 598 599 600 601

out_hwrng:
	if (IS_ENABLED(CONFIG_HW_RANDOM_TPM))
		hwrng_unregister(&chip->hwrng);
out_ppi:
	tpm_bios_log_teardown(chip);

	return rc;
602 603 604 605 606 607 608 609 610 611
}
EXPORT_SYMBOL_GPL(tpm_chip_register);

/*
 * tpm_chip_unregister() - release the TPM driver
 * @chip: TPM chip to use.
 *
 * Takes the chip first away from the list of available TPM chips and then
 * cleans up all the resources reserved by tpm_chip_register().
 *
612 613 614
 * Once this function returns the driver call backs in 'op's will not be
 * running and will no longer start.
 *
615 616 617 618 619
 * NOTE: This function should be only called before deinitializing chip
 * resources.
 */
void tpm_chip_unregister(struct tpm_chip *chip)
{
620
	tpm_del_legacy_sysfs(chip);
621 622
	if (IS_ENABLED(CONFIG_HW_RANDOM_TPM))
		hwrng_unregister(&chip->hwrng);
623
	tpm_bios_log_teardown(chip);
624 625
	if (chip->flags & TPM_CHIP_FLAG_TPM2)
		cdev_device_del(&chip->cdevs, &chip->devs);
626
	tpm_del_char_device(chip);
627 628
}
EXPORT_SYMBOL_GPL(tpm_chip_unregister);