Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
563737c5
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看板
提交
563737c5
编写于
12月 11, 2018
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/kms/tu104: initial support
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
c36322d2
变更
15
隐藏空白更改
内联
并排
Showing
15 changed file
with
457 addition
and
19 deletion
+457
-19
drivers/gpu/drm/nouveau/dispnv50/Kbuild
drivers/gpu/drm/nouveau/dispnv50/Kbuild
+3
-0
drivers/gpu/drm/nouveau/dispnv50/atom.h
drivers/gpu/drm/nouveau/dispnv50/atom.h
+2
-2
drivers/gpu/drm/nouveau/dispnv50/core.c
drivers/gpu/drm/nouveau/dispnv50/core.c
+1
-0
drivers/gpu/drm/nouveau/dispnv50/core.h
drivers/gpu/drm/nouveau/dispnv50/core.h
+4
-0
drivers/gpu/drm/nouveau/dispnv50/corec37d.c
drivers/gpu/drm/nouveau/dispnv50/corec37d.c
+2
-2
drivers/gpu/drm/nouveau/dispnv50/corec57d.c
drivers/gpu/drm/nouveau/dispnv50/corec57d.c
+61
-0
drivers/gpu/drm/nouveau/dispnv50/curs.c
drivers/gpu/drm/nouveau/dispnv50/curs.c
+1
-0
drivers/gpu/drm/nouveau/dispnv50/head.h
drivers/gpu/drm/nouveau/dispnv50/head.h
+10
-0
drivers/gpu/drm/nouveau/dispnv50/headc37d.c
drivers/gpu/drm/nouveau/dispnv50/headc37d.c
+5
-5
drivers/gpu/drm/nouveau/dispnv50/headc57d.c
drivers/gpu/drm/nouveau/dispnv50/headc57d.c
+206
-0
drivers/gpu/drm/nouveau/dispnv50/wimm.c
drivers/gpu/drm/nouveau/dispnv50/wimm.c
+1
-0
drivers/gpu/drm/nouveau/dispnv50/wndw.c
drivers/gpu/drm/nouveau/dispnv50/wndw.c
+1
-0
drivers/gpu/drm/nouveau/dispnv50/wndw.h
drivers/gpu/drm/nouveau/dispnv50/wndw.h
+17
-0
drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
+10
-10
drivers/gpu/drm/nouveau/dispnv50/wndwc57e.c
drivers/gpu/drm/nouveau/dispnv50/wndwc57e.c
+133
-0
未找到文件。
drivers/gpu/drm/nouveau/dispnv50/Kbuild
浏览文件 @
563737c5
...
...
@@ -7,6 +7,7 @@ nouveau-y += dispnv50/core827d.o
nouveau-y += dispnv50/core907d.o
nouveau-y += dispnv50/core917d.o
nouveau-y += dispnv50/corec37d.o
nouveau-y += dispnv50/corec57d.o
nouveau-y += dispnv50/dac507d.o
nouveau-y += dispnv50/dac907d.o
...
...
@@ -23,12 +24,14 @@ nouveau-y += dispnv50/head827d.o
nouveau-y += dispnv50/head907d.o
nouveau-y += dispnv50/head917d.o
nouveau-y += dispnv50/headc37d.o
nouveau-y += dispnv50/headc57d.o
nouveau-y += dispnv50/wimm.o
nouveau-y += dispnv50/wimmc37b.o
nouveau-y += dispnv50/wndw.o
nouveau-y += dispnv50/wndwc37e.o
nouveau-y += dispnv50/wndwc57e.o
nouveau-y += dispnv50/base.o
nouveau-y += dispnv50/base507c.o
...
...
drivers/gpu/drm/nouveau/dispnv50/atom.h
浏览文件 @
563737c5
...
...
@@ -54,7 +54,7 @@ struct nv50_head_atom {
u64
offset
:
40
;
u8
buffer
:
1
;
u8
mode
:
4
;
u
8
size
:
2
;
u
16
size
:
11
;
u8
range
:
2
;
u8
output_mode
:
2
;
void
(
*
load
)(
struct
drm_color_lut
*
,
int
size
,
void
__iomem
*
);
...
...
@@ -170,7 +170,7 @@ struct nv50_wndw_atom {
u8
buffer
:
1
;
u8
enable
:
2
;
u8
mode
:
4
;
u
8
size
:
2
;
u
16
size
:
11
;
u8
range
:
2
;
u8
output_mode
:
2
;
void
(
*
load
)(
struct
drm_color_lut
*
,
int
size
,
...
...
drivers/gpu/drm/nouveau/dispnv50/core.c
浏览文件 @
563737c5
...
...
@@ -42,6 +42,7 @@ nv50_core_new(struct nouveau_drm *drm, struct nv50_core **pcore)
int
version
;
int
(
*
new
)(
struct
nouveau_drm
*
,
s32
,
struct
nv50_core
**
);
}
cores
[]
=
{
{
TU104_DISP_CORE_CHANNEL_DMA
,
0
,
corec57d_new
},
{
GV100_DISP_CORE_CHANNEL_DMA
,
0
,
corec37d_new
},
{
GP102_DISP_CORE_CHANNEL_DMA
,
0
,
core917d_new
},
{
GP100_DISP_CORE_CHANNEL_DMA
,
0
,
core917d_new
},
...
...
drivers/gpu/drm/nouveau/dispnv50/core.h
浏览文件 @
563737c5
...
...
@@ -46,5 +46,9 @@ extern const struct nv50_outp_func sor907d;
int
core917d_new
(
struct
nouveau_drm
*
,
s32
,
struct
nv50_core
**
);
int
corec37d_new
(
struct
nouveau_drm
*
,
s32
,
struct
nv50_core
**
);
int
corec37d_ntfy_wait_done
(
struct
nouveau_bo
*
,
u32
,
struct
nvif_device
*
);
void
corec37d_update
(
struct
nv50_core
*
,
u32
*
,
bool
);
extern
const
struct
nv50_outp_func
sorc37d
;
int
corec57d_new
(
struct
nouveau_drm
*
,
s32
,
struct
nv50_core
**
);
#endif
drivers/gpu/drm/nouveau/dispnv50/corec37d.c
浏览文件 @
563737c5
...
...
@@ -24,7 +24,7 @@
#include <nouveau_bo.h>
static
void
void
corec37d_update
(
struct
nv50_core
*
core
,
u32
*
interlock
,
bool
ntfy
)
{
u32
*
push
;
...
...
@@ -71,7 +71,7 @@ corec37d_ntfy_init(struct nouveau_bo *bo, u32 offset)
nouveau_bo_wr32
(
bo
,
offset
/
4
+
3
,
0x00000000
);
}
void
static
void
corec37d_init
(
struct
nv50_core
*
core
)
{
const
u32
windows
=
8
;
/*XXX*/
...
...
drivers/gpu/drm/nouveau/dispnv50/corec57d.c
0 → 100644
浏览文件 @
563737c5
/*
* 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 "core.h"
#include "head.h"
static
void
corec57d_init
(
struct
nv50_core
*
core
)
{
const
u32
windows
=
8
;
/*XXX*/
u32
*
push
,
i
;
if
((
push
=
evo_wait
(
&
core
->
chan
,
2
+
6
*
windows
+
2
)))
{
evo_mthd
(
push
,
0x0208
,
1
);
evo_data
(
push
,
core
->
chan
.
sync
.
handle
);
for
(
i
=
0
;
i
<
windows
;
i
++
)
{
evo_mthd
(
push
,
0x1000
+
(
i
*
0x080
),
3
);
evo_data
(
push
,
i
>>
1
);
evo_data
(
push
,
0x0000000f
);
evo_data
(
push
,
0x00000000
);
evo_mthd
(
push
,
0x1010
+
(
i
*
0x080
),
1
);
evo_data
(
push
,
0x00117fff
);
}
evo_mthd
(
push
,
0x0200
,
1
);
evo_data
(
push
,
0x00000001
);
evo_kick
(
push
,
&
core
->
chan
);
}
}
static
const
struct
nv50_core_func
corec57d
=
{
.
init
=
corec57d_init
,
.
ntfy_init
=
corec37d_ntfy_init
,
.
ntfy_wait_done
=
corec37d_ntfy_wait_done
,
.
update
=
corec37d_update
,
.
head
=
&
headc57d
,
.
sor
=
&
sorc37d
,
};
int
corec57d_new
(
struct
nouveau_drm
*
drm
,
s32
oclass
,
struct
nv50_core
**
pcore
)
{
return
core507d_new_
(
&
corec57d
,
drm
,
oclass
,
pcore
);
}
drivers/gpu/drm/nouveau/dispnv50/curs.c
浏览文件 @
563737c5
...
...
@@ -31,6 +31,7 @@ nv50_curs_new(struct nouveau_drm *drm, int head, struct nv50_wndw **pwndw)
int
version
;
int
(
*
new
)(
struct
nouveau_drm
*
,
int
,
s32
,
struct
nv50_wndw
**
);
}
curses
[]
=
{
{
TU104_DISP_CURSOR
,
0
,
cursc37a_new
},
{
GV100_DISP_CURSOR
,
0
,
cursc37a_new
},
{
GK104_DISP_CURSOR
,
0
,
curs907a_new
},
{
GF110_DISP_CURSOR
,
0
,
curs907a_new
},
...
...
drivers/gpu/drm/nouveau/dispnv50/head.h
浏览文件 @
563737c5
...
...
@@ -76,4 +76,14 @@ int head917d_curs_layout(struct nv50_head *, struct nv50_wndw_atom *,
struct
nv50_head_atom
*
);
extern
const
struct
nv50_head_func
headc37d
;
void
headc37d_view
(
struct
nv50_head
*
,
struct
nv50_head_atom
*
);
void
headc37d_core_set
(
struct
nv50_head
*
,
struct
nv50_head_atom
*
);
void
headc37d_core_clr
(
struct
nv50_head
*
);
int
headc37d_curs_format
(
struct
nv50_head
*
,
struct
nv50_wndw_atom
*
,
struct
nv50_head_atom
*
);
void
headc37d_curs_set
(
struct
nv50_head
*
,
struct
nv50_head_atom
*
);
void
headc37d_curs_clr
(
struct
nv50_head
*
);
void
headc37d_dither
(
struct
nv50_head
*
,
struct
nv50_head_atom
*
);
extern
const
struct
nv50_head_func
headc57d
;
#endif
drivers/gpu/drm/nouveau/dispnv50/headc37d.c
浏览文件 @
563737c5
...
...
@@ -65,7 +65,7 @@ headc37d_procamp(struct nv50_head *head, struct nv50_head_atom *asyh)
}
}
static
void
void
headc37d_dither
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
...
...
@@ -79,7 +79,7 @@ headc37d_dither(struct nv50_head *head, struct nv50_head_atom *asyh)
}
}
static
void
void
headc37d_curs_clr
(
struct
nv50_head
*
head
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
...
...
@@ -93,7 +93,7 @@ headc37d_curs_clr(struct nv50_head *head)
}
}
static
void
void
headc37d_curs_set
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
...
...
@@ -112,7 +112,7 @@ headc37d_curs_set(struct nv50_head *head, struct nv50_head_atom *asyh)
}
}
static
int
int
headc37d_curs_format
(
struct
nv50_head
*
head
,
struct
nv50_wndw_atom
*
asyw
,
struct
nv50_head_atom
*
asyh
)
{
...
...
@@ -182,7 +182,7 @@ headc37d_mode(struct nv50_head *head, struct nv50_head_atom *asyh)
}
}
static
void
void
headc37d_view
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
...
...
drivers/gpu/drm/nouveau/dispnv50/headc57d.c
0 → 100644
浏览文件 @
563737c5
/*
* 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 "head.h"
#include "atom.h"
#include "core.h"
static
void
headc57d_or
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
u32
*
push
;
if
((
push
=
evo_wait
(
core
,
2
)))
{
/*XXX: This is a dirty hack until OR depth handling is
* improved later for deep colour etc.
*/
switch
(
asyh
->
or
.
depth
)
{
case
6
:
asyh
->
or
.
depth
=
5
;
break
;
case
5
:
asyh
->
or
.
depth
=
4
;
break
;
case
2
:
asyh
->
or
.
depth
=
1
;
break
;
case
0
:
asyh
->
or
.
depth
=
4
;
break
;
default:
WARN_ON
(
1
);
break
;
}
evo_mthd
(
push
,
0x2004
+
(
head
->
base
.
index
*
0x400
),
1
);
evo_data
(
push
,
0xfc000001
|
asyh
->
or
.
depth
<<
4
|
asyh
->
or
.
nvsync
<<
3
|
asyh
->
or
.
nhsync
<<
2
);
evo_kick
(
push
,
core
);
}
}
static
void
headc57d_procamp
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
u32
*
push
;
if
((
push
=
evo_wait
(
core
,
2
)))
{
evo_mthd
(
push
,
0x2000
+
(
head
->
base
.
index
*
0x400
),
1
);
#if 0
evo_data(push, 0x80000000 |
asyh->procamp.sat.sin << 16 |
asyh->procamp.sat.cos << 4);
#else
evo_data
(
push
,
0
);
#endif
evo_kick
(
push
,
core
);
}
}
void
headc57d_olut_clr
(
struct
nv50_head
*
head
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
u32
*
push
;
if
((
push
=
evo_wait
(
core
,
2
)))
{
evo_mthd
(
push
,
0x2288
+
(
head
->
base
.
index
*
0x400
),
1
);
evo_data
(
push
,
0x00000000
);
evo_kick
(
push
,
core
);
}
}
void
headc57d_olut_set
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
u32
*
push
;
if
((
push
=
evo_wait
(
core
,
4
)))
{
evo_mthd
(
push
,
0x2280
+
(
head
->
base
.
index
*
0x400
),
4
);
evo_data
(
push
,
asyh
->
olut
.
size
<<
8
|
asyh
->
olut
.
mode
<<
2
|
asyh
->
olut
.
output_mode
);
evo_data
(
push
,
0xffffffff
);
/* FP_NORM_SCALE. */
evo_data
(
push
,
asyh
->
olut
.
handle
);
evo_data
(
push
,
asyh
->
olut
.
offset
>>
8
);
evo_kick
(
push
,
core
);
}
}
static
void
headc57d_olut_load_8
(
struct
drm_color_lut
*
in
,
int
size
,
void
__iomem
*
mem
)
{
memset_io
(
mem
,
0x00
,
0x20
);
/* VSS header. */
mem
+=
0x20
;
while
(
size
--
)
{
u16
r
=
drm_color_lut_extract
(
in
->
red
+
0
,
16
);
u16
g
=
drm_color_lut_extract
(
in
->
green
+
0
,
16
);
u16
b
=
drm_color_lut_extract
(
in
->
blue
+
0
,
16
);
u16
ri
=
0
,
gi
=
0
,
bi
=
0
,
i
;
if
(
in
++
,
size
)
{
ri
=
(
drm_color_lut_extract
(
in
->
red
,
16
)
-
r
)
/
4
;
gi
=
(
drm_color_lut_extract
(
in
->
green
,
16
)
-
g
)
/
4
;
bi
=
(
drm_color_lut_extract
(
in
->
blue
,
16
)
-
b
)
/
4
;
}
for
(
i
=
0
;
i
<
4
;
i
++
,
mem
+=
8
)
{
writew
(
r
+
ri
*
i
,
mem
+
0
);
writew
(
g
+
gi
*
i
,
mem
+
2
);
writew
(
b
+
bi
*
i
,
mem
+
4
);
}
}
/* INTERPOLATE modes require a "next" entry to interpolate with,
* so we replicate the last entry to deal with this for now.
*/
writew
(
readw
(
mem
-
8
),
mem
+
0
);
writew
(
readw
(
mem
-
6
),
mem
+
2
);
writew
(
readw
(
mem
-
4
),
mem
+
4
);
}
static
void
headc57d_olut_load
(
struct
drm_color_lut
*
in
,
int
size
,
void
__iomem
*
mem
)
{
memset_io
(
mem
,
0x00
,
0x20
);
/* VSS header. */
mem
+=
0x20
;
for
(;
size
--
;
in
++
,
mem
+=
0x08
)
{
writew
(
drm_color_lut_extract
(
in
->
red
,
16
),
mem
+
0
);
writew
(
drm_color_lut_extract
(
in
->
green
,
16
),
mem
+
2
);
writew
(
drm_color_lut_extract
(
in
->
blue
,
16
),
mem
+
4
);
}
/* INTERPOLATE modes require a "next" entry to interpolate with,
* so we replicate the last entry to deal with this for now.
*/
writew
(
readw
(
mem
-
8
),
mem
+
0
);
writew
(
readw
(
mem
-
6
),
mem
+
2
);
writew
(
readw
(
mem
-
4
),
mem
+
4
);
}
void
headc57d_olut
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
asyh
->
olut
.
mode
=
2
;
/* DIRECT10 */
asyh
->
olut
.
size
=
4
/* VSS header. */
+
1024
+
1
/* Entries. */
;
asyh
->
olut
.
output_mode
=
1
;
/* INTERPOLATE_ENABLE. */
if
(
asyh
->
state
.
gamma_lut
&&
asyh
->
state
.
gamma_lut
->
length
/
sizeof
(
struct
drm_color_lut
)
==
256
)
asyh
->
olut
.
load
=
headc57d_olut_load_8
;
else
asyh
->
olut
.
load
=
headc57d_olut_load
;
}
static
void
headc57d_mode
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
struct
nv50_head_mode
*
m
=
&
asyh
->
mode
;
u32
*
push
;
if
((
push
=
evo_wait
(
core
,
12
)))
{
evo_mthd
(
push
,
0x2064
+
(
head
->
base
.
index
*
0x400
),
5
);
evo_data
(
push
,
(
m
->
v
.
active
<<
16
)
|
m
->
h
.
active
);
evo_data
(
push
,
(
m
->
v
.
synce
<<
16
)
|
m
->
h
.
synce
);
evo_data
(
push
,
(
m
->
v
.
blanke
<<
16
)
|
m
->
h
.
blanke
);
evo_data
(
push
,
(
m
->
v
.
blanks
<<
16
)
|
m
->
h
.
blanks
);
evo_data
(
push
,
(
m
->
v
.
blank2e
<<
16
)
|
m
->
v
.
blank2s
);
evo_mthd
(
push
,
0x200c
+
(
head
->
base
.
index
*
0x400
),
1
);
evo_data
(
push
,
m
->
clock
*
1000
);
evo_mthd
(
push
,
0x2028
+
(
head
->
base
.
index
*
0x400
),
1
);
evo_data
(
push
,
m
->
clock
*
1000
);
/*XXX: HEAD_USAGE_BOUNDS, doesn't belong here. */
evo_mthd
(
push
,
0x2030
+
(
head
->
base
.
index
*
0x400
),
1
);
evo_data
(
push
,
0x00001014
);
evo_kick
(
push
,
core
);
}
}
const
struct
nv50_head_func
headc57d
=
{
.
view
=
headc37d_view
,
.
mode
=
headc57d_mode
,
.
olut
=
headc57d_olut
,
.
olut_identity
=
true
,
.
olut_set
=
headc57d_olut_set
,
.
olut_clr
=
headc57d_olut_clr
,
.
curs_layout
=
head917d_curs_layout
,
.
curs_format
=
headc37d_curs_format
,
.
curs_set
=
headc37d_curs_set
,
.
curs_clr
=
headc37d_curs_clr
,
.
dither
=
headc37d_dither
,
.
procamp
=
headc57d_procamp
,
.
or
=
headc57d_or
,
};
drivers/gpu/drm/nouveau/dispnv50/wimm.c
浏览文件 @
563737c5
...
...
@@ -31,6 +31,7 @@ nv50_wimm_init(struct nouveau_drm *drm, struct nv50_wndw *wndw)
int
version
;
int
(
*
init
)(
struct
nouveau_drm
*
,
s32
,
struct
nv50_wndw
*
);
}
wimms
[]
=
{
{
TU104_DISP_WINDOW_IMM_CHANNEL_DMA
,
0
,
wimmc37b_init
},
{
GV100_DISP_WINDOW_IMM_CHANNEL_DMA
,
0
,
wimmc37b_init
},
{}
};
...
...
drivers/gpu/drm/nouveau/dispnv50/wndw.c
浏览文件 @
563737c5
...
...
@@ -626,6 +626,7 @@ nv50_wndw_new(struct nouveau_drm *drm, enum drm_plane_type type, int index,
int
(
*
new
)(
struct
nouveau_drm
*
,
enum
drm_plane_type
,
int
,
s32
,
struct
nv50_wndw
**
);
}
wndws
[]
=
{
{
TU104_DISP_WINDOW_CHANNEL_DMA
,
0
,
wndwc57e_new
},
{
GV100_DISP_WINDOW_CHANNEL_DMA
,
0
,
wndwc37e_new
},
{}
};
...
...
drivers/gpu/drm/nouveau/dispnv50/wndw.h
浏览文件 @
563737c5
...
...
@@ -91,6 +91,23 @@ extern const struct nv50_wimm_func curs507a;
int
wndwc37e_new
(
struct
nouveau_drm
*
,
enum
drm_plane_type
,
int
,
s32
,
struct
nv50_wndw
**
);
int
wndwc37e_new_
(
const
struct
nv50_wndw_func
*
,
struct
nouveau_drm
*
,
enum
drm_plane_type
type
,
int
index
,
s32
oclass
,
u32
heads
,
struct
nv50_wndw
**
);
int
wndwc37e_acquire
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
,
struct
nv50_head_atom
*
);
void
wndwc37e_release
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
,
struct
nv50_head_atom
*
);
void
wndwc37e_sema_set
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
wndwc37e_sema_clr
(
struct
nv50_wndw
*
);
void
wndwc37e_ntfy_set
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
wndwc37e_ntfy_clr
(
struct
nv50_wndw
*
);
void
wndwc37e_image_set
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
wndwc37e_image_clr
(
struct
nv50_wndw
*
);
void
wndwc37e_update
(
struct
nv50_wndw
*
,
u32
*
);
int
wndwc57e_new
(
struct
nouveau_drm
*
,
enum
drm_plane_type
,
int
,
s32
,
struct
nv50_wndw
**
);
int
nv50_wndw_new
(
struct
nouveau_drm
*
,
enum
drm_plane_type
,
int
index
,
struct
nv50_wndw
**
);
...
...
drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
浏览文件 @
563737c5
...
...
@@ -64,7 +64,7 @@ wndwc37e_ilut(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
asyw
->
xlut
.
i
.
load
=
head907d_olut_load
;
}
static
void
void
wndwc37e_image_clr
(
struct
nv50_wndw
*
wndw
)
{
u32
*
push
;
...
...
@@ -77,7 +77,7 @@ wndwc37e_image_clr(struct nv50_wndw *wndw)
}
}
static
void
void
wndwc37e_image_set
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u32
*
push
;
...
...
@@ -118,7 +118,7 @@ wndwc37e_image_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
evo_kick
(
push
,
&
wndw
->
wndw
);
}
static
void
void
wndwc37e_ntfy_clr
(
struct
nv50_wndw
*
wndw
)
{
u32
*
push
;
...
...
@@ -129,7 +129,7 @@ wndwc37e_ntfy_clr(struct nv50_wndw *wndw)
}
}
static
void
void
wndwc37e_ntfy_set
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u32
*
push
;
...
...
@@ -141,7 +141,7 @@ wndwc37e_ntfy_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
}
}
static
void
void
wndwc37e_sema_clr
(
struct
nv50_wndw
*
wndw
)
{
u32
*
push
;
...
...
@@ -152,7 +152,7 @@ wndwc37e_sema_clr(struct nv50_wndw *wndw)
}
}
static
void
void
wndwc37e_sema_set
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u32
*
push
;
...
...
@@ -166,7 +166,7 @@ wndwc37e_sema_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
}
}
static
void
void
wndwc37e_update
(
struct
nv50_wndw
*
wndw
,
u32
*
interlock
)
{
u32
*
push
;
...
...
@@ -184,13 +184,13 @@ wndwc37e_update(struct nv50_wndw *wndw, u32 *interlock)
}
}
static
void
void
wndwc37e_release
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
,
struct
nv50_head_atom
*
asyh
)
{
}
static
int
int
wndwc37e_acquire
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
,
struct
nv50_head_atom
*
asyh
)
{
...
...
@@ -237,7 +237,7 @@ wndwc37e = {
.
update
=
wndwc37e_update
,
};
static
int
int
wndwc37e_new_
(
const
struct
nv50_wndw_func
*
func
,
struct
nouveau_drm
*
drm
,
enum
drm_plane_type
type
,
int
index
,
s32
oclass
,
u32
heads
,
struct
nv50_wndw
**
pwndw
)
...
...
drivers/gpu/drm/nouveau/dispnv50/wndwc57e.c
0 → 100644
浏览文件 @
563737c5
/*
* 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 "wndw.h"
#include "atom.h"
#include <drm/drm_atomic_helper.h>
#include <drm/drm_plane_helper.h>
#include <nouveau_bo.h>
#include <nvif/clc37e.h>
static
void
wndwc57e_ilut_clr
(
struct
nv50_wndw
*
wndw
)
{
u32
*
push
;
if
((
push
=
evo_wait
(
&
wndw
->
wndw
,
2
)))
{
evo_mthd
(
push
,
0x0444
,
1
);
evo_data
(
push
,
0x00000000
);
evo_kick
(
push
,
&
wndw
->
wndw
);
}
}
static
void
wndwc57e_ilut_set
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u32
*
push
;
if
((
push
=
evo_wait
(
&
wndw
->
wndw
,
4
)))
{
evo_mthd
(
push
,
0x0440
,
3
);
evo_data
(
push
,
asyw
->
xlut
.
i
.
size
<<
8
|
asyw
->
xlut
.
i
.
mode
<<
2
|
asyw
->
xlut
.
i
.
output_mode
);
evo_data
(
push
,
asyw
->
xlut
.
handle
);
evo_data
(
push
,
asyw
->
xlut
.
i
.
offset
>>
8
);
evo_kick
(
push
,
&
wndw
->
wndw
);
}
}
static
u16
fixedU0_16_FP16
(
u16
fixed
)
{
int
sign
=
0
,
exp
=
0
,
man
=
0
;
if
(
fixed
)
{
while
(
--
exp
&&
!
(
fixed
&
0x8000
))
fixed
<<=
1
;
man
=
((
fixed
<<
1
)
&
0xffc0
)
>>
6
;
exp
+=
15
;
}
return
(
sign
<<
15
)
|
(
exp
<<
10
)
|
man
;
}
static
void
wndwc57e_ilut_load
(
struct
drm_color_lut
*
in
,
int
size
,
void
__iomem
*
mem
)
{
memset_io
(
mem
,
0x00
,
0x20
);
/* VSS header. */
mem
+=
0x20
;
for
(;
size
--
;
in
++
,
mem
+=
0x08
)
{
u16
r
=
fixedU0_16_FP16
(
drm_color_lut_extract
(
in
->
red
,
16
));
u16
g
=
fixedU0_16_FP16
(
drm_color_lut_extract
(
in
->
green
,
16
));
u16
b
=
fixedU0_16_FP16
(
drm_color_lut_extract
(
in
->
blue
,
16
));
writew
(
r
,
mem
+
0
);
writew
(
g
,
mem
+
2
);
writew
(
b
,
mem
+
4
);
}
/* INTERPOLATE modes require a "next" entry to interpolate with,
* so we replicate the last entry to deal with this for now.
*/
writew
(
readw
(
mem
-
8
),
mem
+
0
);
writew
(
readw
(
mem
-
6
),
mem
+
2
);
writew
(
readw
(
mem
-
4
),
mem
+
4
);
}
static
void
wndwc57e_ilut
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u16
size
=
asyw
->
ilut
->
length
/
sizeof
(
struct
drm_color_lut
);
if
(
size
==
256
)
{
asyw
->
xlut
.
i
.
mode
=
1
;
/* DIRECT8. */
}
else
{
asyw
->
xlut
.
i
.
mode
=
2
;
/* DIRECT10. */
size
=
1024
;
}
asyw
->
xlut
.
i
.
size
=
4
/* VSS header. */
+
size
+
1
/* Entries. */
;
asyw
->
xlut
.
i
.
output_mode
=
0
;
/* INTERPOLATE_DISABLE. */
asyw
->
xlut
.
i
.
load
=
wndwc57e_ilut_load
;
}
static
const
struct
nv50_wndw_func
wndwc57e
=
{
.
acquire
=
wndwc37e_acquire
,
.
release
=
wndwc37e_release
,
.
sema_set
=
wndwc37e_sema_set
,
.
sema_clr
=
wndwc37e_sema_clr
,
.
ntfy_set
=
wndwc37e_ntfy_set
,
.
ntfy_clr
=
wndwc37e_ntfy_clr
,
.
ntfy_reset
=
corec37d_ntfy_init
,
.
ntfy_wait_begun
=
base507c_ntfy_wait_begun
,
.
ilut
=
wndwc57e_ilut
,
.
ilut_identity
=
true
,
.
xlut_set
=
wndwc57e_ilut_set
,
.
xlut_clr
=
wndwc57e_ilut_clr
,
.
image_set
=
wndwc37e_image_set
,
.
image_clr
=
wndwc37e_image_clr
,
.
update
=
wndwc37e_update
,
};
int
wndwc57e_new
(
struct
nouveau_drm
*
drm
,
enum
drm_plane_type
type
,
int
index
,
s32
oclass
,
struct
nv50_wndw
**
pwndw
)
{
return
wndwc37e_new_
(
&
wndwc57e
,
drm
,
type
,
index
,
oclass
,
BIT
(
index
>>
1
),
pwndw
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录