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 35 static const struct gf100_gr_init 36 gf100_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 273 const struct gf100_gr_pack 274 gf100_grctx_pack_icmd[] = { 275 { gf100_grctx_init_icmd_0 }, 276 {} 277 }; 278 279 static const struct gf100_gr_init 280 gf100_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 582 const struct gf100_gr_init 583 gf100_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 601 const struct gf100_gr_init 602 gf100_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 610 const struct gf100_gr_init 611 gf100_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 628 const struct gf100_gr_pack 629 gf100_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 637 const struct gf100_gr_init 638 gf100_grctx_init_main_0[] = { 639 { 0x400204, 2, 0x04, 0x00000000 }, 640 {} 641 }; 642 643 const struct gf100_gr_init 644 gf100_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 664 const struct gf100_gr_init 665 gf100_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 675 const struct gf100_gr_init 676 gf100_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 697 static const struct gf100_gr_init 698 gf100_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 709 static const struct gf100_gr_init 710 gf100_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 719 const struct gf100_gr_init 720 gf100_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 732 const struct gf100_gr_init 733 gf100_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 743 static const struct gf100_gr_init 744 gf100_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 755 const struct gf100_gr_pack 756 gf100_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 769 const struct gf100_gr_init 770 gf100_grctx_init_gpc_unk_0[] = { 771 { 0x418380, 1, 0x04, 0x00000016 }, 772 {} 773 }; 774 775 const struct gf100_gr_init 776 gf100_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 789 const struct gf100_gr_init 790 gf100_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 801 static const struct gf100_gr_init 802 gf100_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 814 const struct gf100_gr_init 815 gf100_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 823 const struct gf100_gr_init 824 gf100_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 836 const struct gf100_gr_init 837 gf100_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 845 const struct gf100_gr_init 846 gf100_grctx_init_gcc_0[] = { 847 { 0x419000, 1, 0x04, 0x00000780 }, 848 { 0x419004, 2, 0x04, 0x00000000 }, 849 { 0x419014, 1, 0x04, 0x00000004 }, 850 {} 851 }; 852 853 const struct gf100_gr_pack 854 gf100_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 863 const struct gf100_gr_pack 864 gf100_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 871 static const struct gf100_gr_init 872 gf100_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 900 const struct gf100_gr_pack 901 gf100_grctx_pack_zcull[] = { 902 { gf100_grctx_init_zcullr_0 }, 903 {} 904 }; 905 906 const struct gf100_gr_init 907 gf100_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 916 static const struct gf100_gr_init 917 gf100_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 927 const struct gf100_gr_init 928 gf100_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 941 const struct gf100_gr_init 942 gf100_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 950 static const struct gf100_gr_init 951 gf100_grctx_init_l1c_0[] = { 952 { 0x419cb0, 1, 0x04, 0x00060048 }, 953 { 0x419ce8, 1, 0x04, 0x00000000 }, 954 { 0x419cf4, 1, 0x04, 0x00000183 }, 955 {} 956 }; 957 958 const struct gf100_gr_init 959 gf100_grctx_init_tpccs_0[] = { 960 { 0x419d20, 1, 0x04, 0x02180000 }, 961 { 0x419d24, 1, 0x04, 0x00001fff }, 962 {} 963 }; 964 965 static const struct gf100_gr_init 966 gf100_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 978 const struct gf100_gr_pack 979 gf100_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 994 void 995 gf100_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 1006 void 1007 gf100_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 1013 void 1014 gf100_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 1022 void 1023 gf100_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 1031 void 1032 gf100_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 1052 void 1053 gf100_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 1059 u32 1060 gf100_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 1067 void 1068 gf100_grctx_generate_unkn(struct gf100_gr *gr) 1069 { 1070 } 1071 1072 void 1073 gf100_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 1092 void 1093 gf100_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 1138 void 1139 gf100_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 1147 static const u32 1148 gf100_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 1248 void 1249 gf100_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 1284 void 1285 gf100_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 1292 void 1293 gf100_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 1302 void 1303 gf100_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 1341 void 1342 gf100_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 1435 int 1436 gf100_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 1549 done_inst: 1550 nvkm_kmap(inst); 1551 nvkm_wo32(inst, 0x0210, 0); 1552 nvkm_wo32(inst, 0x0214, 0); 1553 nvkm_done(inst); 1554 done: 1555 nvkm_vmm_put(chan->vmm, &ctx); 1556 nvkm_memory_unref(&data); 1557 return ret; 1558 } 1559 1560 const struct gf100_grctx_func 1561 gf100_grctx = { 1562 .main = gf100_grctx_generate_main, 1563 .unkn = gf100_grctx_generate_unkn, 1564 .hub = gf100_grctx_pack_hub, 1565 .gpc_0 = gf100_grctx_pack_gpc_0, 1566 .gpc_1 = gf100_grctx_pack_gpc_1, 1567 .zcull = gf100_grctx_pack_zcull, 1568 .tpc = gf100_grctx_pack_tpc, 1569 .icmd = gf100_grctx_pack_icmd, 1570 .mthd = gf100_grctx_pack_mthd, 1571 .bundle = gf100_grctx_generate_bundle, 1572 .bundle_size = 0x1800, 1573 .pagepool = gf100_grctx_generate_pagepool, 1574 .pagepool_size = 0x8000, 1575 .attrib_cb_size = gf100_grctx_generate_attrib_cb_size, 1576 .attrib_cb = gf100_grctx_generate_attrib_cb, 1577 .attrib = gf100_grctx_generate_attrib, 1578 .attrib_nr_max = 0x324, 1579 .attrib_nr = 0x218, 1580 .sm_id = gf100_grctx_generate_sm_id, 1581 .tpc_nr = gf100_grctx_generate_tpc_nr, 1582 .r4060a8 = gf100_grctx_generate_r4060a8, 1583 .rop_mapping = gf100_grctx_generate_rop_mapping, 1584 .alpha_beta_tables = gf100_grctx_generate_alpha_beta_tables, 1585 .max_ways_evict = gf100_grctx_generate_max_ways_evict, 1586 .r419cb8 = gf100_grctx_generate_r419cb8, 1587 }; 1588