// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright 2016 Google Inc.
 *
 * Based on Linux Kernel TPM driver by
 * Peter Huewe <peter.huewe@infineon.com>
 * Copyright (C) 2011 Infineon Technologies
 */

/*
 * cr50 is a firmware for H1 secure modules that requires special
 * handling for the I2C interface.
 *
 * - Use an interrupt for transaction status instead of hardcoded delays
 * - Must use write+wait+read read protocol
 * - All 4 bytes of status register must be read/written at once
 * - Burst count max is 63 bytes, and burst count behaves
 *   slightly differently than other I2C TPMs
 * - When reading from FIFO the full burstcnt must be read
 *   instead of just reading header and determining the remainder
 */

#include <linux/acpi.h>
#include <linux/completion.h>
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/pm.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/wait.h>
#include "tpm.h"
#include "tpm_tis_core.h"

#define CR50_MAX_BUFSIZE	63
#define CR50_TIMEOUT_SHORT_MS	2	/* Short timeout during transactions */
#define CR50_TIMEOUT_NOIRQ_MS	20	/* Timeout for TPM ready without IRQ */
#define CR50_I2C_DID_VID	0x00281ae0L
#define TI50_I2C_DID_VID	0x504a6666L
#define CR50_I2C_MAX_RETRIES	3	/* Max retries due to I2C errors */
#define CR50_I2C_RETRY_DELAY_LO	55	/* Min usecs between retries on I2C */
#define CR50_I2C_RETRY_DELAY_HI	65	/* Max usecs between retries on I2C */

struct priv_data {
	int irq;
	struct completion tpm_ready;
	u8 buf[CR50_MAX_BUFSIZE + sizeof(u8)];
};

/*
 * The cr50 interrupt handler just signals waiting threads that the
 * interrupt was asserted.  It does not do any processing triggered
 * by interrupts but is instead used to avoid fixed delays.
 */
static irqreturn_t cr50_i2c_int_handler(int dummy, void *dev_id)
{
	struct tpm_chip *chip = dev_id;
	struct priv_data *priv = dev_get_drvdata(&chip->dev);

	complete(&priv->tpm_ready);

	return IRQ_HANDLED;
}

/*
 * Wait for completion interrupt if available, otherwise use a fixed
 * delay for the TPM to be ready.
 *
 * Returns negative number for error, positive number for success.
 */
static int cr50_i2c_wait_tpm_ready(struct tpm_chip *chip)
{
	struct priv_data *priv = dev_get_drvdata(&chip->dev);
	long rc;

	/* Use a safe fixed delay if interrupt is not supported */
	if (priv->irq <= 0) {
		msleep(CR50_TIMEOUT_NOIRQ_MS);
		return 1;
	}

	/* Wait for interrupt to indicate TPM is ready to respond */
	rc = wait_for_completion_timeout(&priv->tpm_ready, chip->timeout_a);

	if (rc == 0)
		dev_warn(&chip->dev, "Timeout waiting for TPM ready\n");

	return rc;
}

static void cr50_i2c_enable_tpm_irq(struct tpm_chip *chip)
{
	struct priv_data *priv = dev_get_drvdata(&chip->dev);

	if (priv->irq > 0) {
		reinit_completion(&priv->tpm_ready);
		enable_irq(priv->irq);
	}
}

static void cr50_i2c_disable_tpm_irq(struct tpm_chip *chip)
{
	struct priv_data *priv = dev_get_drvdata(&chip->dev);

	if (priv->irq > 0)
		disable_irq(priv->irq);
}

/*
 * cr50_i2c_transfer - transfer messages over i2c
 *
 * @adapter: i2c adapter
 * @msgs: array of messages to transfer
 * @num: number of messages in the array
 *
 * Call unlocked i2c transfer routine with the provided parameters and retry
 * in case of bus errors. Returns the number of transferred messages.
 */
static int cr50_i2c_transfer(struct device *dev, struct i2c_adapter *adapter,
			     struct i2c_msg *msgs, int num)
{
	int rc, try;

	for (try = 0; try < CR50_I2C_MAX_RETRIES; try++) {
		rc = __i2c_transfer(adapter, msgs, num);
		if (rc > 0)
			break;
		if (try)
			dev_warn(dev, "i2c transfer failed (attempt %d/%d): %d\n",
				 try+1, CR50_I2C_MAX_RETRIES, rc);
		usleep_range(CR50_I2C_RETRY_DELAY_LO, CR50_I2C_RETRY_DELAY_HI);
	}

	return rc;
}

/*
 * cr50_i2c_read() - read from TPM register
 *
 * @chip: TPM chip information
 * @addr: register address to read from
 * @buffer: provided by caller
 * @len: number of bytes to read
 *
 * 1) send register address byte 'addr' to the TPM
 * 2) wait for TPM to indicate it is ready
 * 3) read 'len' bytes of TPM response into the provided 'buffer'
 *
 * Returns negative number for error, 0 for success.
 */
static int cr50_i2c_read(struct tpm_chip *chip, u8 addr, u8 *buffer, size_t len)
{
	struct i2c_client *client = to_i2c_client(chip->dev.parent);
	struct i2c_msg msg1 = {
		.addr = client->addr,
		.len = 1,
		.buf = &addr
	};
	struct i2c_msg msg2 = {
		.addr = client->addr,
		.flags = I2C_M_RD,
		.len = len,
		.buf = buffer
	};
	int rc;

	/* Prepare for completion interrupt */
	cr50_i2c_enable_tpm_irq(chip);

	/* Send the register address byte to the TPM */
	rc = cr50_i2c_transfer(&chip->dev, client->adapter, &msg1, 1);
	if (rc <= 0)
		goto out;

	/* Wait for TPM to be ready with response data */
	rc = cr50_i2c_wait_tpm_ready(chip);
	if (rc < 0)
		goto out;

	/* Read response data from the TPM */
	rc = cr50_i2c_transfer(&chip->dev, client->adapter, &msg2, 1);

out:
	cr50_i2c_disable_tpm_irq(chip);

	if (rc < 0)
		return rc;
	if (rc == 0)
		return -EIO; /* No i2c segments transferred */

	return 0;
}

/*
 * cr50_i2c_write() - write to TPM register
 *
 * @chip: TPM chip information
 * @addr: register address to write to
 * @buffer: data to write
 * @len: number of bytes to write
 *
 * 1) prepend the provided address to the provided data
 * 2) send the address+data to the TPM
 * 3) wait for TPM to indicate it is done writing
 *
 * Returns negative number for error, 0 for success.
 */
static int cr50_i2c_write(struct tpm_chip *chip, u8 addr, u8 *buffer,
			  size_t len)
{
	struct priv_data *priv = dev_get_drvdata(&chip->dev);
	struct i2c_client *client = to_i2c_client(chip->dev.parent);
	struct i2c_msg msg1 = {
		.addr = client->addr,
		.len = len + 1,
		.buf = priv->buf
	};
	int rc;

	if (len > CR50_MAX_BUFSIZE)
		return -EINVAL;

	/* Prepend the 'register address' to the buffer */
	priv->buf[0] = addr;
	memcpy(priv->buf + 1, buffer, len);

	/* Prepare for completion interrupt */
	cr50_i2c_enable_tpm_irq(chip);

	/* Send write request buffer with address */
	rc = cr50_i2c_transfer(&chip->dev, client->adapter, &msg1, 1);
	if (rc <= 0)
		goto out;

	/* Wait for TPM to be ready, ignore timeout */
	cr50_i2c_wait_tpm_ready(chip);

out:
	cr50_i2c_disable_tpm_irq(chip);

	if (rc < 0)
		return rc;
	if (rc == 0)
		return -EIO; /* No i2c segments transferred */

	return 0;
}

#undef	TPM_ACCESS
#undef	TPM_STS
#undef	TPM_DATA_FIFO
#undef	TPM_DID_VID

#define	TPM_ACCESS(l)			(0x0000 | ((l) << 4))
#define	TPM_STS(l)			(0x0001 | ((l) << 4))
#define	TPM_DATA_FIFO(l)		(0x0005 | ((l) << 4))
#define	TPM_DID_VID(l)			(0x0006 | ((l) << 4))

static int check_locality(struct tpm_chip *chip, int loc)
{
	u8 mask = TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY;
	u8 buf;
	int rc;

	rc = cr50_i2c_read(chip, TPM_ACCESS(loc), &buf, 1);
	if (rc < 0)
		return rc;

	if ((buf & mask) == mask)
		return loc;

	return -EIO;
}

static int release_locality(struct tpm_chip *chip, int loc)
{
	struct i2c_client *client = to_i2c_client(chip->dev.parent);
	u8 mask = TPM_ACCESS_VALID | TPM_ACCESS_REQUEST_PENDING;
	u8 addr = TPM_ACCESS(loc);
	u8 buf;
	int rc;

	rc = cr50_i2c_read(chip, addr, &buf, 1);
	if (rc < 0)
		goto unlock_out;

	if ((buf & mask) == mask) {
		buf = TPM_ACCESS_ACTIVE_LOCALITY;
		rc = cr50_i2c_write(chip, addr, &buf, 1);
	}

unlock_out:
	i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT);
	return rc;
}

static int request_locality(struct tpm_chip *chip, int loc)
{
	struct i2c_client *client = to_i2c_client(chip->dev.parent);
	u8 buf = TPM_ACCESS_REQUEST_USE;
	unsigned long stop;
	int rc;

	i2c_lock_bus(client->adapter, I2C_LOCK_SEGMENT);

	if (check_locality(chip, loc) == loc)
		return loc;

	rc = cr50_i2c_write(chip, TPM_ACCESS(loc), &buf, 1);
	if (rc < 0)
		goto unlock_out;

	stop = jiffies + chip->timeout_a;
	do {
		if (check_locality(chip, loc) == loc)
			return loc;

		msleep(CR50_TIMEOUT_SHORT_MS);
	} while (time_before(jiffies, stop));

	rc = -ETIMEDOUT;

unlock_out:
	i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT);
	return rc;

}

/* cr50 requires all 4 bytes of status register to be read */
static u8 cr50_i2c_tis_status(struct tpm_chip *chip)
{
	u8 buf[4];

	if (cr50_i2c_read(chip, TPM_STS(chip->locality), buf, sizeof(buf)) < 0)
		return 0;
	return buf[0];
}

/* cr50 requires all 4 bytes of status register to be written */
static void cr50_i2c_tis_ready(struct tpm_chip *chip)
{
	u8 buf[4] = { TPM_STS_COMMAND_READY };

	cr50_i2c_write(chip, TPM_STS(chip->locality), buf, sizeof(buf));
	msleep(CR50_TIMEOUT_SHORT_MS);
}

/*
 * cr50 uses bytes 3:2 of status register for burst count and
 * all 4 bytes must be read
 */
static int cr50_i2c_wait_burststs(struct tpm_chip *chip, u8 mask,
				  size_t *burst, int *status)
{
	unsigned long stop;
	u8 buf[4];

	/* wait for burstcount */
	stop = jiffies + chip->timeout_b;
	do {
		if (cr50_i2c_read(chip, TPM_STS(chip->locality),
				  (u8 *)&buf, sizeof(buf)) < 0) {
			msleep(CR50_TIMEOUT_SHORT_MS);
			continue;
		}

		*status = *buf;
		*burst = le16_to_cpup((__le16 *)(buf + 1));

		if ((*status & mask) == mask &&
		    *burst > 0 && *burst <= CR50_MAX_BUFSIZE)
			return 0;

		msleep(CR50_TIMEOUT_SHORT_MS);
	} while (time_before(jiffies, stop));

	dev_err(&chip->dev, "Timeout reading burst and status\n");
	return -ETIMEDOUT;
}

static int cr50_i2c_tis_recv(struct tpm_chip *chip, u8 *buf, size_t buf_len)
{
	int status, rc;
	size_t burstcnt, cur, len, expected;
	u8 addr = TPM_DATA_FIFO(chip->locality);
	u8 mask = TPM_STS_VALID | TPM_STS_DATA_AVAIL;

	if (buf_len < TPM_HEADER_SIZE)
		return -EINVAL;

	rc = cr50_i2c_wait_burststs(chip, mask, &burstcnt, &status);
	if (rc < 0)
		goto out_err;

	if (burstcnt > buf_len || burstcnt < TPM_HEADER_SIZE) {
		dev_err(&chip->dev,
			"Unexpected burstcnt: %zu (max=%zu, min=%d)\n",
			burstcnt, buf_len, TPM_HEADER_SIZE);
		rc = -EIO;
		goto out_err;
	}

	/* Read first chunk of burstcnt bytes */
	rc = cr50_i2c_read(chip, addr, buf, burstcnt);
	if (rc < 0) {
		dev_err(&chip->dev, "Read of first chunk failed\n");
		goto out_err;
	}

	/* Determine expected data in the return buffer */
	expected = be32_to_cpup((__be32 *)(buf + 2));
	if (expected > buf_len) {
		dev_err(&chip->dev, "Too much data in FIFO\n");
		goto out_err;
	}

	/* Now read the rest of the data */
	cur = burstcnt;
	while (cur < expected) {
		/* Read updated burst count and check status */
		rc = cr50_i2c_wait_burststs(chip, mask, &burstcnt, &status);
		if (rc < 0)
			goto out_err;

		len = min_t(size_t, burstcnt, expected - cur);
		rc = cr50_i2c_read(chip, addr, buf + cur, len);
		if (rc < 0) {
			dev_err(&chip->dev, "Read failed\n");
			goto out_err;
		}

		cur += len;
	}

	/* Ensure TPM is done reading data */
	rc = cr50_i2c_wait_burststs(chip, TPM_STS_VALID, &burstcnt, &status);
	if (rc < 0)
		goto out_err;
	if (status & TPM_STS_DATA_AVAIL) {
		dev_err(&chip->dev, "Data still available\n");
		rc = -EIO;
		goto out_err;
	}

	return cur;

out_err:
	/* Abort current transaction if still pending */
	if (cr50_i2c_tis_status(chip) & TPM_STS_COMMAND_READY)
		cr50_i2c_tis_ready(chip);

	return rc;
}

static int cr50_i2c_tis_send(struct tpm_chip *chip, u8 *buf, size_t len)
{
	int rc, status;
	size_t burstcnt, limit, sent = 0;
	u8 tpm_go[4] = { TPM_STS_GO };
	unsigned long stop;

	/* Wait until TPM is ready for a command */
	stop = jiffies + chip->timeout_b;
	while (!(cr50_i2c_tis_status(chip) & TPM_STS_COMMAND_READY)) {
		if (time_after(jiffies, stop)) {
			rc = -ETIMEDOUT;
			goto out_err;
		}

		cr50_i2c_tis_ready(chip);
	}

	while (len > 0) {
		u8 mask = TPM_STS_VALID;

		/* Wait for data if this is not the first chunk */
		if (sent > 0)
			mask |= TPM_STS_DATA_EXPECT;

		/* Read burst count and check status */
		rc = cr50_i2c_wait_burststs(chip, mask, &burstcnt, &status);
		if (rc < 0)
			goto out_err;

		/*
		 * Use burstcnt - 1 to account for the address byte
		 * that is inserted by cr50_i2c_write()
		 */
		limit = min_t(size_t, burstcnt - 1, len);
		rc = cr50_i2c_write(chip, TPM_DATA_FIFO(chip->locality),
				    &buf[sent], limit);
		if (rc < 0) {
			dev_err(&chip->dev, "Write failed\n");
			goto out_err;
		}

		sent += limit;
		len -= limit;
	}

	/* Ensure TPM is not expecting more data */
	rc = cr50_i2c_wait_burststs(chip, TPM_STS_VALID, &burstcnt, &status);
	if (rc < 0)
		goto out_err;
	if (status & TPM_STS_DATA_EXPECT) {
		dev_err(&chip->dev, "Data still expected\n");
		rc = -EIO;
		goto out_err;
	}

	/* Start the TPM command */
	rc = cr50_i2c_write(chip, TPM_STS(chip->locality), tpm_go,
			    sizeof(tpm_go));
	if (rc < 0) {
		dev_err(&chip->dev, "Start command failed\n");
		goto out_err;
	}
	return 0;

out_err:
	/* Abort current transaction if still pending */
	if (cr50_i2c_tis_status(chip) & TPM_STS_COMMAND_READY)
		cr50_i2c_tis_ready(chip);

	return rc;
}

static bool cr50_i2c_req_canceled(struct tpm_chip *chip, u8 status)
{
	return (status == TPM_STS_COMMAND_READY);
}

static bool tpm_cr50_i2c_is_firmware_power_managed(struct device *dev)
{
	u8 val;
	int ret;

	/* This flag should default true when the device property is not present */
	ret = device_property_read_u8(dev, "firmware-power-managed", &val);
	if (ret)
		return true;

	return val;
}

static const struct tpm_class_ops cr50_i2c = {
	.flags = TPM_OPS_AUTO_STARTUP,
	.status = &cr50_i2c_tis_status,
	.recv = &cr50_i2c_tis_recv,
	.send = &cr50_i2c_tis_send,
	.cancel = &cr50_i2c_tis_ready,
	.req_complete_mask = TPM_STS_DATA_AVAIL | TPM_STS_VALID,
	.req_complete_val = TPM_STS_DATA_AVAIL | TPM_STS_VALID,
	.req_canceled = &cr50_i2c_req_canceled,
	.request_locality = &request_locality,
	.relinquish_locality = &release_locality,
};

static int cr50_i2c_init(struct i2c_client *client)
{
	struct device *dev = &client->dev;
	struct tpm_chip *chip;
	struct priv_data *priv;
	u8 buf[4];
	u32 vendor;
	int rc;

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

	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	/* cr50 is a TPM 2.0 chip */
	chip->flags |= TPM_CHIP_FLAG_TPM2;
	if (tpm_cr50_i2c_is_firmware_power_managed(dev))
		chip->flags |= TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED;

	/* Default timeouts */
	chip->timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
	chip->timeout_b = msecs_to_jiffies(TIS_LONG_TIMEOUT);
	chip->timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
	chip->timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT);

	dev_set_drvdata(&chip->dev, priv);
	init_completion(&priv->tpm_ready);

	if (client->irq > 0) {
		rc = devm_request_irq(dev, client->irq, cr50_i2c_int_handler,
				      IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
				      dev->driver->name, chip);
		if (rc < 0) {
			dev_err(dev, "Failed to probe IRQ %d\n", client->irq);
			return rc;
		}

		disable_irq(client->irq);
		priv->irq = client->irq;
	} else {
		dev_warn(dev, "No IRQ, will use %ums delay for TPM ready\n",
			 CR50_TIMEOUT_NOIRQ_MS);
	}

	rc = request_locality(chip, 0);
	if (rc < 0) {
		dev_err(dev, "Could not request locality\n");
		return rc;
	}

	/* Read four bytes from DID_VID register */
	rc = cr50_i2c_read(chip, TPM_DID_VID(0), buf, sizeof(buf));
	if (rc < 0) {
		dev_err(dev, "Could not read vendor id\n");
		if (release_locality(chip, 0))
			dev_err(dev, "Could not release locality\n");
		return rc;
	}

	rc = release_locality(chip, 0);
	if (rc) {
		dev_err(dev, "Could not release locality\n");
		return rc;
	}

	vendor = le32_to_cpup((__le32 *)buf);
	if (vendor != CR50_I2C_DID_VID && vendor != TI50_I2C_DID_VID) {
		dev_err(dev, "Vendor ID did not match! ID was %08x\n", vendor);
		return -ENODEV;
	}

	dev_info(dev, "%s TPM 2.0 (i2c 0x%02x irq %d id 0x%x)\n",
		 vendor == TI50_I2C_DID_VID ? "ti50" : "cr50",
		 client->addr, client->irq, vendor >> 16);

	return tpm_chip_register(chip);
}

static const struct i2c_device_id cr50_i2c_table[] = {
	{"cr50_i2c", 0},
	{}
};
MODULE_DEVICE_TABLE(i2c, cr50_i2c_table);

#ifdef CONFIG_ACPI
static const struct acpi_device_id cr50_i2c_acpi_id[] = {
	{ "GOOG0005", 0 },
	{}
};
MODULE_DEVICE_TABLE(acpi, cr50_i2c_acpi_id);
#endif

#ifdef CONFIG_OF
static const struct of_device_id of_cr50_i2c_match[] = {
	{ .compatible = "google,cr50", },
	{}
};
MODULE_DEVICE_TABLE(of, of_cr50_i2c_match);
#endif

static int cr50_i2c_probe(struct i2c_client *client,
			  const struct i2c_device_id *id)
{
	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
		return -ENODEV;

	return cr50_i2c_init(client);
}

static int cr50_i2c_remove(struct i2c_client *client)
{
	struct tpm_chip *chip = i2c_get_clientdata(client);

	tpm_chip_unregister(chip);

	return 0;
}

static SIMPLE_DEV_PM_OPS(cr50_i2c_pm, tpm_pm_suspend, tpm_pm_resume);

static struct i2c_driver cr50_i2c_driver = {
	.id_table = cr50_i2c_table,
	.probe = cr50_i2c_probe,
	.remove = cr50_i2c_remove,
	.driver = {
		.name = "cr50_i2c",
		.pm = &cr50_i2c_pm,
		.acpi_match_table = ACPI_PTR(cr50_i2c_acpi_id),
		.of_match_table = of_match_ptr(of_cr50_i2c_match),
	},
};

module_i2c_driver(cr50_i2c_driver);

MODULE_DESCRIPTION("cr50 TPM I2C Driver");
MODULE_LICENSE("GPL");
