^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2017 James.Bottomley@HansenPartnership.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include "tpm-dev.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) struct tpmrm_priv {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) struct file_priv priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) struct tpm_space space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) static int tpmrm_open(struct inode *inode, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) struct tpm_chip *chip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) struct tpmrm_priv *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) chip = container_of(inode->i_cdev, struct tpm_chip, cdevs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) priv = kzalloc(sizeof(*priv), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) if (priv == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) rc = tpm2_init_space(&priv->space, TPM2_SPACE_BUFFER_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) kfree(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) tpm_common_open(file, chip, &priv->priv, &priv->space);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) static int tpmrm_release(struct inode *inode, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) struct file_priv *fpriv = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct tpmrm_priv *priv = container_of(fpriv, struct tpmrm_priv, priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) tpm_common_release(file, fpriv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) tpm2_del_space(fpriv->chip, &priv->space);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) kfree(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) const struct file_operations tpmrm_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) .llseek = no_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) .open = tpmrm_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .read = tpm_common_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) .write = tpm_common_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .poll = tpm_common_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .release = tpmrm_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) };