cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hed.c (1920B)


      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
     77MODULE_AUTHOR("Huang Ying");
     78MODULE_DESCRIPTION("ACPI Hardware Error Device Driver");
     79MODULE_LICENSE("GPL");