Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
0ce41e3c
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
161
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看板
提交
0ce41e3c
编写于
8月 20, 2015
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/disp: convert user classes to new-style nvkm_object
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
2a7909c0
变更
73
隐藏空白更改
内联
并排
Showing
73 changed file
with
2346 addition
and
1053 deletion
+2346
-1053
drivers/gpu/drm/nouveau/include/nvkm/core/oproxy.h
drivers/gpu/drm/nouveau/include/nvkm/core/oproxy.h
+22
-0
drivers/gpu/drm/nouveau/include/nvkm/engine/disp.h
drivers/gpu/drm/nouveau/include/nvkm/engine/disp.h
+8
-0
drivers/gpu/drm/nouveau/nvkm/core/Kbuild
drivers/gpu/drm/nouveau/nvkm/core/Kbuild
+1
-0
drivers/gpu/drm/nouveau/nvkm/core/oproxy.c
drivers/gpu/drm/nouveau/nvkm/core/oproxy.c
+198
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
+16
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c
+68
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/baseg84.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/baseg84.c
+17
-2
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegf119.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegf119.c
+14
-14
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegk104.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegk104.c
+38
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegk110.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegk110.c
+38
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegt200.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegt200.c
+38
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegt215.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegt215.c
+38
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/basenv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/basenv50.c
+43
-47
drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.c
+128
-56
drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.h
+76
-52
drivers/gpu/drm/nouveau/nvkm/engine/disp/coreg84.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/coreg84.c
+17
-2
drivers/gpu/drm/nouveau/nvkm/engine/disp/coreg94.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/coreg94.c
+17
-2
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregf119.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregf119.c
+29
-31
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregk104.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregk104.c
+17
-2
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregk110.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregk110.c
+38
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregm107.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregm107.c
+38
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregm204.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregm204.c
+38
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregt200.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregt200.c
+38
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregt215.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregt215.c
+38
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/corenv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/corenv50.c
+51
-59
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursg84.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursg84.c
+37
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursgf119.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursgf119.c
+10
-10
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursgk104.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursgk104.c
+37
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursgt215.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursgt215.c
+37
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursnv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursnv50.c
+19
-24
drivers/gpu/drm/nouveau/nvkm/engine/disp/dmacgf119.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/dmacgf119.c
+21
-34
drivers/gpu/drm/nouveau/nvkm/engine/disp/dmacnv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/dmacnv50.c
+161
-76
drivers/gpu/drm/nouveau/nvkm/engine/disp/dmacnv50.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/dmacnv50.h
+81
-14
drivers/gpu/drm/nouveau/nvkm/engine/disp/g84.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/g84.c
+7
-7
drivers/gpu/drm/nouveau/nvkm/engine/disp/g94.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/g94.c
+7
-7
drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
+10
-33
drivers/gpu/drm/nouveau/nvkm/engine/disp/gk104.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gk104.c
+7
-7
drivers/gpu/drm/nouveau/nvkm/engine/disp/gk110.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gk110.c
+7
-7
drivers/gpu/drm/nouveau/nvkm/engine/disp/gm107.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gm107.c
+7
-7
drivers/gpu/drm/nouveau/nvkm/engine/disp/gm204.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gm204.c
+7
-7
drivers/gpu/drm/nouveau/nvkm/engine/disp/gt200.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gt200.c
+7
-7
drivers/gpu/drm/nouveau/nvkm/engine/disp/gt215.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gt215.c
+7
-7
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv04.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv04.c
+7
-1
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
+10
-74
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.h
+3
-56
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmg84.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmg84.c
+37
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmgf119.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmgf119.c
+10
-10
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmgk104.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmgk104.c
+37
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmgt215.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmgt215.c
+37
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmnv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmnv50.c
+19
-24
drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.h
+11
-7
drivers/gpu/drm/nouveau/nvkm/engine/disp/outpdp.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/outpdp.h
+8
-6
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlyg84.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlyg84.c
+17
-2
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlygf119.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlygf119.c
+14
-14
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlygk104.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlygk104.c
+17
-2
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlygt200.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlygt200.c
+17
-2
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlygt215.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlygt215.c
+38
-0
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlynv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlynv50.c
+44
-48
drivers/gpu/drm/nouveau/nvkm/engine/disp/piocgf119.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/piocgf119.c
+15
-19
drivers/gpu/drm/nouveau/nvkm/engine/disp/piocnv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/piocnv50.c
+14
-35
drivers/gpu/drm/nouveau/nvkm/engine/disp/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/priv.h
+7
-1
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootg84.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootg84.c
+27
-12
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootg94.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootg94.c
+27
-12
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgf119.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgf119.c
+37
-42
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgk104.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgk104.c
+27
-12
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgk110.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgk110.c
+27
-12
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgm107.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgm107.c
+27
-12
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgm204.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgm204.c
+27
-12
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgt200.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgt200.c
+27
-12
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgt215.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgt215.c
+27
-12
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv04.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv04.c
+34
-14
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c
+132
-61
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.h
+32
-25
未找到文件。
drivers/gpu/drm/nouveau/include/nvkm/core/oproxy.h
0 → 100644
浏览文件 @
0ce41e3c
#ifndef __NVKM_OPROXY_H__
#define __NVKM_OPROXY_H__
#define nvkm_oproxy(p) container_of((p), struct nvkm_oproxy, base)
#include <core/object.h>
struct
nvkm_oproxy
{
const
struct
nvkm_oproxy_func
*
func
;
struct
nvkm_object
base
;
struct
nvkm_object
*
object
;
};
struct
nvkm_oproxy_func
{
void
(
*
dtor
[
2
])(
struct
nvkm_oproxy
*
);
int
(
*
init
[
2
])(
struct
nvkm_oproxy
*
);
int
(
*
fini
[
2
])(
struct
nvkm_oproxy
*
,
bool
suspend
);
};
void
nvkm_oproxy_ctor
(
const
struct
nvkm_oproxy_func
*
,
const
struct
nvkm_oclass
*
,
struct
nvkm_oproxy
*
);
int
nvkm_oproxy_new_
(
const
struct
nvkm_oproxy_func
*
,
const
struct
nvkm_oclass
*
,
struct
nvkm_oproxy
**
);
#endif
drivers/gpu/drm/nouveau/include/nvkm/engine/disp.h
浏览文件 @
0ce41e3c
#ifndef __NVKM_DISP_H__
#define __NVKM_DISP_H__
#define nvkm_disp(p) container_of((p), struct nvkm_disp, engine)
#include <core/engine.h>
#include <core/event.h>
struct
nvkm_disp
{
struct
nvkm_engine
engine
;
const
struct
nvkm_disp_func
*
func
;
struct
nvkm_oproxy
*
client
;
struct
list_head
outp
;
struct
list_head
conn
;
...
...
@@ -13,6 +17,10 @@ struct nvkm_disp {
struct
nvkm_event
vblank
;
};
struct
nvkm_disp_func
{
const
struct
nvkm_disp_oclass
*
root
;
};
extern
struct
nvkm_oclass
*
nv04_disp_oclass
;
extern
struct
nvkm_oclass
*
nv50_disp_oclass
;
extern
struct
nvkm_oclass
*
g84_disp_oclass
;
...
...
drivers/gpu/drm/nouveau/nvkm/core/Kbuild
浏览文件 @
0ce41e3c
...
...
@@ -11,6 +11,7 @@ nvkm-y += nvkm/core/mm.o
nvkm-y += nvkm/core/namedb.o
nvkm-y += nvkm/core/notify.o
nvkm-y += nvkm/core/object.o
nvkm-y += nvkm/core/oproxy.o
nvkm-y += nvkm/core/option.o
nvkm-y += nvkm/core/parent.o
nvkm-y += nvkm/core/ramht.o
...
...
drivers/gpu/drm/nouveau/nvkm/core/oproxy.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2015 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include <core/oproxy.h>
static
int
nvkm_oproxy_mthd
(
struct
nvkm_object
*
object
,
u32
mthd
,
void
*
data
,
u32
size
)
{
return
nvkm_object_mthd
(
nvkm_oproxy
(
object
)
->
object
,
mthd
,
data
,
size
);
}
static
int
nvkm_oproxy_ntfy
(
struct
nvkm_object
*
object
,
u32
mthd
,
struct
nvkm_event
**
pevent
)
{
return
nvkm_object_ntfy
(
nvkm_oproxy
(
object
)
->
object
,
mthd
,
pevent
);
}
static
int
nvkm_oproxy_map
(
struct
nvkm_object
*
object
,
u64
*
addr
,
u32
*
size
)
{
return
nvkm_object_map
(
nvkm_oproxy
(
object
)
->
object
,
addr
,
size
);
}
static
int
nvkm_oproxy_rd08
(
struct
nvkm_object
*
object
,
u64
addr
,
u8
*
data
)
{
return
nvkm_object_rd08
(
nvkm_oproxy
(
object
)
->
object
,
addr
,
data
);
}
static
int
nvkm_oproxy_rd16
(
struct
nvkm_object
*
object
,
u64
addr
,
u16
*
data
)
{
return
nvkm_object_rd16
(
nvkm_oproxy
(
object
)
->
object
,
addr
,
data
);
}
static
int
nvkm_oproxy_rd32
(
struct
nvkm_object
*
object
,
u64
addr
,
u32
*
data
)
{
return
nvkm_object_rd32
(
nvkm_oproxy
(
object
)
->
object
,
addr
,
data
);
}
static
int
nvkm_oproxy_wr08
(
struct
nvkm_object
*
object
,
u64
addr
,
u8
data
)
{
return
nvkm_object_wr08
(
nvkm_oproxy
(
object
)
->
object
,
addr
,
data
);
}
static
int
nvkm_oproxy_wr16
(
struct
nvkm_object
*
object
,
u64
addr
,
u16
data
)
{
return
nvkm_object_wr16
(
nvkm_oproxy
(
object
)
->
object
,
addr
,
data
);
}
static
int
nvkm_oproxy_wr32
(
struct
nvkm_object
*
object
,
u64
addr
,
u32
data
)
{
return
nvkm_object_wr32
(
nvkm_oproxy
(
object
)
->
object
,
addr
,
data
);
}
static
int
nvkm_oproxy_bind
(
struct
nvkm_object
*
object
,
struct
nvkm_gpuobj
*
parent
,
int
align
,
struct
nvkm_gpuobj
**
pgpuobj
)
{
return
nvkm_object_bind
(
nvkm_oproxy
(
object
)
->
object
,
parent
,
align
,
pgpuobj
);
}
static
int
nvkm_oproxy_sclass
(
struct
nvkm_object
*
object
,
int
index
,
struct
nvkm_oclass
*
oclass
)
{
struct
nvkm_oproxy
*
oproxy
=
nvkm_oproxy
(
object
);
oclass
->
parent
=
oproxy
->
object
;
if
(
oproxy
->
object
->
oclass
)
return
-
ENOSYS
;
if
(
!
oproxy
->
object
->
func
->
sclass
)
return
-
ENODEV
;
return
oproxy
->
object
->
func
->
sclass
(
oproxy
->
object
,
index
,
oclass
);
}
static
int
nvkm_oproxy_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
{
struct
nvkm_oproxy
*
oproxy
=
nvkm_oproxy
(
object
);
int
ret
;
if
(
oproxy
->
func
->
fini
[
0
])
{
ret
=
oproxy
->
func
->
fini
[
0
](
oproxy
,
suspend
);
if
(
ret
&&
suspend
)
return
ret
;
}
ret
=
nvkm_object_fini
(
oproxy
->
object
,
suspend
);
if
(
ret
&&
suspend
)
return
ret
;
if
(
oproxy
->
func
->
fini
[
1
])
{
ret
=
oproxy
->
func
->
fini
[
1
](
oproxy
,
suspend
);
if
(
ret
&&
suspend
)
return
ret
;
}
return
0
;
}
static
int
nvkm_oproxy_init
(
struct
nvkm_object
*
object
)
{
struct
nvkm_oproxy
*
oproxy
=
nvkm_oproxy
(
object
);
int
ret
;
if
(
oproxy
->
func
->
init
[
0
])
{
ret
=
oproxy
->
func
->
init
[
0
](
oproxy
);
if
(
ret
)
return
ret
;
}
ret
=
nvkm_object_init
(
oproxy
->
object
);
if
(
ret
)
return
ret
;
if
(
oproxy
->
func
->
init
[
1
])
{
ret
=
oproxy
->
func
->
init
[
1
](
oproxy
);
if
(
ret
)
return
ret
;
}
return
0
;
}
static
void
*
nvkm_oproxy_dtor
(
struct
nvkm_object
*
object
)
{
struct
nvkm_oproxy
*
oproxy
=
nvkm_oproxy
(
object
);
if
(
oproxy
->
func
->
dtor
[
0
])
oproxy
->
func
->
dtor
[
0
](
oproxy
);
nvkm_object_ref
(
NULL
,
&
oproxy
->
object
);
if
(
oproxy
->
func
->
dtor
[
1
])
oproxy
->
func
->
dtor
[
1
](
oproxy
);
return
oproxy
;
}
static
const
struct
nvkm_object_func
nvkm_oproxy_func
=
{
.
dtor
=
nvkm_oproxy_dtor
,
.
init
=
nvkm_oproxy_init
,
.
fini
=
nvkm_oproxy_fini
,
.
mthd
=
nvkm_oproxy_mthd
,
.
ntfy
=
nvkm_oproxy_ntfy
,
.
map
=
nvkm_oproxy_map
,
.
rd08
=
nvkm_oproxy_rd08
,
.
rd16
=
nvkm_oproxy_rd16
,
.
rd32
=
nvkm_oproxy_rd32
,
.
wr08
=
nvkm_oproxy_wr08
,
.
wr16
=
nvkm_oproxy_wr16
,
.
wr32
=
nvkm_oproxy_wr32
,
.
bind
=
nvkm_oproxy_bind
,
.
sclass
=
nvkm_oproxy_sclass
,
};
void
nvkm_oproxy_ctor
(
const
struct
nvkm_oproxy_func
*
func
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_oproxy
*
oproxy
)
{
nvkm_object_ctor
(
&
nvkm_oproxy_func
,
oclass
,
&
oproxy
->
base
);
oproxy
->
func
=
func
;
}
int
nvkm_oproxy_new_
(
const
struct
nvkm_oproxy_func
*
func
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_oproxy
**
poproxy
)
{
if
(
!
(
*
poproxy
=
kzalloc
(
sizeof
(
**
poproxy
),
GFP_KERNEL
)))
return
-
ENOMEM
;
nvkm_oproxy_ctor
(
func
,
oclass
,
*
poproxy
);
return
0
;
}
drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
浏览文件 @
0ce41e3c
...
...
@@ -53,17 +53,27 @@ nvkm-y += nvkm/engine/disp/dmacgf119.o
nvkm-y += nvkm/engine/disp/basenv50.o
nvkm-y += nvkm/engine/disp/baseg84.o
nvkm-y += nvkm/engine/disp/basegt200.o
nvkm-y += nvkm/engine/disp/basegt215.o
nvkm-y += nvkm/engine/disp/basegf119.o
nvkm-y += nvkm/engine/disp/basegk104.o
nvkm-y += nvkm/engine/disp/basegk110.o
nvkm-y += nvkm/engine/disp/corenv50.o
nvkm-y += nvkm/engine/disp/coreg84.o
nvkm-y += nvkm/engine/disp/coreg94.o
nvkm-y += nvkm/engine/disp/coregt200.o
nvkm-y += nvkm/engine/disp/coregt215.o
nvkm-y += nvkm/engine/disp/coregf119.o
nvkm-y += nvkm/engine/disp/coregk104.o
nvkm-y += nvkm/engine/disp/coregk110.o
nvkm-y += nvkm/engine/disp/coregm107.o
nvkm-y += nvkm/engine/disp/coregm204.o
nvkm-y += nvkm/engine/disp/ovlynv50.o
nvkm-y += nvkm/engine/disp/ovlyg84.o
nvkm-y += nvkm/engine/disp/ovlygt200.o
nvkm-y += nvkm/engine/disp/ovlygt215.o
nvkm-y += nvkm/engine/disp/ovlygf119.o
nvkm-y += nvkm/engine/disp/ovlygk104.o
...
...
@@ -71,7 +81,13 @@ 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/cursg84.o
nvkm-y += nvkm/engine/disp/cursgt215.o
nvkm-y += nvkm/engine/disp/cursgf119.o
nvkm-y += nvkm/engine/disp/cursgk104.o
nvkm-y += nvkm/engine/disp/oimmnv50.o
nvkm-y += nvkm/engine/disp/oimmg84.o
nvkm-y += nvkm/engine/disp/oimmgt215.o
nvkm-y += nvkm/engine/disp/oimmgf119.o
nvkm-y += nvkm/engine/disp/oimmgk104.o
drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c
浏览文件 @
0ce41e3c
...
...
@@ -25,7 +25,9 @@
#include "conn.h"
#include "outp.h"
#include <core/client.h>
#include <core/notify.h>
#include <core/oproxy.h>
#include <subdev/bios.h>
#include <subdev/bios/dcb.h>
...
...
@@ -114,6 +116,66 @@ nvkm_disp_ntfy(struct nvkm_object *object, u32 type, struct nvkm_event **event)
return
-
EINVAL
;
}
static
void
nvkm_disp_class_del
(
struct
nvkm_oproxy
*
oproxy
)
{
struct
nvkm_disp
*
disp
=
nvkm_disp
(
oproxy
->
base
.
engine
);
mutex_lock
(
&
disp
->
engine
.
subdev
.
mutex
);
if
(
disp
->
client
==
oproxy
)
disp
->
client
=
NULL
;
mutex_unlock
(
&
disp
->
engine
.
subdev
.
mutex
);
}
static
const
struct
nvkm_oproxy_func
nvkm_disp_class
=
{
.
dtor
[
1
]
=
nvkm_disp_class_del
,
};
static
int
nvkm_disp_class_new
(
struct
nvkm_device
*
device
,
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
const
struct
nvkm_disp_oclass
*
sclass
=
oclass
->
engn
;
struct
nvkm_disp
*
disp
=
nvkm_disp
(
oclass
->
engine
);
struct
nvkm_oproxy
*
oproxy
;
int
ret
;
ret
=
nvkm_oproxy_new_
(
&
nvkm_disp_class
,
oclass
,
&
oproxy
);
if
(
ret
)
return
ret
;
*
pobject
=
&
oproxy
->
base
;
mutex_lock
(
&
disp
->
engine
.
subdev
.
mutex
);
if
(
disp
->
client
)
{
mutex_unlock
(
&
disp
->
engine
.
subdev
.
mutex
);
return
-
EBUSY
;
}
disp
->
client
=
oproxy
;
mutex_unlock
(
&
disp
->
engine
.
subdev
.
mutex
);
return
sclass
->
ctor
(
disp
,
oclass
,
data
,
size
,
&
oproxy
->
object
);
}
static
const
struct
nvkm_device_oclass
nvkm_disp_sclass
=
{
.
ctor
=
nvkm_disp_class_new
,
};
static
int
nvkm_disp_class_get
(
struct
nvkm_oclass
*
oclass
,
int
index
,
const
struct
nvkm_device_oclass
**
class
)
{
struct
nvkm_disp
*
disp
=
nvkm_disp
(
oclass
->
engine
);
if
(
index
==
0
)
{
oclass
->
base
=
disp
->
func
->
root
->
base
;
oclass
->
engn
=
disp
->
func
->
root
;
*
class
=
&
nvkm_disp_sclass
;
return
0
;
}
return
1
;
}
int
_nvkm_disp_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
{
...
...
@@ -180,6 +242,11 @@ _nvkm_disp_dtor(struct nvkm_object *object)
nvkm_engine_destroy
(
&
disp
->
engine
);
}
static
const
struct
nvkm_engine_func
nvkm_disp
=
{
.
base
.
sclass
=
nvkm_disp_class_get
,
};
int
nvkm_disp_create_
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
int
heads
,
const
char
*
intname
,
...
...
@@ -203,6 +270,7 @@ nvkm_disp_create_(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
disp
->
engine
.
func
=
&
nvkm_disp
;
INIT_LIST_HEAD
(
&
disp
->
outp
);
INIT_LIST_HEAD
(
&
disp
->
conn
);
...
...
drivers/gpu/drm/nouveau/nvkm/engine/disp/baseg84.c
浏览文件 @
0ce41e3c
...
...
@@ -22,6 +22,9 @@
* Authors: Ben Skeggs
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
static
const
struct
nv50_disp_mthd_list
g84_disp_base_mthd_base
=
{
...
...
@@ -53,13 +56,25 @@ g84_disp_base_mthd_base = {
}
};
const
struct
nv50_disp_
mthd_chan
g84_disp_base_
mthd_chan
=
{
const
struct
nv50_disp_
chan_mthd
g84_disp_base_
chan_mthd
=
{
.
name
=
"Base"
,
.
addr
=
0x000540
,
.
prev
=
0x000004
,
.
data
=
{
{
"Global"
,
1
,
&
g84_disp_base_mthd_base
},
{
"Image"
,
2
,
&
nv50_disp_base_mthd_image
},
{}
}
};
const
struct
nv50_disp_dmac_oclass
g84_disp_base_oclass
=
{
.
base
.
oclass
=
G82_DISP_BASE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_base_new
,
.
func
=
&
nv50_disp_dmac_func
,
.
mthd
=
&
g84_disp_base_chan_mthd
,
.
chid
=
1
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegf119.c
浏览文件 @
0ce41e3c
...
...
@@ -22,6 +22,9 @@
* Authors: Ben Skeggs
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
static
const
struct
nv50_disp_mthd_list
gf119_disp_base_mthd_base
=
{
...
...
@@ -87,10 +90,11 @@ gf119_disp_base_mthd_image = {
}
};
const
struct
nv50_disp_
mthd_chan
gf119_disp_base_
mthd_chan
=
{
const
struct
nv50_disp_
chan_mthd
gf119_disp_base_
chan_mthd
=
{
.
name
=
"Base"
,
.
addr
=
0x001000
,
.
prev
=
-
0x020000
,
.
data
=
{
{
"Global"
,
1
,
&
gf119_disp_base_mthd_base
},
{
"Image"
,
2
,
&
gf119_disp_base_mthd_image
},
...
...
@@ -98,17 +102,13 @@ gf119_disp_base_mthd_chan = {
}
};
struct
nv50_disp_chan_impl
gf119_disp_base_ofuncs
=
{
.
base
.
ctor
=
nv50_disp_base_ctor
,
.
base
.
dtor
=
nv50_disp_dmac_dtor
,
.
base
.
init
=
gf119_disp_dmac_init
,
.
base
.
fini
=
gf119_disp_dmac_fini
,
.
base
.
ntfy
=
nv50_disp_chan_ntfy
,
.
base
.
map
=
nv50_disp_chan_map
,
.
base
.
rd32
=
nv50_disp_chan_rd32
,
.
base
.
wr32
=
nv50_disp_chan_wr32
,
const
struct
nv50_disp_dmac_oclass
gf119_disp_base_oclass
=
{
.
base
.
oclass
=
GF110_DISP_BASE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_base_new
,
.
func
=
&
gf119_disp_dmac_func
,
.
mthd
=
&
gf119_disp_base_chan_mthd
,
.
chid
=
1
,
.
attach
=
gf119_disp_dmac_object_attach
,
.
detach
=
gf119_disp_dmac_object_detach
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegk104.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2015 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_dmac_oclass
gk104_disp_base_oclass
=
{
.
base
.
oclass
=
GK104_DISP_BASE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_base_new
,
.
func
=
&
gf119_disp_dmac_func
,
.
mthd
=
&
gf119_disp_base_chan_mthd
,
.
chid
=
1
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegk110.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2015 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_dmac_oclass
gk110_disp_base_oclass
=
{
.
base
.
oclass
=
GK110_DISP_BASE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_base_new
,
.
func
=
&
gf119_disp_dmac_func
,
.
mthd
=
&
gf119_disp_base_chan_mthd
,
.
chid
=
1
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegt200.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2015 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_dmac_oclass
gt200_disp_base_oclass
=
{
.
base
.
oclass
=
GT200_DISP_BASE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_base_new
,
.
func
=
&
nv50_disp_dmac_func
,
.
mthd
=
&
g84_disp_base_chan_mthd
,
.
chid
=
1
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/basegt215.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2015 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_dmac_oclass
gt215_disp_base_oclass
=
{
.
base
.
oclass
=
GT214_DISP_BASE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_base_new
,
.
func
=
&
nv50_disp_dmac_func
,
.
mthd
=
&
g84_disp_base_chan_mthd
,
.
chid
=
1
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/basenv50.c
浏览文件 @
0ce41e3c
...
...
@@ -22,12 +22,44 @@
* Authors: Ben Skeggs
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <core/client.h>
#include <nvif/class.h>
#include <nvif/unpack.h>
int
nv50_disp_base_new
(
const
struct
nv50_disp_dmac_func
*
func
,
const
struct
nv50_disp_chan_mthd
*
mthd
,
struct
nv50_disp_root
*
root
,
int
chid
,
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
union
{
struct
nv50_disp_base_channel_dma_v0
v0
;
}
*
args
=
data
;
struct
nvkm_object
*
parent
=
oclass
->
parent
;
struct
nv50_disp
*
disp
=
root
->
disp
;
int
head
,
ret
;
u64
push
;
nvif_ioctl
(
parent
,
"create disp base channel dma size %d
\n
"
,
size
);
if
(
nvif_unpack
(
args
->
v0
,
0
,
0
,
false
))
{
nvif_ioctl
(
parent
,
"create disp base channel dma vers %d "
"pushbuf %016llx head %d
\n
"
,
args
->
v0
.
version
,
args
->
v0
.
pushbuf
,
args
->
v0
.
head
);
if
(
args
->
v0
.
head
>
disp
->
head
.
nr
)
return
-
EINVAL
;
push
=
args
->
v0
.
pushbuf
;
head
=
args
->
v0
.
head
;
}
else
return
ret
;
return
nv50_disp_dmac_new_
(
func
,
mthd
,
root
,
chid
+
head
,
head
,
push
,
oclass
,
pobject
);
}
static
const
struct
nv50_disp_mthd_list
nv50_disp_base_mthd_base
=
{
.
mthd
=
0x0000
,
...
...
@@ -67,10 +99,11 @@ nv50_disp_base_mthd_image = {
}
};
const
struct
nv50_disp_mthd_chan
nv50_disp_base_
mthd_chan
=
{
static
const
struct
nv50_disp_chan_mthd
nv50_disp_base_
chan_mthd
=
{
.
name
=
"Base"
,
.
addr
=
0x000540
,
.
prev
=
0x000004
,
.
data
=
{
{
"Global"
,
1
,
&
nv50_disp_base_mthd_base
},
{
"Image"
,
2
,
&
nv50_disp_base_mthd_image
},
...
...
@@ -78,50 +111,13 @@ nv50_disp_base_mthd_chan = {
}
};
int
nv50_disp_base_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
union
{
struct
nv50_disp_base_channel_dma_v0
v0
;
}
*
args
=
data
;
struct
nv50_disp
*
disp
=
(
void
*
)
engine
;
struct
nv50_disp_dmac
*
dmac
;
int
ret
;
nvif_ioctl
(
parent
,
"create disp base channel dma size %d
\n
"
,
size
);
if
(
nvif_unpack
(
args
->
v0
,
0
,
0
,
false
))
{
nvif_ioctl
(
parent
,
"create disp base channel dma vers %d "
"pushbuf %016llx head %d
\n
"
,
args
->
v0
.
version
,
args
->
v0
.
pushbuf
,
args
->
v0
.
head
);
if
(
args
->
v0
.
head
>
disp
->
head
.
nr
)
return
-
EINVAL
;
}
else
return
ret
;
ret
=
nv50_disp_dmac_create_
(
parent
,
engine
,
oclass
,
args
->
v0
.
pushbuf
,
args
->
v0
.
head
,
sizeof
(
*
dmac
),
(
void
**
)
&
dmac
);
*
pobject
=
nv_object
(
dmac
);
if
(
ret
)
return
ret
;
return
0
;
}
struct
nv50_disp_chan_impl
nv50_disp_base_ofuncs
=
{
.
base
.
ctor
=
nv50_disp_base_ctor
,
.
base
.
dtor
=
nv50_disp_dmac_dtor
,
.
base
.
init
=
nv50_disp_dmac_init
,
.
base
.
fini
=
nv50_disp_dmac_fini
,
.
base
.
ntfy
=
nv50_disp_chan_ntfy
,
.
base
.
map
=
nv50_disp_chan_map
,
.
base
.
rd32
=
nv50_disp_chan_rd32
,
.
base
.
wr32
=
nv50_disp_chan_wr32
,
const
struct
nv50_disp_dmac_oclass
nv50_disp_base_oclass
=
{
.
base
.
oclass
=
NV50_DISP_BASE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_base_new
,
.
func
=
&
nv50_disp_dmac_func
,
.
mthd
=
&
nv50_disp_base_chan_mthd
,
.
chid
=
1
,
.
attach
=
nv50_disp_dmac_object_attach
,
.
detach
=
nv50_disp_dmac_object_detach
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.c
浏览文件 @
0ce41e3c
...
...
@@ -24,6 +24,10 @@
#include "channv50.h"
#include "rootnv50.h"
#include <core/client.h>
#include <core/ramht.h>
#include <engine/dma.h>
#include <nvif/class.h>
#include <nvif/event.h>
#include <nvif/unpack.h>
...
...
@@ -58,39 +62,38 @@ nv50_disp_mthd_list(struct nv50_disp *disp, int debug, u32 base, int c,
}
void
nv50_disp_mthd_chan
(
struct
nv50_disp
*
disp
,
int
debug
,
int
head
,
const
struct
nv50_disp_mthd_chan
*
chan
)
nv50_disp_chan_mthd
(
struct
nv50_disp_chan
*
chan
,
int
debug
)
{
struct
nvkm_object
*
object
=
nv_object
(
disp
);
const
struct
nv50_disp_impl
*
impl
=
(
void
*
)
object
->
oclass
;
const
struct
nv50_disp_mthd_list
*
list
;
struct
nv50_disp
*
disp
=
chan
->
root
->
disp
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
const
struct
nv50_disp_chan_mthd
*
mthd
=
chan
->
mthd
;
const
struct
nv50_disp_mthd_list
*
list
;
int
i
,
j
;
if
(
debug
>
nv_subdev
(
disp
)
->
debug
)
if
(
debug
>
subdev
->
debug
)
return
;
for
(
i
=
0
;
(
list
=
chan
->
data
[
i
].
mthd
)
!=
NULL
;
i
++
)
{
u32
base
=
head
*
chan
->
addr
;
for
(
j
=
0
;
j
<
chan
->
data
[
i
].
nr
;
j
++
,
base
+=
list
->
addr
)
{
const
char
*
cname
=
chan
->
name
;
for
(
i
=
0
;
(
list
=
mthd
->
data
[
i
].
mthd
)
!=
NULL
;
i
++
)
{
u32
base
=
chan
->
head
*
mthd
->
addr
;
for
(
j
=
0
;
j
<
mthd
->
data
[
i
].
nr
;
j
++
,
base
+=
list
->
addr
)
{
const
char
*
cname
=
mthd
->
name
;
const
char
*
sname
=
""
;
char
cname_
[
16
],
sname_
[
16
];
if
(
chan
->
addr
)
{
if
(
mthd
->
addr
)
{
snprintf
(
cname_
,
sizeof
(
cname_
),
"%s %d"
,
chan
->
name
,
hea
d
);
mthd
->
name
,
chan
->
chi
d
);
cname
=
cname_
;
}
if
(
chan
->
data
[
i
].
nr
>
1
)
{
if
(
mthd
->
data
[
i
].
nr
>
1
)
{
snprintf
(
sname_
,
sizeof
(
sname_
),
" - %s %d"
,
chan
->
data
[
i
].
name
,
j
);
mthd
->
data
[
i
].
name
,
j
);
sname
=
sname_
;
}
nvkm_printk_
(
subdev
,
debug
,
info
,
"%s%s:
\n
"
,
cname
,
sname
);
nv50_disp_mthd_list
(
disp
,
debug
,
base
,
impl
->
mthd
.
prev
,
nv50_disp_mthd_list
(
disp
,
debug
,
base
,
mthd
->
prev
,
list
,
j
);
}
}
...
...
@@ -127,7 +130,7 @@ int
nv50_disp_chan_uevent_ctor
(
struct
nvkm_object
*
object
,
void
*
data
,
u32
size
,
struct
nvkm_notify
*
notify
)
{
struct
nv50_disp_
dmac
*
dmac
=
(
void
*
)
object
;
struct
nv50_disp_
chan
*
chan
=
nv50_disp_chan
(
object
)
;
union
{
struct
nvif_notify_uevent_req
none
;
}
*
args
=
data
;
...
...
@@ -136,7 +139,7 @@ nv50_disp_chan_uevent_ctor(struct nvkm_object *object, void *data, u32 size,
if
(
nvif_unvers
(
args
->
none
))
{
notify
->
size
=
sizeof
(
struct
nvif_notify_uevent_rep
);
notify
->
types
=
1
;
notify
->
index
=
dmac
->
base
.
chid
;
notify
->
index
=
chan
->
chid
;
return
0
;
}
...
...
@@ -150,11 +153,32 @@ nv50_disp_chan_uevent = {
.
fini
=
nv50_disp_chan_uevent_fini
,
};
int
nv50_disp_chan_rd32
(
struct
nvkm_object
*
object
,
u64
addr
,
u32
*
data
)
{
struct
nv50_disp_chan
*
chan
=
nv50_disp_chan
(
object
);
struct
nv50_disp
*
disp
=
chan
->
root
->
disp
;
struct
nvkm_device
*
device
=
disp
->
base
.
engine
.
subdev
.
device
;
*
data
=
nvkm_rd32
(
device
,
0x640000
+
(
chan
->
chid
*
0x1000
)
+
addr
);
return
0
;
}
int
nv50_disp_chan_wr32
(
struct
nvkm_object
*
object
,
u64
addr
,
u32
data
)
{
struct
nv50_disp_chan
*
chan
=
nv50_disp_chan
(
object
);
struct
nv50_disp
*
disp
=
chan
->
root
->
disp
;
struct
nvkm_device
*
device
=
disp
->
base
.
engine
.
subdev
.
device
;
nvkm_wr32
(
device
,
0x640000
+
(
chan
->
chid
*
0x1000
)
+
addr
,
data
);
return
0
;
}
int
nv50_disp_chan_ntfy
(
struct
nvkm_object
*
object
,
u32
type
,
struct
nvkm_event
**
pevent
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_chan
*
chan
=
nv50_disp_chan
(
object
);
struct
nv50_disp
*
disp
=
chan
->
root
->
disp
;
switch
(
type
)
{
case
NV50_DISP_CORE_CHANNEL_DMA_V0_NTFY_UEVENT
:
*
pevent
=
&
disp
->
uevent
;
...
...
@@ -168,62 +192,110 @@ nv50_disp_chan_ntfy(struct nvkm_object *object, u32 type,
int
nv50_disp_chan_map
(
struct
nvkm_object
*
object
,
u64
*
addr
,
u32
*
size
)
{
struct
nv50_disp_chan
*
chan
=
(
void
*
)
object
;
*
addr
=
nv_device_resource_start
(
nv_device
(
object
),
0
)
+
struct
nv50_disp_chan
*
chan
=
nv50_disp_chan
(
object
);
struct
nv50_disp
*
disp
=
chan
->
root
->
disp
;
struct
nvkm_device
*
device
=
disp
->
base
.
engine
.
subdev
.
device
;
*
addr
=
nv_device_resource_start
(
device
,
0
)
+
0x640000
+
(
chan
->
chid
*
0x1000
);
*
size
=
0x001000
;
return
0
;
}
u32
nv50_disp_chan_rd32
(
struct
nvkm_object
*
object
,
u64
addr
)
static
int
nv50_disp_chan_child_new
(
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
struct
nv50_disp_chan
*
chan
=
(
void
*
)
object
;
struct
nvkm_device
*
device
=
object
->
engine
->
subdev
.
device
;
return
nvkm_rd32
(
device
,
0x640000
+
(
chan
->
chid
*
0x1000
)
+
addr
);
struct
nv50_disp_chan
*
chan
=
nv50_disp_chan
(
oclass
->
parent
);
return
chan
->
func
->
child_new
(
chan
,
oclass
,
data
,
size
,
pobject
);
}
void
nv50_disp_chan_wr32
(
struct
nvkm_object
*
object
,
u64
addr
,
u32
data
)
static
int
nv50_disp_chan_child_get
(
struct
nvkm_object
*
object
,
int
index
,
struct
nvkm_oclass
*
oclass
)
{
struct
nv50_disp_chan
*
chan
=
(
void
*
)
object
;
struct
nvkm_device
*
device
=
object
->
engine
->
subdev
.
device
;
nvkm_wr32
(
device
,
0x640000
+
(
chan
->
chid
*
0x1000
)
+
addr
,
data
);
struct
nv50_disp_chan
*
chan
=
nv50_disp_chan
(
object
);
if
(
chan
->
func
->
child_get
)
{
int
ret
=
chan
->
func
->
child_get
(
chan
,
index
,
oclass
);
if
(
ret
==
0
)
oclass
->
ctor
=
nv50_disp_chan_child_new
;
return
ret
;
}
return
-
EINVAL
;
}
void
nv50_disp_chan_
destroy
(
struct
nv50_disp_chan
*
chan
)
static
int
nv50_disp_chan_
fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
{
struct
nv50_disp_
root
*
root
=
(
void
*
)
nv_object
(
chan
)
->
parent
;
root
->
chan
&=
~
(
1
<<
chan
->
chid
);
nvkm_namedb_destroy
(
&
chan
->
base
)
;
struct
nv50_disp_
chan
*
chan
=
nv50_disp_chan
(
object
)
;
chan
->
func
->
fini
(
chan
);
return
0
;
}
int
nv50_disp_chan_create_
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
int
head
,
int
length
,
void
**
pobject
)
static
int
nv50_disp_chan_init
(
struct
nvkm_object
*
object
)
{
const
struct
nv50_disp_chan_impl
*
impl
=
(
void
*
)
oclass
->
ofuncs
;
struct
nv50_disp_root
*
root
=
(
void
*
)
parent
;
struct
nv50_disp_chan
*
chan
;
int
chid
=
impl
->
chid
+
head
;
int
ret
;
struct
nv50_disp_chan
*
chan
=
nv50_disp_chan
(
object
);
return
chan
->
func
->
init
(
chan
);
}
if
(
root
->
chan
&
(
1
<<
chid
))
return
-
EBUSY
;
root
->
chan
|=
(
1
<<
chid
);
static
void
*
nv50_disp_chan_dtor
(
struct
nvkm_object
*
object
)
{
struct
nv50_disp_chan
*
chan
=
nv50_disp_chan
(
object
);
struct
nv50_disp
*
disp
=
chan
->
root
->
disp
;
if
(
chan
->
chid
>=
0
)
disp
->
chan
[
chan
->
chid
]
=
NULL
;
return
chan
->
func
->
dtor
?
chan
->
func
->
dtor
(
chan
)
:
chan
;
}
ret
=
nvkm_namedb_create_
(
parent
,
engine
,
oclass
,
0
,
NULL
,
(
1ULL
<<
NVDEV_ENGINE_DMAOBJ
),
length
,
pobject
);
chan
=
*
pobject
;
if
(
ret
)
return
ret
;
static
const
struct
nvkm_object_func
nv50_disp_chan
=
{
.
dtor
=
nv50_disp_chan_dtor
,
.
init
=
nv50_disp_chan_init
,
.
fini
=
nv50_disp_chan_fini
,
.
rd32
=
nv50_disp_chan_rd32
,
.
wr32
=
nv50_disp_chan_wr32
,
.
ntfy
=
nv50_disp_chan_ntfy
,
.
map
=
nv50_disp_chan_map
,
.
sclass
=
nv50_disp_chan_child_get
,
};
int
nv50_disp_chan_ctor
(
const
struct
nv50_disp_chan_func
*
func
,
const
struct
nv50_disp_chan_mthd
*
mthd
,
struct
nv50_disp_root
*
root
,
int
chid
,
int
head
,
const
struct
nvkm_oclass
*
oclass
,
struct
nv50_disp_chan
*
chan
)
{
struct
nv50_disp
*
disp
=
root
->
disp
;
nvkm_object_ctor
(
&
nv50_disp_chan
,
oclass
,
&
chan
->
object
);
chan
->
func
=
func
;
chan
->
mthd
=
mthd
;
chan
->
root
=
root
;
chan
->
chid
=
chid
;
chan
->
head
=
head
;
nv_parent
(
chan
)
->
object_attach
=
impl
->
attach
;
nv_parent
(
chan
)
->
object_detach
=
impl
->
detach
;
if
(
disp
->
chan
[
chan
->
chid
])
{
chan
->
chid
=
-
1
;
return
-
EBUSY
;
}
disp
->
chan
[
chan
->
chid
]
=
chan
;
return
0
;
}
int
nv50_disp_chan_new_
(
const
struct
nv50_disp_chan_func
*
func
,
const
struct
nv50_disp_chan_mthd
*
mthd
,
struct
nv50_disp_root
*
root
,
int
chid
,
int
head
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
{
struct
nv50_disp_chan
*
chan
;
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
return
-
ENOMEM
;
*
pobject
=
&
chan
->
object
;
return
nv50_disp_chan_ctor
(
func
,
mthd
,
root
,
chid
,
head
,
oclass
,
chan
);
}
drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.h
浏览文件 @
0ce41e3c
#ifndef __NV50_DISP_CHAN_H__
#define __NV50_DISP_CHAN_H__
#define nv50_disp_chan(p) container_of((p), struct nv50_disp_chan, object)
#include "nv50.h"
struct
nv50_disp_chan_impl
{
struct
nvkm_ofuncs
base
;
struct
nv50_disp_chan
{
const
struct
nv50_disp_chan_func
*
func
;
const
struct
nv50_disp_chan_mthd
*
mthd
;
struct
nv50_disp_root
*
root
;
int
chid
;
int
(
*
attach
)(
struct
nvkm_object
*
,
struct
nvkm_object
*
,
u32
);
void
(
*
detach
)(
struct
nvkm_object
*
,
int
);
};
int
head
;
#include <core/namedb.h>
struct
nvkm_object
object
;
};
struct
nv50_disp_chan
{
struct
nvkm_namedb
base
;
int
chid
;
struct
nv50_disp_chan_func
{
void
*
(
*
dtor
)(
struct
nv50_disp_chan
*
);
int
(
*
init
)(
struct
nv50_disp_chan
*
);
void
(
*
fini
)(
struct
nv50_disp_chan
*
);
int
(
*
child_get
)(
struct
nv50_disp_chan
*
,
int
index
,
struct
nvkm_oclass
*
);
int
(
*
child_new
)(
struct
nv50_disp_chan
*
,
const
struct
nvkm_oclass
*
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
);
};
int
nv50_disp_chan_create_
(
struct
nvkm_object
*
,
struct
nvkm_object
*
,
struct
nvkm_oclass
*
,
int
,
int
,
void
**
);
void
nv50_disp_chan_destroy
(
struct
nv50_disp_chan
*
);
int
nv50_disp_chan_ntfy
(
struct
nvkm_object
*
,
u32
,
struct
nvkm_event
**
);
int
nv50_disp_chan_map
(
struct
nvkm_object
*
,
u64
*
,
u32
*
);
u32
nv50_disp_chan_rd32
(
struct
nvkm_object
*
,
u64
);
void
nv50_disp_chan_wr32
(
struct
nvkm_object
*
,
u64
,
u32
);
int
nv50_disp_chan_ctor
(
const
struct
nv50_disp_chan_func
*
,
const
struct
nv50_disp_chan_mthd
*
,
struct
nv50_disp_root
*
,
int
chid
,
int
head
,
const
struct
nvkm_oclass
*
,
struct
nv50_disp_chan
*
);
int
nv50_disp_chan_new_
(
const
struct
nv50_disp_chan_func
*
,
const
struct
nv50_disp_chan_mthd
*
,
struct
nv50_disp_root
*
,
int
chid
,
int
head
,
const
struct
nvkm_oclass
*
,
struct
nvkm_object
**
);
extern
const
struct
nv50_disp_chan_func
nv50_disp_pioc_func
;
extern
const
struct
nv50_disp_chan_func
gf119_disp_pioc_func
;
extern
const
struct
nvkm_event_func
nv50_disp_chan_uevent
;
int
nv50_disp_chan_uevent_ctor
(
struct
nvkm_object
*
,
void
*
,
u32
,
struct
nvkm_notify
*
);
...
...
@@ -30,24 +42,6 @@ void nv50_disp_chan_uevent_send(struct nv50_disp *, int);
extern
const
struct
nvkm_event_func
gf119_disp_chan_uevent
;
#define nv50_disp_chan_init(a) \
nvkm_namedb_init(&(a)->base)
#define nv50_disp_chan_fini(a,b) \
nvkm_namedb_fini(&(a)->base, (b))
struct
nv50_disp_pioc
{
struct
nv50_disp_chan
base
;
};
int
nv50_disp_pioc_create_
(
struct
nvkm_object
*
,
struct
nvkm_object
*
,
struct
nvkm_oclass
*
,
int
,
int
,
void
**
);
void
nv50_disp_pioc_dtor
(
struct
nvkm_object
*
);
int
nv50_disp_pioc_init
(
struct
nvkm_object
*
);
int
nv50_disp_pioc_fini
(
struct
nvkm_object
*
,
bool
);
int
gf119_disp_pioc_init
(
struct
nvkm_object
*
);
int
gf119_disp_pioc_fini
(
struct
nvkm_object
*
,
bool
);
struct
nv50_disp_mthd_list
{
u32
mthd
;
u32
addr
;
...
...
@@ -58,9 +52,10 @@ struct nv50_disp_mthd_list {
}
data
[];
};
struct
nv50_disp_
mthd_chan
{
struct
nv50_disp_
chan_mthd
{
const
char
*
name
;
u32
addr
;
s32
prev
;
struct
{
const
char
*
name
;
int
nr
;
...
...
@@ -68,36 +63,65 @@ struct nv50_disp_mthd_chan {
}
data
[];
};
void
nv50_disp_mthd_chan
(
struct
nv50_disp
*
,
int
debug
,
int
head
,
const
struct
nv50_disp_mthd_chan
*
);
void
nv50_disp_chan_mthd
(
struct
nv50_disp_chan
*
,
int
debug
);
extern
const
struct
nv50_disp_mthd_chan
nv50_disp_core_mthd_chan
;
extern
const
struct
nv50_disp_mthd_list
nv50_disp_core_mthd_base
;
extern
const
struct
nv50_disp_mthd_list
nv50_disp_core_mthd_sor
;
extern
const
struct
nv50_disp_mthd_list
nv50_disp_core_mthd_pior
;
extern
const
struct
nv50_disp_mthd_chan
nv50_disp_base_mthd_chan
;
extern
const
struct
nv50_disp_mthd_list
nv50_disp_base_mthd_image
;
extern
const
struct
nv50_disp_mthd_chan
nv50_disp_ovly_mthd_chan
;
extern
const
struct
nv50_disp_mthd_list
nv50_disp_ovly_mthd_base
;
extern
const
struct
nv50_disp_
mthd_chan
g84_disp_core_mthd_chan
;
extern
const
struct
nv50_disp_
chan_mthd
g84_disp_core_chan_mthd
;
extern
const
struct
nv50_disp_mthd_list
g84_disp_core_mthd_dac
;
extern
const
struct
nv50_disp_mthd_list
g84_disp_core_mthd_head
;
extern
const
struct
nv50_disp_mthd_chan
g84_disp_base_mthd_chan
;
extern
const
struct
nv50_disp_mthd_chan
g84_disp_ovly_mthd_chan
;
extern
const
struct
nv50_disp_mthd_chan
g94_disp_core_mthd_chan
;
extern
const
struct
nv50_disp_chan_mthd
g84_disp_base_chan_mthd
;
extern
const
struct
nv50_disp_chan_mthd
g84_disp_ovly_chan_mthd
;
extern
const
struct
nv50_disp_
mthd_chan
gt200_disp_ovly_mthd_chan
;
extern
const
struct
nv50_disp_
chan_mthd
g94_disp_core_chan_mthd
;
extern
const
struct
nv50_disp_mthd_chan
gf119_disp_core_mthd_chan
;
extern
const
struct
nv50_disp_mthd_list
gf119_disp_core_mthd_base
;
extern
const
struct
nv50_disp_mthd_list
gf119_disp_core_mthd_dac
;
extern
const
struct
nv50_disp_mthd_list
gf119_disp_core_mthd_sor
;
extern
const
struct
nv50_disp_mthd_list
gf119_disp_core_mthd_pior
;
extern
const
struct
nv50_disp_mthd_chan
gf119_disp_base_mthd_chan
;
extern
const
struct
nv50_disp_mthd_chan
gf119_disp_ovly_mthd_chan
;
extern
const
struct
nv50_disp_chan_mthd
gf119_disp_base_chan_mthd
;
extern
const
struct
nv50_disp_chan_mthd
gk104_disp_core_chan_mthd
;
struct
nv50_disp_pioc_oclass
{
int
(
*
ctor
)(
const
struct
nv50_disp_chan_func
*
,
const
struct
nv50_disp_chan_mthd
*
,
struct
nv50_disp_root
*
,
int
chid
,
const
struct
nvkm_oclass
*
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
);
struct
nvkm_sclass
base
;
const
struct
nv50_disp_chan_func
*
func
;
const
struct
nv50_disp_chan_mthd
*
mthd
;
int
chid
;
};
extern
const
struct
nv50_disp_pioc_oclass
nv50_disp_oimm_oclass
;
extern
const
struct
nv50_disp_pioc_oclass
nv50_disp_curs_oclass
;
extern
const
struct
nv50_disp_pioc_oclass
g84_disp_oimm_oclass
;
extern
const
struct
nv50_disp_pioc_oclass
g84_disp_curs_oclass
;
extern
const
struct
nv50_disp_pioc_oclass
gt215_disp_oimm_oclass
;
extern
const
struct
nv50_disp_pioc_oclass
gt215_disp_curs_oclass
;
extern
const
struct
nv50_disp_pioc_oclass
gf119_disp_oimm_oclass
;
extern
const
struct
nv50_disp_pioc_oclass
gf119_disp_curs_oclass
;
extern
const
struct
nv50_disp_pioc_oclass
gk104_disp_oimm_oclass
;
extern
const
struct
nv50_disp_pioc_oclass
gk104_disp_curs_oclass
;
extern
const
struct
nv50_disp_mthd_chan
gk104_disp_core_mthd_chan
;
extern
const
struct
nv50_disp_mthd_chan
gk104_disp_ovly_mthd_chan
;
int
nv50_disp_curs_new
(
const
struct
nv50_disp_chan_func
*
,
const
struct
nv50_disp_chan_mthd
*
,
struct
nv50_disp_root
*
,
int
chid
,
const
struct
nvkm_oclass
*
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
);
int
nv50_disp_oimm_new
(
const
struct
nv50_disp_chan_func
*
,
const
struct
nv50_disp_chan_mthd
*
,
struct
nv50_disp_root
*
,
int
chid
,
const
struct
nvkm_oclass
*
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
);
#endif
drivers/gpu/drm/nouveau/nvkm/engine/disp/coreg84.c
浏览文件 @
0ce41e3c
...
...
@@ -22,6 +22,9 @@
* Authors: Ben Skeggs
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_mthd_list
g84_disp_core_mthd_dac
=
{
...
...
@@ -87,10 +90,11 @@ g84_disp_core_mthd_head = {
}
};
const
struct
nv50_disp_
mthd_chan
g84_disp_core_
mthd_chan
=
{
const
struct
nv50_disp_
chan_mthd
g84_disp_core_
chan_mthd
=
{
.
name
=
"Core"
,
.
addr
=
0x000000
,
.
prev
=
0x000004
,
.
data
=
{
{
"Global"
,
1
,
&
nv50_disp_core_mthd_base
},
{
"DAC"
,
3
,
&
g84_disp_core_mthd_dac
},
...
...
@@ -100,3 +104,14 @@ g84_disp_core_mthd_chan = {
{}
}
};
const
struct
nv50_disp_dmac_oclass
g84_disp_core_oclass
=
{
.
base
.
oclass
=
G82_DISP_CORE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_core_new
,
.
func
=
&
nv50_disp_core_func
,
.
mthd
=
&
g84_disp_core_chan_mthd
,
.
chid
=
0
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/coreg94.c
浏览文件 @
0ce41e3c
...
...
@@ -22,6 +22,9 @@
* Authors: Ben Skeggs
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_mthd_list
g94_disp_core_mthd_sor
=
{
...
...
@@ -33,10 +36,11 @@ g94_disp_core_mthd_sor = {
}
};
const
struct
nv50_disp_
mthd_chan
g94_disp_core_
mthd_chan
=
{
const
struct
nv50_disp_
chan_mthd
g94_disp_core_
chan_mthd
=
{
.
name
=
"Core"
,
.
addr
=
0x000000
,
.
prev
=
0x000004
,
.
data
=
{
{
"Global"
,
1
,
&
nv50_disp_core_mthd_base
},
{
"DAC"
,
3
,
&
g84_disp_core_mthd_dac
},
...
...
@@ -46,3 +50,14 @@ g94_disp_core_mthd_chan = {
{}
}
};
const
struct
nv50_disp_dmac_oclass
g94_disp_core_oclass
=
{
.
base
.
oclass
=
GT206_DISP_CORE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_core_new
,
.
func
=
&
nv50_disp_core_func
,
.
mthd
=
&
g94_disp_core_chan_mthd
,
.
chid
=
0
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregf119.c
浏览文件 @
0ce41e3c
...
...
@@ -22,9 +22,14 @@
* Authors: Ben Skeggs
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <core/client.h>
#include <subdev/timer.h>
#include <nvif/class.h>
#include <nvif/unpack.h>
const
struct
nv50_disp_mthd_list
gf119_disp_core_mthd_base
=
{
.
mthd
=
0x0000
,
...
...
@@ -151,10 +156,11 @@ gf119_disp_core_mthd_head = {
}
};
const
struct
nv50_disp_mthd_chan
gf119_disp_core_
mthd_chan
=
{
static
const
struct
nv50_disp_chan_mthd
gf119_disp_core_
chan_mthd
=
{
.
name
=
"Core"
,
.
addr
=
0x000000
,
.
prev
=
-
0x020000
,
.
data
=
{
{
"Global"
,
1
,
&
gf119_disp_core_mthd_base
},
{
"DAC"
,
3
,
&
gf119_disp_core_mthd_dac
},
...
...
@@ -165,11 +171,10 @@ gf119_disp_core_mthd_chan = {
}
};
static
int
gf119_disp_core_fini
(
struct
nv
km_object
*
object
,
bool
suspend
)
static
void
gf119_disp_core_fini
(
struct
nv
50_disp_dmac
*
chan
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_dmac
*
mast
=
(
void
*
)
object
;
struct
nv50_disp
*
disp
=
chan
->
base
.
root
->
disp
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
...
...
@@ -182,35 +187,25 @@ gf119_disp_core_fini(struct nvkm_object *object, bool suspend)
)
<
0
)
{
nvkm_error
(
subdev
,
"core fini: %08x
\n
"
,
nvkm_rd32
(
device
,
0x610490
));
if
(
suspend
)
return
-
EBUSY
;
}
/* disable error reporting and completion notification */
nvkm_mask
(
device
,
0x610090
,
0x00000001
,
0x00000000
);
nvkm_mask
(
device
,
0x6100a0
,
0x00000001
,
0x00000000
);
return
nv50_disp_chan_fini
(
&
mast
->
base
,
suspend
);
}
static
int
gf119_disp_core_init
(
struct
nv
km_object
*
object
)
gf119_disp_core_init
(
struct
nv
50_disp_dmac
*
chan
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_dmac
*
mast
=
(
void
*
)
object
;
struct
nv50_disp
*
disp
=
chan
->
base
.
root
->
disp
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
int
ret
;
ret
=
nv50_disp_chan_init
(
&
mast
->
base
);
if
(
ret
)
return
ret
;
/* enable error reporting */
nvkm_mask
(
device
,
0x6100a0
,
0x00000001
,
0x00000001
);
/* initialise channel for dma command submission */
nvkm_wr32
(
device
,
0x610494
,
mast
->
push
);
nvkm_wr32
(
device
,
0x610494
,
chan
->
push
);
nvkm_wr32
(
device
,
0x610498
,
0x00010000
);
nvkm_wr32
(
device
,
0x61049c
,
0x00000001
);
nvkm_mask
(
device
,
0x610490
,
0x00000010
,
0x00000010
);
...
...
@@ -230,17 +225,20 @@ gf119_disp_core_init(struct nvkm_object *object)
return
0
;
}
struct
nv50_disp_chan_impl
gf119_disp_core_ofuncs
=
{
.
base
.
ctor
=
nv50_disp_core_ctor
,
.
base
.
dtor
=
nv50_disp_dmac_dtor
,
.
base
.
init
=
gf119_disp_core_init
,
.
base
.
fini
=
gf119_disp_core_fini
,
.
base
.
ntfy
=
nv50_disp_chan_ntfy
,
.
base
.
map
=
nv50_disp_chan_map
,
.
base
.
rd32
=
nv50_disp_chan_rd32
,
.
base
.
wr32
=
nv50_disp_chan_wr32
,
const
struct
nv50_disp_dmac_func
gf119_disp_core_func
=
{
.
init
=
gf119_disp_core_init
,
.
fini
=
gf119_disp_core_fini
,
.
bind
=
gf119_disp_dmac_bind
,
};
const
struct
nv50_disp_dmac_oclass
gf119_disp_core_oclass
=
{
.
base
.
oclass
=
GF110_DISP_CORE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_core_new
,
.
func
=
&
gf119_disp_core_func
,
.
mthd
=
&
gf119_disp_core_chan_mthd
,
.
chid
=
0
,
.
attach
=
gf119_disp_dmac_object_attach
,
.
detach
=
gf119_disp_dmac_object_detach
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregk104.c
浏览文件 @
0ce41e3c
...
...
@@ -22,6 +22,9 @@
* Authors: Ben Skeggs
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
static
const
struct
nv50_disp_mthd_list
gk104_disp_core_mthd_head
=
{
...
...
@@ -102,10 +105,11 @@ gk104_disp_core_mthd_head = {
}
};
const
struct
nv50_disp_
mthd_chan
gk104_disp_core_
mthd_chan
=
{
const
struct
nv50_disp_
chan_mthd
gk104_disp_core_
chan_mthd
=
{
.
name
=
"Core"
,
.
addr
=
0x000000
,
.
prev
=
-
0x020000
,
.
data
=
{
{
"Global"
,
1
,
&
gf119_disp_core_mthd_base
},
{
"DAC"
,
3
,
&
gf119_disp_core_mthd_dac
},
...
...
@@ -115,3 +119,14 @@ gk104_disp_core_mthd_chan = {
{}
}
};
const
struct
nv50_disp_dmac_oclass
gk104_disp_core_oclass
=
{
.
base
.
oclass
=
GK104_DISP_CORE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_core_new
,
.
func
=
&
gf119_disp_core_func
,
.
mthd
=
&
gk104_disp_core_chan_mthd
,
.
chid
=
0
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregk110.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2015 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_dmac_oclass
gk110_disp_core_oclass
=
{
.
base
.
oclass
=
GK110_DISP_CORE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_core_new
,
.
func
=
&
gf119_disp_core_func
,
.
mthd
=
&
gk104_disp_core_chan_mthd
,
.
chid
=
0
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregm107.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2015 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_dmac_oclass
gm107_disp_core_oclass
=
{
.
base
.
oclass
=
GM107_DISP_CORE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_core_new
,
.
func
=
&
gf119_disp_core_func
,
.
mthd
=
&
gk104_disp_core_chan_mthd
,
.
chid
=
0
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregm204.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2015 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_dmac_oclass
gm204_disp_core_oclass
=
{
.
base
.
oclass
=
GM204_DISP_CORE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_core_new
,
.
func
=
&
gf119_disp_core_func
,
.
mthd
=
&
gk104_disp_core_chan_mthd
,
.
chid
=
0
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregt200.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2015 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_dmac_oclass
gt200_disp_core_oclass
=
{
.
base
.
oclass
=
GT200_DISP_CORE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_core_new
,
.
func
=
&
nv50_disp_core_func
,
.
mthd
=
&
g84_disp_core_chan_mthd
,
.
chid
=
0
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/coregt215.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2015 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_dmac_oclass
gt215_disp_core_oclass
=
{
.
base
.
oclass
=
GT214_DISP_CORE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_core_new
,
.
func
=
&
nv50_disp_core_func
,
.
mthd
=
&
g94_disp_core_chan_mthd
,
.
chid
=
0
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/corenv50.c
浏览文件 @
0ce41e3c
...
...
@@ -22,6 +22,7 @@
* Authors: Ben Skeggs
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <core/client.h>
#include <subdev/timer.h>
...
...
@@ -29,6 +30,33 @@
#include <nvif/class.h>
#include <nvif/unpack.h>
int
nv50_disp_core_new
(
const
struct
nv50_disp_dmac_func
*
func
,
const
struct
nv50_disp_chan_mthd
*
mthd
,
struct
nv50_disp_root
*
root
,
int
chid
,
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
union
{
struct
nv50_disp_core_channel_dma_v0
v0
;
}
*
args
=
data
;
struct
nvkm_object
*
parent
=
oclass
->
parent
;
u64
push
;
int
ret
;
nvif_ioctl
(
parent
,
"create disp core channel dma size %d
\n
"
,
size
);
if
(
nvif_unpack
(
args
->
v0
,
0
,
0
,
false
))
{
nvif_ioctl
(
parent
,
"create disp core channel dma vers %d "
"pushbuf %016llx
\n
"
,
args
->
v0
.
version
,
args
->
v0
.
pushbuf
);
push
=
args
->
v0
.
pushbuf
;
}
else
return
ret
;
return
nv50_disp_dmac_new_
(
func
,
mthd
,
root
,
chid
,
0
,
push
,
oclass
,
pobject
);
}
const
struct
nv50_disp_mthd_list
nv50_disp_core_mthd_base
=
{
.
mthd
=
0x0000
,
...
...
@@ -121,10 +149,11 @@ nv50_disp_core_mthd_head = {
}
};
const
struct
nv50_disp_mthd_chan
nv50_disp_core_
mthd_chan
=
{
static
const
struct
nv50_disp_chan_mthd
nv50_disp_core_
chan_mthd
=
{
.
name
=
"Core"
,
.
addr
=
0x000000
,
.
prev
=
0x000004
,
.
data
=
{
{
"Global"
,
1
,
&
nv50_disp_core_mthd_base
},
{
"DAC"
,
3
,
&
nv50_disp_core_mthd_dac
},
...
...
@@ -135,11 +164,10 @@ nv50_disp_core_mthd_chan = {
}
};
static
int
nv50_disp_core_fini
(
struct
nv
km_object
*
object
,
bool
suspend
)
static
void
nv50_disp_core_fini
(
struct
nv
50_disp_dmac
*
chan
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_dmac
*
mast
=
(
void
*
)
object
;
struct
nv50_disp
*
disp
=
chan
->
base
.
root
->
disp
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
...
...
@@ -152,28 +180,18 @@ nv50_disp_core_fini(struct nvkm_object *object, bool suspend)
)
<
0
)
{
nvkm_error
(
subdev
,
"core fini: %08x
\n
"
,
nvkm_rd32
(
device
,
0x610200
));
if
(
suspend
)
return
-
EBUSY
;
}
/* disable error reporting and completion notifications */
nvkm_mask
(
device
,
0x610028
,
0x00010001
,
0x00000000
);
return
nv50_disp_chan_fini
(
&
mast
->
base
,
suspend
);
}
static
int
nv50_disp_core_init
(
struct
nv
km_object
*
object
)
nv50_disp_core_init
(
struct
nv
50_disp_dmac
*
chan
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_dmac
*
mast
=
(
void
*
)
object
;
struct
nv50_disp
*
disp
=
chan
->
base
.
root
->
disp
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
int
ret
;
ret
=
nv50_disp_chan_init
(
&
mast
->
base
);
if
(
ret
)
return
ret
;
/* enable error reporting */
nvkm_mask
(
device
,
0x610028
,
0x00010000
,
0x00010000
);
...
...
@@ -185,7 +203,7 @@ nv50_disp_core_init(struct nvkm_object *object)
nvkm_mask
(
device
,
0x610200
,
0x00600000
,
0x00600000
);
/* initialise channel for dma command submission */
nvkm_wr32
(
device
,
0x610204
,
mast
->
push
);
nvkm_wr32
(
device
,
0x610204
,
chan
->
push
);
nvkm_wr32
(
device
,
0x610208
,
0x00010000
);
nvkm_wr32
(
device
,
0x61020c
,
0x00000000
);
nvkm_mask
(
device
,
0x610200
,
0x00000010
,
0x00000010
);
...
...
@@ -205,46 +223,20 @@ nv50_disp_core_init(struct nvkm_object *object)
return
0
;
}
int
nv50_disp_core_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
union
{
struct
nv50_disp_core_channel_dma_v0
v0
;
}
*
args
=
data
;
struct
nv50_disp_dmac
*
mast
;
int
ret
;
nvif_ioctl
(
parent
,
"create disp core channel dma size %d
\n
"
,
size
);
if
(
nvif_unpack
(
args
->
v0
,
0
,
0
,
false
))
{
nvif_ioctl
(
parent
,
"create disp core channel dma vers %d "
"pushbuf %016llx
\n
"
,
args
->
v0
.
version
,
args
->
v0
.
pushbuf
);
}
else
return
ret
;
ret
=
nv50_disp_dmac_create_
(
parent
,
engine
,
oclass
,
args
->
v0
.
pushbuf
,
0
,
sizeof
(
*
mast
),
(
void
**
)
&
mast
);
*
pobject
=
nv_object
(
mast
);
if
(
ret
)
return
ret
;
return
0
;
}
const
struct
nv50_disp_dmac_func
nv50_disp_core_func
=
{
.
init
=
nv50_disp_core_init
,
.
fini
=
nv50_disp_core_fini
,
.
bind
=
nv50_disp_dmac_bind
,
};
struct
nv50_disp_chan_impl
nv50_disp_core_ofuncs
=
{
.
base
.
ctor
=
nv50_disp_core_ctor
,
.
base
.
dtor
=
nv50_disp_dmac_dtor
,
.
base
.
init
=
nv50_disp_core_init
,
.
base
.
fini
=
nv50_disp_core_fini
,
.
base
.
map
=
nv50_disp_chan_map
,
.
base
.
ntfy
=
nv50_disp_chan_ntfy
,
.
base
.
rd32
=
nv50_disp_chan_rd32
,
.
base
.
wr32
=
nv50_disp_chan_wr32
,
const
struct
nv50_disp_dmac_oclass
nv50_disp_core_oclass
=
{
.
base
.
oclass
=
NV50_DISP_CORE_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_core_new
,
.
func
=
&
nv50_disp_core_func
,
.
mthd
=
&
nv50_disp_core_chan_mthd
,
.
chid
=
0
,
.
attach
=
nv50_disp_dmac_object_attach
,
.
detach
=
nv50_disp_dmac_object_detach
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursg84.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2015 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "channv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_pioc_oclass
g84_disp_curs_oclass
=
{
.
base
.
oclass
=
G82_DISP_CURSOR
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_curs_new
,
.
func
=
&
nv50_disp_pioc_func
,
.
chid
=
7
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursgf119.c
浏览文件 @
0ce41e3c
...
...
@@ -22,16 +22,16 @@
* Authors: Ben Skeggs
*/
#include "channv50.h"
#include "rootnv50.h"
struct
nv50_disp_chan_impl
gf119_disp_curs_ofuncs
=
{
.
base
.
ctor
=
nv50_disp_curs_ctor
,
.
base
.
dtor
=
nv50_disp_pioc_dtor
,
.
base
.
init
=
gf119_disp_pioc_init
,
.
base
.
fini
=
gf119_disp_pioc_fini
,
.
base
.
ntfy
=
nv50_disp_chan_ntfy
,
.
base
.
map
=
nv50_disp_chan_map
,
.
base
.
rd32
=
nv50_disp_chan_rd32
,
.
base
.
wr32
=
nv50_disp_chan_wr32
,
#include <nvif/class.h>
const
struct
nv50_disp_pioc_oclass
gf119_disp_curs_oclass
=
{
.
base
.
oclass
=
GF110_DISP_CURSOR
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_curs_new
,
.
func
=
&
gf119_disp_pioc_func
,
.
chid
=
13
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursgk104.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2012 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.
*
* Authors: Ben Skeggs
*/
#include "channv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_pioc_oclass
gk104_disp_curs_oclass
=
{
.
base
.
oclass
=
GK104_DISP_CURSOR
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_curs_new
,
.
func
=
&
gf119_disp_pioc_func
,
.
chid
=
13
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursgt215.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2015 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "channv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_pioc_oclass
gt215_disp_curs_oclass
=
{
.
base
.
oclass
=
GT214_DISP_CURSOR
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_curs_new
,
.
func
=
&
nv50_disp_pioc_func
,
.
chid
=
7
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/cursnv50.c
浏览文件 @
0ce41e3c
...
...
@@ -22,6 +22,7 @@
* Authors: Ben Skeggs
*/
#include "channv50.h"
#include "rootnv50.h"
#include <core/client.h>
...
...
@@ -29,17 +30,18 @@
#include <nvif/unpack.h>
int
nv50_disp_curs_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
nv50_disp_curs_new
(
const
struct
nv50_disp_chan_func
*
func
,
const
struct
nv50_disp_chan_mthd
*
mthd
,
struct
nv50_disp_root
*
root
,
int
chid
,
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
union
{
struct
nv50_disp_cursor_v0
v0
;
}
*
args
=
data
;
struct
nv
50_disp
*
disp
=
(
void
*
)
engine
;
struct
nv50_disp
_pioc
*
pioc
;
int
ret
;
struct
nv
km_object
*
parent
=
oclass
->
parent
;
struct
nv50_disp
*
disp
=
root
->
disp
;
int
head
,
ret
;
nvif_ioctl
(
parent
,
"create disp cursor size %d
\n
"
,
size
);
if
(
nvif_unpack
(
args
->
v0
,
0
,
0
,
false
))
{
...
...
@@ -47,27 +49,20 @@ nv50_disp_curs_ctor(struct nvkm_object *parent,
args
->
v0
.
version
,
args
->
v0
.
head
);
if
(
args
->
v0
.
head
>
disp
->
head
.
nr
)
return
-
EINVAL
;
head
=
args
->
v0
.
head
;
}
else
return
ret
;
ret
=
nv50_disp_pioc_create_
(
parent
,
engine
,
oclass
,
args
->
v0
.
head
,
sizeof
(
*
pioc
),
(
void
**
)
&
pioc
);
*
pobject
=
nv_object
(
pioc
);
if
(
ret
)
return
ret
;
return
0
;
return
nv50_disp_chan_new_
(
func
,
mthd
,
root
,
chid
+
head
,
head
,
oclass
,
pobject
);
}
struct
nv50_disp_chan_impl
nv50_disp_curs_ofuncs
=
{
.
base
.
ctor
=
nv50_disp_curs_ctor
,
.
base
.
dtor
=
nv50_disp_pioc_dtor
,
.
base
.
init
=
nv50_disp_pioc_init
,
.
base
.
fini
=
nv50_disp_pioc_fini
,
.
base
.
ntfy
=
nv50_disp_chan_ntfy
,
.
base
.
map
=
nv50_disp_chan_map
,
.
base
.
rd32
=
nv50_disp_chan_rd32
,
.
base
.
wr32
=
nv50_disp_chan_wr32
,
const
struct
nv50_disp_pioc_oclass
nv50_disp_curs_oclass
=
{
.
base
.
oclass
=
NV50_DISP_CURSOR
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_curs_new
,
.
func
=
&
nv50_disp_pioc_func
,
.
chid
=
7
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/dmacgf119.c
浏览文件 @
0ce41e3c
...
...
@@ -27,32 +27,22 @@
#include <core/ramht.h>
#include <subdev/timer.h>
void
gf119_disp_dmac_object_detach
(
struct
nvkm_object
*
parent
,
int
cookie
)
{
struct
nv50_disp_root
*
root
=
(
void
*
)
parent
->
parent
;
nvkm_ramht_remove
(
root
->
ramht
,
cookie
);
}
int
gf119_disp_dmac_
object_attach
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
object
,
u32
nam
e
)
gf119_disp_dmac_
bind
(
struct
nv50_disp_dmac
*
chan
,
struct
nvkm_object
*
object
,
u32
handl
e
)
{
struct
nv50_disp_root
*
root
=
(
void
*
)
parent
->
parent
;
struct
nv50_disp_chan
*
chan
=
(
void
*
)
parent
;
u32
addr
=
nv_gpuobj
(
object
)
->
node
->
offset
;
u32
data
=
(
chan
->
chid
<<
27
)
|
(
addr
<<
9
)
|
0x00000001
;
return
nvkm_ramht_insert
(
root
->
ramht
,
NULL
,
chan
->
chid
,
0
,
name
,
data
);
return
nvkm_ramht_insert
(
chan
->
base
.
root
->
ramht
,
object
,
chan
->
base
.
chid
,
-
9
,
handle
,
chan
->
base
.
chid
<<
27
|
0x00000001
);
}
int
gf119_disp_dmac_fini
(
struct
nv
km_object
*
object
,
bool
suspend
)
static
void
gf119_disp_dmac_fini
(
struct
nv
50_disp_dmac
*
chan
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_dmac
*
dmac
=
(
void
*
)
object
;
struct
nv50_disp
*
disp
=
chan
->
base
.
root
->
disp
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
int
chid
=
dmac
->
base
.
chid
;
int
chid
=
chan
->
base
.
chid
;
/* deactivate channel */
nvkm_mask
(
device
,
0x610490
+
(
chid
*
0x0010
),
0x00001010
,
0x00001000
);
...
...
@@ -63,36 +53,26 @@ gf119_disp_dmac_fini(struct nvkm_object *object, bool suspend)
)
<
0
)
{
nvkm_error
(
subdev
,
"ch %d fini: %08x
\n
"
,
chid
,
nvkm_rd32
(
device
,
0x610490
+
(
chid
*
0x10
)));
if
(
suspend
)
return
-
EBUSY
;
}
/* disable error reporting and completion notification */
nvkm_mask
(
device
,
0x610090
,
0x00000001
<<
chid
,
0x00000000
);
nvkm_mask
(
device
,
0x6100a0
,
0x00000001
<<
chid
,
0x00000000
);
return
nv50_disp_chan_fini
(
&
dmac
->
base
,
suspend
);
}
int
gf119_disp_dmac_init
(
struct
nv
km_object
*
object
)
static
int
gf119_disp_dmac_init
(
struct
nv
50_disp_dmac
*
chan
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_dmac
*
dmac
=
(
void
*
)
object
;
struct
nv50_disp
*
disp
=
chan
->
base
.
root
->
disp
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
int
chid
=
dmac
->
base
.
chid
;
int
ret
;
ret
=
nv50_disp_chan_init
(
&
dmac
->
base
);
if
(
ret
)
return
ret
;
int
chid
=
chan
->
base
.
chid
;
/* enable error reporting */
nvkm_mask
(
device
,
0x6100a0
,
0x00000001
<<
chid
,
0x00000001
<<
chid
);
/* initialise channel for dma command submission */
nvkm_wr32
(
device
,
0x610494
+
(
chid
*
0x0010
),
dmac
->
push
);
nvkm_wr32
(
device
,
0x610494
+
(
chid
*
0x0010
),
chan
->
push
);
nvkm_wr32
(
device
,
0x610498
+
(
chid
*
0x0010
),
0x00010000
);
nvkm_wr32
(
device
,
0x61049c
+
(
chid
*
0x0010
),
0x00000001
);
nvkm_mask
(
device
,
0x610490
+
(
chid
*
0x0010
),
0x00000010
,
0x00000010
);
...
...
@@ -111,3 +91,10 @@ gf119_disp_dmac_init(struct nvkm_object *object)
return
0
;
}
const
struct
nv50_disp_dmac_func
gf119_disp_dmac_func
=
{
.
init
=
gf119_disp_dmac_init
,
.
fini
=
gf119_disp_dmac_fini
,
.
bind
=
gf119_disp_dmac_bind
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/dmacnv50.c
浏览文件 @
0ce41e3c
...
...
@@ -26,38 +26,172 @@
#include <core/client.h>
#include <core/handle.h>
#include <core/oproxy.h>
#include <core/ramht.h>
#include <subdev/fb.h>
#include <subdev/timer.h>
#include <engine/dma.h>
void
nv50_disp_dmac_object_detach
(
struct
nvkm_object
*
parent
,
int
cookie
)
struct
nv50_disp_dmac_object
{
struct
nvkm_oproxy
oproxy
;
struct
nv50_disp_root
*
root
;
int
hash
;
};
static
void
nv50_disp_dmac_child_del_
(
struct
nvkm_oproxy
*
base
)
{
struct
nv50_disp_dmac_object
*
object
=
container_of
(
base
,
typeof
(
*
object
),
oproxy
);
nvkm_ramht_remove
(
object
->
root
->
ramht
,
object
->
hash
);
}
static
const
struct
nvkm_oproxy_func
nv50_disp_dmac_child_func_
=
{
.
dtor
[
0
]
=
nv50_disp_dmac_child_del_
,
};
static
int
nv50_disp_dmac_child_new_
(
struct
nv50_disp_chan
*
base
,
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
struct
nv50_disp_dmac
*
chan
=
nv50_disp_dmac
(
base
);
struct
nv50_disp_root
*
root
=
chan
->
base
.
root
;
struct
nvkm_device
*
device
=
root
->
disp
->
base
.
engine
.
subdev
.
device
;
const
struct
nvkm_device_oclass
*
sclass
=
oclass
->
priv
;
struct
nv50_disp_dmac_object
*
object
;
int
ret
;
if
(
!
(
object
=
kzalloc
(
sizeof
(
*
object
),
GFP_KERNEL
)))
return
-
ENOMEM
;
nvkm_oproxy_ctor
(
&
nv50_disp_dmac_child_func_
,
oclass
,
&
object
->
oproxy
);
object
->
root
=
root
;
*
pobject
=
&
object
->
oproxy
.
base
;
ret
=
sclass
->
ctor
(
device
,
oclass
,
data
,
size
,
&
object
->
oproxy
.
object
);
if
(
ret
)
return
ret
;
object
->
hash
=
chan
->
func
->
bind
(
chan
,
object
->
oproxy
.
object
,
oclass
->
handle
);
if
(
object
->
hash
<
0
)
return
object
->
hash
;
return
0
;
}
static
int
nv50_disp_dmac_child_get_
(
struct
nv50_disp_chan
*
base
,
int
index
,
struct
nvkm_oclass
*
sclass
)
{
struct
nv50_disp_dmac
*
chan
=
nv50_disp_dmac
(
base
);
struct
nv50_disp
*
disp
=
chan
->
base
.
root
->
disp
;
struct
nvkm_device
*
device
=
disp
->
base
.
engine
.
subdev
.
device
;
const
struct
nvkm_device_oclass
*
oclass
=
NULL
;
sclass
->
engine
=
nvkm_device_engine
(
device
,
NVDEV_ENGINE_DMAOBJ
);
if
(
sclass
->
engine
&&
sclass
->
engine
->
func
->
base
.
sclass
)
{
sclass
->
engine
->
func
->
base
.
sclass
(
sclass
,
index
,
&
oclass
);
if
(
oclass
)
{
sclass
->
priv
=
oclass
;
return
0
;
}
}
return
-
EINVAL
;
}
static
void
nv50_disp_dmac_fini_
(
struct
nv50_disp_chan
*
base
)
{
struct
nv50_disp_dmac
*
chan
=
nv50_disp_dmac
(
base
);
chan
->
func
->
fini
(
chan
);
}
static
int
nv50_disp_dmac_init_
(
struct
nv50_disp_chan
*
base
)
{
struct
nv50_disp_dmac
*
chan
=
nv50_disp_dmac
(
base
);
return
chan
->
func
->
init
(
chan
);
}
static
void
*
nv50_disp_dmac_dtor_
(
struct
nv50_disp_chan
*
base
)
{
struct
nv50_disp_root
*
root
=
(
void
*
)
parent
->
parent
;
nvkm_ramht_remove
(
root
->
ramht
,
cookie
);
return
nv50_disp_dmac
(
base
);
}
static
const
struct
nv50_disp_chan_func
nv50_disp_dmac_func_
=
{
.
dtor
=
nv50_disp_dmac_dtor_
,
.
init
=
nv50_disp_dmac_init_
,
.
fini
=
nv50_disp_dmac_fini_
,
.
child_get
=
nv50_disp_dmac_child_get_
,
.
child_new
=
nv50_disp_dmac_child_new_
,
};
int
nv50_disp_dmac_object_attach
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
object
,
u32
name
)
nv50_disp_dmac_new_
(
const
struct
nv50_disp_dmac_func
*
func
,
const
struct
nv50_disp_chan_mthd
*
mthd
,
struct
nv50_disp_root
*
root
,
int
chid
,
int
head
,
u64
push
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
{
struct
nv50_disp_root
*
root
=
(
void
*
)
parent
->
parent
;
struct
nv50_disp_chan
*
chan
=
(
void
*
)
parent
;
u32
addr
=
nv_gpuobj
(
object
)
->
node
->
offset
;
u32
chid
=
chan
->
chid
;
u32
data
=
(
chid
<<
28
)
|
(
addr
<<
10
)
|
chid
;
return
nvkm_ramht_insert
(
root
->
ramht
,
NULL
,
chid
,
0
,
name
,
data
);
struct
nvkm_device
*
device
=
root
->
disp
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_client
*
client
=
oclass
->
client
;
struct
nvkm_dmaobj
*
dmaobj
;
struct
nv50_disp_dmac
*
chan
;
int
ret
;
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
return
-
ENOMEM
;
*
pobject
=
&
chan
->
base
.
object
;
chan
->
func
=
func
;
ret
=
nv50_disp_chan_ctor
(
&
nv50_disp_dmac_func_
,
mthd
,
root
,
chid
,
head
,
oclass
,
&
chan
->
base
);
if
(
ret
)
return
ret
;
dmaobj
=
nvkm_dma_search
(
device
->
dma
,
client
,
push
);
if
(
!
dmaobj
)
return
-
ENOENT
;
if
(
dmaobj
->
limit
-
dmaobj
->
start
!=
0xfff
)
return
-
EINVAL
;
switch
(
dmaobj
->
target
)
{
case
NV_MEM_TARGET_VRAM
:
chan
->
push
=
0x00000001
|
dmaobj
->
start
>>
8
;
break
;
case
NV_MEM_TARGET_PCI_NOSNOOP
:
chan
->
push
=
0x00000003
|
dmaobj
->
start
>>
8
;
break
;
default:
return
-
EINVAL
;
}
return
0
;
}
int
nv50_disp_dmac_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
nv50_disp_dmac_bind
(
struct
nv50_disp_dmac
*
chan
,
struct
nvkm_object
*
object
,
u32
handle
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_dmac
*
dmac
=
(
void
*
)
object
;
return
nvkm_ramht_insert
(
chan
->
base
.
root
->
ramht
,
object
,
chan
->
base
.
chid
,
-
10
,
handle
,
chan
->
base
.
chid
<<
28
|
chan
->
base
.
chid
);
}
static
void
nv50_disp_dmac_fini
(
struct
nv50_disp_dmac
*
chan
)
{
struct
nv50_disp
*
disp
=
chan
->
base
.
root
->
disp
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
int
chid
=
dmac
->
base
.
chid
;
int
chid
=
chan
->
base
.
chid
;
/* deactivate channel */
nvkm_mask
(
device
,
0x610200
+
(
chid
*
0x0010
),
0x00001010
,
0x00001000
);
...
...
@@ -68,35 +202,25 @@ nv50_disp_dmac_fini(struct nvkm_object *object, bool suspend)
)
<
0
)
{
nvkm_error
(
subdev
,
"ch %d fini timeout, %08x
\n
"
,
chid
,
nvkm_rd32
(
device
,
0x610200
+
(
chid
*
0x10
)));
if
(
suspend
)
return
-
EBUSY
;
}
/* disable error reporting and completion notifications */
nvkm_mask
(
device
,
0x610028
,
0x00010001
<<
chid
,
0x00000000
<<
chid
);
return
nv50_disp_chan_fini
(
&
dmac
->
base
,
suspend
);
}
int
nv50_disp_dmac_init
(
struct
nv
km_object
*
object
)
static
int
nv50_disp_dmac_init
(
struct
nv
50_disp_dmac
*
chan
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_dmac
*
dmac
=
(
void
*
)
object
;
struct
nv50_disp
*
disp
=
chan
->
base
.
root
->
disp
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
int
chid
=
dmac
->
base
.
chid
;
int
ret
;
ret
=
nv50_disp_chan_init
(
&
dmac
->
base
);
if
(
ret
)
return
ret
;
int
chid
=
chan
->
base
.
chid
;
/* enable error reporting */
nvkm_mask
(
device
,
0x610028
,
0x00010000
<<
chid
,
0x00010000
<<
chid
);
/* initialise channel for dma command submission */
nvkm_wr32
(
device
,
0x610204
+
(
chid
*
0x0010
),
dmac
->
push
);
nvkm_wr32
(
device
,
0x610204
+
(
chid
*
0x0010
),
chan
->
push
);
nvkm_wr32
(
device
,
0x610208
+
(
chid
*
0x0010
),
0x00010000
);
nvkm_wr32
(
device
,
0x61020c
+
(
chid
*
0x0010
),
chid
);
nvkm_mask
(
device
,
0x610200
+
(
chid
*
0x0010
),
0x00000010
,
0x00000010
);
...
...
@@ -116,48 +240,9 @@ nv50_disp_dmac_init(struct nvkm_object *object)
return
0
;
}
void
nv50_disp_dmac_dtor
(
struct
nvkm_object
*
object
)
{
struct
nv50_disp_dmac
*
dmac
=
(
void
*
)
object
;
nv50_disp_chan_destroy
(
&
dmac
->
base
);
}
int
nv50_disp_dmac_create_
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
u64
pushbuf
,
int
head
,
int
length
,
void
**
pobject
)
{
struct
nvkm_device
*
device
=
parent
->
engine
->
subdev
.
device
;
struct
nvkm_client
*
client
=
nvkm_client
(
parent
);
struct
nvkm_dmaobj
*
dmaobj
;
struct
nv50_disp_dmac
*
dmac
;
int
ret
;
ret
=
nv50_disp_chan_create_
(
parent
,
engine
,
oclass
,
head
,
length
,
pobject
);
dmac
=
*
pobject
;
if
(
ret
)
return
ret
;
dmaobj
=
nvkm_dma_search
(
device
->
dma
,
client
,
pushbuf
);
if
(
!
dmaobj
)
return
-
ENOENT
;
if
(
dmaobj
->
limit
-
dmaobj
->
start
!=
0xfff
)
return
-
EINVAL
;
switch
(
dmaobj
->
target
)
{
case
NV_MEM_TARGET_VRAM
:
dmac
->
push
=
0x00000001
|
dmaobj
->
start
>>
8
;
break
;
case
NV_MEM_TARGET_PCI_NOSNOOP
:
dmac
->
push
=
0x00000003
|
dmaobj
->
start
>>
8
;
break
;
default:
return
-
EINVAL
;
}
return
0
;
}
const
struct
nv50_disp_dmac_func
nv50_disp_dmac_func
=
{
.
init
=
nv50_disp_dmac_init
,
.
fini
=
nv50_disp_dmac_fini
,
.
bind
=
nv50_disp_dmac_bind
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/dmacnv50.h
浏览文件 @
0ce41e3c
#ifndef __NV50_DISP_DMAC_H__
#define __NV50_DISP_DMAC_H__
#define nv50_disp_dmac(p) container_of((p), struct nv50_disp_dmac, base)
#include "channv50.h"
struct
nv50_disp_dmac
{
const
struct
nv50_disp_dmac_func
*
func
;
struct
nv50_disp_chan
base
;
u32
push
;
};
void
nv50_disp_dmac_dtor
(
struct
nvkm_object
*
);
int
nv50_disp_dmac_object_attach
(
struct
nvkm_object
*
,
struct
nvkm_object
*
,
u32
);
void
nv50_disp_dmac_object_detach
(
struct
nvkm_object
*
,
int
);
int
nv50_disp_dmac_create_
(
struct
nvkm_object
*
,
struct
nvkm_object
*
,
struct
nvkm_oclass
*
,
u64
,
int
,
int
,
void
**
);
int
nv50_disp_dmac_init
(
struct
nvkm_object
*
);
int
nv50_disp_dmac_fini
(
struct
nvkm_object
*
,
bool
);
int
gf119_disp_dmac_object_attach
(
struct
nvkm_object
*
,
struct
nvkm_object
*
,
u32
);
void
gf119_disp_dmac_object_detach
(
struct
nvkm_object
*
,
int
);
int
gf119_disp_dmac_init
(
struct
nvkm_object
*
);
int
gf119_disp_dmac_fini
(
struct
nvkm_object
*
,
bool
);
struct
nv50_disp_dmac_func
{
int
(
*
init
)(
struct
nv50_disp_dmac
*
);
void
(
*
fini
)(
struct
nv50_disp_dmac
*
);
int
(
*
bind
)(
struct
nv50_disp_dmac
*
,
struct
nvkm_object
*
,
u32
handle
);
};
int
nv50_disp_dmac_new_
(
const
struct
nv50_disp_dmac_func
*
,
const
struct
nv50_disp_chan_mthd
*
,
struct
nv50_disp_root
*
,
int
chid
,
int
head
,
u64
push
,
const
struct
nvkm_oclass
*
,
struct
nvkm_object
**
);
extern
const
struct
nv50_disp_dmac_func
nv50_disp_dmac_func
;
int
nv50_disp_dmac_bind
(
struct
nv50_disp_dmac
*
,
struct
nvkm_object
*
,
u32
);
extern
const
struct
nv50_disp_dmac_func
nv50_disp_core_func
;
extern
const
struct
nv50_disp_dmac_func
gf119_disp_dmac_func
;
int
gf119_disp_dmac_bind
(
struct
nv50_disp_dmac
*
,
struct
nvkm_object
*
,
u32
);
extern
const
struct
nv50_disp_dmac_func
gf119_disp_core_func
;
struct
nv50_disp_dmac_oclass
{
int
(
*
ctor
)(
const
struct
nv50_disp_dmac_func
*
,
const
struct
nv50_disp_chan_mthd
*
,
struct
nv50_disp_root
*
,
int
chid
,
const
struct
nvkm_oclass
*
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
);
struct
nvkm_sclass
base
;
const
struct
nv50_disp_dmac_func
*
func
;
const
struct
nv50_disp_chan_mthd
*
mthd
;
int
chid
;
};
int
nv50_disp_core_new
(
const
struct
nv50_disp_dmac_func
*
,
const
struct
nv50_disp_chan_mthd
*
,
struct
nv50_disp_root
*
,
int
chid
,
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
);
int
nv50_disp_base_new
(
const
struct
nv50_disp_dmac_func
*
,
const
struct
nv50_disp_chan_mthd
*
,
struct
nv50_disp_root
*
,
int
chid
,
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
);
int
nv50_disp_ovly_new
(
const
struct
nv50_disp_dmac_func
*
,
const
struct
nv50_disp_chan_mthd
*
,
struct
nv50_disp_root
*
,
int
chid
,
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
);
extern
const
struct
nv50_disp_dmac_oclass
nv50_disp_core_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
nv50_disp_base_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
nv50_disp_ovly_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
g84_disp_core_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
g84_disp_base_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
g84_disp_ovly_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
g94_disp_core_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gt200_disp_core_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gt200_disp_base_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gt200_disp_ovly_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gt215_disp_core_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gt215_disp_base_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gt215_disp_ovly_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gf119_disp_core_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gf119_disp_base_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gf119_disp_ovly_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gk104_disp_core_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gk104_disp_base_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gk104_disp_ovly_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gk110_disp_core_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gk110_disp_base_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gm107_disp_core_oclass
;
extern
const
struct
nv50_disp_dmac_oclass
gm204_disp_core_oclass
;
#endif
drivers/gpu/drm/nouveau/nvkm/engine/disp/g84.c
浏览文件 @
0ce41e3c
...
...
@@ -24,6 +24,11 @@
#include "nv50.h"
#include "rootnv50.h"
static
const
struct
nvkm_disp_func
g84_disp
=
{
.
root
=
&
g84_disp_root_oclass
,
};
static
int
g84_disp_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -38,15 +43,14 @@ g84_disp_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
disp
->
base
.
func
=
&
g84_disp
;
ret
=
nvkm_event_init
(
&
nv50_disp_chan_uevent
,
1
,
9
,
&
disp
->
uevent
);
if
(
ret
)
return
ret
;
nv_engine
(
disp
)
->
sclass
=
g84_disp_root_oclass
;
nv_engine
(
disp
)
->
cclass
=
&
nv50_disp_cclass
;
nv_subdev
(
disp
)
->
intr
=
nv50_disp_intr
;
INIT_WORK
(
&
disp
->
supervisor
,
nv50_disp_intr_supervisor
);
disp
->
sclass
=
g84_disp_sclass
;
disp
->
head
.
nr
=
2
;
disp
->
dac
.
nr
=
3
;
disp
->
sor
.
nr
=
2
;
...
...
@@ -74,9 +78,5 @@ g84_disp_oclass = &(struct nv50_disp_impl) {
.
base
.
outp
.
external
.
tmds
=
nv50_pior_output_new
,
.
base
.
outp
.
external
.
dp
=
nv50_pior_dp_new
,
.
base
.
vblank
=
&
nv50_disp_vblank_func
,
.
mthd
.
core
=
&
g84_disp_core_mthd_chan
,
.
mthd
.
base
=
&
g84_disp_base_mthd_chan
,
.
mthd
.
ovly
=
&
g84_disp_ovly_mthd_chan
,
.
mthd
.
prev
=
0x000004
,
.
head
.
scanoutpos
=
nv50_disp_root_scanoutpos
,
}.
base
.
base
;
drivers/gpu/drm/nouveau/nvkm/engine/disp/g94.c
浏览文件 @
0ce41e3c
...
...
@@ -24,6 +24,11 @@
#include "nv50.h"
#include "rootnv50.h"
static
const
struct
nvkm_disp_func
g94_disp
=
{
.
root
=
&
g94_disp_root_oclass
,
};
static
int
g94_disp_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -38,15 +43,14 @@ g94_disp_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
disp
->
base
.
func
=
&
g94_disp
;
ret
=
nvkm_event_init
(
&
nv50_disp_chan_uevent
,
1
,
9
,
&
disp
->
uevent
);
if
(
ret
)
return
ret
;
nv_engine
(
disp
)
->
sclass
=
g94_disp_root_oclass
;
nv_engine
(
disp
)
->
cclass
=
&
nv50_disp_cclass
;
nv_subdev
(
disp
)
->
intr
=
nv50_disp_intr
;
INIT_WORK
(
&
disp
->
supervisor
,
nv50_disp_intr_supervisor
);
disp
->
sclass
=
g94_disp_sclass
;
disp
->
head
.
nr
=
2
;
disp
->
dac
.
nr
=
3
;
disp
->
sor
.
nr
=
4
;
...
...
@@ -75,9 +79,5 @@ g94_disp_oclass = &(struct nv50_disp_impl) {
.
base
.
outp
.
external
.
lvds
=
nv50_pior_output_new
,
.
base
.
outp
.
external
.
dp
=
nv50_pior_dp_new
,
.
base
.
vblank
=
&
nv50_disp_vblank_func
,
.
mthd
.
core
=
&
g94_disp_core_mthd_chan
,
.
mthd
.
base
=
&
g84_disp_base_mthd_chan
,
.
mthd
.
ovly
=
&
g84_disp_ovly_mthd_chan
,
.
mthd
.
prev
=
0x000004
,
.
head
.
scanoutpos
=
nv50_disp_root_scanoutpos
,
}.
base
.
base
;
drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
浏览文件 @
0ce41e3c
...
...
@@ -370,7 +370,6 @@ gf119_disp_intr_supervisor(struct work_struct *work)
{
struct
nv50_disp
*
disp
=
container_of
(
work
,
struct
nv50_disp
,
supervisor
);
struct
nv50_disp_impl
*
impl
=
(
void
*
)
nv_object
(
disp
)
->
oclass
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
u32
mask
[
4
];
...
...
@@ -383,7 +382,7 @@ gf119_disp_intr_supervisor(struct work_struct *work)
}
if
(
disp
->
super
&
0x00000001
)
{
nv50_disp_
mthd_chan
(
disp
,
NV_DBG_DEBUG
,
0
,
impl
->
mthd
.
core
);
nv50_disp_
chan_mthd
(
disp
->
chan
[
0
],
NV_DBG_DEBUG
);
for
(
head
=
0
;
head
<
disp
->
head
.
nr
;
head
++
)
{
if
(
!
(
mask
[
head
]
&
0x00001000
))
continue
;
...
...
@@ -428,7 +427,6 @@ gf119_disp_intr_supervisor(struct work_struct *work)
static
void
gf119_disp_intr_error
(
struct
nv50_disp
*
disp
,
int
chid
)
{
const
struct
nv50_disp_impl
*
impl
=
(
void
*
)
nv_object
(
disp
)
->
oclass
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
u32
mthd
=
nvkm_rd32
(
device
,
0x6101f0
+
(
chid
*
12
));
...
...
@@ -438,31 +436,10 @@ gf119_disp_intr_error(struct nv50_disp *disp, int chid)
nvkm_error
(
subdev
,
"chid %d mthd %04x data %08x %08x %08x
\n
"
,
chid
,
(
mthd
&
0x0000ffc
),
data
,
mthd
,
unkn
);
if
(
chid
==
0
)
{
if
(
chid
<
ARRAY_SIZE
(
disp
->
chan
)
)
{
switch
(
mthd
&
0xffc
)
{
case
0x0080
:
nv50_disp_mthd_chan
(
disp
,
NV_DBG_ERROR
,
chid
-
0
,
impl
->
mthd
.
core
);
break
;
default:
break
;
}
}
else
if
(
chid
<=
4
)
{
switch
(
mthd
&
0xffc
)
{
case
0x0080
:
nv50_disp_mthd_chan
(
disp
,
NV_DBG_ERROR
,
chid
-
1
,
impl
->
mthd
.
base
);
break
;
default:
break
;
}
}
else
if
(
chid
<=
8
)
{
switch
(
mthd
&
0xffc
)
{
case
0x0080
:
nv50_disp_mthd_chan
(
disp
,
NV_DBG_ERROR
,
chid
-
5
,
impl
->
mthd
.
ovly
);
nv50_disp_chan_mthd
(
disp
->
chan
[
chid
],
NV_DBG_ERROR
);
break
;
default:
break
;
...
...
@@ -528,6 +505,11 @@ gf119_disp_intr(struct nvkm_subdev *subdev)
}
}
static
const
struct
nvkm_disp_func
gf119_disp
=
{
.
root
=
&
gf119_disp_root_oclass
,
};
static
int
gf119_disp_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -544,15 +526,14 @@ gf119_disp_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
disp
->
base
.
func
=
&
gf119_disp
;
ret
=
nvkm_event_init
(
&
gf119_disp_chan_uevent
,
1
,
17
,
&
disp
->
uevent
);
if
(
ret
)
return
ret
;
nv_engine
(
disp
)
->
sclass
=
gf119_disp_root_oclass
;
nv_engine
(
disp
)
->
cclass
=
&
nv50_disp_cclass
;
nv_subdev
(
disp
)
->
intr
=
gf119_disp_intr
;
INIT_WORK
(
&
disp
->
supervisor
,
gf119_disp_intr_supervisor
);
disp
->
sclass
=
gf119_disp_sclass
;
disp
->
head
.
nr
=
heads
;
disp
->
dac
.
nr
=
3
;
disp
->
sor
.
nr
=
4
;
...
...
@@ -578,9 +559,5 @@ gf110_disp_oclass = &(struct nv50_disp_impl) {
.
base
.
outp
.
internal
.
lvds
=
nv50_sor_output_new
,
.
base
.
outp
.
internal
.
dp
=
gf119_sor_dp_new
,
.
base
.
vblank
=
&
gf119_disp_vblank_func
,
.
mthd
.
core
=
&
gf119_disp_core_mthd_chan
,
.
mthd
.
base
=
&
gf119_disp_base_mthd_chan
,
.
mthd
.
ovly
=
&
gf119_disp_ovly_mthd_chan
,
.
mthd
.
prev
=
-
0x020000
,
.
head
.
scanoutpos
=
gf119_disp_root_scanoutpos
,
}.
base
.
base
;
drivers/gpu/drm/nouveau/nvkm/engine/disp/gk104.c
浏览文件 @
0ce41e3c
...
...
@@ -24,6 +24,11 @@
#include "nv50.h"
#include "rootnv50.h"
static
const
struct
nvkm_disp_func
gk104_disp
=
{
.
root
=
&
gk104_disp_root_oclass
,
};
static
int
gk104_disp_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -40,15 +45,14 @@ gk104_disp_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
disp
->
base
.
func
=
&
gk104_disp
;
ret
=
nvkm_event_init
(
&
gf119_disp_chan_uevent
,
1
,
17
,
&
disp
->
uevent
);
if
(
ret
)
return
ret
;
nv_engine
(
disp
)
->
sclass
=
gk104_disp_root_oclass
;
nv_engine
(
disp
)
->
cclass
=
&
nv50_disp_cclass
;
nv_subdev
(
disp
)
->
intr
=
gf119_disp_intr
;
INIT_WORK
(
&
disp
->
supervisor
,
gf119_disp_intr_supervisor
);
disp
->
sclass
=
gk104_disp_sclass
;
disp
->
head
.
nr
=
heads
;
disp
->
dac
.
nr
=
3
;
disp
->
sor
.
nr
=
4
;
...
...
@@ -74,9 +78,5 @@ gk104_disp_oclass = &(struct nv50_disp_impl) {
.
base
.
outp
.
internal
.
lvds
=
nv50_sor_output_new
,
.
base
.
outp
.
internal
.
dp
=
gf119_sor_dp_new
,
.
base
.
vblank
=
&
gf119_disp_vblank_func
,
.
mthd
.
core
=
&
gk104_disp_core_mthd_chan
,
.
mthd
.
base
=
&
gf119_disp_base_mthd_chan
,
.
mthd
.
ovly
=
&
gk104_disp_ovly_mthd_chan
,
.
mthd
.
prev
=
-
0x020000
,
.
head
.
scanoutpos
=
gf119_disp_root_scanoutpos
,
}.
base
.
base
;
drivers/gpu/drm/nouveau/nvkm/engine/disp/gk110.c
浏览文件 @
0ce41e3c
...
...
@@ -24,6 +24,11 @@
#include "nv50.h"
#include "rootnv50.h"
static
const
struct
nvkm_disp_func
gk110_disp
=
{
.
root
=
&
gk110_disp_root_oclass
,
};
static
int
gk110_disp_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -40,15 +45,14 @@ gk110_disp_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
disp
->
base
.
func
=
&
gk110_disp
;
ret
=
nvkm_event_init
(
&
gf119_disp_chan_uevent
,
1
,
17
,
&
disp
->
uevent
);
if
(
ret
)
return
ret
;
nv_engine
(
disp
)
->
sclass
=
gk110_disp_root_oclass
;
nv_engine
(
disp
)
->
cclass
=
&
nv50_disp_cclass
;
nv_subdev
(
disp
)
->
intr
=
gf119_disp_intr
;
INIT_WORK
(
&
disp
->
supervisor
,
gf119_disp_intr_supervisor
);
disp
->
sclass
=
gk110_disp_sclass
;
disp
->
head
.
nr
=
heads
;
disp
->
dac
.
nr
=
3
;
disp
->
sor
.
nr
=
4
;
...
...
@@ -74,9 +78,5 @@ gk110_disp_oclass = &(struct nv50_disp_impl) {
.
base
.
outp
.
internal
.
lvds
=
nv50_sor_output_new
,
.
base
.
outp
.
internal
.
dp
=
gf119_sor_dp_new
,
.
base
.
vblank
=
&
gf119_disp_vblank_func
,
.
mthd
.
core
=
&
gk104_disp_core_mthd_chan
,
.
mthd
.
base
=
&
gf119_disp_base_mthd_chan
,
.
mthd
.
ovly
=
&
gk104_disp_ovly_mthd_chan
,
.
mthd
.
prev
=
-
0x020000
,
.
head
.
scanoutpos
=
gf119_disp_root_scanoutpos
,
}.
base
.
base
;
drivers/gpu/drm/nouveau/nvkm/engine/disp/gm107.c
浏览文件 @
0ce41e3c
...
...
@@ -24,6 +24,11 @@
#include "nv50.h"
#include "rootnv50.h"
static
const
struct
nvkm_disp_func
gm107_disp
=
{
.
root
=
&
gm107_disp_root_oclass
,
};
static
int
gm107_disp_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -40,15 +45,14 @@ gm107_disp_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
disp
->
base
.
func
=
&
gm107_disp
;
ret
=
nvkm_event_init
(
&
gf119_disp_chan_uevent
,
1
,
17
,
&
disp
->
uevent
);
if
(
ret
)
return
ret
;
nv_engine
(
disp
)
->
sclass
=
gm107_disp_root_oclass
;
nv_engine
(
disp
)
->
cclass
=
&
nv50_disp_cclass
;
nv_subdev
(
disp
)
->
intr
=
gf119_disp_intr
;
INIT_WORK
(
&
disp
->
supervisor
,
gf119_disp_intr_supervisor
);
disp
->
sclass
=
gm107_disp_sclass
;
disp
->
head
.
nr
=
heads
;
disp
->
dac
.
nr
=
3
;
disp
->
sor
.
nr
=
4
;
...
...
@@ -74,9 +78,5 @@ gm107_disp_oclass = &(struct nv50_disp_impl) {
.
base
.
outp
.
internal
.
lvds
=
nv50_sor_output_new
,
.
base
.
outp
.
internal
.
dp
=
gf119_sor_dp_new
,
.
base
.
vblank
=
&
gf119_disp_vblank_func
,
.
mthd
.
core
=
&
gk104_disp_core_mthd_chan
,
.
mthd
.
base
=
&
gf119_disp_base_mthd_chan
,
.
mthd
.
ovly
=
&
gk104_disp_ovly_mthd_chan
,
.
mthd
.
prev
=
-
0x020000
,
.
head
.
scanoutpos
=
gf119_disp_root_scanoutpos
,
}.
base
.
base
;
drivers/gpu/drm/nouveau/nvkm/engine/disp/gm204.c
浏览文件 @
0ce41e3c
...
...
@@ -24,6 +24,11 @@
#include "nv50.h"
#include "rootnv50.h"
static
const
struct
nvkm_disp_func
gm204_disp
=
{
.
root
=
&
gm204_disp_root_oclass
,
};
static
int
gm204_disp_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -40,15 +45,14 @@ gm204_disp_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
disp
->
base
.
func
=
&
gm204_disp
;
ret
=
nvkm_event_init
(
&
gf119_disp_chan_uevent
,
1
,
17
,
&
disp
->
uevent
);
if
(
ret
)
return
ret
;
nv_engine
(
disp
)
->
sclass
=
gm204_disp_root_oclass
;
nv_engine
(
disp
)
->
cclass
=
&
nv50_disp_cclass
;
nv_subdev
(
disp
)
->
intr
=
gf119_disp_intr
;
INIT_WORK
(
&
disp
->
supervisor
,
gf119_disp_intr_supervisor
);
disp
->
sclass
=
gm204_disp_sclass
;
disp
->
head
.
nr
=
heads
;
disp
->
dac
.
nr
=
3
;
disp
->
sor
.
nr
=
4
;
...
...
@@ -75,9 +79,5 @@ gm204_disp_oclass = &(struct nv50_disp_impl) {
.
base
.
outp
.
internal
.
lvds
=
nv50_sor_output_new
,
.
base
.
outp
.
internal
.
dp
=
gm204_sor_dp_new
,
.
base
.
vblank
=
&
gf119_disp_vblank_func
,
.
mthd
.
core
=
&
gk104_disp_core_mthd_chan
,
.
mthd
.
base
=
&
gf119_disp_base_mthd_chan
,
.
mthd
.
ovly
=
&
gk104_disp_ovly_mthd_chan
,
.
mthd
.
prev
=
-
0x020000
,
.
head
.
scanoutpos
=
gf119_disp_root_scanoutpos
,
}.
base
.
base
;
drivers/gpu/drm/nouveau/nvkm/engine/disp/gt200.c
浏览文件 @
0ce41e3c
...
...
@@ -24,6 +24,11 @@
#include "nv50.h"
#include "rootnv50.h"
static
const
struct
nvkm_disp_func
gt200_disp
=
{
.
root
=
&
gt200_disp_root_oclass
,
};
static
int
gt200_disp_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -38,15 +43,14 @@ gt200_disp_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
disp
->
base
.
func
=
&
gt200_disp
;
ret
=
nvkm_event_init
(
&
nv50_disp_chan_uevent
,
1
,
9
,
&
disp
->
uevent
);
if
(
ret
)
return
ret
;
nv_engine
(
disp
)
->
sclass
=
gt200_disp_root_oclass
;
nv_engine
(
disp
)
->
cclass
=
&
nv50_disp_cclass
;
nv_subdev
(
disp
)
->
intr
=
nv50_disp_intr
;
INIT_WORK
(
&
disp
->
supervisor
,
nv50_disp_intr_supervisor
);
disp
->
sclass
=
gt200_disp_sclass
;
disp
->
head
.
nr
=
2
;
disp
->
dac
.
nr
=
3
;
disp
->
sor
.
nr
=
2
;
...
...
@@ -74,9 +78,5 @@ gt200_disp_oclass = &(struct nv50_disp_impl) {
.
base
.
outp
.
external
.
tmds
=
nv50_pior_output_new
,
.
base
.
outp
.
external
.
dp
=
nv50_pior_dp_new
,
.
base
.
vblank
=
&
nv50_disp_vblank_func
,
.
mthd
.
core
=
&
g84_disp_core_mthd_chan
,
.
mthd
.
base
=
&
g84_disp_base_mthd_chan
,
.
mthd
.
ovly
=
&
gt200_disp_ovly_mthd_chan
,
.
mthd
.
prev
=
0x000004
,
.
head
.
scanoutpos
=
nv50_disp_root_scanoutpos
,
}.
base
.
base
;
drivers/gpu/drm/nouveau/nvkm/engine/disp/gt215.c
浏览文件 @
0ce41e3c
...
...
@@ -24,6 +24,11 @@
#include "nv50.h"
#include "rootnv50.h"
static
const
struct
nvkm_disp_func
gt215_disp_func
=
{
.
root
=
&
gt215_disp_root_oclass
,
};
static
int
gt215_disp_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -38,15 +43,14 @@ gt215_disp_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
disp
->
base
.
func
=
&
gt215_disp_func
;
ret
=
nvkm_event_init
(
&
nv50_disp_chan_uevent
,
1
,
9
,
&
disp
->
uevent
);
if
(
ret
)
return
ret
;
nv_engine
(
disp
)
->
sclass
=
gt215_disp_root_oclass
;
nv_engine
(
disp
)
->
cclass
=
&
nv50_disp_cclass
;
nv_subdev
(
disp
)
->
intr
=
nv50_disp_intr
;
INIT_WORK
(
&
disp
->
supervisor
,
nv50_disp_intr_supervisor
);
disp
->
sclass
=
gt215_disp_sclass
;
disp
->
head
.
nr
=
2
;
disp
->
dac
.
nr
=
3
;
disp
->
sor
.
nr
=
4
;
...
...
@@ -76,9 +80,5 @@ gt215_disp_oclass = &(struct nv50_disp_impl) {
.
base
.
outp
.
external
.
lvds
=
nv50_pior_output_new
,
.
base
.
outp
.
external
.
dp
=
nv50_pior_dp_new
,
.
base
.
vblank
=
&
nv50_disp_vblank_func
,
.
mthd
.
core
=
&
g94_disp_core_mthd_chan
,
.
mthd
.
base
=
&
g84_disp_base_mthd_chan
,
.
mthd
.
ovly
=
&
g84_disp_ovly_mthd_chan
,
.
mthd
.
prev
=
0x000004
,
.
head
.
scanoutpos
=
nv50_disp_root_scanoutpos
,
}.
base
.
base
;
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv04.c
浏览文件 @
0ce41e3c
...
...
@@ -74,6 +74,11 @@ nv04_disp_intr(struct nvkm_subdev *subdev)
}
}
static
const
struct
nvkm_disp_func
nv04_disp
=
{
.
root
=
&
nv04_disp_root_oclass
,
};
static
int
nv04_disp_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -88,7 +93,8 @@ nv04_disp_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
nv_engine
(
disp
)
->
sclass
=
nv04_disp_sclass
;
disp
->
func
=
&
nv04_disp
;
nv_subdev
(
disp
)
->
intr
=
nv04_disp_intr
;
return
0
;
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
浏览文件 @
0ce41e3c
...
...
@@ -33,47 +33,6 @@
#include <subdev/bios/pll.h>
#include <subdev/devinit.h>
static
int
nv50_disp_data_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
engine
;
struct
nvkm_gpuobj
*
gpuobj
;
int
ret
;
/* no context needed for channel objects... */
if
(
parent
->
parent
!=
&
nvkm_client
(
parent
)
->
object
)
{
atomic_inc
(
&
parent
->
refcount
);
*
pobject
=
parent
;
return
1
;
}
/* allocate display hardware to client */
ret
=
nvkm_gpuobj_create
(
parent
,
engine
,
oclass
,
0
,
NULL
,
0x10000
,
0x10000
,
NVOBJ_FLAG_HEAP
,
&
gpuobj
);
*
pobject
=
nv_object
(
gpuobj
);
mutex_lock
(
&
nv_subdev
(
disp
)
->
mutex
);
if
(
!
list_empty
(
&
nv_engine
(
disp
)
->
contexts
))
ret
=
-
EBUSY
;
mutex_unlock
(
&
nv_subdev
(
disp
)
->
mutex
);
return
ret
;
}
struct
nvkm_oclass
nv50_disp_cclass
=
{
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
nv50_disp_data_ctor
,
.
dtor
=
_nvkm_gpuobj_dtor
,
.
init
=
_nvkm_gpuobj_init
,
.
fini
=
_nvkm_gpuobj_fini
,
.
rd32
=
_nvkm_gpuobj_rd32
,
.
wr32
=
_nvkm_gpuobj_wr32
,
},
};
static
void
nv50_disp_vblank_fini
(
struct
nvkm_event
*
event
,
int
type
,
int
head
)
{
...
...
@@ -115,7 +74,6 @@ nv50_disp_intr_error_code[] = {
static
void
nv50_disp_intr_error
(
struct
nv50_disp
*
disp
,
int
chid
)
{
struct
nv50_disp_impl
*
impl
=
(
void
*
)
nv_object
(
disp
)
->
oclass
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
u32
data
=
nvkm_rd32
(
device
,
0x610084
+
(
chid
*
0x08
));
...
...
@@ -133,31 +91,10 @@ nv50_disp_intr_error(struct nv50_disp *disp, int chid)
type
,
et
?
et
->
name
:
""
,
code
,
ec
?
ec
->
name
:
""
,
chid
,
mthd
,
data
);
if
(
chid
==
0
)
{
switch
(
mthd
)
{
case
0x0080
:
nv50_disp_mthd_chan
(
disp
,
NV_DBG_ERROR
,
chid
-
0
,
impl
->
mthd
.
core
);
break
;
default:
break
;
}
}
else
if
(
chid
<=
2
)
{
switch
(
mthd
)
{
case
0x0080
:
nv50_disp_mthd_chan
(
disp
,
NV_DBG_ERROR
,
chid
-
1
,
impl
->
mthd
.
base
);
break
;
default:
break
;
}
}
else
if
(
chid
<=
4
)
{
if
(
chid
<
ARRAY_SIZE
(
disp
->
chan
))
{
switch
(
mthd
)
{
case
0x0080
:
nv50_disp_mthd_chan
(
disp
,
NV_DBG_ERROR
,
chid
-
3
,
impl
->
mthd
.
ovly
);
nv50_disp_chan_mthd
(
disp
->
chan
[
chid
],
NV_DBG_ERROR
);
break
;
default:
break
;
...
...
@@ -673,7 +610,6 @@ nv50_disp_intr_supervisor(struct work_struct *work)
{
struct
nv50_disp
*
disp
=
container_of
(
work
,
struct
nv50_disp
,
supervisor
);
struct
nv50_disp_impl
*
impl
=
(
void
*
)
nv_object
(
disp
)
->
oclass
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
u32
super
=
nvkm_rd32
(
device
,
0x610030
);
...
...
@@ -682,7 +618,7 @@ nv50_disp_intr_supervisor(struct work_struct *work)
nvkm_debug
(
subdev
,
"supervisor %08x %08x
\n
"
,
disp
->
super
,
super
);
if
(
disp
->
super
&
0x00000010
)
{
nv50_disp_
mthd_chan
(
disp
,
NV_DBG_DEBUG
,
0
,
impl
->
mthd
.
core
);
nv50_disp_
chan_mthd
(
disp
->
chan
[
0
],
NV_DBG_DEBUG
);
for
(
head
=
0
;
head
<
disp
->
head
.
nr
;
head
++
)
{
if
(
!
(
super
&
(
0x00000020
<<
head
)))
continue
;
...
...
@@ -756,6 +692,11 @@ nv50_disp_intr(struct nvkm_subdev *subdev)
}
}
static
const
struct
nvkm_disp_func
nv50_disp
=
{
.
root
=
&
nv50_disp_root_oclass
,
};
static
int
nv50_disp_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -770,15 +711,14 @@ nv50_disp_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
disp
->
base
.
func
=
&
nv50_disp
;
ret
=
nvkm_event_init
(
&
nv50_disp_chan_uevent
,
1
,
9
,
&
disp
->
uevent
);
if
(
ret
)
return
ret
;
nv_engine
(
disp
)
->
sclass
=
nv50_disp_root_oclass
;
nv_engine
(
disp
)
->
cclass
=
&
nv50_disp_cclass
;
nv_subdev
(
disp
)
->
intr
=
nv50_disp_intr
;
INIT_WORK
(
&
disp
->
supervisor
,
nv50_disp_intr_supervisor
);
disp
->
sclass
=
nv50_disp_sclass
;
disp
->
head
.
nr
=
2
;
disp
->
dac
.
nr
=
3
;
disp
->
sor
.
nr
=
2
;
...
...
@@ -805,9 +745,5 @@ nv50_disp_oclass = &(struct nv50_disp_impl) {
.
base
.
outp
.
external
.
tmds
=
nv50_pior_output_new
,
.
base
.
outp
.
external
.
dp
=
nv50_pior_dp_new
,
.
base
.
vblank
=
&
nv50_disp_vblank_func
,
.
mthd
.
core
=
&
nv50_disp_core_mthd_chan
,
.
mthd
.
base
=
&
nv50_disp_base_mthd_chan
,
.
mthd
.
ovly
=
&
nv50_disp_ovly_mthd_chan
,
.
mthd
.
prev
=
0x000004
,
.
head
.
scanoutpos
=
nv50_disp_root_scanoutpos
,
}.
base
.
base
;
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.h
浏览文件 @
0ce41e3c
#ifndef __NV50_DISP_H__
#define __NV50_DISP_H__
#define nv50_disp(p) container_of((p), struct nv50_disp, base)
#include "priv.h"
struct
nvkm_output
;
struct
nvkm_output_dp
;
...
...
@@ -11,7 +12,6 @@ struct nvkm_output_dp;
struct
nv50_disp
{
struct
nvkm_disp
base
;
struct
nvkm_oclass
*
sclass
;
struct
work_struct
supervisor
;
u32
super
;
...
...
@@ -39,23 +39,18 @@ struct nv50_disp {
int
(
*
power
)(
NV50_DISP_MTHD_V1
);
u8
type
[
3
];
}
pior
;
struct
nv50_disp_chan
*
chan
[
17
];
};
struct
nv50_disp_impl
{
struct
nvkm_disp_impl
base
;
struct
{
const
struct
nv50_disp_mthd_chan
*
core
;
const
struct
nv50_disp_mthd_chan
*
base
;
const
struct
nv50_disp_mthd_chan
*
ovly
;
int
prev
;
}
mthd
;
struct
{
int
(
*
scanoutpos
)(
NV50_DISP_MTHD_V0
);
}
head
;
};
int
nv50_disp_root_scanoutpos
(
NV50_DISP_MTHD_V0
);
int
nv50_disp_root_mthd
(
struct
nvkm_object
*
,
u32
,
void
*
,
u32
);
int
gf119_disp_root_scanoutpos
(
NV50_DISP_MTHD_V0
);
...
...
@@ -73,59 +68,11 @@ int gk104_hdmi_ctrl(NV50_DISP_MTHD_V1);
int
nv50_sor_power
(
NV50_DISP_MTHD_V1
);
int
nv50_pior_power
(
NV50_DISP_MTHD_V1
);
extern
struct
nv50_disp_chan_impl
nv50_disp_core_ofuncs
;
int
nv50_disp_core_ctor
(
struct
nvkm_object
*
,
struct
nvkm_object
*
,
struct
nvkm_oclass
*
,
void
*
,
u32
,
struct
nvkm_object
**
);
extern
struct
nv50_disp_chan_impl
nv50_disp_base_ofuncs
;
int
nv50_disp_base_ctor
(
struct
nvkm_object
*
,
struct
nvkm_object
*
,
struct
nvkm_oclass
*
,
void
*
,
u32
,
struct
nvkm_object
**
);
extern
struct
nv50_disp_chan_impl
nv50_disp_ovly_ofuncs
;
int
nv50_disp_ovly_ctor
(
struct
nvkm_object
*
,
struct
nvkm_object
*
,
struct
nvkm_oclass
*
,
void
*
,
u32
,
struct
nvkm_object
**
);
extern
struct
nv50_disp_chan_impl
nv50_disp_oimm_ofuncs
;
int
nv50_disp_oimm_ctor
(
struct
nvkm_object
*
,
struct
nvkm_object
*
,
struct
nvkm_oclass
*
,
void
*
,
u32
,
struct
nvkm_object
**
);
extern
struct
nv50_disp_chan_impl
nv50_disp_curs_ofuncs
;
int
nv50_disp_curs_ctor
(
struct
nvkm_object
*
,
struct
nvkm_object
*
,
struct
nvkm_oclass
*
,
void
*
,
u32
,
struct
nvkm_object
**
);
extern
struct
nvkm_ofuncs
nv50_disp_root_ofuncs
;
int
nv50_disp_root_ctor
(
struct
nvkm_object
*
,
struct
nvkm_object
*
,
struct
nvkm_oclass
*
,
void
*
,
u32
,
struct
nvkm_object
**
);
void
nv50_disp_root_dtor
(
struct
nvkm_object
*
);
extern
struct
nvkm_oclass
nv50_disp_cclass
;
void
nv50_disp_intr_supervisor
(
struct
work_struct
*
);
void
nv50_disp_intr
(
struct
nvkm_subdev
*
);
extern
const
struct
nvkm_event_func
nv50_disp_vblank_func
;
extern
struct
nv50_disp_chan_impl
gf119_disp_core_ofuncs
;
extern
struct
nv50_disp_chan_impl
gf119_disp_base_ofuncs
;
extern
struct
nv50_disp_chan_impl
gf119_disp_ovly_ofuncs
;
extern
struct
nv50_disp_chan_impl
gf119_disp_oimm_ofuncs
;
extern
struct
nv50_disp_chan_impl
gf119_disp_curs_ofuncs
;
extern
struct
nvkm_ofuncs
gf119_disp_root_ofuncs
;
extern
struct
nvkm_oclass
gf119_disp_cclass
;
void
gf119_disp_intr_supervisor
(
struct
work_struct
*
);
void
gf119_disp_intr
(
struct
nvkm_subdev
*
);
extern
const
struct
nvkm_event_func
gf119_disp_vblank_func
;
extern
struct
nvkm_output_dp_impl
nv50_pior_dp_impl
;
extern
struct
nvkm_oclass
*
nv50_disp_outp_sclass
[];
extern
struct
nvkm_output_dp_impl
g94_sor_dp_impl
;
u32
g94_sor_dp_lane_map
(
struct
nvkm_device
*
,
u8
lane
);
int
g94_sor_dp_lnk_pwr
(
struct
nvkm_output_dp
*
,
int
);
extern
struct
nvkm_oclass
*
g94_disp_outp_sclass
[];
extern
struct
nvkm_output_dp_impl
gf119_sor_dp_impl
;
int
gf119_sor_dp_lnk_ctl
(
struct
nvkm_output_dp
*
,
int
,
int
,
bool
);
extern
struct
nvkm_oclass
*
gf119_disp_outp_sclass
[];
void
gm204_sor_magic
(
struct
nvkm_output
*
outp
);
extern
struct
nvkm_output_dp_impl
gm204_sor_dp_impl
;
#endif
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmg84.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2012 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.
*
* Authors: Ben Skeggs
*/
#include "channv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_pioc_oclass
g84_disp_oimm_oclass
=
{
.
base
.
oclass
=
G82_DISP_OVERLAY
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_oimm_new
,
.
func
=
&
nv50_disp_pioc_func
,
.
chid
=
5
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmgf119.c
浏览文件 @
0ce41e3c
...
...
@@ -22,16 +22,16 @@
* Authors: Ben Skeggs
*/
#include "channv50.h"
#include "rootnv50.h"
struct
nv50_disp_chan_impl
gf119_disp_oimm_ofuncs
=
{
.
base
.
ctor
=
nv50_disp_oimm_ctor
,
.
base
.
dtor
=
nv50_disp_pioc_dtor
,
.
base
.
init
=
gf119_disp_pioc_init
,
.
base
.
fini
=
gf119_disp_pioc_fini
,
.
base
.
ntfy
=
nv50_disp_chan_ntfy
,
.
base
.
map
=
nv50_disp_chan_map
,
.
base
.
rd32
=
nv50_disp_chan_rd32
,
.
base
.
wr32
=
nv50_disp_chan_wr32
,
#include <nvif/class.h>
const
struct
nv50_disp_pioc_oclass
gf119_disp_oimm_oclass
=
{
.
base
.
oclass
=
GF110_DISP_OVERLAY
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_oimm_new
,
.
func
=
&
gf119_disp_pioc_func
,
.
chid
=
9
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmgk104.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2012 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.
*
* Authors: Ben Skeggs
*/
#include "channv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_pioc_oclass
gk104_disp_oimm_oclass
=
{
.
base
.
oclass
=
GK104_DISP_OVERLAY
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_oimm_new
,
.
func
=
&
gf119_disp_pioc_func
,
.
chid
=
9
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmgt215.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2012 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.
*
* Authors: Ben Skeggs
*/
#include "channv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_pioc_oclass
gt215_disp_oimm_oclass
=
{
.
base
.
oclass
=
GT214_DISP_OVERLAY
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_oimm_new
,
.
func
=
&
nv50_disp_pioc_func
,
.
chid
=
5
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/oimmnv50.c
浏览文件 @
0ce41e3c
...
...
@@ -22,6 +22,7 @@
* Authors: Ben Skeggs
*/
#include "channv50.h"
#include "rootnv50.h"
#include <core/client.h>
...
...
@@ -29,17 +30,18 @@
#include <nvif/unpack.h>
int
nv50_disp_oimm_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
nv50_disp_oimm_new
(
const
struct
nv50_disp_chan_func
*
func
,
const
struct
nv50_disp_chan_mthd
*
mthd
,
struct
nv50_disp_root
*
root
,
int
chid
,
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
union
{
struct
nv50_disp_overlay_v0
v0
;
}
*
args
=
data
;
struct
nv
50_disp
*
disp
=
(
void
*
)
engine
;
struct
nv50_disp
_pioc
*
pioc
;
int
ret
;
struct
nv
km_object
*
parent
=
oclass
->
parent
;
struct
nv50_disp
*
disp
=
root
->
disp
;
int
head
,
ret
;
nvif_ioctl
(
parent
,
"create disp overlay size %d
\n
"
,
size
);
if
(
nvif_unpack
(
args
->
v0
,
0
,
0
,
false
))
{
...
...
@@ -47,27 +49,20 @@ nv50_disp_oimm_ctor(struct nvkm_object *parent,
args
->
v0
.
version
,
args
->
v0
.
head
);
if
(
args
->
v0
.
head
>
disp
->
head
.
nr
)
return
-
EINVAL
;
head
=
args
->
v0
.
head
;
}
else
return
ret
;
ret
=
nv50_disp_pioc_create_
(
parent
,
engine
,
oclass
,
args
->
v0
.
head
,
sizeof
(
*
pioc
),
(
void
**
)
&
pioc
);
*
pobject
=
nv_object
(
pioc
);
if
(
ret
)
return
ret
;
return
0
;
return
nv50_disp_chan_new_
(
func
,
mthd
,
root
,
chid
+
head
,
head
,
oclass
,
pobject
);
}
struct
nv50_disp_chan_impl
nv50_disp_oimm_ofuncs
=
{
.
base
.
ctor
=
nv50_disp_oimm_ctor
,
.
base
.
dtor
=
nv50_disp_pioc_dtor
,
.
base
.
init
=
nv50_disp_pioc_init
,
.
base
.
fini
=
nv50_disp_pioc_fini
,
.
base
.
ntfy
=
nv50_disp_chan_ntfy
,
.
base
.
map
=
nv50_disp_chan_map
,
.
base
.
rd32
=
nv50_disp_chan_rd32
,
.
base
.
wr32
=
nv50_disp_chan_wr32
,
const
struct
nv50_disp_pioc_oclass
nv50_disp_oimm_oclass
=
{
.
base
.
oclass
=
NV50_DISP_OVERLAY
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_oimm_new
,
.
func
=
&
nv50_disp_pioc_func
,
.
chid
=
5
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.h
浏览文件 @
0ce41e3c
...
...
@@ -27,18 +27,22 @@ struct nvkm_output_func {
void
nvkm_output_ctor
(
const
struct
nvkm_output_func
*
,
struct
nvkm_disp
*
,
int
index
,
struct
dcb_output
*
,
struct
nvkm_output
*
);
int
nvkm_output_new_
(
const
struct
nvkm_output_func
*
,
struct
nvkm_disp
*
,
int
index
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
int
nvkm_output_new_
(
const
struct
nvkm_output_func
*
,
struct
nvkm_disp
*
,
int
index
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
void
nvkm_output_del
(
struct
nvkm_output
**
);
void
nvkm_output_init
(
struct
nvkm_output
*
);
void
nvkm_output_fini
(
struct
nvkm_output
*
);
int
nv50_dac_output_new
(
struct
nvkm_disp
*
,
int
,
struct
dcb_output
*
,
int
nv50_dac_output_new
(
struct
nvkm_disp
*
,
int
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
int
nv50_sor_output_new
(
struct
nvkm_disp
*
,
int
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
int
nv50_pior_output_new
(
struct
nvkm_disp
*
,
int
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
int
nv50_sor_output_new
(
struct
nvkm_disp
*
,
int
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
int
nv50_pior_output_new
(
struct
nvkm_disp
*
,
int
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
u32
g94_sor_dp_lane_map
(
struct
nvkm_device
*
,
u8
lane
);
void
gm204_sor_magic
(
struct
nvkm_output
*
outp
);
#define OUTP_MSG(o,l,f,a...) do { \
struct nvkm_output *_outp = (o); \
...
...
drivers/gpu/drm/nouveau/nvkm/engine/disp/outpdp.h
浏览文件 @
0ce41e3c
...
...
@@ -52,14 +52,16 @@ int nvkm_output_dp_new_(const struct nvkm_output_dp_func *, struct nvkm_disp *,
int
index
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
int
nv50_pior_dp_new
(
struct
nvkm_disp
*
,
int
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
int
nv50_pior_dp_new
(
struct
nvkm_disp
*
,
int
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
int
g94_sor_dp_new
(
struct
nvkm_disp
*
,
int
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
int
g94_sor_dp_new
(
struct
nvkm_disp
*
,
int
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
int
g94_sor_dp_lnk_pwr
(
struct
nvkm_output_dp
*
,
int
);
int
gf119_sor_dp_new
(
struct
nvkm_disp
*
,
int
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
int
gf119_sor_dp_new
(
struct
nvkm_disp
*
,
int
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
int
gf119_sor_dp_lnk_ctl
(
struct
nvkm_output_dp
*
,
int
,
int
,
bool
);
int
gm204_sor_dp_new
(
struct
nvkm_disp
*
,
int
,
struct
dcb_output
*
,
struct
nvkm_output
**
);
...
...
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlyg84.c
浏览文件 @
0ce41e3c
...
...
@@ -22,6 +22,9 @@
* Authors: Ben Skeggs
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
static
const
struct
nv50_disp_mthd_list
g84_disp_ovly_mthd_base
=
{
...
...
@@ -51,12 +54,24 @@ g84_disp_ovly_mthd_base = {
}
};
const
struct
nv50_disp_
mthd_chan
g84_disp_ovly_
mthd_chan
=
{
const
struct
nv50_disp_
chan_mthd
g84_disp_ovly_
chan_mthd
=
{
.
name
=
"Overlay"
,
.
addr
=
0x000540
,
.
prev
=
0x000004
,
.
data
=
{
{
"Global"
,
1
,
&
g84_disp_ovly_mthd_base
},
{}
}
};
const
struct
nv50_disp_dmac_oclass
g84_disp_ovly_oclass
=
{
.
base
.
oclass
=
G82_DISP_OVERLAY_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_ovly_new
,
.
func
=
&
nv50_disp_dmac_func
,
.
mthd
=
&
g84_disp_ovly_chan_mthd
,
.
chid
=
3
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlygf119.c
浏览文件 @
0ce41e3c
...
...
@@ -22,6 +22,9 @@
* Authors: Ben Skeggs
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
static
const
struct
nv50_disp_mthd_list
gf119_disp_ovly_mthd_base
=
{
...
...
@@ -75,27 +78,24 @@ gf119_disp_ovly_mthd_base = {
}
};
const
struct
nv50_disp_mthd_chan
gf119_disp_ovly_
mthd_chan
=
{
static
const
struct
nv50_disp_chan_mthd
gf119_disp_ovly_
chan_mthd
=
{
.
name
=
"Overlay"
,
.
addr
=
0x001000
,
.
prev
=
-
0x020000
,
.
data
=
{
{
"Global"
,
1
,
&
gf119_disp_ovly_mthd_base
},
{}
}
};
struct
nv50_disp_chan_impl
gf119_disp_ovly_ofuncs
=
{
.
base
.
ctor
=
nv50_disp_ovly_ctor
,
.
base
.
dtor
=
nv50_disp_dmac_dtor
,
.
base
.
init
=
gf119_disp_dmac_init
,
.
base
.
fini
=
gf119_disp_dmac_fini
,
.
base
.
ntfy
=
nv50_disp_chan_ntfy
,
.
base
.
map
=
nv50_disp_chan_map
,
.
base
.
rd32
=
nv50_disp_chan_rd32
,
.
base
.
wr32
=
nv50_disp_chan_wr32
,
const
struct
nv50_disp_dmac_oclass
gf119_disp_ovly_oclass
=
{
.
base
.
oclass
=
GF110_DISP_OVERLAY_CONTROL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_ovly_new
,
.
func
=
&
gf119_disp_dmac_func
,
.
mthd
=
&
gf119_disp_ovly_chan_mthd
,
.
chid
=
5
,
.
attach
=
gf119_disp_dmac_object_attach
,
.
detach
=
gf119_disp_dmac_object_detach
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlygk104.c
浏览文件 @
0ce41e3c
...
...
@@ -22,6 +22,9 @@
* Authors: Ben Skeggs
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
static
const
struct
nv50_disp_mthd_list
gk104_disp_ovly_mthd_base
=
{
...
...
@@ -77,12 +80,24 @@ gk104_disp_ovly_mthd_base = {
}
};
const
struct
nv50_disp_mthd_chan
gk104_disp_ovly_
mthd_chan
=
{
static
const
struct
nv50_disp_chan_mthd
gk104_disp_ovly_
chan_mthd
=
{
.
name
=
"Overlay"
,
.
addr
=
0x001000
,
.
prev
=
-
0x020000
,
.
data
=
{
{
"Global"
,
1
,
&
gk104_disp_ovly_mthd_base
},
{}
}
};
const
struct
nv50_disp_dmac_oclass
gk104_disp_ovly_oclass
=
{
.
base
.
oclass
=
GK104_DISP_OVERLAY_CONTROL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_ovly_new
,
.
func
=
&
gf119_disp_dmac_func
,
.
mthd
=
&
gk104_disp_ovly_chan_mthd
,
.
chid
=
5
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlygt200.c
浏览文件 @
0ce41e3c
...
...
@@ -22,6 +22,9 @@
* Authors: Ben Skeggs
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
static
const
struct
nv50_disp_mthd_list
gt200_disp_ovly_mthd_base
=
{
...
...
@@ -54,12 +57,24 @@ gt200_disp_ovly_mthd_base = {
}
};
const
struct
nv50_disp_mthd_chan
gt200_disp_ovly_
mthd_chan
=
{
static
const
struct
nv50_disp_chan_mthd
gt200_disp_ovly_
chan_mthd
=
{
.
name
=
"Overlay"
,
.
addr
=
0x000540
,
.
prev
=
0x000004
,
.
data
=
{
{
"Global"
,
1
,
&
gt200_disp_ovly_mthd_base
},
{}
}
};
const
struct
nv50_disp_dmac_oclass
gt200_disp_ovly_oclass
=
{
.
base
.
oclass
=
GT200_DISP_OVERLAY_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_ovly_new
,
.
func
=
&
nv50_disp_dmac_func
,
.
mthd
=
&
gt200_disp_ovly_chan_mthd
,
.
chid
=
3
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlygt215.c
0 → 100644
浏览文件 @
0ce41e3c
/*
* Copyright 2015 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <nvif/class.h>
const
struct
nv50_disp_dmac_oclass
gt215_disp_ovly_oclass
=
{
.
base
.
oclass
=
GT214_DISP_OVERLAY_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_ovly_new
,
.
func
=
&
nv50_disp_dmac_func
,
.
mthd
=
&
g84_disp_ovly_chan_mthd
,
.
chid
=
3
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/ovlynv50.c
浏览文件 @
0ce41e3c
...
...
@@ -22,13 +22,45 @@
* Authors: Ben Skeggs
*/
#include "dmacnv50.h"
#include "rootnv50.h"
#include <core/client.h>
#include <nvif/class.h>
#include <nvif/unpack.h>
const
struct
nv50_disp_mthd_list
int
nv50_disp_ovly_new
(
const
struct
nv50_disp_dmac_func
*
func
,
const
struct
nv50_disp_chan_mthd
*
mthd
,
struct
nv50_disp_root
*
root
,
int
chid
,
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
union
{
struct
nv50_disp_overlay_channel_dma_v0
v0
;
}
*
args
=
data
;
struct
nvkm_object
*
parent
=
oclass
->
parent
;
struct
nv50_disp
*
disp
=
root
->
disp
;
int
head
,
ret
;
u64
push
;
nvif_ioctl
(
parent
,
"create disp overlay channel dma size %d
\n
"
,
size
);
if
(
nvif_unpack
(
args
->
v0
,
0
,
0
,
false
))
{
nvif_ioctl
(
parent
,
"create disp overlay channel dma vers %d "
"pushbuf %016llx head %d
\n
"
,
args
->
v0
.
version
,
args
->
v0
.
pushbuf
,
args
->
v0
.
head
);
if
(
args
->
v0
.
head
>
disp
->
head
.
nr
)
return
-
EINVAL
;
push
=
args
->
v0
.
pushbuf
;
head
=
args
->
v0
.
head
;
}
else
return
ret
;
return
nv50_disp_dmac_new_
(
func
,
mthd
,
root
,
chid
+
head
,
head
,
push
,
oclass
,
pobject
);
}
static
const
struct
nv50_disp_mthd_list
nv50_disp_ovly_mthd_base
=
{
.
mthd
=
0x0000
,
.
addr
=
0x000000
,
...
...
@@ -56,60 +88,24 @@ nv50_disp_ovly_mthd_base = {
}
};
const
struct
nv50_disp_mthd_chan
nv50_disp_ovly_
mthd_chan
=
{
static
const
struct
nv50_disp_chan_mthd
nv50_disp_ovly_
chan_mthd
=
{
.
name
=
"Overlay"
,
.
addr
=
0x000540
,
.
prev
=
0x000004
,
.
data
=
{
{
"Global"
,
1
,
&
nv50_disp_ovly_mthd_base
},
{}
}
};
int
nv50_disp_ovly_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
union
{
struct
nv50_disp_overlay_channel_dma_v0
v0
;
}
*
args
=
data
;
struct
nv50_disp
*
disp
=
(
void
*
)
engine
;
struct
nv50_disp_dmac
*
dmac
;
int
ret
;
nvif_ioctl
(
parent
,
"create disp overlay channel dma size %d
\n
"
,
size
);
if
(
nvif_unpack
(
args
->
v0
,
0
,
0
,
false
))
{
nvif_ioctl
(
parent
,
"create disp overlay channel dma vers %d "
"pushbuf %016llx head %d
\n
"
,
args
->
v0
.
version
,
args
->
v0
.
pushbuf
,
args
->
v0
.
head
);
if
(
args
->
v0
.
head
>
disp
->
head
.
nr
)
return
-
EINVAL
;
}
else
return
ret
;
ret
=
nv50_disp_dmac_create_
(
parent
,
engine
,
oclass
,
args
->
v0
.
pushbuf
,
args
->
v0
.
head
,
sizeof
(
*
dmac
),
(
void
**
)
&
dmac
);
*
pobject
=
nv_object
(
dmac
);
if
(
ret
)
return
ret
;
return
0
;
}
struct
nv50_disp_chan_impl
nv50_disp_ovly_ofuncs
=
{
.
base
.
ctor
=
nv50_disp_ovly_ctor
,
.
base
.
dtor
=
nv50_disp_dmac_dtor
,
.
base
.
init
=
nv50_disp_dmac_init
,
.
base
.
fini
=
nv50_disp_dmac_fini
,
.
base
.
ntfy
=
nv50_disp_chan_ntfy
,
.
base
.
map
=
nv50_disp_chan_map
,
.
base
.
rd32
=
nv50_disp_chan_rd32
,
.
base
.
wr32
=
nv50_disp_chan_wr32
,
const
struct
nv50_disp_dmac_oclass
nv50_disp_ovly_oclass
=
{
.
base
.
oclass
=
NV50_DISP_OVERLAY_CHANNEL_DMA
,
.
base
.
minver
=
0
,
.
base
.
maxver
=
0
,
.
ctor
=
nv50_disp_ovly_new
,
.
func
=
&
nv50_disp_dmac_func
,
.
mthd
=
&
nv50_disp_ovly_chan_mthd
,
.
chid
=
3
,
.
attach
=
nv50_disp_dmac_object_attach
,
.
detach
=
nv50_disp_dmac_object_detach
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/piocgf119.c
浏览文件 @
0ce41e3c
...
...
@@ -22,17 +22,17 @@
* Authors: Ben Skeggs
*/
#include "channv50.h"
#include "rootnv50.h"
#include <subdev/timer.h>
int
gf119_disp_pioc_fini
(
struct
nv
km_object
*
object
,
bool
suspend
)
static
void
gf119_disp_pioc_fini
(
struct
nv
50_disp_chan
*
chan
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_pioc
*
pioc
=
(
void
*
)
object
;
struct
nv50_disp
*
disp
=
chan
->
root
->
disp
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
int
chid
=
pioc
->
base
.
chid
;
int
chid
=
chan
->
chid
;
nvkm_mask
(
device
,
0x610490
+
(
chid
*
0x10
),
0x00000001
,
0x00000000
);
if
(
nvkm_msec
(
device
,
2000
,
...
...
@@ -41,30 +41,20 @@ gf119_disp_pioc_fini(struct nvkm_object *object, bool suspend)
)
<
0
)
{
nvkm_error
(
subdev
,
"ch %d fini: %08x
\n
"
,
chid
,
nvkm_rd32
(
device
,
0x610490
+
(
chid
*
0x10
)));
if
(
suspend
)
return
-
EBUSY
;
}
/* disable error reporting and completion notification */
nvkm_mask
(
device
,
0x610090
,
0x00000001
<<
chid
,
0x00000000
);
nvkm_mask
(
device
,
0x6100a0
,
0x00000001
<<
chid
,
0x00000000
);
return
nv50_disp_chan_fini
(
&
pioc
->
base
,
suspend
);
}
int
gf119_disp_pioc_init
(
struct
nv
km_object
*
object
)
static
int
gf119_disp_pioc_init
(
struct
nv
50_disp_chan
*
chan
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_pioc
*
pioc
=
(
void
*
)
object
;
struct
nv50_disp
*
disp
=
chan
->
root
->
disp
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
int
chid
=
pioc
->
base
.
chid
;
int
ret
;
ret
=
nv50_disp_chan_init
(
&
pioc
->
base
);
if
(
ret
)
return
ret
;
int
chid
=
chan
->
chid
;
/* enable error reporting */
nvkm_mask
(
device
,
0x6100a0
,
0x00000001
<<
chid
,
0x00000001
<<
chid
);
...
...
@@ -83,3 +73,9 @@ gf119_disp_pioc_init(struct nvkm_object *object)
return
0
;
}
const
struct
nv50_disp_chan_func
gf119_disp_pioc_func
=
{
.
init
=
gf119_disp_pioc_init
,
.
fini
=
gf119_disp_pioc_fini
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/piocnv50.c
浏览文件 @
0ce41e3c
...
...
@@ -22,17 +22,17 @@
* Authors: Ben Skeggs
*/
#include "channv50.h"
#include "rootnv50.h"
#include <subdev/timer.h>
int
nv50_disp_pioc_fini
(
struct
nv
km_object
*
object
,
bool
suspend
)
static
void
nv50_disp_pioc_fini
(
struct
nv
50_disp_chan
*
chan
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_pioc
*
pioc
=
(
void
*
)
object
;
struct
nv50_disp
*
disp
=
chan
->
root
->
disp
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
int
chid
=
pioc
->
base
.
chid
;
int
chid
=
chan
->
chid
;
nvkm_mask
(
device
,
0x610200
+
(
chid
*
0x10
),
0x00000001
,
0x00000000
);
if
(
nvkm_msec
(
device
,
2000
,
...
...
@@ -41,26 +41,16 @@ nv50_disp_pioc_fini(struct nvkm_object *object, bool suspend)
)
<
0
)
{
nvkm_error
(
subdev
,
"ch %d timeout: %08x
\n
"
,
chid
,
nvkm_rd32
(
device
,
0x610200
+
(
chid
*
0x10
)));
if
(
suspend
)
return
-
EBUSY
;
}
return
nv50_disp_chan_fini
(
&
pioc
->
base
,
suspend
);
}
int
nv50_disp_pioc_init
(
struct
nv
km_object
*
object
)
static
int
nv50_disp_pioc_init
(
struct
nv
50_disp_chan
*
chan
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_pioc
*
pioc
=
(
void
*
)
object
;
struct
nv50_disp
*
disp
=
chan
->
root
->
disp
;
struct
nvkm_subdev
*
subdev
=
&
disp
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
int
chid
=
pioc
->
base
.
chid
;
int
ret
;
ret
=
nv50_disp_chan_init
(
&
pioc
->
base
);
if
(
ret
)
return
ret
;
int
chid
=
chan
->
chid
;
nvkm_wr32
(
device
,
0x610200
+
(
chid
*
0x10
),
0x00002000
);
if
(
nvkm_msec
(
device
,
2000
,
...
...
@@ -86,19 +76,8 @@ nv50_disp_pioc_init(struct nvkm_object *object)
return
0
;
}
void
nv50_disp_pioc_dtor
(
struct
nvkm_object
*
object
)
{
struct
nv50_disp_pioc
*
pioc
=
(
void
*
)
object
;
nv50_disp_chan_destroy
(
&
pioc
->
base
);
}
int
nv50_disp_pioc_create_
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
int
head
,
int
length
,
void
**
pobject
)
{
return
nv50_disp_chan_create_
(
parent
,
engine
,
oclass
,
head
,
length
,
pobject
);
}
const
struct
nv50_disp_chan_func
nv50_disp_pioc_func
=
{
.
init
=
nv50_disp_pioc_init
,
.
fini
=
nv50_disp_pioc_fini
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/priv.h
浏览文件 @
0ce41e3c
...
...
@@ -57,5 +57,11 @@ int nvkm_disp_vblank_ctor(struct nvkm_object *, void *data, u32 size,
void
nvkm_disp_vblank
(
struct
nvkm_disp
*
,
int
head
);
int
nvkm_disp_ntfy
(
struct
nvkm_object
*
,
u32
,
struct
nvkm_event
**
);
extern
struct
nvkm_oclass
nv04_disp_sclass
[];
extern
const
struct
nvkm_disp_oclass
nv04_disp_root_oclass
;
struct
nvkm_disp_oclass
{
int
(
*
ctor
)(
struct
nvkm_disp
*
,
const
struct
nvkm_oclass
*
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
);
struct
nvkm_sclass
base
;
};
#endif
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootg84.c
浏览文件 @
0ce41e3c
...
...
@@ -26,18 +26,33 @@
#include <nvif/class.h>
struct
nvkm_oclass
g84_disp_sclass
[]
=
{
{
G82_DISP_CORE_CHANNEL_DMA
,
&
nv50_disp_core_ofuncs
.
base
},
{
G82_DISP_BASE_CHANNEL_DMA
,
&
nv50_disp_base_ofuncs
.
base
},
{
G82_DISP_OVERLAY_CHANNEL_DMA
,
&
nv50_disp_ovly_ofuncs
.
base
},
{
G82_DISP_OVERLAY
,
&
nv50_disp_oimm_ofuncs
.
base
},
{
G82_DISP_CURSOR
,
&
nv50_disp_curs_ofuncs
.
base
},
{}
static
const
struct
nv50_disp_root_func
g84_disp_root
=
{
.
init
=
nv50_disp_root_init
,
.
fini
=
nv50_disp_root_fini
,
.
dmac
=
{
&
g84_disp_core_oclass
,
&
g84_disp_base_oclass
,
&
g84_disp_ovly_oclass
,
},
.
pioc
=
{
&
g84_disp_oimm_oclass
,
&
g84_disp_curs_oclass
,
},
};
struct
nvkm_oclass
g84_disp_root_oclass
[]
=
{
{
G82_DISP
,
&
nv50_disp_root_ofuncs
},
{}
static
int
g84_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_
(
&
g84_disp_root
,
disp
,
oclass
,
data
,
size
,
pobject
);
}
const
struct
nvkm_disp_oclass
g84_disp_root_oclass
=
{
.
base
.
oclass
=
G82_DISP
,
.
base
.
minver
=
-
1
,
.
base
.
maxver
=
-
1
,
.
ctor
=
g84_disp_root_new
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootg94.c
浏览文件 @
0ce41e3c
...
...
@@ -26,18 +26,33 @@
#include <nvif/class.h>
struct
nvkm_oclass
g94_disp_sclass
[]
=
{
{
GT206_DISP_CORE_CHANNEL_DMA
,
&
nv50_disp_core_ofuncs
.
base
},
{
GT200_DISP_BASE_CHANNEL_DMA
,
&
nv50_disp_base_ofuncs
.
base
},
{
GT200_DISP_OVERLAY_CHANNEL_DMA
,
&
nv50_disp_ovly_ofuncs
.
base
},
{
G82_DISP_OVERLAY
,
&
nv50_disp_oimm_ofuncs
.
base
},
{
G82_DISP_CURSOR
,
&
nv50_disp_curs_ofuncs
.
base
},
{}
static
const
struct
nv50_disp_root_func
g94_disp_root
=
{
.
init
=
nv50_disp_root_init
,
.
fini
=
nv50_disp_root_fini
,
.
dmac
=
{
&
g94_disp_core_oclass
,
&
gt200_disp_base_oclass
,
&
gt200_disp_ovly_oclass
,
},
.
pioc
=
{
&
g84_disp_oimm_oclass
,
&
g84_disp_curs_oclass
,
},
};
struct
nvkm_oclass
g94_disp_root_oclass
[]
=
{
{
GT206_DISP
,
&
nv50_disp_root_ofuncs
},
{}
static
int
g94_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_
(
&
g94_disp_root
,
disp
,
oclass
,
data
,
size
,
pobject
);
}
const
struct
nvkm_disp_oclass
g94_disp_root_oclass
=
{
.
base
.
oclass
=
GT206_DISP
,
.
base
.
minver
=
-
1
,
.
base
.
maxver
=
-
1
,
.
ctor
=
g94_disp_root_new
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgf119.c
浏览文件 @
0ce41e3c
...
...
@@ -65,18 +65,21 @@ gf119_disp_root_scanoutpos(NV50_DISP_MTHD_V0)
return
0
;
}
static
int
gf119_disp_root_
init
(
struct
nvkm_object
*
objec
t
)
void
gf119_disp_root_
fini
(
struct
nv50_disp_root
*
roo
t
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_root
*
root
=
(
void
*
)
object
;
struct
nvkm_device
*
device
=
root
->
disp
->
base
.
engine
.
subdev
.
device
;
/* disable all interrupts */
nvkm_wr32
(
device
,
0x6100b0
,
0x00000000
);
}
int
gf119_disp_root_init
(
struct
nv50_disp_root
*
root
)
{
struct
nv50_disp
*
disp
=
root
->
disp
;
struct
nvkm_device
*
device
=
disp
->
base
.
engine
.
subdev
.
device
;
int
ret
,
i
;
u32
tmp
;
ret
=
nvkm_parent_init
(
&
root
->
base
);
if
(
ret
)
return
ret
;
int
i
;
/* The below segments of code copying values from one register to
* another appear to inform EVO of the display capabilities or
...
...
@@ -117,7 +120,7 @@ gf119_disp_root_init(struct nvkm_object *object)
}
/* point at display engine memory area (hash table, objects) */
nvkm_wr32
(
device
,
0x610010
,
(
nv_gpuobj
(
object
->
parent
)
->
addr
>>
8
)
|
9
);
nvkm_wr32
(
device
,
0x610010
,
(
root
->
instmem
->
addr
>>
8
)
|
9
);
/* enable supervisor interrupts, disable everything else */
nvkm_wr32
(
device
,
0x610090
,
0x00000000
);
...
...
@@ -136,41 +139,33 @@ gf119_disp_root_init(struct nvkm_object *object)
return
0
;
}
static
int
gf119_disp_root_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_root
*
root
=
(
void
*
)
object
;
struct
nvkm_device
*
device
=
disp
->
base
.
engine
.
subdev
.
device
;
/* disable all interrupts */
nvkm_wr32
(
device
,
0x6100b0
,
0x00000000
);
return
nvkm_parent_fini
(
&
root
->
base
,
suspend
);
}
struct
nvkm_ofuncs
gf119_disp_root_ofuncs
=
{
.
ctor
=
nv50_disp_root_ctor
,
.
dtor
=
nv50_disp_root_dtor
,
static
const
struct
nv50_disp_root_func
gf119_disp_root
=
{
.
init
=
gf119_disp_root_init
,
.
fini
=
gf119_disp_root_fini
,
.
mthd
=
nv50_disp_root_mthd
,
.
ntfy
=
nvkm_disp_ntfy
,
.
dmac
=
{
&
gf119_disp_core_oclass
,
&
gf119_disp_base_oclass
,
&
gf119_disp_ovly_oclass
,
},
.
pioc
=
{
&
gf119_disp_oimm_oclass
,
&
gf119_disp_curs_oclass
,
},
};
struct
nvkm_oclass
gf119_disp_root_oclass
[]
=
{
{
GF110_DISP
,
&
gf119_disp_root_ofuncs
},
{}
};
static
int
gf119_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_
(
&
gf119_disp_root
,
disp
,
oclass
,
data
,
size
,
pobject
);
}
struct
nvkm_oclass
gf119_disp_sclass
[]
=
{
{
GF110_DISP_CORE_CHANNEL_DMA
,
&
gf119_disp_core_ofuncs
.
base
},
{
GF110_DISP_BASE_CHANNEL_DMA
,
&
gf119_disp_base_ofuncs
.
base
},
{
GF110_DISP_OVERLAY_CONTROL_DMA
,
&
gf119_disp_ovly_ofuncs
.
base
},
{
GF110_DISP_OVERLAY
,
&
gf119_disp_oimm_ofuncs
.
base
},
{
GF110_DISP_CURSOR
,
&
gf119_disp_curs_ofuncs
.
base
},
{}
const
struct
nvkm_disp_oclass
gf119_disp_root_oclass
=
{
.
base
.
oclass
=
GF110_DISP
,
.
base
.
minver
=
-
1
,
.
base
.
maxver
=
-
1
,
.
ctor
=
gf119_disp_root_new
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgk104.c
浏览文件 @
0ce41e3c
...
...
@@ -26,18 +26,33 @@
#include <nvif/class.h>
struct
nvkm_oclass
gk104_disp_sclass
[]
=
{
{
GK104_DISP_CORE_CHANNEL_DMA
,
&
gf119_disp_core_ofuncs
.
base
},
{
GK104_DISP_BASE_CHANNEL_DMA
,
&
gf119_disp_base_ofuncs
.
base
},
{
GK104_DISP_OVERLAY_CONTROL_DMA
,
&
gf119_disp_ovly_ofuncs
.
base
},
{
GK104_DISP_OVERLAY
,
&
gf119_disp_oimm_ofuncs
.
base
},
{
GK104_DISP_CURSOR
,
&
gf119_disp_curs_ofuncs
.
base
},
{}
static
const
struct
nv50_disp_root_func
gk104_disp_root
=
{
.
init
=
gf119_disp_root_init
,
.
fini
=
gf119_disp_root_fini
,
.
dmac
=
{
&
gk104_disp_core_oclass
,
&
gk104_disp_base_oclass
,
&
gk104_disp_ovly_oclass
,
},
.
pioc
=
{
&
gk104_disp_oimm_oclass
,
&
gk104_disp_curs_oclass
,
},
};
struct
nvkm_oclass
gk104_disp_root_oclass
[]
=
{
{
GK104_DISP
,
&
gf119_disp_root_ofuncs
},
{}
static
int
gk104_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_
(
&
gk104_disp_root
,
disp
,
oclass
,
data
,
size
,
pobject
);
}
const
struct
nvkm_disp_oclass
gk104_disp_root_oclass
=
{
.
base
.
oclass
=
GK104_DISP
,
.
base
.
minver
=
-
1
,
.
base
.
maxver
=
-
1
,
.
ctor
=
gk104_disp_root_new
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgk110.c
浏览文件 @
0ce41e3c
...
...
@@ -26,18 +26,33 @@
#include <nvif/class.h>
struct
nvkm_oclass
gk110_disp_sclass
[]
=
{
{
GK110_DISP_CORE_CHANNEL_DMA
,
&
gf119_disp_core_ofuncs
.
base
},
{
GK110_DISP_BASE_CHANNEL_DMA
,
&
gf119_disp_base_ofuncs
.
base
},
{
GK104_DISP_OVERLAY_CONTROL_DMA
,
&
gf119_disp_ovly_ofuncs
.
base
},
{
GK104_DISP_OVERLAY
,
&
gf119_disp_oimm_ofuncs
.
base
},
{
GK104_DISP_CURSOR
,
&
gf119_disp_curs_ofuncs
.
base
},
{}
static
const
struct
nv50_disp_root_func
gk110_disp_root
=
{
.
init
=
gf119_disp_root_init
,
.
fini
=
gf119_disp_root_fini
,
.
dmac
=
{
&
gk110_disp_core_oclass
,
&
gk110_disp_base_oclass
,
&
gk104_disp_ovly_oclass
,
},
.
pioc
=
{
&
gk104_disp_oimm_oclass
,
&
gk104_disp_curs_oclass
,
},
};
struct
nvkm_oclass
gk110_disp_root_oclass
[]
=
{
{
GK110_DISP
,
&
gf119_disp_root_ofuncs
},
{}
static
int
gk110_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_
(
&
gk110_disp_root
,
disp
,
oclass
,
data
,
size
,
pobject
);
}
const
struct
nvkm_disp_oclass
gk110_disp_root_oclass
=
{
.
base
.
oclass
=
GK110_DISP
,
.
base
.
minver
=
-
1
,
.
base
.
maxver
=
-
1
,
.
ctor
=
gk110_disp_root_new
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgm107.c
浏览文件 @
0ce41e3c
...
...
@@ -26,18 +26,33 @@
#include <nvif/class.h>
struct
nvkm_oclass
gm107_disp_sclass
[]
=
{
{
GM107_DISP_CORE_CHANNEL_DMA
,
&
gf119_disp_core_ofuncs
.
base
},
{
GK110_DISP_BASE_CHANNEL_DMA
,
&
gf119_disp_base_ofuncs
.
base
},
{
GK104_DISP_OVERLAY_CONTROL_DMA
,
&
gf119_disp_ovly_ofuncs
.
base
},
{
GK104_DISP_OVERLAY
,
&
gf119_disp_oimm_ofuncs
.
base
},
{
GK104_DISP_CURSOR
,
&
gf119_disp_curs_ofuncs
.
base
},
{}
static
const
struct
nv50_disp_root_func
gm107_disp_root
=
{
.
init
=
gf119_disp_root_init
,
.
fini
=
gf119_disp_root_fini
,
.
dmac
=
{
&
gm107_disp_core_oclass
,
&
gk110_disp_base_oclass
,
&
gk104_disp_ovly_oclass
,
},
.
pioc
=
{
&
gk104_disp_oimm_oclass
,
&
gk104_disp_curs_oclass
,
},
};
struct
nvkm_oclass
gm107_disp_root_oclass
[]
=
{
{
GM107_DISP
,
&
gf119_disp_root_ofuncs
},
{}
static
int
gm107_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_
(
&
gm107_disp_root
,
disp
,
oclass
,
data
,
size
,
pobject
);
}
const
struct
nvkm_disp_oclass
gm107_disp_root_oclass
=
{
.
base
.
oclass
=
GM107_DISP
,
.
base
.
minver
=
-
1
,
.
base
.
maxver
=
-
1
,
.
ctor
=
gm107_disp_root_new
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgm204.c
浏览文件 @
0ce41e3c
...
...
@@ -26,18 +26,33 @@
#include <nvif/class.h>
struct
nvkm_oclass
gm204_disp_sclass
[]
=
{
{
GM204_DISP_CORE_CHANNEL_DMA
,
&
gf119_disp_core_ofuncs
.
base
},
{
GK110_DISP_BASE_CHANNEL_DMA
,
&
gf119_disp_base_ofuncs
.
base
},
{
GK104_DISP_OVERLAY_CONTROL_DMA
,
&
gf119_disp_ovly_ofuncs
.
base
},
{
GK104_DISP_OVERLAY
,
&
gf119_disp_oimm_ofuncs
.
base
},
{
GK104_DISP_CURSOR
,
&
gf119_disp_curs_ofuncs
.
base
},
{}
static
const
struct
nv50_disp_root_func
gm204_disp_root
=
{
.
init
=
gf119_disp_root_init
,
.
fini
=
gf119_disp_root_fini
,
.
dmac
=
{
&
gm204_disp_core_oclass
,
&
gk110_disp_base_oclass
,
&
gk104_disp_ovly_oclass
,
},
.
pioc
=
{
&
gk104_disp_oimm_oclass
,
&
gk104_disp_curs_oclass
,
},
};
struct
nvkm_oclass
gm204_disp_root_oclass
[]
=
{
{
GM204_DISP
,
&
gf119_disp_root_ofuncs
},
{}
static
int
gm204_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_
(
&
gm204_disp_root
,
disp
,
oclass
,
data
,
size
,
pobject
);
}
const
struct
nvkm_disp_oclass
gm204_disp_root_oclass
=
{
.
base
.
oclass
=
GM204_DISP
,
.
base
.
minver
=
-
1
,
.
base
.
maxver
=
-
1
,
.
ctor
=
gm204_disp_root_new
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgt200.c
浏览文件 @
0ce41e3c
...
...
@@ -26,18 +26,33 @@
#include <nvif/class.h>
struct
nvkm_oclass
gt200_disp_sclass
[]
=
{
{
GT200_DISP_CORE_CHANNEL_DMA
,
&
nv50_disp_core_ofuncs
.
base
},
{
GT200_DISP_BASE_CHANNEL_DMA
,
&
nv50_disp_base_ofuncs
.
base
},
{
GT200_DISP_OVERLAY_CHANNEL_DMA
,
&
nv50_disp_ovly_ofuncs
.
base
},
{
G82_DISP_OVERLAY
,
&
nv50_disp_oimm_ofuncs
.
base
},
{
G82_DISP_CURSOR
,
&
nv50_disp_curs_ofuncs
.
base
},
{}
static
const
struct
nv50_disp_root_func
gt200_disp_root
=
{
.
init
=
nv50_disp_root_init
,
.
fini
=
nv50_disp_root_fini
,
.
dmac
=
{
&
gt200_disp_core_oclass
,
&
gt200_disp_base_oclass
,
&
gt200_disp_ovly_oclass
,
},
.
pioc
=
{
&
g84_disp_oimm_oclass
,
&
g84_disp_curs_oclass
,
},
};
struct
nvkm_oclass
gt200_disp_root_oclass
[]
=
{
{
GT200_DISP
,
&
nv50_disp_root_ofuncs
},
{}
static
int
gt200_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_
(
&
gt200_disp_root
,
disp
,
oclass
,
data
,
size
,
pobject
);
}
const
struct
nvkm_disp_oclass
gt200_disp_root_oclass
=
{
.
base
.
oclass
=
GT200_DISP
,
.
base
.
minver
=
-
1
,
.
base
.
maxver
=
-
1
,
.
ctor
=
gt200_disp_root_new
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootgt215.c
浏览文件 @
0ce41e3c
...
...
@@ -26,18 +26,33 @@
#include <nvif/class.h>
struct
nvkm_oclass
gt215_disp_sclass
[]
=
{
{
GT214_DISP_CORE_CHANNEL_DMA
,
&
nv50_disp_core_ofuncs
.
base
},
{
GT214_DISP_BASE_CHANNEL_DMA
,
&
nv50_disp_base_ofuncs
.
base
},
{
GT214_DISP_OVERLAY_CHANNEL_DMA
,
&
nv50_disp_ovly_ofuncs
.
base
},
{
GT214_DISP_OVERLAY
,
&
nv50_disp_oimm_ofuncs
.
base
},
{
GT214_DISP_CURSOR
,
&
nv50_disp_curs_ofuncs
.
base
},
{}
static
const
struct
nv50_disp_root_func
gt215_disp_root
=
{
.
init
=
nv50_disp_root_init
,
.
fini
=
nv50_disp_root_fini
,
.
dmac
=
{
&
gt215_disp_core_oclass
,
&
gt215_disp_base_oclass
,
&
gt215_disp_ovly_oclass
,
},
.
pioc
=
{
&
gt215_disp_oimm_oclass
,
&
gt215_disp_curs_oclass
,
},
};
struct
nvkm_oclass
gt215_disp_root_oclass
[]
=
{
{
GT214_DISP
,
&
nv50_disp_root_ofuncs
},
{}
static
int
gt215_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_
(
&
gt215_disp_root
,
disp
,
oclass
,
data
,
size
,
pobject
);
}
const
struct
nvkm_disp_oclass
gt215_disp_root_oclass
=
{
.
base
.
oclass
=
GT214_DISP
,
.
base
.
minver
=
-
1
,
.
base
.
maxver
=
-
1
,
.
ctor
=
gt215_disp_root_new
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv04.c
浏览文件 @
0ce41e3c
...
...
@@ -21,6 +21,7 @@
*
* Authors: Ben Skeggs
*/
#define nv04_disp_root(p) container_of((p), struct nv04_disp_root, object);
#include "priv.h"
#include <core/client.h>
...
...
@@ -28,11 +29,17 @@
#include <nvif/class.h>
#include <nvif/unpack.h>
struct
nv04_disp_root
{
struct
nvkm_object
object
;
struct
nvkm_disp
*
disp
;
};
static
int
nv04_disp_scanoutpos
(
struct
nv
km_object
*
object
,
struct
nvkm_disp
*
disp
,
nv04_disp_scanoutpos
(
struct
nv
04_disp_root
*
root
,
void
*
data
,
u32
size
,
int
head
)
{
struct
nvkm_device
*
device
=
disp
->
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
root
->
disp
->
engine
.
subdev
.
device
;
struct
nvkm_object
*
object
=
&
root
->
object
;
const
u32
hoff
=
head
*
0x2000
;
union
{
struct
nv04_disp_scanoutpos_v0
v0
;
...
...
@@ -74,10 +81,10 @@ nv04_disp_scanoutpos(struct nvkm_object *object, struct nvkm_disp *disp,
static
int
nv04_disp_mthd
(
struct
nvkm_object
*
object
,
u32
mthd
,
void
*
data
,
u32
size
)
{
struct
nv04_disp_root
*
root
=
nv04_disp_root
(
object
);
union
{
struct
nv04_disp_mthd_v0
v0
;
}
*
args
=
data
;
struct
nvkm_disp
*
disp
=
(
void
*
)
object
->
engine
;
int
head
,
ret
;
nvif_ioctl
(
object
,
"disp mthd size %d
\n
"
,
size
);
...
...
@@ -94,7 +101,7 @@ nv04_disp_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
switch
(
mthd
)
{
case
NV04_DISP_SCANOUTPOS
:
return
nv04_disp_scanoutpos
(
object
,
disp
,
data
,
size
,
head
);
return
nv04_disp_scanoutpos
(
root
,
data
,
size
,
head
);
default:
break
;
}
...
...
@@ -102,18 +109,31 @@ nv04_disp_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
return
-
EINVAL
;
}
static
struct
nvkm_ofuncs
nv04_disp_ofuncs
=
{
.
ctor
=
_nvkm_object_ctor
,
.
dtor
=
nvkm_object_destroy
,
.
init
=
_nvkm_object_init
,
.
fini
=
_nvkm_object_fini
,
static
struct
nvkm_object_func
nv04_disp_root
=
{
.
mthd
=
nv04_disp_mthd
,
.
ntfy
=
nvkm_disp_ntfy
,
};
struct
nvkm_oclass
nv04_disp_sclass
[]
=
{
{
NV04_DISP
,
&
nv04_disp_ofuncs
},
{},
static
int
nv04_disp_root_new
(
struct
nvkm_disp
*
disp
,
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
struct
nv04_disp_root
*
root
;
if
(
!
(
root
=
kzalloc
(
sizeof
(
*
root
),
GFP_KERNEL
)))
return
-
ENOMEM
;
root
->
disp
=
disp
;
*
pobject
=
&
root
->
object
;
nvkm_object_ctor
(
&
nv04_disp_root
,
oclass
,
&
root
->
object
);
return
0
;
}
const
struct
nvkm_disp_oclass
nv04_disp_root_oclass
=
{
.
base
.
oclass
=
NV04_DISP
,
.
base
.
minver
=
-
1
,
.
base
.
maxver
=
-
1
,
.
ctor
=
nv04_disp_root_new
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c
浏览文件 @
0ce41e3c
...
...
@@ -66,14 +66,15 @@ nv50_disp_root_scanoutpos(NV50_DISP_MTHD_V0)
}
int
nv50_disp_root_mthd
(
struct
nvkm_object
*
object
,
u32
mthd
,
void
*
data
,
u32
size
)
nv50_disp_root_mthd
_
(
struct
nvkm_object
*
object
,
u32
mthd
,
void
*
data
,
u32
size
)
{
const
struct
nv50_disp_impl
*
impl
=
(
void
*
)
nv_oclass
(
object
->
engine
);
union
{
struct
nv50_disp_mthd_v0
v0
;
struct
nv50_disp_mthd_v1
v1
;
}
*
args
=
data
;
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_root
*
root
=
nv50_disp_root
(
object
);
struct
nv50_disp
*
disp
=
root
->
disp
;
const
struct
nv50_disp_impl
*
impl
=
(
void
*
)
nv_oclass
(
object
->
engine
);
struct
nvkm_output
*
outp
=
NULL
;
struct
nvkm_output
*
temp
;
u16
type
,
mask
=
0
;
...
...
@@ -187,48 +188,127 @@ nv50_disp_root_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
return
-
EINVAL
;
}
static
int
nv50_disp_root_dmac_new_
(
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
const
struct
nv50_disp_dmac_oclass
*
sclass
=
oclass
->
priv
;
struct
nv50_disp_root
*
root
=
nv50_disp_root
(
oclass
->
parent
);
return
sclass
->
ctor
(
sclass
->
func
,
sclass
->
mthd
,
root
,
sclass
->
chid
,
oclass
,
data
,
size
,
pobject
);
}
static
int
nv50_disp_root_pioc_new_
(
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
const
struct
nv50_disp_pioc_oclass
*
sclass
=
oclass
->
priv
;
struct
nv50_disp_root
*
root
=
nv50_disp_root
(
oclass
->
parent
);
return
sclass
->
ctor
(
sclass
->
func
,
sclass
->
mthd
,
root
,
sclass
->
chid
,
oclass
,
data
,
size
,
pobject
);
}
static
int
nv50_disp_root_child_get_
(
struct
nvkm_object
*
object
,
int
index
,
struct
nvkm_oclass
*
sclass
)
{
struct
nv50_disp_root
*
root
=
nv50_disp_root
(
object
);
if
(
index
<
ARRAY_SIZE
(
root
->
func
->
dmac
))
{
sclass
->
base
=
root
->
func
->
dmac
[
index
]
->
base
;
sclass
->
priv
=
root
->
func
->
dmac
[
index
];
sclass
->
ctor
=
nv50_disp_root_dmac_new_
;
return
0
;
}
index
-=
ARRAY_SIZE
(
root
->
func
->
dmac
);
if
(
index
<
ARRAY_SIZE
(
root
->
func
->
pioc
))
{
sclass
->
base
=
root
->
func
->
pioc
[
index
]
->
base
;
sclass
->
priv
=
root
->
func
->
pioc
[
index
];
sclass
->
ctor
=
nv50_disp_root_pioc_new_
;
return
0
;
}
return
-
EINVAL
;
}
static
int
nv50_disp_root_fini_
(
struct
nvkm_object
*
object
,
bool
suspend
)
{
struct
nv50_disp_root
*
root
=
nv50_disp_root
(
object
);
root
->
func
->
fini
(
root
);
return
0
;
}
static
int
nv50_disp_root_init_
(
struct
nvkm_object
*
object
)
{
struct
nv50_disp_root
*
root
=
nv50_disp_root
(
object
);
return
root
->
func
->
init
(
root
);
}
static
void
*
nv50_disp_root_dtor_
(
struct
nvkm_object
*
object
)
{
struct
nv50_disp_root
*
root
=
nv50_disp_root
(
object
);
nvkm_ramht_del
(
&
root
->
ramht
);
nvkm_gpuobj_del
(
&
root
->
instmem
);
return
root
;
}
static
const
struct
nvkm_object_func
nv50_disp_root_
=
{
.
dtor
=
nv50_disp_root_dtor_
,
.
init
=
nv50_disp_root_init_
,
.
fini
=
nv50_disp_root_fini_
,
.
mthd
=
nv50_disp_root_mthd_
,
.
ntfy
=
nvkm_disp_ntfy
,
.
sclass
=
nv50_disp_root_child_get_
,
};
int
nv50_disp_root_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
nv50_disp_root_new_
(
const
struct
nv50_disp_root_func
*
func
,
struct
nvkm_disp
*
base
,
const
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
engine
;
struct
nv50_disp
*
disp
=
nv50_disp
(
base
)
;
struct
nv50_disp_root
*
root
;
struct
nvkm_device
*
device
=
disp
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_gpuobj
*
instmem
=
(
void
*
)
parent
;
int
ret
;
ret
=
nvkm_parent_create
(
parent
,
engine
,
oclass
,
0
,
disp
->
sclass
,
0
,
&
root
);
*
pobject
=
nv_object
(
root
);
if
(
!
(
root
=
kzalloc
(
sizeof
(
*
root
),
GFP_KERNEL
)))
return
-
ENOMEM
;
*
pobject
=
&
root
->
object
;
nvkm_object_ctor
(
&
nv50_disp_root_
,
oclass
,
&
root
->
object
);
root
->
func
=
func
;
root
->
disp
=
disp
;
ret
=
nvkm_gpuobj_new
(
disp
->
base
.
engine
.
subdev
.
device
,
0x10000
,
0x10000
,
false
,
NULL
,
&
root
->
instmem
);
if
(
ret
)
return
ret
;
return
nvkm_ramht_new
(
device
,
0x1000
,
0
,
instmem
,
&
root
->
ramht
);
return
nvkm_ramht_new
(
device
,
0x1000
,
0
,
root
->
instmem
,
&
root
->
ramht
);
}
void
nv50_disp_root_
dtor
(
struct
nvkm_object
*
objec
t
)
nv50_disp_root_
fini
(
struct
nv50_disp_root
*
roo
t
)
{
struct
nv50_disp_root
*
root
=
(
void
*
)
object
;
nvkm_ramht_del
(
&
root
->
ramht
);
nvkm_parent_destroy
(
&
root
->
base
);
struct
nvkm_device
*
device
=
root
->
disp
->
base
.
engine
.
subdev
.
device
;
/* disable all interrupts */
nvkm_wr32
(
device
,
0x610024
,
0x00000000
);
nvkm_wr32
(
device
,
0x610020
,
0x00000000
);
}
static
int
nv50_disp_root_init
(
struct
nv
km_object
*
objec
t
)
int
nv50_disp_root_init
(
struct
nv
50_disp_root
*
roo
t
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_root
*
root
=
(
void
*
)
object
;
struct
nv50_disp
*
disp
=
root
->
disp
;
struct
nvkm_device
*
device
=
disp
->
base
.
engine
.
subdev
.
device
;
int
ret
,
i
;
u32
tmp
;
ret
=
nvkm_parent_init
(
&
root
->
base
);
if
(
ret
)
return
ret
;
int
i
;
/* The below segments of code copying values from one register to
* another appear to inform EVO of the display capabilities or
...
...
@@ -279,7 +359,7 @@ nv50_disp_root_init(struct nvkm_object *object)
}
/* point at display engine memory area (hash table, objects) */
nvkm_wr32
(
device
,
0x610010
,
(
root
->
ramht
->
gpuobj
->
addr
>>
8
)
|
9
);
nvkm_wr32
(
device
,
0x610010
,
(
root
->
instmem
->
addr
>>
8
)
|
9
);
/* enable supervisor interrupts, disable everything else */
nvkm_wr32
(
device
,
0x61002c
,
0x00000370
);
...
...
@@ -287,42 +367,33 @@ nv50_disp_root_init(struct nvkm_object *object)
return
0
;
}
static
int
nv50_disp_root_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
{
struct
nv50_disp
*
disp
=
(
void
*
)
object
->
engine
;
struct
nv50_disp_root
*
root
=
(
void
*
)
object
;
struct
nvkm_device
*
device
=
disp
->
base
.
engine
.
subdev
.
device
;
/* disable all interrupts */
nvkm_wr32
(
device
,
0x610024
,
0x00000000
);
nvkm_wr32
(
device
,
0x610020
,
0x00000000
);
return
nvkm_parent_fini
(
&
root
->
base
,
suspend
);
}
struct
nvkm_ofuncs
nv50_disp_root_ofuncs
=
{
.
ctor
=
nv50_disp_root_ctor
,
.
dtor
=
nv50_disp_root_dtor
,
static
const
struct
nv50_disp_root_func
nv50_disp_root
=
{
.
init
=
nv50_disp_root_init
,
.
fini
=
nv50_disp_root_fini
,
.
mthd
=
nv50_disp_root_mthd
,
.
ntfy
=
nvkm_disp_ntfy
,
.
dmac
=
{
&
nv50_disp_core_oclass
,
&
nv50_disp_base_oclass
,
&
nv50_disp_ovly_oclass
,
},
.
pioc
=
{
&
nv50_disp_oimm_oclass
,
&
nv50_disp_curs_oclass
,
},
};
struct
nvkm_oclass
nv50_disp_root_oclass
[]
=
{
{
NV50_DISP
,
&
nv50_disp_root_ofuncs
},
{}
};
static
int
nv50_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_
(
&
nv50_disp_root
,
disp
,
oclass
,
data
,
size
,
pobject
);
}
struct
nvkm_oclass
nv50_disp_sclass
[]
=
{
{
NV50_DISP_CORE_CHANNEL_DMA
,
&
nv50_disp_core_ofuncs
.
base
},
{
NV50_DISP_BASE_CHANNEL_DMA
,
&
nv50_disp_base_ofuncs
.
base
},
{
NV50_DISP_OVERLAY_CHANNEL_DMA
,
&
nv50_disp_ovly_ofuncs
.
base
},
{
NV50_DISP_OVERLAY
,
&
nv50_disp_oimm_ofuncs
.
base
},
{
NV50_DISP_CURSOR
,
&
nv50_disp_curs_ofuncs
.
base
},
{}
const
struct
nvkm_disp_oclass
nv50_disp_root_oclass
=
{
.
base
.
oclass
=
NV50_DISP
,
.
base
.
minver
=
-
1
,
.
base
.
maxver
=
-
1
,
.
ctor
=
nv50_disp_root_new
,
};
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.h
浏览文件 @
0ce41e3c
#ifndef __NV50_DISP_ROOT_H__
#define __NV50_DISP_ROOT_H__
#define nv50_disp_root(p) container_of((p), struct nv50_disp_root, object)
#include "nv50.h"
#include "channv50.h"
#include "dmacnv50.h"
#include <core/parent.h>
#include <nvif/class.h>
struct
nv50_disp_root
{
struct
nvkm_parent
base
;
const
struct
nv50_disp_root_func
*
func
;
struct
nv50_disp
*
disp
;
struct
nvkm_object
object
;
struct
nvkm_gpuobj
*
instmem
;
struct
nvkm_ramht
*
ramht
;
u32
chan
;
};
extern
struct
nvkm_oclass
nv50_disp_root_oclass
[];
extern
struct
nvkm_oclass
nv50_disp_sclass
[];
extern
struct
nvkm_oclass
g84_disp_root_oclass
[];
extern
struct
nvkm_oclass
g84_disp_sclass
[];
extern
struct
nvkm_oclass
g94_disp_root_oclass
[];
extern
struct
nvkm_oclass
g94_disp_sclass
[];
extern
struct
nvkm_oclass
gt200_disp_root_oclass
[];
extern
struct
nvkm_oclass
gt200_disp_sclass
[];
extern
struct
nvkm_oclass
gt215_disp_root_oclass
[];
extern
struct
nvkm_oclass
gt215_disp_sclass
[];
extern
struct
nvkm_oclass
gf119_disp_root_oclass
[];
extern
struct
nvkm_oclass
gf119_disp_sclass
[];
extern
struct
nvkm_oclass
gk104_disp_root_oclass
[];
extern
struct
nvkm_oclass
gk104_disp_sclass
[];
extern
struct
nvkm_oclass
gk110_disp_root_oclass
[];
extern
struct
nvkm_oclass
gk110_disp_sclass
[];
extern
struct
nvkm_oclass
gm107_disp_root_oclass
[];
extern
struct
nvkm_oclass
gm107_disp_sclass
[];
extern
struct
nvkm_oclass
gm204_disp_root_oclass
[];
extern
struct
nvkm_oclass
gm204_disp_sclass
[];
struct
nv50_disp_root_func
{
int
(
*
init
)(
struct
nv50_disp_root
*
);
void
(
*
fini
)(
struct
nv50_disp_root
*
);
const
struct
nv50_disp_dmac_oclass
*
dmac
[
3
];
const
struct
nv50_disp_pioc_oclass
*
pioc
[
2
];
};
int
nv50_disp_root_new_
(
const
struct
nv50_disp_root_func
*
,
struct
nvkm_disp
*
,
const
struct
nvkm_oclass
*
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
);
int
nv50_disp_root_init
(
struct
nv50_disp_root
*
);
void
nv50_disp_root_fini
(
struct
nv50_disp_root
*
);
int
gf119_disp_root_init
(
struct
nv50_disp_root
*
);
void
gf119_disp_root_fini
(
struct
nv50_disp_root
*
);
extern
const
struct
nvkm_disp_oclass
nv50_disp_root_oclass
;
extern
const
struct
nvkm_disp_oclass
g84_disp_root_oclass
;
extern
const
struct
nvkm_disp_oclass
g94_disp_root_oclass
;
extern
const
struct
nvkm_disp_oclass
gt200_disp_root_oclass
;
extern
const
struct
nvkm_disp_oclass
gt215_disp_root_oclass
;
extern
const
struct
nvkm_disp_oclass
gf119_disp_root_oclass
;
extern
const
struct
nvkm_disp_oclass
gk104_disp_root_oclass
;
extern
const
struct
nvkm_disp_oclass
gk110_disp_root_oclass
;
extern
const
struct
nvkm_disp_oclass
gm107_disp_root_oclass
;
extern
const
struct
nvkm_disp_oclass
gm204_disp_root_oclass
;
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录