Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18608fb4 authored by Rob Herring's avatar Rob Herring Committed by Venkatesh Yadav Abbarapu
Browse files

ARM: fixmap early permanent mapping support



This adds early permanent mapping support to fixmap early mappings.
Unlike early_ioremap mappings, permanent mappings are kept after
paging_init. Each permament mapping must be explicitly added.
Initially, the only permanent mapping is for early console.

The early pmd and ptes are still destroyed and recreated since the
attributes may change as the memory types are initialized

Change-Id: I49b2adfe6f25be3a40324883c6862c99185f027a
Cc: Mark Salter <msalter@redhat.com>
Cc: Russell King <linux@arm.linux.org.uk>
Signed-off-by: default avatarRob Herring <robh@kernel.org>
Git-commit: d0e6f4365fab9b8505ca97955e9769132c10aaf4
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git


[vabbar@codeaurora.org: Fixed trivial merge conflicts]
Signed-off-by: default avatarVenkatesh Yadav Abbarapu <vabbar@codeaurora.org>
parent 1e378098
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -108,6 +108,9 @@ config EARLY_IOREMAP
         the same virtual memory range as kmap so all early mappings must
         be unmapped before paging_init() is called.

config FIX_EARLYCON_MEM
	def_bool EARLY_IOREMAP

if ARM_DMA_USE_IOMMU

config ARM_DMA_IOMMU_ALIGNMENT
+2 −0
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@ enum fixed_addresses {
extern void __early_set_fixmap(enum fixed_addresses idx,
					phys_addr_t phys, pgprot_t flags);

#define __set_fixmap __early_set_fixmap

#include <asm-generic/fixmap.h>

#endif
+1 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ enum {
};

#ifdef CONFIG_MMU
extern void create_mapping(struct map_desc *);
extern void iotable_init(struct map_desc *, int);
extern void vm_reserve_area_early(unsigned long addr, unsigned long size,
				  void *caller);
+21 −0
Original line number Diff line number Diff line
@@ -86,5 +86,26 @@ void __init __early_set_fixmap(enum fixed_addresses idx,

void __init early_ioremap_shutdown(void)
{
	int i;
	pmd_clear(early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN)));

	 /* Create new entries for permanent mappings */
	for (i = 0; i < __end_of_permanent_fixed_addresses; i++) {
		pte_t *pte;
		struct map_desc map;

		map.virtual = fix_to_virt(i);
		pte = early_ioremap_pte(map.virtual);

		/* Only i/o device mappings are supported ATM */
		if (pte_none(*pte) ||
		   (pte_val(*pte) & L_PTE_MT_MASK) != L_PTE_MT_DEV_SHARED)
			continue;

		map.pfn = pte_pfn(*pte);
		map.type = MT_DEVICE;
		map.length = PAGE_SIZE;

		create_mapping(&map);
	}
}
+3 −3
Original line number Diff line number Diff line
@@ -843,7 +843,7 @@ static void __init create_36bit_mapping(struct map_desc *md,
 * offsets, and we take full advantage of sections and
 * supersections.
 */
static void __init create_mapping(struct map_desc *md)
void __init create_mapping(struct map_desc *md)
{
	unsigned long addr, length, end;
	phys_addr_t phys;
@@ -858,7 +858,7 @@ static void __init create_mapping(struct map_desc *md)
	}

	if ((md->type == MT_DEVICE || md->type == MT_ROM) &&
	    md->virtual >= PAGE_OFFSET &&
	    md->virtual >= PAGE_OFFSET && md->virtual < 0xffc00000 &&
	    (md->virtual < VMALLOC_START || md->virtual >= VMALLOC_END)) {
		printk(KERN_WARNING "BUG: mapping for 0x%08llx"
		       " at 0x%08lx out of vmalloc space\n",
@@ -1238,7 +1238,7 @@ static void __init devicemaps_init(const struct machine_desc *mdesc)

	early_trap_init(vectors);

	for (addr = VMALLOC_START; addr; addr += PMD_SIZE)
	for (addr = VMALLOC_START; addr < FIXADDR_START; addr += PMD_SIZE)
		pmd_clear(pmd_off_k(addr));

	/*