162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include <linux/mm.h>
462306a36Sopenharmony_ci#include <linux/io.h>
562306a36Sopenharmony_ci
662306a36Sopenharmony_civoid __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size,
762306a36Sopenharmony_ci			   unsigned long prot)
862306a36Sopenharmony_ci{
962306a36Sopenharmony_ci	unsigned long last_addr = phys_addr + size - 1;
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci	/* Don't allow outside PHYS_MASK */
1262306a36Sopenharmony_ci	if (last_addr & ~PHYS_MASK)
1362306a36Sopenharmony_ci		return NULL;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	/* Don't allow RAM to be mapped. */
1662306a36Sopenharmony_ci	if (WARN_ON(pfn_is_map_memory(__phys_to_pfn(phys_addr))))
1762306a36Sopenharmony_ci		return NULL;
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci	return generic_ioremap_prot(phys_addr, size, __pgprot(prot));
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ciEXPORT_SYMBOL(ioremap_prot);
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci/*
2462306a36Sopenharmony_ci * Must be called after early_fixmap_init
2562306a36Sopenharmony_ci */
2662306a36Sopenharmony_civoid __init early_ioremap_init(void)
2762306a36Sopenharmony_ci{
2862306a36Sopenharmony_ci	early_ioremap_setup();
2962306a36Sopenharmony_ci}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cibool arch_memremap_can_ram_remap(resource_size_t offset, size_t size,
3262306a36Sopenharmony_ci				 unsigned long flags)
3362306a36Sopenharmony_ci{
3462306a36Sopenharmony_ci	unsigned long pfn = PHYS_PFN(offset);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	return pfn_is_map_memory(pfn);
3762306a36Sopenharmony_ci}
38