Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
powerpc
include
asm
highmem.h
Go to the documentation of this file.
1
/*
2
* highmem.h: virtual kernel memory mappings for high memory
3
*
4
* PowerPC version, stolen from the i386 version.
5
*
6
* Used in CONFIG_HIGHMEM systems for memory pages which
7
* are not addressable by direct kernel virtual addresses.
8
*
9
* Copyright (C) 1999 Gerhard Wichert, Siemens AG
10
*
[email protected]
11
*
12
*
13
* Redesigned the x86 32-bit VM architecture to deal with
14
* up to 16 Terrabyte physical memory. With current x86 CPUs
15
* we now support up to 64 Gigabytes physical RAM.
16
*
17
* Copyright (C) 1999 Ingo Molnar <
[email protected]
>
18
*/
19
20
#ifndef _ASM_HIGHMEM_H
21
#define _ASM_HIGHMEM_H
22
23
#ifdef __KERNEL__
24
25
#include <
linux/interrupt.h
>
26
#include <asm/kmap_types.h>
27
#include <asm/tlbflush.h>
28
#include <asm/page.h>
29
#include <asm/fixmap.h>
30
31
extern
pte_t
*
kmap_pte
;
32
extern
pgprot_t
kmap_prot
;
33
extern
pte_t
*
pkmap_page_table
;
34
35
/*
36
* Right now we initialize only a single pte table. It can be extended
37
* easily, subsequent pte tables have to be allocated in one physical
38
* chunk of RAM.
39
*/
40
/*
41
* We use one full pte table with 4K pages. And with 16K/64K/256K pages pte
42
* table covers enough memory (32MB/512MB/2GB resp.), so that both FIXMAP
43
* and PKMAP can be placed in a single pte table. We use 512 pages for PKMAP
44
* in case of 16K/64K/256K page sizes.
45
*/
46
#ifdef CONFIG_PPC_4K_PAGES
47
#define PKMAP_ORDER PTE_SHIFT
48
#else
49
#define PKMAP_ORDER 9
50
#endif
51
#define LAST_PKMAP (1 << PKMAP_ORDER)
52
#ifndef CONFIG_PPC_4K_PAGES
53
#define PKMAP_BASE (FIXADDR_START - PAGE_SIZE*(LAST_PKMAP + 1))
54
#else
55
#define PKMAP_BASE ((FIXADDR_START - PAGE_SIZE*(LAST_PKMAP + 1)) & PMD_MASK)
56
#endif
57
#define LAST_PKMAP_MASK (LAST_PKMAP-1)
58
#define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT)
59
#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
60
61
extern
void
*
kmap_high
(
struct
page
*
page
);
62
extern
void
kunmap_high
(
struct
page
*
page
);
63
extern
void
*
kmap_atomic_prot
(
struct
page
*
page
,
pgprot_t
prot);
64
extern
void
__kunmap_atomic
(
void
*kvaddr);
65
66
static
inline
void
*
kmap
(
struct
page
*
page
)
67
{
68
might_sleep
();
69
if
(!PageHighMem(page))
70
return
page_address
(page);
71
return
kmap_high
(page);
72
}
73
74
static
inline
void
kunmap
(
struct
page *page)
75
{
76
BUG_ON
(
in_interrupt
());
77
if
(!PageHighMem(page))
78
return
;
79
kunmap_high
(page);
80
}
81
82
static
inline
void
*
kmap_atomic
(
struct
page *page)
83
{
84
return
kmap_atomic_prot
(page, kmap_prot);
85
}
86
87
static
inline
struct
page *
kmap_atomic_to_page
(
void
*
ptr
)
88
{
89
unsigned
long
idx
,
vaddr
= (
unsigned
long
) ptr;
90
pte_t
*
pte
;
91
92
if
(vaddr <
FIXADDR_START
)
93
return
virt_to_page
(ptr);
94
95
idx = virt_to_fix(vaddr);
96
pte = kmap_pte - (idx -
FIX_KMAP_BEGIN
);
97
return
pte_page
(*pte);
98
}
99
100
101
#define flush_cache_kmaps() flush_cache_all()
102
103
#endif
/* __KERNEL__ */
104
105
#endif
/* _ASM_HIGHMEM_H */
Generated on Thu Jan 10 2013 12:55:09 for Linux Kernel by
1.8.2