我有点卡在编程设备 MSI(Message Signaled interrupt) 并且任何指针欢迎...(我的环境是Watcom C DOS / 32a - dos扩展程序,在 flat 模式......)
@ PIC(8259)模式对我来说还可以...
我列出了我的工作如下,也许有人可以帮助澄清这些...谢谢!
(1) 多个消息启用= 0(对于单个MSI设置此字段= 0; MMC = 100b)
(2) 对于MSI功能中的MSI消息地址寄存器
-
位[31:20] = 0xFEE
-
位[19:12] = 0(目标ID,找到本地APIC ID = 0 ......)
-
bit3 = 0(重定向提示= 0)
-
bit2 = 0(目的地模式,因RH = 0而不在乎)
(3) 对于MSI功能中的MSI消息数据寄存器
-
bit15 = 0(触发模式=边缘)
-
bit14 = 0(触发电平,如果触发模式=边沿则忽略)
-
位[10:8] = 000(交货方式=固定)
-
位[7:0] = 0x20(向量,我选择使用0x20)
(4) 最后通过设置MSICAP.MC.MSIE = 1启用MSI
-
我大致阅读了文档(第10章)http://download.intel.com/products/processor/manual/253668.pdf
-
我认为没有必要编写IO APIC和本地APIC寄存器,因为MSI不会路由到APIC系统......!
Current status: 我在启用MSIE = 1后发现系统挂起,设备通过MSI生成中断!
注意:在上面的序列中 service routine is NOT installed 因为我不知道怎么做...(这就是我的应用程序挂起的原因吗?)
谢谢 !
[20120822 updated] 当将 Message Data 字段中的向量设置为0x20时,应用程序挂起...但是如果设置为0x76,我发现应用程序没有挂起,然后我可以检查设备是否生成中断,本地APIC收到此中断消息,如下所示:
-
For PCI device(AHCI controller):
-
ID(中断禁用)= 0
-
IS(中断状态)= 0
-
MSI Cap = 09,FEE00000,00000076
-
For AHCI HBA registers:
-
PxIS = 00000023
-
PxIE = 7DC0007F
-
IS = 00000001
-
IE bit1 = 1
通过1和2我认为设备成功发送消息给请求服务,因为:
-
IS bit0 = 1(端口0具有待处理的中断状态)
-
IE(中断使能)= 1
-
PCI命令寄存器bit10(ID)= 0
-
MSICAP.MC.MSIE = 1(到MSI引擎)
我还发现LAPIC收到此中断消息,因为:
-
本地APIC IRR(中断请求寄存器)bit118(= 0x76)= 1
-
本地APIC ISR(服务中寄存器)bit118(= 0x76)= 1
因此,似乎设备产生中断并且本地APIC接收到该中断;即便如此,我的服务程序也没有被调用!
1 回答
要在DOS模式下实现MSI功能,您可以参考以下序列:
检查是否启用了本地APIC
读取CPU MSR 0x1B并检查本地APIC全局启用/禁用位= 1
读取本地APIC寄存器寄生中断向量寄存器bit8(APIC SW使能/禁止)= 1
初始化MSI功能寄存器
配置消息控制寄存器(例如MME ...)
配置消息地址寄存器(例如目标ID,DM和RH)
配置消息数据寄存器(例如触发模式,断言,传送模式和向量)
安装自己的服务例程
这取决于你使用的编译器/编程语言......
以(Watcom C Dos32a)为例,您可以使用以下声明和安装服务例程
使用__interrupt __far声明并创建YourISR
使用DPMI调用0x204 / 0x205获取(旧)和设置(新)中断向量!
笔记:
消息数据寄存器中的中断向量可以是Ex . 0x70,0x71,...或0x76
在ISR结束时和返回之前请"write"本地APIC寄存器(EOI)“然后LAPIC将清除服务中寄存器中的位,然后准备服务另一个中断!
启用设备以通过MSI请求服务
PCI命令寄存器bit10(ID)= 0
设备的中断使能位= 1(特定于器件)
MSICAP.MC.MSIE = 1(中断路由到MSI引擎)
您可以检查设备是否生成请求,LAPIC是否收到请求
设备将发出PCI DWORD写入事务以将32位数据写入32位存储器地址,因此您可以探测LA是否发生这种情况,或者您可以检查是否(ID = 0 &&中断状态!= 0 && MSIE = 1)
检查LAPIC寄存器IRR和ISR以查看LAPIC是否收到并提供服务!
@ References:
Intel 64 and IA-32 Architectures Software Developer Manuals
APIC
PCI Local Bus Specification v2.2
Access CPU MSR
DOS/32 Advanced