2014-04-15 21:59:30 -04:00
/*
* Extensible Firmware Interface
*
* Based on Extensible Firmware Interface Specification version 2.4
*
* Copyright ( C ) 2013 , 2014 Linaro Ltd .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
*/
2014-10-04 23:46:43 +08:00
# include <linux/dmi.h>
2014-04-15 21:59:30 -04:00
# include <linux/efi.h>
2015-11-30 13:28:18 +01:00
# include <linux/init.h>
2014-04-15 21:59:30 -04:00
# include <asm/efi.h>
2014-10-04 23:46:43 +08:00
2015-11-30 13:28:19 +01:00
int __init efi_create_mapping ( struct mm_struct * mm , efi_memory_desc_t * md )
{
pteval_t prot_val ;
/*
* Only regions of type EFI_RUNTIME_SERVICES_CODE need to be
* executable , everything else can be mapped with the XN bits
* set .
*/
if ( ( md - > attribute & EFI_MEMORY_WB ) = = 0 )
prot_val = PROT_DEVICE_nGnRE ;
else if ( md - > type = = EFI_RUNTIME_SERVICES_CODE | |
! PAGE_ALIGNED ( md - > phys_addr ) )
prot_val = pgprot_val ( PAGE_KERNEL_EXEC ) ;
else
prot_val = pgprot_val ( PAGE_KERNEL ) ;
create_pgd_mapping ( mm , md - > phys_addr , md - > virt_addr ,
md - > num_pages < < EFI_PAGE_SHIFT ,
__pgprot ( prot_val | PTE_NG ) ) ;
return 0 ;
}
2014-10-04 23:46:43 +08:00
static int __init arm64_dmi_init ( void )
{
/*
* On arm64 , DMI depends on UEFI , and dmi_scan_machine ( ) needs to
* be called early because dmi_id_init ( ) , which is an arch_initcall
* itself , depends on dmi_scan_machine ( ) having been called already .
*/
dmi_scan_machine ( ) ;
2014-10-15 09:36:50 +02:00
if ( dmi_available )
dmi_set_dump_stack_arch_desc ( ) ;
2014-10-04 23:46:43 +08:00
return 0 ;
}
core_initcall ( arm64_dmi_init ) ;
2014-10-20 16:27:26 +02:00
2015-03-06 15:49:24 +01:00
/*
* UpdateCapsule ( ) depends on the system being shutdown via
* ResetSystem ( ) .
*/
bool efi_poweroff_required ( void )
{
return efi_enabled ( EFI_RUNTIME_SERVICES ) ;
}