2008-04-23 13:05:20 +00:00
|
|
|
/*
|
|
|
|
* fixmap.h: compile-time virtual memory allocation
|
|
|
|
*
|
|
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
|
|
* for more details.
|
|
|
|
*
|
|
|
|
* Copyright (C) 1998 Ingo Molnar
|
|
|
|
*
|
|
|
|
* Copyright 2008 Freescale Semiconductor Inc.
|
|
|
|
* Port to powerpc added by Kumar Gala
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _ASM_FIXMAP_H
|
|
|
|
#define _ASM_FIXMAP_H
|
|
|
|
|
|
|
|
#ifndef __ASSEMBLY__
|
2019-09-12 13:49:43 +00:00
|
|
|
#include <linux/sizes.h>
|
2008-04-23 13:05:20 +00:00
|
|
|
#include <asm/page.h>
|
powerpc/cpm1: fix compilation error with CONFIG_PPC_EARLY_DEBUG_CPM
commit e8cb7a55eb8dc ("powerpc: remove superflous inclusions of
asm/fixmap.h") removed inclusion of asm/fixmap.h from files not
including objects from that file.
However, asm/mmu-8xx.h includes call to __fix_to_virt(). The proper
way would be to include asm/fixmap.h in asm/mmu-8xx.h but it creates
an inclusion loop.
So we have to leave asm/fixmap.h in sysdep/cpm_common.c for
CONFIG_PPC_EARLY_DEBUG_CPM
CC arch/powerpc/sysdev/cpm_common.o
In file included from ./arch/powerpc/include/asm/mmu.h:340:0,
from ./arch/powerpc/include/asm/reg_8xx.h:8,
from ./arch/powerpc/include/asm/reg.h:29,
from ./arch/powerpc/include/asm/processor.h:13,
from ./arch/powerpc/include/asm/thread_info.h:28,
from ./include/linux/thread_info.h:38,
from ./arch/powerpc/include/asm/ptrace.h:159,
from ./arch/powerpc/include/asm/hw_irq.h:12,
from ./arch/powerpc/include/asm/irqflags.h:12,
from ./include/linux/irqflags.h:16,
from ./include/asm-generic/cmpxchg-local.h:6,
from ./arch/powerpc/include/asm/cmpxchg.h:537,
from ./arch/powerpc/include/asm/atomic.h:11,
from ./include/linux/atomic.h:5,
from ./include/linux/mutex.h:18,
from ./include/linux/kernfs.h:13,
from ./include/linux/sysfs.h:16,
from ./include/linux/kobject.h:20,
from ./include/linux/device.h:16,
from ./include/linux/node.h:18,
from ./include/linux/cpu.h:17,
from ./include/linux/of_device.h:5,
from arch/powerpc/sysdev/cpm_common.c:21:
arch/powerpc/sysdev/cpm_common.c: In function ‘udbg_init_cpm’:
./arch/powerpc/include/asm/mmu-8xx.h:218:25: error: implicit declaration of function ‘__fix_to_virt’ [-Werror=implicit-function-declaration]
#define VIRT_IMMR_BASE (__fix_to_virt(FIX_IMMR_BASE))
^
arch/powerpc/sysdev/cpm_common.c:75:7: note: in expansion of macro ‘VIRT_IMMR_BASE’
VIRT_IMMR_BASE);
^
./arch/powerpc/include/asm/mmu-8xx.h:218:39: error: ‘FIX_IMMR_BASE’ undeclared (first use in this function)
#define VIRT_IMMR_BASE (__fix_to_virt(FIX_IMMR_BASE))
^
arch/powerpc/sysdev/cpm_common.c:75:7: note: in expansion of macro ‘VIRT_IMMR_BASE’
VIRT_IMMR_BASE);
^
./arch/powerpc/include/asm/mmu-8xx.h:218:39: note: each undeclared identifier is reported only once for each function it appears in
#define VIRT_IMMR_BASE (__fix_to_virt(FIX_IMMR_BASE))
^
arch/powerpc/sysdev/cpm_common.c:75:7: note: in expansion of macro ‘VIRT_IMMR_BASE’
VIRT_IMMR_BASE);
^
cc1: all warnings being treated as errors
make[1]: *** [arch/powerpc/sysdev/cpm_common.o] Error 1
Fixes: e8cb7a55eb8dc ("powerpc: remove superflous inclusions of asm/fixmap.h")
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2018-08-06 15:09:11 +00:00
|
|
|
#include <asm/pgtable.h>
|
2008-04-23 13:05:20 +00:00
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
|
|
#include <linux/threads.h>
|
|
|
|
#include <asm/kmap_types.h>
|
|
|
|
#endif
|
|
|
|
|
2019-04-26 16:23:32 +00:00
|
|
|
#ifdef CONFIG_KASAN
|
|
|
|
#include <asm/kasan.h>
|
|
|
|
#define FIXADDR_TOP (KASAN_SHADOW_START - PAGE_SIZE)
|
|
|
|
#else
|
2009-05-27 03:44:50 +00:00
|
|
|
#define FIXADDR_TOP ((unsigned long)(-PAGE_SIZE))
|
2019-04-26 16:23:32 +00:00
|
|
|
#endif
|
2009-05-27 03:44:50 +00:00
|
|
|
|
2008-04-23 13:05:20 +00:00
|
|
|
/*
|
|
|
|
* Here we define all the compile-time 'special' virtual
|
|
|
|
* addresses. The point is to have a constant address at
|
|
|
|
* compile time, but to set the physical address only
|
|
|
|
* in the boot process. We allocate these special addresses
|
|
|
|
* from the end of virtual memory (0xfffff000) backwards.
|
|
|
|
* Also this lets us do fail-safe vmalloc(), we
|
|
|
|
* can guarantee that these special addresses and
|
|
|
|
* vmalloc()-ed addresses never overlap.
|
|
|
|
*
|
|
|
|
* these 'compile-time allocated' memory buffers are
|
|
|
|
* fixed-size 4k pages. (or larger if used with an increment
|
|
|
|
* highger than 1) use fixmap_set(idx,phys) to associate
|
|
|
|
* physical memory with fixmap indices.
|
|
|
|
*
|
|
|
|
* TLB entries of such buffers will not be flushed across
|
|
|
|
* task switches.
|
|
|
|
*/
|
|
|
|
enum fixed_addresses {
|
|
|
|
FIX_HOLE,
|
2009-12-12 06:31:50 +00:00
|
|
|
/* reserve the top 128K for early debugging purposes */
|
|
|
|
FIX_EARLY_DEBUG_TOP = FIX_HOLE,
|
|
|
|
FIX_EARLY_DEBUG_BASE = FIX_EARLY_DEBUG_TOP+((128*1024)/PAGE_SIZE)-1,
|
2008-04-23 13:05:20 +00:00
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
|
|
FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
|
|
|
|
FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
|
powerpc/8xx: Fix vaddr for IMMR early remap
Memory: 124428K/131072K available (3748K kernel code, 188K rwdata,
648K rodata, 508K init, 290K bss, 6644K reserved)
Kernel virtual memory layout:
* 0xfffdf000..0xfffff000 : fixmap
* 0xfde00000..0xfe000000 : consistent mem
* 0xfddf6000..0xfde00000 : early ioremap
* 0xc9000000..0xfddf6000 : vmalloc & ioremap
SLUB: HWalign=16, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Today, IMMR is mapped 1:1 at startup
Mapping IMMR 1:1 is just wrong because it may overlap with another
area. On most mpc8xx boards it is OK as IMMR is set to 0xff000000
but for instance on EP88xC board, IMMR is at 0xfa200000 which
overlaps with VM ioremap area
This patch fixes the virtual address for remapping IMMR with the fixmap
regardless of the value of IMMR.
The size of IMMR area is 256kbytes (CPM at offset 0, security engine
at offset 128k) so a 512k page is enough
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Scott Wood <oss@buserror.net>
2016-05-17 07:02:43 +00:00
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_PPC_8xx
|
|
|
|
/* For IMMR we need an aligned 512K area */
|
|
|
|
#define FIX_IMMR_SIZE (512 * 1024 / PAGE_SIZE)
|
2019-09-16 20:25:41 +00:00
|
|
|
FIX_IMMR_START,
|
|
|
|
FIX_IMMR_BASE = __ALIGN_MASK(FIX_IMMR_START, FIX_IMMR_SIZE - 1) - 1 +
|
|
|
|
FIX_IMMR_SIZE,
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_PPC_83xx
|
|
|
|
/* For IMMR we need an aligned 2M area */
|
|
|
|
#define FIX_IMMR_SIZE (SZ_2M / PAGE_SIZE)
|
powerpc/8xx: Fix vaddr for IMMR early remap
Memory: 124428K/131072K available (3748K kernel code, 188K rwdata,
648K rodata, 508K init, 290K bss, 6644K reserved)
Kernel virtual memory layout:
* 0xfffdf000..0xfffff000 : fixmap
* 0xfde00000..0xfe000000 : consistent mem
* 0xfddf6000..0xfde00000 : early ioremap
* 0xc9000000..0xfddf6000 : vmalloc & ioremap
SLUB: HWalign=16, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Today, IMMR is mapped 1:1 at startup
Mapping IMMR 1:1 is just wrong because it may overlap with another
area. On most mpc8xx boards it is OK as IMMR is set to 0xff000000
but for instance on EP88xC board, IMMR is at 0xfa200000 which
overlaps with VM ioremap area
This patch fixes the virtual address for remapping IMMR with the fixmap
regardless of the value of IMMR.
The size of IMMR area is 256kbytes (CPM at offset 0, security engine
at offset 128k) so a 512k page is enough
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Scott Wood <oss@buserror.net>
2016-05-17 07:02:43 +00:00
|
|
|
FIX_IMMR_START,
|
|
|
|
FIX_IMMR_BASE = __ALIGN_MASK(FIX_IMMR_START, FIX_IMMR_SIZE - 1) - 1 +
|
|
|
|
FIX_IMMR_SIZE,
|
2008-04-23 13:05:20 +00:00
|
|
|
#endif
|
|
|
|
/* FIX_PCIE_MCFG, */
|
2019-09-12 13:49:43 +00:00
|
|
|
__end_of_permanent_fixed_addresses,
|
|
|
|
|
|
|
|
#define NR_FIX_BTMAPS (SZ_256K / PAGE_SIZE)
|
|
|
|
#define FIX_BTMAPS_SLOTS 16
|
|
|
|
#define TOTAL_FIX_BTMAPS (NR_FIX_BTMAPS * FIX_BTMAPS_SLOTS)
|
|
|
|
|
|
|
|
FIX_BTMAP_END = __end_of_permanent_fixed_addresses,
|
|
|
|
FIX_BTMAP_BEGIN = FIX_BTMAP_END + TOTAL_FIX_BTMAPS - 1,
|
2008-04-23 13:05:20 +00:00
|
|
|
__end_of_fixed_addresses
|
|
|
|
};
|
|
|
|
|
|
|
|
#define __FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
|
|
|
|
#define FIXADDR_START (FIXADDR_TOP - __FIXADDR_SIZE)
|
|
|
|
|
2020-05-19 05:48:58 +00:00
|
|
|
#define FIXMAP_ALIGNED_SIZE (ALIGN(FIXADDR_TOP, PGDIR_SIZE) - \
|
|
|
|
ALIGN_DOWN(FIXADDR_START, PGDIR_SIZE))
|
|
|
|
#define FIXMAP_PTE_SIZE (FIXMAP_ALIGNED_SIZE / PGDIR_SIZE * PTE_TABLE_SIZE)
|
|
|
|
|
2014-01-23 23:53:55 +00:00
|
|
|
#define FIXMAP_PAGE_NOCACHE PAGE_KERNEL_NCG
|
2019-09-12 13:49:43 +00:00
|
|
|
#define FIXMAP_PAGE_IO PAGE_KERNEL_NCG
|
2008-04-23 13:05:20 +00:00
|
|
|
|
2014-01-23 23:53:55 +00:00
|
|
|
#include <asm-generic/fixmap.h>
|
2008-04-23 13:05:20 +00:00
|
|
|
|
2017-08-02 13:51:09 +00:00
|
|
|
static inline void __set_fixmap(enum fixed_addresses idx,
|
|
|
|
phys_addr_t phys, pgprot_t flags)
|
|
|
|
{
|
powerpc/fixmap: Use __fix_to_virt() instead of fix_to_virt()
Modify back __set_fixmap() to using __fix_to_virt() instead
of fix_to_virt() otherwise the following happens because it
seems GCC doesn't see idx as a builtin const.
CC mm/early_ioremap.o
In file included from ./include/linux/kernel.h:11:0,
from mm/early_ioremap.c:11:
In function ‘fix_to_virt’,
inlined from ‘__set_fixmap’ at ./arch/powerpc/include/asm/fixmap.h:87:2,
inlined from ‘__early_ioremap’ at mm/early_ioremap.c:156:4:
./include/linux/compiler.h:350:38: error: call to ‘__compiletime_assert_32’ declared with attribute error: BUILD_BUG_ON failed: idx >= __end_of_fixed_addresses
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
./include/linux/compiler.h:331:4: note: in definition of macro ‘__compiletime_assert’
prefix ## suffix(); \
^
./include/linux/compiler.h:350:2: note: in expansion of macro ‘_compiletime_assert’
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
./include/linux/build_bug.h:39:37: note: in expansion of macro ‘compiletime_assert’
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^
./include/linux/build_bug.h:50:2: note: in expansion of macro ‘BUILD_BUG_ON_MSG’
BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)
^
./include/asm-generic/fixmap.h:32:2: note: in expansion of macro ‘BUILD_BUG_ON’
BUILD_BUG_ON(idx >= __end_of_fixed_addresses);
^
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Fixes: 4cfac2f9c7f1 ("powerpc/mm: Simplify __set_fixmap()")
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/f4984c615f90caa3277775a68849afeea846850d.1568295907.git.christophe.leroy@c-s.fr
2019-09-12 13:49:42 +00:00
|
|
|
if (__builtin_constant_p(idx))
|
|
|
|
BUILD_BUG_ON(idx >= __end_of_fixed_addresses);
|
|
|
|
else if (WARN_ON(idx >= __end_of_fixed_addresses))
|
|
|
|
return;
|
|
|
|
|
|
|
|
map_kernel_page(__fix_to_virt(idx), phys, flags);
|
2017-08-02 13:51:09 +00:00
|
|
|
}
|
|
|
|
|
2019-09-12 13:49:43 +00:00
|
|
|
#define __early_set_fixmap __set_fixmap
|
|
|
|
|
2008-04-23 13:05:20 +00:00
|
|
|
#endif /* !__ASSEMBLY__ */
|
|
|
|
#endif
|