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 Original line Diff line number Diff line
@@ -89,28 +89,6 @@ MODULE_DESCRIPTION("sysfs interface to EFI Variables");
MODULE_LICENSE("GPL");
MODULE_LICENSE("GPL");
MODULE_VERSION(EFIVARS_VERSION);
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
 * The maximum size of VariableName + Data = 1024
 * Therefore, it's reasonable to save that much
 * Therefore, it's reasonable to save that much
@@ -706,7 +684,7 @@ create_efivars_bin_attributes(struct efivars *efivars)
	return error;
	return error;
}
}


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


@@ -724,8 +702,9 @@ static void unregister_efivars(struct efivars *efivars)
	kfree(efivars->del_var);
	kfree(efivars->del_var);
	kset_unregister(efivars->kset);
	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,
		     const struct efivar_operations *ops,
		     struct kobject *parent_kobj)
		     struct kobject *parent_kobj)
{
{
@@ -789,6 +768,7 @@ static int register_efivars(struct efivars *efivars,


	return error;
	return error;
}
}
EXPORT_SYMBOL_GPL(register_efivars);


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


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


	/* For now we'll register the efi directory at /sys/firmware/efi */
	/* For now we'll register the efi directory at /sys/firmware/efi */
	efi_kobj = kobject_create_and_add("efi", firmware_kobj);
	efi_kobj = kobject_create_and_add("efi", firmware_kobj);
+37 −0
Original line number Original line Diff line number Diff line
@@ -397,4 +397,41 @@ static inline void memrange_efi_to_native(u64 *addr, u64 *npages)
	*addr &= PAGE_MASK;
	*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 */
#endif /* _LINUX_EFI_H */