PCI ACPI相关
1、热插拔流程
1) 设备状态模式检测的信号脚 ---- 对应的GPEx_STS的位
2) 在DSDT中编写对应的_LXX控制方法。(用于表示某个GPE事件中GPEx_STS状态响应位来指明当前的设备插入事件)来描述事件执行策略。并通过初始化节点对象绑定通告函数(Notify Handler)通告到OSPM执行相关设备的PCI枚举操作,以下是设备插入后所发生的事件:
1. 用户插入PCI热拔插设备到Slot内;
2. HPPC(南桥中热插拔控制器)生成GPE事件;
3. ACPI核心控制芯片组产生SCI中断;
4. ACPI硬件会清除这个GPE事件的响应位,并且运行对应GPE位在名字空间中的_LXX控制方法;
5. _LXX控制方法将根据HPPC的相应控制位来决定当前事件是否为一个设备插入事件,以及哪个插槽有设备插入;
6. _LXX控制方法将向驱动层发出通告(Notify)表示当前的PCI总线上的某一个插槽有设备插入;
7. ACPI驱动层(这里开始就进入ACPI OS层部分了)运行_STA方法获得第6步所知的设备的当前状态,如果运行_STA方法返回0x0a表示当前设备不能使能。
8. ACPI驱动层告诉PCI层准备对新插入的设备进行枚举;
9. PCI设备层读入相关设备(PCI功能模块)的配置信息;
a) 对该PCI卡上所有设备根据设备制造厂商获得相关的驱动程序;
b) 使能PCI卡上所有的功能模块;
c) ACPI驱动层运行_PS0控制方法,根据PCI设备的电源管理规范,使能PCI设备上的电源管理状态寄存器,使PCI设备上电;
d) 正常运行/访问设备。
2、acpi相关控制方法
1、PCI0下_OSC方法分析:
arg0 : UUID --- 33db4d5b-1ff7-401c-9657-7441c03dd766.
arg1 : rev --- 1
arg2 : length --- arg3双字数
arg3 : Capabilities Buffer --- 三个双字DWORD
first DWORD : Query/Control and Error Returns (generic)
The second DWORD : Support Field(如下struct pci_osc_bit_struct pci_osc_support_bit)
The third DWORD : Control Field(如下struct pci_osc_bit_struct pci_osc_control_bit)
注: (1)support域不可修改,如修改系统忽略(disregard any changes to this field when returned.)
(2)contrl域 :如被_OSC控制方法清零某bit,则被指定对应的特性不支持,其中一些功能可能在操作系统启动之前或在遗留操作系统的运行期间由平台固件控制,而其他功能可能会被禁用/停用,直到本地操作系统支持可用。
(3)如果在主桥下没有定义_OSC方法,则操作系统不能使能或尝试使用下面定义的特性。如使用则会与平台固件相抵触或产生不希望的结果。
support域:
0 bit --- 操作系统置一表示asl代码可访问扩展配置空间
1 bit --- 置一表示pcie支持ASPM(Active State Power Management)
2 bit --- 如果操作系统支持时钟功率管理功能,则将此位设置为1,如果新添加的设备支持,则在本地热插拔插入事件期间启用此功能。
3 bit --- 置一表示支持PCI Segment Groups
4 bit --- 置一表示支持MSI
其他位保留
control域:
0 bit --- pcie热插拔控制
1 bit --- pci Standard Hot-Plug Controller (SHPC) hot plug控制
2 bit --- PME(PCI Express Power Management Events)控制请求
3 bit --- AER(PCI Express Advanced Error Reporting)控制请求
4 bit --- PCI Express Capability Structure控制请求
其他位保留
返回值:
0 bit --- pcie热插拔控制位,固件将这个位设置为1以允许对PCI Express本地热插拔中断的控制。如果固件允许操作系统控制该特性,那么在_OSC方法的上下文中,它必须确保所有热插拔事件都按照PCI Express基本规范中的描述路由到设备中断。另外,控制转移到操作系统后,固件不能更新热插拔槽的状态,包括指示器和电源控制器的状态。如果该特性的控制被请求和拒绝或没有被请求,固件将返回该位设置为0。
1 bit --- pcie热插拔控制器控制位,固件将这个位设置为1以允许对PCI 热插拔通过标准热插拔控制器控制。如果固件允许操作系统控制该特性,那么在_OSC方法的上下文中,它必须确保所有热插拔事件都按照热插拔规范标准路由到设备中断。另外,控制转移到操作系统后,固件不能更新热插拔槽的状态,包括指示器和电源控制器的状态。如果该特性的控制被请求和拒绝或没有被请求,固件将返回该位设置为0。
2 bit --- pcie电源管理控制位,固件将这个位设置为1,以授予对PCI Express本机电源管理事件中断(PMEs)的控制权。如果固件允许操作系统控制该特性,那么在_OSC方法的上下文中,它必须确保按照PCI Express基本规范中的描述,将所有pme路由到根端口中断。此外,控制转移到操作系统后,固件不能更新根状态寄存器中的PME状态字段或根控制寄存器中的PME中断启用字段。如果该特性的控制被请求和拒绝或没有被请求,固件将返回该位设置为0。
3 bit --- pcie AER控制位,同上。
4 bit --- pcie能力结构控制位,固件将此位设置为1以授予对PCI Express功能的控制。如果固件没有授予此功能的控制权,则固件必须处理PCI Express功能结构的配置。如果固件授予操作系统此功能的控制权,则任何PCI Express功能的固件配置都可能被操作系统配置覆盖,具体取决于操作系统策略。
其他位保留使用
操作系统必须在以下情况下评估_OSC:
(1)在初始化对上述部分中描述的功能提供本机支持的任何驱动程序期间。 这些功能可能受一个或多个驱动程序支持,但应仅由该层次结构的主总线驱动程序评估。 辅助驱动程序必须与总线驱动程序配合才能安装对这些功能的支持。 驱动程序可能不会放弃对先前获得的功能的控制; 也就是说,必须在所有后续协商尝试中设置协商过程之后在功能DWORD3中设置的位。
(2)将Notify(<device>,8)发送到PCI Host Bridge设备时。
(3)从S4恢复后。 从S1-S3恢复时,平台固件将处理上下文还原。
negotiate_os_control函数:获取系统支持的特性,包括PCI domains,PCI扩展配置空间访问、ASPM、MSI。下面为osc控制方法参数解释。
static struct pci_osc_bit_struct pci_osc_support_bit[] = {
{ OSC_PCI_EXT_CONFIG_SUPPORT, "ExtendedConfig" },
{ OSC_PCI_ASPM_SUPPORT, "ASPM" },
{ OSC_PCI_CLOCK_PM_SUPPORT, "ClockPM" },
{ OSC_PCI_SEGMENT_GROUPS_SUPPORT, "Segments" },
{ OSC_PCI_MSI_SUPPORT, "MSI" },
};
static struct pci_osc_bit_struct pci_osc_control_bit[] = {
{ OSC_PCI_EXPRESS_NATIVE_HP_CONTROL, "PCIeHotplug" },
{ OSC_PCI_SHPC_NATIVE_HP_CONTROL, "SHPCHotplug" },
{ OSC_PCI_EXPRESS_PME_CONTROL, "PME" },
{ OSC_PCI_EXPRESS_AER_CONTROL, "AER" },
{ OSC_PCI_EXPRESS_CAPABILITY_CONTROL, "PCIeCapability" },
{ OSC_PCI_EXPRESS_LTR_CONTROL, "LTR" },
};
调用acpi_pci_osc_support执行_OSC控制方法。
内核通过执行DSDT中定义的_OSC控制方法,来决定下列flag的值:
host_bridge->native_pcie_hotplug = 0;
host_bridge->native_shpc_hotplug = 0;
host_bridge->native_aer = 0;
host_bridge->native_pme = 0;
host_bridge->native_ltr = 0;
2、OSHP控制方法
某些包含标准热插拔控件(SHPC)的系统在具有本机SHPC支持的ACPI兼容操作系统可用之前已发布,这些控制器使用ACPI固件来操作SHPC。
如果使用具有本机支持的操作系统,则必须禁用SHPC的固件控制。提供ACPI固件以运行SHPC的平台还必须提供一种控制方法,以将控制权转移到操作系统。此方法称为OSHP(操作系统热插拔),并且为每个由ACPI固件控制的SHPC提供此方法。具有本地SHPC支持的操作系统必须为每个SHPC执行OSHP方法(如果存在)在访问SHPC的寄存器之前以及从休眠状态返回时。如果多次执行SHPC的OSHP方法,并且已经实现了对操作系统控制的切换,则该方法必须成功返回,而无需执行任何操作。
执行OSHP方法后,固件不得访问SHPC寄存器。如果已将诸如系统中断或PME#之类的任何信号重定向到固件进行维修,则必须将其适当还原以进行操作系统控制。
实现注意:
1.使用ACPI控制SHPC时,应考虑以下因素:固件应该将系统中断和唤醒信号重定向到GPE,以便ACPI可以服务中断而不是操作系统。适当的_Lxx GPE处理程序应该提供。 当具有本机SHPC支持的操作系统执行OSHP方法,固件恢复正常的系统中断和唤醒信号连接,以便操作系统可以处理中断。
在PCI-PCI桥中实现时,建议通过配置空间中的DWORD Select/DWORD Data寄存器对而不是存储器基址寄存器来访问SHPC寄存器。这是因为2.0之前的ACPI版本不允许通过基地址寄存器进行内存访问。在主桥实现中,可以通过声明包含它的内存空间操作区域来直接访问主桥寄存器块。
2.平台可以同时实现OSHP和_OSC。 但是,包含_OSC的操作系统将优先于OSHP调用_OSC。