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