On Wed, Mar 29, 2017 at 12:43:23AM -0700, Petr Vandrovec wrote:
> From: Petr Vandrovec <[email protected]>
> 
> Latest revision of TPM 2.0 ACPI spec adds log start/length
> to the TPM2 table.  Add them to our definition.  As few
> places were using sizeof(TPM2) to make sure required fields
> are present, switch them to use length of table up to and
> including start type field, as that is what they are after.
> 
> Also change SMC CRB handling to use TPM2 fields rather than
> offsets + typecasts.
> 
> Signed-off-by: Petr Vandrovec <[email protected]>

Looking into these after 4.12 PR. Where is the cover letter?
I cannot find it for some reason.

/Jarkko

> ---
>  drivers/char/tpm/tpm_crb.c | 15 +++------------
>  drivers/char/tpm/tpm_tis.c |  2 +-
>  include/acpi/actbl2.h      | 30 +++++++++++++++++++++++++-----
>  3 files changed, 29 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c
> index 72b03c328198..43bec842e013 100644
> --- a/drivers/char/tpm/tpm_crb.c
> +++ b/drivers/char/tpm/tpm_crb.c
> @@ -110,14 +110,6 @@ struct crb_priv {
>       u32 smc_func_id;
>  };
>  
> -struct tpm2_crb_smc {
> -     u32 interrupt;
> -     u8 interrupt_flags;
> -     u8 op_flags;
> -     u16 reserved2;
> -     u32 smc_func_id;
> -};
> -
>  /**
>   * crb_go_idle - request tpm crb device to go the idle state
>   *
> @@ -538,7 +530,7 @@ static int crb_acpi_add(struct acpi_device *device)
>  
>       status = acpi_get_table(ACPI_SIG_TPM2, 1,
>                               (struct acpi_table_header **) &buf);
> -     if (ACPI_FAILURE(status) || buf->header.length < sizeof(*buf)) {
> +     if (ACPI_FAILURE(status) || buf->header.length < 
> ACPI_TPM2_SIZE_WITH_START) {
>               dev_err(dev, FW_BUG "failed to get TPM2 ACPI table\n");
>               return -EINVAL;
>       }
> @@ -565,15 +557,14 @@ static int crb_acpi_add(struct acpi_device *device)
>               priv->flags |= CRB_FL_ACPI_START;
>  
>       if (sm == ACPI_TPM2_COMMAND_BUFFER_WITH_SMC) {
> -             if (buf->header.length < (sizeof(*buf) + sizeof(*crb_smc))) {
> +             if (buf->header.length < ACPI_TPM2_SIZE_WITH_SMC) {
>                       dev_err(dev,
>                               FW_BUG "TPM2 ACPI table has wrong size %u for 
> start method type %d\n",
>                               buf->header.length,
>                               ACPI_TPM2_COMMAND_BUFFER_WITH_SMC);
>                       return -EINVAL;
>               }
> -             crb_smc = ACPI_ADD_PTR(struct tpm2_crb_smc, buf,
> -                                    ACPI_TPM2_START_METHOD_PARAMETER_OFFSET);
> +             crb_smc = &buf->platform_specific_data.smc;
>               priv->smc_func_id = crb_smc->smc_func_id;
>               priv->flags |= CRB_FL_CRB_SMC_START;
>       }
> diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c
> index c7e1384f1b08..f513a116e195 100644
> --- a/drivers/char/tpm/tpm_tis.c
> +++ b/drivers/char/tpm/tpm_tis.c
> @@ -257,7 +257,7 @@ static int tpm_tis_acpi_init(struct acpi_device *acpi_dev)
>  
>       st = acpi_get_table(ACPI_SIG_TPM2, 1,
>                           (struct acpi_table_header **) &tbl);
> -     if (ACPI_FAILURE(st) || tbl->header.length < sizeof(*tbl)) {
> +     if (ACPI_FAILURE(st) || tbl->header.length < ACPI_TPM2_SIZE_WITH_START) 
> {
>               dev_err(&acpi_dev->dev,
>                       FW_BUG "failed to get TPM2 ACPI table\n");
>               return -EINVAL;
> diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h
> index 2b4af0769a28..645961f998ef 100644
> --- a/include/acpi/actbl2.h
> +++ b/include/acpi/actbl2.h
> @@ -1273,20 +1273,42 @@ struct acpi_table_tcpa_server {
>   *        Version 4
>   *
>   * Conforms to "TCG ACPI Specification, Family 1.2 and 2.0",
> - * December 19, 2014
> + * Version 1.2, Revision 8, February 27, 2017, Committee Draft
>   *
>   
> ******************************************************************************/
>  
> +struct tpm2_crb_smc {
> +     u32 interrupt;
> +     u8 interrupt_flags;
> +     u8 op_flags;
> +     u16 reserved2;
> +     u32 smc_func_id;
> +};
> +
>  struct acpi_table_tpm2 {
>       struct acpi_table_header header;        /* Common ACPI table header */
>       u16 platform_class;
>       u16 reserved;
>       u64 control_address;
>       u32 start_method;
> -
> -     /* Platform-specific data follows */
> +     /* End of Version 3 or minimal version 4 table. */
> +        union {
> +             u8 raw[12];
> +             u32 acpi;  /* ACPI start method should have 4 zero bytes here. 
> */
> +             struct tpm2_crb_smc smc;
> +     } platform_specific_data;       /* Added in Level 00 Version 00.37 */
> +     u32 minimum_log_length;         /* Added in Version 1.2 */
> +     u64 log_address;                /* Added in Version 1.2 */
>  };
>  
> +/* TPM2 table sizes. */
> +
> +#define ACPI_TPM2_SIZE_WITH_START    offsetofend(struct acpi_table_tpm2, \
> +                                                 start_method)
> +#define ACPI_TPM2_SIZE_WITH_SMC              offsetofend(struct 
> acpi_table_tpm2, \
> +                                                 platform_specific_data)
> +#define ACPI_TPM2_SIZE_WITH_LOG              sizeof(struct acpi_table_tpm2)
> +
>  /* Values for start_method above */
>  
>  #define ACPI_TPM2_NOT_ALLOWED                       0
> @@ -1296,8 +1318,6 @@ struct acpi_table_tpm2 {
>  #define ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD  8
>  #define ACPI_TPM2_COMMAND_BUFFER_WITH_SMC          11
>  
> -#define ACPI_TPM2_START_METHOD_PARAMETER_OFFSET    52
> -
>  
> /*******************************************************************************
>   *
>   * UEFI - UEFI Boot optimization Table
> -- 
> 2.11.0
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
tpmdd-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tpmdd-devel

Reply via email to