Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
27f3d6cf
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
27f3d6cf
编写于
8月 20, 2015
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/gr: convert user classes to new-style nvkm_object
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
b3c98150
变更
55
显示空白变更内容
内联
并排
Showing
55 changed file
with
1760 addition
and
1738 deletion
+1760
-1738
drivers/gpu/drm/nouveau/include/nvif/device.h
drivers/gpu/drm/nouveau/include/nvif/device.h
+1
-1
drivers/gpu/drm/nouveau/include/nvkm/core/client.h
drivers/gpu/drm/nouveau/include/nvkm/core/client.h
+0
-1
drivers/gpu/drm/nouveau/include/nvkm/engine/gr.h
drivers/gpu/drm/nouveau/include/nvkm/engine/gr.h
+7
-30
drivers/gpu/drm/nouveau/nvkm/core/client.c
drivers/gpu/drm/nouveau/nvkm/core/client.c
+0
-10
drivers/gpu/drm/nouveau/nvkm/engine/gr/Kbuild
drivers/gpu/drm/nouveau/nvkm/engine/gr/Kbuild
+1
-0
drivers/gpu/drm/nouveau/nvkm/engine/gr/base.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/base.c
+84
-0
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.c
+27
-36
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h
+16
-23
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf104.c
+3
-12
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf108.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf108.c
+10
-19
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf110.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf110.c
+3
-12
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf117.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf117.c
+22
-31
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf119.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf119.c
+3
-12
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c
+24
-33
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110.c
+3
-12
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110b.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110b.c
+3
-12
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk208.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk208.c
+3
-12
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk20a.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk20a.c
+8
-17
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm107.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm107.c
+31
-40
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm204.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm204.c
+15
-24
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm206.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm206.c
+3
-12
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm20b.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm20b.c
+8
-17
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxnv40.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxnv40.c
+0
-2
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxnv40.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxnv40.h
+0
-2
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxnv50.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxnv50.c
+0
-4
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c
+120
-84
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h
+17
-10
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf104.c
+15
-2
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf108.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf108.c
+14
-16
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf110.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf110.c
+15
-17
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf117.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf117.c
+17
-2
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf119.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf119.c
+17
-2
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.c
+13
-15
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110.c
+13
-15
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110b.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110b.c
+15
-2
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk208.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk208.c
+13
-15
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c
+14
-11
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm107.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm107.c
+13
-15
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm204.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm204.c
+13
-15
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm206.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm206.c
+15
-2
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm20b.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm20b.c
+14
-11
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv04.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv04.c
+117
-148
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv10.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv10.c
+155
-164
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.c
+119
-119
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.h
+10
-5
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv25.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv25.c
+90
-94
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv2a.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv2a.c
+82
-62
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.c
+89
-93
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.c
+89
-93
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv35.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv35.c
+89
-93
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.c
+123
-136
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.h
+17
-2
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv50.c
+131
-118
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv50.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv50.h
+21
-3
drivers/gpu/drm/nouveau/nvkm/engine/gr/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/priv.h
+15
-0
未找到文件。
drivers/gpu/drm/nouveau/include/nvif/device.h
浏览文件 @
27f3d6cf
...
@@ -65,5 +65,5 @@ u64 nvif_device_time(struct nvif_device *);
...
@@ -65,5 +65,5 @@ u64 nvif_device_time(struct nvif_device *);
#include <engine/sw.h>
#include <engine/sw.h>
#define nvxx_fifo(a) nvxx_device(a)->fifo
#define nvxx_fifo(a) nvxx_device(a)->fifo
#define nvxx_gr(a) nv
km_gr(nvxx_device(a))
#define nvxx_gr(a) nv
xx_device(a)->gr
#endif
#endif
drivers/gpu/drm/nouveau/include/nvkm/core/client.h
浏览文件 @
27f3d6cf
...
@@ -30,7 +30,6 @@ int nvkm_client_new(const char *name, u64 device, const char *cfg,
...
@@ -30,7 +30,6 @@ int nvkm_client_new(const char *name, u64 device, const char *cfg,
void
nvkm_client_del
(
struct
nvkm_client
**
);
void
nvkm_client_del
(
struct
nvkm_client
**
);
int
nvkm_client_init
(
struct
nvkm_client
*
);
int
nvkm_client_init
(
struct
nvkm_client
*
);
int
nvkm_client_fini
(
struct
nvkm_client
*
,
bool
suspend
);
int
nvkm_client_fini
(
struct
nvkm_client
*
,
bool
suspend
);
const
char
*
nvkm_client_name
(
void
*
obj
);
static
inline
struct
nvkm_client
*
static
inline
struct
nvkm_client
*
nvkm_client
(
struct
nvkm_object
*
object
)
nvkm_client
(
struct
nvkm_object
*
object
)
...
...
drivers/gpu/drm/nouveau/include/nvkm/engine/gr.h
浏览文件 @
27f3d6cf
#ifndef __NVKM_GR_H__
#ifndef __NVKM_GR_H__
#define __NVKM_GR_H__
#define __NVKM_GR_H__
#include <core/engctx.h>
struct
nvkm_gr_chan
{
struct
nvkm_engctx
base
;
};
#define nvkm_gr_context_create(p,e,c,g,s,a,f,d) \
nvkm_engctx_create((p), (e), (c), (g), (s), (a), (f), (d))
#define nvkm_gr_context_destroy(d) \
nvkm_engctx_destroy(&(d)->base)
#define nvkm_gr_context_init(d) \
nvkm_engctx_init(&(d)->base)
#define nvkm_gr_context_fini(d,s) \
nvkm_engctx_fini(&(d)->base, (s))
#define _nvkm_gr_context_dtor _nvkm_engctx_dtor
#define _nvkm_gr_context_init _nvkm_engctx_init
#define _nvkm_gr_context_fini _nvkm_engctx_fini
#define _nvkm_gr_context_rd32 _nvkm_engctx_rd32
#define _nvkm_gr_context_wr32 _nvkm_engctx_wr32
#include <core/engine.h>
#include <core/engine.h>
struct
nvkm_gr
{
struct
nvkm_gr
{
struct
nvkm_engine
engine
;
struct
nvkm_engine
engine
;
const
struct
nvkm_gr_func
*
func
;
/* Returns chipset-specific counts of units packed into an u64.
/* Returns chipset-specific counts of units packed into an u64.
*/
*/
u64
(
*
units
)(
struct
nvkm_gr
*
);
u64
(
*
units
)(
struct
nvkm_gr
*
);
};
};
static
inline
struct
nvkm_gr
*
nvkm_gr
(
void
*
obj
)
{
return
(
void
*
)
nvkm_engine
(
obj
,
NVDEV_ENGINE_GR
);
}
#define nvkm_gr_create(p,e,c,y,d) \
#define nvkm_gr_create(p,e,c,y,d) \
nvkm_engine_create((p), (e), (c), (y), "PGRAPH", "graphics", (d))
nvkm_gr_create_((p), (e), (c), (y), sizeof(**d), (void **)(d))
int
nvkm_gr_create_
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
bool
enable
,
int
length
,
void
**
pobject
);
#define nvkm_gr_destroy(d) \
#define nvkm_gr_destroy(d) \
nvkm_engine_destroy(&(d)->engine)
nvkm_engine_destroy(&(d)->engine)
#define nvkm_gr_init(d) \
#define nvkm_gr_init(d) \
...
@@ -79,8 +57,7 @@ extern struct nvkm_oclass *gm20b_gr_oclass;
...
@@ -79,8 +57,7 @@ extern struct nvkm_oclass *gm20b_gr_oclass;
#include <core/enum.h>
#include <core/enum.h>
extern
const
struct
nvkm_bitfield
nv04_gr_nsource
[];
extern
const
struct
nvkm_bitfield
nv04_gr_nsource
[];
extern
struct
nvkm_ofuncs
nv04_gr_ofuncs
;
bool
nv04_gr_idle
(
struct
nvkm_gr
*
);
bool
nv04_gr_idle
(
void
*
obj
);
extern
const
struct
nvkm_bitfield
nv10_gr_intr_name
[];
extern
const
struct
nvkm_bitfield
nv10_gr_intr_name
[];
extern
const
struct
nvkm_bitfield
nv10_gr_nstatus
[];
extern
const
struct
nvkm_bitfield
nv10_gr_nstatus
[];
...
...
drivers/gpu/drm/nouveau/nvkm/core/client.c
浏览文件 @
27f3d6cf
...
@@ -321,13 +321,3 @@ nvkm_client_new(const char *name, u64 device, const char *cfg,
...
@@ -321,13 +321,3 @@ nvkm_client_new(const char *name, u64 device, const char *cfg,
nvkm_client_del
(
pclient
);
nvkm_client_del
(
pclient
);
return
ret
;
return
ret
;
}
}
const
char
*
nvkm_client_name
(
void
*
obj
)
{
const
char
*
client_name
=
"unknown"
;
struct
nvkm_client
*
client
=
nvkm_client
(
obj
);
if
(
client
)
client_name
=
client
->
name
;
return
client_name
;
}
drivers/gpu/drm/nouveau/nvkm/engine/gr/Kbuild
浏览文件 @
27f3d6cf
nvkm-y += nvkm/engine/gr/base.o
nvkm-y += nvkm/engine/gr/nv04.o
nvkm-y += nvkm/engine/gr/nv04.o
nvkm-y += nvkm/engine/gr/nv10.o
nvkm-y += nvkm/engine/gr/nv10.o
nvkm-y += nvkm/engine/gr/nv20.o
nvkm-y += nvkm/engine/gr/nv20.o
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/base.c
0 → 100644
浏览文件 @
27f3d6cf
/*
* 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 "priv.h"
#include <engine/fifo.h>
static
int
nvkm_gr_oclass_get
(
struct
nvkm_oclass
*
oclass
,
int
index
)
{
struct
nvkm_gr
*
gr
=
nvkm_gr
(
oclass
->
engine
);
int
c
=
0
;
if
(
gr
->
func
->
object_get
)
{
int
ret
=
gr
->
func
->
object_get
(
gr
,
index
,
&
oclass
->
base
);
if
(
oclass
->
base
.
oclass
)
return
index
;
return
ret
;
}
while
(
gr
->
func
->
sclass
[
c
].
oclass
)
{
if
(
c
++
==
index
)
{
oclass
->
base
=
gr
->
func
->
sclass
[
index
];
return
index
;
}
}
return
c
;
}
static
int
nvkm_gr_cclass_new
(
struct
nvkm_fifo_chan
*
chan
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
{
struct
nvkm_gr
*
gr
=
nvkm_gr
(
oclass
->
engine
);
if
(
gr
->
func
->
chan_new
)
return
gr
->
func
->
chan_new
(
gr
,
chan
,
oclass
,
pobject
);
return
0
;
}
struct
nvkm_engine_func
nvkm_gr
=
{
.
fifo
.
cclass
=
nvkm_gr_cclass_new
,
.
fifo
.
sclass
=
nvkm_gr_oclass_get
,
};
int
nvkm_gr_create_
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
bool
enable
,
int
length
,
void
**
pobject
)
{
struct
nvkm_gr
*
gr
;
int
ret
;
ret
=
nvkm_engine_create_
(
parent
,
engine
,
oclass
,
enable
,
"gr"
,
"gr"
,
length
,
pobject
);
gr
=
*
pobject
;
if
(
ret
)
return
ret
;
gr
->
engine
.
func
=
&
nvkm_gr
;
return
0
;
}
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.c
浏览文件 @
27f3d6cf
...
@@ -1027,23 +1027,23 @@ gf100_grctx_mmio_item(struct gf100_grctx *info, u32 addr, u32 data,
...
@@ -1027,23 +1027,23 @@ gf100_grctx_mmio_item(struct gf100_grctx *info, u32 addr, u32 data,
void
void
gf100_grctx_generate_bundle
(
struct
gf100_grctx
*
info
)
gf100_grctx_generate_bundle
(
struct
gf100_grctx
*
info
)
{
{
const
struct
gf100_grctx_
oclass
*
impl
=
gf100_grctx_impl
(
info
->
gr
)
;
const
struct
gf100_grctx_
func
*
grctx
=
info
->
gr
->
func
->
grctx
;
const
u32
access
=
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
;
const
u32
access
=
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
;
const
int
s
=
8
;
const
int
s
=
8
;
const
int
b
=
mmio_vram
(
info
,
impl
->
bundle_size
,
(
1
<<
s
),
access
);
const
int
b
=
mmio_vram
(
info
,
grctx
->
bundle_size
,
(
1
<<
s
),
access
);
mmio_refn
(
info
,
0x408004
,
0x00000000
,
s
,
b
);
mmio_refn
(
info
,
0x408004
,
0x00000000
,
s
,
b
);
mmio_wr32
(
info
,
0x408008
,
0x80000000
|
(
impl
->
bundle_size
>>
s
));
mmio_wr32
(
info
,
0x408008
,
0x80000000
|
(
grctx
->
bundle_size
>>
s
));
mmio_refn
(
info
,
0x418808
,
0x00000000
,
s
,
b
);
mmio_refn
(
info
,
0x418808
,
0x00000000
,
s
,
b
);
mmio_wr32
(
info
,
0x41880c
,
0x80000000
|
(
impl
->
bundle_size
>>
s
));
mmio_wr32
(
info
,
0x41880c
,
0x80000000
|
(
grctx
->
bundle_size
>>
s
));
}
}
void
void
gf100_grctx_generate_pagepool
(
struct
gf100_grctx
*
info
)
gf100_grctx_generate_pagepool
(
struct
gf100_grctx
*
info
)
{
{
const
struct
gf100_grctx_
oclass
*
impl
=
gf100_grctx_impl
(
info
->
gr
)
;
const
struct
gf100_grctx_
func
*
grctx
=
info
->
gr
->
func
->
grctx
;
const
u32
access
=
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
;
const
u32
access
=
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
;
const
int
s
=
8
;
const
int
s
=
8
;
const
int
b
=
mmio_vram
(
info
,
impl
->
pagepool_size
,
(
1
<<
s
),
access
);
const
int
b
=
mmio_vram
(
info
,
grctx
->
pagepool_size
,
(
1
<<
s
),
access
);
mmio_refn
(
info
,
0x40800c
,
0x00000000
,
s
,
b
);
mmio_refn
(
info
,
0x40800c
,
0x00000000
,
s
,
b
);
mmio_wr32
(
info
,
0x408010
,
0x80000000
);
mmio_wr32
(
info
,
0x408010
,
0x80000000
);
mmio_refn
(
info
,
0x419004
,
0x00000000
,
s
,
b
);
mmio_refn
(
info
,
0x419004
,
0x00000000
,
s
,
b
);
...
@@ -1054,9 +1054,9 @@ void
...
@@ -1054,9 +1054,9 @@ void
gf100_grctx_generate_attrib
(
struct
gf100_grctx
*
info
)
gf100_grctx_generate_attrib
(
struct
gf100_grctx
*
info
)
{
{
struct
gf100_gr
*
gr
=
info
->
gr
;
struct
gf100_gr
*
gr
=
info
->
gr
;
const
struct
gf100_grctx_
oclass
*
impl
=
gf100_grctx_impl
(
gr
)
;
const
struct
gf100_grctx_
func
*
grctx
=
gr
->
func
->
grctx
;
const
u32
attrib
=
impl
->
attrib_nr
;
const
u32
attrib
=
grctx
->
attrib_nr
;
const
u32
size
=
0x20
*
(
impl
->
attrib_nr_max
+
impl
->
alpha_nr_max
);
const
u32
size
=
0x20
*
(
grctx
->
attrib_nr_max
+
grctx
->
alpha_nr_max
);
const
u32
access
=
NV_MEM_ACCESS_RW
;
const
u32
access
=
NV_MEM_ACCESS_RW
;
const
int
s
=
12
;
const
int
s
=
12
;
const
int
b
=
mmio_vram
(
info
,
size
*
gr
->
tpc_total
,
(
1
<<
s
),
access
);
const
int
b
=
mmio_vram
(
info
,
size
*
gr
->
tpc_total
,
(
1
<<
s
),
access
);
...
@@ -1072,7 +1072,7 @@ gf100_grctx_generate_attrib(struct gf100_grctx *info)
...
@@ -1072,7 +1072,7 @@ gf100_grctx_generate_attrib(struct gf100_grctx *info)
const
u32
o
=
TPC_UNIT
(
gpc
,
tpc
,
0x0520
);
const
u32
o
=
TPC_UNIT
(
gpc
,
tpc
,
0x0520
);
mmio_skip
(
info
,
o
,
(
attrib
<<
16
)
|
++
bo
);
mmio_skip
(
info
,
o
,
(
attrib
<<
16
)
|
++
bo
);
mmio_wr32
(
info
,
o
,
(
attrib
<<
16
)
|
--
bo
);
mmio_wr32
(
info
,
o
,
(
attrib
<<
16
)
|
--
bo
);
bo
+=
impl
->
attrib_nr_max
;
bo
+=
grctx
->
attrib_nr_max
;
}
}
}
}
}
}
...
@@ -1237,22 +1237,22 @@ void
...
@@ -1237,22 +1237,22 @@ void
gf100_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
gf100_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
{
{
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
gf100_grctx_oclass
*
oclass
=
(
void
*
)
nv_engine
(
gr
)
->
cclass
;
const
struct
gf100_grctx_func
*
grctx
=
gr
->
func
->
grctx
;
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
0
);
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
0
);
gf100_gr_mmio
(
gr
,
oclass
->
hub
);
gf100_gr_mmio
(
gr
,
grctx
->
hub
);
gf100_gr_mmio
(
gr
,
oclass
->
gpc
);
gf100_gr_mmio
(
gr
,
grctx
->
gpc
);
gf100_gr_mmio
(
gr
,
oclass
->
zcull
);
gf100_gr_mmio
(
gr
,
grctx
->
zcull
);
gf100_gr_mmio
(
gr
,
oclass
->
tpc
);
gf100_gr_mmio
(
gr
,
grctx
->
tpc
);
gf100_gr_mmio
(
gr
,
oclass
->
ppc
);
gf100_gr_mmio
(
gr
,
grctx
->
ppc
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
oclass
->
bundle
(
info
);
grctx
->
bundle
(
info
);
oclass
->
pagepool
(
info
);
grctx
->
pagepool
(
info
);
oclass
->
attrib
(
info
);
grctx
->
attrib
(
info
);
oclass
->
unkn
(
gr
);
grctx
->
unkn
(
gr
);
gf100_grctx_generate_tpcid
(
gr
);
gf100_grctx_generate_tpcid
(
gr
);
gf100_grctx_generate_r406028
(
gr
);
gf100_grctx_generate_r406028
(
gr
);
...
@@ -1260,16 +1260,16 @@ gf100_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
...
@@ -1260,16 +1260,16 @@ gf100_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
gf100_grctx_generate_r418bb8
(
gr
);
gf100_grctx_generate_r418bb8
(
gr
);
gf100_grctx_generate_r406800
(
gr
);
gf100_grctx_generate_r406800
(
gr
);
gf100_gr_icmd
(
gr
,
oclass
->
icmd
);
gf100_gr_icmd
(
gr
,
grctx
->
icmd
);
nvkm_wr32
(
device
,
0x404154
,
0x00000400
);
nvkm_wr32
(
device
,
0x404154
,
0x00000400
);
gf100_gr_mthd
(
gr
,
oclass
->
mthd
);
gf100_gr_mthd
(
gr
,
grctx
->
mthd
);
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
1
);
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
1
);
}
}
int
int
gf100_grctx_generate
(
struct
gf100_gr
*
gr
)
gf100_grctx_generate
(
struct
gf100_gr
*
gr
)
{
{
struct
gf100_grctx_oclass
*
oclass
=
(
void
*
)
nv_engine
(
gr
)
->
cclass
;
const
struct
gf100_grctx_func
*
grctx
=
gr
->
func
->
grctx
;
struct
nvkm_subdev
*
subdev
=
&
gr
->
base
.
engine
.
subdev
;
struct
nvkm_subdev
*
subdev
=
&
gr
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
struct
nvkm_device
*
device
=
subdev
->
device
;
struct
nvkm_memory
*
chan
;
struct
nvkm_memory
*
chan
;
...
@@ -1352,7 +1352,7 @@ gf100_grctx_generate(struct gf100_gr *gr)
...
@@ -1352,7 +1352,7 @@ gf100_grctx_generate(struct gf100_gr *gr)
);
);
}
}
oclass
->
main
(
gr
,
&
info
);
grctx
->
main
(
gr
,
&
info
);
/* trigger a context unload by unsetting the "next channel valid" bit
/* trigger a context unload by unsetting the "next channel valid" bit
* and faking a context switch interrupt
* and faking a context switch interrupt
...
@@ -1383,17 +1383,8 @@ gf100_grctx_generate(struct gf100_gr *gr)
...
@@ -1383,17 +1383,8 @@ gf100_grctx_generate(struct gf100_gr *gr)
return
ret
;
return
ret
;
}
}
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gf100_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gf100_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0xc0
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gf100_grctx_generate_main
,
.
main
=
gf100_grctx_generate_main
,
.
unkn
=
gf100_grctx_generate_unkn
,
.
unkn
=
gf100_grctx_generate_unkn
,
.
hub
=
gf100_grctx_pack_hub
,
.
hub
=
gf100_grctx_pack_hub
,
...
@@ -1409,4 +1400,4 @@ gf100_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -1409,4 +1400,4 @@ gf100_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib
=
gf100_grctx_generate_attrib
,
.
attrib
=
gf100_grctx_generate_attrib
,
.
attrib_nr_max
=
0x324
,
.
attrib_nr_max
=
0x324
,
.
attrib_nr
=
0x218
,
.
attrib_nr
=
0x218
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h
浏览文件 @
27f3d6cf
...
@@ -19,8 +19,7 @@ void gf100_grctx_mmio_item(struct gf100_grctx *, u32 addr, u32 data, int s, int)
...
@@ -19,8 +19,7 @@ void gf100_grctx_mmio_item(struct gf100_grctx *, u32 addr, u32 data, int s, int)
#define mmio_skip(a,b,c) mmio_refn((a), (b), (c), -1, -1)
#define mmio_skip(a,b,c) mmio_refn((a), (b), (c), -1, -1)
#define mmio_wr32(a,b,c) mmio_refn((a), (b), (c), 0, -1)
#define mmio_wr32(a,b,c) mmio_refn((a), (b), (c), 0, -1)
struct
gf100_grctx_oclass
{
struct
gf100_grctx_func
{
struct
nvkm_oclass
base
;
/* main context generation function */
/* main context generation function */
void
(
*
main
)(
struct
gf100_gr
*
,
struct
gf100_grctx
*
);
void
(
*
main
)(
struct
gf100_gr
*
,
struct
gf100_grctx
*
);
/* context-specific modify-on-first-load list generation function */
/* context-specific modify-on-first-load list generation function */
...
@@ -50,13 +49,7 @@ struct gf100_grctx_oclass {
...
@@ -50,13 +49,7 @@ struct gf100_grctx_oclass {
u32
alpha_nr
;
u32
alpha_nr
;
};
};
static
inline
const
struct
gf100_grctx_oclass
*
extern
const
struct
gf100_grctx_func
gf100_grctx
;
gf100_grctx_impl
(
struct
gf100_gr
*
gr
)
{
return
(
void
*
)
nv_engine
(
gr
)
->
cclass
;
}
extern
struct
nvkm_oclass
*
gf100_grctx_oclass
;
int
gf100_grctx_generate
(
struct
gf100_gr
*
);
int
gf100_grctx_generate
(
struct
gf100_gr
*
);
void
gf100_grctx_generate_main
(
struct
gf100_gr
*
,
struct
gf100_grctx
*
);
void
gf100_grctx_generate_main
(
struct
gf100_gr
*
,
struct
gf100_grctx
*
);
void
gf100_grctx_generate_bundle
(
struct
gf100_grctx
*
);
void
gf100_grctx_generate_bundle
(
struct
gf100_grctx
*
);
...
@@ -69,20 +62,20 @@ void gf100_grctx_generate_r4060a8(struct gf100_gr *);
...
@@ -69,20 +62,20 @@ void gf100_grctx_generate_r4060a8(struct gf100_gr *);
void
gf100_grctx_generate_r418bb8
(
struct
gf100_gr
*
);
void
gf100_grctx_generate_r418bb8
(
struct
gf100_gr
*
);
void
gf100_grctx_generate_r406800
(
struct
gf100_gr
*
);
void
gf100_grctx_generate_r406800
(
struct
gf100_gr
*
);
extern
struct
nvkm_oclass
*
gf108_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gf108_grctx
;
void
gf108_grctx_generate_attrib
(
struct
gf100_grctx
*
);
void
gf108_grctx_generate_attrib
(
struct
gf100_grctx
*
);
void
gf108_grctx_generate_unkn
(
struct
gf100_gr
*
);
void
gf108_grctx_generate_unkn
(
struct
gf100_gr
*
);
extern
struct
nvkm_oclass
*
gf104_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gf104_grctx
;
extern
struct
nvkm_oclass
*
gf110_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gf110_grctx
;
extern
struct
nvkm_oclass
*
gf117_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gf117_grctx
;
void
gf117_grctx_generate_attrib
(
struct
gf100_grctx
*
);
void
gf117_grctx_generate_attrib
(
struct
gf100_grctx
*
);
extern
struct
nvkm_oclass
*
gf119_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gf119_grctx
;
extern
struct
nvkm_oclass
*
gk104_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gk104_grctx
;
extern
struct
nvkm_oclass
*
gk20a_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gk20a_grctx
;
void
gk104_grctx_generate_main
(
struct
gf100_gr
*
,
struct
gf100_grctx
*
);
void
gk104_grctx_generate_main
(
struct
gf100_gr
*
,
struct
gf100_grctx
*
);
void
gk104_grctx_generate_bundle
(
struct
gf100_grctx
*
);
void
gk104_grctx_generate_bundle
(
struct
gf100_grctx
*
);
void
gk104_grctx_generate_pagepool
(
struct
gf100_grctx
*
);
void
gk104_grctx_generate_pagepool
(
struct
gf100_grctx
*
);
...
@@ -95,22 +88,22 @@ void gm107_grctx_generate_bundle(struct gf100_grctx *);
...
@@ -95,22 +88,22 @@ void gm107_grctx_generate_bundle(struct gf100_grctx *);
void
gm107_grctx_generate_pagepool
(
struct
gf100_grctx
*
);
void
gm107_grctx_generate_pagepool
(
struct
gf100_grctx
*
);
void
gm107_grctx_generate_attrib
(
struct
gf100_grctx
*
);
void
gm107_grctx_generate_attrib
(
struct
gf100_grctx
*
);
extern
struct
nvkm_oclass
*
gk110_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gk110_grctx
;
extern
struct
nvkm_oclass
*
gk110b_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gk110b_grctx
;
extern
struct
nvkm_oclass
*
gk208_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gk208_grctx
;
extern
struct
nvkm_oclass
*
gm107_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gm107_grctx
;
void
gm107_grctx_generate_bundle
(
struct
gf100_grctx
*
);
void
gm107_grctx_generate_bundle
(
struct
gf100_grctx
*
);
void
gm107_grctx_generate_pagepool
(
struct
gf100_grctx
*
);
void
gm107_grctx_generate_pagepool
(
struct
gf100_grctx
*
);
void
gm107_grctx_generate_attrib
(
struct
gf100_grctx
*
);
void
gm107_grctx_generate_attrib
(
struct
gf100_grctx
*
);
extern
struct
nvkm_oclass
*
gm204_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gm204_grctx
;
void
gm204_grctx_generate_main
(
struct
gf100_gr
*
,
struct
gf100_grctx
*
);
void
gm204_grctx_generate_main
(
struct
gf100_gr
*
,
struct
gf100_grctx
*
);
void
gm204_grctx_generate_tpcid
(
struct
gf100_gr
*
);
void
gm204_grctx_generate_tpcid
(
struct
gf100_gr
*
);
void
gm204_grctx_generate_405b60
(
struct
gf100_gr
*
);
void
gm204_grctx_generate_405b60
(
struct
gf100_gr
*
);
extern
struct
nvkm_oclass
*
gm206_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gm206_grctx
;
extern
struct
nvkm_oclass
*
gm20b_grctx_oclass
;
extern
const
struct
gf100_grctx_func
gm20b_grctx
;
/* context init value lists */
/* context init value lists */
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf104.c
浏览文件 @
27f3d6cf
...
@@ -79,17 +79,8 @@ gf104_grctx_pack_tpc[] = {
...
@@ -79,17 +79,8 @@ gf104_grctx_pack_tpc[] = {
* PGRAPH context implementation
* PGRAPH context implementation
******************************************************************************/
******************************************************************************/
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gf104_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gf104_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0xc3
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gf100_grctx_generate_main
,
.
main
=
gf100_grctx_generate_main
,
.
unkn
=
gf100_grctx_generate_unkn
,
.
unkn
=
gf100_grctx_generate_unkn
,
.
hub
=
gf100_grctx_pack_hub
,
.
hub
=
gf100_grctx_pack_hub
,
...
@@ -105,4 +96,4 @@ gf104_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -105,4 +96,4 @@ gf104_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib
=
gf100_grctx_generate_attrib
,
.
attrib
=
gf100_grctx_generate_attrib
,
.
attrib_nr_max
=
0x324
,
.
attrib_nr_max
=
0x324
,
.
attrib_nr
=
0x218
,
.
attrib_nr
=
0x218
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf108.c
浏览文件 @
27f3d6cf
...
@@ -731,17 +731,17 @@ void
...
@@ -731,17 +731,17 @@ void
gf108_grctx_generate_attrib
(
struct
gf100_grctx
*
info
)
gf108_grctx_generate_attrib
(
struct
gf100_grctx
*
info
)
{
{
struct
gf100_gr
*
gr
=
info
->
gr
;
struct
gf100_gr
*
gr
=
info
->
gr
;
const
struct
gf100_grctx_
oclass
*
impl
=
gf100_grctx_impl
(
gr
)
;
const
struct
gf100_grctx_
func
*
grctx
=
gr
->
func
->
grctx
;
const
u32
alpha
=
impl
->
alpha_nr
;
const
u32
alpha
=
grctx
->
alpha_nr
;
const
u32
beta
=
impl
->
attrib_nr
;
const
u32
beta
=
grctx
->
attrib_nr
;
const
u32
size
=
0x20
*
(
impl
->
attrib_nr_max
+
impl
->
alpha_nr_max
);
const
u32
size
=
0x20
*
(
grctx
->
attrib_nr_max
+
grctx
->
alpha_nr_max
);
const
u32
access
=
NV_MEM_ACCESS_RW
;
const
u32
access
=
NV_MEM_ACCESS_RW
;
const
int
s
=
12
;
const
int
s
=
12
;
const
int
b
=
mmio_vram
(
info
,
size
*
gr
->
tpc_total
,
(
1
<<
s
),
access
);
const
int
b
=
mmio_vram
(
info
,
size
*
gr
->
tpc_total
,
(
1
<<
s
),
access
);
const
int
timeslice_mode
=
1
;
const
int
timeslice_mode
=
1
;
const
int
max_batches
=
0xffff
;
const
int
max_batches
=
0xffff
;
u32
bo
=
0
;
u32
bo
=
0
;
u32
ao
=
bo
+
impl
->
attrib_nr_max
*
gr
->
tpc_total
;
u32
ao
=
bo
+
grctx
->
attrib_nr_max
*
gr
->
tpc_total
;
int
gpc
,
tpc
;
int
gpc
,
tpc
;
mmio_refn
(
info
,
0x418810
,
0x80000000
,
s
,
b
);
mmio_refn
(
info
,
0x418810
,
0x80000000
,
s
,
b
);
...
@@ -757,9 +757,9 @@ gf108_grctx_generate_attrib(struct gf100_grctx *info)
...
@@ -757,9 +757,9 @@ gf108_grctx_generate_attrib(struct gf100_grctx *info)
const
u32
o
=
TPC_UNIT
(
gpc
,
tpc
,
0x500
);
const
u32
o
=
TPC_UNIT
(
gpc
,
tpc
,
0x500
);
mmio_skip
(
info
,
o
+
0x20
,
(
t
<<
28
)
|
(
b
<<
16
)
|
++
bo
);
mmio_skip
(
info
,
o
+
0x20
,
(
t
<<
28
)
|
(
b
<<
16
)
|
++
bo
);
mmio_wr32
(
info
,
o
+
0x20
,
(
t
<<
28
)
|
(
b
<<
16
)
|
--
bo
);
mmio_wr32
(
info
,
o
+
0x20
,
(
t
<<
28
)
|
(
b
<<
16
)
|
--
bo
);
bo
+=
impl
->
attrib_nr_max
;
bo
+=
grctx
->
attrib_nr_max
;
mmio_wr32
(
info
,
o
+
0x44
,
(
a
<<
16
)
|
ao
);
mmio_wr32
(
info
,
o
+
0x44
,
(
a
<<
16
)
|
ao
);
ao
+=
impl
->
alpha_nr_max
;
ao
+=
grctx
->
alpha_nr_max
;
}
}
}
}
}
}
...
@@ -776,17 +776,8 @@ gf108_grctx_generate_unkn(struct gf100_gr *gr)
...
@@ -776,17 +776,8 @@ gf108_grctx_generate_unkn(struct gf100_gr *gr)
nvkm_mask
(
device
,
0x419c00
,
0x00000008
,
0x00000008
);
nvkm_mask
(
device
,
0x419c00
,
0x00000008
,
0x00000008
);
}
}
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gf108_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gf108_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0xc1
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gf100_grctx_generate_main
,
.
main
=
gf100_grctx_generate_main
,
.
unkn
=
gf108_grctx_generate_unkn
,
.
unkn
=
gf108_grctx_generate_unkn
,
.
hub
=
gf108_grctx_pack_hub
,
.
hub
=
gf108_grctx_pack_hub
,
...
@@ -804,4 +795,4 @@ gf108_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -804,4 +795,4 @@ gf108_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib_nr
=
0x218
,
.
attrib_nr
=
0x218
,
.
alpha_nr_max
=
0x324
,
.
alpha_nr_max
=
0x324
,
.
alpha_nr
=
0x218
,
.
alpha_nr
=
0x218
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf110.c
浏览文件 @
27f3d6cf
...
@@ -330,17 +330,8 @@ gf110_grctx_pack_gpc[] = {
...
@@ -330,17 +330,8 @@ gf110_grctx_pack_gpc[] = {
* PGRAPH context implementation
* PGRAPH context implementation
******************************************************************************/
******************************************************************************/
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gf110_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gf110_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0xc8
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gf100_grctx_generate_main
,
.
main
=
gf100_grctx_generate_main
,
.
unkn
=
gf100_grctx_generate_unkn
,
.
unkn
=
gf100_grctx_generate_unkn
,
.
hub
=
gf100_grctx_pack_hub
,
.
hub
=
gf100_grctx_pack_hub
,
...
@@ -356,4 +347,4 @@ gf110_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -356,4 +347,4 @@ gf110_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib
=
gf100_grctx_generate_attrib
,
.
attrib
=
gf100_grctx_generate_attrib
,
.
attrib_nr_max
=
0x324
,
.
attrib_nr_max
=
0x324
,
.
attrib_nr
=
0x218
,
.
attrib_nr
=
0x218
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf117.c
浏览文件 @
27f3d6cf
...
@@ -183,17 +183,17 @@ void
...
@@ -183,17 +183,17 @@ void
gf117_grctx_generate_attrib
(
struct
gf100_grctx
*
info
)
gf117_grctx_generate_attrib
(
struct
gf100_grctx
*
info
)
{
{
struct
gf100_gr
*
gr
=
info
->
gr
;
struct
gf100_gr
*
gr
=
info
->
gr
;
const
struct
gf100_grctx_
oclass
*
impl
=
gf100_grctx_impl
(
gr
)
;
const
struct
gf100_grctx_
func
*
grctx
=
gr
->
func
->
grctx
;
const
u32
alpha
=
impl
->
alpha_nr
;
const
u32
alpha
=
grctx
->
alpha_nr
;
const
u32
beta
=
impl
->
attrib_nr
;
const
u32
beta
=
grctx
->
attrib_nr
;
const
u32
size
=
0x20
*
(
impl
->
attrib_nr_max
+
impl
->
alpha_nr_max
);
const
u32
size
=
0x20
*
(
grctx
->
attrib_nr_max
+
grctx
->
alpha_nr_max
);
const
u32
access
=
NV_MEM_ACCESS_RW
;
const
u32
access
=
NV_MEM_ACCESS_RW
;
const
int
s
=
12
;
const
int
s
=
12
;
const
int
b
=
mmio_vram
(
info
,
size
*
gr
->
tpc_total
,
(
1
<<
s
),
access
);
const
int
b
=
mmio_vram
(
info
,
size
*
gr
->
tpc_total
,
(
1
<<
s
),
access
);
const
int
timeslice_mode
=
1
;
const
int
timeslice_mode
=
1
;
const
int
max_batches
=
0xffff
;
const
int
max_batches
=
0xffff
;
u32
bo
=
0
;
u32
bo
=
0
;
u32
ao
=
bo
+
impl
->
attrib_nr_max
*
gr
->
tpc_total
;
u32
ao
=
bo
+
grctx
->
attrib_nr_max
*
gr
->
tpc_total
;
int
gpc
,
ppc
;
int
gpc
,
ppc
;
mmio_refn
(
info
,
0x418810
,
0x80000000
,
s
,
b
);
mmio_refn
(
info
,
0x418810
,
0x80000000
,
s
,
b
);
...
@@ -209,9 +209,9 @@ gf117_grctx_generate_attrib(struct gf100_grctx *info)
...
@@ -209,9 +209,9 @@ gf117_grctx_generate_attrib(struct gf100_grctx *info)
const
u32
o
=
PPC_UNIT
(
gpc
,
ppc
,
0
);
const
u32
o
=
PPC_UNIT
(
gpc
,
ppc
,
0
);
mmio_skip
(
info
,
o
+
0xc0
,
(
t
<<
28
)
|
(
b
<<
16
)
|
++
bo
);
mmio_skip
(
info
,
o
+
0xc0
,
(
t
<<
28
)
|
(
b
<<
16
)
|
++
bo
);
mmio_wr32
(
info
,
o
+
0xc0
,
(
t
<<
28
)
|
(
b
<<
16
)
|
--
bo
);
mmio_wr32
(
info
,
o
+
0xc0
,
(
t
<<
28
)
|
(
b
<<
16
)
|
--
bo
);
bo
+=
impl
->
attrib_nr_max
*
gr
->
ppc_tpc_nr
[
gpc
][
ppc
];
bo
+=
grctx
->
attrib_nr_max
*
gr
->
ppc_tpc_nr
[
gpc
][
ppc
];
mmio_wr32
(
info
,
o
+
0xe4
,
(
a
<<
16
)
|
ao
);
mmio_wr32
(
info
,
o
+
0xe4
,
(
a
<<
16
)
|
ao
);
ao
+=
impl
->
alpha_nr_max
*
gr
->
ppc_tpc_nr
[
gpc
][
ppc
];
ao
+=
grctx
->
alpha_nr_max
*
gr
->
ppc_tpc_nr
[
gpc
][
ppc
];
}
}
}
}
}
}
...
@@ -220,23 +220,23 @@ void
...
@@ -220,23 +220,23 @@ void
gf117_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
gf117_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
{
{
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
gf100_grctx_oclass
*
oclass
=
(
void
*
)
nv_engine
(
gr
)
->
cclass
;
const
struct
gf100_grctx_func
*
grctx
=
gr
->
func
->
grctx
;
int
i
;
int
i
;
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
0
);
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
0
);
gf100_gr_mmio
(
gr
,
oclass
->
hub
);
gf100_gr_mmio
(
gr
,
grctx
->
hub
);
gf100_gr_mmio
(
gr
,
oclass
->
gpc
);
gf100_gr_mmio
(
gr
,
grctx
->
gpc
);
gf100_gr_mmio
(
gr
,
oclass
->
zcull
);
gf100_gr_mmio
(
gr
,
grctx
->
zcull
);
gf100_gr_mmio
(
gr
,
oclass
->
tpc
);
gf100_gr_mmio
(
gr
,
grctx
->
tpc
);
gf100_gr_mmio
(
gr
,
oclass
->
ppc
);
gf100_gr_mmio
(
gr
,
grctx
->
ppc
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
oclass
->
bundle
(
info
);
grctx
->
bundle
(
info
);
oclass
->
pagepool
(
info
);
grctx
->
pagepool
(
info
);
oclass
->
attrib
(
info
);
grctx
->
attrib
(
info
);
oclass
->
unkn
(
gr
);
grctx
->
unkn
(
gr
);
gf100_grctx_generate_tpcid
(
gr
);
gf100_grctx_generate_tpcid
(
gr
);
gf100_grctx_generate_r406028
(
gr
);
gf100_grctx_generate_r406028
(
gr
);
...
@@ -247,23 +247,14 @@ gf117_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
...
@@ -247,23 +247,14 @@ gf117_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
for
(
i
=
0
;
i
<
8
;
i
++
)
for
(
i
=
0
;
i
<
8
;
i
++
)
nvkm_wr32
(
device
,
0x4064d0
+
(
i
*
0x04
),
0x00000000
);
nvkm_wr32
(
device
,
0x4064d0
+
(
i
*
0x04
),
0x00000000
);
gf100_gr_icmd
(
gr
,
oclass
->
icmd
);
gf100_gr_icmd
(
gr
,
grctx
->
icmd
);
nvkm_wr32
(
device
,
0x404154
,
0x00000400
);
nvkm_wr32
(
device
,
0x404154
,
0x00000400
);
gf100_gr_mthd
(
gr
,
oclass
->
mthd
);
gf100_gr_mthd
(
gr
,
grctx
->
mthd
);
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
1
);
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
1
);
}
}
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gf117_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gf117_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0xd7
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gf117_grctx_generate_main
,
.
main
=
gf117_grctx_generate_main
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
hub
=
gf117_grctx_pack_hub
,
.
hub
=
gf117_grctx_pack_hub
,
...
@@ -282,4 +273,4 @@ gf117_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -282,4 +273,4 @@ gf117_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib_nr
=
0x218
,
.
attrib_nr
=
0x218
,
.
alpha_nr_max
=
0x7ff
,
.
alpha_nr_max
=
0x7ff
,
.
alpha_nr
=
0x324
,
.
alpha_nr
=
0x324
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf119.c
浏览文件 @
27f3d6cf
...
@@ -498,17 +498,8 @@ gf119_grctx_pack_tpc[] = {
...
@@ -498,17 +498,8 @@ gf119_grctx_pack_tpc[] = {
* PGRAPH context implementation
* PGRAPH context implementation
******************************************************************************/
******************************************************************************/
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gf119_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gf119_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0xd9
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gf100_grctx_generate_main
,
.
main
=
gf100_grctx_generate_main
,
.
unkn
=
gf108_grctx_generate_unkn
,
.
unkn
=
gf108_grctx_generate_unkn
,
.
hub
=
gf119_grctx_pack_hub
,
.
hub
=
gf119_grctx_pack_hub
,
...
@@ -526,4 +517,4 @@ gf119_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -526,4 +517,4 @@ gf119_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib_nr
=
0x218
,
.
attrib_nr
=
0x218
,
.
alpha_nr_max
=
0x324
,
.
alpha_nr_max
=
0x324
,
.
alpha_nr
=
0x218
,
.
alpha_nr
=
0x218
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c
浏览文件 @
27f3d6cf
...
@@ -843,27 +843,27 @@ gk104_grctx_pack_ppc[] = {
...
@@ -843,27 +843,27 @@ gk104_grctx_pack_ppc[] = {
void
void
gk104_grctx_generate_bundle
(
struct
gf100_grctx
*
info
)
gk104_grctx_generate_bundle
(
struct
gf100_grctx
*
info
)
{
{
const
struct
gf100_grctx_
oclass
*
impl
=
gf100_grctx_impl
(
info
->
gr
)
;
const
struct
gf100_grctx_
func
*
grctx
=
info
->
gr
->
func
->
grctx
;
const
u32
state_limit
=
min
(
impl
->
bundle_min_gpm_fifo_depth
,
const
u32
state_limit
=
min
(
grctx
->
bundle_min_gpm_fifo_depth
,
impl
->
bundle_size
/
0x20
);
grctx
->
bundle_size
/
0x20
);
const
u32
token_limit
=
impl
->
bundle_token_limit
;
const
u32
token_limit
=
grctx
->
bundle_token_limit
;
const
u32
access
=
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
;
const
u32
access
=
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
;
const
int
s
=
8
;
const
int
s
=
8
;
const
int
b
=
mmio_vram
(
info
,
impl
->
bundle_size
,
(
1
<<
s
),
access
);
const
int
b
=
mmio_vram
(
info
,
grctx
->
bundle_size
,
(
1
<<
s
),
access
);
mmio_refn
(
info
,
0x408004
,
0x00000000
,
s
,
b
);
mmio_refn
(
info
,
0x408004
,
0x00000000
,
s
,
b
);
mmio_wr32
(
info
,
0x408008
,
0x80000000
|
(
impl
->
bundle_size
>>
s
));
mmio_wr32
(
info
,
0x408008
,
0x80000000
|
(
grctx
->
bundle_size
>>
s
));
mmio_refn
(
info
,
0x418808
,
0x00000000
,
s
,
b
);
mmio_refn
(
info
,
0x418808
,
0x00000000
,
s
,
b
);
mmio_wr32
(
info
,
0x41880c
,
0x80000000
|
(
impl
->
bundle_size
>>
s
));
mmio_wr32
(
info
,
0x41880c
,
0x80000000
|
(
grctx
->
bundle_size
>>
s
));
mmio_wr32
(
info
,
0x4064c8
,
(
state_limit
<<
16
)
|
token_limit
);
mmio_wr32
(
info
,
0x4064c8
,
(
state_limit
<<
16
)
|
token_limit
);
}
}
void
void
gk104_grctx_generate_pagepool
(
struct
gf100_grctx
*
info
)
gk104_grctx_generate_pagepool
(
struct
gf100_grctx
*
info
)
{
{
const
struct
gf100_grctx_
oclass
*
impl
=
gf100_grctx_impl
(
info
->
gr
)
;
const
struct
gf100_grctx_
func
*
grctx
=
info
->
gr
->
func
->
grctx
;
const
u32
access
=
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
;
const
u32
access
=
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
;
const
int
s
=
8
;
const
int
s
=
8
;
const
int
b
=
mmio_vram
(
info
,
impl
->
pagepool_size
,
(
1
<<
s
),
access
);
const
int
b
=
mmio_vram
(
info
,
grctx
->
pagepool_size
,
(
1
<<
s
),
access
);
mmio_refn
(
info
,
0x40800c
,
0x00000000
,
s
,
b
);
mmio_refn
(
info
,
0x40800c
,
0x00000000
,
s
,
b
);
mmio_wr32
(
info
,
0x408010
,
0x80000000
);
mmio_wr32
(
info
,
0x408010
,
0x80000000
);
mmio_refn
(
info
,
0x419004
,
0x00000000
,
s
,
b
);
mmio_refn
(
info
,
0x419004
,
0x00000000
,
s
,
b
);
...
@@ -955,23 +955,23 @@ void
...
@@ -955,23 +955,23 @@ void
gk104_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
gk104_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
{
{
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
gf100_grctx_oclass
*
oclass
=
(
void
*
)
nv_engine
(
gr
)
->
cclass
;
const
struct
gf100_grctx_func
*
grctx
=
gr
->
func
->
grctx
;
int
i
;
int
i
;
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
0
);
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
0
);
gf100_gr_mmio
(
gr
,
oclass
->
hub
);
gf100_gr_mmio
(
gr
,
grctx
->
hub
);
gf100_gr_mmio
(
gr
,
oclass
->
gpc
);
gf100_gr_mmio
(
gr
,
grctx
->
gpc
);
gf100_gr_mmio
(
gr
,
oclass
->
zcull
);
gf100_gr_mmio
(
gr
,
grctx
->
zcull
);
gf100_gr_mmio
(
gr
,
oclass
->
tpc
);
gf100_gr_mmio
(
gr
,
grctx
->
tpc
);
gf100_gr_mmio
(
gr
,
oclass
->
ppc
);
gf100_gr_mmio
(
gr
,
grctx
->
ppc
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
oclass
->
bundle
(
info
);
grctx
->
bundle
(
info
);
oclass
->
pagepool
(
info
);
grctx
->
pagepool
(
info
);
oclass
->
attrib
(
info
);
grctx
->
attrib
(
info
);
oclass
->
unkn
(
gr
);
grctx
->
unkn
(
gr
);
gf100_grctx_generate_tpcid
(
gr
);
gf100_grctx_generate_tpcid
(
gr
);
gf100_grctx_generate_r406028
(
gr
);
gf100_grctx_generate_r406028
(
gr
);
...
@@ -985,26 +985,17 @@ gk104_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
...
@@ -985,26 +985,17 @@ gk104_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
gk104_grctx_generate_rop_active_fbps
(
gr
);
gk104_grctx_generate_rop_active_fbps
(
gr
);
nvkm_mask
(
device
,
0x419f78
,
0x00000001
,
0x00000000
);
nvkm_mask
(
device
,
0x419f78
,
0x00000001
,
0x00000000
);
gf100_gr_icmd
(
gr
,
oclass
->
icmd
);
gf100_gr_icmd
(
gr
,
grctx
->
icmd
);
nvkm_wr32
(
device
,
0x404154
,
0x00000400
);
nvkm_wr32
(
device
,
0x404154
,
0x00000400
);
gf100_gr_mthd
(
gr
,
oclass
->
mthd
);
gf100_gr_mthd
(
gr
,
grctx
->
mthd
);
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
1
);
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
1
);
nvkm_mask
(
device
,
0x418800
,
0x00200000
,
0x00200000
);
nvkm_mask
(
device
,
0x418800
,
0x00200000
,
0x00200000
);
nvkm_mask
(
device
,
0x41be10
,
0x00800000
,
0x00800000
);
nvkm_mask
(
device
,
0x41be10
,
0x00800000
,
0x00800000
);
}
}
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gk104_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gk104_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0xe4
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gk104_grctx_generate_main
,
.
main
=
gk104_grctx_generate_main
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
hub
=
gk104_grctx_pack_hub
,
.
hub
=
gk104_grctx_pack_hub
,
...
@@ -1025,4 +1016,4 @@ gk104_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -1025,4 +1016,4 @@ gk104_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib_nr
=
0x218
,
.
attrib_nr
=
0x218
,
.
alpha_nr_max
=
0x7ff
,
.
alpha_nr_max
=
0x7ff
,
.
alpha_nr
=
0x648
,
.
alpha_nr
=
0x648
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110.c
浏览文件 @
27f3d6cf
...
@@ -808,17 +808,8 @@ gk110_grctx_pack_ppc[] = {
...
@@ -808,17 +808,8 @@ gk110_grctx_pack_ppc[] = {
* PGRAPH context implementation
* PGRAPH context implementation
******************************************************************************/
******************************************************************************/
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gk110_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gk110_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0xf0
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gk104_grctx_generate_main
,
.
main
=
gk104_grctx_generate_main
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
hub
=
gk110_grctx_pack_hub
,
.
hub
=
gk110_grctx_pack_hub
,
...
@@ -839,4 +830,4 @@ gk110_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -839,4 +830,4 @@ gk110_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib_nr
=
0x218
,
.
attrib_nr
=
0x218
,
.
alpha_nr_max
=
0x7ff
,
.
alpha_nr_max
=
0x7ff
,
.
alpha_nr
=
0x648
,
.
alpha_nr
=
0x648
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110b.c
浏览文件 @
27f3d6cf
...
@@ -69,17 +69,8 @@ gk110b_grctx_pack_tpc[] = {
...
@@ -69,17 +69,8 @@ gk110b_grctx_pack_tpc[] = {
* PGRAPH context implementation
* PGRAPH context implementation
******************************************************************************/
******************************************************************************/
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gk110b_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gk110b_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0xf1
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gk104_grctx_generate_main
,
.
main
=
gk104_grctx_generate_main
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
hub
=
gk110_grctx_pack_hub
,
.
hub
=
gk110_grctx_pack_hub
,
...
@@ -100,4 +91,4 @@ gk110b_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -100,4 +91,4 @@ gk110b_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib_nr
=
0x218
,
.
attrib_nr
=
0x218
,
.
alpha_nr_max
=
0x7ff
,
.
alpha_nr_max
=
0x7ff
,
.
alpha_nr
=
0x648
,
.
alpha_nr
=
0x648
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk208.c
浏览文件 @
27f3d6cf
...
@@ -530,17 +530,8 @@ gk208_grctx_pack_ppc[] = {
...
@@ -530,17 +530,8 @@ gk208_grctx_pack_ppc[] = {
* PGRAPH context implementation
* PGRAPH context implementation
******************************************************************************/
******************************************************************************/
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gk208_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gk208_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0x08
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gk104_grctx_generate_main
,
.
main
=
gk104_grctx_generate_main
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
hub
=
gk208_grctx_pack_hub
,
.
hub
=
gk208_grctx_pack_hub
,
...
@@ -561,4 +552,4 @@ gk208_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -561,4 +552,4 @@ gk208_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib_nr
=
0x218
,
.
attrib_nr
=
0x218
,
.
alpha_nr_max
=
0x7ff
,
.
alpha_nr_max
=
0x7ff
,
.
alpha_nr
=
0x648
,
.
alpha_nr
=
0x648
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk20a.c
浏览文件 @
27f3d6cf
...
@@ -29,7 +29,7 @@ static void
...
@@ -29,7 +29,7 @@ static void
gk20a_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
gk20a_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
{
{
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
gf100_grctx_oclass
*
oclass
=
(
void
*
)
nv_engine
(
gr
)
->
cclass
;
const
struct
gf100_grctx_func
*
grctx
=
gr
->
func
->
grctx
;
int
idle_timeout_save
;
int
idle_timeout_save
;
int
i
;
int
i
;
...
@@ -40,9 +40,9 @@ gk20a_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
...
@@ -40,9 +40,9 @@ gk20a_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
idle_timeout_save
=
nvkm_rd32
(
device
,
0x404154
);
idle_timeout_save
=
nvkm_rd32
(
device
,
0x404154
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
oclass
->
attrib
(
info
);
grctx
->
attrib
(
info
);
oclass
->
unkn
(
gr
);
grctx
->
unkn
(
gr
);
gf100_grctx_generate_tpcid
(
gr
);
gf100_grctx_generate_tpcid
(
gr
);
gf100_grctx_generate_r406028
(
gr
);
gf100_grctx_generate_r406028
(
gr
);
...
@@ -67,21 +67,12 @@ gk20a_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
...
@@ -67,21 +67,12 @@ gk20a_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
gf100_gr_wait_idle
(
gr
);
gf100_gr_wait_idle
(
gr
);
gf100_gr_icmd
(
gr
,
gr
->
fuc_bundle
);
gf100_gr_icmd
(
gr
,
gr
->
fuc_bundle
);
oclass
->
pagepool
(
info
);
grctx
->
pagepool
(
info
);
oclass
->
bundle
(
info
);
grctx
->
bundle
(
info
);
}
}
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gk20a_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gk20a_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0xea
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gk20a_grctx_generate_main
,
.
main
=
gk20a_grctx_generate_main
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
bundle
=
gk104_grctx_generate_bundle
,
.
bundle
=
gk104_grctx_generate_bundle
,
...
@@ -95,4 +86,4 @@ gk20a_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -95,4 +86,4 @@ gk20a_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib_nr
=
0x240
,
.
attrib_nr
=
0x240
,
.
alpha_nr_max
=
0x648
+
(
0x648
/
2
),
.
alpha_nr_max
=
0x648
+
(
0x648
/
2
),
.
alpha_nr
=
0x648
,
.
alpha_nr
=
0x648
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm107.c
浏览文件 @
27f3d6cf
...
@@ -863,27 +863,27 @@ gm107_grctx_pack_ppc[] = {
...
@@ -863,27 +863,27 @@ gm107_grctx_pack_ppc[] = {
void
void
gm107_grctx_generate_bundle
(
struct
gf100_grctx
*
info
)
gm107_grctx_generate_bundle
(
struct
gf100_grctx
*
info
)
{
{
const
struct
gf100_grctx_
oclass
*
impl
=
gf100_grctx_impl
(
info
->
gr
)
;
const
struct
gf100_grctx_
func
*
grctx
=
info
->
gr
->
func
->
grctx
;
const
u32
state_limit
=
min
(
impl
->
bundle_min_gpm_fifo_depth
,
const
u32
state_limit
=
min
(
grctx
->
bundle_min_gpm_fifo_depth
,
impl
->
bundle_size
/
0x20
);
grctx
->
bundle_size
/
0x20
);
const
u32
token_limit
=
impl
->
bundle_token_limit
;
const
u32
token_limit
=
grctx
->
bundle_token_limit
;
const
u32
access
=
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
;
const
u32
access
=
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
;
const
int
s
=
8
;
const
int
s
=
8
;
const
int
b
=
mmio_vram
(
info
,
impl
->
bundle_size
,
(
1
<<
s
),
access
);
const
int
b
=
mmio_vram
(
info
,
grctx
->
bundle_size
,
(
1
<<
s
),
access
);
mmio_refn
(
info
,
0x408004
,
0x00000000
,
s
,
b
);
mmio_refn
(
info
,
0x408004
,
0x00000000
,
s
,
b
);
mmio_wr32
(
info
,
0x408008
,
0x80000000
|
(
impl
->
bundle_size
>>
s
));
mmio_wr32
(
info
,
0x408008
,
0x80000000
|
(
grctx
->
bundle_size
>>
s
));
mmio_refn
(
info
,
0x418e24
,
0x00000000
,
s
,
b
);
mmio_refn
(
info
,
0x418e24
,
0x00000000
,
s
,
b
);
mmio_wr32
(
info
,
0x418e28
,
0x80000000
|
(
impl
->
bundle_size
>>
s
));
mmio_wr32
(
info
,
0x418e28
,
0x80000000
|
(
grctx
->
bundle_size
>>
s
));
mmio_wr32
(
info
,
0x4064c8
,
(
state_limit
<<
16
)
|
token_limit
);
mmio_wr32
(
info
,
0x4064c8
,
(
state_limit
<<
16
)
|
token_limit
);
}
}
void
void
gm107_grctx_generate_pagepool
(
struct
gf100_grctx
*
info
)
gm107_grctx_generate_pagepool
(
struct
gf100_grctx
*
info
)
{
{
const
struct
gf100_grctx_
oclass
*
impl
=
gf100_grctx_impl
(
info
->
gr
)
;
const
struct
gf100_grctx_
func
*
grctx
=
info
->
gr
->
func
->
grctx
;
const
u32
access
=
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
;
const
u32
access
=
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
;
const
int
s
=
8
;
const
int
s
=
8
;
const
int
b
=
mmio_vram
(
info
,
impl
->
pagepool_size
,
(
1
<<
s
),
access
);
const
int
b
=
mmio_vram
(
info
,
grctx
->
pagepool_size
,
(
1
<<
s
),
access
);
mmio_refn
(
info
,
0x40800c
,
0x00000000
,
s
,
b
);
mmio_refn
(
info
,
0x40800c
,
0x00000000
,
s
,
b
);
mmio_wr32
(
info
,
0x408010
,
0x80000000
);
mmio_wr32
(
info
,
0x408010
,
0x80000000
);
mmio_refn
(
info
,
0x419004
,
0x00000000
,
s
,
b
);
mmio_refn
(
info
,
0x419004
,
0x00000000
,
s
,
b
);
...
@@ -896,16 +896,16 @@ void
...
@@ -896,16 +896,16 @@ void
gm107_grctx_generate_attrib
(
struct
gf100_grctx
*
info
)
gm107_grctx_generate_attrib
(
struct
gf100_grctx
*
info
)
{
{
struct
gf100_gr
*
gr
=
info
->
gr
;
struct
gf100_gr
*
gr
=
info
->
gr
;
const
struct
gf100_grctx_
oclass
*
impl
=
(
void
*
)
gf100_grctx_impl
(
gr
)
;
const
struct
gf100_grctx_
func
*
grctx
=
gr
->
func
->
grctx
;
const
u32
alpha
=
impl
->
alpha_nr
;
const
u32
alpha
=
grctx
->
alpha_nr
;
const
u32
attrib
=
impl
->
attrib_nr
;
const
u32
attrib
=
grctx
->
attrib_nr
;
const
u32
size
=
0x20
*
(
impl
->
attrib_nr_max
+
impl
->
alpha_nr_max
);
const
u32
size
=
0x20
*
(
grctx
->
attrib_nr_max
+
grctx
->
alpha_nr_max
);
const
u32
access
=
NV_MEM_ACCESS_RW
;
const
u32
access
=
NV_MEM_ACCESS_RW
;
const
int
s
=
12
;
const
int
s
=
12
;
const
int
b
=
mmio_vram
(
info
,
size
*
gr
->
tpc_total
,
(
1
<<
s
),
access
);
const
int
b
=
mmio_vram
(
info
,
size
*
gr
->
tpc_total
,
(
1
<<
s
),
access
);
const
int
max_batches
=
0xffff
;
const
int
max_batches
=
0xffff
;
u32
bo
=
0
;
u32
bo
=
0
;
u32
ao
=
bo
+
impl
->
attrib_nr_max
*
gr
->
tpc_total
;
u32
ao
=
bo
+
grctx
->
attrib_nr_max
*
gr
->
tpc_total
;
int
gpc
,
ppc
,
n
=
0
;
int
gpc
,
ppc
,
n
=
0
;
mmio_refn
(
info
,
0x418810
,
0x80000000
,
s
,
b
);
mmio_refn
(
info
,
0x418810
,
0x80000000
,
s
,
b
);
...
@@ -922,10 +922,10 @@ gm107_grctx_generate_attrib(struct gf100_grctx *info)
...
@@ -922,10 +922,10 @@ gm107_grctx_generate_attrib(struct gf100_grctx *info)
const
u32
o
=
PPC_UNIT
(
gpc
,
ppc
,
0
);
const
u32
o
=
PPC_UNIT
(
gpc
,
ppc
,
0
);
mmio_wr32
(
info
,
o
+
0xc0
,
bs
);
mmio_wr32
(
info
,
o
+
0xc0
,
bs
);
mmio_wr32
(
info
,
o
+
0xf4
,
bo
);
mmio_wr32
(
info
,
o
+
0xf4
,
bo
);
bo
+=
impl
->
attrib_nr_max
*
gr
->
ppc_tpc_nr
[
gpc
][
ppc
];
bo
+=
grctx
->
attrib_nr_max
*
gr
->
ppc_tpc_nr
[
gpc
][
ppc
];
mmio_wr32
(
info
,
o
+
0xe4
,
as
);
mmio_wr32
(
info
,
o
+
0xe4
,
as
);
mmio_wr32
(
info
,
o
+
0xf8
,
ao
);
mmio_wr32
(
info
,
o
+
0xf8
,
ao
);
ao
+=
impl
->
alpha_nr_max
*
gr
->
ppc_tpc_nr
[
gpc
][
ppc
];
ao
+=
grctx
->
alpha_nr_max
*
gr
->
ppc_tpc_nr
[
gpc
][
ppc
];
mmio_wr32
(
info
,
u
,
((
bs
/
3
/*XXX*/
)
<<
16
)
|
bs
);
mmio_wr32
(
info
,
u
,
((
bs
/
3
/*XXX*/
)
<<
16
)
|
bs
);
}
}
}
}
...
@@ -956,21 +956,21 @@ static void
...
@@ -956,21 +956,21 @@ static void
gm107_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
gm107_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
{
{
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
gf100_grctx_oclass
*
oclass
=
(
void
*
)
nv_engine
(
gr
)
->
cclass
;
const
struct
gf100_grctx_func
*
grctx
=
gr
->
func
->
grctx
;
int
i
;
int
i
;
gf100_gr_mmio
(
gr
,
oclass
->
hub
);
gf100_gr_mmio
(
gr
,
grctx
->
hub
);
gf100_gr_mmio
(
gr
,
oclass
->
gpc
);
gf100_gr_mmio
(
gr
,
grctx
->
gpc
);
gf100_gr_mmio
(
gr
,
oclass
->
zcull
);
gf100_gr_mmio
(
gr
,
grctx
->
zcull
);
gf100_gr_mmio
(
gr
,
oclass
->
tpc
);
gf100_gr_mmio
(
gr
,
grctx
->
tpc
);
gf100_gr_mmio
(
gr
,
oclass
->
ppc
);
gf100_gr_mmio
(
gr
,
grctx
->
ppc
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
oclass
->
bundle
(
info
);
grctx
->
bundle
(
info
);
oclass
->
pagepool
(
info
);
grctx
->
pagepool
(
info
);
oclass
->
attrib
(
info
);
grctx
->
attrib
(
info
);
oclass
->
unkn
(
gr
);
grctx
->
unkn
(
gr
);
gm107_grctx_generate_tpcid
(
gr
);
gm107_grctx_generate_tpcid
(
gr
);
gf100_grctx_generate_r406028
(
gr
);
gf100_grctx_generate_r406028
(
gr
);
...
@@ -986,9 +986,9 @@ gm107_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
...
@@ -986,9 +986,9 @@ gm107_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
gk104_grctx_generate_rop_active_fbps
(
gr
);
gk104_grctx_generate_rop_active_fbps
(
gr
);
gf100_gr_icmd
(
gr
,
oclass
->
icmd
);
gf100_gr_icmd
(
gr
,
grctx
->
icmd
);
nvkm_wr32
(
device
,
0x404154
,
0x00000400
);
nvkm_wr32
(
device
,
0x404154
,
0x00000400
);
gf100_gr_mthd
(
gr
,
oclass
->
mthd
);
gf100_gr_mthd
(
gr
,
grctx
->
mthd
);
nvkm_mask
(
device
,
0x419e00
,
0x00808080
,
0x00808080
);
nvkm_mask
(
device
,
0x419e00
,
0x00808080
,
0x00808080
);
nvkm_mask
(
device
,
0x419ccc
,
0x80000000
,
0x80000000
);
nvkm_mask
(
device
,
0x419ccc
,
0x80000000
,
0x80000000
);
...
@@ -996,17 +996,8 @@ gm107_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
...
@@ -996,17 +996,8 @@ gm107_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
nvkm_mask
(
device
,
0x419f88
,
0x80000000
,
0x80000000
);
nvkm_mask
(
device
,
0x419f88
,
0x80000000
,
0x80000000
);
}
}
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gm107_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gm107_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0x08
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gm107_grctx_generate_main
,
.
main
=
gm107_grctx_generate_main
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
hub
=
gm107_grctx_pack_hub
,
.
hub
=
gm107_grctx_pack_hub
,
...
@@ -1027,4 +1018,4 @@ gm107_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -1027,4 +1018,4 @@ gm107_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib_nr
=
0xaa0
,
.
attrib_nr
=
0xaa0
,
.
alpha_nr_max
=
0x1800
,
.
alpha_nr_max
=
0x1800
,
.
alpha_nr
=
0x1000
,
.
alpha_nr
=
0x1000
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm204.c
浏览文件 @
27f3d6cf
...
@@ -981,22 +981,22 @@ void
...
@@ -981,22 +981,22 @@ void
gm204_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
gm204_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
{
{
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
gf100_grctx_oclass
*
oclass
=
(
void
*
)
nv_engine
(
gr
)
->
cclass
;
const
struct
gf100_grctx_func
*
grctx
=
gr
->
func
->
grctx
;
u32
tmp
;
u32
tmp
;
int
i
;
int
i
;
gf100_gr_mmio
(
gr
,
oclass
->
hub
);
gf100_gr_mmio
(
gr
,
grctx
->
hub
);
gf100_gr_mmio
(
gr
,
oclass
->
gpc
);
gf100_gr_mmio
(
gr
,
grctx
->
gpc
);
gf100_gr_mmio
(
gr
,
oclass
->
zcull
);
gf100_gr_mmio
(
gr
,
grctx
->
zcull
);
gf100_gr_mmio
(
gr
,
oclass
->
tpc
);
gf100_gr_mmio
(
gr
,
grctx
->
tpc
);
gf100_gr_mmio
(
gr
,
oclass
->
ppc
);
gf100_gr_mmio
(
gr
,
grctx
->
ppc
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
oclass
->
bundle
(
info
);
grctx
->
bundle
(
info
);
oclass
->
pagepool
(
info
);
grctx
->
pagepool
(
info
);
oclass
->
attrib
(
info
);
grctx
->
attrib
(
info
);
oclass
->
unkn
(
gr
);
grctx
->
unkn
(
gr
);
gm204_grctx_generate_tpcid
(
gr
);
gm204_grctx_generate_tpcid
(
gr
);
gf100_grctx_generate_r406028
(
gr
);
gf100_grctx_generate_r406028
(
gr
);
...
@@ -1016,25 +1016,16 @@ gm204_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
...
@@ -1016,25 +1016,16 @@ gm204_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
gm204_grctx_generate_405b60
(
gr
);
gm204_grctx_generate_405b60
(
gr
);
gf100_gr_icmd
(
gr
,
oclass
->
icmd
);
gf100_gr_icmd
(
gr
,
grctx
->
icmd
);
nvkm_wr32
(
device
,
0x404154
,
0x00000800
);
nvkm_wr32
(
device
,
0x404154
,
0x00000800
);
gf100_gr_mthd
(
gr
,
oclass
->
mthd
);
gf100_gr_mthd
(
gr
,
grctx
->
mthd
);
nvkm_mask
(
device
,
0x418e94
,
0xffffffff
,
0xc4230000
);
nvkm_mask
(
device
,
0x418e94
,
0xffffffff
,
0xc4230000
);
nvkm_mask
(
device
,
0x418e4c
,
0xffffffff
,
0x70000000
);
nvkm_mask
(
device
,
0x418e4c
,
0xffffffff
,
0x70000000
);
}
}
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gm204_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gm204_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0x24
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gm204_grctx_generate_main
,
.
main
=
gm204_grctx_generate_main
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
hub
=
gm204_grctx_pack_hub
,
.
hub
=
gm204_grctx_pack_hub
,
...
@@ -1055,4 +1046,4 @@ gm204_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -1055,4 +1046,4 @@ gm204_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib_nr
=
0x400
,
.
attrib_nr
=
0x400
,
.
alpha_nr_max
=
0x1800
,
.
alpha_nr_max
=
0x1800
,
.
alpha_nr
=
0x1000
,
.
alpha_nr
=
0x1000
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm206.c
浏览文件 @
27f3d6cf
...
@@ -49,17 +49,8 @@ gm206_grctx_pack_gpc[] = {
...
@@ -49,17 +49,8 @@ gm206_grctx_pack_gpc[] = {
{}
{}
};
};
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gm206_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gm206_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0x26
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gm204_grctx_generate_main
,
.
main
=
gm204_grctx_generate_main
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
hub
=
gm204_grctx_pack_hub
,
.
hub
=
gm204_grctx_pack_hub
,
...
@@ -80,4 +71,4 @@ gm206_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -80,4 +71,4 @@ gm206_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib_nr
=
0x400
,
.
attrib_nr
=
0x400
,
.
alpha_nr_max
=
0x1800
,
.
alpha_nr_max
=
0x1800
,
.
alpha_nr
=
0x1000
,
.
alpha_nr
=
0x1000
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm20b.c
浏览文件 @
27f3d6cf
...
@@ -39,7 +39,7 @@ static void
...
@@ -39,7 +39,7 @@ static void
gm20b_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
gm20b_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
{
{
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
gf100_grctx_oclass
*
oclass
=
(
void
*
)
nv_engine
(
gr
)
->
cclass
;
const
struct
gf100_grctx_func
*
grctx
=
gr
->
func
->
grctx
;
int
idle_timeout_save
;
int
idle_timeout_save
;
int
i
,
tmp
;
int
i
,
tmp
;
...
@@ -50,9 +50,9 @@ gm20b_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
...
@@ -50,9 +50,9 @@ gm20b_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
idle_timeout_save
=
nvkm_rd32
(
device
,
0x404154
);
idle_timeout_save
=
nvkm_rd32
(
device
,
0x404154
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
nvkm_wr32
(
device
,
0x404154
,
0x00000000
);
oclass
->
attrib
(
info
);
grctx
->
attrib
(
info
);
oclass
->
unkn
(
gr
);
grctx
->
unkn
(
gr
);
gm204_grctx_generate_tpcid
(
gr
);
gm204_grctx_generate_tpcid
(
gr
);
gm20b_grctx_generate_r406028
(
gr
);
gm20b_grctx_generate_r406028
(
gr
);
...
@@ -81,21 +81,12 @@ gm20b_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
...
@@ -81,21 +81,12 @@ gm20b_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
gf100_gr_wait_idle
(
gr
);
gf100_gr_wait_idle
(
gr
);
gf100_gr_icmd
(
gr
,
gr
->
fuc_bundle
);
gf100_gr_icmd
(
gr
,
gr
->
fuc_bundle
);
oclass
->
pagepool
(
info
);
grctx
->
pagepool
(
info
);
oclass
->
bundle
(
info
);
grctx
->
bundle
(
info
);
}
}
struct
nvkm_oclass
*
const
struct
gf100_grctx_func
gm20b_grctx_oclass
=
&
(
struct
gf100_grctx_oclass
)
{
gm20b_grctx
=
{
.
base
.
handle
=
NV_ENGCTX
(
GR
,
0x2b
),
.
base
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
gf100_gr_context_ctor
,
.
dtor
=
gf100_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
.
main
=
gm20b_grctx_generate_main
,
.
main
=
gm20b_grctx_generate_main
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
bundle
=
gm107_grctx_generate_bundle
,
.
bundle
=
gm107_grctx_generate_bundle
,
...
@@ -109,4 +100,4 @@ gm20b_grctx_oclass = &(struct gf100_grctx_oclass) {
...
@@ -109,4 +100,4 @@ gm20b_grctx_oclass = &(struct gf100_grctx_oclass) {
.
attrib_nr
=
0x400
,
.
attrib_nr
=
0x400
,
.
alpha_nr_max
=
0xc00
,
.
alpha_nr_max
=
0xc00
,
.
alpha_nr
=
0x800
,
.
alpha_nr
=
0x800
,
}
.
base
;
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxnv40.c
浏览文件 @
27f3d6cf
...
@@ -580,7 +580,6 @@ nv40_gr_construct_shader(struct nvkm_grctx *ctx)
...
@@ -580,7 +580,6 @@ nv40_gr_construct_shader(struct nvkm_grctx *ctx)
if
(
ctx
->
mode
!=
NVKM_GRCTX_VALS
)
if
(
ctx
->
mode
!=
NVKM_GRCTX_VALS
)
return
;
return
;
nvkm_kmap
(
obj
);
offset
+=
0x0280
/
4
;
offset
+=
0x0280
/
4
;
for
(
i
=
0
;
i
<
16
;
i
++
,
offset
+=
2
)
for
(
i
=
0
;
i
<
16
;
i
++
,
offset
+=
2
)
nvkm_wo32
(
obj
,
offset
*
4
,
0x3f800000
);
nvkm_wo32
(
obj
,
offset
*
4
,
0x3f800000
);
...
@@ -591,7 +590,6 @@ nv40_gr_construct_shader(struct nvkm_grctx *ctx)
...
@@ -591,7 +590,6 @@ nv40_gr_construct_shader(struct nvkm_grctx *ctx)
for
(
i
=
0
;
i
<
vs_nr_b1
*
4
;
i
+=
4
)
for
(
i
=
0
;
i
<
vs_nr_b1
*
4
;
i
+=
4
)
nvkm_wo32
(
obj
,
(
offset
+
b1_offset
+
i
)
*
4
,
0x3f800000
);
nvkm_wo32
(
obj
,
(
offset
+
b1_offset
+
i
)
*
4
,
0x3f800000
);
}
}
nvkm_done
(
obj
);
}
}
static
void
static
void
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxnv40.h
浏览文件 @
27f3d6cf
...
@@ -125,8 +125,6 @@ gr_def(struct nvkm_grctx *ctx, u32 reg, u32 val)
...
@@ -125,8 +125,6 @@ gr_def(struct nvkm_grctx *ctx, u32 reg, u32 val)
reg
=
(
reg
-
0x00400000
)
/
4
;
reg
=
(
reg
-
0x00400000
)
/
4
;
reg
=
(
reg
-
ctx
->
ctxprog_reg
)
+
ctx
->
ctxvals_base
;
reg
=
(
reg
-
ctx
->
ctxprog_reg
)
+
ctx
->
ctxvals_base
;
nvkm_kmap
(
ctx
->
data
);
nvkm_wo32
(
ctx
->
data
,
reg
*
4
,
val
);
nvkm_wo32
(
ctx
->
data
,
reg
*
4
,
val
);
nvkm_done
(
ctx
->
data
);
}
}
#endif
#endif
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxnv50.c
浏览文件 @
27f3d6cf
...
@@ -784,10 +784,8 @@ static void
...
@@ -784,10 +784,8 @@ static void
dd_emit
(
struct
nvkm_grctx
*
ctx
,
int
num
,
u32
val
)
{
dd_emit
(
struct
nvkm_grctx
*
ctx
,
int
num
,
u32
val
)
{
int
i
;
int
i
;
if
(
val
&&
ctx
->
mode
==
NVKM_GRCTX_VALS
)
{
if
(
val
&&
ctx
->
mode
==
NVKM_GRCTX_VALS
)
{
nvkm_kmap
(
ctx
->
data
);
for
(
i
=
0
;
i
<
num
;
i
++
)
for
(
i
=
0
;
i
<
num
;
i
++
)
nvkm_wo32
(
ctx
->
data
,
4
*
(
ctx
->
ctxvals_pos
+
i
),
val
);
nvkm_wo32
(
ctx
->
data
,
4
*
(
ctx
->
ctxvals_pos
+
i
),
val
);
nvkm_done
(
ctx
->
data
);
}
}
ctx
->
ctxvals_pos
+=
num
;
ctx
->
ctxvals_pos
+=
num
;
}
}
...
@@ -1159,10 +1157,8 @@ static void
...
@@ -1159,10 +1157,8 @@ static void
xf_emit
(
struct
nvkm_grctx
*
ctx
,
int
num
,
u32
val
)
{
xf_emit
(
struct
nvkm_grctx
*
ctx
,
int
num
,
u32
val
)
{
int
i
;
int
i
;
if
(
val
&&
ctx
->
mode
==
NVKM_GRCTX_VALS
)
{
if
(
val
&&
ctx
->
mode
==
NVKM_GRCTX_VALS
)
{
nvkm_kmap
(
ctx
->
data
);
for
(
i
=
0
;
i
<
num
;
i
++
)
for
(
i
=
0
;
i
<
num
;
i
++
)
nvkm_wo32
(
ctx
->
data
,
4
*
(
ctx
->
ctxvals_pos
+
(
i
<<
3
)),
val
);
nvkm_wo32
(
ctx
->
data
,
4
*
(
ctx
->
ctxvals_pos
+
(
i
<<
3
)),
val
);
nvkm_done
(
ctx
->
data
);
}
}
ctx
->
ctxvals_pos
+=
num
<<
3
;
ctx
->
ctxvals_pos
+=
num
<<
3
;
}
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c
浏览文件 @
27f3d6cf
...
@@ -223,12 +223,8 @@ gf100_fermi_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
...
@@ -223,12 +223,8 @@ gf100_fermi_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
return
-
EINVAL
;
return
-
EINVAL
;
}
}
struct
nvkm_ofuncs
const
struct
nvkm_object_func
gf100_fermi_ofuncs
=
{
gf100_fermi
=
{
.
ctor
=
_nvkm_object_ctor
,
.
dtor
=
nvkm_object_destroy
,
.
init
=
_nvkm_object_init
,
.
fini
=
_nvkm_object_fini
,
.
mthd
=
gf100_fermi_mthd
,
.
mthd
=
gf100_fermi_mthd
,
};
};
...
@@ -259,40 +255,106 @@ gf100_gr_mthd_sw(struct nvkm_device *device, u16 class, u32 mthd, u32 data)
...
@@ -259,40 +255,106 @@ gf100_gr_mthd_sw(struct nvkm_device *device, u16 class, u32 mthd, u32 data)
return
false
;
return
false
;
}
}
struct
nvkm_oclass
static
int
gf100_gr_sclass
[]
=
{
gf100_gr_object_get
(
struct
nvkm_gr
*
base
,
int
index
,
struct
nvkm_sclass
*
sclass
)
{
FERMI_TWOD_A
,
&
nvkm_object_ofuncs
},
{
{
FERMI_MEMORY_TO_MEMORY_FORMAT_A
,
&
nvkm_object_ofuncs
},
struct
gf100_gr
*
gr
=
gf100_gr
(
base
);
{
FERMI_A
,
&
gf100_fermi_ofuncs
},
int
c
=
0
;
{
FERMI_COMPUTE_A
,
&
nvkm_object_ofuncs
},
{}
while
(
gr
->
func
->
sclass
[
c
].
oclass
)
{
};
if
(
c
++
==
index
)
{
*
sclass
=
gr
->
func
->
sclass
[
index
];
return
index
;
}
}
return
c
;
}
/*******************************************************************************
/*******************************************************************************
* PGRAPH context
* PGRAPH context
******************************************************************************/
******************************************************************************/
int
static
int
gf100_gr_context_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
gf100_gr_chan_bind
(
struct
nvkm_object
*
object
,
struct
nvkm_gpuobj
*
parent
,
struct
nvkm_oclass
*
oclass
,
void
*
args
,
u32
size
,
int
align
,
struct
nvkm_gpuobj
**
pgpuobj
)
{
struct
gf100_gr_chan
*
chan
=
gf100_gr_chan
(
object
);
struct
gf100_gr
*
gr
=
chan
->
gr
;
int
ret
,
i
;
ret
=
nvkm_gpuobj_new
(
gr
->
base
.
engine
.
subdev
.
device
,
gr
->
size
,
align
,
false
,
parent
,
pgpuobj
);
if
(
ret
)
return
ret
;
nvkm_kmap
(
*
pgpuobj
);
for
(
i
=
0
;
i
<
gr
->
size
;
i
+=
4
)
nvkm_wo32
(
*
pgpuobj
,
i
,
gr
->
data
[
i
/
4
]);
if
(
!
gr
->
firmware
)
{
nvkm_wo32
(
*
pgpuobj
,
0x00
,
chan
->
mmio_nr
/
2
);
nvkm_wo32
(
*
pgpuobj
,
0x04
,
chan
->
mmio_vma
.
offset
>>
8
);
}
else
{
nvkm_wo32
(
*
pgpuobj
,
0xf4
,
0
);
nvkm_wo32
(
*
pgpuobj
,
0xf8
,
0
);
nvkm_wo32
(
*
pgpuobj
,
0x10
,
chan
->
mmio_nr
/
2
);
nvkm_wo32
(
*
pgpuobj
,
0x14
,
lower_32_bits
(
chan
->
mmio_vma
.
offset
));
nvkm_wo32
(
*
pgpuobj
,
0x18
,
upper_32_bits
(
chan
->
mmio_vma
.
offset
));
nvkm_wo32
(
*
pgpuobj
,
0x1c
,
1
);
nvkm_wo32
(
*
pgpuobj
,
0x20
,
0
);
nvkm_wo32
(
*
pgpuobj
,
0x28
,
0
);
nvkm_wo32
(
*
pgpuobj
,
0x2c
,
0
);
}
nvkm_done
(
*
pgpuobj
);
return
0
;
}
static
void
*
gf100_gr_chan_dtor
(
struct
nvkm_object
*
object
)
{
struct
gf100_gr_chan
*
chan
=
gf100_gr_chan
(
object
);
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
chan
->
data
);
i
++
)
{
if
(
chan
->
data
[
i
].
vma
.
node
)
{
nvkm_vm_unmap
(
&
chan
->
data
[
i
].
vma
);
nvkm_vm_put
(
&
chan
->
data
[
i
].
vma
);
}
nvkm_memory_del
(
&
chan
->
data
[
i
].
mem
);
}
if
(
chan
->
mmio_vma
.
node
)
{
nvkm_vm_unmap
(
&
chan
->
mmio_vma
);
nvkm_vm_put
(
&
chan
->
mmio_vma
);
}
nvkm_memory_del
(
&
chan
->
mmio
);
return
chan
;
}
static
const
struct
nvkm_object_func
gf100_gr_chan
=
{
.
dtor
=
gf100_gr_chan_dtor
,
.
bind
=
gf100_gr_chan_bind
,
};
static
int
gf100_gr_chan_new
(
struct
nvkm_gr
*
base
,
struct
nvkm_fifo_chan
*
fifoch
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
struct
nvkm_object
**
pobject
)
{
{
struct
nvkm_vm
*
vm
=
nvkm_client
(
parent
)
->
vm
;
struct
gf100_gr
*
gr
=
gf100_gr
(
base
);
struct
gf100_gr
*
gr
=
(
void
*
)
engine
;
struct
gf100_gr_data
*
data
=
gr
->
mmio_data
;
struct
gf100_gr_data
*
data
=
gr
->
mmio_data
;
struct
gf100_gr_mmio
*
mmio
=
gr
->
mmio_list
;
struct
gf100_gr_mmio
*
mmio
=
gr
->
mmio_list
;
struct
gf100_gr_chan
*
chan
;
struct
gf100_gr_chan
*
chan
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_gpuobj
*
image
;
int
ret
,
i
;
int
ret
,
i
;
/* allocate memory for context, and fill with default values */
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
ret
=
nvkm_gr_context_create
(
parent
,
engine
,
oclass
,
NULL
,
return
-
ENOMEM
;
gr
->
size
,
0x100
,
nvkm_object_ctor
(
&
gf100_gr_chan
,
oclass
,
&
chan
->
object
);
NVOBJ_FLAG_ZERO_ALLOC
,
&
chan
);
chan
->
gr
=
gr
;
*
pobject
=
nv_object
(
chan
);
*
pobject
=
&
chan
->
object
;
if
(
ret
)
return
ret
;
/* allocate memory for a "mmio list" buffer that's used by the HUB
/* allocate memory for a "mmio list" buffer that's used by the HUB
* fuc to modify some per-context register settings on first load
* fuc to modify some per-context register settings on first load
...
@@ -303,7 +365,7 @@ gf100_gr_context_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -303,7 +365,7 @@ gf100_gr_context_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
ret
=
nvkm_vm_get
(
vm
,
0x1000
,
12
,
NV_MEM_ACCESS_RW
|
ret
=
nvkm_vm_get
(
fifoch
->
vm
,
0x1000
,
12
,
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
,
&
chan
->
mmio_vma
);
NV_MEM_ACCESS_SYS
,
&
chan
->
mmio_vma
);
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
...
@@ -318,8 +380,9 @@ gf100_gr_context_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -318,8 +380,9 @@ gf100_gr_context_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
ret
=
nvkm_vm_get
(
vm
,
nvkm_memory_size
(
chan
->
data
[
i
].
mem
),
ret
=
nvkm_vm_get
(
fifoch
->
vm
,
12
,
data
->
access
,
&
chan
->
data
[
i
].
vma
);
nvkm_memory_size
(
chan
->
data
[
i
].
mem
),
12
,
data
->
access
,
&
chan
->
data
[
i
].
vma
);
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
...
@@ -343,53 +406,9 @@ gf100_gr_context_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -343,53 +406,9 @@ gf100_gr_context_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
mmio
++
;
mmio
++
;
}
}
nvkm_done
(
chan
->
mmio
);
nvkm_done
(
chan
->
mmio
);
image
=
&
chan
->
base
.
base
.
gpuobj
;
nvkm_kmap
(
image
);
for
(
i
=
0
;
i
<
gr
->
size
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
gr
->
data
[
i
/
4
]);
if
(
!
gr
->
firmware
)
{
nvkm_wo32
(
image
,
0x00
,
chan
->
mmio_nr
/
2
);
nvkm_wo32
(
image
,
0x04
,
chan
->
mmio_vma
.
offset
>>
8
);
}
else
{
nvkm_wo32
(
image
,
0xf4
,
0
);
nvkm_wo32
(
image
,
0xf8
,
0
);
nvkm_wo32
(
image
,
0x10
,
chan
->
mmio_nr
/
2
);
nvkm_wo32
(
image
,
0x14
,
lower_32_bits
(
chan
->
mmio_vma
.
offset
));
nvkm_wo32
(
image
,
0x18
,
upper_32_bits
(
chan
->
mmio_vma
.
offset
));
nvkm_wo32
(
image
,
0x1c
,
1
);
nvkm_wo32
(
image
,
0x20
,
0
);
nvkm_wo32
(
image
,
0x28
,
0
);
nvkm_wo32
(
image
,
0x2c
,
0
);
}
nvkm_done
(
image
);
return
0
;
return
0
;
}
}
void
gf100_gr_context_dtor
(
struct
nvkm_object
*
object
)
{
struct
gf100_gr_chan
*
chan
=
(
void
*
)
object
;
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
chan
->
data
);
i
++
)
{
if
(
chan
->
data
[
i
].
vma
.
node
)
{
nvkm_vm_unmap
(
&
chan
->
data
[
i
].
vma
);
nvkm_vm_put
(
&
chan
->
data
[
i
].
vma
);
}
nvkm_memory_del
(
&
chan
->
data
[
i
].
mem
);
}
if
(
chan
->
mmio_vma
.
node
)
{
nvkm_vm_unmap
(
&
chan
->
mmio_vma
);
nvkm_vm_put
(
&
chan
->
mmio_vma
);
}
nvkm_memory_del
(
&
chan
->
mmio
);
nvkm_gr_context_destroy
(
&
chan
->
base
);
}
/*******************************************************************************
/*******************************************************************************
* PGRAPH register lists
* PGRAPH register lists
******************************************************************************/
******************************************************************************/
...
@@ -1312,10 +1331,10 @@ gf100_gr_init_csdata(struct gf100_gr *gr,
...
@@ -1312,10 +1331,10 @@ gf100_gr_init_csdata(struct gf100_gr *gr,
int
int
gf100_gr_init_ctxctl
(
struct
gf100_gr
*
gr
)
gf100_gr_init_ctxctl
(
struct
gf100_gr
*
gr
)
{
{
const
struct
gf100_grctx_func
*
grctx
=
gr
->
func
->
grctx
;
struct
nvkm_subdev
*
subdev
=
&
gr
->
base
.
engine
.
subdev
;
struct
nvkm_subdev
*
subdev
=
&
gr
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
struct
nvkm_device
*
device
=
subdev
->
device
;
struct
gf100_gr_oclass
*
oclass
=
(
void
*
)
nv_object
(
gr
)
->
oclass
;
struct
gf100_gr_oclass
*
oclass
=
(
void
*
)
nv_object
(
gr
)
->
oclass
;
struct
gf100_grctx_oclass
*
cclass
=
(
void
*
)
nv_engine
(
gr
)
->
cclass
;
int
i
;
int
i
;
if
(
gr
->
firmware
)
{
if
(
gr
->
firmware
)
{
...
@@ -1446,10 +1465,10 @@ gf100_gr_init_ctxctl(struct gf100_gr *gr)
...
@@ -1446,10 +1465,10 @@ gf100_gr_init_ctxctl(struct gf100_gr *gr)
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
1
);
nvkm_mc
(
gr
)
->
unk260
(
nvkm_mc
(
gr
),
1
);
/* load register lists */
/* load register lists */
gf100_gr_init_csdata
(
gr
,
cclass
->
hub
,
0x409000
,
0x000
,
0x000000
);
gf100_gr_init_csdata
(
gr
,
grctx
->
hub
,
0x409000
,
0x000
,
0x000000
);
gf100_gr_init_csdata
(
gr
,
cclass
->
gpc
,
0x41a000
,
0x000
,
0x418000
);
gf100_gr_init_csdata
(
gr
,
grctx
->
gpc
,
0x41a000
,
0x000
,
0x418000
);
gf100_gr_init_csdata
(
gr
,
cclass
->
tpc
,
0x41a000
,
0x004
,
0x419800
);
gf100_gr_init_csdata
(
gr
,
grctx
->
tpc
,
0x41a000
,
0x004
,
0x419800
);
gf100_gr_init_csdata
(
gr
,
cclass
->
ppc
,
0x41a000
,
0x008
,
0x41be00
);
gf100_gr_init_csdata
(
gr
,
grctx
->
ppc
,
0x41a000
,
0x008
,
0x41be00
);
/* start HUB ucode running, it'll init the GPCs */
/* start HUB ucode running, it'll init the GPCs */
nvkm_wr32
(
device
,
0x40910c
,
0x00000000
);
nvkm_wr32
(
device
,
0x40910c
,
0x00000000
);
...
@@ -1646,6 +1665,12 @@ gf100_gr_dtor(struct nvkm_object *object)
...
@@ -1646,6 +1665,12 @@ gf100_gr_dtor(struct nvkm_object *object)
nvkm_gr_destroy
(
&
gr
->
base
);
nvkm_gr_destroy
(
&
gr
->
base
);
}
}
static
const
struct
nvkm_gr_func
gf100_gr_
=
{
.
chan_new
=
gf100_gr_chan_new
,
.
object_get
=
gf100_gr_object_get
,
};
int
int
gf100_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
gf100_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
bclass
,
void
*
data
,
u32
size
,
struct
nvkm_oclass
*
bclass
,
void
*
data
,
u32
size
,
...
@@ -1666,6 +1691,8 @@ gf100_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -1666,6 +1691,8 @@ gf100_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
gr
->
func
=
oclass
->
func
;
gr
->
base
.
func
=
&
gf100_gr_
;
nv_subdev
(
gr
)
->
unit
=
0x08001000
;
nv_subdev
(
gr
)
->
unit
=
0x08001000
;
nv_subdev
(
gr
)
->
intr
=
gf100_gr_intr
;
nv_subdev
(
gr
)
->
intr
=
gf100_gr_intr
;
...
@@ -1752,8 +1779,6 @@ gf100_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -1752,8 +1779,6 @@ gf100_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
break
;
break
;
}
}
nv_engine
(
gr
)
->
cclass
=
*
oclass
->
cclass
;
nv_engine
(
gr
)
->
sclass
=
oclass
->
sclass
;
return
0
;
return
0
;
}
}
...
@@ -1777,6 +1802,18 @@ gf100_gr_gpccs_ucode = {
...
@@ -1777,6 +1802,18 @@ gf100_gr_gpccs_ucode = {
.
data
.
size
=
sizeof
(
gf100_grgpc_data
),
.
data
.
size
=
sizeof
(
gf100_grgpc_data
),
};
};
static
const
struct
gf100_gr_func
gf100_gr
=
{
.
grctx
=
&
gf100_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
FERMI_MEMORY_TO_MEMORY_FORMAT_A
},
{
-
1
,
-
1
,
FERMI_A
,
&
gf100_fermi
},
{
-
1
,
-
1
,
FERMI_COMPUTE_A
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gf100_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
gf100_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xc0
),
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xc0
),
...
@@ -1786,8 +1823,7 @@ gf100_gr_oclass = &(struct gf100_gr_oclass) {
...
@@ -1786,8 +1823,7 @@ gf100_gr_oclass = &(struct gf100_gr_oclass) {
.
init
=
gf100_gr_init
,
.
init
=
gf100_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gf100_grctx_oclass
,
.
func
=
&
gf100_gr
,
.
sclass
=
gf100_gr_sclass
,
.
mmio
=
gf100_gr_pack_mmio
,
.
mmio
=
gf100_gr_pack_mmio
,
.
fecs
.
ucode
=
&
gf100_gr_fecs_ucode
,
.
fecs
.
ucode
=
&
gf100_gr_fecs_ucode
,
.
gpccs
.
ucode
=
&
gf100_gr_gpccs_ucode
,
.
gpccs
.
ucode
=
&
gf100_gr_gpccs_ucode
,
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h
浏览文件 @
27f3d6cf
...
@@ -23,9 +23,12 @@
...
@@ -23,9 +23,12 @@
*/
*/
#ifndef __NVC0_GR_H__
#ifndef __NVC0_GR_H__
#define __NVC0_GR_H__
#define __NVC0_GR_H__
#include <engine/gr.h>
#define gf100_gr(p) container_of((p), struct gf100_gr, base)
#include "priv.h"
#include <core/gpuobj.h>
#include <subdev/ltc.h>
#include <subdev/ltc.h>
#include <subdev/mmu.h>
#define GPC_MAX 32
#define GPC_MAX 32
#define TPC_MAX (GPC_MAX * 8)
#define TPC_MAX (GPC_MAX * 8)
...
@@ -69,6 +72,7 @@ struct gf100_gr_zbc_depth {
...
@@ -69,6 +72,7 @@ struct gf100_gr_zbc_depth {
struct
gf100_gr
{
struct
gf100_gr
{
struct
nvkm_gr
base
;
struct
nvkm_gr
base
;
const
struct
gf100_gr_func
*
func
;
struct
gf100_gr_fuc
fuc409c
;
struct
gf100_gr_fuc
fuc409c
;
struct
gf100_gr_fuc
fuc409d
;
struct
gf100_gr_fuc
fuc409d
;
...
@@ -106,23 +110,27 @@ struct gf100_gr {
...
@@ -106,23 +110,27 @@ struct gf100_gr {
u8
magic_not_rop_nr
;
u8
magic_not_rop_nr
;
};
};
struct
gf100_gr_func
{
const
struct
gf100_grctx_func
*
grctx
;
struct
nvkm_sclass
sclass
[];
};
#define gf100_gr_chan(p) container_of((p), struct gf100_gr_chan, object)
struct
gf100_gr_chan
{
struct
gf100_gr_chan
{
struct
nvkm_gr_chan
base
;
struct
nvkm_object
object
;
struct
gf100_gr
*
gr
;
struct
nvkm_memory
*
mmio
;
struct
nvkm_memory
*
mmio
;
struct
nvkm_vma
mmio_vma
;
struct
nvkm_vma
mmio_vma
;
int
mmio_nr
;
int
mmio_nr
;
struct
{
struct
{
struct
nvkm_memory
*
mem
;
struct
nvkm_memory
*
mem
;
struct
nvkm_vma
vma
;
struct
nvkm_vma
vma
;
}
data
[
4
];
}
data
[
4
];
};
};
int
gf100_gr_context_ctor
(
struct
nvkm_object
*
,
struct
nvkm_object
*
,
struct
nvkm_oclass
*
,
void
*
,
u32
,
struct
nvkm_object
**
);
void
gf100_gr_context_dtor
(
struct
nvkm_object
*
);
void
gf100_gr_ctxctl_debug
(
struct
gf100_gr
*
);
void
gf100_gr_ctxctl_debug
(
struct
gf100_gr
*
);
void
gf100_gr_dtor_fw
(
struct
gf100_gr_fuc
*
);
void
gf100_gr_dtor_fw
(
struct
gf100_gr_fuc
*
);
...
@@ -149,7 +157,7 @@ int gk20a_gr_init(struct nvkm_object *);
...
@@ -149,7 +157,7 @@ int gk20a_gr_init(struct nvkm_object *);
int
gm204_gr_init
(
struct
nvkm_object
*
);
int
gm204_gr_init
(
struct
nvkm_object
*
);
extern
struct
nvkm_ofuncs
gf100_fermi_ofuncs
;
extern
const
struct
nvkm_object_func
gf100_fermi
;
extern
struct
nvkm_oclass
gf100_gr_sclass
[];
extern
struct
nvkm_oclass
gf100_gr_sclass
[];
extern
struct
nvkm_oclass
gf110_gr_sclass
[];
extern
struct
nvkm_oclass
gf110_gr_sclass
[];
...
@@ -185,8 +193,7 @@ extern struct gf100_gr_ucode gk110_gr_gpccs_ucode;
...
@@ -185,8 +193,7 @@ extern struct gf100_gr_ucode gk110_gr_gpccs_ucode;
struct
gf100_gr_oclass
{
struct
gf100_gr_oclass
{
struct
nvkm_oclass
base
;
struct
nvkm_oclass
base
;
struct
nvkm_oclass
**
cclass
;
const
struct
gf100_gr_func
*
func
;
struct
nvkm_oclass
*
sclass
;
const
struct
gf100_gr_pack
*
mmio
;
const
struct
gf100_gr_pack
*
mmio
;
struct
{
struct
{
struct
gf100_gr_ucode
*
ucode
;
struct
gf100_gr_ucode
*
ucode
;
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf104.c
浏览文件 @
27f3d6cf
...
@@ -24,6 +24,8 @@
...
@@ -24,6 +24,8 @@
#include "gf100.h"
#include "gf100.h"
#include "ctxgf100.h"
#include "ctxgf100.h"
#include <nvif/class.h>
/*******************************************************************************
/*******************************************************************************
* PGRAPH register lists
* PGRAPH register lists
******************************************************************************/
******************************************************************************/
...
@@ -110,6 +112,18 @@ gf104_gr_pack_mmio[] = {
...
@@ -110,6 +112,18 @@ gf104_gr_pack_mmio[] = {
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
static
const
struct
gf100_gr_func
gf104_gr
=
{
.
grctx
=
&
gf104_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
FERMI_MEMORY_TO_MEMORY_FORMAT_A
},
{
-
1
,
-
1
,
FERMI_A
,
&
gf100_fermi
},
{
-
1
,
-
1
,
FERMI_COMPUTE_A
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gf104_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
gf104_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xc3
),
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xc3
),
...
@@ -119,8 +133,7 @@ gf104_gr_oclass = &(struct gf100_gr_oclass) {
...
@@ -119,8 +133,7 @@ gf104_gr_oclass = &(struct gf100_gr_oclass) {
.
init
=
gf100_gr_init
,
.
init
=
gf100_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gf104_grctx_oclass
,
.
func
=
&
gf104_gr
,
.
sclass
=
gf100_gr_sclass
,
.
mmio
=
gf104_gr_pack_mmio
,
.
mmio
=
gf104_gr_pack_mmio
,
.
fecs
.
ucode
=
&
gf100_gr_fecs_ucode
,
.
fecs
.
ucode
=
&
gf100_gr_fecs_ucode
,
.
gpccs
.
ucode
=
&
gf100_gr_gpccs_ucode
,
.
gpccs
.
ucode
=
&
gf100_gr_gpccs_ucode
,
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf108.c
浏览文件 @
27f3d6cf
...
@@ -26,20 +26,6 @@
...
@@ -26,20 +26,6 @@
#include <nvif/class.h>
#include <nvif/class.h>
/*******************************************************************************
* Graphics object classes
******************************************************************************/
static
struct
nvkm_oclass
gf108_gr_sclass
[]
=
{
{
FERMI_TWOD_A
,
&
nvkm_object_ofuncs
},
{
FERMI_MEMORY_TO_MEMORY_FORMAT_A
,
&
nvkm_object_ofuncs
},
{
FERMI_A
,
&
gf100_fermi_ofuncs
},
{
FERMI_B
,
&
gf100_fermi_ofuncs
},
{
FERMI_COMPUTE_A
,
&
nvkm_object_ofuncs
},
{}
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH register lists
* PGRAPH register lists
******************************************************************************/
******************************************************************************/
...
@@ -117,6 +103,19 @@ gf108_gr_pack_mmio[] = {
...
@@ -117,6 +103,19 @@ gf108_gr_pack_mmio[] = {
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
static
const
struct
gf100_gr_func
gf108_gr
=
{
.
grctx
=
&
gf108_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
FERMI_MEMORY_TO_MEMORY_FORMAT_A
},
{
-
1
,
-
1
,
FERMI_A
,
&
gf100_fermi
},
{
-
1
,
-
1
,
FERMI_B
,
&
gf100_fermi
},
{
-
1
,
-
1
,
FERMI_COMPUTE_A
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gf108_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
gf108_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xc1
),
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xc1
),
...
@@ -126,8 +125,7 @@ gf108_gr_oclass = &(struct gf100_gr_oclass) {
...
@@ -126,8 +125,7 @@ gf108_gr_oclass = &(struct gf100_gr_oclass) {
.
init
=
gf100_gr_init
,
.
init
=
gf100_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gf108_grctx_oclass
,
.
func
=
&
gf108_gr
,
.
sclass
=
gf108_gr_sclass
,
.
mmio
=
gf108_gr_pack_mmio
,
.
mmio
=
gf108_gr_pack_mmio
,
.
fecs
.
ucode
=
&
gf100_gr_fecs_ucode
,
.
fecs
.
ucode
=
&
gf100_gr_fecs_ucode
,
.
gpccs
.
ucode
=
&
gf100_gr_gpccs_ucode
,
.
gpccs
.
ucode
=
&
gf100_gr_gpccs_ucode
,
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf110.c
浏览文件 @
27f3d6cf
...
@@ -26,21 +26,6 @@
...
@@ -26,21 +26,6 @@
#include <nvif/class.h>
#include <nvif/class.h>
/*******************************************************************************
* Graphics object classes
******************************************************************************/
struct
nvkm_oclass
gf110_gr_sclass
[]
=
{
{
FERMI_TWOD_A
,
&
nvkm_object_ofuncs
},
{
FERMI_MEMORY_TO_MEMORY_FORMAT_A
,
&
nvkm_object_ofuncs
},
{
FERMI_A
,
&
gf100_fermi_ofuncs
},
{
FERMI_B
,
&
gf100_fermi_ofuncs
},
{
FERMI_C
,
&
gf100_fermi_ofuncs
},
{
FERMI_COMPUTE_A
,
&
nvkm_object_ofuncs
},
{}
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH register lists
* PGRAPH register lists
******************************************************************************/
******************************************************************************/
...
@@ -99,6 +84,20 @@ gf110_gr_pack_mmio[] = {
...
@@ -99,6 +84,20 @@ gf110_gr_pack_mmio[] = {
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
static
const
struct
gf100_gr_func
gf110_gr
=
{
.
grctx
=
&
gf110_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
FERMI_MEMORY_TO_MEMORY_FORMAT_A
},
{
-
1
,
-
1
,
FERMI_A
,
&
gf100_fermi
},
{
-
1
,
-
1
,
FERMI_B
,
&
gf100_fermi
},
{
-
1
,
-
1
,
FERMI_C
,
&
gf100_fermi
},
{
-
1
,
-
1
,
FERMI_COMPUTE_A
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gf110_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
gf110_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xc8
),
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xc8
),
...
@@ -108,8 +107,7 @@ gf110_gr_oclass = &(struct gf100_gr_oclass) {
...
@@ -108,8 +107,7 @@ gf110_gr_oclass = &(struct gf100_gr_oclass) {
.
init
=
gf100_gr_init
,
.
init
=
gf100_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gf110_grctx_oclass
,
.
func
=
&
gf110_gr
,
.
sclass
=
gf110_gr_sclass
,
.
mmio
=
gf110_gr_pack_mmio
,
.
mmio
=
gf110_gr_pack_mmio
,
.
fecs
.
ucode
=
&
gf100_gr_fecs_ucode
,
.
fecs
.
ucode
=
&
gf100_gr_fecs_ucode
,
.
gpccs
.
ucode
=
&
gf100_gr_gpccs_ucode
,
.
gpccs
.
ucode
=
&
gf100_gr_gpccs_ucode
,
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf117.c
浏览文件 @
27f3d6cf
...
@@ -24,6 +24,8 @@
...
@@ -24,6 +24,8 @@
#include "gf100.h"
#include "gf100.h"
#include "ctxgf100.h"
#include "ctxgf100.h"
#include <nvif/class.h>
/*******************************************************************************
/*******************************************************************************
* PGRAPH register lists
* PGRAPH register lists
******************************************************************************/
******************************************************************************/
...
@@ -118,6 +120,20 @@ gf117_gr_gpccs_ucode = {
...
@@ -118,6 +120,20 @@ gf117_gr_gpccs_ucode = {
.
data
.
size
=
sizeof
(
gf117_grgpc_data
),
.
data
.
size
=
sizeof
(
gf117_grgpc_data
),
};
};
static
const
struct
gf100_gr_func
gf117_gr
=
{
.
grctx
=
&
gf117_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
FERMI_MEMORY_TO_MEMORY_FORMAT_A
},
{
-
1
,
-
1
,
FERMI_A
,
&
gf100_fermi
},
{
-
1
,
-
1
,
FERMI_B
,
&
gf100_fermi
},
{
-
1
,
-
1
,
FERMI_C
,
&
gf100_fermi
},
{
-
1
,
-
1
,
FERMI_COMPUTE_A
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gf117_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
gf117_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xd7
),
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xd7
),
...
@@ -127,8 +143,7 @@ gf117_gr_oclass = &(struct gf100_gr_oclass) {
...
@@ -127,8 +143,7 @@ gf117_gr_oclass = &(struct gf100_gr_oclass) {
.
init
=
gf100_gr_init
,
.
init
=
gf100_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gf117_grctx_oclass
,
.
func
=
&
gf117_gr
,
.
sclass
=
gf110_gr_sclass
,
.
mmio
=
gf117_gr_pack_mmio
,
.
mmio
=
gf117_gr_pack_mmio
,
.
fecs
.
ucode
=
&
gf117_gr_fecs_ucode
,
.
fecs
.
ucode
=
&
gf117_gr_fecs_ucode
,
.
gpccs
.
ucode
=
&
gf117_gr_gpccs_ucode
,
.
gpccs
.
ucode
=
&
gf117_gr_gpccs_ucode
,
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf119.c
浏览文件 @
27f3d6cf
...
@@ -24,6 +24,8 @@
...
@@ -24,6 +24,8 @@
#include "gf100.h"
#include "gf100.h"
#include "ctxgf100.h"
#include "ctxgf100.h"
#include <nvif/class.h>
/*******************************************************************************
/*******************************************************************************
* PGRAPH register lists
* PGRAPH register lists
******************************************************************************/
******************************************************************************/
...
@@ -173,6 +175,20 @@ gf119_gr_pack_mmio[] = {
...
@@ -173,6 +175,20 @@ gf119_gr_pack_mmio[] = {
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
static
const
struct
gf100_gr_func
gf119_gr
=
{
.
grctx
=
&
gf119_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
FERMI_MEMORY_TO_MEMORY_FORMAT_A
},
{
-
1
,
-
1
,
FERMI_A
,
&
gf100_fermi
},
{
-
1
,
-
1
,
FERMI_B
,
&
gf100_fermi
},
{
-
1
,
-
1
,
FERMI_C
,
&
gf100_fermi
},
{
-
1
,
-
1
,
FERMI_COMPUTE_A
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gf119_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
gf119_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xd9
),
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xd9
),
...
@@ -182,8 +198,7 @@ gf119_gr_oclass = &(struct gf100_gr_oclass) {
...
@@ -182,8 +198,7 @@ gf119_gr_oclass = &(struct gf100_gr_oclass) {
.
init
=
gf100_gr_init
,
.
init
=
gf100_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gf119_grctx_oclass
,
.
func
=
&
gf119_gr
,
.
sclass
=
gf110_gr_sclass
,
.
mmio
=
gf119_gr_pack_mmio
,
.
mmio
=
gf119_gr_pack_mmio
,
.
fecs
.
ucode
=
&
gf100_gr_fecs_ucode
,
.
fecs
.
ucode
=
&
gf100_gr_fecs_ucode
,
.
gpccs
.
ucode
=
&
gf100_gr_gpccs_ucode
,
.
gpccs
.
ucode
=
&
gf100_gr_gpccs_ucode
,
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.c
浏览文件 @
27f3d6cf
...
@@ -28,19 +28,6 @@
...
@@ -28,19 +28,6 @@
#include <nvif/class.h>
#include <nvif/class.h>
/*******************************************************************************
* Graphics object classes
******************************************************************************/
static
struct
nvkm_oclass
gk104_gr_sclass
[]
=
{
{
FERMI_TWOD_A
,
&
nvkm_object_ofuncs
},
{
KEPLER_INLINE_TO_MEMORY_A
,
&
nvkm_object_ofuncs
},
{
KEPLER_A
,
&
gf100_fermi_ofuncs
},
{
KEPLER_COMPUTE_A
,
&
nvkm_object_ofuncs
},
{}
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH register lists
* PGRAPH register lists
******************************************************************************/
******************************************************************************/
...
@@ -311,6 +298,18 @@ gk104_gr_init(struct nvkm_object *object)
...
@@ -311,6 +298,18 @@ gk104_gr_init(struct nvkm_object *object)
return
gf100_gr_init_ctxctl
(
gr
);
return
gf100_gr_init_ctxctl
(
gr
);
}
}
static
const
struct
gf100_gr_func
gk104_gr
=
{
.
grctx
=
&
gk104_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
KEPLER_INLINE_TO_MEMORY_A
},
{
-
1
,
-
1
,
KEPLER_A
,
&
gf100_fermi
},
{
-
1
,
-
1
,
KEPLER_COMPUTE_A
},
{}
}
};
int
int
gk104_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
gk104_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
@@ -351,8 +350,7 @@ gk104_gr_oclass = &(struct gf100_gr_oclass) {
...
@@ -351,8 +350,7 @@ gk104_gr_oclass = &(struct gf100_gr_oclass) {
.
init
=
gk104_gr_init
,
.
init
=
gk104_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gk104_grctx_oclass
,
.
func
=
&
gk104_gr
,
.
sclass
=
gk104_gr_sclass
,
.
mmio
=
gk104_gr_pack_mmio
,
.
mmio
=
gk104_gr_pack_mmio
,
.
fecs
.
ucode
=
&
gk104_gr_fecs_ucode
,
.
fecs
.
ucode
=
&
gk104_gr_fecs_ucode
,
.
gpccs
.
ucode
=
&
gk104_gr_gpccs_ucode
,
.
gpccs
.
ucode
=
&
gk104_gr_gpccs_ucode
,
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110.c
浏览文件 @
27f3d6cf
...
@@ -28,19 +28,6 @@
...
@@ -28,19 +28,6 @@
#include <nvif/class.h>
#include <nvif/class.h>
/*******************************************************************************
* Graphics object classes
******************************************************************************/
struct
nvkm_oclass
gk110_gr_sclass
[]
=
{
{
FERMI_TWOD_A
,
&
nvkm_object_ofuncs
},
{
KEPLER_INLINE_TO_MEMORY_B
,
&
nvkm_object_ofuncs
},
{
KEPLER_B
,
&
gf100_fermi_ofuncs
},
{
KEPLER_COMPUTE_B
,
&
nvkm_object_ofuncs
},
{}
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH register lists
* PGRAPH register lists
******************************************************************************/
******************************************************************************/
...
@@ -193,6 +180,18 @@ gk110_gr_gpccs_ucode = {
...
@@ -193,6 +180,18 @@ gk110_gr_gpccs_ucode = {
.
data
.
size
=
sizeof
(
gk110_grgpc_data
),
.
data
.
size
=
sizeof
(
gk110_grgpc_data
),
};
};
static
const
struct
gf100_gr_func
gk110_gr
=
{
.
grctx
=
&
gk110_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
KEPLER_INLINE_TO_MEMORY_B
},
{
-
1
,
-
1
,
KEPLER_B
,
&
gf100_fermi
},
{
-
1
,
-
1
,
KEPLER_COMPUTE_B
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gk110_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
gk110_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xf0
),
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xf0
),
...
@@ -202,8 +201,7 @@ gk110_gr_oclass = &(struct gf100_gr_oclass) {
...
@@ -202,8 +201,7 @@ gk110_gr_oclass = &(struct gf100_gr_oclass) {
.
init
=
gk104_gr_init
,
.
init
=
gk104_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gk110_grctx_oclass
,
.
func
=
&
gk110_gr
,
.
sclass
=
gk110_gr_sclass
,
.
mmio
=
gk110_gr_pack_mmio
,
.
mmio
=
gk110_gr_pack_mmio
,
.
fecs
.
ucode
=
&
gk110_gr_fecs_ucode
,
.
fecs
.
ucode
=
&
gk110_gr_fecs_ucode
,
.
gpccs
.
ucode
=
&
gk110_gr_gpccs_ucode
,
.
gpccs
.
ucode
=
&
gk110_gr_gpccs_ucode
,
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110b.c
浏览文件 @
27f3d6cf
...
@@ -24,6 +24,8 @@
...
@@ -24,6 +24,8 @@
#include "gf100.h"
#include "gf100.h"
#include "ctxgf100.h"
#include "ctxgf100.h"
#include <nvif/class.h>
/*******************************************************************************
/*******************************************************************************
* PGRAPH register lists
* PGRAPH register lists
******************************************************************************/
******************************************************************************/
...
@@ -98,6 +100,18 @@ gk110b_gr_pack_mmio[] = {
...
@@ -98,6 +100,18 @@ gk110b_gr_pack_mmio[] = {
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
static
const
struct
gf100_gr_func
gk110b_gr
=
{
.
grctx
=
&
gk110b_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
KEPLER_INLINE_TO_MEMORY_B
},
{
-
1
,
-
1
,
KEPLER_B
,
&
gf100_fermi
},
{
-
1
,
-
1
,
KEPLER_COMPUTE_B
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gk110b_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
gk110b_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xf1
),
.
base
.
handle
=
NV_ENGINE
(
GR
,
0xf1
),
...
@@ -107,8 +121,7 @@ gk110b_gr_oclass = &(struct gf100_gr_oclass) {
...
@@ -107,8 +121,7 @@ gk110b_gr_oclass = &(struct gf100_gr_oclass) {
.
init
=
gk104_gr_init
,
.
init
=
gk104_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gk110b_grctx_oclass
,
.
func
=
&
gk110b_gr
,
.
sclass
=
gk110_gr_sclass
,
.
mmio
=
gk110b_gr_pack_mmio
,
.
mmio
=
gk110b_gr_pack_mmio
,
.
fecs
.
ucode
=
&
gk110_gr_fecs_ucode
,
.
fecs
.
ucode
=
&
gk110_gr_fecs_ucode
,
.
gpccs
.
ucode
=
&
gk110_gr_gpccs_ucode
,
.
gpccs
.
ucode
=
&
gk110_gr_gpccs_ucode
,
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk208.c
浏览文件 @
27f3d6cf
...
@@ -28,19 +28,6 @@
...
@@ -28,19 +28,6 @@
#include <nvif/class.h>
#include <nvif/class.h>
/*******************************************************************************
* Graphics object classes
******************************************************************************/
static
struct
nvkm_oclass
gk208_gr_sclass
[]
=
{
{
FERMI_TWOD_A
,
&
nvkm_object_ofuncs
},
{
KEPLER_INLINE_TO_MEMORY_B
,
&
nvkm_object_ofuncs
},
{
KEPLER_B
,
&
gf100_fermi_ofuncs
},
{
KEPLER_COMPUTE_B
,
&
nvkm_object_ofuncs
},
{}
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH register lists
* PGRAPH register lists
******************************************************************************/
******************************************************************************/
...
@@ -172,6 +159,18 @@ gk208_gr_gpccs_ucode = {
...
@@ -172,6 +159,18 @@ gk208_gr_gpccs_ucode = {
.
data
.
size
=
sizeof
(
gk208_grgpc_data
),
.
data
.
size
=
sizeof
(
gk208_grgpc_data
),
};
};
static
const
struct
gf100_gr_func
gk208_gr
=
{
.
grctx
=
&
gk208_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
KEPLER_INLINE_TO_MEMORY_B
},
{
-
1
,
-
1
,
KEPLER_B
,
&
gf100_fermi
},
{
-
1
,
-
1
,
KEPLER_COMPUTE_B
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gk208_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
gk208_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
.
base
.
handle
=
NV_ENGINE
(
GR
,
0x08
),
.
base
.
handle
=
NV_ENGINE
(
GR
,
0x08
),
...
@@ -181,8 +180,7 @@ gk208_gr_oclass = &(struct gf100_gr_oclass) {
...
@@ -181,8 +180,7 @@ gk208_gr_oclass = &(struct gf100_gr_oclass) {
.
init
=
gk104_gr_init
,
.
init
=
gk104_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gk208_grctx_oclass
,
.
func
=
&
gk208_gr
,
.
sclass
=
gk208_gr_sclass
,
.
mmio
=
gk208_gr_pack_mmio
,
.
mmio
=
gk208_gr_pack_mmio
,
.
fecs
.
ucode
=
&
gk208_gr_fecs_ucode
,
.
fecs
.
ucode
=
&
gk208_gr_fecs_ucode
,
.
gpccs
.
ucode
=
&
gk208_gr_gpccs_ucode
,
.
gpccs
.
ucode
=
&
gk208_gr_gpccs_ucode
,
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c
浏览文件 @
27f3d6cf
...
@@ -22,17 +22,9 @@
...
@@ -22,17 +22,9 @@
#include "gk20a.h"
#include "gk20a.h"
#include "ctxgf100.h"
#include "ctxgf100.h"
#include <nvif/class.h>
#include <subdev/timer.h>
#include <subdev/timer.h>
static
struct
nvkm_oclass
#include <nvif/class.h>
gk20a_gr_sclass
[]
=
{
{
FERMI_TWOD_A
,
&
nvkm_object_ofuncs
},
{
KEPLER_INLINE_TO_MEMORY_A
,
&
nvkm_object_ofuncs
},
{
KEPLER_C
,
&
gf100_fermi_ofuncs
},
{
KEPLER_COMPUTE_A
,
&
nvkm_object_ofuncs
},
{}
};
static
void
static
void
gk20a_gr_init_dtor
(
struct
gf100_gr_pack
*
pack
)
gk20a_gr_init_dtor
(
struct
gf100_gr_pack
*
pack
)
...
@@ -350,6 +342,18 @@ gk20a_gr_init(struct nvkm_object *object)
...
@@ -350,6 +342,18 @@ gk20a_gr_init(struct nvkm_object *object)
return
gf100_gr_init_ctxctl
(
gr
);
return
gf100_gr_init_ctxctl
(
gr
);
}
}
static
const
struct
gf100_gr_func
gk20a_gr
=
{
.
grctx
=
&
gk20a_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
KEPLER_INLINE_TO_MEMORY_A
},
{
-
1
,
-
1
,
KEPLER_C
,
&
gf100_fermi
},
{
-
1
,
-
1
,
KEPLER_COMPUTE_A
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gk20a_gr_oclass
=
&
(
struct
gk20a_gr_oclass
)
{
gk20a_gr_oclass
=
&
(
struct
gk20a_gr_oclass
)
{
.
gf100
=
{
.
gf100
=
{
...
@@ -360,8 +364,7 @@ gk20a_gr_oclass = &(struct gk20a_gr_oclass) {
...
@@ -360,8 +364,7 @@ gk20a_gr_oclass = &(struct gk20a_gr_oclass) {
.
init
=
gk20a_gr_init
,
.
init
=
gk20a_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gk20a_grctx_oclass
,
.
func
=
&
gk20a_gr
,
.
sclass
=
gk20a_gr_sclass
,
.
ppc_nr
=
1
,
.
ppc_nr
=
1
,
},
},
.
set_hww_esr_report_mask
=
gk20a_gr_set_hww_esr_report_mask
,
.
set_hww_esr_report_mask
=
gk20a_gr_set_hww_esr_report_mask
,
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm107.c
浏览文件 @
27f3d6cf
...
@@ -29,19 +29,6 @@
...
@@ -29,19 +29,6 @@
#include <nvif/class.h>
#include <nvif/class.h>
/*******************************************************************************
* Graphics object classes
******************************************************************************/
static
struct
nvkm_oclass
gm107_gr_sclass
[]
=
{
{
FERMI_TWOD_A
,
&
nvkm_object_ofuncs
},
{
KEPLER_INLINE_TO_MEMORY_B
,
&
nvkm_object_ofuncs
},
{
MAXWELL_A
,
&
gf100_fermi_ofuncs
},
{
MAXWELL_COMPUTE_A
,
&
nvkm_object_ofuncs
},
{}
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH register lists
* PGRAPH register lists
******************************************************************************/
******************************************************************************/
...
@@ -454,6 +441,18 @@ gm107_gr_gpccs_ucode = {
...
@@ -454,6 +441,18 @@ gm107_gr_gpccs_ucode = {
.
data
.
size
=
sizeof
(
gm107_grgpc_data
),
.
data
.
size
=
sizeof
(
gm107_grgpc_data
),
};
};
static
const
struct
gf100_gr_func
gm107_gr
=
{
.
grctx
=
&
gm107_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
KEPLER_INLINE_TO_MEMORY_B
},
{
-
1
,
-
1
,
MAXWELL_A
,
&
gf100_fermi
},
{
-
1
,
-
1
,
MAXWELL_COMPUTE_A
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gm107_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
gm107_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
.
base
.
handle
=
NV_ENGINE
(
GR
,
0x07
),
.
base
.
handle
=
NV_ENGINE
(
GR
,
0x07
),
...
@@ -463,8 +462,7 @@ gm107_gr_oclass = &(struct gf100_gr_oclass) {
...
@@ -463,8 +462,7 @@ gm107_gr_oclass = &(struct gf100_gr_oclass) {
.
init
=
gm107_gr_init
,
.
init
=
gm107_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gm107_grctx_oclass
,
.
func
=
&
gm107_gr
,
.
sclass
=
gm107_gr_sclass
,
.
mmio
=
gm107_gr_pack_mmio
,
.
mmio
=
gm107_gr_pack_mmio
,
.
fecs
.
ucode
=
&
gm107_gr_fecs_ucode
,
.
fecs
.
ucode
=
&
gm107_gr_fecs_ucode
,
.
gpccs
.
ucode
=
&
gm107_gr_gpccs_ucode
,
.
gpccs
.
ucode
=
&
gm107_gr_gpccs_ucode
,
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm204.c
浏览文件 @
27f3d6cf
...
@@ -26,19 +26,6 @@
...
@@ -26,19 +26,6 @@
#include <nvif/class.h>
#include <nvif/class.h>
/*******************************************************************************
* Graphics object classes
******************************************************************************/
struct
nvkm_oclass
gm204_gr_sclass
[]
=
{
{
FERMI_TWOD_A
,
&
nvkm_object_ofuncs
},
{
KEPLER_INLINE_TO_MEMORY_B
,
&
nvkm_object_ofuncs
},
{
MAXWELL_B
,
&
gf100_fermi_ofuncs
},
{
MAXWELL_COMPUTE_B
,
&
nvkm_object_ofuncs
},
{}
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH register lists
* PGRAPH register lists
******************************************************************************/
******************************************************************************/
...
@@ -371,6 +358,18 @@ gm204_gr_init(struct nvkm_object *object)
...
@@ -371,6 +358,18 @@ gm204_gr_init(struct nvkm_object *object)
return
gm204_gr_init_ctxctl
(
gr
);
return
gm204_gr_init_ctxctl
(
gr
);
}
}
static
const
struct
gf100_gr_func
gm204_gr
=
{
.
grctx
=
&
gm204_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
KEPLER_INLINE_TO_MEMORY_B
},
{
-
1
,
-
1
,
MAXWELL_B
,
&
gf100_fermi
},
{
-
1
,
-
1
,
MAXWELL_COMPUTE_B
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gm204_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
gm204_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
.
base
.
handle
=
NV_ENGINE
(
GR
,
0x24
),
.
base
.
handle
=
NV_ENGINE
(
GR
,
0x24
),
...
@@ -380,8 +379,7 @@ gm204_gr_oclass = &(struct gf100_gr_oclass) {
...
@@ -380,8 +379,7 @@ gm204_gr_oclass = &(struct gf100_gr_oclass) {
.
init
=
gm204_gr_init
,
.
init
=
gm204_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gm204_grctx_oclass
,
.
func
=
&
gm204_gr
,
.
sclass
=
gm204_gr_sclass
,
.
mmio
=
gm204_gr_pack_mmio
,
.
mmio
=
gm204_gr_pack_mmio
,
.
ppc_nr
=
2
,
.
ppc_nr
=
2
,
}.
base
;
}.
base
;
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm206.c
浏览文件 @
27f3d6cf
...
@@ -24,6 +24,20 @@
...
@@ -24,6 +24,20 @@
#include "gf100.h"
#include "gf100.h"
#include "ctxgf100.h"
#include "ctxgf100.h"
#include <nvif/class.h>
static
const
struct
gf100_gr_func
gm206_gr
=
{
.
grctx
=
&
gm206_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
KEPLER_INLINE_TO_MEMORY_B
},
{
-
1
,
-
1
,
MAXWELL_B
,
&
gf100_fermi
},
{
-
1
,
-
1
,
MAXWELL_COMPUTE_B
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gm206_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
gm206_gr_oclass
=
&
(
struct
gf100_gr_oclass
)
{
.
base
.
handle
=
NV_ENGINE
(
GR
,
0x26
),
.
base
.
handle
=
NV_ENGINE
(
GR
,
0x26
),
...
@@ -33,8 +47,7 @@ gm206_gr_oclass = &(struct gf100_gr_oclass) {
...
@@ -33,8 +47,7 @@ gm206_gr_oclass = &(struct gf100_gr_oclass) {
.
init
=
gm204_gr_init
,
.
init
=
gm204_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gm206_grctx_oclass
,
.
func
=
&
gm206_gr
,
.
sclass
=
gm204_gr_sclass
,
.
mmio
=
gm204_gr_pack_mmio
,
.
mmio
=
gm204_gr_pack_mmio
,
.
ppc_nr
=
2
,
.
ppc_nr
=
2
,
}.
base
;
}.
base
;
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm20b.c
浏览文件 @
27f3d6cf
...
@@ -22,17 +22,9 @@
...
@@ -22,17 +22,9 @@
#include "gk20a.h"
#include "gk20a.h"
#include "ctxgf100.h"
#include "ctxgf100.h"
#include <nvif/class.h>
#include <subdev/timer.h>
#include <subdev/timer.h>
static
struct
nvkm_oclass
#include <nvif/class.h>
gm20b_gr_sclass
[]
=
{
{
FERMI_TWOD_A
,
&
nvkm_object_ofuncs
},
{
KEPLER_INLINE_TO_MEMORY_B
,
&
nvkm_object_ofuncs
},
{
MAXWELL_B
,
&
gf100_fermi_ofuncs
},
{
MAXWELL_COMPUTE_B
,
&
nvkm_object_ofuncs
},
{}
};
static
void
static
void
gm20b_gr_init_gpc_mmu
(
struct
gf100_gr
*
gr
)
gm20b_gr_init_gpc_mmu
(
struct
gf100_gr
*
gr
)
...
@@ -67,6 +59,18 @@ gm20b_gr_set_hww_esr_report_mask(struct gf100_gr *gr)
...
@@ -67,6 +59,18 @@ gm20b_gr_set_hww_esr_report_mask(struct gf100_gr *gr)
nvkm_wr32
(
device
,
0x419e4c
,
0x5
);
nvkm_wr32
(
device
,
0x419e4c
,
0x5
);
}
}
static
const
struct
gf100_gr_func
gm20b_gr
=
{
.
grctx
=
&
gm20b_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
KEPLER_INLINE_TO_MEMORY_B
},
{
-
1
,
-
1
,
MAXWELL_B
,
&
gf100_fermi
},
{
-
1
,
-
1
,
MAXWELL_COMPUTE_B
},
{}
}
};
struct
nvkm_oclass
*
struct
nvkm_oclass
*
gm20b_gr_oclass
=
&
(
struct
gk20a_gr_oclass
)
{
gm20b_gr_oclass
=
&
(
struct
gk20a_gr_oclass
)
{
.
gf100
=
{
.
gf100
=
{
...
@@ -77,8 +81,7 @@ gm20b_gr_oclass = &(struct gk20a_gr_oclass) {
...
@@ -77,8 +81,7 @@ gm20b_gr_oclass = &(struct gk20a_gr_oclass) {
.
init
=
gk20a_gr_init
,
.
init
=
gk20a_gr_init
,
.
fini
=
_nvkm_gr_fini
,
.
fini
=
_nvkm_gr_fini
,
},
},
.
cclass
=
&
gm20b_grctx_oclass
,
.
func
=
&
gm20b_gr
,
.
sclass
=
gm20b_gr_sclass
,
.
ppc_nr
=
1
,
.
ppc_nr
=
1
,
},
},
.
init_gpc_mmu
=
gm20b_gr_init_gpc_mmu
,
.
init_gpc_mmu
=
gm20b_gr_init_gpc_mmu
,
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv04.c
浏览文件 @
27f3d6cf
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
* DEALINGS IN THE SOFTWARE.
*/
*/
#include
<engine/gr.h>
#include
"priv.h"
#include "regs.h"
#include "regs.h"
#include <core/client.h>
#include <core/client.h>
...
@@ -345,25 +345,23 @@ nv04_gr_ctx_regs[] = {
...
@@ -345,25 +345,23 @@ nv04_gr_ctx_regs[] = {
NV04_PGRAPH_DEBUG_3
NV04_PGRAPH_DEBUG_3
};
};
#define nv04_gr(p) container_of((p), struct nv04_gr, base)
struct
nv04_gr
{
struct
nv04_gr
{
struct
nvkm_gr
base
;
struct
nvkm_gr
base
;
struct
nv04_gr_chan
*
chan
[
16
];
struct
nv04_gr_chan
*
chan
[
16
];
spinlock_t
lock
;
spinlock_t
lock
;
};
};
#define nv04_gr_chan(p) container_of((p), struct nv04_gr_chan, object)
struct
nv04_gr_chan
{
struct
nv04_gr_chan
{
struct
nvkm_object
base
;
struct
nvkm_object
object
;
struct
nv04_gr
*
gr
;
int
chid
;
int
chid
;
u32
nv04
[
ARRAY_SIZE
(
nv04_gr_ctx_regs
)];
u32
nv04
[
ARRAY_SIZE
(
nv04_gr_ctx_regs
)];
};
};
static
inline
struct
nv04_gr
*
nv04_gr
(
struct
nv04_gr_chan
*
chan
)
{
return
(
void
*
)
nv_object
(
chan
)
->
engine
;
}
/*******************************************************************************
/*******************************************************************************
* Graphics object classes
* Graphics object classes
******************************************************************************/
******************************************************************************/
...
@@ -1041,85 +1039,28 @@ nv04_gr_mthd(struct nvkm_device *device, u32 inst, u32 mthd, u32 data)
...
@@ -1041,85 +1039,28 @@ nv04_gr_mthd(struct nvkm_device *device, u32 inst, u32 mthd, u32 data)
}
}
static
int
static
int
nv04_gr_object_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv04_gr_object_bind
(
struct
nvkm_object
*
object
,
struct
nvkm_gpuobj
*
parent
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
int
align
,
struct
nvkm_gpuobj
**
pgpuobj
)
struct
nvkm_object
**
pobject
)
{
{
struct
nvkm_gpuobj
*
obj
;
int
ret
=
nvkm_gpuobj_new
(
object
->
engine
->
subdev
.
device
,
16
,
align
,
int
ret
;
false
,
parent
,
pgpuobj
);
if
(
ret
==
0
)
{
ret
=
nvkm_gpuobj_create
(
parent
,
engine
,
oclass
,
0
,
parent
,
nvkm_kmap
(
*
pgpuobj
);
16
,
16
,
0
,
&
obj
);
nvkm_wo32
(
*
pgpuobj
,
0x00
,
object
->
oclass_name
);
*
pobject
=
nv_object
(
obj
);
nvkm_wo32
(
*
pgpuobj
,
0x04
,
0x00000000
);
if
(
ret
)
nvkm_wo32
(
*
pgpuobj
,
0x08
,
0x00000000
);
return
ret
;
nvkm_kmap
(
obj
);
nvkm_wo32
(
obj
,
0x00
,
nv_mclass
(
obj
));
#ifdef __BIG_ENDIAN
#ifdef __BIG_ENDIAN
nvkm_mo32
(
obj
,
0x00
,
0x00080000
,
0x00080000
);
nvkm_mo32
(
*
pgpuobj
,
0x08
,
0x00080000
,
0x00080000
);
#endif
#endif
nvkm_wo32
(
obj
,
0x04
,
0x00000000
);
nvkm_wo32
(
*
pgpuobj
,
0x0c
,
0x00000000
);
nvkm_wo32
(
obj
,
0x08
,
0x00000000
);
nvkm_done
(
*
pgpuobj
);
nvkm_wo32
(
obj
,
0x0c
,
0x00000000
);
}
nvkm_done
(
obj
);
return
ret
;
return
0
;
}
}
struct
nvkm_ofuncs
const
struct
nvkm_object_func
nv04_gr_ofuncs
=
{
nv04_gr_object
=
{
.
ctor
=
nv04_gr_object_ctor
,
.
bind
=
nv04_gr_object_bind
,
.
dtor
=
_nvkm_gpuobj_dtor
,
.
init
=
_nvkm_gpuobj_init
,
.
fini
=
_nvkm_gpuobj_fini
,
.
rd32
=
_nvkm_gpuobj_rd32
,
.
wr32
=
_nvkm_gpuobj_wr32
,
};
static
struct
nvkm_oclass
nv04_gr_sclass
[]
=
{
{
0x0012
,
&
nv04_gr_ofuncs
},
/* beta1 */
{
0x0017
,
&
nv04_gr_ofuncs
},
/* chroma */
{
0x0018
,
&
nv04_gr_ofuncs
},
/* pattern (nv01) */
{
0x0019
,
&
nv04_gr_ofuncs
},
/* clip */
{
0x001c
,
&
nv04_gr_ofuncs
},
/* line */
{
0x001d
,
&
nv04_gr_ofuncs
},
/* tri */
{
0x001e
,
&
nv04_gr_ofuncs
},
/* rect */
{
0x001f
,
&
nv04_gr_ofuncs
},
{
0x0021
,
&
nv04_gr_ofuncs
},
{
0x0030
,
&
nv04_gr_ofuncs
},
/* null */
{
0x0036
,
&
nv04_gr_ofuncs
},
{
0x0037
,
&
nv04_gr_ofuncs
},
{
0x0038
,
&
nv04_gr_ofuncs
},
/* dvd subpicture */
{
0x0039
,
&
nv04_gr_ofuncs
},
/* m2mf */
{
0x0042
,
&
nv04_gr_ofuncs
},
/* surf2d */
{
0x0043
,
&
nv04_gr_ofuncs
},
/* rop */
{
0x0044
,
&
nv04_gr_ofuncs
},
/* pattern */
{
0x0048
,
&
nv04_gr_ofuncs
},
{
0x004a
,
&
nv04_gr_ofuncs
},
{
0x004b
,
&
nv04_gr_ofuncs
},
{
0x0052
,
&
nv04_gr_ofuncs
},
/* swzsurf */
{
0x0053
,
&
nv04_gr_ofuncs
},
{
0x0054
,
&
nv04_gr_ofuncs
},
/* ttri */
{
0x0055
,
&
nv04_gr_ofuncs
},
/* mtri */
{
0x0057
,
&
nv04_gr_ofuncs
},
/* chroma */
{
0x0058
,
&
nv04_gr_ofuncs
},
/* surf_dst */
{
0x0059
,
&
nv04_gr_ofuncs
},
/* surf_src */
{
0x005a
,
&
nv04_gr_ofuncs
},
/* surf_color */
{
0x005b
,
&
nv04_gr_ofuncs
},
/* surf_zeta */
{
0x005c
,
&
nv04_gr_ofuncs
},
/* line */
{
0x005d
,
&
nv04_gr_ofuncs
},
/* tri */
{
0x005e
,
&
nv04_gr_ofuncs
},
/* rect */
{
0x005f
,
&
nv04_gr_ofuncs
},
{
0x0060
,
&
nv04_gr_ofuncs
},
{
0x0061
,
&
nv04_gr_ofuncs
},
{
0x0064
,
&
nv04_gr_ofuncs
},
/* iifc (nv05) */
{
0x0065
,
&
nv04_gr_ofuncs
},
/* ifc (nv05) */
{
0x0066
,
&
nv04_gr_ofuncs
},
/* sifc (nv05) */
{
0x0072
,
&
nv04_gr_ofuncs
},
/* beta4 */
{
0x0076
,
&
nv04_gr_ofuncs
},
{
0x0077
,
&
nv04_gr_ofuncs
},
{},
};
};
/*******************************************************************************
/*******************************************************************************
...
@@ -1142,8 +1083,7 @@ nv04_gr_channel(struct nv04_gr *gr)
...
@@ -1142,8 +1083,7 @@ nv04_gr_channel(struct nv04_gr *gr)
static
int
static
int
nv04_gr_load_context
(
struct
nv04_gr_chan
*
chan
,
int
chid
)
nv04_gr_load_context
(
struct
nv04_gr_chan
*
chan
,
int
chid
)
{
{
struct
nv04_gr
*
gr
=
nv04_gr
(
chan
);
struct
nvkm_device
*
device
=
chan
->
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
int
i
;
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
nv04_gr_ctx_regs
);
i
++
)
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
nv04_gr_ctx_regs
);
i
++
)
...
@@ -1158,8 +1098,7 @@ nv04_gr_load_context(struct nv04_gr_chan *chan, int chid)
...
@@ -1158,8 +1098,7 @@ nv04_gr_load_context(struct nv04_gr_chan *chan, int chid)
static
int
static
int
nv04_gr_unload_context
(
struct
nv04_gr_chan
*
chan
)
nv04_gr_unload_context
(
struct
nv04_gr_chan
*
chan
)
{
{
struct
nv04_gr
*
gr
=
nv04_gr
(
chan
);
struct
nvkm_device
*
device
=
chan
->
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
int
i
;
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
nv04_gr_ctx_regs
);
i
++
)
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
nv04_gr_ctx_regs
);
i
++
)
...
@@ -1178,7 +1117,7 @@ nv04_gr_context_switch(struct nv04_gr *gr)
...
@@ -1178,7 +1117,7 @@ nv04_gr_context_switch(struct nv04_gr *gr)
struct
nv04_gr_chan
*
next
=
NULL
;
struct
nv04_gr_chan
*
next
=
NULL
;
int
chid
;
int
chid
;
nv04_gr_idle
(
gr
);
nv04_gr_idle
(
&
gr
->
base
);
/* If previous context is valid, we need to save it */
/* If previous context is valid, we need to save it */
prev
=
nv04_gr_channel
(
gr
);
prev
=
nv04_gr_channel
(
gr
);
...
@@ -1204,59 +1143,24 @@ static u32 *ctx_reg(struct nv04_gr_chan *chan, u32 reg)
...
@@ -1204,59 +1143,24 @@ static u32 *ctx_reg(struct nv04_gr_chan *chan, u32 reg)
return
NULL
;
return
NULL
;
}
}
static
int
static
void
*
nv04_gr_context_ctor
(
struct
nvkm_object
*
parent
,
nv04_gr_chan_dtor
(
struct
nvkm_object
*
object
)
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
{
struct
nvkm_fifo_chan
*
fifo
=
(
void
*
)
parent
;
struct
nv04_gr_chan
*
chan
=
nv04_gr_chan
(
object
);
struct
nv04_gr
*
gr
=
(
void
*
)
engine
;
struct
nv04_gr
*
gr
=
chan
->
gr
;
struct
nv04_gr_chan
*
chan
;
unsigned
long
flags
;
int
ret
;
ret
=
nvkm_object_create
(
parent
,
engine
,
oclass
,
0
,
&
chan
);
*
pobject
=
nv_object
(
chan
);
if
(
ret
)
return
ret
;
spin_lock_irqsave
(
&
gr
->
lock
,
flags
);
if
(
gr
->
chan
[
fifo
->
chid
])
{
*
pobject
=
nv_object
(
gr
->
chan
[
fifo
->
chid
]);
atomic_inc
(
&
(
*
pobject
)
->
refcount
);
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
nvkm_object_destroy
(
&
chan
->
base
);
return
1
;
}
*
ctx_reg
(
chan
,
NV04_PGRAPH_DEBUG_3
)
=
0xfad4ff31
;
gr
->
chan
[
fifo
->
chid
]
=
chan
;
chan
->
chid
=
fifo
->
chid
;
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
return
0
;
}
static
void
nv04_gr_context_dtor
(
struct
nvkm_object
*
object
)
{
struct
nv04_gr
*
gr
=
(
void
*
)
object
->
engine
;
struct
nv04_gr_chan
*
chan
=
(
void
*
)
object
;
unsigned
long
flags
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
gr
->
lock
,
flags
);
spin_lock_irqsave
(
&
gr
->
lock
,
flags
);
gr
->
chan
[
chan
->
chid
]
=
NULL
;
gr
->
chan
[
chan
->
chid
]
=
NULL
;
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
return
chan
;
nvkm_object_destroy
(
&
chan
->
base
);
}
}
static
int
static
int
nv04_gr_c
ontext
_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
nv04_gr_c
han
_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
{
{
struct
nv04_gr
*
gr
=
(
void
*
)
object
->
engine
;
struct
nv04_gr
_chan
*
chan
=
nv04_gr_chan
(
object
)
;
struct
nv04_gr
_chan
*
chan
=
(
void
*
)
object
;
struct
nv04_gr
*
gr
=
chan
->
gr
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
unsigned
long
flags
;
unsigned
long
flags
;
...
@@ -1266,34 +1170,50 @@ nv04_gr_context_fini(struct nvkm_object *object, bool suspend)
...
@@ -1266,34 +1170,50 @@ nv04_gr_context_fini(struct nvkm_object *object, bool suspend)
nv04_gr_unload_context
(
chan
);
nv04_gr_unload_context
(
chan
);
nvkm_mask
(
device
,
NV04_PGRAPH_FIFO
,
0x00000001
,
0x00000001
);
nvkm_mask
(
device
,
NV04_PGRAPH_FIFO
,
0x00000001
,
0x00000001
);
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
return
0
;
return
_nvkm_object_fini
(
&
chan
->
base
,
suspend
);
}
}
static
struct
nvkm_oclass
static
const
struct
nvkm_object_func
nv04_gr_cclass
=
{
nv04_gr_chan
=
{
.
handle
=
NV_ENGCTX
(
GR
,
0x04
),
.
dtor
=
nv04_gr_chan_dtor
,
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
fini
=
nv04_gr_chan_fini
,
.
ctor
=
nv04_gr_context_ctor
,
.
dtor
=
nv04_gr_context_dtor
,
.
init
=
_nvkm_object_init
,
.
fini
=
nv04_gr_context_fini
,
},
};
};
static
int
nv04_gr_chan_new
(
struct
nvkm_gr
*
base
,
struct
nvkm_fifo_chan
*
fifoch
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
{
struct
nv04_gr
*
gr
=
nv04_gr
(
base
);
struct
nv04_gr_chan
*
chan
;
unsigned
long
flags
;
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
return
-
ENOMEM
;
nvkm_object_ctor
(
&
nv04_gr_chan
,
oclass
,
&
chan
->
object
);
chan
->
gr
=
gr
;
chan
->
chid
=
fifoch
->
chid
;
*
pobject
=
&
chan
->
object
;
*
ctx_reg
(
chan
,
NV04_PGRAPH_DEBUG_3
)
=
0xfad4ff31
;
spin_lock_irqsave
(
&
gr
->
lock
,
flags
);
gr
->
chan
[
chan
->
chid
]
=
chan
;
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
return
0
;
}
/*******************************************************************************
/*******************************************************************************
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
bool
bool
nv04_gr_idle
(
void
*
obj
)
nv04_gr_idle
(
struct
nvkm_gr
*
gr
)
{
{
struct
nvkm_gr
*
gr
=
nvkm_gr
(
obj
);
struct
nvkm_subdev
*
subdev
=
&
gr
->
engine
.
subdev
;
struct
nvkm_subdev
*
subdev
=
&
gr
->
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
struct
nvkm_device
*
device
=
subdev
->
device
;
u32
mask
=
0xffffffff
;
u32
mask
=
0xffffffff
;
if
(
nv_device
(
obj
)
->
card_type
==
NV_40
)
if
(
device
->
card_type
==
NV_40
)
mask
&=
~
NV40_PGRAPH_STATUS_SYNC_STALL
;
mask
&=
~
NV40_PGRAPH_STATUS_SYNC_STALL
;
if
(
nvkm_msec
(
device
,
2000
,
if
(
nvkm_msec
(
device
,
2000
,
...
@@ -1395,12 +1315,62 @@ nv04_gr_intr(struct nvkm_subdev *subdev)
...
@@ -1395,12 +1315,62 @@ nv04_gr_intr(struct nvkm_subdev *subdev)
"nstatus %08x [%s] ch %d [%s] subc %d "
"nstatus %08x [%s] ch %d [%s] subc %d "
"class %04x mthd %04x data %08x
\n
"
,
"class %04x mthd %04x data %08x
\n
"
,
show
,
msg
,
nsource
,
src
,
nstatus
,
sta
,
chid
,
show
,
msg
,
nsource
,
src
,
nstatus
,
sta
,
chid
,
nvkm_client_name
(
chan
),
subc
,
class
,
mthd
,
data
);
chan
?
chan
->
object
.
client
->
name
:
"unknown"
,
subc
,
class
,
mthd
,
data
);
}
}
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
}
}
static
const
struct
nvkm_gr_func
nv04_gr
=
{
.
chan_new
=
nv04_gr_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
0x0012
,
&
nv04_gr_object
},
/* beta1 */
{
-
1
,
-
1
,
0x0017
,
&
nv04_gr_object
},
/* chroma */
{
-
1
,
-
1
,
0x0018
,
&
nv04_gr_object
},
/* pattern (nv01) */
{
-
1
,
-
1
,
0x0019
,
&
nv04_gr_object
},
/* clip */
{
-
1
,
-
1
,
0x001c
,
&
nv04_gr_object
},
/* line */
{
-
1
,
-
1
,
0x001d
,
&
nv04_gr_object
},
/* tri */
{
-
1
,
-
1
,
0x001e
,
&
nv04_gr_object
},
/* rect */
{
-
1
,
-
1
,
0x001f
,
&
nv04_gr_object
},
{
-
1
,
-
1
,
0x0021
,
&
nv04_gr_object
},
{
-
1
,
-
1
,
0x0030
,
&
nv04_gr_object
},
/* null */
{
-
1
,
-
1
,
0x0036
,
&
nv04_gr_object
},
{
-
1
,
-
1
,
0x0037
,
&
nv04_gr_object
},
{
-
1
,
-
1
,
0x0038
,
&
nv04_gr_object
},
/* dvd subpicture */
{
-
1
,
-
1
,
0x0039
,
&
nv04_gr_object
},
/* m2mf */
{
-
1
,
-
1
,
0x0042
,
&
nv04_gr_object
},
/* surf2d */
{
-
1
,
-
1
,
0x0043
,
&
nv04_gr_object
},
/* rop */
{
-
1
,
-
1
,
0x0044
,
&
nv04_gr_object
},
/* pattern */
{
-
1
,
-
1
,
0x0048
,
&
nv04_gr_object
},
{
-
1
,
-
1
,
0x004a
,
&
nv04_gr_object
},
{
-
1
,
-
1
,
0x004b
,
&
nv04_gr_object
},
{
-
1
,
-
1
,
0x0052
,
&
nv04_gr_object
},
/* swzsurf */
{
-
1
,
-
1
,
0x0053
,
&
nv04_gr_object
},
{
-
1
,
-
1
,
0x0054
,
&
nv04_gr_object
},
/* ttri */
{
-
1
,
-
1
,
0x0055
,
&
nv04_gr_object
},
/* mtri */
{
-
1
,
-
1
,
0x0057
,
&
nv04_gr_object
},
/* chroma */
{
-
1
,
-
1
,
0x0058
,
&
nv04_gr_object
},
/* surf_dst */
{
-
1
,
-
1
,
0x0059
,
&
nv04_gr_object
},
/* surf_src */
{
-
1
,
-
1
,
0x005a
,
&
nv04_gr_object
},
/* surf_color */
{
-
1
,
-
1
,
0x005b
,
&
nv04_gr_object
},
/* surf_zeta */
{
-
1
,
-
1
,
0x005c
,
&
nv04_gr_object
},
/* line */
{
-
1
,
-
1
,
0x005d
,
&
nv04_gr_object
},
/* tri */
{
-
1
,
-
1
,
0x005e
,
&
nv04_gr_object
},
/* rect */
{
-
1
,
-
1
,
0x005f
,
&
nv04_gr_object
},
{
-
1
,
-
1
,
0x0060
,
&
nv04_gr_object
},
{
-
1
,
-
1
,
0x0061
,
&
nv04_gr_object
},
{
-
1
,
-
1
,
0x0064
,
&
nv04_gr_object
},
/* iifc (nv05) */
{
-
1
,
-
1
,
0x0065
,
&
nv04_gr_object
},
/* ifc (nv05) */
{
-
1
,
-
1
,
0x0066
,
&
nv04_gr_object
},
/* sifc (nv05) */
{
-
1
,
-
1
,
0x0072
,
&
nv04_gr_object
},
/* beta4 */
{
-
1
,
-
1
,
0x0076
,
&
nv04_gr_object
},
{
-
1
,
-
1
,
0x0077
,
&
nv04_gr_object
},
{}
}
};
static
int
static
int
nv04_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv04_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
@@ -1414,10 +1384,9 @@ nv04_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -1414,10 +1384,9 @@ nv04_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
gr
->
base
.
func
=
&
nv04_gr
;
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
intr
=
nv04_gr_intr
;
nv_subdev
(
gr
)
->
intr
=
nv04_gr_intr
;
nv_engine
(
gr
)
->
cclass
=
&
nv04_gr_cclass
;
nv_engine
(
gr
)
->
sclass
=
nv04_gr_sclass
;
spin_lock_init
(
&
gr
->
lock
);
spin_lock_init
(
&
gr
->
lock
);
return
0
;
return
0
;
}
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv10.c
浏览文件 @
27f3d6cf
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
* DEALINGS IN THE SOFTWARE.
*/
*/
#include
<engine/gr.h>
#include
"priv.h"
#include "regs.h"
#include "regs.h"
#include <core/client.h>
#include <core/client.h>
...
@@ -385,14 +385,19 @@ static int nv17_gr_ctx_regs[] = {
...
@@ -385,14 +385,19 @@ static int nv17_gr_ctx_regs[] = {
0x00400a04
,
0x00400a04
,
};
};
#define nv10_gr(p) container_of((p), struct nv10_gr, base)
struct
nv10_gr
{
struct
nv10_gr
{
struct
nvkm_gr
base
;
struct
nvkm_gr
base
;
struct
nv10_gr_chan
*
chan
[
32
];
struct
nv10_gr_chan
*
chan
[
32
];
spinlock_t
lock
;
spinlock_t
lock
;
};
};
#define nv10_gr_chan(p) container_of((p), struct nv10_gr_chan, object)
struct
nv10_gr_chan
{
struct
nv10_gr_chan
{
struct
nvkm_object
base
;
struct
nvkm_object
object
;
struct
nv10_gr
*
gr
;
int
chid
;
int
chid
;
int
nv10
[
ARRAY_SIZE
(
nv10_gr_ctx_regs
)];
int
nv10
[
ARRAY_SIZE
(
nv10_gr_ctx_regs
)];
int
nv17
[
ARRAY_SIZE
(
nv17_gr_ctx_regs
)];
int
nv17
[
ARRAY_SIZE
(
nv17_gr_ctx_regs
)];
...
@@ -401,12 +406,6 @@ struct nv10_gr_chan {
...
@@ -401,12 +406,6 @@ struct nv10_gr_chan {
};
};
static
inline
struct
nv10_gr
*
nv10_gr
(
struct
nv10_gr_chan
*
chan
)
{
return
(
void
*
)
nv_object
(
chan
)
->
engine
;
}
/*******************************************************************************
/*******************************************************************************
* Graphics object classes
* Graphics object classes
******************************************************************************/
******************************************************************************/
...
@@ -427,57 +426,11 @@ nv10_gr(struct nv10_gr_chan *chan)
...
@@ -427,57 +426,11 @@ nv10_gr(struct nv10_gr_chan *chan)
nvkm_wr32(device, NV10_PGRAPH_PIPE_DATA, state[__i]); \
nvkm_wr32(device, NV10_PGRAPH_PIPE_DATA, state[__i]); \
} while (0)
} while (0)
static
struct
nvkm_oclass
nv10_gr_sclass
[]
=
{
{
0x0012
,
&
nv04_gr_ofuncs
},
/* beta1 */
{
0x0019
,
&
nv04_gr_ofuncs
},
/* clip */
{
0x0030
,
&
nv04_gr_ofuncs
},
/* null */
{
0x0039
,
&
nv04_gr_ofuncs
},
/* m2mf */
{
0x0043
,
&
nv04_gr_ofuncs
},
/* rop */
{
0x0044
,
&
nv04_gr_ofuncs
},
/* pattern */
{
0x004a
,
&
nv04_gr_ofuncs
},
/* gdi */
{
0x0052
,
&
nv04_gr_ofuncs
},
/* swzsurf */
{
0x005f
,
&
nv04_gr_ofuncs
},
/* blit */
{
0x0062
,
&
nv04_gr_ofuncs
},
/* surf2d */
{
0x0072
,
&
nv04_gr_ofuncs
},
/* beta4 */
{
0x0089
,
&
nv04_gr_ofuncs
},
/* sifm */
{
0x008a
,
&
nv04_gr_ofuncs
},
/* ifc */
{
0x009f
,
&
nv04_gr_ofuncs
},
/* blit */
{
0x0093
,
&
nv04_gr_ofuncs
},
/* surf3d */
{
0x0094
,
&
nv04_gr_ofuncs
},
/* ttri */
{
0x0095
,
&
nv04_gr_ofuncs
},
/* mtri */
{
0x0056
,
&
nv04_gr_ofuncs
},
/* celcius */
{},
};
static
struct
nvkm_oclass
nv15_gr_sclass
[]
=
{
{
0x0012
,
&
nv04_gr_ofuncs
},
/* beta1 */
{
0x0019
,
&
nv04_gr_ofuncs
},
/* clip */
{
0x0030
,
&
nv04_gr_ofuncs
},
/* null */
{
0x0039
,
&
nv04_gr_ofuncs
},
/* m2mf */
{
0x0043
,
&
nv04_gr_ofuncs
},
/* rop */
{
0x0044
,
&
nv04_gr_ofuncs
},
/* pattern */
{
0x004a
,
&
nv04_gr_ofuncs
},
/* gdi */
{
0x0052
,
&
nv04_gr_ofuncs
},
/* swzsurf */
{
0x005f
,
&
nv04_gr_ofuncs
},
/* blit */
{
0x0062
,
&
nv04_gr_ofuncs
},
/* surf2d */
{
0x0072
,
&
nv04_gr_ofuncs
},
/* beta4 */
{
0x0089
,
&
nv04_gr_ofuncs
},
/* sifm */
{
0x008a
,
&
nv04_gr_ofuncs
},
/* ifc */
{
0x009f
,
&
nv04_gr_ofuncs
},
/* blit */
{
0x0093
,
&
nv04_gr_ofuncs
},
/* surf3d */
{
0x0094
,
&
nv04_gr_ofuncs
},
/* ttri */
{
0x0095
,
&
nv04_gr_ofuncs
},
/* mtri */
{
0x0096
,
&
nv04_gr_ofuncs
},
/* celcius */
{},
};
static
void
static
void
nv17_gr_mthd_lma_window
(
struct
nv10_gr_chan
*
chan
,
u32
mthd
,
u32
data
)
nv17_gr_mthd_lma_window
(
struct
nv10_gr_chan
*
chan
,
u32
mthd
,
u32
data
)
{
{
struct
nvkm_device
*
device
=
chan
->
base
.
engine
->
subdev
.
device
;
struct
nvkm_device
*
device
=
chan
->
object
.
engine
->
subdev
.
device
;
struct
nvkm_gr
*
gr
=
nvkm_gr
(
chan
)
;
struct
nvkm_gr
*
gr
=
&
chan
->
gr
->
base
;
struct
pipe_state
*
pipe
=
&
chan
->
pipe_state
;
struct
pipe_state
*
pipe
=
&
chan
->
pipe_state
;
u32
pipe_0x0040
[
1
],
pipe_0x64c0
[
8
],
pipe_0x6a80
[
3
],
pipe_0x6ab0
[
3
];
u32
pipe_0x0040
[
1
],
pipe_0x64c0
[
8
],
pipe_0x6a80
[
3
],
pipe_0x6ab0
[
3
];
u32
xfmode0
,
xfmode1
;
u32
xfmode0
,
xfmode1
;
...
@@ -549,8 +502,8 @@ nv17_gr_mthd_lma_window(struct nv10_gr_chan *chan, u32 mthd, u32 data)
...
@@ -549,8 +502,8 @@ nv17_gr_mthd_lma_window(struct nv10_gr_chan *chan, u32 mthd, u32 data)
static
void
static
void
nv17_gr_mthd_lma_enable
(
struct
nv10_gr_chan
*
chan
,
u32
mthd
,
u32
data
)
nv17_gr_mthd_lma_enable
(
struct
nv10_gr_chan
*
chan
,
u32
mthd
,
u32
data
)
{
{
struct
nvkm_device
*
device
=
chan
->
base
.
engine
->
subdev
.
device
;
struct
nvkm_device
*
device
=
chan
->
object
.
engine
->
subdev
.
device
;
struct
nvkm_gr
*
gr
=
nvkm_gr
(
chan
)
;
struct
nvkm_gr
*
gr
=
&
chan
->
gr
->
base
;
nv04_gr_idle
(
gr
);
nv04_gr_idle
(
gr
);
...
@@ -585,29 +538,6 @@ nv10_gr_mthd(struct nv10_gr_chan *chan, u8 class, u32 mthd, u32 data)
...
@@ -585,29 +538,6 @@ nv10_gr_mthd(struct nv10_gr_chan *chan, u8 class, u32 mthd, u32 data)
return
func
(
chan
,
mthd
,
data
);
return
func
(
chan
,
mthd
,
data
);
}
}
static
struct
nvkm_oclass
nv17_gr_sclass
[]
=
{
{
0x0012
,
&
nv04_gr_ofuncs
},
/* beta1 */
{
0x0019
,
&
nv04_gr_ofuncs
},
/* clip */
{
0x0030
,
&
nv04_gr_ofuncs
},
/* null */
{
0x0039
,
&
nv04_gr_ofuncs
},
/* m2mf */
{
0x0043
,
&
nv04_gr_ofuncs
},
/* rop */
{
0x0044
,
&
nv04_gr_ofuncs
},
/* pattern */
{
0x004a
,
&
nv04_gr_ofuncs
},
/* gdi */
{
0x0052
,
&
nv04_gr_ofuncs
},
/* swzsurf */
{
0x005f
,
&
nv04_gr_ofuncs
},
/* blit */
{
0x0062
,
&
nv04_gr_ofuncs
},
/* surf2d */
{
0x0072
,
&
nv04_gr_ofuncs
},
/* beta4 */
{
0x0089
,
&
nv04_gr_ofuncs
},
/* sifm */
{
0x008a
,
&
nv04_gr_ofuncs
},
/* ifc */
{
0x009f
,
&
nv04_gr_ofuncs
},
/* blit */
{
0x0093
,
&
nv04_gr_ofuncs
},
/* surf3d */
{
0x0094
,
&
nv04_gr_ofuncs
},
/* ttri */
{
0x0095
,
&
nv04_gr_ofuncs
},
/* mtri */
{
0x0099
,
&
nv04_gr_ofuncs
},
{},
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH context
* PGRAPH context
******************************************************************************/
******************************************************************************/
...
@@ -628,7 +558,7 @@ nv10_gr_channel(struct nv10_gr *gr)
...
@@ -628,7 +558,7 @@ nv10_gr_channel(struct nv10_gr *gr)
static
void
static
void
nv10_gr_save_pipe
(
struct
nv10_gr_chan
*
chan
)
nv10_gr_save_pipe
(
struct
nv10_gr_chan
*
chan
)
{
{
struct
nv10_gr
*
gr
=
nv10_gr
(
chan
)
;
struct
nv10_gr
*
gr
=
chan
->
gr
;
struct
pipe_state
*
pipe
=
&
chan
->
pipe_state
;
struct
pipe_state
*
pipe
=
&
chan
->
pipe_state
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
...
@@ -647,13 +577,13 @@ nv10_gr_save_pipe(struct nv10_gr_chan *chan)
...
@@ -647,13 +577,13 @@ nv10_gr_save_pipe(struct nv10_gr_chan *chan)
static
void
static
void
nv10_gr_load_pipe
(
struct
nv10_gr_chan
*
chan
)
nv10_gr_load_pipe
(
struct
nv10_gr_chan
*
chan
)
{
{
struct
nv10_gr
*
gr
=
nv10_gr
(
chan
)
;
struct
nv10_gr
*
gr
=
chan
->
gr
;
struct
pipe_state
*
pipe
=
&
chan
->
pipe_state
;
struct
pipe_state
*
pipe
=
&
chan
->
pipe_state
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
u32
xfmode0
,
xfmode1
;
u32
xfmode0
,
xfmode1
;
int
i
;
int
i
;
nv04_gr_idle
(
gr
);
nv04_gr_idle
(
&
gr
->
base
);
/* XXX check haiku comments */
/* XXX check haiku comments */
xfmode0
=
nvkm_rd32
(
device
,
NV10_PGRAPH_XFMODE0
);
xfmode0
=
nvkm_rd32
(
device
,
NV10_PGRAPH_XFMODE0
);
xfmode1
=
nvkm_rd32
(
device
,
NV10_PGRAPH_XFMODE1
);
xfmode1
=
nvkm_rd32
(
device
,
NV10_PGRAPH_XFMODE1
);
...
@@ -678,7 +608,7 @@ nv10_gr_load_pipe(struct nv10_gr_chan *chan)
...
@@ -678,7 +608,7 @@ nv10_gr_load_pipe(struct nv10_gr_chan *chan)
PIPE_RESTORE
(
gr
,
pipe
->
pipe_0x0200
,
0x0200
);
PIPE_RESTORE
(
gr
,
pipe
->
pipe_0x0200
,
0x0200
);
nv04_gr_idle
(
gr
);
nv04_gr_idle
(
&
gr
->
base
);
/* restore XFMODE */
/* restore XFMODE */
nvkm_wr32
(
device
,
NV10_PGRAPH_XFMODE0
,
xfmode0
);
nvkm_wr32
(
device
,
NV10_PGRAPH_XFMODE0
,
xfmode0
);
...
@@ -692,13 +622,13 @@ nv10_gr_load_pipe(struct nv10_gr_chan *chan)
...
@@ -692,13 +622,13 @@ nv10_gr_load_pipe(struct nv10_gr_chan *chan)
PIPE_RESTORE
(
gr
,
pipe
->
pipe_0x4400
,
0x4400
);
PIPE_RESTORE
(
gr
,
pipe
->
pipe_0x4400
,
0x4400
);
PIPE_RESTORE
(
gr
,
pipe
->
pipe_0x0000
,
0x0000
);
PIPE_RESTORE
(
gr
,
pipe
->
pipe_0x0000
,
0x0000
);
PIPE_RESTORE
(
gr
,
pipe
->
pipe_0x0040
,
0x0040
);
PIPE_RESTORE
(
gr
,
pipe
->
pipe_0x0040
,
0x0040
);
nv04_gr_idle
(
gr
);
nv04_gr_idle
(
&
gr
->
base
);
}
}
static
void
static
void
nv10_gr_create_pipe
(
struct
nv10_gr_chan
*
chan
)
nv10_gr_create_pipe
(
struct
nv10_gr_chan
*
chan
)
{
{
struct
nv10_gr
*
gr
=
nv10_gr
(
chan
)
;
struct
nv10_gr
*
gr
=
chan
->
gr
;
struct
nvkm_subdev
*
subdev
=
&
gr
->
base
.
engine
.
subdev
;
struct
nvkm_subdev
*
subdev
=
&
gr
->
base
.
engine
.
subdev
;
struct
pipe_state
*
pipe_state
=
&
chan
->
pipe_state
;
struct
pipe_state
*
pipe_state
=
&
chan
->
pipe_state
;
u32
*
pipe_state_addr
;
u32
*
pipe_state_addr
;
...
@@ -880,7 +810,7 @@ nv17_gr_ctx_regs_find_offset(struct nv10_gr *gr, int reg)
...
@@ -880,7 +810,7 @@ nv17_gr_ctx_regs_find_offset(struct nv10_gr *gr, int reg)
static
void
static
void
nv10_gr_load_dma_vtxbuf
(
struct
nv10_gr_chan
*
chan
,
int
chid
,
u32
inst
)
nv10_gr_load_dma_vtxbuf
(
struct
nv10_gr_chan
*
chan
,
int
chid
,
u32
inst
)
{
{
struct
nv10_gr
*
gr
=
nv10_gr
(
chan
)
;
struct
nv10_gr
*
gr
=
chan
->
gr
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
u32
st2
,
st2_dl
,
st2_dh
,
fifo_ptr
,
fifo
[
0x60
/
4
];
u32
st2
,
st2_dl
,
st2_dh
,
fifo_ptr
,
fifo
[
0x60
/
4
];
u32
ctx_user
,
ctx_switch
[
5
];
u32
ctx_user
,
ctx_switch
[
5
];
...
@@ -951,7 +881,7 @@ nv10_gr_load_dma_vtxbuf(struct nv10_gr_chan *chan, int chid, u32 inst)
...
@@ -951,7 +881,7 @@ nv10_gr_load_dma_vtxbuf(struct nv10_gr_chan *chan, int chid, u32 inst)
static
int
static
int
nv10_gr_load_context
(
struct
nv10_gr_chan
*
chan
,
int
chid
)
nv10_gr_load_context
(
struct
nv10_gr_chan
*
chan
,
int
chid
)
{
{
struct
nv10_gr
*
gr
=
nv10_gr
(
chan
)
;
struct
nv10_gr
*
gr
=
chan
->
gr
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
u32
inst
;
u32
inst
;
int
i
;
int
i
;
...
@@ -979,7 +909,7 @@ nv10_gr_load_context(struct nv10_gr_chan *chan, int chid)
...
@@ -979,7 +909,7 @@ nv10_gr_load_context(struct nv10_gr_chan *chan, int chid)
static
int
static
int
nv10_gr_unload_context
(
struct
nv10_gr_chan
*
chan
)
nv10_gr_unload_context
(
struct
nv10_gr_chan
*
chan
)
{
{
struct
nv10_gr
*
gr
=
nv10_gr
(
chan
)
;
struct
nv10_gr
*
gr
=
chan
->
gr
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
int
i
;
int
i
;
...
@@ -1007,7 +937,7 @@ nv10_gr_context_switch(struct nv10_gr *gr)
...
@@ -1007,7 +937,7 @@ nv10_gr_context_switch(struct nv10_gr *gr)
struct
nv10_gr_chan
*
next
=
NULL
;
struct
nv10_gr_chan
*
next
=
NULL
;
int
chid
;
int
chid
;
nv04_gr_idle
(
gr
);
nv04_gr_idle
(
&
gr
->
base
);
/* If previous context is valid, we need to save it */
/* If previous context is valid, we need to save it */
prev
=
nv10_gr_channel
(
gr
);
prev
=
nv10_gr_channel
(
gr
);
...
@@ -1021,6 +951,42 @@ nv10_gr_context_switch(struct nv10_gr *gr)
...
@@ -1021,6 +951,42 @@ nv10_gr_context_switch(struct nv10_gr *gr)
nv10_gr_load_context
(
next
,
chid
);
nv10_gr_load_context
(
next
,
chid
);
}
}
static
int
nv10_gr_chan_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
{
struct
nv10_gr_chan
*
chan
=
nv10_gr_chan
(
object
);
struct
nv10_gr
*
gr
=
chan
->
gr
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
gr
->
lock
,
flags
);
nvkm_mask
(
device
,
NV04_PGRAPH_FIFO
,
0x00000001
,
0x00000000
);
if
(
nv10_gr_channel
(
gr
)
==
chan
)
nv10_gr_unload_context
(
chan
);
nvkm_mask
(
device
,
NV04_PGRAPH_FIFO
,
0x00000001
,
0x00000001
);
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
return
0
;
}
static
void
*
nv10_gr_chan_dtor
(
struct
nvkm_object
*
object
)
{
struct
nv10_gr_chan
*
chan
=
nv10_gr_chan
(
object
);
struct
nv10_gr
*
gr
=
chan
->
gr
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
gr
->
lock
,
flags
);
gr
->
chan
[
chan
->
chid
]
=
NULL
;
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
return
chan
;
}
static
const
struct
nvkm_object_func
nv10_gr_chan
=
{
.
dtor
=
nv10_gr_chan_dtor
,
.
fini
=
nv10_gr_chan_fini
,
};
#define NV_WRITE_CTX(reg, val) do { \
#define NV_WRITE_CTX(reg, val) do { \
int offset = nv10_gr_ctx_regs_find_offset(gr, reg); \
int offset = nv10_gr_ctx_regs_find_offset(gr, reg); \
if (offset > 0) \
if (offset > 0) \
...
@@ -1034,30 +1000,20 @@ nv10_gr_context_switch(struct nv10_gr *gr)
...
@@ -1034,30 +1000,20 @@ nv10_gr_context_switch(struct nv10_gr *gr)
} while (0)
} while (0)
static
int
static
int
nv10_gr_context_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv10_gr_chan_new
(
struct
nvkm_gr
*
base
,
struct
nvkm_fifo_chan
*
fifoch
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
struct
nvkm_object
**
pobject
)
{
{
struct
nvkm_fifo_chan
*
fifo
=
(
void
*
)
parent
;
struct
nv10_gr
*
gr
=
nv10_gr
(
base
);
struct
nv10_gr
*
gr
=
(
void
*
)
engine
;
struct
nv10_gr_chan
*
chan
;
struct
nv10_gr_chan
*
chan
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
unsigned
long
flags
;
unsigned
long
flags
;
int
ret
;
ret
=
nvkm_object_create
(
parent
,
engine
,
oclass
,
0
,
&
chan
);
*
pobject
=
nv_object
(
chan
);
if
(
ret
)
return
ret
;
spin_lock_irqsave
(
&
gr
->
lock
,
flags
);
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
if
(
gr
->
chan
[
fifo
->
chid
])
{
return
-
ENOMEM
;
*
pobject
=
nv_object
(
gr
->
chan
[
fifo
->
chid
]);
nvkm_object_ctor
(
&
nv10_gr_chan
,
oclass
,
&
chan
->
object
);
atomic_inc
(
&
(
*
pobject
)
->
refcount
);
chan
->
gr
=
gr
;
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
chan
->
chid
=
fifoch
->
chid
;
nvkm_object_destroy
(
&
chan
->
base
);
*
pobject
=
&
chan
->
object
;
return
1
;
}
NV_WRITE_CTX
(
0x00400e88
,
0x08000000
);
NV_WRITE_CTX
(
0x00400e88
,
0x08000000
);
NV_WRITE_CTX
(
0x00400e9c
,
0x4b7fffff
);
NV_WRITE_CTX
(
0x00400e9c
,
0x4b7fffff
);
...
@@ -1066,8 +1022,7 @@ nv10_gr_context_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -1066,8 +1022,7 @@ nv10_gr_context_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
NV_WRITE_CTX
(
0x00400e14
,
0x00001000
);
NV_WRITE_CTX
(
0x00400e14
,
0x00001000
);
NV_WRITE_CTX
(
0x00400e30
,
0x00080008
);
NV_WRITE_CTX
(
0x00400e30
,
0x00080008
);
NV_WRITE_CTX
(
0x00400e34
,
0x00080008
);
NV_WRITE_CTX
(
0x00400e34
,
0x00080008
);
if
(
nv_device
(
gr
)
->
card_type
>=
NV_11
&&
if
(
device
->
card_type
>=
NV_11
&&
device
->
chipset
>=
0x17
)
{
nv_device
(
gr
)
->
chipset
>=
0x17
)
{
/* is it really needed ??? */
/* is it really needed ??? */
NV17_WRITE_CTX
(
NV10_PGRAPH_DEBUG_4
,
NV17_WRITE_CTX
(
NV10_PGRAPH_DEBUG_4
,
nvkm_rd32
(
device
,
NV10_PGRAPH_DEBUG_4
));
nvkm_rd32
(
device
,
NV10_PGRAPH_DEBUG_4
));
...
@@ -1081,55 +1036,12 @@ nv10_gr_context_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -1081,55 +1036,12 @@ nv10_gr_context_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
nv10_gr_create_pipe
(
chan
);
nv10_gr_create_pipe
(
chan
);
gr
->
chan
[
fifo
->
chid
]
=
chan
;
chan
->
chid
=
fifo
->
chid
;
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
return
0
;
}
static
void
nv10_gr_context_dtor
(
struct
nvkm_object
*
object
)
{
struct
nv10_gr
*
gr
=
(
void
*
)
object
->
engine
;
struct
nv10_gr_chan
*
chan
=
(
void
*
)
object
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
gr
->
lock
,
flags
);
gr
->
chan
[
chan
->
chid
]
=
NULL
;
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
nvkm_object_destroy
(
&
chan
->
base
);
}
static
int
nv10_gr_context_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
{
struct
nv10_gr
*
gr
=
(
void
*
)
object
->
engine
;
struct
nv10_gr_chan
*
chan
=
(
void
*
)
object
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
gr
->
lock
,
flags
);
spin_lock_irqsave
(
&
gr
->
lock
,
flags
);
nvkm_mask
(
device
,
NV04_PGRAPH_FIFO
,
0x00000001
,
0x00000000
);
gr
->
chan
[
chan
->
chid
]
=
chan
;
if
(
nv10_gr_channel
(
gr
)
==
chan
)
nv10_gr_unload_context
(
chan
);
nvkm_mask
(
device
,
NV04_PGRAPH_FIFO
,
0x00000001
,
0x00000001
);
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
return
0
;
return
_nvkm_object_fini
(
&
chan
->
base
,
suspend
);
}
}
static
struct
nvkm_oclass
nv10_gr_cclass
=
{
.
handle
=
NV_ENGCTX
(
GR
,
0x10
),
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
nv10_gr_context_ctor
,
.
dtor
=
nv10_gr_context_dtor
,
.
init
=
_nvkm_object_init
,
.
fini
=
nv10_gr_context_fini
,
},
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
...
@@ -1144,7 +1056,7 @@ nv10_gr_tile_prog(struct nvkm_engine *engine, int i)
...
@@ -1144,7 +1056,7 @@ nv10_gr_tile_prog(struct nvkm_engine *engine, int i)
unsigned
long
flags
;
unsigned
long
flags
;
fifo
->
pause
(
fifo
,
&
flags
);
fifo
->
pause
(
fifo
,
&
flags
);
nv04_gr_idle
(
gr
);
nv04_gr_idle
(
&
gr
->
base
);
nvkm_wr32
(
device
,
NV10_PGRAPH_TLIMIT
(
i
),
tile
->
limit
);
nvkm_wr32
(
device
,
NV10_PGRAPH_TLIMIT
(
i
),
tile
->
limit
);
nvkm_wr32
(
device
,
NV10_PGRAPH_TSIZE
(
i
),
tile
->
pitch
);
nvkm_wr32
(
device
,
NV10_PGRAPH_TSIZE
(
i
),
tile
->
pitch
);
...
@@ -1214,12 +1126,92 @@ nv10_gr_intr(struct nvkm_subdev *subdev)
...
@@ -1214,12 +1126,92 @@ nv10_gr_intr(struct nvkm_subdev *subdev)
"nstatus %08x [%s] ch %d [%s] subc %d "
"nstatus %08x [%s] ch %d [%s] subc %d "
"class %04x mthd %04x data %08x
\n
"
,
"class %04x mthd %04x data %08x
\n
"
,
show
,
msg
,
nsource
,
src
,
nstatus
,
sta
,
chid
,
show
,
msg
,
nsource
,
src
,
nstatus
,
sta
,
chid
,
nvkm_client_name
(
chan
),
subc
,
class
,
mthd
,
data
);
chan
?
chan
->
object
.
client
->
name
:
"unknown"
,
subc
,
class
,
mthd
,
data
);
}
}
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
gr
->
lock
,
flags
);
}
}
static
const
struct
nvkm_gr_func
nv10_gr
=
{
.
chan_new
=
nv10_gr_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
0x0012
,
&
nv04_gr_object
},
/* beta1 */
{
-
1
,
-
1
,
0x0019
,
&
nv04_gr_object
},
/* clip */
{
-
1
,
-
1
,
0x0030
,
&
nv04_gr_object
},
/* null */
{
-
1
,
-
1
,
0x0039
,
&
nv04_gr_object
},
/* m2mf */
{
-
1
,
-
1
,
0x0043
,
&
nv04_gr_object
},
/* rop */
{
-
1
,
-
1
,
0x0044
,
&
nv04_gr_object
},
/* pattern */
{
-
1
,
-
1
,
0x004a
,
&
nv04_gr_object
},
/* gdi */
{
-
1
,
-
1
,
0x0052
,
&
nv04_gr_object
},
/* swzsurf */
{
-
1
,
-
1
,
0x005f
,
&
nv04_gr_object
},
/* blit */
{
-
1
,
-
1
,
0x0062
,
&
nv04_gr_object
},
/* surf2d */
{
-
1
,
-
1
,
0x0072
,
&
nv04_gr_object
},
/* beta4 */
{
-
1
,
-
1
,
0x0089
,
&
nv04_gr_object
},
/* sifm */
{
-
1
,
-
1
,
0x008a
,
&
nv04_gr_object
},
/* ifc */
{
-
1
,
-
1
,
0x009f
,
&
nv04_gr_object
},
/* blit */
{
-
1
,
-
1
,
0x0093
,
&
nv04_gr_object
},
/* surf3d */
{
-
1
,
-
1
,
0x0094
,
&
nv04_gr_object
},
/* ttri */
{
-
1
,
-
1
,
0x0095
,
&
nv04_gr_object
},
/* mtri */
{
-
1
,
-
1
,
0x0056
,
&
nv04_gr_object
},
/* celcius */
{}
}
};
static
const
struct
nvkm_gr_func
nv15_gr
=
{
.
chan_new
=
nv10_gr_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
0x0012
,
&
nv04_gr_object
},
/* beta1 */
{
-
1
,
-
1
,
0x0019
,
&
nv04_gr_object
},
/* clip */
{
-
1
,
-
1
,
0x0030
,
&
nv04_gr_object
},
/* null */
{
-
1
,
-
1
,
0x0039
,
&
nv04_gr_object
},
/* m2mf */
{
-
1
,
-
1
,
0x0043
,
&
nv04_gr_object
},
/* rop */
{
-
1
,
-
1
,
0x0044
,
&
nv04_gr_object
},
/* pattern */
{
-
1
,
-
1
,
0x004a
,
&
nv04_gr_object
},
/* gdi */
{
-
1
,
-
1
,
0x0052
,
&
nv04_gr_object
},
/* swzsurf */
{
-
1
,
-
1
,
0x005f
,
&
nv04_gr_object
},
/* blit */
{
-
1
,
-
1
,
0x0062
,
&
nv04_gr_object
},
/* surf2d */
{
-
1
,
-
1
,
0x0072
,
&
nv04_gr_object
},
/* beta4 */
{
-
1
,
-
1
,
0x0089
,
&
nv04_gr_object
},
/* sifm */
{
-
1
,
-
1
,
0x008a
,
&
nv04_gr_object
},
/* ifc */
{
-
1
,
-
1
,
0x009f
,
&
nv04_gr_object
},
/* blit */
{
-
1
,
-
1
,
0x0093
,
&
nv04_gr_object
},
/* surf3d */
{
-
1
,
-
1
,
0x0094
,
&
nv04_gr_object
},
/* ttri */
{
-
1
,
-
1
,
0x0095
,
&
nv04_gr_object
},
/* mtri */
{
-
1
,
-
1
,
0x0096
,
&
nv04_gr_object
},
/* celcius */
{}
}
};
static
const
struct
nvkm_gr_func
nv17_gr
=
{
.
chan_new
=
nv10_gr_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
0x0012
,
&
nv04_gr_object
},
/* beta1 */
{
-
1
,
-
1
,
0x0019
,
&
nv04_gr_object
},
/* clip */
{
-
1
,
-
1
,
0x0030
,
&
nv04_gr_object
},
/* null */
{
-
1
,
-
1
,
0x0039
,
&
nv04_gr_object
},
/* m2mf */
{
-
1
,
-
1
,
0x0043
,
&
nv04_gr_object
},
/* rop */
{
-
1
,
-
1
,
0x0044
,
&
nv04_gr_object
},
/* pattern */
{
-
1
,
-
1
,
0x004a
,
&
nv04_gr_object
},
/* gdi */
{
-
1
,
-
1
,
0x0052
,
&
nv04_gr_object
},
/* swzsurf */
{
-
1
,
-
1
,
0x005f
,
&
nv04_gr_object
},
/* blit */
{
-
1
,
-
1
,
0x0062
,
&
nv04_gr_object
},
/* surf2d */
{
-
1
,
-
1
,
0x0072
,
&
nv04_gr_object
},
/* beta4 */
{
-
1
,
-
1
,
0x0089
,
&
nv04_gr_object
},
/* sifm */
{
-
1
,
-
1
,
0x008a
,
&
nv04_gr_object
},
/* ifc */
{
-
1
,
-
1
,
0x009f
,
&
nv04_gr_object
},
/* blit */
{
-
1
,
-
1
,
0x0093
,
&
nv04_gr_object
},
/* surf3d */
{
-
1
,
-
1
,
0x0094
,
&
nv04_gr_object
},
/* ttri */
{
-
1
,
-
1
,
0x0095
,
&
nv04_gr_object
},
/* mtri */
{
-
1
,
-
1
,
0x0099
,
&
nv04_gr_object
},
{}
}
};
static
int
static
int
nv10_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv10_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
@@ -1235,16 +1227,15 @@ nv10_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -1235,16 +1227,15 @@ nv10_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
intr
=
nv10_gr_intr
;
nv_subdev
(
gr
)
->
intr
=
nv10_gr_intr
;
nv_engine
(
gr
)
->
cclass
=
&
nv10_gr_cclass
;
if
(
nv_device
(
gr
)
->
chipset
<=
0x10
)
if
(
nv_device
(
gr
)
->
chipset
<=
0x10
)
nv_engine
(
gr
)
->
sclass
=
nv10_gr_sclass
;
gr
->
base
.
func
=
&
nv10_gr
;
else
else
if
(
nv_device
(
gr
)
->
chipset
<
0x17
||
if
(
nv_device
(
gr
)
->
chipset
<
0x17
||
nv_device
(
gr
)
->
card_type
<
NV_11
)
nv_device
(
gr
)
->
card_type
<
NV_11
)
nv_engine
(
gr
)
->
sclass
=
nv15_gr_sclass
;
gr
->
base
.
func
=
&
nv15_gr
;
else
else
nv_engine
(
gr
)
->
sclass
=
nv17_gr_sclass
;
gr
->
base
.
func
=
&
nv17_gr
;
nv_engine
(
gr
)
->
tile_prog
=
nv10_gr_tile_prog
;
nv_engine
(
gr
)
->
tile_prog
=
nv10_gr_tile_prog
;
spin_lock_init
(
&
gr
->
lock
);
spin_lock_init
(
&
gr
->
lock
);
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.c
浏览文件 @
27f3d6cf
...
@@ -7,131 +7,37 @@
...
@@ -7,131 +7,37 @@
#include <subdev/fb.h>
#include <subdev/fb.h>
#include <subdev/timer.h>
#include <subdev/timer.h>
/*******************************************************************************
* Graphics object classes
******************************************************************************/
static
struct
nvkm_oclass
nv20_gr_sclass
[]
=
{
{
0x0012
,
&
nv04_gr_ofuncs
,
NULL
},
/* beta1 */
{
0x0019
,
&
nv04_gr_ofuncs
,
NULL
},
/* clip */
{
0x0030
,
&
nv04_gr_ofuncs
,
NULL
},
/* null */
{
0x0039
,
&
nv04_gr_ofuncs
,
NULL
},
/* m2mf */
{
0x0043
,
&
nv04_gr_ofuncs
,
NULL
},
/* rop */
{
0x0044
,
&
nv04_gr_ofuncs
,
NULL
},
/* patt */
{
0x004a
,
&
nv04_gr_ofuncs
,
NULL
},
/* gdi */
{
0x0062
,
&
nv04_gr_ofuncs
,
NULL
},
/* surf2d */
{
0x0072
,
&
nv04_gr_ofuncs
,
NULL
},
/* beta4 */
{
0x0089
,
&
nv04_gr_ofuncs
,
NULL
},
/* sifm */
{
0x008a
,
&
nv04_gr_ofuncs
,
NULL
},
/* ifc */
{
0x0096
,
&
nv04_gr_ofuncs
,
NULL
},
/* celcius */
{
0x0097
,
&
nv04_gr_ofuncs
,
NULL
},
/* kelvin */
{
0x009e
,
&
nv04_gr_ofuncs
,
NULL
},
/* swzsurf */
{
0x009f
,
&
nv04_gr_ofuncs
,
NULL
},
/* imageblit */
{},
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH context
* PGRAPH context
******************************************************************************/
******************************************************************************/
static
int
nv20_gr_context_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
struct
nv20_gr_chan
*
chan
;
struct
nvkm_gpuobj
*
image
;
int
ret
,
i
;
ret
=
nvkm_gr_context_create
(
parent
,
engine
,
oclass
,
NULL
,
0x37f0
,
16
,
NVOBJ_FLAG_ZERO_ALLOC
,
&
chan
);
*
pobject
=
nv_object
(
chan
);
if
(
ret
)
return
ret
;
chan
->
chid
=
nvkm_fifo_chan
(
parent
)
->
chid
;
image
=
&
chan
->
base
.
base
.
gpuobj
;
nvkm_kmap
(
image
);
nvkm_wo32
(
image
,
0x0000
,
0x00000001
|
(
chan
->
chid
<<
24
));
nvkm_wo32
(
image
,
0x033c
,
0xffff0000
);
nvkm_wo32
(
image
,
0x03a0
,
0x0fff0000
);
nvkm_wo32
(
image
,
0x03a4
,
0x0fff0000
);
nvkm_wo32
(
image
,
0x047c
,
0x00000101
);
nvkm_wo32
(
image
,
0x0490
,
0x00000111
);
nvkm_wo32
(
image
,
0x04a8
,
0x44400000
);
for
(
i
=
0x04d4
;
i
<=
0x04e0
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00030303
);
for
(
i
=
0x04f4
;
i
<=
0x0500
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00080000
);
for
(
i
=
0x050c
;
i
<=
0x0518
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x01012000
);
for
(
i
=
0x051c
;
i
<=
0x0528
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x000105b8
);
for
(
i
=
0x052c
;
i
<=
0x0538
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00080008
);
for
(
i
=
0x055c
;
i
<=
0x0598
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x07ff0000
);
nvkm_wo32
(
image
,
0x05a4
,
0x4b7fffff
);
nvkm_wo32
(
image
,
0x05fc
,
0x00000001
);
nvkm_wo32
(
image
,
0x0604
,
0x00004000
);
nvkm_wo32
(
image
,
0x0610
,
0x00000001
);
nvkm_wo32
(
image
,
0x0618
,
0x00040000
);
nvkm_wo32
(
image
,
0x061c
,
0x00010000
);
for
(
i
=
0x1c1c
;
i
<=
0x248c
;
i
+=
16
)
{
nvkm_wo32
(
image
,
(
i
+
0
),
0x10700ff9
);
nvkm_wo32
(
image
,
(
i
+
4
),
0x0436086c
);
nvkm_wo32
(
image
,
(
i
+
8
),
0x000c001b
);
}
nvkm_wo32
(
image
,
0x281c
,
0x3f800000
);
nvkm_wo32
(
image
,
0x2830
,
0x3f800000
);
nvkm_wo32
(
image
,
0x285c
,
0x40000000
);
nvkm_wo32
(
image
,
0x2860
,
0x3f800000
);
nvkm_wo32
(
image
,
0x2864
,
0x3f000000
);
nvkm_wo32
(
image
,
0x286c
,
0x40000000
);
nvkm_wo32
(
image
,
0x2870
,
0x3f800000
);
nvkm_wo32
(
image
,
0x2878
,
0xbf800000
);
nvkm_wo32
(
image
,
0x2880
,
0xbf800000
);
nvkm_wo32
(
image
,
0x34a4
,
0x000fe000
);
nvkm_wo32
(
image
,
0x3530
,
0x000003f8
);
nvkm_wo32
(
image
,
0x3540
,
0x002fe000
);
for
(
i
=
0x355c
;
i
<=
0x3578
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x001c527c
);
nvkm_done
(
image
);
return
0
;
}
int
int
nv20_gr_c
ontext
_init
(
struct
nvkm_object
*
object
)
nv20_gr_c
han
_init
(
struct
nvkm_object
*
object
)
{
{
struct
nv20_gr
*
gr
=
(
void
*
)
object
->
engine
;
struct
nv20_gr_chan
*
chan
=
nv20_gr_chan
(
object
);
struct
nv20_gr_chan
*
chan
=
(
void
*
)
object
;
struct
nv20_gr
*
gr
=
chan
->
gr
;
int
ret
;
u32
inst
=
nvkm_memory_addr
(
chan
->
inst
);
ret
=
nvkm_gr_context_init
(
&
chan
->
base
);
if
(
ret
)
return
ret
;
nvkm_kmap
(
gr
->
ctxtab
);
nvkm_kmap
(
gr
->
ctxtab
);
nvkm_wo32
(
gr
->
ctxtab
,
chan
->
chid
*
4
,
nv_gpuobj
(
chan
)
->
addr
>>
4
);
nvkm_wo32
(
gr
->
ctxtab
,
chan
->
chid
*
4
,
inst
>>
4
);
nvkm_done
(
gr
->
ctxtab
);
nvkm_done
(
gr
->
ctxtab
);
return
0
;
return
0
;
}
}
int
int
nv20_gr_c
ontext
_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
nv20_gr_c
han
_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
{
{
struct
nv20_gr
*
gr
=
(
void
*
)
object
->
engine
;
struct
nv20_gr
_chan
*
chan
=
nv20_gr_chan
(
object
)
;
struct
nv20_gr
_chan
*
chan
=
(
void
*
)
object
;
struct
nv20_gr
*
gr
=
chan
->
gr
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
u32
inst
=
nvkm_memory_addr
(
chan
->
inst
);
int
chid
=
-
1
;
int
chid
=
-
1
;
nvkm_mask
(
device
,
0x400720
,
0x00000001
,
0x00000000
);
nvkm_mask
(
device
,
0x400720
,
0x00000001
,
0x00000000
);
if
(
nvkm_rd32
(
device
,
0x400144
)
&
0x00010000
)
if
(
nvkm_rd32
(
device
,
0x400144
)
&
0x00010000
)
chid
=
(
nvkm_rd32
(
device
,
0x400148
)
&
0x1f000000
)
>>
24
;
chid
=
(
nvkm_rd32
(
device
,
0x400148
)
&
0x1f000000
)
>>
24
;
if
(
chan
->
chid
==
chid
)
{
if
(
chan
->
chid
==
chid
)
{
nvkm_wr32
(
device
,
0x400784
,
nv_gpuobj
(
chan
)
->
addr
>>
4
);
nvkm_wr32
(
device
,
0x400784
,
inst
>>
4
);
nvkm_wr32
(
device
,
0x400788
,
0x00000002
);
nvkm_wr32
(
device
,
0x400788
,
0x00000002
);
nvkm_msec
(
device
,
2000
,
nvkm_msec
(
device
,
2000
,
if
(
!
nvkm_rd32
(
device
,
0x400700
))
if
(
!
nvkm_rd32
(
device
,
0x400700
))
...
@@ -145,23 +51,94 @@ nv20_gr_context_fini(struct nvkm_object *object, bool suspend)
...
@@ -145,23 +51,94 @@ nv20_gr_context_fini(struct nvkm_object *object, bool suspend)
nvkm_kmap
(
gr
->
ctxtab
);
nvkm_kmap
(
gr
->
ctxtab
);
nvkm_wo32
(
gr
->
ctxtab
,
chan
->
chid
*
4
,
0x00000000
);
nvkm_wo32
(
gr
->
ctxtab
,
chan
->
chid
*
4
,
0x00000000
);
nvkm_done
(
gr
->
ctxtab
);
nvkm_done
(
gr
->
ctxtab
);
return
0
;
}
return
nvkm_gr_context_fini
(
&
chan
->
base
,
suspend
);
void
*
nv20_gr_chan_dtor
(
struct
nvkm_object
*
object
)
{
struct
nv20_gr_chan
*
chan
=
nv20_gr_chan
(
object
);
nvkm_memory_del
(
&
chan
->
inst
);
return
chan
;
}
}
static
struct
nvkm_oclass
static
const
struct
nvkm_object_func
nv20_gr_cclass
=
{
nv20_gr_chan
=
{
.
handle
=
NV_ENGCTX
(
GR
,
0x20
),
.
dtor
=
nv20_gr_chan_dtor
,
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
init
=
nv20_gr_chan_init
,
.
ctor
=
nv20_gr_context_ctor
,
.
fini
=
nv20_gr_chan_fini
,
.
dtor
=
_nvkm_gr_context_dtor
,
.
init
=
nv20_gr_context_init
,
.
fini
=
nv20_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
};
};
static
int
nv20_gr_chan_new
(
struct
nvkm_gr
*
base
,
struct
nvkm_fifo_chan
*
fifoch
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
{
struct
nv20_gr
*
gr
=
nv20_gr
(
base
);
struct
nv20_gr_chan
*
chan
;
int
ret
,
i
;
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
return
-
ENOMEM
;
nvkm_object_ctor
(
&
nv20_gr_chan
,
oclass
,
&
chan
->
object
);
chan
->
gr
=
gr
;
chan
->
chid
=
fifoch
->
chid
;
*
pobject
=
&
chan
->
object
;
ret
=
nvkm_memory_new
(
gr
->
base
.
engine
.
subdev
.
device
,
NVKM_MEM_TARGET_INST
,
0x37f0
,
16
,
true
,
&
chan
->
inst
);
if
(
ret
)
return
ret
;
nvkm_kmap
(
chan
->
inst
);
nvkm_wo32
(
chan
->
inst
,
0x0000
,
0x00000001
|
(
chan
->
chid
<<
24
));
nvkm_wo32
(
chan
->
inst
,
0x033c
,
0xffff0000
);
nvkm_wo32
(
chan
->
inst
,
0x03a0
,
0x0fff0000
);
nvkm_wo32
(
chan
->
inst
,
0x03a4
,
0x0fff0000
);
nvkm_wo32
(
chan
->
inst
,
0x047c
,
0x00000101
);
nvkm_wo32
(
chan
->
inst
,
0x0490
,
0x00000111
);
nvkm_wo32
(
chan
->
inst
,
0x04a8
,
0x44400000
);
for
(
i
=
0x04d4
;
i
<=
0x04e0
;
i
+=
4
)
nvkm_wo32
(
chan
->
inst
,
i
,
0x00030303
);
for
(
i
=
0x04f4
;
i
<=
0x0500
;
i
+=
4
)
nvkm_wo32
(
chan
->
inst
,
i
,
0x00080000
);
for
(
i
=
0x050c
;
i
<=
0x0518
;
i
+=
4
)
nvkm_wo32
(
chan
->
inst
,
i
,
0x01012000
);
for
(
i
=
0x051c
;
i
<=
0x0528
;
i
+=
4
)
nvkm_wo32
(
chan
->
inst
,
i
,
0x000105b8
);
for
(
i
=
0x052c
;
i
<=
0x0538
;
i
+=
4
)
nvkm_wo32
(
chan
->
inst
,
i
,
0x00080008
);
for
(
i
=
0x055c
;
i
<=
0x0598
;
i
+=
4
)
nvkm_wo32
(
chan
->
inst
,
i
,
0x07ff0000
);
nvkm_wo32
(
chan
->
inst
,
0x05a4
,
0x4b7fffff
);
nvkm_wo32
(
chan
->
inst
,
0x05fc
,
0x00000001
);
nvkm_wo32
(
chan
->
inst
,
0x0604
,
0x00004000
);
nvkm_wo32
(
chan
->
inst
,
0x0610
,
0x00000001
);
nvkm_wo32
(
chan
->
inst
,
0x0618
,
0x00040000
);
nvkm_wo32
(
chan
->
inst
,
0x061c
,
0x00010000
);
for
(
i
=
0x1c1c
;
i
<=
0x248c
;
i
+=
16
)
{
nvkm_wo32
(
chan
->
inst
,
(
i
+
0
),
0x10700ff9
);
nvkm_wo32
(
chan
->
inst
,
(
i
+
4
),
0x0436086c
);
nvkm_wo32
(
chan
->
inst
,
(
i
+
8
),
0x000c001b
);
}
nvkm_wo32
(
chan
->
inst
,
0x281c
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x2830
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x285c
,
0x40000000
);
nvkm_wo32
(
chan
->
inst
,
0x2860
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x2864
,
0x3f000000
);
nvkm_wo32
(
chan
->
inst
,
0x286c
,
0x40000000
);
nvkm_wo32
(
chan
->
inst
,
0x2870
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x2878
,
0xbf800000
);
nvkm_wo32
(
chan
->
inst
,
0x2880
,
0xbf800000
);
nvkm_wo32
(
chan
->
inst
,
0x34a4
,
0x000fe000
);
nvkm_wo32
(
chan
->
inst
,
0x3530
,
0x000003f8
);
nvkm_wo32
(
chan
->
inst
,
0x3540
,
0x002fe000
);
for
(
i
=
0x355c
;
i
<=
0x3578
;
i
+=
4
)
nvkm_wo32
(
chan
->
inst
,
i
,
0x001c527c
);
nvkm_done
(
chan
->
inst
);
return
0
;
}
/*******************************************************************************
/*******************************************************************************
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
...
@@ -176,7 +153,7 @@ nv20_gr_tile_prog(struct nvkm_engine *engine, int i)
...
@@ -176,7 +153,7 @@ nv20_gr_tile_prog(struct nvkm_engine *engine, int i)
unsigned
long
flags
;
unsigned
long
flags
;
fifo
->
pause
(
fifo
,
&
flags
);
fifo
->
pause
(
fifo
,
&
flags
);
nv04_gr_idle
(
gr
);
nv04_gr_idle
(
&
gr
->
base
);
nvkm_wr32
(
device
,
NV20_PGRAPH_TLIMIT
(
i
),
tile
->
limit
);
nvkm_wr32
(
device
,
NV20_PGRAPH_TLIMIT
(
i
),
tile
->
limit
);
nvkm_wr32
(
device
,
NV20_PGRAPH_TSIZE
(
i
),
tile
->
pitch
);
nvkm_wr32
(
device
,
NV20_PGRAPH_TSIZE
(
i
),
tile
->
pitch
);
...
@@ -237,6 +214,29 @@ nv20_gr_intr(struct nvkm_subdev *subdev)
...
@@ -237,6 +214,29 @@ nv20_gr_intr(struct nvkm_subdev *subdev)
nvkm_fifo_chan_put
(
device
->
fifo
,
flags
,
&
chan
);
nvkm_fifo_chan_put
(
device
->
fifo
,
flags
,
&
chan
);
}
}
static
const
struct
nvkm_gr_func
nv20_gr
=
{
.
chan_new
=
nv20_gr_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
0x0012
,
&
nv04_gr_object
},
/* beta1 */
{
-
1
,
-
1
,
0x0019
,
&
nv04_gr_object
},
/* clip */
{
-
1
,
-
1
,
0x0030
,
&
nv04_gr_object
},
/* null */
{
-
1
,
-
1
,
0x0039
,
&
nv04_gr_object
},
/* m2mf */
{
-
1
,
-
1
,
0x0043
,
&
nv04_gr_object
},
/* rop */
{
-
1
,
-
1
,
0x0044
,
&
nv04_gr_object
},
/* patt */
{
-
1
,
-
1
,
0x004a
,
&
nv04_gr_object
},
/* gdi */
{
-
1
,
-
1
,
0x0062
,
&
nv04_gr_object
},
/* surf2d */
{
-
1
,
-
1
,
0x0072
,
&
nv04_gr_object
},
/* beta4 */
{
-
1
,
-
1
,
0x0089
,
&
nv04_gr_object
},
/* sifm */
{
-
1
,
-
1
,
0x008a
,
&
nv04_gr_object
},
/* ifc */
{
-
1
,
-
1
,
0x0096
,
&
nv04_gr_object
},
/* celcius */
{
-
1
,
-
1
,
0x0097
,
&
nv04_gr_object
},
/* kelvin */
{
-
1
,
-
1
,
0x009e
,
&
nv04_gr_object
},
/* swzsurf */
{
-
1
,
-
1
,
0x009f
,
&
nv04_gr_object
},
/* imageblit */
{}
}
};
static
int
static
int
nv20_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv20_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
@@ -251,6 +251,8 @@ nv20_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -251,6 +251,8 @@ nv20_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
gr
->
base
.
func
=
&
nv20_gr
;
ret
=
nvkm_memory_new
(
device
,
NVKM_MEM_TARGET_INST
,
32
*
4
,
16
,
true
,
ret
=
nvkm_memory_new
(
device
,
NVKM_MEM_TARGET_INST
,
32
*
4
,
16
,
true
,
&
gr
->
ctxtab
);
&
gr
->
ctxtab
);
if
(
ret
)
if
(
ret
)
...
@@ -258,8 +260,6 @@ nv20_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -258,8 +260,6 @@ nv20_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
intr
=
nv20_gr_intr
;
nv_subdev
(
gr
)
->
intr
=
nv20_gr_intr
;
nv_engine
(
gr
)
->
cclass
=
&
nv20_gr_cclass
;
nv_engine
(
gr
)
->
sclass
=
nv20_gr_sclass
;
nv_engine
(
gr
)
->
tile_prog
=
nv20_gr_tile_prog
;
nv_engine
(
gr
)
->
tile_prog
=
nv20_gr_tile_prog
;
return
0
;
return
0
;
}
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.h
浏览文件 @
27f3d6cf
#ifndef __NV20_GR_H__
#ifndef __NV20_GR_H__
#define __NV20_GR_H__
#define __NV20_GR_H__
#include <engine/gr.h>
#define nv20_gr(p) container_of((p), struct nv20_gr, base)
#include "priv.h"
struct
nv20_gr
{
struct
nv20_gr
{
struct
nvkm_gr
base
;
struct
nvkm_gr
base
;
struct
nvkm_memory
*
ctxtab
;
struct
nvkm_memory
*
ctxtab
;
};
};
#define nv20_gr_chan(p) container_of((p), struct nv20_gr_chan, object)
struct
nv20_gr_chan
{
struct
nv20_gr_chan
{
struct
nvkm_gr_chan
base
;
struct
nvkm_object
object
;
struct
nv20_gr
*
gr
;
int
chid
;
int
chid
;
struct
nvkm_memory
*
inst
;
};
};
extern
struct
nvkm_oclass
nv25_gr_sclass
[]
;
void
*
nv20_gr_chan_dtor
(
struct
nvkm_object
*
)
;
int
nv20_gr_c
ontext
_init
(
struct
nvkm_object
*
);
int
nv20_gr_c
han
_init
(
struct
nvkm_object
*
);
int
nv20_gr_c
ontext
_fini
(
struct
nvkm_object
*
,
bool
);
int
nv20_gr_c
han
_fini
(
struct
nvkm_object
*
,
bool
);
void
nv20_gr_tile_prog
(
struct
nvkm_engine
*
,
int
);
void
nv20_gr_tile_prog
(
struct
nvkm_engine
*
,
int
);
void
nv20_gr_intr
(
struct
nvkm_subdev
*
);
void
nv20_gr_intr
(
struct
nvkm_subdev
*
);
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv25.c
浏览文件 @
27f3d6cf
...
@@ -5,126 +5,122 @@
...
@@ -5,126 +5,122 @@
#include <engine/fifo/chan.h>
#include <engine/fifo/chan.h>
/*******************************************************************************
/*******************************************************************************
*
Graphics object classes
*
PGRAPH context
******************************************************************************/
******************************************************************************/
struct
nvkm_oclass
static
const
struct
nvkm_object_func
nv25_gr_sclass
[]
=
{
nv25_gr_chan
=
{
{
0x0012
,
&
nv04_gr_ofuncs
,
NULL
},
/* beta1 */
.
dtor
=
nv20_gr_chan_dtor
,
{
0x0019
,
&
nv04_gr_ofuncs
,
NULL
},
/* clip */
.
init
=
nv20_gr_chan_init
,
{
0x0030
,
&
nv04_gr_ofuncs
,
NULL
},
/* null */
.
fini
=
nv20_gr_chan_fini
,
{
0x0039
,
&
nv04_gr_ofuncs
,
NULL
},
/* m2mf */
{
0x0043
,
&
nv04_gr_ofuncs
,
NULL
},
/* rop */
{
0x0044
,
&
nv04_gr_ofuncs
,
NULL
},
/* patt */
{
0x004a
,
&
nv04_gr_ofuncs
,
NULL
},
/* gdi */
{
0x0062
,
&
nv04_gr_ofuncs
,
NULL
},
/* surf2d */
{
0x0072
,
&
nv04_gr_ofuncs
,
NULL
},
/* beta4 */
{
0x0089
,
&
nv04_gr_ofuncs
,
NULL
},
/* sifm */
{
0x008a
,
&
nv04_gr_ofuncs
,
NULL
},
/* ifc */
{
0x0096
,
&
nv04_gr_ofuncs
,
NULL
},
/* celcius */
{
0x009e
,
&
nv04_gr_ofuncs
,
NULL
},
/* swzsurf */
{
0x009f
,
&
nv04_gr_ofuncs
,
NULL
},
/* imageblit */
{
0x0597
,
&
nv04_gr_ofuncs
,
NULL
},
/* kelvin */
{},
};
};
/*******************************************************************************
* PGRAPH context
******************************************************************************/
static
int
static
int
nv25_gr_context_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv25_gr_chan_new
(
struct
nvkm_gr
*
base
,
struct
nvkm_fifo_chan
*
fifoch
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
struct
nvkm_object
**
pobject
)
{
{
struct
nv20_gr
*
gr
=
nv20_gr
(
base
);
struct
nv20_gr_chan
*
chan
;
struct
nv20_gr_chan
*
chan
;
struct
nvkm_gpuobj
*
image
;
int
ret
,
i
;
int
ret
,
i
;
ret
=
nvkm_gr_context_create
(
parent
,
engine
,
oclass
,
NULL
,
0x3724
,
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
16
,
NVOBJ_FLAG_ZERO_ALLOC
,
&
chan
);
return
-
ENOMEM
;
*
pobject
=
nv_object
(
chan
);
nvkm_object_ctor
(
&
nv25_gr_chan
,
oclass
,
&
chan
->
object
);
chan
->
gr
=
gr
;
chan
->
chid
=
fifoch
->
chid
;
*
pobject
=
&
chan
->
object
;
ret
=
nvkm_memory_new
(
gr
->
base
.
engine
.
subdev
.
device
,
NVKM_MEM_TARGET_INST
,
0x3724
,
16
,
true
,
&
chan
->
inst
);
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
chan
->
chid
=
nvkm_fifo_chan
(
parent
)
->
chid
;
nvkm_kmap
(
chan
->
inst
);
image
=
&
chan
->
base
.
base
.
gpuobj
;
nvkm_wo32
(
chan
->
inst
,
0x0028
,
0x00000001
|
(
chan
->
chid
<<
24
));
nvkm_wo32
(
chan
->
inst
,
0x035c
,
0xffff0000
);
nvkm_kmap
(
image
);
nvkm_wo32
(
chan
->
inst
,
0x03c0
,
0x0fff0000
);
nvkm_wo32
(
image
,
0x0028
,
0x00000001
|
(
chan
->
chid
<<
24
));
nvkm_wo32
(
chan
->
inst
,
0x03c4
,
0x0fff0000
);
nvkm_wo32
(
image
,
0x035c
,
0xffff0000
);
nvkm_wo32
(
chan
->
inst
,
0x049c
,
0x00000101
);
nvkm_wo32
(
image
,
0x03c0
,
0x0fff0000
);
nvkm_wo32
(
chan
->
inst
,
0x04b0
,
0x00000111
);
nvkm_wo32
(
image
,
0x03c4
,
0x0fff0000
);
nvkm_wo32
(
chan
->
inst
,
0x04c8
,
0x00000080
);
nvkm_wo32
(
image
,
0x049c
,
0x00000101
);
nvkm_wo32
(
chan
->
inst
,
0x04cc
,
0xffff0000
);
nvkm_wo32
(
image
,
0x04b0
,
0x00000111
);
nvkm_wo32
(
chan
->
inst
,
0x04d0
,
0x00000001
);
nvkm_wo32
(
image
,
0x04c8
,
0x00000080
);
nvkm_wo32
(
chan
->
inst
,
0x04e4
,
0x44400000
);
nvkm_wo32
(
image
,
0x04cc
,
0xffff0000
);
nvkm_wo32
(
chan
->
inst
,
0x04fc
,
0x4b800000
);
nvkm_wo32
(
image
,
0x04d0
,
0x00000001
);
nvkm_wo32
(
image
,
0x04e4
,
0x44400000
);
nvkm_wo32
(
image
,
0x04fc
,
0x4b800000
);
for
(
i
=
0x0510
;
i
<=
0x051c
;
i
+=
4
)
for
(
i
=
0x0510
;
i
<=
0x051c
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00030303
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00030303
);
for
(
i
=
0x0530
;
i
<=
0x053c
;
i
+=
4
)
for
(
i
=
0x0530
;
i
<=
0x053c
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00080000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00080000
);
for
(
i
=
0x0548
;
i
<=
0x0554
;
i
+=
4
)
for
(
i
=
0x0548
;
i
<=
0x0554
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x01012000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x01012000
);
for
(
i
=
0x0558
;
i
<=
0x0564
;
i
+=
4
)
for
(
i
=
0x0558
;
i
<=
0x0564
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x000105b8
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x000105b8
);
for
(
i
=
0x0568
;
i
<=
0x0574
;
i
+=
4
)
for
(
i
=
0x0568
;
i
<=
0x0574
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00080008
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00080008
);
for
(
i
=
0x0598
;
i
<=
0x05d4
;
i
+=
4
)
for
(
i
=
0x0598
;
i
<=
0x05d4
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x07ff0000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x07ff0000
);
nvkm_wo32
(
image
,
0x05e0
,
0x4b7fffff
);
nvkm_wo32
(
chan
->
inst
,
0x05e0
,
0x4b7fffff
);
nvkm_wo32
(
image
,
0x0620
,
0x00000080
);
nvkm_wo32
(
chan
->
inst
,
0x0620
,
0x00000080
);
nvkm_wo32
(
image
,
0x0624
,
0x30201000
);
nvkm_wo32
(
chan
->
inst
,
0x0624
,
0x30201000
);
nvkm_wo32
(
image
,
0x0628
,
0x70605040
);
nvkm_wo32
(
chan
->
inst
,
0x0628
,
0x70605040
);
nvkm_wo32
(
image
,
0x062c
,
0xb0a09080
);
nvkm_wo32
(
chan
->
inst
,
0x062c
,
0xb0a09080
);
nvkm_wo32
(
image
,
0x0630
,
0xf0e0d0c0
);
nvkm_wo32
(
chan
->
inst
,
0x0630
,
0xf0e0d0c0
);
nvkm_wo32
(
image
,
0x0664
,
0x00000001
);
nvkm_wo32
(
chan
->
inst
,
0x0664
,
0x00000001
);
nvkm_wo32
(
image
,
0x066c
,
0x00004000
);
nvkm_wo32
(
chan
->
inst
,
0x066c
,
0x00004000
);
nvkm_wo32
(
image
,
0x0678
,
0x00000001
);
nvkm_wo32
(
chan
->
inst
,
0x0678
,
0x00000001
);
nvkm_wo32
(
image
,
0x0680
,
0x00040000
);
nvkm_wo32
(
chan
->
inst
,
0x0680
,
0x00040000
);
nvkm_wo32
(
image
,
0x0684
,
0x00010000
);
nvkm_wo32
(
chan
->
inst
,
0x0684
,
0x00010000
);
for
(
i
=
0x1b04
;
i
<=
0x2374
;
i
+=
16
)
{
for
(
i
=
0x1b04
;
i
<=
0x2374
;
i
+=
16
)
{
nvkm_wo32
(
image
,
(
i
+
0
),
0x10700ff9
);
nvkm_wo32
(
chan
->
inst
,
(
i
+
0
),
0x10700ff9
);
nvkm_wo32
(
image
,
(
i
+
4
),
0x0436086c
);
nvkm_wo32
(
chan
->
inst
,
(
i
+
4
),
0x0436086c
);
nvkm_wo32
(
image
,
(
i
+
8
),
0x000c001b
);
nvkm_wo32
(
chan
->
inst
,
(
i
+
8
),
0x000c001b
);
}
}
nvkm_wo32
(
image
,
0x2704
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x2704
,
0x3f800000
);
nvkm_wo32
(
image
,
0x2718
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x2718
,
0x3f800000
);
nvkm_wo32
(
image
,
0x2744
,
0x40000000
);
nvkm_wo32
(
chan
->
inst
,
0x2744
,
0x40000000
);
nvkm_wo32
(
image
,
0x2748
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x2748
,
0x3f800000
);
nvkm_wo32
(
image
,
0x274c
,
0x3f000000
);
nvkm_wo32
(
chan
->
inst
,
0x274c
,
0x3f000000
);
nvkm_wo32
(
image
,
0x2754
,
0x40000000
);
nvkm_wo32
(
chan
->
inst
,
0x2754
,
0x40000000
);
nvkm_wo32
(
image
,
0x2758
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x2758
,
0x3f800000
);
nvkm_wo32
(
image
,
0x2760
,
0xbf800000
);
nvkm_wo32
(
chan
->
inst
,
0x2760
,
0xbf800000
);
nvkm_wo32
(
image
,
0x2768
,
0xbf800000
);
nvkm_wo32
(
chan
->
inst
,
0x2768
,
0xbf800000
);
nvkm_wo32
(
image
,
0x308c
,
0x000fe000
);
nvkm_wo32
(
chan
->
inst
,
0x308c
,
0x000fe000
);
nvkm_wo32
(
image
,
0x3108
,
0x000003f8
);
nvkm_wo32
(
chan
->
inst
,
0x3108
,
0x000003f8
);
nvkm_wo32
(
image
,
0x3468
,
0x002fe000
);
nvkm_wo32
(
chan
->
inst
,
0x3468
,
0x002fe000
);
for
(
i
=
0x3484
;
i
<=
0x34a0
;
i
+=
4
)
for
(
i
=
0x3484
;
i
<=
0x34a0
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x001c527c
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x001c527c
);
nvkm_done
(
image
);
nvkm_done
(
chan
->
inst
);
return
0
;
return
0
;
}
}
static
struct
nvkm_oclass
nv25_gr_cclass
=
{
.
handle
=
NV_ENGCTX
(
GR
,
0x25
),
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
nv25_gr_context_ctor
,
.
dtor
=
_nvkm_gr_context_dtor
,
.
init
=
nv20_gr_context_init
,
.
fini
=
nv20_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
static
const
struct
nvkm_gr_func
nv25_gr
=
{
.
chan_new
=
nv25_gr_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
0x0012
,
&
nv04_gr_object
},
/* beta1 */
{
-
1
,
-
1
,
0x0019
,
&
nv04_gr_object
},
/* clip */
{
-
1
,
-
1
,
0x0030
,
&
nv04_gr_object
},
/* null */
{
-
1
,
-
1
,
0x0039
,
&
nv04_gr_object
},
/* m2mf */
{
-
1
,
-
1
,
0x0043
,
&
nv04_gr_object
},
/* rop */
{
-
1
,
-
1
,
0x0044
,
&
nv04_gr_object
},
/* patt */
{
-
1
,
-
1
,
0x004a
,
&
nv04_gr_object
},
/* gdi */
{
-
1
,
-
1
,
0x0062
,
&
nv04_gr_object
},
/* surf2d */
{
-
1
,
-
1
,
0x0072
,
&
nv04_gr_object
},
/* beta4 */
{
-
1
,
-
1
,
0x0089
,
&
nv04_gr_object
},
/* sifm */
{
-
1
,
-
1
,
0x008a
,
&
nv04_gr_object
},
/* ifc */
{
-
1
,
-
1
,
0x0096
,
&
nv04_gr_object
},
/* celcius */
{
-
1
,
-
1
,
0x009e
,
&
nv04_gr_object
},
/* swzsurf */
{
-
1
,
-
1
,
0x009f
,
&
nv04_gr_object
},
/* imageblit */
{
-
1
,
-
1
,
0x0597
,
&
nv04_gr_object
},
/* kelvin */
{}
}
};
static
int
static
int
nv25_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv25_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
@@ -139,6 +135,8 @@ nv25_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -139,6 +135,8 @@ nv25_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
gr
->
base
.
func
=
&
nv25_gr
;
ret
=
nvkm_memory_new
(
device
,
NVKM_MEM_TARGET_INST
,
32
*
4
,
16
,
true
,
ret
=
nvkm_memory_new
(
device
,
NVKM_MEM_TARGET_INST
,
32
*
4
,
16
,
true
,
&
gr
->
ctxtab
);
&
gr
->
ctxtab
);
if
(
ret
)
if
(
ret
)
...
@@ -146,8 +144,6 @@ nv25_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -146,8 +144,6 @@ nv25_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
intr
=
nv20_gr_intr
;
nv_subdev
(
gr
)
->
intr
=
nv20_gr_intr
;
nv_engine
(
gr
)
->
cclass
=
&
nv25_gr_cclass
;
nv_engine
(
gr
)
->
sclass
=
nv25_gr_sclass
;
nv_engine
(
gr
)
->
tile_prog
=
nv20_gr_tile_prog
;
nv_engine
(
gr
)
->
tile_prog
=
nv20_gr_tile_prog
;
return
0
;
return
0
;
}
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv2a.c
浏览文件 @
27f3d6cf
...
@@ -8,90 +8,110 @@
...
@@ -8,90 +8,110 @@
* PGRAPH context
* PGRAPH context
******************************************************************************/
******************************************************************************/
static
const
struct
nvkm_object_func
nv2a_gr_chan
=
{
.
dtor
=
nv20_gr_chan_dtor
,
.
init
=
nv20_gr_chan_init
,
.
fini
=
nv20_gr_chan_fini
,
};
static
int
static
int
nv2a_gr_context_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv2a_gr_chan_new
(
struct
nvkm_gr
*
base
,
struct
nvkm_fifo_chan
*
fifoch
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
struct
nvkm_object
**
pobject
)
{
{
struct
nv20_gr
*
gr
=
nv20_gr
(
base
);
struct
nv20_gr_chan
*
chan
;
struct
nv20_gr_chan
*
chan
;
struct
nvkm_gpuobj
*
image
;
int
ret
,
i
;
int
ret
,
i
;
ret
=
nvkm_gr_context_create
(
parent
,
engine
,
oclass
,
NULL
,
0x36b0
,
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
16
,
NVOBJ_FLAG_ZERO_ALLOC
,
&
chan
);
return
-
ENOMEM
;
*
pobject
=
nv_object
(
chan
);
nvkm_object_ctor
(
&
nv2a_gr_chan
,
oclass
,
&
chan
->
object
);
chan
->
gr
=
gr
;
chan
->
chid
=
fifoch
->
chid
;
*
pobject
=
&
chan
->
object
;
ret
=
nvkm_memory_new
(
gr
->
base
.
engine
.
subdev
.
device
,
NVKM_MEM_TARGET_INST
,
0x36b0
,
16
,
true
,
&
chan
->
inst
);
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
chan
->
chid
=
nvkm_fifo_chan
(
parent
)
->
chid
;
nvkm_kmap
(
chan
->
inst
);
image
=
&
chan
->
base
.
base
.
gpuobj
;
nvkm_wo32
(
chan
->
inst
,
0x0000
,
0x00000001
|
(
chan
->
chid
<<
24
));
nvkm_wo32
(
chan
->
inst
,
0x033c
,
0xffff0000
);
nvkm_kmap
(
image
);
nvkm_wo32
(
chan
->
inst
,
0x03a0
,
0x0fff0000
);
nvkm_wo32
(
image
,
0x0000
,
0x00000001
|
(
chan
->
chid
<<
24
));
nvkm_wo32
(
chan
->
inst
,
0x03a4
,
0x0fff0000
);
nvkm_wo32
(
image
,
0x033c
,
0xffff0000
);
nvkm_wo32
(
chan
->
inst
,
0x047c
,
0x00000101
);
nvkm_wo32
(
image
,
0x03a0
,
0x0fff0000
);
nvkm_wo32
(
chan
->
inst
,
0x0490
,
0x00000111
);
nvkm_wo32
(
image
,
0x03a4
,
0x0fff0000
);
nvkm_wo32
(
chan
->
inst
,
0x04a8
,
0x44400000
);
nvkm_wo32
(
image
,
0x047c
,
0x00000101
);
nvkm_wo32
(
image
,
0x0490
,
0x00000111
);
nvkm_wo32
(
image
,
0x04a8
,
0x44400000
);
for
(
i
=
0x04d4
;
i
<=
0x04e0
;
i
+=
4
)
for
(
i
=
0x04d4
;
i
<=
0x04e0
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00030303
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00030303
);
for
(
i
=
0x04f4
;
i
<=
0x0500
;
i
+=
4
)
for
(
i
=
0x04f4
;
i
<=
0x0500
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00080000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00080000
);
for
(
i
=
0x050c
;
i
<=
0x0518
;
i
+=
4
)
for
(
i
=
0x050c
;
i
<=
0x0518
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x01012000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x01012000
);
for
(
i
=
0x051c
;
i
<=
0x0528
;
i
+=
4
)
for
(
i
=
0x051c
;
i
<=
0x0528
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x000105b8
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x000105b8
);
for
(
i
=
0x052c
;
i
<=
0x0538
;
i
+=
4
)
for
(
i
=
0x052c
;
i
<=
0x0538
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00080008
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00080008
);
for
(
i
=
0x055c
;
i
<=
0x0598
;
i
+=
4
)
for
(
i
=
0x055c
;
i
<=
0x0598
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x07ff0000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x07ff0000
);
nvkm_wo32
(
image
,
0x05a4
,
0x4b7fffff
);
nvkm_wo32
(
chan
->
inst
,
0x05a4
,
0x4b7fffff
);
nvkm_wo32
(
image
,
0x05fc
,
0x00000001
);
nvkm_wo32
(
chan
->
inst
,
0x05fc
,
0x00000001
);
nvkm_wo32
(
image
,
0x0604
,
0x00004000
);
nvkm_wo32
(
chan
->
inst
,
0x0604
,
0x00004000
);
nvkm_wo32
(
image
,
0x0610
,
0x00000001
);
nvkm_wo32
(
chan
->
inst
,
0x0610
,
0x00000001
);
nvkm_wo32
(
image
,
0x0618
,
0x00040000
);
nvkm_wo32
(
chan
->
inst
,
0x0618
,
0x00040000
);
nvkm_wo32
(
image
,
0x061c
,
0x00010000
);
nvkm_wo32
(
chan
->
inst
,
0x061c
,
0x00010000
);
for
(
i
=
0x1a9c
;
i
<=
0x22fc
;
i
+=
16
)
{
/*XXX: check!! */
for
(
i
=
0x1a9c
;
i
<=
0x22fc
;
i
+=
16
)
{
/*XXX: check!! */
nvkm_wo32
(
image
,
(
i
+
0
),
0x10700ff9
);
nvkm_wo32
(
chan
->
inst
,
(
i
+
0
),
0x10700ff9
);
nvkm_wo32
(
image
,
(
i
+
4
),
0x0436086c
);
nvkm_wo32
(
chan
->
inst
,
(
i
+
4
),
0x0436086c
);
nvkm_wo32
(
image
,
(
i
+
8
),
0x000c001b
);
nvkm_wo32
(
chan
->
inst
,
(
i
+
8
),
0x000c001b
);
}
}
nvkm_wo32
(
image
,
0x269c
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x269c
,
0x3f800000
);
nvkm_wo32
(
image
,
0x26b0
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x26b0
,
0x3f800000
);
nvkm_wo32
(
image
,
0x26dc
,
0x40000000
);
nvkm_wo32
(
chan
->
inst
,
0x26dc
,
0x40000000
);
nvkm_wo32
(
image
,
0x26e0
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x26e0
,
0x3f800000
);
nvkm_wo32
(
image
,
0x26e4
,
0x3f000000
);
nvkm_wo32
(
chan
->
inst
,
0x26e4
,
0x3f000000
);
nvkm_wo32
(
image
,
0x26ec
,
0x40000000
);
nvkm_wo32
(
chan
->
inst
,
0x26ec
,
0x40000000
);
nvkm_wo32
(
image
,
0x26f0
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x26f0
,
0x3f800000
);
nvkm_wo32
(
image
,
0x26f8
,
0xbf800000
);
nvkm_wo32
(
chan
->
inst
,
0x26f8
,
0xbf800000
);
nvkm_wo32
(
image
,
0x2700
,
0xbf800000
);
nvkm_wo32
(
chan
->
inst
,
0x2700
,
0xbf800000
);
nvkm_wo32
(
image
,
0x3024
,
0x000fe000
);
nvkm_wo32
(
chan
->
inst
,
0x3024
,
0x000fe000
);
nvkm_wo32
(
image
,
0x30a0
,
0x000003f8
);
nvkm_wo32
(
chan
->
inst
,
0x30a0
,
0x000003f8
);
nvkm_wo32
(
image
,
0x33fc
,
0x002fe000
);
nvkm_wo32
(
chan
->
inst
,
0x33fc
,
0x002fe000
);
for
(
i
=
0x341c
;
i
<=
0x3438
;
i
+=
4
)
for
(
i
=
0x341c
;
i
<=
0x3438
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x001c527c
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x001c527c
);
nvkm_done
(
image
);
nvkm_done
(
chan
->
inst
);
return
0
;
return
0
;
}
}
static
struct
nvkm_oclass
nv2a_gr_cclass
=
{
.
handle
=
NV_ENGCTX
(
GR
,
0x2a
),
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
nv2a_gr_context_ctor
,
.
dtor
=
_nvkm_gr_context_dtor
,
.
init
=
nv20_gr_context_init
,
.
fini
=
nv20_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
static
const
struct
nvkm_gr_func
nv2a_gr
=
{
.
chan_new
=
nv2a_gr_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
0x0012
,
&
nv04_gr_object
},
/* beta1 */
{
-
1
,
-
1
,
0x0019
,
&
nv04_gr_object
},
/* clip */
{
-
1
,
-
1
,
0x0030
,
&
nv04_gr_object
},
/* null */
{
-
1
,
-
1
,
0x0039
,
&
nv04_gr_object
},
/* m2mf */
{
-
1
,
-
1
,
0x0043
,
&
nv04_gr_object
},
/* rop */
{
-
1
,
-
1
,
0x0044
,
&
nv04_gr_object
},
/* patt */
{
-
1
,
-
1
,
0x004a
,
&
nv04_gr_object
},
/* gdi */
{
-
1
,
-
1
,
0x0062
,
&
nv04_gr_object
},
/* surf2d */
{
-
1
,
-
1
,
0x0072
,
&
nv04_gr_object
},
/* beta4 */
{
-
1
,
-
1
,
0x0089
,
&
nv04_gr_object
},
/* sifm */
{
-
1
,
-
1
,
0x008a
,
&
nv04_gr_object
},
/* ifc */
{
-
1
,
-
1
,
0x0096
,
&
nv04_gr_object
},
/* celcius */
{
-
1
,
-
1
,
0x009e
,
&
nv04_gr_object
},
/* swzsurf */
{
-
1
,
-
1
,
0x009f
,
&
nv04_gr_object
},
/* imageblit */
{
-
1
,
-
1
,
0x0597
,
&
nv04_gr_object
},
/* kelvin */
{}
}
};
static
int
static
int
nv2a_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv2a_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
@@ -106,6 +126,8 @@ nv2a_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -106,6 +126,8 @@ nv2a_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
gr
->
base
.
func
=
&
nv2a_gr
;
ret
=
nvkm_memory_new
(
device
,
NVKM_MEM_TARGET_INST
,
32
*
4
,
16
,
true
,
ret
=
nvkm_memory_new
(
device
,
NVKM_MEM_TARGET_INST
,
32
*
4
,
16
,
true
,
&
gr
->
ctxtab
);
&
gr
->
ctxtab
);
if
(
ret
)
if
(
ret
)
...
@@ -113,8 +135,6 @@ nv2a_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -113,8 +135,6 @@ nv2a_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
intr
=
nv20_gr_intr
;
nv_subdev
(
gr
)
->
intr
=
nv20_gr_intr
;
nv_engine
(
gr
)
->
cclass
=
&
nv2a_gr_cclass
;
nv_engine
(
gr
)
->
sclass
=
nv25_gr_sclass
;
nv_engine
(
gr
)
->
tile_prog
=
nv20_gr_tile_prog
;
nv_engine
(
gr
)
->
tile_prog
=
nv20_gr_tile_prog
;
return
0
;
return
0
;
}
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.c
浏览文件 @
27f3d6cf
...
@@ -6,127 +6,123 @@
...
@@ -6,127 +6,123 @@
#include <subdev/fb.h>
#include <subdev/fb.h>
/*******************************************************************************
/*******************************************************************************
*
Graphics object classes
*
PGRAPH context
******************************************************************************/
******************************************************************************/
static
struct
nvkm_oclass
static
const
struct
nvkm_object_func
nv30_gr_sclass
[]
=
{
nv30_gr_chan
=
{
{
0x0012
,
&
nv04_gr_ofuncs
,
NULL
},
/* beta1 */
.
dtor
=
nv20_gr_chan_dtor
,
{
0x0019
,
&
nv04_gr_ofuncs
,
NULL
},
/* clip */
.
init
=
nv20_gr_chan_init
,
{
0x0030
,
&
nv04_gr_ofuncs
,
NULL
},
/* null */
.
fini
=
nv20_gr_chan_fini
,
{
0x0039
,
&
nv04_gr_ofuncs
,
NULL
},
/* m2mf */
{
0x0043
,
&
nv04_gr_ofuncs
,
NULL
},
/* rop */
{
0x0044
,
&
nv04_gr_ofuncs
,
NULL
},
/* patt */
{
0x004a
,
&
nv04_gr_ofuncs
,
NULL
},
/* gdi */
{
0x0062
,
&
nv04_gr_ofuncs
,
NULL
},
/* surf2d */
{
0x0072
,
&
nv04_gr_ofuncs
,
NULL
},
/* beta4 */
{
0x0089
,
&
nv04_gr_ofuncs
,
NULL
},
/* sifm */
{
0x008a
,
&
nv04_gr_ofuncs
,
NULL
},
/* ifc */
{
0x009f
,
&
nv04_gr_ofuncs
,
NULL
},
/* imageblit */
{
0x0362
,
&
nv04_gr_ofuncs
,
NULL
},
/* surf2d (nv30) */
{
0x0389
,
&
nv04_gr_ofuncs
,
NULL
},
/* sifm (nv30) */
{
0x038a
,
&
nv04_gr_ofuncs
,
NULL
},
/* ifc (nv30) */
{
0x039e
,
&
nv04_gr_ofuncs
,
NULL
},
/* swzsurf (nv30) */
{
0x0397
,
&
nv04_gr_ofuncs
,
NULL
},
/* rankine */
{},
};
};
/*******************************************************************************
* PGRAPH context
******************************************************************************/
static
int
static
int
nv30_gr_context_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv30_gr_chan_new
(
struct
nvkm_gr
*
base
,
struct
nvkm_fifo_chan
*
fifoch
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
struct
nvkm_object
**
pobject
)
{
{
struct
nv20_gr
*
gr
=
nv20_gr
(
base
);
struct
nv20_gr_chan
*
chan
;
struct
nv20_gr_chan
*
chan
;
struct
nvkm_gpuobj
*
image
;
int
ret
,
i
;
int
ret
,
i
;
ret
=
nvkm_gr_context_create
(
parent
,
engine
,
oclass
,
NULL
,
0x5f48
,
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
16
,
NVOBJ_FLAG_ZERO_ALLOC
,
&
chan
);
return
-
ENOMEM
;
*
pobject
=
nv_object
(
chan
);
nvkm_object_ctor
(
&
nv30_gr_chan
,
oclass
,
&
chan
->
object
);
chan
->
gr
=
gr
;
chan
->
chid
=
fifoch
->
chid
;
*
pobject
=
&
chan
->
object
;
ret
=
nvkm_memory_new
(
gr
->
base
.
engine
.
subdev
.
device
,
NVKM_MEM_TARGET_INST
,
0x5f48
,
16
,
true
,
&
chan
->
inst
);
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
chan
->
chid
=
nvkm_fifo_chan
(
parent
)
->
chid
;
nvkm_kmap
(
chan
->
inst
);
image
=
&
chan
->
base
.
base
.
gpuobj
;
nvkm_wo32
(
chan
->
inst
,
0x0028
,
0x00000001
|
(
chan
->
chid
<<
24
));
nvkm_wo32
(
chan
->
inst
,
0x0410
,
0x00000101
);
nvkm_kmap
(
image
);
nvkm_wo32
(
chan
->
inst
,
0x0424
,
0x00000111
);
nvkm_wo32
(
image
,
0x0028
,
0x00000001
|
(
chan
->
chid
<<
24
));
nvkm_wo32
(
chan
->
inst
,
0x0428
,
0x00000060
);
nvkm_wo32
(
image
,
0x0410
,
0x00000101
);
nvkm_wo32
(
chan
->
inst
,
0x0444
,
0x00000080
);
nvkm_wo32
(
image
,
0x0424
,
0x00000111
);
nvkm_wo32
(
chan
->
inst
,
0x0448
,
0xffff0000
);
nvkm_wo32
(
image
,
0x0428
,
0x00000060
);
nvkm_wo32
(
chan
->
inst
,
0x044c
,
0x00000001
);
nvkm_wo32
(
image
,
0x0444
,
0x00000080
);
nvkm_wo32
(
chan
->
inst
,
0x0460
,
0x44400000
);
nvkm_wo32
(
image
,
0x0448
,
0xffff0000
);
nvkm_wo32
(
chan
->
inst
,
0x048c
,
0xffff0000
);
nvkm_wo32
(
image
,
0x044c
,
0x00000001
);
nvkm_wo32
(
image
,
0x0460
,
0x44400000
);
nvkm_wo32
(
image
,
0x048c
,
0xffff0000
);
for
(
i
=
0x04e0
;
i
<
0x04e8
;
i
+=
4
)
for
(
i
=
0x04e0
;
i
<
0x04e8
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x0fff0000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x0fff0000
);
nvkm_wo32
(
image
,
0x04ec
,
0x00011100
);
nvkm_wo32
(
chan
->
inst
,
0x04ec
,
0x00011100
);
for
(
i
=
0x0508
;
i
<
0x0548
;
i
+=
4
)
for
(
i
=
0x0508
;
i
<
0x0548
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x07ff0000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x07ff0000
);
nvkm_wo32
(
image
,
0x0550
,
0x4b7fffff
);
nvkm_wo32
(
chan
->
inst
,
0x0550
,
0x4b7fffff
);
nvkm_wo32
(
image
,
0x058c
,
0x00000080
);
nvkm_wo32
(
chan
->
inst
,
0x058c
,
0x00000080
);
nvkm_wo32
(
image
,
0x0590
,
0x30201000
);
nvkm_wo32
(
chan
->
inst
,
0x0590
,
0x30201000
);
nvkm_wo32
(
image
,
0x0594
,
0x70605040
);
nvkm_wo32
(
chan
->
inst
,
0x0594
,
0x70605040
);
nvkm_wo32
(
image
,
0x0598
,
0xb8a89888
);
nvkm_wo32
(
chan
->
inst
,
0x0598
,
0xb8a89888
);
nvkm_wo32
(
image
,
0x059c
,
0xf8e8d8c8
);
nvkm_wo32
(
chan
->
inst
,
0x059c
,
0xf8e8d8c8
);
nvkm_wo32
(
image
,
0x05b0
,
0xb0000000
);
nvkm_wo32
(
chan
->
inst
,
0x05b0
,
0xb0000000
);
for
(
i
=
0x0600
;
i
<
0x0640
;
i
+=
4
)
for
(
i
=
0x0600
;
i
<
0x0640
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00010588
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00010588
);
for
(
i
=
0x0640
;
i
<
0x0680
;
i
+=
4
)
for
(
i
=
0x0640
;
i
<
0x0680
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00030303
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00030303
);
for
(
i
=
0x06c0
;
i
<
0x0700
;
i
+=
4
)
for
(
i
=
0x06c0
;
i
<
0x0700
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x0008aae4
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x0008aae4
);
for
(
i
=
0x0700
;
i
<
0x0740
;
i
+=
4
)
for
(
i
=
0x0700
;
i
<
0x0740
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x01012000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x01012000
);
for
(
i
=
0x0740
;
i
<
0x0780
;
i
+=
4
)
for
(
i
=
0x0740
;
i
<
0x0780
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00080008
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00080008
);
nvkm_wo32
(
image
,
0x085c
,
0x00040000
);
nvkm_wo32
(
chan
->
inst
,
0x085c
,
0x00040000
);
nvkm_wo32
(
image
,
0x0860
,
0x00010000
);
nvkm_wo32
(
chan
->
inst
,
0x0860
,
0x00010000
);
for
(
i
=
0x0864
;
i
<
0x0874
;
i
+=
4
)
for
(
i
=
0x0864
;
i
<
0x0874
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00040004
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00040004
);
for
(
i
=
0x1f18
;
i
<=
0x3088
;
i
+=
16
)
{
for
(
i
=
0x1f18
;
i
<=
0x3088
;
i
+=
16
)
{
nvkm_wo32
(
image
,
i
+
0
,
0x10700ff9
);
nvkm_wo32
(
chan
->
inst
,
i
+
0
,
0x10700ff9
);
nvkm_wo32
(
image
,
i
+
1
,
0x0436086c
);
nvkm_wo32
(
chan
->
inst
,
i
+
1
,
0x0436086c
);
nvkm_wo32
(
image
,
i
+
2
,
0x000c001b
);
nvkm_wo32
(
chan
->
inst
,
i
+
2
,
0x000c001b
);
}
}
for
(
i
=
0x30b8
;
i
<
0x30c8
;
i
+=
4
)
for
(
i
=
0x30b8
;
i
<
0x30c8
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x0000ffff
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x0000ffff
);
nvkm_wo32
(
image
,
0x344c
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x344c
,
0x3f800000
);
nvkm_wo32
(
image
,
0x3808
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x3808
,
0x3f800000
);
nvkm_wo32
(
image
,
0x381c
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x381c
,
0x3f800000
);
nvkm_wo32
(
image
,
0x3848
,
0x40000000
);
nvkm_wo32
(
chan
->
inst
,
0x3848
,
0x40000000
);
nvkm_wo32
(
image
,
0x384c
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x384c
,
0x3f800000
);
nvkm_wo32
(
image
,
0x3850
,
0x3f000000
);
nvkm_wo32
(
chan
->
inst
,
0x3850
,
0x3f000000
);
nvkm_wo32
(
image
,
0x3858
,
0x40000000
);
nvkm_wo32
(
chan
->
inst
,
0x3858
,
0x40000000
);
nvkm_wo32
(
image
,
0x385c
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x385c
,
0x3f800000
);
nvkm_wo32
(
image
,
0x3864
,
0xbf800000
);
nvkm_wo32
(
chan
->
inst
,
0x3864
,
0xbf800000
);
nvkm_wo32
(
image
,
0x386c
,
0xbf800000
);
nvkm_wo32
(
chan
->
inst
,
0x386c
,
0xbf800000
);
nvkm_done
(
image
);
nvkm_done
(
chan
->
inst
);
return
0
;
return
0
;
}
}
static
struct
nvkm_oclass
nv30_gr_cclass
=
{
.
handle
=
NV_ENGCTX
(
GR
,
0x30
),
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
nv30_gr_context_ctor
,
.
dtor
=
_nvkm_gr_context_dtor
,
.
init
=
nv20_gr_context_init
,
.
fini
=
nv20_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
static
const
struct
nvkm_gr_func
nv30_gr
=
{
.
chan_new
=
nv30_gr_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
0x0012
,
&
nv04_gr_object
},
/* beta1 */
{
-
1
,
-
1
,
0x0019
,
&
nv04_gr_object
},
/* clip */
{
-
1
,
-
1
,
0x0030
,
&
nv04_gr_object
},
/* null */
{
-
1
,
-
1
,
0x0039
,
&
nv04_gr_object
},
/* m2mf */
{
-
1
,
-
1
,
0x0043
,
&
nv04_gr_object
},
/* rop */
{
-
1
,
-
1
,
0x0044
,
&
nv04_gr_object
},
/* patt */
{
-
1
,
-
1
,
0x004a
,
&
nv04_gr_object
},
/* gdi */
{
-
1
,
-
1
,
0x0062
,
&
nv04_gr_object
},
/* surf2d */
{
-
1
,
-
1
,
0x0072
,
&
nv04_gr_object
},
/* beta4 */
{
-
1
,
-
1
,
0x0089
,
&
nv04_gr_object
},
/* sifm */
{
-
1
,
-
1
,
0x008a
,
&
nv04_gr_object
},
/* ifc */
{
-
1
,
-
1
,
0x009f
,
&
nv04_gr_object
},
/* imageblit */
{
-
1
,
-
1
,
0x0362
,
&
nv04_gr_object
},
/* surf2d (nv30) */
{
-
1
,
-
1
,
0x0389
,
&
nv04_gr_object
},
/* sifm (nv30) */
{
-
1
,
-
1
,
0x038a
,
&
nv04_gr_object
},
/* ifc (nv30) */
{
-
1
,
-
1
,
0x039e
,
&
nv04_gr_object
},
/* swzsurf (nv30) */
{
-
1
,
-
1
,
0x0397
,
&
nv04_gr_object
},
/* rankine */
{}
}
};
static
int
static
int
nv30_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv30_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
@@ -141,6 +137,8 @@ nv30_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -141,6 +137,8 @@ nv30_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
gr
->
base
.
func
=
&
nv30_gr
;
ret
=
nvkm_memory_new
(
device
,
NVKM_MEM_TARGET_INST
,
32
*
4
,
16
,
true
,
ret
=
nvkm_memory_new
(
device
,
NVKM_MEM_TARGET_INST
,
32
*
4
,
16
,
true
,
&
gr
->
ctxtab
);
&
gr
->
ctxtab
);
if
(
ret
)
if
(
ret
)
...
@@ -148,8 +146,6 @@ nv30_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -148,8 +146,6 @@ nv30_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
intr
=
nv20_gr_intr
;
nv_subdev
(
gr
)
->
intr
=
nv20_gr_intr
;
nv_engine
(
gr
)
->
cclass
=
&
nv30_gr_cclass
;
nv_engine
(
gr
)
->
sclass
=
nv30_gr_sclass
;
nv_engine
(
gr
)
->
tile_prog
=
nv20_gr_tile_prog
;
nv_engine
(
gr
)
->
tile_prog
=
nv20_gr_tile_prog
;
return
0
;
return
0
;
}
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.c
浏览文件 @
27f3d6cf
...
@@ -5,127 +5,123 @@
...
@@ -5,127 +5,123 @@
#include <engine/fifo/chan.h>
#include <engine/fifo/chan.h>
/*******************************************************************************
/*******************************************************************************
*
Graphics object classes
*
PGRAPH context
******************************************************************************/
******************************************************************************/
static
struct
nvkm_oclass
static
const
struct
nvkm_object_func
nv34_gr_sclass
[]
=
{
nv34_gr_chan
=
{
{
0x0012
,
&
nv04_gr_ofuncs
,
NULL
},
/* beta1 */
.
dtor
=
nv20_gr_chan_dtor
,
{
0x0019
,
&
nv04_gr_ofuncs
,
NULL
},
/* clip */
.
init
=
nv20_gr_chan_init
,
{
0x0030
,
&
nv04_gr_ofuncs
,
NULL
},
/* null */
.
fini
=
nv20_gr_chan_fini
,
{
0x0039
,
&
nv04_gr_ofuncs
,
NULL
},
/* m2mf */
{
0x0043
,
&
nv04_gr_ofuncs
,
NULL
},
/* rop */
{
0x0044
,
&
nv04_gr_ofuncs
,
NULL
},
/* patt */
{
0x004a
,
&
nv04_gr_ofuncs
,
NULL
},
/* gdi */
{
0x0062
,
&
nv04_gr_ofuncs
,
NULL
},
/* surf2d */
{
0x0072
,
&
nv04_gr_ofuncs
,
NULL
},
/* beta4 */
{
0x0089
,
&
nv04_gr_ofuncs
,
NULL
},
/* sifm */
{
0x008a
,
&
nv04_gr_ofuncs
,
NULL
},
/* ifc */
{
0x009f
,
&
nv04_gr_ofuncs
,
NULL
},
/* imageblit */
{
0x0362
,
&
nv04_gr_ofuncs
,
NULL
},
/* surf2d (nv30) */
{
0x0389
,
&
nv04_gr_ofuncs
,
NULL
},
/* sifm (nv30) */
{
0x038a
,
&
nv04_gr_ofuncs
,
NULL
},
/* ifc (nv30) */
{
0x039e
,
&
nv04_gr_ofuncs
,
NULL
},
/* swzsurf (nv30) */
{
0x0697
,
&
nv04_gr_ofuncs
,
NULL
},
/* rankine */
{},
};
};
/*******************************************************************************
* PGRAPH context
******************************************************************************/
static
int
static
int
nv34_gr_context_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv34_gr_chan_new
(
struct
nvkm_gr
*
base
,
struct
nvkm_fifo_chan
*
fifoch
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
struct
nvkm_object
**
pobject
)
{
{
struct
nv20_gr
*
gr
=
nv20_gr
(
base
);
struct
nv20_gr_chan
*
chan
;
struct
nv20_gr_chan
*
chan
;
struct
nvkm_gpuobj
*
image
;
int
ret
,
i
;
int
ret
,
i
;
ret
=
nvkm_gr_context_create
(
parent
,
engine
,
oclass
,
NULL
,
0x46dc
,
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
16
,
NVOBJ_FLAG_ZERO_ALLOC
,
&
chan
);
return
-
ENOMEM
;
*
pobject
=
nv_object
(
chan
);
nvkm_object_ctor
(
&
nv34_gr_chan
,
oclass
,
&
chan
->
object
);
chan
->
gr
=
gr
;
chan
->
chid
=
fifoch
->
chid
;
*
pobject
=
&
chan
->
object
;
ret
=
nvkm_memory_new
(
gr
->
base
.
engine
.
subdev
.
device
,
NVKM_MEM_TARGET_INST
,
0x46dc
,
16
,
true
,
&
chan
->
inst
);
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
chan
->
chid
=
nvkm_fifo_chan
(
parent
)
->
chid
;
nvkm_kmap
(
chan
->
inst
);
image
=
&
chan
->
base
.
base
.
gpuobj
;
nvkm_wo32
(
chan
->
inst
,
0x0028
,
0x00000001
|
(
chan
->
chid
<<
24
));
nvkm_wo32
(
chan
->
inst
,
0x040c
,
0x01000101
);
nvkm_kmap
(
image
);
nvkm_wo32
(
chan
->
inst
,
0x0420
,
0x00000111
);
nvkm_wo32
(
image
,
0x0028
,
0x00000001
|
(
chan
->
chid
<<
24
));
nvkm_wo32
(
chan
->
inst
,
0x0424
,
0x00000060
);
nvkm_wo32
(
image
,
0x040c
,
0x01000101
);
nvkm_wo32
(
chan
->
inst
,
0x0440
,
0x00000080
);
nvkm_wo32
(
image
,
0x0420
,
0x00000111
);
nvkm_wo32
(
chan
->
inst
,
0x0444
,
0xffff0000
);
nvkm_wo32
(
image
,
0x0424
,
0x00000060
);
nvkm_wo32
(
chan
->
inst
,
0x0448
,
0x00000001
);
nvkm_wo32
(
image
,
0x0440
,
0x00000080
);
nvkm_wo32
(
chan
->
inst
,
0x045c
,
0x44400000
);
nvkm_wo32
(
image
,
0x0444
,
0xffff0000
);
nvkm_wo32
(
chan
->
inst
,
0x0480
,
0xffff0000
);
nvkm_wo32
(
image
,
0x0448
,
0x00000001
);
nvkm_wo32
(
image
,
0x045c
,
0x44400000
);
nvkm_wo32
(
image
,
0x0480
,
0xffff0000
);
for
(
i
=
0x04d4
;
i
<
0x04dc
;
i
+=
4
)
for
(
i
=
0x04d4
;
i
<
0x04dc
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x0fff0000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x0fff0000
);
nvkm_wo32
(
image
,
0x04e0
,
0x00011100
);
nvkm_wo32
(
chan
->
inst
,
0x04e0
,
0x00011100
);
for
(
i
=
0x04fc
;
i
<
0x053c
;
i
+=
4
)
for
(
i
=
0x04fc
;
i
<
0x053c
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x07ff0000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x07ff0000
);
nvkm_wo32
(
image
,
0x0544
,
0x4b7fffff
);
nvkm_wo32
(
chan
->
inst
,
0x0544
,
0x4b7fffff
);
nvkm_wo32
(
image
,
0x057c
,
0x00000080
);
nvkm_wo32
(
chan
->
inst
,
0x057c
,
0x00000080
);
nvkm_wo32
(
image
,
0x0580
,
0x30201000
);
nvkm_wo32
(
chan
->
inst
,
0x0580
,
0x30201000
);
nvkm_wo32
(
image
,
0x0584
,
0x70605040
);
nvkm_wo32
(
chan
->
inst
,
0x0584
,
0x70605040
);
nvkm_wo32
(
image
,
0x0588
,
0xb8a89888
);
nvkm_wo32
(
chan
->
inst
,
0x0588
,
0xb8a89888
);
nvkm_wo32
(
image
,
0x058c
,
0xf8e8d8c8
);
nvkm_wo32
(
chan
->
inst
,
0x058c
,
0xf8e8d8c8
);
nvkm_wo32
(
image
,
0x05a0
,
0xb0000000
);
nvkm_wo32
(
chan
->
inst
,
0x05a0
,
0xb0000000
);
for
(
i
=
0x05f0
;
i
<
0x0630
;
i
+=
4
)
for
(
i
=
0x05f0
;
i
<
0x0630
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00010588
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00010588
);
for
(
i
=
0x0630
;
i
<
0x0670
;
i
+=
4
)
for
(
i
=
0x0630
;
i
<
0x0670
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00030303
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00030303
);
for
(
i
=
0x06b0
;
i
<
0x06f0
;
i
+=
4
)
for
(
i
=
0x06b0
;
i
<
0x06f0
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x0008aae4
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x0008aae4
);
for
(
i
=
0x06f0
;
i
<
0x0730
;
i
+=
4
)
for
(
i
=
0x06f0
;
i
<
0x0730
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x01012000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x01012000
);
for
(
i
=
0x0730
;
i
<
0x0770
;
i
+=
4
)
for
(
i
=
0x0730
;
i
<
0x0770
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00080008
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00080008
);
nvkm_wo32
(
image
,
0x0850
,
0x00040000
);
nvkm_wo32
(
chan
->
inst
,
0x0850
,
0x00040000
);
nvkm_wo32
(
image
,
0x0854
,
0x00010000
);
nvkm_wo32
(
chan
->
inst
,
0x0854
,
0x00010000
);
for
(
i
=
0x0858
;
i
<
0x0868
;
i
+=
4
)
for
(
i
=
0x0858
;
i
<
0x0868
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00040004
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00040004
);
for
(
i
=
0x15ac
;
i
<=
0x271c
;
i
+=
16
)
{
for
(
i
=
0x15ac
;
i
<=
0x271c
;
i
+=
16
)
{
nvkm_wo32
(
image
,
i
+
0
,
0x10700ff9
);
nvkm_wo32
(
chan
->
inst
,
i
+
0
,
0x10700ff9
);
nvkm_wo32
(
image
,
i
+
1
,
0x0436086c
);
nvkm_wo32
(
chan
->
inst
,
i
+
1
,
0x0436086c
);
nvkm_wo32
(
image
,
i
+
2
,
0x000c001b
);
nvkm_wo32
(
chan
->
inst
,
i
+
2
,
0x000c001b
);
}
}
for
(
i
=
0x274c
;
i
<
0x275c
;
i
+=
4
)
for
(
i
=
0x274c
;
i
<
0x275c
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x0000ffff
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x0000ffff
);
nvkm_wo32
(
image
,
0x2ae0
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x2ae0
,
0x3f800000
);
nvkm_wo32
(
image
,
0x2e9c
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x2e9c
,
0x3f800000
);
nvkm_wo32
(
image
,
0x2eb0
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x2eb0
,
0x3f800000
);
nvkm_wo32
(
image
,
0x2edc
,
0x40000000
);
nvkm_wo32
(
chan
->
inst
,
0x2edc
,
0x40000000
);
nvkm_wo32
(
image
,
0x2ee0
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x2ee0
,
0x3f800000
);
nvkm_wo32
(
image
,
0x2ee4
,
0x3f000000
);
nvkm_wo32
(
chan
->
inst
,
0x2ee4
,
0x3f000000
);
nvkm_wo32
(
image
,
0x2eec
,
0x40000000
);
nvkm_wo32
(
chan
->
inst
,
0x2eec
,
0x40000000
);
nvkm_wo32
(
image
,
0x2ef0
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x2ef0
,
0x3f800000
);
nvkm_wo32
(
image
,
0x2ef8
,
0xbf800000
);
nvkm_wo32
(
chan
->
inst
,
0x2ef8
,
0xbf800000
);
nvkm_wo32
(
image
,
0x2f00
,
0xbf800000
);
nvkm_wo32
(
chan
->
inst
,
0x2f00
,
0xbf800000
);
nvkm_done
(
image
);
nvkm_done
(
chan
->
inst
);
return
0
;
return
0
;
}
}
static
struct
nvkm_oclass
nv34_gr_cclass
=
{
.
handle
=
NV_ENGCTX
(
GR
,
0x34
),
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
nv34_gr_context_ctor
,
.
dtor
=
_nvkm_gr_context_dtor
,
.
init
=
nv20_gr_context_init
,
.
fini
=
nv20_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
static
const
struct
nvkm_gr_func
nv34_gr
=
{
.
chan_new
=
nv34_gr_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
0x0012
,
&
nv04_gr_object
},
/* beta1 */
{
-
1
,
-
1
,
0x0019
,
&
nv04_gr_object
},
/* clip */
{
-
1
,
-
1
,
0x0030
,
&
nv04_gr_object
},
/* null */
{
-
1
,
-
1
,
0x0039
,
&
nv04_gr_object
},
/* m2mf */
{
-
1
,
-
1
,
0x0043
,
&
nv04_gr_object
},
/* rop */
{
-
1
,
-
1
,
0x0044
,
&
nv04_gr_object
},
/* patt */
{
-
1
,
-
1
,
0x004a
,
&
nv04_gr_object
},
/* gdi */
{
-
1
,
-
1
,
0x0062
,
&
nv04_gr_object
},
/* surf2d */
{
-
1
,
-
1
,
0x0072
,
&
nv04_gr_object
},
/* beta4 */
{
-
1
,
-
1
,
0x0089
,
&
nv04_gr_object
},
/* sifm */
{
-
1
,
-
1
,
0x008a
,
&
nv04_gr_object
},
/* ifc */
{
-
1
,
-
1
,
0x009f
,
&
nv04_gr_object
},
/* imageblit */
{
-
1
,
-
1
,
0x0362
,
&
nv04_gr_object
},
/* surf2d (nv30) */
{
-
1
,
-
1
,
0x0389
,
&
nv04_gr_object
},
/* sifm (nv30) */
{
-
1
,
-
1
,
0x038a
,
&
nv04_gr_object
},
/* ifc (nv30) */
{
-
1
,
-
1
,
0x039e
,
&
nv04_gr_object
},
/* swzsurf (nv30) */
{
-
1
,
-
1
,
0x0697
,
&
nv04_gr_object
},
/* rankine */
{}
}
};
static
int
static
int
nv34_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv34_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
@@ -140,6 +136,8 @@ nv34_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -140,6 +136,8 @@ nv34_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
gr
->
base
.
func
=
&
nv34_gr
;
ret
=
nvkm_memory_new
(
device
,
NVKM_MEM_TARGET_INST
,
32
*
4
,
16
,
true
,
ret
=
nvkm_memory_new
(
device
,
NVKM_MEM_TARGET_INST
,
32
*
4
,
16
,
true
,
&
gr
->
ctxtab
);
&
gr
->
ctxtab
);
if
(
ret
)
if
(
ret
)
...
@@ -147,8 +145,6 @@ nv34_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -147,8 +145,6 @@ nv34_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
intr
=
nv20_gr_intr
;
nv_subdev
(
gr
)
->
intr
=
nv20_gr_intr
;
nv_engine
(
gr
)
->
cclass
=
&
nv34_gr_cclass
;
nv_engine
(
gr
)
->
sclass
=
nv34_gr_sclass
;
nv_engine
(
gr
)
->
tile_prog
=
nv20_gr_tile_prog
;
nv_engine
(
gr
)
->
tile_prog
=
nv20_gr_tile_prog
;
return
0
;
return
0
;
}
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv35.c
浏览文件 @
27f3d6cf
...
@@ -5,127 +5,123 @@
...
@@ -5,127 +5,123 @@
#include <engine/fifo/chan.h>
#include <engine/fifo/chan.h>
/*******************************************************************************
/*******************************************************************************
*
Graphics object classes
*
PGRAPH context
******************************************************************************/
******************************************************************************/
static
struct
nvkm_oclass
static
const
struct
nvkm_object_func
nv35_gr_sclass
[]
=
{
nv35_gr_chan
=
{
{
0x0012
,
&
nv04_gr_ofuncs
,
NULL
},
/* beta1 */
.
dtor
=
nv20_gr_chan_dtor
,
{
0x0019
,
&
nv04_gr_ofuncs
,
NULL
},
/* clip */
.
init
=
nv20_gr_chan_init
,
{
0x0030
,
&
nv04_gr_ofuncs
,
NULL
},
/* null */
.
fini
=
nv20_gr_chan_fini
,
{
0x0039
,
&
nv04_gr_ofuncs
,
NULL
},
/* m2mf */
{
0x0043
,
&
nv04_gr_ofuncs
,
NULL
},
/* rop */
{
0x0044
,
&
nv04_gr_ofuncs
,
NULL
},
/* patt */
{
0x004a
,
&
nv04_gr_ofuncs
,
NULL
},
/* gdi */
{
0x0062
,
&
nv04_gr_ofuncs
,
NULL
},
/* surf2d */
{
0x0072
,
&
nv04_gr_ofuncs
,
NULL
},
/* beta4 */
{
0x0089
,
&
nv04_gr_ofuncs
,
NULL
},
/* sifm */
{
0x008a
,
&
nv04_gr_ofuncs
,
NULL
},
/* ifc */
{
0x009f
,
&
nv04_gr_ofuncs
,
NULL
},
/* imageblit */
{
0x0362
,
&
nv04_gr_ofuncs
,
NULL
},
/* surf2d (nv30) */
{
0x0389
,
&
nv04_gr_ofuncs
,
NULL
},
/* sifm (nv30) */
{
0x038a
,
&
nv04_gr_ofuncs
,
NULL
},
/* ifc (nv30) */
{
0x039e
,
&
nv04_gr_ofuncs
,
NULL
},
/* swzsurf (nv30) */
{
0x0497
,
&
nv04_gr_ofuncs
,
NULL
},
/* rankine */
{},
};
};
/*******************************************************************************
* PGRAPH context
******************************************************************************/
static
int
static
int
nv35_gr_context_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv35_gr_chan_new
(
struct
nvkm_gr
*
base
,
struct
nvkm_fifo_chan
*
fifoch
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
struct
nvkm_object
**
pobject
)
{
{
struct
nv20_gr
*
gr
=
nv20_gr
(
base
);
struct
nv20_gr_chan
*
chan
;
struct
nv20_gr_chan
*
chan
;
struct
nvkm_gpuobj
*
image
;
int
ret
,
i
;
int
ret
,
i
;
ret
=
nvkm_gr_context_create
(
parent
,
engine
,
oclass
,
NULL
,
0x577c
,
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
16
,
NVOBJ_FLAG_ZERO_ALLOC
,
&
chan
);
return
-
ENOMEM
;
*
pobject
=
nv_object
(
chan
);
nvkm_object_ctor
(
&
nv35_gr_chan
,
oclass
,
&
chan
->
object
);
chan
->
gr
=
gr
;
chan
->
chid
=
fifoch
->
chid
;
*
pobject
=
&
chan
->
object
;
ret
=
nvkm_memory_new
(
gr
->
base
.
engine
.
subdev
.
device
,
NVKM_MEM_TARGET_INST
,
0x577c
,
16
,
true
,
&
chan
->
inst
);
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
chan
->
chid
=
nvkm_fifo_chan
(
parent
)
->
chid
;
nvkm_kmap
(
chan
->
inst
);
image
=
&
chan
->
base
.
base
.
gpuobj
;
nvkm_wo32
(
chan
->
inst
,
0x0028
,
0x00000001
|
(
chan
->
chid
<<
24
));
nvkm_wo32
(
chan
->
inst
,
0x040c
,
0x00000101
);
nvkm_kmap
(
image
);
nvkm_wo32
(
chan
->
inst
,
0x0420
,
0x00000111
);
nvkm_wo32
(
image
,
0x0028
,
0x00000001
|
(
chan
->
chid
<<
24
));
nvkm_wo32
(
chan
->
inst
,
0x0424
,
0x00000060
);
nvkm_wo32
(
image
,
0x040c
,
0x00000101
);
nvkm_wo32
(
chan
->
inst
,
0x0440
,
0x00000080
);
nvkm_wo32
(
image
,
0x0420
,
0x00000111
);
nvkm_wo32
(
chan
->
inst
,
0x0444
,
0xffff0000
);
nvkm_wo32
(
image
,
0x0424
,
0x00000060
);
nvkm_wo32
(
chan
->
inst
,
0x0448
,
0x00000001
);
nvkm_wo32
(
image
,
0x0440
,
0x00000080
);
nvkm_wo32
(
chan
->
inst
,
0x045c
,
0x44400000
);
nvkm_wo32
(
image
,
0x0444
,
0xffff0000
);
nvkm_wo32
(
chan
->
inst
,
0x0488
,
0xffff0000
);
nvkm_wo32
(
image
,
0x0448
,
0x00000001
);
nvkm_wo32
(
image
,
0x045c
,
0x44400000
);
nvkm_wo32
(
image
,
0x0488
,
0xffff0000
);
for
(
i
=
0x04dc
;
i
<
0x04e4
;
i
+=
4
)
for
(
i
=
0x04dc
;
i
<
0x04e4
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x0fff0000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x0fff0000
);
nvkm_wo32
(
image
,
0x04e8
,
0x00011100
);
nvkm_wo32
(
chan
->
inst
,
0x04e8
,
0x00011100
);
for
(
i
=
0x0504
;
i
<
0x0544
;
i
+=
4
)
for
(
i
=
0x0504
;
i
<
0x0544
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x07ff0000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x07ff0000
);
nvkm_wo32
(
image
,
0x054c
,
0x4b7fffff
);
nvkm_wo32
(
chan
->
inst
,
0x054c
,
0x4b7fffff
);
nvkm_wo32
(
image
,
0x0588
,
0x00000080
);
nvkm_wo32
(
chan
->
inst
,
0x0588
,
0x00000080
);
nvkm_wo32
(
image
,
0x058c
,
0x30201000
);
nvkm_wo32
(
chan
->
inst
,
0x058c
,
0x30201000
);
nvkm_wo32
(
image
,
0x0590
,
0x70605040
);
nvkm_wo32
(
chan
->
inst
,
0x0590
,
0x70605040
);
nvkm_wo32
(
image
,
0x0594
,
0xb8a89888
);
nvkm_wo32
(
chan
->
inst
,
0x0594
,
0xb8a89888
);
nvkm_wo32
(
image
,
0x0598
,
0xf8e8d8c8
);
nvkm_wo32
(
chan
->
inst
,
0x0598
,
0xf8e8d8c8
);
nvkm_wo32
(
image
,
0x05ac
,
0xb0000000
);
nvkm_wo32
(
chan
->
inst
,
0x05ac
,
0xb0000000
);
for
(
i
=
0x0604
;
i
<
0x0644
;
i
+=
4
)
for
(
i
=
0x0604
;
i
<
0x0644
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00010588
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00010588
);
for
(
i
=
0x0644
;
i
<
0x0684
;
i
+=
4
)
for
(
i
=
0x0644
;
i
<
0x0684
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00030303
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00030303
);
for
(
i
=
0x06c4
;
i
<
0x0704
;
i
+=
4
)
for
(
i
=
0x06c4
;
i
<
0x0704
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x0008aae4
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x0008aae4
);
for
(
i
=
0x0704
;
i
<
0x0744
;
i
+=
4
)
for
(
i
=
0x0704
;
i
<
0x0744
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x01012000
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x01012000
);
for
(
i
=
0x0744
;
i
<
0x0784
;
i
+=
4
)
for
(
i
=
0x0744
;
i
<
0x0784
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00080008
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00080008
);
nvkm_wo32
(
image
,
0x0860
,
0x00040000
);
nvkm_wo32
(
chan
->
inst
,
0x0860
,
0x00040000
);
nvkm_wo32
(
image
,
0x0864
,
0x00010000
);
nvkm_wo32
(
chan
->
inst
,
0x0864
,
0x00010000
);
for
(
i
=
0x0868
;
i
<
0x0878
;
i
+=
4
)
for
(
i
=
0x0868
;
i
<
0x0878
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x00040004
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x00040004
);
for
(
i
=
0x1f1c
;
i
<=
0x308c
;
i
+=
16
)
{
for
(
i
=
0x1f1c
;
i
<=
0x308c
;
i
+=
16
)
{
nvkm_wo32
(
image
,
i
+
0
,
0x10700ff9
);
nvkm_wo32
(
chan
->
inst
,
i
+
0
,
0x10700ff9
);
nvkm_wo32
(
image
,
i
+
4
,
0x0436086c
);
nvkm_wo32
(
chan
->
inst
,
i
+
4
,
0x0436086c
);
nvkm_wo32
(
image
,
i
+
8
,
0x000c001b
);
nvkm_wo32
(
chan
->
inst
,
i
+
8
,
0x000c001b
);
}
}
for
(
i
=
0x30bc
;
i
<
0x30cc
;
i
+=
4
)
for
(
i
=
0x30bc
;
i
<
0x30cc
;
i
+=
4
)
nvkm_wo32
(
image
,
i
,
0x0000ffff
);
nvkm_wo32
(
chan
->
inst
,
i
,
0x0000ffff
);
nvkm_wo32
(
image
,
0x3450
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x3450
,
0x3f800000
);
nvkm_wo32
(
image
,
0x380c
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x380c
,
0x3f800000
);
nvkm_wo32
(
image
,
0x3820
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x3820
,
0x3f800000
);
nvkm_wo32
(
image
,
0x384c
,
0x40000000
);
nvkm_wo32
(
chan
->
inst
,
0x384c
,
0x40000000
);
nvkm_wo32
(
image
,
0x3850
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x3850
,
0x3f800000
);
nvkm_wo32
(
image
,
0x3854
,
0x3f000000
);
nvkm_wo32
(
chan
->
inst
,
0x3854
,
0x3f000000
);
nvkm_wo32
(
image
,
0x385c
,
0x40000000
);
nvkm_wo32
(
chan
->
inst
,
0x385c
,
0x40000000
);
nvkm_wo32
(
image
,
0x3860
,
0x3f800000
);
nvkm_wo32
(
chan
->
inst
,
0x3860
,
0x3f800000
);
nvkm_wo32
(
image
,
0x3868
,
0xbf800000
);
nvkm_wo32
(
chan
->
inst
,
0x3868
,
0xbf800000
);
nvkm_wo32
(
image
,
0x3870
,
0xbf800000
);
nvkm_wo32
(
chan
->
inst
,
0x3870
,
0xbf800000
);
nvkm_done
(
image
);
nvkm_done
(
chan
->
inst
);
return
0
;
return
0
;
}
}
static
struct
nvkm_oclass
nv35_gr_cclass
=
{
.
handle
=
NV_ENGCTX
(
GR
,
0x35
),
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
nv35_gr_context_ctor
,
.
dtor
=
_nvkm_gr_context_dtor
,
.
init
=
nv20_gr_context_init
,
.
fini
=
nv20_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
static
const
struct
nvkm_gr_func
nv35_gr
=
{
.
chan_new
=
nv35_gr_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
0x0012
,
&
nv04_gr_object
},
/* beta1 */
{
-
1
,
-
1
,
0x0019
,
&
nv04_gr_object
},
/* clip */
{
-
1
,
-
1
,
0x0030
,
&
nv04_gr_object
},
/* null */
{
-
1
,
-
1
,
0x0039
,
&
nv04_gr_object
},
/* m2mf */
{
-
1
,
-
1
,
0x0043
,
&
nv04_gr_object
},
/* rop */
{
-
1
,
-
1
,
0x0044
,
&
nv04_gr_object
},
/* patt */
{
-
1
,
-
1
,
0x004a
,
&
nv04_gr_object
},
/* gdi */
{
-
1
,
-
1
,
0x0062
,
&
nv04_gr_object
},
/* surf2d */
{
-
1
,
-
1
,
0x0072
,
&
nv04_gr_object
},
/* beta4 */
{
-
1
,
-
1
,
0x0089
,
&
nv04_gr_object
},
/* sifm */
{
-
1
,
-
1
,
0x008a
,
&
nv04_gr_object
},
/* ifc */
{
-
1
,
-
1
,
0x009f
,
&
nv04_gr_object
},
/* imageblit */
{
-
1
,
-
1
,
0x0362
,
&
nv04_gr_object
},
/* surf2d (nv30) */
{
-
1
,
-
1
,
0x0389
,
&
nv04_gr_object
},
/* sifm (nv30) */
{
-
1
,
-
1
,
0x038a
,
&
nv04_gr_object
},
/* ifc (nv30) */
{
-
1
,
-
1
,
0x039e
,
&
nv04_gr_object
},
/* swzsurf (nv30) */
{
-
1
,
-
1
,
0x0497
,
&
nv04_gr_object
},
/* rankine */
{}
}
};
static
int
static
int
nv35_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv35_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
@@ -140,6 +136,8 @@ nv35_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -140,6 +136,8 @@ nv35_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
gr
->
base
.
func
=
&
nv35_gr
;
ret
=
nvkm_memory_new
(
device
,
NVKM_MEM_TARGET_INST
,
32
*
4
,
16
,
true
,
ret
=
nvkm_memory_new
(
device
,
NVKM_MEM_TARGET_INST
,
32
*
4
,
16
,
true
,
&
gr
->
ctxtab
);
&
gr
->
ctxtab
);
if
(
ret
)
if
(
ret
)
...
@@ -147,8 +145,6 @@ nv35_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -147,8 +145,6 @@ nv35_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
intr
=
nv20_gr_intr
;
nv_subdev
(
gr
)
->
intr
=
nv20_gr_intr
;
nv_engine
(
gr
)
->
cclass
=
&
nv35_gr_cclass
;
nv_engine
(
gr
)
->
sclass
=
nv35_gr_sclass
;
nv_engine
(
gr
)
->
tile_prog
=
nv20_gr_tile_prog
;
nv_engine
(
gr
)
->
tile_prog
=
nv20_gr_tile_prog
;
return
0
;
return
0
;
}
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.c
浏览文件 @
27f3d6cf
...
@@ -29,19 +29,6 @@
...
@@ -29,19 +29,6 @@
#include <subdev/timer.h>
#include <subdev/timer.h>
#include <engine/fifo.h>
#include <engine/fifo.h>
struct
nv40_gr
{
struct
nvkm_gr
base
;
u32
size
;
struct
list_head
chan
;
};
struct
nv40_gr_chan
{
struct
nvkm_gr_chan
base
;
struct
nvkm_fifo_chan
*
fifo
;
u32
inst
;
struct
list_head
head
;
};
static
u64
static
u64
nv40_gr_units
(
struct
nvkm_gr
*
gr
)
nv40_gr_units
(
struct
nvkm_gr
*
gr
)
{
{
...
@@ -53,133 +40,61 @@ nv40_gr_units(struct nvkm_gr *gr)
...
@@ -53,133 +40,61 @@ nv40_gr_units(struct nvkm_gr *gr)
******************************************************************************/
******************************************************************************/
static
int
static
int
nv40_gr_object_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv40_gr_object_bind
(
struct
nvkm_object
*
object
,
struct
nvkm_gpuobj
*
parent
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
int
align
,
struct
nvkm_gpuobj
**
pgpuobj
)
struct
nvkm_object
**
pobject
)
{
{
struct
nvkm_gpuobj
*
obj
;
int
ret
=
nvkm_gpuobj_new
(
object
->
engine
->
subdev
.
device
,
20
,
align
,
int
ret
;
false
,
parent
,
pgpuobj
);
if
(
ret
==
0
)
{
ret
=
nvkm_gpuobj_create
(
parent
,
engine
,
oclass
,
0
,
parent
,
nvkm_kmap
(
*
pgpuobj
);
20
,
16
,
0
,
&
obj
);
nvkm_wo32
(
*
pgpuobj
,
0x00
,
object
->
oclass_name
);
*
pobject
=
nv_object
(
obj
);
nvkm_wo32
(
*
pgpuobj
,
0x04
,
0x00000000
);
if
(
ret
)
nvkm_wo32
(
*
pgpuobj
,
0x08
,
0x00000000
);
return
ret
;
nvkm_kmap
(
obj
);
nvkm_wo32
(
obj
,
0x00
,
nv_mclass
(
obj
));
nvkm_wo32
(
obj
,
0x04
,
0x00000000
);
nvkm_wo32
(
obj
,
0x08
,
0x00000000
);
#ifdef __BIG_ENDIAN
#ifdef __BIG_ENDIAN
nvkm_mo32
(
obj
,
0x08
,
0x01000000
,
0x01000000
);
nvkm_mo32
(
*
pgpu
obj
,
0x08
,
0x01000000
,
0x01000000
);
#endif
#endif
nvkm_wo32
(
obj
,
0x0c
,
0x00000000
);
nvkm_wo32
(
*
pgpuobj
,
0x0c
,
0x00000000
);
nvkm_wo32
(
obj
,
0x10
,
0x00000000
);
nvkm_wo32
(
*
pgpuobj
,
0x10
,
0x00000000
);
nvkm_done
(
obj
);
nvkm_done
(
*
pgpuobj
);
return
0
;
}
return
ret
;
}
}
static
struct
nvkm_ofuncs
static
const
struct
nvkm_object_func
nv40_gr_ofuncs
=
{
nv40_gr_object
=
{
.
ctor
=
nv40_gr_object_ctor
,
.
bind
=
nv40_gr_object_bind
,
.
dtor
=
_nvkm_gpuobj_dtor
,
.
init
=
_nvkm_gpuobj_init
,
.
fini
=
_nvkm_gpuobj_fini
,
.
rd32
=
_nvkm_gpuobj_rd32
,
.
wr32
=
_nvkm_gpuobj_wr32
,
};
static
struct
nvkm_oclass
nv40_gr_sclass
[]
=
{
{
0x0012
,
&
nv40_gr_ofuncs
,
NULL
},
/* beta1 */
{
0x0019
,
&
nv40_gr_ofuncs
,
NULL
},
/* clip */
{
0x0030
,
&
nv40_gr_ofuncs
,
NULL
},
/* null */
{
0x0039
,
&
nv40_gr_ofuncs
,
NULL
},
/* m2mf */
{
0x0043
,
&
nv40_gr_ofuncs
,
NULL
},
/* rop */
{
0x0044
,
&
nv40_gr_ofuncs
,
NULL
},
/* patt */
{
0x004a
,
&
nv40_gr_ofuncs
,
NULL
},
/* gdi */
{
0x0062
,
&
nv40_gr_ofuncs
,
NULL
},
/* surf2d */
{
0x0072
,
&
nv40_gr_ofuncs
,
NULL
},
/* beta4 */
{
0x0089
,
&
nv40_gr_ofuncs
,
NULL
},
/* sifm */
{
0x008a
,
&
nv40_gr_ofuncs
,
NULL
},
/* ifc */
{
0x009f
,
&
nv40_gr_ofuncs
,
NULL
},
/* imageblit */
{
0x3062
,
&
nv40_gr_ofuncs
,
NULL
},
/* surf2d (nv40) */
{
0x3089
,
&
nv40_gr_ofuncs
,
NULL
},
/* sifm (nv40) */
{
0x309e
,
&
nv40_gr_ofuncs
,
NULL
},
/* swzsurf (nv40) */
{
0x4097
,
&
nv40_gr_ofuncs
,
NULL
},
/* curie */
{},
};
static
struct
nvkm_oclass
nv44_gr_sclass
[]
=
{
{
0x0012
,
&
nv40_gr_ofuncs
,
NULL
},
/* beta1 */
{
0x0019
,
&
nv40_gr_ofuncs
,
NULL
},
/* clip */
{
0x0030
,
&
nv40_gr_ofuncs
,
NULL
},
/* null */
{
0x0039
,
&
nv40_gr_ofuncs
,
NULL
},
/* m2mf */
{
0x0043
,
&
nv40_gr_ofuncs
,
NULL
},
/* rop */
{
0x0044
,
&
nv40_gr_ofuncs
,
NULL
},
/* patt */
{
0x004a
,
&
nv40_gr_ofuncs
,
NULL
},
/* gdi */
{
0x0062
,
&
nv40_gr_ofuncs
,
NULL
},
/* surf2d */
{
0x0072
,
&
nv40_gr_ofuncs
,
NULL
},
/* beta4 */
{
0x0089
,
&
nv40_gr_ofuncs
,
NULL
},
/* sifm */
{
0x008a
,
&
nv40_gr_ofuncs
,
NULL
},
/* ifc */
{
0x009f
,
&
nv40_gr_ofuncs
,
NULL
},
/* imageblit */
{
0x3062
,
&
nv40_gr_ofuncs
,
NULL
},
/* surf2d (nv40) */
{
0x3089
,
&
nv40_gr_ofuncs
,
NULL
},
/* sifm (nv40) */
{
0x309e
,
&
nv40_gr_ofuncs
,
NULL
},
/* swzsurf (nv40) */
{
0x4497
,
&
nv40_gr_ofuncs
,
NULL
},
/* curie */
{},
};
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH context
* PGRAPH context
******************************************************************************/
******************************************************************************/
static
void
nv40_gr_context_dtor
(
struct
nvkm_object
*
object
)
{
struct
nv40_gr_chan
*
chan
=
(
void
*
)
object
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
object
->
engine
->
lock
,
flags
);
list_del
(
&
chan
->
head
);
spin_unlock_irqrestore
(
&
object
->
engine
->
lock
,
flags
);
}
static
int
static
int
nv40_gr_context_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv40_gr_chan_bind
(
struct
nvkm_object
*
object
,
struct
nvkm_gpuobj
*
parent
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
int
align
,
struct
nvkm_gpuobj
**
pgpuobj
)
struct
nvkm_object
**
pobject
)
{
{
struct
nv40_gr
*
gr
=
(
void
*
)
engine
;
struct
nv40_gr_chan
*
chan
=
nv40_gr_chan
(
object
);
struct
nv40_gr_chan
*
chan
;
struct
nv40_gr
*
gr
=
chan
->
gr
;
unsigned
long
flags
;
int
ret
=
nvkm_gpuobj_new
(
gr
->
base
.
engine
.
subdev
.
device
,
gr
->
size
,
int
ret
;
align
,
true
,
parent
,
pgpuobj
);
if
(
ret
==
0
)
{
ret
=
nvkm_gr_context_create
(
parent
,
engine
,
oclass
,
NULL
,
gr
->
size
,
chan
->
inst
=
(
*
pgpuobj
)
->
addr
;
16
,
NVOBJ_FLAG_ZERO_ALLOC
,
&
chan
);
nvkm_kmap
(
*
pgpuobj
);
*
pobject
=
nv_object
(
chan
);
nv40_grctx_fill
(
gr
->
base
.
engine
.
subdev
.
device
,
*
pgpuobj
);
if
(
ret
)
nvkm_wo32
(
*
pgpuobj
,
0x00000
,
chan
->
inst
>>
4
);
nvkm_done
(
*
pgpuobj
);
}
return
ret
;
return
ret
;
nv40_grctx_fill
(
nv_device
(
gr
),
nv_gpuobj
(
chan
));
nvkm_wo32
(
&
chan
->
base
.
base
.
gpuobj
,
0x00000
,
nv_gpuobj
(
chan
)
->
addr
>>
4
);
spin_lock_irqsave
(
&
gr
->
base
.
engine
.
lock
,
flags
);
chan
->
fifo
=
(
void
*
)
parent
;
chan
->
inst
=
chan
->
base
.
base
.
gpuobj
.
addr
;
list_add
(
&
chan
->
head
,
&
gr
->
chan
);
spin_unlock_irqrestore
(
&
gr
->
base
.
engine
.
lock
,
flags
);
return
0
;
}
}
static
int
static
int
nv40_gr_c
ontext
_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
nv40_gr_c
han
_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
{
{
struct
nv40_gr
*
gr
=
(
void
*
)
object
->
engine
;
struct
nv40_gr
_chan
*
chan
=
nv40_gr_chan
(
object
)
;
struct
nv40_gr
_chan
*
chan
=
(
void
*
)
object
;
struct
nv40_gr
*
gr
=
chan
->
gr
;
struct
nvkm_subdev
*
subdev
=
&
gr
->
base
.
engine
.
subdev
;
struct
nvkm_subdev
*
subdev
=
&
gr
->
base
.
engine
.
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
struct
nvkm_device
*
device
=
subdev
->
device
;
u32
inst
=
0x01000000
|
nv_gpuobj
(
chan
)
->
addr
>>
4
;
u32
inst
=
0x01000000
|
chan
->
inst
>>
4
;
int
ret
=
0
;
int
ret
=
0
;
nvkm_mask
(
device
,
0x400720
,
0x00000001
,
0x00000000
);
nvkm_mask
(
device
,
0x400720
,
0x00000001
,
0x00000000
);
...
@@ -210,19 +125,44 @@ nv40_gr_context_fini(struct nvkm_object *object, bool suspend)
...
@@ -210,19 +125,44 @@ nv40_gr_context_fini(struct nvkm_object *object, bool suspend)
return
ret
;
return
ret
;
}
}
static
struct
nvkm_oclass
static
void
*
nv40_gr_cclass
=
{
nv40_gr_chan_dtor
(
struct
nvkm_object
*
object
)
.
handle
=
NV_ENGCTX
(
GR
,
0x40
),
{
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
struct
nv40_gr_chan
*
chan
=
nv40_gr_chan
(
object
);
.
ctor
=
nv40_gr_context_ctor
,
unsigned
long
flags
;
.
dtor
=
nv40_gr_context_dtor
,
spin_lock_irqsave
(
&
chan
->
gr
->
base
.
engine
.
lock
,
flags
);
.
init
=
_nvkm_gr_context_init
,
list_del
(
&
chan
->
head
);
.
fini
=
nv40_gr_context_fini
,
spin_unlock_irqrestore
(
&
chan
->
gr
->
base
.
engine
.
lock
,
flags
);
.
rd32
=
_nvkm_gr_context_rd32
,
return
chan
;
.
wr32
=
_nvkm_gr_context_wr32
,
}
},
static
const
struct
nvkm_object_func
nv40_gr_chan
=
{
.
dtor
=
nv40_gr_chan_dtor
,
.
fini
=
nv40_gr_chan_fini
,
.
bind
=
nv40_gr_chan_bind
,
};
};
static
int
nv40_gr_chan_new
(
struct
nvkm_gr
*
base
,
struct
nvkm_fifo_chan
*
fifoch
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
{
struct
nv40_gr
*
gr
=
nv40_gr
(
base
);
struct
nv40_gr_chan
*
chan
;
unsigned
long
flags
;
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
return
-
ENOMEM
;
nvkm_object_ctor
(
&
nv40_gr_chan
,
oclass
,
&
chan
->
object
);
chan
->
gr
=
gr
;
*
pobject
=
&
chan
->
object
;
spin_lock_irqsave
(
&
chan
->
gr
->
base
.
engine
.
lock
,
flags
);
list_add
(
&
chan
->
head
,
&
gr
->
chan
);
spin_unlock_irqrestore
(
&
chan
->
gr
->
base
.
engine
.
lock
,
flags
);
return
0
;
}
/*******************************************************************************
/*******************************************************************************
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
...
@@ -237,7 +177,7 @@ nv40_gr_tile_prog(struct nvkm_engine *engine, int i)
...
@@ -237,7 +177,7 @@ nv40_gr_tile_prog(struct nvkm_engine *engine, int i)
unsigned
long
flags
;
unsigned
long
flags
;
fifo
->
pause
(
fifo
,
&
flags
);
fifo
->
pause
(
fifo
,
&
flags
);
nv04_gr_idle
(
gr
);
nv04_gr_idle
(
&
gr
->
base
);
switch
(
nv_device
(
gr
)
->
chipset
)
{
switch
(
nv_device
(
gr
)
->
chipset
)
{
case
0x40
:
case
0x40
:
...
@@ -360,6 +300,54 @@ nv40_gr_intr(struct nvkm_subdev *subdev)
...
@@ -360,6 +300,54 @@ nv40_gr_intr(struct nvkm_subdev *subdev)
spin_unlock_irqrestore
(
&
gr
->
base
.
engine
.
lock
,
flags
);
spin_unlock_irqrestore
(
&
gr
->
base
.
engine
.
lock
,
flags
);
}
}
static
const
struct
nvkm_gr_func
nv40_gr
=
{
.
chan_new
=
nv40_gr_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
0x0012
,
&
nv40_gr_object
},
/* beta1 */
{
-
1
,
-
1
,
0x0019
,
&
nv40_gr_object
},
/* clip */
{
-
1
,
-
1
,
0x0030
,
&
nv40_gr_object
},
/* null */
{
-
1
,
-
1
,
0x0039
,
&
nv40_gr_object
},
/* m2mf */
{
-
1
,
-
1
,
0x0043
,
&
nv40_gr_object
},
/* rop */
{
-
1
,
-
1
,
0x0044
,
&
nv40_gr_object
},
/* patt */
{
-
1
,
-
1
,
0x004a
,
&
nv40_gr_object
},
/* gdi */
{
-
1
,
-
1
,
0x0062
,
&
nv40_gr_object
},
/* surf2d */
{
-
1
,
-
1
,
0x0072
,
&
nv40_gr_object
},
/* beta4 */
{
-
1
,
-
1
,
0x0089
,
&
nv40_gr_object
},
/* sifm */
{
-
1
,
-
1
,
0x008a
,
&
nv40_gr_object
},
/* ifc */
{
-
1
,
-
1
,
0x009f
,
&
nv40_gr_object
},
/* imageblit */
{
-
1
,
-
1
,
0x3062
,
&
nv40_gr_object
},
/* surf2d (nv40) */
{
-
1
,
-
1
,
0x3089
,
&
nv40_gr_object
},
/* sifm (nv40) */
{
-
1
,
-
1
,
0x309e
,
&
nv40_gr_object
},
/* swzsurf (nv40) */
{
-
1
,
-
1
,
0x4097
,
&
nv40_gr_object
},
/* curie */
{}
}
};
static
const
struct
nvkm_gr_func
nv44_gr
=
{
.
chan_new
=
nv40_gr_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
0x0012
,
&
nv40_gr_object
},
/* beta1 */
{
-
1
,
-
1
,
0x0019
,
&
nv40_gr_object
},
/* clip */
{
-
1
,
-
1
,
0x0030
,
&
nv40_gr_object
},
/* null */
{
-
1
,
-
1
,
0x0039
,
&
nv40_gr_object
},
/* m2mf */
{
-
1
,
-
1
,
0x0043
,
&
nv40_gr_object
},
/* rop */
{
-
1
,
-
1
,
0x0044
,
&
nv40_gr_object
},
/* patt */
{
-
1
,
-
1
,
0x004a
,
&
nv40_gr_object
},
/* gdi */
{
-
1
,
-
1
,
0x0062
,
&
nv40_gr_object
},
/* surf2d */
{
-
1
,
-
1
,
0x0072
,
&
nv40_gr_object
},
/* beta4 */
{
-
1
,
-
1
,
0x0089
,
&
nv40_gr_object
},
/* sifm */
{
-
1
,
-
1
,
0x008a
,
&
nv40_gr_object
},
/* ifc */
{
-
1
,
-
1
,
0x009f
,
&
nv40_gr_object
},
/* imageblit */
{
-
1
,
-
1
,
0x3062
,
&
nv40_gr_object
},
/* surf2d (nv40) */
{
-
1
,
-
1
,
0x3089
,
&
nv40_gr_object
},
/* sifm (nv40) */
{
-
1
,
-
1
,
0x309e
,
&
nv40_gr_object
},
/* swzsurf (nv40) */
{
-
1
,
-
1
,
0x4497
,
&
nv40_gr_object
},
/* curie */
{}
}
};
static
int
static
int
nv40_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv40_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
@@ -377,11 +365,10 @@ nv40_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -377,11 +365,10 @@ nv40_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
unit
=
0x00001000
;
nv_subdev
(
gr
)
->
intr
=
nv40_gr_intr
;
nv_subdev
(
gr
)
->
intr
=
nv40_gr_intr
;
nv_engine
(
gr
)
->
cclass
=
&
nv40_gr_cclass
;
if
(
nv44_gr_class
(
gr
))
if
(
nv44_gr_class
(
gr
))
nv_engine
(
gr
)
->
sclass
=
nv44_gr_sclass
;
gr
->
base
.
func
=
&
nv44_gr
;
else
else
nv_engine
(
gr
)
->
sclass
=
nv40_gr_sclass
;
gr
->
base
.
func
=
&
nv40_gr
;
nv_engine
(
gr
)
->
tile_prog
=
nv40_gr_tile_prog
;
nv_engine
(
gr
)
->
tile_prog
=
nv40_gr_tile_prog
;
gr
->
base
.
units
=
nv40_gr_units
;
gr
->
base
.
units
=
nv40_gr_units
;
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.h
浏览文件 @
27f3d6cf
#ifndef __NV40_GR_H__
#ifndef __NV40_GR_H__
#define __NV40_GR_H__
#define __NV40_GR_H__
#include <engine/gr.h>
#define nv40_gr(p) container_of((p), struct nv40_gr, base)
#include "priv.h"
struct
nvkm_gpuobj
;
struct
nv40_gr
{
struct
nvkm_gr
base
;
u32
size
;
struct
list_head
chan
;
};
#define nv40_gr_chan(p) container_of((p), struct nv40_gr_chan, object)
struct
nv40_gr_chan
{
struct
nvkm_object
object
;
struct
nv40_gr
*
gr
;
struct
nvkm_fifo_chan
*
fifo
;
u32
inst
;
struct
list_head
head
;
};
/* returns 1 if device is one of the nv4x using the 0x4497 object class,
/* returns 1 if device is one of the nv4x using the 0x4497 object class,
* helpful to determine a number of other hardware features
* helpful to determine a number of other hardware features
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv50.c
浏览文件 @
27f3d6cf
...
@@ -27,16 +27,6 @@
...
@@ -27,16 +27,6 @@
#include <subdev/timer.h>
#include <subdev/timer.h>
#include <engine/fifo.h>
#include <engine/fifo.h>
struct
nv50_gr
{
struct
nvkm_gr
base
;
spinlock_t
lock
;
u32
size
;
};
struct
nv50_gr_chan
{
struct
nvkm_gr_chan
base
;
};
static
u64
static
u64
nv50_gr_units
(
struct
nvkm_gr
*
gr
)
nv50_gr_units
(
struct
nvkm_gr
*
gr
)
{
{
...
@@ -48,126 +38,82 @@ nv50_gr_units(struct nvkm_gr *gr)
...
@@ -48,126 +38,82 @@ nv50_gr_units(struct nvkm_gr *gr)
******************************************************************************/
******************************************************************************/
static
int
static
int
nv50_gr_object_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv50_gr_object_bind
(
struct
nvkm_object
*
object
,
struct
nvkm_gpuobj
*
parent
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
int
align
,
struct
nvkm_gpuobj
**
pgpuobj
)
struct
nvkm_object
**
pobject
)
{
{
struct
nvkm_gpuobj
*
obj
;
int
ret
=
nvkm_gpuobj_new
(
object
->
engine
->
subdev
.
device
,
16
,
int
ret
;
align
,
false
,
parent
,
pgpuobj
);
if
(
ret
==
0
)
{
ret
=
nvkm_gpuobj_create
(
parent
,
engine
,
oclass
,
0
,
parent
,
nvkm_kmap
(
*
pgpuobj
);
16
,
16
,
0
,
&
obj
);
nvkm_wo32
(
*
pgpuobj
,
0x00
,
object
->
oclass_name
);
*
pobject
=
nv_object
(
obj
);
nvkm_wo32
(
*
pgpuobj
,
0x04
,
0x00000000
);
if
(
ret
)
nvkm_wo32
(
*
pgpuobj
,
0x08
,
0x00000000
);
nvkm_wo32
(
*
pgpuobj
,
0x0c
,
0x00000000
);
nvkm_done
(
*
pgpuobj
);
}
return
ret
;
return
ret
;
nvkm_kmap
(
obj
);
nvkm_wo32
(
obj
,
0x00
,
nv_mclass
(
obj
));
nvkm_wo32
(
obj
,
0x04
,
0x00000000
);
nvkm_wo32
(
obj
,
0x08
,
0x00000000
);
nvkm_wo32
(
obj
,
0x0c
,
0x00000000
);
nvkm_done
(
obj
);
return
0
;
}
}
static
struct
nvkm_ofuncs
static
const
struct
nvkm_object_func
nv50_gr_ofuncs
=
{
nv50_gr_object
=
{
.
ctor
=
nv50_gr_object_ctor
,
.
bind
=
nv50_gr_object_bind
,
.
dtor
=
_nvkm_gpuobj_dtor
,
.
init
=
_nvkm_gpuobj_init
,
.
fini
=
_nvkm_gpuobj_fini
,
.
rd32
=
_nvkm_gpuobj_rd32
,
.
wr32
=
_nvkm_gpuobj_wr32
,
};
static
struct
nvkm_oclass
nv50_gr_sclass
[]
=
{
{
0x0030
,
&
nv50_gr_ofuncs
},
{
0x502d
,
&
nv50_gr_ofuncs
},
{
0x5039
,
&
nv50_gr_ofuncs
},
{
0x5097
,
&
nv50_gr_ofuncs
},
{
0x50c0
,
&
nv50_gr_ofuncs
},
{}
};
static
struct
nvkm_oclass
g84_gr_sclass
[]
=
{
{
0x0030
,
&
nv50_gr_ofuncs
},
{
0x502d
,
&
nv50_gr_ofuncs
},
{
0x5039
,
&
nv50_gr_ofuncs
},
{
0x50c0
,
&
nv50_gr_ofuncs
},
{
0x8297
,
&
nv50_gr_ofuncs
},
{}
};
};
static
struct
nvkm_oclass
static
int
gt200_gr_sclass
[]
=
{
nv50_gr_object_get
(
struct
nvkm_gr
*
base
,
int
index
,
struct
nvkm_sclass
*
sclass
)
{
0x0030
,
&
nv50_gr_ofuncs
},
{
{
0x502d
,
&
nv50_gr_ofuncs
},
struct
nv50_gr
*
gr
=
nv50_gr
(
base
);
{
0x5039
,
&
nv50_gr_ofuncs
},
int
c
=
0
;
{
0x50c0
,
&
nv50_gr_ofuncs
},
{
0x8397
,
&
nv50_gr_ofuncs
},
{}
};
static
struct
nvkm_oclass
while
(
gr
->
func
->
sclass
[
c
].
oclass
)
{
gt215_gr_sclass
[]
=
{
if
(
c
++
==
index
)
{
{
0x0030
,
&
nv50_gr_ofuncs
},
*
sclass
=
gr
->
func
->
sclass
[
index
];
{
0x502d
,
&
nv50_gr_ofuncs
},
return
index
;
{
0x5039
,
&
nv50_gr_ofuncs
},
}
{
0x50c0
,
&
nv50_gr_ofuncs
},
}
{
0x8597
,
&
nv50_gr_ofuncs
},
{
0x85c0
,
&
nv50_gr_ofuncs
},
{}
};
static
struct
nvkm_oclass
return
c
;
mcp89_gr_sclass
[]
=
{
}
{
0x0030
,
&
nv50_gr_ofuncs
},
{
0x502d
,
&
nv50_gr_ofuncs
},
{
0x5039
,
&
nv50_gr_ofuncs
},
{
0x50c0
,
&
nv50_gr_ofuncs
},
{
0x85c0
,
&
nv50_gr_ofuncs
},
{
0x8697
,
&
nv50_gr_ofuncs
},
{}
};
/*******************************************************************************
/*******************************************************************************
* PGRAPH context
* PGRAPH context
******************************************************************************/
******************************************************************************/
static
int
static
int
nv50_gr_context_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv50_gr_chan_bind
(
struct
nvkm_object
*
object
,
struct
nvkm_gpuobj
*
parent
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
int
align
,
struct
nvkm_gpuobj
**
pgpuobj
)
struct
nvkm_object
**
pobject
)
{
{
struct
nv50_gr
*
gr
=
(
void
*
)
engine
;
struct
nv50_gr
*
gr
=
nv50_gr_chan
(
object
)
->
gr
;
struct
nv50_gr_chan
*
chan
;
int
ret
=
nvkm_gpuobj_new
(
gr
->
base
.
engine
.
subdev
.
device
,
gr
->
size
,
int
ret
;
align
,
true
,
parent
,
pgpuobj
)
;
if
(
ret
==
0
)
{
ret
=
nvkm_gr_context_create
(
parent
,
engine
,
oclass
,
NULL
,
gr
->
size
,
nvkm_kmap
(
*
pgpuobj
);
0
,
NVOBJ_FLAG_ZERO_ALLOC
,
&
chan
);
nv50_grctx_fill
(
gr
->
base
.
engine
.
subdev
.
device
,
*
pgpuobj
);
*
pobject
=
nv_object
(
chan
);
nvkm_done
(
*
pgpuobj
);
if
(
ret
)
}
return
ret
;
return
ret
;
nv50_grctx_fill
(
nv_device
(
gr
),
nv_gpuobj
(
chan
));
return
0
;
}
}
static
struct
nvkm_oclass
static
const
struct
nvkm_object_func
nv50_gr_cclass
=
{
nv50_gr_chan
=
{
.
handle
=
NV_ENGCTX
(
GR
,
0x50
),
.
bind
=
nv50_gr_chan_bind
,
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
nv50_gr_context_ctor
,
.
dtor
=
_nvkm_gr_context_dtor
,
.
init
=
_nvkm_gr_context_init
,
.
fini
=
_nvkm_gr_context_fini
,
.
rd32
=
_nvkm_gr_context_rd32
,
.
wr32
=
_nvkm_gr_context_wr32
,
},
};
};
static
int
nv50_gr_chan_new
(
struct
nvkm_gr
*
base
,
struct
nvkm_fifo_chan
*
fifoch
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
{
struct
nv50_gr
*
gr
=
nv50_gr
(
base
);
struct
nv50_gr_chan
*
chan
;
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
return
-
ENOMEM
;
nvkm_object_ctor
(
&
nv50_gr_chan
,
oclass
,
&
chan
->
object
);
chan
->
gr
=
gr
;
*
pobject
=
&
chan
->
object
;
return
0
;
}
/*******************************************************************************
/*******************************************************************************
* PGRAPH engine/subdev functions
* PGRAPH engine/subdev functions
******************************************************************************/
******************************************************************************/
...
@@ -889,6 +835,74 @@ nv50_gr_intr(struct nvkm_subdev *subdev)
...
@@ -889,6 +835,74 @@ nv50_gr_intr(struct nvkm_subdev *subdev)
nvkm_fifo_chan_put
(
device
->
fifo
,
flags
,
&
chan
);
nvkm_fifo_chan_put
(
device
->
fifo
,
flags
,
&
chan
);
}
}
static
const
struct
nv50_gr_func
nv50_gr
=
{
.
sclass
=
{
{
-
1
,
-
1
,
0x0030
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x502d
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x5039
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x5097
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x50c0
,
&
nv50_gr_object
},
{}
}
};
static
const
struct
nv50_gr_func
g84_gr
=
{
.
sclass
=
{
{
-
1
,
-
1
,
0x0030
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x502d
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x5039
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x50c0
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x8297
,
&
nv50_gr_object
},
{}
}
};
static
const
struct
nv50_gr_func
gt200_gr
=
{
.
sclass
=
{
{
-
1
,
-
1
,
0x0030
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x502d
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x5039
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x50c0
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x8397
,
&
nv50_gr_object
},
{}
}
};
static
const
struct
nv50_gr_func
gt215_gr
=
{
.
sclass
=
{
{
-
1
,
-
1
,
0x0030
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x502d
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x5039
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x50c0
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x8597
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x85c0
,
&
nv50_gr_object
},
{}
}
};
static
const
struct
nv50_gr_func
mcp89_gr
=
{
.
sclass
=
{
{
-
1
,
-
1
,
0x0030
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x502d
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x5039
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x50c0
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x85c0
,
&
nv50_gr_object
},
{
-
1
,
-
1
,
0x8697
,
&
nv50_gr_object
},
{}
}
};
static
const
struct
nvkm_gr_func
nv50_gr_
=
{
.
chan_new
=
nv50_gr_chan_new
,
.
object_get
=
nv50_gr_object_get
,
};
static
int
static
int
nv50_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
nv50_gr_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
@@ -904,13 +918,13 @@ nv50_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -904,13 +918,13 @@ nv50_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
nv_subdev
(
gr
)
->
unit
=
0x00201000
;
nv_subdev
(
gr
)
->
unit
=
0x00201000
;
nv_subdev
(
gr
)
->
intr
=
nv50_gr_intr
;
nv_subdev
(
gr
)
->
intr
=
nv50_gr_intr
;
nv_engine
(
gr
)
->
cclass
=
&
nv50_gr_cclass
;
gr
->
base
.
func
=
&
nv50_gr_
;
gr
->
base
.
units
=
nv50_gr_units
;
gr
->
base
.
units
=
nv50_gr_units
;
switch
(
nv_device
(
gr
)
->
chipset
)
{
switch
(
nv_device
(
gr
)
->
chipset
)
{
case
0x50
:
case
0x50
:
nv_engine
(
gr
)
->
sclass
=
nv50_gr_sclass
;
gr
->
func
=
&
nv50_gr
;
break
;
break
;
case
0x84
:
case
0x84
:
case
0x86
:
case
0x86
:
...
@@ -918,22 +932,21 @@ nv50_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
...
@@ -918,22 +932,21 @@ nv50_gr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
case
0x94
:
case
0x94
:
case
0x96
:
case
0x96
:
case
0x98
:
case
0x98
:
nv_engine
(
gr
)
->
sclass
=
g84_gr_sclass
;
gr
->
func
=
&
g84_gr
;
break
;
break
;
case
0xa0
:
case
0xa0
:
case
0xaa
:
case
0xaa
:
case
0xac
:
case
0xac
:
nv_engine
(
gr
)
->
sclass
=
gt200_gr_sclass
;
gr
->
func
=
&
gt200_gr
;
break
;
break
;
case
0xa3
:
case
0xa3
:
case
0xa5
:
case
0xa5
:
case
0xa8
:
case
0xa8
:
nv_engine
(
gr
)
->
sclass
=
gt215_gr_sclass
;
gr
->
func
=
&
gt215_gr
;
break
;
break
;
case
0xaf
:
case
0xaf
:
nv_engine
(
gr
)
->
sclass
=
mcp89_gr_sclass
;
gr
->
func
=
&
mcp89_gr
;
break
;
break
;
}
}
/* unfortunate hw bug workaround... */
/* unfortunate hw bug workaround... */
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv50.h
浏览文件 @
27f3d6cf
#ifndef __NV50_GR_H__
#ifndef __NV50_GR_H__
#define __NV50_GR_H__
#define __NV50_GR_H__
#include <engine/gr.h>
#define nv50_gr(p) container_of((p), struct nv50_gr, base)
struct
nvkm_device
;
#include "priv.h"
struct
nvkm_gpuobj
;
struct
nv50_gr
{
struct
nvkm_gr
base
;
const
struct
nv50_gr_func
*
func
;
spinlock_t
lock
;
u32
size
;
};
struct
nv50_gr_func
{
void
*
(
*
dtor
)(
struct
nv50_gr
*
);
struct
nvkm_sclass
sclass
[];
};
#define nv50_gr_chan(p) container_of((p), struct nv50_gr_chan, object)
struct
nv50_gr_chan
{
struct
nvkm_object
object
;
struct
nv50_gr
*
gr
;
};
int
nv50_grctx_init
(
struct
nvkm_device
*
,
u32
*
size
);
int
nv50_grctx_init
(
struct
nvkm_device
*
,
u32
*
size
);
void
nv50_grctx_fill
(
struct
nvkm_device
*
,
struct
nvkm_gpuobj
*
);
void
nv50_grctx_fill
(
struct
nvkm_device
*
,
struct
nvkm_gpuobj
*
);
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/priv.h
0 → 100644
浏览文件 @
27f3d6cf
#ifndef __NVKM_GR_PRIV_H__
#define __NVKM_GR_PRIV_H__
#define nvkm_gr(p) container_of((p), struct nvkm_gr, engine)
#include <engine/gr.h>
struct
nvkm_fifo_chan
;
struct
nvkm_gr_func
{
int
(
*
chan_new
)(
struct
nvkm_gr
*
,
struct
nvkm_fifo_chan
*
,
const
struct
nvkm_oclass
*
,
struct
nvkm_object
**
);
int
(
*
object_get
)(
struct
nvkm_gr
*
,
int
,
struct
nvkm_sclass
*
);
struct
nvkm_sclass
sclass
[];
};
extern
const
struct
nvkm_object_func
nv04_gr_object
;
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录