blob: 67ec9d3d04f529ba07fa1feb926bd1809a78a405 [file] [log] [blame]
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -08001/*
2 * Copyright (C) 2004 IBM Corporation
3 * Copyright (C) 2014 Intel Corporation
4 *
5 * Authors:
6 * Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
7 * Leendert van Doorn <leendert@watson.ibm.com>
8 * Dave Safford <safford@watson.ibm.com>
9 * Reiner Sailer <sailer@watson.ibm.com>
10 * Kylene Hall <kjhall@us.ibm.com>
11 *
12 * Maintained by: <tpmdd-devel@lists.sourceforge.net>
13 *
14 * TPM chip management routines.
15 *
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License as
18 * published by the Free Software Foundation, version 2 of the
19 * License.
20 *
21 */
22
23#include <linux/poll.h>
24#include <linux/slab.h>
25#include <linux/mutex.h>
26#include <linux/spinlock.h>
27#include <linux/freezer.h>
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -080028#include <linux/major.h>
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -080029#include "tpm.h"
30#include "tpm_eventlog.h"
31
Stefan Berger15516782016-02-29 08:53:02 -050032DEFINE_IDR(dev_nums_idr);
33static DEFINE_MUTEX(idr_lock);
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -080034
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -080035struct class *tpm_class;
James Bottomleyfdc915f2017-01-03 09:07:32 -080036struct class *tpmrm_class;
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -080037dev_t tpm_devt;
38
Jason Gunthorpe4e261952016-02-12 20:29:53 -070039/**
40 * tpm_try_get_ops() - Get a ref to the tpm_chip
41 * @chip: Chip to ref
42 *
43 * The caller must already have some kind of locking to ensure that chip is
44 * valid. This function will lock the chip so that the ops member can be
45 * accessed safely. The locking prevents tpm_chip_unregister from
46 * completing, so it should not be held for long periods.
47 *
48 * Returns -ERRNO if the chip could not be got.
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -080049 */
Jason Gunthorpe4e261952016-02-12 20:29:53 -070050int tpm_try_get_ops(struct tpm_chip *chip)
51{
52 int rc = -EIO;
53
54 get_device(&chip->dev);
55
56 down_read(&chip->ops_sem);
57 if (!chip->ops)
58 goto out_lock;
59
Jason Gunthorpe4e261952016-02-12 20:29:53 -070060 return 0;
61out_lock:
62 up_read(&chip->ops_sem);
63 put_device(&chip->dev);
64 return rc;
65}
66EXPORT_SYMBOL_GPL(tpm_try_get_ops);
67
68/**
69 * tpm_put_ops() - Release a ref to the tpm_chip
70 * @chip: Chip to put
71 *
72 * This is the opposite pair to tpm_try_get_ops(). After this returns chip may
73 * be kfree'd.
74 */
75void tpm_put_ops(struct tpm_chip *chip)
76{
Jason Gunthorpe4e261952016-02-12 20:29:53 -070077 up_read(&chip->ops_sem);
78 put_device(&chip->dev);
79}
80EXPORT_SYMBOL_GPL(tpm_put_ops);
81
82/**
83 * tpm_chip_find_get() - return tpm_chip for a given chip number
84 * @chip_num: id to find
85 *
86 * The return'd chip has been tpm_try_get_ops'd and must be released via
87 * tpm_put_ops
Matthew Wilcox37f49152016-12-14 15:09:16 -080088 */
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -080089struct tpm_chip *tpm_chip_find_get(int chip_num)
90{
Stefan Berger15516782016-02-29 08:53:02 -050091 struct tpm_chip *chip, *res = NULL;
92 int chip_prev;
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -080093
Stefan Berger15516782016-02-29 08:53:02 -050094 mutex_lock(&idr_lock);
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -080095
Stefan Berger15516782016-02-29 08:53:02 -050096 if (chip_num == TPM_ANY_NUM) {
97 chip_num = 0;
98 do {
99 chip_prev = chip_num;
100 chip = idr_get_next(&dev_nums_idr, &chip_num);
101 if (chip && !tpm_try_get_ops(chip)) {
102 res = chip;
103 break;
104 }
105 } while (chip_prev != chip_num);
106 } else {
Matthew Wilcox37f49152016-12-14 15:09:16 -0800107 chip = idr_find(&dev_nums_idr, chip_num);
Stefan Berger15516782016-02-29 08:53:02 -0500108 if (chip && !tpm_try_get_ops(chip))
109 res = chip;
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800110 }
Stefan Berger15516782016-02-29 08:53:02 -0500111
112 mutex_unlock(&idr_lock);
113
114 return res;
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800115}
116
117/**
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800118 * tpm_dev_release() - free chip memory and the device number
119 * @dev: the character device for the TPM chip
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800120 *
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800121 * This is used as the release function for the character device.
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800122 */
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800123static void tpm_dev_release(struct device *dev)
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800124{
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800125 struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev);
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800126
Stefan Berger15516782016-02-29 08:53:02 -0500127 mutex_lock(&idr_lock);
128 idr_remove(&dev_nums_idr, chip->dev_num);
129 mutex_unlock(&idr_lock);
130
Nayna Jain748935e2016-11-14 05:00:52 -0500131 kfree(chip->log.bios_event_log);
Jarkko Sakkinen745b3612017-01-06 14:03:45 +0200132 kfree(chip->work_space.context_buf);
James Bottomley4d578562017-01-31 15:47:31 -0800133 kfree(chip->work_space.session_buf);
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800134 kfree(chip);
135}
136
James Bottomleyfdc915f2017-01-03 09:07:32 -0800137static void tpm_devs_release(struct device *dev)
138{
139 struct tpm_chip *chip = container_of(dev, struct tpm_chip, devs);
140
141 /* release the master device reference */
142 put_device(&chip->dev);
143}
144
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800145/**
Josh Zimmermand1bd4a72017-06-25 14:53:24 -0700146 * tpm_class_shutdown() - prepare the TPM device for loss of power.
147 * @dev: device to which the chip is associated.
148 *
149 * Issues a TPM2_Shutdown command prior to loss of power, as required by the
150 * TPM 2.0 spec.
151 * Then, calls bus- and device- specific shutdown code.
152 *
153 * XXX: This codepath relies on the fact that sysfs is not enabled for
154 * TPM2: sysfs uses an implicit lock on chip->ops, so this could race if TPM2
155 * has sysfs support enabled before TPM sysfs's implicit locking is fixed.
156 */
157static int tpm_class_shutdown(struct device *dev)
158{
159 struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev);
160
161 if (chip->flags & TPM_CHIP_FLAG_TPM2) {
162 down_write(&chip->ops_sem);
163 tpm2_shutdown(chip, TPM2_SU_CLEAR);
164 chip->ops = NULL;
165 up_write(&chip->ops_sem);
166 }
167 /* Allow bus- and device-specific code to run. Note: since chip->ops
168 * is NULL, more-specific shutdown code will not be able to issue TPM
169 * commands.
170 */
171 if (dev->bus && dev->bus->shutdown)
172 dev->bus->shutdown(dev);
173 else if (dev->driver && dev->driver->shutdown)
174 dev->driver->shutdown(dev);
175 return 0;
176}
177
178/**
Jason Gunthorpe3897cd92016-02-11 12:45:48 -0700179 * tpm_chip_alloc() - allocate a new struct tpm_chip instance
180 * @pdev: device to which the chip is associated
181 * At this point pdev mst be initialized, but does not have to
182 * be registered
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800183 * @ops: struct tpm_class_ops instance
184 *
185 * Allocates a new struct tpm_chip instance and assigns a free
Jason Gunthorpe3897cd92016-02-11 12:45:48 -0700186 * device number for it. Must be paired with put_device(&chip->dev).
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800187 */
Winkler, Tomas2998b022016-11-23 12:04:13 +0200188struct tpm_chip *tpm_chip_alloc(struct device *pdev,
Jason Gunthorpe3897cd92016-02-11 12:45:48 -0700189 const struct tpm_class_ops *ops)
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800190{
191 struct tpm_chip *chip;
Jarkko Sakkinen4f3b1932016-02-13 11:58:16 +0200192 int rc;
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800193
194 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
195 if (chip == NULL)
196 return ERR_PTR(-ENOMEM);
197
198 mutex_init(&chip->tpm_mutex);
Jason Gunthorpe4e261952016-02-12 20:29:53 -0700199 init_rwsem(&chip->ops_sem);
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800200
201 chip->ops = ops;
202
Stefan Berger15516782016-02-29 08:53:02 -0500203 mutex_lock(&idr_lock);
204 rc = idr_alloc(&dev_nums_idr, NULL, 0, TPM_NUM_DEVICES, GFP_KERNEL);
205 mutex_unlock(&idr_lock);
206 if (rc < 0) {
Winkler, Tomas2998b022016-11-23 12:04:13 +0200207 dev_err(pdev, "No available tpm device numbers\n");
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800208 kfree(chip);
Stefan Berger15516782016-02-29 08:53:02 -0500209 return ERR_PTR(rc);
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800210 }
Stefan Berger15516782016-02-29 08:53:02 -0500211 chip->dev_num = rc;
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800212
Jason Gunthorpe3635e2e2016-02-29 12:29:48 -0500213 device_initialize(&chip->dev);
James Bottomleyfdc915f2017-01-03 09:07:32 -0800214 device_initialize(&chip->devs);
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800215
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800216 chip->dev.class = tpm_class;
Josh Zimmermand1bd4a72017-06-25 14:53:24 -0700217 chip->dev.class->shutdown = tpm_class_shutdown;
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800218 chip->dev.release = tpm_dev_release;
Winkler, Tomas2998b022016-11-23 12:04:13 +0200219 chip->dev.parent = pdev;
Jarkko Sakkinen9b774d52015-04-14 17:56:48 +0300220 chip->dev.groups = chip->groups;
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800221
James Bottomleyfdc915f2017-01-03 09:07:32 -0800222 chip->devs.parent = pdev;
223 chip->devs.class = tpmrm_class;
224 chip->devs.release = tpm_devs_release;
225 /* get extra reference on main device to hold on
226 * behalf of devs. This holds the chip structure
227 * while cdevs is in use. The corresponding put
Stefan Berger8979b022017-04-17 21:58:26 -0400228 * is in the tpm_devs_release (TPM2 only)
James Bottomleyfdc915f2017-01-03 09:07:32 -0800229 */
Stefan Berger8979b022017-04-17 21:58:26 -0400230 if (chip->flags & TPM_CHIP_FLAG_TPM2)
231 get_device(&chip->dev);
James Bottomleyfdc915f2017-01-03 09:07:32 -0800232
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800233 if (chip->dev_num == 0)
234 chip->dev.devt = MKDEV(MISC_MAJOR, TPM_MINOR);
235 else
236 chip->dev.devt = MKDEV(MAJOR(tpm_devt), chip->dev_num);
237
James Bottomleyfdc915f2017-01-03 09:07:32 -0800238 chip->devs.devt =
239 MKDEV(MAJOR(tpm_devt), chip->dev_num + TPM_NUM_DEVICES);
240
Jason Gunthorpe3635e2e2016-02-29 12:29:48 -0500241 rc = dev_set_name(&chip->dev, "tpm%d", chip->dev_num);
242 if (rc)
243 goto out;
James Bottomleyfdc915f2017-01-03 09:07:32 -0800244 rc = dev_set_name(&chip->devs, "tpmrm%d", chip->dev_num);
245 if (rc)
246 goto out;
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800247
Winkler, Tomas2998b022016-11-23 12:04:13 +0200248 if (!pdev)
Stefan Berger2f9f5372016-04-18 13:26:14 -0400249 chip->flags |= TPM_CHIP_FLAG_VIRTUAL;
250
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800251 cdev_init(&chip->cdev, &tpm_fops);
James Bottomleyfdc915f2017-01-03 09:07:32 -0800252 cdev_init(&chip->cdevs, &tpmrm_fops);
Stefan Berger2072df42016-02-29 08:53:01 -0500253 chip->cdev.owner = THIS_MODULE;
James Bottomleyfdc915f2017-01-03 09:07:32 -0800254 chip->cdevs.owner = THIS_MODULE;
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800255
Jarkko Sakkinen745b3612017-01-06 14:03:45 +0200256 chip->work_space.context_buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
257 if (!chip->work_space.context_buf) {
258 rc = -ENOMEM;
259 goto out;
260 }
James Bottomley4d578562017-01-31 15:47:31 -0800261 chip->work_space.session_buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
262 if (!chip->work_space.session_buf) {
263 rc = -ENOMEM;
264 goto out;
265 }
Jarkko Sakkinen745b3612017-01-06 14:03:45 +0200266
Jarkko Sakkinen877c57d2017-03-24 11:45:49 +0200267 chip->locality = -1;
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800268 return chip;
Jason Gunthorpe3635e2e2016-02-29 12:29:48 -0500269
270out:
James Bottomleyfdc915f2017-01-03 09:07:32 -0800271 put_device(&chip->devs);
Jason Gunthorpe3635e2e2016-02-29 12:29:48 -0500272 put_device(&chip->dev);
273 return ERR_PTR(rc);
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800274}
Jason Gunthorpe3897cd92016-02-11 12:45:48 -0700275EXPORT_SYMBOL_GPL(tpm_chip_alloc);
276
277/**
278 * tpmm_chip_alloc() - allocate a new struct tpm_chip instance
279 * @pdev: parent device to which the chip is associated
280 * @ops: struct tpm_class_ops instance
281 *
282 * Same as tpm_chip_alloc except devm is used to do the put_device
283 */
284struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
285 const struct tpm_class_ops *ops)
286{
287 struct tpm_chip *chip;
288 int rc;
289
290 chip = tpm_chip_alloc(pdev, ops);
291 if (IS_ERR(chip))
292 return chip;
293
Sudip Mukherjee2b88cd92016-06-12 15:05:29 +0100294 rc = devm_add_action_or_reset(pdev,
295 (void (*)(void *)) put_device,
296 &chip->dev);
297 if (rc)
Jason Gunthorpe3897cd92016-02-11 12:45:48 -0700298 return ERR_PTR(rc);
Jason Gunthorpe3897cd92016-02-11 12:45:48 -0700299
300 dev_set_drvdata(pdev, chip);
301
302 return chip;
303}
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800304EXPORT_SYMBOL_GPL(tpmm_chip_alloc);
305
Jarkko Sakkinen72c91ce2016-01-29 09:47:22 -0800306static int tpm_add_char_device(struct tpm_chip *chip)
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800307{
308 int rc;
309
Logan Gunthorpe8dbbf582017-03-17 12:48:13 -0600310 rc = cdev_device_add(&chip->cdev, &chip->dev);
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800311 if (rc) {
312 dev_err(&chip->dev,
Logan Gunthorpe8dbbf582017-03-17 12:48:13 -0600313 "unable to cdev_device_add() %s, major %d, minor %d, err=%d\n",
Jason Gunthorpe3635e2e2016-02-29 12:29:48 -0500314 dev_name(&chip->dev), MAJOR(chip->dev.devt),
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800315 MINOR(chip->dev.devt), rc);
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800316 return rc;
317 }
318
Linus Torvaldsaf824552017-05-04 19:07:10 -0700319 if (chip->flags & TPM_CHIP_FLAG_TPM2) {
320 rc = cdev_device_add(&chip->cdevs, &chip->devs);
321 if (rc) {
322 dev_err(&chip->devs,
323 "unable to cdev_device_add() %s, major %d, minor %d, err=%d\n",
324 dev_name(&chip->devs), MAJOR(chip->devs.devt),
325 MINOR(chip->devs.devt), rc);
326 return rc;
327 }
James Bottomleyfdc915f2017-01-03 09:07:32 -0800328 }
329
Stefan Berger15516782016-02-29 08:53:02 -0500330 /* Make the chip available. */
331 mutex_lock(&idr_lock);
332 idr_replace(&dev_nums_idr, chip, chip->dev_num);
333 mutex_unlock(&idr_lock);
334
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800335 return rc;
336}
337
Jarkko Sakkinen72c91ce2016-01-29 09:47:22 -0800338static void tpm_del_char_device(struct tpm_chip *chip)
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800339{
Logan Gunthorpe8dbbf582017-03-17 12:48:13 -0600340 cdev_device_del(&chip->cdev, &chip->dev);
Stefan Berger15516782016-02-29 08:53:02 -0500341
342 /* Make the chip unavailable. */
343 mutex_lock(&idr_lock);
344 idr_replace(&dev_nums_idr, NULL, chip->dev_num);
345 mutex_unlock(&idr_lock);
Jason Gunthorpe4e261952016-02-12 20:29:53 -0700346
347 /* Make the driver uncallable. */
348 down_write(&chip->ops_sem);
Jarkko Sakkinenc0dff1f2016-04-25 12:20:07 +0300349 if (chip->flags & TPM_CHIP_FLAG_TPM2)
350 tpm2_shutdown(chip, TPM2_SU_CLEAR);
Jason Gunthorpe4e261952016-02-12 20:29:53 -0700351 chip->ops = NULL;
352 up_write(&chip->ops_sem);
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800353}
354
Jason Gunthorpe062807f2016-04-18 13:26:13 -0400355static void tpm_del_legacy_sysfs(struct tpm_chip *chip)
356{
357 struct attribute **i;
358
Stefan Berger2f9f5372016-04-18 13:26:14 -0400359 if (chip->flags & (TPM_CHIP_FLAG_TPM2 | TPM_CHIP_FLAG_VIRTUAL))
Jason Gunthorpe062807f2016-04-18 13:26:13 -0400360 return;
361
362 sysfs_remove_link(&chip->dev.parent->kobj, "ppi");
363
364 for (i = chip->groups[0]->attrs; *i != NULL; ++i)
365 sysfs_remove_link(&chip->dev.parent->kobj, (*i)->name);
366}
367
368/* For compatibility with legacy sysfs paths we provide symlinks from the
369 * parent dev directory to selected names within the tpm chip directory. Old
370 * kernel versions created these files directly under the parent.
371 */
372static int tpm_add_legacy_sysfs(struct tpm_chip *chip)
373{
374 struct attribute **i;
375 int rc;
376
Stefan Berger2f9f5372016-04-18 13:26:14 -0400377 if (chip->flags & (TPM_CHIP_FLAG_TPM2 | TPM_CHIP_FLAG_VIRTUAL))
Jason Gunthorpe062807f2016-04-18 13:26:13 -0400378 return 0;
379
380 rc = __compat_only_sysfs_link_entry_to_kobj(
381 &chip->dev.parent->kobj, &chip->dev.kobj, "ppi");
382 if (rc && rc != -ENOENT)
383 return rc;
384
385 /* All the names from tpm-sysfs */
386 for (i = chip->groups[0]->attrs; *i != NULL; ++i) {
387 rc = __compat_only_sysfs_link_entry_to_kobj(
388 &chip->dev.parent->kobj, &chip->dev.kobj, (*i)->name);
389 if (rc) {
390 tpm_del_legacy_sysfs(chip);
391 return rc;
392 }
393 }
394
395 return 0;
396}
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800397/*
Jarkko Sakkinen313d21e2014-12-12 11:46:37 -0800398 * tpm_chip_register() - create a character device for the TPM chip
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800399 * @chip: TPM chip to use.
400 *
Jarkko Sakkinend972b052015-03-01 23:55:47 +0200401 * Creates a character device for the TPM chip and adds sysfs attributes for
402 * the device. As the last step this function adds the chip to the list of TPM
403 * chips available for in-kernel use.
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800404 *
Jarkko Sakkinend972b052015-03-01 23:55:47 +0200405 * This function should be only called after the chip initialization is
406 * complete.
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800407 */
408int tpm_chip_register(struct tpm_chip *chip)
409{
410 int rc;
411
Jason Gunthorpecae8b442016-07-12 11:41:49 -0600412 if (chip->ops->flags & TPM_OPS_AUTO_STARTUP) {
413 if (chip->flags & TPM_CHIP_FLAG_TPM2)
414 rc = tpm2_auto_startup(chip);
415 else
416 rc = tpm1_auto_startup(chip);
417 if (rc)
418 return rc;
419 }
420
Jarkko Sakkinen7518a212016-11-14 05:00:51 -0500421 tpm_sysfs_add_device(chip);
422
423 rc = tpm_bios_log_setup(chip);
Jason Gunthorpe0cf577a2016-11-19 11:18:28 -0700424 if (rc != 0 && rc != -ENODEV)
Jarkko Sakkinen34d47b62015-03-18 08:17:14 +0200425 return rc;
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800426
Jarkko Sakkinen9b774d52015-04-14 17:56:48 +0300427 tpm_add_ppi(chip);
428
Jarkko Sakkinen72c91ce2016-01-29 09:47:22 -0800429 rc = tpm_add_char_device(chip);
Jason Gunthorpe062807f2016-04-18 13:26:13 -0400430 if (rc) {
Jarkko Sakkinen7518a212016-11-14 05:00:51 -0500431 tpm_bios_log_teardown(chip);
Jason Gunthorpe062807f2016-04-18 13:26:13 -0400432 return rc;
433 }
Jarkko Sakkinend972b052015-03-01 23:55:47 +0200434
Jason Gunthorpe062807f2016-04-18 13:26:13 -0400435 rc = tpm_add_legacy_sysfs(chip);
436 if (rc) {
437 tpm_chip_unregister(chip);
438 return rc;
Jarkko Sakkinend56e4f72015-11-07 13:33:25 +0200439 }
440
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800441 return 0;
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800442}
443EXPORT_SYMBOL_GPL(tpm_chip_register);
444
445/*
446 * tpm_chip_unregister() - release the TPM driver
447 * @chip: TPM chip to use.
448 *
449 * Takes the chip first away from the list of available TPM chips and then
450 * cleans up all the resources reserved by tpm_chip_register().
451 *
Jason Gunthorpe4e261952016-02-12 20:29:53 -0700452 * Once this function returns the driver call backs in 'op's will not be
453 * running and will no longer start.
454 *
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800455 * NOTE: This function should be only called before deinitializing chip
456 * resources.
457 */
458void tpm_chip_unregister(struct tpm_chip *chip)
459{
Jason Gunthorpe062807f2016-04-18 13:26:13 -0400460 tpm_del_legacy_sysfs(chip);
Jarkko Sakkinen7518a212016-11-14 05:00:51 -0500461 tpm_bios_log_teardown(chip);
Linus Torvaldsaf824552017-05-04 19:07:10 -0700462 if (chip->flags & TPM_CHIP_FLAG_TPM2)
463 cdev_device_del(&chip->cdevs, &chip->devs);
Jarkko Sakkinen72c91ce2016-01-29 09:47:22 -0800464 tpm_del_char_device(chip);
Jarkko Sakkinenafb5abc2014-12-12 11:46:34 -0800465}
466EXPORT_SYMBOL_GPL(tpm_chip_unregister);