diff options
| -rw-r--r-- | arch/x86/include/asm/uv/bios.h | 8 | ||||
| -rw-r--r-- | arch/x86/platform/uv/bios_uv.c | 23 | ||||
| -rw-r--r-- | drivers/firmware/efi/runtime-wrappers.c | 7 |
3 files changed, 35 insertions, 3 deletions
diff --git a/arch/x86/include/asm/uv/bios.h b/arch/x86/include/asm/uv/bios.h index e652a7cc6186..3f697a9e3f59 100644 --- a/arch/x86/include/asm/uv/bios.h +++ b/arch/x86/include/asm/uv/bios.h | |||
| @@ -48,7 +48,8 @@ enum { | |||
| 48 | BIOS_STATUS_SUCCESS = 0, | 48 | BIOS_STATUS_SUCCESS = 0, |
| 49 | BIOS_STATUS_UNIMPLEMENTED = -ENOSYS, | 49 | BIOS_STATUS_UNIMPLEMENTED = -ENOSYS, |
| 50 | BIOS_STATUS_EINVAL = -EINVAL, | 50 | BIOS_STATUS_EINVAL = -EINVAL, |
| 51 | BIOS_STATUS_UNAVAIL = -EBUSY | 51 | BIOS_STATUS_UNAVAIL = -EBUSY, |
| 52 | BIOS_STATUS_ABORT = -EINTR, | ||
| 52 | }; | 53 | }; |
| 53 | 54 | ||
| 54 | /* Address map parameters */ | 55 | /* Address map parameters */ |
| @@ -167,4 +168,9 @@ extern long system_serial_number; | |||
| 167 | 168 | ||
| 168 | extern struct kobject *sgi_uv_kobj; /* /sys/firmware/sgi_uv */ | 169 | extern struct kobject *sgi_uv_kobj; /* /sys/firmware/sgi_uv */ |
| 169 | 170 | ||
| 171 | /* | ||
| 172 | * EFI runtime lock; cf. firmware/efi/runtime-wrappers.c for details | ||
| 173 | */ | ||
| 174 | extern struct semaphore __efi_uv_runtime_lock; | ||
| 175 | |||
| 170 | #endif /* _ASM_X86_UV_BIOS_H */ | 176 | #endif /* _ASM_X86_UV_BIOS_H */ |
diff --git a/arch/x86/platform/uv/bios_uv.c b/arch/x86/platform/uv/bios_uv.c index 4a6a5a26c582..eb33432f2f24 100644 --- a/arch/x86/platform/uv/bios_uv.c +++ b/arch/x86/platform/uv/bios_uv.c | |||
| @@ -29,7 +29,8 @@ | |||
| 29 | 29 | ||
| 30 | struct uv_systab *uv_systab; | 30 | struct uv_systab *uv_systab; |
| 31 | 31 | ||
| 32 | s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5) | 32 | static s64 __uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, |
| 33 | u64 a4, u64 a5) | ||
| 33 | { | 34 | { |
| 34 | struct uv_systab *tab = uv_systab; | 35 | struct uv_systab *tab = uv_systab; |
| 35 | s64 ret; | 36 | s64 ret; |
| @@ -51,6 +52,19 @@ s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5) | |||
| 51 | 52 | ||
| 52 | return ret; | 53 | return ret; |
| 53 | } | 54 | } |
| 55 | |||
| 56 | s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5) | ||
| 57 | { | ||
| 58 | s64 ret; | ||
| 59 | |||
| 60 | if (down_interruptible(&__efi_uv_runtime_lock)) | ||
| 61 | return BIOS_STATUS_ABORT; | ||
| 62 | |||
| 63 | ret = __uv_bios_call(which, a1, a2, a3, a4, a5); | ||
| 64 | up(&__efi_uv_runtime_lock); | ||
| 65 | |||
| 66 | return ret; | ||
| 67 | } | ||
| 54 | EXPORT_SYMBOL_GPL(uv_bios_call); | 68 | EXPORT_SYMBOL_GPL(uv_bios_call); |
| 55 | 69 | ||
| 56 | s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, | 70 | s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, |
| @@ -59,10 +73,15 @@ s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, | |||
| 59 | unsigned long bios_flags; | 73 | unsigned long bios_flags; |
| 60 | s64 ret; | 74 | s64 ret; |
| 61 | 75 | ||
| 76 | if (down_interruptible(&__efi_uv_runtime_lock)) | ||
| 77 | return BIOS_STATUS_ABORT; | ||
| 78 | |||
| 62 | local_irq_save(bios_flags); | 79 | local_irq_save(bios_flags); |
| 63 | ret = uv_bios_call(which, a1, a2, a3, a4, a5); | 80 | ret = __uv_bios_call(which, a1, a2, a3, a4, a5); |
| 64 | local_irq_restore(bios_flags); | 81 | local_irq_restore(bios_flags); |
| 65 | 82 | ||
| 83 | up(&__efi_uv_runtime_lock); | ||
| 84 | |||
| 66 | return ret; | 85 | return ret; |
| 67 | } | 86 | } |
| 68 | 87 | ||
diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c index 8903b9ccfc2b..e2abfdb5cee6 100644 --- a/drivers/firmware/efi/runtime-wrappers.c +++ b/drivers/firmware/efi/runtime-wrappers.c | |||
| @@ -147,6 +147,13 @@ void efi_call_virt_check_flags(unsigned long flags, const char *call) | |||
| 147 | static DEFINE_SEMAPHORE(efi_runtime_lock); | 147 | static DEFINE_SEMAPHORE(efi_runtime_lock); |
| 148 | 148 | ||
| 149 | /* | 149 | /* |
| 150 | * Expose the EFI runtime lock to the UV platform | ||
| 151 | */ | ||
| 152 | #ifdef CONFIG_X86_UV | ||
| 153 | extern struct semaphore __efi_uv_runtime_lock __alias(efi_runtime_lock); | ||
| 154 | #endif | ||
| 155 | |||
| 156 | /* | ||
| 150 | * Calls the appropriate efi_runtime_service() with the appropriate | 157 | * Calls the appropriate efi_runtime_service() with the appropriate |
| 151 | * arguments. | 158 | * arguments. |
| 152 | * | 159 | * |
