Commit 91aea06e authored by David Mosberger's avatar David Mosberger

ia64: Based on patch by Stephane Eranian: Make fpswa version info available

	via /proc/efi/fpswa, rather than printing it at boot time.
parent a5d5fc46
...@@ -29,6 +29,9 @@ ...@@ -29,6 +29,9 @@
* *
* Changelog: * Changelog:
* *
* 10 Feb 2004 - Stephane Eranian <eranian@hpl.hp.com>
* Provide FPSWA version number via /proc/efi/fpswa
*
* 10 Dec 2002 - Matt Domsch <Matt_Domsch@dell.com> * 10 Dec 2002 - Matt Domsch <Matt_Domsch@dell.com>
* fix locking per Peter Chubb's findings * fix locking per Peter Chubb's findings
* *
...@@ -70,6 +73,7 @@ ...@@ -70,6 +73,7 @@
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/efi.h> #include <linux/efi.h>
#include <asm/fpswa.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
MODULE_AUTHOR("Matt Domsch <Matt_Domsch@Dell.com>"); MODULE_AUTHOR("Matt Domsch <Matt_Domsch@Dell.com>");
...@@ -407,6 +411,37 @@ static struct file_operations efi_systab_fops = { ...@@ -407,6 +411,37 @@ static struct file_operations efi_systab_fops = {
.read = efi_systab_read, .read = efi_systab_read,
}; };
static ssize_t
efi_fpswa_read (struct file *file, char *buffer, size_t count, loff_t *ppos)
{
ssize_t size, length;
char str[32];
void *data;
snprintf(str, sizeof(str), "revision=%u.%u\n",
fpswa_interface->revision >> 16, fpswa_interface->revision & 0xffff);
length = strlen(str);
if (*ppos >= length)
return 0;
data = str + file->f_pos;
size = length - file->f_pos;
if (size > count)
size = count;
if (copy_to_user(buffer, data, size))
return -EFAULT;
*ppos += size;
return size;
}
static struct proc_dir_entry *efi_fpswa_entry;
static struct file_operations efi_fpswa_fops = {
.read = efi_fpswa_read,
};
static int __init static int __init
efivars_init(void) efivars_init(void)
{ {
...@@ -429,6 +464,12 @@ efivars_init(void) ...@@ -429,6 +464,12 @@ efivars_init(void)
if (efi_systab_entry) if (efi_systab_entry)
efi_systab_entry->proc_fops = &efi_systab_fops; efi_systab_entry->proc_fops = &efi_systab_fops;
if (fpswa_interface) {
efi_fpswa_entry = create_proc_entry("fpswa", S_IRUGO, efi_dir);
if (efi_fpswa_entry)
efi_fpswa_entry->proc_fops = &efi_fpswa_fops;
}
efi_vars_dir = proc_mkdir("vars", efi_dir); efi_vars_dir = proc_mkdir("vars", efi_dir);
/* Per EFI spec, the maximum storage allocated for both /* Per EFI spec, the maximum storage allocated for both
......
...@@ -46,21 +46,14 @@ register double f30 asm ("f30"); register double f31 asm ("f31"); ...@@ -46,21 +46,14 @@ register double f30 asm ("f30"); register double f31 asm ("f31");
extern spinlock_t timerlist_lock; extern spinlock_t timerlist_lock;
static fpswa_interface_t *fpswa_interface; fpswa_interface_t *fpswa_interface;
void __init void __init
trap_init (void) trap_init (void)
{ {
int major = 0, minor = 0; if (ia64_boot_param->fpswa)
if (ia64_boot_param->fpswa) {
/* FPSWA fixup: make the interface pointer a kernel virtual address: */ /* FPSWA fixup: make the interface pointer a kernel virtual address: */
fpswa_interface = __va(ia64_boot_param->fpswa); fpswa_interface = __va(ia64_boot_param->fpswa);
major = fpswa_interface->revision >> 16;
minor = fpswa_interface->revision & 0xffff;
}
printk(KERN_INFO "fpswa interface at %lx (rev %d.%d)\n",
ia64_boot_param->fpswa, major, minor);
} }
/* /*
......
...@@ -68,4 +68,6 @@ typedef struct { ...@@ -68,4 +68,6 @@ typedef struct {
efi_fpswa_t fpswa; efi_fpswa_t fpswa;
} fpswa_interface_t; } fpswa_interface_t;
extern fpswa_interface_t *fpswa_interface;
#endif /* _ASM_IA64_FPSWA_H */ #endif /* _ASM_IA64_FPSWA_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment