首页
社区
课程
招聘
[原创]ACPI.sys,从Windows到Bios的桥梁(2):Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
发表于: 2021-2-18 20:30 18052

[原创]ACPI.sys,从Windows到Bios的桥梁(2):Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

2021-2-18 20:30
18052

    2010年毕业那会,我首次接触到51单片机,当时发现51单片机如此简单却功能完备:尽管它没有搭载OS,却能接收GPIO Port上的硬件事件;同时能将控制逻辑反馈给设备。反观基于x86体系的PC,虽然功能强大,但终端用户因为下列限制,很难在Ring3层控制简单如按钮开关这样的外设:

a.主板厂商本着节省原料的原则,未必会在主板上引出空闲的GPIO Port;退一步,即使厂商出于某种原因,引出了空闲的GPIO Port,终端用户没有主板回路图,无法找到这些GPIO Port;

b.即使用户侥幸找到了GPIO Port,但是GPIO Port的作用是由主板厂商在Bios中设定的,普通用户无法修改这些设定;另外,Intel仅向IBV/OEM等它的合作厂商提供PCH spec,除非发生了类似2020年7月Intel泄露了30G相关资料的事件,否则终端用户无法对外设进行准确的设定;

c.OS足够强大,以至于抽象了底层硬件实现(OS的透明性),这是积极的一面。但是反过来,正是因为OS的透明性,位于Ring3层的App很难访问硬件。

以上种种,像是PC行业给初学者添加的重重壁垒。我由于机缘巧合,有机会在这些壁垒上自底向上的(Bios--Acpi.sys/OS--驱动--App)打了一串小孔,从而能在Ring3层接受来自硬件层的GPIO中断。本文基于Intel Whiskey Lake平台,总结了这种自上而下的(非标准)访问方式,也算是我对毕业这么多年的一个回顾~

Intel PCH EDS Vol2中规定,Intel PCH通过P2SB(Primary to Sideband Bridge)接口,以下列公式访问GPIO Pad:

图1.P2SB访问GPIO Community


图2.P2SB的PCIe Location.

P2SB接口是PCH上的PCIe设备,在Whisky Lake平台上,它位于B:0/D:31/F:1。看到这,你的第一反应一定是计算P2SB的配置空间地址,然后通过MMIO方式获得SBREG_BAR,这就有了上述公式里1/3的原料。但是P2SB和PMC Controller(B:0/D:31/F:2)一样神秘:即使已知Bus\Device\Function Number,也无法访问该PCIe设备的配置空间。我们可以用RW分别访问Root Bridge/P2SB/Power Managment Controller 3个PCIe设备的配置空间

图3.MMIO方式读取3种PCIe设备的配置空间的结果.


根据图3结果,我制作了下表,方便读者阅读:

根据图表可知:RW无法获得P2SB的配置空间,进而无法获得SBREG_BAR(P2SB Base Address B:0/D:31/F:1/Reg 0x10),所以本文结束!?


当然这不是结束,我开玩笑的。RW关上一扇门,但是Intel开了一个烟囱:我们可以从Intel提供给IBV\OEM的Intel\KabyLakeSiliconPkg目录下找到SBREG_BAR和通过P2SB接口访问各类寄存器的宏定义:


这个宏定义可以视为对图1中红线部分的补充说明。

不同于51单片机访问GPIO Port,Intel PCH视GPIO为GPIO Pad。读者可以将GPIO Pad理解为主板上的焊点(当然Pad本身也有焊盘的意思)。而焊点GPIO Pad到真正的GPIO Port之间还有不为人知的回路。同时,Intel PCH将若干物理内存上相近的GPIO Pad划到同一个GPIO Community(GPIO社区?GPIO组?),以便于访问,并赋予各个GPIO Community平台唯一的Port ID。各个平台定义的Port ID不同,需要查询EDS Vol1,下图为KabyLake定义的Port ID:


图4.本文用到的是GPIO community 4 GPPC_E(GPPC_E22),Port ID:6A

至此,铺垫已经完成,开始正题:配置Bios使GPIO在OS下触发SCI Event需要几步?

答:需要3步(把大象关进冰箱要几步?也需要三步。)

1.配置GPIO,使其能触发GPIO SCI event;

2.配置PMC;

3.让ACPI.sys响应SCI event。下面开始具体的配置过程。

这一步分3小步:

如果读者能获得主板的GPIO table(其实读者几乎没可能获得OEM厂商的GPIO table这类内部资料,这就是我在文章开头说的障碍之一),那么从中挑选一个空闲的GPIO pin并不是难事。对于本文使用的主板,OEM厂商将GPP_E22设置为一个弱上拉信号,辅助Bios判断主板上喇叭类型(品牌喇叭/杂牌喇叭),我琢磨着这类引脚应该能随意折腾,于是外接了一根引线作为GPP_E22的输入线,另外又引出一根地线:

图5.某日摄于公司的一块已上市多年的主板,也是本文试验用的板子

Bios通过Pad Configuration DW0 寄存器设置来控制GPIO pin的触发方式以及中断触发类型(SCI/SMI/NMI/IOxACPI)等属性,如果将中断触发类型设置为SCI,还需要配置GPI General Purpose Events Enable寄存器:

图6.GPI General Purpose Events Enable寄存器


图7.GPIO DW0寄存器

我已经提前在主板上按如下方式配置这2个寄存器,

为了验证配置结果,可以将GPI_GPE_EN_GPP_E_22的偏移(Offset:0x164)和PAD_CFG_DW0_GPPC_E_22的偏移(Offset:0x8E0)作为宏PCH_PCR_ADDRESS的参数分别计算出它们的地址,然后用RW查看配置结果:


图8. GPI_GPE_EN_GPP_E_22的配置结果



[注意]APP应用上架合规检测服务,协助应用顺利上架!

收藏
免费 14
支持
分享
最新回复 (16)
雪    币: 8282
活跃值: (2793)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了
2021-2-19 09:25
0
雪    币: 137
活跃值: (1420)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
太强了 期待下文
2021-2-19 16:16
0
雪    币: 23352
活跃值: (3447)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
4
赞!期待下文!
2021-2-19 17:12
0
雪    币: 3802
活跃值: (3972)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
感谢分享!
2021-2-19 17:24
0
雪    币: 14735
活跃值: (17849)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2021-2-19 18:37
0
雪    币: 284
活跃值: (3694)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
7
谢谢分享
2021-2-19 21:17
0
雪    币: 965
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2021-2-20 09:16
0
雪    币: 471
活跃值: (4278)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
搜索了下泄露的内容很有帮助
--------------------------------------------------------
英特尔ME Bringup指南 + 工具 + 各平台示例

Kabylake(Purley平台)BIOS参考代码和示例代码+初始化代码

英特尔CEDFK(消费电子固件开发套件)

适用于各种平台的芯片/ FSP源代码包

各种英特尔开发和调试工具

针对Rocket Lake S和其他平台的Simics仿真器

各种路线图和其他文件

英特尔为SpaceX制造的相机驱动程序的二进制文件

未发布的Tiger Lake平台的原理图、文档、工具+固件

Kabylake FDK培训视频

适用于各种Intel ME版本的Intel Trace Hub +解码器文件

Elkhart Lake芯片参考和平台示例代码

各种Xeon平台的Verilog内容

用于各种平台的BIOS/TXE调试工具

Bootguard SDK(加密zip压缩包)

英特尔Snowridge/Snowfish进程模拟器ADK

各种原理图

英特尔营销材料模板(InDesign)

2021-2-20 20:28
1
雪    币: 802
活跃值: (4433)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
10
xss 搜索了下泄露的内容很有帮助 -------------------------------------------------------- 英特尔ME Bringup指南 + 工具 + 各平台示 ...
嘘,低调
2021-2-20 22:14
0
雪    币: 2408
活跃值: (2320)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
11
学习了~
2021-2-24 10:44
0
雪    币: 802
活跃值: (4433)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
12
huojier 太强了 期待下文
已经更新了
2021-3-5 17:49
0
雪    币: 12
活跃值: (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
2021-3-19 16:10
0
雪    币: 12
活跃值: (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
《介绍把Bios的Q-event消息转交给驱动程序进一步处理》

期待大神出文章给我们科普
2021-4-2 10:39
0
雪    币: 2458
活跃值: (4676)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15

大佬,想请教个问题,我刚接触这些内容,还分不清各种文档
看文章中有这样两段话:
1."Intel仅向IBV/OEM等它的合作厂商提供PCH spec"
2." 这两份是Intel Skylake PCH spec,规定了PCH的寄存器偏移/默认值等"
同时我在intel的官网也下载到了一个《 Intel 600 Series Chipset Family Platform Controller Hub (Datasheet,Volume 1 of 2)》
想请教下,这三个内容中的PCH spec指的是同一个文档么,我有点看蒙了

最后于 2022-9-18 01:20 被小白养的菜鸡编辑 ,原因:
2022-9-18 01:19
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
请教一下, Method DSTR()是怎么实现的? PL Commander是什么工具? 怎么抓ASL code的日志信息? 谢谢~
2023-9-5 13:13
0
雪    币: 802
活跃值: (4433)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
17
dstr走串口输出
plc 是ami的串口输出工具
2023-9-18 23:59
0
游客
登录 | 注册 方可回帖
返回
// // 统计代码