[SeaBIOS] Long delay: WARNING - Timeout at wait_reg8:81!

Stefan Berger stefanb at linux.vnet.ibm.com
Tue Mar 13 15:40:31 CET 2018


On 03/13/2018 10:15 AM, Stephen Douthit wrote:
>> When tis_probe() returns '1', it means the interface was detected.
>> If all registers return 0xffffffff in the no-TPM case we should 
>> return a '0' from tis_probe since rc was set to 0 from 
>> tis_wait_access() and we will not get into the ifaceid test case. If 
>> they return 0 then we shouldn't get past the tis_wait_access() 
>> because the expected pattern would not show up. I think tis_probe() 
>> is correct.
>
> Sounds good, I assumed I had screwed this up based on Paul's original
> bug report, and was still carrying the patch for my 'fix' to this
> function when I was doing my testing.
>
>> static u32 crb_probe(void)
>> {
>>      if (!CONFIG_TCGBIOS)
>>          return 0;
>>
>>      u32 ifaceid = readl(CRB_REG(0, CRB_REG_INTF_ID));
>>
>>      if ((ifaceid & 0xf) != 0xf) {
>>          if ((ifaceid & 0xf) == 1) {
>>              /* CRB is active */
>
> We also return here without doing the 64 bit address check.

Right...

>
>>              return 1;
>>          }
>>          if ((ifaceid & (1 << 14)) == 0) {
>>              /* CRB cannot be selected */
>>              return 0;
>>          }
>>          /* write of 1 to bits 17-18 selects CRB */
>>          writel(CRB_REG(0, CRB_REG_INTF_ID), (1 << 17));
>>          /* lock it */
>>          writel(CRB_REG(0, CRB_REG_INTF_ID), (1 << 19));
>>      }
>>
>>      /* no support for 64 bit addressing yet */
>>      if (readl(CRB_REG(0, CRB_REG_CTRL_CMD_HADDR)))
>>          return 1;
>>
>>      u64 addr = readq(CRB_REG(0, CRB_REG_CTRL_RSP_ADDR));
>>      if (addr > 0xffffffff)
>>          return 1;
>>
>>      return 0;
>> }
>>
>> if ifaceid returns ~0 we may return when reading 
>> CRB_REG_CTRL_CMD_HADDR. So probably we should test for ifaceid = ~0 
>> after it is read and return 0.
>>
>>
>>
>>>> inverted from what they should be, and the first 64bit address check
>>>> returned the wrong value.  Fixing both probe functions got rid of the
>>>> timeout for me when the TPM was disconnected.
>>
>> I see a problem with the crb_probe function but not the tis_probe.
>>
>>>>
>>>> It looks like there's a bit in the ACCESS register called Seize that
>>>> must always read '0' for the version 1.2/1.3 interfaces. I'd like to
>>>> check that instead of didvid in tis_probe to handle the aborted 
>>>> read all
>>>> 0s/Fs case.
>>
>> Why would there be a 'aborted read all'? I think the didvid registers 
>> should not return either 0 or ~0 for there to be a valid device. Why 
>> would that not be a good first test to see whether anything is there?
>
> The old parallel PCI bus referred to the termination of any access to a
> bad address where no device responded as 'Master Abort'.  That's where I
> got the aborted read term from.  As Kevin mentioned, on x86 this case
> normally results in a read of all Fs.
>
> The reason I want to move to Seize (or something like it) instead of
> didvid is that the spec actually says that _must_ always return '0', I
> don't see any explicit restrictions on didvid.

We could just look at the vendor id part of didvid and follow this 
document here. There's neither a 0x0000 nor a 0xffff vendor -- assuming 
the list is complete.

https://trustedcomputinggroup.org/wp-content/uploads/TCG-TPM-Vendor-ID-Registry-Version-1.01-Revision-1.00.pdf

So, following that logic, it cannot return 32bit ~0 (or 0), either. So 
the existing test is fine from what I can see.

I think that should be a first test, maybe also for CRB.

     Stefan




More information about the SeaBIOS mailing list