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
0d8136ea
Commit
0d8136ea
authored
Aug 22, 2008
by
Ingo Molnar
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'x86/gart' into x86/iommu
parents
766af9fa
7b22ff53
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
17 additions
and
10 deletions
+17
-10
arch/x86/kernel/pci-gart_64.c
arch/x86/kernel/pci-gart_64.c
+17
-10
No files found.
arch/x86/kernel/pci-gart_64.c
View file @
0d8136ea
...
...
@@ -82,7 +82,8 @@ AGPEXTERN __u32 *agp_gatt_table;
static
unsigned
long
next_bit
;
/* protected by iommu_bitmap_lock */
static
int
need_flush
;
/* global flush state. set for each gart wrap */
static
unsigned
long
alloc_iommu
(
struct
device
*
dev
,
int
size
)
static
unsigned
long
alloc_iommu
(
struct
device
*
dev
,
int
size
,
unsigned
long
align_mask
)
{
unsigned
long
offset
,
flags
;
unsigned
long
boundary_size
;
...
...
@@ -90,16 +91,17 @@ static unsigned long alloc_iommu(struct device *dev, int size)
base_index
=
ALIGN
(
iommu_bus_base
&
dma_get_seg_boundary
(
dev
),
PAGE_SIZE
)
>>
PAGE_SHIFT
;
boundary_size
=
ALIGN
(
dma_get_seg_boundary
(
dev
)
+
1
,
boundary_size
=
ALIGN
(
(
unsigned
long
long
)
dma_get_seg_boundary
(
dev
)
+
1
,
PAGE_SIZE
)
>>
PAGE_SHIFT
;
spin_lock_irqsave
(
&
iommu_bitmap_lock
,
flags
);
offset
=
iommu_area_alloc
(
iommu_gart_bitmap
,
iommu_pages
,
next_bit
,
size
,
base_index
,
boundary_size
,
0
);
size
,
base_index
,
boundary_size
,
align_mask
);
if
(
offset
==
-
1
)
{
need_flush
=
1
;
offset
=
iommu_area_alloc
(
iommu_gart_bitmap
,
iommu_pages
,
0
,
size
,
base_index
,
boundary_size
,
0
);
size
,
base_index
,
boundary_size
,
align_mask
);
}
if
(
offset
!=
-
1
)
{
next_bit
=
offset
+
size
;
...
...
@@ -236,10 +238,10 @@ nonforced_iommu(struct device *dev, unsigned long addr, size_t size)
* Caller needs to check if the iommu is needed and flush.
*/
static
dma_addr_t
dma_map_area
(
struct
device
*
dev
,
dma_addr_t
phys_mem
,
size_t
size
,
int
dir
)
size_t
size
,
int
dir
,
unsigned
long
align_mask
)
{
unsigned
long
npages
=
iommu_num_pages
(
phys_mem
,
size
);
unsigned
long
iommu_page
=
alloc_iommu
(
dev
,
npages
);
unsigned
long
iommu_page
=
alloc_iommu
(
dev
,
npages
,
align_mask
);
int
i
;
if
(
iommu_page
==
-
1
)
{
...
...
@@ -262,7 +264,11 @@ static dma_addr_t dma_map_area(struct device *dev, dma_addr_t phys_mem,
static
dma_addr_t
gart_map_simple
(
struct
device
*
dev
,
phys_addr_t
paddr
,
size_t
size
,
int
dir
)
{
dma_addr_t
map
=
dma_map_area
(
dev
,
paddr
,
size
,
dir
);
dma_addr_t
map
;
unsigned
long
align_mask
;
align_mask
=
(
1UL
<<
get_order
(
size
))
-
1
;
map
=
dma_map_area
(
dev
,
paddr
,
size
,
dir
,
align_mask
);
flush_gart
();
...
...
@@ -281,7 +287,8 @@ gart_map_single(struct device *dev, phys_addr_t paddr, size_t size, int dir)
if
(
!
need_iommu
(
dev
,
paddr
,
size
))
return
paddr
;
bus
=
gart_map_simple
(
dev
,
paddr
,
size
,
dir
);
bus
=
dma_map_area
(
dev
,
paddr
,
size
,
dir
,
0
);
flush_gart
();
return
bus
;
}
...
...
@@ -340,7 +347,7 @@ static int dma_map_sg_nonforce(struct device *dev, struct scatterlist *sg,
unsigned
long
addr
=
sg_phys
(
s
);
if
(
nonforced_iommu
(
dev
,
addr
,
s
->
length
))
{
addr
=
dma_map_area
(
dev
,
addr
,
s
->
length
,
dir
);
addr
=
dma_map_area
(
dev
,
addr
,
s
->
length
,
dir
,
0
);
if
(
addr
==
bad_dma_address
)
{
if
(
i
>
0
)
gart_unmap_sg
(
dev
,
sg
,
i
,
dir
);
...
...
@@ -362,7 +369,7 @@ static int __dma_map_cont(struct device *dev, struct scatterlist *start,
int
nelems
,
struct
scatterlist
*
sout
,
unsigned
long
pages
)
{
unsigned
long
iommu_start
=
alloc_iommu
(
dev
,
pages
);
unsigned
long
iommu_start
=
alloc_iommu
(
dev
,
pages
,
0
);
unsigned
long
iommu_page
=
iommu_start
;
struct
scatterlist
*
s
;
int
i
;
...
...
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