[tpm2] Re: Installing on FreeBSD?

John Connett <jrc at skylon.me.uk> Tue, 05 Apr 2022 19:50:02 +0100
Newsgroups dev.linux.lists.tpm2
Message-ID <[email protected]>
On 05/04/2022 19:20, Tadeusz Struk wrote:

> On 4/5/22 10:03, John Connett wrote:
>> It's ths one! I added a printf to output the value of "timeout" at:
>> https://github.com/freebsd/freebsd-src/blob/main/sys/dev/tpm/tpm_crb.c#L259 
>>
>>
>> It counts down until timeout <= 0 (in steps of 10000) then ENXIO is 
>> returned.
>>
>> I've had a quick look at:
>> https://trustedcomputinggroup.org/wp-content/uploads/Mobile-Command-Response-Buffer-Interface-v2-r12-Specification_FINAL2.pdf 
>>
>>
>> If polling isn't working perhaps interrupt control or some other form 
>> of notification is required?
>
> I don't think CRB interface requires irq, in my case no interrupt is 
> registered: 

Similar here:
# vmstat -i
interrupt                          total       rate
cpu0:timer                        103066         13
cpu1:timer                         72551          9
cpu0:hyperv                        19225          3
cpu1:hyperv                         1850          0
Total                             196692         26

> Is there anything I could dig out of the control structures that would 
> help identify the problem?
>
> Not sure, must be something specific to the windows hyper-V TPM.
> I'm running freeBSD13.0 on top of Linux KVM and crb-tpm2.0 and it's 
> working fine.
> You may want to compare the ACPI tables to see what's missing. Here 
> what I have:

I have:
...
/*
   TPM2: Length=52, Revision=3, Checksum=236,
     OEMID=VRTUAL, OEM Table ID=VTPM, OEM Revision=0x1,
     Creator ID=MSFT, Creator Revision=0x1
         ControlArea=fed40000
         StartMethod=7
  */
...
/*
  * Intel ACPI Component Architecture
  * AML/ASL+ Disassembler version 20210930 (64-bit version)
  * Copyright (c) 2000 - 2021 Intel Corporation
  *
  * Disassembling to symbolic ASL+ operators
  *
  * Disassembly of /tmp/acpidump.61CEQi/acpdump.din, Tue Apr  5 19:23:27 
2022
  *
  * Original Table Header:
  *     Signature        "DSDT"
  *     Length           0x0001E184 (123268)
  *     Revision         0x02
  *     Checksum         0x3A
  *     OEM ID           "MSFTVM"
  *     OEM Table ID     "DSDT01"
  *     OEM Revision     0x00000001 (1)
  *     Compiler ID      "MSFT"
  *     Compiler Version 0x05000000 (83886080)
  */
DefinitionBlock ("", "DSDT", 2, "MSFTVM", "DSDT01", 0x00000001)
{
     OperationRegion (BIOS, SystemMemory, 0xF7FD9000, 0xFF)
     Field (BIOS, ByteAcc, NoLock, Preserve)
     {
         MG2B,   32,
         MG2L,   32,
         HMIB,   32,
         HMIL,   32,
         GCAL,   32,
         GCAH,   32,
         PCNT,   32,
         NVDA,   32,
         SCFG,   8,
         TCFG,   8,
         PCFG,   8,
         HCFG,   8,
         NCFG,   8,
         BCFG,   8,
         SGXE,   8,
         PADE,   8,
         NCNT,   16
     }
...
     If ((TCFG > Zero))
     {
         Device (\_SB.VMOD.TPM2)
         {
             Name (_ADR, Zero)  // _ADR: Address
             Name (_HID, "VTPM0101")  // _HID: Hardware ID
             Name (_CID, "MSFT0101" /* TPM 2.0 Security Device */) // 
_CID: Compatible ID
             Name (_UID, One)  // _UID: Unique ID
             Name (_DDN, "Microsoft Virtual TPM 2.0")  // _DDN: DOS 
Device Name
             Name (_STR, Unicode ("Microsoft Virtual TPM 2.0"))  // 
_STR: Description String
             Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource 
Settings
             {
                 Memory32Fixed (ReadWrite,
                     0xFED40000,         // Address Base
                     0x00001000,         // Address Length
                     )
             })
             Method (_STA, 0, NotSerialized)  // _STA: Status
             {
                 Return (0x0F)
             }

             OperationRegion (GIO, SystemIO, 0x1040, 0x08)
             Field (GIO, DWordAcc, NoLock, Preserve)
             {
                 CTLP,   32,
                 DATP,   32
             }

             Method (TPPI, 2, Serialized)
             {
                 Name (PKG2, Package (0x02)
                 {
                     Zero,
                     Zero
                 })
                 Name (PKG3, Package (0x03)
                 {
                     Zero,
                     Zero,
                     Zero
                 })
                 While (One)
                 {
                     Name (_T_0, 0x00)  // _T_x: Emitted by ASL 
Compiler, x=0-9, A-Z
                     _T_0 = ToInteger (Arg0)
                     If ((_T_0 == Zero))
                     {
                         Return (Buffer (0x02)
                         {
                              0xFF, 
0x01                                       // ..
                         })
                     }
                     ElseIf ((_T_0 == One))
                     {
                         Return ("1.3")
                     }
                     ElseIf ((_T_0 == 0x02))
                     {
                         Return (0x03)
                     }
                     ElseIf ((_T_0 == 0x03))
                     {
                         CTLP = 0x03
                         PKG2 [Zero] = Zero
                         PKG2 [One] = DATP /* \_SB_.VMOD.TPM2.DATP */
                         Return (PKG2) /* \_SB_.VMOD.TPM2.TPPI.PKG2 */
                     }
                     ElseIf ((_T_0 == 0x04))
                     {
                         Return (0x02)
                     }
                     ElseIf ((_T_0 == 0x05))
                     {
                         CTLP = 0x05
                         PKG3 [One] = DATP /* \_SB_.VMOD.TPM2.DATP */
                         CTLP = 0x06
                         PKG3 [0x02] = DATP /* \_SB_.VMOD.TPM2.DATP */
                         PKG3 [Zero] = Zero
                         Return (PKG3) /* \_SB_.VMOD.TPM2.TPPI.PKG3 */
                     }
                     ElseIf ((_T_0 == 0x06))
                     {
                         Return (0x03)
                     }
                     ElseIf ((_T_0 == 0x07))
                     {
                         CTLP = 0x07
                         DATP = DerefOf (Arg1 [Zero])
                         Return (DATP) /* \_SB_.VMOD.TPM2.DATP */
                     }
                     ElseIf ((_T_0 == 0x08))
                     {
                         CTLP = 0x08
                         DATP = DerefOf (Arg1 [Zero])
                         Return (DATP) /* \_SB_.VMOD.TPM2.DATP */
                     }

                     Break
                 }

                 Return (One)
             }

             Method (TMCI, 2, Serialized)
             {
                 While (One)
                 {
                     Name (_T_0, 0x00)  // _T_x: Emitted by ASL 
Compiler, x=0-9, A-Z
                     _T_0 = ToInteger (Arg0)
                     If ((_T_0 == Zero))
                     {
                         Return (Buffer (One)
                         {
0x03                                             // .
                         })
                     }
                     ElseIf ((_T_0 == One))
                     {
                         BADR = 0x31
                         BDAT = DerefOf (Arg1 [Zero])
                         Return (BDAT) /* \_SB_.BDAT */
                     }

                     Break
                 }

                 Return (One)
             }

             Method (_DSM, 4, Serialized)  // _DSM: Device-Specific Method
             {
                 If ((Arg0 == ToUUID 
("3dddfaa6-361b-4eb4-a424-8d10089d1653") /* Physical Presence Interface */))
                 {
                     Return (TPPI (Arg2, Arg3))
                 }

                 If ((Arg0 == ToUUID 
("376054ed-cc13-4675-901c-4756d7f2d45d") /* Unknown UUID */))
                 {
                     Return (TMCI (Arg2, Arg3))
                 }

                 Return (Buffer (One)
                 {
0x00                                             // .
                 })
             }
         }
     }
...
OpenPGP_0x8F3115112EB8DB54.asc (application/pgp-keys, 2.1 KB)
-----BEGIN PGP PUBLIC KEY BLOCK-----

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
rA==
=DCrz
-----END PGP PUBLIC KEY BLOCK-----
OpenPGP_signature.sig (application/pgp-signature, 495 B) - not displayed