Skip to content

Commit

Permalink
[ARM] nommu: adjust headers for !MMU ARM systems
Browse files Browse the repository at this point in the history
Majorily based on Hyok Choi's patches, this fixes up the asm-arm
header files for mmuless systems.  Over and above Hyok's patches:

- nommu.h merged into mmu.h (it's only a structure)
- nommu_context.h is essentially the same as mmu_context.h, but
  without the MM switching code.

so there's no point having separate files.  Also, in memory.h,
there's no point #ifndef'ing PHYS_OFFSET and END_MEM - both
CONFIG_DRAM_BASE and CONFIG_DRAM_SIZE will always be set by the
configuration scripts.

Other files have minor formatting changes, but are essentially
the same.  Hyok's original patches were signed off thusly:

  Signed-off-by: Hyok S. Choi <hyok.choi@samsung.com>

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Russell King authored and Russell King committed Jun 28, 2006
1 parent 60b6cf6 commit 002547b
Show file tree
Hide file tree
Showing 11 changed files with 287 additions and 21 deletions.
4 changes: 4 additions & 0 deletions include/asm-arm/bugs.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,12 @@
#ifndef __ASM_BUGS_H
#define __ASM_BUGS_H

#ifdef CONFIG_MMU
extern void check_writebuffer_bugs(void);

#define check_bugs() check_writebuffer_bugs()
#else
#define check_bugs() do { } while (0)
#endif

#endif
7 changes: 7 additions & 0 deletions include/asm-arm/domain.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
#define domain_val(dom,type) ((type) << (2*(dom)))

#ifndef __ASSEMBLY__

#ifdef CONFIG_MMU
#define set_domain(x) \
do { \
__asm__ __volatile__( \
Expand All @@ -66,5 +68,10 @@
set_domain(thread->cpu_domain); \
} while (0)

#else
#define set_domain(x) do { } while (0)
#define modify_domain(dom,type) do { } while (0)
#endif

#endif
#endif /* !__ASSEMBLY__ */
75 changes: 57 additions & 18 deletions include/asm-arm/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
* linux/include/asm-arm/memory.h
*
* Copyright (C) 2000-2002 Russell King
* modification for nommu, Hyok S. Choi, 2004
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
Expand All @@ -26,6 +27,8 @@
#include <asm/arch/memory.h>
#include <asm/sizes.h>

#ifdef CONFIG_MMU

#ifndef TASK_SIZE
/*
* TASK_SIZE - the maximum size of a user space task.
Expand All @@ -47,6 +50,60 @@
#define PAGE_OFFSET UL(0xc0000000)
#endif

/*
* The module space lives between the addresses given by TASK_SIZE
* and PAGE_OFFSET - it must be within 32MB of the kernel text.
*/
#define MODULE_END (PAGE_OFFSET)
#define MODULE_START (MODULE_END - 16*1048576)

#if TASK_SIZE > MODULE_START
#error Top of user space clashes with start of module space
#endif

/*
* The XIP kernel gets mapped at the bottom of the module vm area.
* Since we use sections to map it, this macro replaces the physical address
* with its virtual address while keeping offset from the base section.
*/
#define XIP_VIRT_ADDR(physaddr) (MODULE_START + ((physaddr) & 0x000fffff))

#else /* CONFIG_MMU */

/*
* The limitation of user task size can grow up to the end of free ram region.
* It is difficult to define and perhaps will never meet the original meaning
* of this define that was meant to.
* Fortunately, there is no reference for this in noMMU mode, for now.
*/
#ifndef TASK_SIZE
#define TASK_SIZE (CONFIG_DRAM_SIZE)
#endif

#ifndef TASK_UNMAPPED_BASE
#define TASK_UNMAPPED_BASE UL(0x00000000)
#endif

#ifndef PHYS_OFFSET
#define PHYS_OFFSET (CONFIG_DRAM_BASE)
#endif

#ifndef END_MEM
#define END_MEM (CONFIG_DRAM_BASE + CONFIG_DRAM_SIZE)
#endif

#ifndef PAGE_OFFSET
#define PAGE_OFFSET (PHYS_OFFSET)
#endif

/*
* The module can be at any place in ram in nommu mode.
*/
#define MODULE_END (END_MEM)
#define MODULE_START (PHYS_OFFSET)

#endif /* !CONFIG_MMU */

/*
* Size of DMA-consistent memory region. Must be multiple of 2M,
* between 2MB and 14MB inclusive.
Expand All @@ -71,24 +128,6 @@
#define __phys_to_pfn(paddr) ((paddr) >> PAGE_SHIFT)
#define __pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT)

/*
* The module space lives between the addresses given by TASK_SIZE
* and PAGE_OFFSET - it must be within 32MB of the kernel text.
*/
#define MODULE_END (PAGE_OFFSET)
#define MODULE_START (MODULE_END - 16*1048576)

#if TASK_SIZE > MODULE_START
#error Top of user space clashes with start of module space
#endif

/*
* The XIP kernel gets mapped at the bottom of the module vm area.
* Since we use sections to map it, this macro replaces the physical address
* with its virtual address while keeping offset from the base section.
*/
#define XIP_VIRT_ADDR(physaddr) (MODULE_START + ((physaddr) & 0x000fffff))

#ifndef __ASSEMBLY__

/*
Expand Down
16 changes: 16 additions & 0 deletions include/asm-arm/mmu.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#ifndef __ARM_MMU_H
#define __ARM_MMU_H

#ifdef CONFIG_MMU

typedef struct {
#if __LINUX_ARM_ARCH__ >= 6
unsigned int id;
Expand All @@ -13,4 +15,18 @@ typedef struct {
#define ASID(mm) (0)
#endif

#else

/*
* From nommu.h:
* Copyright (C) 2002, David McCullough <davidm@snapgear.com>
* modified for 2.6 by Hyok S. Choi <hyok.choi@samsung.com>
*/
typedef struct {
struct vm_list_struct *vmlist;
unsigned long end_brk;
} mm_context_t;

#endif

#endif
2 changes: 2 additions & 0 deletions include/asm-arm/mmu_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ static inline void
switch_mm(struct mm_struct *prev, struct mm_struct *next,
struct task_struct *tsk)
{
#ifdef CONFIG_MMU
unsigned int cpu = smp_processor_id();

if (prev != next) {
Expand All @@ -91,6 +92,7 @@ switch_mm(struct mm_struct *prev, struct mm_struct *next,
if (cache_is_vivt())
cpu_clear(cpu, prev->cpu_vm_mask);
}
#endif
}

#define deactivate_mm(tsk,mm) do { } while (0)
Expand Down
51 changes: 51 additions & 0 deletions include/asm-arm/page-nommu.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* linux/include/asm-arm/page-nommu.h
*
* Copyright (C) 2004 Hyok S. Choi
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef _ASMARM_PAGE_NOMMU_H
#define _ASMARM_PAGE_NOMMU_H

#if !defined(CONFIG_SMALL_TASKS) && PAGE_SHIFT < 13
#define KTHREAD_SIZE (8192)
#else
#define KTHREAD_SIZE PAGE_SIZE
#endif

#define get_user_page(vaddr) __get_free_page(GFP_KERNEL)
#define free_user_page(page, addr) free_page(addr)

#define clear_page(page) memset((page), 0, PAGE_SIZE)
#define copy_page(to,from) memcpy((to), (from), PAGE_SIZE)

#define clear_user_page(page, vaddr, pg) clear_page(page)
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)

/*
* These are used to make use of C type-checking..
*/
typedef unsigned long pte_t;
typedef unsigned long pmd_t;
typedef unsigned long pgd_t[2];
typedef unsigned long pgprot_t;

#define pte_val(x) (x)
#define pmd_val(x) (x)
#define pgd_val(x) ((x)[0])
#define pgprot_val(x) (x)

#define __pte(x) (x)
#define __pmd(x) (x)
#define __pgprot(x) (x)

/* to align the pointer to the (next) page boundary */
#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK)

extern unsigned long memory_start;
extern unsigned long memory_end;

#endif
8 changes: 8 additions & 0 deletions include/asm-arm/page.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@

#ifndef __ASSEMBLY__

#ifndef CONFIG_MMU

#include "page-nommu.h"

#else

#include <asm/glue.h>

/*
Expand Down Expand Up @@ -171,6 +177,8 @@ typedef unsigned long pgprot_t;
/* the upper-most page table pointer */
extern pmd_t *top_pmd;

#endif /* CONFIG_MMU */

#include <asm/memory.h>

#endif /* !__ASSEMBLY__ */
Expand Down
8 changes: 6 additions & 2 deletions include/asm-arm/pgalloc.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
#include <asm/cacheflush.h>
#include <asm/tlbflush.h>

#define check_pgt_cache() do { } while (0)

#ifdef CONFIG_MMU

#define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER))
#define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL))

Expand All @@ -32,8 +36,6 @@ extern void free_pgd_slow(pgd_t *pgd);
#define pgd_alloc(mm) get_pgd_slow(mm)
#define pgd_free(pgd) free_pgd_slow(pgd)

#define check_pgt_cache() do { } while (0)

/*
* Allocate one PTE table.
*
Expand Down Expand Up @@ -126,4 +128,6 @@ pmd_populate(struct mm_struct *mm, pmd_t *pmdp, struct page *ptep)
__pmd_populate(pmdp, page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE);
}

#endif /* CONFIG_MMU */

#endif
Loading

0 comments on commit 002547b

Please sign in to comment.