1230557Sjimharris/*	$NetBSD: nouveau_nvkm_engine_gr_gk208.c,v 1.3 2021/12/18 23:45:36 riastradh Exp $	*/
2230557Sjimharris
3230557Sjimharris/*
4230557Sjimharris * Copyright 2013 Red Hat Inc.
5230557Sjimharris *
6230557Sjimharris * Permission is hereby granted, free of charge, to any person obtaining a
7230557Sjimharris * copy of this software and associated documentation files (the "Software"),
8230557Sjimharris * to deal in the Software without restriction, including without limitation
9230557Sjimharris * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10230557Sjimharris * and/or sell copies of the Software, and to permit persons to whom the
11230557Sjimharris * Software is furnished to do so, subject to the following conditions:
12230557Sjimharris *
13230557Sjimharris * The above copyright notice and this permission notice shall be included in
14230557Sjimharris * all copies or substantial portions of the Software.
15230557Sjimharris *
16230557Sjimharris * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17230557Sjimharris * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18230557Sjimharris * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19230557Sjimharris * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20230557Sjimharris * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21230557Sjimharris * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22230557Sjimharris * OTHER DEALINGS IN THE SOFTWARE.
23230557Sjimharris *
24230557Sjimharris * Authors: Ben Skeggs <bskeggs@redhat.com>
25230557Sjimharris */
26230557Sjimharris#include <sys/cdefs.h>
27230557Sjimharris__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_engine_gr_gk208.c,v 1.3 2021/12/18 23:45:36 riastradh Exp $");
28230557Sjimharris
29230557Sjimharris#include "gf100.h"
30230557Sjimharris#include "ctxgf100.h"
31230557Sjimharris
32230557Sjimharris#include <subdev/timer.h>
33230557Sjimharris
34230557Sjimharris#include <nvif/class.h>
35230557Sjimharris
36230557Sjimharris/*******************************************************************************
37230557Sjimharris * PGRAPH register lists
38230557Sjimharris ******************************************************************************/
39230557Sjimharris
40230557Sjimharrisstatic const struct gf100_gr_init
41230557Sjimharrisgk208_gr_init_main_0[] = {
42230557Sjimharris	{ 0x400080,   1, 0x04, 0x003083c2 },
43230557Sjimharris	{ 0x400088,   1, 0x04, 0x0001bfe7 },
44230557Sjimharris	{ 0x40008c,   1, 0x04, 0x00000000 },
45230557Sjimharris	{ 0x400090,   1, 0x04, 0x00000030 },
46230557Sjimharris	{ 0x40013c,   1, 0x04, 0x003901f7 },
47230557Sjimharris	{ 0x400140,   1, 0x04, 0x00000100 },
48230557Sjimharris	{ 0x400144,   1, 0x04, 0x00000000 },
49230557Sjimharris	{ 0x400148,   1, 0x04, 0x00000110 },
50230557Sjimharris	{ 0x400138,   1, 0x04, 0x00000000 },
51230557Sjimharris	{ 0x400130,   2, 0x04, 0x00000000 },
52230557Sjimharris	{ 0x400124,   1, 0x04, 0x00000002 },
53230557Sjimharris	{}
54230557Sjimharris};
55230557Sjimharris
56230557Sjimharrisstatic const struct gf100_gr_init
57230557Sjimharrisgk208_gr_init_ds_0[] = {
58230557Sjimharris	{ 0x405844,   1, 0x04, 0x00ffffff },
59230557Sjimharris	{ 0x405850,   1, 0x04, 0x00000000 },
60230557Sjimharris	{ 0x405900,   1, 0x04, 0x00000000 },
61230557Sjimharris	{ 0x405908,   1, 0x04, 0x00000000 },
62230557Sjimharris	{ 0x405928,   2, 0x04, 0x00000000 },
63230557Sjimharris	{}
64230557Sjimharris};
65230557Sjimharris
66230557Sjimharrisconst struct gf100_gr_init
67230557Sjimharrisgk208_gr_init_gpc_unk_0[] = {
68230557Sjimharris	{ 0x418604,   1, 0x04, 0x00000000 },
69230557Sjimharris	{ 0x418680,   1, 0x04, 0x00000000 },
70230557Sjimharris	{ 0x418714,   1, 0x04, 0x00000000 },
71230557Sjimharris	{ 0x418384,   2, 0x04, 0x00000000 },
72230557Sjimharris	{}
73230557Sjimharris};
74230557Sjimharris
75230557Sjimharrisstatic const struct gf100_gr_init
76230557Sjimharrisgk208_gr_init_setup_1[] = {
77230557Sjimharris	{ 0x4188c8,   2, 0x04, 0x00000000 },
78230557Sjimharris	{ 0x4188d0,   1, 0x04, 0x00010000 },
79230557Sjimharris	{ 0x4188d4,   1, 0x04, 0x00000201 },
80230557Sjimharris	{}
81230557Sjimharris};
82230557Sjimharris
83230557Sjimharrisstatic const struct gf100_gr_init
84230557Sjimharrisgk208_gr_init_tex_0[] = {
85230557Sjimharris	{ 0x419ab0,   1, 0x04, 0x00000000 },
86230557Sjimharris	{ 0x419ac8,   1, 0x04, 0x00000000 },
87230557Sjimharris	{ 0x419ab8,   1, 0x04, 0x000000e7 },
88230557Sjimharris	{ 0x419abc,   2, 0x04, 0x00000000 },
89230557Sjimharris	{ 0x419ab4,   1, 0x04, 0x00000000 },
90230557Sjimharris	{ 0x419aa8,   2, 0x04, 0x00000000 },
91230557Sjimharris	{}
92230557Sjimharris};
93230557Sjimharris
94230557Sjimharrisstatic const struct gf100_gr_init
95230557Sjimharrisgk208_gr_init_l1c_0[] = {
96230557Sjimharris	{ 0x419c98,   1, 0x04, 0x00000000 },
97230557Sjimharris	{ 0x419ca8,   1, 0x04, 0x00000000 },
98230557Sjimharris	{ 0x419cb0,   1, 0x04, 0x01000000 },
99230557Sjimharris	{ 0x419cb4,   1, 0x04, 0x00000000 },
100230557Sjimharris	{ 0x419cb8,   1, 0x04, 0x00b08bea },
101230557Sjimharris	{ 0x419c84,   1, 0x04, 0x00010384 },
102230557Sjimharris	{ 0x419cbc,   1, 0x04, 0x281b3646 },
103230557Sjimharris	{ 0x419cc0,   2, 0x04, 0x00000000 },
104230557Sjimharris	{ 0x419c80,   1, 0x04, 0x00000230 },
105230557Sjimharris	{ 0x419ccc,   2, 0x04, 0x00000000 },
106230557Sjimharris	{}
107230557Sjimharris};
108230557Sjimharris
109230557Sjimharrisstatic const struct gf100_gr_pack
110230557Sjimharrisgk208_gr_pack_mmio[] = {
111230557Sjimharris	{ gk208_gr_init_main_0 },
112230557Sjimharris	{ gk110_gr_init_fe_0 },
113230557Sjimharris	{ gf100_gr_init_pri_0 },
114230557Sjimharris	{ gf100_gr_init_rstr2d_0 },
115230557Sjimharris	{ gf119_gr_init_pd_0 },
116230557Sjimharris	{ gk208_gr_init_ds_0 },
117230557Sjimharris	{ gf100_gr_init_scc_0 },
118230557Sjimharris	{ gk110_gr_init_sked_0 },
119230557Sjimharris	{ gk110_gr_init_cwd_0 },
120230557Sjimharris	{ gf119_gr_init_prop_0 },
121230557Sjimharris	{ gk208_gr_init_gpc_unk_0 },
122230557Sjimharris	{ gf100_gr_init_setup_0 },
123230557Sjimharris	{ gf100_gr_init_crstr_0 },
124230557Sjimharris	{ gk208_gr_init_setup_1 },
125230557Sjimharris	{ gf100_gr_init_zcull_0 },
126230557Sjimharris	{ gf119_gr_init_gpm_0 },
127230557Sjimharris	{ gk110_gr_init_gpc_unk_1 },
128230557Sjimharris	{ gf100_gr_init_gcc_0 },
129230557Sjimharris	{ gk104_gr_init_gpc_unk_2 },
130230557Sjimharris	{ gk104_gr_init_tpccs_0 },
131230557Sjimharris	{ gk208_gr_init_tex_0 },
132230557Sjimharris	{ gk104_gr_init_pe_0 },
133230557Sjimharris	{ gk208_gr_init_l1c_0 },
134230557Sjimharris	{ gf100_gr_init_mpc_0 },
135230557Sjimharris	{ gk110_gr_init_sm_0 },
136230557Sjimharris	{ gf117_gr_init_pes_0 },
137230557Sjimharris	{ gf117_gr_init_wwdx_0 },
138230557Sjimharris	{ gf117_gr_init_cbm_0 },
139230557Sjimharris	{ gk104_gr_init_be_0 },
140230557Sjimharris	{ gf100_gr_init_fe_1 },
141230557Sjimharris	{}
142230557Sjimharris};
143230557Sjimharris
144230557Sjimharris/*******************************************************************************
145230557Sjimharris * PGRAPH engine/subdev functions
146230557Sjimharris ******************************************************************************/
147230557Sjimharris
148230557Sjimharris#include "fuc/hubgk208.fuc5.h"
149230557Sjimharris
150230557Sjimharrisstatic struct gf100_gr_ucode
151230557Sjimharrisgk208_gr_fecs_ucode = {
152230557Sjimharris	.code.data = gk208_grhub_code,
153230557Sjimharris	.code.size = sizeof(gk208_grhub_code),
154230557Sjimharris	.data.data = gk208_grhub_data,
155230557Sjimharris	.data.size = sizeof(gk208_grhub_data),
156230557Sjimharris};
157230557Sjimharris
158230557Sjimharris#include "fuc/gpcgk208.fuc5.h"
159230557Sjimharris
160230557Sjimharrisstatic struct gf100_gr_ucode
161230557Sjimharrisgk208_gr_gpccs_ucode = {
162230557Sjimharris	.code.data = gk208_grgpc_code,
163230557Sjimharris	.code.size = sizeof(gk208_grgpc_code),
164230557Sjimharris	.data.data = gk208_grgpc_data,
165230557Sjimharris	.data.size = sizeof(gk208_grgpc_data),
166230557Sjimharris};
167230557Sjimharris
168230557Sjimharrisstatic const struct gf100_gr_func
169230557Sjimharrisgk208_gr = {
170230557Sjimharris	.oneinit_tiles = gf100_gr_oneinit_tiles,
171230557Sjimharris	.oneinit_sm_id = gf100_gr_oneinit_sm_id,
172230557Sjimharris	.init = gf100_gr_init,
173230557Sjimharris	.init_gpc_mmu = gf100_gr_init_gpc_mmu,
174230557Sjimharris	.init_vsc_stream_master = gk104_gr_init_vsc_stream_master,
175230557Sjimharris	.init_zcull = gf117_gr_init_zcull,
176230557Sjimharris	.init_num_active_ltcs = gf100_gr_init_num_active_ltcs,
177230557Sjimharris	.init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
178230557Sjimharris	.init_fecs_exceptions = gf100_gr_init_fecs_exceptions,
179230557Sjimharris	.init_sked_hww_esr = gk104_gr_init_sked_hww_esr,
180230557Sjimharris	.init_419cc0 = gf100_gr_init_419cc0,
181230557Sjimharris	.init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
182230557Sjimharris	.init_tex_hww_esr = gf100_gr_init_tex_hww_esr,
183230557Sjimharris	.init_shader_exceptions = gf100_gr_init_shader_exceptions,
184230557Sjimharris	.init_400054 = gf100_gr_init_400054,
185230557Sjimharris	.trap_mp = gf100_gr_trap_mp,
186230557Sjimharris	.mmio = gk208_gr_pack_mmio,
187230557Sjimharris	.fecs.ucode = &gk208_gr_fecs_ucode,
188230557Sjimharris	.gpccs.ucode = &gk208_gr_gpccs_ucode,
189230557Sjimharris	.rops = gf100_gr_rops,
190230557Sjimharris	.ppc_nr = 1,
191230557Sjimharris	.grctx = &gk208_grctx,
192230557Sjimharris	.zbc = &gf100_gr_zbc,
193230557Sjimharris	.sclass = {
194230557Sjimharris		{ -1, -1, FERMI_TWOD_A },
195230557Sjimharris		{ -1, -1, KEPLER_INLINE_TO_MEMORY_B },
196230557Sjimharris		{ -1, -1, KEPLER_B, &gf100_fermi },
197230557Sjimharris		{ -1, -1, KEPLER_COMPUTE_B },
198230557Sjimharris		{}
199230557Sjimharris	}
200230557Sjimharris};
201230557Sjimharris
202230557Sjimharrisstatic const struct gf100_gr_fwif
203230557Sjimharrisgk208_gr_fwif[] = {
204230557Sjimharris	{ -1, gf100_gr_load, &gk208_gr },
205230557Sjimharris	{ -1, gf100_gr_nofw, &gk208_gr },
206230557Sjimharris	{}
207230557Sjimharris};
208230557Sjimharris
209230557Sjimharrisint
210230557Sjimharrisgk208_gr_new(struct nvkm_device *device, int index, struct nvkm_gr **pgr)
211230557Sjimharris{
212230557Sjimharris	return gf100_gr_new_(gk208_gr_fwif, device, index, pgr);
213230557Sjimharris}
214230557Sjimharris