// SPDX-License-Identifier: GPL-2.0-only /* * nvs.c - Routines for saving and restoring ACPI NVS memory region * * Copyright (C) 2008-2011 Rafael J. Wysocki <[email protected]>, Novell Inc. */ #define pr_fmt(fmt) … #include <linux/io.h> #include <linux/kernel.h> #include <linux/list.h> #include <linux/mm.h> #include <linux/slab.h> #include <linux/acpi.h> #include "internal.h" /* ACPI NVS regions, APEI may use it */ struct nvs_region { … }; static LIST_HEAD(nvs_region_list); #ifdef CONFIG_ACPI_SLEEP static int suspend_nvs_register(unsigned long start, unsigned long size); #else static inline int suspend_nvs_register(unsigned long a, unsigned long b) { return 0; } #endif int acpi_nvs_register(__u64 start, __u64 size) { … } int acpi_nvs_for_each_region(int (*func)(__u64 start, __u64 size, void *data), void *data) { … } #ifdef CONFIG_ACPI_SLEEP /* * Platforms, like ACPI, may want us to save some memory used by them during * suspend and to restore the contents of this memory during the subsequent * resume. The code below implements a mechanism allowing us to do that. */ struct nvs_page { … }; static LIST_HEAD(nvs_list); /** * suspend_nvs_register - register platform NVS memory region to save * @start: Physical address of the region. * @size: Size of the region. * * The NVS region need not be page-aligned (both ends) and we arrange * things so that the data from page-aligned addresses in this region will * be copied into separate RAM pages. */ static int suspend_nvs_register(unsigned long start, unsigned long size) { … } /** * suspend_nvs_free - free data pages allocated for saving NVS regions */ void suspend_nvs_free(void) { … } /** * suspend_nvs_alloc - allocate memory necessary for saving NVS regions */ int suspend_nvs_alloc(void) { … } /** * suspend_nvs_save - save NVS memory regions */ int suspend_nvs_save(void) { … } /** * suspend_nvs_restore - restore NVS memory regions * * This function is going to be called with interrupts disabled, so it * cannot iounmap the virtual addresses used to access the NVS region. */ void suspend_nvs_restore(void) { … } #endif