Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
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