admin 管理员组文章数量: 887021
TPM
TCG_PCClient_Device_Driver_Design_Principles_TPM2p0_v1p1_r4_211104_final.pdf
4 简介 本文档补充了 TCG PC Client Platform TPM Profile for TPM 2.0 Specification [PTP]; 特别是,本文档为有兴趣开发 DD 的 DD 编写者提供指导,以便与旨在满足 [PTP] 要求的 TPM 对话。 在使用本文档之前,读者应该熟悉 TPM 库规范第 1 部分中描述的 TPM 体系结构,并彻底熟悉 [ PTP]规范。 [PTP] 作者的目的是提供足够的标准化、指导和限制,以允许每个操作系统或每个操作系统环境中的通用 DD 访问和控制来自不同 TPM 制造商的 TPM,同时仍然为 TPM 制造商提供足够的灵活性 产品和功能差异化。 然而,[PTP] 是从 TPM 开发人员的角度编写的,几乎没有包含有助于 DD 设计人员的信息性评论。 本文档的读者是 TPM 制造商和 TPM DD 设计、开发和测试工程师。 TPM 制造商会发现此文档很有价值,因为它从 DD 的角度解释了 TPM 的行为。 此外,本文档提供的指南可能对独立 BIOS 供应商有用
TPM 寄存器接口
[PTP] 定义了 TPM 寄存器和寄存器接口类型的访问方法,以及任何物理接口依赖性。
5 接口选择
根据 [PTP] 的 TPM 可以在物理 SPI 接口上提供最多三个不同的逻辑接口:
符合 TIS 1.3 的 FIFO
根据 [PTP] 的 FIFO
CRB
FIFO 接口在 LPC 和 SPI 物理接口上相同,但在 I2C 物理接口上不同。
根据平台实现,必须根据图 1 接口选择切换 TPM 的默认接口。
注意:切换仅与 BIOS DD 相关。
6 局部性和访问协议
[PTP] 中定义的局部性是 TPM 为不同平台组件提供对 TPM 的隔离访问的机制。 TPM 通过为每个位置提供不同的寄存器地址范围来实现这一点。 有关其他信息,请参阅 [PTP] 第 5.2 节。 位置是对 TPM 的断言,即命令的源与特定平台组件相关联。 局部性可以被认为是基于硬件的授权。 TPM 实际上并不知道位置和平台组件之间关系的性质。 [PTP] 中定义了区域的保护和分离(以及因此与相应平台组件的关联)。 TPM 的设计为命令提供单线程访问:即,每个命令必须在请求另一个命令之前完成。 局部性并不意味着不同的平台组件可以同时访问 TPM。 使用的方案是 TPM 级别的请求/授权方案。 通常,对一个地方的访问是非抢占式的,即,如果一个地方可以访问 TPM,那么在另一个地方可以被授予访问权限之前,该地方必须释放它的地方。 通过捕获机制提供异常。 该机制旨在仅用作“故障安全”,而不是正常执行的协议,以防止可能成为死锁的系统。 对于 FIFO 和 CRB 接口,局部性断言是通过在指定的地址范围块与 TPM 交互来完成的。 每个地区都被分配了一个地址范围,并且当在与地区关联的地址范围内接收到命令时,TPM 设置一个内部标志(localityModifier)来记录哪个地区已被授予访问权限。
与 TPM Localities 关联的所有进程都可以访问 TPM_ACCESS_x (FIFO) 或 TPM_LOC_STATE_x (CRB) 寄存器,用于检查和/或请求使用其关联的 Locality。 如果当前执行进程的 Locality 不是 TPM 当前活动的 Locality,则可以使用分配给进程 Locality 的 TPM_ACCESS_x/TPM_LOC_STATE_x 发出请求。 如果没有设置 TPM Locality 或当前有权访问 TPM 的 Locality 释放它,则请求 Locality 被授予访问权限。 请参阅图 2 位置访问协议 - DD 观点以了解相应的流程。
7 使用 TPM 的代码流 以下流程图
(图 3、图 4、图 5 和图 6)提供了代码流的信息序列,DD 通过遵循 [PTP] 的规范性和信息性部分关于 FIFO 或 CRB 协议。 这些流程图仅供参考,仅供参考。 通常的做法是让 DD 在与 TPM 通信期间检查寄存器的一致性。 这确保了实际的 TPM 状态与 DD 假定的 TPM 状态一致。 建议在命令写入、执行和读取期间添加对 TPM_CRB_STS_X.tpmSts 和 TPM_CRB_STS_X.tpmIdle(CRB 接口)的检查,以确保没有发生致命错误并且 TPM 不处于空闲状态。
7.1 FIFO 协议 FIFO 协议的代码流专为常见用例而设计。 有一些优化的可能性,可以应用于特定的平台。 DD 的开发人员必须考虑 DD 所针对的平台的功能,并且必须确定在应用优化时是否存在任何功能风险。
7.1.1 解释和定义 下面表 2 中定义的 DD 变量和缩写用于 FIFO 协议的以下流程图(图 3 和图 4):
7.1.2 取消读取TPM.burstCount 如果DD有指示TPM准备好接收命令(TPM.commandReady == 1),DD可能只读取一次TPM.burstCount然后写入所有字节(初始 TxSize 的值)包含在 DD 的传输缓冲区到 TPM FIFO 中。 注意:此优化要求主机和 TPM 之间的硬件握手(对于 LPC:SYNC = Long Wait,对于 SPI:Wait states per [PTP],6.4.5 Flow Control)绝对正确地工作。 否则,如果握手出现问题,平台可能会挂起。
7.2 CRB 协议
7.2.1 解释和定义
下表 3 中定义的 DD 变量和缩写用于 CRB 协议的以下流程图(图 5 和图 6):
注意:任何超时情况都表示需要正确处理错误的 TPM 故障。
如果无法纠正此类情况,则 TPM 有缺陷。
所有表达式都遵循 C 风格语法
8 中断使用
为方便起见,本节重复了 TCG PC 客户端平台 TPM 配置文件 [PTP] 规范第 5.6 节“中断”中包含的一些信息。
8.1 设置
TPM 的 OS DD 将向 OS 注册一个 ISR 以指示它可以处理中断。 这通常在 TPM DD 初始化期间完成。 然后,操作系统将确保每当 TPM 设备触发中断时,都会调用 TPM DD 的 ISR 来处理中断。 OS DD 设计指南建议采用拆分方法来处理中断:使用 ISR 来处理快速任务,例如确认中断。 然后,ISR 会安排另一个处理程序,有时称为延迟过程调用 (DPC),它会执行更多时间密集型工作
8.2 启用中断
启用TPM 中断就像在中断启用寄存器(TPM_INT_ENABLE_x 或TPM_CRB_INT_ENABLE_x)中设置相应中断位一样简单。 关于如何使用中断有不同的方法。 一种是在OS TPM DD启动时启用中断,另一种是选择性地启用中断。 如果操作系统 TPM DD 采用第一种方法,它必须在中断处理程序和发送 TPM 命令的代码之间进行同步,以确定是否需要中断。 仅在发送命令后启用中断和在接收到中断后禁用中断将不需要这种同步。 操作系统 TPM DD 编写者必须意识到,启用和禁用中断会产生性能成本,即额外的寄存器读取和写入。 操作系统也可能会产生处理中断的开销。 它必须将中断分派给正确的中断服务程序。 调度中断时,操作系统通常会屏蔽其他中断,直到中断被确认。 为了解决这些惩罚,[PTP] 包含对可能优化的描述:许多命令在正常操作期间立即响应,因此 DD 在发送命令后,应轮询 TPM 以获取响应,同时保持数据可用中断禁用。 如果 DD 确定 TPM 将无法立即响应,它将停止轮询 TPM 并启用数据可用中断。 如果 DD 这样做,则在轮询期间最后一次读取发生的时间与启用中断之间可能会出现竞争条件。 因此,使能中断后,DD应该再轮询一次TPM。 这同样适用于影响其他中断的变化。 对于 LPC 设备,TPM_INT_ENABLE_x 寄存器还包含中断的极性。 TPM DD 应注意不要在正常操作期间更改极性。 某些 TPM 实现要求操作系统 TPM DD 设置已由固件/操作系统分配给 TPM 设备的中断向量。 OS TPM DD查询OS提供的设备信息,将中断向量写入TPM_INT_VECTOR_x寄存器。
8.3 处理中断
当导致 TPM 发出中断信号的事件发生时,TPM 必须在 TPM_INT_STATUS_x 或 TPM_CRB_INT_STS_x 寄存器中设置适当的字段。 如果 TPM 尚未发送中断,则 TPM_INT_STATUS_x 或 TPM_CRB_INT_STS_x 寄存器中的字段从 0 到 1 的转换必须导致 TPM 根据 SIRQ 或 PIRQ 协议断言适当的中断。 中断服务例程将读取 TPM_INT_STATUS_x 或 TPM_CRB_INT_STS_x 寄存器以确定原因并采取适当的措施。 当中断被服务时,中断服务例程必须对 I/O APIC 执行中断结束 (EOI),以重新准备 I/O APIC 中的 TPM 中断。 然后中断服务例程还必须向TPM发送TPM_EOI,以允许TPM发送新的中断。
在收到 TPM_EOI 消息之前,TPM 不得发出另一个中断,即使发生了应该引起中断的新事件。 TPM 应在 TPM_INT_STATUS_x 或 TPM_CRB_INT_STS_x 寄存器中设置适当的字段,但 TPM 断言中断直到它收到 TPM_EOI。 如果中断处理程序检测到设置了多个字段,它可能会处理所有原因并清除多个状态字段。 这意味着可以在不引起新中断的情况下处理中断。 中断处理程序可能会在发送 TPM_EOI 之前继续检查 TPM_INT_STATUS_x 或 TPM_CRB_INT_STS_x 字段是否设置了新字段。 请注意,每个中断只能有一个未完成的通知。 如果 TPM DD 实施了一种策略,可以为每个命令启用和禁用数据可用中断,例如,基于命令的持续时间,则应在确认中断时禁用数据可用中断。 这必须在发送下一个命令之前发生。 由于 TPM 的串行特性,TPM 的通信接口不应在发送下一个命令之前触发另一个数据可用中断。 请注意,中断可能会在设备之间共享。 这意味着当另一个设备触发中断时,可以调用 TPM DD 的 ISR。 TPM DD 必须检查 TPM_INT_STATUS_x 或 TPM_CRB_INT_STS_x 寄存器以查看 TPM 设备是否生成中断。 如果 TPM DD 实现延迟过程调用 (DPC),则数据可用中断的 DPC 可以读取响应或向另一个线程发出信号以继续处理响应
9 寻址、电源管理和 TPM 操作模式
本章描述了在电源管理和 ACPI 方面相当复杂的 TPM 处理。 TPM DD 的实施不需要本章。
9.1 TPM 寻址
TPM 与其他平台组件一起在平台重置期间初始化。 平台重置后,根据定义,S-CRTM 是第一个执行的代码。 必然地,此环境往往无法发现 TPM 的逻辑位置。 D-CRTM 具有相同的局限性。 因此,为了为 PC 客户端提供最佳的安全性和性能属性,PTP 规范将 TPM 的位置定义为固定位置,不允许有任何差异。 基于 ACPI 的操作系统使用平台固件提供的 ACPI 表来分配和保留 TPM 资源。 DD 使用即插即用管理器的接口来发现为当前平台的启动周期分配的资源。 (例如,是否已为该引导周期分配了 TPM DD,分配了哪个 IRQ 等?)但是,如果没有用于 TPM 的 ACPI 表条目,操作系统将不会加载 DD,因此可以执行 没有什么。
9.2 电源管理
9.2.1 提醒
对于 PC,ACPI 定义了一组电源状态,每个状态都有不同的性能和电源要求。 系统状态 系统状态描述了整个系统的电源状态。 定义的系统状态列举如下:
S0 - 工作状态(更快的响应时间,高功率使用)
S1、S2、S3 – 睡眠(某些组件可能已断电;易失性存储器已通电)
S4 – 休眠(系统关闭;易失性内存内容保存到非易失性内存)
S5 – 关闭设备状态
设备状态
D0–D3 取决于设备:
9.2.2 Power State Transitions
TPM 设计为仅在平台“运行状态”期间消耗电力,即特别是在 S0、S1 和 S2 ACPI 电源状态期间。 在平台的“非运行”状态(S4 和 S5)期间,TPM 不耗电。 TPM 可以在 S3 期间从辅助或备用电源汲取电力,但这样做只能在发出 TPM2_Shutdown (STATE) 命令时维持所需的状态。 在特定条件下平台的“运行状态”期间,允许 TPM 进入较低功率状态。 如果 TPM 处于空闲状态,只要 TPM 设备驱动程序(即图 3 使用 FIFO 协议发送命令的流程图)和 TPM 功能不受影响,就可以通过关闭内部功能块来降低其功耗。 当 TPM 在其接口上接收到会导致其从空闲状态变为就绪状态的事务时,TPM 在 TIMEOUT_B 内退出低功耗模式。 在收到 TPM2_Startup 命令之前,不允许 TPM 进入低功耗状态
本文标签: TPM
版权声明:本文标题:TPM 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1686774012h35482.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论