Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
8e8832e8
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看板
提交
8e8832e8
编写于
5月 13, 2014
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/core: allow event source to handle multiple event types per index
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
255b329c
变更
21
隐藏空白更改
内联
并排
Showing
21 changed file
with
112 addition
and
77 deletion
+112
-77
drivers/gpu/drm/nouveau/core/core/event.c
drivers/gpu/drm/nouveau/core/core/event.c
+58
-25
drivers/gpu/drm/nouveau/core/engine/disp/base.c
drivers/gpu/drm/nouveau/core/engine/disp/base.c
+1
-1
drivers/gpu/drm/nouveau/core/engine/disp/nv04.c
drivers/gpu/drm/nouveau/core/engine/disp/nv04.c
+4
-4
drivers/gpu/drm/nouveau/core/engine/disp/nv50.c
drivers/gpu/drm/nouveau/core/engine/disp/nv50.c
+4
-4
drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c
drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c
+3
-3
drivers/gpu/drm/nouveau/core/engine/fifo/base.c
drivers/gpu/drm/nouveau/core/engine/fifo/base.c
+3
-3
drivers/gpu/drm/nouveau/core/engine/fifo/nv04.c
drivers/gpu/drm/nouveau/core/engine/fifo/nv04.c
+1
-1
drivers/gpu/drm/nouveau/core/engine/fifo/nv84.c
drivers/gpu/drm/nouveau/core/engine/fifo/nv84.c
+2
-2
drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c
drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c
+3
-3
drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c
drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c
+3
-3
drivers/gpu/drm/nouveau/core/engine/software/nv50.c
drivers/gpu/drm/nouveau/core/engine/software/nv50.c
+2
-2
drivers/gpu/drm/nouveau/core/engine/software/nv50.h
drivers/gpu/drm/nouveau/core/engine/software/nv50.h
+1
-1
drivers/gpu/drm/nouveau/core/engine/software/nvc0.c
drivers/gpu/drm/nouveau/core/engine/software/nvc0.c
+1
-1
drivers/gpu/drm/nouveau/core/include/core/event.h
drivers/gpu/drm/nouveau/core/include/core/event.h
+15
-14
drivers/gpu/drm/nouveau/core/subdev/gpio/base.c
drivers/gpu/drm/nouveau/core/subdev/gpio/base.c
+1
-1
drivers/gpu/drm/nouveau/core/subdev/gpio/nv10.c
drivers/gpu/drm/nouveau/core/subdev/gpio/nv10.c
+1
-1
drivers/gpu/drm/nouveau/core/subdev/gpio/nv50.c
drivers/gpu/drm/nouveau/core/subdev/gpio/nv50.c
+1
-1
drivers/gpu/drm/nouveau/core/subdev/gpio/nve0.c
drivers/gpu/drm/nouveau/core/subdev/gpio/nve0.c
+1
-1
drivers/gpu/drm/nouveau/nouveau_connector.c
drivers/gpu/drm/nouveau/nouveau_connector.c
+3
-2
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nouveau_display.c
+2
-2
drivers/gpu/drm/nouveau/nouveau_fence.c
drivers/gpu/drm/nouveau/nouveau_fence.c
+2
-2
未找到文件。
drivers/gpu/drm/nouveau/core/core/event.c
浏览文件 @
8e8832e8
...
...
@@ -28,14 +28,20 @@ nouveau_event_put(struct nouveau_eventh *handler)
{
struct
nouveau_event
*
event
=
handler
->
event
;
unsigned
long
flags
;
if
(
__test_and_clear_bit
(
NVKM_EVENT_ENABLE
,
&
handler
->
flags
))
{
spin_lock_irqsave
(
&
event
->
refs_lock
,
flags
);
if
(
!--
event
->
index
[
handler
->
index
].
refs
)
{
u32
m
,
t
;
if
(
!
__test_and_clear_bit
(
NVKM_EVENT_ENABLE
,
&
handler
->
flags
))
return
;
spin_lock_irqsave
(
&
event
->
refs_lock
,
flags
);
for
(
m
=
handler
->
types
;
t
=
__ffs
(
m
),
m
;
m
&=
~
(
1
<<
t
))
{
if
(
!--
event
->
refs
[
handler
->
index
*
event
->
types_nr
+
t
])
{
if
(
event
->
disable
)
event
->
disable
(
event
,
handler
->
index
);
event
->
disable
(
event
,
1
<<
t
,
handler
->
index
);
}
spin_unlock_irqrestore
(
&
event
->
refs_lock
,
flags
);
}
spin_unlock_irqrestore
(
&
event
->
refs_lock
,
flags
);
}
void
...
...
@@ -43,14 +49,20 @@ nouveau_event_get(struct nouveau_eventh *handler)
{
struct
nouveau_event
*
event
=
handler
->
event
;
unsigned
long
flags
;
if
(
!
__test_and_set_bit
(
NVKM_EVENT_ENABLE
,
&
handler
->
flags
))
{
spin_lock_irqsave
(
&
event
->
refs_lock
,
flags
);
if
(
!
event
->
index
[
handler
->
index
].
refs
++
)
{
u32
m
,
t
;
if
(
__test_and_set_bit
(
NVKM_EVENT_ENABLE
,
&
handler
->
flags
))
return
;
spin_lock_irqsave
(
&
event
->
refs_lock
,
flags
);
for
(
m
=
handler
->
types
;
t
=
__ffs
(
m
),
m
;
m
&=
~
(
1
<<
t
))
{
if
(
!
event
->
refs
[
handler
->
index
*
event
->
types_nr
+
t
]
++
)
{
if
(
event
->
enable
)
event
->
enable
(
event
,
handler
->
index
);
event
->
enable
(
event
,
1
<<
t
,
handler
->
index
);
}
spin_unlock_irqrestore
(
&
event
->
refs_lock
,
flags
);
}
spin_unlock_irqrestore
(
&
event
->
refs_lock
,
flags
);
}
static
void
...
...
@@ -65,38 +77,47 @@ nouveau_event_fini(struct nouveau_eventh *handler)
}
static
int
nouveau_event_init
(
struct
nouveau_event
*
event
,
int
index
,
int
(
*
func
)(
void
*
,
int
),
void
*
priv
,
nouveau_event_init
(
struct
nouveau_event
*
event
,
u32
types
,
int
index
,
int
(
*
func
)(
void
*
,
u32
,
int
),
void
*
priv
,
struct
nouveau_eventh
*
handler
)
{
unsigned
long
flags
;
if
(
types
&
~
((
1
<<
event
->
types_nr
)
-
1
))
return
-
EINVAL
;
if
(
index
>=
event
->
index_nr
)
return
-
EINVAL
;
handler
->
event
=
event
;
handler
->
flags
=
0
;
handler
->
types
=
types
;
handler
->
index
=
index
;
handler
->
func
=
func
;
handler
->
priv
=
priv
;
spin_lock_irqsave
(
&
event
->
list_lock
,
flags
);
list_add_tail
(
&
handler
->
head
,
&
event
->
index
[
index
].
list
);
list_add_tail
(
&
handler
->
head
,
&
event
->
list
[
index
]
);
spin_unlock_irqrestore
(
&
event
->
list_lock
,
flags
);
return
0
;
}
int
nouveau_event_new
(
struct
nouveau_event
*
event
,
int
index
,
int
(
*
func
)(
void
*
,
int
),
void
*
priv
,
nouveau_event_new
(
struct
nouveau_event
*
event
,
u32
types
,
int
index
,
int
(
*
func
)(
void
*
,
u32
,
int
),
void
*
priv
,
struct
nouveau_eventh
**
phandler
)
{
struct
nouveau_eventh
*
handler
;
int
ret
=
-
ENOMEM
;
if
(
event
->
check
)
{
ret
=
event
->
check
(
event
,
types
,
index
);
if
(
ret
)
return
ret
;
}
handler
=
*
phandler
=
kmalloc
(
sizeof
(
*
handler
),
GFP_KERNEL
);
if
(
handler
)
{
ret
=
nouveau_event_init
(
event
,
index
,
func
,
priv
,
handler
);
ret
=
nouveau_event_init
(
event
,
types
,
index
,
func
,
priv
,
handler
);
if
(
ret
)
kfree
(
handler
);
}
...
...
@@ -116,7 +137,7 @@ nouveau_event_ref(struct nouveau_eventh *handler, struct nouveau_eventh **ref)
}
void
nouveau_event_trigger
(
struct
nouveau_event
*
event
,
int
index
)
nouveau_event_trigger
(
struct
nouveau_event
*
event
,
u32
types
,
int
index
)
{
struct
nouveau_eventh
*
handler
;
unsigned
long
flags
;
...
...
@@ -125,10 +146,15 @@ nouveau_event_trigger(struct nouveau_event *event, int index)
return
;
spin_lock_irqsave
(
&
event
->
list_lock
,
flags
);
list_for_each_entry
(
handler
,
&
event
->
index
[
index
].
list
,
head
)
{
if
(
test_bit
(
NVKM_EVENT_ENABLE
,
&
handler
->
flags
)
&&
handler
->
func
(
handler
->
priv
,
index
)
==
NVKM_EVENT_DROP
)
nouveau_event_put
(
handler
);
list_for_each_entry
(
handler
,
&
event
->
list
[
index
],
head
)
{
if
(
!
test_bit
(
NVKM_EVENT_ENABLE
,
&
handler
->
flags
))
continue
;
if
(
!
(
handler
->
types
&
types
))
continue
;
if
(
handler
->
func
(
handler
->
priv
,
handler
->
types
&
types
,
index
)
!=
NVKM_EVENT_DROP
)
continue
;
nouveau_event_put
(
handler
);
}
spin_unlock_irqrestore
(
&
event
->
list_lock
,
flags
);
}
...
...
@@ -144,20 +170,27 @@ nouveau_event_destroy(struct nouveau_event **pevent)
}
int
nouveau_event_create
(
int
index_nr
,
struct
nouveau_event
**
pevent
)
nouveau_event_create
(
int
types_nr
,
int
index_nr
,
struct
nouveau_event
**
pevent
)
{
struct
nouveau_event
*
event
;
int
i
;
event
=
*
pevent
=
kzalloc
(
sizeof
(
*
event
)
+
index_nr
*
sizeof
(
event
->
index
[
0
]),
GFP_KERNEL
);
event
=
*
pevent
=
kzalloc
(
sizeof
(
*
event
)
+
(
index_nr
*
types_nr
)
*
sizeof
(
event
->
refs
[
0
]),
GFP_KERNEL
);
if
(
!
event
)
return
-
ENOMEM
;
event
->
list
=
kmalloc
(
sizeof
(
*
event
->
list
)
*
index_nr
,
GFP_KERNEL
);
if
(
!
event
->
list
)
{
kfree
(
event
);
return
-
ENOMEM
;
}
spin_lock_init
(
&
event
->
list_lock
);
spin_lock_init
(
&
event
->
refs_lock
);
for
(
i
=
0
;
i
<
index_nr
;
i
++
)
INIT_LIST_HEAD
(
&
event
->
index
[
i
].
list
);
INIT_LIST_HEAD
(
&
event
->
list
[
i
]);
event
->
types_nr
=
types_nr
;
event
->
index_nr
=
index_nr
;
return
0
;
}
drivers/gpu/drm/nouveau/core/engine/disp/base.c
浏览文件 @
8e8832e8
...
...
@@ -48,5 +48,5 @@ nouveau_disp_create_(struct nouveau_object *parent,
if
(
ret
)
return
ret
;
return
nouveau_event_create
(
heads
,
&
disp
->
vblank
);
return
nouveau_event_create
(
1
,
heads
,
&
disp
->
vblank
);
}
drivers/gpu/drm/nouveau/core/engine/disp/nv04.c
浏览文件 @
8e8832e8
...
...
@@ -86,13 +86,13 @@ nv04_disp_sclass[] = {
******************************************************************************/
static
void
nv04_disp_vblank_enable
(
struct
nouveau_event
*
event
,
int
head
)
nv04_disp_vblank_enable
(
struct
nouveau_event
*
event
,
int
type
,
int
head
)
{
nv_wr32
(
event
->
priv
,
0x600140
+
(
head
*
0x2000
)
,
0x00000001
);
}
static
void
nv04_disp_vblank_disable
(
struct
nouveau_event
*
event
,
int
head
)
nv04_disp_vblank_disable
(
struct
nouveau_event
*
event
,
int
type
,
int
head
)
{
nv_wr32
(
event
->
priv
,
0x600140
+
(
head
*
0x2000
)
,
0x00000000
);
}
...
...
@@ -106,12 +106,12 @@ nv04_disp_intr(struct nouveau_subdev *subdev)
u32
pvideo
;
if
(
crtc0
&
0x00000001
)
{
nouveau_event_trigger
(
priv
->
base
.
vblank
,
0
);
nouveau_event_trigger
(
priv
->
base
.
vblank
,
1
,
0
);
nv_wr32
(
priv
,
0x600100
,
0x00000001
);
}
if
(
crtc1
&
0x00000001
)
{
nouveau_event_trigger
(
priv
->
base
.
vblank
,
1
);
nouveau_event_trigger
(
priv
->
base
.
vblank
,
1
,
1
);
nv_wr32
(
priv
,
0x602100
,
0x00000001
);
}
...
...
drivers/gpu/drm/nouveau/core/engine/disp/nv50.c
浏览文件 @
8e8832e8
...
...
@@ -829,13 +829,13 @@ nv50_disp_base_scanoutpos(struct nouveau_object *object, u32 mthd,
}
static
void
nv50_disp_base_vblank_enable
(
struct
nouveau_event
*
event
,
int
head
)
nv50_disp_base_vblank_enable
(
struct
nouveau_event
*
event
,
int
type
,
int
head
)
{
nv_mask
(
event
->
priv
,
0x61002c
,
(
4
<<
head
),
(
4
<<
head
));
}
static
void
nv50_disp_base_vblank_disable
(
struct
nouveau_event
*
event
,
int
head
)
nv50_disp_base_vblank_disable
(
struct
nouveau_event
*
event
,
int
type
,
int
head
)
{
nv_mask
(
event
->
priv
,
0x61002c
,
(
4
<<
head
),
0
);
}
...
...
@@ -1610,13 +1610,13 @@ nv50_disp_intr(struct nouveau_subdev *subdev)
}
if
(
intr1
&
0x00000004
)
{
nouveau_event_trigger
(
priv
->
base
.
vblank
,
0
);
nouveau_event_trigger
(
priv
->
base
.
vblank
,
1
,
0
);
nv_wr32
(
priv
,
0x610024
,
0x00000004
);
intr1
&=
~
0x00000004
;
}
if
(
intr1
&
0x00000008
)
{
nouveau_event_trigger
(
priv
->
base
.
vblank
,
1
);
nouveau_event_trigger
(
priv
->
base
.
vblank
,
1
,
1
);
nv_wr32
(
priv
,
0x610024
,
0x00000008
);
intr1
&=
~
0x00000008
;
}
...
...
drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c
浏览文件 @
8e8832e8
...
...
@@ -748,13 +748,13 @@ nvd0_disp_base_scanoutpos(struct nouveau_object *object, u32 mthd,
}
static
void
nvd0_disp_base_vblank_enable
(
struct
nouveau_event
*
event
,
int
head
)
nvd0_disp_base_vblank_enable
(
struct
nouveau_event
*
event
,
int
type
,
int
head
)
{
nv_mask
(
event
->
priv
,
0x6100c0
+
(
head
*
0x800
),
0x00000001
,
0x00000001
);
}
static
void
nvd0_disp_base_vblank_disable
(
struct
nouveau_event
*
event
,
int
head
)
nvd0_disp_base_vblank_disable
(
struct
nouveau_event
*
event
,
int
type
,
int
head
)
{
nv_mask
(
event
->
priv
,
0x6100c0
+
(
head
*
0x800
),
0x00000001
,
0x00000000
);
}
...
...
@@ -1317,7 +1317,7 @@ nvd0_disp_intr(struct nouveau_subdev *subdev)
if
(
mask
&
intr
)
{
u32
stat
=
nv_rd32
(
priv
,
0x6100bc
+
(
i
*
0x800
));
if
(
stat
&
0x00000001
)
nouveau_event_trigger
(
priv
->
base
.
vblank
,
i
);
nouveau_event_trigger
(
priv
->
base
.
vblank
,
1
,
i
);
nv_mask
(
priv
,
0x6100bc
+
(
i
*
0x800
),
0
,
0
);
nv_rd32
(
priv
,
0x6100c0
+
(
i
*
0x800
));
}
...
...
drivers/gpu/drm/nouveau/core/engine/fifo/base.c
浏览文件 @
8e8832e8
...
...
@@ -91,7 +91,7 @@ nouveau_fifo_channel_create_(struct nouveau_object *parent,
if
(
!
chan
->
user
)
return
-
EFAULT
;
nouveau_event_trigger
(
priv
->
cevent
,
0
);
nouveau_event_trigger
(
priv
->
cevent
,
1
,
0
);
chan
->
size
=
size
;
return
0
;
...
...
@@ -194,11 +194,11 @@ nouveau_fifo_create_(struct nouveau_object *parent,
if
(
!
priv
->
channel
)
return
-
ENOMEM
;
ret
=
nouveau_event_create
(
1
,
&
priv
->
cevent
);
ret
=
nouveau_event_create
(
1
,
1
,
&
priv
->
cevent
);
if
(
ret
)
return
ret
;
ret
=
nouveau_event_create
(
1
,
&
priv
->
uevent
);
ret
=
nouveau_event_create
(
1
,
1
,
&
priv
->
uevent
);
if
(
ret
)
return
ret
;
...
...
drivers/gpu/drm/nouveau/core/engine/fifo/nv04.c
浏览文件 @
8e8832e8
...
...
@@ -539,7 +539,7 @@ nv04_fifo_intr(struct nouveau_subdev *subdev)
}
if
(
status
&
0x40000000
)
{
nouveau_event_trigger
(
priv
->
base
.
uevent
,
0
);
nouveau_event_trigger
(
priv
->
base
.
uevent
,
1
,
0
);
nv_wr32
(
priv
,
0x002100
,
0x40000000
);
status
&=
~
0x40000000
;
}
...
...
drivers/gpu/drm/nouveau/core/engine/fifo/nv84.c
浏览文件 @
8e8832e8
...
...
@@ -389,14 +389,14 @@ nv84_fifo_cclass = {
******************************************************************************/
static
void
nv84_fifo_uevent_enable
(
struct
nouveau_event
*
event
,
int
index
)
nv84_fifo_uevent_enable
(
struct
nouveau_event
*
event
,
int
type
,
int
index
)
{
struct
nv84_fifo_priv
*
priv
=
event
->
priv
;
nv_mask
(
priv
,
0x002140
,
0x40000000
,
0x40000000
);
}
static
void
nv84_fifo_uevent_disable
(
struct
nouveau_event
*
event
,
int
index
)
nv84_fifo_uevent_disable
(
struct
nouveau_event
*
event
,
int
type
,
int
index
)
{
struct
nv84_fifo_priv
*
priv
=
event
->
priv
;
nv_mask
(
priv
,
0x002140
,
0x40000000
,
0x00000000
);
...
...
drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c
浏览文件 @
8e8832e8
...
...
@@ -730,7 +730,7 @@ nvc0_fifo_intr_engine_unit(struct nvc0_fifo_priv *priv, int engn)
for
(
unkn
=
0
;
unkn
<
8
;
unkn
++
)
{
u32
ints
=
(
intr
>>
(
unkn
*
0x04
))
&
inte
;
if
(
ints
&
0x1
)
{
nouveau_event_trigger
(
priv
->
base
.
uevent
,
0
);
nouveau_event_trigger
(
priv
->
base
.
uevent
,
1
,
0
);
ints
&=
~
1
;
}
if
(
ints
)
{
...
...
@@ -827,14 +827,14 @@ nvc0_fifo_intr(struct nouveau_subdev *subdev)
}
static
void
nvc0_fifo_uevent_enable
(
struct
nouveau_event
*
event
,
int
index
)
nvc0_fifo_uevent_enable
(
struct
nouveau_event
*
event
,
int
type
,
int
index
)
{
struct
nvc0_fifo_priv
*
priv
=
event
->
priv
;
nv_mask
(
priv
,
0x002140
,
0x80000000
,
0x80000000
);
}
static
void
nvc0_fifo_uevent_disable
(
struct
nouveau_event
*
event
,
int
index
)
nvc0_fifo_uevent_disable
(
struct
nouveau_event
*
event
,
int
type
,
int
index
)
{
struct
nvc0_fifo_priv
*
priv
=
event
->
priv
;
nv_mask
(
priv
,
0x002140
,
0x80000000
,
0x00000000
);
...
...
drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c
浏览文件 @
8e8832e8
...
...
@@ -859,7 +859,7 @@ nve0_fifo_intr_runlist(struct nve0_fifo_priv *priv)
static
void
nve0_fifo_intr_engine
(
struct
nve0_fifo_priv
*
priv
)
{
nouveau_event_trigger
(
priv
->
base
.
uevent
,
0
);
nouveau_event_trigger
(
priv
->
base
.
uevent
,
1
,
0
);
}
static
void
...
...
@@ -952,14 +952,14 @@ nve0_fifo_intr(struct nouveau_subdev *subdev)
}
static
void
nve0_fifo_uevent_enable
(
struct
nouveau_event
*
event
,
int
index
)
nve0_fifo_uevent_enable
(
struct
nouveau_event
*
event
,
int
type
,
int
index
)
{
struct
nve0_fifo_priv
*
priv
=
event
->
priv
;
nv_mask
(
priv
,
0x002140
,
0x80000000
,
0x80000000
);
}
static
void
nve0_fifo_uevent_disable
(
struct
nouveau_event
*
event
,
int
index
)
nve0_fifo_uevent_disable
(
struct
nouveau_event
*
event
,
int
type
,
int
index
)
{
struct
nve0_fifo_priv
*
priv
=
event
->
priv
;
nv_mask
(
priv
,
0x002140
,
0x80000000
,
0x00000000
);
...
...
drivers/gpu/drm/nouveau/core/engine/software/nv50.c
浏览文件 @
8e8832e8
...
...
@@ -124,7 +124,7 @@ nv50_software_sclass[] = {
******************************************************************************/
static
int
nv50_software_vblsem_release
(
void
*
data
,
int
head
)
nv50_software_vblsem_release
(
void
*
data
,
u32
type
,
int
head
)
{
struct
nv50_software_chan
*
chan
=
data
;
struct
nv50_software_priv
*
priv
=
(
void
*
)
nv_object
(
chan
)
->
engine
;
...
...
@@ -183,7 +183,7 @@ nv50_software_context_ctor(struct nouveau_object *parent,
return
-
ENOMEM
;
for
(
i
=
0
;
i
<
chan
->
vblank
.
nr_event
;
i
++
)
{
ret
=
nouveau_event_new
(
pdisp
->
vblank
,
i
,
pclass
->
vblank
,
ret
=
nouveau_event_new
(
pdisp
->
vblank
,
1
,
i
,
pclass
->
vblank
,
chan
,
&
chan
->
vblank
.
event
[
i
]);
if
(
ret
)
return
ret
;
...
...
drivers/gpu/drm/nouveau/core/engine/software/nv50.h
浏览文件 @
8e8832e8
...
...
@@ -19,7 +19,7 @@ int nv50_software_ctor(struct nouveau_object *, struct nouveau_object *,
struct
nv50_software_cclass
{
struct
nouveau_oclass
base
;
int
(
*
vblank
)(
void
*
,
int
);
int
(
*
vblank
)(
void
*
,
u32
,
int
);
};
struct
nv50_software_chan
{
...
...
drivers/gpu/drm/nouveau/core/engine/software/nvc0.c
浏览文件 @
8e8832e8
...
...
@@ -104,7 +104,7 @@ nvc0_software_sclass[] = {
******************************************************************************/
static
int
nvc0_software_vblsem_release
(
void
*
data
,
int
head
)
nvc0_software_vblsem_release
(
void
*
data
,
u32
type
,
int
head
)
{
struct
nv50_software_chan
*
chan
=
data
;
struct
nv50_software_priv
*
priv
=
(
void
*
)
nv_object
(
chan
)
->
engine
;
...
...
drivers/gpu/drm/nouveau/core/include/core/event.h
浏览文件 @
8e8832e8
...
...
@@ -12,32 +12,33 @@ struct nouveau_eventh {
struct
nouveau_event
*
event
;
struct
list_head
head
;
unsigned
long
flags
;
u32
types
;
int
index
;
int
(
*
func
)(
void
*
,
int
);
int
(
*
func
)(
void
*
,
u32
,
int
);
void
*
priv
;
};
struct
nouveau_event
{
spinlock_t
list_lock
;
spinlock_t
refs_lock
;
void
*
priv
;
void
(
*
enable
)(
struct
nouveau_event
*
,
int
index
);
void
(
*
disable
)(
struct
nouveau_event
*
,
int
index
);
int
(
*
check
)(
struct
nouveau_event
*
,
u32
type
,
int
index
);
void
(
*
enable
)(
struct
nouveau_event
*
,
int
type
,
int
index
);
void
(
*
disable
)(
struct
nouveau_event
*
,
int
type
,
int
index
);
int
types_nr
;
int
index_nr
;
struct
{
struct
list_head
list
;
int
refs
;
}
index
[];
spinlock_t
list_lock
;
struct
list_head
*
list
;
spinlock_t
refs_lock
;
int
refs
[];
};
int
nouveau_event_create
(
int
index_nr
,
struct
nouveau_event
**
);
int
nouveau_event_create
(
int
types_nr
,
int
index_nr
,
struct
nouveau_event
**
);
void
nouveau_event_destroy
(
struct
nouveau_event
**
);
void
nouveau_event_trigger
(
struct
nouveau_event
*
,
int
index
);
void
nouveau_event_trigger
(
struct
nouveau_event
*
,
u32
types
,
int
index
);
int
nouveau_event_new
(
struct
nouveau_event
*
,
int
index
,
int
(
*
func
)(
void
*
,
int
),
void
*
,
int
nouveau_event_new
(
struct
nouveau_event
*
,
u32
types
,
int
index
,
int
(
*
func
)(
void
*
,
u32
,
int
),
void
*
,
struct
nouveau_eventh
**
);
void
nouveau_event_ref
(
struct
nouveau_eventh
*
,
struct
nouveau_eventh
**
);
void
nouveau_event_get
(
struct
nouveau_eventh
*
);
...
...
drivers/gpu/drm/nouveau/core/subdev/gpio/base.c
浏览文件 @
8e8832e8
...
...
@@ -125,7 +125,7 @@ nouveau_gpio_create_(struct nouveau_object *parent,
if
(
ret
)
return
ret
;
ret
=
nouveau_event_create
(
lines
,
&
gpio
->
events
);
ret
=
nouveau_event_create
(
1
,
lines
,
&
gpio
->
events
);
if
(
ret
)
return
ret
;
...
...
drivers/gpu/drm/nouveau/core/subdev/gpio/nv10.c
浏览文件 @
8e8832e8
...
...
@@ -93,7 +93,7 @@ nv10_gpio_intr(struct nouveau_subdev *subdev)
for
(
i
=
0
;
(
hi
|
lo
)
&&
i
<
32
;
i
++
)
{
if
((
hi
|
lo
)
&
(
1
<<
i
))
nouveau_event_trigger
(
priv
->
base
.
events
,
i
);
nouveau_event_trigger
(
priv
->
base
.
events
,
1
,
i
);
}
nv_wr32
(
priv
,
0x001104
,
intr
);
...
...
drivers/gpu/drm/nouveau/core/subdev/gpio/nv50.c
浏览文件 @
8e8832e8
...
...
@@ -112,7 +112,7 @@ nv50_gpio_intr(struct nouveau_subdev *subdev)
for
(
i
=
0
;
(
hi
|
lo
)
&&
i
<
32
;
i
++
)
{
if
((
hi
|
lo
)
&
(
1
<<
i
))
nouveau_event_trigger
(
priv
->
base
.
events
,
i
);
nouveau_event_trigger
(
priv
->
base
.
events
,
1
,
i
);
}
nv_wr32
(
priv
,
0xe054
,
intr0
);
...
...
drivers/gpu/drm/nouveau/core/subdev/gpio/nve0.c
浏览文件 @
8e8832e8
...
...
@@ -40,7 +40,7 @@ nve0_gpio_intr(struct nouveau_subdev *subdev)
for
(
i
=
0
;
(
hi
|
lo
)
&&
i
<
32
;
i
++
)
{
if
((
hi
|
lo
)
&
(
1
<<
i
))
nouveau_event_trigger
(
priv
->
base
.
events
,
i
);
nouveau_event_trigger
(
priv
->
base
.
events
,
1
,
i
);
}
nv_wr32
(
priv
,
0xdc00
,
intr0
);
...
...
drivers/gpu/drm/nouveau/nouveau_connector.c
浏览文件 @
8e8832e8
...
...
@@ -934,7 +934,7 @@ nouveau_connector_hotplug_work(struct work_struct *work)
}
static
int
nouveau_connector_hotplug
(
void
*
data
,
int
index
)
nouveau_connector_hotplug
(
void
*
data
,
u32
type
,
int
index
)
{
struct
nouveau_connector
*
nv_connector
=
data
;
schedule_work
(
&
nv_connector
->
hpd_work
);
...
...
@@ -1013,7 +1013,8 @@ nouveau_connector_create(struct drm_device *dev, int index)
nv_connector
->
hpd
.
func
=
DCB_GPIO_UNUSED
;
if
(
nv_connector
->
hpd
.
func
!=
DCB_GPIO_UNUSED
)
{
nouveau_event_new
(
gpio
->
events
,
nv_connector
->
hpd
.
line
,
nouveau_event_new
(
gpio
->
events
,
1
,
nv_connector
->
hpd
.
line
,
nouveau_connector_hotplug
,
nv_connector
,
&
nv_connector
->
hpd_func
);
...
...
drivers/gpu/drm/nouveau/nouveau_display.c
浏览文件 @
8e8832e8
...
...
@@ -42,7 +42,7 @@
#include <core/class.h>
static
int
nouveau_display_vblank_handler
(
void
*
data
,
int
head
)
nouveau_display_vblank_handler
(
void
*
data
,
u32
type
,
int
head
)
{
struct
nouveau_drm
*
drm
=
data
;
drm_handle_vblank
(
drm
->
dev
,
head
);
...
...
@@ -178,7 +178,7 @@ nouveau_display_vblank_init(struct drm_device *dev)
return
-
ENOMEM
;
for
(
i
=
0
;
i
<
dev
->
mode_config
.
num_crtc
;
i
++
)
{
ret
=
nouveau_event_new
(
pdisp
->
vblank
,
i
,
ret
=
nouveau_event_new
(
pdisp
->
vblank
,
1
,
i
,
nouveau_display_vblank_handler
,
drm
,
&
disp
->
vblank
[
i
]);
if
(
ret
)
{
...
...
drivers/gpu/drm/nouveau/nouveau_fence.c
浏览文件 @
8e8832e8
...
...
@@ -166,7 +166,7 @@ nouveau_fence_done(struct nouveau_fence *fence)
}
static
int
nouveau_fence_wait_uevent_handler
(
void
*
data
,
int
index
)
nouveau_fence_wait_uevent_handler
(
void
*
data
,
u32
type
,
int
index
)
{
struct
nouveau_fence_priv
*
priv
=
data
;
wake_up_all
(
&
priv
->
waiting
);
...
...
@@ -183,7 +183,7 @@ nouveau_fence_wait_uevent(struct nouveau_fence *fence, bool intr)
struct
nouveau_eventh
*
handler
;
int
ret
=
0
;
ret
=
nouveau_event_new
(
pfifo
->
uevent
,
0
,
ret
=
nouveau_event_new
(
pfifo
->
uevent
,
1
,
0
,
nouveau_fence_wait_uevent_handler
,
priv
,
&
handler
);
if
(
ret
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录