diff options
| author | David S. Miller <davem@nuts.ninka.net> | 2004-01-06 05:05:40 -0800 |
|---|---|---|
| committer | David S. Miller <davem@nuts.ninka.net> | 2004-01-06 05:05:40 -0800 |
| commit | 31d227033b15ce4a7ac0451d11e737b74d7dd40a (patch) | |
| tree | 9591c4250b4b7a3f257834e6ca784842a2a3b248 /include | |
| parent | 0c8ad9d059408e60916b8c974e1f20655c2b1810 (diff) | |
| parent | 6952db3d03d803b89fabf9d562684ef262675be9 (diff) | |
Merge nuts.ninka.net:/disk1/davem/BK/sparcwork-2.6
into nuts.ninka.net:/disk1/davem/BK/sparc-2.6
Diffstat (limited to 'include')
| -rw-r--r-- | include/asm-sparc/fixmap.h | 111 | ||||
| -rw-r--r-- | include/asm-sparc/highmem.h | 39 | ||||
| -rw-r--r-- | include/asm-sparc/kmap_types.h | 1 | ||||
| -rw-r--r-- | include/asm-sparc/page.h | 2 | ||||
| -rw-r--r-- | include/asm-sparc/pgtsrmmu.h | 7 | ||||
| -rw-r--r-- | include/asm-sparc/setup.h | 9 | ||||
| -rw-r--r-- | include/asm-sparc/vaddrs.h | 3 | ||||
| -rw-r--r-- | include/asm-sparc64/setup.h | 9 |
8 files changed, 152 insertions, 29 deletions
diff --git a/include/asm-sparc/fixmap.h b/include/asm-sparc/fixmap.h new file mode 100644 index 000000000000..9de52b4d2cfb --- /dev/null +++ b/include/asm-sparc/fixmap.h @@ -0,0 +1,111 @@ +/* + * 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 + * + * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999 + */ + +#ifndef _ASM_FIXMAP_H +#define _ASM_FIXMAP_H + +#include <linux/config.h> +#include <linux/kernel.h> +#include <asm/page.h> +#ifdef CONFIG_HIGHMEM +#include <linux/threads.h> +#include <asm/kmap_types.h> +#endif + +/* + * 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 top of unused virtual memory (0xfd000000 - 1 page) 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. + */ + +/* + * on UP currently we will have no trace of the fixmap mechanism, + * no page table allocations, etc. This might change in the + * future, say framebuffers for the console driver(s) could be + * fix-mapped? + */ +enum fixed_addresses { + FIX_HOLE, +#ifdef CONFIG_HIGHMEM + FIX_KMAP_BEGIN, + FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, +#endif + __end_of_fixed_addresses +}; + +extern void __set_fixmap (enum fixed_addresses idx, + unsigned long phys, pgprot_t flags); + +#define set_fixmap(idx, phys) \ + __set_fixmap(idx, phys, PAGE_KERNEL) +/* + * Some hardware wants to get fixmapped without caching. + */ +#define set_fixmap_nocache(idx, phys) \ + __set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE) +/* + * used by vmalloc.c. + * + * Leave one empty page between IO pages at 0xfd000000 and + * the start of the fixmap. + */ +#define FIXADDR_TOP (0xfcfff000UL) +#define FIXADDR_SIZE ((__end_of_fixed_addresses) << PAGE_SHIFT) +#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) + +extern void __this_fixmap_does_not_exist(void); + +/* + * '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 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) + __this_fixmap_does_not_exist(); + + 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 diff --git a/include/asm-sparc/highmem.h b/include/asm-sparc/highmem.h index 2e5dba9bfc28..f2795c8dcddd 100644 --- a/include/asm-sparc/highmem.h +++ b/include/asm-sparc/highmem.h @@ -21,10 +21,10 @@ #ifdef __KERNEL__ #include <linux/interrupt.h> +#include <asm/fixmap.h> +#include <asm/vaddrs.h> #include <asm/kmap_types.h> - -/* undef for production */ -#define HIGHMEM_DEBUG 1 +#include <asm/pgtsrmmu.h> /* declarations for highmem.c */ extern unsigned long highstart_pfn, highend_pfn; @@ -33,12 +33,6 @@ extern pte_t *kmap_pte; extern pgprot_t kmap_prot; extern pte_t *pkmap_page_table; -/* This gets set in {srmmu,sun4c}_paging_init() */ -extern unsigned long fix_kmap_begin; - -/* Only used and set with srmmu? */ -extern unsigned long pkmap_base; - extern void kmap_init(void) __init; /* @@ -46,19 +40,21 @@ extern void kmap_init(void) __init; * easily, subsequent pte tables have to be allocated in one physical * chunk of RAM. */ +#define PKMAP_BASE (SRMMU_NOCACHE_VADDR + (SRMMU_MAX_NOCACHE_PAGES << PAGE_SHIFT)) #define LAST_PKMAP 1024 #define LAST_PKMAP_MASK (LAST_PKMAP - 1) -#define PKMAP_NR(virt) ((virt - pkmap_base) >> PAGE_SHIFT) -#define PKMAP_ADDR(nr) (pkmap_base + ((nr) << PAGE_SHIFT)) +#define PKMAP_NR(virt) ((virt - PKMAP_BASE) >> PAGE_SHIFT) +#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) + +#define PKMAP_END (PKMAP_ADDR(LAST_PKMAP)) extern void *kmap_high(struct page *page); extern void kunmap_high(struct page *page); static inline void *kmap(struct page *page) { - if (in_interrupt()) - BUG(); + BUG_ON(in_interrupt()); if (page < highmem_start_page) return page_address(page); return kmap_high(page); @@ -66,8 +62,7 @@ static inline void *kmap(struct page *page) static inline void kunmap(struct page *page) { - if (in_interrupt()) - BUG(); + BUG_ON(in_interrupt()); if (page < highmem_start_page) return; kunmap_high(page); @@ -75,19 +70,7 @@ static inline void kunmap(struct page *page) extern void *kmap_atomic(struct page *page, enum km_type type); extern void kunmap_atomic(void *kvaddr, enum km_type type); - -static inline struct page *kmap_atomic_to_page(void *ptr) -{ - unsigned long idx, vaddr = (unsigned long)ptr; - pte_t *pte; - - if (vaddr < fix_kmap_begin) - return virt_to_page(ptr); - - idx = ((vaddr - fix_kmap_begin) >> PAGE_SHIFT); - pte = kmap_pte + idx; - return pte_page(*pte); -} +extern struct page *kmap_atomic_to_page(void *vaddr); #define flush_cache_kmaps() flush_cache_all() diff --git a/include/asm-sparc/kmap_types.h b/include/asm-sparc/kmap_types.h index e215f7104974..cbacf44427e0 100644 --- a/include/asm-sparc/kmap_types.h +++ b/include/asm-sparc/kmap_types.h @@ -11,6 +11,7 @@ enum km_type { KM_BIO_DST_IRQ, KM_PTE0, KM_PTE1, + KM_PTE2, KM_IRQ0, KM_IRQ1, KM_SOFTIRQ0, diff --git a/include/asm-sparc/page.h b/include/asm-sparc/page.h index bed19a83acbc..858767f53ffd 100644 --- a/include/asm-sparc/page.h +++ b/include/asm-sparc/page.h @@ -54,7 +54,7 @@ struct sparc_phys_banks { #define SPARC_PHYS_BANKS 32 -extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS]; +extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS+1]; /* Cache alias structure. Entry is valid if context != -1. */ struct cache_palias { diff --git a/include/asm-sparc/pgtsrmmu.h b/include/asm-sparc/pgtsrmmu.h index 6d41b8b055bb..dee6984d949f 100644 --- a/include/asm-sparc/pgtsrmmu.h +++ b/include/asm-sparc/pgtsrmmu.h @@ -109,6 +109,13 @@ #ifndef __ASSEMBLY__ +/* This makes sense. Honest it does - Anton */ +/* XXX Yes but it's ugly as sin. FIXME. -KMW */ +extern void *srmmu_nocache_pool; +#define __nocache_pa(VADDR) (((unsigned long)VADDR) - SRMMU_NOCACHE_VADDR + __pa((unsigned long)srmmu_nocache_pool)) +#define __nocache_va(PADDR) (__va((unsigned long)PADDR) - (unsigned long)srmmu_nocache_pool + SRMMU_NOCACHE_VADDR) +#define __nocache_fix(VADDR) __va(__nocache_pa(VADDR)) + /* Accessing the MMU control register. */ extern __inline__ unsigned int srmmu_get_mmureg(void) { diff --git a/include/asm-sparc/setup.h b/include/asm-sparc/setup.h new file mode 100644 index 000000000000..d8aaa7205345 --- /dev/null +++ b/include/asm-sparc/setup.h @@ -0,0 +1,9 @@ +/* + * Just a place holder. + */ + +#ifndef _SPARC_SETUP_H +#define _SPARC_SETUP_H + + +#endif /* _SPARC_SETUP_H */ diff --git a/include/asm-sparc/vaddrs.h b/include/asm-sparc/vaddrs.h index d823a79b0746..d74f4dfc3a1a 100644 --- a/include/asm-sparc/vaddrs.h +++ b/include/asm-sparc/vaddrs.h @@ -16,6 +16,9 @@ #define SRMMU_NOCACHE_VADDR (KERNBASE + SRMMU_MAXMEM) /* = 0x0fc000000 */ +/* XXX Empiricals - this needs to go away - KMW */ +#define SRMMU_MIN_NOCACHE_PAGES (550) +#define SRMMU_MAX_NOCACHE_PAGES (1280) /* The following constant is used in mm/srmmu.c::srmmu_nocache_calcsize() * to determine the amount of memory that will be reserved as nocache: diff --git a/include/asm-sparc64/setup.h b/include/asm-sparc64/setup.h new file mode 100644 index 000000000000..97ae5d456702 --- /dev/null +++ b/include/asm-sparc64/setup.h @@ -0,0 +1,9 @@ +/* + * Just a place holder. + */ + +#ifndef _SPARC64_SETUP_H +#define _SPARC64_SETUP_H + + +#endif /* _SPARC64_SETUP_H */ |
