Commit c66fbc6c authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'for-linus' of https://github.com/openrisc/linux

Pull OpenRISC update from Stafford Horne:
 "A single fixup from me: Fix bug with earlycon being broken due to
  removal of early_ioremap"

* tag 'for-linus' of https://github.com/openrisc/linux:
  openrisc: Implement fixmap to fix earlycon
parents f1037497 1037d186
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -65,6 +65,9 @@ config STACKTRACE_SUPPORT
config LOCKDEP_SUPPORT
	def_bool  y

config FIX_EARLYCON_MEM
	def_bool y

menu "Processor type and features"

choice
+5 −16
Original line number Diff line number Diff line
@@ -26,29 +26,18 @@
#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,
	FIX_EARLYCON_MEM_BASE,
	__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 FIXMAP_PAGE_IO		PAGE_KERNEL_NOCACHE

extern void __set_fixmap(enum fixed_addresses idx,
			 phys_addr_t phys, pgprot_t flags);

#include <asm-generic/fixmap.h>

+37 −0
Original line number Diff line number Diff line
@@ -207,6 +207,43 @@ void __init mem_init(void)
	return;
}

static int __init map_page(unsigned long va, phys_addr_t pa, pgprot_t prot)
{
	p4d_t *p4d;
	pud_t *pud;
	pmd_t *pmd;
	pte_t *pte;

	p4d = p4d_offset(pgd_offset_k(va), va);
	pud = pud_offset(p4d, va);
	pmd = pmd_offset(pud, va);
	pte = pte_alloc_kernel(pmd, va);

	if (pte == NULL)
		return -ENOMEM;

	if (pgprot_val(prot))
		set_pte_at(&init_mm, va, pte, pfn_pte(pa >> PAGE_SHIFT, prot));
	else
		pte_clear(&init_mm, va, pte);

	local_flush_tlb_page(NULL, va);
	return 0;
}

void __init __set_fixmap(enum fixed_addresses idx,
			 phys_addr_t phys, pgprot_t prot)
{
	unsigned long address = __fix_to_virt(idx);

	if (idx >= __end_of_fixed_addresses) {
		BUG();
		return;
	}

	map_page(address, phys, prot);
}

static const pgprot_t protection_map[16] = {
	[VM_NONE]					= PAGE_NONE,
	[VM_READ]					= PAGE_READONLY_X,