ACPI知识学习笔记

ACPI table之FACP(Fixed ACPI Description Table).

在代码里面:Resources\AcpiTables\Fadt\Fadt3.0.act 定义了EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE Fadt.

列举出比较重要且常用的几项:

INT_MODEL,          //System Interrupt Model
SCI_INT_VECTOR, //System Vector of SCI interrupt
SMI_CMD_IO_PORT, //Port Address of SMI command port
ACPI_ENABLE, //Value to write to port SMI_CMD to enable ACPI
ACPI_DISABLE, //Value to write to port SMI_CMD to disable ACPI

这些items会在AcpiPlatform.h中定义:

#define INT_MODEL 0x01
#define SCI_INT_VECTOR 0x0009
#define SMI_CMD_IO_PORT 0x00B0 //For AMD
#define ACPI_ENABLE 0xA0
#define ACPI_DISABLE 0xA1

如果研究ACPI的规范,就会发现,当ACPI_EN起来,系统就会发SCI而不是SMI。那为什么?具体的流程是什么样子的?

  其实,让ACPI ENABLE起来的动作是最后一号SMI来做的。通过向B0 端口下0xA0,就会调用到一个SMI的Callback function,这个函数最后把SCI enable。

接着又有一个问题,SCI的产生,OS是怎么知道的呢?CPU怎么会去执行SCI呢?

  插入一个概念,当一个SMI发出来,CPU上的一个关于SMI的pin会被触发,CPU会进入SMM。而SCI其实是通过配置成APIC,产生IRQ。我的理解是,在上面所述的Callback函数里面,会将SCI对应到IRQ 9。之后SCI INT的信息就被存在ACPI FADT table里面,即定义的SCI_INT_VECTOR。这样OS就可以通过FADT获得SCI所使用的中断号码,这样就能在SCI产生时处理该中断。

这里插入一段我对Qxx的大概理解:

   当AC IN/OUT, LID CLOSE/OPEN, HOTKEY PRESS等事件发生时,KBC/EC会侦测到。随即,它会触发南桥的EC_SCI pin(这边可以解释为什么OS知道这是EC发出的SCI),南桥就会触发一个SCI,OS会收到这个SCI,并且去查询Qxx的number(通过向EC下达84h命令,读取EC RAM某个地方的value,这个value就是number),最后asl code会调用相关的Qxx执行。

posted @ 2011-08-09 12:59  晨風拂雪  阅读(3320)  评论(0编辑  收藏  举报