Hi,
If possible, could you still pick this change for v6.18 [1]? The change in question corrects the state transitions for ARM FF-A to match the spec and how tpm_crb behaves on other platforms. [1] https://lore.kernel.org/linux-integrity/aPN59bwcUrieMACf@kernel.org/ BR, Jarkko -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQRE6pSOnaBC00OEHEIaerohdGur0gUCaPN84QAKCRAaerohdGur 0q4SAQD0o1dG70qraZjVU+xySiz/jGb04d49A/LxKJj/LIXxPQD/W3xjulnS3S25 rWoIn7wO6NeiGUiUPSnCEc6LDIOYYQA= =wbvF -----END PGP SIGNATURE----- Merge tag 'tpmdd-next-v6.18-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd Pull tpm fix from Jarkko Sakkinen: "Correct the state transitions for ARM FF-A to match the spec and how tpm_crb behaves on other platforms" * tag 'tpmdd-next-v6.18-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd: tpm_crb: Add idle support for the Arm FF-A start methodpull/1354/merge
commit
648937f64a
|
|
@ -133,8 +133,7 @@ static inline bool tpm_crb_has_idle(u32 start_method)
|
||||||
{
|
{
|
||||||
return !(start_method == ACPI_TPM2_START_METHOD ||
|
return !(start_method == ACPI_TPM2_START_METHOD ||
|
||||||
start_method == ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD ||
|
start_method == ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD ||
|
||||||
start_method == ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC ||
|
start_method == ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC);
|
||||||
start_method == ACPI_TPM2_CRB_WITH_ARM_FFA);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool crb_wait_for_reg_32(u32 __iomem *reg, u32 mask, u32 value,
|
static bool crb_wait_for_reg_32(u32 __iomem *reg, u32 mask, u32 value,
|
||||||
|
|
@ -191,7 +190,7 @@ static int crb_try_pluton_doorbell(struct crb_priv *priv, bool wait_for_complete
|
||||||
*
|
*
|
||||||
* Return: 0 always
|
* Return: 0 always
|
||||||
*/
|
*/
|
||||||
static int __crb_go_idle(struct device *dev, struct crb_priv *priv)
|
static int __crb_go_idle(struct device *dev, struct crb_priv *priv, int loc)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
|
@ -200,6 +199,12 @@ static int __crb_go_idle(struct device *dev, struct crb_priv *priv)
|
||||||
|
|
||||||
iowrite32(CRB_CTRL_REQ_GO_IDLE, &priv->regs_t->ctrl_req);
|
iowrite32(CRB_CTRL_REQ_GO_IDLE, &priv->regs_t->ctrl_req);
|
||||||
|
|
||||||
|
if (priv->sm == ACPI_TPM2_CRB_WITH_ARM_FFA) {
|
||||||
|
rc = tpm_crb_ffa_start(CRB_FFA_START_TYPE_COMMAND, loc);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
rc = crb_try_pluton_doorbell(priv, true);
|
rc = crb_try_pluton_doorbell(priv, true);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
@ -220,7 +225,7 @@ static int crb_go_idle(struct tpm_chip *chip)
|
||||||
struct device *dev = &chip->dev;
|
struct device *dev = &chip->dev;
|
||||||
struct crb_priv *priv = dev_get_drvdata(dev);
|
struct crb_priv *priv = dev_get_drvdata(dev);
|
||||||
|
|
||||||
return __crb_go_idle(dev, priv);
|
return __crb_go_idle(dev, priv, chip->locality);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -238,7 +243,7 @@ static int crb_go_idle(struct tpm_chip *chip)
|
||||||
*
|
*
|
||||||
* Return: 0 on success -ETIME on timeout;
|
* Return: 0 on success -ETIME on timeout;
|
||||||
*/
|
*/
|
||||||
static int __crb_cmd_ready(struct device *dev, struct crb_priv *priv)
|
static int __crb_cmd_ready(struct device *dev, struct crb_priv *priv, int loc)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
|
@ -247,6 +252,12 @@ static int __crb_cmd_ready(struct device *dev, struct crb_priv *priv)
|
||||||
|
|
||||||
iowrite32(CRB_CTRL_REQ_CMD_READY, &priv->regs_t->ctrl_req);
|
iowrite32(CRB_CTRL_REQ_CMD_READY, &priv->regs_t->ctrl_req);
|
||||||
|
|
||||||
|
if (priv->sm == ACPI_TPM2_CRB_WITH_ARM_FFA) {
|
||||||
|
rc = tpm_crb_ffa_start(CRB_FFA_START_TYPE_COMMAND, loc);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
rc = crb_try_pluton_doorbell(priv, true);
|
rc = crb_try_pluton_doorbell(priv, true);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
@ -267,7 +278,7 @@ static int crb_cmd_ready(struct tpm_chip *chip)
|
||||||
struct device *dev = &chip->dev;
|
struct device *dev = &chip->dev;
|
||||||
struct crb_priv *priv = dev_get_drvdata(dev);
|
struct crb_priv *priv = dev_get_drvdata(dev);
|
||||||
|
|
||||||
return __crb_cmd_ready(dev, priv);
|
return __crb_cmd_ready(dev, priv, chip->locality);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __crb_request_locality(struct device *dev,
|
static int __crb_request_locality(struct device *dev,
|
||||||
|
|
@ -444,7 +455,7 @@ static int crb_send(struct tpm_chip *chip, u8 *buf, size_t bufsiz, size_t len)
|
||||||
|
|
||||||
/* Seems to be necessary for every command */
|
/* Seems to be necessary for every command */
|
||||||
if (priv->sm == ACPI_TPM2_COMMAND_BUFFER_WITH_PLUTON)
|
if (priv->sm == ACPI_TPM2_COMMAND_BUFFER_WITH_PLUTON)
|
||||||
__crb_cmd_ready(&chip->dev, priv);
|
__crb_cmd_ready(&chip->dev, priv, chip->locality);
|
||||||
|
|
||||||
memcpy_toio(priv->cmd, buf, len);
|
memcpy_toio(priv->cmd, buf, len);
|
||||||
|
|
||||||
|
|
@ -672,7 +683,7 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||||
* PTT HW bug w/a: wake up the device to access
|
* PTT HW bug w/a: wake up the device to access
|
||||||
* possibly not retained registers.
|
* possibly not retained registers.
|
||||||
*/
|
*/
|
||||||
ret = __crb_cmd_ready(dev, priv);
|
ret = __crb_cmd_ready(dev, priv, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_relinquish_locality;
|
goto out_relinquish_locality;
|
||||||
|
|
||||||
|
|
@ -744,7 +755,7 @@ out:
|
||||||
if (!ret)
|
if (!ret)
|
||||||
priv->cmd_size = cmd_size;
|
priv->cmd_size = cmd_size;
|
||||||
|
|
||||||
__crb_go_idle(dev, priv);
|
__crb_go_idle(dev, priv, 0);
|
||||||
|
|
||||||
out_relinquish_locality:
|
out_relinquish_locality:
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue