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
9ae27c57
Commit
9ae27c57
authored
Jun 04, 2003
by
Russell King
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[ARM] Move dma_alloc_coherent() to consistent.c
parent
c0f1e790
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
31 additions
and
18 deletions
+31
-18
arch/arm/mm/consistent.c
arch/arm/mm/consistent.c
+27
-8
include/asm-arm/dma-mapping.h
include/asm-arm/dma-mapping.h
+4
-10
No files found.
arch/arm/mm/consistent.c
View file @
9ae27c57
...
...
@@ -10,7 +10,7 @@
* DMA uncached mapping support.
*/
#include <linux/config.h>
#include <linux/
types
.h>
#include <linux/
module
.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/string.h>
...
...
@@ -145,6 +145,7 @@ void *consistent_alloc(int gfp, size_t size, dma_addr_t *handle,
struct
vm_region
*
c
;
unsigned
long
order
,
flags
;
void
*
ret
=
NULL
;
int
res
;
if
(
!
consistent_pte
)
{
printk
(
KERN_ERR
"consistent_alloc: not initialised
\n
"
);
...
...
@@ -177,14 +178,19 @@ void *consistent_alloc(int gfp, size_t size, dma_addr_t *handle,
if
(
!
c
)
goto
no_remap
;
spin_lock_irqsave
(
&
consistent_lock
,
flags
);
vm_region_dump
(
&
consistent_head
,
"before alloc"
);
/*
* Attempt to allocate a virtual address in the
* consistent mapping region.
*/
if
(
!
vm_region_alloc
(
&
consistent_head
,
c
,
size
))
{
spin_lock_irqsave
(
&
consistent_lock
,
flags
);
vm_region_dump
(
&
consistent_head
,
"before alloc"
);
res
=
vm_region_alloc
(
&
consistent_head
,
c
,
size
);
vm_region_dump
(
&
consistent_head
,
"after alloc"
);
spin_unlock_irqrestore
(
&
consistent_lock
,
flags
);
if
(
!
res
)
{
pte_t
*
pte
=
consistent_pte
+
CONSISTENT_OFFSET
(
c
->
vm_start
);
struct
page
*
end
=
page
+
(
1
<<
order
);
pgprot_t
prot
=
__pgprot
(
L_PTE_PRESENT
|
L_PTE_YOUNG
|
...
...
@@ -218,9 +224,6 @@ void *consistent_alloc(int gfp, size_t size, dma_addr_t *handle,
ret
=
(
void
*
)
c
->
vm_start
;
}
vm_region_dump
(
&
consistent_head
,
"after alloc"
);
spin_unlock_irqrestore
(
&
consistent_lock
,
flags
);
no_remap:
if
(
ret
==
NULL
)
{
kfree
(
c
);
...
...
@@ -230,6 +233,22 @@ void *consistent_alloc(int gfp, size_t size, dma_addr_t *handle,
return
ret
;
}
/*
* Since we have the DMA mask available to us here, we could try to do
* a normal allocation, and only fall back to a "DMA" allocation if the
* resulting bus address does not satisfy the dma_mask requirements.
*/
void
*
dma_alloc_coherent
(
struct
device
*
dev
,
size_t
size
,
dma_addr_t
*
handle
,
int
gfp
)
{
if
(
dev
==
NULL
||
*
dev
->
dma_mask
!=
0xffffffff
)
gfp
|=
GFP_DMA
;
return
consistent_alloc
(
gfp
,
size
,
handle
,
0
);
}
EXPORT_SYMBOL
(
dma_alloc_coherent
);
/*
* free a page as defined by the above mapping.
*/
...
...
include/asm-arm/dma-mapping.h
View file @
9ae27c57
...
...
@@ -42,12 +42,12 @@ extern struct bus_type sa1111_bus_type;
/*
* Return whether the given device DMA address mask can be supported
* properly. For example, if your device can only drive the low 24-bits
* during
PCI
bus mastering, then you would pass 0x00ffffff as the mask
* during bus mastering, then you would pass 0x00ffffff as the mask
* to this function.
*/
static
inline
int
dma_supported
(
struct
device
*
dev
,
u64
mask
)
{
return
1
;
return
dev
->
dma_mask
&&
*
dev
->
dma_mask
!=
0
;
}
static
inline
int
dma_set_mask
(
struct
device
*
dev
,
u64
dma_mask
)
...
...
@@ -81,14 +81,8 @@ static inline int dma_is_consistent(dma_addr_t handle)
* return the CPU-viewed address, and sets @handle to be the
* device-viewed address.
*/
static
inline
void
*
dma_alloc_coherent
(
struct
device
*
dev
,
size_t
size
,
dma_addr_t
*
handle
,
int
gfp
)
{
if
(
dev
==
NULL
||
dmadev_is_sa1111
(
dev
)
||
*
dev
->
dma_mask
!=
0xffffffff
)
gfp
|=
GFP_DMA
;
return
consistent_alloc
(
gfp
,
size
,
handle
,
0
);
}
extern
void
*
dma_alloc_coherent
(
struct
device
*
dev
,
size_t
size
,
dma_addr_t
*
handle
,
int
gfp
);
/**
* dma_free_coherent - free memory allocated by dma_alloc_coherent
...
...
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