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
cris
mm
ioremap.c
Go to the documentation of this file.
1
/*
2
* arch/cris/mm/ioremap.c
3
*
4
* Re-map IO memory to kernel address space so that we can access it.
5
* Needed for memory-mapped I/O devices mapped outside our normal DRAM
6
* window (that is, all memory-mapped I/O devices).
7
*
8
* (C) Copyright 1995 1996 Linus Torvalds
9
* CRIS-port by Axis Communications AB
10
*/
11
12
#include <
linux/vmalloc.h
>
13
#include <
linux/io.h
>
14
#include <asm/pgalloc.h>
15
#include <arch/memmap.h>
16
17
/*
18
* Generic mapping function (not visible outside):
19
*/
20
21
/*
22
* Remap an arbitrary physical address space into the kernel virtual
23
* address space. Needed when the kernel wants to access high addresses
24
* directly.
25
*
26
* NOTE! We need to allow non-page-aligned mappings too: we will obviously
27
* have to convert them into an offset in a page-aligned mapping, but the
28
* caller shouldn't need to know that small detail.
29
*/
30
void
__iomem
*
__ioremap_prot
(
unsigned
long
phys_addr
,
unsigned
long
size
,
pgprot_t
prot)
31
{
32
void
__iomem
*
addr
;
33
struct
vm_struct
* area;
34
unsigned
long
offset
, last_addr;
35
36
/* Don't allow wraparound or zero size */
37
last_addr = phys_addr + size - 1;
38
if
(!size || last_addr < phys_addr)
39
return
NULL
;
40
41
/*
42
* Mappings have to be page-aligned
43
*/
44
offset = phys_addr & ~
PAGE_MASK
;
45
phys_addr &=
PAGE_MASK
;
46
size =
PAGE_ALIGN
(last_addr+1) -
phys_addr
;
47
48
/*
49
* Ok, go for it..
50
*/
51
area =
get_vm_area
(size,
VM_IOREMAP
);
52
if
(!area)
53
return
NULL
;
54
addr = (
void
__iomem
*)area->
addr
;
55
if
(
ioremap_page_range
((
unsigned
long
)addr, (
unsigned
long
)addr + size,
56
phys_addr, prot)) {
57
vfree
((
void
__force
*)addr);
58
return
NULL
;
59
}
60
return
(
void
__iomem
*) (offset + (
char
__iomem
*)addr);
61
}
62
63
void
__iomem
*
__ioremap
(
unsigned
long
phys_addr
,
unsigned
long
size
,
unsigned
long
flags
)
64
{
65
return
__ioremap_prot
(phys_addr, size,
66
__pgprot
(
_PAGE_PRESENT
|
__READABLE
|
67
__WRITEABLE
|
_PAGE_GLOBAL
|
68
_PAGE_KERNEL
| flags));
69
}
70
79
void
__iomem
*
ioremap_nocache
(
unsigned
long
phys_addr
,
unsigned
long
size
)
80
{
81
return
__ioremap
(phys_addr |
MEM_NON_CACHEABLE
, size, 0);
82
}
83
84
void
iounmap
(
volatile
void
__iomem
*
addr
)
85
{
86
if
(addr >
high_memory
)
87
return
vfree
((
void
*) (
PAGE_MASK
& (
unsigned
long
) addr));
88
}
Generated on Thu Jan 10 2013 13:02:46 for Linux Kernel by
1.8.2