了解 ACPI 通用事件设备 (GED)、硬件错误设备 (HED) 和操作系统处理程序的流程

问题描述 投票:0回答:1

在下面的 ASL 代码中,定义了 GED 和 HED。

我对硬件错误发生时流程的理解如下:

1.固件部分

  1. 操作系统的 OSPM 子系统意识到中断 51 和 243 与
    GED1
    相关,因为
    GED1._CRS
  2. 所以当操作系统看到中断 51 和 243 时,OSPM 将声明中断并调用
    _EVT()
    设备的
    GED1
    方法。
  3. 并且
    _GED1._EVT()
    会以
    HED0
    作为通知值来通知
    0x80
    Device (GED1) {
        Name (_HID, "ACPI0013")
        Name (_UID, Zero)
        Method (_STA) {
          Return (0xF)
        }
        Name (_CRS, ResourceTemplate () {
          Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive) { 51 } // Socket 0 GHESv2
          Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive) { 243 } // Socket 1 GHESv2
        })
        Method (_EVT, 1, Serialized) {
          Switch (ToInteger (Arg0)) {
            Case (51) { // Socket 0 GHESv2
              Notify (HED0, 0x80)
            }
            Case (243) { // Socket 1 GHESv2
              Notify (HED0, 0x80)
            }
          }
        }
    }

    Device (HED0)
    {
        Name (_HID, EISAID ("PNP0C33"))
        Name (_UID, Zero)
    }

2. Linux部分

  1. Linux 由于
    HED0
    值而将
    PNP0C33
    识别为硬件错误设备。
  2. Linux 使用 drivers/acpi/hed.c 来处理
    HED0
  3. 我相信上面的
    Notify (HED0, 0x80)
    最终会命中来自drivers/acpi/hed.c的以下代码。
static void acpi_hed_notify(struct acpi_device *device, u32 event)
{
    blocking_notifier_call_chain(&acpi_hed_notify_list, 0, NULL);
}

3.我的问题

    由于 _HID 的
  1. HED0

    值,Linux 将 drivers/acpi/hed.c

    PNP0C33
    设备相匹配。这是正确的吗?
    
    

  2. 我认为
  3. 0x80

    中的

    Notify (HED0, 0x80)
    对应于
    u32 event
    acpi_hed_notify()
    参数。但这个说法根本没有被使用。那么为什么我们需要特定值
    0x80
    呢?
    
    

  4. 如果存在这样的信息传递,
  5. Notify(HED0, 0x80)

    如何将信息传递到

    drivers/acpi/hed.c
    中的
    acpi_hed_notify()

  6. 谢谢。

acpi acpica
1个回答
0
投票

我认为假设

PNP0C33

_HID
值用于匹配
hed.c
Linux 驱动程序是正确的。

黄英对PNP0C33支持的评论

收到ACPI核心的通知后,转发给所有 通过通知链的监听器。诸如
APEI GHES

之类的听众应该 收到通知后检查相应的错误源是否有新事件。


查看
linux/drivers/acpi/apei/ghes.c

,我们看到位于

hed.c
中的队列的侦听器已为
SCI
事件设置:
case ACPI_HEST_NOTIFY_SCI:
case ACPI_HEST_NOTIFY_GSIV:
case ACPI_HEST_NOTIFY_GPIO:
    mutex_lock(&ghes_list_mutex);
    if (list_empty(&ghes_hed))
        register_acpi_hed_notifier(&ghes_notifier_hed);

函数
int register_acpi_hed_notifier(struct notifier_block *nb)

确实位于

hed.c
源文件中。
因此,当事件到达 

hed.c

时,通过调用

blocking_notifier_call_chain
会调用
static int ghes_proc(struct ghes *ghes)
,它会处理所有的 shebang。
所以看来

event

参数没有被使用,因为所有的处理都是在

ghes
模块中完成的。
    

© www.soinside.com 2019 - 2024. All rights reserved.