Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
264ce192
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
264ce192
编写于
2月 14, 2013
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nv84-/fence: prepare for emit/sync support of sysram sequences
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
827520ce
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
65 addition
and
62 deletion
+65
-62
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_bo.c
+1
-1
drivers/gpu/drm/nouveau/nouveau_chan.c
drivers/gpu/drm/nouveau/nouveau_chan.c
+1
-1
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nouveau_display.c
+1
-1
drivers/gpu/drm/nouveau/nouveau_fence.c
drivers/gpu/drm/nouveau/nouveau_fence.c
+4
-5
drivers/gpu/drm/nouveau/nouveau_fence.h
drivers/gpu/drm/nouveau/nouveau_fence.h
+6
-12
drivers/gpu/drm/nouveau/nouveau_gem.c
drivers/gpu/drm/nouveau/nouveau_gem.c
+1
-1
drivers/gpu/drm/nouveau/nv84_fence.c
drivers/gpu/drm/nouveau/nv84_fence.c
+48
-11
drivers/gpu/drm/nouveau/nvc0_fence.c
drivers/gpu/drm/nouveau/nvc0_fence.c
+3
-30
未找到文件。
drivers/gpu/drm/nouveau/nouveau_bo.c
浏览文件 @
264ce192
...
...
@@ -561,7 +561,7 @@ nouveau_bo_move_accel_cleanup(struct nouveau_channel *chan,
struct
nouveau_fence
*
fence
=
NULL
;
int
ret
;
ret
=
nouveau_fence_new
(
chan
,
&
fence
);
ret
=
nouveau_fence_new
(
chan
,
false
,
&
fence
);
if
(
ret
)
return
ret
;
...
...
drivers/gpu/drm/nouveau/nouveau_chan.c
浏览文件 @
264ce192
...
...
@@ -51,7 +51,7 @@ nouveau_channel_idle(struct nouveau_channel *chan)
struct
nouveau_fence
*
fence
=
NULL
;
int
ret
;
ret
=
nouveau_fence_new
(
chan
,
&
fence
);
ret
=
nouveau_fence_new
(
chan
,
false
,
&
fence
);
if
(
!
ret
)
{
ret
=
nouveau_fence_wait
(
fence
,
false
,
false
);
nouveau_fence_unref
(
&
fence
);
...
...
drivers/gpu/drm/nouveau/nouveau_display.c
浏览文件 @
264ce192
...
...
@@ -540,7 +540,7 @@ nouveau_page_flip_emit(struct nouveau_channel *chan,
}
FIRE_RING
(
chan
);
ret
=
nouveau_fence_new
(
chan
,
pfence
);
ret
=
nouveau_fence_new
(
chan
,
false
,
pfence
);
if
(
ret
)
goto
fail
;
...
...
drivers/gpu/drm/nouveau/nouveau_fence.c
浏览文件 @
264ce192
...
...
@@ -41,8 +41,6 @@ nouveau_fence_context_del(struct nouveau_fence_chan *fctx)
struct
nouveau_fence
*
fence
,
*
fnext
;
spin_lock
(
&
fctx
->
lock
);
list_for_each_entry_safe
(
fence
,
fnext
,
&
fctx
->
pending
,
head
)
{
if
(
fence
->
work
)
fence
->
work
(
fence
->
priv
,
false
);
fence
->
channel
=
NULL
;
list_del
(
&
fence
->
head
);
nouveau_fence_unref
(
&
fence
);
...
...
@@ -69,8 +67,6 @@ nouveau_fence_update(struct nouveau_channel *chan)
if
(
fctx
->
read
(
chan
)
<
fence
->
sequence
)
break
;
if
(
fence
->
work
)
fence
->
work
(
fence
->
priv
,
true
);
fence
->
channel
=
NULL
;
list_del
(
&
fence
->
head
);
nouveau_fence_unref
(
&
fence
);
...
...
@@ -256,7 +252,8 @@ nouveau_fence_ref(struct nouveau_fence *fence)
}
int
nouveau_fence_new
(
struct
nouveau_channel
*
chan
,
struct
nouveau_fence
**
pfence
)
nouveau_fence_new
(
struct
nouveau_channel
*
chan
,
bool
sysmem
,
struct
nouveau_fence
**
pfence
)
{
struct
nouveau_fence
*
fence
;
int
ret
=
0
;
...
...
@@ -267,6 +264,8 @@ nouveau_fence_new(struct nouveau_channel *chan, struct nouveau_fence **pfence)
fence
=
kzalloc
(
sizeof
(
*
fence
),
GFP_KERNEL
);
if
(
!
fence
)
return
-
ENOMEM
;
fence
->
sysmem
=
sysmem
;
kref_init
(
&
fence
->
kref
);
ret
=
nouveau_fence_emit
(
fence
,
chan
);
...
...
drivers/gpu/drm/nouveau/nouveau_fence.h
浏览文件 @
264ce192
...
...
@@ -7,15 +7,15 @@ struct nouveau_fence {
struct
list_head
head
;
struct
kref
kref
;
bool
sysmem
;
struct
nouveau_channel
*
channel
;
unsigned
long
timeout
;
u32
sequence
;
void
(
*
work
)(
void
*
priv
,
bool
signalled
);
void
*
priv
;
};
int
nouveau_fence_new
(
struct
nouveau_channel
*
,
struct
nouveau_fence
**
);
int
nouveau_fence_new
(
struct
nouveau_channel
*
,
bool
sysmem
,
struct
nouveau_fence
**
);
struct
nouveau_fence
*
nouveau_fence_ref
(
struct
nouveau_fence
*
);
void
nouveau_fence_unref
(
struct
nouveau_fence
**
);
...
...
@@ -79,24 +79,18 @@ int nouveau_flip_complete(void *chan);
struct
nv84_fence_chan
{
struct
nouveau_fence_chan
base
;
struct
nouveau_vma
vma
;
struct
nouveau_vma
vma_gart
;
struct
nouveau_vma
dispc_vma
[
4
];
};
struct
nv84_fence_priv
{
struct
nouveau_fence_priv
base
;
struct
nouveau_bo
*
bo
;
struct
nouveau_bo
*
bo_gart
;
u32
*
suspend
;
};
u64
nv84_fence_crtc
(
struct
nouveau_channel
*
,
int
);
int
nv84_fence_emit
(
struct
nouveau_fence
*
);
int
nv84_fence_sync
(
struct
nouveau_fence
*
,
struct
nouveau_channel
*
,
struct
nouveau_channel
*
);
u32
nv84_fence_read
(
struct
nouveau_channel
*
);
int
nv84_fence_context_new
(
struct
nouveau_channel
*
);
void
nv84_fence_context_del
(
struct
nouveau_channel
*
);
bool
nv84_fence_suspend
(
struct
nouveau_drm
*
);
void
nv84_fence_resume
(
struct
nouveau_drm
*
);
void
nv84_fence_destroy
(
struct
nouveau_drm
*
);
#endif
drivers/gpu/drm/nouveau/nouveau_gem.c
浏览文件 @
264ce192
...
...
@@ -787,7 +787,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
}
}
ret
=
nouveau_fence_new
(
chan
,
&
fence
);
ret
=
nouveau_fence_new
(
chan
,
false
,
&
fence
);
if
(
ret
)
{
NV_ERROR
(
cli
,
"error fencing pushbuf: %d
\n
"
,
ret
);
WIND_RING
(
chan
);
...
...
drivers/gpu/drm/nouveau/nv84_fence.c
浏览文件 @
264ce192
...
...
@@ -76,27 +76,39 @@ nv84_fence_sync32(struct nouveau_channel *chan, u64 virtual, u32 sequence)
return
ret
;
}
int
static
int
nv84_fence_emit
(
struct
nouveau_fence
*
fence
)
{
struct
nouveau_channel
*
chan
=
fence
->
channel
;
struct
nv84_fence_chan
*
fctx
=
chan
->
fence
;
struct
nouveau_fifo_chan
*
fifo
=
(
void
*
)
chan
->
object
;
u64
addr
=
fctx
->
vma
.
offset
+
fifo
->
chid
*
16
;
u64
addr
=
fifo
->
chid
*
16
;
if
(
fence
->
sysmem
)
addr
+=
fctx
->
vma_gart
.
offset
;
else
addr
+=
fctx
->
vma
.
offset
;
return
fctx
->
base
.
emit32
(
chan
,
addr
,
fence
->
sequence
);
}
int
static
int
nv84_fence_sync
(
struct
nouveau_fence
*
fence
,
struct
nouveau_channel
*
prev
,
struct
nouveau_channel
*
chan
)
{
struct
nv84_fence_chan
*
fctx
=
chan
->
fence
;
struct
nouveau_fifo_chan
*
fifo
=
(
void
*
)
prev
->
object
;
u64
addr
=
fctx
->
vma
.
offset
+
fifo
->
chid
*
16
;
u64
addr
=
fifo
->
chid
*
16
;
if
(
fence
->
sysmem
)
addr
+=
fctx
->
vma_gart
.
offset
;
else
addr
+=
fctx
->
vma
.
offset
;
return
fctx
->
base
.
sync32
(
chan
,
addr
,
fence
->
sequence
);
}
u32
static
u32
nv84_fence_read
(
struct
nouveau_channel
*
chan
)
{
struct
nouveau_fifo_chan
*
fifo
=
(
void
*
)
chan
->
object
;
...
...
@@ -104,7 +116,7 @@ nv84_fence_read(struct nouveau_channel *chan)
return
nouveau_bo_rd32
(
priv
->
bo
,
fifo
->
chid
*
16
/
4
);
}
void
static
void
nv84_fence_context_del
(
struct
nouveau_channel
*
chan
)
{
struct
drm_device
*
dev
=
chan
->
drm
->
dev
;
...
...
@@ -117,6 +129,7 @@ nv84_fence_context_del(struct nouveau_channel *chan)
nouveau_bo_vma_del
(
bo
,
&
fctx
->
dispc_vma
[
i
]);
}
nouveau_bo_vma_del
(
priv
->
bo
,
&
fctx
->
vma_gart
);
nouveau_bo_vma_del
(
priv
->
bo
,
&
fctx
->
vma
);
nouveau_fence_context_del
(
&
fctx
->
base
);
chan
->
fence
=
NULL
;
...
...
@@ -144,8 +157,10 @@ nv84_fence_context_new(struct nouveau_channel *chan)
fctx
->
base
.
sync32
=
nv84_fence_sync32
;
ret
=
nouveau_bo_vma_add
(
priv
->
bo
,
client
->
vm
,
&
fctx
->
vma
);
if
(
ret
)
nv84_fence_context_del
(
chan
);
if
(
ret
==
0
)
{
ret
=
nouveau_bo_vma_add
(
priv
->
bo_gart
,
client
->
vm
,
&
fctx
->
vma_gart
);
}
/* map display semaphore buffers into channel's vm */
for
(
i
=
0
;
!
ret
&&
i
<
chan
->
drm
->
dev
->
mode_config
.
num_crtc
;
i
++
)
{
...
...
@@ -154,10 +169,13 @@ nv84_fence_context_new(struct nouveau_channel *chan)
}
nouveau_bo_wr32
(
priv
->
bo
,
fifo
->
chid
*
16
/
4
,
0x00000000
);
if
(
ret
)
nv84_fence_context_del
(
chan
);
return
ret
;
}
bool
static
bool
nv84_fence_suspend
(
struct
nouveau_drm
*
drm
)
{
struct
nouveau_fifo
*
pfifo
=
nouveau_fifo
(
drm
->
device
);
...
...
@@ -173,7 +191,7 @@ nv84_fence_suspend(struct nouveau_drm *drm)
return
priv
->
suspend
!=
NULL
;
}
void
static
void
nv84_fence_resume
(
struct
nouveau_drm
*
drm
)
{
struct
nouveau_fifo
*
pfifo
=
nouveau_fifo
(
drm
->
device
);
...
...
@@ -188,10 +206,14 @@ nv84_fence_resume(struct nouveau_drm *drm)
}
}
void
static
void
nv84_fence_destroy
(
struct
nouveau_drm
*
drm
)
{
struct
nv84_fence_priv
*
priv
=
drm
->
fence
;
nouveau_bo_unmap
(
priv
->
bo_gart
);
if
(
priv
->
bo_gart
)
nouveau_bo_unpin
(
priv
->
bo_gart
);
nouveau_bo_ref
(
NULL
,
&
priv
->
bo_gart
);
nouveau_bo_unmap
(
priv
->
bo
);
if
(
priv
->
bo
)
nouveau_bo_unpin
(
priv
->
bo
);
...
...
@@ -233,6 +255,21 @@ nv84_fence_create(struct nouveau_drm *drm)
nouveau_bo_ref
(
NULL
,
&
priv
->
bo
);
}
if
(
ret
==
0
)
ret
=
nouveau_bo_new
(
drm
->
dev
,
16
*
(
pfifo
->
max
+
1
),
0
,
TTM_PL_FLAG_TT
,
0
,
0
,
NULL
,
&
priv
->
bo_gart
);
if
(
ret
==
0
)
{
ret
=
nouveau_bo_pin
(
priv
->
bo_gart
,
TTM_PL_FLAG_TT
);
if
(
ret
==
0
)
{
ret
=
nouveau_bo_map
(
priv
->
bo_gart
);
if
(
ret
)
nouveau_bo_unpin
(
priv
->
bo_gart
);
}
if
(
ret
)
nouveau_bo_ref
(
NULL
,
&
priv
->
bo_gart
);
}
if
(
ret
)
nv84_fence_destroy
(
drm
);
return
ret
;
...
...
drivers/gpu/drm/nouveau/nvc0_fence.c
浏览文件 @
264ce192
...
...
@@ -81,37 +81,10 @@ nvc0_fence_context_new(struct nouveau_channel *chan)
int
nvc0_fence_create
(
struct
nouveau_drm
*
drm
)
{
struct
nouveau_fifo
*
pfifo
=
nouveau_fifo
(
drm
->
device
);
struct
nv84_fence_priv
*
priv
;
int
ret
;
priv
=
drm
->
fence
=
kzalloc
(
sizeof
(
*
priv
),
GFP_KERNEL
);
if
(
!
priv
)
return
-
ENOMEM
;
priv
->
base
.
dtor
=
nv84_fence_destroy
;
priv
->
base
.
suspend
=
nv84_fence_suspend
;
priv
->
base
.
resume
=
nv84_fence_resume
;
priv
->
base
.
context_new
=
nvc0_fence_context_new
;
priv
->
base
.
context_del
=
nv84_fence_context_del
;
init_waitqueue_head
(
&
priv
->
base
.
waiting
);
priv
->
base
.
uevent
=
true
;
ret
=
nouveau_bo_new
(
drm
->
dev
,
16
*
(
pfifo
->
max
+
1
),
0
,
TTM_PL_FLAG_VRAM
,
0
,
0
,
NULL
,
&
priv
->
bo
);
int
ret
=
nv84_fence_create
(
drm
);
if
(
ret
==
0
)
{
ret
=
nouveau_bo_pin
(
priv
->
bo
,
TTM_PL_FLAG_VRAM
);
if
(
ret
==
0
)
{
ret
=
nouveau_bo_map
(
priv
->
bo
);
if
(
ret
)
nouveau_bo_unpin
(
priv
->
bo
);
}
if
(
ret
)
nouveau_bo_ref
(
NULL
,
&
priv
->
bo
);
struct
nv84_fence_priv
*
priv
=
drm
->
fence
;
priv
->
base
.
context_new
=
nvc0_fence_context_new
;
}
if
(
ret
)
nv84_fence_destroy
(
drm
);
return
ret
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录