Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
146922ec
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看板
提交
146922ec
编写于
3月 09, 2014
作者:
D
David Woodhouse
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
iommu/vt-d: Make get_domain_for_dev() take struct device
Signed-off-by:
N
David Woodhouse
<
David.Woodhouse@intel.com
>
上级
e1f167f3
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
36 addition
and
39 deletion
+36
-39
drivers/iommu/intel-iommu.c
drivers/iommu/intel-iommu.c
+36
-39
未找到文件。
drivers/iommu/intel-iommu.c
浏览文件 @
146922ec
...
...
@@ -2207,52 +2207,51 @@ static struct dmar_domain *dmar_insert_dev_info(struct intel_iommu *iommu,
}
/* domain is initialized */
static
struct
dmar_domain
*
get_domain_for_dev
(
struct
pci_dev
*
p
dev
,
int
gaw
)
static
struct
dmar_domain
*
get_domain_for_dev
(
struct
device
*
dev
,
int
gaw
)
{
struct
dmar_domain
*
domain
,
*
free
=
NULL
;
struct
intel_iommu
*
iommu
=
NULL
;
struct
device_domain_info
*
info
;
struct
dmar_drhd_unit
*
drhd
;
struct
pci_dev
*
dev_tmp
;
struct
pci_dev
*
dev_tmp
=
NULL
;
unsigned
long
flags
;
int
bus
=
0
,
devfn
=
0
;
int
segment
;
u8
bus
,
devfn
,
bridge_bus
,
bridge_devfn
;
domain
=
find_domain
(
&
pdev
->
dev
);
domain
=
find_domain
(
dev
);
if
(
domain
)
return
domain
;
segment
=
pci_domain_nr
(
pdev
->
bus
);
if
(
dev_is_pci
(
dev
))
{
struct
pci_dev
*
pdev
=
to_pci_dev
(
dev
);
u16
segment
;
dev_tmp
=
pci_find_upstream_pcie_bridge
(
pdev
);
if
(
dev_tmp
)
{
if
(
pci_is_pcie
(
dev_tmp
))
{
bus
=
dev_tmp
->
subordinate
->
number
;
devfn
=
0
;
}
else
{
bus
=
dev_tmp
->
bus
->
number
;
devfn
=
dev_tmp
->
devfn
;
}
spin_lock_irqsave
(
&
device_domain_lock
,
flags
);
info
=
dmar_search_domain_by_dev_info
(
segment
,
bus
,
devfn
);
if
(
info
)
{
iommu
=
info
->
iommu
;
domain
=
info
->
domain
;
segment
=
pci_domain_nr
(
pdev
->
bus
);
dev_tmp
=
pci_find_upstream_pcie_bridge
(
pdev
);
if
(
dev_tmp
)
{
if
(
pci_is_pcie
(
dev_tmp
))
{
bridge_bus
=
dev_tmp
->
subordinate
->
number
;
bridge_devfn
=
0
;
}
else
{
bridge_bus
=
dev_tmp
->
bus
->
number
;
bridge_devfn
=
dev_tmp
->
devfn
;
}
spin_lock_irqsave
(
&
device_domain_lock
,
flags
);
info
=
dmar_search_domain_by_dev_info
(
segment
,
bus
,
devfn
);
if
(
info
)
{
iommu
=
info
->
iommu
;
domain
=
info
->
domain
;
}
spin_unlock_irqrestore
(
&
device_domain_lock
,
flags
);
/* pcie-pci bridge already has a domain, uses it */
if
(
info
)
goto
found_domain
;
}
spin_unlock_irqrestore
(
&
device_domain_lock
,
flags
);
if
(
info
)
goto
found_domain
;
}
drhd
=
dmar_find_matched_drhd_unit
(
pdev
);
if
(
!
drhd
)
{
printk
(
KERN_ERR
"IOMMU: can't find DMAR for device %s
\n
"
,
pci_name
(
pdev
));
return
NULL
;
}
iommu
=
drhd
->
iommu
;
iommu
=
device_to_iommu
(
dev
,
&
bus
,
&
devfn
);
if
(
!
iommu
)
goto
error
;
/* Allocate and intialize new domain for the device */
/* Allocate and in
i
tialize new domain for the device */
domain
=
alloc_domain
(
false
);
if
(
!
domain
)
goto
error
;
...
...
@@ -2266,15 +2265,14 @@ static struct dmar_domain *get_domain_for_dev(struct pci_dev *pdev, int gaw)
/* register pcie-to-pci device */
if
(
dev_tmp
)
{
domain
=
dmar_insert_dev_info
(
iommu
,
b
us
,
devfn
,
NULL
,
domain
);
domain
=
dmar_insert_dev_info
(
iommu
,
b
ridge_bus
,
bridge_devfn
,
NULL
,
domain
);
if
(
!
domain
)
goto
error
;
}
found_domain:
domain
=
dmar_insert_dev_info
(
iommu
,
pdev
->
bus
->
number
,
pdev
->
devfn
,
&
pdev
->
dev
,
domain
);
domain
=
dmar_insert_dev_info
(
iommu
,
bus
,
devfn
,
dev
,
domain
);
error:
if
(
free
!=
domain
)
domain_exit
(
free
);
...
...
@@ -2320,7 +2318,7 @@ static int iommu_prepare_identity_map(struct pci_dev *pdev,
struct
dmar_domain
*
domain
;
int
ret
;
domain
=
get_domain_for_dev
(
p
dev
,
DEFAULT_DOMAIN_ADDRESS_WIDTH
);
domain
=
get_domain_for_dev
(
&
pdev
->
dev
,
DEFAULT_DOMAIN_ADDRESS_WIDTH
);
if
(
!
domain
)
return
-
ENOMEM
;
...
...
@@ -2864,8 +2862,7 @@ static struct dmar_domain *__get_valid_domain_for_dev(struct pci_dev *pdev)
struct
dmar_domain
*
domain
;
int
ret
;
domain
=
get_domain_for_dev
(
pdev
,
DEFAULT_DOMAIN_ADDRESS_WIDTH
);
domain
=
get_domain_for_dev
(
&
pdev
->
dev
,
DEFAULT_DOMAIN_ADDRESS_WIDTH
);
if
(
!
domain
)
{
printk
(
KERN_ERR
"Allocating domain for %s failed"
,
pci_name
(
pdev
));
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录