tpm_tis.c 28.6 KB
Newer Older
1 2
/*
 * Copyright (C) 2005, 2006 IBM Corporation
3
 * Copyright (C) 2014, 2015 Intel Corporation
4 5 6 7 8
 *
 * Authors:
 * Leendert van Doorn <leendert@watson.ibm.com>
 * Kylene Hall <kjhall@us.ibm.com>
 *
K
Kent Yoder 已提交
9 10
 * Maintained by: <tpmdd-devel@lists.sourceforge.net>
 *
11 12 13 14 15 16 17 18 19 20 21
 * Device driver for TCG/TCPA TPM (trusted platform module).
 * Specifications at www.trustedcomputinggroup.org
 *
 * This device driver implements the TPM interface as defined in
 * the TCG TPM Interface Spec version 1.2, revision 1.0.
 *
 * 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.
 */
22 23 24
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
25
#include <linux/pnp.h>
26
#include <linux/slab.h>
27 28
#include <linux/interrupt.h>
#include <linux/wait.h>
M
Matthew Garrett 已提交
29
#include <linux/acpi.h>
30
#include <linux/freezer.h>
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
#include "tpm.h"

enum tis_access {
	TPM_ACCESS_VALID = 0x80,
	TPM_ACCESS_ACTIVE_LOCALITY = 0x20,
	TPM_ACCESS_REQUEST_PENDING = 0x04,
	TPM_ACCESS_REQUEST_USE = 0x02,
};

enum tis_status {
	TPM_STS_VALID = 0x80,
	TPM_STS_COMMAND_READY = 0x40,
	TPM_STS_GO = 0x20,
	TPM_STS_DATA_AVAIL = 0x10,
	TPM_STS_DATA_EXPECT = 0x08,
};

enum tis_int_flags {
	TPM_GLOBAL_INT_ENABLE = 0x80000000,
	TPM_INTF_BURST_COUNT_STATIC = 0x100,
	TPM_INTF_CMD_READY_INT = 0x080,
	TPM_INTF_INT_EDGE_FALLING = 0x040,
	TPM_INTF_INT_EDGE_RISING = 0x020,
	TPM_INTF_INT_LEVEL_LOW = 0x010,
	TPM_INTF_INT_LEVEL_HIGH = 0x008,
	TPM_INTF_LOCALITY_CHANGE_INT = 0x004,
	TPM_INTF_STS_VALID_INT = 0x002,
	TPM_INTF_DATA_AVAIL_INT = 0x001,
};

61
enum tis_defaults {
62
	TIS_MEM_LEN = 0x5000,
K
Kylene Jo Hall 已提交
63 64
	TIS_SHORT_TIMEOUT = 750,	/* ms */
	TIS_LONG_TIMEOUT = 2000,	/* 2 sec */
65 66
};

67
struct tpm_info {
68
	struct resource res;
69 70 71 72 73
	/* irq > 0 means: use irq $irq;
	 * irq = 0 means: autoprobe for an irq;
	 * irq = -1 means: no irq support
	 */
	int irq;
74 75
};

J
Jarkko Sakkinen 已提交
76 77 78 79 80 81 82 83
/* Some timeout values are needed before it is known whether the chip is
 * TPM 1.0 or TPM 2.0.
 */
#define TIS_TIMEOUT_A_MAX	max(TIS_SHORT_TIMEOUT, TPM2_TIMEOUT_A)
#define TIS_TIMEOUT_B_MAX	max(TIS_LONG_TIMEOUT, TPM2_TIMEOUT_B)
#define TIS_TIMEOUT_C_MAX	max(TIS_SHORT_TIMEOUT, TPM2_TIMEOUT_C)
#define TIS_TIMEOUT_D_MAX	max(TIS_SHORT_TIMEOUT, TPM2_TIMEOUT_D)

84 85 86 87 88 89
#define	TPM_ACCESS(l)			(0x0000 | ((l) << 12))
#define	TPM_INT_ENABLE(l)		(0x0008 | ((l) << 12))
#define	TPM_INT_VECTOR(l)		(0x000C | ((l) << 12))
#define	TPM_INT_STATUS(l)		(0x0010 | ((l) << 12))
#define	TPM_INTF_CAPS(l)		(0x0014 | ((l) << 12))
#define	TPM_STS(l)			(0x0018 | ((l) << 12))
J
Jarkko Sakkinen 已提交
90
#define	TPM_STS3(l)			(0x001b | ((l) << 12))
91 92 93 94 95
#define	TPM_DATA_FIFO(l)		(0x0024 | ((l) << 12))

#define	TPM_DID_VID(l)			(0x0F00 | ((l) << 12))
#define	TPM_RID(l)			(0x0F04 | ((l) << 12))

96
struct priv_data {
97
	void __iomem *iobase;
98
	u16 manufacturer_id;
99
	bool irq_tested;
100
	wait_queue_head_t int_queue;
101 102
};

103
#if defined(CONFIG_PNP) && defined(CONFIG_ACPI)
104
static int has_hid(struct acpi_device *dev, const char *hid)
M
Matthew Garrett 已提交
105 106 107
{
	struct acpi_hardware_id *id;

108 109
	list_for_each_entry(id, &dev->pnp.ids, list)
		if (!strcmp(hid, id->id))
M
Matthew Garrett 已提交
110 111 112 113
			return 1;

	return 0;
}
114 115 116 117 118

static inline int is_itpm(struct acpi_device *dev)
{
	return has_hid(dev, "INTC0102");
}
119
#else
120
static inline int is_itpm(struct acpi_device *dev)
121 122 123
{
	return 0;
}
M
Matthew Garrett 已提交
124 125
#endif

126 127 128 129 130 131
/* Before we attempt to access the TPM we must see that the valid bit is set.
 * The specification says that this bit is 0 at reset and remains 0 until the
 * 'TPM has gone through its self test and initialization and has established
 * correct values in the other bits.' */
static int wait_startup(struct tpm_chip *chip, int l)
{
132
	struct priv_data *priv = chip->vendor.priv;
133 134
	unsigned long stop = jiffies + chip->vendor.timeout_a;
	do {
135
		if (ioread8(priv->iobase + TPM_ACCESS(l)) &
136 137 138 139 140 141 142
		    TPM_ACCESS_VALID)
			return 0;
		msleep(TPM_TIMEOUT);
	} while (time_before(jiffies, stop));
	return -1;
}

143 144
static int check_locality(struct tpm_chip *chip, int l)
{
145 146 147
	struct priv_data *priv = chip->vendor.priv;

	if ((ioread8(priv->iobase + TPM_ACCESS(l)) &
148 149 150 151 152 153 154 155 156
	     (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) ==
	    (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID))
		return chip->vendor.locality = l;

	return -1;
}

static void release_locality(struct tpm_chip *chip, int l, int force)
{
157 158 159
	struct priv_data *priv = chip->vendor.priv;

	if (force || (ioread8(priv->iobase + TPM_ACCESS(l)) &
160 161 162
		      (TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID)) ==
	    (TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID))
		iowrite8(TPM_ACCESS_ACTIVE_LOCALITY,
163
			 priv->iobase + TPM_ACCESS(l));
164 165 166 167
}

static int request_locality(struct tpm_chip *chip, int l)
{
168
	struct priv_data *priv = chip->vendor.priv;
169
	unsigned long stop, timeout;
170 171 172 173 174 175
	long rc;

	if (check_locality(chip, l) >= 0)
		return l;

	iowrite8(TPM_ACCESS_REQUEST_USE,
176
		 priv->iobase + TPM_ACCESS(l));
177

178 179
	stop = jiffies + chip->vendor.timeout_a;

180
	if (chip->vendor.irq) {
181 182 183 184
again:
		timeout = stop - jiffies;
		if ((long)timeout <= 0)
			return -1;
185
		rc = wait_event_interruptible_timeout(priv->int_queue,
186 187
						      (check_locality
						       (chip, l) >= 0),
188
						      timeout);
189 190
		if (rc > 0)
			return l;
191 192 193 194
		if (rc == -ERESTARTSYS && freezing(current)) {
			clear_thread_flag(TIF_SIGPENDING);
			goto again;
		}
195 196 197 198 199 200 201 202 203 204 205 206 207 208
	} else {
		/* wait for burstcount */
		do {
			if (check_locality(chip, l) >= 0)
				return l;
			msleep(TPM_TIMEOUT);
		}
		while (time_before(jiffies, stop));
	}
	return -1;
}

static u8 tpm_tis_status(struct tpm_chip *chip)
{
209 210 211
	struct priv_data *priv = chip->vendor.priv;

	return ioread8(priv->iobase +
212 213 214 215 216
		       TPM_STS(chip->vendor.locality));
}

static void tpm_tis_ready(struct tpm_chip *chip)
{
217 218
	struct priv_data *priv = chip->vendor.priv;

219 220
	/* this causes the current command to be aborted */
	iowrite8(TPM_STS_COMMAND_READY,
221
		 priv->iobase + TPM_STS(chip->vendor.locality));
222 223 224 225
}

static int get_burstcount(struct tpm_chip *chip)
{
226
	struct priv_data *priv = chip->vendor.priv;
227 228 229 230 231
	unsigned long stop;
	int burstcnt;

	/* wait for burstcount */
	/* which timeout value, spec has 2 answers (c & d) */
232
	stop = jiffies + chip->vendor.timeout_d;
233
	do {
234
		burstcnt = ioread8(priv->iobase +
235
				   TPM_STS(chip->vendor.locality) + 1);
236
		burstcnt += ioread8(priv->iobase +
237 238 239 240 241 242 243 244 245
				    TPM_STS(chip->vendor.locality) +
				    2) << 8;
		if (burstcnt)
			return burstcnt;
		msleep(TPM_TIMEOUT);
	} while (time_before(jiffies, stop));
	return -EBUSY;
}

K
Kylene Jo Hall 已提交
246
static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count)
247
{
248
	struct priv_data *priv = chip->vendor.priv;
249 250
	int size = 0, burstcnt;
	while (size < count &&
251 252 253
	       wait_for_tpm_stat(chip,
				 TPM_STS_DATA_AVAIL | TPM_STS_VALID,
				 chip->vendor.timeout_c,
254
				 &chip->vendor.read_queue, true)
255 256 257
	       == 0) {
		burstcnt = get_burstcount(chip);
		for (; burstcnt > 0 && size < count; burstcnt--)
258
			buf[size++] = ioread8(priv->iobase +
259 260 261 262 263 264
					      TPM_DATA_FIFO(chip->vendor.
							    locality));
	}
	return size;
}

K
Kylene Jo Hall 已提交
265
static int tpm_tis_recv(struct tpm_chip *chip, u8 *buf, size_t count)
266
{
267
	struct priv_data *priv = chip->vendor.priv;
268 269 270 271 272 273 274 275 276 277 278
	int size = 0;
	int expected, status;

	if (count < TPM_HEADER_SIZE) {
		size = -EIO;
		goto out;
	}

	/* read first 10 bytes, including tag, paramsize, and result */
	if ((size =
	     recv_data(chip, buf, TPM_HEADER_SIZE)) < TPM_HEADER_SIZE) {
J
Jason Gunthorpe 已提交
279
		dev_err(&chip->dev, "Unable to read header\n");
280 281 282 283 284 285 286 287 288 289 290 291
		goto out;
	}

	expected = be32_to_cpu(*(__be32 *) (buf + 2));
	if (expected > count) {
		size = -EIO;
		goto out;
	}

	if ((size +=
	     recv_data(chip, &buf[TPM_HEADER_SIZE],
		       expected - TPM_HEADER_SIZE)) < expected) {
J
Jason Gunthorpe 已提交
292
		dev_err(&chip->dev, "Unable to read remainder of result\n");
293 294 295 296
		size = -ETIME;
		goto out;
	}

297
	wait_for_tpm_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c,
298
			  &priv->int_queue, false);
299 300
	status = tpm_tis_status(chip);
	if (status & TPM_STS_DATA_AVAIL) {	/* retry? */
J
Jason Gunthorpe 已提交
301
		dev_err(&chip->dev, "Error left over data\n");
302 303 304 305 306 307 308 309 310 311
		size = -EIO;
		goto out;
	}

out:
	tpm_tis_ready(chip);
	release_locality(chip, chip->vendor.locality, 0);
	return size;
}

312
static bool itpm;
313 314 315
module_param(itpm, bool, 0444);
MODULE_PARM_DESC(itpm, "Force iTPM workarounds (found on some Lenovo laptops)");

316 317 318 319 320
/*
 * If interrupts are used (signaled by an irq set in the vendor structure)
 * tpm.c can skip polling for the data to be available as the interrupt is
 * waited for here
 */
321
static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len)
322
{
323
	struct priv_data *priv = chip->vendor.priv;
324 325 326 327 328 329 330 331 332
	int rc, status, burstcnt;
	size_t count = 0;

	if (request_locality(chip, 0) < 0)
		return -EBUSY;

	status = tpm_tis_status(chip);
	if ((status & TPM_STS_COMMAND_READY) == 0) {
		tpm_tis_ready(chip);
333
		if (wait_for_tpm_stat
334
		    (chip, TPM_STS_COMMAND_READY, chip->vendor.timeout_b,
335
		     &priv->int_queue, false) < 0) {
336 337 338 339 340 341 342 343
			rc = -ETIME;
			goto out_err;
		}
	}

	while (count < len - 1) {
		burstcnt = get_burstcount(chip);
		for (; burstcnt > 0 && count < len - 1; burstcnt--) {
344
			iowrite8(buf[count], priv->iobase +
345 346 347 348
				 TPM_DATA_FIFO(chip->vendor.locality));
			count++;
		}

349
		wait_for_tpm_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c,
350
				  &priv->int_queue, false);
351
		status = tpm_tis_status(chip);
352
		if (!itpm && (status & TPM_STS_DATA_EXPECT) == 0) {
353 354 355 356 357 358 359
			rc = -EIO;
			goto out_err;
		}
	}

	/* write last byte */
	iowrite8(buf[count],
360
		 priv->iobase + TPM_DATA_FIFO(chip->vendor.locality));
361
	wait_for_tpm_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c,
362
			  &priv->int_queue, false);
363 364 365 366 367 368
	status = tpm_tis_status(chip);
	if ((status & TPM_STS_DATA_EXPECT) != 0) {
		rc = -EIO;
		goto out_err;
	}

369 370 371 372 373 374 375 376
	return 0;

out_err:
	tpm_tis_ready(chip);
	release_locality(chip, chip->vendor.locality, 0);
	return rc;
}

377 378
static void disable_interrupts(struct tpm_chip *chip)
{
379
	struct priv_data *priv = chip->vendor.priv;
380 381 382
	u32 intmask;

	intmask =
383
	    ioread32(priv->iobase +
384 385 386
		     TPM_INT_ENABLE(chip->vendor.locality));
	intmask &= ~TPM_GLOBAL_INT_ENABLE;
	iowrite32(intmask,
387
		  priv->iobase + TPM_INT_ENABLE(chip->vendor.locality));
J
Jason Gunthorpe 已提交
388
	devm_free_irq(&chip->dev, chip->vendor.irq, chip);
389 390 391
	chip->vendor.irq = 0;
}

392 393 394 395 396
/*
 * If interrupts are used (signaled by an irq set in the vendor structure)
 * tpm.c can skip polling for the data to be available as the interrupt is
 * waited for here
 */
397
static int tpm_tis_send_main(struct tpm_chip *chip, u8 *buf, size_t len)
398
{
399
	struct priv_data *priv = chip->vendor.priv;
400 401
	int rc;
	u32 ordinal;
J
Jarkko Sakkinen 已提交
402
	unsigned long dur;
403 404 405 406 407

	rc = tpm_tis_send_data(chip, buf, len);
	if (rc < 0)
		return rc;

408 409
	/* go and do it */
	iowrite8(TPM_STS_GO,
410
		 priv->iobase + TPM_STS(chip->vendor.locality));
411 412 413

	if (chip->vendor.irq) {
		ordinal = be32_to_cpu(*((__be32 *) (buf + 6)));
J
Jarkko Sakkinen 已提交
414 415 416 417 418 419

		if (chip->flags & TPM_CHIP_FLAG_TPM2)
			dur = tpm2_calc_ordinal_duration(chip, ordinal);
		else
			dur = tpm_calc_ordinal_duration(chip, ordinal);

420
		if (wait_for_tpm_stat
J
Jarkko Sakkinen 已提交
421
		    (chip, TPM_STS_DATA_AVAIL | TPM_STS_VALID, dur,
422
		     &chip->vendor.read_queue, false) < 0) {
423 424 425 426 427 428 429 430 431 432 433
			rc = -ETIME;
			goto out_err;
		}
	}
	return len;
out_err:
	tpm_tis_ready(chip);
	release_locality(chip, chip->vendor.locality, 0);
	return rc;
}

434 435 436 437 438 439 440 441 442 443 444 445 446 447 448
static int tpm_tis_send(struct tpm_chip *chip, u8 *buf, size_t len)
{
	int rc, irq;
	struct priv_data *priv = chip->vendor.priv;

	if (!chip->vendor.irq || priv->irq_tested)
		return tpm_tis_send_main(chip, buf, len);

	/* Verify receipt of the expected IRQ */
	irq = chip->vendor.irq;
	chip->vendor.irq = 0;
	rc = tpm_tis_send_main(chip, buf, len);
	chip->vendor.irq = irq;
	if (!priv->irq_tested)
		msleep(1);
449
	if (!priv->irq_tested)
450 451 452 453 454
		disable_interrupts(chip);
	priv->irq_tested = true;
	return rc;
}

455 456 457 458 459 460 461 462 463 464 465 466 467 468
struct tis_vendor_timeout_override {
	u32 did_vid;
	unsigned long timeout_us[4];
};

static const struct tis_vendor_timeout_override vendor_timeout_overrides[] = {
	/* Atmel 3204 */
	{ 0x32041114, { (TIS_SHORT_TIMEOUT*1000), (TIS_LONG_TIMEOUT*1000),
			(TIS_SHORT_TIMEOUT*1000), (TIS_SHORT_TIMEOUT*1000) } },
};

static bool tpm_tis_update_timeouts(struct tpm_chip *chip,
				    unsigned long *timeout_cap)
{
469
	struct priv_data *priv = chip->vendor.priv;
470 471 472
	int i;
	u32 did_vid;

473
	did_vid = ioread32(priv->iobase + TPM_DID_VID(0));
474 475 476 477 478 479 480 481 482 483 484 485

	for (i = 0; i != ARRAY_SIZE(vendor_timeout_overrides); i++) {
		if (vendor_timeout_overrides[i].did_vid != did_vid)
			continue;
		memcpy(timeout_cap, vendor_timeout_overrides[i].timeout_us,
		       sizeof(vendor_timeout_overrides[i].timeout_us));
		return true;
	}

	return false;
}

486 487 488 489 490 491 492
/*
 * Early probing for iTPM with STS_DATA_EXPECT flaw.
 * Try sending command without itpm flag set and if that
 * fails, repeat with itpm flag set.
 */
static int probe_itpm(struct tpm_chip *chip)
{
493
	struct priv_data *priv = chip->vendor.priv;
494 495 496 497 498 499
	int rc = 0;
	u8 cmd_getticks[] = {
		0x00, 0xc1, 0x00, 0x00, 0x00, 0x0a,
		0x00, 0x00, 0x00, 0xf1
	};
	size_t len = sizeof(cmd_getticks);
500
	bool rem_itpm = itpm;
501
	u16 vendor = ioread16(priv->iobase + TPM_DID_VID(0));
S
Stefan Berger 已提交
502 503 504 505

	/* probe only iTPMS */
	if (vendor != TPM_VID_INTEL)
		return 0;
506

507
	itpm = false;
508 509 510 511 512 513 514 515

	rc = tpm_tis_send_data(chip, cmd_getticks, len);
	if (rc == 0)
		goto out;

	tpm_tis_ready(chip);
	release_locality(chip, chip->vendor.locality, 0);

516
	itpm = true;
517 518 519

	rc = tpm_tis_send_data(chip, cmd_getticks, len);
	if (rc == 0) {
J
Jason Gunthorpe 已提交
520
		dev_info(&chip->dev, "Detected an iTPM.\n");
521 522 523 524 525 526 527 528 529 530 531 532
		rc = 1;
	} else
		rc = -EFAULT;

out:
	itpm = rem_itpm;
	tpm_tis_ready(chip);
	release_locality(chip, chip->vendor.locality, 0);

	return rc;
}

533 534
static bool tpm_tis_req_canceled(struct tpm_chip *chip, u8 status)
{
535 536 537
	struct priv_data *priv = chip->vendor.priv;

	switch (priv->manufacturer_id) {
538 539 540 541 542 543 544 545 546 547
	case TPM_VID_WINBOND:
		return ((status == TPM_STS_VALID) ||
			(status == (TPM_STS_VALID | TPM_STS_COMMAND_READY)));
	case TPM_VID_STM:
		return (status == (TPM_STS_VALID | TPM_STS_COMMAND_READY));
	default:
		return (status == TPM_STS_COMMAND_READY);
	}
}

548
static const struct tpm_class_ops tpm_tis = {
549 550 551 552
	.status = tpm_tis_status,
	.recv = tpm_tis_recv,
	.send = tpm_tis_send,
	.cancel = tpm_tis_ready,
553
	.update_timeouts = tpm_tis_update_timeouts,
554 555
	.req_complete_mask = TPM_STS_DATA_AVAIL | TPM_STS_VALID,
	.req_complete_val = TPM_STS_DATA_AVAIL | TPM_STS_VALID,
556
	.req_canceled = tpm_tis_req_canceled,
557 558
};

559
static irqreturn_t tis_int_handler(int dummy, void *dev_id)
560
{
561
	struct tpm_chip *chip = dev_id;
562
	struct priv_data *priv = chip->vendor.priv;
563 564 565
	u32 interrupt;
	int i;

566
	interrupt = ioread32(priv->iobase +
567 568 569 570 571
			     TPM_INT_STATUS(chip->vendor.locality));

	if (interrupt == 0)
		return IRQ_NONE;

572
	((struct priv_data *)chip->vendor.priv)->irq_tested = true;
573 574 575 576 577 578 579 580 581
	if (interrupt & TPM_INTF_DATA_AVAIL_INT)
		wake_up_interruptible(&chip->vendor.read_queue);
	if (interrupt & TPM_INTF_LOCALITY_CHANGE_INT)
		for (i = 0; i < 5; i++)
			if (check_locality(chip, i) >= 0)
				break;
	if (interrupt &
	    (TPM_INTF_LOCALITY_CHANGE_INT | TPM_INTF_STS_VALID_INT |
	     TPM_INTF_CMD_READY_INT))
582
		wake_up_interruptible(&priv->int_queue);
583 584 585

	/* Clear interrupts handled with TPM_EOI */
	iowrite32(interrupt,
586
		  priv->iobase +
587
		  TPM_INT_STATUS(chip->vendor.locality));
588
	ioread32(priv->iobase + TPM_INT_STATUS(chip->vendor.locality));
589 590 591
	return IRQ_HANDLED;
}

592 593 594 595
/* Register the IRQ and issue a command that will cause an interrupt. If an
 * irq is seen then leave the chip setup for IRQ operation, otherwise reverse
 * everything and leave in polling mode. Returns 0 on success.
 */
596 597
static int tpm_tis_probe_irq_single(struct tpm_chip *chip, u32 intmask,
				    int flags, int irq)
598 599 600 601
{
	struct priv_data *priv = chip->vendor.priv;
	u8 original_int_vec;

J
Jason Gunthorpe 已提交
602
	if (devm_request_irq(&chip->dev, irq, tis_int_handler, flags,
J
Jason Gunthorpe 已提交
603
			     dev_name(&chip->dev), chip) != 0) {
J
Jason Gunthorpe 已提交
604
		dev_info(&chip->dev, "Unable to request irq: %d for probe\n",
605 606 607 608 609
			 irq);
		return -1;
	}
	chip->vendor.irq = irq;

610
	original_int_vec = ioread8(priv->iobase +
611 612
				   TPM_INT_VECTOR(chip->vendor.locality));
	iowrite8(irq,
613
		 priv->iobase + TPM_INT_VECTOR(chip->vendor.locality));
614 615

	/* Clear all existing */
616
	iowrite32(ioread32(priv->iobase +
617
			   TPM_INT_STATUS(chip->vendor.locality)),
618
		  priv->iobase + TPM_INT_STATUS(chip->vendor.locality));
619 620 621

	/* Turn on */
	iowrite32(intmask | TPM_GLOBAL_INT_ENABLE,
622
		  priv->iobase + TPM_INT_ENABLE(chip->vendor.locality));
623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638

	priv->irq_tested = false;

	/* Generate an interrupt by having the core call through to
	 * tpm_tis_send
	 */
	if (chip->flags & TPM_CHIP_FLAG_TPM2)
		tpm2_gen_interrupt(chip);
	else
		tpm_gen_interrupt(chip);

	/* tpm_tis_send will either confirm the interrupt is working or it
	 * will call disable_irq which undoes all of the above.
	 */
	if (!chip->vendor.irq) {
		iowrite8(original_int_vec,
639
			 priv->iobase + TPM_INT_VECTOR(chip->vendor.locality));
640 641 642 643 644 645 646 647 648 649 650 651
		return 1;
	}

	return 0;
}

/* Try to find the IRQ the TPM is using. This is for legacy x86 systems that
 * do not have ACPI/etc. We typically expect the interrupt to be declared if
 * present.
 */
static void tpm_tis_probe_irq(struct tpm_chip *chip, u32 intmask)
{
652
	struct priv_data *priv = chip->vendor.priv;
653 654 655
	u8 original_int_vec;
	int i;

656
	original_int_vec = ioread8(priv->iobase +
657 658 659
				   TPM_INT_VECTOR(chip->vendor.locality));

	if (!original_int_vec) {
660 661 662 663 664 665 666
		if (IS_ENABLED(CONFIG_X86))
			for (i = 3; i <= 15; i++)
				if (!tpm_tis_probe_irq_single(chip, intmask, 0,
							      i))
					return;
	} else if (!tpm_tis_probe_irq_single(chip, intmask, 0,
					     original_int_vec))
667 668 669
		return;
}

670
static bool interrupts = true;
671 672 673
module_param(interrupts, bool, 0444);
MODULE_PARM_DESC(interrupts, "Enable interrupts");

674 675
static void tpm_tis_remove(struct tpm_chip *chip)
{
676 677
	struct priv_data *priv = chip->vendor.priv;
	void __iomem *reg = priv->iobase +
J
Jarkko Sakkinen 已提交
678 679 680
		TPM_INT_ENABLE(chip->vendor.locality);

	iowrite32(~TPM_GLOBAL_INT_ENABLE & ioread32(reg), reg);
681 682 683
	release_locality(chip, chip->vendor.locality, 1);
}

684 685
static int tpm_tis_init(struct device *dev, struct tpm_info *tpm_info,
			acpi_handle acpi_dev_handle)
686 687
{
	u32 vendor, intfcaps, intmask;
688
	int rc, probe;
689
	struct tpm_chip *chip;
690
	struct priv_data *priv;
691

692 693 694
	priv = devm_kzalloc(dev, sizeof(struct priv_data), GFP_KERNEL);
	if (priv == NULL)
		return -ENOMEM;
695 696 697 698 699

	chip = tpmm_chip_alloc(dev, &tpm_tis);
	if (IS_ERR(chip))
		return PTR_ERR(chip);

700
	chip->vendor.priv = priv;
J
Jarkko Sakkinen 已提交
701
#ifdef CONFIG_ACPI
702
	chip->acpi_dev_handle = acpi_dev_handle;
J
Jarkko Sakkinen 已提交
703
#endif
704

705 706 707
	priv->iobase = devm_ioremap_resource(dev, &tpm_info->res);
	if (IS_ERR(priv->iobase))
		return PTR_ERR(priv->iobase);
708

J
Jarkko Sakkinen 已提交
709 710 711 712 713
	/* Maximum timeouts */
	chip->vendor.timeout_a = TIS_TIMEOUT_A_MAX;
	chip->vendor.timeout_b = TIS_TIMEOUT_B_MAX;
	chip->vendor.timeout_c = TIS_TIMEOUT_C_MAX;
	chip->vendor.timeout_d = TIS_TIMEOUT_D_MAX;
714

715 716 717 718 719
	if (wait_startup(chip, 0) != 0) {
		rc = -ENODEV;
		goto out_err;
	}

720
	/* Take control of the TPM's interrupt hardware and shut it off */
721
	intmask = ioread32(priv->iobase +
722 723 724 725 726
			   TPM_INT_ENABLE(chip->vendor.locality));
	intmask |= TPM_INTF_CMD_READY_INT | TPM_INTF_LOCALITY_CHANGE_INT |
		   TPM_INTF_DATA_AVAIL_INT | TPM_INTF_STS_VALID_INT;
	intmask &= ~TPM_GLOBAL_INT_ENABLE;
	iowrite32(intmask,
727
		  priv->iobase + TPM_INT_ENABLE(chip->vendor.locality));
728

729 730 731 732 733
	if (request_locality(chip, 0) != 0) {
		rc = -ENODEV;
		goto out_err;
	}

734 735 736
	rc = tpm2_probe(chip);
	if (rc)
		goto out_err;
J
Jarkko Sakkinen 已提交
737

738
	vendor = ioread32(priv->iobase + TPM_DID_VID(0));
739
	priv->manufacturer_id = vendor;
740

J
Jarkko Sakkinen 已提交
741 742
	dev_info(dev, "%s TPM (device-id 0x%X, rev-id %d)\n",
		 (chip->flags & TPM_CHIP_FLAG_TPM2) ? "2.0" : "1.2",
743
		 vendor >> 16, ioread8(priv->iobase + TPM_RID(0)));
744

745
	if (!itpm) {
746 747
		probe = probe_itpm(chip);
		if (probe < 0) {
748 749 750
			rc = -ENODEV;
			goto out_err;
		}
751
		itpm = !!probe;
752 753
	}

754 755 756 757
	if (itpm)
		dev_info(dev, "Intel iTPM workaround enabled\n");


758 759
	/* Figure out the capabilities */
	intfcaps =
760
	    ioread32(priv->iobase +
761
		     TPM_INTF_CAPS(chip->vendor.locality));
762
	dev_dbg(dev, "TPM interface capabilities (0x%x):\n",
763 764
		intfcaps);
	if (intfcaps & TPM_INTF_BURST_COUNT_STATIC)
765
		dev_dbg(dev, "\tBurst Count Static\n");
766
	if (intfcaps & TPM_INTF_CMD_READY_INT)
767
		dev_dbg(dev, "\tCommand Ready Int Support\n");
768
	if (intfcaps & TPM_INTF_INT_EDGE_FALLING)
769
		dev_dbg(dev, "\tInterrupt Edge Falling\n");
770
	if (intfcaps & TPM_INTF_INT_EDGE_RISING)
771
		dev_dbg(dev, "\tInterrupt Edge Rising\n");
772
	if (intfcaps & TPM_INTF_INT_LEVEL_LOW)
773
		dev_dbg(dev, "\tInterrupt Level Low\n");
774
	if (intfcaps & TPM_INTF_INT_LEVEL_HIGH)
775
		dev_dbg(dev, "\tInterrupt Level High\n");
776
	if (intfcaps & TPM_INTF_LOCALITY_CHANGE_INT)
777
		dev_dbg(dev, "\tLocality Change Int Support\n");
778
	if (intfcaps & TPM_INTF_STS_VALID_INT)
779
		dev_dbg(dev, "\tSts Valid Int Support\n");
780
	if (intfcaps & TPM_INTF_DATA_AVAIL_INT)
781
		dev_dbg(dev, "\tData Avail Int Support\n");
782

J
Jason Gunthorpe 已提交
783 784 785 786 787 788 789 790 791 792
	/* Very early on issue a command to the TPM in polling mode to make
	 * sure it works. May as well use that command to set the proper
	 *  timeouts for the driver.
	 */
	if (tpm_get_timeouts(chip)) {
		dev_err(dev, "Could not get TPM timeouts and durations\n");
		rc = -ENODEV;
		goto out_err;
	}

793 794
	/* INTERRUPT Setup */
	init_waitqueue_head(&chip->vendor.read_queue);
795
	init_waitqueue_head(&priv->int_queue);
796
	if (interrupts && tpm_info->irq != -1) {
797
		if (tpm_info->irq) {
798 799
			tpm_tis_probe_irq_single(chip, intmask, IRQF_SHARED,
						 tpm_info->irq);
800
			if (!chip->vendor.irq)
J
Jason Gunthorpe 已提交
801
				dev_err(&chip->dev, FW_BUG
802 803 804
					"TPM interrupt not working, polling instead\n");
		} else
			tpm_tis_probe_irq(chip, intmask);
J
Jason Gunthorpe 已提交
805
	}
J
Jarkko Sakkinen 已提交
806

J
Jason Gunthorpe 已提交
807
	if (chip->flags & TPM_CHIP_FLAG_TPM2) {
J
Jarkko Sakkinen 已提交
808 809 810 811 812 813 814
		rc = tpm2_do_selftest(chip);
		if (rc == TPM2_RC_INITIALIZE) {
			dev_warn(dev, "Firmware has not started TPM\n");
			rc  = tpm2_startup(chip, TPM2_SU_CLEAR);
			if (!rc)
				rc = tpm2_do_selftest(chip);
		}
815

J
Jarkko Sakkinen 已提交
816 817 818 819 820 821 822 823 824 825 826 827
		if (rc) {
			dev_err(dev, "TPM self test failed\n");
			if (rc > 0)
				rc = -ENODEV;
			goto out_err;
		}
	} else {
		if (tpm_do_selftest(chip)) {
			dev_err(dev, "TPM self test failed\n");
			rc = -ENODEV;
			goto out_err;
		}
828 829
	}

830
	return tpm_chip_register(chip);
831
out_err:
832
	tpm_tis_remove(chip);
833 834
	return rc;
}
835

836
#ifdef CONFIG_PM_SLEEP
837 838
static void tpm_tis_reenable_interrupts(struct tpm_chip *chip)
{
839
	struct priv_data *priv = chip->vendor.priv;
840 841 842 843
	u32 intmask;

	/* reenable interrupts that device may have lost or
	   BIOS/firmware may have disabled */
844
	iowrite8(chip->vendor.irq, priv->iobase +
845 846 847
		 TPM_INT_VECTOR(chip->vendor.locality));

	intmask =
848
	    ioread32(priv->iobase + TPM_INT_ENABLE(chip->vendor.locality));
849 850 851 852 853 854

	intmask |= TPM_INTF_CMD_READY_INT
	    | TPM_INTF_LOCALITY_CHANGE_INT | TPM_INTF_DATA_AVAIL_INT
	    | TPM_INTF_STS_VALID_INT | TPM_GLOBAL_INT_ENABLE;

	iowrite32(intmask,
855
		  priv->iobase + TPM_INT_ENABLE(chip->vendor.locality));
856 857
}

858 859 860
static int tpm_tis_resume(struct device *dev)
{
	struct tpm_chip *chip = dev_get_drvdata(dev);
861
	int ret;
862 863 864 865

	if (chip->vendor.irq)
		tpm_tis_reenable_interrupts(chip);

866 867 868
	ret = tpm_pm_resume(dev);
	if (ret)
		return ret;
J
Jarkko Sakkinen 已提交
869

870 871 872 873 874
	/* TPM 1.2 requires self-test on resume. This function actually returns
	 * an error code but for unknown reason it isn't handled.
	 */
	if (!(chip->flags & TPM_CHIP_FLAG_TPM2))
		tpm_do_selftest(chip);
875

876
	return 0;
877
}
878
#endif
879 880 881

static SIMPLE_DEV_PM_OPS(tpm_tis_pm, tpm_pm_suspend, tpm_tis_resume);

B
Bill Pemberton 已提交
882
static int tpm_tis_pnp_init(struct pnp_dev *pnp_dev,
883
			    const struct pnp_device_id *pnp_id)
884
{
885
	struct tpm_info tpm_info = {};
886
	acpi_handle acpi_dev_handle = NULL;
887
	struct resource *res;
888

889 890 891 892
	res = pnp_get_resource(pnp_dev, IORESOURCE_MEM, 0);
	if (!res)
		return -ENODEV;
	tpm_info.res = *res;
893

894
	if (pnp_irq_valid(pnp_dev, 0))
895
		tpm_info.irq = pnp_irq(pnp_dev, 0);
896
	else
897
		tpm_info.irq = -1;
898

899 900 901 902
	if (pnp_acpi_device(pnp_dev)) {
		if (is_itpm(pnp_acpi_device(pnp_dev)))
			itpm = true;

903
		acpi_dev_handle = ACPI_HANDLE(&pnp_dev->dev);
904
	}
905

906
	return tpm_tis_init(&pnp_dev->dev, &tpm_info, acpi_dev_handle);
907 908
}

B
Bill Pemberton 已提交
909
static struct pnp_device_id tpm_pnp_tbl[] = {
910
	{"PNP0C31", 0},		/* TPM */
911 912 913
	{"ATM1200", 0},		/* Atmel */
	{"IFX0102", 0},		/* Infineon */
	{"BCM0101", 0},		/* Broadcom */
914
	{"BCM0102", 0},		/* Broadcom */
915
	{"NSC1200", 0},		/* National */
M
Marcin Obara 已提交
916
	{"ICO0102", 0},		/* Intel */
917 918 919
	/* Add new here */
	{"", 0},		/* User Specified */
	{"", 0}			/* Terminator */
920
};
921
MODULE_DEVICE_TABLE(pnp, tpm_pnp_tbl);
922

B
Bill Pemberton 已提交
923
static void tpm_tis_pnp_remove(struct pnp_dev *dev)
924 925
{
	struct tpm_chip *chip = pnp_get_drvdata(dev);
926

927 928
	tpm_chip_unregister(chip);
	tpm_tis_remove(chip);
929 930
}

931 932 933 934
static struct pnp_driver tis_pnp_driver = {
	.name = "tpm_tis",
	.id_table = tpm_pnp_tbl,
	.probe = tpm_tis_pnp_init,
935
	.remove = tpm_tis_pnp_remove,
936 937 938
	.driver	= {
		.pm = &tpm_tis_pm,
	},
939 940
};

941 942 943 944
#define TIS_HID_USR_IDX sizeof(tpm_pnp_tbl)/sizeof(struct pnp_device_id) -2
module_param_string(hid, tpm_pnp_tbl[TIS_HID_USR_IDX].id,
		    sizeof(tpm_pnp_tbl[TIS_HID_USR_IDX].id), 0444);
MODULE_PARM_DESC(hid, "Set additional specific HID for this driver to probe");
945

946 947 948 949 950 951
#ifdef CONFIG_ACPI
static int tpm_check_resource(struct acpi_resource *ares, void *data)
{
	struct tpm_info *tpm_info = (struct tpm_info *) data;
	struct resource res;

952
	if (acpi_dev_resource_interrupt(ares, 0, &res))
953
		tpm_info->irq = res.start;
954
	else if (acpi_dev_resource_memory(ares, &res)) {
955
		tpm_info->res = res;
956 957
		tpm_info->res.name = NULL;
	}
958 959 960 961 962 963

	return 1;
}

static int tpm_tis_acpi_init(struct acpi_device *acpi_dev)
{
964 965
	struct acpi_table_tpm2 *tbl;
	acpi_status st;
966
	struct list_head resources;
967
	struct tpm_info tpm_info = {};
968 969
	int ret;

970 971 972 973 974 975 976 977 978
	st = acpi_get_table(ACPI_SIG_TPM2, 1,
			    (struct acpi_table_header **) &tbl);
	if (ACPI_FAILURE(st) || tbl->header.length < sizeof(*tbl)) {
		dev_err(&acpi_dev->dev,
			FW_BUG "failed to get TPM2 ACPI table\n");
		return -EINVAL;
	}

	if (tbl->start_method != ACPI_TPM2_MEMORY_MAPPED)
979 980 981
		return -ENODEV;

	INIT_LIST_HEAD(&resources);
982
	tpm_info.irq = -1;
983 984 985 986 987 988 989
	ret = acpi_dev_get_resources(acpi_dev, &resources, tpm_check_resource,
				     &tpm_info);
	if (ret < 0)
		return ret;

	acpi_dev_free_resource_list(&resources);

990
	if (resource_type(&tpm_info.res) != IORESOURCE_MEM) {
991 992 993 994 995
		dev_err(&acpi_dev->dev,
			FW_BUG "TPM2 ACPI table does not define a memory resource\n");
		return -EINVAL;
	}

996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032
	if (is_itpm(acpi_dev))
		itpm = true;

	return tpm_tis_init(&acpi_dev->dev, &tpm_info, acpi_dev->handle);
}

static int tpm_tis_acpi_remove(struct acpi_device *dev)
{
	struct tpm_chip *chip = dev_get_drvdata(&dev->dev);

	tpm_chip_unregister(chip);
	tpm_tis_remove(chip);

	return 0;
}

static struct acpi_device_id tpm_acpi_tbl[] = {
	{"MSFT0101", 0},	/* TPM 2.0 */
	/* Add new here */
	{"", 0},		/* User Specified */
	{"", 0}			/* Terminator */
};
MODULE_DEVICE_TABLE(acpi, tpm_acpi_tbl);

static struct acpi_driver tis_acpi_driver = {
	.name = "tpm_tis",
	.ids = tpm_acpi_tbl,
	.ops = {
		.add = tpm_tis_acpi_init,
		.remove = tpm_tis_acpi_remove,
	},
	.drv = {
		.pm = &tpm_tis_pm,
	},
};
#endif

1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070
static struct platform_device *force_pdev;

static int tpm_tis_plat_probe(struct platform_device *pdev)
{
	struct tpm_info tpm_info = {};
	struct resource *res;

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (res == NULL) {
		dev_err(&pdev->dev, "no memory resource defined\n");
		return -ENODEV;
	}
	tpm_info.res = *res;

	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
	if (res) {
		tpm_info.irq = res->start;
	} else {
		if (pdev == force_pdev)
			tpm_info.irq = -1;
		else
			/* When forcing auto probe the IRQ */
			tpm_info.irq = 0;
	}

	return tpm_tis_init(&pdev->dev, &tpm_info, NULL);
}

static int tpm_tis_plat_remove(struct platform_device *pdev)
{
	struct tpm_chip *chip = dev_get_drvdata(&pdev->dev);

	tpm_chip_unregister(chip);
	tpm_tis_remove(chip);

	return 0;
}

1071
static struct platform_driver tis_drv = {
1072 1073
	.probe = tpm_tis_plat_probe,
	.remove = tpm_tis_plat_remove,
1074
	.driver = {
1075
		.name		= "tpm_tis",
1076
		.pm		= &tpm_tis_pm,
1077
	},
1078 1079
};

1080
static bool force;
1081
#ifdef CONFIG_X86
1082 1083
module_param(force, bool, 0444);
MODULE_PARM_DESC(force, "Force device probe rather than using ACPI entry");
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112
#endif

static int tpm_tis_force_device(void)
{
	struct platform_device *pdev;
	static const struct resource x86_resources[] = {
		{
			.start = 0xFED40000,
			.end = 0xFED40000 + TIS_MEM_LEN - 1,
			.flags = IORESOURCE_MEM,
		},
	};

	if (!force)
		return 0;

	/* The driver core will match the name tpm_tis of the device to
	 * the tpm_tis platform driver and complete the setup via
	 * tpm_tis_plat_probe
	 */
	pdev = platform_device_register_simple("tpm_tis", -1, x86_resources,
					       ARRAY_SIZE(x86_resources));
	if (IS_ERR(pdev))
		return PTR_ERR(pdev);
	force_pdev = pdev;

	return 0;
}

1113 1114
static int __init init_tis(void)
{
1115
	int rc;
1116 1117 1118 1119 1120 1121 1122 1123 1124

	rc = tpm_tis_force_device();
	if (rc)
		goto err_force;

	rc = platform_driver_register(&tis_drv);
	if (rc)
		goto err_platform;

1125
#ifdef CONFIG_ACPI
1126 1127 1128
	rc = acpi_bus_register_driver(&tis_acpi_driver);
	if (rc)
		goto err_acpi;
1129
#endif
1130

1131 1132 1133 1134
	if (IS_ENABLED(CONFIG_PNP)) {
		rc = pnp_register_driver(&tis_pnp_driver);
		if (rc)
			goto err_pnp;
1135
	}
1136

1137
	return 0;
1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148

err_pnp:
#ifdef CONFIG_ACPI
	acpi_bus_unregister_driver(&tis_acpi_driver);
err_acpi:
#endif
	platform_device_unregister(force_pdev);
err_platform:
	if (force_pdev)
		platform_device_unregister(force_pdev);
err_force:
R
Rajiv Andrade 已提交
1149
	return rc;
1150 1151 1152 1153
}

static void __exit cleanup_tis(void)
{
1154
	pnp_unregister_driver(&tis_pnp_driver);
1155
#ifdef CONFIG_ACPI
1156
	acpi_bus_unregister_driver(&tis_acpi_driver);
R
Rajiv Andrade 已提交
1157 1158
#endif
	platform_driver_unregister(&tis_drv);
1159 1160 1161

	if (force_pdev)
		platform_device_unregister(force_pdev);
1162 1163 1164 1165 1166 1167 1168 1169
}

module_init(init_tis);
module_exit(cleanup_tis);
MODULE_AUTHOR("Leendert van Doorn (leendert@watson.ibm.com)");
MODULE_DESCRIPTION("TPM Driver");
MODULE_VERSION("2.0");
MODULE_LICENSE("GPL");