diff options
Diffstat (limited to 'include/linux/efi.h')
| -rw-r--r-- | include/linux/efi.h | 37 | 
1 files changed, 37 insertions, 0 deletions
diff --git a/include/linux/efi.h b/include/linux/efi.h index fb737bc19a8c..33fa1203024e 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -397,4 +397,41 @@ static inline void memrange_efi_to_native(u64 *addr, u64 *npages)  	*addr &= PAGE_MASK;  } +#if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE) +/* + * EFI Variable support. + * + * Different firmware drivers can expose their EFI-like variables using + * the following. + */ + +struct efivar_operations { +	efi_get_variable_t *get_variable; +	efi_get_next_variable_t *get_next_variable; +	efi_set_variable_t *set_variable; +}; + +struct efivars { +	/* +	 * ->lock protects two things: +	 * 1) ->list - adds, removals, reads, writes +	 * 2) ops.[gs]et_variable() calls. +	 * It must not be held when creating sysfs entries or calling kmalloc. +	 * ops.get_next_variable() is only called from register_efivars(), +	 * which is protected by the BKL, so that path is safe. +	 */ +	spinlock_t lock; +	struct list_head list; +	struct kset *kset; +	struct bin_attribute *new_var, *del_var; +	const struct efivar_operations *ops; +}; + +int register_efivars(struct efivars *efivars, +		     const struct efivar_operations *ops, +		     struct kobject *parent_kobj); +void unregister_efivars(struct efivars *efivars); + +#endif /* CONFIG_EFI_VARS */ +  #endif /* _LINUX_EFI_H */  | 
