Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
2ce7f386
K
Kernel
项目概览
openeuler
/
Kernel
接近 2 年 前同步成功
通知
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看板
提交
2ce7f386
编写于
5月 08, 2018
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/kms/nv50-: initial overlay support
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
88b600d4
变更
16
隐藏空白更改
内联
并排
Showing
16 changed file
with
364 addition
and
15 deletion
+364
-15
drivers/gpu/drm/nouveau/dispnv50/Kbuild
drivers/gpu/drm/nouveau/dispnv50/Kbuild
+1
-0
drivers/gpu/drm/nouveau/dispnv50/atom.h
drivers/gpu/drm/nouveau/dispnv50/atom.h
+11
-0
drivers/gpu/drm/nouveau/dispnv50/base.h
drivers/gpu/drm/nouveau/dispnv50/base.h
+0
-2
drivers/gpu/drm/nouveau/dispnv50/curs.h
drivers/gpu/drm/nouveau/dispnv50/curs.h
+0
-1
drivers/gpu/drm/nouveau/dispnv50/disp.h
drivers/gpu/drm/nouveau/dispnv50/disp.h
+3
-0
drivers/gpu/drm/nouveau/dispnv50/head507d.c
drivers/gpu/drm/nouveau/dispnv50/head507d.c
+2
-1
drivers/gpu/drm/nouveau/dispnv50/head907d.c
drivers/gpu/drm/nouveau/dispnv50/head907d.c
+2
-0
drivers/gpu/drm/nouveau/dispnv50/oimm507b.c
drivers/gpu/drm/nouveau/dispnv50/oimm507b.c
+1
-5
drivers/gpu/drm/nouveau/dispnv50/ovly.c
drivers/gpu/drm/nouveau/dispnv50/ovly.c
+1
-1
drivers/gpu/drm/nouveau/dispnv50/ovly.h
drivers/gpu/drm/nouveau/dispnv50/ovly.h
+14
-0
drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
+144
-0
drivers/gpu/drm/nouveau/dispnv50/ovly827e.c
drivers/gpu/drm/nouveau/dispnv50/ovly827e.c
+65
-1
drivers/gpu/drm/nouveau/dispnv50/ovly907e.c
drivers/gpu/drm/nouveau/dispnv50/ovly907e.c
+37
-1
drivers/gpu/drm/nouveau/dispnv50/ovly917e.c
drivers/gpu/drm/nouveau/dispnv50/ovly917e.c
+45
-0
drivers/gpu/drm/nouveau/dispnv50/wndw.c
drivers/gpu/drm/nouveau/dispnv50/wndw.c
+32
-3
drivers/gpu/drm/nouveau/dispnv50/wndw.h
drivers/gpu/drm/nouveau/dispnv50/wndw.h
+6
-0
未找到文件。
drivers/gpu/drm/nouveau/dispnv50/Kbuild
浏览文件 @
2ce7f386
...
...
@@ -40,3 +40,4 @@ nouveau-y += dispnv50/ovly.o
nouveau-y += dispnv50/ovly507e.o
nouveau-y += dispnv50/ovly827e.o
nouveau-y += dispnv50/ovly907e.o
nouveau-y += dispnv50/ovly917e.o
drivers/gpu/drm/nouveau/dispnv50/atom.h
浏览文件 @
2ce7f386
...
...
@@ -173,6 +173,7 @@ struct nv50_wndw_atom {
u8
mode
:
2
;
u8
interval
:
4
;
u8
colorspace
:
2
;
u8
format
;
u8
kind
:
7
;
u8
layout
:
1
;
...
...
@@ -186,6 +187,15 @@ struct nv50_wndw_atom {
u64
offset
[
6
];
}
image
;
struct
{
u16
sx
;
u16
sy
;
u16
sw
;
u16
sh
;
u16
dw
;
u16
dh
;
}
scale
;
struct
{
u16
x
;
u16
y
;
...
...
@@ -197,6 +207,7 @@ struct nv50_wndw_atom {
bool
sema
:
1
;
bool
xlut
:
1
;
bool
image
:
1
;
bool
scale
:
1
;
bool
point
:
1
;
};
u8
mask
;
...
...
drivers/gpu/drm/nouveau/dispnv50/base.h
浏览文件 @
2ce7f386
...
...
@@ -13,10 +13,8 @@ void base507c_release(struct nv50_wndw *, struct nv50_wndw_atom *,
struct
nv50_head_atom
*
);
void
base507c_sema_set
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
base507c_sema_clr
(
struct
nv50_wndw
*
);
void
base507c_ntfy_reset
(
struct
nouveau_bo
*
,
u32
);
void
base507c_ntfy_set
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
base507c_ntfy_clr
(
struct
nv50_wndw
*
);
int
base507c_ntfy_wait_begun
(
struct
nouveau_bo
*
,
u32
,
struct
nvif_device
*
);
void
base507c_xlut_set
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
base507c_xlut_clr
(
struct
nv50_wndw
*
);
void
base507c_image_clr
(
struct
nv50_wndw
*
);
...
...
drivers/gpu/drm/nouveau/dispnv50/curs.h
浏览文件 @
2ce7f386
...
...
@@ -6,7 +6,6 @@ int curs507a_new(struct nouveau_drm *, int, s32, struct nv50_wndw **);
int
curs507a_new_
(
const
struct
nv50_wimm_func
*
,
struct
nouveau_drm
*
,
int
head
,
s32
oclass
,
u32
interlock_data
,
struct
nv50_wndw
**
);
extern
const
struct
nv50_wimm_func
curs507a
;
int
curs907a_new
(
struct
nouveau_drm
*
,
int
,
s32
,
struct
nv50_wndw
**
);
...
...
drivers/gpu/drm/nouveau/dispnv50/disp.h
浏览文件 @
2ce7f386
...
...
@@ -16,6 +16,9 @@ struct nv50_disp {
#define NV50_DISP_BASE_SEM0(c) NV50_DISP_WNDW_SEM0(0 + (c))
#define NV50_DISP_BASE_SEM1(c) NV50_DISP_WNDW_SEM1(0 + (c))
#define NV50_DISP_BASE_NTFY(c) NV50_DISP_WNDW_NTFY(0 + (c))
#define NV50_DISP_OVLY_SEM0(c) NV50_DISP_WNDW_SEM0(4 + (c))
#define NV50_DISP_OVLY_SEM1(c) NV50_DISP_WNDW_SEM1(4 + (c))
#define NV50_DISP_OVLY_NTFY(c) NV50_DISP_WNDW_NTFY(4 + (c))
struct
nouveau_bo
*
sync
;
struct
mutex
mutex
;
...
...
drivers/gpu/drm/nouveau/dispnv50/head507d.c
浏览文件 @
2ce7f386
...
...
@@ -58,7 +58,6 @@ head507d_ovly(struct nv50_head *head, struct nv50_head_atom *asyh)
if
(
asyh
->
ovly
.
cpp
)
{
switch
(
asyh
->
ovly
.
cpp
)
{
case
8
:
bounds
|=
0x00000500
;
break
;
case
4
:
bounds
|=
0x00000300
;
break
;
case
2
:
bounds
|=
0x00000100
;
break
;
default:
...
...
@@ -66,6 +65,8 @@ head507d_ovly(struct nv50_head *head, struct nv50_head_atom *asyh)
break
;
}
bounds
|=
0x00000001
;
}
else
{
bounds
|=
0x00000100
;
}
if
((
push
=
evo_wait
(
core
,
2
)))
{
...
...
drivers/gpu/drm/nouveau/dispnv50/head907d.c
浏览文件 @
2ce7f386
...
...
@@ -82,6 +82,8 @@ head907d_ovly(struct nv50_head *head, struct nv50_head_atom *asyh)
break
;
}
bounds
|=
0x00000001
;
}
else
{
bounds
|=
0x00000100
;
}
if
((
push
=
evo_wait
(
core
,
2
)))
{
...
...
drivers/gpu/drm/nouveau/dispnv50/oimm507b.c
浏览文件 @
2ce7f386
...
...
@@ -23,10 +23,6 @@
#include <nvif/cl507b.h>
static
const
struct
nv50_wimm_func
oimm507b
=
{
};
static
int
oimm507b_init_
(
const
struct
nv50_wimm_func
*
func
,
struct
nouveau_drm
*
drm
,
s32
oclass
,
struct
nv50_wndw
*
wndw
)
...
...
@@ -52,5 +48,5 @@ oimm507b_init_(const struct nv50_wimm_func *func, struct nouveau_drm *drm,
int
oimm507b_init
(
struct
nouveau_drm
*
drm
,
s32
oclass
,
struct
nv50_wndw
*
wndw
)
{
return
oimm507b_init_
(
&
oimm507b
,
drm
,
oclass
,
wndw
);
return
oimm507b_init_
(
&
curs507a
,
drm
,
oclass
,
wndw
);
}
drivers/gpu/drm/nouveau/dispnv50/ovly.c
浏览文件 @
2ce7f386
...
...
@@ -32,7 +32,7 @@ nv50_ovly_new(struct nouveau_drm *drm, int head, struct nv50_wndw **pwndw)
int
version
;
int
(
*
new
)(
struct
nouveau_drm
*
,
int
,
s32
,
struct
nv50_wndw
**
);
}
ovlys
[]
=
{
{
GK104_DISP_OVERLAY_CONTROL_DMA
,
0
,
ovly9
0
7e_new
},
{
GK104_DISP_OVERLAY_CONTROL_DMA
,
0
,
ovly9
1
7e_new
},
{
GF110_DISP_OVERLAY_CONTROL_DMA
,
0
,
ovly907e_new
},
{
GT214_DISP_OVERLAY_CHANNEL_DMA
,
0
,
ovly827e_new
},
{
GT200_DISP_OVERLAY_CHANNEL_DMA
,
0
,
ovly827e_new
},
...
...
drivers/gpu/drm/nouveau/dispnv50/ovly.h
浏览文件 @
2ce7f386
...
...
@@ -6,11 +6,25 @@ int ovly507e_new(struct nouveau_drm *, int, s32, struct nv50_wndw **);
int
ovly507e_new_
(
const
struct
nv50_wndw_func
*
,
const
u32
*
format
,
struct
nouveau_drm
*
,
int
head
,
s32
oclass
,
u32
interlock_data
,
struct
nv50_wndw
**
);
int
ovly507e_acquire
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
,
struct
nv50_head_atom
*
);
void
ovly507e_release
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
,
struct
nv50_head_atom
*
);
void
ovly507e_ntfy_set
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
ovly507e_ntfy_clr
(
struct
nv50_wndw
*
);
void
ovly507e_image_clr
(
struct
nv50_wndw
*
);
void
ovly507e_scale_set
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
ovly507e_update
(
struct
nv50_wndw
*
,
u32
*
);
extern
const
u32
ovly827e_format
[];
void
ovly827e_ntfy_reset
(
struct
nouveau_bo
*
,
u32
);
int
ovly827e_ntfy_wait_begun
(
struct
nouveau_bo
*
,
u32
,
struct
nvif_device
*
);
extern
const
struct
nv50_wndw_func
ovly907e
;
int
ovly827e_new
(
struct
nouveau_drm
*
,
int
,
s32
,
struct
nv50_wndw
**
);
int
ovly907e_new
(
struct
nouveau_drm
*
,
int
,
s32
,
struct
nv50_wndw
**
);
int
ovly917e_new
(
struct
nouveau_drm
*
,
int
,
s32
,
struct
nv50_wndw
**
);
int
nv50_ovly_new
(
struct
nouveau_drm
*
,
int
head
,
struct
nv50_wndw
**
);
#endif
drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
浏览文件 @
2ce7f386
...
...
@@ -20,17 +20,149 @@
* OTHER DEALINGS IN THE SOFTWARE.
*/
#include "ovly.h"
#include "atom.h"
#include <drm/drm_atomic_helper.h>
#include <drm/drm_plane_helper.h>
#include <nvif/cl507e.h>
#include <nvif/event.h>
void
ovly507e_update
(
struct
nv50_wndw
*
wndw
,
u32
*
interlock
)
{
u32
*
push
;
if
((
push
=
evo_wait
(
&
wndw
->
wndw
,
2
)))
{
evo_mthd
(
push
,
0x0080
,
1
);
evo_data
(
push
,
interlock
[
NV50_DISP_INTERLOCK_CORE
]);
evo_kick
(
push
,
&
wndw
->
wndw
);
}
}
void
ovly507e_scale_set
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u32
*
push
;
if
((
push
=
evo_wait
(
&
wndw
->
wndw
,
4
)))
{
evo_mthd
(
push
,
0x00e0
,
3
);
evo_data
(
push
,
asyw
->
scale
.
sy
<<
16
|
asyw
->
scale
.
sx
);
evo_data
(
push
,
asyw
->
scale
.
sh
<<
16
|
asyw
->
scale
.
sw
);
evo_data
(
push
,
asyw
->
scale
.
dw
);
evo_kick
(
push
,
&
wndw
->
wndw
);
}
}
void
ovly507e_image_clr
(
struct
nv50_wndw
*
wndw
)
{
u32
*
push
;
if
((
push
=
evo_wait
(
&
wndw
->
wndw
,
4
)))
{
evo_mthd
(
push
,
0x0084
,
1
);
evo_data
(
push
,
0x00000000
);
evo_mthd
(
push
,
0x00c0
,
1
);
evo_data
(
push
,
0x00000000
);
evo_kick
(
push
,
&
wndw
->
wndw
);
}
}
static
void
ovly507e_image_set
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u32
*
push
;
if
((
push
=
evo_wait
(
&
wndw
->
wndw
,
12
)))
{
evo_mthd
(
push
,
0x0084
,
1
);
evo_data
(
push
,
asyw
->
image
.
interval
<<
4
);
evo_mthd
(
push
,
0x00c0
,
1
);
evo_data
(
push
,
asyw
->
image
.
handle
[
0
]);
evo_mthd
(
push
,
0x0100
,
1
);
evo_data
(
push
,
0x00000002
);
evo_mthd
(
push
,
0x0800
,
1
);
evo_data
(
push
,
asyw
->
image
.
offset
[
0
]
>>
8
);
evo_mthd
(
push
,
0x0808
,
3
);
evo_data
(
push
,
asyw
->
image
.
h
<<
16
|
asyw
->
image
.
w
);
evo_data
(
push
,
asyw
->
image
.
layout
<<
20
|
(
asyw
->
image
.
pitch
[
0
]
>>
8
)
<<
8
|
asyw
->
image
.
blocks
[
0
]
<<
8
|
asyw
->
image
.
blockh
);
evo_data
(
push
,
asyw
->
image
.
kind
<<
16
|
asyw
->
image
.
format
<<
8
|
asyw
->
image
.
colorspace
);
evo_kick
(
push
,
&
wndw
->
wndw
);
}
}
void
ovly507e_ntfy_clr
(
struct
nv50_wndw
*
wndw
)
{
u32
*
push
;
if
((
push
=
evo_wait
(
&
wndw
->
wndw
,
2
)))
{
evo_mthd
(
push
,
0x00a4
,
1
);
evo_data
(
push
,
0x00000000
);
evo_kick
(
push
,
&
wndw
->
wndw
);
}
}
void
ovly507e_ntfy_set
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u32
*
push
;
if
((
push
=
evo_wait
(
&
wndw
->
wndw
,
3
)))
{
evo_mthd
(
push
,
0x00a0
,
2
);
evo_data
(
push
,
asyw
->
ntfy
.
awaken
<<
30
|
asyw
->
ntfy
.
offset
);
evo_data
(
push
,
asyw
->
ntfy
.
handle
);
evo_kick
(
push
,
&
wndw
->
wndw
);
}
}
void
ovly507e_release
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
,
struct
nv50_head_atom
*
asyh
)
{
asyh
->
ovly
.
cpp
=
0
;
}
int
ovly507e_acquire
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
,
struct
nv50_head_atom
*
asyh
)
{
const
struct
drm_framebuffer
*
fb
=
asyw
->
state
.
fb
;
int
ret
;
ret
=
drm_atomic_helper_check_plane_state
(
&
asyw
->
state
,
&
asyh
->
state
,
DRM_PLANE_HELPER_NO_SCALING
,
DRM_PLANE_HELPER_NO_SCALING
,
true
,
true
);
if
(
ret
)
return
ret
;
asyh
->
ovly
.
cpp
=
fb
->
format
->
cpp
[
0
];
return
0
;
}
#include "nouveau_bo.h"
static
const
struct
nv50_wndw_func
ovly507e
=
{
.
acquire
=
ovly507e_acquire
,
.
release
=
ovly507e_release
,
.
ntfy_set
=
ovly507e_ntfy_set
,
.
ntfy_clr
=
ovly507e_ntfy_clr
,
.
ntfy_reset
=
base507c_ntfy_reset
,
.
ntfy_wait_begun
=
base507c_ntfy_wait_begun
,
.
image_set
=
ovly507e_image_set
,
.
image_clr
=
ovly507e_image_clr
,
.
scale_set
=
ovly507e_scale_set
,
.
update
=
ovly507e_update
,
};
static
const
u32
ovly507e_format
[]
=
{
DRM_FORMAT_YUYV
,
DRM_FORMAT_UYVY
,
DRM_FORMAT_XRGB8888
,
DRM_FORMAT_ARGB8888
,
DRM_FORMAT_XRGB1555
,
DRM_FORMAT_ARGB1555
,
0
};
...
...
@@ -61,6 +193,18 @@ ovly507e_new_(const struct nv50_wndw_func *func, const u32 *format,
return
ret
;
}
ret
=
nvif_notify_init
(
&
wndw
->
wndw
.
base
.
user
,
wndw
->
notify
.
func
,
false
,
NV50_DISP_OVERLAY_CHANNEL_DMA_V0_NTFY_UEVENT
,
&
(
struct
nvif_notify_uevent_req
)
{},
sizeof
(
struct
nvif_notify_uevent_req
),
sizeof
(
struct
nvif_notify_uevent_rep
),
&
wndw
->
notify
);
if
(
ret
)
return
ret
;
wndw
->
ntfy
=
NV50_DISP_OVLY_NTFY
(
wndw
->
id
);
wndw
->
sema
=
NV50_DISP_OVLY_SEM0
(
wndw
->
id
);
wndw
->
data
=
0x00000000
;
return
0
;
}
...
...
drivers/gpu/drm/nouveau/dispnv50/ovly827e.c
浏览文件 @
2ce7f386
...
...
@@ -20,17 +20,81 @@
* OTHER DEALINGS IN THE SOFTWARE.
*/
#include "ovly.h"
#include "atom.h"
#include <nouveau_bo.h>
#include <nvif/cl507e.h>
static
void
ovly827e_image_set
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u32
*
push
;
if
((
push
=
evo_wait
(
&
wndw
->
wndw
,
12
)))
{
evo_mthd
(
push
,
0x0084
,
1
);
evo_data
(
push
,
asyw
->
image
.
interval
<<
4
);
evo_mthd
(
push
,
0x00c0
,
1
);
evo_data
(
push
,
asyw
->
image
.
handle
[
0
]);
evo_mthd
(
push
,
0x0100
,
1
);
evo_data
(
push
,
0x00000002
);
evo_mthd
(
push
,
0x0800
,
1
);
evo_data
(
push
,
asyw
->
image
.
offset
[
0
]
>>
8
);
evo_mthd
(
push
,
0x0808
,
3
);
evo_data
(
push
,
asyw
->
image
.
h
<<
16
|
asyw
->
image
.
w
);
evo_data
(
push
,
asyw
->
image
.
layout
<<
20
|
(
asyw
->
image
.
pitch
[
0
]
>>
8
)
<<
8
|
asyw
->
image
.
blocks
[
0
]
<<
8
|
asyw
->
image
.
blockh
);
evo_data
(
push
,
asyw
->
image
.
format
<<
8
|
asyw
->
image
.
colorspace
);
evo_kick
(
push
,
&
wndw
->
wndw
);
}
}
int
ovly827e_ntfy_wait_begun
(
struct
nouveau_bo
*
bo
,
u32
offset
,
struct
nvif_device
*
device
)
{
s64
time
=
nvif_msec
(
device
,
2000ULL
,
u32
data
=
nouveau_bo_rd32
(
bo
,
offset
/
4
+
3
);
if
((
data
&
0xffff0000
)
==
0xffff0000
)
break
;
usleep_range
(
1
,
2
);
);
return
time
<
0
?
time
:
0
;
}
void
ovly827e_ntfy_reset
(
struct
nouveau_bo
*
bo
,
u32
offset
)
{
nouveau_bo_wr32
(
bo
,
offset
/
4
+
0
,
0x00000000
);
nouveau_bo_wr32
(
bo
,
offset
/
4
+
1
,
0x00000000
);
nouveau_bo_wr32
(
bo
,
offset
/
4
+
2
,
0x00000000
);
nouveau_bo_wr32
(
bo
,
offset
/
4
+
3
,
0x80000000
);
}
static
const
struct
nv50_wndw_func
ovly827e
=
{
.
acquire
=
ovly507e_acquire
,
.
release
=
ovly507e_release
,
.
ntfy_set
=
ovly507e_ntfy_set
,
.
ntfy_clr
=
ovly507e_ntfy_clr
,
.
ntfy_reset
=
ovly827e_ntfy_reset
,
.
ntfy_wait_begun
=
ovly827e_ntfy_wait_begun
,
.
image_set
=
ovly827e_image_set
,
.
image_clr
=
ovly507e_image_clr
,
.
scale_set
=
ovly507e_scale_set
,
.
update
=
ovly507e_update
,
};
const
u32
ovly827e_format
[]
=
{
DRM_FORMAT_YUYV
,
DRM_FORMAT_UYVY
,
DRM_FORMAT_XRGB8888
,
DRM_FORMAT_ARGB8888
,
DRM_FORMAT_XRGB1555
,
DRM_FORMAT_ARGB1555
,
DRM_FORMAT_XBGR2101010
,
DRM_FORMAT_ABGR2101010
,
0
};
...
...
drivers/gpu/drm/nouveau/dispnv50/ovly907e.c
浏览文件 @
2ce7f386
...
...
@@ -20,9 +20,45 @@
* OTHER DEALINGS IN THE SOFTWARE.
*/
#include "ovly.h"
#include "atom.h"
static
const
struct
nv50_wndw_func
static
void
ovly907e_image_set
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u32
*
push
;
if
((
push
=
evo_wait
(
&
wndw
->
wndw
,
12
)))
{
evo_mthd
(
push
,
0x0084
,
1
);
evo_data
(
push
,
asyw
->
image
.
interval
<<
4
);
evo_mthd
(
push
,
0x00c0
,
1
);
evo_data
(
push
,
asyw
->
image
.
handle
[
0
]);
evo_mthd
(
push
,
0x0100
,
1
);
evo_data
(
push
,
0x00000002
);
evo_mthd
(
push
,
0x0400
,
1
);
evo_data
(
push
,
asyw
->
image
.
offset
[
0
]
>>
8
);
evo_mthd
(
push
,
0x0408
,
3
);
evo_data
(
push
,
asyw
->
image
.
h
<<
16
|
asyw
->
image
.
w
);
evo_data
(
push
,
asyw
->
image
.
layout
<<
24
|
(
asyw
->
image
.
pitch
[
0
]
>>
8
)
<<
8
|
asyw
->
image
.
blocks
[
0
]
<<
8
|
asyw
->
image
.
blockh
);
evo_data
(
push
,
asyw
->
image
.
format
<<
8
|
asyw
->
image
.
colorspace
);
evo_kick
(
push
,
&
wndw
->
wndw
);
}
}
const
struct
nv50_wndw_func
ovly907e
=
{
.
acquire
=
ovly507e_acquire
,
.
release
=
ovly507e_release
,
.
ntfy_set
=
ovly507e_ntfy_set
,
.
ntfy_clr
=
ovly507e_ntfy_clr
,
.
ntfy_reset
=
ovly827e_ntfy_reset
,
.
ntfy_wait_begun
=
ovly827e_ntfy_wait_begun
,
.
image_set
=
ovly907e_image_set
,
.
image_clr
=
ovly507e_image_clr
,
.
scale_set
=
ovly507e_scale_set
,
.
update
=
ovly507e_update
,
};
int
...
...
drivers/gpu/drm/nouveau/dispnv50/ovly917e.c
0 → 100644
浏览文件 @
2ce7f386
/*
* Copyright 2018 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 "ovly.h"
static
const
u32
ovly917e_format
[]
=
{
DRM_FORMAT_YUYV
,
DRM_FORMAT_UYVY
,
DRM_FORMAT_XRGB8888
,
DRM_FORMAT_ARGB8888
,
DRM_FORMAT_XRGB1555
,
DRM_FORMAT_ARGB1555
,
DRM_FORMAT_XBGR2101010
,
DRM_FORMAT_ABGR2101010
,
DRM_FORMAT_XRGB2101010
,
DRM_FORMAT_ARGB2101010
,
0
};
int
ovly917e_new
(
struct
nouveau_drm
*
drm
,
int
head
,
s32
oclass
,
struct
nv50_wndw
**
pwndw
)
{
return
ovly507e_new_
(
&
ovly907e
,
ovly917e_format
,
drm
,
head
,
oclass
,
0x00000004
<<
(
head
*
4
),
pwndw
);
}
drivers/gpu/drm/nouveau/dispnv50/wndw.c
浏览文件 @
2ce7f386
...
...
@@ -146,6 +146,7 @@ nv50_wndw_flush_set(struct nv50_wndw *wndw, u32 *interlock,
wndw
->
func
->
xlut_set
(
wndw
,
asyw
);
}
if
(
asyw
->
set
.
scale
)
wndw
->
func
->
scale_set
(
wndw
,
asyw
);
if
(
asyw
->
set
.
point
)
{
wndw
->
immd
->
point
(
wndw
,
asyw
);
wndw
->
immd
->
update
(
wndw
,
interlock
);
...
...
@@ -180,6 +181,20 @@ nv50_wndw_atomic_check_release(struct nv50_wndw *wndw,
asyw
->
sema
.
handle
=
0
;
}
static
int
nv50_wndw_atomic_check_acquire_yuv
(
struct
nv50_wndw_atom
*
asyw
)
{
switch
(
asyw
->
state
.
fb
->
format
->
format
)
{
case
DRM_FORMAT_YUYV
:
asyw
->
image
.
format
=
0x28
;
break
;
case
DRM_FORMAT_UYVY
:
asyw
->
image
.
format
=
0x29
;
break
;
default:
WARN_ON
(
1
);
return
-
EINVAL
;
}
asyw
->
image
.
colorspace
=
1
;
return
0
;
}
static
int
nv50_wndw_atomic_check_acquire_rgb
(
struct
nv50_wndw_atom
*
asyw
)
{
...
...
@@ -197,9 +212,9 @@ nv50_wndw_atomic_check_acquire_rgb(struct nv50_wndw_atom *asyw)
case
DRM_FORMAT_XRGB2101010
:
case
DRM_FORMAT_ARGB2101010
:
asyw
->
image
.
format
=
0xdf
;
break
;
default:
WARN_ON
(
1
);
return
-
EINVAL
;
}
asyw
->
image
.
colorspace
=
0
;
return
0
;
}
...
...
@@ -221,8 +236,11 @@ nv50_wndw_atomic_check_acquire(struct nv50_wndw *wndw, bool modeset,
asyw
->
image
.
kind
=
fb
->
nvbo
->
kind
;
ret
=
nv50_wndw_atomic_check_acquire_rgb
(
asyw
);
if
(
ret
)
return
ret
;
if
(
ret
)
{
ret
=
nv50_wndw_atomic_check_acquire_yuv
(
asyw
);
if
(
ret
)
return
ret
;
}
if
(
asyw
->
image
.
kind
)
{
asyw
->
image
.
layout
=
0
;
...
...
@@ -247,6 +265,17 @@ nv50_wndw_atomic_check_acquire(struct nv50_wndw *wndw, bool modeset,
asyw
->
set
.
image
=
wndw
->
func
->
image_set
!=
NULL
;
}
if
(
wndw
->
func
->
scale_set
)
{
asyw
->
scale
.
sx
=
asyw
->
state
.
src_x
>>
16
;
asyw
->
scale
.
sy
=
asyw
->
state
.
src_y
>>
16
;
asyw
->
scale
.
sw
=
asyw
->
state
.
src_w
>>
16
;
asyw
->
scale
.
sh
=
asyw
->
state
.
src_h
>>
16
;
asyw
->
scale
.
dw
=
asyw
->
state
.
crtc_w
;
asyw
->
scale
.
dh
=
asyw
->
state
.
crtc_h
;
if
(
memcmp
(
&
armw
->
scale
,
&
asyw
->
scale
,
sizeof
(
asyw
->
scale
)))
asyw
->
set
.
scale
=
true
;
}
if
(
wndw
->
immd
)
{
asyw
->
point
.
x
=
asyw
->
state
.
crtc_x
;
asyw
->
point
.
y
=
asyw
->
state
.
crtc_y
;
...
...
drivers/gpu/drm/nouveau/dispnv50/wndw.h
浏览文件 @
2ce7f386
...
...
@@ -70,15 +70,21 @@ struct nv50_wndw_func {
void
(
*
xlut_clr
)(
struct
nv50_wndw
*
);
void
(
*
image_set
)(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
(
*
image_clr
)(
struct
nv50_wndw
*
);
void
(
*
scale_set
)(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
(
*
update
)(
struct
nv50_wndw
*
,
u32
*
interlock
);
};
extern
const
struct
drm_plane_funcs
nv50_wndw
;
void
base507c_ntfy_reset
(
struct
nouveau_bo
*
,
u32
);
int
base507c_ntfy_wait_begun
(
struct
nouveau_bo
*
,
u32
,
struct
nvif_device
*
);
struct
nv50_wimm_func
{
void
(
*
point
)(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
(
*
update
)(
struct
nv50_wndw
*
,
u32
*
interlock
);
};
extern
const
struct
nv50_wimm_func
curs507a
;
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录