EC資料有個很好的CSDN博客推薦去看看:zhao_longwei的專欄
EC固件代碼架構:https://blog.csdn.net/zhao_longwei/article/details/51010544
PCI/PCIE MSI#中斷:https://blog.csdn.net/pwl999/article/details/78208151
Linux內核推薦:https://blog.csdn.net/pwl999/article/details/78817899#comments
關於SMI、MSI、SCI、INTx各種中斷小結:https://blog.csdn.net/huangkangying/article/details/11178425
http://www.aiuxian.com/article/p-1103653.html
推薦博客:我所知道的EC====>KBSMI&KBSCI:http://www.aiuxian.com/article/p-1090092.html
小弟是學硬件的,苦苦修行中,
SCI VS SMI
SCI:System Control Interrupt, 系統控制中斷。專門用於ACPI電源管理的一個IRQ,需要OS支持。
SMI:System Management Interrupt, 系統管理中斷,使用系統進入SMM的特殊中斷。
兩者區別:
SMI是CPU級別的,ACPI和非ACPI模式下都可以使用,而SCI是OS級別的,只有在ACPI support的OS中才能見到。比如說DOS下觸發的中斷肯定不是SCI,但有可能是SMI。
兩者聯系:
兩者可以用於電源管理,但SMI不限於電源管理。
觸發過程:
SMI: (硬件方式)
SMI Pinassert -> CPU SMM mode -> BIOS SMI handler
SMI:(軟件方式)
WriteIO(B2h) -> CPU SMM mode->BIOS SMI handler
SCI:
SCI Pinassert->IDT->OS ACPI driver->ASL code(Q Evnent)->?
http://www.aiuxian.com/relative/p-1103656.html
http://bbs.javaee.cc/post/289740_1_1.html
https://www.cnblogs.com/jyaray/p/7127316.html
http://www.chinafix.com/thread-1035371-1-4.html
https://blog.csdn.net/huangkangying/article/details/7918179
中斷信號。也可以走LPC。但是有些對時效性有要求的,就走SCI/SMI了。SMI極少用到。主要是SCI比較多。 system management interrupt 系統管理中斷 在繁忙中 請求停下來 先處理某個請求 中斷有優先權 某個級別比較高的中斷 |
管理信息結構SMI(structure of management information) 它是簡單網絡管理協議(SNMP)的一部分,指定了在 SNMP 的 MIB 中用於定義管理目標的規則。 SMI: 系統管理中斷 System Management Interrupt |
SMI#:System Management Interrupt,系統管理中斷 An OS-transparent interrupt generated by interrupt events on legacy systems. By contrast, on ACPI systems, interrupt events generate an OS-visible interrupt that is shareable (edge-style interrupts will not work). Hardware platforms that want to support both legacy operating systems and ACPI systems must support a way of remapping the interrupt events between SMIs and SCIs when switching between ACPI and legacy models. SCI:beyond compare,系統控制中斷 A system interrupt used by hardware to notify the OS of ACPI events. The SCI is an active, low, shareable, level interrupt. 大師說:SCI主要是在進入ACPI后,ACPI用的中斷信號。SMI一般在ACPI狀態之前使用的用來做后台中斷的東西。在ACPI后 ,SMI就自動關閉,切換到SCI的方式。 SMI少量的會在ACPI的狀態下還可以正常工作。主要是用來執行 一些超脫操作系統的特殊的代碼。 聯想當年的被美國禁用的主要原因就是SMI的問題。他的權限超過操作系統。超脫在操作系統之外 總之,功能一切正常,就是不能正常關機的。刷了BIOS換了橋還不好,查查這些吧。 PME:PCI Express Native Power Management Events control The firmware sets this bit to 1 to grant control over control over PCI Express native power management event interrupts (PMEs). If firmware allows the OS control of this feature, then in the context of the _OSC method it must ensure that all PMEs are routed to root port interrupts as described in the PCI Express Base Specification. Additionally, after control is transferred to the OS, firmware must not update the PME Status field in the Root Status register or the PME Interrupt Enable field in the Root Control register. If control of this feature was requested and denied or was not requested, firmware returns this bit set to 0. 電源管理的中斷。因為在休眠狀態下,設備的其他中斷是關閉的,只能通過這個通知系統來喚醒設備用的。設備休眠了,沒有這個信號,系統就不知道什么時候要喚醒他。就一直睡下去了。可能會整個系統都停了。 |
SCI與SMI的區別與聯系
SMI: System Management Interrupt,系統管理中斷,進入SMM的方法,包含(但不限於)電源管理功能,對OS透明的;
SMI pin觸發后,CPU進入SMM Mode,轉去執行BIOS中的SMI Handler。
SMI pin--> CPU SMM Mode --> BIOS routine
SCI: System Control Interrupt,系統控制中斷,是ACPI定義的,專用於ACPI電源管理的一個IRQ,需要OS支持的。
SCI pin觸發后,CPU去執行某個放在中斷描述表(IDT)中的程式,一般都是指向某個驅動程式(ACPI.sys),ACPI driver會通知相關的驅動程式(ACPI EC Driver),然后跟EC BIOS取得一個代碼,而這個代碼就是ASL code中的Qxx Number,接着OS會去執行相應的ASL Code,一般都是Method(Qxx)。
SCI pin --> OS Acpi Driver --> ASL Code (Q event) --> ? (看BIOS Spec需求)
聯系:都可以用於電源管理功能
區別:SMI是CPU級別的,ACPI和非ACPI模式下都可以用;SCI是OS級別的,只有在ACPI模式才可以用。
SCI只能在ACPI的OS下發出來,如果在DOS下能觸發的中斷,那肯定不是SCI,那可能是SMI。SMI同樣可以在OS下發出來。在進入ACPI的OS后,Bios把CPU的控制權交給OS,SMI還是可以發出來的。SMI大部分由硬件來issue,也可以發soft SMI,一般是在port 0B2h下command,然后在SMI Handle中加入對cmd的動作即可。
SCI_INT
FADT的Offset46為SCI_INT field。
它記錄了在PIC Mode下,SCI連接到8259的哪個pin(通常都是IRQ9);在APIC Mode下,它記錄了SCI interrupt的Global System interrupt number。
如果在PIC Mode下SCI連接到IRQ9,而在APIC Mode下IRQ9連接到INTIN11,則在FADT中SCI_INT為9, MADT中interrupt resource override entry mapping 將IRQ9 mapping到INTIN11。
如何把SCI_INT從IRQ9改成IRQ11?
三個地方要改:
1. SCI IRQ Select(D31:F0:R44h bit[2:0])由000h(IRQ9)改成010h(IRQ11)
2. FADT中SCI_INT 由9改成11
3. MADT中interrupt resource override entry, Source 0x09; GSI:由0x09改成0x0B