// SPDX-License-Identifier: GPL-2.0+ /* * Originally from efivars.c * * Copyright (C) 2001,2003,2004 Dell <[email protected]> * Copyright (C) 2004 Intel Corporation <[email protected]> */ #define pr_fmt(fmt) … #include <linux/types.h> #include <linux/sizes.h> #include <linux/errno.h> #include <linux/init.h> #include <linux/module.h> #include <linux/string.h> #include <linux/smp.h> #include <linux/efi.h> #include <linux/ucs2_string.h> /* Private pointer to registered efivars */ static struct efivars *__efivars; static DEFINE_SEMAPHORE(efivars_lock, 1); static efi_status_t check_var_size(bool nonblocking, u32 attributes, unsigned long size) { … } /** * efivar_is_available - check if efivars is available * * @return true iff evivars is currently registered */ bool efivar_is_available(void) { … } EXPORT_SYMBOL_GPL(…); /** * efivars_register - register an efivars * @efivars: efivars to register * @ops: efivars operations * * Only a single efivars can be registered at any time. */ int efivars_register(struct efivars *efivars, const struct efivar_operations *ops) { … } EXPORT_SYMBOL_GPL(…); /** * efivars_unregister - unregister an efivars * @efivars: efivars to unregister * * The caller must have already removed every entry from the list, * failure to do so is an error. */ int efivars_unregister(struct efivars *efivars) { … } EXPORT_SYMBOL_GPL(…); bool efivar_supports_writes(void) { … } EXPORT_SYMBOL_GPL(…); /* * efivar_lock() - obtain the efivar lock, wait for it if needed * @return 0 on success, error code on failure */ int efivar_lock(void) { … } EXPORT_SYMBOL_NS_GPL(…); /* * efivar_lock() - obtain the efivar lock if it is free * @return 0 on success, error code on failure */ int efivar_trylock(void) { … } EXPORT_SYMBOL_NS_GPL(…); /* * efivar_unlock() - release the efivar lock */ void efivar_unlock(void) { … } EXPORT_SYMBOL_NS_GPL(…); /* * efivar_get_variable() - retrieve a variable identified by name/vendor * * Must be called with efivars_lock held. */ efi_status_t efivar_get_variable(efi_char16_t *name, efi_guid_t *vendor, u32 *attr, unsigned long *size, void *data) { … } EXPORT_SYMBOL_NS_GPL(…); /* * efivar_get_next_variable() - enumerate the next name/vendor pair * * Must be called with efivars_lock held. */ efi_status_t efivar_get_next_variable(unsigned long *name_size, efi_char16_t *name, efi_guid_t *vendor) { … } EXPORT_SYMBOL_NS_GPL(…); /* * efivar_set_variable_locked() - set a variable identified by name/vendor * * Must be called with efivars_lock held. If @nonblocking is set, it will use * non-blocking primitives so it is guaranteed not to sleep. */ efi_status_t efivar_set_variable_locked(efi_char16_t *name, efi_guid_t *vendor, u32 attr, unsigned long data_size, void *data, bool nonblocking) { … } EXPORT_SYMBOL_NS_GPL(…); /* * efivar_set_variable() - set a variable identified by name/vendor * * Can be called without holding the efivars_lock. Will sleep on obtaining the * lock, or on obtaining other locks that are needed in order to complete the * call. */ efi_status_t efivar_set_variable(efi_char16_t *name, efi_guid_t *vendor, u32 attr, unsigned long data_size, void *data) { … } EXPORT_SYMBOL_NS_GPL(…); efi_status_t efivar_query_variable_info(u32 attr, u64 *storage_space, u64 *remaining_space, u64 *max_variable_size) { … } EXPORT_SYMBOL_NS_GPL(…);