Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
290ffeaf
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看板
提交
290ffeaf
编写于
5月 08, 2018
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/disp/gv100: initial support
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
6fb566b9
变更
26
隐藏空白更改
内联
并排
Showing
26 changed file
with
1544 addition
and
9 deletion
+1544
-9
drivers/gpu/drm/nouveau/include/nvif/class.h
drivers/gpu/drm/nouveau/include/nvif/class.h
+7
-0
drivers/gpu/drm/nouveau/include/nvif/clc37b.h
drivers/gpu/drm/nouveau/include/nvif/clc37b.h
+11
-0
drivers/gpu/drm/nouveau/include/nvif/clc37e.h
drivers/gpu/drm/nouveau/include/nvif/clc37e.h
+13
-0
drivers/gpu/drm/nouveau/include/nvkm/engine/disp.h
drivers/gpu/drm/nouveau/include/nvkm/engine/disp.h
+1
-0
drivers/gpu/drm/nouveau/nvif/disp.c
drivers/gpu/drm/nouveau/nvif/disp.c
+1
-0
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+1
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
+13
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/changv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/changv100.c
+34
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.h
+14
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregv100.c
+204
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursgv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursgv100.c
+81
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/dmacgv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/dmacgv100.c
+77
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/gv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gv100.c
+427
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c
+85
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/head.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/head.h
+4
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/headgf119.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/headgf119.c
+1
-1
drivers/gpu/drm/nouveau/nvkm/engine/disp/headgv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/headgv100.c
+105
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h
+9
-1
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
+8
-1
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.h
+6
-3
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgv100.c
+52
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.h
+1
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm200.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm200.c
+3
-3
drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgv100.c
+120
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/wimmgv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/wimmgv100.c
+82
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/wndwgv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/wndwgv100.c
+184
-0
未找到文件。
drivers/gpu/drm/nouveau/include/nvif/class.h
浏览文件 @
290ffeaf
...
...
@@ -79,6 +79,7 @@
#define GM200_DISP
/* cl5070.h */
0x00009570
#define GP100_DISP
/* cl5070.h */
0x00009770
#define GP102_DISP
/* cl5070.h */
0x00009870
#define GV100_DISP
/* cl5070.h */
0x0000c370
#define NV31_MPEG 0x00003174
#define G82_MPEG 0x00008274
...
...
@@ -90,6 +91,7 @@
#define GT214_DISP_CURSOR
/* cl507a.h */
0x0000857a
#define GF110_DISP_CURSOR
/* cl507a.h */
0x0000907a
#define GK104_DISP_CURSOR
/* cl507a.h */
0x0000917a
#define GV100_DISP_CURSOR
/* cl507a.h */
0x0000c37a
#define NV50_DISP_OVERLAY
/* cl507b.h */
0x0000507b
#define G82_DISP_OVERLAY
/* cl507b.h */
0x0000827b
...
...
@@ -97,6 +99,8 @@
#define GF110_DISP_OVERLAY
/* cl507b.h */
0x0000907b
#define GK104_DISP_OVERLAY
/* cl507b.h */
0x0000917b
#define GV100_DISP_WINDOW_IMM_CHANNEL_DMA
/* clc37b.h */
0x0000c37b
#define NV50_DISP_BASE_CHANNEL_DMA
/* cl507c.h */
0x0000507c
#define G82_DISP_BASE_CHANNEL_DMA
/* cl507c.h */
0x0000827c
#define GT200_DISP_BASE_CHANNEL_DMA
/* cl507c.h */
0x0000837c
...
...
@@ -117,6 +121,7 @@
#define GM200_DISP_CORE_CHANNEL_DMA
/* cl507d.h */
0x0000957d
#define GP100_DISP_CORE_CHANNEL_DMA
/* cl507d.h */
0x0000977d
#define GP102_DISP_CORE_CHANNEL_DMA
/* cl507d.h */
0x0000987d
#define GV100_DISP_CORE_CHANNEL_DMA
/* cl507d.h */
0x0000c37d
#define NV50_DISP_OVERLAY_CHANNEL_DMA
/* cl507e.h */
0x0000507e
#define G82_DISP_OVERLAY_CHANNEL_DMA
/* cl507e.h */
0x0000827e
...
...
@@ -125,6 +130,8 @@
#define GF110_DISP_OVERLAY_CONTROL_DMA
/* cl507e.h */
0x0000907e
#define GK104_DISP_OVERLAY_CONTROL_DMA
/* cl507e.h */
0x0000917e
#define GV100_DISP_WINDOW_CHANNEL_DMA
/* clc37e.h */
0x0000c37e
#define NV50_TESLA 0x00005097
#define G82_TESLA 0x00008297
#define GT200_TESLA 0x00008397
...
...
drivers/gpu/drm/nouveau/include/nvif/clc37b.h
0 → 100644
浏览文件 @
290ffeaf
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __NVIF_CLC37B_H__
#define __NVIF_CLC37B_H__
struct
nvc37b_window_imm_channel_dma_v0
{
__u8
version
;
__u8
index
;
__u8
pad02
[
6
];
__u64
pushbuf
;
};
#endif
drivers/gpu/drm/nouveau/include/nvif/clc37e.h
0 → 100644
浏览文件 @
290ffeaf
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __NVIF_CLC37E_H__
#define __NVIF_CLC37E_H__
struct
nvc37e_window_channel_dma_v0
{
__u8
version
;
__u8
index
;
__u8
pad02
[
6
];
__u64
pushbuf
;
};
#define NVC37E_WINDOW_CHANNEL_DMA_V0_NTFY_UEVENT 0x00
#endif
drivers/gpu/drm/nouveau/include/nvkm/engine/disp.h
浏览文件 @
290ffeaf
...
...
@@ -35,4 +35,5 @@ int gm107_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
int
gm200_disp_new
(
struct
nvkm_device
*
,
int
,
struct
nvkm_disp
**
);
int
gp100_disp_new
(
struct
nvkm_device
*
,
int
,
struct
nvkm_disp
**
);
int
gp102_disp_new
(
struct
nvkm_device
*
,
int
,
struct
nvkm_disp
**
);
int
gv100_disp_new
(
struct
nvkm_device
*
,
int
,
struct
nvkm_disp
**
);
#endif
drivers/gpu/drm/nouveau/nvif/disp.c
浏览文件 @
290ffeaf
...
...
@@ -34,6 +34,7 @@ int
nvif_disp_ctor
(
struct
nvif_device
*
device
,
s32
oclass
,
struct
nvif_disp
*
disp
)
{
static
const
struct
nvif_mclass
disps
[]
=
{
{
GV100_DISP
,
-
1
},
{
GP102_DISP
,
-
1
},
{
GP100_DISP
,
-
1
},
{
GM200_DISP
,
-
1
},
...
...
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
浏览文件 @
290ffeaf
...
...
@@ -2416,6 +2416,7 @@ nv140_chipset = {
.
therm
=
gp100_therm_new
,
.
timer
=
gk20a_timer_new
,
.
top
=
gk104_top_new
,
.
disp
=
gv100_disp_new
,
.
dma
=
gv100_dma_new
,
};
...
...
drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
浏览文件 @
290ffeaf
...
...
@@ -14,12 +14,14 @@ nvkm-y += nvkm/engine/disp/gm107.o
nvkm-y += nvkm/engine/disp/gm200.o
nvkm-y += nvkm/engine/disp/gp100.o
nvkm-y += nvkm/engine/disp/gp102.o
nvkm-y += nvkm/engine/disp/gv100.o
nvkm-y += nvkm/engine/disp/vga.o
nvkm-y += nvkm/engine/disp/head.o
nvkm-y += nvkm/engine/disp/headnv04.o
nvkm-y += nvkm/engine/disp/headnv50.o
nvkm-y += nvkm/engine/disp/headgf119.o
nvkm-y += nvkm/engine/disp/headgv100.o
nvkm-y += nvkm/engine/disp/ior.o
nvkm-y += nvkm/engine/disp/dacnv50.o
...
...
@@ -35,6 +37,7 @@ nvkm-y += nvkm/engine/disp/sorgf119.o
nvkm-y += nvkm/engine/disp/sorgk104.o
nvkm-y += nvkm/engine/disp/sorgm107.o
nvkm-y += nvkm/engine/disp/sorgm200.o
nvkm-y += nvkm/engine/disp/sorgv100.o
nvkm-y += nvkm/engine/disp/outp.o
nvkm-y += nvkm/engine/disp/dp.o
...
...
@@ -47,6 +50,7 @@ nvkm-y += nvkm/engine/disp/hdmig84.o
nvkm-y += nvkm/engine/disp/hdmigt215.o
nvkm-y += nvkm/engine/disp/hdmigf119.o
nvkm-y += nvkm/engine/disp/hdmigk104.o
nvkm-y += nvkm/engine/disp/hdmigv100.o
nvkm-y += nvkm/engine/disp/conn.o
...
...
@@ -63,13 +67,16 @@ nvkm-y += nvkm/engine/disp/rootgm107.o
nvkm-y += nvkm/engine/disp/rootgm200.o
nvkm-y += nvkm/engine/disp/rootgp100.o
nvkm-y += nvkm/engine/disp/rootgp102.o
nvkm-y += nvkm/engine/disp/rootgv100.o
nvkm-y += nvkm/engine/disp/channv50.o
nvkm-y += nvkm/engine/disp/changf119.o
nvkm-y += nvkm/engine/disp/changv100.o
nvkm-y += nvkm/engine/disp/dmacnv50.o
nvkm-y += nvkm/engine/disp/dmacgf119.o
nvkm-y += nvkm/engine/disp/dmacgp102.o
nvkm-y += nvkm/engine/disp/dmacgv100.o
nvkm-y += nvkm/engine/disp/basenv50.o
nvkm-y += nvkm/engine/disp/baseg84.o
...
...
@@ -82,6 +89,7 @@ nvkm-y += nvkm/engine/disp/coreg94.o
nvkm-y += nvkm/engine/disp/coregf119.o
nvkm-y += nvkm/engine/disp/coregk104.o
nvkm-y += nvkm/engine/disp/coregp102.o
nvkm-y += nvkm/engine/disp/coregv100.o
nvkm-y += nvkm/engine/disp/ovlynv50.o
nvkm-y += nvkm/engine/disp/ovlyg84.o
...
...
@@ -90,12 +98,17 @@ nvkm-y += nvkm/engine/disp/ovlygf119.o
nvkm-y += nvkm/engine/disp/ovlygk104.o
nvkm-y += nvkm/engine/disp/ovlygp102.o
nvkm-y += nvkm/engine/disp/wimmgv100.o
nvkm-y += nvkm/engine/disp/wndwgv100.o
nvkm-y += nvkm/engine/disp/piocnv50.o
nvkm-y += nvkm/engine/disp/piocgf119.o
nvkm-y += nvkm/engine/disp/cursnv50.o
nvkm-y += nvkm/engine/disp/cursgf119.o
nvkm-y += nvkm/engine/disp/cursgp102.o
nvkm-y += nvkm/engine/disp/cursgv100.o
nvkm-y += nvkm/engine/disp/oimmnv50.o
nvkm-y += nvkm/engine/disp/oimmgf119.o
...
...
drivers/gpu/drm/nouveau/nvkm/engine/disp/changv100.c
0 → 100644
浏览文件 @
290ffeaf
/*
* 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 "channv50.h"
const
struct
nvkm_event_func
gv100_disp_chan_uevent
=
{
.
ctor
=
nv50_disp_chan_uevent_ctor
,
};
u64
gv100_disp_chan_user
(
struct
nv50_disp_chan
*
chan
,
u64
*
psize
)
{
*
psize
=
0x1000
;
return
0x690000
+
((
chan
->
chid
.
user
-
1
)
*
0x1000
);
}
drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.h
浏览文件 @
290ffeaf
...
...
@@ -57,6 +57,11 @@ void gf119_disp_core_fini(struct nv50_disp_chan *);
extern
const
struct
nv50_disp_chan_func
gp102_disp_dmac_func
;
u64
gv100_disp_chan_user
(
struct
nv50_disp_chan
*
,
u64
*
);
int
gv100_disp_dmac_init
(
struct
nv50_disp_chan
*
);
void
gv100_disp_dmac_fini
(
struct
nv50_disp_chan
*
);
int
gv100_disp_dmac_bind
(
struct
nv50_disp_chan
*
,
struct
nvkm_object
*
,
u32
);
int
nv50_disp_curs_new_
(
const
struct
nv50_disp_chan_func
*
,
struct
nv50_disp
*
,
int
ctrl
,
int
user
,
const
struct
nvkm_oclass
*
,
void
*
argv
,
u32
argc
,
...
...
@@ -132,6 +137,15 @@ int gp102_disp_core_new(const struct nvkm_oclass *, void *, u32,
int
gp102_disp_ovly_new
(
const
struct
nvkm_oclass
*
,
void
*
,
u32
,
struct
nv50_disp
*
,
struct
nvkm_object
**
);
int
gv100_disp_curs_new
(
const
struct
nvkm_oclass
*
,
void
*
,
u32
,
struct
nv50_disp
*
,
struct
nvkm_object
**
);
int
gv100_disp_wimm_new
(
const
struct
nvkm_oclass
*
,
void
*
,
u32
,
struct
nv50_disp
*
,
struct
nvkm_object
**
);
int
gv100_disp_core_new
(
const
struct
nvkm_oclass
*
,
void
*
,
u32
,
struct
nv50_disp
*
,
struct
nvkm_object
**
);
int
gv100_disp_wndw_new
(
const
struct
nvkm_oclass
*
,
void
*
,
u32
,
struct
nv50_disp
*
,
struct
nvkm_object
**
);
struct
nv50_disp_mthd_list
{
u32
mthd
;
u32
addr
;
...
...
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregv100.c
0 → 100644
浏览文件 @
290ffeaf
/*
* 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 "channv50.h"
#include <subdev/timer.h>
const
struct
nv50_disp_mthd_list
gv100_disp_core_mthd_base
=
{
.
mthd
=
0x0000
,
.
addr
=
0x000000
,
.
data
=
{
{
0x0200
,
0x680200
},
{
0x0208
,
0x680208
},
{
0x020c
,
0x68020c
},
{
0x0210
,
0x680210
},
{
0x0214
,
0x680214
},
{
0x0218
,
0x680218
},
{
0x021c
,
0x68021c
},
{}
}
};
const
struct
nv50_disp_mthd_list
gv100_disp_core_mthd_sor
=
{
.
mthd
=
0x0020
,
.
addr
=
0x000020
,
.
data
=
{
{
0x0300
,
0x680300
},
{
0x0304
,
0x680304
},
{
0x0308
,
0x680308
},
{
0x030c
,
0x68030c
},
{}
}
};
static
const
struct
nv50_disp_mthd_list
gv100_disp_core_mthd_wndw
=
{
.
mthd
=
0x0080
,
.
addr
=
0x000080
,
.
data
=
{
{
0x1000
,
0x681000
},
{
0x1004
,
0x681004
},
{
0x1008
,
0x681008
},
{
0x100c
,
0x68100c
},
{
0x1010
,
0x681010
},
{}
}
};
static
const
struct
nv50_disp_mthd_list
gv100_disp_core_mthd_head
=
{
.
mthd
=
0x0400
,
.
addr
=
0x000400
,
.
data
=
{
{
0x2000
,
0x682000
},
{
0x2004
,
0x682004
},
{
0x2008
,
0x682008
},
{
0x200c
,
0x68200c
},
{
0x2014
,
0x682014
},
{
0x2018
,
0x682018
},
{
0x201c
,
0x68201c
},
{
0x2020
,
0x682020
},
{
0x2028
,
0x682028
},
{
0x202c
,
0x68202c
},
{
0x2030
,
0x682030
},
{
0x2038
,
0x682038
},
{
0x203c
,
0x68203c
},
{
0x2048
,
0x682048
},
{
0x204c
,
0x68204c
},
{
0x2050
,
0x682050
},
{
0x2054
,
0x682054
},
{
0x2058
,
0x682058
},
{
0x205c
,
0x68205c
},
{
0x2060
,
0x682060
},
{
0x2064
,
0x682064
},
{
0x2068
,
0x682068
},
{
0x206c
,
0x68206c
},
{
0x2070
,
0x682070
},
{
0x2074
,
0x682074
},
{
0x2078
,
0x682078
},
{
0x207c
,
0x68207c
},
{
0x2080
,
0x682080
},
{
0x2088
,
0x682088
},
{
0x2090
,
0x682090
},
{
0x209c
,
0x68209c
},
{
0x20a0
,
0x6820a0
},
{
0x20a4
,
0x6820a4
},
{
0x20a8
,
0x6820a8
},
{
0x20ac
,
0x6820ac
},
{
0x218c
,
0x68218c
},
{
0x2194
,
0x682194
},
{
0x2198
,
0x682198
},
{
0x219c
,
0x68219c
},
{
0x21a0
,
0x6821a0
},
{
0x21a4
,
0x6821a4
},
{
0x2214
,
0x682214
},
{
0x2218
,
0x682218
},
{}
}
};
static
const
struct
nv50_disp_chan_mthd
gv100_disp_core_mthd
=
{
.
name
=
"Core"
,
.
addr
=
0x000000
,
.
prev
=
0x008000
,
.
data
=
{
{
"Global"
,
1
,
&
gv100_disp_core_mthd_base
},
{
"SOR"
,
4
,
&
gv100_disp_core_mthd_sor
},
{
"WINDOW"
,
8
,
&
gv100_disp_core_mthd_wndw
},
{
"HEAD"
,
4
,
&
gv100_disp_core_mthd_head
},
{}
}
};
static
int
gv100_disp_core_idle
(
struct
nv50_disp_chan
*
chan
)
{
struct
nvkm_device
*
device
=
chan
->
disp
->
base
.
engine
.
subdev
.
device
;
nvkm_msec
(
device
,
2000
,
u32
stat
=
nvkm_rd32
(
device
,
0x610630
);
if
((
stat
&
0x001f0000
)
==
0x000b0000
)
return
0
;
);
return
-
EBUSY
;
}
static
u64
gv100_disp_core_user
(
struct
nv50_disp_chan
*
chan
,
u64
*
psize
)
{
*
psize
=
0x10000
;
return
0x680000
;
}
static
void
gv100_disp_core_intr
(
struct
nv50_disp_chan
*
chan
,
bool
en
)
{
struct
nvkm_device
*
device
=
chan
->
disp
->
base
.
engine
.
subdev
.
device
;
const
u32
mask
=
0x00000001
;
const
u32
data
=
en
?
mask
:
0
;
nvkm_mask
(
device
,
0x611dac
,
mask
,
data
);
}
static
void
gv100_disp_core_fini
(
struct
nv50_disp_chan
*
chan
)
{
struct
nvkm_device
*
device
=
chan
->
disp
->
base
.
engine
.
subdev
.
device
;
nvkm_mask
(
device
,
0x6104e0
,
0x00000010
,
0x00000000
);
gv100_disp_core_idle
(
chan
);
nvkm_mask
(
device
,
0x6104e0
,
0x00000002
,
0x00000000
);
}
static
int
gv100_disp_core_init
(
struct
nv50_disp_chan
*
chan
)
{
struct
nvkm_subdev
*
subdev
=
&
chan
->
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
nvkm_wr32
(
device
,
0x610b24
,
lower_32_bits
(
chan
->
push
));
nvkm_wr32
(
device
,
0x610b20
,
upper_32_bits
(
chan
->
push
));
nvkm_wr32
(
device
,
0x610b28
,
0x00000001
);
nvkm_wr32
(
device
,
0x610b2c
,
0x00000040
);
nvkm_mask
(
device
,
0x6104e0
,
0x00000010
,
0x00000010
);
nvkm_wr32
(
device
,
0x680000
,
0x00000000
);
nvkm_wr32
(
device
,
0x6104e0
,
0x00000013
);
return
gv100_disp_core_idle
(
chan
);
}
static
const
struct
nv50_disp_chan_func
gv100_disp_core
=
{
.
init
=
gv100_disp_core_init
,
.
fini
=
gv100_disp_core_fini
,
.
intr
=
gv100_disp_core_intr
,
.
user
=
gv100_disp_core_user
,
.
bind
=
gv100_disp_dmac_bind
,
};
int
gv100_disp_core_new
(
const
struct
nvkm_oclass
*
oclass
,
void
*
argv
,
u32
argc
,
struct
nv50_disp
*
disp
,
struct
nvkm_object
**
pobject
)
{
return
nv50_disp_core_new_
(
&
gv100_disp_core
,
&
gv100_disp_core_mthd
,
disp
,
0
,
oclass
,
argv
,
argc
,
pobject
);
}
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursgv100.c
0 → 100644
浏览文件 @
290ffeaf
/*
* 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 "channv50.h"
#include <subdev/timer.h>
static
int
gv100_disp_curs_idle
(
struct
nv50_disp_chan
*
chan
)
{
struct
nvkm_device
*
device
=
chan
->
disp
->
base
.
engine
.
subdev
.
device
;
const
u32
soff
=
(
chan
->
chid
.
ctrl
-
1
)
*
0x04
;
nvkm_msec
(
device
,
2000
,
u32
stat
=
nvkm_rd32
(
device
,
0x610664
+
soff
);
if
((
stat
&
0x00070000
)
==
0x00040000
)
return
0
;
);
return
-
EBUSY
;
}
static
void
gv100_disp_curs_intr
(
struct
nv50_disp_chan
*
chan
,
bool
en
)
{
struct
nvkm_device
*
device
=
chan
->
disp
->
base
.
engine
.
subdev
.
device
;
const
u32
mask
=
0x00010000
<<
chan
->
head
;
const
u32
data
=
en
?
mask
:
0
;
nvkm_mask
(
device
,
0x611dac
,
mask
,
data
);
}
static
void
gv100_disp_curs_fini
(
struct
nv50_disp_chan
*
chan
)
{
struct
nvkm_device
*
device
=
chan
->
disp
->
base
.
engine
.
subdev
.
device
;
const
u32
hoff
=
chan
->
chid
.
ctrl
*
4
;
nvkm_mask
(
device
,
0x6104e0
+
hoff
,
0x00000010
,
0x00000010
);
gv100_disp_curs_idle
(
chan
);
nvkm_mask
(
device
,
0x6104e0
+
hoff
,
0x00000001
,
0x00000000
);
}
static
int
gv100_disp_curs_init
(
struct
nv50_disp_chan
*
chan
)
{
struct
nvkm_subdev
*
subdev
=
&
chan
->
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
nvkm_wr32
(
device
,
0x6104e0
+
chan
->
chid
.
ctrl
*
4
,
0x00000001
);
return
gv100_disp_curs_idle
(
chan
);
}
static
const
struct
nv50_disp_chan_func
gv100_disp_curs
=
{
.
init
=
gv100_disp_curs_init
,
.
fini
=
gv100_disp_curs_fini
,
.
intr
=
gv100_disp_curs_intr
,
.
user
=
gv100_disp_chan_user
,
};
int
gv100_disp_curs_new
(
const
struct
nvkm_oclass
*
oclass
,
void
*
argv
,
u32
argc
,
struct
nv50_disp
*
disp
,
struct
nvkm_object
**
pobject
)
{
return
nv50_disp_curs_new_
(
&
gv100_disp_curs
,
disp
,
73
,
73
,
oclass
,
argv
,
argc
,
pobject
);
}
drivers/gpu/drm/nouveau/nvkm/engine/disp/dmacgv100.c
0 → 100644
浏览文件 @
290ffeaf
/*
* 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 "channv50.h"
#include <core/ramht.h>
#include <subdev/timer.h>
static
int
gv100_disp_dmac_idle
(
struct
nv50_disp_chan
*
chan
)
{
struct
nvkm_device
*
device
=
chan
->
disp
->
base
.
engine
.
subdev
.
device
;
const
u32
soff
=
(
chan
->
chid
.
ctrl
-
1
)
*
0x04
;
nvkm_msec
(
device
,
2000
,
u32
stat
=
nvkm_rd32
(
device
,
0x610664
+
soff
);
if
((
stat
&
0x000f0000
)
==
0x00040000
)
return
0
;
);
return
-
EBUSY
;
}
int
gv100_disp_dmac_bind
(
struct
nv50_disp_chan
*
chan
,
struct
nvkm_object
*
object
,
u32
handle
)
{
return
nvkm_ramht_insert
(
chan
->
disp
->
ramht
,
object
,
chan
->
chid
.
user
,
-
9
,
handle
,
chan
->
chid
.
user
<<
25
|
0x00000040
);
}
void
gv100_disp_dmac_fini
(
struct
nv50_disp_chan
*
chan
)
{
struct
nvkm_device
*
device
=
chan
->
disp
->
base
.
engine
.
subdev
.
device
;
const
u32
coff
=
chan
->
chid
.
ctrl
*
0x04
;
nvkm_mask
(
device
,
0x6104e0
+
coff
,
0x00000010
,
0x00000000
);
gv100_disp_dmac_idle
(
chan
);
nvkm_mask
(
device
,
0x6104e0
+
coff
,
0x00000002
,
0x00000000
);
}
int
gv100_disp_dmac_init
(
struct
nv50_disp_chan
*
chan
)
{
struct
nvkm_subdev
*
subdev
=
&
chan
->
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
const
u32
uoff
=
(
chan
->
chid
.
ctrl
-
1
)
*
0x1000
;
const
u32
poff
=
chan
->
chid
.
ctrl
*
0x10
;
const
u32
coff
=
chan
->
chid
.
ctrl
*
0x04
;
nvkm_wr32
(
device
,
0x610b24
+
poff
,
lower_32_bits
(
chan
->
push
));
nvkm_wr32
(
device
,
0x610b20
+
poff
,
upper_32_bits
(
chan
->
push
));
nvkm_wr32
(
device
,
0x610b28
+
poff
,
0x00000001
);
nvkm_wr32
(
device
,
0x610b2c
+
poff
,
0x00000040
);
nvkm_mask
(
device
,
0x6104e0
+
coff
,
0x00000010
,
0x00000010
);
nvkm_wr32
(
device
,
0x690000
+
uoff
,
0x00000000
);
nvkm_wr32
(
device
,
0x6104e0
+
coff
,
0x00000013
);
return
gv100_disp_dmac_idle
(
chan
);
}
drivers/gpu/drm/nouveau/nvkm/engine/disp/gv100.c
0 → 100644
浏览文件 @
290ffeaf
/*
* 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 "nv50.h"
#include "head.h"
#include "ior.h"
#include "channv50.h"
#include "rootnv50.h"
#include <core/gpuobj.h>
#include <subdev/timer.h>
static
int
gv100_disp_wndw_cnt
(
struct
nvkm_disp
*
disp
,
unsigned
long
*
pmask
)
{
struct
nvkm_device
*
device
=
disp
->
engine
.
subdev
.
device
;
*
pmask
=
nvkm_rd32
(
device
,
0x610064
);
return
(
nvkm_rd32
(
device
,
0x610074
)
&
0x03f00000
)
>>
20
;
}
static
void
gv100_disp_super
(
struct
work_struct
*
work
)
{
struct
nv50_disp
*
disp
=
container_of
(
work
,
struct
nv50_disp
,
supervisor
);
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
struct
nvkm_head
*
head
;
u32
stat
=
nvkm_rd32
(
device
,
0x6107a8
);
u32
mask
[
4
];
nvkm_debug
(
subdev
,
"supervisor %d: %08x
\n
"
,
ffs
(
disp
->
super
),
stat
);
list_for_each_entry
(
head
,
&
disp
->
base
.
head
,
head
)
{
mask
[
head
->
id
]
=
nvkm_rd32
(
device
,
0x6107ac
+
(
head
->
id
*
4
));
HEAD_DBG
(
head
,
"%08x"
,
mask
[
head
->
id
]);
}
if
(
disp
->
super
&
0x00000001
)
{
nv50_disp_chan_mthd
(
disp
->
chan
[
0
],
NV_DBG_DEBUG
);
nv50_disp_super_1
(
disp
);
list_for_each_entry
(
head
,
&
disp
->
base
.
head
,
head
)
{
if
(
!
(
mask
[
head
->
id
]
&
0x00001000
))
continue
;
nv50_disp_super_1_0
(
disp
,
head
);
}
}
else
if
(
disp
->
super
&
0x00000002
)
{
list_for_each_entry
(
head
,
&
disp
->
base
.
head
,
head
)
{
if
(
!
(
mask
[
head
->
id
]
&
0x00001000
))
continue
;
nv50_disp_super_2_0
(
disp
,
head
);
}
nvkm_outp_route
(
&
disp
->
base
);
list_for_each_entry
(
head
,
&
disp
->
base
.
head
,
head
)
{
if
(
!
(
mask
[
head
->
id
]
&
0x00010000
))
continue
;
nv50_disp_super_2_1
(
disp
,
head
);
}
list_for_each_entry
(
head
,
&
disp
->
base
.
head
,
head
)
{
if
(
!
(
mask
[
head
->
id
]
&
0x00001000
))
continue
;
nv50_disp_super_2_2
(
disp
,
head
);
}
}
else
if
(
disp
->
super
&
0x00000004
)
{
list_for_each_entry
(
head
,
&
disp
->
base
.
head
,
head
)
{
if
(
!
(
mask
[
head
->
id
]
&
0x00001000
))
continue
;
nv50_disp_super_3_0
(
disp
,
head
);
}
}
list_for_each_entry
(
head
,
&
disp
->
base
.
head
,
head
)
nvkm_wr32
(
device
,
0x6107ac
+
(
head
->
id
*
4
),
0x00000000
);
nvkm_wr32
(
device
,
0x6107a8
,
0x80000000
);
}
static
void
gv100_disp_exception
(
struct
nv50_disp
*
disp
,
int
chid
)
{
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
u32
stat
=
nvkm_rd32
(
device
,
0x611020
+
(
chid
*
12
));
u32
type
=
(
stat
&
0x00007000
)
>>
12
;
u32
mthd
=
(
stat
&
0x00000fff
)
<<
2
;
u32
data
=
nvkm_rd32
(
device
,
0x611024
+
(
chid
*
12
));
u32
code
=
nvkm_rd32
(
device
,
0x611028
+
(
chid
*
12
));
nvkm_error
(
subdev
,
"chid %d %08x [type %d mthd %04x] "
"data %08x code %08x
\n
"
,
chid
,
stat
,
type
,
mthd
,
data
,
code
);
if
(
chid
<
ARRAY_SIZE
(
disp
->
chan
)
&&
disp
->
chan
[
chid
])
{
switch
(
mthd
)
{
case
0x0200
:
nv50_disp_chan_mthd
(
disp
->
chan
[
chid
],
NV_DBG_ERROR
);
break
;
default:
break
;
}
}
nvkm_wr32
(
device
,
0x611020
+
(
chid
*
12
),
0x90000000
);
}
static
void
gv100_disp_intr_ctrl_disp
(
struct
nv50_disp
*
disp
)
{
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
u32
stat
=
nvkm_rd32
(
device
,
0x611c30
);
if
(
stat
&
0x00000007
)
{
disp
->
super
=
(
stat
&
0x00000007
);
queue_work
(
disp
->
wq
,
&
disp
->
supervisor
);
nvkm_wr32
(
device
,
0x611860
,
disp
->
super
);
stat
&=
~
0x00000007
;
}
/*TODO: I would guess this is VBIOS_RELEASE, however, NFI how to
* ACK it, nor does RM appear to bother.
*/
if
(
stat
&
0x00000008
)
stat
&=
~
0x00000008
;
if
(
stat
&
0x00000100
)
{
unsigned
long
wndws
=
nvkm_rd32
(
device
,
0x611858
);
unsigned
long
other
=
nvkm_rd32
(
device
,
0x61185c
);
int
wndw
;
nvkm_wr32
(
device
,
0x611858
,
wndws
);
nvkm_wr32
(
device
,
0x61185c
,
other
);
/* AWAKEN_OTHER_CORE. */
if
(
other
&
0x00000001
)
nv50_disp_chan_uevent_send
(
disp
,
0
);
/* AWAKEN_WIN_CH(n). */
for_each_set_bit
(
wndw
,
&
wndws
,
disp
->
wndw
.
nr
)
{
nv50_disp_chan_uevent_send
(
disp
,
1
+
wndw
);
}
}
if
(
stat
)
nvkm_warn
(
subdev
,
"ctrl %08x
\n
"
,
stat
);
}
static
void
gv100_disp_intr_exc_other
(
struct
nv50_disp
*
disp
)
{
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
u32
stat
=
nvkm_rd32
(
device
,
0x611854
);
unsigned
long
mask
;
int
head
;
if
(
stat
&
0x00000001
)
{
nvkm_wr32
(
device
,
0x611854
,
0x00000001
);
gv100_disp_exception
(
disp
,
0
);
stat
&=
~
0x00000001
;
}
if
((
mask
=
(
stat
&
0x00ff0000
)
>>
16
))
{
for_each_set_bit
(
head
,
&
mask
,
disp
->
wndw
.
nr
)
{
nvkm_wr32
(
device
,
0x611854
,
0x00010000
<<
head
);
gv100_disp_exception
(
disp
,
73
+
head
);
stat
&=
~
(
0x00010000
<<
head
);
}
}
if
(
stat
)
{
nvkm_warn
(
subdev
,
"exception %08x
\n
"
,
stat
);
nvkm_wr32
(
device
,
0x611854
,
stat
);
}
}
static
void
gv100_disp_intr_exc_winim
(
struct
nv50_disp
*
disp
)
{
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
unsigned
long
stat
=
nvkm_rd32
(
device
,
0x611850
);
int
wndw
;
for_each_set_bit
(
wndw
,
&
stat
,
disp
->
wndw
.
nr
)
{
nvkm_wr32
(
device
,
0x611850
,
BIT
(
wndw
));
gv100_disp_exception
(
disp
,
33
+
wndw
);
stat
&=
~
BIT
(
wndw
);
}
if
(
stat
)
{
nvkm_warn
(
subdev
,
"wimm %08x
\n
"
,
(
u32
)
stat
);
nvkm_wr32
(
device
,
0x611850
,
stat
);
}
}
static
void
gv100_disp_intr_exc_win
(
struct
nv50_disp
*
disp
)
{
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
unsigned
long
stat
=
nvkm_rd32
(
device
,
0x61184c
);
int
wndw
;
for_each_set_bit
(
wndw
,
&
stat
,
disp
->
wndw
.
nr
)
{
nvkm_wr32
(
device
,
0x61184c
,
BIT
(
wndw
));
gv100_disp_exception
(
disp
,
1
+
wndw
);
stat
&=
~
BIT
(
wndw
);
}
if
(
stat
)
{
nvkm_warn
(
subdev
,
"wndw %08x
\n
"
,
(
u32
)
stat
);
nvkm_wr32
(
device
,
0x61184c
,
stat
);
}
}
static
void
gv100_disp_intr_head_timing
(
struct
nv50_disp
*
disp
,
int
head
)
{
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
u32
stat
=
nvkm_rd32
(
device
,
0x611800
+
(
head
*
0x04
));
/* LAST_DATA, LOADV. */
if
(
stat
&
0x00000003
)
{
nvkm_wr32
(
device
,
0x611800
+
(
head
*
0x04
),
stat
&
0x00000003
);
stat
&=
~
0x00000003
;
}
if
(
stat
&
0x00000004
)
{
nvkm_disp_vblank
(
&
disp
->
base
,
head
);
nvkm_wr32
(
device
,
0x611800
+
(
head
*
0x04
),
0x00000004
);
stat
&=
~
0x00000004
;
}
if
(
stat
)
{
nvkm_warn
(
subdev
,
"head %08x
\n
"
,
stat
);
nvkm_wr32
(
device
,
0x611800
+
(
head
*
0x04
),
stat
);
}
}
static
void
gv100_disp_intr
(
struct
nv50_disp
*
disp
)
{
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
u32
stat
=
nvkm_rd32
(
device
,
0x611ec0
);
unsigned
long
mask
;
int
head
;
if
((
mask
=
(
stat
&
0x000000ff
)))
{
for_each_set_bit
(
head
,
&
mask
,
8
)
{
gv100_disp_intr_head_timing
(
disp
,
head
);
stat
&=
~
BIT
(
head
);
}
}
if
(
stat
&
0x00000200
)
{
gv100_disp_intr_exc_win
(
disp
);
stat
&=
~
0x00000200
;
}
if
(
stat
&
0x00000400
)
{
gv100_disp_intr_exc_winim
(
disp
);
stat
&=
~
0x00000400
;
}
if
(
stat
&
0x00000800
)
{
gv100_disp_intr_exc_other
(
disp
);
stat
&=
~
0x00000800
;
}
if
(
stat
&
0x00001000
)
{
gv100_disp_intr_ctrl_disp
(
disp
);
stat
&=
~
0x00001000
;
}
if
(
stat
)
nvkm_warn
(
subdev
,
"intr %08x
\n
"
,
stat
);
}
static
void
gv100_disp_fini
(
struct
nv50_disp
*
disp
)
{
struct
nvkm_device
*
device
=
disp
->
base
.
engine
.
subdev
.
device
;
nvkm_wr32
(
device
,
0x611db0
,
0x00000000
);
}
static
int
gv100_disp_init
(
struct
nv50_disp
*
disp
)
{
struct
nvkm_device
*
device
=
disp
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_head
*
head
;
int
i
,
j
;
u32
tmp
;
/* Claim ownership of display. */
if
(
nvkm_rd32
(
device
,
0x6254e8
)
&
0x00000002
)
{
nvkm_mask
(
device
,
0x6254e8
,
0x00000001
,
0x00000000
);
if
(
nvkm_msec
(
device
,
2000
,
if
(
!
(
nvkm_rd32
(
device
,
0x6254e8
)
&
0x00000002
))
break
;
)
<
0
)
return
-
EBUSY
;
}
/* Lock pin capabilities. */
tmp
=
nvkm_rd32
(
device
,
0x610068
);
nvkm_wr32
(
device
,
0x640008
,
tmp
);
/* SOR capabilities. */
for
(
i
=
0
;
i
<
disp
->
sor
.
nr
;
i
++
)
{
tmp
=
nvkm_rd32
(
device
,
0x61c000
+
(
i
*
0x800
));
nvkm_mask
(
device
,
0x640000
,
0x00000100
<<
i
,
0x00000100
<<
i
);
nvkm_wr32
(
device
,
0x640144
+
(
i
*
0x08
),
tmp
);
}
/* Head capabilities. */
list_for_each_entry
(
head
,
&
disp
->
base
.
head
,
head
)
{
const
int
id
=
head
->
id
;
/* RG. */
tmp
=
nvkm_rd32
(
device
,
0x616300
+
(
id
*
0x800
));
nvkm_wr32
(
device
,
0x640048
+
(
id
*
0x020
),
tmp
);
/* POSTCOMP. */
for
(
j
=
0
;
j
<
6
*
4
;
j
+=
4
)
{
tmp
=
nvkm_rd32
(
device
,
0x616100
+
(
id
*
0x800
)
+
j
);
nvkm_wr32
(
device
,
0x640030
+
(
id
*
0x20
)
+
j
,
tmp
);
}
}
/* Window capabilities. */
for
(
i
=
0
;
i
<
disp
->
wndw
.
nr
;
i
++
)
{
nvkm_mask
(
device
,
0x640004
,
1
<<
i
,
1
<<
i
);
for
(
j
=
0
;
j
<
6
*
4
;
j
+=
4
)
{
tmp
=
nvkm_rd32
(
device
,
0x630050
+
(
i
*
0x800
)
+
j
);
nvkm_wr32
(
device
,
0x6401e4
+
(
i
*
0x20
)
+
j
,
tmp
);
}
}
/* IHUB capabilities. */
for
(
i
=
0
;
i
<
4
;
i
++
)
{
tmp
=
nvkm_rd32
(
device
,
0x62e000
+
(
i
*
0x04
));
nvkm_wr32
(
device
,
0x640010
+
(
i
*
0x04
),
tmp
);
}
nvkm_mask
(
device
,
0x610078
,
0x00000001
,
0x00000001
);
/* Setup instance memory. */
switch
(
nvkm_memory_target
(
disp
->
inst
->
memory
))
{
case
NVKM_MEM_TARGET_VRAM
:
tmp
=
0x00000001
;
break
;
case
NVKM_MEM_TARGET_NCOH
:
tmp
=
0x00000002
;
break
;
case
NVKM_MEM_TARGET_HOST
:
tmp
=
0x00000003
;
break
;
default:
break
;
}
nvkm_wr32
(
device
,
0x610010
,
0x00000008
|
tmp
);
nvkm_wr32
(
device
,
0x610014
,
disp
->
inst
->
addr
>>
16
);
/* CTRL_DISP: AWAKEN, ERROR, SUPERVISOR[1-3]. */
nvkm_wr32
(
device
,
0x611cf0
,
0x00000187
);
/* MSK. */
nvkm_wr32
(
device
,
0x611db0
,
0x00000187
);
/* EN. */
/* EXC_OTHER: CURSn, CORE. */
nvkm_wr32
(
device
,
0x611cec
,
disp
->
head
.
mask
<<
16
|
0x00000001
);
/* MSK. */
nvkm_wr32
(
device
,
0x611dac
,
0x00000000
);
/* EN. */
/* EXC_WINIM. */
nvkm_wr32
(
device
,
0x611ce8
,
disp
->
wndw
.
mask
);
/* MSK. */
nvkm_wr32
(
device
,
0x611da8
,
0x00000000
);
/* EN. */
/* EXC_WIN. */
nvkm_wr32
(
device
,
0x611ce4
,
disp
->
wndw
.
mask
);
/* MSK. */
nvkm_wr32
(
device
,
0x611da4
,
0x00000000
);
/* EN. */
/* HEAD_TIMING(n): VBLANK. */
list_for_each_entry
(
head
,
&
disp
->
base
.
head
,
head
)
{
const
u32
hoff
=
head
->
id
*
4
;
nvkm_wr32
(
device
,
0x611cc0
+
hoff
,
0x00000004
);
/* MSK. */
nvkm_wr32
(
device
,
0x611d80
+
hoff
,
0x00000000
);
/* EN. */
}
/* OR. */
nvkm_wr32
(
device
,
0x611cf4
,
0x00000000
);
/* MSK. */
nvkm_wr32
(
device
,
0x611db4
,
0x00000000
);
/* EN. */
return
0
;
}
static
const
struct
nv50_disp_func
gv100_disp
=
{
.
init
=
gv100_disp_init
,
.
fini
=
gv100_disp_fini
,
.
intr
=
gv100_disp_intr
,
.
uevent
=
&
gv100_disp_chan_uevent
,
.
super
=
gv100_disp_super
,
.
root
=
&
gv100_disp_root_oclass
,
.
wndw
=
{
.
cnt
=
gv100_disp_wndw_cnt
},
.
head
=
{
.
cnt
=
gv100_head_cnt
,
.
new
=
gv100_head_new
},
.
sor
=
{
.
cnt
=
gv100_sor_cnt
,
.
new
=
gv100_sor_new
},
.
ramht_size
=
0x2000
,
};
int
gv100_disp_new
(
struct
nvkm_device
*
device
,
int
index
,
struct
nvkm_disp
**
pdisp
)
{
return
nv50_disp_new_
(
&
gv100_disp
,
device
,
index
,
pdisp
);
}
drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c
0 → 100644
浏览文件 @
290ffeaf
/*
* 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 "hdmi.h"
void
gv100_hdmi_ctrl
(
struct
nvkm_ior
*
ior
,
int
head
,
bool
enable
,
u8
max_ac_packet
,
u8
rekey
,
u8
*
avi
,
u8
avi_size
,
u8
*
vendor
,
u8
vendor_size
)
{
struct
nvkm_device
*
device
=
ior
->
disp
->
engine
.
subdev
.
device
;
const
u32
ctrl
=
0x40000000
*
enable
|
max_ac_packet
<<
16
|
rekey
;
const
u32
hoff
=
head
*
0x800
;
const
u32
hdmi
=
head
*
0x400
;
struct
packed_hdmi_infoframe
avi_infoframe
;
struct
packed_hdmi_infoframe
vendor_infoframe
;
pack_hdmi_infoframe
(
&
avi_infoframe
,
avi
,
avi_size
);
pack_hdmi_infoframe
(
&
vendor_infoframe
,
vendor
,
vendor_size
);
if
(
!
(
ctrl
&
0x40000000
))
{
nvkm_mask
(
device
,
0x6165c0
+
hoff
,
0x40000000
,
0x00000000
);
nvkm_mask
(
device
,
0x6f0100
+
hdmi
,
0x00000001
,
0x00000000
);
nvkm_mask
(
device
,
0x6f00c0
+
hdmi
,
0x00000001
,
0x00000000
);
nvkm_mask
(
device
,
0x6f0000
+
hdmi
,
0x00000001
,
0x00000000
);
return
;
}
/* AVI InfoFrame (AVI). */
nvkm_mask
(
device
,
0x6f0000
+
hdmi
,
0x00000001
,
0x00000000
);
if
(
avi_size
)
{
nvkm_wr32
(
device
,
0x6f0008
+
hdmi
,
avi_infoframe
.
header
);
nvkm_wr32
(
device
,
0x6f000c
+
hdmi
,
avi_infoframe
.
subpack0_low
);
nvkm_wr32
(
device
,
0x6f0010
+
hdmi
,
avi_infoframe
.
subpack0_high
);
nvkm_wr32
(
device
,
0x6f0014
+
hdmi
,
avi_infoframe
.
subpack1_low
);
nvkm_wr32
(
device
,
0x6f0018
+
hdmi
,
avi_infoframe
.
subpack1_high
);
nvkm_mask
(
device
,
0x6f0000
+
hdmi
,
0x00000001
,
0x00000001
);
}
/* Vendor-specific InfoFrame (VSI). */
nvkm_mask
(
device
,
0x6f0100
+
hdmi
,
0x00010001
,
0x00000000
);
if
(
vendor_size
)
{
nvkm_wr32
(
device
,
0x6f0108
+
hdmi
,
vendor_infoframe
.
header
);
nvkm_wr32
(
device
,
0x6f010c
+
hdmi
,
vendor_infoframe
.
subpack0_low
);
nvkm_wr32
(
device
,
0x6f0110
+
hdmi
,
vendor_infoframe
.
subpack0_high
);
nvkm_wr32
(
device
,
0x6f0110
+
hdmi
,
0x00000000
);
nvkm_wr32
(
device
,
0x6f0114
+
hdmi
,
0x00000000
);
nvkm_wr32
(
device
,
0x6f0118
+
hdmi
,
0x00000000
);
nvkm_wr32
(
device
,
0x6f011c
+
hdmi
,
0x00000000
);
nvkm_wr32
(
device
,
0x6f0120
+
hdmi
,
0x00000000
);
nvkm_wr32
(
device
,
0x6f0124
+
hdmi
,
0x00000000
);
nvkm_mask
(
device
,
0x6f0100
+
hdmi
,
0x00000001
,
0x00000001
);
}
/* General Control (GCP). */
nvkm_mask
(
device
,
0x6f00c0
+
hdmi
,
0x00000001
,
0x00000000
);
nvkm_wr32
(
device
,
0x6f00cc
+
hdmi
,
0x00000010
);
nvkm_mask
(
device
,
0x6f00c0
+
hdmi
,
0x00000001
,
0x00000001
);
/* Audio Clock Regeneration (ACR). */
nvkm_wr32
(
device
,
0x6f0080
+
hdmi
,
0x82000000
);
/* NV_PDISP_SF_HDMI_CTRL. */
nvkm_mask
(
device
,
0x6165c0
+
hoff
,
0x401f007f
,
ctrl
);
}
drivers/gpu/drm/nouveau/nvkm/engine/disp/head.h
浏览文件 @
290ffeaf
...
...
@@ -58,4 +58,8 @@ int nv50_head_new(struct nvkm_disp *, int id);
int
gf119_head_cnt
(
struct
nvkm_disp
*
,
unsigned
long
*
);
int
gf119_head_new
(
struct
nvkm_disp
*
,
int
id
);
void
gf119_head_rgclk
(
struct
nvkm_head
*
,
int
);
int
gv100_head_cnt
(
struct
nvkm_disp
*
,
unsigned
long
*
);
int
gv100_head_new
(
struct
nvkm_disp
*
,
int
id
);
#endif
drivers/gpu/drm/nouveau/nvkm/engine/disp/headgf119.c
浏览文件 @
290ffeaf
...
...
@@ -39,7 +39,7 @@ gf119_head_vblank_get(struct nvkm_head *head)
nvkm_mask
(
device
,
0x6100c0
+
hoff
,
0x00000001
,
0x00000001
);
}
static
void
void
gf119_head_rgclk
(
struct
nvkm_head
*
head
,
int
div
)
{
struct
nvkm_device
*
device
=
head
->
disp
->
engine
.
subdev
.
device
;
...
...
drivers/gpu/drm/nouveau/nvkm/engine/disp/headgv100.c
0 → 100644
浏览文件 @
290ffeaf
/*
* 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"
static
void
gv100_head_vblank_put
(
struct
nvkm_head
*
head
)
{
struct
nvkm_device
*
device
=
head
->
disp
->
engine
.
subdev
.
device
;
nvkm_mask
(
device
,
0x611d80
+
(
head
->
id
*
4
),
0x00000004
,
0x00000000
);
}
static
void
gv100_head_vblank_get
(
struct
nvkm_head
*
head
)
{
struct
nvkm_device
*
device
=
head
->
disp
->
engine
.
subdev
.
device
;
nvkm_mask
(
device
,
0x611d80
+
(
head
->
id
*
4
),
0x00000004
,
0x00000004
);
}
static
void
gv100_head_rgpos
(
struct
nvkm_head
*
head
,
u16
*
hline
,
u16
*
vline
)
{
struct
nvkm_device
*
device
=
head
->
disp
->
engine
.
subdev
.
device
;
const
u32
hoff
=
head
->
id
*
0x800
;
/* vline read locks hline. */
*
vline
=
nvkm_rd32
(
device
,
0x616330
+
hoff
)
&
0x0000ffff
;
*
hline
=
nvkm_rd32
(
device
,
0x616334
+
hoff
)
&
0x0000ffff
;
}
static
void
gv100_head_state
(
struct
nvkm_head
*
head
,
struct
nvkm_head_state
*
state
)
{
struct
nvkm_device
*
device
=
head
->
disp
->
engine
.
subdev
.
device
;
const
u32
hoff
=
(
state
==
&
head
->
arm
)
*
0x8000
+
head
->
id
*
0x400
;
u32
data
;
data
=
nvkm_rd32
(
device
,
0x682064
+
hoff
);
state
->
vtotal
=
(
data
&
0xffff0000
)
>>
16
;
state
->
htotal
=
(
data
&
0x0000ffff
);
data
=
nvkm_rd32
(
device
,
0x682068
+
hoff
);
state
->
vsynce
=
(
data
&
0xffff0000
)
>>
16
;
state
->
hsynce
=
(
data
&
0x0000ffff
);
data
=
nvkm_rd32
(
device
,
0x68206c
+
hoff
);
state
->
vblanke
=
(
data
&
0xffff0000
)
>>
16
;
state
->
hblanke
=
(
data
&
0x0000ffff
);
data
=
nvkm_rd32
(
device
,
0x682070
+
hoff
);
state
->
vblanks
=
(
data
&
0xffff0000
)
>>
16
;
state
->
hblanks
=
(
data
&
0x0000ffff
);
state
->
hz
=
nvkm_rd32
(
device
,
0x68200c
+
hoff
);
data
=
nvkm_rd32
(
device
,
0x682004
+
hoff
);
switch
((
data
&
0x000000f0
)
>>
4
)
{
case
5
:
state
->
or
.
depth
=
30
;
break
;
case
4
:
state
->
or
.
depth
=
24
;
break
;
case
1
:
state
->
or
.
depth
=
18
;
break
;
default:
state
->
or
.
depth
=
18
;
WARN_ON
(
1
);
break
;
}
}
static
const
struct
nvkm_head_func
gv100_head
=
{
.
state
=
gv100_head_state
,
.
rgpos
=
gv100_head_rgpos
,
.
rgclk
=
gf119_head_rgclk
,
.
vblank_get
=
gv100_head_vblank_get
,
.
vblank_put
=
gv100_head_vblank_put
,
};
int
gv100_head_new
(
struct
nvkm_disp
*
disp
,
int
id
)
{
struct
nvkm_device
*
device
=
disp
->
engine
.
subdev
.
device
;
if
(
!
(
nvkm_rd32
(
device
,
0x610060
)
&
(
0x00000001
<<
id
)))
return
0
;
return
nvkm_head_new_
(
&
gv100_head
,
disp
,
id
);
}
int
gv100_head_cnt
(
struct
nvkm_disp
*
disp
,
unsigned
long
*
pmask
)
{
struct
nvkm_device
*
device
=
disp
->
engine
.
subdev
.
device
;
*
pmask
=
nvkm_rd32
(
device
,
0x610060
)
&
0x000000ff
;
return
nvkm_rd32
(
device
,
0x610074
)
&
0x0000000f
;
}
drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h
浏览文件 @
290ffeaf
...
...
@@ -30,7 +30,7 @@ struct nvkm_ior {
UNKNOWN
}
proto
:
3
;
unsigned
link
:
2
;
unsigned
head
:
4
;
unsigned
head
:
8
;
}
arm
,
asy
;
/* Armed DP state. */
...
...
@@ -133,10 +133,15 @@ void gf119_sor_dp_watermark(struct nvkm_ior *, int, u8);
void
gm107_sor_dp_pattern
(
struct
nvkm_ior
*
,
int
);
void
gm200_sor_route_set
(
struct
nvkm_outp
*
,
struct
nvkm_ior
*
);
int
gm200_sor_route_get
(
struct
nvkm_outp
*
,
int
*
);
void
gm200_sor_dp_drive
(
struct
nvkm_ior
*
,
int
,
int
,
int
,
int
,
int
);
void
g84_hdmi_ctrl
(
struct
nvkm_ior
*
,
int
,
bool
,
u8
,
u8
,
u8
*
,
u8
,
u8
*
,
u8
);
void
gt215_hdmi_ctrl
(
struct
nvkm_ior
*
,
int
,
bool
,
u8
,
u8
,
u8
*
,
u8
,
u8
*
,
u8
);
void
gf119_hdmi_ctrl
(
struct
nvkm_ior
*
,
int
,
bool
,
u8
,
u8
,
u8
*
,
u8
,
u8
*
,
u8
);
void
gk104_hdmi_ctrl
(
struct
nvkm_ior
*
,
int
,
bool
,
u8
,
u8
,
u8
*
,
u8
,
u8
*
,
u8
);
void
gv100_hdmi_ctrl
(
struct
nvkm_ior
*
,
int
,
bool
,
u8
,
u8
,
u8
*
,
u8
,
u8
*
,
u8
);
void
gt215_hda_hpd
(
struct
nvkm_ior
*
,
int
,
bool
);
void
gt215_hda_eld
(
struct
nvkm_ior
*
,
u8
*
,
u8
);
...
...
@@ -178,4 +183,7 @@ int gf119_sor_new(struct nvkm_disp *, int);
int
gk104_sor_new
(
struct
nvkm_disp
*
,
int
);
int
gm107_sor_new
(
struct
nvkm_disp
*
,
int
);
int
gm200_sor_new
(
struct
nvkm_disp
*
,
int
);
int
gv100_sor_cnt
(
struct
nvkm_disp
*
,
unsigned
long
*
);
int
gv100_sor_new
(
struct
nvkm_disp
*
,
int
);
#endif
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
浏览文件 @
290ffeaf
...
...
@@ -88,6 +88,12 @@ nv50_disp_oneinit_(struct nvkm_disp *base)
struct
nvkm_device
*
device
=
subdev
->
device
;
int
ret
,
i
;
if
(
func
->
wndw
.
cnt
)
{
disp
->
wndw
.
nr
=
func
->
wndw
.
cnt
(
&
disp
->
base
,
&
disp
->
wndw
.
mask
);
nvkm_debug
(
subdev
,
"Window(s): %d (%08lx)
\n
"
,
disp
->
wndw
.
nr
,
disp
->
wndw
.
mask
);
}
disp
->
head
.
nr
=
func
->
head
.
cnt
(
&
disp
->
base
,
&
disp
->
head
.
mask
);
nvkm_debug
(
subdev
,
" Head(s): %d (%02lx)
\n
"
,
disp
->
head
.
nr
,
disp
->
head
.
mask
);
...
...
@@ -133,7 +139,8 @@ nv50_disp_oneinit_(struct nvkm_disp *base)
if
(
ret
)
return
ret
;
return
nvkm_ramht_new
(
device
,
0x1000
,
0
,
disp
->
inst
,
&
disp
->
ramht
);
return
nvkm_ramht_new
(
device
,
func
->
ramht_size
?
func
->
ramht_size
:
0x1000
,
0
,
disp
->
inst
,
&
disp
->
ramht
);
}
static
const
struct
nvkm_disp_func
...
...
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.h
浏览文件 @
290ffeaf
...
...
@@ -18,7 +18,7 @@ struct nv50_disp {
struct
{
unsigned
long
mask
;
int
nr
;
}
head
,
dac
;
}
wndw
,
head
,
dac
;
struct
{
unsigned
long
mask
;
...
...
@@ -35,7 +35,7 @@ struct nv50_disp {
struct
nvkm_gpuobj
*
inst
;
struct
nvkm_ramht
*
ramht
;
struct
nv50_disp_chan
*
chan
[
2
1
];
struct
nv50_disp_chan
*
chan
[
8
1
];
};
void
nv50_disp_super_1
(
struct
nv50_disp
*
);
...
...
@@ -62,7 +62,9 @@ struct nv50_disp_func {
struct
{
int
(
*
cnt
)(
struct
nvkm_disp
*
,
unsigned
long
*
mask
);
int
(
*
new
)(
struct
nvkm_disp
*
,
int
id
);
}
head
,
dac
,
sor
,
pior
;
}
wndw
,
head
,
dac
,
sor
,
pior
;
u16
ramht_size
;
};
int
nv50_disp_init
(
struct
nv50_disp
*
);
...
...
@@ -86,4 +88,5 @@ int nv50_disp_chan_uevent_ctor(struct nvkm_object *, void *, u32,
void
nv50_disp_chan_uevent_send
(
struct
nv50_disp
*
,
int
);
extern
const
struct
nvkm_event_func
gf119_disp_chan_uevent
;
extern
const
struct
nvkm_event_func
gv100_disp_chan_uevent
;
#endif
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgv100.c
0 → 100644
浏览文件 @
290ffeaf
/*
* 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 "rootnv50.h"
#include "channv50.h"
#include <nvif/class.h>
static
const
struct
nv50_disp_root_func
gv100_disp_root
=
{
.
user
=
{
{{
0
,
0
,
GV100_DISP_CURSOR
},
gv100_disp_curs_new
},
{{
0
,
0
,
GV100_DISP_WINDOW_IMM_CHANNEL_DMA
},
gv100_disp_wimm_new
},
{{
0
,
0
,
GV100_DISP_CORE_CHANNEL_DMA
},
gv100_disp_core_new
},
{{
0
,
0
,
GV100_DISP_WINDOW_CHANNEL_DMA
},
gv100_disp_wndw_new
},
{}
},
};
static
int
gv100_disp_root_new
(
struct
nvkm_disp
*
disp
,
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
return
nv50_disp_root_new_
(
&
gv100_disp_root
,
disp
,
oclass
,
data
,
size
,
pobject
);
}
const
struct
nvkm_disp_oclass
gv100_disp_root_oclass
=
{
.
base
.
oclass
=
GV100_DISP
,
.
base
.
minver
=
-
1
,
.
base
.
maxver
=
-
1
,
.
ctor
=
gv100_disp_root_new
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.h
浏览文件 @
290ffeaf
...
...
@@ -36,4 +36,5 @@ extern const struct nvkm_disp_oclass gm107_disp_root_oclass;
extern
const
struct
nvkm_disp_oclass
gm200_disp_root_oclass
;
extern
const
struct
nvkm_disp_oclass
gp100_disp_root_oclass
;
extern
const
struct
nvkm_disp_oclass
gp102_disp_root_oclass
;
extern
const
struct
nvkm_disp_oclass
gv100_disp_root_oclass
;
#endif
drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm200.c
浏览文件 @
290ffeaf
...
...
@@ -23,7 +23,7 @@
*/
#include "ior.h"
static
void
void
gm200_sor_dp_drive
(
struct
nvkm_ior
*
sor
,
int
ln
,
int
pc
,
int
dc
,
int
pe
,
int
pu
)
{
struct
nvkm_device
*
device
=
sor
->
disp
->
engine
.
subdev
.
device
;
...
...
@@ -45,7 +45,7 @@ gm200_sor_dp_drive(struct nvkm_ior *sor, int ln, int pc, int dc, int pe, int pu)
nvkm_wr32
(
device
,
0x61c13c
+
loff
,
data
[
3
]
|
(
pc
<<
shift
));
}
static
void
void
gm200_sor_route_set
(
struct
nvkm_outp
*
outp
,
struct
nvkm_ior
*
ior
)
{
struct
nvkm_device
*
device
=
outp
->
disp
->
engine
.
subdev
.
device
;
...
...
@@ -62,7 +62,7 @@ gm200_sor_route_set(struct nvkm_outp *outp, struct nvkm_ior *ior)
nvkm_mask
(
device
,
0x612388
+
moff
,
0x0000001f
,
link
<<
4
|
sor
);
}
static
int
int
gm200_sor_route_get
(
struct
nvkm_outp
*
outp
,
int
*
link
)
{
struct
nvkm_device
*
device
=
outp
->
disp
->
engine
.
subdev
.
device
;
...
...
drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgv100.c
0 → 100644
浏览文件 @
290ffeaf
/*
* 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 "ior.h"
#include <subdev/timer.h>
static
void
gv100_sor_dp_watermark
(
struct
nvkm_ior
*
sor
,
int
head
,
u8
watermark
)
{
struct
nvkm_device
*
device
=
sor
->
disp
->
engine
.
subdev
.
device
;
const
u32
hoff
=
head
*
0x800
;
nvkm_mask
(
device
,
0x616550
+
hoff
,
0x0c00003f
,
0x08000000
|
watermark
);
}
static
void
gv100_sor_dp_audio_sym
(
struct
nvkm_ior
*
sor
,
int
head
,
u16
h
,
u32
v
)
{
struct
nvkm_device
*
device
=
sor
->
disp
->
engine
.
subdev
.
device
;
const
u32
hoff
=
head
*
0x800
;
nvkm_mask
(
device
,
0x616568
+
hoff
,
0x0000ffff
,
h
);
nvkm_mask
(
device
,
0x61656c
+
hoff
,
0x00ffffff
,
v
);
}
static
void
gv100_sor_dp_audio
(
struct
nvkm_ior
*
sor
,
int
head
,
bool
enable
)
{
struct
nvkm_device
*
device
=
sor
->
disp
->
engine
.
subdev
.
device
;
const
u32
hoff
=
0x800
*
head
;
const
u32
data
=
0x80000000
|
(
0x00000001
*
enable
);
const
u32
mask
=
0x8000000d
;
nvkm_mask
(
device
,
0x616560
+
hoff
,
mask
,
data
);
nvkm_msec
(
device
,
2000
,
if
(
!
(
nvkm_rd32
(
device
,
0x616560
+
hoff
)
&
0x80000000
))
break
;
);
}
static
void
gv100_sor_state
(
struct
nvkm_ior
*
sor
,
struct
nvkm_ior_state
*
state
)
{
struct
nvkm_device
*
device
=
sor
->
disp
->
engine
.
subdev
.
device
;
const
u32
coff
=
(
state
==
&
sor
->
arm
)
*
0x8000
+
sor
->
id
*
0x20
;
u32
ctrl
=
nvkm_rd32
(
device
,
0x680300
+
coff
);
state
->
proto_evo
=
(
ctrl
&
0x00000f00
)
>>
8
;
switch
(
state
->
proto_evo
)
{
case
0
:
state
->
proto
=
LVDS
;
state
->
link
=
1
;
break
;
case
1
:
state
->
proto
=
TMDS
;
state
->
link
=
1
;
break
;
case
2
:
state
->
proto
=
TMDS
;
state
->
link
=
2
;
break
;
case
5
:
state
->
proto
=
TMDS
;
state
->
link
=
3
;
break
;
case
8
:
state
->
proto
=
DP
;
state
->
link
=
1
;
break
;
case
9
:
state
->
proto
=
DP
;
state
->
link
=
2
;
break
;
default:
state
->
proto
=
UNKNOWN
;
break
;
}
state
->
head
=
ctrl
&
0x000000ff
;
}
static
const
struct
nvkm_ior_func
gv100_sor
=
{
.
route
=
{
.
get
=
gm200_sor_route_get
,
.
set
=
gm200_sor_route_set
,
},
.
state
=
gv100_sor_state
,
.
power
=
nv50_sor_power
,
.
clock
=
gf119_sor_clock
,
.
hdmi
=
{
.
ctrl
=
gv100_hdmi_ctrl
,
},
.
dp
=
{
.
lanes
=
{
0
,
1
,
2
,
3
},
.
links
=
gf119_sor_dp_links
,
.
power
=
g94_sor_dp_power
,
.
pattern
=
gm107_sor_dp_pattern
,
.
drive
=
gm200_sor_dp_drive
,
.
audio
=
gv100_sor_dp_audio
,
.
audio_sym
=
gv100_sor_dp_audio_sym
,
.
watermark
=
gv100_sor_dp_watermark
,
},
.
hda
=
{
.
hpd
=
gf119_hda_hpd
,
.
eld
=
gf119_hda_eld
,
},
};
int
gv100_sor_new
(
struct
nvkm_disp
*
disp
,
int
id
)
{
return
nvkm_ior_new_
(
&
gv100_sor
,
disp
,
SOR
,
id
);
}
int
gv100_sor_cnt
(
struct
nvkm_disp
*
disp
,
unsigned
long
*
pmask
)
{
struct
nvkm_device
*
device
=
disp
->
engine
.
subdev
.
device
;
*
pmask
=
(
nvkm_rd32
(
device
,
0x610060
)
&
0x0000ff00
)
>>
8
;
return
(
nvkm_rd32
(
device
,
0x610074
)
&
0x00000f00
)
>>
8
;
}
drivers/gpu/drm/nouveau/nvkm/engine/disp/wimmgv100.c
0 → 100644
浏览文件 @
290ffeaf
/*
* 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 "channv50.h"
#include <core/client.h>
#include <nvif/clc37b.h>
#include <nvif/unpack.h>
static
void
gv100_disp_wimm_intr
(
struct
nv50_disp_chan
*
chan
,
bool
en
)
{
struct
nvkm_device
*
device
=
chan
->
disp
->
base
.
engine
.
subdev
.
device
;
const
u32
mask
=
0x00000001
<<
chan
->
head
;
const
u32
data
=
en
?
mask
:
0
;
nvkm_mask
(
device
,
0x611da8
,
mask
,
data
);
}
const
struct
nv50_disp_chan_func
gv100_disp_wimm
=
{
.
init
=
gv100_disp_dmac_init
,
.
fini
=
gv100_disp_dmac_fini
,
.
intr
=
gv100_disp_wimm_intr
,
.
user
=
gv100_disp_chan_user
,
};
static
int
gv100_disp_wimm_new_
(
const
struct
nv50_disp_chan_func
*
func
,
const
struct
nv50_disp_chan_mthd
*
mthd
,
struct
nv50_disp
*
disp
,
int
chid
,
const
struct
nvkm_oclass
*
oclass
,
void
*
argv
,
u32
argc
,
struct
nvkm_object
**
pobject
)
{
union
{
struct
nvc37b_window_imm_channel_dma_v0
v0
;
}
*
args
=
argv
;
struct
nvkm_object
*
parent
=
oclass
->
parent
;
int
wndw
,
ret
=
-
ENOSYS
;
u64
push
;
nvif_ioctl
(
parent
,
"create window imm channel dma size %d
\n
"
,
argc
);
if
(
!
(
ret
=
nvif_unpack
(
ret
,
&
argv
,
&
argc
,
args
->
v0
,
0
,
0
,
false
)))
{
nvif_ioctl
(
parent
,
"create window imm channel dma vers %d "
"pushbuf %016llx index %d
\n
"
,
args
->
v0
.
version
,
args
->
v0
.
pushbuf
,
args
->
v0
.
index
);
if
(
!
(
disp
->
wndw
.
mask
&
BIT
(
args
->
v0
.
index
)))
return
-
EINVAL
;
push
=
args
->
v0
.
pushbuf
;
wndw
=
args
->
v0
.
index
;
}
else
return
ret
;
return
nv50_disp_dmac_new_
(
func
,
mthd
,
disp
,
chid
+
wndw
,
wndw
,
push
,
oclass
,
pobject
);
}
int
gv100_disp_wimm_new
(
const
struct
nvkm_oclass
*
oclass
,
void
*
argv
,
u32
argc
,
struct
nv50_disp
*
disp
,
struct
nvkm_object
**
pobject
)
{
return
gv100_disp_wimm_new_
(
&
gv100_disp_wimm
,
NULL
,
disp
,
33
,
oclass
,
argv
,
argc
,
pobject
);
}
drivers/gpu/drm/nouveau/nvkm/engine/disp/wndwgv100.c
0 → 100644
浏览文件 @
290ffeaf
/*
* 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 "channv50.h"
#include <core/client.h>
#include <nvif/clc37e.h>
#include <nvif/unpack.h>
static
const
struct
nv50_disp_mthd_list
gv100_disp_wndw_mthd_base
=
{
.
mthd
=
0x0000
,
.
addr
=
0x000000
,
.
data
=
{
{
0x0200
,
0x690200
},
{
0x020c
,
0x69020c
},
{
0x0210
,
0x690210
},
{
0x0214
,
0x690214
},
{
0x0218
,
0x690218
},
{
0x021c
,
0x69021c
},
{
0x0220
,
0x690220
},
{
0x0224
,
0x690224
},
{
0x0228
,
0x690228
},
{
0x022c
,
0x69022c
},
{
0x0230
,
0x690230
},
{
0x0234
,
0x690234
},
{
0x0238
,
0x690238
},
{
0x0240
,
0x690240
},
{
0x0244
,
0x690244
},
{
0x0248
,
0x690248
},
{
0x024c
,
0x69024c
},
{
0x0250
,
0x690250
},
{
0x0254
,
0x690254
},
{
0x0260
,
0x690260
},
{
0x0264
,
0x690264
},
{
0x0268
,
0x690268
},
{
0x026c
,
0x69026c
},
{
0x0270
,
0x690270
},
{
0x0274
,
0x690274
},
{
0x0280
,
0x690280
},
{
0x0284
,
0x690284
},
{
0x0288
,
0x690288
},
{
0x028c
,
0x69028c
},
{
0x0290
,
0x690290
},
{
0x0298
,
0x690298
},
{
0x029c
,
0x69029c
},
{
0x02a0
,
0x6902a0
},
{
0x02a4
,
0x6902a4
},
{
0x02a8
,
0x6902a8
},
{
0x02ac
,
0x6902ac
},
{
0x02b0
,
0x6902b0
},
{
0x02b4
,
0x6902b4
},
{
0x02b8
,
0x6902b8
},
{
0x02bc
,
0x6902bc
},
{
0x02c0
,
0x6902c0
},
{
0x02c4
,
0x6902c4
},
{
0x02c8
,
0x6902c8
},
{
0x02cc
,
0x6902cc
},
{
0x02d0
,
0x6902d0
},
{
0x02d4
,
0x6902d4
},
{
0x02d8
,
0x6902d8
},
{
0x02dc
,
0x6902dc
},
{
0x02e0
,
0x6902e0
},
{
0x02e4
,
0x6902e4
},
{
0x02e8
,
0x6902e8
},
{
0x02ec
,
0x6902ec
},
{
0x02f0
,
0x6902f0
},
{
0x02f4
,
0x6902f4
},
{
0x02f8
,
0x6902f8
},
{
0x02fc
,
0x6902fc
},
{
0x0300
,
0x690300
},
{
0x0304
,
0x690304
},
{
0x0308
,
0x690308
},
{
0x0310
,
0x690310
},
{
0x0314
,
0x690314
},
{
0x0318
,
0x690318
},
{
0x031c
,
0x69031c
},
{
0x0320
,
0x690320
},
{
0x0324
,
0x690324
},
{
0x0328
,
0x690328
},
{
0x032c
,
0x69032c
},
{
0x033c
,
0x69033c
},
{
0x0340
,
0x690340
},
{
0x0344
,
0x690344
},
{
0x0348
,
0x690348
},
{
0x034c
,
0x69034c
},
{
0x0350
,
0x690350
},
{
0x0354
,
0x690354
},
{
0x0358
,
0x690358
},
{
0x0364
,
0x690364
},
{
0x0368
,
0x690368
},
{
0x036c
,
0x69036c
},
{
0x0370
,
0x690370
},
{
0x0374
,
0x690374
},
{
0x0380
,
0x690380
},
{}
}
};
const
struct
nv50_disp_chan_mthd
gv100_disp_wndw_mthd
=
{
.
name
=
"Base"
,
.
addr
=
0x001000
,
.
prev
=
0x000800
,
.
data
=
{
{
"Global"
,
1
,
&
gv100_disp_wndw_mthd_base
},
{}
}
};
static
void
gv100_disp_wndw_intr
(
struct
nv50_disp_chan
*
chan
,
bool
en
)
{
struct
nvkm_device
*
device
=
chan
->
disp
->
base
.
engine
.
subdev
.
device
;
const
u32
mask
=
0x00000001
<<
chan
->
head
;
const
u32
data
=
en
?
mask
:
0
;
nvkm_mask
(
device
,
0x611da4
,
mask
,
data
);
}
const
struct
nv50_disp_chan_func
gv100_disp_wndw
=
{
.
init
=
gv100_disp_dmac_init
,
.
fini
=
gv100_disp_dmac_fini
,
.
intr
=
gv100_disp_wndw_intr
,
.
user
=
gv100_disp_chan_user
,
.
bind
=
gv100_disp_dmac_bind
,
};
static
int
gv100_disp_wndw_new_
(
const
struct
nv50_disp_chan_func
*
func
,
const
struct
nv50_disp_chan_mthd
*
mthd
,
struct
nv50_disp
*
disp
,
int
chid
,
const
struct
nvkm_oclass
*
oclass
,
void
*
argv
,
u32
argc
,
struct
nvkm_object
**
pobject
)
{
union
{
struct
nvc37e_window_channel_dma_v0
v0
;
}
*
args
=
argv
;
struct
nvkm_object
*
parent
=
oclass
->
parent
;
int
wndw
,
ret
=
-
ENOSYS
;
u64
push
;
nvif_ioctl
(
parent
,
"create window channel dma size %d
\n
"
,
argc
);
if
(
!
(
ret
=
nvif_unpack
(
ret
,
&
argv
,
&
argc
,
args
->
v0
,
0
,
0
,
false
)))
{
nvif_ioctl
(
parent
,
"create window channel dma vers %d "
"pushbuf %016llx index %d
\n
"
,
args
->
v0
.
version
,
args
->
v0
.
pushbuf
,
args
->
v0
.
index
);
if
(
!
(
disp
->
wndw
.
mask
&
BIT
(
args
->
v0
.
index
)))
return
-
EINVAL
;
push
=
args
->
v0
.
pushbuf
;
wndw
=
args
->
v0
.
index
;
}
else
return
ret
;
return
nv50_disp_dmac_new_
(
func
,
mthd
,
disp
,
chid
+
wndw
,
wndw
,
push
,
oclass
,
pobject
);
}
int
gv100_disp_wndw_new
(
const
struct
nvkm_oclass
*
oclass
,
void
*
argv
,
u32
argc
,
struct
nv50_disp
*
disp
,
struct
nvkm_object
**
pobject
)
{
return
gv100_disp_wndw_new_
(
&
gv100_disp_wndw
,
&
gv100_disp_wndw_mthd
,
disp
,
1
,
oclass
,
argv
,
argc
,
pobject
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录