All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rajiv Andrade <srajiv@linux.vnet.ibm.com>
To: Matt Helsley <matthltc@us.ibm.com>
Cc: linux-kernel@vger.kernel.org, akpm@linux-foundation.org,
	dave@linux.vnet.ibm.com, jmorris@namei.org,
	zohar@linux.vnet.ibm.com
Subject: Re: [PATCH 1/2] TPM: sysfs functions consolidation
Date: Fri, 30 Jan 2009 12:43:59 -0200	[thread overview]
Message-ID: <4983122F.1010909@linux.vnet.ibm.com> (raw)
In-Reply-To: <1233274749.12333.38.camel@localhost>

Matt Helsley wrote:
> On Thu, 2009-01-29 at 21:01 -0200, Rajiv Andrade wrote:
>   
>> According to Dave Hansen's comments on the tpm_show_*, some of these functions
>> present a pattern when allocating data[] memory space and also when setting its
>> content. A new function was created so that this pattern could be consolidated.
>> Also, replaced the data[] command vectors and its indexes by meaningful structures
>> as pointed out by Matt Helsley too.
>>
>> Signed-off-by: Rajiv Andrade <srajiv@linux.vnet.ibm.com>
>> ---
>>  drivers/char/tpm/tpm.c |  410 +++++++++++++++++-------------------------------
>>  drivers/char/tpm/tpm.h |  117 ++++++++++++++
>>  2 files changed, 258 insertions(+), 269 deletions(-)
>>
>> diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
>> index 9c47dc4..58ea16f 100644
>> --- a/drivers/char/tpm/tpm.c
>> +++ b/drivers/char/tpm/tpm.c
>>     
>
> <snip>
>
>   
>> -	rc = transmit_cmd(chip, data, sizeof(data),
>> +	rc = transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE,
>>  			"attempting to determine the timeouts");
>>  	if (rc)
>>  		goto duration;
>>
>> -	if (be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_SIZE_IDX)))
>> +	if (be32_to_cpu(tpm_cmd.header.out.length)
>>  	    != 4 * sizeof(u32))
>>  		goto duration;
>>
>> +	timeout_cap = &tpm_cmd.params.getcap_out.cap.timeout;
>>  	/* Don't overwrite default if value is 0 */
>> -	timeout =
>> -	    be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_1_IDX)));
>> +	timeout = be32_to_cpu(timeout_cap->a);
>>  	if (timeout)
>>  		chip->vendor.timeout_a = usecs_to_jiffies(timeout);
>> -	timeout =
>> -	    be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_2_IDX)));
>> +	timeout = be32_to_cpu(timeout_cap->b);
>>  	if (timeout)
>>  		chip->vendor.timeout_b = usecs_to_jiffies(timeout);
>> -	timeout =
>> -	    be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_3_IDX)));
>> +	timeout = be32_to_cpu(timeout_cap->c);
>>  	if (timeout)
>>  		chip->vendor.timeout_c = usecs_to_jiffies(timeout);
>> -	timeout =
>> -	    be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_4_IDX)));
>> +	timeout = be32_to_cpu(timeout_cap->d);
>>  	if (timeout)
>>  		chip->vendor.timeout_d = usecs_to_jiffies(timeout);
>>     
>
> Are jiffies really the appropriate units of time for the needs of this
> driver? I could easily be wrong but I thought most drivers were
> discouraged from using jiffies since HZ is configurable...
>
>   
The timeout is converted from usecs to jiffies before assigning it to 
chip->vendor.timeout_*, so even with boxes with different configured HZ, 
those values would be the same in usecs.
Hopefully there's no way to modify HZ in runtime.
>>  duration:
>> -	memcpy(data, tpm_cap, sizeof(tpm_cap));
>> -	data[TPM_CAP_IDX] = TPM_CAP_PROP;
>> -	data[TPM_CAP_SUBCAP_IDX] = TPM_CAP_PROP_TIS_DURATION;
>> +	tpm_cmd.header.in = tpm_getcap_header;
>> +	tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP;
>> +	tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4);
>> +	tpm_cmd.params.getcap_in.subcap = TPM_CAP_PROP_TIS_DURATION;
>>
>> -	rc = transmit_cmd(chip, data, sizeof(data),
>> +	rc = transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE,
>>  			"attempting to determine the durations");
>>  	if (rc)
>>  		return;
>>
>> -	if (be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_SIZE_IDX)))
>> +	if (be32_to_cpu(tpm_cmd.header.out.return_code)
>>  	    != 3 * sizeof(u32))
>>  		return;
>> -
>> +	timeout_cap = &tpm_cmd.params.getcap_out.cap.timeout;
>>  	chip->vendor.duration[TPM_SHORT] =
>> -	    usecs_to_jiffies(be32_to_cpu
>> -			     (*((__be32 *) (data +
>> -					    TPM_GET_CAP_RET_UINT32_1_IDX))));
>> +	    usecs_to_jiffies(be32_to_cpu(timeout_cap->a));
>>  	/* The Broadcom BCM0102 chipset in a Dell Latitude D820 gets the above
>>  	 * value wrong and apparently reports msecs rather than usecs. So we
>>  	 * fix up the resulting too-small TPM_SHORT value to make things work.
>> @@ -565,13 +578,9 @@ duration:
>>  		chip->vendor.duration[TPM_SHORT] = HZ;
>>
>>  	chip->vendor.duration[TPM_MEDIUM] =
>> -	    usecs_to_jiffies(be32_to_cpu
>> -			     (*((__be32 *) (data +
>> -					    TPM_GET_CAP_RET_UINT32_2_IDX))));
>> +	    usecs_to_jiffies(be32_to_cpu(timeout_cap->b));
>>  	chip->vendor.duration[TPM_LONG] =
>> -	    usecs_to_jiffies(be32_to_cpu
>> -			     (*((__be32 *) (data +
>> -					    TPM_GET_CAP_RET_UINT32_3_IDX))));
>> +	    usecs_to_jiffies(be32_to_cpu(timeout_cap->c));
>>     
>
> OK, so it looks like these timeouts are short, medium, and long-duration
> timeouts and those correspond to "a", "b", and "c". What's "d"? Also
> this suggests slightly-better names for these fields. If you can think
> of short names suggesting why these separate, varying-length timeouts
> are needed that could be even better.
>
> <snip>
>
>   
Yes, the timeout_cap struct isn't appropriate here to read the 
TIS_DURATION capability, which has a different meaning from the timeout 
one and hasn't a forth field to be assigned. I'll write the duration_cap 
struct and make use of it here and resubmit this patch.
>> diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
>> index 8e30df4..867987d 100644
>> --- a/drivers/char/tpm/tpm.h
>> +++ b/drivers/char/tpm/tpm.h
>>     
>
> <snip>
>
>   
>> +struct	timeout_t {
>> +	__be32	a;
>> +	__be32	b;
>> +	__be32	c;
>> +	__be32	d;
>> +}__attribute__((packed));
>>     
>
> As I pointed out above I think these could use better names. I also
> noticed that there are timeout_a, timeout_b, etc. fields of another
> struct (somewhere under "chips" if I recall..). Perhaps similar naming
> -- maybe even this struct -- should be (re)used?
>   
> <snip>
>
>   
Yes, it's inside tpm_vendor_specific struct, but this one has __be32 
fields. The tpm_vendor_specific struct has these timeout fields and  but 
also a bunch of others, so unfortunately no reuse could be done.

Thanks reviewing it,
Rajiv


  reply	other threads:[~2009-01-30 14:44 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-29 23:01 [PATCH 0/2] TPM: refactoring and integrity Rajiv Andrade
2009-01-29 23:01 ` [PATCH 1/2] TPM: sysfs functions consolidation Rajiv Andrade
2009-01-29 23:01   ` [PATCH 2/2] TPM: integrity interface Rajiv Andrade
2009-01-30  0:19   ` [PATCH 1/2] TPM: sysfs functions consolidation Matt Helsley
2009-01-30 14:43     ` Rajiv Andrade [this message]
2009-01-29 23:50 ` [PATCH 2/2 - repost] TPM: integrity interface Rajiv Andrade
  -- strict thread matches above, loose matches on Subject: below --
2009-02-02 17:23 [PATCH 0/2] TPM: refactoring and integrity Rajiv Andrade
2009-02-02 17:23 ` [PATCH 1/2] TPM: sysfs functions consolidation Rajiv Andrade

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4983122F.1010909@linux.vnet.ibm.com \
    --to=srajiv@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=dave@linux.vnet.ibm.com \
    --cc=jmorris@namei.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=matthltc@us.ibm.com \
    --cc=zohar@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.