Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
52fa0866
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
52fa0866
编写于
7月 09, 2016
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/gr/gp100: initial support
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
8e7e1586
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
362 addition
and
1 deletion
+362
-1
drivers/gpu/drm/nouveau/include/nvif/class.h
drivers/gpu/drm/nouveau/include/nvif/class.h
+3
-0
drivers/gpu/drm/nouveau/include/nvkm/engine/gr.h
drivers/gpu/drm/nouveau/include/nvkm/engine/gr.h
+1
-0
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+1
-0
drivers/gpu/drm/nouveau/nvkm/engine/gr/Kbuild
drivers/gpu/drm/nouveau/nvkm/engine/gr/Kbuild
+2
-0
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h
+2
-0
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgp100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgp100.c
+179
-0
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h
+2
-0
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm200.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm200.c
+1
-1
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp100.c
+171
-0
未找到文件。
drivers/gpu/drm/nouveau/include/nvif/class.h
浏览文件 @
52fa0866
...
...
@@ -108,6 +108,8 @@
#define MAXWELL_A
/* cl9097.h */
0x0000b097
#define MAXWELL_B
/* cl9097.h */
0x0000b197
#define PASCAL_A
/* cl9097.h */
0x0000c097
#define NV74_BSP 0x000074b0
#define GT212_MSVLD 0x000085b1
...
...
@@ -141,6 +143,7 @@
#define KEPLER_COMPUTE_B 0x0000a1c0
#define MAXWELL_COMPUTE_A 0x0000b0c0
#define MAXWELL_COMPUTE_B 0x0000b1c0
#define PASCAL_COMPUTE_A 0x0000c0c0
#define NV74_CIPHER 0x000074c1
#endif
drivers/gpu/drm/nouveau/include/nvkm/engine/gr.h
浏览文件 @
52fa0866
...
...
@@ -42,4 +42,5 @@ int gk20a_gr_new(struct nvkm_device *, int, struct nvkm_gr **);
int
gm107_gr_new
(
struct
nvkm_device
*
,
int
,
struct
nvkm_gr
**
);
int
gm200_gr_new
(
struct
nvkm_device
*
,
int
,
struct
nvkm_gr
**
);
int
gm20b_gr_new
(
struct
nvkm_device
*
,
int
,
struct
nvkm_gr
**
);
int
gp100_gr_new
(
struct
nvkm_device
*
,
int
,
struct
nvkm_gr
**
);
#endif
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
浏览文件 @
52fa0866
...
...
@@ -2177,6 +2177,7 @@ nv130_chipset = {
.
dma
=
gf119_dma_new
,
.
disp
=
gp100_disp_new
,
.
fifo
=
gp100_fifo_new
,
.
gr
=
gp100_gr_new
,
};
static
int
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/Kbuild
浏览文件 @
52fa0866
...
...
@@ -31,6 +31,7 @@ nvkm-y += nvkm/engine/gr/gk20a.o
nvkm-y += nvkm/engine/gr/gm107.o
nvkm-y += nvkm/engine/gr/gm200.o
nvkm-y += nvkm/engine/gr/gm20b.o
nvkm-y += nvkm/engine/gr/gp100.o
nvkm-y += nvkm/engine/gr/ctxnv40.o
nvkm-y += nvkm/engine/gr/ctxnv50.o
...
...
@@ -48,3 +49,4 @@ nvkm-y += nvkm/engine/gr/ctxgk20a.o
nvkm-y += nvkm/engine/gr/ctxgm107.o
nvkm-y += nvkm/engine/gr/ctxgm200.o
nvkm-y += nvkm/engine/gr/ctxgm20b.o
nvkm-y += nvkm/engine/gr/ctxgp100.o
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h
浏览文件 @
52fa0866
...
...
@@ -101,6 +101,8 @@ void gm200_grctx_generate_405b60(struct gf100_gr *);
extern
const
struct
gf100_grctx_func
gm20b_grctx
;
extern
const
struct
gf100_grctx_func
gp100_grctx
;
/* context init value lists */
extern
const
struct
gf100_gr_pack
gf100_grctx_pack_icmd
[];
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgp100.c
0 → 100644
浏览文件 @
52fa0866
/*
* Copyright 2016 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 "ctxgf100.h"
#include <subdev/fb.h>
/*******************************************************************************
* PGRAPH context implementation
******************************************************************************/
static
void
gp100_grctx_generate_pagepool
(
struct
gf100_grctx
*
info
)
{
const
struct
gf100_grctx_func
*
grctx
=
info
->
gr
->
func
->
grctx
;
const
u32
access
=
NV_MEM_ACCESS_RW
|
NV_MEM_ACCESS_SYS
;
const
int
s
=
8
;
const
int
b
=
mmio_vram
(
info
,
grctx
->
pagepool_size
,
(
1
<<
s
),
access
);
mmio_refn
(
info
,
0x40800c
,
0x00000000
,
s
,
b
);
mmio_wr32
(
info
,
0x408010
,
0x80000000
);
mmio_refn
(
info
,
0x419004
,
0x00000000
,
s
,
b
);
mmio_wr32
(
info
,
0x419008
,
0x00000000
);
}
static
void
gp100_grctx_generate_attrib
(
struct
gf100_grctx
*
info
)
{
struct
gf100_gr
*
gr
=
info
->
gr
;
const
struct
gf100_grctx_func
*
grctx
=
gr
->
func
->
grctx
;
const
u32
alpha
=
grctx
->
alpha_nr
;
const
u32
attrib
=
grctx
->
attrib_nr
;
const
u32
pertpc
=
0x20
*
(
grctx
->
attrib_nr_max
+
grctx
->
alpha_nr_max
);
const
u32
size
=
roundup
(
gr
->
tpc_total
*
pertpc
,
0x80
);
const
u32
access
=
NV_MEM_ACCESS_RW
;
const
int
s
=
12
;
const
int
b
=
mmio_vram
(
info
,
size
,
(
1
<<
s
),
access
);
const
int
max_batches
=
0xffff
;
u32
ao
=
0
;
u32
bo
=
ao
+
grctx
->
alpha_nr_max
*
gr
->
tpc_total
;
int
gpc
,
ppc
,
n
=
0
;
mmio_refn
(
info
,
0x418810
,
0x80000000
,
s
,
b
);
mmio_refn
(
info
,
0x419848
,
0x10000000
,
s
,
b
);
mmio_refn
(
info
,
0x419c2c
,
0x10000000
,
s
,
b
);
mmio_refn
(
info
,
0x419b00
,
0x00000000
,
s
,
b
);
mmio_wr32
(
info
,
0x419b04
,
0x80000000
|
size
>>
7
);
mmio_wr32
(
info
,
0x405830
,
attrib
);
mmio_wr32
(
info
,
0x40585c
,
alpha
);
mmio_wr32
(
info
,
0x4064c4
,
((
alpha
/
4
)
<<
16
)
|
max_batches
);
for
(
gpc
=
0
;
gpc
<
gr
->
gpc_nr
;
gpc
++
)
{
for
(
ppc
=
0
;
ppc
<
gr
->
ppc_nr
[
gpc
];
ppc
++
,
n
++
)
{
const
u32
as
=
alpha
*
gr
->
ppc_tpc_nr
[
gpc
][
ppc
];
const
u32
bs
=
attrib
*
gr
->
ppc_tpc_nr
[
gpc
][
ppc
];
const
u32
u
=
0x418ea0
+
(
n
*
0x04
);
const
u32
o
=
PPC_UNIT
(
gpc
,
ppc
,
0
);
if
(
!
(
gr
->
ppc_mask
[
gpc
]
&
(
1
<<
ppc
)))
continue
;
mmio_wr32
(
info
,
o
+
0xc0
,
bs
);
mmio_wr32
(
info
,
o
+
0xf4
,
bo
);
mmio_wr32
(
info
,
o
+
0xf0
,
bs
);
bo
+=
grctx
->
attrib_nr_max
*
gr
->
ppc_tpc_nr
[
gpc
][
ppc
];
mmio_wr32
(
info
,
o
+
0xe4
,
as
);
mmio_wr32
(
info
,
o
+
0xf8
,
ao
);
ao
+=
grctx
->
alpha_nr_max
*
gr
->
ppc_tpc_nr
[
gpc
][
ppc
];
mmio_wr32
(
info
,
u
,
bs
);
}
}
mmio_wr32
(
info
,
0x418eec
,
0x00000000
);
mmio_wr32
(
info
,
0x41befc
,
0x00000000
);
}
static
void
gp100_grctx_generate_405b60
(
struct
gf100_gr
*
gr
)
{
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
const
u32
dist_nr
=
DIV_ROUND_UP
(
gr
->
tpc_total
,
4
);
u32
dist
[
TPC_MAX
/
4
]
=
{};
u32
gpcs
[
GPC_MAX
*
2
]
=
{};
u8
tpcnr
[
GPC_MAX
];
int
tpc
,
gpc
,
i
;
memcpy
(
tpcnr
,
gr
->
tpc_nr
,
sizeof
(
gr
->
tpc_nr
));
/* won't result in the same distribution as the binary driver where
* some of the gpcs have more tpcs than others, but this shall do
* for the moment. the code for earlier gpus has this issue too.
*/
for
(
gpc
=
-
1
,
i
=
0
;
i
<
gr
->
tpc_total
;
i
++
)
{
do
{
gpc
=
(
gpc
+
1
)
%
gr
->
gpc_nr
;
}
while
(
!
tpcnr
[
gpc
]);
tpc
=
gr
->
tpc_nr
[
gpc
]
-
tpcnr
[
gpc
]
--
;
dist
[
i
/
4
]
|=
((
gpc
<<
4
)
|
tpc
)
<<
((
i
%
4
)
*
8
);
gpcs
[
gpc
+
(
gr
->
gpc_nr
*
(
tpc
/
4
))]
|=
i
<<
(
tpc
*
8
);
}
for
(
i
=
0
;
i
<
dist_nr
;
i
++
)
nvkm_wr32
(
device
,
0x405b60
+
(
i
*
4
),
dist
[
i
]);
for
(
i
=
0
;
i
<
gr
->
gpc_nr
*
2
;
i
++
)
nvkm_wr32
(
device
,
0x405ba0
+
(
i
*
4
),
gpcs
[
i
]);
}
static
void
gp100_grctx_generate_main
(
struct
gf100_gr
*
gr
,
struct
gf100_grctx
*
info
)
{
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
const
struct
gf100_grctx_func
*
grctx
=
gr
->
func
->
grctx
;
u32
idle_timeout
,
tmp
;
int
i
;
gf100_gr_mmio
(
gr
,
gr
->
fuc_sw_ctx
);
idle_timeout
=
nvkm_mask
(
device
,
0x404154
,
0xffffffff
,
0x00000000
);
grctx
->
pagepool
(
info
);
grctx
->
bundle
(
info
);
grctx
->
attrib
(
info
);
grctx
->
unkn
(
gr
);
gm200_grctx_generate_tpcid
(
gr
);
gf100_grctx_generate_r406028
(
gr
);
gk104_grctx_generate_r418bb8
(
gr
);
for
(
i
=
0
;
i
<
8
;
i
++
)
nvkm_wr32
(
device
,
0x4064d0
+
(
i
*
0x04
),
0x00000000
);
nvkm_wr32
(
device
,
0x406500
,
0x00000000
);
nvkm_wr32
(
device
,
0x405b00
,
(
gr
->
tpc_total
<<
8
)
|
gr
->
gpc_nr
);
for
(
tmp
=
0
,
i
=
0
;
i
<
gr
->
gpc_nr
;
i
++
)
tmp
|=
((
1
<<
gr
->
tpc_nr
[
i
])
-
1
)
<<
(
i
*
5
);
nvkm_wr32
(
device
,
0x4041c4
,
tmp
);
gp100_grctx_generate_405b60
(
gr
);
gf100_gr_icmd
(
gr
,
gr
->
fuc_bundle
);
nvkm_wr32
(
device
,
0x404154
,
idle_timeout
);
gf100_gr_mthd
(
gr
,
gr
->
fuc_method
);
}
const
struct
gf100_grctx_func
gp100_grctx
=
{
.
main
=
gp100_grctx_generate_main
,
.
unkn
=
gk104_grctx_generate_unkn
,
.
bundle
=
gm107_grctx_generate_bundle
,
.
bundle_size
=
0x3000
,
.
bundle_min_gpm_fifo_depth
=
0x180
,
.
bundle_token_limit
=
0x1080
,
.
pagepool
=
gp100_grctx_generate_pagepool
,
.
pagepool_size
=
0x20000
,
.
attrib
=
gp100_grctx_generate_attrib
,
.
attrib_nr_max
=
0x660
,
.
attrib_nr
=
0x440
,
.
alpha_nr_max
=
0xc00
,
.
alpha_nr
=
0x800
,
};
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h
浏览文件 @
52fa0866
...
...
@@ -292,4 +292,6 @@ extern const struct gf100_gr_init gm107_gr_init_l1c_0[];
extern
const
struct
gf100_gr_init
gm107_gr_init_wwdx_0
[];
extern
const
struct
gf100_gr_init
gm107_gr_init_cbm_0
[];
void
gm107_gr_init_bios
(
struct
gf100_gr
*
);
void
gm200_gr_init_gpc_mmu
(
struct
gf100_gr
*
);
#endif
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm200.c
浏览文件 @
52fa0866
...
...
@@ -38,7 +38,7 @@ gm200_gr_rops(struct gf100_gr *gr)
return
nvkm_rd32
(
gr
->
base
.
engine
.
subdev
.
device
,
0x12006c
);
}
static
void
void
gm200_gr_init_gpc_mmu
(
struct
gf100_gr
*
gr
)
{
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
...
...
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp100.c
0 → 100644
浏览文件 @
52fa0866
/*
* Copyright 2016 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 "gf100.h"
#include "ctxgf100.h"
#include <nvif/class.h>
/*******************************************************************************
* PGRAPH engine/subdev functions
******************************************************************************/
static
void
gp100_gr_init_rop_active_fbps
(
struct
gf100_gr
*
gr
)
{
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
/*XXX: otherwise identical to gm200 aside from mask.. do everywhere? */
const
u32
fbp_count
=
nvkm_rd32
(
device
,
0x12006c
)
&
0x0000000f
;
nvkm_mask
(
device
,
0x408850
,
0x0000000f
,
fbp_count
);
/* zrop */
nvkm_mask
(
device
,
0x408958
,
0x0000000f
,
fbp_count
);
/* crop */
}
static
int
gp100_gr_init
(
struct
gf100_gr
*
gr
)
{
struct
nvkm_device
*
device
=
gr
->
base
.
engine
.
subdev
.
device
;
const
u32
magicgpc918
=
DIV_ROUND_UP
(
0x00800000
,
gr
->
tpc_total
);
u32
data
[
TPC_MAX
/
8
]
=
{};
u8
tpcnr
[
GPC_MAX
];
int
gpc
,
tpc
,
rop
;
int
i
;
gr
->
func
->
init_gpc_mmu
(
gr
);
gf100_gr_mmio
(
gr
,
gr
->
fuc_sw_nonctx
);
nvkm_wr32
(
device
,
GPC_UNIT
(
0
,
0x3018
),
0x00000001
);
memset
(
data
,
0x00
,
sizeof
(
data
));
memcpy
(
tpcnr
,
gr
->
tpc_nr
,
sizeof
(
gr
->
tpc_nr
));
for
(
i
=
0
,
gpc
=
-
1
;
i
<
gr
->
tpc_total
;
i
++
)
{
do
{
gpc
=
(
gpc
+
1
)
%
gr
->
gpc_nr
;
}
while
(
!
tpcnr
[
gpc
]);
tpc
=
gr
->
tpc_nr
[
gpc
]
-
tpcnr
[
gpc
]
--
;
data
[
i
/
8
]
|=
tpc
<<
((
i
%
8
)
*
4
);
}
nvkm_wr32
(
device
,
GPC_BCAST
(
0x0980
),
data
[
0
]);
nvkm_wr32
(
device
,
GPC_BCAST
(
0x0984
),
data
[
1
]);
nvkm_wr32
(
device
,
GPC_BCAST
(
0x0988
),
data
[
2
]);
nvkm_wr32
(
device
,
GPC_BCAST
(
0x098c
),
data
[
3
]);
for
(
gpc
=
0
;
gpc
<
gr
->
gpc_nr
;
gpc
++
)
{
nvkm_wr32
(
device
,
GPC_UNIT
(
gpc
,
0x0914
),
gr
->
screen_tile_row_offset
<<
8
|
gr
->
tpc_nr
[
gpc
]);
nvkm_wr32
(
device
,
GPC_UNIT
(
gpc
,
0x0910
),
0x00040000
|
gr
->
tpc_total
);
nvkm_wr32
(
device
,
GPC_UNIT
(
gpc
,
0x0918
),
magicgpc918
);
}
nvkm_wr32
(
device
,
GPC_BCAST
(
0x3fd4
),
magicgpc918
);
nvkm_wr32
(
device
,
GPC_BCAST
(
0x08ac
),
nvkm_rd32
(
device
,
0x100800
));
nvkm_wr32
(
device
,
GPC_BCAST
(
0x033c
),
nvkm_rd32
(
device
,
0x100804
));
gr
->
func
->
init_rop_active_fbps
(
gr
);
nvkm_wr32
(
device
,
0x400500
,
0x00010001
);
nvkm_wr32
(
device
,
0x400100
,
0xffffffff
);
nvkm_wr32
(
device
,
0x40013c
,
0xffffffff
);
nvkm_wr32
(
device
,
0x400124
,
0x00000002
);
nvkm_wr32
(
device
,
0x409c24
,
0x000f0002
);
nvkm_wr32
(
device
,
0x405848
,
0xc0000000
);
nvkm_mask
(
device
,
0x40584c
,
0x00000000
,
0x00000001
);
nvkm_wr32
(
device
,
0x404000
,
0xc0000000
);
nvkm_wr32
(
device
,
0x404600
,
0xc0000000
);
nvkm_wr32
(
device
,
0x408030
,
0xc0000000
);
nvkm_wr32
(
device
,
0x404490
,
0xc0000000
);
nvkm_wr32
(
device
,
0x406018
,
0xc0000000
);
nvkm_wr32
(
device
,
0x407020
,
0x40000000
);
nvkm_wr32
(
device
,
0x405840
,
0xc0000000
);
nvkm_wr32
(
device
,
0x405844
,
0x00ffffff
);
nvkm_mask
(
device
,
0x419cc0
,
0x00000008
,
0x00000008
);
nvkm_mask
(
device
,
0x419c9c
,
0x00010000
,
0x00010000
);
nvkm_mask
(
device
,
0x419c9c
,
0x00020000
,
0x00020000
);
gr
->
func
->
init_ppc_exceptions
(
gr
);
for
(
gpc
=
0
;
gpc
<
gr
->
gpc_nr
;
gpc
++
)
{
nvkm_wr32
(
device
,
GPC_UNIT
(
gpc
,
0x0420
),
0xc0000000
);
nvkm_wr32
(
device
,
GPC_UNIT
(
gpc
,
0x0900
),
0xc0000000
);
nvkm_wr32
(
device
,
GPC_UNIT
(
gpc
,
0x1028
),
0xc0000000
);
nvkm_wr32
(
device
,
GPC_UNIT
(
gpc
,
0x0824
),
0xc0000000
);
for
(
tpc
=
0
;
tpc
<
gr
->
tpc_nr
[
gpc
];
tpc
++
)
{
nvkm_wr32
(
device
,
TPC_UNIT
(
gpc
,
tpc
,
0x508
),
0xffffffff
);
nvkm_wr32
(
device
,
TPC_UNIT
(
gpc
,
tpc
,
0x50c
),
0xffffffff
);
nvkm_wr32
(
device
,
TPC_UNIT
(
gpc
,
tpc
,
0x224
),
0xc0000000
);
nvkm_wr32
(
device
,
TPC_UNIT
(
gpc
,
tpc
,
0x48c
),
0xc0000000
);
nvkm_wr32
(
device
,
TPC_UNIT
(
gpc
,
tpc
,
0x084
),
0xc0000000
);
nvkm_wr32
(
device
,
TPC_UNIT
(
gpc
,
tpc
,
0x430
),
0xc0000000
);
nvkm_wr32
(
device
,
TPC_UNIT
(
gpc
,
tpc
,
0x644
),
0x00dffffe
);
nvkm_wr32
(
device
,
TPC_UNIT
(
gpc
,
tpc
,
0x64c
),
0x00000105
);
}
nvkm_wr32
(
device
,
GPC_UNIT
(
gpc
,
0x2c90
),
0xffffffff
);
nvkm_wr32
(
device
,
GPC_UNIT
(
gpc
,
0x2c94
),
0xffffffff
);
}
for
(
rop
=
0
;
rop
<
gr
->
rop_nr
;
rop
++
)
{
nvkm_wr32
(
device
,
ROP_UNIT
(
rop
,
0x144
),
0x40000000
);
nvkm_wr32
(
device
,
ROP_UNIT
(
rop
,
0x070
),
0x40000000
);
nvkm_wr32
(
device
,
ROP_UNIT
(
rop
,
0x204
),
0xffffffff
);
nvkm_wr32
(
device
,
ROP_UNIT
(
rop
,
0x208
),
0xffffffff
);
}
nvkm_wr32
(
device
,
0x400108
,
0xffffffff
);
nvkm_wr32
(
device
,
0x400138
,
0xffffffff
);
nvkm_wr32
(
device
,
0x400118
,
0xffffffff
);
nvkm_wr32
(
device
,
0x400130
,
0xffffffff
);
nvkm_wr32
(
device
,
0x40011c
,
0xffffffff
);
nvkm_wr32
(
device
,
0x400134
,
0xffffffff
);
gf100_gr_zbc_init
(
gr
);
return
gf100_gr_init_ctxctl
(
gr
);
}
static
const
struct
gf100_gr_func
gp100_gr
=
{
.
init
=
gp100_gr_init
,
.
init_gpc_mmu
=
gm200_gr_init_gpc_mmu
,
.
init_rop_active_fbps
=
gp100_gr_init_rop_active_fbps
,
.
init_ppc_exceptions
=
gk104_gr_init_ppc_exceptions
,
.
rops
=
gm200_gr_rops
,
.
ppc_nr
=
2
,
.
grctx
=
&
gp100_grctx
,
.
sclass
=
{
{
-
1
,
-
1
,
FERMI_TWOD_A
},
{
-
1
,
-
1
,
KEPLER_INLINE_TO_MEMORY_B
},
{
-
1
,
-
1
,
PASCAL_A
,
&
gf100_fermi
},
{
-
1
,
-
1
,
PASCAL_COMPUTE_A
},
{}
}
};
int
gp100_gr_new
(
struct
nvkm_device
*
device
,
int
index
,
struct
nvkm_gr
**
pgr
)
{
return
gm200_gr_new_
(
&
gp100_gr
,
device
,
index
,
pgr
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录