tpm_sysfs_add_device(chip);
rc = tpm_bios_log_setup(chip);
- if (rc == -ENODEV)
+ if (rc != 0 && rc != -ENODEV)
return rc;
tpm_add_ppi(chip);
log = &chip->log;
+ /* Unfortuntely ACPI does not associate the event log with a specific
+ * TPM, like PPI. Thus all ACPI TPMs will read the same log.
+ */
+ if (!chip->acpi_dev_handle)
+ return -ENODEV;
+
/* Find TCPA entry in RSDT (ACPI_LOGICAL_ADDRESSING) */
status = acpi_get_table(ACPI_SIG_TCPA, 1,
(struct acpi_table_header **)&buff);
if (ACPI_FAILURE(status))
- return -EIO;
+ return -ENODEV;
switch(buff->platform_class) {
case BIOS_SERVER:
}
rc = tpm_read_log_acpi(chip);
- if ((rc == 0) || (rc == -ENOMEM))
+ if (rc != -ENODEV)
return rc;
- rc = tpm_read_log_of(chip);
-
- return rc;
+ return tpm_read_log_of(chip);
}
+/*
+ * tpm_bios_log_setup() - Read the event log from the firmware
+ * @chip: TPM chip to use.
+ *
+ * If an event log is found then the securityfs files are setup to
+ * export it to userspace, otherwise nothing is done.
+ *
+ * Returns -ENODEV if the firmware has no event log.
+ */
int tpm_bios_log_setup(struct tpm_chip *chip)
{
const char *name = dev_name(&chip->dev);
return 0;
rc = tpm_read_log(chip);
- /*
- * read_log failure means event log is not supported except for ENOMEM.
- */
- if (rc < 0) {
- if (rc == -ENOMEM)
- return -ENODEV;
- else
- return rc;
- }
+ if (rc)
+ return rc;
cnt = 0;
chip->bios_dir[cnt] = securityfs_create_dir(name, NULL);
struct tpm_bios_log *log;
log = &chip->log;
- if (chip->dev.parent->of_node)
+ if (chip->dev.parent && chip->dev.parent->of_node)
np = chip->dev.parent->of_node;
else
return -ENODEV;
sizep = of_get_property(np, "linux,sml-size", NULL);
- if (sizep == NULL)
+ basep = of_get_property(np, "linux,sml-base", NULL);
+ if (sizep == NULL && basep == NULL)
+ return -ENODEV;
+ if (sizep == NULL || basep == NULL)
return -EIO;
if (*sizep == 0) {
return -EIO;
}
- basep = of_get_property(np, "linux,sml-base", NULL);
- if (basep == NULL)
- return -EIO;
-
log->bios_event_log = kmalloc(*sizep, GFP_KERNEL);
if (!log->bios_event_log)
return -ENOMEM;