aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firmware')
-rw-r--r--drivers/firmware/Kconfig9
-rw-r--r--drivers/firmware/efivars.c64
2 files changed, 29 insertions, 44 deletions
diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig
index 9b00072a020f..898023d8e486 100644
--- a/drivers/firmware/Kconfig
+++ b/drivers/firmware/Kconfig
@@ -53,6 +53,15 @@ config EFI_VARS
53 Subsequent efibootmgr releases may be found at: 53 Subsequent efibootmgr releases may be found at:
54 <http://linux.dell.com/efibootmgr> 54 <http://linux.dell.com/efibootmgr>
55 55
56config EFI_VARS_PSTORE
57 bool "Register efivars backend for pstore"
58 depends on EFI_VARS && PSTORE
59 default y
60 help
61 Say Y here to enable use efivars as a backend to pstore. This
62 will allow writing console messages, crash dumps, or anything
63 else supported by pstore to EFI variables.
64
56config EFI_PCDP 65config EFI_PCDP
57 bool "Console device selection via EFI PCDP or HCDP table" 66 bool "Console device selection via EFI PCDP or HCDP table"
58 depends on ACPI && EFI && IA64 67 depends on ACPI && EFI && IA64
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index fe62aa392239..37b6f247399e 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -1309,9 +1309,7 @@ static const struct inode_operations efivarfs_dir_inode_operations = {
1309 .create = efivarfs_create, 1309 .create = efivarfs_create,
1310}; 1310};
1311 1311
1312static struct pstore_info efi_pstore_info; 1312#ifdef CONFIG_EFI_VARS_PSTORE
1313
1314#ifdef CONFIG_PSTORE
1315 1313
1316static int efi_pstore_open(struct pstore_info *psi) 1314static int efi_pstore_open(struct pstore_info *psi)
1317{ 1315{
@@ -1514,38 +1512,6 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count,
1514 1512
1515 return 0; 1513 return 0;
1516} 1514}
1517#else
1518static int efi_pstore_open(struct pstore_info *psi)
1519{
1520 return 0;
1521}
1522
1523static int efi_pstore_close(struct pstore_info *psi)
1524{
1525 return 0;
1526}
1527
1528static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type, int *count,
1529 struct timespec *timespec,
1530 char **buf, struct pstore_info *psi)
1531{
1532 return -1;
1533}
1534
1535static int efi_pstore_write(enum pstore_type_id type,
1536 enum kmsg_dump_reason reason, u64 *id,
1537 unsigned int part, int count, size_t size,
1538 struct pstore_info *psi)
1539{
1540 return 0;
1541}
1542
1543static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count,
1544 struct timespec time, struct pstore_info *psi)
1545{
1546 return 0;
1547}
1548#endif
1549 1515
1550static struct pstore_info efi_pstore_info = { 1516static struct pstore_info efi_pstore_info = {
1551 .owner = THIS_MODULE, 1517 .owner = THIS_MODULE,
@@ -1557,6 +1523,24 @@ static struct pstore_info efi_pstore_info = {
1557 .erase = efi_pstore_erase, 1523 .erase = efi_pstore_erase,
1558}; 1524};
1559 1525
1526static void efivar_pstore_register(struct efivars *efivars)
1527{
1528 efivars->efi_pstore_info = efi_pstore_info;
1529 efivars->efi_pstore_info.buf = kmalloc(4096, GFP_KERNEL);
1530 if (efivars->efi_pstore_info.buf) {
1531 efivars->efi_pstore_info.bufsize = 1024;
1532 efivars->efi_pstore_info.data = efivars;
1533 spin_lock_init(&efivars->efi_pstore_info.buf_lock);
1534 pstore_register(&efivars->efi_pstore_info);
1535 }
1536}
1537#else
1538static void efivar_pstore_register(struct efivars *efivars)
1539{
1540 return;
1541}
1542#endif
1543
1560static ssize_t efivar_create(struct file *filp, struct kobject *kobj, 1544static ssize_t efivar_create(struct file *filp, struct kobject *kobj,
1561 struct bin_attribute *bin_attr, 1545 struct bin_attribute *bin_attr,
1562 char *buf, loff_t pos, size_t count) 1546 char *buf, loff_t pos, size_t count)
@@ -2025,15 +2009,7 @@ int register_efivars(struct efivars *efivars,
2025 if (error) 2009 if (error)
2026 unregister_efivars(efivars); 2010 unregister_efivars(efivars);
2027 2011
2028 efivars->efi_pstore_info = efi_pstore_info; 2012 efivar_pstore_register(efivars);
2029
2030 efivars->efi_pstore_info.buf = kmalloc(4096, GFP_KERNEL);
2031 if (efivars->efi_pstore_info.buf) {
2032 efivars->efi_pstore_info.bufsize = 1024;
2033 efivars->efi_pstore_info.data = efivars;
2034 spin_lock_init(&efivars->efi_pstore_info.buf_lock);
2035 pstore_register(&efivars->efi_pstore_info);
2036 }
2037 2013
2038 register_filesystem(&efivarfs_type); 2014 register_filesystem(&efivarfs_type);
2039 2015