Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
183720b8
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看板
提交
183720b8
编写于
12月 09, 2010
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nvc0: accelerate ttm buffer moves
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
6d86951a
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
56 addition
and
1 deletion
+56
-1
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_bo.c
+56
-1
未找到文件。
drivers/gpu/drm/nouveau/nouveau_bo.c
浏览文件 @
183720b8
...
...
@@ -514,6 +514,58 @@ nouveau_bo_mem_ctxdma(struct ttm_buffer_object *bo,
return
chan
->
vram_handle
;
}
static
int
nvc0_bo_move_m2mf
(
struct
nouveau_channel
*
chan
,
struct
ttm_buffer_object
*
bo
,
struct
ttm_mem_reg
*
old_mem
,
struct
ttm_mem_reg
*
new_mem
)
{
struct
drm_nouveau_private
*
dev_priv
=
nouveau_bdev
(
bo
->
bdev
);
struct
nouveau_bo
*
nvbo
=
nouveau_bo
(
bo
);
u64
src_offset
=
old_mem
->
start
<<
PAGE_SHIFT
;
u64
dst_offset
=
new_mem
->
start
<<
PAGE_SHIFT
;
u32
page_count
=
new_mem
->
num_pages
;
int
ret
;
if
(
!
nvbo
->
no_vm
)
{
if
(
old_mem
->
mem_type
==
TTM_PL_VRAM
)
src_offset
=
nvbo
->
vma
.
offset
;
else
src_offset
+=
dev_priv
->
gart_info
.
aper_base
;
if
(
new_mem
->
mem_type
==
TTM_PL_VRAM
)
dst_offset
=
nvbo
->
vma
.
offset
;
else
dst_offset
+=
dev_priv
->
gart_info
.
aper_base
;
}
page_count
=
new_mem
->
num_pages
;
while
(
page_count
)
{
int
line_count
=
(
page_count
>
2047
)
?
2047
:
page_count
;
ret
=
RING_SPACE
(
chan
,
12
);
if
(
ret
)
return
ret
;
BEGIN_NVC0
(
chan
,
2
,
NvSubM2MF
,
0x0238
,
2
);
OUT_RING
(
chan
,
upper_32_bits
(
dst_offset
));
OUT_RING
(
chan
,
lower_32_bits
(
dst_offset
));
BEGIN_NVC0
(
chan
,
2
,
NvSubM2MF
,
0x030c
,
6
);
OUT_RING
(
chan
,
upper_32_bits
(
src_offset
));
OUT_RING
(
chan
,
lower_32_bits
(
src_offset
));
OUT_RING
(
chan
,
PAGE_SIZE
);
/* src_pitch */
OUT_RING
(
chan
,
PAGE_SIZE
);
/* dst_pitch */
OUT_RING
(
chan
,
PAGE_SIZE
);
/* line_length */
OUT_RING
(
chan
,
line_count
);
BEGIN_NVC0
(
chan
,
2
,
NvSubM2MF
,
0x0300
,
1
);
OUT_RING
(
chan
,
0x00100110
);
page_count
-=
line_count
;
src_offset
+=
(
PAGE_SIZE
*
line_count
);
dst_offset
+=
(
PAGE_SIZE
*
line_count
);
}
return
0
;
}
static
int
nv50_bo_move_m2mf
(
struct
nouveau_channel
*
chan
,
struct
ttm_buffer_object
*
bo
,
struct
ttm_mem_reg
*
old_mem
,
struct
ttm_mem_reg
*
new_mem
)
...
...
@@ -690,7 +742,10 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
if
(
dev_priv
->
card_type
<
NV_50
)
ret
=
nv04_bo_move_m2mf
(
chan
,
bo
,
&
bo
->
mem
,
new_mem
);
else
if
(
dev_priv
->
card_type
<
NV_C0
)
ret
=
nv50_bo_move_m2mf
(
chan
,
bo
,
&
bo
->
mem
,
new_mem
);
else
ret
=
nvc0_bo_move_m2mf
(
chan
,
bo
,
&
bo
->
mem
,
new_mem
);
if
(
ret
==
0
)
{
ret
=
nouveau_bo_move_accel_cleanup
(
chan
,
nvbo
,
evict
,
no_wait_reserve
,
...
...
@@ -836,7 +891,7 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict, bool intr,
}
/* Software copy if the card isn't up and running yet. */
if
(
!
dev_priv
->
channel
||
dev_priv
->
card_type
==
NV_C0
)
{
if
(
!
dev_priv
->
channel
)
{
ret
=
ttm_bo_move_memcpy
(
bo
,
evict
,
no_wait_reserve
,
no_wait_gpu
,
new_mem
);
goto
out
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录