Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
96da0bcd
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看板
提交
96da0bcd
编写于
11月 01, 2017
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau: allocate vmm object for every client
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
acb16cfa
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
44 addition
and
36 deletion
+44
-36
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/nouveau/nouveau_drm.c
+26
-24
drivers/gpu/drm/nouveau/nouveau_drv.h
drivers/gpu/drm/nouveau/nouveau_drv.h
+1
-0
drivers/gpu/drm/nouveau/nouveau_gem.c
drivers/gpu/drm/nouveau/nouveau_gem.c
+5
-3
drivers/gpu/drm/nouveau/nouveau_mem.h
drivers/gpu/drm/nouveau/nouveau_mem.h
+0
-5
drivers/gpu/drm/nouveau/nouveau_vmm.c
drivers/gpu/drm/nouveau/nouveau_vmm.c
+9
-3
drivers/gpu/drm/nouveau/nouveau_vmm.h
drivers/gpu/drm/nouveau/nouveau_vmm.h
+3
-1
未找到文件。
drivers/gpu/drm/nouveau/nouveau_drm.c
浏览文件 @
96da0bcd
...
...
@@ -134,6 +134,15 @@ nouveau_cli_init(struct nouveau_drm *drm, const char *sname,
{
NVIF_CLASS_MMU_NV04
,
-
1
},
{}
};
static
const
struct
nvif_mclass
vmms
[]
=
{
{
NVIF_CLASS_VMM_GP100
,
-
1
},
{
NVIF_CLASS_VMM_GM200
,
-
1
},
{
NVIF_CLASS_VMM_GF100
,
-
1
},
{
NVIF_CLASS_VMM_NV50
,
-
1
},
{
NVIF_CLASS_VMM_NV04
,
-
1
},
{}
};
u64
device
=
nouveau_name
(
drm
->
dev
);
int
ret
;
...
...
@@ -180,6 +189,23 @@ nouveau_cli_init(struct nouveau_drm *drm, const char *sname,
goto
done
;
}
ret
=
nvif_mclass
(
&
cli
->
mmu
.
object
,
vmms
);
if
(
ret
<
0
)
{
NV_ERROR
(
drm
,
"No supported VMM class
\n
"
);
goto
done
;
}
ret
=
nouveau_vmm_init
(
cli
,
vmms
[
ret
].
oclass
,
&
cli
->
vmm
);
if
(
ret
)
{
NV_ERROR
(
drm
,
"VMM allocation failed: %d
\n
"
,
ret
);
goto
done
;
}
if
(
1
)
{
cli
->
vm
=
cli
->
vmm
.
vm
;
nvxx_client
(
&
cli
->
base
)
->
vm
=
cli
->
vm
;
}
done:
if
(
ret
)
nouveau_cli_fini
(
cli
);
...
...
@@ -486,20 +512,6 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
nouveau_vga_init
(
drm
);
if
(
drm
->
client
.
device
.
info
.
family
>=
NV_DEVICE_INFO_V0_TESLA
)
{
if
(
!
nvxx_device
(
&
drm
->
client
.
device
)
->
mmu
)
{
ret
=
-
ENOSYS
;
goto
fail_device
;
}
ret
=
nouveau_vmm_init
(
&
drm
->
client
,
0
,
&
drm
->
client
.
vmm
);
if
(
ret
)
goto
fail_device
;
drm
->
client
.
vm
=
drm
->
client
.
vmm
.
vm
;
nvxx_client
(
&
drm
->
client
.
base
)
->
vm
=
drm
->
client
.
vm
;
}
ret
=
nouveau_ttm_init
(
drm
);
if
(
ret
)
goto
fail_ttm
;
...
...
@@ -545,7 +557,6 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
nouveau_ttm_fini
(
drm
);
fail_ttm:
nouveau_vga_fini
(
drm
);
fail_device:
nouveau_cli_fini
(
&
drm
->
client
);
nouveau_cli_fini
(
&
drm
->
master
);
kfree
(
drm
);
...
...
@@ -881,15 +892,6 @@ nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv)
cli
->
base
.
super
=
false
;
if
(
drm
->
client
.
device
.
info
.
family
>=
NV_DEVICE_INFO_V0_TESLA
)
{
ret
=
nouveau_vmm_init
(
cli
,
0
,
&
cli
->
vmm
);
if
(
ret
)
goto
done
;
cli
->
vm
=
cli
->
vmm
.
vm
;
nvxx_client
(
&
cli
->
base
)
->
vm
=
cli
->
vm
;
}
fpriv
->
driver_priv
=
cli
;
mutex_lock
(
&
drm
->
client
.
mutex
);
...
...
drivers/gpu/drm/nouveau/nouveau_drv.h
浏览文件 @
96da0bcd
...
...
@@ -43,6 +43,7 @@
#include <nvif/device.h>
#include <nvif/ioctl.h>
#include <nvif/mmu.h>
#include <nvif/vmm.h>
#include <drm/drmP.h>
...
...
drivers/gpu/drm/nouveau/nouveau_gem.c
浏览文件 @
96da0bcd
...
...
@@ -33,6 +33,8 @@
#include "nouveau_gem.h"
#include "nouveau_vmm.h"
#include <nvif/class.h>
void
nouveau_gem_object_del
(
struct
drm_gem_object
*
gem
)
{
...
...
@@ -69,7 +71,7 @@ nouveau_gem_object_open(struct drm_gem_object *gem, struct drm_file *file_priv)
struct
nouveau_vma
*
vma
;
int
ret
;
if
(
!
cli
->
vm
)
if
(
cli
->
vmm
.
vmm
.
object
.
oclass
<
NVIF_CLASS_VMM_NV50
)
return
0
;
ret
=
ttm_bo_reserve
(
&
nvbo
->
bo
,
false
,
false
,
NULL
);
...
...
@@ -131,7 +133,7 @@ nouveau_gem_object_close(struct drm_gem_object *gem, struct drm_file *file_priv)
struct
nouveau_vma
*
vma
;
int
ret
;
if
(
!
cli
->
vm
)
if
(
cli
->
vmm
.
vmm
.
object
.
oclass
<
NVIF_CLASS_VMM_NV50
)
return
;
ret
=
ttm_bo_reserve
(
&
nvbo
->
bo
,
false
,
false
,
NULL
);
...
...
@@ -214,7 +216,7 @@ nouveau_gem_info(struct drm_file *file_priv, struct drm_gem_object *gem,
else
rep
->
domain
=
NOUVEAU_GEM_DOMAIN_VRAM
;
rep
->
offset
=
nvbo
->
bo
.
offset
;
if
(
cli
->
vm
)
{
if
(
cli
->
vm
m
.
vmm
.
object
.
oclass
>=
NVIF_CLASS_VMM_NV50
)
{
vma
=
nouveau_vma_find
(
nvbo
,
&
cli
->
vmm
);
if
(
!
vma
)
return
-
EINVAL
;
...
...
drivers/gpu/drm/nouveau/nouveau_mem.h
浏览文件 @
96da0bcd
...
...
@@ -29,11 +29,6 @@ struct nouveau_mem {
struct
nvkm_memory
memory
;
};
enum
nvif_vmm_get
{
PTES
,
LAZY
,
};
int
nouveau_mem_new
(
struct
nouveau_cli
*
,
u8
kind
,
u8
comp
,
struct
ttm_mem_reg
*
);
void
nouveau_mem_del
(
struct
ttm_mem_reg
*
);
...
...
drivers/gpu/drm/nouveau/nouveau_vmm.c
浏览文件 @
96da0bcd
...
...
@@ -114,13 +114,19 @@ nouveau_vma_new(struct nouveau_bo *nvbo, struct nouveau_vmm *vmm,
void
nouveau_vmm_fini
(
struct
nouveau_vmm
*
vmm
)
{
nvkm_vm_ref
(
NULL
,
&
vmm
->
vm
,
NULL
);
nvif_vmm_fini
(
&
vmm
->
vmm
);
vmm
->
cli
=
NULL
;
}
int
nouveau_vmm_init
(
struct
nouveau_cli
*
cli
,
s32
oclass
,
struct
nouveau_vmm
*
vmm
)
{
int
ret
=
nvif_vmm_init
(
&
cli
->
mmu
,
oclass
,
PAGE_SIZE
,
0
,
NULL
,
0
,
&
vmm
->
vmm
);
if
(
ret
)
return
ret
;
vmm
->
cli
=
cli
;
return
nvkm_vm_new
(
nvxx_device
(
&
cli
->
device
),
0
,
(
1ULL
<<
40
),
0x1000
,
NULL
,
&
vmm
->
vm
)
;
vmm
->
vm
=
nvkm_uvmm
(
vmm
->
vmm
.
object
.
priv
)
->
vmm
;
return
0
;
}
drivers/gpu/drm/nouveau/nouveau_vmm.h
浏览文件 @
96da0bcd
#ifndef __NOUVEAU_VMA_H__
#define __NOUVEAU_VMA_H__
#include <subdev/mmu.h>
#include <subdev/mmu/uvmm.h>
#include <nvif/vmm.h>
struct
nouveau_bo
;
struct
nouveau_mem
;
...
...
@@ -24,6 +25,7 @@ void nouveau_vma_unmap(struct nouveau_vma *);
struct
nouveau_vmm
{
struct
nouveau_cli
*
cli
;
struct
nvif_vmm
vmm
;
struct
nvkm_vm
*
vm
;
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录