Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
77783435
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
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看板
提交
77783435
编写于
11月 01, 2017
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/mmu/nv41: implement vmm on top of new base
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
5b17f362
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
69 addition
and
28 deletion
+69
-28
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/Kbuild
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/Kbuild
+1
-0
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv41.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv41.c
+16
-28
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h
+3
-0
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv41.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv41.c
+49
-0
未找到文件。
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/Kbuild
浏览文件 @
77783435
...
...
@@ -14,3 +14,4 @@ nvkm-y += nvkm/subdev/mmu/gp10b.o
nvkm-y += nvkm/subdev/mmu/vmm.o
nvkm-y += nvkm/subdev/mmu/vmmnv04.o
nvkm-y += nvkm/subdev/mmu/vmmnv41.o
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv41.c
浏览文件 @
77783435
...
...
@@ -21,12 +21,13 @@
*
* Authors: Ben Skeggs
*/
#include "
nv04
.h"
#include "
vmm
.h"
#include <core/gpuobj.h>
#include <core/option.h>
#include <subdev/timer.h>
#include <nvif/class.h>
#define NV41_GART_SIZE (512 * 1024 * 1024)
#define NV41_GART_PAGE ( 4 * 1024)
...
...
@@ -68,17 +69,17 @@ nv41_vm_unmap(struct nvkm_vma *vma, struct nvkm_memory *pgt, u32 pte, u32 cnt)
static
void
nv41_vm_flush
(
struct
nvkm_vm
*
vm
)
{
struct
nv
04_mmu
*
mmu
=
nv04_mmu
(
vm
->
mmu
)
;
struct
nvkm_device
*
device
=
mmu
->
base
.
subdev
.
device
;
struct
nv
km_subdev
*
subdev
=
&
vm
->
mmu
->
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
mutex_lock
(
&
mmu
->
base
.
subdev
.
mutex
);
mutex_lock
(
&
subdev
->
mutex
);
nvkm_wr32
(
device
,
0x100810
,
0x00000022
);
nvkm_msec
(
device
,
2000
,
if
(
nvkm_rd32
(
device
,
0x100810
)
&
0x00000020
)
break
;
);
nvkm_wr32
(
device
,
0x100810
,
0x00000000
);
mutex_unlock
(
&
mmu
->
base
.
subdev
.
mutex
);
mutex_unlock
(
&
subdev
->
mutex
);
}
/*******************************************************************************
...
...
@@ -86,38 +87,24 @@ nv41_vm_flush(struct nvkm_vm *vm)
******************************************************************************/
static
int
nv41_mmu_oneinit
(
struct
nvkm_mmu
*
base
)
nv41_mmu_oneinit
(
struct
nvkm_mmu
*
mmu
)
{
struct
nv04_mmu
*
mmu
=
nv04_mmu
(
base
);
struct
nvkm_device
*
device
=
mmu
->
base
.
subdev
.
device
;
int
ret
;
ret
=
nvkm_vm_create
(
&
mmu
->
base
,
0
,
NV41_GART_SIZE
,
0
,
4096
,
NULL
,
&
mmu
->
base
.
vmm
);
if
(
ret
)
return
ret
;
ret
=
nvkm_memory_new
(
device
,
NVKM_MEM_TARGET_INST
,
(
NV41_GART_SIZE
/
NV41_GART_PAGE
)
*
4
,
16
,
true
,
&
mmu
->
base
.
vmm
->
pgt
[
0
].
mem
[
0
]);
mmu
->
base
.
vmm
->
pgt
[
0
].
refcount
[
0
]
=
1
;
return
ret
;
mmu
->
vmm
->
pgt
[
0
].
mem
[
0
]
=
mmu
->
vmm
->
pd
->
pt
[
0
]
->
memory
;
mmu
->
vmm
->
pgt
[
0
].
refcount
[
0
]
=
1
;
return
0
;
}
static
void
nv41_mmu_init
(
struct
nvkm_mmu
*
base
)
nv41_mmu_init
(
struct
nvkm_mmu
*
mmu
)
{
struct
nv04_mmu
*
mmu
=
nv04_mmu
(
base
);
struct
nvkm_device
*
device
=
mmu
->
base
.
subdev
.
device
;
struct
nvkm_memory
*
dma
=
mmu
->
base
.
vmm
->
pgt
[
0
].
mem
[
0
];
nvkm_wr32
(
device
,
0x100800
,
0x00000002
|
nvkm_memory_addr
(
dma
));
struct
nvkm_device
*
device
=
mmu
->
subdev
.
device
;
nvkm_wr32
(
device
,
0x100800
,
0x00000002
|
mmu
->
vmm
->
pd
->
pt
[
0
]
->
addr
);
nvkm_mask
(
device
,
0x10008c
,
0x00000100
,
0x00000100
);
nvkm_wr32
(
device
,
0x100820
,
0x00000000
);
}
static
const
struct
nvkm_mmu_func
nv41_mmu
=
{
.
dtor
=
nv04_mmu_dtor
,
.
oneinit
=
nv41_mmu_oneinit
,
.
init
=
nv41_mmu_init
,
.
limit
=
NV41_GART_SIZE
,
...
...
@@ -128,6 +115,7 @@ nv41_mmu = {
.
map_sg
=
nv41_vm_map_sg
,
.
unmap
=
nv41_vm_unmap
,
.
flush
=
nv41_vm_flush
,
.
vmm
=
{{
-
1
,
-
1
,
NVIF_CLASS_VMM_NV04
},
nv41_vmm_new
,
true
},
};
int
...
...
@@ -137,5 +125,5 @@ nv41_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
!
nvkm_boolopt
(
device
->
cfgopt
,
"NvPCIE"
,
true
))
return
nv04_mmu_new
(
device
,
index
,
pmmu
);
return
nv
04
_mmu_new_
(
&
nv41_mmu
,
device
,
index
,
pmmu
);
return
nv
km
_mmu_new_
(
&
nv41_mmu
,
device
,
index
,
pmmu
);
}
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h
浏览文件 @
77783435
...
...
@@ -105,6 +105,9 @@ void nvkm_vmm_dtor(struct nvkm_vmm *);
int
nv04_vmm_new_
(
const
struct
nvkm_vmm_func
*
,
struct
nvkm_mmu
*
,
u32
,
u64
,
u64
,
void
*
,
u32
,
struct
lock_class_key
*
,
const
char
*
,
struct
nvkm_vmm
**
);
int
nv04_vmm_new
(
struct
nvkm_mmu
*
,
u64
,
u64
,
void
*
,
u32
,
struct
lock_class_key
*
,
const
char
*
,
struct
nvkm_vmm
**
);
int
nv41_vmm_new
(
struct
nvkm_mmu
*
,
u64
,
u64
,
void
*
,
u32
,
struct
lock_class_key
*
,
const
char
*
,
struct
nvkm_vmm
**
);
#endif
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv41.c
0 → 100644
浏览文件 @
77783435
/*
* Copyright 2017 Red Hat Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
#include "vmm.h"
static
const
struct
nvkm_vmm_desc_func
nv41_vmm_desc_pgt
=
{
};
static
const
struct
nvkm_vmm_desc
nv41_vmm_desc_12
[]
=
{
{
PGT
,
17
,
4
,
0x1000
,
&
nv41_vmm_desc_pgt
},
{}
};
static
const
struct
nvkm_vmm_func
nv41_vmm
=
{
.
page
=
{
{
12
,
&
nv41_vmm_desc_12
[
0
],
NVKM_VMM_PAGE_HOST
},
{}
}
};
int
nv41_vmm_new
(
struct
nvkm_mmu
*
mmu
,
u64
addr
,
u64
size
,
void
*
argv
,
u32
argc
,
struct
lock_class_key
*
key
,
const
char
*
name
,
struct
nvkm_vmm
**
pvmm
)
{
return
nv04_vmm_new_
(
&
nv41_vmm
,
mmu
,
0
,
addr
,
size
,
argv
,
argc
,
key
,
name
,
pvmm
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录