brintos

brintos / linux-shallow public Read only

0
0
Text · 46.0 KiB · cb390e0 Raw
1588 lines · c
1/*2 * Copyright 2010 Red Hat Inc.3 *4 * Permission is hereby granted, free of charge, to any person obtaining a5 * copy of this software and associated documentation files (the "Software"),6 * to deal in the Software without restriction, including without limitation7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,8 * and/or sell copies of the Software, and to permit persons to whom the9 * Software is furnished to do so, subject to the following conditions:10 *11 * The above copyright notice and this permission notice shall be included in12 * all copies or substantial portions of the Software.13 *14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR20 * OTHER DEALINGS IN THE SOFTWARE.21 *22 * Authors: Ben Skeggs23 */24#include "ctxgf100.h"25 26#include <subdev/fb.h>27#include <subdev/mc.h>28#include <subdev/timer.h>29#include <engine/fifo.h>30 31/*******************************************************************************32 * PGRAPH context register lists33 ******************************************************************************/34 35static const struct gf100_gr_init36gf100_grctx_init_icmd_0[] = {37	{ 0x001000,   1, 0x01, 0x00000004 },38	{ 0x0000a9,   1, 0x01, 0x0000ffff },39	{ 0x000038,   1, 0x01, 0x0fac6881 },40	{ 0x00003d,   1, 0x01, 0x00000001 },41	{ 0x0000e8,   8, 0x01, 0x00000400 },42	{ 0x000078,   8, 0x01, 0x00000300 },43	{ 0x000050,   1, 0x01, 0x00000011 },44	{ 0x000058,   8, 0x01, 0x00000008 },45	{ 0x000208,   8, 0x01, 0x00000001 },46	{ 0x000081,   1, 0x01, 0x00000001 },47	{ 0x000085,   1, 0x01, 0x00000004 },48	{ 0x000088,   1, 0x01, 0x00000400 },49	{ 0x000090,   1, 0x01, 0x00000300 },50	{ 0x000098,   1, 0x01, 0x00001001 },51	{ 0x0000e3,   1, 0x01, 0x00000001 },52	{ 0x0000da,   1, 0x01, 0x00000001 },53	{ 0x0000f8,   1, 0x01, 0x00000003 },54	{ 0x0000fa,   1, 0x01, 0x00000001 },55	{ 0x00009f,   4, 0x01, 0x0000ffff },56	{ 0x0000b1,   1, 0x01, 0x00000001 },57	{ 0x0000b2,  40, 0x01, 0x00000000 },58	{ 0x000210,   8, 0x01, 0x00000040 },59	{ 0x000218,   8, 0x01, 0x0000c080 },60	{ 0x0000ad,   1, 0x01, 0x0000013e },61	{ 0x0000e1,   1, 0x01, 0x00000010 },62	{ 0x000290,  16, 0x01, 0x00000000 },63	{ 0x0003b0,  16, 0x01, 0x00000000 },64	{ 0x0002a0,  16, 0x01, 0x00000000 },65	{ 0x000420,  16, 0x01, 0x00000000 },66	{ 0x0002b0,  16, 0x01, 0x00000000 },67	{ 0x000430,  16, 0x01, 0x00000000 },68	{ 0x0002c0,  16, 0x01, 0x00000000 },69	{ 0x0004d0,  16, 0x01, 0x00000000 },70	{ 0x000720,  16, 0x01, 0x00000000 },71	{ 0x0008c0,  16, 0x01, 0x00000000 },72	{ 0x000890,  16, 0x01, 0x00000000 },73	{ 0x0008e0,  16, 0x01, 0x00000000 },74	{ 0x0008a0,  16, 0x01, 0x00000000 },75	{ 0x0008f0,  16, 0x01, 0x00000000 },76	{ 0x00094c,   1, 0x01, 0x000000ff },77	{ 0x00094d,   1, 0x01, 0xffffffff },78	{ 0x00094e,   1, 0x01, 0x00000002 },79	{ 0x0002ec,   1, 0x01, 0x00000001 },80	{ 0x000303,   1, 0x01, 0x00000001 },81	{ 0x0002e6,   1, 0x01, 0x00000001 },82	{ 0x000466,   1, 0x01, 0x00000052 },83	{ 0x000301,   1, 0x01, 0x3f800000 },84	{ 0x000304,   1, 0x01, 0x30201000 },85	{ 0x000305,   1, 0x01, 0x70605040 },86	{ 0x000306,   1, 0x01, 0xb8a89888 },87	{ 0x000307,   1, 0x01, 0xf8e8d8c8 },88	{ 0x00030a,   1, 0x01, 0x00ffff00 },89	{ 0x00030b,   1, 0x01, 0x0000001a },90	{ 0x00030c,   1, 0x01, 0x00000001 },91	{ 0x000318,   1, 0x01, 0x00000001 },92	{ 0x000340,   1, 0x01, 0x00000000 },93	{ 0x000375,   1, 0x01, 0x00000001 },94	{ 0x000351,   1, 0x01, 0x00000100 },95	{ 0x00037d,   1, 0x01, 0x00000006 },96	{ 0x0003a0,   1, 0x01, 0x00000002 },97	{ 0x0003aa,   1, 0x01, 0x00000001 },98	{ 0x0003a9,   1, 0x01, 0x00000001 },99	{ 0x000380,   1, 0x01, 0x00000001 },100	{ 0x000360,   1, 0x01, 0x00000040 },101	{ 0x000366,   2, 0x01, 0x00000000 },102	{ 0x000368,   1, 0x01, 0x00001fff },103	{ 0x000370,   2, 0x01, 0x00000000 },104	{ 0x000372,   1, 0x01, 0x003fffff },105	{ 0x00037a,   1, 0x01, 0x00000012 },106	{ 0x0005e0,   5, 0x01, 0x00000022 },107	{ 0x000619,   1, 0x01, 0x00000003 },108	{ 0x000811,   1, 0x01, 0x00000003 },109	{ 0x000812,   1, 0x01, 0x00000004 },110	{ 0x000813,   1, 0x01, 0x00000006 },111	{ 0x000814,   1, 0x01, 0x00000008 },112	{ 0x000815,   1, 0x01, 0x0000000b },113	{ 0x000800,   6, 0x01, 0x00000001 },114	{ 0x000632,   1, 0x01, 0x00000001 },115	{ 0x000633,   1, 0x01, 0x00000002 },116	{ 0x000634,   1, 0x01, 0x00000003 },117	{ 0x000635,   1, 0x01, 0x00000004 },118	{ 0x000654,   1, 0x01, 0x3f800000 },119	{ 0x000657,   1, 0x01, 0x3f800000 },120	{ 0x000655,   2, 0x01, 0x3f800000 },121	{ 0x0006cd,   1, 0x01, 0x3f800000 },122	{ 0x0007f5,   1, 0x01, 0x3f800000 },123	{ 0x0007dc,   1, 0x01, 0x39291909 },124	{ 0x0007dd,   1, 0x01, 0x79695949 },125	{ 0x0007de,   1, 0x01, 0xb9a99989 },126	{ 0x0007df,   1, 0x01, 0xf9e9d9c9 },127	{ 0x0007e8,   1, 0x01, 0x00003210 },128	{ 0x0007e9,   1, 0x01, 0x00007654 },129	{ 0x0007ea,   1, 0x01, 0x00000098 },130	{ 0x0007ec,   1, 0x01, 0x39291909 },131	{ 0x0007ed,   1, 0x01, 0x79695949 },132	{ 0x0007ee,   1, 0x01, 0xb9a99989 },133	{ 0x0007ef,   1, 0x01, 0xf9e9d9c9 },134	{ 0x0007f0,   1, 0x01, 0x00003210 },135	{ 0x0007f1,   1, 0x01, 0x00007654 },136	{ 0x0007f2,   1, 0x01, 0x00000098 },137	{ 0x0005a5,   1, 0x01, 0x00000001 },138	{ 0x000980, 128, 0x01, 0x00000000 },139	{ 0x000468,   1, 0x01, 0x00000004 },140	{ 0x00046c,   1, 0x01, 0x00000001 },141	{ 0x000470,  96, 0x01, 0x00000000 },142	{ 0x000510,  16, 0x01, 0x3f800000 },143	{ 0x000520,   1, 0x01, 0x000002b6 },144	{ 0x000529,   1, 0x01, 0x00000001 },145	{ 0x000530,  16, 0x01, 0xffff0000 },146	{ 0x000585,   1, 0x01, 0x0000003f },147	{ 0x000576,   1, 0x01, 0x00000003 },148	{ 0x000586,   1, 0x01, 0x00000040 },149	{ 0x000582,   2, 0x01, 0x00000080 },150	{ 0x0005c2,   1, 0x01, 0x00000001 },151	{ 0x000638,   2, 0x01, 0x00000001 },152	{ 0x00063a,   1, 0x01, 0x00000002 },153	{ 0x00063b,   2, 0x01, 0x00000001 },154	{ 0x00063d,   1, 0x01, 0x00000002 },155	{ 0x00063e,   1, 0x01, 0x00000001 },156	{ 0x0008b8,   8, 0x01, 0x00000001 },157	{ 0x000900,   8, 0x01, 0x00000001 },158	{ 0x000908,   8, 0x01, 0x00000002 },159	{ 0x000910,  16, 0x01, 0x00000001 },160	{ 0x000920,   8, 0x01, 0x00000002 },161	{ 0x000928,   8, 0x01, 0x00000001 },162	{ 0x000648,   9, 0x01, 0x00000001 },163	{ 0x000658,   1, 0x01, 0x0000000f },164	{ 0x0007ff,   1, 0x01, 0x0000000a },165	{ 0x00066a,   1, 0x01, 0x40000000 },166	{ 0x00066b,   1, 0x01, 0x10000000 },167	{ 0x00066c,   2, 0x01, 0xffff0000 },168	{ 0x0007af,   2, 0x01, 0x00000008 },169	{ 0x0007f6,   1, 0x01, 0x00000001 },170	{ 0x0006b2,   1, 0x01, 0x00000055 },171	{ 0x0007ad,   1, 0x01, 0x00000003 },172	{ 0x000937,   1, 0x01, 0x00000001 },173	{ 0x000971,   1, 0x01, 0x00000008 },174	{ 0x000972,   1, 0x01, 0x00000040 },175	{ 0x000973,   1, 0x01, 0x0000012c },176	{ 0x00097c,   1, 0x01, 0x00000040 },177	{ 0x000979,   1, 0x01, 0x00000003 },178	{ 0x000975,   1, 0x01, 0x00000020 },179	{ 0x000976,   1, 0x01, 0x00000001 },180	{ 0x000977,   1, 0x01, 0x00000020 },181	{ 0x000978,   1, 0x01, 0x00000001 },182	{ 0x000957,   1, 0x01, 0x00000003 },183	{ 0x00095e,   1, 0x01, 0x20164010 },184	{ 0x00095f,   1, 0x01, 0x00000020 },185	{ 0x000683,   1, 0x01, 0x00000006 },186	{ 0x000685,   1, 0x01, 0x003fffff },187	{ 0x000687,   1, 0x01, 0x00000c48 },188	{ 0x0006a0,   1, 0x01, 0x00000005 },189	{ 0x000840,   1, 0x01, 0x00300008 },190	{ 0x000841,   1, 0x01, 0x04000080 },191	{ 0x000842,   1, 0x01, 0x00300008 },192	{ 0x000843,   1, 0x01, 0x04000080 },193	{ 0x000818,   8, 0x01, 0x00000000 },194	{ 0x000848,  16, 0x01, 0x00000000 },195	{ 0x000738,   1, 0x01, 0x00000000 },196	{ 0x0006aa,   1, 0x01, 0x00000001 },197	{ 0x0006ab,   1, 0x01, 0x00000002 },198	{ 0x0006ac,   1, 0x01, 0x00000080 },199	{ 0x0006ad,   2, 0x01, 0x00000100 },200	{ 0x0006b1,   1, 0x01, 0x00000011 },201	{ 0x0006bb,   1, 0x01, 0x000000cf },202	{ 0x0006ce,   1, 0x01, 0x2a712488 },203	{ 0x000739,   1, 0x01, 0x4085c000 },204	{ 0x00073a,   1, 0x01, 0x00000080 },205	{ 0x000786,   1, 0x01, 0x80000100 },206	{ 0x00073c,   1, 0x01, 0x00010100 },207	{ 0x00073d,   1, 0x01, 0x02800000 },208	{ 0x000787,   1, 0x01, 0x000000cf },209	{ 0x00078c,   1, 0x01, 0x00000008 },210	{ 0x000792,   1, 0x01, 0x00000001 },211	{ 0x000794,   3, 0x01, 0x00000001 },212	{ 0x000797,   1, 0x01, 0x000000cf },213	{ 0x000836,   1, 0x01, 0x00000001 },214	{ 0x00079a,   1, 0x01, 0x00000002 },215	{ 0x000833,   1, 0x01, 0x04444480 },216	{ 0x0007a1,   1, 0x01, 0x00000001 },217	{ 0x0007a3,   3, 0x01, 0x00000001 },218	{ 0x000831,   1, 0x01, 0x00000004 },219	{ 0x00080c,   1, 0x01, 0x00000002 },220	{ 0x00080d,   2, 0x01, 0x00000100 },221	{ 0x00080f,   1, 0x01, 0x00000001 },222	{ 0x000823,   1, 0x01, 0x00000002 },223	{ 0x000824,   2, 0x01, 0x00000100 },224	{ 0x000826,   1, 0x01, 0x00000001 },225	{ 0x00095d,   1, 0x01, 0x00000001 },226	{ 0x00082b,   1, 0x01, 0x00000004 },227	{ 0x000942,   1, 0x01, 0x00010001 },228	{ 0x000943,   1, 0x01, 0x00000001 },229	{ 0x000944,   1, 0x01, 0x00000022 },230	{ 0x0007c5,   1, 0x01, 0x00010001 },231	{ 0x000834,   1, 0x01, 0x00000001 },232	{ 0x0007c7,   1, 0x01, 0x00000001 },233	{ 0x00c1b0,   8, 0x01, 0x0000000f },234	{ 0x00c1b8,   1, 0x01, 0x0fac6881 },235	{ 0x00c1b9,   1, 0x01, 0x00fac688 },236	{ 0x01e100,   1, 0x01, 0x00000001 },237	{ 0x001000,   1, 0x01, 0x00000002 },238	{ 0x0006aa,   1, 0x01, 0x00000001 },239	{ 0x0006ad,   2, 0x01, 0x00000100 },240	{ 0x0006b1,   1, 0x01, 0x00000011 },241	{ 0x00078c,   1, 0x01, 0x00000008 },242	{ 0x000792,   1, 0x01, 0x00000001 },243	{ 0x000794,   3, 0x01, 0x00000001 },244	{ 0x000797,   1, 0x01, 0x000000cf },245	{ 0x00079a,   1, 0x01, 0x00000002 },246	{ 0x000833,   1, 0x01, 0x04444480 },247	{ 0x0007a1,   1, 0x01, 0x00000001 },248	{ 0x0007a3,   3, 0x01, 0x00000001 },249	{ 0x000831,   1, 0x01, 0x00000004 },250	{ 0x01e100,   1, 0x01, 0x00000001 },251	{ 0x001000,   1, 0x01, 0x00000014 },252	{ 0x000351,   1, 0x01, 0x00000100 },253	{ 0x000957,   1, 0x01, 0x00000003 },254	{ 0x00095d,   1, 0x01, 0x00000001 },255	{ 0x00082b,   1, 0x01, 0x00000004 },256	{ 0x000942,   1, 0x01, 0x00010001 },257	{ 0x000943,   1, 0x01, 0x00000001 },258	{ 0x0007c5,   1, 0x01, 0x00010001 },259	{ 0x000834,   1, 0x01, 0x00000001 },260	{ 0x0007c7,   1, 0x01, 0x00000001 },261	{ 0x01e100,   1, 0x01, 0x00000001 },262	{ 0x001000,   1, 0x01, 0x00000001 },263	{ 0x00080c,   1, 0x01, 0x00000002 },264	{ 0x00080d,   2, 0x01, 0x00000100 },265	{ 0x00080f,   1, 0x01, 0x00000001 },266	{ 0x000823,   1, 0x01, 0x00000002 },267	{ 0x000824,   2, 0x01, 0x00000100 },268	{ 0x000826,   1, 0x01, 0x00000001 },269	{ 0x01e100,   1, 0x01, 0x00000001 },270	{}271};272 273const struct gf100_gr_pack274gf100_grctx_pack_icmd[] = {275	{ gf100_grctx_init_icmd_0 },276	{}277};278 279static const struct gf100_gr_init280gf100_grctx_init_9097_0[] = {281	{ 0x000800,   8, 0x40, 0x00000000 },282	{ 0x000804,   8, 0x40, 0x00000000 },283	{ 0x000808,   8, 0x40, 0x00000400 },284	{ 0x00080c,   8, 0x40, 0x00000300 },285	{ 0x000810,   1, 0x04, 0x000000cf },286	{ 0x000850,   7, 0x40, 0x00000000 },287	{ 0x000814,   8, 0x40, 0x00000040 },288	{ 0x000818,   8, 0x40, 0x00000001 },289	{ 0x00081c,   8, 0x40, 0x00000000 },290	{ 0x000820,   8, 0x40, 0x00000000 },291	{ 0x002700,   8, 0x20, 0x00000000 },292	{ 0x002704,   8, 0x20, 0x00000000 },293	{ 0x002708,   8, 0x20, 0x00000000 },294	{ 0x00270c,   8, 0x20, 0x00000000 },295	{ 0x002710,   8, 0x20, 0x00014000 },296	{ 0x002714,   8, 0x20, 0x00000040 },297	{ 0x001c00,  16, 0x10, 0x00000000 },298	{ 0x001c04,  16, 0x10, 0x00000000 },299	{ 0x001c08,  16, 0x10, 0x00000000 },300	{ 0x001c0c,  16, 0x10, 0x00000000 },301	{ 0x001d00,  16, 0x10, 0x00000000 },302	{ 0x001d04,  16, 0x10, 0x00000000 },303	{ 0x001d08,  16, 0x10, 0x00000000 },304	{ 0x001d0c,  16, 0x10, 0x00000000 },305	{ 0x001f00,  16, 0x08, 0x00000000 },306	{ 0x001f04,  16, 0x08, 0x00000000 },307	{ 0x001f80,  16, 0x08, 0x00000000 },308	{ 0x001f84,  16, 0x08, 0x00000000 },309	{ 0x002200,   5, 0x10, 0x00000022 },310	{ 0x002000,   1, 0x04, 0x00000000 },311	{ 0x002040,   1, 0x04, 0x00000011 },312	{ 0x002080,   1, 0x04, 0x00000020 },313	{ 0x0020c0,   1, 0x04, 0x00000030 },314	{ 0x002100,   1, 0x04, 0x00000040 },315	{ 0x002140,   1, 0x04, 0x00000051 },316	{ 0x00200c,   6, 0x40, 0x00000001 },317	{ 0x002010,   1, 0x04, 0x00000000 },318	{ 0x002050,   1, 0x04, 0x00000000 },319	{ 0x002090,   1, 0x04, 0x00000001 },320	{ 0x0020d0,   1, 0x04, 0x00000002 },321	{ 0x002110,   1, 0x04, 0x00000003 },322	{ 0x002150,   1, 0x04, 0x00000004 },323	{ 0x000380,   4, 0x20, 0x00000000 },324	{ 0x000384,   4, 0x20, 0x00000000 },325	{ 0x000388,   4, 0x20, 0x00000000 },326	{ 0x00038c,   4, 0x20, 0x00000000 },327	{ 0x000700,   4, 0x10, 0x00000000 },328	{ 0x000704,   4, 0x10, 0x00000000 },329	{ 0x000708,   4, 0x10, 0x00000000 },330	{ 0x002800, 128, 0x04, 0x00000000 },331	{ 0x000a00,  16, 0x20, 0x00000000 },332	{ 0x000a04,  16, 0x20, 0x00000000 },333	{ 0x000a08,  16, 0x20, 0x00000000 },334	{ 0x000a0c,  16, 0x20, 0x00000000 },335	{ 0x000a10,  16, 0x20, 0x00000000 },336	{ 0x000a14,  16, 0x20, 0x00000000 },337	{ 0x000c00,  16, 0x10, 0x00000000 },338	{ 0x000c04,  16, 0x10, 0x00000000 },339	{ 0x000c08,  16, 0x10, 0x00000000 },340	{ 0x000c0c,  16, 0x10, 0x3f800000 },341	{ 0x000d00,   8, 0x08, 0xffff0000 },342	{ 0x000d04,   8, 0x08, 0xffff0000 },343	{ 0x000e00,  16, 0x10, 0x00000000 },344	{ 0x000e04,  16, 0x10, 0xffff0000 },345	{ 0x000e08,  16, 0x10, 0xffff0000 },346	{ 0x000d40,   4, 0x08, 0x00000000 },347	{ 0x000d44,   4, 0x08, 0x00000000 },348	{ 0x001e00,   8, 0x20, 0x00000001 },349	{ 0x001e04,   8, 0x20, 0x00000001 },350	{ 0x001e08,   8, 0x20, 0x00000002 },351	{ 0x001e0c,   8, 0x20, 0x00000001 },352	{ 0x001e10,   8, 0x20, 0x00000001 },353	{ 0x001e14,   8, 0x20, 0x00000002 },354	{ 0x001e18,   8, 0x20, 0x00000001 },355	{ 0x003400, 128, 0x04, 0x00000000 },356	{ 0x00030c,   1, 0x04, 0x00000001 },357	{ 0x001944,   1, 0x04, 0x00000000 },358	{ 0x001514,   1, 0x04, 0x00000000 },359	{ 0x000d68,   1, 0x04, 0x0000ffff },360	{ 0x00121c,   1, 0x04, 0x0fac6881 },361	{ 0x000fac,   1, 0x04, 0x00000001 },362	{ 0x001538,   1, 0x04, 0x00000001 },363	{ 0x000fe0,   2, 0x04, 0x00000000 },364	{ 0x000fe8,   1, 0x04, 0x00000014 },365	{ 0x000fec,   1, 0x04, 0x00000040 },366	{ 0x000ff0,   1, 0x04, 0x00000000 },367	{ 0x00179c,   1, 0x04, 0x00000000 },368	{ 0x001228,   1, 0x04, 0x00000400 },369	{ 0x00122c,   1, 0x04, 0x00000300 },370	{ 0x001230,   1, 0x04, 0x00010001 },371	{ 0x0007f8,   1, 0x04, 0x00000000 },372	{ 0x0015b4,   1, 0x04, 0x00000001 },373	{ 0x0015cc,   1, 0x04, 0x00000000 },374	{ 0x001534,   1, 0x04, 0x00000000 },375	{ 0x000fb0,   1, 0x04, 0x00000000 },376	{ 0x0015d0,   1, 0x04, 0x00000000 },377	{ 0x00153c,   1, 0x04, 0x00000000 },378	{ 0x0016b4,   1, 0x04, 0x00000003 },379	{ 0x000fbc,   4, 0x04, 0x0000ffff },380	{ 0x000df8,   2, 0x04, 0x00000000 },381	{ 0x001948,   1, 0x04, 0x00000000 },382	{ 0x001970,   1, 0x04, 0x00000001 },383	{ 0x00161c,   1, 0x04, 0x000009f0 },384	{ 0x000dcc,   1, 0x04, 0x00000010 },385	{ 0x00163c,   1, 0x04, 0x00000000 },386	{ 0x0015e4,   1, 0x04, 0x00000000 },387	{ 0x001160,  32, 0x04, 0x25e00040 },388	{ 0x001880,  32, 0x04, 0x00000000 },389	{ 0x000f84,   2, 0x04, 0x00000000 },390	{ 0x0017c8,   2, 0x04, 0x00000000 },391	{ 0x0017d0,   1, 0x04, 0x000000ff },392	{ 0x0017d4,   1, 0x04, 0xffffffff },393	{ 0x0017d8,   1, 0x04, 0x00000002 },394	{ 0x0017dc,   1, 0x04, 0x00000000 },395	{ 0x0015f4,   2, 0x04, 0x00000000 },396	{ 0x001434,   2, 0x04, 0x00000000 },397	{ 0x000d74,   1, 0x04, 0x00000000 },398	{ 0x000dec,   1, 0x04, 0x00000001 },399	{ 0x0013a4,   1, 0x04, 0x00000000 },400	{ 0x001318,   1, 0x04, 0x00000001 },401	{ 0x001644,   1, 0x04, 0x00000000 },402	{ 0x000748,   1, 0x04, 0x00000000 },403	{ 0x000de8,   1, 0x04, 0x00000000 },404	{ 0x001648,   1, 0x04, 0x00000000 },405	{ 0x0012a4,   1, 0x04, 0x00000000 },406	{ 0x001120,   4, 0x04, 0x00000000 },407	{ 0x001118,   1, 0x04, 0x00000000 },408	{ 0x00164c,   1, 0x04, 0x00000000 },409	{ 0x001658,   1, 0x04, 0x00000000 },410	{ 0x001910,   1, 0x04, 0x00000290 },411	{ 0x001518,   1, 0x04, 0x00000000 },412	{ 0x00165c,   1, 0x04, 0x00000001 },413	{ 0x001520,   1, 0x04, 0x00000000 },414	{ 0x001604,   1, 0x04, 0x00000000 },415	{ 0x001570,   1, 0x04, 0x00000000 },416	{ 0x0013b0,   2, 0x04, 0x3f800000 },417	{ 0x00020c,   1, 0x04, 0x00000000 },418	{ 0x001670,   1, 0x04, 0x30201000 },419	{ 0x001674,   1, 0x04, 0x70605040 },420	{ 0x001678,   1, 0x04, 0xb8a89888 },421	{ 0x00167c,   1, 0x04, 0xf8e8d8c8 },422	{ 0x00166c,   1, 0x04, 0x00000000 },423	{ 0x001680,   1, 0x04, 0x00ffff00 },424	{ 0x0012d0,   1, 0x04, 0x00000003 },425	{ 0x0012d4,   1, 0x04, 0x00000002 },426	{ 0x001684,   2, 0x04, 0x00000000 },427	{ 0x000dac,   2, 0x04, 0x00001b02 },428	{ 0x000db4,   1, 0x04, 0x00000000 },429	{ 0x00168c,   1, 0x04, 0x00000000 },430	{ 0x0015bc,   1, 0x04, 0x00000000 },431	{ 0x00156c,   1, 0x04, 0x00000000 },432	{ 0x00187c,   1, 0x04, 0x00000000 },433	{ 0x001110,   1, 0x04, 0x00000001 },434	{ 0x000dc0,   3, 0x04, 0x00000000 },435	{ 0x001234,   1, 0x04, 0x00000000 },436	{ 0x001690,   1, 0x04, 0x00000000 },437	{ 0x0012ac,   1, 0x04, 0x00000001 },438	{ 0x0002c4,   1, 0x04, 0x00000000 },439	{ 0x000790,   5, 0x04, 0x00000000 },440	{ 0x00077c,   1, 0x04, 0x00000000 },441	{ 0x001000,   1, 0x04, 0x00000010 },442	{ 0x0010fc,   1, 0x04, 0x00000000 },443	{ 0x001290,   1, 0x04, 0x00000000 },444	{ 0x000218,   1, 0x04, 0x00000010 },445	{ 0x0012d8,   1, 0x04, 0x00000000 },446	{ 0x0012dc,   1, 0x04, 0x00000010 },447	{ 0x000d94,   1, 0x04, 0x00000001 },448	{ 0x00155c,   2, 0x04, 0x00000000 },449	{ 0x001564,   1, 0x04, 0x00001fff },450	{ 0x001574,   2, 0x04, 0x00000000 },451	{ 0x00157c,   1, 0x04, 0x003fffff },452	{ 0x001354,   1, 0x04, 0x00000000 },453	{ 0x001664,   1, 0x04, 0x00000000 },454	{ 0x001610,   1, 0x04, 0x00000012 },455	{ 0x001608,   2, 0x04, 0x00000000 },456	{ 0x00162c,   1, 0x04, 0x00000003 },457	{ 0x000210,   1, 0x04, 0x00000000 },458	{ 0x000320,   1, 0x04, 0x00000000 },459	{ 0x000324,   6, 0x04, 0x3f800000 },460	{ 0x000750,   1, 0x04, 0x00000000 },461	{ 0x000760,   1, 0x04, 0x39291909 },462	{ 0x000764,   1, 0x04, 0x79695949 },463	{ 0x000768,   1, 0x04, 0xb9a99989 },464	{ 0x00076c,   1, 0x04, 0xf9e9d9c9 },465	{ 0x000770,   1, 0x04, 0x30201000 },466	{ 0x000774,   1, 0x04, 0x70605040 },467	{ 0x000778,   1, 0x04, 0x00009080 },468	{ 0x000780,   1, 0x04, 0x39291909 },469	{ 0x000784,   1, 0x04, 0x79695949 },470	{ 0x000788,   1, 0x04, 0xb9a99989 },471	{ 0x00078c,   1, 0x04, 0xf9e9d9c9 },472	{ 0x0007d0,   1, 0x04, 0x30201000 },473	{ 0x0007d4,   1, 0x04, 0x70605040 },474	{ 0x0007d8,   1, 0x04, 0x00009080 },475	{ 0x00037c,   1, 0x04, 0x00000001 },476	{ 0x000740,   2, 0x04, 0x00000000 },477	{ 0x002600,   1, 0x04, 0x00000000 },478	{ 0x001918,   1, 0x04, 0x00000000 },479	{ 0x00191c,   1, 0x04, 0x00000900 },480	{ 0x001920,   1, 0x04, 0x00000405 },481	{ 0x001308,   1, 0x04, 0x00000001 },482	{ 0x001924,   1, 0x04, 0x00000000 },483	{ 0x0013ac,   1, 0x04, 0x00000000 },484	{ 0x00192c,   1, 0x04, 0x00000001 },485	{ 0x00193c,   1, 0x04, 0x00002c1c },486	{ 0x000d7c,   1, 0x04, 0x00000000 },487	{ 0x000f8c,   1, 0x04, 0x00000000 },488	{ 0x0002c0,   1, 0x04, 0x00000001 },489	{ 0x001510,   1, 0x04, 0x00000000 },490	{ 0x001940,   1, 0x04, 0x00000000 },491	{ 0x000ff4,   2, 0x04, 0x00000000 },492	{ 0x00194c,   2, 0x04, 0x00000000 },493	{ 0x001968,   1, 0x04, 0x00000000 },494	{ 0x001590,   1, 0x04, 0x0000003f },495	{ 0x0007e8,   4, 0x04, 0x00000000 },496	{ 0x00196c,   1, 0x04, 0x00000011 },497	{ 0x00197c,   1, 0x04, 0x00000000 },498	{ 0x000fcc,   2, 0x04, 0x00000000 },499	{ 0x0002d8,   1, 0x04, 0x00000040 },500	{ 0x001980,   1, 0x04, 0x00000080 },501	{ 0x001504,   1, 0x04, 0x00000080 },502	{ 0x001984,   1, 0x04, 0x00000000 },503	{ 0x000300,   1, 0x04, 0x00000001 },504	{ 0x0013a8,   1, 0x04, 0x00000000 },505	{ 0x0012ec,   1, 0x04, 0x00000000 },506	{ 0x001310,   1, 0x04, 0x00000000 },507	{ 0x001314,   1, 0x04, 0x00000001 },508	{ 0x001380,   1, 0x04, 0x00000000 },509	{ 0x001384,   4, 0x04, 0x00000001 },510	{ 0x001394,   1, 0x04, 0x00000000 },511	{ 0x00139c,   1, 0x04, 0x00000000 },512	{ 0x001398,   1, 0x04, 0x00000000 },513	{ 0x001594,   1, 0x04, 0x00000000 },514	{ 0x001598,   4, 0x04, 0x00000001 },515	{ 0x000f54,   3, 0x04, 0x00000000 },516	{ 0x0019bc,   1, 0x04, 0x00000000 },517	{ 0x000f9c,   2, 0x04, 0x00000000 },518	{ 0x0012cc,   1, 0x04, 0x00000000 },519	{ 0x0012e8,   1, 0x04, 0x00000000 },520	{ 0x00130c,   1, 0x04, 0x00000001 },521	{ 0x001360,   8, 0x04, 0x00000000 },522	{ 0x00133c,   2, 0x04, 0x00000001 },523	{ 0x001344,   1, 0x04, 0x00000002 },524	{ 0x001348,   2, 0x04, 0x00000001 },525	{ 0x001350,   1, 0x04, 0x00000002 },526	{ 0x001358,   1, 0x04, 0x00000001 },527	{ 0x0012e4,   1, 0x04, 0x00000000 },528	{ 0x00131c,   4, 0x04, 0x00000000 },529	{ 0x0019c0,   1, 0x04, 0x00000000 },530	{ 0x001140,   1, 0x04, 0x00000000 },531	{ 0x0019c4,   1, 0x04, 0x00000000 },532	{ 0x0019c8,   1, 0x04, 0x00001500 },533	{ 0x00135c,   1, 0x04, 0x00000000 },534	{ 0x000f90,   1, 0x04, 0x00000000 },535	{ 0x0019e0,   8, 0x04, 0x00000001 },536	{ 0x0019cc,   1, 0x04, 0x00000001 },537	{ 0x0015b8,   1, 0x04, 0x00000000 },538	{ 0x001a00,   1, 0x04, 0x00001111 },539	{ 0x001a04,   7, 0x04, 0x00000000 },540	{ 0x000d6c,   2, 0x04, 0xffff0000 },541	{ 0x0010f8,   1, 0x04, 0x00001010 },542	{ 0x000d80,   5, 0x04, 0x00000000 },543	{ 0x000da0,   1, 0x04, 0x00000000 },544	{ 0x001508,   1, 0x04, 0x80000000 },545	{ 0x00150c,   1, 0x04, 0x40000000 },546	{ 0x001668,   1, 0x04, 0x00000000 },547	{ 0x000318,   2, 0x04, 0x00000008 },548	{ 0x000d9c,   1, 0x04, 0x00000001 },549	{ 0x0007dc,   1, 0x04, 0x00000000 },550	{ 0x00074c,   1, 0x04, 0x00000055 },551	{ 0x001420,   1, 0x04, 0x00000003 },552	{ 0x0017bc,   2, 0x04, 0x00000000 },553	{ 0x0017c4,   1, 0x04, 0x00000001 },554	{ 0x001008,   1, 0x04, 0x00000008 },555	{ 0x00100c,   1, 0x04, 0x00000040 },556	{ 0x001010,   1, 0x04, 0x0000012c },557	{ 0x000d60,   1, 0x04, 0x00000040 },558	{ 0x00075c,   1, 0x04, 0x00000003 },559	{ 0x001018,   1, 0x04, 0x00000020 },560	{ 0x00101c,   1, 0x04, 0x00000001 },561	{ 0x001020,   1, 0x04, 0x00000020 },562	{ 0x001024,   1, 0x04, 0x00000001 },563	{ 0x001444,   3, 0x04, 0x00000000 },564	{ 0x000360,   1, 0x04, 0x20164010 },565	{ 0x000364,   1, 0x04, 0x00000020 },566	{ 0x000368,   1, 0x04, 0x00000000 },567	{ 0x000de4,   1, 0x04, 0x00000000 },568	{ 0x000204,   1, 0x04, 0x00000006 },569	{ 0x000208,   1, 0x04, 0x00000000 },570	{ 0x0002cc,   1, 0x04, 0x003fffff },571	{ 0x0002d0,   1, 0x04, 0x00000c48 },572	{ 0x001220,   1, 0x04, 0x00000005 },573	{ 0x000fdc,   1, 0x04, 0x00000000 },574	{ 0x000f98,   1, 0x04, 0x00300008 },575	{ 0x001284,   1, 0x04, 0x04000080 },576	{ 0x001450,   1, 0x04, 0x00300008 },577	{ 0x001454,   1, 0x04, 0x04000080 },578	{ 0x000214,   1, 0x04, 0x00000000 },579	{}580};581 582const struct gf100_gr_init583gf100_grctx_init_902d_0[] = {584	{ 0x000200,   1, 0x04, 0x000000cf },585	{ 0x000204,   1, 0x04, 0x00000001 },586	{ 0x000208,   1, 0x04, 0x00000020 },587	{ 0x00020c,   1, 0x04, 0x00000001 },588	{ 0x000210,   1, 0x04, 0x00000000 },589	{ 0x000214,   1, 0x04, 0x00000080 },590	{ 0x000218,   2, 0x04, 0x00000100 },591	{ 0x000220,   2, 0x04, 0x00000000 },592	{ 0x000230,   1, 0x04, 0x000000cf },593	{ 0x000234,   1, 0x04, 0x00000001 },594	{ 0x000238,   1, 0x04, 0x00000020 },595	{ 0x00023c,   1, 0x04, 0x00000001 },596	{ 0x000244,   1, 0x04, 0x00000080 },597	{ 0x000248,   2, 0x04, 0x00000100 },598	{}599};600 601const struct gf100_gr_init602gf100_grctx_init_9039_0[] = {603	{ 0x00030c,   3, 0x04, 0x00000000 },604	{ 0x000320,   1, 0x04, 0x00000000 },605	{ 0x000238,   2, 0x04, 0x00000000 },606	{ 0x000318,   2, 0x04, 0x00000000 },607	{}608};609 610const struct gf100_gr_init611gf100_grctx_init_90c0_0[] = {612	{ 0x00270c,   8, 0x20, 0x00000000 },613	{ 0x00030c,   1, 0x04, 0x00000001 },614	{ 0x001944,   1, 0x04, 0x00000000 },615	{ 0x000758,   1, 0x04, 0x00000100 },616	{ 0x0002c4,   1, 0x04, 0x00000000 },617	{ 0x000790,   5, 0x04, 0x00000000 },618	{ 0x00077c,   1, 0x04, 0x00000000 },619	{ 0x000204,   3, 0x04, 0x00000000 },620	{ 0x000214,   1, 0x04, 0x00000000 },621	{ 0x00024c,   1, 0x04, 0x00000000 },622	{ 0x000d94,   1, 0x04, 0x00000001 },623	{ 0x001608,   2, 0x04, 0x00000000 },624	{ 0x001664,   1, 0x04, 0x00000000 },625	{}626};627 628const struct gf100_gr_pack629gf100_grctx_pack_mthd[] = {630	{ gf100_grctx_init_9097_0, 0x9097 },631	{ gf100_grctx_init_902d_0, 0x902d },632	{ gf100_grctx_init_9039_0, 0x9039 },633	{ gf100_grctx_init_90c0_0, 0x90c0 },634	{}635};636 637const struct gf100_gr_init638gf100_grctx_init_main_0[] = {639	{ 0x400204,   2, 0x04, 0x00000000 },640	{}641};642 643const struct gf100_gr_init644gf100_grctx_init_fe_0[] = {645	{ 0x404004,  11, 0x04, 0x00000000 },646	{ 0x404044,   1, 0x04, 0x00000000 },647	{ 0x404094,  13, 0x04, 0x00000000 },648	{ 0x4040c8,   1, 0x04, 0xf0000087 },649	{ 0x4040d0,   6, 0x04, 0x00000000 },650	{ 0x4040e8,   1, 0x04, 0x00001000 },651	{ 0x4040f8,   1, 0x04, 0x00000000 },652	{ 0x404130,   2, 0x04, 0x00000000 },653	{ 0x404138,   1, 0x04, 0x20000040 },654	{ 0x404150,   1, 0x04, 0x0000002e },655	{ 0x404154,   1, 0x04, 0x00000400 },656	{ 0x404158,   1, 0x04, 0x00000200 },657	{ 0x404164,   1, 0x04, 0x00000055 },658	{ 0x404168,   1, 0x04, 0x00000000 },659	{ 0x404174,   3, 0x04, 0x00000000 },660	{ 0x404200,   8, 0x04, 0x00000000 },661	{}662};663 664const struct gf100_gr_init665gf100_grctx_init_pri_0[] = {666	{ 0x404404,  14, 0x04, 0x00000000 },667	{ 0x404460,   2, 0x04, 0x00000000 },668	{ 0x404468,   1, 0x04, 0x00ffffff },669	{ 0x40446c,   1, 0x04, 0x00000000 },670	{ 0x404480,   1, 0x04, 0x00000001 },671	{ 0x404498,   1, 0x04, 0x00000001 },672	{}673};674 675const struct gf100_gr_init676gf100_grctx_init_memfmt_0[] = {677	{ 0x404604,   1, 0x04, 0x00000015 },678	{ 0x404608,   1, 0x04, 0x00000000 },679	{ 0x40460c,   1, 0x04, 0x00002e00 },680	{ 0x404610,   1, 0x04, 0x00000100 },681	{ 0x404618,   8, 0x04, 0x00000000 },682	{ 0x404638,   1, 0x04, 0x00000004 },683	{ 0x40463c,   8, 0x04, 0x00000000 },684	{ 0x40465c,   1, 0x04, 0x007f0100 },685	{ 0x404660,   7, 0x04, 0x00000000 },686	{ 0x40467c,   1, 0x04, 0x00000002 },687	{ 0x404680,   8, 0x04, 0x00000000 },688	{ 0x4046a0,   1, 0x04, 0x007f0080 },689	{ 0x4046a4,  18, 0x04, 0x00000000 },690	{ 0x4046f0,   2, 0x04, 0x00000000 },691	{ 0x404700,  13, 0x04, 0x00000000 },692	{ 0x404734,   1, 0x04, 0x00000100 },693	{ 0x404738,   8, 0x04, 0x00000000 },694	{}695};696 697static const struct gf100_gr_init698gf100_grctx_init_ds_0[] = {699	{ 0x405800,   1, 0x04, 0x078000bf },700	{ 0x405830,   1, 0x04, 0x02180000 },701	{ 0x405834,   2, 0x04, 0x00000000 },702	{ 0x405854,   1, 0x04, 0x00000000 },703	{ 0x405870,   4, 0x04, 0x00000001 },704	{ 0x405a00,   2, 0x04, 0x00000000 },705	{ 0x405a18,   1, 0x04, 0x00000000 },706	{}707};708 709static const struct gf100_gr_init710gf100_grctx_init_pd_0[] = {711	{ 0x406020,   1, 0x04, 0x000103c1 },712	{ 0x406028,   4, 0x04, 0x00000001 },713	{ 0x4064a8,   1, 0x04, 0x00000000 },714	{ 0x4064ac,   1, 0x04, 0x00003fff },715	{ 0x4064b4,   2, 0x04, 0x00000000 },716	{}717};718 719const struct gf100_gr_init720gf100_grctx_init_rstr2d_0[] = {721	{ 0x407804,   1, 0x04, 0x00000023 },722	{ 0x40780c,   1, 0x04, 0x0a418820 },723	{ 0x407810,   1, 0x04, 0x062080e6 },724	{ 0x407814,   1, 0x04, 0x020398a4 },725	{ 0x407818,   1, 0x04, 0x0e629062 },726	{ 0x40781c,   1, 0x04, 0x0a418820 },727	{ 0x407820,   1, 0x04, 0x000000e6 },728	{ 0x4078bc,   1, 0x04, 0x00000103 },729	{}730};731 732const struct gf100_gr_init733gf100_grctx_init_scc_0[] = {734	{ 0x408000,   2, 0x04, 0x00000000 },735	{ 0x408008,   1, 0x04, 0x00000018 },736	{ 0x40800c,   2, 0x04, 0x00000000 },737	{ 0x408014,   1, 0x04, 0x00000069 },738	{ 0x408018,   1, 0x04, 0xe100e100 },739	{ 0x408064,   1, 0x04, 0x00000000 },740	{}741};742 743static const struct gf100_gr_init744gf100_grctx_init_be_0[] = {745	{ 0x408800,   1, 0x04, 0x02802a3c },746	{ 0x408804,   1, 0x04, 0x00000040 },747	{ 0x408808,   1, 0x04, 0x0003e00d },748	{ 0x408900,   1, 0x04, 0x3080b801 },749	{ 0x408904,   1, 0x04, 0x02000001 },750	{ 0x408908,   1, 0x04, 0x00c80929 },751	{ 0x408980,   1, 0x04, 0x0000011d },752	{}753};754 755const struct gf100_gr_pack756gf100_grctx_pack_hub[] = {757	{ gf100_grctx_init_main_0 },758	{ gf100_grctx_init_fe_0 },759	{ gf100_grctx_init_pri_0 },760	{ gf100_grctx_init_memfmt_0 },761	{ gf100_grctx_init_ds_0 },762	{ gf100_grctx_init_pd_0 },763	{ gf100_grctx_init_rstr2d_0 },764	{ gf100_grctx_init_scc_0 },765	{ gf100_grctx_init_be_0 },766	{}767};768 769const struct gf100_gr_init770gf100_grctx_init_gpc_unk_0[] = {771	{ 0x418380,   1, 0x04, 0x00000016 },772	{}773};774 775const struct gf100_gr_init776gf100_grctx_init_prop_0[] = {777	{ 0x418400,   1, 0x04, 0x38004e00 },778	{ 0x418404,   1, 0x04, 0x71e0ffff },779	{ 0x418408,   1, 0x04, 0x00000000 },780	{ 0x41840c,   1, 0x04, 0x00001008 },781	{ 0x418410,   1, 0x04, 0x0fff0fff },782	{ 0x418414,   1, 0x04, 0x00200fff },783	{ 0x418450,   6, 0x04, 0x00000000 },784	{ 0x418468,   1, 0x04, 0x00000001 },785	{ 0x41846c,   2, 0x04, 0x00000000 },786	{}787};788 789const struct gf100_gr_init790gf100_grctx_init_gpc_unk_1[] = {791	{ 0x418600,   1, 0x04, 0x0000001f },792	{ 0x418684,   1, 0x04, 0x0000000f },793	{ 0x418700,   1, 0x04, 0x00000002 },794	{ 0x418704,   1, 0x04, 0x00000080 },795	{ 0x418708,   1, 0x04, 0x00000000 },796	{ 0x41870c,   1, 0x04, 0x07c80000 },797	{ 0x418710,   1, 0x04, 0x00000000 },798	{}799};800 801static const struct gf100_gr_init802gf100_grctx_init_setup_0[] = {803	{ 0x418800,   1, 0x04, 0x0006860a },804	{ 0x418808,   3, 0x04, 0x00000000 },805	{ 0x418828,   1, 0x04, 0x00008442 },806	{ 0x418830,   1, 0x04, 0x00000001 },807	{ 0x4188d8,   1, 0x04, 0x00000008 },808	{ 0x4188e0,   1, 0x04, 0x01000000 },809	{ 0x4188e8,   5, 0x04, 0x00000000 },810	{ 0x4188fc,   1, 0x04, 0x00100000 },811	{}812};813 814const struct gf100_gr_init815gf100_grctx_init_zcull_0[] = {816	{ 0x41891c,   1, 0x04, 0x00ff00ff },817	{ 0x418924,   1, 0x04, 0x00000000 },818	{ 0x418928,   1, 0x04, 0x00ffff00 },819	{ 0x41892c,   1, 0x04, 0x0000ff00 },820	{}821};822 823const struct gf100_gr_init824gf100_grctx_init_crstr_0[] = {825	{ 0x418b00,   1, 0x04, 0x00000000 },826	{ 0x418b08,   1, 0x04, 0x0a418820 },827	{ 0x418b0c,   1, 0x04, 0x062080e6 },828	{ 0x418b10,   1, 0x04, 0x020398a4 },829	{ 0x418b14,   1, 0x04, 0x0e629062 },830	{ 0x418b18,   1, 0x04, 0x0a418820 },831	{ 0x418b1c,   1, 0x04, 0x000000e6 },832	{ 0x418bb8,   1, 0x04, 0x00000103 },833	{}834};835 836const struct gf100_gr_init837gf100_grctx_init_gpm_0[] = {838	{ 0x418c08,   1, 0x04, 0x00000001 },839	{ 0x418c10,   8, 0x04, 0x00000000 },840	{ 0x418c80,   1, 0x04, 0x20200004 },841	{ 0x418c8c,   1, 0x04, 0x00000001 },842	{}843};844 845const struct gf100_gr_init846gf100_grctx_init_gcc_0[] = {847	{ 0x419000,   1, 0x04, 0x00000780 },848	{ 0x419004,   2, 0x04, 0x00000000 },849	{ 0x419014,   1, 0x04, 0x00000004 },850	{}851};852 853const struct gf100_gr_pack854gf100_grctx_pack_gpc_0[] = {855	{ gf100_grctx_init_gpc_unk_0 },856	{ gf100_grctx_init_prop_0 },857	{ gf100_grctx_init_gpc_unk_1 },858	{ gf100_grctx_init_setup_0 },859	{ gf100_grctx_init_zcull_0 },860	{}861};862 863const struct gf100_gr_pack864gf100_grctx_pack_gpc_1[] = {865	{ gf100_grctx_init_crstr_0 },866	{ gf100_grctx_init_gpm_0 },867	{ gf100_grctx_init_gcc_0 },868	{}869};870 871static const struct gf100_gr_init872gf100_grctx_init_zcullr_0[] = {873	{ 0x418a00,   3, 0x04, 0x00000000 },874	{ 0x418a0c,   1, 0x04, 0x00010000 },875	{ 0x418a10,   3, 0x04, 0x00000000 },876	{ 0x418a20,   3, 0x04, 0x00000000 },877	{ 0x418a2c,   1, 0x04, 0x00010000 },878	{ 0x418a30,   3, 0x04, 0x00000000 },879	{ 0x418a40,   3, 0x04, 0x00000000 },880	{ 0x418a4c,   1, 0x04, 0x00010000 },881	{ 0x418a50,   3, 0x04, 0x00000000 },882	{ 0x418a60,   3, 0x04, 0x00000000 },883	{ 0x418a6c,   1, 0x04, 0x00010000 },884	{ 0x418a70,   3, 0x04, 0x00000000 },885	{ 0x418a80,   3, 0x04, 0x00000000 },886	{ 0x418a8c,   1, 0x04, 0x00010000 },887	{ 0x418a90,   3, 0x04, 0x00000000 },888	{ 0x418aa0,   3, 0x04, 0x00000000 },889	{ 0x418aac,   1, 0x04, 0x00010000 },890	{ 0x418ab0,   3, 0x04, 0x00000000 },891	{ 0x418ac0,   3, 0x04, 0x00000000 },892	{ 0x418acc,   1, 0x04, 0x00010000 },893	{ 0x418ad0,   3, 0x04, 0x00000000 },894	{ 0x418ae0,   3, 0x04, 0x00000000 },895	{ 0x418aec,   1, 0x04, 0x00010000 },896	{ 0x418af0,   3, 0x04, 0x00000000 },897	{}898};899 900const struct gf100_gr_pack901gf100_grctx_pack_zcull[] = {902	{ gf100_grctx_init_zcullr_0 },903	{}904};905 906const struct gf100_gr_init907gf100_grctx_init_pe_0[] = {908	{ 0x419818,   1, 0x04, 0x00000000 },909	{ 0x41983c,   1, 0x04, 0x00038bc7 },910	{ 0x419848,   1, 0x04, 0x00000000 },911	{ 0x419864,   1, 0x04, 0x0000012a },912	{ 0x419888,   1, 0x04, 0x00000000 },913	{}914};915 916static const struct gf100_gr_init917gf100_grctx_init_tex_0[] = {918	{ 0x419a00,   1, 0x04, 0x000001f0 },919	{ 0x419a04,   1, 0x04, 0x00000001 },920	{ 0x419a08,   1, 0x04, 0x00000023 },921	{ 0x419a0c,   1, 0x04, 0x00020000 },922	{ 0x419a10,   1, 0x04, 0x00000000 },923	{ 0x419a14,   1, 0x04, 0x00000200 },924	{}925};926 927const struct gf100_gr_init928gf100_grctx_init_wwdx_0[] = {929	{ 0x419b00,   1, 0x04, 0x0a418820 },930	{ 0x419b04,   1, 0x04, 0x062080e6 },931	{ 0x419b08,   1, 0x04, 0x020398a4 },932	{ 0x419b0c,   1, 0x04, 0x0e629062 },933	{ 0x419b10,   1, 0x04, 0x0a418820 },934	{ 0x419b14,   1, 0x04, 0x000000e6 },935	{ 0x419bd0,   1, 0x04, 0x00900103 },936	{ 0x419be0,   1, 0x04, 0x00000001 },937	{ 0x419be4,   1, 0x04, 0x00000000 },938	{}939};940 941const struct gf100_gr_init942gf100_grctx_init_mpc_0[] = {943	{ 0x419c00,   1, 0x04, 0x00000002 },944	{ 0x419c04,   1, 0x04, 0x00000006 },945	{ 0x419c08,   1, 0x04, 0x00000002 },946	{ 0x419c20,   1, 0x04, 0x00000000 },947	{}948};949 950static const struct gf100_gr_init951gf100_grctx_init_l1c_0[] = {952	{ 0x419cb0,   1, 0x04, 0x00060048 },953	{ 0x419ce8,   1, 0x04, 0x00000000 },954	{ 0x419cf4,   1, 0x04, 0x00000183 },955	{}956};957 958const struct gf100_gr_init959gf100_grctx_init_tpccs_0[] = {960	{ 0x419d20,   1, 0x04, 0x02180000 },961	{ 0x419d24,   1, 0x04, 0x00001fff },962	{}963};964 965static const struct gf100_gr_init966gf100_grctx_init_sm_0[] = {967	{ 0x419e04,   3, 0x04, 0x00000000 },968	{ 0x419e10,   1, 0x04, 0x00000002 },969	{ 0x419e44,   1, 0x04, 0x001beff2 },970	{ 0x419e48,   1, 0x04, 0x00000000 },971	{ 0x419e4c,   1, 0x04, 0x0000000f },972	{ 0x419e50,  17, 0x04, 0x00000000 },973	{ 0x419e98,   1, 0x04, 0x00000000 },974	{ 0x419f50,   2, 0x04, 0x00000000 },975	{}976};977 978const struct gf100_gr_pack979gf100_grctx_pack_tpc[] = {980	{ gf100_grctx_init_pe_0 },981	{ gf100_grctx_init_tex_0 },982	{ gf100_grctx_init_wwdx_0 },983	{ gf100_grctx_init_mpc_0 },984	{ gf100_grctx_init_l1c_0 },985	{ gf100_grctx_init_tpccs_0 },986	{ gf100_grctx_init_sm_0 },987	{}988};989 990/*******************************************************************************991 * PGRAPH context implementation992 ******************************************************************************/993 994void995gf100_grctx_patch_wr32(struct gf100_gr_chan *chan, u32 addr, u32 data)996{997	if (unlikely(!chan->mmio)) {998		nvkm_wr32(chan->gr->base.engine.subdev.device, addr, data);999		return;1000	}1001 1002	nvkm_wo32(chan->mmio, chan->mmio_nr++ * 4, addr);1003	nvkm_wo32(chan->mmio, chan->mmio_nr++ * 4, data);1004}1005 1006void1007gf100_grctx_generate_r419cb8(struct gf100_gr *gr)1008{1009	struct nvkm_device *device = gr->base.engine.subdev.device;1010	nvkm_mask(device, 0x419cb8, 0x00007c00, 0x00000000);1011}1012 1013void1014gf100_grctx_generate_bundle(struct gf100_gr_chan *chan, u64 addr, u32 size)1015{1016	gf100_grctx_patch_wr32(chan, 0x408004, addr >> 8);1017	gf100_grctx_patch_wr32(chan, 0x408008, 0x80000000 | (size >> 8));1018	gf100_grctx_patch_wr32(chan, 0x418808, addr >> 8);1019	gf100_grctx_patch_wr32(chan, 0x41880c, 0x80000000 | (size >> 8));1020}1021 1022void1023gf100_grctx_generate_pagepool(struct gf100_gr_chan *chan, u64 addr)1024{1025	gf100_grctx_patch_wr32(chan, 0x40800c, addr >> 8);1026	gf100_grctx_patch_wr32(chan, 0x408010, 0x80000000);1027	gf100_grctx_patch_wr32(chan, 0x419004, addr >> 8);1028	gf100_grctx_patch_wr32(chan, 0x419008, 0x00000000);1029}1030 1031void1032gf100_grctx_generate_attrib(struct gf100_gr_chan *chan)1033{1034	struct gf100_gr *gr = chan->gr;1035	const struct gf100_grctx_func *grctx = gr->func->grctx;1036	const u32 attrib = grctx->attrib_nr;1037	int gpc, tpc;1038	u32 bo = 0;1039 1040	gf100_grctx_patch_wr32(chan, 0x405830, (attrib << 16));1041 1042	for (gpc = 0; gpc < gr->gpc_nr; gpc++) {1043		for (tpc = 0; tpc < gr->tpc_nr[gpc]; tpc++) {1044			const u32 o = TPC_UNIT(gpc, tpc, 0x0520);1045 1046			gf100_grctx_patch_wr32(chan, o, (attrib << 16) | bo);1047			bo += grctx->attrib_nr_max;1048		}1049	}1050}1051 1052void1053gf100_grctx_generate_attrib_cb(struct gf100_gr_chan *chan, u64 addr, u32 size)1054{1055	gf100_grctx_patch_wr32(chan, 0x418810, 0x80000000 | addr >> 12);1056	gf100_grctx_patch_wr32(chan, 0x419848, 0x10000000 | addr >> 12);1057}1058 1059u321060gf100_grctx_generate_attrib_cb_size(struct gf100_gr *gr)1061{1062	const struct gf100_grctx_func *grctx = gr->func->grctx;1063 1064	return 0x20 * (grctx->attrib_nr_max + grctx->alpha_nr_max) * gr->tpc_total;1065}1066 1067void1068gf100_grctx_generate_unkn(struct gf100_gr *gr)1069{1070}1071 1072void1073gf100_grctx_generate_r4060a8(struct gf100_gr *gr)1074{1075	struct nvkm_device *device = gr->base.engine.subdev.device;1076	const u8 gpcmax = nvkm_rd32(device, 0x022430);1077	const u8 tpcmax = nvkm_rd32(device, 0x022434) * gpcmax;1078	int i, j, sm = 0;1079	u32 data;1080 1081	for (i = 0; i < DIV_ROUND_UP(tpcmax, 4); i++) {1082		for (data = 0, j = 0; j < 4; j++) {1083			if (sm < gr->sm_nr)1084				data |= gr->sm[sm++].gpc << (j * 8);1085			else1086				data |= 0x1f << (j * 8);1087		}1088		nvkm_wr32(device, 0x4060a8 + (i * 4), data);1089	}1090}1091 1092void1093gf100_grctx_generate_rop_mapping(struct gf100_gr *gr)1094{1095	struct nvkm_device *device = gr->base.engine.subdev.device;1096	u32 data[6] = {}, data2[2] = {};1097	u8  shift, ntpcv;1098	int i;1099 1100	/* Pack tile map into register format. */1101	for (i = 0; i < 32; i++)1102		data[i / 6] |= (gr->tile[i] & 0x07) << ((i % 6) * 5);1103 1104	/* Magic. */1105	shift = 0;1106	ntpcv = gr->tpc_total;1107	while (!(ntpcv & (1 << 4))) {1108		ntpcv <<= 1;1109		shift++;1110	}1111 1112	data2[0]  = (ntpcv << 16);1113	data2[0] |= (shift << 21);1114	data2[0] |= (((1 << (0 + 5)) % ntpcv) << 24);1115	for (i = 1; i < 7; i++)1116		data2[1] |= ((1 << (i + 5)) % ntpcv) << ((i - 1) * 5);1117 1118	/* GPC_BROADCAST */1119	nvkm_wr32(device, 0x418bb8, (gr->tpc_total << 8) |1120				     gr->screen_tile_row_offset);1121	for (i = 0; i < 6; i++)1122		nvkm_wr32(device, 0x418b08 + (i * 4), data[i]);1123 1124	/* GPC_BROADCAST.TP_BROADCAST */1125	nvkm_wr32(device, 0x419bd0, (gr->tpc_total << 8) |1126				     gr->screen_tile_row_offset | data2[0]);1127	nvkm_wr32(device, 0x419be4, data2[1]);1128	for (i = 0; i < 6; i++)1129		nvkm_wr32(device, 0x419b00 + (i * 4), data[i]);1130 1131	/* UNK78xx */1132	nvkm_wr32(device, 0x4078bc, (gr->tpc_total << 8) |1133				     gr->screen_tile_row_offset);1134	for (i = 0; i < 6; i++)1135		nvkm_wr32(device, 0x40780c + (i * 4), data[i]);1136}1137 1138void1139gf100_grctx_generate_max_ways_evict(struct gf100_gr *gr)1140{1141	struct nvkm_device *device = gr->base.engine.subdev.device;1142	u32 fbps = nvkm_rd32(device, 0x121c74);1143	if (fbps == 1)1144		nvkm_mask(device, 0x17e91c, 0x001f0000, 0x00090000);1145}1146 1147static const u321148gf100_grctx_alpha_beta_map[17][32] = {1149	[1] = {1150		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1151		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1152	},1153	[2] = {1154		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1155		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1156	},1157	//XXX: 31158	[4] = {1159		1, 1, 1, 1, 1, 1, 1, 1,1160		2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,1161		3, 3, 3, 3, 3, 3, 3, 3,1162	},1163	//XXX: 51164	//XXX: 61165	[7] = {1166		1, 1, 1, 1,1167		2, 2, 2, 2, 2, 2,1168		3, 3, 3, 3, 3, 3,1169		4, 4, 4, 4, 4, 4,1170		5, 5, 5, 5, 5, 5,1171		6, 6, 6, 6,1172	},1173	[8] = {1174		1, 1, 1,1175		2, 2, 2, 2, 2,1176		3, 3, 3, 3, 3,1177		4, 4, 4, 4, 4, 4,1178		5, 5, 5, 5, 5,1179		6, 6, 6, 6, 6,1180		7, 7, 7,1181	},1182	//XXX: 91183	//XXX: 101184	[11] = {1185		1, 1,1186		2, 2, 2, 2,1187		3, 3, 3,1188		4, 4, 4, 4,1189		5, 5, 5,1190		6, 6, 6,1191		7, 7, 7, 7,1192		8, 8, 8,1193		9, 9, 9, 9,1194		10, 10,1195	},1196	//XXX: 121197	//XXX: 131198	[14] = {1199		1, 1,1200		2, 2,1201		3, 3, 3,1202		4, 4, 4,1203		5, 5,1204		6, 6, 6,1205		7, 7,1206		8, 8, 8,1207		9, 9,1208		10, 10, 10,1209		11, 11, 11,1210		12, 12,1211		13, 13,1212	},1213	[15] = {1214		1, 1,1215		2, 2,1216		3, 3,1217		4, 4, 4,1218		5, 5,1219		6, 6, 6,1220		7, 7,1221		8, 8,1222		9, 9, 9,1223		10, 10,1224		11, 11, 11,1225		12, 12,1226		13, 13,1227		14, 14,1228	},1229	[16] = {1230		1, 1,1231		2, 2,1232		3, 3,1233		4, 4,1234		5, 5,1235		6, 6, 6,1236		7, 7,1237		8, 8,1238		9, 9,1239		10, 10, 10,1240		11, 11,1241		12, 12,1242		13, 13,1243		14, 14,1244		15, 15,1245	},1246};1247 1248void1249gf100_grctx_generate_alpha_beta_tables(struct gf100_gr *gr)1250{1251	struct nvkm_subdev *subdev = &gr->base.engine.subdev;1252	struct nvkm_device *device = subdev->device;1253	int i, gpc;1254 1255	for (i = 0; i < 32; i++) {1256		u32 atarget = gf100_grctx_alpha_beta_map[gr->tpc_total][i];1257		u32 abits[GPC_MAX] = {}, amask = 0, bmask = 0;1258 1259		if (!atarget) {1260			nvkm_warn(subdev, "missing alpha/beta mapping table\n");1261			atarget = max_t(u32, gr->tpc_total * i / 32, 1);1262		}1263 1264		while (atarget) {1265			for (gpc = 0; atarget && gpc < gr->gpc_nr; gpc++) {1266				if (abits[gpc] < gr->tpc_nr[gpc]) {1267					abits[gpc]++;1268					atarget--;1269				}1270			}1271		}1272 1273		for (gpc = 0; gpc < gr->gpc_nr; gpc++) {1274			u32 bbits = gr->tpc_nr[gpc] - abits[gpc];1275			amask |= ((1 << abits[gpc]) - 1) << (gpc * 8);1276			bmask |= ((1 << bbits) - 1) << abits[gpc] << (gpc * 8);1277		}1278 1279		nvkm_wr32(device, 0x406800 + (i * 0x20), amask);1280		nvkm_wr32(device, 0x406c00 + (i * 0x20), bmask);1281	}1282}1283 1284void1285gf100_grctx_generate_tpc_nr(struct gf100_gr *gr, int gpc)1286{1287	struct nvkm_device *device = gr->base.engine.subdev.device;1288	nvkm_wr32(device, GPC_UNIT(gpc, 0x0c08), gr->tpc_nr[gpc]);1289	nvkm_wr32(device, GPC_UNIT(gpc, 0x0c8c), gr->tpc_nr[gpc]);1290}1291 1292void1293gf100_grctx_generate_sm_id(struct gf100_gr *gr, int gpc, int tpc, int sm)1294{1295	struct nvkm_device *device = gr->base.engine.subdev.device;1296	nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x698), sm);1297	nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x4e8), sm);1298	nvkm_wr32(device, GPC_UNIT(gpc, 0x0c10 + tpc * 4), sm);1299	nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x088), sm);1300}1301 1302void1303gf100_grctx_generate_floorsweep(struct gf100_gr *gr)1304{1305	const struct gf100_grctx_func *func = gr->func->grctx;1306	int sm;1307 1308	for (sm = 0; sm < gr->sm_nr; sm++) {1309		func->sm_id(gr, gr->sm[sm].gpc, gr->sm[sm].tpc, sm);1310		if (func->tpc_nr)1311			func->tpc_nr(gr, gr->sm[sm].gpc);1312	}1313 1314	gf100_gr_init_num_tpc_per_gpc(gr, false, true);1315	if (!func->skip_pd_num_tpc_per_gpc)1316		gf100_gr_init_num_tpc_per_gpc(gr, true, false);1317 1318	if (func->r4060a8)1319		func->r4060a8(gr);1320 1321	func->rop_mapping(gr);1322 1323	if (func->alpha_beta_tables)1324		func->alpha_beta_tables(gr);1325	if (func->max_ways_evict)1326		func->max_ways_evict(gr);1327	if (func->dist_skip_table)1328		func->dist_skip_table(gr);1329	if (func->r406500)1330		func->r406500(gr);1331	if (func->gpc_tpc_nr)1332		func->gpc_tpc_nr(gr);1333	if (func->r419f78)1334		func->r419f78(gr);1335	if (func->tpc_mask)1336		func->tpc_mask(gr);1337	if (func->smid_config)1338		func->smid_config(gr);1339}1340 1341void1342gf100_grctx_generate_main(struct gf100_gr_chan *chan)1343{1344	struct gf100_gr *gr = chan->gr;1345	struct nvkm_device *device = gr->base.engine.subdev.device;1346	const struct gf100_grctx_func *grctx = gr->func->grctx;1347	u32 idle_timeout;1348 1349	nvkm_mc_unk260(device, 0);1350 1351	if (!gr->sw_ctx) {1352		gf100_gr_mmio(gr, grctx->hub);1353		gf100_gr_mmio(gr, grctx->gpc_0);1354		gf100_gr_mmio(gr, grctx->zcull);1355		gf100_gr_mmio(gr, grctx->gpc_1);1356		gf100_gr_mmio(gr, grctx->tpc);1357		gf100_gr_mmio(gr, grctx->ppc);1358	} else {1359		gf100_gr_mmio(gr, gr->sw_ctx);1360	}1361 1362	if (gr->func->init_419bd8)1363		gr->func->init_419bd8(gr);1364	if (grctx->r419ea8)1365		grctx->r419ea8(gr);1366 1367	gf100_gr_wait_idle(gr);1368 1369	idle_timeout = nvkm_mask(device, 0x404154, 0xffffffff, 0x00000000);1370 1371	grctx->pagepool(chan, chan->pagepool->addr);1372	grctx->bundle(chan, chan->bundle_cb->addr, grctx->bundle_size);1373	grctx->attrib_cb(chan, chan->attrib_cb->addr, grctx->attrib_cb_size(gr));1374	grctx->attrib(chan);1375	if (grctx->patch_ltc)1376		grctx->patch_ltc(chan);1377	if (grctx->unknown_size)1378		grctx->unknown(chan, chan->unknown->addr, grctx->unknown_size);1379	grctx->unkn(gr);1380 1381	gf100_grctx_generate_floorsweep(gr);1382 1383	gf100_gr_wait_idle(gr);1384 1385	if (grctx->r400088) grctx->r400088(gr, false);1386 1387	if (gr->bundle)1388		gf100_gr_icmd(gr, gr->bundle);1389	else1390		gf100_gr_icmd(gr, grctx->icmd);1391 1392	if (gr->bundle_veid)1393		gf100_gr_icmd(gr, gr->bundle_veid);1394	else1395		gf100_gr_icmd(gr, grctx->sw_veid_bundle_init);1396 1397	if (gr->bundle64)1398		gf100_gr_icmd(gr, gr->bundle64);1399	else1400	if (grctx->sw_bundle64_init)1401		gf100_gr_icmd(gr, grctx->sw_bundle64_init);1402 1403	if (grctx->r400088) grctx->r400088(gr, true);1404 1405	nvkm_wr32(device, 0x404154, idle_timeout);1406 1407	if (gr->method)1408		gf100_gr_mthd(gr, gr->method);1409	else1410		gf100_gr_mthd(gr, grctx->mthd);1411	nvkm_mc_unk260(device, 1);1412 1413	if (grctx->r419cb8)1414		grctx->r419cb8(gr);1415	if (grctx->r418800)1416		grctx->r418800(gr);1417	if (grctx->r419eb0)1418		grctx->r419eb0(gr);1419	if (grctx->r419e00)1420		grctx->r419e00(gr);1421	if (grctx->r418e94)1422		grctx->r418e94(gr);1423	if (grctx->r419a3c)1424		grctx->r419a3c(gr);1425	if (grctx->r408840)1426		grctx->r408840(gr);1427	if (grctx->r419c0c)1428		grctx->r419c0c(gr);1429 1430	gf100_gr_wait_idle(gr);1431}1432 1433#define CB_RESERVED 0x800001434 1435int1436gf100_grctx_generate(struct gf100_gr *gr, struct gf100_gr_chan *chan, struct nvkm_gpuobj *inst)1437{1438	const struct gf100_grctx_func *grctx = gr->func->grctx;1439	struct nvkm_subdev *subdev = &gr->base.engine.subdev;1440	struct nvkm_device *device = subdev->device;1441	struct nvkm_memory *data = NULL;1442	struct nvkm_vma *ctx = NULL;1443	int ret, i;1444	u64 addr;1445 1446	/* NV_PGRAPH_FE_PWR_MODE_FORCE_ON. */1447	nvkm_wr32(device, 0x404170, 0x00000012);1448	nvkm_msec(device, 2000,1449		if (!(nvkm_rd32(device, 0x404170) & 0x00000010))1450			break;1451	);1452 1453	if (grctx->unkn88c)1454		grctx->unkn88c(gr, true);1455 1456	/* Reset FECS. */1457	gr->func->fecs.reset(gr);1458 1459	if (grctx->unkn88c)1460		grctx->unkn88c(gr, false);1461 1462	/* NV_PGRAPH_FE_PWR_MODE_AUTO. */1463	nvkm_wr32(device, 0x404170, 0x00000010);1464	nvkm_msec(device, 2000,1465		if (!(nvkm_rd32(device, 0x404170) & 0x00000010))1466			break;1467	);1468 1469	/* Init SCC RAM. */1470	nvkm_wr32(device, 0x40802c, 0x00000001);1471 1472	/* Allocate memory to store context, and dummy global context buffers. */1473	ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST,1474			      CB_RESERVED + gr->size, 0, true, &data);1475	if (ret)1476		goto done;1477 1478	ret = nvkm_vmm_get(chan->vmm, 0, nvkm_memory_size(data), &ctx);1479	if (ret)1480		goto done;1481 1482	ret = nvkm_memory_map(data, 0, chan->vmm, ctx, NULL, 0);1483	if (ret)1484		goto done;1485 1486	/* Setup context pointer. */1487	nvkm_kmap(inst);1488	nvkm_wo32(inst, 0x0210, lower_32_bits(ctx->addr + CB_RESERVED) | 4);1489	nvkm_wo32(inst, 0x0214, upper_32_bits(ctx->addr + CB_RESERVED));1490	nvkm_done(inst);1491 1492	/* Make channel current. */1493	addr = inst->addr >> 12;1494	if (gr->firmware) {1495		ret = gf100_gr_fecs_bind_pointer(gr, 0x80000000 | addr);1496		if (ret)1497			goto done_inst;1498 1499		nvkm_kmap(data);1500		nvkm_wo32(data, 0x1c, 1);1501		nvkm_wo32(data, 0x20, 0);1502		nvkm_wo32(data, 0x28, 0);1503		nvkm_wo32(data, 0x2c, 0);1504		nvkm_done(data);1505	} else {1506		nvkm_wr32(device, 0x409840, 0x80000000);1507		nvkm_wr32(device, 0x409500, 0x80000000 | addr);1508		nvkm_wr32(device, 0x409504, 0x00000001);1509		nvkm_msec(device, 2000,1510			if (nvkm_rd32(device, 0x409800) & 0x80000000)1511				break;1512		);1513	}1514 1515	grctx->main(chan);1516 1517	if (!gr->firmware) {1518		/* Trigger a context unload by unsetting the "next channel valid" bit1519		 * and faking a context switch interrupt.1520		 */1521		nvkm_mask(device, 0x409b04, 0x80000000, 0x00000000);1522		nvkm_wr32(device, 0x409000, 0x00000100);1523		if (nvkm_msec(device, 2000,1524			if (!(nvkm_rd32(device, 0x409b00) & 0x80000000))1525				break;1526		) < 0) {1527			ret = -EBUSY;1528			goto done_inst;1529		}1530	} else {1531		ret = gf100_gr_fecs_wfi_golden_save(gr, 0x80000000 | addr);1532		if (ret)1533			goto done_inst;1534 1535		nvkm_mask(device, 0x409b00, 0x80000000, 0x00000000);1536	}1537 1538	gr->data = kmalloc(gr->size, GFP_KERNEL);1539	if (gr->data) {1540		nvkm_kmap(data);1541		for (i = 0; i < gr->size; i += 4)1542			gr->data[i / 4] = nvkm_ro32(data, CB_RESERVED + i);1543		nvkm_done(data);1544		ret = 0;1545	} else {1546		ret = -ENOMEM;1547	}1548 1549done_inst:1550	nvkm_kmap(inst);1551	nvkm_wo32(inst, 0x0210, 0);1552	nvkm_wo32(inst, 0x0214, 0);1553	nvkm_done(inst);1554done:1555	nvkm_vmm_put(chan->vmm, &ctx);1556	nvkm_memory_unref(&data);1557	return ret;1558}1559 1560const struct gf100_grctx_func1561gf100_grctx = {1562	.main  = gf100_grctx_generate_main,1563	.unkn  = gf100_grctx_generate_unkn,1564	.hub   = gf100_grctx_pack_hub,1565	.gpc_0 = gf100_grctx_pack_gpc_0,1566	.gpc_1 = gf100_grctx_pack_gpc_1,1567	.zcull = gf100_grctx_pack_zcull,1568	.tpc   = gf100_grctx_pack_tpc,1569	.icmd  = gf100_grctx_pack_icmd,1570	.mthd  = gf100_grctx_pack_mthd,1571	.bundle = gf100_grctx_generate_bundle,1572	.bundle_size = 0x1800,1573	.pagepool = gf100_grctx_generate_pagepool,1574	.pagepool_size = 0x8000,1575	.attrib_cb_size = gf100_grctx_generate_attrib_cb_size,1576	.attrib_cb = gf100_grctx_generate_attrib_cb,1577	.attrib = gf100_grctx_generate_attrib,1578	.attrib_nr_max = 0x324,1579	.attrib_nr = 0x218,1580	.sm_id = gf100_grctx_generate_sm_id,1581	.tpc_nr = gf100_grctx_generate_tpc_nr,1582	.r4060a8 = gf100_grctx_generate_r4060a8,1583	.rop_mapping = gf100_grctx_generate_rop_mapping,1584	.alpha_beta_tables = gf100_grctx_generate_alpha_beta_tables,1585	.max_ways_evict = gf100_grctx_generate_max_ways_evict,1586	.r419cb8 = gf100_grctx_generate_r419cb8,1587};1588