Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
3cce469c
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看板
提交
3cce469c
编写于
10月 27, 2010
作者:
C
Chris Wilson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/i915: Propagate error from failing to queue a request
Signed-off-by:
N
Chris Wilson
<
chris@chris-wilson.co.uk
>
上级
b2223497
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
111 addition
and
85 deletion
+111
-85
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_drv.h
+4
-4
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem.c
+24
-12
drivers/gpu/drm/i915/intel_overlay.c
drivers/gpu/drm/i915/intel_overlay.c
+13
-7
drivers/gpu/drm/i915/intel_ringbuffer.c
drivers/gpu/drm/i915/intel_ringbuffer.c
+68
-60
drivers/gpu/drm/i915/intel_ringbuffer.h
drivers/gpu/drm/i915/intel_ringbuffer.h
+2
-2
未找到文件。
drivers/gpu/drm/i915/i915_drv.h
浏览文件 @
3cce469c
...
...
@@ -1041,10 +1041,10 @@ int i915_gem_do_init(struct drm_device *dev, unsigned long start,
unsigned
long
end
);
int
i915_gpu_idle
(
struct
drm_device
*
dev
);
int
i915_gem_idle
(
struct
drm_device
*
dev
);
uint32_
t
i915_add_request
(
struct
drm_device
*
dev
,
struct
drm_file
*
file_priv
,
struct
drm_i915_gem_request
*
request
,
struct
intel_ring_buffer
*
ring
);
in
t
i915_add_request
(
struct
drm_device
*
dev
,
struct
drm_file
*
file_priv
,
struct
drm_i915_gem_request
*
request
,
struct
intel_ring_buffer
*
ring
);
int
i915_do_wait_request
(
struct
drm_device
*
dev
,
uint32_t
seqno
,
bool
interruptible
,
...
...
drivers/gpu/drm/i915/i915_gem.c
浏览文件 @
3cce469c
...
...
@@ -1683,7 +1683,7 @@ i915_gem_process_flushing_list(struct drm_device *dev,
}
}
uint32_
t
in
t
i915_add_request
(
struct
drm_device
*
dev
,
struct
drm_file
*
file
,
struct
drm_i915_gem_request
*
request
,
...
...
@@ -1693,17 +1693,17 @@ i915_add_request(struct drm_device *dev,
struct
drm_i915_file_private
*
file_priv
=
NULL
;
uint32_t
seqno
;
int
was_empty
;
int
ret
;
BUG_ON
(
request
==
NULL
);
if
(
file
!=
NULL
)
file_priv
=
file
->
driver_priv
;
if
(
request
==
NULL
)
{
request
=
kzalloc
(
sizeof
(
*
request
),
GFP_KERNEL
);
if
(
request
==
NULL
)
return
0
;
}
ret
=
ring
->
add_request
(
ring
,
&
seqno
);
if
(
ret
)
return
ret
;
seqno
=
ring
->
add_request
(
ring
,
0
);
ring
->
outstanding_lazy_request
=
false
;
request
->
seqno
=
seqno
;
...
...
@@ -1727,7 +1727,7 @@ i915_add_request(struct drm_device *dev,
queue_delayed_work
(
dev_priv
->
wq
,
&
dev_priv
->
mm
.
retire_work
,
HZ
);
}
return
seqno
;
return
0
;
}
/**
...
...
@@ -1964,9 +1964,19 @@ i915_do_wait_request(struct drm_device *dev, uint32_t seqno,
return
-
EAGAIN
;
if
(
ring
->
outstanding_lazy_request
)
{
seqno
=
i915_add_request
(
dev
,
NULL
,
NULL
,
ring
);
if
(
seqno
==
0
)
struct
drm_i915_gem_request
*
request
;
request
=
kzalloc
(
sizeof
(
*
request
),
GFP_KERNEL
);
if
(
request
==
NULL
)
return
-
ENOMEM
;
ret
=
i915_add_request
(
dev
,
NULL
,
request
,
ring
);
if
(
ret
)
{
kfree
(
request
);
return
ret
;
}
seqno
=
request
->
seqno
;
}
BUG_ON
(
seqno
==
dev_priv
->
next_seqno
);
...
...
@@ -3844,8 +3854,10 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
*/
i915_retire_commands
(
dev
,
ring
);
i915_add_request
(
dev
,
file
,
request
,
ring
);
request
=
NULL
;
if
(
i915_add_request
(
dev
,
file
,
request
,
ring
))
ring
->
outstanding_lazy_request
=
true
;
else
request
=
NULL
;
err:
for
(
i
=
0
;
i
<
args
->
buffer_count
;
i
++
)
{
...
...
drivers/gpu/drm/i915/intel_overlay.c
浏览文件 @
3cce469c
...
...
@@ -221,11 +221,12 @@ static int intel_overlay_do_wait_request(struct intel_overlay *overlay,
int
ret
;
BUG_ON
(
overlay
->
last_flip_req
);
overlay
->
last_flip_req
=
i915_add_request
(
dev
,
NULL
,
request
,
&
dev_priv
->
render_ring
);
if
(
overlay
->
last_flip_req
==
0
)
return
-
ENOMEM
;
ret
=
i915_add_request
(
dev
,
NULL
,
request
,
&
dev_priv
->
render_ring
);
if
(
ret
)
{
kfree
(
request
);
return
ret
;
}
overlay
->
last_flip_req
=
request
->
seqno
;
overlay
->
flip_tail
=
tail
;
ret
=
i915_do_wait_request
(
dev
,
overlay
->
last_flip_req
,
true
,
...
...
@@ -363,8 +364,13 @@ static int intel_overlay_continue(struct intel_overlay *overlay,
OUT_RING
(
flip_addr
);
ADVANCE_LP_RING
();
overlay
->
last_flip_req
=
i915_add_request
(
dev
,
NULL
,
request
,
&
dev_priv
->
render_ring
);
ret
=
i915_add_request
(
dev
,
NULL
,
request
,
&
dev_priv
->
render_ring
);
if
(
ret
)
{
kfree
(
request
);
return
ret
;
}
overlay
->
last_flip_req
=
request
->
seqno
;
return
0
;
}
...
...
drivers/gpu/drm/i915/intel_ringbuffer.c
浏览文件 @
3cce469c
...
...
@@ -234,28 +234,28 @@ do { \
*
* Returned sequence numbers are nonzero on success.
*/
static
u32
static
int
render_ring_add_request
(
struct
intel_ring_buffer
*
ring
,
u32
flush_domains
)
u32
*
result
)
{
struct
drm_device
*
dev
=
ring
->
dev
;
drm_i915_private_t
*
dev_priv
=
dev
->
dev_private
;
u32
seqno
;
seqno
=
i915_gem_get_seqno
(
dev
);
u32
seqno
=
i915_gem_get_seqno
(
dev
);
int
ret
;
if
(
IS_GEN6
(
dev
))
{
if
(
intel_ring_begin
(
ring
,
6
)
==
0
)
{
intel_ring_emit
(
ring
,
GFX_OP_PIPE_CONTROL
|
3
);
intel_ring_emit
(
ring
,
PIPE_CONTROL_QW_WRITE
|
PIPE_CONTROL_WC_FLUSH
|
PIPE_CONTROL_IS_FLUSH
|
PIPE_CONTROL_NOTIFY
);
intel_ring_emit
(
ring
,
dev_priv
->
seqno_gfx_addr
|
PIPE_CONTROL_GLOBAL_GTT
);
intel_ring_emit
(
ring
,
seqno
);
intel_ring_emit
(
ring
,
0
);
intel_ring_emit
(
ring
,
0
);
intel_ring_advance
(
ring
);
}
ret
=
intel_ring_begin
(
ring
,
6
);
if
(
ret
)
return
ret
;
intel_ring_emit
(
ring
,
GFX_OP_PIPE_CONTROL
|
3
);
intel_ring_emit
(
ring
,
PIPE_CONTROL_QW_WRITE
|
PIPE_CONTROL_WC_FLUSH
|
PIPE_CONTROL_IS_FLUSH
|
PIPE_CONTROL_NOTIFY
);
intel_ring_emit
(
ring
,
dev_priv
->
seqno_gfx_addr
|
PIPE_CONTROL_GLOBAL_GTT
);
intel_ring_emit
(
ring
,
seqno
);
intel_ring_emit
(
ring
,
0
);
intel_ring_emit
(
ring
,
0
);
}
else
if
(
HAS_PIPE_CONTROL
(
dev
))
{
u32
scratch_addr
=
dev_priv
->
seqno_gfx_addr
+
128
;
...
...
@@ -264,42 +264,47 @@ render_ring_add_request(struct intel_ring_buffer *ring,
* PIPE_NOTIFY buffers out to memory before requesting
* an interrupt.
*/
if
(
intel_ring_begin
(
ring
,
32
)
==
0
)
{
intel_ring_emit
(
ring
,
GFX_OP_PIPE_CONTROL
|
PIPE_CONTROL_QW_WRITE
|
PIPE_CONTROL_WC_FLUSH
|
PIPE_CONTROL_TC_FLUSH
);
intel_ring_emit
(
ring
,
dev_priv
->
seqno_gfx_addr
|
PIPE_CONTROL_GLOBAL_GTT
);
intel_ring_emit
(
ring
,
seqno
);
intel_ring_emit
(
ring
,
0
);
PIPE_CONTROL_FLUSH
(
ring
,
scratch_addr
);
scratch_addr
+=
128
;
/* write to separate cachelines */
PIPE_CONTROL_FLUSH
(
ring
,
scratch_addr
);
scratch_addr
+=
128
;
PIPE_CONTROL_FLUSH
(
ring
,
scratch_addr
);
scratch_addr
+=
128
;
PIPE_CONTROL_FLUSH
(
ring
,
scratch_addr
);
scratch_addr
+=
128
;
PIPE_CONTROL_FLUSH
(
ring
,
scratch_addr
);
scratch_addr
+=
128
;
PIPE_CONTROL_FLUSH
(
ring
,
scratch_addr
);
intel_ring_emit
(
ring
,
GFX_OP_PIPE_CONTROL
|
PIPE_CONTROL_QW_WRITE
|
PIPE_CONTROL_WC_FLUSH
|
PIPE_CONTROL_TC_FLUSH
|
PIPE_CONTROL_NOTIFY
);
intel_ring_emit
(
ring
,
dev_priv
->
seqno_gfx_addr
|
PIPE_CONTROL_GLOBAL_GTT
);
intel_ring_emit
(
ring
,
seqno
);
intel_ring_emit
(
ring
,
0
);
intel_ring_advance
(
ring
);
}
ret
=
intel_ring_begin
(
ring
,
32
);
if
(
ret
)
return
ret
;
intel_ring_emit
(
ring
,
GFX_OP_PIPE_CONTROL
|
PIPE_CONTROL_QW_WRITE
|
PIPE_CONTROL_WC_FLUSH
|
PIPE_CONTROL_TC_FLUSH
);
intel_ring_emit
(
ring
,
dev_priv
->
seqno_gfx_addr
|
PIPE_CONTROL_GLOBAL_GTT
);
intel_ring_emit
(
ring
,
seqno
);
intel_ring_emit
(
ring
,
0
);
PIPE_CONTROL_FLUSH
(
ring
,
scratch_addr
);
scratch_addr
+=
128
;
/* write to separate cachelines */
PIPE_CONTROL_FLUSH
(
ring
,
scratch_addr
);
scratch_addr
+=
128
;
PIPE_CONTROL_FLUSH
(
ring
,
scratch_addr
);
scratch_addr
+=
128
;
PIPE_CONTROL_FLUSH
(
ring
,
scratch_addr
);
scratch_addr
+=
128
;
PIPE_CONTROL_FLUSH
(
ring
,
scratch_addr
);
scratch_addr
+=
128
;
PIPE_CONTROL_FLUSH
(
ring
,
scratch_addr
);
intel_ring_emit
(
ring
,
GFX_OP_PIPE_CONTROL
|
PIPE_CONTROL_QW_WRITE
|
PIPE_CONTROL_WC_FLUSH
|
PIPE_CONTROL_TC_FLUSH
|
PIPE_CONTROL_NOTIFY
);
intel_ring_emit
(
ring
,
dev_priv
->
seqno_gfx_addr
|
PIPE_CONTROL_GLOBAL_GTT
);
intel_ring_emit
(
ring
,
seqno
);
intel_ring_emit
(
ring
,
0
);
}
else
{
if
(
intel_ring_begin
(
ring
,
4
)
==
0
)
{
intel_ring_emit
(
ring
,
MI_STORE_DWORD_INDEX
);
intel_ring_emit
(
ring
,
I915_GEM_HWS_INDEX
<<
MI_STORE_DWORD_INDEX_SHIFT
);
intel_ring_emit
(
ring
,
seqno
);
ret
=
intel_ring_begin
(
ring
,
4
);
if
(
ret
)
return
ret
;
intel_ring_emit
(
ring
,
MI_USER_INTERRUPT
);
intel_ring_advance
(
ring
);
}
intel_ring_emit
(
ring
,
MI_STORE_DWORD_INDEX
);
intel_ring_emit
(
ring
,
I915_GEM_HWS_INDEX
<<
MI_STORE_DWORD_INDEX_SHIFT
);
intel_ring_emit
(
ring
,
seqno
);
intel_ring_emit
(
ring
,
MI_USER_INTERRUPT
);
}
return
seqno
;
intel_ring_advance
(
ring
);
*
result
=
seqno
;
return
0
;
}
static
u32
...
...
@@ -370,25 +375,28 @@ bsd_ring_flush(struct intel_ring_buffer *ring,
}
}
static
u32
static
int
ring_add_request
(
struct
intel_ring_buffer
*
ring
,
u32
flush_domains
)
u32
*
result
)
{
u32
seqno
;
int
ret
;
ret
=
intel_ring_begin
(
ring
,
4
);
if
(
ret
)
return
ret
;
seqno
=
i915_gem_get_seqno
(
ring
->
dev
);
if
(
intel_ring_begin
(
ring
,
4
)
==
0
)
{
intel_ring_emit
(
ring
,
MI_STORE_DWORD_INDEX
);
intel_ring_emit
(
ring
,
I915_GEM_HWS_INDEX
<<
MI_STORE_DWORD_INDEX_SHIFT
);
intel_ring_emit
(
ring
,
seqno
);
intel_ring_emit
(
ring
,
MI_USER_INTERRUPT
);
intel_ring_advance
(
ring
);
}
intel_ring_emit
(
ring
,
MI_STORE_DWORD_INDEX
);
intel_ring_emit
(
ring
,
I915_GEM_HWS_INDEX
<<
MI_STORE_DWORD_INDEX_SHIFT
);
intel_ring_emit
(
ring
,
seqno
);
intel_ring_emit
(
ring
,
MI_USER_INTERRUPT
);
intel_ring_advance
(
ring
);
DRM_DEBUG_DRIVER
(
"%s %d
\n
"
,
ring
->
name
,
seqno
);
return
seqno
;
*
result
=
seqno
;
return
0
;
}
static
void
...
...
drivers/gpu/drm/i915/intel_ringbuffer.h
浏览文件 @
3cce469c
...
...
@@ -48,8 +48,8 @@ struct intel_ring_buffer {
void
(
*
flush
)(
struct
intel_ring_buffer
*
ring
,
u32
invalidate_domains
,
u32
flush_domains
);
u32
(
*
add_request
)(
struct
intel_ring_buffer
*
ring
,
u32
flush_domains
);
int
(
*
add_request
)(
struct
intel_ring_buffer
*
ring
,
u32
*
seqno
);
u32
(
*
get_seqno
)(
struct
intel_ring_buffer
*
ring
);
int
(
*
dispatch_execbuffer
)(
struct
intel_ring_buffer
*
ring
,
struct
drm_i915_gem_execbuffer2
*
exec
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录