@@ -188,6 +188,9 @@ config ARCH_HAS_CPUFREQ
config ARCH_HAS_BANDGAP
bool
+config FIX_EARLYCON_MEM
+ def_bool EARLY_IOREMAP
+
config GENERIC_HWEIGHT
bool
default y
@@ -1,6 +1,9 @@
#ifndef _ASM_FIXMAP_H
#define _ASM_FIXMAP_H
+#include <linux/kernel.h>
+#include <asm/pgtable.h>
+
/*
* Nothing too fancy for now.
*
@@ -18,6 +21,8 @@
#define FIXADDR_TOP (FIXADDR_END - PAGE_SIZE)
enum fixed_addresses {
+ FIX_EARLYCON_MEM_BASE,
+ __end_of_permanent_fixed_addresses,
FIX_KMAP_BEGIN,
FIX_KMAP_END = (FIXADDR_TOP - FIXADDR_START) >> PAGE_SHIFT,
__end_of_fixed_addresses
@@ -44,6 +49,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
@@ -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);
@@ -86,5 +86,27 @@ 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);
+ }
}
@@ -829,7 +829,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;
@@ -844,7 +844,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 < 0xffe00000 &&
(md->virtual < VMALLOC_START || md->virtual >= VMALLOC_END)) {
printk(KERN_WARNING "BUG: mapping for 0x%08llx"
" at 0x%08lx out of vmalloc space\n",
@@ -1271,7 +1271,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 < 0xffe00000; addr += PMD_SIZE)
pmd_clear(pmd_off_k(addr));
/*