Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
801c0be8
Commit
801c0be8
authored
Feb 26, 2009
by
Ingo Molnar
Browse files
Options
Browse Files
Download
Plain Diff
Merge branches 'x86/urgent' and 'x86/pat' into x86/core
Conflicts: arch/x86/include/asm/pat.h
parents
13b2eda6
13093cb0
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
82 additions
and
22 deletions
+82
-22
arch/x86/include/asm/iomap.h
arch/x86/include/asm/iomap.h
+4
-1
arch/x86/include/asm/pat.h
arch/x86/include/asm/pat.h
+3
-0
arch/x86/mm/iomap_32.c
arch/x86/mm/iomap_32.c
+42
-2
arch/x86/mm/pat.c
arch/x86/mm/pat.c
+29
-17
include/linux/io-mapping.h
include/linux/io-mapping.h
+4
-2
No files found.
arch/x86/include/asm/iomap.h
View file @
801c0be8
...
@@ -24,7 +24,10 @@
...
@@ -24,7 +24,10 @@
#include <asm/tlbflush.h>
#include <asm/tlbflush.h>
int
int
is_io_mapping_possible
(
resource_size_t
base
,
unsigned
long
size
);
reserve_io_memtype_wc
(
u64
base
,
unsigned
long
size
,
pgprot_t
*
prot
);
void
free_io_memtype
(
u64
base
,
unsigned
long
size
);
void
*
void
*
iomap_atomic_prot_pfn
(
unsigned
long
pfn
,
enum
km_type
type
,
pgprot_t
prot
);
iomap_atomic_prot_pfn
(
unsigned
long
pfn
,
enum
km_type
type
,
pgprot_t
prot
);
...
...
arch/x86/include/asm/pat.h
View file @
801c0be8
...
@@ -15,4 +15,7 @@ extern int reserve_memtype(u64 start, u64 end,
...
@@ -15,4 +15,7 @@ extern int reserve_memtype(u64 start, u64 end,
unsigned
long
req_type
,
unsigned
long
*
ret_type
);
unsigned
long
req_type
,
unsigned
long
*
ret_type
);
extern
int
free_memtype
(
u64
start
,
u64
end
);
extern
int
free_memtype
(
u64
start
,
u64
end
);
extern
int
kernel_map_sync_memtype
(
u64
base
,
unsigned
long
size
,
unsigned
long
flag
);
#endif
/* _ASM_X86_PAT_H */
#endif
/* _ASM_X86_PAT_H */
arch/x86/mm/iomap_32.c
View file @
801c0be8
...
@@ -21,13 +21,13 @@
...
@@ -21,13 +21,13 @@
#include <linux/module.h>
#include <linux/module.h>
#ifdef CONFIG_X86_PAE
#ifdef CONFIG_X86_PAE
int
static
int
is_io_mapping_possible
(
resource_size_t
base
,
unsigned
long
size
)
is_io_mapping_possible
(
resource_size_t
base
,
unsigned
long
size
)
{
{
return
1
;
return
1
;
}
}
#else
#else
int
static
int
is_io_mapping_possible
(
resource_size_t
base
,
unsigned
long
size
)
is_io_mapping_possible
(
resource_size_t
base
,
unsigned
long
size
)
{
{
/* There is no way to map greater than 1 << 32 address without PAE */
/* There is no way to map greater than 1 << 32 address without PAE */
...
@@ -38,6 +38,46 @@ is_io_mapping_possible(resource_size_t base, unsigned long size)
...
@@ -38,6 +38,46 @@ is_io_mapping_possible(resource_size_t base, unsigned long size)
}
}
#endif
#endif
int
reserve_io_memtype_wc
(
u64
base
,
unsigned
long
size
,
pgprot_t
*
prot
)
{
unsigned
long
ret_flag
;
if
(
!
is_io_mapping_possible
(
base
,
size
))
goto
out_err
;
if
(
!
pat_enabled
)
{
*
prot
=
pgprot_noncached
(
PAGE_KERNEL
);
return
0
;
}
if
(
reserve_memtype
(
base
,
base
+
size
,
_PAGE_CACHE_WC
,
&
ret_flag
))
goto
out_err
;
if
(
ret_flag
==
_PAGE_CACHE_WB
)
goto
out_free
;
if
(
kernel_map_sync_memtype
(
base
,
size
,
ret_flag
))
goto
out_free
;
*
prot
=
__pgprot
(
__PAGE_KERNEL
|
ret_flag
);
return
0
;
out_free:
free_memtype
(
base
,
base
+
size
);
out_err:
return
-
EINVAL
;
}
EXPORT_SYMBOL_GPL
(
reserve_io_memtype_wc
);
void
free_io_memtype
(
u64
base
,
unsigned
long
size
)
{
if
(
pat_enabled
)
free_memtype
(
base
,
base
+
size
);
}
EXPORT_SYMBOL_GPL
(
free_io_memtype
);
/* Map 'pfn' using fixed map 'type' and protections 'prot'
/* Map 'pfn' using fixed map 'type' and protections 'prot'
*/
*/
void
*
void
*
...
...
arch/x86/mm/pat.c
View file @
801c0be8
...
@@ -633,6 +633,33 @@ void unmap_devmem(unsigned long pfn, unsigned long size, pgprot_t vma_prot)
...
@@ -633,6 +633,33 @@ void unmap_devmem(unsigned long pfn, unsigned long size, pgprot_t vma_prot)
free_memtype
(
addr
,
addr
+
size
);
free_memtype
(
addr
,
addr
+
size
);
}
}
/*
* Change the memory type for the physial address range in kernel identity
* mapping space if that range is a part of identity map.
*/
int
kernel_map_sync_memtype
(
u64
base
,
unsigned
long
size
,
unsigned
long
flags
)
{
unsigned
long
id_sz
;
if
(
!
pat_enabled
||
base
>=
__pa
(
high_memory
))
return
0
;
id_sz
=
(
__pa
(
high_memory
)
<
base
+
size
)
?
__pa
(
high_memory
)
-
base
:
size
;
if
(
ioremap_change_attr
((
unsigned
long
)
__va
(
base
),
id_sz
,
flags
)
<
0
)
{
printk
(
KERN_INFO
"%s:%d ioremap_change_attr failed %s "
"for %Lx-%Lx
\n
"
,
current
->
comm
,
current
->
pid
,
cattr_name
(
flags
),
base
,
(
unsigned
long
long
)(
base
+
size
));
return
-
EINVAL
;
}
return
0
;
}
/*
/*
* Internal interface to reserve a range of physical memory with prot.
* Internal interface to reserve a range of physical memory with prot.
* Reserved non RAM regions only and after successful reserve_memtype,
* Reserved non RAM regions only and after successful reserve_memtype,
...
@@ -642,7 +669,7 @@ static int reserve_pfn_range(u64 paddr, unsigned long size, pgprot_t *vma_prot,
...
@@ -642,7 +669,7 @@ static int reserve_pfn_range(u64 paddr, unsigned long size, pgprot_t *vma_prot,
int
strict_prot
)
int
strict_prot
)
{
{
int
is_ram
=
0
;
int
is_ram
=
0
;
int
id_sz
,
ret
;
int
ret
;
unsigned
long
flags
;
unsigned
long
flags
;
unsigned
long
want_flags
=
(
pgprot_val
(
*
vma_prot
)
&
_PAGE_CACHE_MASK
);
unsigned
long
want_flags
=
(
pgprot_val
(
*
vma_prot
)
&
_PAGE_CACHE_MASK
);
...
@@ -679,23 +706,8 @@ static int reserve_pfn_range(u64 paddr, unsigned long size, pgprot_t *vma_prot,
...
@@ -679,23 +706,8 @@ static int reserve_pfn_range(u64 paddr, unsigned long size, pgprot_t *vma_prot,
flags
);
flags
);
}
}
/* Need to keep identity mapping in sync */
if
(
kernel_map_sync_memtype
(
paddr
,
size
,
flags
)
<
0
)
{
if
(
paddr
>=
__pa
(
high_memory
))
return
0
;
id_sz
=
(
__pa
(
high_memory
)
<
paddr
+
size
)
?
__pa
(
high_memory
)
-
paddr
:
size
;
if
(
ioremap_change_attr
((
unsigned
long
)
__va
(
paddr
),
id_sz
,
flags
)
<
0
)
{
free_memtype
(
paddr
,
paddr
+
size
);
free_memtype
(
paddr
,
paddr
+
size
);
printk
(
KERN_ERR
"%s:%d reserve_pfn_range ioremap_change_attr failed %s "
"for %Lx-%Lx
\n
"
,
current
->
comm
,
current
->
pid
,
cattr_name
(
flags
),
(
unsigned
long
long
)
paddr
,
(
unsigned
long
long
)(
paddr
+
size
));
return
-
EINVAL
;
return
-
EINVAL
;
}
}
return
0
;
return
0
;
...
...
include/linux/io-mapping.h
View file @
801c0be8
...
@@ -49,8 +49,9 @@ static inline struct io_mapping *
...
@@ -49,8 +49,9 @@ static inline struct io_mapping *
io_mapping_create_wc
(
resource_size_t
base
,
unsigned
long
size
)
io_mapping_create_wc
(
resource_size_t
base
,
unsigned
long
size
)
{
{
struct
io_mapping
*
iomap
;
struct
io_mapping
*
iomap
;
pgprot_t
prot
;
if
(
!
is_io_mapping_possible
(
base
,
size
))
if
(
!
reserve_io_memtype_wc
(
base
,
size
,
&
prot
))
return
NULL
;
return
NULL
;
iomap
=
kmalloc
(
sizeof
(
*
iomap
),
GFP_KERNEL
);
iomap
=
kmalloc
(
sizeof
(
*
iomap
),
GFP_KERNEL
);
...
@@ -59,13 +60,14 @@ io_mapping_create_wc(resource_size_t base, unsigned long size)
...
@@ -59,13 +60,14 @@ io_mapping_create_wc(resource_size_t base, unsigned long size)
iomap
->
base
=
base
;
iomap
->
base
=
base
;
iomap
->
size
=
size
;
iomap
->
size
=
size
;
iomap
->
prot
=
p
gprot_writecombine
(
__pgprot
(
__PAGE_KERNEL
))
;
iomap
->
prot
=
p
rot
;
return
iomap
;
return
iomap
;
}
}
static
inline
void
static
inline
void
io_mapping_free
(
struct
io_mapping
*
mapping
)
io_mapping_free
(
struct
io_mapping
*
mapping
)
{
{
free_io_memtype
(
mapping
->
base
,
mapping
->
size
);
kfree
(
mapping
);
kfree
(
mapping
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment