162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2015 Linaro Ltd <ard.biesheuvel@linaro.org>
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __ASM_ARM_EFI_H
762306a36Sopenharmony_ci#define __ASM_ARM_EFI_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <asm/cacheflush.h>
1062306a36Sopenharmony_ci#include <asm/cachetype.h>
1162306a36Sopenharmony_ci#include <asm/early_ioremap.h>
1262306a36Sopenharmony_ci#include <asm/fixmap.h>
1362306a36Sopenharmony_ci#include <asm/highmem.h>
1462306a36Sopenharmony_ci#include <asm/mach/map.h>
1562306a36Sopenharmony_ci#include <asm/mmu_context.h>
1662306a36Sopenharmony_ci#include <asm/ptrace.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#ifdef CONFIG_EFI
1962306a36Sopenharmony_civoid efi_init(void);
2062306a36Sopenharmony_civoid arm_efi_init(void);
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciint efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md);
2362306a36Sopenharmony_ciint efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md, bool);
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#define arch_efi_call_virt_setup()	efi_virtmap_load()
2662306a36Sopenharmony_ci#define arch_efi_call_virt_teardown()	efi_virtmap_unload()
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define ARCH_EFI_IRQ_FLAGS_MASK \
2962306a36Sopenharmony_ci	(PSR_J_BIT | PSR_E_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT | \
3062306a36Sopenharmony_ci	 PSR_T_BIT | MODE_MASK)
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistatic inline void efi_set_pgd(struct mm_struct *mm)
3362306a36Sopenharmony_ci{
3462306a36Sopenharmony_ci	check_and_switch_context(mm, NULL);
3562306a36Sopenharmony_ci}
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_civoid efi_virtmap_load(void);
3862306a36Sopenharmony_civoid efi_virtmap_unload(void);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#else
4162306a36Sopenharmony_ci#define arm_efi_init()
4262306a36Sopenharmony_ci#endif /* CONFIG_EFI */
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/* arch specific definitions used by the stub code */
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/*
4762306a36Sopenharmony_ci * A reasonable upper bound for the uncompressed kernel size is 32 MBytes,
4862306a36Sopenharmony_ci * so we will reserve that amount of memory. We have no easy way to tell what
4962306a36Sopenharmony_ci * the actuall size of code + data the uncompressed kernel will use.
5062306a36Sopenharmony_ci * If this is insufficient, the decompressor will relocate itself out of the
5162306a36Sopenharmony_ci * way before performing the decompression.
5262306a36Sopenharmony_ci */
5362306a36Sopenharmony_ci#define MAX_UNCOMP_KERNEL_SIZE	SZ_32M
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci/*
5662306a36Sopenharmony_ci * phys-to-virt patching requires that the physical to virtual offset is a
5762306a36Sopenharmony_ci * multiple of 2 MiB. However, using an alignment smaller than TEXT_OFFSET
5862306a36Sopenharmony_ci * here throws off the memory allocation logic, so let's use the lowest power
5962306a36Sopenharmony_ci * of two greater than 2 MiB and greater than TEXT_OFFSET.
6062306a36Sopenharmony_ci */
6162306a36Sopenharmony_ci#define EFI_PHYS_ALIGN		max(UL(SZ_2M), roundup_pow_of_two(TEXT_OFFSET))
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci/* on ARM, the initrd should be loaded in a lowmem region */
6462306a36Sopenharmony_cistatic inline unsigned long efi_get_max_initrd_addr(unsigned long image_addr)
6562306a36Sopenharmony_ci{
6662306a36Sopenharmony_ci	return round_down(image_addr, SZ_4M) + SZ_512M;
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cistruct efi_arm_entry_state {
7062306a36Sopenharmony_ci	u32	cpsr_before_ebs;
7162306a36Sopenharmony_ci	u32	sctlr_before_ebs;
7262306a36Sopenharmony_ci	u32	cpsr_after_ebs;
7362306a36Sopenharmony_ci	u32	sctlr_after_ebs;
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistatic inline void efi_capsule_flush_cache_range(void *addr, int size)
7762306a36Sopenharmony_ci{
7862306a36Sopenharmony_ci	__cpuc_flush_dcache_area(addr, size);
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci#endif /* _ASM_ARM_EFI_H */
82