forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.5 KiB
84 lines
2.5 KiB
/* SPDX-License-Identifier: GPL-2.0-or-later */ |
|
/* |
|
* OpenRISC Linux |
|
* |
|
* Linux architectural port borrowing liberally from similar works of |
|
* others. All original copyrights apply as per the original source |
|
* declaration. |
|
* |
|
* OpenRISC implementation: |
|
* Copyright (C) 2003 Matjaz Breskvar <[email protected]> |
|
* Copyright (C) 2010-2011 Jonas Bonn <[email protected]> |
|
* et al. |
|
*/ |
|
|
|
#ifndef __ASM_OPENRISC_FIXMAP_H |
|
#define __ASM_OPENRISC_FIXMAP_H |
|
|
|
/* Why exactly do we need 2 empty pages between the top of the fixed |
|
* addresses and the top of virtual memory? Something is using that |
|
* memory space but not sure what right now... If you find it, leave |
|
* a comment here. |
|
*/ |
|
#define FIXADDR_TOP ((unsigned long) (-2*PAGE_SIZE)) |
|
|
|
#include <linux/kernel.h> |
|
#include <linux/bug.h> |
|
#include <asm/page.h> |
|
|
|
/* |
|
* On OpenRISC we use these special fixed_addresses for doing ioremap |
|
* early in the boot process before memory initialization is complete. |
|
* This is used, in particular, by the early serial console code. |
|
* |
|
* It's not really 'fixmap', per se, but fits loosely into the same |
|
* paradigm. |
|
*/ |
|
enum fixed_addresses { |
|
/* |
|
* FIX_IOREMAP entries are useful for mapping physical address |
|
* space before ioremap() is useable, e.g. really early in boot |
|
* before kmalloc() is working. |
|
*/ |
|
#define FIX_N_IOREMAPS 32 |
|
FIX_IOREMAP_BEGIN, |
|
FIX_IOREMAP_END = FIX_IOREMAP_BEGIN + FIX_N_IOREMAPS - 1, |
|
__end_of_fixed_addresses |
|
}; |
|
|
|
#define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT) |
|
/* FIXADDR_BOTTOM might be a better name here... */ |
|
#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) |
|
|
|
#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT)) |
|
#define __virt_to_fix(x) ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT) |
|
|
|
/* |
|
* 'index to address' translation. If anyone tries to use the idx |
|
* directly without tranlation, we catch the bug with a NULL-deference |
|
* kernel oops. Illegal ranges of incoming indices are caught too. |
|
*/ |
|
static __always_inline unsigned long fix_to_virt(const unsigned int idx) |
|
{ |
|
/* |
|
* this branch gets completely eliminated after inlining, |
|
* except when someone tries to use fixaddr indices in an |
|
* illegal way. (such as mixing up address types or using |
|
* out-of-range indices). |
|
* |
|
* If it doesn't get removed, the linker will complain |
|
* loudly with a reasonably clear error message.. |
|
*/ |
|
if (idx >= __end_of_fixed_addresses) |
|
BUG(); |
|
|
|
return __fix_to_virt(idx); |
|
} |
|
|
|
static inline unsigned long virt_to_fix(const unsigned long vaddr) |
|
{ |
|
BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START); |
|
return __virt_to_fix(vaddr); |
|
} |
|
|
|
#endif
|
|
|