Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
0d8136ea
K
Kernel
项目概览
openeuler
/
Kernel
接近 2 年 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
0d8136ea
编写于
8月 22, 2008
作者:
I
Ingo Molnar
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'x86/gart' into x86/iommu
上级
766af9fa
7b22ff53
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
17 addition
and
10 deletion
+17
-10
arch/x86/kernel/pci-gart_64.c
arch/x86/kernel/pci-gart_64.c
+17
-10
未找到文件。
arch/x86/kernel/pci-gart_64.c
浏览文件 @
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
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录