File Index
Files and directories
Sign in
FILE

ctxgf100.c

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.c C
   1/*
   2 * Copyright 2010 Red Hat Inc.
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice shall be included in
  12 * all copies or substantial portions of the Software.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18 * 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 OR
  20 * OTHER DEALINGS IN THE SOFTWARE.
  21 *
  22 * Authors: Ben Skeggs
  23 */
  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 lists
  33 ******************************************************************************/
  34
  35static const struct gf100_gr_init
  36gf100_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_pack
 274gf100_grctx_pack_icmd[] = {
 275	{ gf100_grctx_init_icmd_0 },
 276	{}
 277};
 278
 279static const struct gf100_gr_init
 280gf100_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_init
 583gf100_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_init
 602gf100_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_init
 611gf100_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_pack
 629gf100_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_init
 638gf100_grctx_init_main_0[] = {
 639	{ 0x400204,   2, 0x04, 0x00000000 },
 640	{}
 641};
 642
 643const struct gf100_gr_init
 644gf100_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_init
 665gf100_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_init
 676gf100_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_init
 698gf100_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_init
 710gf100_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_init
 720gf100_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_init
 733gf100_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_init
 744gf100_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_pack
 756gf100_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_init
 770gf100_grctx_init_gpc_unk_0[] = {
 771	{ 0x418380,   1, 0x04, 0x00000016 },
 772	{}
 773};
 774
 775const struct gf100_gr_init
 776gf100_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_init
 790gf100_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_init
 802gf100_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_init
 815gf100_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_init
 824gf100_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_init
 837gf100_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_init
 846gf100_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_pack
 854gf100_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_pack
 864gf100_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_init
 872gf100_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_pack
 901gf100_grctx_pack_zcull[] = {
 902	{ gf100_grctx_init_zcullr_0 },
 903	{}
 904};
 905
 906const struct gf100_gr_init
 907gf100_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_init
 917gf100_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_init
 928gf100_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_init
 942gf100_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_init
 951gf100_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_init
 959gf100_grctx_init_tpccs_0[] = {
 960	{ 0x419d20,   1, 0x04, 0x02180000 },
 961	{ 0x419d24,   1, 0x04, 0x00001fff },
 962	{}
 963};
 964
 965static const struct gf100_gr_init
 966gf100_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_pack
 979gf100_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 implementation
 992 ******************************************************************************/
 993
 994void
 995gf100_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
1006void
1007gf100_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
1013void
1014gf100_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
1022void
1023gf100_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
1031void
1032gf100_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
1052void
1053gf100_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
1059u32
1060gf100_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
1067void
1068gf100_grctx_generate_unkn(struct gf100_gr *gr)
1069{
1070}
1071
1072void
1073gf100_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			else
1086				data |= 0x1f << (j * 8);
1087		}
1088		nvkm_wr32(device, 0x4060a8 + (i * 4), data);
1089	}
1090}
1091
1092void
1093gf100_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
1138void
1139gf100_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 u32
1148gf100_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: 3
1158	[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: 5
1164	//XXX: 6
1165	[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: 9
1183	//XXX: 10
1184	[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: 12
1197	//XXX: 13
1198	[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
1248void
1249gf100_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
1284void
1285gf100_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
1292void
1293gf100_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
1302void
1303gf100_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
1341void
1342gf100_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	else
1390		gf100_gr_icmd(gr, grctx->icmd);
1391
1392	if (gr->bundle_veid)
1393		gf100_gr_icmd(gr, gr->bundle_veid);
1394	else
1395		gf100_gr_icmd(gr, grctx->sw_veid_bundle_init);
1396
1397	if (gr->bundle64)
1398		gf100_gr_icmd(gr, gr->bundle64);
1399	else
1400	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	else
1410		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 0x80000
1434
1435int
1436gf100_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" bit
1519		 * 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_func
1561gf100_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};
~/ Read-only file preview.