Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4fc756bd authored by Mike Waychison's avatar Mike Waychison Committed by Greg Kroah-Hartman
Browse files

efivars: Expose efivars functionality to external drivers.



Signed-off-by: default avatarMike Waychison <mikew@google.com>
Cc: Matt Domsch <Matt_Domsch@dell.com>,
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 3295814d
Loading
Loading
Loading
Loading
+7 −27
Original line number Diff line number Diff line
@@ -89,28 +89,6 @@ MODULE_DESCRIPTION("sysfs interface to EFI Variables");
MODULE_LICENSE("GPL");
MODULE_VERSION(EFIVARS_VERSION);

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;
};

/*
 * The maximum size of VariableName + Data = 1024
 * Therefore, it's reasonable to save that much
@@ -706,7 +684,7 @@ out_free:
	return error;
}

static void unregister_efivars(struct efivars *efivars)
void unregister_efivars(struct efivars *efivars)
{
	struct efivar_entry *entry, *n;

@@ -724,8 +702,9 @@ static void unregister_efivars(struct efivars *efivars)
	kfree(efivars->del_var);
	kset_unregister(efivars->kset);
}
EXPORT_SYMBOL_GPL(unregister_efivars);

static int register_efivars(struct efivars *efivars,
int register_efivars(struct efivars *efivars,
		     const struct efivar_operations *ops,
		     struct kobject *parent_kobj)
{
@@ -789,6 +768,7 @@ out:

	return error;
}
EXPORT_SYMBOL_GPL(register_efivars);

static struct efivars __efivars;
static struct efivar_operations ops;
@@ -810,7 +790,7 @@ efivars_init(void)
	       EFIVARS_DATE);

	if (!efi_enabled)
		return -ENODEV;
		return 0;

	/* For now we'll register the efi directory at /sys/firmware/efi */
	efi_kobj = kobject_create_and_add("efi", firmware_kobj);
+37 −0
Original line number Diff line number Diff line
@@ -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 */