linux/drivers/acpi/hed.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * ACPI Hardware Error Device (PNP0C33) Driver
   4 *
   5 * Copyright (C) 2010, Intel Corp.
   6 *      Author: Huang Ying <ying.huang@intel.com>
   7 *
   8 * ACPI Hardware Error Device is used to report some hardware errors
   9 * notified via SCI, mainly the corrected errors.
  10 */
  11
  12#include <linux/kernel.h>
  13#include <linux/module.h>
  14#include <linux/init.h>
  15#include <linux/acpi.h>
  16#include <acpi/hed.h>
  17
  18static const struct acpi_device_id acpi_hed_ids[] = {
  19        {"PNP0C33", 0},
  20        {"", 0},
  21};
  22MODULE_DEVICE_TABLE(acpi, acpi_hed_ids);
  23
  24static acpi_handle hed_handle;
  25
  26static BLOCKING_NOTIFIER_HEAD(acpi_hed_notify_list);
  27
  28int register_acpi_hed_notifier(struct notifier_block *nb)
  29{
  30        return blocking_notifier_chain_register(&acpi_hed_notify_list, nb);
  31}
  32EXPORT_SYMBOL_GPL(register_acpi_hed_notifier);
  33
  34void unregister_acpi_hed_notifier(struct notifier_block *nb)
  35{
  36        blocking_notifier_chain_unregister(&acpi_hed_notify_list, nb);
  37}
  38EXPORT_SYMBOL_GPL(unregister_acpi_hed_notifier);
  39
  40/*
  41 * SCI to report hardware error is forwarded to the listeners of HED,
  42 * it is used by HEST Generic Hardware Error Source with notify type
  43 * SCI.
  44 */
  45static void acpi_hed_notify(struct acpi_device *device, u32 event)
  46{
  47        blocking_notifier_call_chain(&acpi_hed_notify_list, 0, NULL);
  48}
  49
  50static int acpi_hed_add(struct acpi_device *device)
  51{
  52        /* Only one hardware error device */
  53        if (hed_handle)
  54                return -EINVAL;
  55        hed_handle = device->handle;
  56        return 0;
  57}
  58
  59static int acpi_hed_remove(struct acpi_device *device)
  60{
  61        hed_handle = NULL;
  62        return 0;
  63}
  64
  65static struct acpi_driver acpi_hed_driver = {
  66        .name = "hardware_error_device",
  67        .class = "hardware_error",
  68        .ids = acpi_hed_ids,
  69        .ops = {
  70                .add = acpi_hed_add,
  71                .remove = acpi_hed_remove,
  72                .notify = acpi_hed_notify,
  73        },
  74};
  75module_acpi_driver(acpi_hed_driver);
  76
  77ACPI_MODULE_NAME("hed");
  78MODULE_AUTHOR("Huang Ying");
  79MODULE_DESCRIPTION("ACPI Hardware Error Device Driver");
  80MODULE_LICENSE("GPL");
  81